linkmore-design
Version:
🌈 🚀lm组件库。🚀
653 lines (628 loc) • 25.2 kB
JavaScript
import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
import { useCallback } from 'react';
import { getFilterShow, getIsHas, getValueForType } from "../utils";
// 初始化查询结构
export var initLocalization = function initLocalization(props) {
var _globalQuery$filters, _globalQuery$filters$, _fuzzyQuery$filters, _fuzzyQuery$filters$, _filterQuery$filters, _filterQuery$filters$;
var localization = props.localization,
dataSource = props.dataSource,
searchKey = props.searchKey,
searchConfig = props.searchConfig,
customOptions = props.customOptions;
var globalQuery = localization.globalQuery,
filterQuery = localization.filterQuery,
fuzzyQuery = localization.fuzzyQuery;
var basicFilter = (localization === null || localization === void 0 ? void 0 : localization.basicFilter) || {};
var basicQuery = {}; // 存储查询结构
var isFuzzy = Array.isArray(searchKey); // 数组时为模糊搜索结构
var searchFilter = (localization === null || localization === void 0 ? void 0 : localization.fuzzyFilter) || {};
var searchQuery = {}; // 模糊查询结构
var customFilter = (customOptions === null || customOptions === void 0 ? void 0 : customOptions.find(function (v) {
var _localization$customF;
return (v === null || v === void 0 ? void 0 : v.value) === (localization === null || localization === void 0 ? void 0 : (_localization$customF = localization.customFilter) === null || _localization$customF === void 0 ? void 0 : _localization$customF.value);
})) || {};
var customQuery = {}; // 自定义筛选存储结构
// 一级查询
if (globalQuery !== null && globalQuery !== void 0 && (_globalQuery$filters = globalQuery.filters) !== null && _globalQuery$filters !== void 0 && (_globalQuery$filters$ = _globalQuery$filters[0]) !== null && _globalQuery$filters$ !== void 0 && _globalQuery$filters$.conditions) {
var _globalQuery$filters2, _globalQuery$filters3;
var globalQueryArr = (globalQuery === null || globalQuery === void 0 ? void 0 : (_globalQuery$filters2 = globalQuery.filters) === null || _globalQuery$filters2 === void 0 ? void 0 : (_globalQuery$filters3 = _globalQuery$filters2[0]) === null || _globalQuery$filters3 === void 0 ? void 0 : _globalQuery$filters3.conditions) || [];
customQuery = globalQueryArr.reduce(function (pre, cur) {
var checkedValue = cur.value; // 选中的数据
// 查找该数据是否展示
if (getIsHas(checkedValue)) {
pre[cur.fieldName] = cur;
}
return pre;
}, {});
}
// 模糊查询
if (getIsHas(searchFilter)) {
var _Object$keys;
searchQuery = (_Object$keys = Object.keys(searchFilter)) === null || _Object$keys === void 0 ? void 0 : _Object$keys.reduce(function (pre, cur) {
if (getIsHas(searchFilter[cur])) {
pre[cur] = _objectSpread(_objectSpread({}, searchConfig), {}, {
fieldName: cur,
value: [searchFilter[cur]]
});
}
return pre;
}, {});
} else if (fuzzyQuery !== null && fuzzyQuery !== void 0 && (_fuzzyQuery$filters = fuzzyQuery.filters) !== null && _fuzzyQuery$filters !== void 0 && (_fuzzyQuery$filters$ = _fuzzyQuery$filters[0]) !== null && _fuzzyQuery$filters$ !== void 0 && _fuzzyQuery$filters$.conditions) {
var _fuzzyQuery$filters2, _fuzzyQuery$filters2$;
var fuzzyQueryArr = (fuzzyQuery === null || fuzzyQuery === void 0 ? void 0 : (_fuzzyQuery$filters2 = fuzzyQuery.filters) === null || _fuzzyQuery$filters2 === void 0 ? void 0 : (_fuzzyQuery$filters2$ = _fuzzyQuery$filters2[0]) === null || _fuzzyQuery$filters2$ === void 0 ? void 0 : _fuzzyQuery$filters2$.conditions) || [];
// 初始化基础查询缓存
searchFilter = fuzzyQueryArr.reduce(function (pre, cur) {
var checkedValue = cur.value; // 选中的数据
if (getIsHas(checkedValue)) {
searchQuery[cur.fieldName] = cur;
pre[cur.fieldName] = checkedValue[0];
}
return pre;
}, {});
}
// 二级查询
if (getIsHas(basicFilter)) {
var _Object$keys2;
basicQuery = (_Object$keys2 = Object.keys(basicFilter)) === null || _Object$keys2 === void 0 ? void 0 : _Object$keys2.reduce(function (pre, cur) {
var item = dataSource.find(function (v) {
if (cur === v.field) {
return v.show || typeof v.show !== 'boolean';
}
return false;
});
if (!isFuzzy && cur === searchKey) {
item = {
field: searchKey,
operator: 'contains',
fieldType: 'string'
};
}
if (getIsHas(basicFilter[cur]) && !!item) {
var _item, _item2;
pre[cur] = {
fieldName: cur,
fieldType: ((_item = item) === null || _item === void 0 ? void 0 : _item.valueType) || 'string',
value: Array.isArray(basicFilter[cur]) ? basicFilter[cur] : [basicFilter[cur]],
operator: ((_item2 = item) === null || _item2 === void 0 ? void 0 : _item2.operator) || 'equal'
};
}
return pre;
}, {});
} else if (filterQuery !== null && filterQuery !== void 0 && (_filterQuery$filters = filterQuery.filters) !== null && _filterQuery$filters !== void 0 && (_filterQuery$filters$ = _filterQuery$filters[0]) !== null && _filterQuery$filters$ !== void 0 && _filterQuery$filters$.conditions) {
var _filterQuery$filters2, _filterQuery$filters3;
var filterQueryArr = (filterQuery === null || filterQuery === void 0 ? void 0 : (_filterQuery$filters2 = filterQuery.filters) === null || _filterQuery$filters2 === void 0 ? void 0 : (_filterQuery$filters3 = _filterQuery$filters2[0]) === null || _filterQuery$filters3 === void 0 ? void 0 : _filterQuery$filters3.conditions) || [];
// 初始化基础查询缓存
basicFilter = filterQueryArr.reduce(function (pre, cur) {
var checkedValue = cur.value; // 选中的数据
// 是否搜索框
var isSearchInput = cur.fieldName === searchKey;
// 查找该数据是否展示
var someData = dataSource.some(function (v) {
if (cur.fieldName === v.field) {
return v.show || typeof v.show !== 'boolean';
}
return false;
});
if (getIsHas(checkedValue) && someData || isSearchInput) {
basicQuery[cur.fieldName] = cur;
// 复选/级联/日期区间
if (!['checkbox', 'cascader'].includes(cur.type) && checkedValue.length < 2) {
checkedValue = checkedValue[0];
}
pre[cur.fieldName] = checkedValue;
}
return pre;
}, {});
}
return {
searchFilter: searchFilter,
searchQuery: searchQuery,
basicFilter: basicFilter,
basicQuery: basicQuery,
customFilter: customFilter,
customQuery: customQuery
};
};
// 核心参数集合
var useCoreOptions = function useCoreOptions(_ref) {
var state = _ref.state,
dispatch = _ref.dispatch,
props = _ref.props;
var onChange = props.onChange,
dataSource = props.dataSource,
searchKey = props.searchKey,
searchConfig = props.searchConfig,
enableAutoString = props.enableAutoString;
// 获取是否存在过滤值
var getHasFilter = useCallback(function () {
var _state$complexFilter, _state$complexFilter$;
return getIsHas(state.basicFilter) || getIsHas(state.searchFilter) || ((_state$complexFilter = state.complexFilter) === null || _state$complexFilter === void 0 ? void 0 : (_state$complexFilter$ = _state$complexFilter.data) === null || _state$complexFilter$ === void 0 ? void 0 : _state$complexFilter$.some(function (v) {
var _Object$values;
return !!((_Object$values = Object.values(v)) !== null && _Object$values !== void 0 && _Object$values.filter(Boolean).length);
}));
}, [state.basicFilter, state.searchFilter, state.complexFilter]);
// 转换一级查询结构 object => array
// 转行查询结构
var tranformQuery = useCallback(function (_ref2) {
var _Object$keys3, _Object$keys4;
var _ref2$searchQuery = _ref2.searchQuery,
searchQuery = _ref2$searchQuery === void 0 ? {} : _ref2$searchQuery,
_ref2$basicQuery = _ref2.basicQuery,
basicQuery = _ref2$basicQuery === void 0 ? {} : _ref2$basicQuery;
var globalQuery = {
filters: [{
conditions: []
}]
};
var fuzzyQuery = {
filters: [{
conditions: (_Object$keys3 = Object.keys(searchQuery)) === null || _Object$keys3 === void 0 ? void 0 : _Object$keys3.map(function (k) {
return searchQuery[k];
})
}]
};
var filterQuery = {
filters: [{
conditions: (_Object$keys4 = Object.keys(basicQuery)) === null || _Object$keys4 === void 0 ? void 0 : _Object$keys4.map(function (k) {
return basicQuery[k];
})
}]
};
return {
globalQuery: globalQuery,
fuzzyQuery: fuzzyQuery,
filterQuery: filterQuery
};
}, []);
// 触发查询 type basic基础筛选 | complex高级筛选
var onQuery = useCallback(function () {
var _ref3 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
_ref3$complexFilter = _ref3.complexFilter,
complexFilter = _ref3$complexFilter === void 0 ? {} : _ref3$complexFilter,
_ref3$type = _ref3.type,
type = _ref3$type === void 0 ? 'basic' : _ref3$type,
_ref3$basicFilter = _ref3.basicFilter,
basicFilter = _ref3$basicFilter === void 0 ? state.basicFilter || {} : _ref3$basicFilter,
_ref3$basicQuery = _ref3.basicQuery,
basicQuery = _ref3$basicQuery === void 0 ? state.basicQuery || {} : _ref3$basicQuery,
_ref3$searchFilter = _ref3.searchFilter,
searchFilter = _ref3$searchFilter === void 0 ? state.searchFilter || {} : _ref3$searchFilter,
_ref3$searchQuery = _ref3.searchQuery,
searchQuery = _ref3$searchQuery === void 0 ? state.searchQuery || {} : _ref3$searchQuery,
_ref3$customFilter = _ref3.customFilter,
customFilter = _ref3$customFilter === void 0 ? state.customFilter || {} : _ref3$customFilter;
if (type === 'custom') {
var customSelectValue = customFilter.value,
_customFilter$relatio = customFilter.relation,
relation = _customFilter$relatio === void 0 ? 'and' : _customFilter$relatio,
_customFilter$data = customFilter.data,
data = _customFilter$data === void 0 ? [] : _customFilter$data;
// 将结果转换为字符串(级联数据需要递归)
var transformString = function transformString(val) {
return Array.isArray(val) ? val.map(function (v) {
return transformString(v);
}) : String(val);
};
var conditions = data === null || data === void 0 ? void 0 : data.map(function (item) {
var dataSourceItem = dataSource.find(function (v) {
return v.field === item.field;
}) || {};
var getValue = function getValue(val) {
if (val === undefined) return [];
var stringValue = enableAutoString ? transformString(val) : val;
if (Array.isArray(stringValue)) return stringValue;
return [stringValue];
};
return {
relation: relation,
fieldName: item.field,
value: getValue(item.value),
fieldType: dataSourceItem.valueType || 'string',
// string
operator: item.operator || 'equal' // equal
};
});
var complexQuery = {
filters: [{
relation: 'and',
conditions: conditions
}]
};
dispatch({
type: 'changeSearchFilter',
searchFilter: {}
});
dispatch({
type: 'changeSearchQuery',
searchQuery: {}
});
dispatch({
type: 'changeBasicFilter',
basicFilter: {}
});
dispatch({
type: 'changeCustomFilter',
customFilter: customFilter
});
dispatch({
type: 'changeComplexFilter',
complexFilter: customFilter
});
dispatch({
type: 'changeCustomSelectValue',
customSelectValue: customSelectValue
});
dispatch({
type: 'changeBasicQuery',
basicQuery: basicQuery
});
var _tranformQuery = tranformQuery({}),
globalQuery = _tranformQuery.globalQuery;
onChange === null || onChange === void 0 ? void 0 : onChange({
complexFilter: complexFilter,
globalQuery: globalQuery,
filterQuery: complexQuery,
type: type
});
}
if (type === 'search') {
dispatch({
type: 'changeSearchFilter',
searchFilter: searchFilter
});
dispatch({
type: 'changeSearchQuery',
searchQuery: searchQuery
});
dispatch({
type: 'resetComplexFilter'
}); // 基础筛选清空高级筛选
// 抛出给外部查询
var _tranformQuery2 = tranformQuery({
searchQuery: searchQuery,
basicQuery: basicQuery
}),
_globalQuery = _tranformQuery2.globalQuery,
fuzzyQuery = _tranformQuery2.fuzzyQuery,
filterQuery = _tranformQuery2.filterQuery;
onChange === null || onChange === void 0 ? void 0 : onChange({
fuzzyFilter: searchFilter,
basicFilter: basicFilter,
fuzzyQuery: fuzzyQuery,
globalQuery: _globalQuery,
filterQuery: filterQuery,
type: 'search'
});
}
if (type === 'basic') {
dispatch({
type: 'changeBasicFilter',
basicFilter: basicFilter
});
dispatch({
type: 'changeBasicQuery',
basicQuery: basicQuery
});
dispatch({
type: 'resetComplexFilter'
}); // 基础筛选清空高级筛选
// 抛出给外部查询
var _tranformQuery3 = tranformQuery({
searchQuery: searchQuery,
basicQuery: basicQuery
}),
_globalQuery2 = _tranformQuery3.globalQuery,
_fuzzyQuery = _tranformQuery3.fuzzyQuery,
_filterQuery = _tranformQuery3.filterQuery;
onChange === null || onChange === void 0 ? void 0 : onChange({
fuzzyFilter: searchFilter,
basicFilter: basicFilter,
fuzzyQuery: _fuzzyQuery,
globalQuery: _globalQuery2,
filterQuery: _filterQuery,
type: 'basic'
});
}
// 高级筛选存在 "为空"/"不为空"
if (type === 'complex') {
var _complexFilter$relati = complexFilter.relation,
_relation = _complexFilter$relati === void 0 ? 'and' : _complexFilter$relati,
_complexFilter$data = complexFilter.data,
_data = _complexFilter$data === void 0 ? [] : _complexFilter$data;
// 将结果转换为字符串(级联数据需要递归)
var _transformString = function _transformString(val) {
return Array.isArray(val) ? val.map(function (v) {
return _transformString(v);
}) : String(val);
};
var getValue = function getValue(val) {
if (val === undefined) return [];
var stringValue = enableAutoString ? _transformString(val) : val;
if (Array.isArray(stringValue)) return stringValue;
return [stringValue];
};
var _conditions = _data === null || _data === void 0 ? void 0 : _data.reduce(function (pre, cur) {
var curValue = getValue(cur === null || cur === void 0 ? void 0 : cur.value);
// 是否查空值
var isQueryEmpty = ['empty', 'not_empty'].includes(cur.operator);
// 未选字段或值时不查
if (!cur.field) return pre;
if (!(curValue !== null && curValue !== void 0 && curValue.length) && !isQueryEmpty) return pre;
// 解析empty操作符, 转换为'equal'/'not_equal'
var operator = isQueryEmpty ? cur.operator === 'empty' ? 'equal' : cur.operator === 'not_empty' ? 'not_equal' : cur.operator : cur.operator;
var dataSourceItem = dataSource.find(function (v) {
return v.field === cur.field;
}) || {};
pre.push({
relation: _relation,
fieldName: cur.field,
value: curValue,
fieldType: dataSourceItem.valueType || 'string',
// string
operator: operator || 'equal' // equal
});
return pre;
}, []);
var _complexQuery = {
filters: [{
relation: 'and',
conditions: _conditions
}]
};
dispatch({
type: 'changeSearchFilter',
searchFilter: {}
});
dispatch({
type: 'changeSearchQuery',
searchQuery: {}
});
dispatch({
type: 'changeBasicFilter',
basicFilter: {}
});
dispatch({
type: 'changeComplexFilter',
complexFilter: complexFilter
});
dispatch({
type: 'changeBasicQuery',
basicQuery: basicQuery
});
var _tranformQuery4 = tranformQuery({}),
_globalQuery3 = _tranformQuery4.globalQuery;
onChange === null || onChange === void 0 ? void 0 : onChange({
complexFilter: complexFilter,
globalQuery: _globalQuery3,
filterQuery: _complexQuery,
type: type
});
}
if (type === 'clear') {
dispatch({
type: 'reset'
});
var _tranformQuery5 = tranformQuery({
searchQuery: searchQuery,
basicQuery: basicQuery
}),
_globalQuery4 = _tranformQuery5.globalQuery,
_fuzzyQuery2 = _tranformQuery5.fuzzyQuery,
_filterQuery2 = _tranformQuery5.filterQuery;
onChange === null || onChange === void 0 ? void 0 : onChange({
fuzzyFilter: searchFilter,
basicFilter: basicFilter,
fuzzyQuery: _fuzzyQuery2,
globalQuery: _globalQuery4,
filterQuery: _filterQuery2,
type: 'clear'
});
}
}, [tranformQuery, state, dataSource, enableAutoString, onChange]);
// 清除事件
var onClearChange = useCallback(function () {
var _props$onClearChange;
var params = {
searchFilter: {},
searchQuery: {},
basicFilter: {},
complexFilter: {},
basicQuery: {},
type: 'clear'
};
(_props$onClearChange = props.onClearChange) === null || _props$onClearChange === void 0 ? void 0 : _props$onClearChange.call(props, params);
onQuery(params);
}, [onQuery]);
// 根据字段查找过滤的数据, 不存在时返回默认值
var getFilterValue = useCallback(function (_ref4) {
var field = _ref4.field,
type = _ref4.type;
if (getIsHas(state.basicFilter[field])) {
return state.basicFilter[field];
}
var defaultValue = getValueForType(type);
return state.basicFilter[field] || defaultValue;
}, [state.basicFilter]);
// 获取查询结构
var getFilterQuery = useCallback(function () {
var originData = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : dataSource;
var basicFilter = getFilterShow(state.basicFilter, originData);
var basicQuery = getFilterShow(state.basicQuery, originData);
dispatch({
type: 'changeBasicFilter',
basicFilter: basicFilter
});
dispatch({
type: 'changeBasicQuery',
basicQuery: basicQuery
});
var _tranformQuery6 = tranformQuery({
searchQuery: state.searchQuery,
basicQuery: basicQuery
}),
globalQuery = _tranformQuery6.globalQuery,
fuzzyQuery = _tranformQuery6.fuzzyQuery,
filterQuery = _tranformQuery6.filterQuery;
return {
fuzzyFilter: state.searchFilter,
basicFilter: basicFilter,
fuzzyQuery: fuzzyQuery,
globalQuery: globalQuery,
filterQuery: filterQuery,
type: 'basic'
};
}, [state, dataSource]);
/** 获取当前过滤的值,格式化为指定格式 */
var getFilterFormat = function getFilterFormat() {
if (!getIsHas(state.basicFilter)) {
return state.complexFilter;
}
var getDataSourceItem = function getDataSourceItem(val) {
return dataSource === null || dataSource === void 0 ? void 0 : dataSource.find(function (v) {
return (v === null || v === void 0 ? void 0 : v.field) === val;
});
};
var result = Object.keys(state.basicFilter).map(function (v) {
var _getDataSourceItem;
return {
field: v,
operator: ((_getDataSourceItem = getDataSourceItem(v)) === null || _getDataSourceItem === void 0 ? void 0 : _getDataSourceItem.operator) || 'equal',
value: state.basicFilter[v]
};
});
return {
realtion: 'and',
data: result
};
};
/*
* 设置筛选的值 itemValue => String || Array => ['', '', ...]
* 后端仅接受数组包字符串形式, 不接受数值及布尔值
*/
var setFilterValue = useCallback(function (itemValue, item) {
var field = item.field;
if (field) {
// 将结果转换为字符串(级联数据需要递归)
var transformString = function transformString(val) {
return Array.isArray(val) ? val.map(function (v) {
return transformString(v);
}) : String(val);
};
var stringValue = enableAutoString ? transformString(itemValue) : itemValue;
// 基础查询数据(受控数据)
var basicFilter = _objectSpread(_objectSpread({}, state.basicFilter), {}, _defineProperty({}, field, stringValue));
// 外部查询数据结构
var basicQuery = _objectSpread(_objectSpread({}, state.basicQuery), {}, _defineProperty({}, field, {
fieldName: field,
fieldType: item.valueType || 'string',
type: item.type,
value: Array.isArray(itemValue) ? stringValue : [stringValue],
operator: item.operator || 'equal'
}));
// 数据清除时不返回结构体
if (!getIsHas(itemValue)) {
delete basicFilter[field];
delete basicQuery[field];
}
// 触发外部事件
onQuery === null || onQuery === void 0 ? void 0 : onQuery({
basicFilter: basicFilter,
basicQuery: basicQuery,
type: 'basic'
});
}
}, [state, onQuery]);
// 单个设置过滤字段值, 会触发onChange事件, 多个字段时使用setLocalization
var setFilterFieldValue = useCallback(function (field, value) {
var item = (dataSource === null || dataSource === void 0 ? void 0 : dataSource.find(function (v) {
return v.field === field;
})) || {};
setFilterValue === null || setFilterValue === void 0 ? void 0 : setFilterValue(value, item);
}, [dataSource, setFilterValue]);
// 读取缓存
var setLocalization = useCallback(function () {
var localization = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : props.localization;
var _initLocalization = initLocalization(_objectSpread(_objectSpread({}, props), {}, {
localization: localization
})),
searchFilter = _initLocalization.searchFilter,
searchQuery = _initLocalization.searchQuery,
basicFilter = _initLocalization.basicFilter,
basicQuery = _initLocalization.basicQuery;
dispatch({
type: 'changeSearchFilter',
searchFilter: searchFilter
});
dispatch({
type: 'changeSearchQuery',
searchQuery: searchQuery
});
dispatch({
type: 'changeBasicFilter',
basicFilter: basicFilter
});
dispatch({
type: 'changeBasicQuery',
basicQuery: basicQuery
});
}, [props]);
// 模糊查询结构
var setSearchFilter = useCallback(function (itemValue) {
var searchFilter = searchKey === null || searchKey === void 0 ? void 0 : searchKey.reduce(function (pre, cur) {
pre[cur] = itemValue;
return pre;
}, _objectSpread({}, state.searchFilter));
var searchQuery = searchKey === null || searchKey === void 0 ? void 0 : searchKey.reduce(function (pre, cur) {
pre[cur] = _objectSpread(_objectSpread({}, searchConfig), {}, {
fieldName: cur,
value: [itemValue]
});
return pre;
}, _objectSpread({}, state.searchQuery));
// 数据清除时不返回结构体
if (!getIsHas(itemValue)) {
searchFilter = {};
searchQuery = {};
}
onQuery({
searchFilter: searchFilter,
searchQuery: searchQuery,
type: 'search'
});
}, [searchKey, state]);
var onComplexFilter = useCallback(function (customFilter) {
onQuery({
customFilter: customFilter,
type: 'custom'
});
}, [onQuery]);
// 组件内部使用
var CoreMethods = {
onQuery: onQuery,
setSearchFilter: setSearchFilter
};
// 参与Ref转发
var RefMethods = {
getState: function getState() {
return state;
},
getBasicFilter: function getBasicFilter() {
return state.basicFilter;
},
getFilterValue: getFilterValue,
getFilterQuery: getFilterQuery,
getHasFilter: getHasFilter,
setFilterValue: setFilterValue,
setFilterFieldValue: setFilterFieldValue,
setLocalization: setLocalization,
onComplexFilter: onComplexFilter,
onClearChange: onClearChange,
getFilterFormat: getFilterFormat
};
return {
CoreMethods: CoreMethods,
RefMethods: RefMethods
};
};
export default useCoreOptions;