Merge pull request #200 from mathuo/198-vanillajs-rendering-and-persistance

198 vanillajs rendering and persistance
This commit is contained in:
mathuo 2023-03-12 21:54:05 +08:00 committed by GitHub
commit 3fdb3fd3d6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 27 additions and 100 deletions

View File

@ -27,6 +27,8 @@ jobs:
- run: yarn install - run: yarn install
- run: lerna bootstrap - run: lerna bootstrap
- run: npm run build
working-directory: packages/dockview-core
- run: npm run build - run: npm run build
working-directory: packages/dockview working-directory: packages/dockview
- run: npm run build - run: npm run build

18
packages/README.md Normal file
View File

@ -0,0 +1,18 @@
# Project Structure
This mono-repository has a number of packages containing the code for the [dockview](https://www.npmjs.com/package/dockview) library and the documentation website [dockview.dev](dockview.dev).
## dockview-core
- Contains the core logic for the dockview library.
- Written entirely in vanilla JavaScript/TypeScript.
## dockview
- Depends on `dockview-core`.
- Exports a `React` wrapper.
- Published as [dockview](https://www.npmjs.com/package/dockview) on npm.
## docs
- Code for [dockview.dev](dockview.dev).

View File

@ -16,7 +16,6 @@ import {
DockviewPanelApi, DockviewPanelApi,
DockviewPanelApiImpl, DockviewPanelApiImpl,
} from '../../api/dockviewPanelApi'; } from '../../api/dockviewPanelApi';
import { DefaultDockviewDeserialzier } from '../../dockview/deserializer';
import { IDockviewPanelModel } from '../../dockview/dockviewPanelModel'; import { IDockviewPanelModel } from '../../dockview/dockviewPanelModel';
import { DockviewPanelModelMock } from '../__mocks__/mockDockviewPanelMode'; import { DockviewPanelModelMock } from '../__mocks__/mockDockviewPanelMode';
import { DefaultTab } from '../../dockview/components/tab/defaultTab'; import { DefaultTab } from '../../dockview/components/tab/defaultTab';
@ -94,66 +93,6 @@ class PanelTabPartTest implements ITabRenderer {
} }
} }
class TestGroupPanel implements IDockviewPanel {
private _group: DockviewGroupPanel | undefined;
readonly api: DockviewPanelApi;
readonly view: IDockviewPanelModel;
constructor(
public readonly id: string,
public readonly title: string,
accessor: DockviewComponent
) {
this.api = new DockviewPanelApiImpl(this, this._group!);
this._group = new DockviewGroupPanel(accessor, id, {});
this.view = new DockviewPanelModelMock(
'component',
new PanelContentPartTest(id, 'component'),
'tabComponent',
new DefaultTab()
);
}
get params(): Record<string, any> {
return {};
}
get group(): DockviewGroupPanel {
return this._group!;
}
updateParentGroup(group: DockviewGroupPanel, isGroupActive: boolean): void {
this._group = group;
}
init(params: IGroupPanelInitParameters): void {
//
}
layout(width: number, height: number): void {
//
}
focus(): void {
//
}
toJSON(): GroupviewPanelState {
return {
id: this.id,
title: this.title,
};
}
update(event: GroupPanelUpdateEvent): void {
//
}
dispose(): void {
//
}
}
describe('dockviewComponent', () => { describe('dockviewComponent', () => {
let container: HTMLElement; let container: HTMLElement;
let dockview: DockviewComponent; let dockview: DockviewComponent;
@ -470,7 +409,6 @@ describe('dockviewComponent', () => {
test('serialization', () => { test('serialization', () => {
dockview.layout(1000, 1000); dockview.layout(1000, 1000);
dockview.deserializer = new DefaultDockviewDeserialzier(dockview);
dockview.fromJSON({ dockview.fromJSON({
activeGroup: 'group-1', activeGroup: 'group-1',
grid: { grid: {
@ -992,15 +930,6 @@ describe('dockviewComponent', () => {
test('#1', () => { test('#1', () => {
dockview.layout(500, 500); dockview.layout(500, 500);
dockview.deserializer = {
fromJSON: (panelData: GroupviewPanelState): IDockviewPanel => {
return new TestGroupPanel(
panelData.id,
panelData.title || '',
dockview
);
},
};
const panel1 = dockview.addPanel({ const panel1 = dockview.addPanel({
id: 'panel1', id: 'panel1',
@ -1055,14 +984,17 @@ describe('dockviewComponent', () => {
panels: { panels: {
view_1: { view_1: {
id: 'view_1', id: 'view_1',
contentComponent: 'default',
title: 'view_1_title', title: 'view_1_title',
}, },
view_2: { view_2: {
id: 'view_2', id: 'view_2',
contentComponent: 'default',
title: 'view_2_title', title: 'view_2_title',
}, },
view_3: { view_3: {
id: 'view_3', id: 'view_3',
contentComponent: 'default',
title: 'view_3_title', title: 'view_3_title',
}, },
}, },
@ -1382,7 +1314,6 @@ describe('dockviewComponent', () => {
default: PanelContentPartTest, default: PanelContentPartTest,
}, },
}); });
dockview.deserializer = new DefaultDockviewDeserialzier(dockview);
dockview.layout(500, 1000); dockview.layout(500, 1000);
@ -1507,7 +1438,6 @@ describe('dockviewComponent', () => {
}) })
); );
dockview.deserializer = new DefaultDockviewDeserialzier(dockview);
dockview.fromJSON({ dockview.fromJSON({
activeGroup: 'group-1', activeGroup: 'group-1',
grid: { grid: {
@ -1641,7 +1571,6 @@ describe('dockviewComponent', () => {
default: PanelContentPartTest, default: PanelContentPartTest,
}, },
}); });
dockview.deserializer = new DefaultDockviewDeserialzier(dockview);
dockview.fromJSON({ dockview.fromJSON({
activeGroup: 'group-1', activeGroup: 'group-1',
grid: { grid: {
@ -1731,7 +1660,6 @@ describe('dockviewComponent', () => {
test_tab_id: PanelTabPartTest, test_tab_id: PanelTabPartTest,
}, },
}); });
dockview.deserializer = new DefaultDockviewDeserialzier(dockview);
dockview.fromJSON({ dockview.fromJSON({
activeGroup: 'group-1', activeGroup: 'group-1',
grid: { grid: {
@ -1840,7 +1768,6 @@ describe('dockviewComponent', () => {
test_tab_id: PanelTabPartTest, test_tab_id: PanelTabPartTest,
}, },
}); });
dockview.deserializer = new DefaultDockviewDeserialzier(dockview);
dockview.fromJSON({ dockview.fromJSON({
activeGroup: 'group-1', activeGroup: 'group-1',
grid: { grid: {
@ -1928,7 +1855,6 @@ describe('dockviewComponent', () => {
}, },
orientation: Orientation.HORIZONTAL, orientation: Orientation.HORIZONTAL,
}); });
dockview.deserializer = new DefaultDockviewDeserialzier(dockview);
expect(dockview.orientation).toBe(Orientation.HORIZONTAL); expect(dockview.orientation).toBe(Orientation.HORIZONTAL);
@ -2034,7 +1960,6 @@ describe('dockviewComponent', () => {
}, },
orientation: Orientation.HORIZONTAL, orientation: Orientation.HORIZONTAL,
}); });
dockview.deserializer = new DefaultDockviewDeserialzier(dockview);
expect(dockview.orientation).toBe(Orientation.HORIZONTAL); expect(dockview.orientation).toBe(Orientation.HORIZONTAL);
@ -2175,7 +2100,6 @@ describe('dockviewComponent', () => {
}, },
orientation: Orientation.HORIZONTAL, orientation: Orientation.HORIZONTAL,
}); });
dockview.deserializer = new DefaultDockviewDeserialzier(dockview);
expect(dockview.orientation).toBe(Orientation.HORIZONTAL); expect(dockview.orientation).toBe(Orientation.HORIZONTAL);
@ -2303,7 +2227,6 @@ describe('dockviewComponent', () => {
}, },
orientation: Orientation.HORIZONTAL, orientation: Orientation.HORIZONTAL,
}); });
dockview.deserializer = new DefaultDockviewDeserialzier(dockview);
expect(dockview.groups.length).toBe(0); expect(dockview.groups.length).toBe(0);
}); });
@ -2320,7 +2243,6 @@ describe('dockviewComponent', () => {
}, },
orientation: Orientation.HORIZONTAL, orientation: Orientation.HORIZONTAL,
}); });
dockview.deserializer = new DefaultDockviewDeserialzier(dockview);
expect(dockview.groups.length).toBe(0); expect(dockview.groups.length).toBe(0);
@ -2360,7 +2282,6 @@ describe('dockviewComponent', () => {
}, },
orientation: Orientation.HORIZONTAL, orientation: Orientation.HORIZONTAL,
}); });
dockview.deserializer = new DefaultDockviewDeserialzier(dockview);
expect(JSON.parse(JSON.stringify(dockview.toJSON()))).toEqual({ expect(JSON.parse(JSON.stringify(dockview.toJSON()))).toEqual({
grid: { grid: {

View File

@ -16,7 +16,7 @@ import {
DockviewDropTargets, DockviewDropTargets,
} from './types'; } from './types';
import { sequentialNumberGenerator } from '../math'; import { sequentialNumberGenerator } from '../math';
import { IPanelDeserializer } from './deserializer'; import { DefaultDockviewDeserialzier } from './deserializer';
import { createComponent } from '../panel/componentFactory'; import { createComponent } from '../panel/componentFactory';
import { import {
AddGroupOptions, AddGroupOptions,
@ -87,7 +87,6 @@ export interface IDockviewComponent extends IBaseGrid<DockviewGroupPanel> {
readonly onDidDrop: Event<DockviewDropEvent>; readonly onDidDrop: Event<DockviewDropEvent>;
readonly orientation: Orientation; readonly orientation: Orientation;
tabHeight: number | undefined; tabHeight: number | undefined;
deserializer: IPanelDeserializer | undefined;
updateOptions(options: DockviewComponentUpdateOptions): void; updateOptions(options: DockviewComponentUpdateOptions): void;
moveGroupOrPanel( moveGroupOrPanel(
referenceGroup: DockviewGroupPanel, referenceGroup: DockviewGroupPanel,
@ -125,8 +124,8 @@ export class DockviewComponent
implements IDockviewComponent implements IDockviewComponent
{ {
private readonly nextGroupId = sequentialNumberGenerator(); private readonly nextGroupId = sequentialNumberGenerator();
private _deserializer: IPanelDeserializer | undefined; private readonly _deserializer = new DefaultDockviewDeserialzier(this);
private _api: DockviewApi; private readonly _api: DockviewApi;
private _options: Exclude<DockviewComponentOptions, 'orientation'>; private _options: Exclude<DockviewComponentOptions, 'orientation'>;
private watermark: IWatermarkRenderer | null = null; private watermark: IWatermarkRenderer | null = null;
@ -161,14 +160,6 @@ export class DockviewComponent
return this.groups.flatMap((group) => group.panels); return this.groups.flatMap((group) => group.panels);
} }
get deserializer(): IPanelDeserializer | undefined {
return this._deserializer;
}
set deserializer(value: IPanelDeserializer | undefined) {
this._deserializer = value;
}
get options(): DockviewComponentOptions { get options(): DockviewComponentOptions {
return this._options; return this._options;
} }
@ -428,9 +419,6 @@ export class DockviewComponent
fromJSON(data: SerializedDockview): void { fromJSON(data: SerializedDockview): void {
this.clear(); this.clear();
if (!this.deserializer) {
throw new Error('no deserializer provided');
}
const { grid, panels, options, activeGroup } = data; const { grid, panels, options, activeGroup } = data;
if (typeof options?.tabHeight === 'number') { if (typeof options?.tabHeight === 'number') {
@ -454,7 +442,7 @@ export class DockviewComponent
this._onDidAddGroup.fire(group); this._onDidAddGroup.fire(group);
for (const child of views) { for (const child of views) {
const panel = this.deserializer!.fromJSON( const panel = this._deserializer.fromJSON(
panels[child], panels[child],
group group
); );

View File

@ -11,7 +11,6 @@ import {
ITabRenderer, ITabRenderer,
watchElementResize, watchElementResize,
DockviewGroupPanel, DockviewGroupPanel,
DefaultDockviewDeserialzier,
} from 'dockview-core'; } from 'dockview-core';
import { ReactPanelContentPart } from './reactContentPart'; import { ReactPanelContentPart } from './reactContentPart';
import { ReactPanelHeaderPart } from './reactHeaderPart'; import { ReactPanelHeaderPart } from './reactHeaderPart';
@ -173,7 +172,6 @@ export const DockviewReact = React.forwardRef(
}); });
domRef.current?.appendChild(dockview.element); domRef.current?.appendChild(dockview.element);
dockview.deserializer = new DefaultDockviewDeserialzier(dockview);
const { clientWidth, clientHeight } = domRef.current!; const { clientWidth, clientHeight } = domRef.current!;
dockview.layout(clientWidth, clientHeight); dockview.layout(clientWidth, clientHeight);