@deephaven/dashboard-core-plugins 1.22.1-alpha-pivot-builder.0 → 1.22.2-alpha-pivot-builder.0
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/ChartBuilderPlugin.js +8 -15
- package/dist/ChartBuilderPlugin.js.map +1 -1
- package/dist/ChartPanelPlugin.js +13 -6
- package/dist/ChartPanelPlugin.js.map +1 -1
- package/dist/ChartWidgetPlugin.js +11 -4
- package/dist/ChartWidgetPlugin.js.map +1 -1
- package/dist/ConsolePlugin.js +38 -46
- package/dist/ConsolePlugin.js.map +1 -1
- package/dist/FilterPlugin.js +63 -44
- package/dist/FilterPlugin.js.map +1 -1
- package/dist/GridPanelPlugin.js +3 -5
- package/dist/GridPanelPlugin.js.map +1 -1
- package/dist/GridWidgetPlugin.js +35 -29
- package/dist/GridWidgetPlugin.js.map +1 -1
- package/dist/LinkerPlugin.js +3 -5
- package/dist/LinkerPlugin.js.map +1 -1
- package/dist/MarkdownPlugin.js +18 -17
- package/dist/MarkdownPlugin.js.map +1 -1
- package/dist/PandasPanelPlugin.js +3 -5
- package/dist/PandasPanelPlugin.js.map +1 -1
- package/dist/PandasWidgetPlugin.js +3 -7
- package/dist/PandasWidgetPlugin.js.map +1 -1
- package/dist/TablePluginWrapper.js +8 -10
- package/dist/TablePluginWrapper.js.map +1 -1
- package/dist/WidgetLoaderPlugin.js +24 -29
- package/dist/WidgetLoaderPlugin.js.map +1 -1
- package/dist/controls/dropdown-filter/DropdownFilter.js +63 -79
- package/dist/controls/dropdown-filter/DropdownFilter.js.map +1 -1
- package/dist/controls/input-filter/InputFilter.js +32 -58
- package/dist/controls/input-filter/InputFilter.js.map +1 -1
- package/dist/controls/markdown/MarkdownContainer.js +4 -5
- package/dist/controls/markdown/MarkdownContainer.js.map +1 -1
- package/dist/controls/markdown/MarkdownEditor.js +7 -10
- package/dist/controls/markdown/MarkdownEditor.js.map +1 -1
- package/dist/controls/markdown/MarkdownStartPage.js +8 -12
- package/dist/controls/markdown/MarkdownStartPage.js.map +1 -1
- package/dist/linker/Linker.js +100 -192
- package/dist/linker/Linker.js.map +1 -1
- package/dist/linker/LinkerLink.js +23 -31
- package/dist/linker/LinkerLink.js.map +1 -1
- package/dist/linker/LinkerOverlayContent.js +65 -66
- package/dist/linker/LinkerOverlayContent.js.map +1 -1
- package/dist/linker/LinkerUtils.js +6 -14
- package/dist/linker/LinkerUtils.js.map +1 -1
- package/dist/panels/ChartColumnSelectorOverlay.js +4 -6
- package/dist/panels/ChartColumnSelectorOverlay.js.map +1 -1
- package/dist/panels/ChartFilterOverlay.js +7 -9
- package/dist/panels/ChartFilterOverlay.js.map +1 -1
- package/dist/panels/ChartPanel.js +136 -220
- package/dist/panels/ChartPanel.js.map +1 -1
- package/dist/panels/ChartPanelUtils.js +3 -4
- package/dist/panels/ChartPanelUtils.js.map +1 -1
- package/dist/panels/CommandHistoryPanel.js +33 -52
- package/dist/panels/CommandHistoryPanel.js.map +1 -1
- package/dist/panels/ConsolePanel.js +68 -130
- package/dist/panels/ConsolePanel.js.map +1 -1
- package/dist/panels/CorePanel.js +6 -18
- package/dist/panels/CorePanel.js.map +1 -1
- package/dist/panels/DropdownFilterPanel.js +109 -165
- package/dist/panels/DropdownFilterPanel.js.map +1 -1
- package/dist/panels/FileExplorerPanel.js +30 -55
- package/dist/panels/FileExplorerPanel.js.map +1 -1
- package/dist/panels/FilterSetManager.js +81 -141
- package/dist/panels/FilterSetManager.js.map +1 -1
- package/dist/panels/FilterSetManagerPanel.js +68 -87
- package/dist/panels/FilterSetManagerPanel.js.map +1 -1
- package/dist/panels/InputFilterPanel.js +45 -68
- package/dist/panels/InputFilterPanel.js.map +1 -1
- package/dist/panels/IrisGridPanel.js +197 -272
- package/dist/panels/IrisGridPanel.js.map +1 -1
- package/dist/panels/IrisGridPanelTooltip.js +1 -3
- package/dist/panels/IrisGridPanelTooltip.js.map +1 -1
- package/dist/panels/LogPanel.js +6 -13
- package/dist/panels/LogPanel.js.map +1 -1
- package/dist/panels/MarkdownNotebook.js +28 -50
- package/dist/panels/MarkdownNotebook.js.map +1 -1
- package/dist/panels/MarkdownPanel.js +19 -38
- package/dist/panels/MarkdownPanel.js.map +1 -1
- package/dist/panels/NotebookPanel.js +157 -292
- package/dist/panels/NotebookPanel.js.map +1 -1
- package/dist/panels/PandasPanel.js +5 -15
- package/dist/panels/PandasPanel.js.map +1 -1
- package/dist/panels/PandasReloadButton.js +1 -3
- package/dist/panels/PandasReloadButton.js.map +1 -1
- package/dist/panels/WidgetPanel.js +42 -51
- package/dist/panels/WidgetPanel.js.map +1 -1
- package/dist/panels/WidgetPanelTooltip.js +6 -10
- package/dist/panels/WidgetPanelTooltip.js.map +1 -1
- package/dist/useConfigureRuff.js +8 -9
- package/dist/useConfigureRuff.js.map +1 -1
- package/dist/useDashboardColumnFilters.js +4 -7
- package/dist/useDashboardColumnFilters.js.map +1 -1
- package/dist/useGridLinker.js +9 -16
- package/dist/useGridLinker.js.map +1 -1
- package/dist/useIrisGridModel.js +18 -3
- package/dist/useIrisGridModel.js.map +1 -1
- package/dist/useTablePlugin.js +27 -14
- package/dist/useTablePlugin.js.map +1 -1
- package/package.json +24 -24
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PandasWidgetPlugin.js","names":["IrisGrid","LoadingOverlay","getErrorMessage","PandasReloadButton","useIrisGridModel","jsx","_jsx","PandasWidgetPlugin","_ref","fetch","fetchResult","status","isLoading","errorMessage","error","model","reload","children","onClick"],"sources":["../src/PandasWidgetPlugin.tsx"],"sourcesContent":["import { type WidgetComponentProps } from '@deephaven/plugin';\nimport { type dh } from '@deephaven/jsapi-types';\nimport IrisGrid from '@deephaven/iris-grid';\nimport { LoadingOverlay } from '@deephaven/components';\nimport { getErrorMessage } from '@deephaven/utils';\nimport { PandasReloadButton } from './panels/PandasReloadButton';\nimport { useIrisGridModel } from './useIrisGridModel';\n\nexport function PandasWidgetPlugin({\n fetch,\n}: WidgetComponentProps<dh.Table>): JSX.Element | null {\n const fetchResult = useIrisGridModel(fetch);\n\n if (fetchResult.status === 'loading') {\n return (\n <LoadingOverlay isLoading data-testid=\"pandas-widget-plugin-loading\" />\n );\n }\n\n if (fetchResult.status === 'error') {\n return (\n <LoadingOverlay\n errorMessage={getErrorMessage(fetchResult.error)}\n isLoading={false}\n data-testid=\"pandas-widget-plugin-loading-error\"\n />\n );\n }\n\n const { model, reload } = fetchResult;\n return (\n <IrisGrid model={model}>\n <PandasReloadButton onClick={reload} />\n </IrisGrid>\n );\n}\n\nexport default PandasWidgetPlugin;\n"],"mappings":"AAEA,OAAOA,QAAQ,MAAM,sBAAsB;AAC3C,SAASC,cAAc,QAAQ,uBAAuB;AACtD,SAASC,eAAe,QAAQ,kBAAkB;AAAC,SAC1CC,kBAAkB;AAAA,SAClBC,gBAAgB;AAAA,SAAAC,GAAA,IAAAC,IAAA;AAEzB,OAAO,SAASC,kBAAkBA,CAAAC,IAAA,EAEqB;EAAA,
|
|
1
|
+
{"version":3,"file":"PandasWidgetPlugin.js","names":["IrisGrid","LoadingOverlay","getErrorMessage","PandasReloadButton","useIrisGridModel","jsx","_jsx","PandasWidgetPlugin","_ref","fetch","fetchResult","status","isLoading","errorMessage","error","model","reload","children","onClick"],"sources":["../src/PandasWidgetPlugin.tsx"],"sourcesContent":["import { type WidgetComponentProps } from '@deephaven/plugin';\nimport { type dh } from '@deephaven/jsapi-types';\nimport IrisGrid from '@deephaven/iris-grid';\nimport { LoadingOverlay } from '@deephaven/components';\nimport { getErrorMessage } from '@deephaven/utils';\nimport { PandasReloadButton } from './panels/PandasReloadButton';\nimport { useIrisGridModel } from './useIrisGridModel';\n\nexport function PandasWidgetPlugin({\n fetch,\n}: WidgetComponentProps<dh.Table>): JSX.Element | null {\n const fetchResult = useIrisGridModel(fetch);\n\n if (fetchResult.status === 'loading') {\n return (\n <LoadingOverlay isLoading data-testid=\"pandas-widget-plugin-loading\" />\n );\n }\n\n if (fetchResult.status === 'error') {\n return (\n <LoadingOverlay\n errorMessage={getErrorMessage(fetchResult.error)}\n isLoading={false}\n data-testid=\"pandas-widget-plugin-loading-error\"\n />\n );\n }\n\n const { model, reload } = fetchResult;\n return (\n <IrisGrid model={model}>\n <PandasReloadButton onClick={reload} />\n </IrisGrid>\n );\n}\n\nexport default PandasWidgetPlugin;\n"],"mappings":"AAEA,OAAOA,QAAQ,MAAM,sBAAsB;AAC3C,SAASC,cAAc,QAAQ,uBAAuB;AACtD,SAASC,eAAe,QAAQ,kBAAkB;AAAC,SAC1CC,kBAAkB;AAAA,SAClBC,gBAAgB;AAAA,SAAAC,GAAA,IAAAC,IAAA;AAEzB,OAAO,SAASC,kBAAkBA,CAAAC,IAAA,EAEqB;EAAA,IADrDC,KAAK,GAAAD,IAAA,CAALC,KAAK;EAEL,IAAMC,WAAW,GAAGN,gBAAgB,CAACK,KAAK,CAAC;EAE3C,IAAIC,WAAW,CAACC,MAAM,KAAK,SAAS,EAAE;IACpC,oBACEL,IAAA,CAACL,cAAc;MAACW,SAAS;MAAC,eAAY;IAA8B,CAAE,CAAC;EAE3E;EAEA,IAAIF,WAAW,CAACC,MAAM,KAAK,OAAO,EAAE;IAClC,oBACEL,IAAA,CAACL,cAAc;MACbY,YAAY,EAAEX,eAAe,CAACQ,WAAW,CAACI,KAAK,CAAE;MACjDF,SAAS,EAAE,KAAM;MACjB,eAAY;IAAoC,CACjD,CAAC;EAEN;EAEA,IAAQG,KAAK,GAAaL,WAAW,CAA7BK,KAAK;IAAEC,MAAM,GAAKN,WAAW,CAAtBM,MAAM;EACrB,oBACEV,IAAA,CAACN,QAAQ;IAACe,KAAK,EAAEA,KAAM;IAAAE,QAAA,eACrBX,IAAA,CAACH,kBAAkB;MAACe,OAAO,EAAEF;IAAO,CAAE;EAAC,CAC/B,CAAC;AAEf;AAEA,eAAeT,kBAAkB","ignoreList":[]}
|
|
@@ -3,16 +3,14 @@ import { LayoutUtils, useLayoutManager, usePanelId } from '@deephaven/dashboard'
|
|
|
3
3
|
import useLoadTablePlugin from "./useLoadTablePlugin.js";
|
|
4
4
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
5
5
|
export var TablePluginWrapper = /*#__PURE__*/forwardRef((_ref, ref) => {
|
|
6
|
-
var
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
onStateChange
|
|
15
|
-
} = _ref;
|
|
6
|
+
var name = _ref.name,
|
|
7
|
+
model = _ref.model,
|
|
8
|
+
filter = _ref.filter,
|
|
9
|
+
fetchColumns = _ref.fetchColumns,
|
|
10
|
+
selectedRanges = _ref.selectedRanges,
|
|
11
|
+
irisGridRef = _ref.irisGridRef,
|
|
12
|
+
pluginState = _ref.pluginState,
|
|
13
|
+
onStateChange = _ref.onStateChange;
|
|
16
14
|
var loadPlugin = useLoadTablePlugin();
|
|
17
15
|
var Plugin = useMemo(() => loadPlugin(name), [loadPlugin, name]);
|
|
18
16
|
var layoutManager = useLayoutManager();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TablePluginWrapper.js","names":["forwardRef","useMemo","LayoutUtils","useLayoutManager","usePanelId","useLoadTablePlugin","jsx","_jsx","TablePluginWrapper","_ref","ref","name","model","filter","fetchColumns","selectedRanges","irisGridRef","pluginState","onStateChange","loadPlugin","Plugin","layoutManager","panelId","panelName","_panelItem$config$tit","panelItem","getContentItemById","root","config","title","panel","irisGrid","getTableName","className","children","table","tableName","displayName"],"sources":["../src/TablePluginWrapper.tsx"],"sourcesContent":["import { forwardRef, useMemo } from 'react';\nimport {\n type TablePluginProps,\n type TablePluginElement,\n} from '@deephaven/plugin';\nimport { type IrisGridType } from '@deephaven/iris-grid';\nimport {\n LayoutUtils,\n useLayoutManager,\n usePanelId,\n} from '@deephaven/dashboard';\nimport useLoadTablePlugin from './useLoadTablePlugin';\n\nexport const TablePluginWrapper = forwardRef(\n (\n {\n name,\n model,\n filter,\n fetchColumns,\n selectedRanges,\n irisGridRef,\n pluginState,\n onStateChange,\n }: Pick<\n TablePluginProps,\n | 'model'\n | 'filter'\n | 'fetchColumns'\n | 'selectedRanges'\n | 'pluginState'\n | 'onStateChange'\n > & {\n name: string;\n irisGridRef: React.MutableRefObject<IrisGridType | null>;\n },\n ref: React.Ref<TablePluginElement>\n ): JSX.Element | null => {\n const loadPlugin = useLoadTablePlugin();\n const Plugin = useMemo(() => loadPlugin(name), [loadPlugin, name]);\n\n const layoutManager = useLayoutManager();\n const panelId = usePanelId();\n const panelName = useMemo(() => {\n if (panelId == null) {\n return 'unknown';\n }\n\n const panelItem = LayoutUtils.getContentItemById(\n layoutManager.root,\n panelId\n );\n\n return panelItem?.config.title ?? 'unknown';\n }, [layoutManager.root, panelId]);\n\n const panel = useMemo(\n () => ({\n irisGrid: irisGridRef,\n getTableName: () => panelName,\n }),\n [irisGridRef, panelName]\n );\n\n return (\n <div className=\"iris-grid-plugin\">\n <Plugin\n ref={ref}\n filter={filter}\n fetchColumns={fetchColumns}\n model={model}\n table={model.table}\n tableName={panelName}\n selectedRanges={selectedRanges}\n onStateChange={onStateChange}\n pluginState={pluginState}\n // Mimic the panel containing `irisGrid.current` for backwards compatibility\n // since we don't have an IrisGridPanel to use here.\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n panel={panel}\n />\n </div>\n );\n }\n);\n\nTablePluginWrapper.displayName = 'TablePluginWrapper';\n\nexport default TablePluginWrapper;\n"],"mappings":"AAAA,SAASA,UAAU,EAAEC,OAAO,QAAQ,OAAO;AAM3C,SACEC,WAAW,EACXC,gBAAgB,EAChBC,UAAU,QACL,sBAAsB;AAAC,OACvBC,kBAAkB;AAAA,SAAAC,GAAA,IAAAC,IAAA;AAEzB,OAAO,IAAMC,kBAAkB,gBAAGR,UAAU,CAC1C,CAAAS,IAAA,EAsBEC,GAAkC,KACX;EAAA,
|
|
1
|
+
{"version":3,"file":"TablePluginWrapper.js","names":["forwardRef","useMemo","LayoutUtils","useLayoutManager","usePanelId","useLoadTablePlugin","jsx","_jsx","TablePluginWrapper","_ref","ref","name","model","filter","fetchColumns","selectedRanges","irisGridRef","pluginState","onStateChange","loadPlugin","Plugin","layoutManager","panelId","panelName","_panelItem$config$tit","panelItem","getContentItemById","root","config","title","panel","irisGrid","getTableName","className","children","table","tableName","displayName"],"sources":["../src/TablePluginWrapper.tsx"],"sourcesContent":["import { forwardRef, useMemo } from 'react';\nimport {\n type TablePluginProps,\n type TablePluginElement,\n} from '@deephaven/plugin';\nimport { type IrisGridType } from '@deephaven/iris-grid';\nimport {\n LayoutUtils,\n useLayoutManager,\n usePanelId,\n} from '@deephaven/dashboard';\nimport useLoadTablePlugin from './useLoadTablePlugin';\n\nexport const TablePluginWrapper = forwardRef(\n (\n {\n name,\n model,\n filter,\n fetchColumns,\n selectedRanges,\n irisGridRef,\n pluginState,\n onStateChange,\n }: Pick<\n TablePluginProps,\n | 'model'\n | 'filter'\n | 'fetchColumns'\n | 'selectedRanges'\n | 'pluginState'\n | 'onStateChange'\n > & {\n name: string;\n irisGridRef: React.MutableRefObject<IrisGridType | null>;\n },\n ref: React.Ref<TablePluginElement>\n ): JSX.Element | null => {\n const loadPlugin = useLoadTablePlugin();\n const Plugin = useMemo(() => loadPlugin(name), [loadPlugin, name]);\n\n const layoutManager = useLayoutManager();\n const panelId = usePanelId();\n const panelName = useMemo(() => {\n if (panelId == null) {\n return 'unknown';\n }\n\n const panelItem = LayoutUtils.getContentItemById(\n layoutManager.root,\n panelId\n );\n\n return panelItem?.config.title ?? 'unknown';\n }, [layoutManager.root, panelId]);\n\n const panel = useMemo(\n () => ({\n irisGrid: irisGridRef,\n getTableName: () => panelName,\n }),\n [irisGridRef, panelName]\n );\n\n return (\n <div className=\"iris-grid-plugin\">\n <Plugin\n ref={ref}\n filter={filter}\n fetchColumns={fetchColumns}\n model={model}\n table={model.table}\n tableName={panelName}\n selectedRanges={selectedRanges}\n onStateChange={onStateChange}\n pluginState={pluginState}\n // Mimic the panel containing `irisGrid.current` for backwards compatibility\n // since we don't have an IrisGridPanel to use here.\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n panel={panel}\n />\n </div>\n );\n }\n);\n\nTablePluginWrapper.displayName = 'TablePluginWrapper';\n\nexport default TablePluginWrapper;\n"],"mappings":"AAAA,SAASA,UAAU,EAAEC,OAAO,QAAQ,OAAO;AAM3C,SACEC,WAAW,EACXC,gBAAgB,EAChBC,UAAU,QACL,sBAAsB;AAAC,OACvBC,kBAAkB;AAAA,SAAAC,GAAA,IAAAC,IAAA;AAEzB,OAAO,IAAMC,kBAAkB,gBAAGR,UAAU,CAC1C,CAAAS,IAAA,EAsBEC,GAAkC,KACX;EAAA,IArBrBC,IAAI,GAAAF,IAAA,CAAJE,IAAI;IACJC,KAAK,GAAAH,IAAA,CAALG,KAAK;IACLC,MAAM,GAAAJ,IAAA,CAANI,MAAM;IACNC,YAAY,GAAAL,IAAA,CAAZK,YAAY;IACZC,cAAc,GAAAN,IAAA,CAAdM,cAAc;IACdC,WAAW,GAAAP,IAAA,CAAXO,WAAW;IACXC,WAAW,GAAAR,IAAA,CAAXQ,WAAW;IACXC,aAAa,GAAAT,IAAA,CAAbS,aAAa;EAef,IAAMC,UAAU,GAAGd,kBAAkB,CAAC,CAAC;EACvC,IAAMe,MAAM,GAAGnB,OAAO,CAAC,MAAMkB,UAAU,CAACR,IAAI,CAAC,EAAE,CAACQ,UAAU,EAAER,IAAI,CAAC,CAAC;EAElE,IAAMU,aAAa,GAAGlB,gBAAgB,CAAC,CAAC;EACxC,IAAMmB,OAAO,GAAGlB,UAAU,CAAC,CAAC;EAC5B,IAAMmB,SAAS,GAAGtB,OAAO,CAAC,MAAM;IAAA,IAAAuB,qBAAA;IAC9B,IAAIF,OAAO,IAAI,IAAI,EAAE;MACnB,OAAO,SAAS;IAClB;IAEA,IAAMG,SAAS,GAAGvB,WAAW,CAACwB,kBAAkB,CAC9CL,aAAa,CAACM,IAAI,EAClBL,OACF,CAAC;IAED,QAAAE,qBAAA,GAAOC,SAAS,aAATA,SAAS,uBAATA,SAAS,CAAEG,MAAM,CAACC,KAAK,cAAAL,qBAAA,cAAAA,qBAAA,GAAI,SAAS;EAC7C,CAAC,EAAE,CAACH,aAAa,CAACM,IAAI,EAAEL,OAAO,CAAC,CAAC;EAEjC,IAAMQ,KAAK,GAAG7B,OAAO,CACnB,OAAO;IACL8B,QAAQ,EAAEf,WAAW;IACrBgB,YAAY,EAAEA,CAAA,KAAMT;EACtB,CAAC,CAAC,EACF,CAACP,WAAW,EAAEO,SAAS,CACzB,CAAC;EAED,oBACEhB,IAAA;IAAK0B,SAAS,EAAC,kBAAkB;IAAAC,QAAA,eAC/B3B,IAAA,CAACa,MAAM;MACLV,GAAG,EAAEA,GAAI;MACTG,MAAM,EAAEA,MAAO;MACfC,YAAY,EAAEA,YAAa;MAC3BF,KAAK,EAAEA,KAAM;MACbuB,KAAK,EAAEvB,KAAK,CAACuB,KAAM;MACnBC,SAAS,EAAEb,SAAU;MACrBR,cAAc,EAAEA,cAAe;MAC/BG,aAAa,EAAEA,aAAc;MAC7BD,WAAW,EAAEA;MACb;MACA;MACA;MACA;MAAA;MACAa,KAAK,EAAEA;IAAM,CACd;EAAC,CACC,CAAC;AAEV,CACF,CAAC;AAEDtB,kBAAkB,CAAC6B,WAAW,GAAG,oBAAoB;AAErD,eAAe7B,kBAAkB","ignoreList":[]}
|
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
|
|
2
|
+
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
3
|
+
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
|
|
4
|
+
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
|
|
5
|
+
function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
|
|
6
|
+
function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
|
|
1
7
|
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
2
8
|
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
3
9
|
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; }
|
|
@@ -22,9 +28,7 @@ export function WrapWidgetPlugin(plugin) {
|
|
|
22
28
|
var _metadata$type, _metadata$name;
|
|
23
29
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
24
30
|
var C = plugin.component;
|
|
25
|
-
var
|
|
26
|
-
metadata
|
|
27
|
-
} = props;
|
|
31
|
+
var metadata = props.metadata;
|
|
28
32
|
var panelDescriptor = _objectSpread(_objectSpread({}, metadata), {}, {
|
|
29
33
|
type: (_metadata$type = metadata === null || metadata === void 0 ? void 0 : metadata.type) !== null && _metadata$type !== void 0 ? _metadata$type : plugin.type,
|
|
30
34
|
name: (_metadata$name = metadata === null || metadata === void 0 ? void 0 : metadata.name) !== null && _metadata$name !== void 0 ? _metadata$name : 'Widget'
|
|
@@ -128,22 +132,17 @@ export function WidgetLoaderPlugin(props) {
|
|
|
128
132
|
return validEntries;
|
|
129
133
|
}, [plugins]);
|
|
130
134
|
assertIsDashboardPluginProps(props);
|
|
131
|
-
var
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
registerComponent
|
|
135
|
-
} = props;
|
|
135
|
+
var id = props.id,
|
|
136
|
+
layout = props.layout,
|
|
137
|
+
registerComponent = props.registerComponent;
|
|
136
138
|
var handlePanelOpen = useCallback(_ref => {
|
|
137
139
|
var _widget$name;
|
|
138
|
-
var
|
|
139
|
-
|
|
140
|
-
panelId = nanoid(),
|
|
141
|
-
fetch,
|
|
142
|
-
widget
|
|
143
|
-
|
|
144
|
-
var {
|
|
145
|
-
type
|
|
146
|
-
} = widget;
|
|
140
|
+
var dragEvent = _ref.dragEvent,
|
|
141
|
+
_ref$panelId = _ref.panelId,
|
|
142
|
+
panelId = _ref$panelId === void 0 ? nanoid() : _ref$panelId,
|
|
143
|
+
fetch = _ref.fetch,
|
|
144
|
+
widget = _ref.widget;
|
|
145
|
+
var type = widget.type;
|
|
147
146
|
var typeInfo = type != null ? supportedTypes.get(type) : null;
|
|
148
147
|
if (typeInfo == null) {
|
|
149
148
|
return;
|
|
@@ -161,9 +160,7 @@ export function WidgetLoaderPlugin(props) {
|
|
|
161
160
|
title: name,
|
|
162
161
|
id: panelId
|
|
163
162
|
};
|
|
164
|
-
var
|
|
165
|
-
root
|
|
166
|
-
} = layout;
|
|
163
|
+
var root = layout.root;
|
|
167
164
|
LayoutUtils.openComponent({
|
|
168
165
|
root,
|
|
169
166
|
config,
|
|
@@ -196,21 +193,19 @@ export function WidgetLoaderPlugin(props) {
|
|
|
196
193
|
}
|
|
197
194
|
});
|
|
198
195
|
log.debug('Registering widget components', [...uniquePluginInfos.entries()].map(_ref2 => {
|
|
199
|
-
var
|
|
196
|
+
var _ref3 = _slicedToArray(_ref2, 2),
|
|
197
|
+
name = _ref3[0],
|
|
198
|
+
info = _ref3[1];
|
|
200
199
|
return {
|
|
201
200
|
plugin: name,
|
|
202
201
|
middleware: info.middleware.map(m => m.name),
|
|
203
202
|
hasPanel: info.basePlugin.panelComponent != null
|
|
204
203
|
};
|
|
205
204
|
}));
|
|
206
|
-
var deregisterFns = [...uniquePluginInfos.values()].map(
|
|
207
|
-
var
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
} = _ref3;
|
|
211
|
-
var {
|
|
212
|
-
panelComponent
|
|
213
|
-
} = basePlugin;
|
|
205
|
+
var deregisterFns = [...uniquePluginInfos.values()].map(_ref4 => {
|
|
206
|
+
var basePlugin = _ref4.basePlugin,
|
|
207
|
+
middleware = _ref4.middleware;
|
|
208
|
+
var panelComponent = basePlugin.panelComponent;
|
|
214
209
|
if (panelComponent == null) {
|
|
215
210
|
// No panel component - chain the widget components and wrap in default panel
|
|
216
211
|
log.debug("Chaining widget components for ".concat(basePlugin.name, " (no panel component, using default wrapper)"));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WidgetLoaderPlugin.js","names":["useMemo","useCallback","useEffect","forwardRef","nanoid","assertIsDashboardPluginProps","LayoutUtils","canHaveRef","usePanelOpenListener","Log","isWidgetPlugin","isWidgetMiddlewarePlugin","createChainedComponent","createChainedPanelComponent","usePlugins","WidgetPanel","jsx","_jsx","log","module","WrapWidgetPlugin","plugin","_plugin$component$dis","Wrapper","props","ref","_metadata$type","_metadata$name","C","component","metadata","panelDescriptor","_objectSpread","type","name","hasRef","className","concat","descriptor","children","displayName","WidgetLoaderPlugin","plugins","supportedTypes","typeMap","Map","forEach","isMiddleware","flat","supportedType","existing","get","middleware","push","debug","set","basePlugin","warn","validEntries","info","id","layout","registerComponent","handlePanelOpen","_ref","_widget$name","dragEvent","panelId","fetch","widget","typeInfo","panelProps","localDashboardId","config","title","root","openComponent","uniquePluginInfos","_type","has","existingInfo","m","includes","entries","map","_ref2","hasPanel","panelComponent","deregisterFns","values","_ref3","chainedComponent","wrappedPlugin","chainedPanelComponent","deregister","eventHub"],"sources":["../src/WidgetLoaderPlugin.tsx"],"sourcesContent":["import { useMemo, useCallback, useEffect, forwardRef } from 'react';\nimport type { ReactComponentConfig } from '@deephaven/golden-layout';\nimport { nanoid } from 'nanoid';\nimport {\n assertIsDashboardPluginProps,\n type DashboardPluginComponentProps,\n type DehydratedDashboardPanelProps,\n type PanelOpenEventDetail,\n LayoutUtils,\n type PanelProps,\n canHaveRef,\n usePanelOpenListener,\n} from '@deephaven/dashboard';\nimport Log from '@deephaven/log';\nimport {\n isWidgetPlugin,\n isWidgetMiddlewarePlugin,\n createChainedComponent,\n createChainedPanelComponent,\n usePlugins,\n type WidgetPlugin,\n type WidgetMiddlewarePlugin,\n} from '@deephaven/plugin';\nimport { WidgetPanel } from './panels';\nimport { type WidgetPanelDescriptor } from './panels/WidgetPanelTypes';\n\nconst log = Log.module('WidgetLoaderPlugin');\n\n/**\n * Information about a widget type including its base plugin and any middleware.\n */\ninterface WidgetTypeInfo {\n /** The base plugin that handles this widget type, or null if only middleware registered so far */\n basePlugin: WidgetPlugin | null;\n /** Middleware plugins to apply, in order from outermost to innermost */\n middleware: WidgetMiddlewarePlugin[];\n}\n\nexport function WrapWidgetPlugin(\n plugin: WidgetPlugin\n): React.ForwardRefExoticComponent<PanelProps & React.RefAttributes<unknown>> {\n function Wrapper(props: PanelProps, ref: React.ForwardedRef<unknown>) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const C = plugin.component as any;\n const { metadata } = props;\n\n const panelDescriptor: WidgetPanelDescriptor = {\n ...metadata,\n type: metadata?.type ?? plugin.type,\n name: metadata?.name ?? 'Widget',\n };\n\n const hasRef = canHaveRef(C);\n const className = `widget-loader-${panelDescriptor.type}`;\n\n return (\n <WidgetPanel\n descriptor={panelDescriptor}\n className={className}\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...props}\n >\n {hasRef ? (\n <C\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...props}\n ref={ref}\n />\n ) : (\n <C\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...props}\n />\n )}\n </WidgetPanel>\n );\n }\n\n Wrapper.displayName = `WidgetLoaderPlugin(${\n plugin.component.displayName ?? plugin.name\n })`;\n\n return forwardRef(Wrapper);\n}\n\n/**\n * Widget to automatically open any supported WidgetPlugin types as panels\n * if the widget is emitted from the server as the result of executed code.\n *\n * Does not open panels for widgets that are not supported by any plugins.\n * Does not open panels for widgets that are a component of a larger widget or UI element.\n *\n * Supports plugin chaining via middleware plugins. When multiple plugins\n * support the same widget type, middleware plugins are chained around\n * the base plugin in registration order.\n *\n * @param props Dashboard plugin props\n * @returns React element\n */\nexport function WidgetLoaderPlugin(\n props: Partial<DashboardPluginComponentProps>\n): JSX.Element | null {\n const plugins = usePlugins();\n\n /**\n * Build a map of widget types to their plugin chain info.\n * For each type, we have a base plugin and a list of middleware to apply.\n */\n const supportedTypes = useMemo(() => {\n const typeMap = new Map<string, WidgetTypeInfo>();\n\n plugins.forEach(plugin => {\n const isMiddleware = isWidgetMiddlewarePlugin(plugin);\n if (!isWidgetPlugin(plugin) && !isMiddleware) {\n return;\n }\n\n [plugin.supportedTypes].flat().forEach(supportedType => {\n if (supportedType == null || supportedType === '') {\n return;\n }\n\n const existing = typeMap.get(supportedType);\n\n if (isMiddleware) {\n // Add middleware to existing chain or create pending chain\n if (existing != null) {\n existing.middleware.push(plugin);\n log.debug(\n `Adding middleware ${plugin.name} to chain for type ${supportedType}`\n );\n } else {\n // No base plugin yet, create entry with just middleware\n // The base plugin will be set when a non-middleware plugin is registered\n typeMap.set(supportedType, {\n basePlugin: null,\n middleware: [plugin],\n });\n log.debug(\n `Creating pending middleware chain for type ${supportedType} with ${plugin.name}`\n );\n }\n } else {\n // Non-middleware plugin: becomes the base plugin\n if (existing != null) {\n if (existing.basePlugin != null) {\n // Already have a base plugin, warn about replacement\n log.warn(\n `Multiple WidgetPlugins handling type ${supportedType}. ` +\n `Replacing ${existing.basePlugin.name} with ${plugin.name} as base plugin`\n );\n }\n // Keep existing middleware, update the base plugin\n existing.basePlugin = plugin;\n } else {\n typeMap.set(supportedType, {\n basePlugin: plugin,\n middleware: [],\n });\n }\n log.debug(`Set base plugin ${plugin.name} for type ${supportedType}`);\n }\n });\n });\n\n // Filter out entries that only have middleware (no base plugin)\n const validEntries = new Map<\n string,\n WidgetTypeInfo & { basePlugin: WidgetPlugin }\n >();\n typeMap.forEach((info, type) => {\n if (info.basePlugin != null) {\n validEntries.set(\n type,\n info as WidgetTypeInfo & { basePlugin: WidgetPlugin }\n );\n } else {\n log.warn(\n `No base plugin found for type ${type}, middleware will not be applied`\n );\n }\n });\n\n return validEntries;\n }, [plugins]);\n\n assertIsDashboardPluginProps(props);\n const { id, layout, registerComponent } = props;\n\n const handlePanelOpen = useCallback(\n ({\n dragEvent,\n panelId = nanoid(),\n fetch,\n widget,\n }: PanelOpenEventDetail) => {\n const { type } = widget;\n const typeInfo = type != null ? supportedTypes.get(type) : null;\n if (typeInfo == null) {\n return;\n }\n const name = widget.name ?? type;\n\n const panelProps: DehydratedDashboardPanelProps & {\n fetch?: () => Promise<unknown>;\n } = {\n localDashboardId: id,\n metadata: widget,\n fetch,\n };\n\n const config: ReactComponentConfig = {\n type: 'react-component',\n component: typeInfo.basePlugin.name,\n props: panelProps,\n title: name,\n id: panelId,\n };\n\n const { root } = layout;\n LayoutUtils.openComponent({ root, config, dragEvent });\n },\n [id, layout, supportedTypes]\n );\n\n useEffect(() => {\n // Get unique base plugins (a plugin may handle multiple types)\n // supportedTypes is already filtered to entries with non-null basePlugin\n type ValidWidgetTypeInfo = WidgetTypeInfo & { basePlugin: WidgetPlugin };\n const uniquePluginInfos = new Map<string, ValidWidgetTypeInfo>();\n supportedTypes.forEach((info, _type) => {\n // Use the base plugin name as the key to get unique plugins\n if (!uniquePluginInfos.has(info.basePlugin.name)) {\n // Clone to avoid mutating the useMemo result\n uniquePluginInfos.set(info.basePlugin.name, {\n basePlugin: info.basePlugin,\n middleware: [...info.middleware],\n });\n } else {\n // Merge middleware from multiple type registrations for the same base plugin\n const existingInfo = uniquePluginInfos.get(info.basePlugin.name);\n if (existingInfo != null) {\n info.middleware.forEach(m => {\n if (!existingInfo.middleware.includes(m)) {\n existingInfo.middleware.push(m);\n }\n });\n }\n }\n });\n\n log.debug(\n 'Registering widget components',\n [...uniquePluginInfos.entries()].map(([name, info]) => ({\n plugin: name,\n middleware: info.middleware.map(m => m.name),\n hasPanel: info.basePlugin.panelComponent != null,\n }))\n );\n\n const deregisterFns = [...uniquePluginInfos.values()].map(\n ({ basePlugin, middleware }) => {\n const { panelComponent } = basePlugin;\n\n if (panelComponent == null) {\n // No panel component - chain the widget components and wrap in default panel\n log.debug(\n `Chaining widget components for ${basePlugin.name} (no panel component, using default wrapper)`\n );\n const chainedComponent = createChainedComponent(\n basePlugin.component,\n middleware\n );\n const wrappedPlugin: WidgetPlugin = {\n ...basePlugin,\n component: chainedComponent,\n };\n return registerComponent(\n basePlugin.name,\n WrapWidgetPlugin(wrappedPlugin)\n );\n }\n\n // Has panel component - chain middleware around the panel.\n // Only middleware that defines panelComponent is applied here.\n // Middleware with only component is skipped in this path.\n log.debug(\n `Chaining panel components for ${basePlugin.name} (has custom panel component)`\n );\n const chainedPanelComponent = createChainedPanelComponent(\n panelComponent,\n middleware\n );\n\n return registerComponent(basePlugin.name, chainedPanelComponent);\n }\n );\n\n return () => {\n deregisterFns.forEach(deregister => deregister());\n };\n }, [registerComponent, supportedTypes]);\n\n /**\n * Listen for panel open events so we know when to open a panel\n */\n usePanelOpenListener(layout.eventHub, handlePanelOpen);\n\n return null;\n}\n\nexport default WidgetLoaderPlugin;\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"WidgetLoaderPlugin.js","names":["useMemo","useCallback","useEffect","forwardRef","nanoid","assertIsDashboardPluginProps","LayoutUtils","canHaveRef","usePanelOpenListener","Log","isWidgetPlugin","isWidgetMiddlewarePlugin","createChainedComponent","createChainedPanelComponent","usePlugins","WidgetPanel","jsx","_jsx","log","module","WrapWidgetPlugin","plugin","_plugin$component$dis","Wrapper","props","ref","_metadata$type","_metadata$name","C","component","metadata","panelDescriptor","_objectSpread","type","name","hasRef","className","concat","descriptor","children","displayName","WidgetLoaderPlugin","plugins","supportedTypes","typeMap","Map","forEach","isMiddleware","flat","supportedType","existing","get","middleware","push","debug","set","basePlugin","warn","validEntries","info","id","layout","registerComponent","handlePanelOpen","_ref","_widget$name","dragEvent","_ref$panelId","panelId","fetch","widget","typeInfo","panelProps","localDashboardId","config","title","root","openComponent","uniquePluginInfos","_type","has","existingInfo","m","includes","entries","map","_ref2","_ref3","_slicedToArray","hasPanel","panelComponent","deregisterFns","values","_ref4","chainedComponent","wrappedPlugin","chainedPanelComponent","deregister","eventHub"],"sources":["../src/WidgetLoaderPlugin.tsx"],"sourcesContent":["import { useMemo, useCallback, useEffect, forwardRef } from 'react';\nimport type { ReactComponentConfig } from '@deephaven/golden-layout';\nimport { nanoid } from 'nanoid';\nimport {\n assertIsDashboardPluginProps,\n type DashboardPluginComponentProps,\n type DehydratedDashboardPanelProps,\n type PanelOpenEventDetail,\n LayoutUtils,\n type PanelProps,\n canHaveRef,\n usePanelOpenListener,\n} from '@deephaven/dashboard';\nimport Log from '@deephaven/log';\nimport {\n isWidgetPlugin,\n isWidgetMiddlewarePlugin,\n createChainedComponent,\n createChainedPanelComponent,\n usePlugins,\n type WidgetPlugin,\n type WidgetMiddlewarePlugin,\n} from '@deephaven/plugin';\nimport { WidgetPanel } from './panels';\nimport { type WidgetPanelDescriptor } from './panels/WidgetPanelTypes';\n\nconst log = Log.module('WidgetLoaderPlugin');\n\n/**\n * Information about a widget type including its base plugin and any middleware.\n */\ninterface WidgetTypeInfo {\n /** The base plugin that handles this widget type, or null if only middleware registered so far */\n basePlugin: WidgetPlugin | null;\n /** Middleware plugins to apply, in order from outermost to innermost */\n middleware: WidgetMiddlewarePlugin[];\n}\n\nexport function WrapWidgetPlugin(\n plugin: WidgetPlugin\n): React.ForwardRefExoticComponent<PanelProps & React.RefAttributes<unknown>> {\n function Wrapper(props: PanelProps, ref: React.ForwardedRef<unknown>) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const C = plugin.component as any;\n const { metadata } = props;\n\n const panelDescriptor: WidgetPanelDescriptor = {\n ...metadata,\n type: metadata?.type ?? plugin.type,\n name: metadata?.name ?? 'Widget',\n };\n\n const hasRef = canHaveRef(C);\n const className = `widget-loader-${panelDescriptor.type}`;\n\n return (\n <WidgetPanel\n descriptor={panelDescriptor}\n className={className}\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...props}\n >\n {hasRef ? (\n <C\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...props}\n ref={ref}\n />\n ) : (\n <C\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...props}\n />\n )}\n </WidgetPanel>\n );\n }\n\n Wrapper.displayName = `WidgetLoaderPlugin(${\n plugin.component.displayName ?? plugin.name\n })`;\n\n return forwardRef(Wrapper);\n}\n\n/**\n * Widget to automatically open any supported WidgetPlugin types as panels\n * if the widget is emitted from the server as the result of executed code.\n *\n * Does not open panels for widgets that are not supported by any plugins.\n * Does not open panels for widgets that are a component of a larger widget or UI element.\n *\n * Supports plugin chaining via middleware plugins. When multiple plugins\n * support the same widget type, middleware plugins are chained around\n * the base plugin in registration order.\n *\n * @param props Dashboard plugin props\n * @returns React element\n */\nexport function WidgetLoaderPlugin(\n props: Partial<DashboardPluginComponentProps>\n): JSX.Element | null {\n const plugins = usePlugins();\n\n /**\n * Build a map of widget types to their plugin chain info.\n * For each type, we have a base plugin and a list of middleware to apply.\n */\n const supportedTypes = useMemo(() => {\n const typeMap = new Map<string, WidgetTypeInfo>();\n\n plugins.forEach(plugin => {\n const isMiddleware = isWidgetMiddlewarePlugin(plugin);\n if (!isWidgetPlugin(plugin) && !isMiddleware) {\n return;\n }\n\n [plugin.supportedTypes].flat().forEach(supportedType => {\n if (supportedType == null || supportedType === '') {\n return;\n }\n\n const existing = typeMap.get(supportedType);\n\n if (isMiddleware) {\n // Add middleware to existing chain or create pending chain\n if (existing != null) {\n existing.middleware.push(plugin);\n log.debug(\n `Adding middleware ${plugin.name} to chain for type ${supportedType}`\n );\n } else {\n // No base plugin yet, create entry with just middleware\n // The base plugin will be set when a non-middleware plugin is registered\n typeMap.set(supportedType, {\n basePlugin: null,\n middleware: [plugin],\n });\n log.debug(\n `Creating pending middleware chain for type ${supportedType} with ${plugin.name}`\n );\n }\n } else {\n // Non-middleware plugin: becomes the base plugin\n if (existing != null) {\n if (existing.basePlugin != null) {\n // Already have a base plugin, warn about replacement\n log.warn(\n `Multiple WidgetPlugins handling type ${supportedType}. ` +\n `Replacing ${existing.basePlugin.name} with ${plugin.name} as base plugin`\n );\n }\n // Keep existing middleware, update the base plugin\n existing.basePlugin = plugin;\n } else {\n typeMap.set(supportedType, {\n basePlugin: plugin,\n middleware: [],\n });\n }\n log.debug(`Set base plugin ${plugin.name} for type ${supportedType}`);\n }\n });\n });\n\n // Filter out entries that only have middleware (no base plugin)\n const validEntries = new Map<\n string,\n WidgetTypeInfo & { basePlugin: WidgetPlugin }\n >();\n typeMap.forEach((info, type) => {\n if (info.basePlugin != null) {\n validEntries.set(\n type,\n info as WidgetTypeInfo & { basePlugin: WidgetPlugin }\n );\n } else {\n log.warn(\n `No base plugin found for type ${type}, middleware will not be applied`\n );\n }\n });\n\n return validEntries;\n }, [plugins]);\n\n assertIsDashboardPluginProps(props);\n const { id, layout, registerComponent } = props;\n\n const handlePanelOpen = useCallback(\n ({\n dragEvent,\n panelId = nanoid(),\n fetch,\n widget,\n }: PanelOpenEventDetail) => {\n const { type } = widget;\n const typeInfo = type != null ? supportedTypes.get(type) : null;\n if (typeInfo == null) {\n return;\n }\n const name = widget.name ?? type;\n\n const panelProps: DehydratedDashboardPanelProps & {\n fetch?: () => Promise<unknown>;\n } = {\n localDashboardId: id,\n metadata: widget,\n fetch,\n };\n\n const config: ReactComponentConfig = {\n type: 'react-component',\n component: typeInfo.basePlugin.name,\n props: panelProps,\n title: name,\n id: panelId,\n };\n\n const { root } = layout;\n LayoutUtils.openComponent({ root, config, dragEvent });\n },\n [id, layout, supportedTypes]\n );\n\n useEffect(() => {\n // Get unique base plugins (a plugin may handle multiple types)\n // supportedTypes is already filtered to entries with non-null basePlugin\n type ValidWidgetTypeInfo = WidgetTypeInfo & { basePlugin: WidgetPlugin };\n const uniquePluginInfos = new Map<string, ValidWidgetTypeInfo>();\n supportedTypes.forEach((info, _type) => {\n // Use the base plugin name as the key to get unique plugins\n if (!uniquePluginInfos.has(info.basePlugin.name)) {\n // Clone to avoid mutating the useMemo result\n uniquePluginInfos.set(info.basePlugin.name, {\n basePlugin: info.basePlugin,\n middleware: [...info.middleware],\n });\n } else {\n // Merge middleware from multiple type registrations for the same base plugin\n const existingInfo = uniquePluginInfos.get(info.basePlugin.name);\n if (existingInfo != null) {\n info.middleware.forEach(m => {\n if (!existingInfo.middleware.includes(m)) {\n existingInfo.middleware.push(m);\n }\n });\n }\n }\n });\n\n log.debug(\n 'Registering widget components',\n [...uniquePluginInfos.entries()].map(([name, info]) => ({\n plugin: name,\n middleware: info.middleware.map(m => m.name),\n hasPanel: info.basePlugin.panelComponent != null,\n }))\n );\n\n const deregisterFns = [...uniquePluginInfos.values()].map(\n ({ basePlugin, middleware }) => {\n const { panelComponent } = basePlugin;\n\n if (panelComponent == null) {\n // No panel component - chain the widget components and wrap in default panel\n log.debug(\n `Chaining widget components for ${basePlugin.name} (no panel component, using default wrapper)`\n );\n const chainedComponent = createChainedComponent(\n basePlugin.component,\n middleware\n );\n const wrappedPlugin: WidgetPlugin = {\n ...basePlugin,\n component: chainedComponent,\n };\n return registerComponent(\n basePlugin.name,\n WrapWidgetPlugin(wrappedPlugin)\n );\n }\n\n // Has panel component - chain middleware around the panel.\n // Only middleware that defines panelComponent is applied here.\n // Middleware with only component is skipped in this path.\n log.debug(\n `Chaining panel components for ${basePlugin.name} (has custom panel component)`\n );\n const chainedPanelComponent = createChainedPanelComponent(\n panelComponent,\n middleware\n );\n\n return registerComponent(basePlugin.name, chainedPanelComponent);\n }\n );\n\n return () => {\n deregisterFns.forEach(deregister => deregister());\n };\n }, [registerComponent, supportedTypes]);\n\n /**\n * Listen for panel open events so we know when to open a panel\n */\n usePanelOpenListener(layout.eventHub, handlePanelOpen);\n\n return null;\n}\n\nexport default WidgetLoaderPlugin;\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
|
|
2
|
+
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
3
|
+
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
|
|
4
|
+
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
|
|
5
|
+
function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
|
|
6
|
+
function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
|
|
1
7
|
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
8
|
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
|
|
3
9
|
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); }
|
|
@@ -24,9 +30,7 @@ export class DropdownFilter extends Component {
|
|
|
24
30
|
super(props);
|
|
25
31
|
_defineProperty(this, "dropdownRef", void 0);
|
|
26
32
|
_defineProperty(this, "getCompatibleColumns", memoize((source, columns) => source != null ? columns.filter(_ref => {
|
|
27
|
-
var
|
|
28
|
-
type
|
|
29
|
-
} = _ref;
|
|
33
|
+
var type = _ref.type;
|
|
30
34
|
return type !== undefined && TableUtils.isCompatibleType(type, source.columnType);
|
|
31
35
|
}) : []));
|
|
32
36
|
_defineProperty(this, "getColumnOptions", memoize((columns, selectedColumn) => {
|
|
@@ -58,10 +62,9 @@ export class DropdownFilter extends Component {
|
|
|
58
62
|
children: val !== null && val !== void 0 ? val : '(null)'
|
|
59
63
|
}, "".concat(index, "/").concat(val)))]));
|
|
60
64
|
_defineProperty(this, "getItemLabel", memoizee((columns, index) => {
|
|
61
|
-
var
|
|
62
|
-
name,
|
|
63
|
-
type
|
|
64
|
-
} = columns[index];
|
|
65
|
+
var _columns$index = columns[index],
|
|
66
|
+
name = _columns$index.name,
|
|
67
|
+
type = _columns$index.type;
|
|
65
68
|
if (index > 0 && columns[index - 1].name === name || index < columns.length - 1 && columns[index + 1].name === name) {
|
|
66
69
|
var shortType = type.substring(type.lastIndexOf('.') + 1);
|
|
67
70
|
return "".concat(name, " (").concat(shortType, ")");
|
|
@@ -71,14 +74,11 @@ export class DropdownFilter extends Component {
|
|
|
71
74
|
max: 1000
|
|
72
75
|
}));
|
|
73
76
|
_defineProperty(this, "sendUpdate", debounce(() => {
|
|
74
|
-
var
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
value,
|
|
80
|
-
isValueShown
|
|
81
|
-
} = this.state;
|
|
77
|
+
var onChange = this.props.onChange;
|
|
78
|
+
var _this$state = this.state,
|
|
79
|
+
column = _this$state.column,
|
|
80
|
+
value = _this$state.value,
|
|
81
|
+
isValueShown = _this$state.isValueShown;
|
|
82
82
|
onChange({
|
|
83
83
|
column,
|
|
84
84
|
isValueShown,
|
|
@@ -93,11 +93,9 @@ export class DropdownFilter extends Component {
|
|
|
93
93
|
this.handleDropdownKeyPress = this.handleDropdownKeyPress.bind(this);
|
|
94
94
|
this.handleValueChange = this.handleValueChange.bind(this);
|
|
95
95
|
this.dropdownRef = /*#__PURE__*/React.createRef();
|
|
96
|
-
var
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
value: _value
|
|
100
|
-
} = props;
|
|
96
|
+
var _column = props.column,
|
|
97
|
+
_isValueShown = props.isValueShown,
|
|
98
|
+
_value = props.value;
|
|
101
99
|
this.state = {
|
|
102
100
|
column: _column,
|
|
103
101
|
id: nanoid(),
|
|
@@ -108,16 +106,14 @@ export class DropdownFilter extends Component {
|
|
|
108
106
|
};
|
|
109
107
|
}
|
|
110
108
|
componentDidUpdate(prevProps, prevState) {
|
|
111
|
-
var
|
|
112
|
-
source,
|
|
113
|
-
values,
|
|
114
|
-
isLoaded
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
isValueShown
|
|
120
|
-
} = this.state;
|
|
109
|
+
var _this$props = this.props,
|
|
110
|
+
source = _this$props.source,
|
|
111
|
+
values = _this$props.values,
|
|
112
|
+
isLoaded = _this$props.isLoaded;
|
|
113
|
+
var _this$state2 = this.state,
|
|
114
|
+
column = _this$state2.column,
|
|
115
|
+
value = _this$state2.value,
|
|
116
|
+
isValueShown = _this$state2.isValueShown;
|
|
121
117
|
if (isLoaded) {
|
|
122
118
|
if (source !== prevProps.source) {
|
|
123
119
|
this.sourceUpdated();
|
|
@@ -148,10 +144,9 @@ export class DropdownFilter extends Component {
|
|
|
148
144
|
});
|
|
149
145
|
return;
|
|
150
146
|
}
|
|
151
|
-
var
|
|
152
|
-
columns
|
|
153
|
-
source
|
|
154
|
-
} = this.props;
|
|
147
|
+
var _this$props2 = this.props,
|
|
148
|
+
allColumns = _this$props2.columns,
|
|
149
|
+
source = _this$props2.source;
|
|
155
150
|
var columns = this.getCompatibleColumns(source, allColumns);
|
|
156
151
|
this.setState({
|
|
157
152
|
selectedColumn: columns[parseInt(value, 10)]
|
|
@@ -171,9 +166,7 @@ export class DropdownFilter extends Component {
|
|
|
171
166
|
var index = parseInt(valueIndex, 10);
|
|
172
167
|
// Default empty string value for 'clear filter'
|
|
173
168
|
var value = '';
|
|
174
|
-
var
|
|
175
|
-
values
|
|
176
|
-
} = this.props;
|
|
169
|
+
var values = this.props.values;
|
|
177
170
|
if (index >= 0 && index < values.length) {
|
|
178
171
|
value = values[index];
|
|
179
172
|
} else {
|
|
@@ -186,9 +179,7 @@ export class DropdownFilter extends Component {
|
|
|
186
179
|
}
|
|
187
180
|
handleSettingsCancel() {
|
|
188
181
|
this.setState(_ref2 => {
|
|
189
|
-
var
|
|
190
|
-
column
|
|
191
|
-
} = _ref2;
|
|
182
|
+
var column = _ref2.column;
|
|
192
183
|
return {
|
|
193
184
|
selectedColumn: column,
|
|
194
185
|
isValueShown: true
|
|
@@ -197,11 +188,9 @@ export class DropdownFilter extends Component {
|
|
|
197
188
|
}
|
|
198
189
|
handleSettingsSave() {
|
|
199
190
|
this.setState(_ref3 => {
|
|
200
|
-
var
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
value
|
|
204
|
-
} = _ref3;
|
|
191
|
+
var column = _ref3.column,
|
|
192
|
+
selectedColumn = _ref3.selectedColumn,
|
|
193
|
+
value = _ref3.value;
|
|
205
194
|
return {
|
|
206
195
|
column: selectedColumn,
|
|
207
196
|
// Reset value if column changed
|
|
@@ -231,9 +220,7 @@ export class DropdownFilter extends Component {
|
|
|
231
220
|
});
|
|
232
221
|
}
|
|
233
222
|
showSettings() {
|
|
234
|
-
var
|
|
235
|
-
column
|
|
236
|
-
} = this.state;
|
|
223
|
+
var column = this.state.column;
|
|
237
224
|
this.setState({
|
|
238
225
|
selectedColumn: column,
|
|
239
226
|
isValueShown: false
|
|
@@ -256,21 +243,17 @@ export class DropdownFilter extends Component {
|
|
|
256
243
|
|
|
257
244
|
// Called by the parent component via ref
|
|
258
245
|
setFilterState(_ref4) {
|
|
259
|
-
var
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
isValueShown
|
|
264
|
-
} = _ref4;
|
|
246
|
+
var name = _ref4.name,
|
|
247
|
+
type = _ref4.type,
|
|
248
|
+
value = _ref4.value,
|
|
249
|
+
isValueShown = _ref4.isValueShown;
|
|
265
250
|
var column = name != null && type != null ? {
|
|
266
251
|
name,
|
|
267
252
|
type
|
|
268
253
|
} : null;
|
|
269
254
|
this.setState(_ref5 => {
|
|
270
|
-
var
|
|
271
|
-
|
|
272
|
-
isValueShown: oldIsValueShown
|
|
273
|
-
} = _ref5;
|
|
255
|
+
var oldValue = _ref5.value,
|
|
256
|
+
oldIsValueShown = _ref5.isValueShown;
|
|
274
257
|
return {
|
|
275
258
|
column,
|
|
276
259
|
value: value !== null && value !== void 0 ? value : oldValue,
|
|
@@ -280,32 +263,33 @@ export class DropdownFilter extends Component {
|
|
|
280
263
|
}
|
|
281
264
|
render() {
|
|
282
265
|
var _source$columnName;
|
|
283
|
-
var
|
|
284
|
-
columns
|
|
285
|
-
disableLinking,
|
|
286
|
-
isLinkerActive,
|
|
287
|
-
isLoaded,
|
|
288
|
-
source,
|
|
289
|
-
onColumnSelected,
|
|
290
|
-
onSourceMouseEnter,
|
|
291
|
-
onSourceMouseLeave,
|
|
292
|
-
values,
|
|
293
|
-
settingsError
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
value
|
|
302
|
-
} = this.state;
|
|
266
|
+
var _this$props3 = this.props,
|
|
267
|
+
allColumns = _this$props3.columns,
|
|
268
|
+
disableLinking = _this$props3.disableLinking,
|
|
269
|
+
isLinkerActive = _this$props3.isLinkerActive,
|
|
270
|
+
isLoaded = _this$props3.isLoaded,
|
|
271
|
+
source = _this$props3.source,
|
|
272
|
+
onColumnSelected = _this$props3.onColumnSelected,
|
|
273
|
+
onSourceMouseEnter = _this$props3.onSourceMouseEnter,
|
|
274
|
+
onSourceMouseLeave = _this$props3.onSourceMouseLeave,
|
|
275
|
+
values = _this$props3.values,
|
|
276
|
+
settingsError = _this$props3.settingsError;
|
|
277
|
+
var _this$state3 = this.state,
|
|
278
|
+
column = _this$state3.column,
|
|
279
|
+
disableCancel = _this$state3.disableCancel,
|
|
280
|
+
id = _this$state3.id,
|
|
281
|
+
isValueShown = _this$state3.isValueShown,
|
|
282
|
+
selectedColumn = _this$state3.selectedColumn,
|
|
283
|
+
value = _this$state3.value;
|
|
303
284
|
var columnSelectionDisabled = source === null;
|
|
304
285
|
var columns = this.getCompatibleColumns(source, allColumns);
|
|
305
286
|
var isLinked = source != null;
|
|
306
287
|
var sourceButtonLabel = (_source$columnName = source === null || source === void 0 ? void 0 : source.columnName) !== null && _source$columnName !== void 0 ? _source$columnName : DropdownFilter.SOURCE_BUTTON_PLACEHOLDER;
|
|
307
288
|
var filterTitle = column != null ? "".concat(column.name, " Filter") : null;
|
|
308
|
-
var
|
|
289
|
+
var _this$getColumnOption = this.getColumnOptions(columns, selectedColumn),
|
|
290
|
+
_this$getColumnOption2 = _slicedToArray(_this$getColumnOption, 2),
|
|
291
|
+
columnOptions = _this$getColumnOption2[0],
|
|
292
|
+
selectedIndex = _this$getColumnOption2[1];
|
|
309
293
|
var valueOptions = this.getValueOptions(values);
|
|
310
294
|
var selectedOption = this.getSelectedOptionIndex(values, value);
|
|
311
295
|
var disableSave = !isLinked || selectedColumn == null;
|