(core) Adding onNewRecord event for custom widgets

Summary:
New onNewRecord event in custom widgets that is triggered
when the user selects a blank row.

Together with this diff there is PR for grist-help https://github.com/gristlabs/grist-help/pull/150

Test Plan: added test case

Reviewers: cyprien

Reviewed By: cyprien

Differential Revision: https://phab.getgrist.com/D3375
This commit is contained in:
Jarosław Sadziński 2022-04-11 21:33:26 +02:00
parent cedcdc6bff
commit 4401ec4d79
4 changed files with 16 additions and 4 deletions

View File

@ -73,7 +73,7 @@ export class CustomView extends Disposable {
private _emptyWidgetPage: string; private _emptyWidgetPage: string;
public create(gristDoc: GristDoc, viewSectionModel: ViewSectionRec) { public create(gristDoc: GristDoc, viewSectionModel: ViewSectionRec) {
BaseView.call(this as any, gristDoc, viewSectionModel); BaseView.call(this as any, gristDoc, viewSectionModel, { 'addNewRow': true });
this._customDef = this.viewSection.customDef; this._customDef = this.viewSection.customDef;

View File

@ -328,7 +328,7 @@ export class GristViewImpl implements GristView {
// Hidden/Visible columns will eventually reflect what is available, but this operation // Hidden/Visible columns will eventually reflect what is available, but this operation
// is not instant - and widget can receive rows with fields that are not in the mapping. // is not instant - and widget can receive rows with fields that are not in the mapping.
const columns: ColumnRec[] = this._visibleColumns(); const columns: ColumnRec[] = this._visibleColumns();
const rowIds: number[] = this._baseView.sortedRows.getKoArray().peek() as number[]; const rowIds = this._baseView.sortedRows.getKoArray().peek().filter(id => id != 'new');
const data: BulkColValues = {}; const data: BulkColValues = {};
for (const column of columns) { for (const column of columns) {
// Use the colId of the displayCol, which may be different in case of Reference columns. // Use the colId of the displayCol, which may be different in case of Reference columns.

View File

@ -63,7 +63,7 @@ declare module "app/client/components/BaseView" {
public isTruncated: ko.Observable<boolean>; public isTruncated: ko.Observable<boolean>;
public tableModel: DataTableModel; public tableModel: DataTableModel;
constructor(gristDoc: GristDoc, viewSectionModel: any); constructor(gristDoc: GristDoc, viewSectionModel: any, options?: {addNewRow?: boolean, isPreview?: boolean});
public setCursorPos(cursorPos: CursorPos): void; public setCursorPos(cursorPos: CursorPos): void;
public createFilterMenu(ctl: IOpenController, filterInfo: FilterInfo, onClose?: () => void): HTMLElement; public createFilterMenu(ctl: IOpenController, filterInfo: FilterInfo, onClose?: () => void): HTMLElement;
public buildTitleControls(): DomArg; public buildTitleControls(): DomArg;

View File

@ -310,12 +310,24 @@ export function mapColumnNamesBack(data: any, options: {
*/ */
export function onRecord(callback: (data: RowRecord | null, mappings: WidgetColumnMap | null) => unknown) { export function onRecord(callback: (data: RowRecord | null, mappings: WidgetColumnMap | null) => unknown) {
on('message', async function(msg) { on('message', async function(msg) {
if (!msg.tableId || !msg.rowId) { return; } if (!msg.tableId || !msg.rowId || msg.rowId === 'new') { return; }
const rec = await docApi.fetchSelectedRecord(msg.rowId); const rec = await docApi.fetchSelectedRecord(msg.rowId);
callback(rec, await getMappingsIfChanged(msg)); callback(rec, await getMappingsIfChanged(msg));
}); });
} }
/**
* For custom widgets, add a handler that will be called whenever the
* new (blank) row is selected.
*/
export function onNewRecord(callback: () => unknown) {
on('message', async function(msg) {
if (msg.tableId && msg.rowId === 'new') {
callback();
}
});
}
/** /**
* For custom widgets, add a handler that will be called whenever the * For custom widgets, add a handler that will be called whenever the
* selected records change. Handler will be called with a list of records. * selected records change. Handler will be called with a list of records.