UNPKG

es-grid-template

Version:

es-grid-template

168 lines (164 loc) 5.93 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.multiSelect = multiSelect; var _react = _interopRequireDefault(require("react")); var _internals = require("../../internals"); var _others = require("../../utils/others"); function multiSelect(opts = {}) { return function multiSelectStep(pipeline) { const stateKey = 'multiSelect'; const Checkbox = pipeline.ctx.components.Checkbox; if (Checkbox == null) { throw new Error('Error'); } const primaryKey = pipeline.ensurePrimaryKey('multiSelect'); const isDisabled = opts.isDisabled ?? (0, _others.always)(false); const clickArea = opts.clickArea ?? 'checkbox'; const value = opts.value ?? pipeline.getStateAtKey(stateKey)?.value ?? opts.defaultValue ?? []; const lastKey = opts.lastKey ?? pipeline.getStateAtKey(stateKey)?.lastKey ?? opts.defaultLastKey ?? ''; const onChange = (nextValue, key, keys, action) => { opts.onChange?.(nextValue, key, keys, action); pipeline.setStateAtKey(stateKey, { value: nextValue, lastKey: key }, { keys, action }); }; const dataSource = pipeline.getDataSource(); /** All keys contained in the dataSource */ const fullKeySet = new Set(); /** All valid keys (where disabled is false) */ const allKeys = []; dataSource.forEach((row, rowIndex) => { const rowKey = _internals.internals.safeGetRowKey(primaryKey, row, rowIndex); fullKeySet.add(rowKey); // Exclude disabled keys from allKeys if (!isDisabled(row, rowIndex)) { allKeys.push(rowKey); } }); const set = new Set(value); const isAllChecked = allKeys.length > 0 && allKeys.every(key => set.has(key)); const isAnyChecked = allKeys.some(key => set.has(key)); const defaultCheckboxColumnTitle = /*#__PURE__*/_react.default.createElement(Checkbox, { checked: isAllChecked, indeterminate: !isAllChecked && isAnyChecked, onChange: () => { if (isAllChecked) { onChange(_others.arrayUtils.diff(value, allKeys), '', allKeys, 'uncheck-all'); } else { onChange(_others.arrayUtils.merge(value, allKeys), '', allKeys, 'check-all'); } } }); const checkboxColumn = { headerText: 'checkbox', field: 'checkbox', title: defaultCheckboxColumnTitle, width: 50, textAlign: 'center', ...opts.checkboxColumn, getCellProps(val, row, rowIndex) { const rowKey = _internals.internals.safeGetRowKey(primaryKey, row, rowIndex); if (fullKeySet.has(rowKey) && clickArea === 'cell') { const prevChecked = set.has(rowKey); const disabled = isDisabled(row, rowIndex); return { style: { cursor: disabled ? 'not-allowed' : 'pointer' }, onClick: disabled ? undefined : e => { if (opts.stopClickEventPropagation) { e.stopPropagation(); } onCheckboxChange(prevChecked, rowKey, e.shiftKey); } }; } else { return {}; } }, template(args) { const { rowData: row, index: rowIndex } = args; const key = _internals.internals.safeGetRowKey(primaryKey, row, rowIndex); const checked = set.has(key); return /*#__PURE__*/_react.default.createElement(Checkbox, { checked: checked, disabled: isDisabled(row, rowIndex), onChange: clickArea === 'checkbox' ? (arg1, arg2) => { const nativeEvent = arg2?.nativeEvent ?? arg1.nativeEvent; if (nativeEvent) { if (opts.stopClickEventPropagation) { nativeEvent.stopPropagation(); } onCheckboxChange(checked, key, nativeEvent.shiftKey); } } : undefined }); } }; const nextColumns = pipeline.getColumns().slice(); const checkboxPlacement = opts.checkboxPlacement ?? 'start'; if (checkboxPlacement === 'start') { nextColumns.unshift(checkboxColumn); } else { nextColumns.push(checkboxColumn); } pipeline.columns(nextColumns); // @ts-ignore pipeline.appendRowPropsGetter((row, rowIndex) => { const rowKey = _internals.internals.safeGetRowKey(primaryKey, row, rowIndex); if (!fullKeySet.has(rowKey)) { // If rowKey is not in fullKeySet this row was generated after multiSelect; skip processing return; } const style = {}; let className = ''; let onClick; const checked = set.has(rowKey); if (opts.highlightRowWhenSelected && checked) { className = 'highlight'; } if (clickArea === 'row') { const disabled = isDisabled(row, rowIndex); if (!disabled) { style.cursor = 'pointer'; onClick = e => { if (opts.stopClickEventPropagation) { e.stopPropagation(); } onCheckboxChange(checked, rowKey, e.shiftKey); }; } } return { className, style, onClick }; }); return pipeline; function onCheckboxChange(prevChecked, key, batch) { let batchKeys = [key]; if (batch && lastKey) { const lastIdx = allKeys.indexOf(lastKey); const cntIdx = allKeys.indexOf(key); const [start, end] = lastIdx < cntIdx ? [lastIdx, cntIdx] : [cntIdx, lastIdx]; batchKeys = allKeys.slice(start, end + 1); } if (prevChecked) { onChange?.(_others.arrayUtils.diff(value, batchKeys), key, batchKeys, 'uncheck'); } else { onChange?.(_others.arrayUtils.merge(value, batchKeys), key, batchKeys, 'check'); } } }; }