mirror of
https://github.com/gristlabs/grist-core.git
synced 2026-03-02 04:09:24 +00:00
(core) Adding sort options for columns.
Summary: Adding sort options for columns. - Sort menu has a new option "More sort options" that opens up Sort left menu - Each sort entry has an additional menu with 3 options -- Order by choice index (for the Choice column, orders by choice position) -- Empty last (puts empty values last in ascending order, first in descending order) -- Natural sort (for Text column, compares strings with numbers as numbers) Updated also CSV/Excel export and api sorting. Most of the changes in this diff is a sort expression refactoring. Pulling out all the methods that works on sortExpression array into a single namespace. Test Plan: Browser tests Reviewers: alexmojaki Reviewed By: alexmojaki Subscribers: dsagal, alexmojaki Differential Revision: https://phab.getgrist.com/D3077
This commit is contained in:
@@ -1,6 +1,8 @@
|
||||
import * as DataTableModel from 'app/client/models/DataTableModel';
|
||||
import {ColumnGetters} from 'app/common/ColumnGetters';
|
||||
import { ColumnGetter, ColumnGetters } from 'app/common/ColumnGetters';
|
||||
import * as gristTypes from 'app/common/gristTypes';
|
||||
import { choiceGetter } from 'app/common/SortFunc';
|
||||
import { Sort } from 'app/common/SortSpec';
|
||||
|
||||
/**
|
||||
*
|
||||
@@ -18,13 +20,15 @@ export class ClientColumnGetters implements ColumnGetters {
|
||||
unversioned?: boolean} = {}) {
|
||||
}
|
||||
|
||||
public getColGetter(colRef: number): ((rowId: number) => any) | null {
|
||||
const colId = this._tableModel.docModel.columns.getRowModel(Math.abs(colRef)).colId();
|
||||
const getter = this._tableModel.tableData.getRowPropFunc(colId);
|
||||
if (!getter) { return getter || null; }
|
||||
public getColGetter(colSpec: Sort.ColSpec): ColumnGetter | null {
|
||||
const rowModel = this._tableModel.docModel.columns.getRowModel(Sort.getColRef(colSpec));
|
||||
const colId = rowModel.colId();
|
||||
let getter: ColumnGetter|undefined = this._tableModel.tableData.getRowPropFunc(colId);
|
||||
if (!getter) { return null; }
|
||||
if (this._options.unversioned && this._tableModel.tableData.mayHaveVersions()) {
|
||||
return (rowId) => {
|
||||
const value = getter(rowId);
|
||||
const valueGetter = getter;
|
||||
getter = (rowId) => {
|
||||
const value = valueGetter(rowId);
|
||||
if (value && gristTypes.isVersions(value)) {
|
||||
const versions = value[1];
|
||||
return ('parent' in versions) ? versions.parent :
|
||||
@@ -33,6 +37,13 @@ export class ClientColumnGetters implements ColumnGetters {
|
||||
return value;
|
||||
};
|
||||
}
|
||||
const details = Sort.specToDetails(colSpec);
|
||||
if (details.orderByChoice) {
|
||||
if (rowModel.pureType() === 'Choice') {
|
||||
const choices: string[] = rowModel.widgetOptionsJson.peek()?.choices || [];
|
||||
getter = choiceGetter(getter, choices);
|
||||
}
|
||||
}
|
||||
return getter;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user