gristlabs_grist-core/app/plugin/TypeCheckers.ts
Jarosław Sadziński 85ef873ce5 (core) Widget options api
Summary:
Adding configuration options for CustomWidgets.

Custom widgets can now store options (in JSON) in viewSection metadata.

Changes in grist-plugin-api:
- Adding onOptions handler, that will be invoked when the widget is ready and when the configuration is changed
- Adding WidgetAPI - new API to read and save a configuration for widget.

Changes in Grist:
- Rewriting CustomView code, and extracting code that is responsible for showing the iframe and registering Rpc.
- Adding Open Configuration button to Widget section in the Creator panel and in the section menu.
- Custom Widgets can implement "configure" method, to show configuration screen when requested.

Test Plan: Browser tests.

Reviewers: paulfitz, dsagal

Reviewed By: paulfitz

Differential Revision: https://phab.getgrist.com/D3185
2022-01-13 11:10:17 +01:00

52 lines
2.3 KiB
TypeScript

import {createCheckers, ICheckerSuite} from 'ts-interface-checker';
import CustomSectionAPITI from './CustomSectionAPI-ti';
import FileParserAPITI from './FileParserAPI-ti';
import GristAPITI from './GristAPI-ti';
import GristTableTI from './GristTable-ti';
import ImportSourceAPITI from './ImportSourceAPI-ti';
import InternalImportSourceAPITI from './InternalImportSourceAPI-ti';
import RenderOptionsTI from './RenderOptions-ti';
import StorageAPITI from './StorageAPI-ti';
import WidgetAPITI from './WidgetAPI-ti';
/**
* The ts-interface-checker type suites are all exported with the "TI" suffix.
*/
export {
CustomSectionAPITI, FileParserAPITI, GristAPITI, GristTableTI, ImportSourceAPITI,
InternalImportSourceAPITI, RenderOptionsTI, StorageAPITI, WidgetAPITI};
const allTypes = [
CustomSectionAPITI, FileParserAPITI, GristAPITI, GristTableTI, ImportSourceAPITI,
InternalImportSourceAPITI, RenderOptionsTI, StorageAPITI, WidgetAPITI];
function checkDuplicates(types: Array<{[key: string]: object}>) {
const seen = new Set<string>();
for (const t of types) {
for (const key of Object.keys(t)) {
if (seen.has(key)) { throw new Error(`TypeCheckers: Duplicate type name ${key}`); }
seen.add(key);
// Uncomment the line below to generate updated list of included types.
// console.log(`'${key}' |`);
}
}
}
checkDuplicates(allTypes);
/**
* We also create and export a global checker object that includes all of the types above.
*/
export const checkers = createCheckers(...allTypes) as (
// The following Pick typecast ensures that Typescript can only use correct properties of the
// checkers object (e.g. checkers.GristAPI will compile, but checkers.GristApi will not).
// TODO: The restrictive type of ICheckerSuite should be generated automatically. (Currently
// generated by commenting out console.log() in checkDuplicates() above.)
Pick<ICheckerSuite,
'CustomSectionAPI' | 'EditOptionsAPI' | 'ParseFileAPI' | 'ParseOptions' | 'ParseOptionSchema' |
'FileSource' | 'ParseFileResult' | 'ComponentKind' | 'GristAPI' | 'GristDocAPI' | 'GristTable' |
'GristTables' | 'GristColumn' | 'GristView' | 'ImportSourceAPI' | 'ImportProcessorAPI' | 'FileContent' |
'FileListItem' | 'URL' | 'ImportSource' | 'InternalImportSourceAPI' | 'RenderTarget' |
'RenderOptions' | 'Storage' | 'WidgetAPI'
>);