2022-07-04 14:14:55 +00:00
|
|
|
import DataTableModel from 'app/client/models/DataTableModel';
|
2021-11-03 11:44:28 +00:00
|
|
|
import { ColumnGetter, ColumnGetters } from 'app/common/ColumnGetters';
|
2020-10-02 15:10:00 +00:00
|
|
|
import * as gristTypes from 'app/common/gristTypes';
|
2021-11-03 11:44:28 +00:00
|
|
|
import { choiceGetter } from 'app/common/SortFunc';
|
|
|
|
import { Sort } from 'app/common/SortSpec';
|
2020-10-02 15:10:00 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
* An implementation of ColumnGetters for the client, drawing
|
|
|
|
* on the observables and models available in that context.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
export class ClientColumnGetters implements ColumnGetters {
|
|
|
|
|
2020-11-18 15:54:23 +00:00
|
|
|
// If the "unversioned" option is set, then cells with multiple
|
|
|
|
// versions will be read as a single version - the first version
|
|
|
|
// available of parent, local, or remote. This can make sense for
|
|
|
|
// sorting, so cells appear in a reasonably sensible place.
|
|
|
|
constructor(private _tableModel: DataTableModel, private _options: {
|
|
|
|
unversioned?: boolean} = {}) {
|
2020-10-02 15:10:00 +00:00
|
|
|
}
|
|
|
|
|
2021-11-03 11:44:28 +00:00
|
|
|
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; }
|
2020-11-18 15:54:23 +00:00
|
|
|
if (this._options.unversioned && this._tableModel.tableData.mayHaveVersions()) {
|
2021-11-03 11:44:28 +00:00
|
|
|
const valueGetter = getter;
|
|
|
|
getter = (rowId) => {
|
|
|
|
const value = valueGetter(rowId);
|
2020-11-18 15:54:23 +00:00
|
|
|
if (value && gristTypes.isVersions(value)) {
|
|
|
|
const versions = value[1];
|
|
|
|
return ('parent' in versions) ? versions.parent :
|
|
|
|
('local' in versions) ? versions.local : versions.remote;
|
|
|
|
}
|
|
|
|
return value;
|
|
|
|
};
|
|
|
|
}
|
2021-11-03 11:44:28 +00:00
|
|
|
const details = Sort.specToDetails(colSpec);
|
|
|
|
if (details.orderByChoice) {
|
|
|
|
if (rowModel.pureType() === 'Choice') {
|
|
|
|
const choices: string[] = rowModel.widgetOptionsJson.peek()?.choices || [];
|
|
|
|
getter = choiceGetter(getter, choices);
|
|
|
|
}
|
|
|
|
}
|
2020-11-18 15:54:23 +00:00
|
|
|
return getter;
|
2020-10-02 15:10:00 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
public getManualSortGetter(): ((rowId: number) => any) | null {
|
|
|
|
const manualSortCol = this._tableModel.tableMetaRow.columns().peek().find(
|
|
|
|
(c: any) => c.colId() === gristTypes.MANUALSORT);
|
|
|
|
if (!manualSortCol) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
return this.getColGetter(manualSortCol.getRowId());
|
|
|
|
}
|
|
|
|
}
|