acud
Version:
acg react 组件库
342 lines (341 loc) • 15.4 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _typeof3 = require("@babel/runtime/helpers/typeof");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = useFilterSorter;
exports.getSortData = getSortData;
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _extends3 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
var React = _interopRequireWildcard(require("react"));
var _classnames = _interopRequireDefault(require("classnames"));
var _acudIcon = _interopRequireDefault(require("acud-icon"));
var _tooltip = _interopRequireDefault(require("../../tooltip"));
var _util = require("../util");
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, "default": e }; if (null === e || "object" != _typeof3(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
var UpSvg = function UpSvg() {
return /*#__PURE__*/React.createElement("svg", {
width: "16px",
height: "8px",
viewBox: "0 0 16 8",
fill: "currentColor"
}, /*#__PURE__*/React.createElement("path", {
d: "M9.14700743,0.645886681 C9.34257881,0.450934266 9.6591609,0.45143604 9.85411332,0.647007426 C10.0490657,0.842578811 10.048564,1.1591609 9.85299257,1.35411332 L7.207,3.991 L9.85411155,6.64700565 C10.0274035,6.82084602 10.0462629,7.09030055 9.91095914,7.28495516 L9.85299435,7.35411155 C9.65742394,7.54906495 9.34084184,7.54856476 9.14588845,7.35299435 L6.14588845,4.34349955 C5.95093436,4.14792845 5.95143535,3.83134499 6.14700743,3.63639189 L9.14700743,0.645886681 Z",
id: "1-L",
transform: "translate(8.000000, 4.000000) rotate(90.000000) translate(-8.000000, -4.000000) "
}));
};
var DownSvg = function DownSvg() {
return /*#__PURE__*/React.createElement("svg", {
width: "16px",
height: "8px",
viewBox: "0 0 16 8",
fill: "currentColor"
}, /*#__PURE__*/React.createElement("path", {
d: "M9.14700743,0.645886681 C9.34257881,0.450934266 9.6591609,0.45143604 9.85411332,0.647007426 C10.0490657,0.842578811 10.048564,1.1591609 9.85299257,1.35411332 L7.207,3.991 L9.85411155,6.64700565 C10.0274035,6.82084602 10.0462629,7.09030055 9.91095914,7.28495516 L9.85299435,7.35411155 C9.65742394,7.54906495 9.34084184,7.54856476 9.14588845,7.35299435 L6.14588845,4.34349955 C5.95093436,4.14792845 5.95143535,3.83134499 6.14700743,3.63639189 L9.14700743,0.645886681 Z",
id: "1-L",
transform: "translate(8.000000, 4.000000) rotate(-90.000000) translate(-8.000000, -4.000000) "
}));
};
var ASCEND = 'ascend';
var DESCEND = 'descend';
function getMultiplePriority(column) {
if ((0, _typeof2["default"])(column.sorter) === 'object' && typeof column.sorter.multiple === 'number') {
return column.sorter.multiple;
}
return false;
}
function getSortFunction(sorter) {
if (typeof sorter === 'function') {
return sorter;
}
if (sorter && (0, _typeof2["default"])(sorter) === 'object' && sorter.compare) {
return sorter.compare;
}
return false;
}
function nextSortDirection(sortDirections, current) {
if (!current) {
return sortDirections[0];
}
return sortDirections[sortDirections.indexOf(current) + 1];
}
function collectSortStates(columns, init, pos) {
var sortStates = [];
function pushState(column, columnPos) {
sortStates.push({
column: column,
key: (0, _util.getColumnKey)(column, columnPos),
multiplePriority: getMultiplePriority(column),
sortOrder: column.sortOrder
});
}
(columns || []).forEach(function (column, index) {
var columnPos = (0, _util.getColumnPos)(index, pos);
if (column.children) {
if ('sortOrder' in column) {
// Controlled
pushState(column, columnPos);
}
sortStates = [].concat((0, _toConsumableArray2["default"])(sortStates), (0, _toConsumableArray2["default"])(collectSortStates(column.children, init, columnPos)));
} else if (column.sorter) {
if ('sortOrder' in column) {
// Controlled
pushState(column, columnPos);
} else if (init && column.defaultSortOrder) {
// Default sorter
sortStates.push({
column: column,
key: (0, _util.getColumnKey)(column, columnPos),
multiplePriority: getMultiplePriority(column),
sortOrder: column.defaultSortOrder
});
}
}
});
return sortStates;
}
function injectSorter(prefixCls, columns, sorterSates, triggerSorter, defaultSortDirections, tableLocale, tableShowSorterTooltip, pos) {
return (columns || []).map(function (column, index) {
var columnPos = (0, _util.getColumnPos)(index, pos);
var newColumn = column;
if (newColumn.sorter) {
var sortDirections = newColumn.sortDirections || defaultSortDirections;
var showSorterTooltip = newColumn.showSorterTooltip === undefined ? tableShowSorterTooltip : newColumn.showSorterTooltip;
var columnKey = (0, _util.getColumnKey)(newColumn, columnPos);
var sorterState = sorterSates.find(function (_ref) {
var key = _ref.key;
return key === columnKey;
});
var sorterOrder = sorterState ? sorterState.sortOrder : null;
var nextSortOrder = nextSortDirection(sortDirections, sorterOrder);
var upNode = /*#__PURE__*/React.createElement(_acudIcon["default"], {
width: 16,
height: 8,
component: UpSvg,
className: (0, _classnames["default"])("".concat(prefixCls, "-column-sorter-icon"), "".concat(prefixCls, "-column-sorter-up"), {
active: sorterOrder === ASCEND
})
});
var downNode = /*#__PURE__*/React.createElement(_acudIcon["default"], {
width: 16,
height: 8,
component: DownSvg,
className: (0, _classnames["default"])("".concat(prefixCls, "-column-sorter-icon"), "".concat(prefixCls, "-column-sorter-down"), {
active: sorterOrder === DESCEND
})
});
var _ref2 = tableLocale || {},
cancelSort = _ref2.cancelSort,
triggerAsc = _ref2.triggerAsc,
triggerDesc = _ref2.triggerDesc;
var sortTip = cancelSort;
if (nextSortOrder === DESCEND) {
sortTip = triggerDesc;
} else if (nextSortOrder === ASCEND) {
sortTip = triggerAsc;
}
var tooltipProps = (0, _typeof2["default"])(showSorterTooltip) === 'object' ? showSorterTooltip : {
title: sortTip
};
newColumn = (0, _extends3["default"])((0, _extends3["default"])({}, newColumn), {
className: (0, _classnames["default"])(newColumn.className, (0, _defineProperty2["default"])({}, "".concat(prefixCls, "-column-sort"), sorterOrder)),
title: function title(renderProps) {
var renderSortTitle = /*#__PURE__*/React.createElement("div", {
className: "".concat(prefixCls, "-column-sorters")
}, /*#__PURE__*/React.createElement("span", {
className: "".concat(prefixCls, "-column-title")
}, (0, _util.renderColumnTitle)(column.title, renderProps)), showSorterTooltip ? /*#__PURE__*/React.createElement(_tooltip["default"], tooltipProps, /*#__PURE__*/React.createElement("span", {
className: (0, _classnames["default"])("".concat(prefixCls, "-column-sorter"), (0, _defineProperty2["default"])((0, _defineProperty2["default"])({}, "".concat(prefixCls, "-column-sorter-full"), !!(upNode && downNode)), "".concat(prefixCls, "-column-sorter-default"), sorterOrder !== ASCEND && sorterOrder !== DESCEND)),
onClick: function onClick() {
triggerSorter({
column: column,
key: columnKey,
sortOrder: nextSortOrder,
multiplePriority: getMultiplePriority(column)
});
}
}, /*#__PURE__*/React.createElement("span", {
className: "".concat(prefixCls, "-column-sorter-inner")
}, upNode, downNode))) : /*#__PURE__*/React.createElement("span", {
className: (0, _classnames["default"])("".concat(prefixCls, "-column-sorter"), (0, _defineProperty2["default"])((0, _defineProperty2["default"])({}, "".concat(prefixCls, "-column-sorter-full"), !!(upNode && downNode)), "".concat(prefixCls, "-column-sorter-default"), sorterOrder !== ASCEND && sorterOrder !== DESCEND)),
onClick: function onClick(event) {
triggerSorter({
column: column,
key: columnKey,
sortOrder: nextSortOrder,
multiplePriority: getMultiplePriority(column)
});
event.stopPropagation();
}
}, /*#__PURE__*/React.createElement("span", {
className: "".concat(prefixCls, "-column-sorter-inner")
}, upNode, downNode)));
return renderSortTitle;
},
onHeaderCell: function onHeaderCell(col) {
var cell = column.onHeaderCell && column.onHeaderCell(col) || {};
cell.className = (0, _classnames["default"])(cell.className, "".concat(prefixCls, "-column-has-sorters"));
return cell;
}
});
}
if ('children' in newColumn) {
newColumn = (0, _extends3["default"])((0, _extends3["default"])({}, newColumn), {
children: injectSorter(prefixCls, newColumn.children, sorterSates, triggerSorter, defaultSortDirections, tableLocale, tableShowSorterTooltip, columnPos)
});
}
return newColumn;
});
}
function stateToInfo(sorterStates) {
var column = sorterStates.column,
sortOrder = sorterStates.sortOrder;
return {
column: column,
order: sortOrder,
field: column.dataIndex,
columnKey: column.key
};
}
function generateSorterInfo(sorterStates) {
var list = sorterStates.filter(function (_ref3) {
var sortOrder = _ref3.sortOrder;
return sortOrder;
}).map(stateToInfo);
if (list.length === 0 && sorterStates.length) {
return (0, _extends3["default"])((0, _extends3["default"])({}, stateToInfo(sorterStates[sorterStates.length - 1])), {
column: undefined
});
}
if (list.length <= 1) {
return list[0] || {};
}
return list;
}
function getSortData(data, sortStates, childrenColumnName) {
var innerSorterStates = sortStates.slice().sort(function (a, b) {
return b.multiplePriority - a.multiplePriority;
});
var cloneData = data.slice();
var runningSorters = innerSorterStates.filter(function (_ref4) {
var sorter = _ref4.column.sorter,
sortOrder = _ref4.sortOrder;
return getSortFunction(sorter) && sortOrder;
});
// Skip if no sorter needed
if (!runningSorters.length) {
return cloneData;
}
return cloneData.sort(function (record1, record2) {
for (var i = 0; i < runningSorters.length; i += 1) {
var sorterState = runningSorters[i];
var sorter = sorterState.column.sorter,
sortOrder = sorterState.sortOrder;
var compareFn = getSortFunction(sorter);
if (compareFn && sortOrder) {
var compareResult = compareFn(record1, record2, sortOrder);
if (compareResult !== 0) {
return sortOrder === ASCEND ? compareResult : -compareResult;
}
}
}
return 0;
}).map(function (record) {
var subRecords = record[childrenColumnName];
if (subRecords) {
return (0, _extends3["default"])((0, _extends3["default"])({}, record), (0, _defineProperty2["default"])({}, childrenColumnName, getSortData(subRecords, sortStates, childrenColumnName)));
}
return record;
});
}
function useFilterSorter(_ref5) {
var prefixCls = _ref5.prefixCls,
mergedColumns = _ref5.mergedColumns,
onSorterChange = _ref5.onSorterChange,
sortDirections = _ref5.sortDirections,
tableLocale = _ref5.tableLocale,
showSorterTooltip = _ref5.showSorterTooltip;
var _React$useState = React.useState(collectSortStates(mergedColumns, true)),
_React$useState2 = (0, _slicedToArray2["default"])(_React$useState, 2),
sortStates = _React$useState2[0],
setSortStates = _React$useState2[1];
var mergedSorterStates = React.useMemo(function () {
var validate = true;
var collectedStates = collectSortStates(mergedColumns, false);
// Return if not controlled
if (!collectedStates.length) {
return sortStates;
}
var validateStates = [];
function patchStates(state) {
if (validate) {
validateStates.push(state);
} else {
validateStates.push((0, _extends3["default"])((0, _extends3["default"])({}, state), {
sortOrder: null
}));
}
}
var multipleMode = null;
collectedStates.forEach(function (state) {
if (multipleMode === null) {
patchStates(state);
if (state.sortOrder) {
if (state.multiplePriority === false) {
validate = false;
} else {
multipleMode = true;
}
}
} else if (multipleMode && state.multiplePriority !== false) {
patchStates(state);
} else {
validate = false;
patchStates(state);
}
});
return validateStates;
}, [mergedColumns, sortStates]);
// Get render columns title required props
var columnTitleSorterProps = React.useMemo(function () {
var sortColumns = mergedSorterStates.map(function (_ref6) {
var column = _ref6.column,
sortOrder = _ref6.sortOrder;
return {
column: column,
order: sortOrder
};
});
return {
sortColumns: sortColumns,
// Legacy
sortColumn: sortColumns[0] && sortColumns[0].column,
sortOrder: sortColumns[0] && sortColumns[0].order
};
}, [mergedSorterStates]);
function triggerSorter(sortState) {
var newSorterStates;
if (sortState.multiplePriority === false || !mergedSorterStates.length || mergedSorterStates[0].multiplePriority === false) {
newSorterStates = [sortState];
} else {
newSorterStates = [].concat((0, _toConsumableArray2["default"])(mergedSorterStates.filter(function (_ref7) {
var key = _ref7.key;
return key !== sortState.key;
})), [sortState]);
}
setSortStates(newSorterStates);
onSorterChange(generateSorterInfo(newSorterStates), newSorterStates);
}
var transformColumns = function transformColumns(innerColumns) {
return injectSorter(prefixCls, innerColumns, mergedSorterStates, triggerSorter, sortDirections, tableLocale, showSorterTooltip);
};
var getSorters = function getSorters() {
return generateSorterInfo(mergedSorterStates);
};
return [transformColumns, mergedSorterStates, columnTitleSorterProps, getSorters];
}