mirror of
https://github.com/gristlabs/grist-core.git
synced 2024-10-27 20:44:07 +00:00
592a43ec36
Summary: - Added a new special page for viewing raw data widgets: - Implemented in DataTables.ts - Accessible only via the special URL path `/p/data` - Future diffs should make this page prettier and easily accessible - Shows a list of user tables - Clicking on a table name shows its `rawViewSection` by setting `GristDoc.viewModel.activeSectionId`. Note that in this case `GristDoc.viewModel` is an empty record, so this is a bit of a hack, but it works well and causes no known issues. - Added `ViewSectionRec.isRaw` to know if the record represents a raw data widget. - Added various restrictions in the UI for raw data widgets: - 'Delete widget' is disabled in the 3-dot widget menu. - Prevent hiding columns: - "Hide column" in the column context menu is disabled - The "VISIBLE/HIDDEN COLUMNS" section of the right panel > Table > Widget is hidden - The toggle bar isn't configurable to ensure that users know when raw data is filtered: - The filter bar always shows if and only if some filters are present - "Toggle Filter Bar" is hidden in: - Right panel > Table > Sort & Filter - The sort/filter menu next to the three-dot menu for widgets. - Other restrictions in the right panel: - In the Column tab: - 'Use separate settings' is disabled - In the Table tab: - In the Widget subtab: - 'Change Widget' is hidden - In the Data subtab: - 'Edit Data Selection' is hidden - 'SELECT BY' is hidden Test Plan: Tested manually. The behaviour of raw data widgets may still change and they aren't easily visible to users yet. Reviewers: georgegevoian Reviewed By: georgegevoian Differential Revision: https://phab.getgrist.com/D3248
78 lines
3.2 KiB
TypeScript
78 lines
3.2 KiB
TypeScript
import {KoArray} from 'app/client/lib/koArray';
|
|
import {DocModel, IRowModel, recordSet, refRecord, ViewSectionRec} from 'app/client/models/DocModel';
|
|
import {ColumnRec, ValidationRec, ViewRec} from 'app/client/models/DocModel';
|
|
import {MANUALSORT} from 'app/common/gristTypes';
|
|
import * as ko from 'knockout';
|
|
import toUpper = require('lodash/toUpper');
|
|
import * as randomcolor from 'randomcolor';
|
|
|
|
// Represents a user-defined table.
|
|
export interface TableRec extends IRowModel<"_grist_Tables"> {
|
|
columns: ko.Computed<KoArray<ColumnRec>>;
|
|
validations: ko.Computed<KoArray<ValidationRec>>;
|
|
|
|
primaryView: ko.Computed<ViewRec>;
|
|
rawViewSection: ko.Computed<ViewSectionRec>;
|
|
summarySource: ko.Computed<TableRec>;
|
|
|
|
// A Set object of colRefs for all summarySourceCols of table.
|
|
summarySourceColRefs: ko.Computed<Set<number>>;
|
|
|
|
// tableId for normal tables, or tableId of the source table for summary tables.
|
|
primaryTableId: ko.Computed<string>;
|
|
|
|
// The list of grouped by columns.
|
|
groupByColumns: ko.Computed<ColumnRec[]>;
|
|
|
|
// The user-friendly name of the table, which is the same as tableId for non-summary tables,
|
|
// and is 'tableId[groupByCols...]' for summary tables.
|
|
tableTitle: ko.Computed<string>;
|
|
|
|
tableColor: string;
|
|
disableAddRemoveRows: ko.Computed<boolean>;
|
|
supportsManualSort: ko.Computed<boolean>;
|
|
}
|
|
|
|
export function createTableRec(this: TableRec, docModel: DocModel): void {
|
|
this.columns = recordSet(this, docModel.columns, 'parentId', {sortBy: 'parentPos'});
|
|
this.validations = recordSet(this, docModel.validations, 'tableRef');
|
|
|
|
this.primaryView = refRecord(docModel.views, this.primaryViewId);
|
|
this.rawViewSection = refRecord(docModel.viewSections, this.rawViewSectionRef);
|
|
this.summarySource = refRecord(docModel.tables, this.summarySourceTable);
|
|
|
|
// A Set object of colRefs for all summarySourceCols of this table.
|
|
this.summarySourceColRefs = this.autoDispose(ko.pureComputed(() => new Set(
|
|
this.columns().all().map(c => c.summarySourceCol()).filter(colRef => colRef))));
|
|
|
|
// tableId for normal tables, or tableId of the source table for summary tables.
|
|
this.primaryTableId = ko.pureComputed(() =>
|
|
this.summarySourceTable() ? this.summarySource().tableId() : this.tableId());
|
|
|
|
this.groupByColumns = ko.pureComputed(() => this.columns().all().filter(c => c.summarySourceCol()));
|
|
|
|
const groupByDesc = ko.pureComputed(() => {
|
|
const groupBy = this.groupByColumns();
|
|
return groupBy.length ? 'by ' + groupBy.map(c => c.label()).join(", ") : "Totals";
|
|
});
|
|
|
|
// The user-friendly name of the table, which is the same as tableId for non-summary tables,
|
|
// and is 'tableId[groupByCols...]' for summary tables.
|
|
this.tableTitle = ko.pureComputed(() => {
|
|
if (this.summarySourceTable()) {
|
|
return toUpper(this.summarySource().tableId()) + " [" + groupByDesc() + "]";
|
|
}
|
|
return toUpper(this.tableId());
|
|
});
|
|
|
|
// TODO: We should save this value and let users change it.
|
|
this.tableColor = randomcolor({
|
|
luminosity: 'light',
|
|
seed: typeof this.id() === 'number' ? 5 * this.id() : this.id()
|
|
});
|
|
|
|
this.disableAddRemoveRows = ko.pureComputed(() => Boolean(this.summarySourceTable()));
|
|
|
|
this.supportsManualSort = ko.pureComputed(() => this.columns().all().some(c => c.colId() === MANUALSORT));
|
|
}
|