Merge pull request #282 from mpearson/mpearson/component-params-typing

feat: add  optional type parameter for addPanel() params
This commit is contained in:
mathuo 2023-06-13 19:56:31 +01:00 committed by GitHub
commit bfc4faeed2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 26 additions and 21 deletions

View File

@ -21,7 +21,7 @@ class TestPanel implements IGridPanelView {
return true; return true;
} }
get params(): Record<string, any> { get params(): Parameters {
return {}; return {};
} }

View File

@ -7,7 +7,7 @@ import {
ITabRenderer, ITabRenderer,
IWatermarkRenderer, IWatermarkRenderer,
} from '../../dockview/types'; } from '../../dockview/types';
import { PanelUpdateEvent } from '../../panel/types'; import { PanelUpdateEvent, Parameters } from '../../panel/types';
import { import {
DockviewGroupPanelModel, DockviewGroupPanelModel,
GroupOptions, GroupOptions,
@ -178,7 +178,7 @@ export class TestPanel implements IDockviewPanel {
return this._group!; return this._group!;
} }
get params(): Record<string, any> { get params(): Parameters {
return {}; return {};
} }

View File

@ -8,6 +8,7 @@ import {
AddPanelOptions, AddPanelOptions,
MovementOptions, MovementOptions,
} from '../dockview/options'; } from '../dockview/options';
import { Parameters } from '../panel/types';
import { Direction } from '../gridview/baseComponentGridview'; import { Direction } from '../gridview/baseComponentGridview';
import { import {
AddComponentOptions, AddComponentOptions,
@ -431,7 +432,7 @@ export class DockviewApi implements CommonApi<SerializedDockview> {
this.component.layout(width, height, force); this.component.layout(width, height, force);
} }
addPanel(options: AddPanelOptions): IDockviewPanel { addPanel<P extends object = Parameters>(options: AddPanelOptions<P>): IDockviewPanel {
return this.component.addPanel(options); return this.component.addPanel(options);
} }

View File

@ -28,6 +28,7 @@ import {
isPanelOptionsWithPanel, isPanelOptionsWithPanel,
MovementOptions, MovementOptions,
} from './options'; } from './options';
import { Parameters } from '../panel/types';
import { import {
BaseGrid, BaseGrid,
Direction, Direction,
@ -96,7 +97,7 @@ export interface IDockviewComponent extends IBaseGrid<DockviewGroupPanel> {
doSetGroupActive: (group: DockviewGroupPanel, skipFocus?: boolean) => void; doSetGroupActive: (group: DockviewGroupPanel, skipFocus?: boolean) => void;
removeGroup: (group: DockviewGroupPanel) => void; removeGroup: (group: DockviewGroupPanel) => void;
options: DockviewComponentOptions; options: DockviewComponentOptions;
addPanel(options: AddPanelOptions): IDockviewPanel; addPanel<P extends object = Parameters>(options: AddPanelOptions<P>): IDockviewPanel;
removePanel(panel: IDockviewPanel): void; removePanel(panel: IDockviewPanel): void;
getGroupPanel: (id: string) => IDockviewPanel | undefined; getGroupPanel: (id: string) => IDockviewPanel | undefined;
createWatermarkComponent(): IWatermarkRenderer; createWatermarkComponent(): IWatermarkRenderer;
@ -495,7 +496,7 @@ export class DockviewComponent
} }
} }
addPanel(options: AddPanelOptions): IDockviewPanel { addPanel<P extends object = Parameters>(options: AddPanelOptions<P>): IDockviewPanel {
if (this.panels.find((_) => _.id === options.id)) { if (this.panels.find((_) => _.id === options.id)) {
throw new Error(`panel with id ${options.id} already exists`); throw new Error(`panel with id ${options.id} already exists`);
} }
@ -913,8 +914,8 @@ export class DockviewComponent
return view; return view;
} }
private createPanel( private createPanel<P extends object = Parameters>(
options: AddPanelOptions, options: AddPanelOptions<P>,
group: DockviewGroupPanel group: DockviewGroupPanel
): IDockviewPanel { ): IDockviewPanel {
const contentComponent = options.component; const contentComponent = options.component;

View File

@ -14,8 +14,8 @@ export interface IDockviewPanel extends IDisposable, IPanel {
readonly view: IDockviewPanelModel; readonly view: IDockviewPanelModel;
readonly group: DockviewGroupPanel; readonly group: DockviewGroupPanel;
readonly api: DockviewPanelApi; readonly api: DockviewPanelApi;
readonly title: string | undefined; readonly title: string;
readonly params: Record<string, any> | undefined; readonly params: Parameters | undefined;
updateParentGroup(group: DockviewGroupPanel, isGroupActive: boolean): void; updateParentGroup(group: DockviewGroupPanel, isGroupActive: boolean): void;
init(params: IGroupPanelInitParameters): void; init(params: IGroupPanelInitParameters): void;
toJSON(): GroupviewPanelState; toJSON(): GroupviewPanelState;

View File

@ -8,6 +8,7 @@ import {
IWatermarkRenderer, IWatermarkRenderer,
DockviewDropTargets, DockviewDropTargets,
} from './types'; } from './types';
import { Parameters } from '../panel/types';
import { import {
DockviewGroupPanel, DockviewGroupPanel,
DockviewGroupPanelApi, DockviewGroupPanelApi,
@ -86,10 +87,10 @@ export interface DockviewComponentOptions extends DockviewRenderFunctions {
parentElement?: HTMLElement; parentElement?: HTMLElement;
} }
export interface PanelOptions { export interface PanelOptions<P extends object = Parameters> {
component: string; component: string;
tabComponent?: string; tabComponent?: string;
params?: { [key: string]: any }; params?: P;
id: string; id: string;
title?: string; title?: string;
} }
@ -131,8 +132,8 @@ export function isPanelOptionsWithGroup(
return false; return false;
} }
export interface AddPanelOptions export interface AddPanelOptions<P extends object = Parameters>
extends Omit<PanelOptions, 'component' | 'tabComponent'> { extends Omit<PanelOptions<P>, 'component' | 'tabComponent'> {
component: string; component: string;
tabComponent?: string; tabComponent?: string;
position?: AddPanelPositionOptions; position?: AddPanelPositionOptions;

View File

@ -5,13 +5,14 @@ import {
PanelUpdateEvent, PanelUpdateEvent,
PanelInitParameters, PanelInitParameters,
IPanel, IPanel,
Parameters,
} from '../panel/types'; } from '../panel/types';
import { PanelApi, PanelApiImpl } from '../api/panelApi'; import { PanelApi, PanelApiImpl } from '../api/panelApi';
export interface BasePanelViewState { export interface BasePanelViewState {
readonly id: string; readonly id: string;
readonly component: string; readonly component: string;
readonly params?: Record<string, any>; readonly params?: Parameters;
} }
export interface BasePanelViewExported<T extends PanelApi> { export interface BasePanelViewExported<T extends PanelApi> {
@ -19,7 +20,7 @@ export interface BasePanelViewExported<T extends PanelApi> {
readonly api: T; readonly api: T;
readonly width: number; readonly width: number;
readonly height: number; readonly height: number;
readonly params: Record<string, any> | undefined; readonly params: Parameters | undefined;
focus(): void; focus(): void;
toJSON(): object; toJSON(): object;
update(event: PanelUpdateEvent): void; update(event: PanelUpdateEvent): void;
@ -50,7 +51,7 @@ export abstract class BasePanelView<T extends PanelApiImpl>
return this._height; return this._height;
} }
get params(): Record<string, any> | undefined { get params(): Parameters | undefined {
return this._params?.params; return this._params?.params;
} }

View File

@ -1,6 +1,6 @@
import * as React from 'react'; import * as React from 'react';
import * as ReactDOM from 'react-dom'; import * as ReactDOM from 'react-dom';
import { IFrameworkPart, IDockviewDisposable } from 'dockview-core'; import { IFrameworkPart, IDockviewDisposable, Parameters } from 'dockview-core';
export interface ReactPortalStore { export interface ReactPortalStore {
addPortal: (portal: React.ReactPortal) => IDockviewDisposable; addPortal: (portal: React.ReactPortal) => IDockviewDisposable;
@ -66,7 +66,7 @@ export const ReactPartContext = React.createContext<{}>({});
export class ReactPart<P extends object, C extends object = {}> export class ReactPart<P extends object, C extends object = {}>
implements IFrameworkPart implements IFrameworkPart
{ {
private _initialProps: Record<string, any> = {}; private _initialProps: Parameters = {};
private componentInstance?: IPanelWrapperRef; private componentInstance?: IPanelWrapperRef;
private ref?: { private ref?: {
portal: React.ReactPortal; portal: React.ReactPortal;

View File

@ -1,9 +1,10 @@
import * as React from 'react'; import * as React from 'react';
import { Parameters } from 'dockview-core';
export interface PanelCollection<T extends object> { export interface PanelCollection<T extends object> {
[name: string]: React.FunctionComponent<T>; [name: string]: React.FunctionComponent<T>;
} }
export interface PanelParameters<T extends {} = Record<string, any>> { export interface PanelParameters<T extends {} = Parameters> {
params: T; params: T;
} }