ka-table
Version:
The customizable, extendable, lightweight, and fully free React Table Component
439 lines (438 loc) • 27.4 kB
JavaScript
"use strict";
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
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));
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.kaReducer = void 0;
var enums_1 = require("../enums");
var ReducerUtils_1 = require("../Utils/ReducerUtils");
var CellUtils_1 = require("../Utils/CellUtils");
var PropsUtils_1 = require("../Utils/PropsUtils");
var NavigationUtils_1 = require("../Utils/NavigationUtils");
var GroupUtils_1 = require("../Utils/GroupUtils");
var DataUtils_1 = require("../Utils/DataUtils");
var FilterUtils_1 = require("../Utils/FilterUtils");
var ArrayUtils_1 = require("../Utils/ArrayUtils");
var TreeUtils_1 = require("../Utils/TreeUtils");
var HeadRowUtils_1 = require("../Utils/HeadRowUtils");
var utils_1 = require("../utils");
var const_1 = require("../const");
var ColumnUtils_1 = require("../Utils/ColumnUtils");
var kaReducer = function (props, action) {
var _a;
var columns = props.columns, _b = props.data, data = _b === void 0 ? [] : _b, _c = props.detailsRows, detailsRows = _c === void 0 ? [] : _c, _d = props.editableCells, editableCells = _d === void 0 ? [] : _d, groupsExpanded = props.groupsExpanded, loading = props.loading, paging = props.paging, treeGroupsExpanded = props.treeGroupsExpanded, rowKeyField = props.rowKeyField, _e = props.selectedRows, selectedRows = _e === void 0 ? [] : _e, validation = props.validation, _f = props.sortingMode, sortingMode = _f === void 0 ? enums_1.SortingMode.None : _f, virtualScrolling = props.virtualScrolling;
switch (action.type) {
case enums_1.ActionType.InsertRow: {
var rowData = action.rowData, options = action.options;
var _g = options || {}, rowKeyValue_1 = _g.rowKeyValue, insertRowPosition = _g.insertRowPosition;
var newData = __spreadArray([], data, true);
if (rowKeyValue_1 != null) {
var rowIndex = newData.findIndex(function (d) { return (0, DataUtils_1.getValueByField)(d, rowKeyField) === rowKeyValue_1; });
if (insertRowPosition === enums_1.InsertRowPosition.after) {
rowIndex++;
}
newData.splice(rowIndex, 0, rowData);
}
else {
insertRowPosition === enums_1.InsertRowPosition.after ? newData.push(rowData) : newData.unshift(rowData);
}
return __assign(__assign({}, props), { data: newData });
}
case enums_1.ActionType.UpdateHeaderFilterValues: {
var newColumns = columns.map(function (c) {
if (c.key === action.columnKey) {
var headerFilterValues = c.headerFilterValues;
if (action.checked) {
if (headerFilterValues === undefined) {
headerFilterValues = [];
}
if (!headerFilterValues.includes(action.item)) {
headerFilterValues.push(action.item);
}
}
else {
headerFilterValues = headerFilterValues === null || headerFilterValues === void 0 ? void 0 : headerFilterValues.filter(function (value) { return value !== action.item; });
}
c.headerFilterValues = headerFilterValues;
}
return c;
});
return __assign(__assign({}, props), { columns: newColumns });
}
case enums_1.ActionType.ClearAllFilters: {
return __assign(__assign({}, props), { columns: columns.map(function (c) { return (__assign(__assign({}, c), { filterRowValue: undefined, headerFilterValues: undefined })); }) });
}
case enums_1.ActionType.UpdatePopupPosition: {
var newColumns = columns.map(function (c) { return (__assign(__assign({}, c), { headerFilterPopupPosition: action.popupPosition })); });
return __assign(__assign({}, props), { columns: newColumns });
}
case enums_1.ActionType.UpdateHeaderFilterPopupState: {
var newColumns = columns.map(function (c) { return (__assign(__assign({}, c), { isHeaderFilterPopupShown: c.key === action.columnKey ? !c.isHeaderFilterPopupShown : false })); });
return __assign(__assign({}, props), { columns: newColumns });
}
case enums_1.ActionType.MoveFocusedRight: {
return (0, ReducerUtils_1.getUpdatedFocused)(props, action, NavigationUtils_1.getRightCell);
}
case enums_1.ActionType.MoveFocusedLeft: {
return (0, ReducerUtils_1.getUpdatedFocused)(props, action, NavigationUtils_1.getLeftCell);
}
case enums_1.ActionType.MoveFocusedUp: {
return (0, ReducerUtils_1.getUpdatedFocused)(props, action, NavigationUtils_1.getUpCell);
}
case enums_1.ActionType.MoveFocusedDown: {
return (0, ReducerUtils_1.getUpdatedFocused)(props, action, NavigationUtils_1.getDownCell);
}
case enums_1.ActionType.SetFocused: {
return __assign(__assign({}, props), { focused: action.focused });
}
case enums_1.ActionType.ClearFocused: {
return __assign(__assign({}, props), { focused: undefined });
}
case enums_1.ActionType.ClearSingleAction: {
return __assign(__assign({}, props), { singleAction: undefined });
}
case enums_1.ActionType.SetSingleAction: {
return __assign(__assign({}, props), { singleAction: action.singleAction });
}
case enums_1.ActionType.ShowColumn: {
var newColumns = (0, ColumnUtils_1.replaceColumnValue)({
columns: columns,
columnKey: action.columnKey,
replacedOption: 'visible',
replacedValue: true
});
return __assign(__assign({}, props), { columns: newColumns });
}
case enums_1.ActionType.HideColumn: {
var newColumns = (0, ColumnUtils_1.replaceColumnValue)({
columns: columns,
columnKey: action.columnKey,
replacedOption: 'visible',
replacedValue: false
});
return __assign(__assign({}, props), { columns: newColumns });
}
case enums_1.ActionType.ReorderRows: {
var newData = (0, DataUtils_1.reorderData)(data, function (d) { return (0, DataUtils_1.getValueByField)(d, rowKeyField); }, action.rowKeyValue, action.targetRowKeyValue);
return __assign(__assign({}, props), { data: newData });
}
case enums_1.ActionType.InsertColumn: {
var newColumns = __spreadArray([], columns, true);
newColumns.splice(action.index, 0, action.column);
return __assign(__assign({}, props), { columns: newColumns });
}
case enums_1.ActionType.MoveColumnBefore: {
var newColumns = (0, DataUtils_1.insertBefore)(columns, function (d) { return d.key; }, action.columnKey, action.targetColumnKey);
return __assign(__assign({}, props), { columns: newColumns });
}
case enums_1.ActionType.ReorderColumns: {
var newData = (0, DataUtils_1.reorderData)(columns, function (d) { return d.key; }, action.columnKey, action.targetColumnKey);
return __assign(__assign({}, props), { columns: newData });
}
case enums_1.ActionType.MoveColumnToIndex: {
var newColumns = (0, DataUtils_1.reorderDataByIndex)(columns, function (d) { return d.key; }, action.columnKey, action.index != null ? action.index : columns === null || columns === void 0 ? void 0 : columns.length);
return __assign(__assign({}, props), { columns: newColumns });
}
case enums_1.ActionType.UngroupColumn: {
var newGroups = (_a = props === null || props === void 0 ? void 0 : props.groups) === null || _a === void 0 ? void 0 : _a.filter(function (group) { return group.columnKey !== action.columnKey; });
return __assign(__assign({}, props), { groups: (newGroups === null || newGroups === void 0 ? void 0 : newGroups.length) ? newGroups : undefined });
}
case enums_1.ActionType.GroupColumn: {
var newGroups = __spreadArray(__spreadArray([], (props === null || props === void 0 ? void 0 : props.groups) || [], true), [{ columnKey: action.columnKey }], false);
return __assign(__assign({}, props), { groups: (newGroups === null || newGroups === void 0 ? void 0 : newGroups.length) ? newGroups : undefined });
}
case enums_1.ActionType.ResizeColumn: {
var columnKey_1 = action.columnKey, width_1 = action.width;
var newColumns = columns.map(function (column) {
var _a, _b, _c, _d, _e;
if (column.key === columnKey_1) {
var newColumn = __assign({}, column);
if (((_a = newColumn.style) === null || _a === void 0 ? void 0 : _a.width) != null) {
newColumn.style = __assign(__assign({}, newColumn.style), { width: width_1 });
}
if (((_b = newColumn.style) === null || _b === void 0 ? void 0 : _b.width) == null || newColumn.width != null) {
newColumn.width = width_1;
}
if (((_d = (_c = newColumn.colGroup) === null || _c === void 0 ? void 0 : _c.style) === null || _d === void 0 ? void 0 : _d.width) != null) {
newColumn.colGroup.style = __assign(__assign({}, newColumn.colGroup.style), { width: width_1 });
}
if (((_e = newColumn.colGroup) === null || _e === void 0 ? void 0 : _e.width) != null) {
newColumn.colGroup.width = width_1;
}
return newColumn;
}
return column;
});
return __assign(__assign({}, props), { columns: newColumns });
}
case enums_1.ActionType.UpdatePageIndex: {
return __assign(__assign({}, props), { paging: __assign(__assign({}, paging), { pageIndex: action.pageIndex }) });
}
case enums_1.ActionType.UpdatePageSize: {
return __assign(__assign({}, props), { paging: __assign(__assign({}, paging), { pageSize: action.pageSize }) });
}
case enums_1.ActionType.UpdatePagesCount: {
return __assign(__assign({}, props), { paging: __assign(__assign({}, paging), { pagesCount: action.pagesCount }) });
}
case enums_1.ActionType.HideLoading: {
return __assign(__assign({}, props), { loading: __assign(__assign({}, loading), { enabled: false }) });
}
case enums_1.ActionType.ShowLoading: {
var newLoading = __assign(__assign({}, loading), { enabled: true });
if (action.text !== undefined) {
newLoading.text = action.text;
}
return __assign(__assign({}, props), { loading: newLoading });
}
case enums_1.ActionType.ShowDetailsRow: {
var newDetailsRows = __spreadArray([], detailsRows, true);
newDetailsRows.push(action.rowKeyValue);
return __assign(__assign({}, props), { detailsRows: newDetailsRows });
}
case enums_1.ActionType.HideDetailsRow: {
var newDetailsRows = detailsRows.filter(function (row) { return row !== action.rowKeyValue; });
return __assign(__assign({}, props), { detailsRows: newDetailsRows });
}
case enums_1.ActionType.OpenEditor: {
var newEditableCells = (0, CellUtils_1.addItemToEditableCells)(action, editableCells);
return __assign(__assign({}, props), { editableCells: newEditableCells });
}
case enums_1.ActionType.CloseEditor: {
var newEditableCells = (0, CellUtils_1.removeItemFromEditableCells)(action, editableCells);
return __assign(__assign({}, props), { editableCells: newEditableCells });
}
case enums_1.ActionType.UpdateFilterRowValue: {
var newColumns = (0, ColumnUtils_1.replaceColumnValue)({
columns: columns,
columnKey: action.columnKey,
replacedOption: 'filterRowValue',
replacedValue: action.filterRowValue
});
return __assign(__assign({}, props), { columns: newColumns });
}
case enums_1.ActionType.UpdateHeaderFilterSearchValue: {
var newColumns = (0, ColumnUtils_1.replaceColumnValue)({
columns: columns,
columnKey: action.columnKey,
replacedOption: 'headerFilterSearchValue',
replacedValue: action.headerFilterSearchValue
});
return __assign(__assign({}, props), { columns: newColumns });
}
case enums_1.ActionType.UpdateFilterRowOperator: {
var newColumns = (0, ColumnUtils_1.replaceColumnValue)({
columns: columns,
columnKey: action.columnKey,
replacedOption: 'filterRowOperator',
replacedValue: action.filterRowOperator
});
return __assign(__assign({}, props), { columns: newColumns });
}
case enums_1.ActionType.UpdateEditorValue: {
var newEditableCells = __spreadArray([], editableCells, true);
var editableCellIndex = newEditableCells.findIndex(function (c) { return c.columnKey === action.columnKey && c.rowKeyValue === action.rowKeyValue; });
var editableCell = __assign(__assign({}, newEditableCells[editableCellIndex]), { editorValue: action.value });
newEditableCells[editableCellIndex] = editableCell;
return __assign(__assign({}, props), { editableCells: newEditableCells });
}
case enums_1.ActionType.UpdateCellValue: {
var row = data.find(function (d) { return (0, DataUtils_1.getValueByField)(d, rowKeyField) === action.rowKeyValue; });
var column = columns.find(function (c) { return c.key === action.columnKey; });
var updatedRowData = (0, DataUtils_1.replaceValue)(row, column, action.value);
var newData = (0, ArrayUtils_1.getCopyOfArrayAndInsertOrReplaceItem)(updatedRowData, rowKeyField, data);
return __assign(__assign({}, props), { data: newData });
}
case enums_1.ActionType.DeleteRow: {
var newData = data.filter(function (d) { return (0, DataUtils_1.getValueByField)(d, rowKeyField) !== action.rowKeyValue; });
return __assign(__assign({}, props), { data: newData });
}
case enums_1.ActionType.SelectAllRows: {
var newSelectedRows = data.map(function (d) { return (0, DataUtils_1.getValueByField)(d, rowKeyField); });
return __assign(__assign({}, props), { selectedRows: newSelectedRows });
}
case enums_1.ActionType.SelectAllFilteredRows: {
var newData = (0, FilterUtils_1.filterAndSearchData)(props);
var newSelectedRows = (0, ReducerUtils_1.removeDataKeysFromSelectedRows)(selectedRows, newData, rowKeyField);
newSelectedRows = __spreadArray(__spreadArray([], newSelectedRows, true), newData.map(function (d) { return (0, DataUtils_1.getValueByField)(d, rowKeyField); }), true);
return __assign(__assign({}, props), { selectedRows: newSelectedRows });
}
case enums_1.ActionType.SelectAllVisibleRows: {
var newData = (0, PropsUtils_1.getData)(props);
var newSelectedRows = (0, ReducerUtils_1.removeDataKeysFromSelectedRows)(selectedRows, newData, rowKeyField);
newSelectedRows = __spreadArray(__spreadArray([], newSelectedRows, true), newData.map(function (d) { return (0, DataUtils_1.getValueByField)(d, rowKeyField); }), true);
return __assign(__assign({}, props), { selectedRows: newSelectedRows });
}
case enums_1.ActionType.Search: {
return __assign(__assign({}, props), { searchText: action.searchText });
}
case enums_1.ActionType.SelectSingleRow: {
var newSelectedRows = [action.rowKeyValue];
return __assign(__assign({}, props), { selectedRows: newSelectedRows });
}
case enums_1.ActionType.DeselectAllRows:
return __assign(__assign({}, props), { selectedRows: [] });
case enums_1.ActionType.DeselectAllFilteredRows: {
var newData = (0, FilterUtils_1.filterAndSearchData)(props);
var newSelectedRows = (0, ReducerUtils_1.removeDataKeysFromSelectedRows)(selectedRows, newData, rowKeyField);
return __assign(__assign({}, props), { selectedRows: newSelectedRows });
}
case enums_1.ActionType.DeselectAllVisibleRows: {
var newData = (0, PropsUtils_1.getData)(props);
var newSelectedRows = (0, ReducerUtils_1.removeDataKeysFromSelectedRows)(selectedRows, newData, rowKeyField);
return __assign(__assign({}, props), { selectedRows: newSelectedRows });
}
case enums_1.ActionType.SelectRow:
return __assign(__assign({}, props), { selectedRows: __spreadArray(__spreadArray([], selectedRows, true), [action.rowKeyValue], false) });
case enums_1.ActionType.SelectRows:
return __assign(__assign({}, props), { selectedRows: __spreadArray(__spreadArray([], selectedRows, true), action.rowsKeyValues, true) });
case enums_1.ActionType.SelectRowsRange: {
var rowKeyValueTo_1 = action.rowKeyValueTo;
if (rowKeyValueTo_1) {
var shownData = utils_1.kaPropsUtils.getData(props);
var rowKeyValueToIndex = shownData.findIndex(function (d) { return (0, DataUtils_1.getValueByField)(d, rowKeyField) === rowKeyValueTo_1; });
var rowKeyValueFromIndex = shownData.findIndex(function (d) { return (0, DataUtils_1.getValueByField)(d, rowKeyField) === action.rowKeyValueFrom; });
if (rowKeyValueToIndex != null && rowKeyValueFromIndex != null) {
var _h = rowKeyValueToIndex > rowKeyValueFromIndex ? [rowKeyValueFromIndex, rowKeyValueToIndex] : [rowKeyValueToIndex, rowKeyValueFromIndex], start = _h[0], end = _h[1];
var rowsToSelect = [];
for (var i = start; i <= end; i++) {
var value = (0, DataUtils_1.getValueByField)(shownData[i], rowKeyField);
if (!selectedRows.includes(value)) {
rowsToSelect.push(value);
}
}
return __assign(__assign({}, props), { selectedRows: __spreadArray(__spreadArray([], selectedRows, true), rowsToSelect, true) });
}
}
return __assign(__assign({}, props), { selectedRows: __spreadArray(__spreadArray([], selectedRows, true), [action.rowKeyValueFrom], false) });
}
case enums_1.ActionType.DeselectRow: {
var newSelectedRows = __spreadArray([], selectedRows, true).filter(function (s) { return s !== action.rowKeyValue; });
return __assign(__assign({}, props), { selectedRows: newSelectedRows });
}
case enums_1.ActionType.DeselectRows: {
var newSelectedRows = __spreadArray([], selectedRows, true).filter(function (s) { return !action.rowsKeyValues.includes(s); });
return __assign(__assign({}, props), { selectedRows: newSelectedRows });
}
case enums_1.ActionType.UpdateSortDirection:
var sortedColumns = (0, HeadRowUtils_1.getUpdatedSortedColumns)(columns, action.columnKey, sortingMode);
return __assign(__assign({}, props), { columns: sortedColumns });
case enums_1.ActionType.UpdateVirtualScrolling:
return __assign(__assign({}, props), { virtualScrolling: action.virtualScrolling });
case enums_1.ActionType.UpdateData:
return __assign(__assign({}, props), { data: action.data });
case enums_1.ActionType.ScrollTable:
var scrollTop = action.scrollTop;
return __assign(__assign({}, props), { virtualScrolling: __assign(__assign({}, virtualScrolling), { scrollTop: scrollTop }) });
case enums_1.ActionType.UpdateGroupsExpanded: {
var currentGroupsExpanded = groupsExpanded;
if (!currentGroupsExpanded) {
var preparedOptions = (0, PropsUtils_1.prepareTableOptions)(props);
currentGroupsExpanded = (0, GroupUtils_1.getExpandedGroups)(preparedOptions.groupedData);
}
var newGroupsExpanded = (0, GroupUtils_1.updateExpandedGroups)(currentGroupsExpanded, action.groupKey);
return __assign(__assign({}, props), { groupsExpanded: newGroupsExpanded });
}
case enums_1.ActionType.ShowNewRow:
case enums_1.ActionType.OpenRowEditors: {
var rowKeyValue = action.type === enums_1.ActionType.ShowNewRow ? const_1.newRowId : action.rowKeyValue;
var newEditableCells = (0, ReducerUtils_1.addColumnsToRowEditableCells)(editableCells, columns, rowKeyValue);
return __assign(__assign({}, props), { editableCells: newEditableCells });
}
case enums_1.ActionType.OpenAllEditors: {
var newEditableCells = (0, ReducerUtils_1.getEditableCellsByData)(data, rowKeyField, columns);
return __assign(__assign({}, props), { editableCells: newEditableCells });
}
case enums_1.ActionType.HideNewRow:
case enums_1.ActionType.CloseRowEditors: {
var rowKeyValue_2 = action.type === enums_1.ActionType.HideNewRow ? const_1.newRowId : action.rowKeyValue;
var newEditableCells = editableCells.filter(function (e) { return e.rowKeyValue !== rowKeyValue_2; });
return __assign(__assign({}, props), { editableCells: newEditableCells });
}
case enums_1.ActionType.Validate: {
var newEditableCells = (0, ReducerUtils_1.getValidatedEditableCells)(props);
return __assign(__assign({}, props), { editableCells: __spreadArray([], newEditableCells, true) });
}
case enums_1.ActionType.SaveAllEditors: {
var newData_1 = __spreadArray([], data, true);
editableCells === null || editableCells === void 0 ? void 0 : editableCells.forEach(function (editableCell) {
if (editableCell.hasOwnProperty('editorValue')) {
var rowIndex = newData_1.findIndex(function (d) { return (0, DataUtils_1.getValueByField)(d, rowKeyField) === editableCell.rowKeyValue; });
if (rowIndex != null) {
var column = columns.find(function (c) { return c.key === editableCell.columnKey; });
newData_1[rowIndex] = (0, DataUtils_1.replaceValue)(newData_1[rowIndex], column, editableCell.editorValue);
}
}
});
return __assign(__assign({}, props), { data: newData_1 });
}
case enums_1.ActionType.SaveRowEditors:
case enums_1.ActionType.SaveNewRow: {
var isNewRow_1 = action.type === enums_1.ActionType.SaveNewRow;
var rowEditorKeyValue_1 = isNewRow_1 ? const_1.newRowId : action.rowKeyValue;
var updatedRowData_1 = data.find(function (d) { return (0, DataUtils_1.getValueByField)(d, rowKeyField) === rowEditorKeyValue_1; });
var rowEditableCells = editableCells.filter(function (editableCell) { return editableCell.rowKeyValue === rowEditorKeyValue_1
&& (isNewRow_1 || editableCell.hasOwnProperty('editorValue')); });
if (action.validate && !(0, PropsUtils_1.isValid)(__assign(__assign({}, props), { editableCells: rowEditableCells }))) {
rowEditableCells.forEach(function (cell) {
var column = columns.find(function (c) { return c.key === cell.columnKey; });
cell.validationMessage = validation && validation({
column: column,
value: cell.editorValue,
rowData: updatedRowData_1
});
});
return __assign(__assign({}, props), { editableCells: __spreadArray([], editableCells, true) });
}
var newEditableCells = editableCells.filter(function (e) { return e.rowKeyValue !== rowEditorKeyValue_1; });
rowEditableCells.forEach(function (cell) {
var column = columns.find(function (c) { return c.key === cell.columnKey; });
updatedRowData_1 = (0, DataUtils_1.replaceValue)(updatedRowData_1, column, cell.editorValue);
});
var newData = void 0;
if (isNewRow_1) {
updatedRowData_1[rowKeyField] = action.rowKeyValue;
newData = __spreadArray([updatedRowData_1], data, true);
}
else {
newData = (0, ArrayUtils_1.getCopyOfArrayAndInsertOrReplaceItem)(updatedRowData_1, rowKeyField, data);
}
return __assign(__assign({}, props), { data: newData, editableCells: newEditableCells });
}
case enums_1.ActionType.UpdateRow: {
var newData = (0, ArrayUtils_1.getCopyOfArrayAndInsertOrReplaceItem)(action.rowData, rowKeyField, data);
return __assign(__assign({}, props), { data: newData });
}
case enums_1.ActionType.UpdateTreeGroupsExpanded: {
var rowKeyValue_3 = action.rowKeyValue;
var value = treeGroupsExpanded ? !treeGroupsExpanded.some(function (v) { return v === rowKeyValue_3; }) : false;
if (value) {
return __assign(__assign({}, props), { treeGroupsExpanded: __spreadArray(__spreadArray([], (treeGroupsExpanded || []), true), [rowKeyValue_3], false) });
}
var currentExpanded = treeGroupsExpanded;
if (!currentExpanded) {
var preparedOptions = (0, PropsUtils_1.prepareTableOptions)(props);
currentExpanded = (0, TreeUtils_1.getExpandedParents)(preparedOptions.groupedData, rowKeyField);
}
return __assign(__assign({}, props), { treeGroupsExpanded: currentExpanded.filter(function (item) { return item !== rowKeyValue_3; }) });
}
}
return props;
};
exports.kaReducer = kaReducer;