UNPKG

dockview-solid

Version:

Zero dependency layout manager supporting tabs, grids and splitviews

96 lines (95 loc) 3.89 kB
import { onMount, onCleanup, createEffect } from "solid-js"; import { createDockview, PROPERTY_KEYS_DOCKVIEW, } from "dockview-core"; import { SolidHeaderActionsRendererPart } from "./solidHeaderActionsRendererPart"; import { SolidPanelContentPart } from "./solidContentPart"; import { SolidPanelHeaderPart } from "./solidHeaderPart"; import { SolidWatermarkPart } from "./solidWatermarkPart"; const DEFAULT_SOLID_TAB = "props.defaultTabComponent"; function createGroupControlPart(component) { return component ? (groupPanel) => { return new SolidHeaderActionsRendererPart(component, groupPanel); } : undefined; } function extractCoreOptions(props) { const coreOptions = {}; PROPERTY_KEYS_DOCKVIEW.forEach((key) => { if (key in props) { coreOptions[key] = props[key]; } }); return coreOptions; } export const DockviewSolid = (props) => { let container; let api; onMount(() => { if (!container) return; const frameworkTabComponents = props.tabComponents || {}; if (props.defaultTabComponent) { frameworkTabComponents[DEFAULT_SOLID_TAB] = props.defaultTabComponent; } const frameworkOptions = { createLeftHeaderActionComponent: createGroupControlPart(props.leftHeaderActionsComponent), createRightHeaderActionComponent: createGroupControlPart(props.rightHeaderActionsComponent), createPrefixHeaderActionComponent: createGroupControlPart(props.prefixHeaderActionsComponent), createComponent: (options) => new SolidPanelContentPart(options.id, props.components[options.name]), createTabComponent: (options) => new SolidPanelHeaderPart(options.id, frameworkTabComponents[options.name]), createWatermarkComponent: props.watermarkComponent ? () => new SolidWatermarkPart("watermark", props.watermarkComponent) : undefined, defaultTabComponent: props.defaultTabComponent ? DEFAULT_SOLID_TAB : undefined, }; api = createDockview(container, Object.assign(Object.assign({}, extractCoreOptions(props)), frameworkOptions)); api.layout(container.clientWidth, container.clientHeight); props.onReady({ api }); }); onCleanup(() => { if (api) api.dispose(); }); createEffect(() => { if (!api) return; const frameworkTabComponents = props.tabComponents || {}; if (props.defaultTabComponent) { frameworkTabComponents[DEFAULT_SOLID_TAB] = props.defaultTabComponent; } api.updateOptions({ createTabComponent: (options) => new SolidPanelHeaderPart(options.id, frameworkTabComponents[options.name]), defaultTabComponent: props.defaultTabComponent ? DEFAULT_SOLID_TAB : undefined, }); }); createEffect(() => { if (api) { const changes = {}; PROPERTY_KEYS_DOCKVIEW.forEach((key) => { if (key in props) { // cast changes to any to allow dynamic property assignment changes[key] = props[key]; } }); api.updateOptions(changes); } }); createEffect(() => { if (api && props.onDidDrop) { const disp = api.onDidDrop((event) => props.onDidDrop(event)); onCleanup(() => disp.dispose()); } }); createEffect(() => { if (api && props.onWillDrop) { const disp = api.onWillDrop((event) => props.onWillDrop(event)); onCleanup(() => disp.dispose()); } }); return (<div style={{ height: "100%", width: "100%" }} ref={(el) => (container = el)}/>); }; export default DockviewSolid;