choerodon-ui
Version:
An enterprise-class UI design language and React-based implementation
492 lines (416 loc) • 17.5 kB
JavaScript
import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
import _createForOfIteratorHelper from "@babel/runtime/helpers/createForOfIteratorHelper";
import _objectSpread from "@babel/runtime/helpers/objectSpread2";
import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
import _defineProperty from "@babel/runtime/helpers/defineProperty";
import _typeof from "@babel/runtime/helpers/typeof";
import _regeneratorRuntime from "@babel/runtime/regenerator";
import React, { useContext, useEffect, useState } from 'react';
import { runInAction } from 'mobx';
import { observer } from 'mobx-react-lite';
import map from 'lodash/map';
import isObject from 'lodash/isObject';
import isEnumEmpty from 'lodash/isEmpty';
import isArray from 'lodash/isArray';
import noop from 'lodash/noop';
import omit from 'lodash/omit';
import isEqual from 'lodash/isEqual';
import ConfigContext from '../../../../../es/config-provider/ConfigContext';
import { $l } from '../../../locale-context';
import Button from '../../../button';
import { ButtonColor } from '../../../button/enum';
import Record from '../../../data-set/Record';
import { RecordStatus } from '../../../data-set/enum';
import { SELECTFIELDS } from '../TableComboBar';
import { isEqualDynamicProps, parseValue, stringifyValue, isSelect } from '../TableDynamicFilterBar';
import Store from './QuickFilterMenuContext';
/**
* 根据数据查找需要处理的字段对象
* @param queryDataSet
* @param data
*/
function findFieldObj(queryDataSet, data) {
var name = data[0];
var value = data[1];
if (!queryDataSet.fields.has(data[0]) && isObject(data[1]) && !isEnumEmpty(data[1]) && !isArray(data[1])) {
name = "".concat(data[0], ".").concat(Object.keys(data[1])[0]);
value = Object.values(data[1])[0];
}
var field = queryDataSet.getField(name);
if (field && field.get('lovCode')) {
var _value;
var textField = field.get('textField');
var valueField = field.get('valueField');
if (_typeof(value) !== 'object') {
return {
name: name,
value: value,
originalValue: field.getValue().slice()
};
}
return {
name: name,
value: (_value = {}, _defineProperty(_value, valueField, value[valueField]), _defineProperty(_value, textField, value[textField]), _value)
};
}
if (field && field.get('ignore') !== 'always') {
return {
name: name,
value: value
};
}
}
/**
* 快速筛选下拉
*/
var QuickFilterButton = function QuickFilterButton() {
var _useState = useState(false),
_useState2 = _slicedToArray(_useState, 2),
customizedChange = _useState2[0],
setCustomizedChange = _useState2[1];
var _useContext = useContext(ConfigContext),
getConfig = _useContext.getConfig;
var _useContext2 = useContext(Store),
tempQueryFields = _useContext2.tempQueryFields,
autoQuery = _useContext2.autoQuery,
dataSet = _useContext2.dataSet,
menuDataSet = _useContext2.menuDataSet,
prefixCls = _useContext2.prefixCls,
queryDataSet = _useContext2.queryDataSet,
filterMenuDataSet = _useContext2.filterMenuDataSet,
conditionDataSet = _useContext2.conditionDataSet,
_useContext2$onChange = _useContext2.onChange,
onChange = _useContext2$onChange === void 0 ? noop : _useContext2$onChange,
conditionStatus = _useContext2.conditionStatus,
_useContext2$onStatus = _useContext2.onStatusChange,
onStatusChange = _useContext2$onStatus === void 0 ? noop : _useContext2$onStatus,
selectFields = _useContext2.selectFields,
_useContext2$onOrigin = _useContext2.onOriginalChange,
onOriginalChange = _useContext2$onOrigin === void 0 ? noop : _useContext2$onOrigin,
_useContext2$filterSa = _useContext2.filterSave,
filterSave = _useContext2$filterSa === void 0 ? true : _useContext2$filterSa,
_useContext2$filterSa2 = _useContext2.filterSaveCallback,
filterSaveCallback = _useContext2$filterSa2 === void 0 ? noop : _useContext2$filterSa2,
_useContext2$onReset = _useContext2.onReset,
onReset = _useContext2$onReset === void 0 ? noop : _useContext2$onReset,
tableStore = _useContext2.tableStore,
refEditors = _useContext2.refEditors;
var isChooseMenu = filterMenuDataSet && filterMenuDataSet.current && filterMenuDataSet.current.get('filterName');
var personalColumn = menuDataSet && menuDataSet.current && menuDataSet.current.get('personalColumn') && parseValue(menuDataSet.current.get('personalColumn')) || {};
var customized = tableStore && tableStore.customized;
useEffect(function () {
if (customized || personalColumn) {
var columns = customized && customized.columns;
setCustomizedChange(isEqual(parseValue(columns), personalColumn));
}
}, [customized, personalColumn]);
/**
* queryDS 筛选赋值并更新初始勾选项
* @param init
*/
var conditionAssign = /*#__PURE__*/function () {
var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(init) {
var current, shouldQuery, conditionList, initData, currentQueryRecord, emptyRecord, _emptyRecord, customizedColumn, hasFocus, _iterator, _step, _step$value, key, value;
return _regeneratorRuntime.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
onOriginalChange();
current = menuDataSet.current;
shouldQuery = false;
if (!current) {
_context.next = 30;
break;
}
conditionList = current.get('personalFilter') && parseValue(current.get('personalFilter'));
initData = {};
if (tempQueryFields) {
runInAction(function () {
queryDataSet.fields = tempQueryFields;
});
}
currentQueryRecord = queryDataSet.current;
if (conditionList && conditionList.length) {
map(conditionList, function (condition) {
var fieldName = condition.fieldName,
value = condition.value;
initData[fieldName] = parseValue(value);
onChange(fieldName);
});
onOriginalChange(Object.keys(initData));
emptyRecord = new Record(_objectSpread({}, initData), queryDataSet);
dataSet.setState(SELECTFIELDS, Object.keys(initData));
shouldQuery = !isEqualDynamicProps(initData, currentQueryRecord ? omit(currentQueryRecord.toData(true), ['__dirty']) : {}, queryDataSet, currentQueryRecord);
runInAction(function () {
queryDataSet.records.push(emptyRecord);
queryDataSet.current = emptyRecord;
});
onStatusChange(RecordStatus.sync, emptyRecord.toData());
} else {
shouldQuery = !isEqualDynamicProps(initData, currentQueryRecord ? omit(currentQueryRecord.toData(true), ['__dirty']) : {}, queryDataSet, currentQueryRecord);
_emptyRecord = new Record({}, queryDataSet);
dataSet.setState(SELECTFIELDS, []);
runInAction(function () {
queryDataSet.records.push(_emptyRecord);
queryDataSet.current = _emptyRecord;
});
onStatusChange(RecordStatus.sync);
}
customizedColumn = current.get('personalColumn') && parseValue(current.get('personalColumn'));
if (tableStore) {
runInAction(function () {
var newCustomized = {
columns: _objectSpread({}, customizedColumn)
};
tableStore.tempCustomized = {
columns: {}
};
tableStore.saveCustomized(newCustomized);
tableStore.initColumns();
});
}
if (!(!init && shouldQuery && autoQuery)) {
_context.next = 30;
break;
}
_context.next = 14;
return dataSet.modifiedCheck(undefined, dataSet, 'query');
case 14:
_context.t2 = _context.sent;
if (!_context.t2) {
_context.next = 17;
break;
}
_context.t2 = queryDataSet;
case 17:
_context.t1 = _context.t2;
if (!_context.t1) {
_context.next = 20;
break;
}
_context.t1 = queryDataSet.current;
case 20:
_context.t0 = _context.t1;
if (!_context.t0) {
_context.next = 25;
break;
}
_context.next = 24;
return queryDataSet.current.validate();
case 24:
_context.t0 = _context.sent;
case 25:
if (!_context.t0) {
_context.next = 29;
break;
}
dataSet.query();
_context.next = 30;
break;
case 29:
if (refEditors) {
hasFocus = false;
_iterator = _createForOfIteratorHelper(refEditors.entries());
try {
for (_iterator.s(); !(_step = _iterator.n()).done;) {
_step$value = _slicedToArray(_step.value, 2), key = _step$value[0], value = _step$value[1];
if (value && !value.valid && !hasFocus) {
refEditors.get(key).focus();
hasFocus = true;
}
}
} catch (err) {
_iterator.e(err);
} finally {
_iterator.f();
}
}
case 30:
case "end":
return _context.stop();
}
}
}, _callee);
}));
return function conditionAssign(_x) {
return _ref.apply(this, arguments);
};
}();
var handleQueryReset = /*#__PURE__*/function () {
var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2() {
var first, hasFocus, _iterator2, _step2, _step2$value, key, value;
return _regeneratorRuntime.wrap(function _callee2$(_context2) {
while (1) {
switch (_context2.prev = _context2.next) {
case 0:
if (!(filterMenuDataSet && filterMenuDataSet.current && filterMenuDataSet.current.get('filterName'))) {
_context2.next = 4;
break;
}
// 筛选项重置重新赋值
conditionAssign();
_context2.next = 24;
break;
case 4:
/**
* 未选择或清除筛选项
* 重置初始勾选项及初始赋值
*/
queryDataSet.locate(0);
first = queryDataSet.get(0);
if (first) {
first.reset();
}
onOriginalChange();
if (!autoQuery) {
_context2.next = 24;
break;
}
_context2.next = 11;
return dataSet.modifiedCheck(undefined, dataSet, 'query');
case 11:
_context2.t1 = _context2.sent;
if (!_context2.t1) {
_context2.next = 14;
break;
}
_context2.t1 = queryDataSet;
case 14:
_context2.t0 = _context2.t1;
if (!_context2.t0) {
_context2.next = 19;
break;
}
_context2.next = 18;
return queryDataSet.validate();
case 18:
_context2.t0 = _context2.sent;
case 19:
if (!_context2.t0) {
_context2.next = 23;
break;
}
dataSet.query();
_context2.next = 24;
break;
case 23:
if (refEditors) {
hasFocus = false;
_iterator2 = _createForOfIteratorHelper(refEditors.entries());
try {
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
_step2$value = _slicedToArray(_step2.value, 2), key = _step2$value[0], value = _step2$value[1];
if (value && !value.valid && !hasFocus) {
refEditors.get(key).focus();
hasFocus = true;
}
}
} catch (err) {
_iterator2.e(err);
} finally {
_iterator2.f();
}
}
case 24:
onReset();
onStatusChange(RecordStatus.sync);
case 26:
case "end":
return _context2.stop();
}
}
}, _callee2);
}));
return function handleQueryReset() {
return _ref2.apply(this, arguments);
};
}();
var handleSave = /*#__PURE__*/function () {
var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee3() {
var current, conditionData, putData, data, customizedColumns;
return _regeneratorRuntime.wrap(function _callee3$(_context3) {
while (1) {
switch (_context3.prev = _context3.next) {
case 0:
current = queryDataSet.current;
if (current && conditionDataSet) {
conditionData = Object.entries(omit(current.toData(), ['__dirty']));
conditionDataSet.reset();
conditionDataSet.map(function (record) {
if (!selectFields || !selectFields.includes(record.get('fieldName'))) {
conditionDataSet.remove(record);
}
return null;
});
map(conditionData, function (data) {
var fieldObj = findFieldObj(queryDataSet, data);
if (fieldObj) {
var name = fieldObj.name;
if (name) {
var currentRecord = conditionDataSet.find(function (record) {
return record.get('fieldName') === name;
});
if (currentRecord) {
currentRecord.set('value', fieldObj.value);
currentRecord.set('originalValue', fieldObj.originalValue);
} else if (isSelect(data)) {
conditionDataSet.create({
fieldName: name,
value: fieldObj.value,
originalValue: fieldObj.originalValue
});
}
}
}
});
putData = [];
map(selectFields, function (fieldName) {
var value = current.get(fieldName);
var statusKey = getConfig('statusKey');
var statusAdd = getConfig('status').add;
var status = {};
var toJSONFields = conditionDataSet.toJSONData().map(function (condition) {
return condition.fieldName;
});
status[statusKey] = statusAdd; // 处理空值已勾选条件
if (!toJSONFields.includes(fieldName)) {
putData.push(_objectSpread({
fieldName: fieldName,
value: value
}, status));
}
});
data = [].concat(_toConsumableArray(conditionDataSet.toJSONData()), putData);
customizedColumns = tableStore && tableStore.customized && tableStore.customized.columns;
filterSaveCallback({
personalFilter: stringifyValue(data),
personalColumn: stringifyValue(customizedColumns)
});
} else {
dataSet.query();
}
case 2:
case "end":
return _context3.stop();
}
}
}, _callee3);
}));
return function handleSave() {
return _ref3.apply(this, arguments);
};
}();
return /*#__PURE__*/React.createElement(React.Fragment, null, (conditionStatus === RecordStatus.update || !customizedChange) && /*#__PURE__*/React.createElement("div", {
className: "".concat(prefixCls, "-combo-filter-buttons")
}, isChooseMenu && filterSave && /*#__PURE__*/React.createElement(Button, {
onClick: handleSave,
color: ButtonColor.primary
}, $l('Table', 'save_button')), /*#__PURE__*/React.createElement(Button, {
onClick: handleQueryReset,
color: ButtonColor.secondary
}, $l('Table', 'reset_button'))));
};
QuickFilterButton.displayName = 'QuickFilterButton';
export default observer(QuickFilterButton);
//# sourceMappingURL=QuickFilterButton.js.map