UNPKG

@antv/s2-react-components

Version:

React components for S2

209 lines 12.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.AdvancedSort = void 0; const tslib_1 = require("tslib"); const icons_1 = require("@ant-design/icons"); const s2_1 = require("@antv/s2"); const antd_1 = require("antd"); const classnames_1 = tslib_1.__importDefault(require("classnames")); const lodash_1 = require("lodash"); const react_1 = tslib_1.__importStar(require("react")); const custom_sort_1 = require("./custom-sort"); require("./index.less"); const { Sider, Content } = antd_1.Layout; exports.AdvancedSort = react_1.default.memo(({ sheetInstance, className, icon, text, ruleText, dimensions, ruleOptions, sortParams, onSortOpen, onSortConfirm, }) => { const [isSortVisible, setIsModalVisible] = (0, react_1.useState)(false); const [isCustomVisible, setIsCustomVisible] = (0, react_1.useState)(false); const [ruleList, setRuleList] = (0, react_1.useState)([]); const [rules, setRules] = (0, react_1.useState)([]); const [manualDimensionList, setManualDimensionList] = (0, react_1.useState)([]); const [dimensionList, setDimensionList] = (0, react_1.useState)([]); const [sortBy, setSortBy] = (0, react_1.useState)([]); const [currentDimension, setCurrentDimension] = (0, react_1.useState)(); const [form] = antd_1.Form.useForm(); const SORT_RULE_OPTIONS = react_1.default.useMemo(s2_1.getSortRuleOptions, []); const SORT_METHOD = react_1.default.useMemo(s2_1.getSortMethod, []); const handleModal = () => { setIsModalVisible(!isSortVisible); }; const sortClick = () => { onSortOpen === null || onSortOpen === void 0 ? void 0 : onSortOpen(); handleModal(); }; const handleCustom = () => { setIsCustomVisible(!isCustomVisible); }; const handleDimension = (dimension) => { if (!(0, lodash_1.find)(ruleList, (item) => item.field === dimension.field)) { setCurrentDimension(dimension); setRuleList([...ruleList, dimension]); } setDimensionList((0, lodash_1.filter)(dimensionList, (item) => item.field !== dimension.field)); }; const handleCustomSort = (dimension, splitOrders) => { var _a; handleCustom(); setCurrentDimension(dimension); if (splitOrders) { setSortBy((0, lodash_1.uniq)(splitOrders)); } else { setSortBy((0, lodash_1.uniq)(((_a = (0, lodash_1.find)(manualDimensionList, (item) => item.field === dimension.field)) === null || _a === void 0 ? void 0 : _a.list) || [])); } }; const customSort = () => { handleCustom(); const currentFieldValue = form.getFieldsValue([currentDimension === null || currentDimension === void 0 ? void 0 : currentDimension.field]); currentFieldValue.sortBy = sortBy; form.setFieldsValue({ [currentDimension === null || currentDimension === void 0 ? void 0 : currentDimension.field]: currentFieldValue }); const newRuleList = (0, lodash_1.map)(ruleList, (item) => { if (item.field === (currentDimension === null || currentDimension === void 0 ? void 0 : currentDimension.field)) { return Object.assign(Object.assign({}, item), { rule: 'sortBy', sortBy, sortMethod: '', sortByMeasure: '' }); } return item; }); setRuleList(newRuleList); }; const customCancel = () => { handleCustom(); }; const deleteRule = (dimension) => { setRuleList((0, lodash_1.filter)(ruleList, (item) => item.field !== dimension.field)); setDimensionList([...dimensionList, dimension]); }; const onFinish = () => { const ruleValue = form.getFieldsValue(); const { values = [] } = sheetInstance.dataCfg.fields; const ruleValues = []; const currentSortParams = []; (0, lodash_1.forEach)((0, lodash_1.keys)(ruleValue), (item) => { const { sortMethod, rule = [], sortBy: currentSortBy, } = ruleValue[item]; const current = { sortFieldId: item }; if (rule[0] === 'sortByMeasure' || rule[1]) { // 如果不是数值 key ,则按照汇总值排序 if (!(0, lodash_1.includes)(values, rule[1])) { current.sortByMeasure = s2_1.TOTAL_VALUE; } else { current.sortByMeasure = rule[1]; } current.sortMethod = sortMethod; current.query = { [s2_1.EXTRA_FIELD]: rule[1], }; } else if (rule[0] === 'sortBy') { current.sortBy = currentSortBy; } else { current.sortMethod = sortMethod; } ruleValues.push(Object.assign({ field: item }, ruleValue[item])); currentSortParams.push(current); }); onSortConfirm === null || onSortConfirm === void 0 ? void 0 : onSortConfirm(ruleValues, currentSortParams); handleModal(); }; const getDimensionList = (list) => (0, lodash_1.filter)(list, (item) => !(0, lodash_1.find)(sortParams, (sortParam) => sortParam.sortFieldId === item.field)); const getManualDimensionList = () => { if (dimensions) { return dimensions; } const { fields = {} } = sheetInstance.dataCfg || {}; const { rows = [], columns = [] } = fields; return (0, lodash_1.map)([...rows, ...columns], (item) => { const name = typeof item === 'string' ? item : item.field; return { field: item, name: sheetInstance.dataSet.getFieldName(name), list: sheetInstance.dataSet.getDimensionValues(name), }; }); }; const getRuleOptions = () => { if (ruleOptions) { return ruleOptions; } return (0, lodash_1.map)(SORT_RULE_OPTIONS, (item) => { if (item.value === 'sortByMeasure') { const { values = [] } = sheetInstance.dataCfg.fields || {}; // @ts-ignore item.children = (0, lodash_1.map)(values, (field) => { return { label: sheetInstance.dataSet.getFieldName(field), value: field, }; }); } return item; }); }; const getRuleList = () => (0, lodash_1.map)(sortParams, (item) => { const { sortFieldId, sortMethod, sortBy: currentSortBy, sortByMeasure, } = item; let rule; if (currentSortBy) { rule = ['sortBy']; } else if (sortByMeasure) { rule = ['sortByMeasure', sortByMeasure]; } else { rule = ['sortMethod']; } return { field: sortFieldId, name: sheetInstance.dataSet.getFieldName(sortFieldId), rule, sortMethod, sortBy: currentSortBy, sortByMeasure, }; }); const renderSide = () => (react_1.default.createElement(Sider, { width: 120, className: `${s2_1.ADVANCED_SORT_PRE_CLS}-sider-layout` }, react_1.default.createElement("div", { className: `${s2_1.ADVANCED_SORT_PRE_CLS}-title` }, (0, s2_1.i18n)('可选字段')), react_1.default.createElement("div", null, (0, lodash_1.map)(dimensionList, (item) => (react_1.default.createElement("div", { className: `${s2_1.ADVANCED_SORT_PRE_CLS}-dimension-item`, key: item.field, title: item.name, onClick: () => { handleDimension(item); } }, item.name)))))); const renderContent = () => (react_1.default.createElement(Content, { className: `${s2_1.ADVANCED_SORT_PRE_CLS}-content-layout` }, react_1.default.createElement("div", { className: `${s2_1.ADVANCED_SORT_PRE_CLS}-title` }, ruleText || (0, s2_1.i18n)('按以下规则进行排序(优先级由低到高)')), react_1.default.createElement(antd_1.Form, { form: form, name: "form", className: `${s2_1.ADVANCED_SORT_PRE_CLS}-custom-form` }, (0, lodash_1.map)(ruleList, (item) => { const { field, name, rule, sortMethod, sortBy: currentSortBy, } = item || {}; return (react_1.default.createElement(antd_1.Form.Item, { key: field }, react_1.default.createElement(antd_1.Form.Item, { name: [field, 'name'], initialValue: name, noStyle: true }, react_1.default.createElement(antd_1.Select, { className: `${s2_1.ADVANCED_SORT_PRE_CLS}-select`, size: "small" })), react_1.default.createElement("span", { className: `${s2_1.ADVANCED_SORT_PRE_CLS}-field-prefix` }, (0, s2_1.i18n)('按')), react_1.default.createElement(antd_1.Form.Item, { name: [field, 'rule'], initialValue: rule || ['sortMethod'], noStyle: true }, react_1.default.createElement(antd_1.Cascader, { options: rules, expandTrigger: "hover", size: "small", allowClear: false })), react_1.default.createElement(antd_1.Form.Item, { shouldUpdate: true, noStyle: true }, ({ getFieldValue }) => !(0, lodash_1.isEqual)(getFieldValue([field, 'rule']), ['sortBy']) ? (react_1.default.createElement(antd_1.Form.Item, { shouldUpdate: true, noStyle: true, name: [field, 'sortMethod'], initialValue: (0, lodash_1.toUpper)(sortMethod) || 'ASC' }, react_1.default.createElement(antd_1.Radio.Group, { className: `${s2_1.ADVANCED_SORT_PRE_CLS}-rule-end` }, (0, lodash_1.map)(SORT_METHOD, (i) => (react_1.default.createElement(antd_1.Radio, { value: i.value, key: i.value }, i.name)))))) : (react_1.default.createElement(react_1.default.Fragment, null, react_1.default.createElement("a", { className: `${s2_1.ADVANCED_SORT_PRE_CLS}-rule-end`, onClick: () => { handleCustomSort(item, currentSortBy); } }, (0, s2_1.i18n)('设置顺序')), react_1.default.createElement(antd_1.Form.Item, { noStyle: true, name: [field, 'sortBy'], initialValue: currentSortBy })))), react_1.default.createElement(icons_1.DeleteOutlined, { className: `${s2_1.ADVANCED_SORT_PRE_CLS}-rule-end-delete`, onClick: () => { deleteRule(item); } }))); })))); (0, react_1.useEffect)(() => { if (isSortVisible) { const initRuleList = getRuleList(); const manualDimensions = getManualDimensionList(); const initDimensionList = getDimensionList(manualDimensions); const initRuleOptions = getRuleOptions(); setRuleList(initRuleList); setManualDimensionList(manualDimensions); setDimensionList(initDimensionList); setRules(initRuleOptions); } }, [isSortVisible]); return (react_1.default.createElement("div", { className: (0, classnames_1.default)(s2_1.ADVANCED_SORT_PRE_CLS, className) }, react_1.default.createElement(antd_1.Button, { onClick: sortClick, icon: icon || react_1.default.createElement(icons_1.OrderedListOutlined, null), size: "small", className: `${s2_1.ADVANCED_SORT_PRE_CLS}-btn` }, text || (0, s2_1.i18n)('高级排序')), react_1.default.createElement(antd_1.Modal, { title: text || (0, s2_1.i18n)('高级排序'), open: isSortVisible, onOk: onFinish, onCancel: handleModal, okText: (0, s2_1.i18n)('确定'), cancelText: (0, s2_1.i18n)('取消'), destroyOnClose: true, className: `${s2_1.ADVANCED_SORT_PRE_CLS}-modal` }, react_1.default.createElement(antd_1.Layout, null, renderSide(), renderContent())), react_1.default.createElement(antd_1.Modal, { title: (0, s2_1.i18n)('手动排序'), open: isCustomVisible, onOk: customSort, onCancel: customCancel, okText: (0, s2_1.i18n)('确定'), cancelText: (0, s2_1.i18n)('取消'), destroyOnClose: true, className: `${s2_1.ADVANCED_SORT_PRE_CLS}-custom-modal` }, react_1.default.createElement(custom_sort_1.CustomSort, { splitOrders: sortBy, setSplitOrders: setSortBy })))); }); exports.AdvancedSort.displayName = 'AdvancedSort'; //# sourceMappingURL=advanced-sort.js.map