From e6cae5f90d06b494d0ffb0a1d218a49a41870174 Mon Sep 17 00:00:00 2001 From: Matthew Pearson Date: Sat, 13 May 2023 14:23:29 -0700 Subject: [PATCH] added an optional type parameter for addPanel() so the `params` prop can be strictly typed --- .../src/__tests__/gridview/baseComponentGridview.spec.ts | 2 +- .../__tests__/groupview/dockviewGroupPanelModel.spec.ts | 6 +++--- packages/dockview-core/src/api/component.api.ts | 3 ++- packages/dockview-core/src/dockview/dockviewComponent.ts | 9 +++++---- packages/dockview-core/src/dockview/dockviewPanel.ts | 2 +- packages/dockview-core/src/dockview/options.ts | 9 +++++---- packages/dockview-core/src/gridview/basePanelView.ts | 7 ++++--- packages/dockview/src/react.ts | 4 ++-- packages/dockview/src/types.ts | 3 ++- 9 files changed, 25 insertions(+), 20 deletions(-) diff --git a/packages/dockview-core/src/__tests__/gridview/baseComponentGridview.spec.ts b/packages/dockview-core/src/__tests__/gridview/baseComponentGridview.spec.ts index 27e8925b1..c0d1a9754 100644 --- a/packages/dockview-core/src/__tests__/gridview/baseComponentGridview.spec.ts +++ b/packages/dockview-core/src/__tests__/gridview/baseComponentGridview.spec.ts @@ -21,7 +21,7 @@ class TestPanel implements IGridPanelView { return true; } - get params(): Record { + get params(): Parameters { return {}; } diff --git a/packages/dockview-core/src/__tests__/groupview/dockviewGroupPanelModel.spec.ts b/packages/dockview-core/src/__tests__/groupview/dockviewGroupPanelModel.spec.ts index b00522d05..3cd48758c 100644 --- a/packages/dockview-core/src/__tests__/groupview/dockviewGroupPanelModel.spec.ts +++ b/packages/dockview-core/src/__tests__/groupview/dockviewGroupPanelModel.spec.ts @@ -1,4 +1,4 @@ -import { DockviewComponent } from '../../dockview/dockviewComponent'; +import {DockviewComponent} from '../../dockview/dockviewComponent'; import { GroupPanelUpdateEvent, GroupviewPanelState, @@ -8,7 +8,7 @@ import { ITabRenderer, IWatermarkRenderer, } from '../../dockview/types'; -import { PanelUpdateEvent } from '../../panel/types'; +import { PanelUpdateEvent, Parameters } from '../../panel/types'; import { DockviewGroupPanelModel, GroupOptions, @@ -179,7 +179,7 @@ export class TestPanel implements IDockviewPanel { return this._group!; } - get params(): Record { + get params(): Parameters { return {}; } diff --git a/packages/dockview-core/src/api/component.api.ts b/packages/dockview-core/src/api/component.api.ts index d527ef6af..46d841f4a 100644 --- a/packages/dockview-core/src/api/component.api.ts +++ b/packages/dockview-core/src/api/component.api.ts @@ -8,6 +8,7 @@ import { AddPanelOptions, MovementOptions, } from '../dockview/options'; +import { Parameters } from '../panel/types'; import { Direction } from '../gridview/baseComponentGridview'; import { AddComponentOptions, @@ -431,7 +432,7 @@ export class DockviewApi implements CommonApi { this.component.layout(width, height, force); } - addPanel(options: AddPanelOptions): IDockviewPanel { + addPanel

(options: AddPanelOptions

): IDockviewPanel { return this.component.addPanel(options); } diff --git a/packages/dockview-core/src/dockview/dockviewComponent.ts b/packages/dockview-core/src/dockview/dockviewComponent.ts index 6d58c0b67..de75ca415 100644 --- a/packages/dockview-core/src/dockview/dockviewComponent.ts +++ b/packages/dockview-core/src/dockview/dockviewComponent.ts @@ -28,6 +28,7 @@ import { isPanelOptionsWithPanel, MovementOptions, } from './options'; +import { Parameters } from '../panel/types'; import { BaseGrid, Direction, @@ -96,7 +97,7 @@ export interface IDockviewComponent extends IBaseGrid { doSetGroupActive: (group: DockviewGroupPanel, skipFocus?: boolean) => void; removeGroup: (group: DockviewGroupPanel) => void; options: DockviewComponentOptions; - addPanel(options: AddPanelOptions): IDockviewPanel; + addPanel

(options: AddPanelOptions

): IDockviewPanel; removePanel(panel: IDockviewPanel): void; getGroupPanel: (id: string) => IDockviewPanel | undefined; createWatermarkComponent(): IWatermarkRenderer; @@ -495,7 +496,7 @@ export class DockviewComponent } } - addPanel(options: AddPanelOptions): IDockviewPanel { + addPanel

(options: AddPanelOptions

): IDockviewPanel { if (this.panels.find((_) => _.id === options.id)) { throw new Error(`panel with id ${options.id} already exists`); } @@ -907,8 +908,8 @@ export class DockviewComponent return view; } - private createPanel( - options: AddPanelOptions, + private createPanel

( + options: AddPanelOptions

, group: DockviewGroupPanel ): IDockviewPanel { const contentComponent = options.component; diff --git a/packages/dockview-core/src/dockview/dockviewPanel.ts b/packages/dockview-core/src/dockview/dockviewPanel.ts index 66ac5be5f..b13f8d5b6 100644 --- a/packages/dockview-core/src/dockview/dockviewPanel.ts +++ b/packages/dockview-core/src/dockview/dockviewPanel.ts @@ -19,7 +19,7 @@ export interface IDockviewPanel extends IDisposable, IPanel { readonly group: DockviewGroupPanel; readonly api: DockviewPanelApi; readonly title: string; - readonly params: Record | undefined; + readonly params: Parameters | undefined; updateParentGroup(group: DockviewGroupPanel, isGroupActive: boolean): void; init(params: IGroupPanelInitParameters): void; toJSON(): GroupviewPanelState; diff --git a/packages/dockview-core/src/dockview/options.ts b/packages/dockview-core/src/dockview/options.ts index 1e9b66db1..091d26a3f 100644 --- a/packages/dockview-core/src/dockview/options.ts +++ b/packages/dockview-core/src/dockview/options.ts @@ -8,6 +8,7 @@ import { IWatermarkRenderer, DockviewDropTargets, } from './types'; +import { Parameters } from '../panel/types'; import { DockviewGroupPanel, DockviewGroupPanelApi, @@ -86,10 +87,10 @@ export interface DockviewComponentOptions extends DockviewRenderFunctions { parentElement?: HTMLElement; } -export interface PanelOptions { +export interface PanelOptions

{ component: string; tabComponent?: string; - params?: { [key: string]: any }; + params?: P; id: string; title?: string; } @@ -131,8 +132,8 @@ export function isPanelOptionsWithGroup( return false; } -export interface AddPanelOptions - extends Omit { +export interface AddPanelOptions

+ extends Omit, 'component' | 'tabComponent'> { component: string; tabComponent?: string; position?: AddPanelPositionOptions; diff --git a/packages/dockview-core/src/gridview/basePanelView.ts b/packages/dockview-core/src/gridview/basePanelView.ts index 375b37a47..31c7b920c 100644 --- a/packages/dockview-core/src/gridview/basePanelView.ts +++ b/packages/dockview-core/src/gridview/basePanelView.ts @@ -5,13 +5,14 @@ import { PanelUpdateEvent, PanelInitParameters, IPanel, + Parameters, } from '../panel/types'; import { PanelApi, PanelApiImpl } from '../api/panelApi'; export interface BasePanelViewState { readonly id: string; readonly component: string; - readonly params?: Record; + readonly params?: Parameters; } export interface BasePanelViewExported { @@ -19,7 +20,7 @@ export interface BasePanelViewExported { readonly api: T; readonly width: number; readonly height: number; - readonly params: Record | undefined; + readonly params: Parameters | undefined; focus(): void; toJSON(): object; update(event: PanelUpdateEvent): void; @@ -50,7 +51,7 @@ export abstract class BasePanelView return this._height; } - get params(): Record | undefined { + get params(): Parameters | undefined { return this._params?.params; } diff --git a/packages/dockview/src/react.ts b/packages/dockview/src/react.ts index 9d78ba4c1..59299f22e 100644 --- a/packages/dockview/src/react.ts +++ b/packages/dockview/src/react.ts @@ -1,6 +1,6 @@ import * as React from 'react'; import * as ReactDOM from 'react-dom'; -import { IFrameworkPart, IDockviewDisposable } from 'dockview-core'; +import { IFrameworkPart, IDockviewDisposable, Parameters } from 'dockview-core'; export interface ReactPortalStore { addPortal: (portal: React.ReactPortal) => IDockviewDisposable; @@ -66,7 +66,7 @@ export const ReactPartContext = React.createContext<{}>({}); export class ReactPart

implements IFrameworkPart { - private _initialProps: Record = {}; + private _initialProps: Parameters = {}; private componentInstance?: IPanelWrapperRef; private ref?: { portal: React.ReactPortal; diff --git a/packages/dockview/src/types.ts b/packages/dockview/src/types.ts index d5b7b07a3..0028f3568 100644 --- a/packages/dockview/src/types.ts +++ b/packages/dockview/src/types.ts @@ -1,9 +1,10 @@ import * as React from 'react'; +import { Parameters } from 'dockview-core'; export interface PanelCollection { [name: string]: React.FunctionComponent; } -export interface PanelParameters> { +export interface PanelParameters { params: T; }