UNPKG

linkmore-design

Version:

🌈 🚀lm组件库。🚀

594 lines (572 loc) 15.5 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.initLocalization = exports.default = void 0; var _react = require("react"); var _utils = require("../utils"); // 初始化查询结构 const initLocalization = props => { const { localization, dataSource, searchKey, searchConfig, customOptions } = props; const { globalQuery, filterQuery, fuzzyQuery } = localization; let basicFilter = localization?.basicFilter || {}; let basicQuery = {}; // 存储查询结构 const isFuzzy = Array.isArray(searchKey); // 数组时为模糊搜索结构 let searchFilter = localization?.fuzzyFilter || {}; let searchQuery = {}; // 模糊查询结构 const customFilter = customOptions?.find(v => v?.value === localization?.customFilter?.value) || {}; let customQuery = {}; // 自定义筛选存储结构 // 一级查询 if (globalQuery?.filters?.[0]?.conditions) { const globalQueryArr = globalQuery?.filters?.[0]?.conditions || []; customQuery = globalQueryArr.reduce((pre, cur) => { const checkedValue = cur.value; // 选中的数据 // 查找该数据是否展示 if ((0, _utils.getIsHas)(checkedValue)) { pre[cur.fieldName] = cur; } return pre; }, {}); } // 模糊查询 if ((0, _utils.getIsHas)(searchFilter)) { searchQuery = Object.keys(searchFilter)?.reduce((pre, cur) => { if ((0, _utils.getIsHas)(searchFilter[cur])) { pre[cur] = { ...searchConfig, fieldName: cur, value: [searchFilter[cur]] }; } return pre; }, {}); } else if (fuzzyQuery?.filters?.[0]?.conditions) { const fuzzyQueryArr = fuzzyQuery?.filters?.[0]?.conditions || []; // 初始化基础查询缓存 searchFilter = fuzzyQueryArr.reduce((pre, cur) => { const checkedValue = cur.value; // 选中的数据 if ((0, _utils.getIsHas)(checkedValue)) { searchQuery[cur.fieldName] = cur; pre[cur.fieldName] = checkedValue[0]; } return pre; }, {}); } // 二级查询 if ((0, _utils.getIsHas)(basicFilter)) { basicQuery = Object.keys(basicFilter)?.reduce((pre, cur) => { let item = dataSource.find(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 ((0, _utils.getIsHas)(basicFilter[cur]) && !!item) { pre[cur] = { fieldName: cur, fieldType: item?.valueType || 'string', value: Array.isArray(basicFilter[cur]) ? basicFilter[cur] : [basicFilter[cur]], operator: item?.operator || 'equal' }; } return pre; }, {}); } else if (filterQuery?.filters?.[0]?.conditions) { const filterQueryArr = filterQuery?.filters?.[0]?.conditions || []; // 初始化基础查询缓存 basicFilter = filterQueryArr.reduce((pre, cur) => { let checkedValue = cur.value; // 选中的数据 // 是否搜索框 const isSearchInput = cur.fieldName === searchKey; // 查找该数据是否展示 const someData = dataSource.some(v => { if (cur.fieldName === v.field) { return v.show || typeof v.show !== 'boolean'; } return false; }); if ((0, _utils.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, searchQuery, basicFilter, basicQuery, customFilter, customQuery }; }; // 核心参数集合 exports.initLocalization = initLocalization; const useCoreOptions = ({ state, dispatch, props }) => { const { onChange, dataSource, searchKey, searchConfig, customOptions, enableAutoString } = props; // 获取是否存在过滤值 const getHasFilter = (0, _react.useCallback)(() => { return (0, _utils.getIsHas)(state.basicFilter) || (0, _utils.getIsHas)(state.searchFilter); }, [state.basicFilter, state.searchFilter]); // 转换一级查询结构 object => array const tranformGlobalQuery = (0, _react.useCallback)(obj => { const nArr = Object.keys(obj)?.reduce((pre, cur) => { const item = dataSource.find(v => cur === v.field); const itemValue = obj[cur].value; if ((0, _utils.getIsHas)(itemValue) && !!item) { return [...pre, { relation: obj[cur].mode || 'and', fieldName: cur, fieldType: item?.valueType || 'string', type: item.type, value: Array.isArray(itemValue) ? itemValue : [itemValue], /** * and 等同于逻辑关系contains: 选中的值包含所有值 * or 等同于逻辑关系in: 选中的值存在于所有值之中 */ operator: 'in' }]; } return pre; }, []) || []; return nArr; }, [dataSource]); // 转行查询结构 const tranformQuery = (0, _react.useCallback)(({ customFilter, searchQuery = {}, basicQuery = {} }) => { const globalQuery = { filters: [{ conditions: tranformGlobalQuery(customFilter?.data) }] }; const fuzzyQuery = { filters: [{ conditions: Object.keys(searchQuery)?.map(k => searchQuery[k]) }] }; const filterQuery = { filters: [{ conditions: Object.keys(basicQuery)?.map(k => basicQuery[k]) }] }; return { globalQuery, fuzzyQuery, filterQuery }; }, [tranformGlobalQuery]); // 触发查询 type basic基础筛选 | complex高级筛选 const onQuery = (0, _react.useCallback)(({ complexFilter = {}, type = 'basic', basicFilter = state.basicFilter || {}, basicQuery = state.basicQuery || {}, searchFilter = state.searchFilter || {}, searchQuery = state.searchQuery || {}, customFilter = state.customFilter || {} } = {}) => { if (type === 'custom') { dispatch({ type: 'changeCustomFilter', customFilter }); const { globalQuery, fuzzyQuery, filterQuery } = tranformQuery({ customFilter, searchQuery, basicQuery }); onChange?.({ fuzzyFilter: searchFilter, fuzzyQuery, basicFilter, globalQuery, filterQuery, type: 'custom' }); } if (type === 'search') { dispatch({ type: 'changeSearchFilter', searchFilter }); dispatch({ type: 'changeSearchQuery', searchQuery }); dispatch({ type: 'changeComplexFilter', complexFilter: {} }); // 基础筛选清空高级筛选 // 抛出给外部查询 const { globalQuery, fuzzyQuery, filterQuery } = tranformQuery({ customFilter, searchQuery, basicQuery }); onChange?.({ fuzzyFilter: searchFilter, basicFilter, fuzzyQuery, globalQuery, filterQuery, type: 'search' }); } if (type === 'basic') { dispatch({ type: 'changeBasicFilter', basicFilter }); dispatch({ type: 'changeBasicQuery', basicQuery }); dispatch({ type: 'changeComplexFilter', complexFilter: {} }); // 基础筛选清空高级筛选 // 抛出给外部查询 const { globalQuery, fuzzyQuery, filterQuery } = tranformQuery({ customFilter, searchQuery, basicQuery }); onChange?.({ fuzzyFilter: searchFilter, basicFilter, fuzzyQuery, globalQuery, filterQuery, type: 'basic' }); } if (type === 'complex') { // eslint-disable-next-line no-shadow const basicQuery = Object.keys(complexFilter)?.reduce((pre, cur) => { const item = dataSource.find(v => cur === v.field); const itemValue = complexFilter[cur].value; if ((0, _utils.getIsHas)(itemValue) && !!item) { // eslint-disable-next-line no-param-reassign pre[cur] = { relation: complexFilter[cur].mode || 'and', fieldName: cur, fieldType: 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 }); dispatch({ type: 'changeComplexDrawer', complexDrawer: { data: {}, visible: false } }); dispatch({ type: 'changeBasicQuery', basicQuery }); const { globalQuery, filterQuery } = tranformQuery({ customFilter, basicQuery }); onChange?.({ complexFilter, globalQuery, filterQuery, type }); } if (type === 'clear') { dispatch({ type: 'reset' }); const { globalQuery, fuzzyQuery, filterQuery } = tranformQuery({ customFilter, searchQuery, basicQuery }); onChange?.({ fuzzyFilter: searchFilter, basicFilter, fuzzyQuery, globalQuery, filterQuery, type: 'clear' }); } }, [tranformQuery, state]); // 清除事件 const onClearChange = (0, _react.useCallback)(() => { const params = { searchFilter: {}, searchQuery: {}, basicFilter: {}, complexFilter: {}, basicQuery: {}, type: 'clear' }; props.onClearChange?.(params); onQuery(params); }, [onQuery]); // 根据字段查找过滤的数据, 不存在时返回默认值 const getFilterValue = (0, _react.useCallback)(({ field, type }) => { if ((0, _utils.getIsHas)(state.basicFilter[field])) { return state.basicFilter[field]; } const defaultValue = (0, _utils.getValueForType)(type); return state.basicFilter[field] || defaultValue; }, [state.basicFilter]); // 获取查询结构 const getFilterQuery = (0, _react.useCallback)((originData = dataSource) => { const basicFilter = (0, _utils.getFilterShow)(state.basicFilter, originData); const basicQuery = (0, _utils.getFilterShow)(state.basicQuery, originData); dispatch({ type: 'changeBasicFilter', basicFilter }); dispatch({ type: 'changeBasicQuery', basicQuery }); const { globalQuery, fuzzyQuery, filterQuery } = tranformQuery({ customFilter: state.customFilter, searchQuery: state.searchQuery, basicQuery }); return { fuzzyFilter: state.searchFilter, basicFilter, fuzzyQuery, globalQuery, filterQuery, type: 'basic' }; }, [state, dataSource]); /* * 设置筛选的值 itemValue => String || Array => ['', '', ...] * 后端仅接受数组包字符串形式, 不接受数值及布尔值 */ const setFilterValue = (0, _react.useCallback)((itemValue, item) => { const { field } = item; if (field) { // 将结果转换为字符串(级联数据需要递归) const transformString = val => Array.isArray(val) ? val.map(v => transformString(v)) : String(val); const stringValue = enableAutoString ? transformString(itemValue) : itemValue; // 基础查询数据(受控数据) const basicFilter = { ...state.basicFilter, [field]: stringValue }; // 外部查询数据结构 const basicQuery = { ...state.basicQuery, [field]: { fieldName: field, fieldType: item.valueType || 'string', type: item.type, value: Array.isArray(itemValue) ? stringValue : [stringValue], operator: item.operator || 'equal' } }; // 数据清除时不返回结构体 if (!(0, _utils.getIsHas)(itemValue)) { delete basicFilter[field]; delete basicQuery[field]; } // 触发外部事件 onQuery?.({ basicFilter, basicQuery, type: 'basic' }); } }, [state]); // 单个设置过滤字段值, 会触发onChange事件, 多个字段时使用setLocalization const setFilterFieldValue = (0, _react.useCallback)((field, value) => { const item = dataSource.find(v => v.fidld === field) || {}; setFilterValue?.(value, item); }, [dataSource]); // 读取缓存 const setLocalization = (0, _react.useCallback)((localization = props.localization) => { const { searchFilter, searchQuery, basicFilter, basicQuery, customFilter, customQuery } = initLocalization({ ...props, localization }); dispatch({ type: 'changeSearchFilter', searchFilter }); dispatch({ type: 'changeSearchQuery', searchQuery }); dispatch({ type: 'changeBasicFilter', basicFilter }); dispatch({ type: 'changeBasicQuery', basicQuery }); dispatch({ type: 'changeCustomFilter', customFilter }); dispatch({ type: 'changeCustomQuery', customQuery }); }, [props]); // 模糊查询结构 const setSearchFilter = (0, _react.useCallback)(itemValue => { let searchFilter = searchKey?.reduce((pre, cur) => { pre[cur] = itemValue; return pre; }, { ...state.searchFilter }); let searchQuery = searchKey?.reduce((pre, cur) => { pre[cur] = { ...searchConfig, fieldName: cur, value: [itemValue] }; return pre; }, { ...state.searchQuery }); // 数据清除时不返回结构体 if (!(0, _utils.getIsHas)(itemValue)) { searchFilter = {}; searchQuery = {}; } onQuery({ searchFilter, searchQuery, type: 'search' }); }, [searchKey, state]); // 自定义筛选查询 const setCustomFilter = (0, _react.useCallback)(val => { const customFilter = customOptions.find(v => v.value === val); onQuery({ customFilter, type: 'custom' }); }, [customOptions, state.basicFilter]); // 组件内部使用 const CoreMethods = { onQuery, setCustomFilter, setSearchFilter }; // 参与Ref转发 const RefMethods = { getState: () => state, getBasicFilter: () => state.basicFilter, getFilterValue, getFilterQuery, getHasFilter, setFilterValue, setFilterFieldValue, setLocalization, onClearChange }; return { CoreMethods, RefMethods }; }; var _default = useCoreOptions; exports.default = _default;