@tanstack/table-core 8.2.1 → 8.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -92,18 +92,17 @@ const Sorting = {
92
92
  // }
93
93
  // this needs to be outside of table.setSorting to be in sync with rerender
94
94
  const nextSortingOrder = column.getNextSortingOrder();
95
+ const hasManualValue = typeof desc !== 'undefined' && desc !== null;
95
96
  table.setSorting(old => {
96
- var _table$options$enable, _table$options$enable2;
97
-
98
97
  // Find any existing sorting for this column
99
98
  const existingSorting = old == null ? void 0 : old.find(d => d.id === column.id);
100
99
  const existingIndex = old == null ? void 0 : old.findIndex(d => d.id === column.id);
101
- const hasDescDefined = typeof desc !== 'undefined' && desc !== null;
102
100
  let newSorting = []; // What should we do with this sort action?
103
101
 
104
102
  let sortAction;
103
+ let nextDesc = hasManualValue ? desc : nextSortingOrder === 'desc'; // Multi-mode
105
104
 
106
- if (column.getCanMultiSort() && multi) {
105
+ if (old != null && old.length && column.getCanMultiSort() && multi) {
107
106
  if (existingSorting) {
108
107
  sortAction = 'toggle';
109
108
  } else {
@@ -121,63 +120,71 @@ const Sorting = {
121
120
  } // Handle toggle states that will remove the sorting
122
121
 
123
122
 
124
- if (sortAction === 'toggle' && ( // Must be toggling
125
- (_table$options$enable = table.options.enableSortingRemoval) != null ? _table$options$enable : true) && // If enableSortRemove, enable in general
126
- !hasDescDefined && ( // Must not be setting desc
127
- multi ? (_table$options$enable2 = table.options.enableMultiRemove) != null ? _table$options$enable2 : true : true) && // If multi, don't allow if enableMultiRemove
128
- !nextSortingOrder // Finally, detect if it should indeed be removed
129
- ) {
130
- sortAction = 'remove';
123
+ if (sortAction === 'toggle') {
124
+ // If we are "actually" toggling (not a manual set value), should we remove the sorting?
125
+ if (!hasManualValue) {
126
+ // Is our intention to remove?
127
+ if (!nextSortingOrder) {
128
+ sortAction = 'remove';
129
+ }
130
+ }
131
131
  }
132
132
 
133
- if (sortAction === 'replace') {
134
- newSorting = [{
135
- id: column.id,
136
- desc: hasDescDefined ? desc : nextSortingOrder === 'desc'
137
- }];
138
- } else if (sortAction === 'add' && old != null && old.length) {
133
+ if (sortAction === 'add') {
139
134
  var _table$options$maxMul;
140
135
 
141
136
  newSorting = [...old, {
142
137
  id: column.id,
143
- desc: hasDescDefined ? desc : nextSortingOrder === 'desc'
138
+ desc: nextDesc
144
139
  }]; // Take latest n columns
145
140
 
146
141
  newSorting.splice(0, newSorting.length - ((_table$options$maxMul = table.options.maxMultiSortColCount) != null ? _table$options$maxMul : Number.MAX_SAFE_INTEGER));
147
- } else if (sortAction === 'toggle' && old != null && old.length) {
142
+ } else if (sortAction === 'toggle') {
148
143
  // This flips (or sets) the
149
144
  newSorting = old.map(d => {
150
145
  if (d.id === column.id) {
151
146
  return { ...d,
152
- desc: hasDescDefined ? desc : nextSortingOrder === 'desc'
147
+ desc: nextDesc
153
148
  };
154
149
  }
155
150
 
156
151
  return d;
157
152
  });
158
- } else if (sortAction === 'remove' && old != null && old.length) {
153
+ } else if (sortAction === 'remove') {
159
154
  newSorting = old.filter(d => d.id !== column.id);
155
+ } else {
156
+ newSorting = [{
157
+ id: column.id,
158
+ desc: nextDesc
159
+ }];
160
160
  }
161
161
 
162
162
  return newSorting;
163
163
  });
164
164
  },
165
- getNextSortingOrder: () => {
165
+ getFirstSortDir: () => {
166
166
  var _ref, _column$columnDef$sor;
167
167
 
168
168
  const sortDescFirst = (_ref = (_column$columnDef$sor = column.columnDef.sortDescFirst) != null ? _column$columnDef$sor : table.options.sortDescFirst) != null ? _ref : column.getAutoSortDir() === 'desc';
169
- const firstSortDirection = sortDescFirst ? 'desc' : 'asc';
169
+ return sortDescFirst ? 'desc' : 'asc';
170
+ },
171
+ getNextSortingOrder: multi => {
172
+ var _table$options$enable, _table$options$enable2;
173
+
174
+ const firstSortDirection = column.getFirstSortDir();
170
175
  const isSorted = column.getIsSorted();
171
176
 
172
177
  if (!isSorted) {
173
178
  return firstSortDirection;
174
179
  }
175
180
 
176
- if (isSorted === firstSortDirection) {
177
- return isSorted === 'desc' ? 'asc' : 'desc';
178
- } else {
181
+ if (isSorted !== firstSortDirection && ((_table$options$enable = table.options.enableSortingRemoval) != null ? _table$options$enable : true) && ( // If enableSortRemove, enable in general
182
+ multi ? (_table$options$enable2 = table.options.enableMultiRemove) != null ? _table$options$enable2 : true : true) // If multi, don't allow if enableMultiRemove))
183
+ ) {
179
184
  return false;
180
185
  }
186
+
187
+ return isSorted === 'desc' ? 'asc' : 'desc';
181
188
  },
182
189
  getCanSort: () => {
183
190
  var _column$columnDef$ena, _table$options$enable3;
@@ -1 +1 @@
1
- {"version":3,"file":"Sorting.js","sources":["../../../src/features/Sorting.ts"],"sourcesContent":["import { RowModel } from '..'\nimport { TableFeature } from '../core/table'\nimport {\n BuiltInSortingFn,\n reSplitAlphaNumeric,\n sortingFns,\n} from '../sortingFns'\n\nimport {\n Column,\n OnChangeFn,\n TableGenerics,\n Table,\n Row,\n Updater,\n RowData,\n} from '../types'\n\nimport { isFunction, makeStateUpdater, Overwrite } from '../utils'\n\nexport type SortDirection = 'asc' | 'desc'\n\nexport type ColumnSort = {\n id: string\n desc: boolean\n}\n\nexport type SortingState = ColumnSort[]\n\nexport type SortingTableState = {\n sorting: SortingState\n}\n\nexport type SortingFn<TData extends RowData> = {\n (rowA: Row<TData>, rowB: Row<TData>, columnId: string): number\n}\n\nexport type CustomSortingFns<TData extends RowData> = Record<\n string,\n SortingFn<TData>\n>\n\nexport type SortingFnOption<TData extends RowData> =\n | 'auto'\n | BuiltInSortingFn\n | SortingFn<TData>\n\nexport type SortingColumnDef<TData extends RowData> = {\n sortingFn?: SortingFnOption<TData>\n sortDescFirst?: boolean\n enableSorting?: boolean\n enableMultiSort?: boolean\n invertSorting?: boolean\n sortUndefined?: false | -1 | 1\n}\n\nexport type SortingColumn<TData extends RowData> = {\n getAutoSortingFn: () => SortingFn<TData>\n getAutoSortDir: () => SortDirection\n getSortingFn: () => SortingFn<TData>\n getNextSortingOrder: () => SortDirection | false\n getCanSort: () => boolean\n getCanMultiSort: () => boolean\n getSortIndex: () => number\n getIsSorted: () => false | SortDirection\n clearSorting: () => void\n toggleSorting: (desc?: boolean, isMulti?: boolean) => void\n getToggleSortingHandler: () => undefined | ((event: unknown) => void)\n}\n\nexport type SortingOptions<TData extends RowData> = {\n manualSorting?: boolean\n onSortingChange?: OnChangeFn<SortingState>\n enableSorting?: boolean\n enableSortingRemoval?: boolean\n enableMultiRemove?: boolean\n enableMultiSort?: boolean\n sortDescFirst?: boolean\n getSortedRowModel?: (table: Table<any>) => () => RowModel<any>\n maxMultiSortColCount?: number\n isMultiSortEvent?: (e: unknown) => boolean\n}\n\nexport type SortingInstance<TData extends RowData> = {\n setSorting: (updater: Updater<SortingState>) => void\n resetSorting: (defaultState?: boolean) => void\n getPreSortedRowModel: () => RowModel<TData>\n getSortedRowModel: () => RowModel<TData>\n _getSortedRowModel?: () => RowModel<TData>\n}\n\n//\n\nexport const Sorting: TableFeature = {\n getInitialState: (state): SortingTableState => {\n return {\n sorting: [],\n ...state,\n }\n },\n\n getDefaultColumnDef: <TData extends RowData>(): SortingColumnDef<TData> => {\n return {\n sortingFn: 'auto',\n }\n },\n\n getDefaultOptions: <TData extends RowData>(\n table: Table<TData>\n ): SortingOptions<TData> => {\n return {\n onSortingChange: makeStateUpdater('sorting', table),\n isMultiSortEvent: (e: unknown) => {\n return (e as MouseEvent).shiftKey\n },\n }\n },\n\n createColumn: <TData extends RowData, TValue>(\n column: Column<TData, TValue>,\n table: Table<TData>\n ): SortingColumn<TData> => {\n return {\n getAutoSortingFn: () => {\n const firstRows = table.getFilteredRowModel().flatRows.slice(10)\n\n let isString = false\n\n for (const row of firstRows) {\n const value = row?.getValue(column.id)\n\n if (Object.prototype.toString.call(value) === '[object Date]') {\n return sortingFns.datetime\n }\n\n if (typeof value === 'string') {\n isString = true\n\n if (value.split(reSplitAlphaNumeric).length > 1) {\n return sortingFns.alphanumeric\n }\n }\n }\n\n if (isString) {\n return sortingFns.text\n }\n\n return sortingFns.basic\n },\n getAutoSortDir: () => {\n const firstRow = table.getFilteredRowModel().flatRows[0]\n\n const value = firstRow?.getValue(column.id)\n\n if (typeof value === 'string') {\n return 'asc'\n }\n\n return 'desc'\n },\n getSortingFn: () => {\n if (!column) {\n throw new Error()\n }\n\n return isFunction(column.columnDef.sortingFn)\n ? column.columnDef.sortingFn\n : column.columnDef.sortingFn === 'auto'\n ? column.getAutoSortingFn()\n : (sortingFns[\n column.columnDef.sortingFn as BuiltInSortingFn\n ] as SortingFn<TData>)\n },\n toggleSorting: (desc, multi) => {\n // if (column.columns.length) {\n // column.columns.forEach((c, i) => {\n // if (c.id) {\n // table.toggleColumnSorting(c.id, undefined, multi || !!i)\n // }\n // })\n // return\n // }\n\n // this needs to be outside of table.setSorting to be in sync with rerender\n const nextSortingOrder = column.getNextSortingOrder()\n\n table.setSorting(old => {\n // Find any existing sorting for this column\n const existingSorting = old?.find(d => d.id === column.id)\n const existingIndex = old?.findIndex(d => d.id === column.id)\n const hasDescDefined = typeof desc !== 'undefined' && desc !== null\n\n let newSorting: SortingState = []\n\n // What should we do with this sort action?\n let sortAction: 'add' | 'remove' | 'toggle' | 'replace'\n\n if (column.getCanMultiSort() && multi) {\n if (existingSorting) {\n sortAction = 'toggle'\n } else {\n sortAction = 'add'\n }\n } else {\n // Normal mode\n if (old?.length && existingIndex !== old.length - 1) {\n sortAction = 'replace'\n } else if (existingSorting) {\n sortAction = 'toggle'\n } else {\n sortAction = 'replace'\n }\n }\n\n // Handle toggle states that will remove the sorting\n if (\n sortAction === 'toggle' && // Must be toggling\n (table.options.enableSortingRemoval ?? true) && // If enableSortRemove, enable in general\n !hasDescDefined && // Must not be setting desc\n (multi ? table.options.enableMultiRemove ?? true : true) && // If multi, don't allow if enableMultiRemove\n !nextSortingOrder // Finally, detect if it should indeed be removed\n ) {\n sortAction = 'remove'\n }\n\n if (sortAction === 'replace') {\n newSorting = [\n {\n id: column.id,\n desc: hasDescDefined ? desc! : nextSortingOrder! === 'desc',\n },\n ]\n } else if (sortAction === 'add' && old?.length) {\n newSorting = [\n ...old,\n {\n id: column.id,\n desc: hasDescDefined ? desc! : nextSortingOrder! === 'desc',\n },\n ]\n // Take latest n columns\n newSorting.splice(\n 0,\n newSorting.length -\n (table.options.maxMultiSortColCount ?? Number.MAX_SAFE_INTEGER)\n )\n } else if (sortAction === 'toggle' && old?.length) {\n // This flips (or sets) the\n newSorting = old.map(d => {\n if (d.id === column.id) {\n return {\n ...d,\n desc: hasDescDefined ? desc! : nextSortingOrder! === 'desc',\n }\n }\n return d\n })\n } else if (sortAction === 'remove' && old?.length) {\n newSorting = old.filter(d => d.id !== column.id)\n }\n\n return newSorting\n })\n },\n\n getNextSortingOrder: () => {\n const sortDescFirst =\n column.columnDef.sortDescFirst ??\n table.options.sortDescFirst ??\n column.getAutoSortDir() === 'desc'\n const firstSortDirection = sortDescFirst ? 'desc' : 'asc'\n\n const isSorted = column.getIsSorted()\n if (!isSorted) {\n return firstSortDirection\n }\n if (isSorted === firstSortDirection) {\n return isSorted === 'desc' ? 'asc' : 'desc'\n } else {\n return false\n }\n },\n\n getCanSort: () => {\n return (\n (column.columnDef.enableSorting ?? true) &&\n (table.options.enableSorting ?? true) &&\n !!column.accessorFn\n )\n },\n\n getCanMultiSort: () => {\n return (\n column.columnDef.enableMultiSort ??\n table.options.enableMultiSort ??\n !!column.accessorFn\n )\n },\n\n getIsSorted: () => {\n const columnSort = table\n .getState()\n .sorting?.find(d => d.id === column.id)\n\n return !columnSort ? false : columnSort.desc ? 'desc' : 'asc'\n },\n\n getSortIndex: () =>\n table.getState().sorting?.findIndex(d => d.id === column.id) ?? -1,\n\n clearSorting: () => {\n //clear sorting for just 1 column\n table.setSorting(old =>\n old?.length ? old.filter(d => d.id !== column.id) : []\n )\n },\n\n getToggleSortingHandler: () => {\n const canSort = column.getCanSort()\n\n return (e: unknown) => {\n if (!canSort) return\n ;(e as any).persist?.()\n column.toggleSorting?.(\n undefined,\n column.getCanMultiSort()\n ? table.options.isMultiSortEvent?.(e)\n : false\n )\n }\n },\n }\n },\n\n createTable: <TData extends RowData>(\n table: Table<TData>\n ): SortingInstance<TData> => {\n return {\n setSorting: updater => table.options.onSortingChange?.(updater),\n resetSorting: defaultState => {\n table.setSorting(defaultState ? [] : table.initialState?.sorting ?? [])\n },\n getPreSortedRowModel: () => table.getGroupedRowModel(),\n getSortedRowModel: () => {\n if (!table._getSortedRowModel && table.options.getSortedRowModel) {\n table._getSortedRowModel = table.options.getSortedRowModel(table)\n }\n\n if (table.options.manualSorting || !table._getSortedRowModel) {\n return table.getPreSortedRowModel()\n }\n\n return table._getSortedRowModel()\n },\n }\n },\n}\n"],"names":["Sorting","getInitialState","state","sorting","getDefaultColumnDef","sortingFn","getDefaultOptions","table","onSortingChange","makeStateUpdater","isMultiSortEvent","e","shiftKey","createColumn","column","getAutoSortingFn","firstRows","getFilteredRowModel","flatRows","slice","isString","row","value","getValue","id","Object","prototype","toString","call","sortingFns","datetime","split","reSplitAlphaNumeric","length","alphanumeric","text","basic","getAutoSortDir","firstRow","getSortingFn","Error","isFunction","columnDef","toggleSorting","desc","multi","nextSortingOrder","getNextSortingOrder","setSorting","old","existingSorting","find","d","existingIndex","findIndex","hasDescDefined","newSorting","sortAction","getCanMultiSort","options","enableSortingRemoval","enableMultiRemove","splice","maxMultiSortColCount","Number","MAX_SAFE_INTEGER","map","filter","sortDescFirst","firstSortDirection","isSorted","getIsSorted","getCanSort","enableSorting","accessorFn","enableMultiSort","columnSort","getState","getSortIndex","clearSorting","getToggleSortingHandler","canSort","persist","undefined","createTable","updater","resetSorting","defaultState","initialState","getPreSortedRowModel","getGroupedRowModel","getSortedRowModel","_getSortedRowModel","manualSorting"],"mappings":"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"}
1
+ {"version":3,"file":"Sorting.js","sources":["../../../src/features/Sorting.ts"],"sourcesContent":["import { RowModel } from '..'\nimport { TableFeature } from '../core/table'\nimport {\n BuiltInSortingFn,\n reSplitAlphaNumeric,\n sortingFns,\n} from '../sortingFns'\n\nimport {\n Column,\n OnChangeFn,\n TableGenerics,\n Table,\n Row,\n Updater,\n RowData,\n} from '../types'\n\nimport { isFunction, makeStateUpdater, Overwrite } from '../utils'\n\nexport type SortDirection = 'asc' | 'desc'\n\nexport type ColumnSort = {\n id: string\n desc: boolean\n}\n\nexport type SortingState = ColumnSort[]\n\nexport type SortingTableState = {\n sorting: SortingState\n}\n\nexport type SortingFn<TData extends RowData> = {\n (rowA: Row<TData>, rowB: Row<TData>, columnId: string): number\n}\n\nexport type CustomSortingFns<TData extends RowData> = Record<\n string,\n SortingFn<TData>\n>\n\nexport type SortingFnOption<TData extends RowData> =\n | 'auto'\n | BuiltInSortingFn\n | SortingFn<TData>\n\nexport type SortingColumnDef<TData extends RowData> = {\n sortingFn?: SortingFnOption<TData>\n sortDescFirst?: boolean\n enableSorting?: boolean\n enableMultiSort?: boolean\n invertSorting?: boolean\n sortUndefined?: false | -1 | 1\n}\n\nexport type SortingColumn<TData extends RowData> = {\n getAutoSortingFn: () => SortingFn<TData>\n getAutoSortDir: () => SortDirection\n getSortingFn: () => SortingFn<TData>\n getFirstSortDir: () => SortDirection\n getNextSortingOrder: () => SortDirection | false\n getCanSort: () => boolean\n getCanMultiSort: () => boolean\n getSortIndex: () => number\n getIsSorted: () => false | SortDirection\n clearSorting: () => void\n toggleSorting: (desc?: boolean, isMulti?: boolean) => void\n getToggleSortingHandler: () => undefined | ((event: unknown) => void)\n}\n\nexport type SortingOptions<TData extends RowData> = {\n manualSorting?: boolean\n onSortingChange?: OnChangeFn<SortingState>\n enableSorting?: boolean\n enableSortingRemoval?: boolean\n enableMultiRemove?: boolean\n enableMultiSort?: boolean\n sortDescFirst?: boolean\n getSortedRowModel?: (table: Table<any>) => () => RowModel<any>\n maxMultiSortColCount?: number\n isMultiSortEvent?: (e: unknown) => boolean\n}\n\nexport type SortingInstance<TData extends RowData> = {\n setSorting: (updater: Updater<SortingState>) => void\n resetSorting: (defaultState?: boolean) => void\n getPreSortedRowModel: () => RowModel<TData>\n getSortedRowModel: () => RowModel<TData>\n _getSortedRowModel?: () => RowModel<TData>\n}\n\n//\n\nexport const Sorting: TableFeature = {\n getInitialState: (state): SortingTableState => {\n return {\n sorting: [],\n ...state,\n }\n },\n\n getDefaultColumnDef: <TData extends RowData>(): SortingColumnDef<TData> => {\n return {\n sortingFn: 'auto',\n }\n },\n\n getDefaultOptions: <TData extends RowData>(\n table: Table<TData>\n ): SortingOptions<TData> => {\n return {\n onSortingChange: makeStateUpdater('sorting', table),\n isMultiSortEvent: (e: unknown) => {\n return (e as MouseEvent).shiftKey\n },\n }\n },\n\n createColumn: <TData extends RowData, TValue>(\n column: Column<TData, TValue>,\n table: Table<TData>\n ): SortingColumn<TData> => {\n return {\n getAutoSortingFn: () => {\n const firstRows = table.getFilteredRowModel().flatRows.slice(10)\n\n let isString = false\n\n for (const row of firstRows) {\n const value = row?.getValue(column.id)\n\n if (Object.prototype.toString.call(value) === '[object Date]') {\n return sortingFns.datetime\n }\n\n if (typeof value === 'string') {\n isString = true\n\n if (value.split(reSplitAlphaNumeric).length > 1) {\n return sortingFns.alphanumeric\n }\n }\n }\n\n if (isString) {\n return sortingFns.text\n }\n\n return sortingFns.basic\n },\n getAutoSortDir: () => {\n const firstRow = table.getFilteredRowModel().flatRows[0]\n\n const value = firstRow?.getValue(column.id)\n\n if (typeof value === 'string') {\n return 'asc'\n }\n\n return 'desc'\n },\n getSortingFn: () => {\n if (!column) {\n throw new Error()\n }\n\n return isFunction(column.columnDef.sortingFn)\n ? column.columnDef.sortingFn\n : column.columnDef.sortingFn === 'auto'\n ? column.getAutoSortingFn()\n : (sortingFns[\n column.columnDef.sortingFn as BuiltInSortingFn\n ] as SortingFn<TData>)\n },\n toggleSorting: (desc, multi) => {\n // if (column.columns.length) {\n // column.columns.forEach((c, i) => {\n // if (c.id) {\n // table.toggleColumnSorting(c.id, undefined, multi || !!i)\n // }\n // })\n // return\n // }\n\n // this needs to be outside of table.setSorting to be in sync with rerender\n const nextSortingOrder = column.getNextSortingOrder()\n const hasManualValue = typeof desc !== 'undefined' && desc !== null\n\n table.setSorting(old => {\n // Find any existing sorting for this column\n const existingSorting = old?.find(d => d.id === column.id)\n const existingIndex = old?.findIndex(d => d.id === column.id)\n\n let newSorting: SortingState = []\n\n // What should we do with this sort action?\n let sortAction: 'add' | 'remove' | 'toggle' | 'replace'\n let nextDesc = hasManualValue ? desc : nextSortingOrder === 'desc'\n\n // Multi-mode\n if (old?.length && column.getCanMultiSort() && multi) {\n if (existingSorting) {\n sortAction = 'toggle'\n } else {\n sortAction = 'add'\n }\n } else {\n // Normal mode\n if (old?.length && existingIndex !== old.length - 1) {\n sortAction = 'replace'\n } else if (existingSorting) {\n sortAction = 'toggle'\n } else {\n sortAction = 'replace'\n }\n }\n\n // Handle toggle states that will remove the sorting\n if (sortAction === 'toggle') {\n // If we are \"actually\" toggling (not a manual set value), should we remove the sorting?\n if (!hasManualValue) {\n // Is our intention to remove?\n if (!nextSortingOrder) {\n sortAction = 'remove'\n }\n }\n }\n\n if (sortAction === 'add') {\n newSorting = [\n ...old,\n {\n id: column.id,\n desc: nextDesc,\n },\n ]\n // Take latest n columns\n newSorting.splice(\n 0,\n newSorting.length -\n (table.options.maxMultiSortColCount ?? Number.MAX_SAFE_INTEGER)\n )\n } else if (sortAction === 'toggle') {\n // This flips (or sets) the\n newSorting = old.map(d => {\n if (d.id === column.id) {\n return {\n ...d,\n desc: nextDesc,\n }\n }\n return d\n })\n } else if (sortAction === 'remove') {\n newSorting = old.filter(d => d.id !== column.id)\n } else {\n newSorting = [\n {\n id: column.id,\n desc: nextDesc,\n },\n ]\n }\n\n return newSorting\n })\n },\n\n getFirstSortDir: () => {\n const sortDescFirst =\n column.columnDef.sortDescFirst ??\n table.options.sortDescFirst ??\n column.getAutoSortDir() === 'desc'\n return sortDescFirst ? 'desc' : 'asc'\n },\n\n getNextSortingOrder: (multi?: boolean) => {\n const firstSortDirection = column.getFirstSortDir()\n const isSorted = column.getIsSorted()\n\n if (!isSorted) {\n return firstSortDirection\n }\n\n if (\n isSorted !== firstSortDirection &&\n (table.options.enableSortingRemoval ?? true) && // If enableSortRemove, enable in general\n (multi ? table.options.enableMultiRemove ?? true : true) // If multi, don't allow if enableMultiRemove))\n ) {\n return false\n }\n return isSorted === 'desc' ? 'asc' : 'desc'\n },\n\n getCanSort: () => {\n return (\n (column.columnDef.enableSorting ?? true) &&\n (table.options.enableSorting ?? true) &&\n !!column.accessorFn\n )\n },\n\n getCanMultiSort: () => {\n return (\n column.columnDef.enableMultiSort ??\n table.options.enableMultiSort ??\n !!column.accessorFn\n )\n },\n\n getIsSorted: () => {\n const columnSort = table\n .getState()\n .sorting?.find(d => d.id === column.id)\n\n return !columnSort ? false : columnSort.desc ? 'desc' : 'asc'\n },\n\n getSortIndex: () =>\n table.getState().sorting?.findIndex(d => d.id === column.id) ?? -1,\n\n clearSorting: () => {\n //clear sorting for just 1 column\n table.setSorting(old =>\n old?.length ? old.filter(d => d.id !== column.id) : []\n )\n },\n\n getToggleSortingHandler: () => {\n const canSort = column.getCanSort()\n\n return (e: unknown) => {\n if (!canSort) return\n ;(e as any).persist?.()\n column.toggleSorting?.(\n undefined,\n column.getCanMultiSort()\n ? table.options.isMultiSortEvent?.(e)\n : false\n )\n }\n },\n }\n },\n\n createTable: <TData extends RowData>(\n table: Table<TData>\n ): SortingInstance<TData> => {\n return {\n setSorting: updater => table.options.onSortingChange?.(updater),\n resetSorting: defaultState => {\n table.setSorting(defaultState ? [] : table.initialState?.sorting ?? [])\n },\n getPreSortedRowModel: () => table.getGroupedRowModel(),\n getSortedRowModel: () => {\n if (!table._getSortedRowModel && table.options.getSortedRowModel) {\n table._getSortedRowModel = table.options.getSortedRowModel(table)\n }\n\n if (table.options.manualSorting || !table._getSortedRowModel) {\n return table.getPreSortedRowModel()\n }\n\n return table._getSortedRowModel()\n },\n }\n },\n}\n"],"names":["Sorting","getInitialState","state","sorting","getDefaultColumnDef","sortingFn","getDefaultOptions","table","onSortingChange","makeStateUpdater","isMultiSortEvent","e","shiftKey","createColumn","column","getAutoSortingFn","firstRows","getFilteredRowModel","flatRows","slice","isString","row","value","getValue","id","Object","prototype","toString","call","sortingFns","datetime","split","reSplitAlphaNumeric","length","alphanumeric","text","basic","getAutoSortDir","firstRow","getSortingFn","Error","isFunction","columnDef","toggleSorting","desc","multi","nextSortingOrder","getNextSortingOrder","hasManualValue","setSorting","old","existingSorting","find","d","existingIndex","findIndex","newSorting","sortAction","nextDesc","getCanMultiSort","splice","options","maxMultiSortColCount","Number","MAX_SAFE_INTEGER","map","filter","getFirstSortDir","sortDescFirst","firstSortDirection","isSorted","getIsSorted","enableSortingRemoval","enableMultiRemove","getCanSort","enableSorting","accessorFn","enableMultiSort","columnSort","getState","getSortIndex","clearSorting","getToggleSortingHandler","canSort","persist","undefined","createTable","updater","resetSorting","defaultState","initialState","getPreSortedRowModel","getGroupedRowModel","getSortedRowModel","_getSortedRowModel","manualSorting"],"mappings":"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"}
@@ -35,7 +35,12 @@ const textCaseSensitive = (rowA, rowB, columnId) => {
35
35
  };
36
36
 
37
37
  const datetime = (rowA, rowB, columnId) => {
38
- return compareBasic(rowA.getValue(columnId).getTime(), rowB.getValue(columnId).getTime());
38
+ const a = rowA.getValue(columnId);
39
+ const b = rowB.getValue(columnId); // Can handle nullish values
40
+ // Use > and < because == (and ===) doesn't work with
41
+ // Date objects (would require calling getTime()).
42
+
43
+ return a > b ? 1 : a < b ? -1 : 0;
39
44
  };
40
45
 
41
46
  const basic = (rowA, rowB, columnId) => {
@@ -1 +1 @@
1
- {"version":3,"file":"sortingFns.js","sources":["../../src/sortingFns.ts"],"sourcesContent":["import { SortingFn } from './features/Sorting'\n\nexport const reSplitAlphaNumeric = /([0-9]+)/gm\n\nconst alphanumeric: SortingFn<any> = (rowA, rowB, columnId) => {\n return compareAlphanumeric(\n toString(rowA.getValue(columnId)).toLowerCase(),\n toString(rowB.getValue(columnId)).toLowerCase()\n )\n}\n\nconst alphanumericCaseSensitive: SortingFn<any> = (rowA, rowB, columnId) => {\n return compareAlphanumeric(\n toString(rowA.getValue(columnId)),\n toString(rowB.getValue(columnId))\n )\n}\n\n// The text filter is more basic (less numeric support)\n// but is much faster\nconst text: SortingFn<any> = (rowA, rowB, columnId) => {\n return compareBasic(\n toString(rowA.getValue(columnId)).toLowerCase(),\n toString(rowB.getValue(columnId)).toLowerCase()\n )\n}\n\n// The text filter is more basic (less numeric support)\n// but is much faster\nconst textCaseSensitive: SortingFn<any> = (rowA, rowB, columnId) => {\n return compareBasic(\n toString(rowA.getValue(columnId)),\n toString(rowB.getValue(columnId))\n )\n}\n\nconst datetime: SortingFn<any> = (rowA, rowB, columnId) => {\n return compareBasic(\n (rowA.getValue(columnId) as Date).getTime(),\n (rowB.getValue(columnId) as Date).getTime()\n )\n}\n\nconst basic: SortingFn<any> = (rowA, rowB, columnId) => {\n return compareBasic(rowA.getValue(columnId), rowB.getValue(columnId))\n}\n\n// Utils\n\nfunction compareBasic(a: any, b: any) {\n return a === b ? 0 : a > b ? 1 : -1\n}\n\nfunction toString(a: any) {\n if (typeof a === 'number') {\n if (isNaN(a) || a === Infinity || a === -Infinity) {\n return ''\n }\n return String(a)\n }\n if (typeof a === 'string') {\n return a\n }\n return ''\n}\n\n// Mixed sorting is slow, but very inclusive of many edge cases.\n// It handles numbers, mixed alphanumeric combinations, and even\n// null, undefined, and Infinity\nfunction compareAlphanumeric(aStr: string, bStr: string) {\n // Split on number groups, but keep the delimiter\n // Then remove falsey split values\n const a = aStr.split(reSplitAlphaNumeric).filter(Boolean)\n const b = bStr.split(reSplitAlphaNumeric).filter(Boolean)\n\n // While\n while (a.length && b.length) {\n const aa = a.shift()!\n const bb = b.shift()!\n\n const an = parseInt(aa, 10)\n const bn = parseInt(bb, 10)\n\n const combo = [an, bn].sort()\n\n // Both are string\n if (isNaN(combo[0]!)) {\n if (aa > bb) {\n return 1\n }\n if (bb > aa) {\n return -1\n }\n continue\n }\n\n // One is a string, one is a number\n if (isNaN(combo[1]!)) {\n return isNaN(an) ? -1 : 1\n }\n\n // Both are numbers\n if (an > bn) {\n return 1\n }\n if (bn > an) {\n return -1\n }\n }\n\n return a.length - b.length\n}\n\n// Exports\n\nexport const sortingFns = {\n alphanumeric,\n alphanumericCaseSensitive,\n text,\n textCaseSensitive,\n datetime,\n basic,\n}\n\nexport type BuiltInSortingFn = keyof typeof sortingFns\n"],"names":["reSplitAlphaNumeric","alphanumeric","rowA","rowB","columnId","compareAlphanumeric","toString","getValue","toLowerCase","alphanumericCaseSensitive","text","compareBasic","textCaseSensitive","datetime","getTime","basic","a","b","isNaN","Infinity","String","aStr","bStr","split","filter","Boolean","length","aa","shift","bb","an","parseInt","bn","combo","sort","sortingFns"],"mappings":";;;;;;;;;;;;;;AAEO,MAAMA,mBAAmB,GAAG,aAA5B;;AAEP,MAAMC,YAA4B,GAAG,CAACC,IAAD,EAAOC,IAAP,EAAaC,QAAb,KAA0B;EAC7D,OAAOC,mBAAmB,CACxBC,QAAQ,CAACJ,IAAI,CAACK,QAAL,CAAcH,QAAd,CAAD,CAAR,CAAkCI,WAAlC,EADwB,EAExBF,QAAQ,CAACH,IAAI,CAACI,QAAL,CAAcH,QAAd,CAAD,CAAR,CAAkCI,WAAlC,EAFwB,CAA1B,CAAA;AAID,CALD,CAAA;;AAOA,MAAMC,yBAAyC,GAAG,CAACP,IAAD,EAAOC,IAAP,EAAaC,QAAb,KAA0B;EAC1E,OAAOC,mBAAmB,CACxBC,QAAQ,CAACJ,IAAI,CAACK,QAAL,CAAcH,QAAd,CAAD,CADgB,EAExBE,QAAQ,CAACH,IAAI,CAACI,QAAL,CAAcH,QAAd,CAAD,CAFgB,CAA1B,CAAA;AAID,CALD;AAQA;;;AACA,MAAMM,IAAoB,GAAG,CAACR,IAAD,EAAOC,IAAP,EAAaC,QAAb,KAA0B;EACrD,OAAOO,YAAY,CACjBL,QAAQ,CAACJ,IAAI,CAACK,QAAL,CAAcH,QAAd,CAAD,CAAR,CAAkCI,WAAlC,EADiB,EAEjBF,QAAQ,CAACH,IAAI,CAACI,QAAL,CAAcH,QAAd,CAAD,CAAR,CAAkCI,WAAlC,EAFiB,CAAnB,CAAA;AAID,CALD;AAQA;;;AACA,MAAMI,iBAAiC,GAAG,CAACV,IAAD,EAAOC,IAAP,EAAaC,QAAb,KAA0B;EAClE,OAAOO,YAAY,CACjBL,QAAQ,CAACJ,IAAI,CAACK,QAAL,CAAcH,QAAd,CAAD,CADS,EAEjBE,QAAQ,CAACH,IAAI,CAACI,QAAL,CAAcH,QAAd,CAAD,CAFS,CAAnB,CAAA;AAID,CALD,CAAA;;AAOA,MAAMS,QAAwB,GAAG,CAACX,IAAD,EAAOC,IAAP,EAAaC,QAAb,KAA0B;EACzD,OAAOO,YAAY,CAChBT,IAAI,CAACK,QAAL,CAAcH,QAAd,CAAD,CAAkCU,OAAlC,EADiB,EAEhBX,IAAI,CAACI,QAAL,CAAcH,QAAd,CAAD,CAAkCU,OAAlC,EAFiB,CAAnB,CAAA;AAID,CALD,CAAA;;AAOA,MAAMC,KAAqB,GAAG,CAACb,IAAD,EAAOC,IAAP,EAAaC,QAAb,KAA0B;AACtD,EAAA,OAAOO,YAAY,CAACT,IAAI,CAACK,QAAL,CAAcH,QAAd,CAAD,EAA0BD,IAAI,CAACI,QAAL,CAAcH,QAAd,CAA1B,CAAnB,CAAA;AACD,CAFD;;;AAMA,SAASO,YAAT,CAAsBK,CAAtB,EAA8BC,CAA9B,EAAsC;AACpC,EAAA,OAAOD,CAAC,KAAKC,CAAN,GAAU,CAAV,GAAcD,CAAC,GAAGC,CAAJ,GAAQ,CAAR,GAAY,CAAC,CAAlC,CAAA;AACD,CAAA;;AAED,SAASX,QAAT,CAAkBU,CAAlB,EAA0B;AACxB,EAAA,IAAI,OAAOA,CAAP,KAAa,QAAjB,EAA2B;AACzB,IAAA,IAAIE,KAAK,CAACF,CAAD,CAAL,IAAYA,CAAC,KAAKG,QAAlB,IAA8BH,CAAC,KAAK,CAACG,QAAzC,EAAmD;AACjD,MAAA,OAAO,EAAP,CAAA;AACD,KAAA;;IACD,OAAOC,MAAM,CAACJ,CAAD,CAAb,CAAA;AACD,GAAA;;AACD,EAAA,IAAI,OAAOA,CAAP,KAAa,QAAjB,EAA2B;AACzB,IAAA,OAAOA,CAAP,CAAA;AACD,GAAA;;AACD,EAAA,OAAO,EAAP,CAAA;AACD;AAGD;AACA;;;AACA,SAASX,mBAAT,CAA6BgB,IAA7B,EAA2CC,IAA3C,EAAyD;AACvD;AACA;EACA,MAAMN,CAAC,GAAGK,IAAI,CAACE,KAAL,CAAWvB,mBAAX,CAAgCwB,CAAAA,MAAhC,CAAuCC,OAAvC,CAAV,CAAA;AACA,EAAA,MAAMR,CAAC,GAAGK,IAAI,CAACC,KAAL,CAAWvB,mBAAX,CAAA,CAAgCwB,MAAhC,CAAuCC,OAAvC,CAAV,CAJuD;;AAOvD,EAAA,OAAOT,CAAC,CAACU,MAAF,IAAYT,CAAC,CAACS,MAArB,EAA6B;AAC3B,IAAA,MAAMC,EAAE,GAAGX,CAAC,CAACY,KAAF,EAAX,CAAA;AACA,IAAA,MAAMC,EAAE,GAAGZ,CAAC,CAACW,KAAF,EAAX,CAAA;AAEA,IAAA,MAAME,EAAE,GAAGC,QAAQ,CAACJ,EAAD,EAAK,EAAL,CAAnB,CAAA;AACA,IAAA,MAAMK,EAAE,GAAGD,QAAQ,CAACF,EAAD,EAAK,EAAL,CAAnB,CAAA;IAEA,MAAMI,KAAK,GAAG,CAACH,EAAD,EAAKE,EAAL,CAASE,CAAAA,IAAT,EAAd,CAP2B;;AAU3B,IAAA,IAAIhB,KAAK,CAACe,KAAK,CAAC,CAAD,CAAN,CAAT,EAAsB;MACpB,IAAIN,EAAE,GAAGE,EAAT,EAAa;AACX,QAAA,OAAO,CAAP,CAAA;AACD,OAAA;;MACD,IAAIA,EAAE,GAAGF,EAAT,EAAa;AACX,QAAA,OAAO,CAAC,CAAR,CAAA;AACD,OAAA;;AACD,MAAA,SAAA;AACD,KAlB0B;;;AAqB3B,IAAA,IAAIT,KAAK,CAACe,KAAK,CAAC,CAAD,CAAN,CAAT,EAAsB;MACpB,OAAOf,KAAK,CAACY,EAAD,CAAL,GAAY,CAAC,CAAb,GAAiB,CAAxB,CAAA;AACD,KAvB0B;;;IA0B3B,IAAIA,EAAE,GAAGE,EAAT,EAAa;AACX,MAAA,OAAO,CAAP,CAAA;AACD,KAAA;;IACD,IAAIA,EAAE,GAAGF,EAAT,EAAa;AACX,MAAA,OAAO,CAAC,CAAR,CAAA;AACD,KAAA;AACF,GAAA;;AAED,EAAA,OAAOd,CAAC,CAACU,MAAF,GAAWT,CAAC,CAACS,MAApB,CAAA;AACD;;;AAIM,MAAMS,UAAU,GAAG;EACxBlC,YADwB;EAExBQ,yBAFwB;EAGxBC,IAHwB;EAIxBE,iBAJwB;EAKxBC,QALwB;AAMxBE,EAAAA,KAAAA;AANwB;;;;;"}
1
+ {"version":3,"file":"sortingFns.js","sources":["../../src/sortingFns.ts"],"sourcesContent":["import { SortingFn } from './features/Sorting'\n\nexport const reSplitAlphaNumeric = /([0-9]+)/gm\n\nconst alphanumeric: SortingFn<any> = (rowA, rowB, columnId) => {\n return compareAlphanumeric(\n toString(rowA.getValue(columnId)).toLowerCase(),\n toString(rowB.getValue(columnId)).toLowerCase()\n )\n}\n\nconst alphanumericCaseSensitive: SortingFn<any> = (rowA, rowB, columnId) => {\n return compareAlphanumeric(\n toString(rowA.getValue(columnId)),\n toString(rowB.getValue(columnId))\n )\n}\n\n// The text filter is more basic (less numeric support)\n// but is much faster\nconst text: SortingFn<any> = (rowA, rowB, columnId) => {\n return compareBasic(\n toString(rowA.getValue(columnId)).toLowerCase(),\n toString(rowB.getValue(columnId)).toLowerCase()\n )\n}\n\n// The text filter is more basic (less numeric support)\n// but is much faster\nconst textCaseSensitive: SortingFn<any> = (rowA, rowB, columnId) => {\n return compareBasic(\n toString(rowA.getValue(columnId)),\n toString(rowB.getValue(columnId))\n )\n}\n\nconst datetime: SortingFn<any> = (rowA, rowB, columnId) => {\n const a = rowA.getValue<Date>(columnId)\n const b = rowB.getValue<Date>(columnId)\n\n // Can handle nullish values\n // Use > and < because == (and ===) doesn't work with\n // Date objects (would require calling getTime()).\n return a > b ? 1 : a < b ? -1 : 0\n}\n\nconst basic: SortingFn<any> = (rowA, rowB, columnId) => {\n return compareBasic(rowA.getValue(columnId), rowB.getValue(columnId))\n}\n\n// Utils\n\nfunction compareBasic(a: any, b: any) {\n return a === b ? 0 : a > b ? 1 : -1\n}\n\nfunction toString(a: any) {\n if (typeof a === 'number') {\n if (isNaN(a) || a === Infinity || a === -Infinity) {\n return ''\n }\n return String(a)\n }\n if (typeof a === 'string') {\n return a\n }\n return ''\n}\n\n// Mixed sorting is slow, but very inclusive of many edge cases.\n// It handles numbers, mixed alphanumeric combinations, and even\n// null, undefined, and Infinity\nfunction compareAlphanumeric(aStr: string, bStr: string) {\n // Split on number groups, but keep the delimiter\n // Then remove falsey split values\n const a = aStr.split(reSplitAlphaNumeric).filter(Boolean)\n const b = bStr.split(reSplitAlphaNumeric).filter(Boolean)\n\n // While\n while (a.length && b.length) {\n const aa = a.shift()!\n const bb = b.shift()!\n\n const an = parseInt(aa, 10)\n const bn = parseInt(bb, 10)\n\n const combo = [an, bn].sort()\n\n // Both are string\n if (isNaN(combo[0]!)) {\n if (aa > bb) {\n return 1\n }\n if (bb > aa) {\n return -1\n }\n continue\n }\n\n // One is a string, one is a number\n if (isNaN(combo[1]!)) {\n return isNaN(an) ? -1 : 1\n }\n\n // Both are numbers\n if (an > bn) {\n return 1\n }\n if (bn > an) {\n return -1\n }\n }\n\n return a.length - b.length\n}\n\n// Exports\n\nexport const sortingFns = {\n alphanumeric,\n alphanumericCaseSensitive,\n text,\n textCaseSensitive,\n datetime,\n basic,\n}\n\nexport type BuiltInSortingFn = keyof typeof sortingFns\n"],"names":["reSplitAlphaNumeric","alphanumeric","rowA","rowB","columnId","compareAlphanumeric","toString","getValue","toLowerCase","alphanumericCaseSensitive","text","compareBasic","textCaseSensitive","datetime","a","b","basic","isNaN","Infinity","String","aStr","bStr","split","filter","Boolean","length","aa","shift","bb","an","parseInt","bn","combo","sort","sortingFns"],"mappings":"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"}
@@ -2349,7 +2349,12 @@ const textCaseSensitive = (rowA, rowB, columnId) => {
2349
2349
  };
2350
2350
 
2351
2351
  const datetime = (rowA, rowB, columnId) => {
2352
- return compareBasic(rowA.getValue(columnId).getTime(), rowB.getValue(columnId).getTime());
2352
+ const a = rowA.getValue(columnId);
2353
+ const b = rowB.getValue(columnId); // Can handle nullish values
2354
+ // Use > and < because == (and ===) doesn't work with
2355
+ // Date objects (would require calling getTime()).
2356
+
2357
+ return a > b ? 1 : a < b ? -1 : 0;
2353
2358
  };
2354
2359
 
2355
2360
  const basic = (rowA, rowB, columnId) => {
@@ -2510,18 +2515,17 @@ const Sorting = {
2510
2515
  // }
2511
2516
  // this needs to be outside of table.setSorting to be in sync with rerender
2512
2517
  const nextSortingOrder = column.getNextSortingOrder();
2518
+ const hasManualValue = typeof desc !== 'undefined' && desc !== null;
2513
2519
  table.setSorting(old => {
2514
- var _table$options$enable, _table$options$enable2;
2515
-
2516
2520
  // Find any existing sorting for this column
2517
2521
  const existingSorting = old == null ? void 0 : old.find(d => d.id === column.id);
2518
2522
  const existingIndex = old == null ? void 0 : old.findIndex(d => d.id === column.id);
2519
- const hasDescDefined = typeof desc !== 'undefined' && desc !== null;
2520
2523
  let newSorting = []; // What should we do with this sort action?
2521
2524
 
2522
2525
  let sortAction;
2526
+ let nextDesc = hasManualValue ? desc : nextSortingOrder === 'desc'; // Multi-mode
2523
2527
 
2524
- if (column.getCanMultiSort() && multi) {
2528
+ if (old != null && old.length && column.getCanMultiSort() && multi) {
2525
2529
  if (existingSorting) {
2526
2530
  sortAction = 'toggle';
2527
2531
  } else {
@@ -2539,63 +2543,71 @@ const Sorting = {
2539
2543
  } // Handle toggle states that will remove the sorting
2540
2544
 
2541
2545
 
2542
- if (sortAction === 'toggle' && ( // Must be toggling
2543
- (_table$options$enable = table.options.enableSortingRemoval) != null ? _table$options$enable : true) && // If enableSortRemove, enable in general
2544
- !hasDescDefined && ( // Must not be setting desc
2545
- multi ? (_table$options$enable2 = table.options.enableMultiRemove) != null ? _table$options$enable2 : true : true) && // If multi, don't allow if enableMultiRemove
2546
- !nextSortingOrder // Finally, detect if it should indeed be removed
2547
- ) {
2548
- sortAction = 'remove';
2546
+ if (sortAction === 'toggle') {
2547
+ // If we are "actually" toggling (not a manual set value), should we remove the sorting?
2548
+ if (!hasManualValue) {
2549
+ // Is our intention to remove?
2550
+ if (!nextSortingOrder) {
2551
+ sortAction = 'remove';
2552
+ }
2553
+ }
2549
2554
  }
2550
2555
 
2551
- if (sortAction === 'replace') {
2552
- newSorting = [{
2553
- id: column.id,
2554
- desc: hasDescDefined ? desc : nextSortingOrder === 'desc'
2555
- }];
2556
- } else if (sortAction === 'add' && old != null && old.length) {
2556
+ if (sortAction === 'add') {
2557
2557
  var _table$options$maxMul;
2558
2558
 
2559
2559
  newSorting = [...old, {
2560
2560
  id: column.id,
2561
- desc: hasDescDefined ? desc : nextSortingOrder === 'desc'
2561
+ desc: nextDesc
2562
2562
  }]; // Take latest n columns
2563
2563
 
2564
2564
  newSorting.splice(0, newSorting.length - ((_table$options$maxMul = table.options.maxMultiSortColCount) != null ? _table$options$maxMul : Number.MAX_SAFE_INTEGER));
2565
- } else if (sortAction === 'toggle' && old != null && old.length) {
2565
+ } else if (sortAction === 'toggle') {
2566
2566
  // This flips (or sets) the
2567
2567
  newSorting = old.map(d => {
2568
2568
  if (d.id === column.id) {
2569
2569
  return { ...d,
2570
- desc: hasDescDefined ? desc : nextSortingOrder === 'desc'
2570
+ desc: nextDesc
2571
2571
  };
2572
2572
  }
2573
2573
 
2574
2574
  return d;
2575
2575
  });
2576
- } else if (sortAction === 'remove' && old != null && old.length) {
2576
+ } else if (sortAction === 'remove') {
2577
2577
  newSorting = old.filter(d => d.id !== column.id);
2578
+ } else {
2579
+ newSorting = [{
2580
+ id: column.id,
2581
+ desc: nextDesc
2582
+ }];
2578
2583
  }
2579
2584
 
2580
2585
  return newSorting;
2581
2586
  });
2582
2587
  },
2583
- getNextSortingOrder: () => {
2588
+ getFirstSortDir: () => {
2584
2589
  var _ref, _column$columnDef$sor;
2585
2590
 
2586
2591
  const sortDescFirst = (_ref = (_column$columnDef$sor = column.columnDef.sortDescFirst) != null ? _column$columnDef$sor : table.options.sortDescFirst) != null ? _ref : column.getAutoSortDir() === 'desc';
2587
- const firstSortDirection = sortDescFirst ? 'desc' : 'asc';
2592
+ return sortDescFirst ? 'desc' : 'asc';
2593
+ },
2594
+ getNextSortingOrder: multi => {
2595
+ var _table$options$enable, _table$options$enable2;
2596
+
2597
+ const firstSortDirection = column.getFirstSortDir();
2588
2598
  const isSorted = column.getIsSorted();
2589
2599
 
2590
2600
  if (!isSorted) {
2591
2601
  return firstSortDirection;
2592
2602
  }
2593
2603
 
2594
- if (isSorted === firstSortDirection) {
2595
- return isSorted === 'desc' ? 'asc' : 'desc';
2596
- } else {
2604
+ if (isSorted !== firstSortDirection && ((_table$options$enable = table.options.enableSortingRemoval) != null ? _table$options$enable : true) && ( // If enableSortRemove, enable in general
2605
+ multi ? (_table$options$enable2 = table.options.enableMultiRemove) != null ? _table$options$enable2 : true : true) // If multi, don't allow if enableMultiRemove))
2606
+ ) {
2597
2607
  return false;
2598
2608
  }
2609
+
2610
+ return isSorted === 'desc' ? 'asc' : 'desc';
2599
2611
  },
2600
2612
  getCanSort: () => {
2601
2613
  var _column$columnDef$ena, _table$options$enable3;