UNPKG

@sms-frontend/components

Version:

SMS Design React UI Library.

148 lines (147 loc) 6.43 kB
var __read = (this && this.__read) || function (o, n) { var m = typeof Symbol === "function" && o[Symbol.iterator]; if (!m) return o; var i = m.call(o), r, ar = [], e; try { while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); } catch (error) { e = { error: error }; } finally { try { if (r && !r.done && (m = i["return"])) m.call(i); } finally { if (e) throw e.error; } } return ar; }; var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { if (ar || !(i in from)) { if (!ar) ar = Array.prototype.slice.call(from, 0, i); ar[i] = from[i]; } } return to.concat(ar || Array.prototype.slice.call(from)); }; import { useState } from 'react'; import { isChildrenNotEmpty } from '../utils'; import { isArray } from '../../_util/is'; function getSet(arr) { return __spreadArray([], __read(new Set(arr)), false); } export default function useRowSelection(props, data, getRowKey) { var rowSelection = props.rowSelection, originData = props.data; var controlledSelectedRowKeys = rowSelection && rowSelection.selectedRowKeys; var onSelectAll = rowSelection && rowSelection.onSelectAll; var onSelect = rowSelection && rowSelection.onSelect; var onChange = rowSelection && rowSelection.onChange; var pureKeys = rowSelection && rowSelection.pureKeys; var preserveSelectedRowKeys = rowSelection && rowSelection.preserveSelectedRowKeys; // 获取扁平化之后的 data function getMetaFromData() { var allSelectedRowKeys = []; var flattenData = []; var travel = function (children) { if (isArray(children) && children.length) { children.forEach(function (record) { var rowKey = getRowKey(record); var checkboxProps = rowSelection && typeof rowSelection.checkboxProps === 'function' ? rowSelection.checkboxProps(record) : {}; if (!checkboxProps.disabled) { allSelectedRowKeys.push(rowKey); } if (isChildrenNotEmpty(record, props.childrenColumnName)) { travel(record[props.childrenColumnName]); } }); } }; travel(data); var travelOrigin = function (children) { if (isArray(children) && children.length) { children.forEach(function (record) { flattenData.push(record); if (isChildrenNotEmpty(record, props.childrenColumnName)) { travelOrigin(record[props.childrenColumnName]); } }); } }; travelOrigin(originData); return { allSelectedRowKeys: allSelectedRowKeys, flattenData: flattenData, }; } var _a = getMetaFromData(), allSelectedRowKeys = _a.allSelectedRowKeys, flattenData = _a.flattenData; var defaultSelectedRowKeys = []; if (rowSelection && rowSelection.selectedRowKeys) { defaultSelectedRowKeys = rowSelection.selectedRowKeys; } var _b = __read(useState(getSet(defaultSelectedRowKeys)), 2), selectedRowKeys = _b[0], setSelectedRowKeys = _b[1]; var _c = __read(useState(pureKeys ? [] : getRowsFromKeys(selectedRowKeys)), 2), selectedRows = _c[0], setSelectedRows = _c[1]; function getRowsFromKeys(keys, plus) { var all = plus ? flattenData.concat(selectedRows) : flattenData; return keys.map(function (r) { return all.find(function (f) { return f && getRowKey(f) === r; }); }).filter(function (a) { return a; }); } var mergedSelectedRowKeys = getSet(controlledSelectedRowKeys || selectedRowKeys); function deleteUnExistKeys(keys) { return preserveSelectedRowKeys ? keys : keys.filter(function (k) { return flattenData.findIndex(function (d) { return getRowKey(d) === k; }) > -1; }); } function onCheckAll(checked) { var newSelectedRowKeys = []; var newSelectedRows = []; if (checked) { newSelectedRowKeys = deleteUnExistKeys(getSet(mergedSelectedRowKeys.concat(allSelectedRowKeys))); } else { newSelectedRowKeys = deleteUnExistKeys(mergedSelectedRowKeys.filter(function (key) { return allSelectedRowKeys.indexOf(key) === -1; })); } if (!pureKeys) { newSelectedRows = getRowsFromKeys(newSelectedRowKeys, true); } setSelectedRowKeys(newSelectedRowKeys); setSelectedRows(newSelectedRows); onChange && onChange(newSelectedRowKeys, newSelectedRows); onSelectAll && onSelectAll(checked, newSelectedRows); } function onCheck(checked, record) { var rowK = getRowKey(record); var newSelectedRowKeys = []; var newSelectedRows = []; if (checked) { newSelectedRowKeys = deleteUnExistKeys(mergedSelectedRowKeys.concat(rowK)); if (!pureKeys) { newSelectedRows = getRowsFromKeys(newSelectedRowKeys, true); } } else { newSelectedRowKeys = deleteUnExistKeys(mergedSelectedRowKeys.filter(function (key) { return key !== rowK; })); if (!pureKeys) { newSelectedRows = getRowsFromKeys(newSelectedRowKeys, true); } } setSelectedRowKeys(newSelectedRowKeys); setSelectedRows(newSelectedRows); onSelect && onSelect(checked, record, newSelectedRows); onChange && onChange(newSelectedRowKeys, newSelectedRows); } function onCheckRadio(key, record) { var newSelectedRows = [flattenData.find(function (d) { return getRowKey(d) === key; })]; setSelectedRowKeys([key]); onSelect && onSelect(true, record, newSelectedRows); onChange && onChange([key], newSelectedRows); } return { selectedRowKeys: mergedSelectedRowKeys, onCheckAll: onCheckAll, onCheck: onCheck, onCheckRadio: onCheckRadio, setSelectedRowKeys: setSelectedRowKeys, allSelectedRowKeys: allSelectedRowKeys, flattenData: flattenData, }; }