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
50 lines
2.2 KiB
TypeScript
50 lines
2.2 KiB
TypeScript
import {KoArray} from 'app/client/lib/koArray';
|
|
import * as koUtil from 'app/client/lib/koUtil';
|
|
import {DocModel, IRowModel, recordSet, refRecord} from 'app/client/models/DocModel';
|
|
import {TabBarRec, ViewSectionRec} from 'app/client/models/DocModel';
|
|
import * as modelUtil from 'app/client/models/modelUtil';
|
|
import * as ko from 'knockout';
|
|
|
|
// Represents a view (now also referred to as a "page") containing one or more view sections.
|
|
export interface ViewRec extends IRowModel<"_grist_Views"> {
|
|
viewSections: ko.Computed<KoArray<ViewSectionRec>>;
|
|
tabBarItem: ko.Computed<KoArray<TabBarRec>>;
|
|
|
|
layoutSpecObj: modelUtil.ObjObservable<any>;
|
|
|
|
// An observable for the ref of the section last selected by the user.
|
|
activeSectionId: ko.Computed<number>;
|
|
|
|
activeSection: ko.Computed<ViewSectionRec>;
|
|
|
|
// If the active section is removed, set the next active section to be the default.
|
|
_isActiveSectionGone: ko.Computed<boolean>;
|
|
}
|
|
|
|
export function createViewRec(this: ViewRec, docModel: DocModel): void {
|
|
this.viewSections = recordSet(this, docModel.viewSections, 'parentId');
|
|
this.tabBarItem = recordSet(this, docModel.tabBar, 'viewRef');
|
|
|
|
this.layoutSpecObj = modelUtil.jsonObservable(this.layoutSpec);
|
|
|
|
// An observable for the ref of the section last selected by the user.
|
|
this.activeSectionId = koUtil.observableWithDefault(ko.observable(), () => {
|
|
// The default function which is used when the conditional case is true.
|
|
// Read may occur for recently disposed sections, must check condition first.
|
|
return !this.isDisposed() &&
|
|
// `!this.getRowId()` implies that this is an empty (non-existent) view record
|
|
// which happens when viewing the raw data tables, in which case the default is no active view section.
|
|
this.getRowId() && this.viewSections().all().length > 0 ? this.viewSections().at(0)!.getRowId() : 0;
|
|
});
|
|
|
|
this.activeSection = refRecord(docModel.viewSections, this.activeSectionId);
|
|
|
|
// If the active section is removed, set the next active section to be the default.
|
|
this._isActiveSectionGone = this.autoDispose(ko.computed(() => this.activeSection()._isDeleted()));
|
|
this.autoDispose(this._isActiveSectionGone.subscribe(gone => {
|
|
if (gone) {
|
|
this.activeSectionId(0);
|
|
}
|
|
}));
|
|
}
|