@perspective-dev/workspace 4.4.0 → 4.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cdn/perspective-workspace.js +16 -16
- package/dist/cdn/perspective-workspace.js.map +4 -4
- package/dist/esm/perspective-workspace.js +3 -3
- package/dist/esm/perspective-workspace.js.map +3 -3
- package/dist/esm/workspace/widget.d.ts +1 -1
- package/dist/esm/workspace/workspace.d.ts +5 -3
- package/package.json +1 -1
- package/src/ts/workspace/commands.ts +2 -1
- package/src/ts/workspace/widget.ts +2 -5
- package/src/ts/workspace/workspace.ts +60 -30
|
@@ -22,7 +22,7 @@ export declare class PerspectiveViewerWidget extends Widget {
|
|
|
22
22
|
toggleConfig(): Promise<void>;
|
|
23
23
|
load(table: psp.Table | Promise<psp.Table>): Promise<void>;
|
|
24
24
|
restore(config: psp_viewer.ViewerConfigUpdate): Promise<any>;
|
|
25
|
-
save(): Promise<
|
|
25
|
+
save(): Promise<import("@perspective-dev/viewer/dist/wasm/perspective-viewer.js").ViewerConfig>;
|
|
26
26
|
addClass(name: string): void;
|
|
27
27
|
removeClass(name: string): void;
|
|
28
28
|
setCallback(callback?: (event: MouseEvent) => {}): void;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { SplitPanel } from "@lumino/widgets";
|
|
2
2
|
import { DebouncedFuncLeading } from "lodash";
|
|
3
|
-
import type { HTMLPerspectiveViewerElement } from "@perspective-dev/viewer";
|
|
3
|
+
import type { HTMLPerspectiveViewerElement, ViewerConfig } from "@perspective-dev/viewer";
|
|
4
4
|
import type * as psp from "@perspective-dev/client";
|
|
5
5
|
import type * as psp_viewer from "@perspective-dev/viewer";
|
|
6
6
|
import { PerspectiveDockPanel } from "./dockpanel";
|
|
@@ -84,9 +84,11 @@ export declare class PerspectiveWorkspace extends SplitPanel {
|
|
|
84
84
|
_unmaximize(): void;
|
|
85
85
|
toggleSingleDocument(widget: PerspectiveViewerWidget): void;
|
|
86
86
|
_filterViewer(viewer: HTMLPerspectiveViewerElement, removeFilters: psp.Filter[], insertFilters: psp.Filter[], candidates: Set<string>): Promise<void>;
|
|
87
|
-
onPerspectiveSelect(event: CustomEvent): Promise<void>;
|
|
87
|
+
onPerspectiveSelect(filterFun: (config: ViewerConfig) => boolean, event: CustomEvent): Promise<void>;
|
|
88
|
+
private on_select_callback;
|
|
89
|
+
private on_global_filter_callback;
|
|
88
90
|
makeMaster(widget: PerspectiveViewerWidget): Promise<void>;
|
|
89
|
-
makeDetail(widget: PerspectiveViewerWidget): void
|
|
91
|
+
makeDetail(widget: PerspectiveViewerWidget): Promise<void>;
|
|
90
92
|
/***************************************************************************
|
|
91
93
|
*
|
|
92
94
|
* Context Menu
|
package/package.json
CHANGED
|
@@ -17,6 +17,7 @@ import { Signal } from "@lumino/signaling";
|
|
|
17
17
|
import type {
|
|
18
18
|
HTMLPerspectiveViewerCopyMenuElement,
|
|
19
19
|
HTMLPerspectiveViewerExportMenuElement,
|
|
20
|
+
ViewerConfigUpdate,
|
|
20
21
|
} from "@perspective-dev/viewer";
|
|
21
22
|
|
|
22
23
|
import type { PerspectiveWorkspace } from "./workspace";
|
|
@@ -141,7 +142,7 @@ export const createCommands = (
|
|
|
141
142
|
args.target_widget_name as string,
|
|
142
143
|
)!;
|
|
143
144
|
|
|
144
|
-
const config = await target_widget.save();
|
|
145
|
+
const config = (await target_widget.save()) as ViewerConfigUpdate;
|
|
145
146
|
const new_widget = await workspace._createWidgetAndNode({
|
|
146
147
|
config,
|
|
147
148
|
slot: undefined,
|
|
@@ -67,11 +67,8 @@ export class PerspectiveViewerWidget extends Widget {
|
|
|
67
67
|
}
|
|
68
68
|
|
|
69
69
|
async save() {
|
|
70
|
-
let config =
|
|
71
|
-
|
|
72
|
-
};
|
|
73
|
-
|
|
74
|
-
delete config["settings"];
|
|
70
|
+
let config = await this.viewer.save();
|
|
71
|
+
config["settings"] = false;
|
|
75
72
|
return config;
|
|
76
73
|
}
|
|
77
74
|
|
|
@@ -16,11 +16,9 @@ import { CommandRegistry } from "@lumino/commands";
|
|
|
16
16
|
import { SplitPanel, Panel, DockPanel } from "@lumino/widgets";
|
|
17
17
|
import uniqBy from "lodash/uniqBy";
|
|
18
18
|
import { DebouncedFunc, DebouncedFuncLeading, isEqual } from "lodash";
|
|
19
|
-
import { throttle } from "lodash";
|
|
20
|
-
import debounce from "lodash/debounce";
|
|
21
19
|
import type {
|
|
22
20
|
HTMLPerspectiveViewerElement,
|
|
23
|
-
|
|
21
|
+
ViewerConfig,
|
|
24
22
|
} from "@perspective-dev/viewer";
|
|
25
23
|
import type * as psp from "@perspective-dev/client";
|
|
26
24
|
import type * as psp_viewer from "@perspective-dev/viewer";
|
|
@@ -29,6 +27,7 @@ import { PerspectiveDockPanel } from "./dockpanel";
|
|
|
29
27
|
import { WorkspaceMenu } from "./menu";
|
|
30
28
|
import { createCommands } from "./commands";
|
|
31
29
|
import { PerspectiveViewerWidget } from "./widget";
|
|
30
|
+
import type { Filter } from "@perspective-dev/client";
|
|
32
31
|
|
|
33
32
|
class AsyncMutex {
|
|
34
33
|
_lock: Promise<unknown> | null;
|
|
@@ -329,7 +328,7 @@ export class PerspectiveWorkspace extends SplitPanel {
|
|
|
329
328
|
for (const widget of this.masterPanel.widgets) {
|
|
330
329
|
const psp_widget = widget as PerspectiveViewerWidget;
|
|
331
330
|
layout.viewers[psp_widget.viewer.getAttribute("slot")!] =
|
|
332
|
-
await psp_widget.save();
|
|
331
|
+
(await psp_widget.save()) as psp_viewer.ViewerConfigUpdate;
|
|
333
332
|
}
|
|
334
333
|
|
|
335
334
|
const widgets = PerspectiveDockPanel.getWidgets(
|
|
@@ -342,7 +341,8 @@ export class PerspectiveWorkspace extends SplitPanel {
|
|
|
342
341
|
widgets.map(async (widget) => {
|
|
343
342
|
const psp_widget = widget as PerspectiveViewerWidget;
|
|
344
343
|
const slot = psp_widget.viewer.getAttribute("slot")!;
|
|
345
|
-
layout.viewers[slot] =
|
|
344
|
+
layout.viewers[slot] =
|
|
345
|
+
(await psp_widget.save()) as psp_viewer.ViewerConfigUpdate;
|
|
346
346
|
layout.viewers[slot]!.settings = false;
|
|
347
347
|
}),
|
|
348
348
|
);
|
|
@@ -515,10 +515,18 @@ export class PerspectiveWorkspace extends SplitPanel {
|
|
|
515
515
|
|
|
516
516
|
if (master) {
|
|
517
517
|
widget.viewer.classList.add("workspace-master-widget");
|
|
518
|
-
widget.viewer.
|
|
518
|
+
await widget.viewer.restore({
|
|
519
|
+
plugin_config: { edit_mode: "SELECT_ROW_TREE" },
|
|
520
|
+
});
|
|
521
|
+
|
|
522
|
+
widget.viewer.addEventListener(
|
|
523
|
+
"perspective-global-filter",
|
|
524
|
+
this.on_global_filter_callback,
|
|
525
|
+
);
|
|
526
|
+
|
|
519
527
|
widget.viewer.addEventListener(
|
|
520
528
|
"perspective-select",
|
|
521
|
-
this.
|
|
529
|
+
this.on_select_callback,
|
|
522
530
|
);
|
|
523
531
|
|
|
524
532
|
// TODO remove event listener
|
|
@@ -613,7 +621,7 @@ export class PerspectiveWorkspace extends SplitPanel {
|
|
|
613
621
|
this._unmaximize();
|
|
614
622
|
}
|
|
615
623
|
|
|
616
|
-
const config = await widget.save();
|
|
624
|
+
const config = (await widget.save()) as psp_viewer.ViewerConfigUpdate;
|
|
617
625
|
config.settings = false;
|
|
618
626
|
config.title = config.title ? `${config.title} (*)` : "";
|
|
619
627
|
const duplicate = await this._createWidgetAndNode({
|
|
@@ -688,30 +696,26 @@ export class PerspectiveWorkspace extends SplitPanel {
|
|
|
688
696
|
candidates: Set<string>,
|
|
689
697
|
) {
|
|
690
698
|
const config = await viewer.save();
|
|
691
|
-
const table = await viewer.getTable();
|
|
692
|
-
const availableColumns = Object.keys(await table.schema());
|
|
693
|
-
const currentFilters = config.filter || [];
|
|
694
|
-
const columnAvailable = (filter: psp.Filter) =>
|
|
695
|
-
filter[0] && availableColumns.includes(filter[0]);
|
|
696
|
-
|
|
697
|
-
const clearColumns = new Set<string>(removeFilters.map((f) => f[0]));
|
|
698
|
-
const validFilters = insertFilters.filter(columnAvailable);
|
|
699
|
-
validFilters.push(
|
|
700
|
-
...currentFilters.filter(
|
|
701
|
-
(x: [string, ..._: string[]]) =>
|
|
702
|
-
!candidates.has(x[0]) && !clearColumns.has(x[0]),
|
|
703
|
-
),
|
|
704
|
-
);
|
|
705
699
|
|
|
706
|
-
|
|
707
|
-
|
|
700
|
+
await viewer.restore({
|
|
701
|
+
filter: config.filter
|
|
702
|
+
.filter((x) => !removeFilters.find((y) => y[0] === x[0]))
|
|
703
|
+
.concat(insertFilters),
|
|
704
|
+
});
|
|
708
705
|
}
|
|
709
706
|
|
|
710
|
-
async onPerspectiveSelect(
|
|
707
|
+
async onPerspectiveSelect(
|
|
708
|
+
filterFun: (config: ViewerConfig) => boolean,
|
|
709
|
+
event: CustomEvent,
|
|
710
|
+
) {
|
|
711
711
|
const config = await (
|
|
712
712
|
event.target as HTMLPerspectiveViewerElement
|
|
713
713
|
).save();
|
|
714
714
|
|
|
715
|
+
if (!filterFun(config)) {
|
|
716
|
+
return;
|
|
717
|
+
}
|
|
718
|
+
|
|
715
719
|
const candidates = new Set([
|
|
716
720
|
...(config["group_by"] || []),
|
|
717
721
|
...(config["split_by"] || []),
|
|
@@ -735,13 +739,26 @@ export class PerspectiveWorkspace extends SplitPanel {
|
|
|
735
739
|
});
|
|
736
740
|
}
|
|
737
741
|
|
|
742
|
+
private on_select_callback = this.onPerspectiveSelect.bind(
|
|
743
|
+
this,
|
|
744
|
+
(config) => config.plugin !== "Datagrid",
|
|
745
|
+
);
|
|
746
|
+
|
|
747
|
+
private on_global_filter_callback = this.onPerspectiveSelect.bind(
|
|
748
|
+
this,
|
|
749
|
+
// (config) => config.plugin === "Datagrid",
|
|
750
|
+
(config) => true,
|
|
751
|
+
);
|
|
752
|
+
|
|
738
753
|
async makeMaster(widget: PerspectiveViewerWidget) {
|
|
739
754
|
if (widget.viewer.hasAttribute("settings")) {
|
|
740
755
|
await widget.toggleConfig();
|
|
741
756
|
}
|
|
742
757
|
|
|
743
758
|
widget.viewer.classList.add("workspace-master-widget");
|
|
744
|
-
widget.viewer.
|
|
759
|
+
await widget.viewer.restore({
|
|
760
|
+
plugin_config: { edit_mode: "SELECT_ROW_TREE" },
|
|
761
|
+
});
|
|
745
762
|
if (!this.masterPanel.isAttached) {
|
|
746
763
|
this.detailPanel.close();
|
|
747
764
|
this.setupMasterPanel(DEFAULT_WORKSPACE_SIZE);
|
|
@@ -750,15 +767,23 @@ export class PerspectiveWorkspace extends SplitPanel {
|
|
|
750
767
|
this.masterPanel.addWidget(widget);
|
|
751
768
|
widget.isHidden && widget.show();
|
|
752
769
|
widget.viewer.restyleElement();
|
|
770
|
+
|
|
771
|
+
widget.viewer.addEventListener(
|
|
772
|
+
"perspective-global-filter",
|
|
773
|
+
this.on_global_filter_callback,
|
|
774
|
+
);
|
|
775
|
+
|
|
753
776
|
widget.viewer.addEventListener(
|
|
754
777
|
"perspective-select",
|
|
755
|
-
this.
|
|
778
|
+
this.on_select_callback,
|
|
756
779
|
);
|
|
757
780
|
}
|
|
758
781
|
|
|
759
|
-
makeDetail(widget: PerspectiveViewerWidget) {
|
|
782
|
+
async makeDetail(widget: PerspectiveViewerWidget) {
|
|
760
783
|
widget.viewer.classList.remove("workspace-master-widget");
|
|
761
|
-
widget.viewer.
|
|
784
|
+
await widget.viewer.restore({
|
|
785
|
+
plugin_config: { edit_mode: "READ_ONLY" },
|
|
786
|
+
});
|
|
762
787
|
this.dockpanel.addWidget(widget, { mode: `split-left` });
|
|
763
788
|
if (this.masterPanel.widgets.length === 0) {
|
|
764
789
|
this.detailPanel.close();
|
|
@@ -768,9 +793,14 @@ export class PerspectiveWorkspace extends SplitPanel {
|
|
|
768
793
|
}
|
|
769
794
|
|
|
770
795
|
widget.viewer.restyleElement();
|
|
796
|
+
widget.viewer.removeEventListener(
|
|
797
|
+
"perspective-global-filter",
|
|
798
|
+
this.on_global_filter_callback,
|
|
799
|
+
);
|
|
800
|
+
|
|
771
801
|
widget.viewer.removeEventListener(
|
|
772
802
|
"perspective-select",
|
|
773
|
-
this.
|
|
803
|
+
this.on_select_callback,
|
|
774
804
|
);
|
|
775
805
|
}
|
|
776
806
|
|