UNPKG

2.08 kBTypeScriptView Raw
1/* -----------------------------------------------------------------------------
2| Copyright (c) Jupyter Development Team.
3| Distributed under the terms of the Modified BSD License.
4|----------------------------------------------------------------------------*/
5
6import { IFormRenderer, IFormRendererRegistry } from './tokens';
7
8/**
9 * A registry for property renderers used in the FormEditor component.
10 */
11export class FormRendererRegistry implements IFormRendererRegistry {
12 /**
13 * Adds a renderer for a given property of a given settings plugin.
14 *
15 * The id must follow that structure `<ISettingRegistry.IPlugin.id>.<propertyName>`
16 *
17 * @param id - Unique ID for the given renderer.
18 * @param renderer - A renderer interfacing IFormRenderer.
19 */
20 addRenderer(id: string, renderer: IFormRenderer): void {
21 if (this._renderers[id]) {
22 throw new Error(`A renderer with id '${id}' is already registered.`);
23 }
24 if (!renderer.fieldRenderer && !renderer.widgetRenderer) {
25 throw new Error(
26 `The component for '${id}' cannot be registered as it does not define 'fieldRenderer' nor 'widgetRenderer'.`
27 );
28 }
29
30 const splitPosition = id.lastIndexOf('.');
31 const pluginId = id.substring(0, splitPosition);
32 const propertyName = id.substring(splitPosition + 1);
33 if (pluginId.length == 0 || propertyName.length == 0) {
34 throw new Error(
35 `Form renderer id must follows the structure '<ISettingRegistry.IPlugin.id>.<propertyName>'; got ${id}.`
36 );
37 }
38
39 this._renderers[id] = renderer;
40 }
41
42 /**
43 * Returns all registered renderers in dictionary form.
44 * @returns - A dictionary that maps an id to a renderer.
45 */
46 get renderers(): { [id: string]: IFormRenderer } {
47 return this._renderers;
48 }
49
50 /**
51 * Returns the renderer for the given id
52 * @param id - The unique id for the renderer.
53 * @returns - A renderer interfacing IFormRenderer.
54 */
55 getRenderer(id: string): IFormRenderer {
56 return this._renderers[id];
57 }
58
59 private _renderers: { [id: string]: IFormRenderer } = {};
60}