linkmore-design
Version:
🌈 🚀lm组件库。🚀
604 lines (582 loc) • 22.9 kB
JavaScript
import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
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,
customOptions = props.customOptions,
enableAutoString = props.enableAutoString;
// 获取是否存在过滤值
var getHasFilter = useCallback(function () {
return getIsHas(state.basicFilter) || getIsHas(state.searchFilter);
}, [state.basicFilter, state.searchFilter]);
// 转换一级查询结构 object => array
var tranformGlobalQuery = useCallback(function (obj) {
var _Object$keys3;
var nArr = ((_Object$keys3 = Object.keys(obj)) === null || _Object$keys3 === void 0 ? void 0 : _Object$keys3.reduce(function (pre, cur) {
var item = dataSource.find(function (v) {
return cur === v.field;
});
var itemValue = obj[cur].value;
if (getIsHas(itemValue) && !!item) {
return [].concat(_toConsumableArray(pre), [{
relation: obj[cur].mode || 'and',
fieldName: cur,
fieldType: (item === null || item === void 0 ? void 0 : item.valueType) || 'string',
type: item.type,
value: Array.isArray(itemValue) ? itemValue : [itemValue],
/**
* and 等同于逻辑关系contains: 选中的值包含所有值
* or 等同于逻辑关系in: 选中的值存在于所有值之中
*/
operator: 'in'
}]);
}
return pre;
}, [])) || [];
return nArr;
}, [dataSource]);
// 转行查询结构
var tranformQuery = useCallback(function (_ref2) {
var _Object$keys4, _Object$keys5;
var customFilter = _ref2.customFilter,
_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: tranformGlobalQuery(customFilter === null || customFilter === void 0 ? void 0 : customFilter.data)
}]
};
var fuzzyQuery = {
filters: [{
conditions: (_Object$keys4 = Object.keys(searchQuery)) === null || _Object$keys4 === void 0 ? void 0 : _Object$keys4.map(function (k) {
return searchQuery[k];
})
}]
};
var filterQuery = {
filters: [{
conditions: (_Object$keys5 = Object.keys(basicQuery)) === null || _Object$keys5 === void 0 ? void 0 : _Object$keys5.map(function (k) {
return basicQuery[k];
})
}]
};
return {
globalQuery: globalQuery,
fuzzyQuery: fuzzyQuery,
filterQuery: filterQuery
};
}, [tranformGlobalQuery]);
// 触发查询 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') {
dispatch({
type: 'changeCustomFilter',
customFilter: customFilter
});
var _tranformQuery = tranformQuery({
customFilter: customFilter,
searchQuery: searchQuery,
basicQuery: basicQuery
}),
globalQuery = _tranformQuery.globalQuery,
fuzzyQuery = _tranformQuery.fuzzyQuery,
filterQuery = _tranformQuery.filterQuery;
onChange === null || onChange === void 0 ? void 0 : onChange({
fuzzyFilter: searchFilter,
fuzzyQuery: fuzzyQuery,
basicFilter: basicFilter,
globalQuery: globalQuery,
filterQuery: filterQuery,
type: 'custom'
});
}
if (type === 'search') {
dispatch({
type: 'changeSearchFilter',
searchFilter: searchFilter
});
dispatch({
type: 'changeSearchQuery',
searchQuery: searchQuery
});
dispatch({
type: 'changeComplexFilter',
complexFilter: {}
}); // 基础筛选清空高级筛选
// 抛出给外部查询
var _tranformQuery2 = tranformQuery({
customFilter: customFilter,
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: 'changeComplexFilter',
complexFilter: {}
}); // 基础筛选清空高级筛选
// 抛出给外部查询
var _tranformQuery3 = tranformQuery({
customFilter: customFilter,
searchQuery: searchQuery,
basicQuery: basicQuery
}),
_globalQuery2 = _tranformQuery3.globalQuery,
_fuzzyQuery2 = _tranformQuery3.fuzzyQuery,
_filterQuery2 = _tranformQuery3.filterQuery;
onChange === null || onChange === void 0 ? void 0 : onChange({
fuzzyFilter: searchFilter,
basicFilter: basicFilter,
fuzzyQuery: _fuzzyQuery2,
globalQuery: _globalQuery2,
filterQuery: _filterQuery2,
type: 'basic'
});
}
if (type === 'complex') {
var _Object$keys6;
// eslint-disable-next-line no-shadow
var _basicQuery = (_Object$keys6 = Object.keys(complexFilter)) === null || _Object$keys6 === void 0 ? void 0 : _Object$keys6.reduce(function (pre, cur) {
var item = dataSource.find(function (v) {
return cur === v.field;
});
var itemValue = complexFilter[cur].value;
if (getIsHas(itemValue) && !!item) {
// eslint-disable-next-line no-param-reassign
pre[cur] = {
relation: complexFilter[cur].mode || 'and',
fieldName: cur,
fieldType: (item === null || item === void 0 ? void 0 : item.valueType) || 'string',
type: item.type,
value: Array.isArray(itemValue) ? itemValue : [itemValue],
operator: 'in'
};
}
return pre;
}, {});
dispatch({
type: 'changeSearchFilter',
searchFilter: {}
});
dispatch({
type: 'changeSearchQuery',
searchQuery: {}
});
dispatch({
type: 'changeBasicFilter',
basicFilter: {}
});
dispatch({
type: 'changeComplexFilter',
complexFilter: complexFilter
});
dispatch({
type: 'changeComplexDrawer',
complexDrawer: {
data: {},
visible: false
}
});
dispatch({
type: 'changeBasicQuery',
basicQuery: _basicQuery
});
var _tranformQuery4 = tranformQuery({
customFilter: customFilter,
basicQuery: _basicQuery
}),
_globalQuery3 = _tranformQuery4.globalQuery,
_filterQuery3 = _tranformQuery4.filterQuery;
onChange === null || onChange === void 0 ? void 0 : onChange({
complexFilter: complexFilter,
globalQuery: _globalQuery3,
filterQuery: _filterQuery3,
type: type
});
}
if (type === 'clear') {
dispatch({
type: 'reset'
});
var _tranformQuery5 = tranformQuery({
customFilter: customFilter,
searchQuery: searchQuery,
basicQuery: basicQuery
}),
_globalQuery4 = _tranformQuery5.globalQuery,
_fuzzyQuery3 = _tranformQuery5.fuzzyQuery,
_filterQuery4 = _tranformQuery5.filterQuery;
onChange === null || onChange === void 0 ? void 0 : onChange({
fuzzyFilter: searchFilter,
basicFilter: basicFilter,
fuzzyQuery: _fuzzyQuery3,
globalQuery: _globalQuery4,
filterQuery: _filterQuery4,
type: 'clear'
});
}
}, [tranformQuery, state]);
// 清除事件
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({
customFilter: state.customFilter,
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]);
/*
* 设置筛选的值 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]);
// 单个设置过滤字段值, 会触发onChange事件, 多个字段时使用setLocalization
var setFilterFieldValue = useCallback(function (field, value) {
var item = dataSource.find(function (v) {
return v.fidld === field;
}) || {};
setFilterValue === null || setFilterValue === void 0 ? void 0 : setFilterValue(value, item);
}, [dataSource]);
// 读取缓存
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,
customFilter = _initLocalization.customFilter,
customQuery = _initLocalization.customQuery;
dispatch({
type: 'changeSearchFilter',
searchFilter: searchFilter
});
dispatch({
type: 'changeSearchQuery',
searchQuery: searchQuery
});
dispatch({
type: 'changeBasicFilter',
basicFilter: basicFilter
});
dispatch({
type: 'changeBasicQuery',
basicQuery: basicQuery
});
dispatch({
type: 'changeCustomFilter',
customFilter: customFilter
});
dispatch({
type: 'changeCustomQuery',
customQuery: customQuery
});
}, [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 setCustomFilter = useCallback(function (val) {
var customFilter = customOptions.find(function (v) {
return v.value === val;
});
onQuery({
customFilter: customFilter,
type: 'custom'
});
}, [customOptions, state.basicFilter]);
// 组件内部使用
var CoreMethods = {
onQuery: onQuery,
setCustomFilter: setCustomFilter,
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,
onClearChange: onClearChange
};
return {
CoreMethods: CoreMethods,
RefMethods: RefMethods
};
};
export default useCoreOptions;