@deephaven/dashboard 0.109.1-beta.7 → 0.109.1-beta.9

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.
@@ -0,0 +1,37 @@
1
+ import { type FocusEventHandler, type ReactNode } from 'react';
2
+ import { type ResolvableContextAction } from '@deephaven/components';
3
+ import type { Container, EventEmitter, Tab } from '@deephaven/golden-layout';
4
+ import { type PanelComponent } from './DashboardPlugin';
5
+ import './Panel.scss';
6
+ export type BasePanelProps = {
7
+ /**
8
+ * Reference to the component panel.
9
+ * Will wait until it is set before emitting mount/unmount events.
10
+ *
11
+ */
12
+ componentPanel?: PanelComponent;
13
+ children: ReactNode;
14
+ glContainer: Container;
15
+ glEventHub: EventEmitter;
16
+ className?: string;
17
+ onFocus?: FocusEventHandler<HTMLDivElement>;
18
+ onBlur?: FocusEventHandler<HTMLDivElement>;
19
+ onTab?: (tab: Tab) => void;
20
+ onTabClicked?: (e: MouseEvent) => void;
21
+ onHide?: (...args: unknown[]) => void;
22
+ onResize?: (...args: unknown[]) => void;
23
+ onBeforeShow?: (...args: unknown[]) => void;
24
+ onShow?: (...args: unknown[]) => void;
25
+ onTabBlur?: (...args: unknown[]) => void;
26
+ onTabFocus?: (...args: unknown[]) => void;
27
+ renderTabTooltip?: () => ReactNode;
28
+ additionalActions?: ResolvableContextAction[];
29
+ errorMessage?: string;
30
+ isLoading?: boolean;
31
+ isLoaded?: boolean;
32
+ isClonable?: boolean;
33
+ isRenamable?: boolean;
34
+ };
35
+ declare const XBasePanel: import("@deephaven/components").XComponentType<BasePanelProps>;
36
+ export default XBasePanel;
37
+ //# sourceMappingURL=BasePanel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BasePanel.d.ts","sourceRoot":"","sources":["../src/BasePanel.tsx"],"names":[],"mappings":"AAAA,OAAc,EAEZ,KAAK,iBAAiB,EAGtB,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAIf,OAAO,EAKL,KAAK,uBAAuB,EAE7B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EACV,SAAS,EACT,YAAY,EAEZ,GAAG,EACJ,MAAM,0BAA0B,CAAC;AAIlC,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAKxD,OAAO,cAAc,CAAC;AAItB,MAAM,MAAM,cAAc,GAAG;IAC3B;;;;OAIG;IACH,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,QAAQ,EAAE,SAAS,CAAC;IACpB,WAAW,EAAE,SAAS,CAAC;IACvB,UAAU,EAAE,YAAY,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,iBAAiB,CAAC,cAAc,CAAC,CAAC;IAC5C,MAAM,CAAC,EAAE,iBAAiB,CAAC,cAAc,CAAC,CAAC;IAC3C,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,CAAC;IAC3B,YAAY,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAC;IACvC,MAAM,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACtC,QAAQ,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACxC,YAAY,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IAC5C,MAAM,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACtC,SAAS,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACzC,UAAU,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IAC1C,gBAAgB,CAAC,EAAE,MAAM,SAAS,CAAC;IACnC,iBAAiB,CAAC,EAAE,uBAAuB,EAAE,CAAC;IAC9C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,CAAC;AAyRF,QAAA,MAAM,UAAU,gEAA8B,CAAC;AAE/C,eAAe,UAAU,CAAC"}
@@ -0,0 +1,304 @@
1
+ function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
2
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
3
+ function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
4
+ import React, { PureComponent } from 'react';
5
+ import ReactDOM from 'react-dom';
6
+ import classNames from 'classnames';
7
+ import memoize from 'memoize-one';
8
+ import { ContextActions, createXComponent, LoadingOverlay, Tooltip } from '@deephaven/components';
9
+ import { assertNotNull, EMPTY_ARRAY } from '@deephaven/utils';
10
+ import Log from '@deephaven/log';
11
+ import LayoutUtils from "./layout/LayoutUtils.js";
12
+ import PanelEvent from "./PanelEvent.js";
13
+ import PanelContextMenu from "./PanelContextMenu.js";
14
+ import RenameDialog from "./RenameDialog.js";
15
+ import TabEvent from "./TabEvent.js";
16
+ import "./Panel.css";
17
+ import { jsx as _jsx } from "react/jsx-runtime";
18
+ import { Fragment as _Fragment } from "react/jsx-runtime";
19
+ import { jsxs as _jsxs } from "react/jsx-runtime";
20
+ var log = Log.module('Panel');
21
+ /**
22
+ * Generic panel component that emits mount/unmount/focus events.
23
+ * Also wires up some triggers for common events:
24
+ * Focus, Resize, Show
25
+ */
26
+ class BasePanel extends PureComponent {
27
+ constructor(props) {
28
+ super(props);
29
+ _defineProperty(this, "ref", void 0);
30
+ _defineProperty(this, "getAdditionalActions", memoize((actions, isClonable, isRenamable) => {
31
+ var additionalActions = [];
32
+ if (isClonable) {
33
+ additionalActions.push(this.getCloneAction());
34
+ }
35
+ if (isRenamable) {
36
+ additionalActions.push(this.getRenameAction());
37
+ }
38
+ return [...additionalActions, ...actions];
39
+ }));
40
+ this.handleCopyPanel = this.handleCopyPanel.bind(this);
41
+ this.handleFocus = this.handleFocus.bind(this);
42
+ this.handleBlur = this.handleBlur.bind(this);
43
+ this.handleHide = this.handleHide.bind(this);
44
+ this.handleResize = this.handleResize.bind(this);
45
+ this.handleBeforeShow = this.handleBeforeShow.bind(this);
46
+ this.handleShow = this.handleShow.bind(this);
47
+ this.handleTabBlur = this.handleTabBlur.bind(this);
48
+ this.handleTabFocus = this.handleTabFocus.bind(this);
49
+ this.handleRenameCancel = this.handleRenameCancel.bind(this);
50
+ this.handleRenameSubmit = this.handleRenameSubmit.bind(this);
51
+ this.handleShowRenameDialog = this.handleShowRenameDialog.bind(this);
52
+ this.handleTabClicked = this.handleTabClicked.bind(this);
53
+ this.handleTab = this.handleTab.bind(this);
54
+ this.ref = /*#__PURE__*/React.createRef();
55
+ var {
56
+ glContainer
57
+ } = this.props;
58
+ this.state = {
59
+ title: LayoutUtils.getTitleFromContainer(glContainer),
60
+ showRenameDialog: false,
61
+ isWithinPanel: true
62
+ };
63
+ }
64
+ componentDidMount() {
65
+ var _this$ref$current, _this$ref$current$par;
66
+ var {
67
+ componentPanel,
68
+ glContainer,
69
+ glEventHub
70
+ } = this.props;
71
+ glContainer.on('resize', this.handleResize);
72
+ glContainer.on('show', this.handleBeforeShow);
73
+ glContainer.on('shown', this.handleShow);
74
+ glContainer.on('hide', this.handleHide);
75
+ glContainer.on('tab', this.handleTab);
76
+ glContainer.on('tabClicked', this.handleTabClicked);
77
+ glEventHub.on(TabEvent.focus, this.handleTabFocus);
78
+ glEventHub.on(TabEvent.blur, this.handleTabBlur);
79
+ glEventHub.emit(PanelEvent.MOUNT, componentPanel !== null && componentPanel !== void 0 ? componentPanel : this);
80
+ this.setState({
81
+ isWithinPanel: ((_this$ref$current = this.ref.current) === null || _this$ref$current === void 0 ? void 0 : (_this$ref$current$par = _this$ref$current.parentElement) === null || _this$ref$current$par === void 0 ? void 0 : _this$ref$current$par.closest('.dh-panel')) != null
82
+ });
83
+ }
84
+ componentWillUnmount() {
85
+ var {
86
+ componentPanel,
87
+ glContainer,
88
+ glEventHub
89
+ } = this.props;
90
+ glContainer.off('resize', this.handleResize);
91
+ glContainer.off('show', this.handleBeforeShow);
92
+ glContainer.off('shown', this.handleShow);
93
+ glContainer.off('hide', this.handleHide);
94
+ glContainer.off('tab', this.handleTab);
95
+ glContainer.off('tabClicked', this.handleTabClicked);
96
+ glEventHub.off(TabEvent.focus, this.handleTabFocus);
97
+ glEventHub.off(TabEvent.blur, this.handleTabBlur);
98
+ glEventHub.emit(PanelEvent.UNMOUNT, componentPanel !== null && componentPanel !== void 0 ? componentPanel : this);
99
+ }
100
+ handleTab(tab) {
101
+ if (tab != null) {
102
+ this.setState({
103
+ title: LayoutUtils.getTitleFromTab(tab)
104
+ });
105
+ }
106
+ // render after move can happen before tab event, glTab could be null
107
+ // when tab event is emitted, force a render update
108
+ this.forceUpdate();
109
+ var {
110
+ onTab
111
+ } = this.props;
112
+ onTab === null || onTab === void 0 ? void 0 : onTab(tab);
113
+ }
114
+ handleTabClicked(e) {
115
+ var {
116
+ onTabClicked
117
+ } = this.props;
118
+ onTabClicked === null || onTabClicked === void 0 ? void 0 : onTabClicked(e);
119
+ }
120
+ handleFocus(event) {
121
+ var {
122
+ componentPanel,
123
+ glEventHub
124
+ } = this.props;
125
+ glEventHub.emit(PanelEvent.FOCUS, componentPanel !== null && componentPanel !== void 0 ? componentPanel : this);
126
+ var {
127
+ onFocus
128
+ } = this.props;
129
+ onFocus === null || onFocus === void 0 ? void 0 : onFocus(event);
130
+ }
131
+ handleBlur(event) {
132
+ var {
133
+ onBlur
134
+ } = this.props;
135
+ onBlur === null || onBlur === void 0 ? void 0 : onBlur(event);
136
+ }
137
+ handleHide() {
138
+ var {
139
+ onHide
140
+ } = this.props;
141
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
142
+ args[_key] = arguments[_key];
143
+ }
144
+ onHide === null || onHide === void 0 ? void 0 : onHide(...args);
145
+ }
146
+ handleResize() {
147
+ var {
148
+ onResize
149
+ } = this.props;
150
+ for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
151
+ args[_key2] = arguments[_key2];
152
+ }
153
+ onResize === null || onResize === void 0 ? void 0 : onResize(...args);
154
+ }
155
+ handleBeforeShow() {
156
+ var {
157
+ onBeforeShow
158
+ } = this.props;
159
+ for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
160
+ args[_key3] = arguments[_key3];
161
+ }
162
+ onBeforeShow === null || onBeforeShow === void 0 ? void 0 : onBeforeShow(...args);
163
+ }
164
+ handleShow() {
165
+ var {
166
+ onShow
167
+ } = this.props;
168
+ for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
169
+ args[_key4] = arguments[_key4];
170
+ }
171
+ onShow === null || onShow === void 0 ? void 0 : onShow(...args);
172
+ }
173
+ handleTabBlur() {
174
+ var {
175
+ onTabBlur
176
+ } = this.props;
177
+ for (var _len5 = arguments.length, args = new Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {
178
+ args[_key5] = arguments[_key5];
179
+ }
180
+ onTabBlur === null || onTabBlur === void 0 ? void 0 : onTabBlur(...args);
181
+ }
182
+ handleTabFocus() {
183
+ var {
184
+ onTabFocus
185
+ } = this.props;
186
+ for (var _len6 = arguments.length, args = new Array(_len6), _key6 = 0; _key6 < _len6; _key6++) {
187
+ args[_key6] = arguments[_key6];
188
+ }
189
+ onTabFocus === null || onTabFocus === void 0 ? void 0 : onTabFocus(...args);
190
+ }
191
+ handleRenameCancel() {
192
+ this.setState({
193
+ showRenameDialog: false
194
+ });
195
+ }
196
+ handleShowRenameDialog() {
197
+ this.setState({
198
+ showRenameDialog: true
199
+ });
200
+ }
201
+ handleRenameSubmit(newTitle) {
202
+ var {
203
+ glContainer
204
+ } = this.props;
205
+ this.setState({
206
+ showRenameDialog: false,
207
+ title: newTitle
208
+ });
209
+ var root = LayoutUtils.getRootFromContainer(glContainer);
210
+ var config = LayoutUtils.getComponentConfigFromContainer(glContainer);
211
+ assertNotNull(config);
212
+ LayoutUtils.renameComponent(root, config, newTitle);
213
+ }
214
+ handleCopyPanel() {
215
+ var {
216
+ glContainer,
217
+ glEventHub
218
+ } = this.props;
219
+ var root = LayoutUtils.getRootFromContainer(glContainer);
220
+ var config = LayoutUtils.getComponentConfigFromContainer(glContainer);
221
+ if (config == null) {
222
+ log.error('Could not get component config from container', glContainer);
223
+ return;
224
+ }
225
+ var cloneConfig = LayoutUtils.cloneComponent(root, config);
226
+ if (cloneConfig !== null) {
227
+ glEventHub.emit(PanelEvent.CLONED, this, cloneConfig);
228
+ }
229
+ }
230
+ getCloneAction() {
231
+ return {
232
+ title: 'Copy Panel',
233
+ order: 10,
234
+ group: ContextActions.groups.high,
235
+ action: this.handleCopyPanel
236
+ };
237
+ }
238
+ getRenameAction() {
239
+ return {
240
+ title: 'Rename',
241
+ order: 10,
242
+ group: ContextActions.groups.medium,
243
+ action: this.handleShowRenameDialog
244
+ };
245
+ }
246
+ render() {
247
+ var {
248
+ children,
249
+ className,
250
+ renderTabTooltip,
251
+ glContainer,
252
+ glEventHub,
253
+ additionalActions = EMPTY_ARRAY,
254
+ errorMessage,
255
+ isLoaded = true,
256
+ isLoading = false,
257
+ isClonable = false,
258
+ isRenamable = false
259
+ } = this.props;
260
+ var {
261
+ tab: glTab
262
+ } = glContainer;
263
+ var {
264
+ showRenameDialog,
265
+ title,
266
+ isWithinPanel
267
+ } = this.state;
268
+ return /*#__PURE__*/_jsxs("div", {
269
+ className: classNames('h-100 w-100 dh-panel', className),
270
+ onFocusCapture: this.handleFocus,
271
+ onBlurCapture: this.handleBlur,
272
+ ref: this.ref,
273
+ children: [children, /*#__PURE__*/_jsx(LoadingOverlay, {
274
+ errorMessage: errorMessage,
275
+ isLoaded: isLoaded,
276
+ isLoading: isLoading
277
+ }), !isWithinPanel && glTab != null && /*#__PURE__*/ReactDOM.createPortal( /*#__PURE__*/_jsxs(_Fragment, {
278
+ children: [/*#__PURE__*/_jsx(PanelContextMenu, {
279
+ glContainer: glContainer,
280
+ glEventHub: glEventHub,
281
+ additionalActions: this.getAdditionalActions(additionalActions, isClonable, isRenamable)
282
+ }), isRenamable && /*#__PURE__*/_jsx(RenameDialog, {
283
+ isShown: showRenameDialog,
284
+ value: title,
285
+ itemType: "Panel",
286
+ onCancel: this.handleRenameCancel,
287
+ onSubmit: this.handleRenameSubmit
288
+ }), renderTabTooltip != null && /*#__PURE__*/_jsx(Tooltip, {
289
+ interactive: true,
290
+ options: {
291
+ placement: 'bottom'
292
+ },
293
+ popperClassName: "panel-tab-popper",
294
+ children: renderTabTooltip()
295
+ })]
296
+ }), glTab.element[0] // tab.element is jquery element, we want a dom element
297
+ )]
298
+ });
299
+ }
300
+ }
301
+
302
+ var XBasePanel = createXComponent(BasePanel);
303
+ export default XBasePanel;
304
+ //# sourceMappingURL=BasePanel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BasePanel.js","names":["React","PureComponent","ReactDOM","classNames","memoize","ContextActions","createXComponent","LoadingOverlay","Tooltip","assertNotNull","EMPTY_ARRAY","Log","LayoutUtils","PanelEvent","PanelContextMenu","RenameDialog","TabEvent","jsx","_jsx","Fragment","_Fragment","jsxs","_jsxs","log","module","BasePanel","constructor","props","_defineProperty","actions","isClonable","isRenamable","additionalActions","push","getCloneAction","getRenameAction","handleCopyPanel","bind","handleFocus","handleBlur","handleHide","handleResize","handleBeforeShow","handleShow","handleTabBlur","handleTabFocus","handleRenameCancel","handleRenameSubmit","handleShowRenameDialog","handleTabClicked","handleTab","ref","createRef","glContainer","state","title","getTitleFromContainer","showRenameDialog","isWithinPanel","componentDidMount","_this$ref$current","_this$ref$current$par","componentPanel","glEventHub","on","focus","blur","emit","MOUNT","setState","current","parentElement","closest","componentWillUnmount","off","UNMOUNT","tab","getTitleFromTab","forceUpdate","onTab","e","onTabClicked","event","FOCUS","onFocus","onBlur","onHide","_len","arguments","length","args","Array","_key","onResize","_len2","_key2","onBeforeShow","_len3","_key3","onShow","_len4","_key4","onTabBlur","_len5","_key5","onTabFocus","_len6","_key6","newTitle","root","getRootFromContainer","config","getComponentConfigFromContainer","renameComponent","error","cloneConfig","cloneComponent","CLONED","order","group","groups","high","action","medium","render","children","className","renderTabTooltip","errorMessage","isLoaded","isLoading","glTab","onFocusCapture","onBlurCapture","createPortal","getAdditionalActions","isShown","value","itemType","onCancel","onSubmit","interactive","options","placement","popperClassName","element","XBasePanel"],"sources":["../src/BasePanel.tsx"],"sourcesContent":["import React, {\n type FocusEvent,\n type FocusEventHandler,\n PureComponent,\n type ReactElement,\n type ReactNode,\n} from 'react';\nimport ReactDOM from 'react-dom';\nimport classNames from 'classnames';\nimport memoize from 'memoize-one';\nimport {\n type ContextAction,\n ContextActions,\n createXComponent,\n LoadingOverlay,\n type ResolvableContextAction,\n Tooltip,\n} from '@deephaven/components';\nimport type {\n Container,\n EventEmitter,\n ReactComponentConfig,\n Tab,\n} from '@deephaven/golden-layout';\nimport { assertNotNull, EMPTY_ARRAY } from '@deephaven/utils';\nimport Log from '@deephaven/log';\nimport LayoutUtils from './layout/LayoutUtils';\nimport { type PanelComponent } from './DashboardPlugin';\nimport PanelEvent from './PanelEvent';\nimport PanelContextMenu from './PanelContextMenu';\nimport RenameDialog from './RenameDialog';\nimport TabEvent from './TabEvent';\nimport './Panel.scss';\n\nconst log = Log.module('Panel');\n\nexport type BasePanelProps = {\n /**\n * Reference to the component panel.\n * Will wait until it is set before emitting mount/unmount events.\n *\n */\n componentPanel?: PanelComponent;\n children: ReactNode;\n glContainer: Container;\n glEventHub: EventEmitter;\n className?: string;\n onFocus?: FocusEventHandler<HTMLDivElement>;\n onBlur?: FocusEventHandler<HTMLDivElement>;\n onTab?: (tab: Tab) => void;\n onTabClicked?: (e: MouseEvent) => void;\n onHide?: (...args: unknown[]) => void;\n onResize?: (...args: unknown[]) => void;\n onBeforeShow?: (...args: unknown[]) => void;\n onShow?: (...args: unknown[]) => void;\n onTabBlur?: (...args: unknown[]) => void;\n onTabFocus?: (...args: unknown[]) => void;\n renderTabTooltip?: () => ReactNode;\n additionalActions?: ResolvableContextAction[];\n errorMessage?: string;\n isLoading?: boolean;\n isLoaded?: boolean;\n isClonable?: boolean;\n isRenamable?: boolean;\n};\n\ninterface BasePanelState {\n title?: string | null;\n showRenameDialog: boolean;\n isWithinPanel: boolean;\n}\n/**\n * Generic panel component that emits mount/unmount/focus events.\n * Also wires up some triggers for common events:\n * Focus, Resize, Show\n */\nclass BasePanel extends PureComponent<BasePanelProps, BasePanelState> {\n constructor(props: BasePanelProps) {\n super(props);\n\n this.handleCopyPanel = this.handleCopyPanel.bind(this);\n this.handleFocus = this.handleFocus.bind(this);\n this.handleBlur = this.handleBlur.bind(this);\n this.handleHide = this.handleHide.bind(this);\n this.handleResize = this.handleResize.bind(this);\n this.handleBeforeShow = this.handleBeforeShow.bind(this);\n this.handleShow = this.handleShow.bind(this);\n this.handleTabBlur = this.handleTabBlur.bind(this);\n this.handleTabFocus = this.handleTabFocus.bind(this);\n this.handleRenameCancel = this.handleRenameCancel.bind(this);\n this.handleRenameSubmit = this.handleRenameSubmit.bind(this);\n this.handleShowRenameDialog = this.handleShowRenameDialog.bind(this);\n this.handleTabClicked = this.handleTabClicked.bind(this);\n this.handleTab = this.handleTab.bind(this);\n\n this.ref = React.createRef<HTMLDivElement>();\n\n const { glContainer } = this.props;\n this.state = {\n title: LayoutUtils.getTitleFromContainer(glContainer),\n showRenameDialog: false,\n isWithinPanel: true,\n };\n }\n\n componentDidMount(): void {\n const { componentPanel, glContainer, glEventHub } = this.props;\n\n glContainer.on('resize', this.handleResize);\n glContainer.on('show', this.handleBeforeShow);\n glContainer.on('shown', this.handleShow);\n glContainer.on('hide', this.handleHide);\n glContainer.on('tab', this.handleTab);\n glContainer.on('tabClicked', this.handleTabClicked);\n glEventHub.on(TabEvent.focus, this.handleTabFocus);\n glEventHub.on(TabEvent.blur, this.handleTabBlur);\n\n glEventHub.emit(PanelEvent.MOUNT, componentPanel ?? this);\n\n this.setState({\n isWithinPanel:\n this.ref.current?.parentElement?.closest('.dh-panel') != null,\n });\n }\n\n componentWillUnmount(): void {\n const { componentPanel, glContainer, glEventHub } = this.props;\n\n glContainer.off('resize', this.handleResize);\n glContainer.off('show', this.handleBeforeShow);\n glContainer.off('shown', this.handleShow);\n glContainer.off('hide', this.handleHide);\n glContainer.off('tab', this.handleTab);\n glContainer.off('tabClicked', this.handleTabClicked);\n glEventHub.off(TabEvent.focus, this.handleTabFocus);\n glEventHub.off(TabEvent.blur, this.handleTabBlur);\n\n glEventHub.emit(PanelEvent.UNMOUNT, componentPanel ?? this);\n }\n\n ref: React.RefObject<HTMLDivElement>;\n\n handleTab(tab: Tab): void {\n if (tab != null) {\n this.setState({\n title: LayoutUtils.getTitleFromTab(tab),\n });\n }\n // render after move can happen before tab event, glTab could be null\n // when tab event is emitted, force a render update\n this.forceUpdate();\n\n const { onTab } = this.props;\n onTab?.(tab);\n }\n\n handleTabClicked(e: MouseEvent): void {\n const { onTabClicked } = this.props;\n onTabClicked?.(e);\n }\n\n handleFocus(event: FocusEvent<HTMLDivElement>): void {\n const { componentPanel, glEventHub } = this.props;\n glEventHub.emit(PanelEvent.FOCUS, componentPanel ?? this);\n\n const { onFocus } = this.props;\n onFocus?.(event);\n }\n\n handleBlur(event: FocusEvent<HTMLDivElement>): void {\n const { onBlur } = this.props;\n onBlur?.(event);\n }\n\n handleHide(...args: unknown[]): void {\n const { onHide } = this.props;\n onHide?.(...args);\n }\n\n handleResize(...args: unknown[]): void {\n const { onResize } = this.props;\n onResize?.(...args);\n }\n\n handleBeforeShow(...args: unknown[]): void {\n const { onBeforeShow } = this.props;\n onBeforeShow?.(...args);\n }\n\n handleShow(...args: unknown[]): void {\n const { onShow } = this.props;\n onShow?.(...args);\n }\n\n handleTabBlur(...args: unknown[]): void {\n const { onTabBlur } = this.props;\n onTabBlur?.(...args);\n }\n\n handleTabFocus(...args: unknown[]): void {\n const { onTabFocus } = this.props;\n onTabFocus?.(...args);\n }\n\n handleRenameCancel(): void {\n this.setState({ showRenameDialog: false });\n }\n\n handleShowRenameDialog(): void {\n this.setState({ showRenameDialog: true });\n }\n\n handleRenameSubmit(newTitle: string): void {\n const { glContainer } = this.props;\n this.setState({ showRenameDialog: false, title: newTitle });\n const root = LayoutUtils.getRootFromContainer(glContainer);\n const config = LayoutUtils.getComponentConfigFromContainer(glContainer);\n assertNotNull(config);\n LayoutUtils.renameComponent(root, config, newTitle);\n }\n\n handleCopyPanel(): void {\n const { glContainer, glEventHub } = this.props;\n const root = LayoutUtils.getRootFromContainer(glContainer);\n const config = LayoutUtils.getComponentConfigFromContainer(glContainer);\n if (config == null) {\n log.error('Could not get component config from container', glContainer);\n return;\n }\n const cloneConfig = LayoutUtils.cloneComponent(\n root,\n config as ReactComponentConfig\n );\n if (cloneConfig !== null) {\n glEventHub.emit(PanelEvent.CLONED, this, cloneConfig);\n }\n }\n\n getCloneAction(): ContextAction {\n return {\n title: 'Copy Panel',\n order: 10,\n group: ContextActions.groups.high,\n action: this.handleCopyPanel,\n };\n }\n\n getRenameAction(): ContextAction {\n return {\n title: 'Rename',\n order: 10,\n group: ContextActions.groups.medium,\n action: this.handleShowRenameDialog,\n };\n }\n\n getAdditionalActions = memoize(\n (\n actions: readonly ResolvableContextAction[],\n isClonable: boolean,\n isRenamable: boolean\n ) => {\n const additionalActions = [];\n if (isClonable) {\n additionalActions.push(this.getCloneAction());\n }\n if (isRenamable) {\n additionalActions.push(this.getRenameAction());\n }\n return [...additionalActions, ...actions];\n }\n );\n\n render(): ReactElement {\n const {\n children,\n className,\n renderTabTooltip,\n glContainer,\n glEventHub,\n additionalActions = EMPTY_ARRAY,\n errorMessage,\n isLoaded = true,\n isLoading = false,\n isClonable = false,\n isRenamable = false,\n } = this.props;\n\n const { tab: glTab } = glContainer;\n const { showRenameDialog, title, isWithinPanel } = this.state;\n\n return (\n <div\n className={classNames('h-100 w-100 dh-panel', className)}\n onFocusCapture={this.handleFocus}\n onBlurCapture={this.handleBlur}\n ref={this.ref}\n >\n {children}\n <LoadingOverlay\n errorMessage={errorMessage}\n isLoaded={isLoaded}\n isLoading={isLoading}\n />\n {!isWithinPanel &&\n glTab != null &&\n ReactDOM.createPortal(\n <>\n <PanelContextMenu\n glContainer={glContainer}\n glEventHub={glEventHub}\n additionalActions={this.getAdditionalActions(\n additionalActions,\n isClonable,\n isRenamable\n )}\n />\n {isRenamable && (\n <RenameDialog\n isShown={showRenameDialog}\n value={title}\n itemType=\"Panel\"\n onCancel={this.handleRenameCancel}\n onSubmit={this.handleRenameSubmit}\n />\n )}\n {renderTabTooltip != null && (\n <Tooltip\n interactive\n options={{\n placement: 'bottom',\n }}\n popperClassName=\"panel-tab-popper\"\n >\n {renderTabTooltip()}\n </Tooltip>\n )}\n </>,\n glTab.element[0] // tab.element is jquery element, we want a dom element\n )}\n </div>\n );\n }\n}\n\nconst XBasePanel = createXComponent(BasePanel);\n\nexport default XBasePanel;\n"],"mappings":"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"}
package/dist/Panel.css ADDED
@@ -0,0 +1,5 @@
1
+ .dh-panel {
2
+ position: relative;
3
+ }
4
+
5
+ /*# sourceMappingURL=Panel.css.map */
@@ -0,0 +1 @@
1
+ {"version":3,"sourceRoot":"","sources":["../src/Panel.scss"],"names":[],"mappings":"AAAA;EACE","file":"Panel.css","sourcesContent":[".dh-panel {\n position: relative;\n}"]}
@@ -0,0 +1,30 @@
1
+ import React, { PureComponent, type ReactElement } from 'react';
2
+ import { type ResolvableContextAction } from '@deephaven/components';
3
+ import type { Container, EventEmitter, Tab } from '@deephaven/golden-layout';
4
+ import { type CustomizableWorkspace } from '@deephaven/redux';
5
+ interface PanelContextMenuProps {
6
+ additionalActions: ResolvableContextAction[];
7
+ glContainer: Container;
8
+ glEventHub: EventEmitter;
9
+ workspace: CustomizableWorkspace;
10
+ }
11
+ declare class PanelContextMenu extends PureComponent<PanelContextMenuProps, Record<string, never>> {
12
+ static defaultProps: {
13
+ additionalActions: never[];
14
+ };
15
+ constructor(props: PanelContextMenuProps);
16
+ getAllTabs(): Tab[];
17
+ handleCloseTab(): void;
18
+ handleCloseTabsAll(): void;
19
+ handleCloseTabsRight(): void;
20
+ handleReopenLast(): void;
21
+ canCloseTabsRight(): boolean;
22
+ canCloseAny(): boolean;
23
+ canReopenLast(): boolean;
24
+ render(): ReactElement;
25
+ }
26
+ declare const ConnectedPanelContextMenu: import("react-redux").ConnectedComponent<typeof PanelContextMenu, import("react-redux").Omit<Pick<React.ClassAttributes<PanelContextMenu> & PanelContextMenuProps, "glContainer" | "glEventHub" | "workspace" | keyof React.ClassAttributes<PanelContextMenu>> & Partial<Pick<React.ClassAttributes<PanelContextMenu> & PanelContextMenuProps, "additionalActions">> & Partial<Pick<{
27
+ additionalActions: never[];
28
+ }, never>>, "workspace">>;
29
+ export default ConnectedPanelContextMenu;
30
+ //# sourceMappingURL=PanelContextMenu.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PanelContextMenu.d.ts","sourceRoot":"","sources":["../src/PanelContextMenu.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,aAAa,EAAE,KAAK,YAAY,EAAE,MAAM,OAAO,CAAC;AAChE,OAAO,EAEL,KAAK,uBAAuB,EAC7B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,0BAA0B,CAAC;AAC7E,OAAO,EACL,KAAK,qBAAqB,EAI3B,MAAM,kBAAkB,CAAC;AAM1B,UAAU,qBAAqB;IAC7B,iBAAiB,EAAE,uBAAuB,EAAE,CAAC;IAC7C,WAAW,EAAE,SAAS,CAAC;IACvB,UAAU,EAAE,YAAY,CAAC;IACzB,SAAS,EAAE,qBAAqB,CAAC;CAClC;AAOD,cAAM,gBAAiB,SAAQ,aAAa,CAC1C,qBAAqB,EACrB,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CACtB;IACC,MAAM,CAAC,YAAY;;MAEjB;gBAEU,KAAK,EAAE,qBAAqB;IASxC,UAAU,IAAI,GAAG,EAAE;IAMnB,cAAc,IAAI,IAAI;IAKtB,kBAAkB,IAAI,IAAI;IAU1B,oBAAoB,IAAI,IAAI;IAiB5B,gBAAgB,IAAI,IAAI;IAKxB,iBAAiB,IAAI,OAAO;IAqB5B,WAAW,IAAI,OAAO;IActB,aAAa,IAAI,OAAO;IAYxB,MAAM,IAAI,YAAY;CAwCvB;AAUD,QAAA,MAAM,yBAAyB;;yBAEX,CAAC;AAErB,eAAe,yBAAyB,CAAC"}
@@ -0,0 +1,160 @@
1
+ function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
2
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
3
+ function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
4
+ import React, { PureComponent } from 'react';
5
+ import { ContextActions } from '@deephaven/components';
6
+ import { getWorkspace, setWorkspace as setWorkspaceAction } from '@deephaven/redux';
7
+ import { connect } from 'react-redux';
8
+ import { LayoutUtils } from "./layout/index.js";
9
+ import { PanelEvent } from "./PanelEvent.js";
10
+ import { jsx as _jsx } from "react/jsx-runtime";
11
+ class PanelContextMenu extends PureComponent {
12
+ constructor(props) {
13
+ super(props);
14
+ this.handleCloseTab = this.handleCloseTab.bind(this);
15
+ this.handleCloseTabsRight = this.handleCloseTabsRight.bind(this);
16
+ this.handleCloseTabsAll = this.handleCloseTabsAll.bind(this);
17
+ this.handleReopenLast = this.handleReopenLast.bind(this);
18
+ }
19
+ getAllTabs() {
20
+ var _glContainer$tab$head, _glContainer$tab, _glContainer$tab$head2;
21
+ // return a clone of the tabs array, or returns empty array if null
22
+ var {
23
+ glContainer
24
+ } = this.props;
25
+ return [...((_glContainer$tab$head = glContainer === null || glContainer === void 0 ? void 0 : (_glContainer$tab = glContainer.tab) === null || _glContainer$tab === void 0 ? void 0 : (_glContainer$tab$head2 = _glContainer$tab.header) === null || _glContainer$tab$head2 === void 0 ? void 0 : _glContainer$tab$head2.tabs) !== null && _glContainer$tab$head !== void 0 ? _glContainer$tab$head : [])];
26
+ }
27
+ handleCloseTab() {
28
+ var {
29
+ glContainer
30
+ } = this.props;
31
+ glContainer.close();
32
+ }
33
+ handleCloseTabsAll() {
34
+ var tabs = this.getAllTabs();
35
+
36
+ // No need to check if isClosable, golden-layout returns
37
+ // false when attempting to close tabs that you can't
38
+ tabs.forEach(tab => {
39
+ var _container;
40
+ return (_container = (tab === null || tab === void 0 ? void 0 : tab.contentItem).container) === null || _container === void 0 ? void 0 : _container.close();
41
+ });
42
+ }
43
+ handleCloseTabsRight() {
44
+ var {
45
+ glContainer
46
+ } = this.props;
47
+ var tabs = this.getAllTabs();
48
+ for (var i = tabs.length - 1; i > 0; i -= 1) {
49
+ var _tabs$i$contentItem, _tabs$i$contentItem$c, _glContainer$tab2, _glContainer$tab2$con, _glContainer$tab2$con2, _container2, _tabs$i;
50
+ if (((_tabs$i$contentItem = tabs[i].contentItem) === null || _tabs$i$contentItem === void 0 ? void 0 : (_tabs$i$contentItem$c = _tabs$i$contentItem.config) === null || _tabs$i$contentItem$c === void 0 ? void 0 : _tabs$i$contentItem$c.id) === ((_glContainer$tab2 = glContainer.tab) === null || _glContainer$tab2 === void 0 ? void 0 : (_glContainer$tab2$con = _glContainer$tab2.contentItem) === null || _glContainer$tab2$con === void 0 ? void 0 : (_glContainer$tab2$con2 = _glContainer$tab2$con.config) === null || _glContainer$tab2$con2 === void 0 ? void 0 : _glContainer$tab2$con2.id)) {
51
+ break; // end when we get back to current id
52
+ }
53
+
54
+ // eslint-disable-next-line no-unused-expressions
55
+ (_container2 = ((_tabs$i = tabs[i]) === null || _tabs$i === void 0 ? void 0 : _tabs$i.contentItem).container) === null || _container2 === void 0 ? void 0 : _container2.close();
56
+ }
57
+ }
58
+ handleReopenLast() {
59
+ var {
60
+ glContainer,
61
+ glEventHub
62
+ } = this.props;
63
+ glEventHub.emit(PanelEvent.REOPEN_LAST, glContainer);
64
+ }
65
+ canCloseTabsRight() {
66
+ var {
67
+ glContainer
68
+ } = this.props;
69
+ var tabs = this.getAllTabs();
70
+ var disabled = true;
71
+ for (var i = tabs.length - 1; i > 0; i -= 1) {
72
+ var _tabs$i$contentItem2, _tabs$i$contentItem2$, _glContainer$tab3, _glContainer$tab3$con, _glContainer$tab3$con2, _tabs$i2, _tabs$i2$contentItem, _tabs$i2$contentItem$;
73
+ if (((_tabs$i$contentItem2 = tabs[i].contentItem) === null || _tabs$i$contentItem2 === void 0 ? void 0 : (_tabs$i$contentItem2$ = _tabs$i$contentItem2.config) === null || _tabs$i$contentItem2$ === void 0 ? void 0 : _tabs$i$contentItem2$.id) === ((_glContainer$tab3 = glContainer.tab) === null || _glContainer$tab3 === void 0 ? void 0 : (_glContainer$tab3$con = _glContainer$tab3.contentItem) === null || _glContainer$tab3$con === void 0 ? void 0 : (_glContainer$tab3$con2 = _glContainer$tab3$con.config) === null || _glContainer$tab3$con2 === void 0 ? void 0 : _glContainer$tab3$con2.id)) {
74
+ break; // end when we get back to current id
75
+ }
76
+
77
+ var closable = Boolean((_tabs$i2 = tabs[i]) === null || _tabs$i2 === void 0 ? void 0 : (_tabs$i2$contentItem = _tabs$i2.contentItem) === null || _tabs$i2$contentItem === void 0 ? void 0 : (_tabs$i2$contentItem$ = _tabs$i2$contentItem.config) === null || _tabs$i2$contentItem$ === void 0 ? void 0 : _tabs$i2$contentItem$.isClosable);
78
+ if (closable) {
79
+ disabled = false;
80
+ break; // end if we find a closeable tab
81
+ }
82
+ }
83
+
84
+ return disabled;
85
+ }
86
+ canCloseAny() {
87
+ var tabs = this.getAllTabs();
88
+ var disabled = true;
89
+ for (var i = tabs.length - 1; i > 0; i -= 1) {
90
+ var _tabs$i3, _tabs$i3$contentItem, _tabs$i3$contentItem$;
91
+ var closable = Boolean((_tabs$i3 = tabs[i]) === null || _tabs$i3 === void 0 ? void 0 : (_tabs$i3$contentItem = _tabs$i3.contentItem) === null || _tabs$i3$contentItem === void 0 ? void 0 : (_tabs$i3$contentItem$ = _tabs$i3$contentItem.config) === null || _tabs$i3$contentItem$ === void 0 ? void 0 : _tabs$i3$contentItem$.isClosable);
92
+ if (closable) {
93
+ disabled = false;
94
+ break;
95
+ }
96
+ }
97
+ return disabled;
98
+ }
99
+ canReopenLast() {
100
+ var _LayoutUtils$getStack, _workspace$data$close;
101
+ var {
102
+ workspace,
103
+ glContainer
104
+ } = this.props;
105
+ var stackId = (_LayoutUtils$getStack = LayoutUtils.getStackForConfig(glContainer.layoutManager.root, glContainer.getConfig())) === null || _LayoutUtils$getStack === void 0 ? void 0 : _LayoutUtils$getStack.config.id;
106
+ return !((_workspace$data$close = workspace.data.closed) !== null && _workspace$data$close !== void 0 && _workspace$data$close.some(panel => panel.parentStackId === stackId));
107
+ }
108
+ render() {
109
+ var _glContainer$tab4, _glContainer$tab4$con, _glContainer$tab4$con2;
110
+ var {
111
+ additionalActions,
112
+ glContainer
113
+ } = this.props;
114
+ var contextActions = [...additionalActions];
115
+ contextActions.push(() => ({
116
+ title: 'Re-open closed panel',
117
+ group: ContextActions.groups.medium + 2004,
118
+ action: this.handleReopenLast,
119
+ disabled: this.canReopenLast()
120
+ }));
121
+ var closable = (_glContainer$tab4 = glContainer.tab) === null || _glContainer$tab4 === void 0 ? void 0 : (_glContainer$tab4$con = _glContainer$tab4.contentItem) === null || _glContainer$tab4$con === void 0 ? void 0 : (_glContainer$tab4$con2 = _glContainer$tab4$con.config) === null || _glContainer$tab4$con2 === void 0 ? void 0 : _glContainer$tab4$con2.isClosable;
122
+ contextActions.push({
123
+ title: 'Close',
124
+ order: 10,
125
+ group: ContextActions.groups.low,
126
+ action: this.handleCloseTab,
127
+ disabled: closable === undefined || !closable
128
+ });
129
+
130
+ // pushed as function so the disable check happens on run
131
+ contextActions.push(() => ({
132
+ title: 'Close Tabs to Right',
133
+ order: 20,
134
+ group: ContextActions.groups.low,
135
+ action: this.handleCloseTabsRight,
136
+ disabled: this.canCloseTabsRight()
137
+ }));
138
+ contextActions.push(() => ({
139
+ title: 'Close All',
140
+ order: 30,
141
+ group: ContextActions.groups.low,
142
+ action: this.handleCloseTabsAll,
143
+ disabled: this.canCloseAny()
144
+ }));
145
+ return /*#__PURE__*/_jsx(ContextActions, {
146
+ actions: contextActions
147
+ });
148
+ }
149
+ }
150
+ _defineProperty(PanelContextMenu, "defaultProps", {
151
+ additionalActions: []
152
+ });
153
+ var mapStateToProps = state => ({
154
+ workspace: getWorkspace(state)
155
+ });
156
+ var ConnectedPanelContextMenu = connect(mapStateToProps, {
157
+ setWorkspace: setWorkspaceAction
158
+ })(PanelContextMenu);
159
+ export default ConnectedPanelContextMenu;
160
+ //# sourceMappingURL=PanelContextMenu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PanelContextMenu.js","names":["React","PureComponent","ContextActions","getWorkspace","setWorkspace","setWorkspaceAction","connect","LayoutUtils","PanelEvent","jsx","_jsx","PanelContextMenu","constructor","props","handleCloseTab","bind","handleCloseTabsRight","handleCloseTabsAll","handleReopenLast","getAllTabs","_glContainer$tab$head","_glContainer$tab","_glContainer$tab$head2","glContainer","tab","header","tabs","close","forEach","_container","contentItem","container","i","length","_tabs$i$contentItem","_tabs$i$contentItem$c","_glContainer$tab2","_glContainer$tab2$con","_glContainer$tab2$con2","_container2","_tabs$i","config","id","glEventHub","emit","REOPEN_LAST","canCloseTabsRight","disabled","_tabs$i$contentItem2","_tabs$i$contentItem2$","_glContainer$tab3","_glContainer$tab3$con","_glContainer$tab3$con2","_tabs$i2","_tabs$i2$contentItem","_tabs$i2$contentItem$","closable","Boolean","isClosable","canCloseAny","_tabs$i3","_tabs$i3$contentItem","_tabs$i3$contentItem$","canReopenLast","_LayoutUtils$getStack","_workspace$data$close","workspace","stackId","getStackForConfig","layoutManager","root","getConfig","data","closed","some","panel","parentStackId","render","_glContainer$tab4","_glContainer$tab4$con","_glContainer$tab4$con2","additionalActions","contextActions","push","title","group","groups","medium","action","order","low","undefined","actions","_defineProperty","mapStateToProps","state","ConnectedPanelContextMenu"],"sources":["../src/PanelContextMenu.tsx"],"sourcesContent":["import React, { PureComponent, type ReactElement } from 'react';\nimport {\n ContextActions,\n type ResolvableContextAction,\n} from '@deephaven/components';\nimport type { Container, EventEmitter, Tab } from '@deephaven/golden-layout';\nimport {\n type CustomizableWorkspace,\n type RootState,\n getWorkspace,\n setWorkspace as setWorkspaceAction,\n} from '@deephaven/redux';\nimport { connect } from 'react-redux';\nimport { type ClosedPanel } from './PanelManager';\nimport { LayoutUtils } from './layout';\nimport { PanelEvent } from './PanelEvent';\n\ninterface PanelContextMenuProps {\n additionalActions: ResolvableContextAction[];\n glContainer: Container;\n glEventHub: EventEmitter;\n workspace: CustomizableWorkspace;\n}\n\ninterface HasContainer {\n container: {\n close: () => void;\n };\n}\nclass PanelContextMenu extends PureComponent<\n PanelContextMenuProps,\n Record<string, never>\n> {\n static defaultProps = {\n additionalActions: [],\n };\n\n constructor(props: PanelContextMenuProps) {\n super(props);\n\n this.handleCloseTab = this.handleCloseTab.bind(this);\n this.handleCloseTabsRight = this.handleCloseTabsRight.bind(this);\n this.handleCloseTabsAll = this.handleCloseTabsAll.bind(this);\n this.handleReopenLast = this.handleReopenLast.bind(this);\n }\n\n getAllTabs(): Tab[] {\n // return a clone of the tabs array, or returns empty array if null\n const { glContainer } = this.props;\n return [...(glContainer?.tab?.header?.tabs ?? [])];\n }\n\n handleCloseTab(): void {\n const { glContainer } = this.props;\n glContainer.close();\n }\n\n handleCloseTabsAll(): void {\n const tabs = this.getAllTabs();\n\n // No need to check if isClosable, golden-layout returns\n // false when attempting to close tabs that you can't\n tabs.forEach(\n tab => (tab?.contentItem as unknown as HasContainer).container?.close()\n );\n }\n\n handleCloseTabsRight(): void {\n const { glContainer } = this.props;\n const tabs = this.getAllTabs();\n\n for (let i = tabs.length - 1; i > 0; i -= 1) {\n if (\n tabs[i].contentItem?.config?.id ===\n glContainer.tab?.contentItem?.config?.id\n ) {\n break; // end when we get back to current id\n }\n\n // eslint-disable-next-line no-unused-expressions\n (tabs[i]?.contentItem as unknown as HasContainer).container?.close();\n }\n }\n\n handleReopenLast(): void {\n const { glContainer, glEventHub } = this.props;\n glEventHub.emit(PanelEvent.REOPEN_LAST, glContainer);\n }\n\n canCloseTabsRight(): boolean {\n const { glContainer } = this.props;\n const tabs = this.getAllTabs();\n\n let disabled = true;\n for (let i = tabs.length - 1; i > 0; i -= 1) {\n if (\n tabs[i].contentItem?.config?.id ===\n glContainer.tab?.contentItem?.config?.id\n ) {\n break; // end when we get back to current id\n }\n const closable = Boolean(tabs[i]?.contentItem?.config?.isClosable);\n if (closable) {\n disabled = false;\n break; // end if we find a closeable tab\n }\n }\n return disabled;\n }\n\n canCloseAny(): boolean {\n const tabs = this.getAllTabs();\n\n let disabled = true;\n for (let i = tabs.length - 1; i > 0; i -= 1) {\n const closable = Boolean(tabs[i]?.contentItem?.config?.isClosable);\n if (closable) {\n disabled = false;\n break;\n }\n }\n return disabled;\n }\n\n canReopenLast(): boolean {\n const { workspace, glContainer } = this.props;\n const stackId = LayoutUtils.getStackForConfig(\n glContainer.layoutManager.root,\n glContainer.getConfig()\n )?.config.id;\n\n return !workspace.data.closed?.some(\n panel => (panel as ClosedPanel).parentStackId === stackId\n );\n }\n\n render(): ReactElement {\n const { additionalActions, glContainer } = this.props;\n\n const contextActions = [...additionalActions];\n\n contextActions.push(() => ({\n title: 'Re-open closed panel',\n group: ContextActions.groups.medium + 2004,\n action: this.handleReopenLast,\n disabled: this.canReopenLast(),\n }));\n\n const closable = glContainer.tab?.contentItem?.config?.isClosable;\n contextActions.push({\n title: 'Close',\n order: 10,\n group: ContextActions.groups.low,\n action: this.handleCloseTab,\n disabled: closable === undefined || !closable,\n });\n\n // pushed as function so the disable check happens on run\n contextActions.push(() => ({\n title: 'Close Tabs to Right',\n order: 20,\n group: ContextActions.groups.low,\n action: this.handleCloseTabsRight,\n disabled: this.canCloseTabsRight(),\n }));\n\n contextActions.push(() => ({\n title: 'Close All',\n order: 30,\n group: ContextActions.groups.low,\n action: this.handleCloseTabsAll,\n disabled: this.canCloseAny(),\n }));\n\n return <ContextActions actions={contextActions} />;\n }\n}\n\nconst mapStateToProps = (\n state: RootState\n): {\n workspace: CustomizableWorkspace;\n} => ({\n workspace: getWorkspace(state),\n});\n\nconst ConnectedPanelContextMenu = connect(mapStateToProps, {\n setWorkspace: setWorkspaceAction,\n})(PanelContextMenu);\n\nexport default ConnectedPanelContextMenu;\n"],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import { type ChangeEvent, type FormEvent, PureComponent, type ReactElement, type RefObject } from 'react';
2
+ interface RenameDialogProps {
3
+ isShared: boolean;
4
+ isOwner: boolean;
5
+ isShown: boolean;
6
+ itemType: string;
7
+ onSubmit: (title: string) => void;
8
+ onCancel: () => void;
9
+ value?: string | null;
10
+ }
11
+ interface RenameDialogState {
12
+ value?: string | null;
13
+ valueWasValidated: boolean;
14
+ }
15
+ export default class RenameDialog extends PureComponent<RenameDialogProps, RenameDialogState> {
16
+ static defaultProps: {
17
+ isShared: boolean;
18
+ isOwner: boolean;
19
+ itemType: string;
20
+ value: string;
21
+ };
22
+ constructor(props: RenameDialogProps);
23
+ componentDidUpdate(prevProps: RenameDialogProps): void;
24
+ renameInputRef: RefObject<HTMLInputElement>;
25
+ resetState(): void;
26
+ handleRenameDialogOpened(): void;
27
+ handleRenameInputChange(event: ChangeEvent<HTMLInputElement>): void;
28
+ handleRenameCancel(): void;
29
+ handleRenameSubmit(event: FormEvent<HTMLFormElement>): void;
30
+ renderRenameDialog(): ReactElement;
31
+ render(): ReactElement;
32
+ }
33
+ export {};
34
+ //# sourceMappingURL=RenameDialog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RenameDialog.d.ts","sourceRoot":"","sources":["../src/RenameDialog.tsx"],"names":[],"mappings":"AAAA,OAAc,EACZ,KAAK,WAAW,EAChB,KAAK,SAAS,EACd,aAAa,EACb,KAAK,YAAY,EACjB,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAIf,UAAU,iBAAiB;IACzB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED,UAAU,iBAAiB;IACzB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,iBAAiB,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,CAAC,OAAO,OAAO,YAAa,SAAQ,aAAa,CACrD,iBAAiB,EACjB,iBAAiB,CAClB;IACC,MAAM,CAAC,YAAY;;;;;MAKjB;gBAEU,KAAK,EAAE,iBAAiB;IAkBpC,kBAAkB,CAAC,SAAS,EAAE,iBAAiB,GAAG,IAAI;IAYtD,cAAc,EAAE,SAAS,CAAC,gBAAgB,CAAC,CAAC;IAE5C,UAAU,IAAI,IAAI;IAKlB,wBAAwB,IAAI,IAAI;IAIhC,uBAAuB,CAAC,KAAK,EAAE,WAAW,CAAC,gBAAgB,CAAC,GAAG,IAAI;IAInE,kBAAkB,IAAI,IAAI;IAK1B,kBAAkB,CAAC,KAAK,EAAE,SAAS,CAAC,eAAe,CAAC,GAAG,IAAI;IAa3D,kBAAkB,IAAI,YAAY;IAyDlC,MAAM,IAAI,YAAY;CAiBvB"}
@@ -0,0 +1,167 @@
1
+ function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
2
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
3
+ function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
4
+ import React, { PureComponent } from 'react';
5
+ import classNames from 'classnames';
6
+ import { Button, Popper } from '@deephaven/components';
7
+ import { jsxs as _jsxs } from "react/jsx-runtime";
8
+ import { jsx as _jsx } from "react/jsx-runtime";
9
+ export default class RenameDialog extends PureComponent {
10
+ constructor(props) {
11
+ super(props);
12
+ _defineProperty(this, "renameInputRef", void 0);
13
+ this.handleRenameDialogOpened = this.handleRenameDialogOpened.bind(this);
14
+ this.handleRenameInputChange = this.handleRenameInputChange.bind(this);
15
+ this.handleRenameCancel = this.handleRenameCancel.bind(this);
16
+ this.handleRenameSubmit = this.handleRenameSubmit.bind(this);
17
+ this.renameInputRef = /*#__PURE__*/React.createRef();
18
+ var {
19
+ value
20
+ } = props;
21
+ this.state = {
22
+ value,
23
+ valueWasValidated: false
24
+ };
25
+ }
26
+ componentDidUpdate(prevProps) {
27
+ var {
28
+ isShown: prevIsShown
29
+ } = prevProps;
30
+ var {
31
+ isShown
32
+ } = this.props;
33
+ // Reset the state on dialog shown and not on the `value` prop change
34
+ // so the input keeps the internal value while the dialog is open.
35
+ // Useful in case the `value` prop update is triggered externally
36
+ // i.e. by someone else renaming the same shared dashboard
37
+ if (isShown && !prevIsShown) {
38
+ this.resetState();
39
+ }
40
+ }
41
+ resetState() {
42
+ var {
43
+ value
44
+ } = this.props;
45
+ this.setState({
46
+ value,
47
+ valueWasValidated: false
48
+ });
49
+ }
50
+ handleRenameDialogOpened() {
51
+ var _this$renameInputRef, _this$renameInputRef$;
52
+ (_this$renameInputRef = this.renameInputRef) === null || _this$renameInputRef === void 0 ? void 0 : (_this$renameInputRef$ = _this$renameInputRef.current) === null || _this$renameInputRef$ === void 0 ? void 0 : _this$renameInputRef$.focus();
53
+ }
54
+ handleRenameInputChange(event) {
55
+ this.setState({
56
+ value: event.target.value
57
+ });
58
+ }
59
+ handleRenameCancel() {
60
+ var {
61
+ onCancel
62
+ } = this.props;
63
+ onCancel();
64
+ }
65
+ handleRenameSubmit(event) {
66
+ event.stopPropagation();
67
+ event.preventDefault();
68
+ var {
69
+ value
70
+ } = this.state;
71
+ var newTitle = value === null || value === void 0 ? void 0 : value.trim();
72
+ if (newTitle !== undefined && newTitle !== '') {
73
+ var {
74
+ onSubmit
75
+ } = this.props;
76
+ onSubmit(newTitle);
77
+ } else {
78
+ this.setState({
79
+ value: newTitle,
80
+ valueWasValidated: true
81
+ });
82
+ }
83
+ }
84
+ renderRenameDialog() {
85
+ var {
86
+ isShared,
87
+ isOwner,
88
+ itemType
89
+ } = this.props;
90
+ var {
91
+ value,
92
+ valueWasValidated
93
+ } = this.state;
94
+ return /*#__PURE__*/_jsxs("form", {
95
+ className: classNames('p-3', {
96
+ 'was-validated': valueWasValidated
97
+ }),
98
+ onSubmit: this.handleRenameSubmit,
99
+ noValidate: true,
100
+ role: "presentation",
101
+ onMouseDown: event => {
102
+ // block events in the NewTabScreen ItemList
103
+ event.stopPropagation();
104
+ },
105
+ onMouseUp: event => {
106
+ event.stopPropagation();
107
+ },
108
+ children: [/*#__PURE__*/_jsxs("div", {
109
+ className: "form-group",
110
+ children: [/*#__PURE__*/_jsxs("label", {
111
+ htmlFor: "rename-dialog-".concat(itemType, "-input"),
112
+ children: ["Rename ", itemType]
113
+ }), /*#__PURE__*/_jsx("input", {
114
+ type: "text",
115
+ className: "form-control",
116
+ id: "rename-dialog-".concat(itemType, "-input"),
117
+ value: value !== null && value !== void 0 ? value : undefined,
118
+ ref: this.renameInputRef,
119
+ onChange: this.handleRenameInputChange,
120
+ required: true
121
+ }), /*#__PURE__*/_jsxs("div", {
122
+ className: "invalid-feedback",
123
+ children: [itemType, " name cannot be empty"]
124
+ }), (isShared || !isOwner) && /*#__PURE__*/_jsxs("div", {
125
+ className: "pt-2",
126
+ children: ["Renaming this ", itemType, " will rename for all users."]
127
+ })]
128
+ }), /*#__PURE__*/_jsxs("div", {
129
+ className: "text-right",
130
+ children: [/*#__PURE__*/_jsx(Button, {
131
+ kind: "secondary",
132
+ className: "mr-2",
133
+ onClick: this.handleRenameCancel,
134
+ children: "Cancel"
135
+ }), /*#__PURE__*/_jsx(Button, {
136
+ kind: "primary",
137
+ type: "submit",
138
+ children: "Rename"
139
+ })]
140
+ })]
141
+ });
142
+ }
143
+ render() {
144
+ var {
145
+ isShown,
146
+ onCancel
147
+ } = this.props;
148
+ return /*#__PURE__*/_jsx(Popper, {
149
+ isShown: isShown,
150
+ onEntered: this.handleRenameDialogOpened,
151
+ onExited: onCancel,
152
+ options: {
153
+ placement: 'bottom'
154
+ },
155
+ interactive: true,
156
+ closeOnBlur: true,
157
+ children: this.renderRenameDialog()
158
+ });
159
+ }
160
+ }
161
+ _defineProperty(RenameDialog, "defaultProps", {
162
+ isShared: false,
163
+ isOwner: true,
164
+ itemType: 'Item',
165
+ value: ''
166
+ });
167
+ //# sourceMappingURL=RenameDialog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RenameDialog.js","names":["React","PureComponent","classNames","Button","Popper","jsxs","_jsxs","jsx","_jsx","RenameDialog","constructor","props","_defineProperty","handleRenameDialogOpened","bind","handleRenameInputChange","handleRenameCancel","handleRenameSubmit","renameInputRef","createRef","value","state","valueWasValidated","componentDidUpdate","prevProps","isShown","prevIsShown","resetState","setState","_this$renameInputRef","_this$renameInputRef$","current","focus","event","target","onCancel","stopPropagation","preventDefault","newTitle","trim","undefined","onSubmit","renderRenameDialog","isShared","isOwner","itemType","className","noValidate","role","onMouseDown","onMouseUp","children","htmlFor","concat","type","id","ref","onChange","required","kind","onClick","render","onEntered","onExited","options","placement","interactive","closeOnBlur"],"sources":["../src/RenameDialog.tsx"],"sourcesContent":["import React, {\n type ChangeEvent,\n type FormEvent,\n PureComponent,\n type ReactElement,\n type RefObject,\n} from 'react';\nimport classNames from 'classnames';\nimport { Button, Popper } from '@deephaven/components';\n\ninterface RenameDialogProps {\n isShared: boolean;\n isOwner: boolean;\n isShown: boolean;\n itemType: string;\n onSubmit: (title: string) => void;\n onCancel: () => void;\n value?: string | null;\n}\n\ninterface RenameDialogState {\n value?: string | null;\n valueWasValidated: boolean;\n}\n\nexport default class RenameDialog extends PureComponent<\n RenameDialogProps,\n RenameDialogState\n> {\n static defaultProps = {\n isShared: false,\n isOwner: true,\n itemType: 'Item',\n value: '',\n };\n\n constructor(props: RenameDialogProps) {\n super(props);\n\n this.handleRenameDialogOpened = this.handleRenameDialogOpened.bind(this);\n this.handleRenameInputChange = this.handleRenameInputChange.bind(this);\n this.handleRenameCancel = this.handleRenameCancel.bind(this);\n this.handleRenameSubmit = this.handleRenameSubmit.bind(this);\n\n this.renameInputRef = React.createRef();\n\n const { value } = props;\n\n this.state = {\n value,\n valueWasValidated: false,\n };\n }\n\n componentDidUpdate(prevProps: RenameDialogProps): void {\n const { isShown: prevIsShown } = prevProps;\n const { isShown } = this.props;\n // Reset the state on dialog shown and not on the `value` prop change\n // so the input keeps the internal value while the dialog is open.\n // Useful in case the `value` prop update is triggered externally\n // i.e. by someone else renaming the same shared dashboard\n if (isShown && !prevIsShown) {\n this.resetState();\n }\n }\n\n renameInputRef: RefObject<HTMLInputElement>;\n\n resetState(): void {\n const { value } = this.props;\n this.setState({ value, valueWasValidated: false });\n }\n\n handleRenameDialogOpened(): void {\n this.renameInputRef?.current?.focus();\n }\n\n handleRenameInputChange(event: ChangeEvent<HTMLInputElement>): void {\n this.setState({ value: event.target.value });\n }\n\n handleRenameCancel(): void {\n const { onCancel } = this.props;\n onCancel();\n }\n\n handleRenameSubmit(event: FormEvent<HTMLFormElement>): void {\n event.stopPropagation();\n event.preventDefault();\n const { value } = this.state;\n const newTitle = value?.trim();\n if (newTitle !== undefined && newTitle !== '') {\n const { onSubmit } = this.props;\n onSubmit(newTitle);\n } else {\n this.setState({ value: newTitle, valueWasValidated: true });\n }\n }\n\n renderRenameDialog(): ReactElement {\n const { isShared, isOwner, itemType } = this.props;\n const { value, valueWasValidated } = this.state;\n\n return (\n <form\n className={classNames('p-3', { 'was-validated': valueWasValidated })}\n onSubmit={this.handleRenameSubmit}\n noValidate\n role=\"presentation\"\n onMouseDown={event => {\n // block events in the NewTabScreen ItemList\n event.stopPropagation();\n }}\n onMouseUp={event => {\n event.stopPropagation();\n }}\n >\n <div className=\"form-group\">\n <label htmlFor={`rename-dialog-${itemType}-input`}>\n Rename {itemType}\n </label>\n <input\n type=\"text\"\n className=\"form-control\"\n id={`rename-dialog-${itemType}-input`}\n value={value ?? undefined}\n ref={this.renameInputRef}\n onChange={this.handleRenameInputChange}\n required\n />\n <div className=\"invalid-feedback\">\n {itemType} name cannot be empty\n </div>\n {(isShared || !isOwner) && (\n <div className=\"pt-2\">\n Renaming this {itemType} will rename for all users.\n </div>\n )}\n </div>\n\n <div className=\"text-right\">\n <Button\n kind=\"secondary\"\n className=\"mr-2\"\n onClick={this.handleRenameCancel}\n >\n Cancel\n </Button>\n <Button kind=\"primary\" type=\"submit\">\n Rename\n </Button>\n </div>\n </form>\n );\n }\n\n render(): ReactElement {\n const { isShown, onCancel } = this.props;\n return (\n <Popper\n isShown={isShown}\n onEntered={this.handleRenameDialogOpened}\n onExited={onCancel}\n options={{\n placement: 'bottom',\n }}\n interactive\n closeOnBlur\n >\n {this.renderRenameDialog()}\n </Popper>\n );\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ declare const TabEvent: Readonly<{
2
+ focus: "TabEvent.focus";
3
+ blur: "TabEvent.blur";
4
+ }>;
5
+ export default TabEvent;
6
+ //# sourceMappingURL=TabEvent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TabEvent.d.ts","sourceRoot":"","sources":["../src/TabEvent.ts"],"names":[],"mappings":"AAAA,QAAA,MAAM,QAAQ;;;EAGZ,CAAC;AAEH,eAAe,QAAQ,CAAC"}
@@ -0,0 +1,6 @@
1
+ var TabEvent = Object.freeze({
2
+ focus: 'TabEvent.focus',
3
+ blur: 'TabEvent.blur'
4
+ });
5
+ export default TabEvent;
6
+ //# sourceMappingURL=TabEvent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TabEvent.js","names":["TabEvent","Object","freeze","focus","blur"],"sources":["../src/TabEvent.ts"],"sourcesContent":["const TabEvent = Object.freeze({\n focus: 'TabEvent.focus',\n blur: 'TabEvent.blur',\n});\n\nexport default TabEvent;\n"],"mappings":"AAAA,IAAMA,QAAQ,GAAGC,MAAM,CAACC,MAAM,CAAC;EAC7BC,KAAK,EAAE,gBAAgB;EACvBC,IAAI,EAAE;AACR,CAAC,CAAC;AAEF,eAAeJ,QAAQ"}
package/dist/index.d.ts CHANGED
@@ -10,10 +10,12 @@ export { default as DashboardUtils } from './DashboardUtils';
10
10
  export * from './LazyDashboard';
11
11
  export * from './layout';
12
12
  export * from './redux';
13
+ export { type BasePanelProps, default as BasePanel, default as Panel, } from './BasePanel';
13
14
  export * from './PanelManager';
14
15
  export * from './PanelEvent';
15
16
  export { default as PanelErrorBoundary } from './PanelErrorBoundary';
16
17
  export { default as PanelManager } from './PanelManager';
18
+ export { default as TabEvent } from './TabEvent';
17
19
  export * from './useDashboardId';
18
20
  export * from './useDhId';
19
21
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,aAAa,CAAC;AAEpC,eAAe,SAAS,CAAC;AAEzB,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAC7D,cAAc,iBAAiB,CAAC;AAChC,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC;AACxB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACzD,cAAc,kBAAkB,CAAC;AACjC,cAAc,WAAW,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,aAAa,CAAC;AAEpC,eAAe,SAAS,CAAC;AAEzB,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAC7D,cAAc,iBAAiB,CAAC;AAChC,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC;AACxB,OAAO,EACL,KAAK,cAAc,EACnB,OAAO,IAAI,SAAS,EAEpB,OAAO,IAAI,KAAK,GACjB,MAAM,aAAa,CAAC;AACrB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,YAAY,CAAC;AACjD,cAAc,kBAAkB,CAAC;AACjC,cAAc,WAAW,CAAC"}
package/dist/index.js CHANGED
@@ -10,10 +10,14 @@ export { default as DashboardUtils } from "./DashboardUtils.js";
10
10
  export * from "./LazyDashboard.js";
11
11
  export * from "./layout/index.js";
12
12
  export * from "./redux/index.js";
13
+ export { default as BasePanel,
14
+ // Alias for BasePanel
15
+ default as Panel } from "./BasePanel.js";
13
16
  export * from "./PanelManager.js";
14
17
  export * from "./PanelEvent.js";
15
18
  export { default as PanelErrorBoundary } from "./PanelErrorBoundary.js";
16
19
  export { default as PanelManager } from "./PanelManager.js";
20
+ export { default as TabEvent } from "./TabEvent.js";
17
21
  export * from "./useDashboardId.js";
18
22
  export * from "./useDhId.js";
19
23
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["Dashboard","default","DashboardUtils","PanelErrorBoundary","PanelManager"],"sources":["../src/index.ts"],"sourcesContent":["import Dashboard from './Dashboard';\n\nexport default Dashboard;\n\nexport * from './Dashboard';\nexport * from './DashboardConstants';\nexport * from './DashboardEvents';\nexport * from './DashboardPlugin';\nexport * from './DashboardLayout';\nexport * from './DashboardUtils';\nexport { default as DashboardUtils } from './DashboardUtils';\nexport * from './LazyDashboard';\nexport * from './layout';\nexport * from './redux';\nexport * from './PanelManager';\nexport * from './PanelEvent';\nexport { default as PanelErrorBoundary } from './PanelErrorBoundary';\nexport { default as PanelManager } from './PanelManager';\nexport * from './useDashboardId';\nexport * from './useDhId';\n"],"mappings":"OAAOA,SAAS;AAEhB,eAAeA,SAAS;AAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAQhBC,OAAO,IAAIC,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAMzBD,OAAO,IAAIE,kBAAkB;AAAA,SAC7BF,OAAO,IAAIG,YAAY;AAAA;AAAA"}
1
+ {"version":3,"file":"index.js","names":["Dashboard","default","DashboardUtils","BasePanel","Panel","PanelErrorBoundary","PanelManager","TabEvent"],"sources":["../src/index.ts"],"sourcesContent":["import Dashboard from './Dashboard';\n\nexport default Dashboard;\n\nexport * from './Dashboard';\nexport * from './DashboardConstants';\nexport * from './DashboardEvents';\nexport * from './DashboardPlugin';\nexport * from './DashboardLayout';\nexport * from './DashboardUtils';\nexport { default as DashboardUtils } from './DashboardUtils';\nexport * from './LazyDashboard';\nexport * from './layout';\nexport * from './redux';\nexport {\n type BasePanelProps,\n default as BasePanel,\n // Alias for BasePanel\n default as Panel,\n} from './BasePanel';\nexport * from './PanelManager';\nexport * from './PanelEvent';\nexport { default as PanelErrorBoundary } from './PanelErrorBoundary';\nexport { default as PanelManager } from './PanelManager';\nexport { default as TabEvent } from './TabEvent';\nexport * from './useDashboardId';\nexport * from './useDhId';\n"],"mappings":"OAAOA,SAAS;AAEhB,eAAeA,SAAS;AAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAQhBC,OAAO,IAAIC,cAAc;AAAA;AAAA;AAAA;AAAA,SAMhCD,OAAO,IAAIE,SAAS;AACpB;AACAF,OAAO,IAAIG,KAAK;AAAA;AAAA;AAAA,SAITH,OAAO,IAAII,kBAAkB;AAAA,SAC7BJ,OAAO,IAAIK,YAAY;AAAA,SACvBL,OAAO,IAAIM,QAAQ;AAAA;AAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@deephaven/dashboard",
3
- "version": "0.109.1-beta.7+9de971f4",
3
+ "version": "0.109.1-beta.9+ce171b91",
4
4
  "description": "Deephaven Dashboard",
5
5
  "author": "Deephaven Data Labs LLC",
6
6
  "license": "Apache-2.0",
@@ -22,15 +22,17 @@
22
22
  "build:sass": "sass --embed-sources --load-path=../../node_modules ./src:./dist"
23
23
  },
24
24
  "dependencies": {
25
- "@deephaven/components": "^0.109.1-beta.7+9de971f4",
26
- "@deephaven/golden-layout": "^0.109.1-beta.7+9de971f4",
27
- "@deephaven/log": "^0.109.1-beta.7+9de971f4",
28
- "@deephaven/react-hooks": "^0.109.1-beta.7+9de971f4",
29
- "@deephaven/redux": "^0.109.1-beta.7+9de971f4",
30
- "@deephaven/utils": "^0.109.1-beta.7+9de971f4",
25
+ "@deephaven/components": "^0.109.1-beta.9+ce171b91",
26
+ "@deephaven/golden-layout": "^0.109.1-beta.9+ce171b91",
27
+ "@deephaven/log": "^0.109.1-beta.9+ce171b91",
28
+ "@deephaven/react-hooks": "^0.109.1-beta.9+ce171b91",
29
+ "@deephaven/redux": "^0.109.1-beta.9+ce171b91",
30
+ "@deephaven/utils": "^0.109.1-beta.9+ce171b91",
31
+ "classnames": "^2.3.1",
31
32
  "fast-deep-equal": "^3.1.3",
32
33
  "lodash.ismatch": "^4.1.1",
33
34
  "lodash.throttle": "^4.1.1",
35
+ "memoize-one": "^5.1.1",
34
36
  "nanoid": "^5.0.7",
35
37
  "prop-types": "^15.7.2"
36
38
  },
@@ -40,8 +42,8 @@
40
42
  "react-redux": "^7.2.4"
41
43
  },
42
44
  "devDependencies": {
43
- "@deephaven/mocks": "^0.109.1-beta.7+9de971f4",
44
- "@deephaven/test-utils": "^0.109.1-beta.7+9de971f4",
45
+ "@deephaven/mocks": "^0.109.1-beta.9+ce171b91",
46
+ "@deephaven/test-utils": "^0.109.1-beta.9+ce171b91",
45
47
  "@types/lodash.ismatch": "^4.4.0",
46
48
  "@types/react-reconciler": "^0.32.0"
47
49
  },
@@ -51,5 +53,5 @@
51
53
  "publishConfig": {
52
54
  "access": "public"
53
55
  },
54
- "gitHead": "9de971f433cd3b8ee9e95719f6641d3428659520"
56
+ "gitHead": "ce171b9146e5ba3ff169cd0a9f498921188ca9f6"
55
57
  }