/** * This file defines the interface for the grist api exposed to SafeBrowser plugins. Grist supports * various ways to require it to cover various scenarios. If writing the main safeBrowser module * (the one referenced by the components.safeBrowser key of the manifest) use * `self.importScript('grist');`, if writing a view include the script in the html `` * * * Example usage (let's assume that Grist let's plugin contributes to a Foo API defined as follow ): * * interface Foo { * foo(name: string): Promise; * } * * > main.ts: * class MyFoo { * public foo(name: string): Promise { * return new Promise( async resolve => { * grist.rpc.onMessage( e => { * resolve(e.data + name); * }); * grist.ready(); * await grist.api.render('view1.html', 'fullscreen'); * }); * } * } * grist.rpc.registerImpl('grist', new MyFoo()); // can add 3rd arg with type information * * > view1.html includes: * grist.api.render('static/view2.html', 'fullscreen').then( view => { * grist.rpc.onMessage(e => grist.rpc.postMessageForward("main.ts", e.data)); * }); * * > view2.html includes: * grist.rpc.postMessage('view1.html', 'foo '); * */ import {RenderOptions, RenderTarget} from './RenderOptions'; export type ComponentKind = "safeBrowser" | "safePython" | "unsafeNode"; export const RPC_GRISTAPI_INTERFACE = '_grist_api'; export interface GristAPI { /** * Render the file at `path` into the `target` location in Grist. `path` must be relative to the * root of the plugin's directory and point to an html that is contained within the plugin's * directory. `target` is a predifined location of the Grist UI, it could be `fullscreen` or * identifier for an inline target. Grist provides inline target identifiers in certain call * plugins. E.g. ImportSourceAPI.getImportSource is given a target identifier to allow rende UI * inline in the import dialog. Returns the procId which can be used to dispose the view. */ render(path: string, target: RenderTarget, options?: RenderOptions): Promise; /** * Dispose the process with id procId. If the process was embedded into the UI, removes the * corresponding element from the view. */ dispose(procId: number): Promise; // Subscribes to actions for `tableId`. Actions of all subscribed tables are send as rpc's // message. // TODO: document format of messages that can be listened on `rpc.onMessage(...);` subscribe(tableId: string): Promise; // Unsubscribe from actions for `tableId`. unsubscribe(tableId: string): Promise; } /** * GristDocAPI interface is implemented by Grist, and allows getting information from and * interacting with the Grist document to which a plugin is attached. */ export interface GristDocAPI { // Returns the docName that identifies the document. getDocName(): Promise; // Returns a sorted list of table IDs. listTables(): Promise; // Returns a complete table of data in the format {colId: [values]}, including the 'id' column. // Do not modify the returned arrays in-place, especially if used directly (not over RPC). // TODO: return type is Promise{[colId: string]: CellValue[]}> but cannot be specified because // ts-interface-builder does not properly support index-signature. fetchTable(tableId: string): Promise; // Applies an array of user actions. // todo: return type should be Promise, but this requires importing modules from // `app/common` which is not currently supported by the build. applyUserActions(actions: any[][]): Promise; } export interface GristView { // Like fetchTable, but gets data for the custom section specifically, if there is any. // TODO: return type is Promise{[colId: string]: CellValue[]}> but cannot be specified because // ts-interface-builder does not properly support index-signature. fetchSelectedTable(): Promise; // Similar TODO to fetchSelectedTable for return type. fetchSelectedRecord(rowId: number): Promise; // Allow custom widget to be listed as a possible source for linking with SELECT BY. allowSelectBy(): Promise; // Set the list of selected rows to be used against any linked widget. Requires `allowSelectBy()`. setSelectedRows(rowIds: number[]): Promise; }