@deephaven/code-studio 1.15.1 → 1.15.2-alpha-fetch-variable-def.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/build/assets/{AppRoot-yoU6xO7o.js → AppRoot-DwJuOWo6.js} +4 -4
- package/build/assets/{AppRoot-yoU6xO7o.js.map → AppRoot-DwJuOWo6.js.map} +1 -1
- package/build/assets/{Chart-B-lgYFRk.js → Chart-C1i1ho1y.js} +2 -2
- package/build/assets/{Chart-B-lgYFRk.js.map → Chart-C1i1ho1y.js.map} +1 -1
- package/build/assets/{ControlType-BXDfYonb.js → ControlType-BEonYtyB.js} +4 -4
- package/build/assets/{ControlType-BXDfYonb.js.map → ControlType-BEonYtyB.js.map} +1 -1
- package/build/assets/{FormatterUtils-VvugcpnR.js → FormatterUtils-Bg2N5U7m.js} +2 -2
- package/build/assets/{FormatterUtils-VvugcpnR.js.map → FormatterUtils-Bg2N5U7m.js.map} +1 -1
- package/build/assets/{Grid-BhSfx_MV.js → Grid-Hz5UYdT_.js} +2 -2
- package/build/assets/{Grid-BhSfx_MV.js.map → Grid-Hz5UYdT_.js.map} +1 -1
- package/build/assets/GridTokenMouseHandler-DHkBdrVc.js +2 -0
- package/build/assets/GridTokenMouseHandler-DHkBdrVc.js.map +1 -0
- package/build/assets/{IrisGrid-CxxjDqw5.js → IrisGrid-DkGF7p3K.js} +3 -3
- package/build/assets/{IrisGrid-CxxjDqw5.js.map → IrisGrid-DkGF7p3K.js.map} +1 -1
- package/build/assets/{IrisGridModel-DSlx1u3X.js → IrisGridModel-DoD8cIz5.js} +3 -3
- package/build/assets/{IrisGridModel-DSlx1u3X.js.map → IrisGridModel-DoD8cIz5.js.map} +1 -1
- package/build/assets/{IrisGridShortcuts-RA3wXust.js → IrisGridShortcuts-DBc8G-3x.js} +2 -2
- package/build/assets/{IrisGridShortcuts-RA3wXust.js.map → IrisGridShortcuts-DBc8G-3x.js.map} +1 -1
- package/build/assets/{IrisGridThemeProvider-6it02n4x.js → IrisGridThemeProvider-BJrYi5zT.js} +6 -6
- package/build/assets/IrisGridThemeProvider-BJrYi5zT.js.map +1 -0
- package/build/assets/{LocalWorkspaceStorage-BZKRnSF8.js → LocalWorkspaceStorage-Ddl67eNC.js} +2 -2
- package/build/assets/{LocalWorkspaceStorage-BZKRnSF8.js.map → LocalWorkspaceStorage-Ddl67eNC.js.map} +1 -1
- package/build/assets/{MarkdownEditor-C2AAm9ih.js → MarkdownEditor-BcHfeFVY.js} +2 -2
- package/build/assets/{MarkdownEditor-C2AAm9ih.js.map → MarkdownEditor-BcHfeFVY.js.map} +1 -1
- package/build/assets/{MarkdownNotebook-DBOYivNl.js → MarkdownNotebook-Du5g1GaK.js} +2 -2
- package/build/assets/{MarkdownNotebook-DBOYivNl.js.map → MarkdownNotebook-Du5g1GaK.js.map} +1 -1
- package/build/assets/{MissingPartitionError-uL8lR3Hy.js → MissingPartitionError-Cjrlbi18.js} +2 -2
- package/build/assets/{MissingPartitionError-uL8lR3Hy.js.map → MissingPartitionError-Cjrlbi18.js.map} +1 -1
- package/build/assets/{MockChartModel-DTdba9NN.js → MockChartModel-B9nKAkLg.js} +2 -2
- package/build/assets/{MockChartModel-DTdba9NN.js.map → MockChartModel-B9nKAkLg.js.map} +1 -1
- package/build/assets/Plot-D75AfC4O.js +2 -0
- package/build/assets/{Plot-Cachc_IP.js.map → Plot-D75AfC4O.js.map} +1 -1
- package/build/assets/{Plotly-CqwB2UoY.js → Plotly-CAcUhtAR.js} +2 -2
- package/build/assets/{Plotly-CqwB2UoY.js.map → Plotly-CAcUhtAR.js.map} +1 -1
- package/build/assets/{StyleGuideRoot-DTTYIKzl.js → StyleGuideRoot-WshrSVsS.js} +2 -2
- package/build/assets/{StyleGuideRoot-DTTYIKzl.js.map → StyleGuideRoot-WshrSVsS.js.map} +1 -1
- package/build/assets/{index-Pb0fT4BS.js → index-CAjC8rry.js} +4 -4
- package/build/assets/{index-Pb0fT4BS.js.map → index-CAjC8rry.js.map} +1 -1
- package/build/assets/{index-SLNddBo_.js → index-Nhi6EDbw.js} +3 -3
- package/build/assets/{index-SLNddBo_.js.map → index-Nhi6EDbw.js.map} +1 -1
- package/build/assets/index-ODecto2-.js +2 -0
- package/build/assets/index-ODecto2-.js.map +1 -0
- package/build/assets/plotly-Cm_x6xfs.js +7 -0
- package/build/assets/{plotly-CJ0h1Bb8.js.map → plotly-Cm_x6xfs.js.map} +1 -1
- package/build/index.html +1 -1
- package/package.json +31 -31
- package/build/assets/GridTokenMouseHandler-Dem4pZ7B.js +0 -2
- package/build/assets/GridTokenMouseHandler-Dem4pZ7B.js.map +0 -1
- package/build/assets/IrisGridThemeProvider-6it02n4x.js.map +0 -1
- package/build/assets/Plot-Cachc_IP.js +0 -2
- package/build/assets/index-DZpheLqH.js +0 -2
- package/build/assets/index-DZpheLqH.js.map +0 -1
- package/build/assets/plotly-CJ0h1Bb8.js +0 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"mappings":"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","names":["StorageUtils","columnName","direction","filters","filterItems","filterOperators","filterItem","i","FilterOperator","config1","config2","operator","type","value","siftPrunableItems","items","maxItems","pruneItemsCount","pruneCount","ownKeys","e","r","t","o","_objectSpread","_defineProperty","asyncGeneratorStep","a","c","u","n","_asyncToGenerator","_next","_throw","_toPropertyKey","_toPrimitive","log","Log","DB_PREFIX","PouchDB","PouchDBFind","makePouchFilter","FilterType","makePouchSelectorFromConfig","config","filter","newFilter","filterOperator","selectorWithFilters","sortWithConfigs","sorts","_sorts$map","reverse","sort","PouchStorageTable","databaseName","dbOptions","callback","other","id","listener","reversed","viewport","_this","_this$viewportUpdateP","item","_this2","newItem","_this$currentViewport","listeners","data","event","selector","_this3","_this4","_this4$infoUpdateProm","_this4$currentFilter","PromiseUtils","findResult","_this5","_this6","_this6$currentFilter","_this6$viewportUpdate","viewportData","_this7","sortedRanges","_this8","itemMap","_ref2","_ref","_this8$currentFilter","from","to","limit","findSnapshotResult","index","_x","COMMAND_HISTORY_ITEMS_MAX","COMMAND_HISTORY_ITEMS_PRUNE","PouchCommandHistoryTable","language","cache","_this$cache$tableRegi","searchText","_selector","result","allItems","row","name","toKeep","toPrune","_ref3","isReversed","docs","resumeListeners","err","_this$cache$tableRegi2","_this$cache$tableRegi3","_this$changes","PouchCommandHistoryCache","dbName","_this$tableRegistry$g","pausedTables","table","_this$tableRegistry$g2","_this$tableRegistry$g3","PouchCommandHistoryStorage","scope","command","updateTable","dbItem","updatedItem","SET_LAYOUT_STORAGE","setLayoutStorage","layoutStorage","dh","isFormatStringFormat","format","getFormattedVersionInfo","serverConfigValues","ua","Bowser","browser","os","pythonVersion","getFormattedPluginInfo","pluginDataValues","plugin","acc","key","focusFirstInputInContainer","container","input","isSameOptions","options1","options2","isSameDecimalOptions","isSameIntegerOptions","isValidColumnName","DbNameValidator","isValidFormat","columnType","DateTimeColumnFormatter","DecimalColumnFormatter","IntegerColumnFormatter","removeFormatRuleExtraProps","isNewRule","rest","isFormatRuleValidForSave","rule","DateTimeOptions","props","timestamp","timeZone","showTimeZone","showTSeparator","isGlobalOptions","legacyGlobalFormat","useApi","formatter","useMemo","Formatter","formats","jsx","Fragment","formatString","TableUtils","TimeZoneOptions","TimeUtils","label","_FormattingSectionContent","PureComponent","__publicField","memoize","timestampAtMenuOpen","debounce","defaultDateTimeFormat","defaultDecimalFormatOptions","defaultIntegerFormatOptions","truncateNumbersWithPound","showEmptyStrings","showNullStrings","showExtraGroupColumn","React","updates","update","defaults","updateSettings","defaultDecimalFormatString","defaultIntegerFormatString","isTimeZoneDefault","isDateTimeOptionsDefault","isDecimalOptionsDefault","isIntegerOptionsDefault","jsxs","Select","Button","vsRefresh","classNames","Checkbox","FormattingSectionContent","mapStateToProps","state","getDefaultDateTimeFormat","getDefaultDecimalFormatOptions","getDefaultIntegerFormatOptions","getApi","getShowTimeZone","getShowTSeparator","getTruncateNumbersWithPound","getShowEmptyStrings","getShowNullStrings","getShowExtraGroupColumn","getTimeZone","getDefaultSettings","ConnectedFormattingSectionContent","connect","updateSettingsAction","LegalNotice","modal","setModal","useState","toggle","vsLaw","Modal","ModalHeader","ModalBody","SettingsMenuSection","children","isExpanded","sectionKey","title","onToggle","FontAwesomeIcon","vsTriangleDown","Collapse","ShortcutItem","shortcut","propsDisplayText","categoryName","onChange","displayText","setDisplayText","keyState","setKeyState","isPending","setIsPending","error","setError","useEffect","Shortcut","conflictNames","ShortcutRegistry","conflict","handleInputKeyDown","newKeyState","backspaceKeyState","KEY","handleInputKeyUp","handleInputFocus","ContextActionUtils","handleInputBlur","handleConfirm","handleUndo","originalKeyState","handleResetToDefaultClick","Tooltip","ShortcutSectionContent","shortcutOverrides","saveShortcutOverrides","useCallback","modifiedShortcuts","isMac","newOverrides","platformOverrides","categories","shortcuts","globalCategoryIndex","category","globalCategory","ShortcutCategory","propsShortcuts","formatCategoryName","word","setShortcuts","handleShortcutChange","conflictingShortcuts","s","modifiedShoftcuts","displayTexts","getShortcutOverrides","mapDispatchToProps","ConnectedShortcutSectionContent","columnTypesArray","ColumnTypeOptions","columnTypeOptions","_ColumnSpecificSectionContent","formatSettings","lastFormatRuleIndex","oldFormatSettings","assertNotNull","resetKeys","newEntry","newFormat","elem","scrollTo","_a","_b","errorMessages","columnNameId","columnTypeId","formatId","onNameChange","onNameBlur","onTypeChange","eventTargetValue","ruleError","vsTrash","isInvalid","selectedFormat","defaultFormatString","formatRulesChanged","formatRules","FadeTransition","addNewRuleButton","dhNewCircleLargeFilled","TransitionGroup","ColumnSpecificSectionContent","getFormatter","ConnectedColumnSpecificSectionContent","AdvancedSectionContent","dispatch","useDispatch","webgl","useAppSelector","getWebGL","webglEditable","getWebGLEditable","handleWebglChange","newValue","helpText","Text","Switch","ContextualHelp","Heading","Content","ThemeSectionContent","theme","useTheme","settings","getSettings","updateDensity","density","ThemePicker","Picker","Item","EditorSectionContent","notebookSettings","getNotebookSettings","isMinimapEnabled","formatOnSave","ruffSettings","ruffEnabled","ruffConfig","RUFF_DEFAULT_SETTINGS","handleMinimapChange","updateNotebookSettings","handleFormatOnSaveChange","handleRuffEnabledChange","MonacoProviders","handleRuffConfigChange","val","isRuffSettingsOpen","setIsRuffSettingsOpen","handleRuffSettingsClose","handleRuffSettingsSave","v","ActionButton","Icon","vsSettings","RuffSettingsModal","_SettingsMenu","Component","BROADCAST_CHANNEL_NAME","expandedSectionKey","makeMessage","BROADCAST_LOGOUT_MESSAGE","x","y","onDone","pluginData","pluginInfo","exportLogs","logHistory","store","supportLink","docsLink","user","versionInfo","deephavenVersion","copyShortcut","GLOBAL_SHORTCUTS","getRow","text","ver","userDisplayName","hasUserImage","showUserName","dhUser","dhUserIncognito","vsClose","vsWatch","vsLayers","vsPaintcan","vsFileCode","vsRecordKeys","vsTools","CopyButton","Logo","SettingsMenu","MINIMUM_DRAG_DISTANCE","DragSourceMenuItem","forwardedProps","action","menuItemDisabled","iconElement","displayShortcut","isMouseSelected","isKeyboardSelected","closeMenu","startX","useRef","startY","startObject","disableDoubleClick","setDisableDoubleClick","handleMouseMove","handleMouseDown","handleMouseUp","AppControlsMenu","handleControlSelect","handleToolSelect","onClearFilter","controlMenuActions","dhInput","dragEvent","ControlType","dhTriangleDownSquare","vsMarkdown","vsDeviceCamera","vsLink","ToolType","dhFilterSlash","IRIS_GRID_SHORTCUTS","DropdownMenu","replaceReducer","reducers","getLayoutStorage","getServerConfigValues","reducer","reducerRegistry","WidgetList","onExportLayout","onImportLayout","onResetLayout","onSelect","widgets","setSearchText","searchField","selectStartEvent","sendSelect","widget","handleSearchChange","filteredWidgets","b","widgetElements","ObjectIcon","errorElement","SearchInput","vsPreview","vsArrowSmallDown","vsArrowSmallUp","EmptyDashboard","onAutoFillClick","vsArrowUp","AppMainContainer","plugins","getDashboardPlugins","bindAllMethods","allDashboardData","createExportLogsContextAction","versionInfoText","copyToClipboard","NAVIGATION_SHORTCUTS","DEFAULT_DASHBOARD_ID","vsTerminal","DashboardUtils","zipFile","JSZip","zip","prevProps","prevState","dashboardData","rm","connection","updated","created","removed","widgetsToRemove","newWidgets","toRemove","toAdd","setDashboardPluginData","updateDashboardData","workspace","workspaceData","filterSets","links","pluginDataMap","pluginKeys","pluginId","match","notebookPath","session","sessionConfig","fileMetadata","NotebookEvent","InputFilterEvent","emitCycleToNextStack","emitCycleToPreviousStack","emitCycleToNextTab","emitCycleToPreviousTab","PanelEvent","tabs","activeTabKey","currentIndex","tab","targetIndex","targetTab","layout","args","MarkdownEvent","toolType","activeTool","setActiveTool","updateWorkspaceData","closed","newLayout","oldLayout","listenForCreateDashboard","listenForCloseDashboard","newId","nanoid","existingTab","tabTitle","isPanelsMenuShown","sortedWidgets","exportedConfig","UserLayoutUtils","blob","link","NotebookPanel","file","fileText","exportedLayout","layoutConfig","flushSync","layoutIteration","clipboardData","pastedData","replacedChars","emitPanelOpen","getVariableDescriptor","tabId","oldTabs","newTabs","newActiveTabKey","oldActiveTabIndex","EMPTY_ARRAY","permissions","canUsePanels","contextActions","isResetLayoutPromptShown","isSettingsMenuShown","unsavedNotebookCount","dashboardPlugins","NavTabList","dhShapes","dhPanels","Popper","vsGear","AppDashboards","LoadingOverlay","ConsolePlugin","SlideTransition","ContextActions","BasicModal","getActiveTool","getAllDashboardsData","getDashboardData","getPlugins","getDashboardConnection","getDashboardSessionWrapper","getUser","getWorkspace","ConnectedAppMainContainer","setActiveToolAction","setDashboardDataAction","setDashboardPluginDataAction","updateDashboardDataAction","updateWorkspaceDataAction","withRouter","App","ToastContainer","AppInit","api","client","useClient","useConnection","usePlugins","serverConfig","useServerConfig","useUser","useSelector","setPlugins","loadApp","sessionDetails","getSessionDetails","sessionWrapper","loadSessionWrapper","storageService","GrpcLayoutStorage","fileStorage","GrpcFileStorage","workspaceStorage","LocalWorkspaceStorage","commandHistoryStorage","loadedWorkspace","setApi","setServerConfigValues","setCommandHistoryStorage","setDashboardData","setFileStorage","setDashboardConnection","setDashboardSessionWrapper","setUser","setWorkspaceStorage","setWorkspace","setDefaultWorkspaceSettings","isLoading","isLoaded","errorMessage","StyleGuideRoot","__vitePreload","baseURI","AppRouter","Router","Route","Redirect","AppRoot","DownloadServiceWorkerUtils","MonacoUtils","MonacoJsonWorker","MonacoWorker"],"ignoreList":[],"sources":["../../../storage/dist/StorageUtils.js","../../../pouch-storage/dist/pouchCommandHistoryUtils.js","../../../pouch-storage/dist/PouchStorageTable.js","../../../pouch-storage/dist/PouchCommandHistoryTable.js","../../../pouch-storage/dist/PouchCommandHistoryCache.js","../../../pouch-storage/dist/PouchCommandHistoryStorage.js","../../src/redux/actionTypes.ts","../../src/redux/actions.ts","../../../jsapi-shim/dist/dh.js","../../src/settings/SettingsUtils.tsx","../../src/settings/DateTimeOptions.tsx","../../src/settings/TimeZoneOptions.tsx","../../src/settings/FormattingSectionContent.tsx","../../src/settings/LegalNotice.tsx","../../src/settings/SettingsMenuSection.tsx","../../src/settings/ShortcutItem.tsx","../../src/settings/ShortcutsSectionContent.tsx","../../src/settings/ColumnTypeOptions.tsx","../../src/settings/ColumnSpecificSectionContent.tsx","../../src/settings/AdvancedSectionContent.tsx","../../src/settings/ThemeSectionContent.tsx","../../src/settings/EditorSectionContent.tsx","../../src/settings/SettingsMenu.tsx","../../src/main/AppControlsMenu.tsx","../../src/redux/reducers/layoutStorage.ts","../../src/redux/reducers/index.ts","../../src/redux/selectors.ts","../../src/redux/index.ts","../../src/main/WidgetList.tsx","../../src/main/EmptyDashboard.tsx","../../src/main/AppMainContainer.tsx","../../src/main/App.tsx","../../src/main/AppInit.tsx","../../src/main/AppRouter.tsx","../../src/AppRoot.tsx"],"sourcesContent":["import { Operator as FilterOperator } from '@deephaven/filters';\nexport class StorageUtils {\n static makeSortConfig(columnName, direction) {\n return {\n column: columnName,\n direction\n };\n }\n static makeFilterConfig(filters) {\n var filterItems = [];\n var filterOperators = [];\n filters.forEach((filterItem, i) => {\n filterItems.push(filterItem);\n if (i > 0) {\n filterOperators.push(FilterOperator.and);\n }\n });\n return {\n filterItems,\n filterOperators\n };\n }\n static combineFilterConfigs(config1, config2) {\n var operator = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : FilterOperator.and;\n return {\n filterItems: [...config1.filterItems, ...config2.filterItems],\n filterOperators: [...config1.filterOperators, operator, ...config2.filterOperators]\n };\n }\n static makeFilterItem(columnName, type, value) {\n return {\n columnName,\n type,\n value\n };\n }\n}\nexport default StorageUtils;\n//# sourceMappingURL=StorageUtils.js.map","/**\n * Takes an array of items and determines which ones to keep and which ones to\n * prune based on the given thresholds.\n * @param items items to keep or prune\n * @param maxItems maximum number of items to allow before pruning\n * @param pruneItemsCount if the maxItems count is exceeded, the number we want to keep\n */\n// eslint-disable-next-line import/prefer-default-export\nexport function siftPrunableItems(items, maxItems, pruneItemsCount) {\n if (items.length > maxItems) {\n var pruneCount = items.length - pruneItemsCount;\n return {\n toKeep: items.slice(pruneCount),\n toPrune: items.slice(0, pruneCount)\n };\n }\n return {\n toKeep: items,\n toPrune: []\n };\n}\n//# sourceMappingURL=pouchCommandHistoryUtils.js.map","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; }\nfunction _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; }\nfunction asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }\nfunction _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"next\", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"throw\", n); } _next(void 0); }); }; }\nfunction _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; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\nfunction _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); }\nimport PouchDB from 'pouchdb-browser';\nimport PouchDBFind from 'pouchdb-find';\nimport { Operator as FilterOperator, Type as FilterType } from '@deephaven/filters';\nimport Log from '@deephaven/log';\nimport { PromiseUtils } from '@deephaven/utils';\nvar log = Log.module('PouchStorageTable');\nvar DB_PREFIX = 'Deephaven.';\nPouchDB.plugin(PouchDBFind);\nexport function makePouchFilter(type, value) {\n switch (type) {\n case FilterType.in:\n case FilterType.contains:\n return {\n $regex: new RegExp(\"\".concat(value)).toString()\n };\n case FilterType.inIgnoreCase:\n return {\n $regex: new RegExp(\"\".concat(value), 'i').toString()\n };\n case FilterType.eq:\n return {\n $eq: value\n };\n case FilterType.notEq:\n return {\n $ne: value\n };\n case FilterType.greaterThan:\n return {\n $gt: value\n };\n case FilterType.greaterThanOrEqualTo:\n return {\n $gte: value\n };\n case FilterType.lessThan:\n return {\n $lt: value\n };\n case FilterType.lessThanOrEqualTo:\n return {\n $lte: value\n };\n case FilterType.startsWith:\n return {\n $regex: new RegExp(\"^\".concat(value, \".*\")).toString()\n };\n default:\n throw new Error(\"Unsupported type: \".concat(type));\n }\n}\nfunction makePouchSelectorFromConfig(config) {\n var {\n filterItems,\n filterOperators\n } = config;\n var filter = null;\n for (var i = 0; i < filterItems.length; i += 1) {\n var filterItem = filterItems[i];\n var {\n columnName,\n type,\n value\n } = filterItem;\n var newFilter = {\n [columnName]: makePouchFilter(type, value)\n };\n if (i === 0) {\n filter = newFilter;\n } else if (filter !== null && i - 1 < filterOperators.length) {\n var filterOperator = filterOperators[i - 1];\n if (filterOperator === FilterOperator.and) {\n filter = {\n $and: [filter, newFilter]\n };\n } else if (filterOperator === FilterOperator.or) {\n filter = {\n $or: [filter, newFilter]\n };\n } else {\n throw new Error(\"Unexpected filter operator \".concat(filterOperator, \", \").concat(newFilter));\n }\n }\n }\n if (filter == null) {\n throw new Error(\"Invalid filter config \".concat(config));\n }\n return filter;\n}\nfunction selectorWithFilters() {\n var filters = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n return {\n $and: [...filters.map(filter => makePouchSelectorFromConfig(filter)), {\n name: {\n $gt: null\n }\n }, {\n id: {\n $gt: null\n }\n }]\n };\n}\nfunction sortWithConfigs(sorts) {\n var _sorts$map;\n var reverse = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n return [{\n id: reverse ? 'desc' : 'asc'\n }, ...((_sorts$map = sorts === null || sorts === void 0 ? void 0 : sorts.map(sort => ({\n [sort.column]: sort.direction\n }))) !== null && _sorts$map !== void 0 ? _sorts$map : [])];\n}\nexport class PouchStorageTable {\n constructor(databaseName, dbOptions) {\n _defineProperty(this, \"db\", void 0);\n _defineProperty(this, \"changes\", void 0);\n _defineProperty(this, \"listeners\", []);\n _defineProperty(this, \"itemListeners\", new Map());\n _defineProperty(this, \"currentSize\", 0);\n _defineProperty(this, \"currentViewport\", void 0);\n _defineProperty(this, \"currentReverse\", false);\n _defineProperty(this, \"currentFilter\", null);\n _defineProperty(this, \"currentSort\", null);\n _defineProperty(this, \"infoUpdatePromise\", void 0);\n _defineProperty(this, \"viewportUpdatePromise\", void 0);\n _defineProperty(this, \"currentViewportData\", void 0);\n this.db = new PouchDB(\"\".concat(DB_PREFIX).concat(databaseName), dbOptions);\n\n // Need to set `_remote` to false to remove deprecation warnings: https://github.com/pouchdb/pouchdb/issues/6106\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, no-underscore-dangle\n this.db._remote = false;\n this.listenForChanges();\n this.db.createIndex({\n index: {\n fields: ['id', 'name']\n }\n });\n this.refreshInfo();\n }\n\n /**\n * Listen for db changes. This can be cancelled by calling\n * `this.changes?.cancel()`\n */\n listenForChanges() {\n this.changes = this.db.changes({\n live: true,\n since: 'now',\n include_docs: true\n }).on('change', this.dbUpdate.bind(this));\n }\n onUpdate(callback) {\n this.listeners = [...this.listeners, callback];\n return () => {\n this.listeners = this.listeners.filter(other => other !== callback);\n };\n }\n onItemUpdate(id, listener) {\n if (!this.itemListeners.has(id)) {\n this.itemListeners.set(id, []);\n }\n this.itemListeners.set(id, [...this.itemListeners.get(id), listener]);\n this.refreshItem(id);\n return () => {\n this.itemListeners.set(id, this.itemListeners.get(id).filter(other => other !== listener));\n };\n }\n close() {\n this.listeners = [];\n }\n get size() {\n return this.currentSize;\n }\n get viewport() {\n return this.currentViewport;\n }\n setReversed(reversed) {\n this.currentReverse = reversed;\n this.currentViewportData = undefined;\n this.refreshData();\n }\n setViewport(viewport) {\n this.currentViewport = viewport;\n this.refreshInfo();\n this.refreshData();\n }\n setSorts(config) {\n this.currentSort = config;\n this.currentViewportData = undefined;\n this.refreshData();\n }\n setFilters(config) {\n this.currentFilter = config;\n this.currentViewportData = undefined;\n this.refreshInfo();\n this.refreshData();\n }\n get data() {\n return this.currentViewportData;\n }\n getViewportData() {\n var _this = this;\n return _asyncToGenerator(function* () {\n var _this$viewportUpdateP;\n if (!_this.viewportUpdatePromise) {\n _this.refreshData();\n }\n return (_this$viewportUpdateP = _this.viewportUpdatePromise) !== null && _this$viewportUpdateP !== void 0 ? _this$viewportUpdateP : Promise.resolve({\n items: [],\n offset: 0\n });\n })();\n }\n put(item) {\n var _this2 = this;\n return _asyncToGenerator(function* () {\n // Put the item ID in both the _id and the id slot\n // PouchDB uses _id everywhere, StorageTable just uses `id` though\n var newItem = _objectSpread(_objectSpread({}, item), {}, {\n _id: item.id\n });\n yield _this2.db.put(newItem);\n return newItem;\n })();\n }\n sendUpdate() {\n var _this$currentViewport;\n // Retain a reference to it in case a listener gets removed while sending an update\n var {\n listeners\n } = this;\n var data = (_this$currentViewport = this.currentViewportData) !== null && _this$currentViewport !== void 0 ? _this$currentViewport : {\n items: [],\n offset: 0\n };\n for (var i = 0; i < listeners.length; i += 1) {\n listeners[i](data);\n }\n }\n sendItemUpdate(item) {\n var listeners = this.itemListeners.get(item.id);\n if (listeners !== undefined) {\n for (var i = 0; i < listeners.length; i += 1) {\n listeners[i](item);\n }\n }\n }\n dbUpdate(event) {\n log.debug('Update received', event);\n this.refreshInfo();\n if (event.doc !== undefined) {\n this.sendItemUpdate(event.doc);\n }\n this.refreshData();\n }\n\n /**\n * Fetch infor for a given selector.\n * @param selector\n */\n fetchInfo(selector) {\n var _this3 = this;\n return _asyncToGenerator(function* () {\n return _this3.db.find({\n selector,\n fields: []\n });\n })();\n }\n refreshInfo() {\n var _this4 = this;\n return _asyncToGenerator(function* () {\n try {\n var _this4$infoUpdateProm, _this4$currentFilter;\n (_this4$infoUpdateProm = _this4.infoUpdatePromise) === null || _this4$infoUpdateProm === void 0 || _this4$infoUpdateProm.cancel();\n _this4.infoUpdatePromise = PromiseUtils.makeCancelable(_this4.fetchInfo(selectorWithFilters((_this4$currentFilter = _this4.currentFilter) !== null && _this4$currentFilter !== void 0 ? _this4$currentFilter : [])));\n var findResult = yield _this4.infoUpdatePromise;\n _this4.currentSize = findResult.docs.length;\n _this4.sendUpdate();\n } catch (e) {\n if (!PromiseUtils.isCanceled(e)) {\n log.error('Unable to refreshInfo', e);\n throw e;\n }\n }\n })();\n }\n\n /**\n * Fetch data for the given viewport, selector, and sort.\n * @param viewport\n * @param selector\n * @param sort\n */\n fetchViewportData(viewport, selector, sort) {\n var _this5 = this;\n return _asyncToGenerator(function* () {\n return _this5.db.find({\n selector,\n skip: viewport.top,\n limit: viewport.bottom - viewport.top + 1,\n sort,\n fields: ['id', 'name']\n }).then(findResult => ({\n items: findResult.docs,\n offset: viewport.top\n }));\n })();\n }\n refreshData() {\n var _this6 = this;\n return _asyncToGenerator(function* () {\n if (!_this6.currentViewport) {\n return;\n }\n try {\n var _this6$currentFilter, _this6$viewportUpdate;\n var selector = selectorWithFilters((_this6$currentFilter = _this6.currentFilter) !== null && _this6$currentFilter !== void 0 ? _this6$currentFilter : []);\n var sort = sortWithConfigs(_this6.currentSort, _this6.currentReverse);\n (_this6$viewportUpdate = _this6.viewportUpdatePromise) === null || _this6$viewportUpdate === void 0 || _this6$viewportUpdate.cancel();\n _this6.viewportUpdatePromise = PromiseUtils.makeCancelable(_this6.fetchViewportData(_this6.currentViewport, selector, sort));\n var viewportData = yield _this6.viewportUpdatePromise;\n _this6.currentViewportData = viewportData;\n _this6.sendUpdate();\n return viewportData;\n } catch (e) {\n if (!PromiseUtils.isCanceled(e)) {\n log.error('Unable to refreshData', e);\n throw e;\n }\n }\n })();\n }\n refreshItem(id) {\n var _this7 = this;\n return _asyncToGenerator(function* () {\n var findResult = yield _this7.db.find({\n selector: {\n id\n },\n limit: 1\n });\n var item = findResult.docs[0];\n if (item !== undefined) {\n _this7.sendItemUpdate(item);\n }\n return item;\n })();\n }\n getSnapshot(sortedRanges) {\n var _this8 = this;\n return _asyncToGenerator(function* () {\n var itemMap = new Map();\n var sort = [{\n id: _this8.currentReverse ? 'desc' : 'asc'\n }];\n yield Promise.all(sortedRanges.map(/*#__PURE__*/function () {\n var _ref2 = _asyncToGenerator(function* (_ref) {\n var _this8$currentFilter;\n var [from, to] = _ref;\n var limit = to - from + 1;\n return _this8.db.find({\n selector: selectorWithFilters((_this8$currentFilter = _this8.currentFilter) !== null && _this8$currentFilter !== void 0 ? _this8$currentFilter : []),\n skip: from,\n limit,\n sort,\n fields: ['id', 'name']\n }).then(findSnapshotResult => {\n for (var i = 0; i < limit; i += 1) {\n var index = from + i;\n itemMap.set(index, findSnapshotResult.docs[i]);\n }\n });\n });\n return function (_x) {\n return _ref2.apply(this, arguments);\n };\n }()));\n return itemMap;\n })();\n }\n}\nexport default PouchStorageTable;\n//# sourceMappingURL=PouchStorageTable.js.map","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; }\nfunction _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; }\nfunction asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }\nfunction _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"next\", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"throw\", n); } _next(void 0); }); }; }\nfunction _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; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\nfunction _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); }\nimport { Type as FilterType } from '@deephaven/filters';\nimport Log from '@deephaven/log';\nimport { StorageUtils } from '@deephaven/storage';\nimport { PromiseUtils } from '@deephaven/utils';\nimport { siftPrunableItems } from \"./pouchCommandHistoryUtils.js\";\nimport PouchStorageTable from \"./PouchStorageTable.js\";\nvar COMMAND_HISTORY_ITEMS_MAX = 2500;\nvar COMMAND_HISTORY_ITEMS_PRUNE = 2000;\nvar log = Log.module('PouchCommandHistoryTable');\nexport class PouchCommandHistoryTable extends PouchStorageTable {\n constructor(language, cache) {\n var _this$cache$tableRegi;\n super(\"CommandHistoryStorage.\".concat(language), {\n // Optimizations to cut down on growing table size. These should be safe\n // since we don't care about revision history for command history\n // documents.\n auto_compaction: true,\n revs_limit: 1\n });\n\n // Add this table instance to the table registry\n _defineProperty(this, \"searchText\", void 0);\n this.cache = cache;\n if (!this.cache.tableRegistry.has(this.cacheKey)) {\n this.cache.tableRegistry.set(this.cacheKey, new Set());\n }\n log.debug('Adding table to registry', this.cacheKey);\n (_this$cache$tableRegi = this.cache.tableRegistry.get(this.cacheKey)) === null || _this$cache$tableRegi === void 0 || _this$cache$tableRegi.add(this);\n }\n get cacheKey() {\n return this.db.name;\n }\n setSearch(searchText) {\n log.debug('Setting search filters', searchText);\n this.searchText = searchText.trim().toLowerCase();\n this.setFilters(searchText ? [StorageUtils.makeFilterConfig([StorageUtils.makeFilterItem('name', FilterType.contains, searchText)])] : []);\n }\n\n // Our current version of eslint + prettier doesn't always like the `override`\n // keyword. Whenever we upgrade, we should annotate this function with `override`.\n dbUpdate(event) {\n log.debug('Clearing cache and refreshing data', event);\n this.cache.response.delete(this.cacheKey);\n super.dbUpdate(event);\n }\n\n /**\n * Fetch command history data from `this.cache.response` or from\n * PouchDB if data is not found in the cache. If the number of total items in\n * the db exceeds COMMAND_HISTORY_ITEMS_MAX, the database will be pruned down\n * to COMMAND_HISTORY_ITEMS_PRUNE total items. Note that PouchDB doesn't\n * actually remove them from the underlying IndexDB, they are just marked\n * as deleted and won't be present in our query results.\n * @param selector\n */\n fetchData(_selector) {\n var _this = this;\n return _asyncToGenerator(function* () {\n // Wrapping this in a setTimeout so that it executes on next call stack.\n // This is necessary to ensure `this.cache` has been initialized due to some\n // nuances with property initilization with inherited classes.\n return PromiseUtils.withTimeout(0, /*#__PURE__*/_asyncToGenerator(function* () {\n if (_this.cache.response.has(_this.cacheKey)) {\n log.debug('Fetching from cache', _this.searchText, _this.viewport);\n } else {\n log.debug('Fetching from PouchDB', _this.searchText, _this.viewport);\n _this.cache.response.set(_this.cacheKey, _this.db.allDocs({\n include_docs: true\n }).then(result => {\n var allItems = result.rows\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n .map(row => row.doc).filter(_ref2 => {\n var {\n name\n } = _ref2;\n return name;\n });\n log.debug(\"Fetched \".concat(allItems.length, \" command history items\"));\n var {\n toKeep,\n toPrune\n } = siftPrunableItems(allItems, COMMAND_HISTORY_ITEMS_MAX, COMMAND_HISTORY_ITEMS_PRUNE);\n\n // If number of items in PouchDB has exceeded COMMAND_HISTORY_ITEMS_MAX\n // prune them down so we have COMMAND_HISTORY_ITEMS_PRUNE left\n if (toPrune.length) {\n _this.pruneItems(toPrune);\n }\n return {\n docs: toKeep\n };\n }));\n }\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n var result = _this.cache.response.get(_this.cacheKey);\n if (_this.searchText == null || _this.searchText === '') {\n return result;\n }\n return _objectSpread(_objectSpread({}, result), {}, {\n docs: (yield result).docs.filter(_ref3 => {\n var {\n name\n } = _ref3;\n return (\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n name.toLowerCase().includes(_this.searchText)\n );\n })\n });\n }));\n })();\n }\n\n /**\n * Override `PouchStorageTable.fetchInfo` so we can make use of\n * `PouchCommandHistoryCache`\n * @param selector\n */\n // Our current version of eslint + prettier doesn't always like the `override`\n // keyword. Whenever we upgrade, we should annotate this function with `override`.\n fetchInfo(selector) {\n var _this2 = this;\n return _asyncToGenerator(function* () {\n return _this2.fetchData(selector);\n })();\n }\n\n /**\n * Override `PouchStorageTable.fetchViewportData` to fetch command history\n * storage items. This override provides caching + optimizations specific to\n * command history. We cache the results to avoid excessive PouchDB queries\n * during scrolling. The cache should only need to be invalidated when search\n * filter changes or commands are added to the storage history.\n *\n * @param viewport\n * @param selector\n * @param sort\n * @returns Promise to array of command history storage items\n */\n // Our current version of eslint + prettier doesn't always like the `override`\n // keyword. Whenever we upgrade, we should annotate this function with `override`.\n fetchViewportData(viewport, selector, sort) {\n var _this3 = this;\n return _asyncToGenerator(function* () {\n var data = yield _this3.fetchData(selector);\n log.debug('Fetching viewport data', viewport.top, viewport.bottom + 1, sort, data);\n var isReversed = typeof sort[0] === 'object' && sort[0].id === 'desc';\n var docs = isReversed ? data.docs.slice(0).reverse() : data.docs;\n var items = docs.slice(viewport.top, viewport.bottom + 1);\n return {\n items,\n offset: viewport.top\n };\n })();\n }\n\n /**\n * Mark given items as `_deleted` in the database.\n * @param items\n */\n pruneItems(items) {\n var _this4 = this;\n return _asyncToGenerator(function* () {\n if (_this4.cache.isPruning.get(_this4.cacheKey) === true) {\n log.debug('Pruning already in progress. Skipping.');\n return;\n }\n try {\n log.debug(\"Pruning \".concat(items.length, \" command history items\"));\n\n // Disable change notifications while we bulk delete to avoid locking up\n // the app\n var resumeListeners = _this4.cache.pauseChangeListeners(_this4.cacheKey);\n _this4.cache.isPruning.set(_this4.cacheKey, true);\n yield _this4.db.bulkDocs(items.map(item => _objectSpread(_objectSpread({}, item), {}, {\n _deleted: true\n })));\n _this4.cache.isPruning.set(_this4.cacheKey, false);\n resumeListeners();\n log.debug('Finished pruning command history items');\n } catch (err) {\n log.error('An error occurred while pruning db', err);\n }\n })();\n }\n\n // Our current version of eslint + prettier doesn't always like the `override`\n // keyword. Whenever we upgrade, we should annotate this function with `override`.\n close() {\n var _this$cache$tableRegi2, _this$cache$tableRegi3, _this$changes;\n log.debug('Closing table', this, (_this$cache$tableRegi2 = this.cache.tableRegistry.get(this.cacheKey)) === null || _this$cache$tableRegi2 === void 0 ? void 0 : _this$cache$tableRegi2.size);\n (_this$cache$tableRegi3 = this.cache.tableRegistry.get(this.cacheKey)) === null || _this$cache$tableRegi3 === void 0 || _this$cache$tableRegi3.delete(this);\n (_this$changes = this.changes) === null || _this$changes === void 0 || _this$changes.cancel();\n super.close();\n }\n}\nexport default PouchCommandHistoryTable;\n//# sourceMappingURL=PouchCommandHistoryTable.js.map","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; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\nfunction _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); }\nimport Log from '@deephaven/log';\nvar log = Log.module('PouchCommandHistoryCache');\n\n/**\n * Cache for tracking things shared across multiple\n * `PouchCommandHistoryTable` instances.\n */\nclass PouchCommandHistoryCache {\n constructor() {\n /**\n * Keep track of pruning status for a database. This helps ensure only 1\n * pruning operation gets executed if multiple instances of a PouchCommandHistory\n * table load data at the same time.\n */\n _defineProperty(this, \"isPruning\", void 0);\n /**\n * Cache for command history query results keyed by db name. The cached data\n * will be shared across all `PouchCommandHistoryTable` instances that have\n * the same db name.\n */\n _defineProperty(this, \"response\", void 0);\n /**\n * Keeps track of all `PouchCommandHistoryTable` instances.\n */\n _defineProperty(this, \"tableRegistry\", void 0);\n this.isPruning = new Map();\n this.response = new Map();\n this.tableRegistry = new Map();\n }\n /**\n * Pauses PouchDB change listeners for any `PouchCommandHistoryTable` with\n * the given database name. This will cancel existing subscriptions and\n * return a callback that can be used to re-subscribe them.\n * @param dbName\n */\n pauseChangeListeners(dbName) {\n var _this$tableRegistry$g;\n var pausedTables = [];\n (_this$tableRegistry$g = this.tableRegistry.get(dbName)) === null || _this$tableRegistry$g === void 0 || _this$tableRegistry$g.forEach(table => {\n if (table.changes) {\n log.debug(\"Pausing event listeners on '\".concat(dbName, \"' table\"), table);\n table.changes.cancel();\n pausedTables.push(table);\n }\n });\n return () => {\n pausedTables.forEach(table => {\n var _this$tableRegistry$g2, _this$tableRegistry$g3;\n // Resume listening for changes if the table is still in the registry\n if ((_this$tableRegistry$g2 = (_this$tableRegistry$g3 = this.tableRegistry.get(dbName)) === null || _this$tableRegistry$g3 === void 0 ? void 0 : _this$tableRegistry$g3.has(table)) !== null && _this$tableRegistry$g2 !== void 0 ? _this$tableRegistry$g2 : false) {\n log.debug(\"Resuming event listeners on '\".concat(dbName, \"' table\"), table);\n table.listenForChanges();\n }\n });\n };\n }\n}\nexport default PouchCommandHistoryCache;\n//# sourceMappingURL=PouchCommandHistoryCache.js.map","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; }\nfunction _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; }\nfunction asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }\nfunction _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"next\", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"throw\", n); } _next(void 0); }); }; }\nfunction _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; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\nfunction _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); }\n/* eslint-disable class-methods-use-this */\nimport Log from '@deephaven/log';\nimport PouchCommandHistoryTable from \"./PouchCommandHistoryTable.js\";\nimport PouchCommandHistoryCache from \"./PouchCommandHistoryCache.js\";\nvar log = Log.module('PouchCommandHistoryStorage');\nexport class PouchCommandHistoryStorage {\n constructor() {\n _defineProperty(this, \"cache\", new PouchCommandHistoryCache());\n _defineProperty(this, \"updateTableMap\", new Map());\n }\n getUpdateTable(language) {\n if (!this.updateTableMap.has(language)) {\n this.updateTableMap.set(language, new PouchCommandHistoryTable(language, this.cache));\n }\n return this.updateTableMap.get(language);\n }\n getTable(language) {\n var _this = this;\n return _asyncToGenerator(function* () {\n return new PouchCommandHistoryTable(language, _this.cache);\n })();\n }\n addItem(language, scope, command, data) {\n var _this2 = this;\n return _asyncToGenerator(function* () {\n return _this2.updateItem(language, {\n id: \"\".concat(new Date().getTime()),\n name: command,\n data\n });\n })();\n }\n updateItem(language, item) {\n var _this3 = this;\n return _asyncToGenerator(function* () {\n var updateTable = _this3.getUpdateTable(language);\n var dbItem = yield updateTable.refreshItem(item.id);\n var updatedItem = _objectSpread(_objectSpread({}, dbItem !== null && dbItem !== void 0 ? dbItem : {}), item);\n log.debug('Updating item', updatedItem);\n yield updateTable.put(updatedItem);\n log.debug('Update saved');\n return item;\n })();\n }\n listenItem(language, id, listener) {\n var updateTable = this.getUpdateTable(language);\n return updateTable.onItemUpdate(id, listener);\n }\n}\nexport default PouchCommandHistoryStorage;\n//# sourceMappingURL=PouchCommandHistoryStorage.js.map","// eslint-disable-next-line import/prefer-default-export\nexport const SET_LAYOUT_STORAGE = 'SET_LAYOUT_STORAGE';\n","import type { LayoutStorage } from '@deephaven/app-utils';\nimport { SET_LAYOUT_STORAGE } from './actionTypes';\n\n// eslint-disable-next-line import/prefer-default-export\nexport const setLayoutStorage = (\n layoutStorage: LayoutStorage\n): { type: string; payload: LayoutStorage } => ({\n type: SET_LAYOUT_STORAGE,\n payload: layoutStorage,\n});\n","// The Deephaven API script isn't packaged as a module (yet), and is just included in index.html, exported to the global namespace\n// This include file is simply a wrapper so that it behaves like a module, and can be mocked easily for unit tests\n\nvar {\n dh\n} = globalThis;\nexport default dh;\n//# sourceMappingURL=dh.js.map","import { DbNameValidator } from '@deephaven/utils';\nimport {\n DateTimeColumnFormatter,\n IntegerColumnFormatter,\n DecimalColumnFormatter,\n type TableColumnFormat,\n type FormattingRule,\n} from '@deephaven/jsapi-utils';\nimport type { dh as DhType } from '@deephaven/jsapi-types';\nimport Log from '@deephaven/log';\nimport type { ServerConfigValues } from '@deephaven/redux';\nimport Bowser from 'bowser';\nimport { type PluginModuleMap } from '@deephaven/plugin';\n\nconst log = Log.module('SettingsUtils');\n\nexport type FormatOption = {\n defaultFormatString?: string;\n};\n\nexport type ValidFormatterItem = FormattingRule & {\n id?: number;\n isNewRule?: boolean;\n};\n\nexport type FormatterItem = Omit<ValidFormatterItem, 'format'> & {\n format: Partial<TableColumnFormat>;\n};\n\nfunction isFormatStringFormat(\n format: Partial<TableColumnFormat>\n): format is Pick<TableColumnFormat, 'formatString'> {\n return (\n (format as Pick<TableColumnFormat, 'formatString'>).formatString != null\n );\n}\n\n/**\n * Get an object containing all version information formatted for display\n * @param serverConfigValues The server config values\n * @returns The formatted version info or \"Unknown\" for any value not available\n */\nexport function getFormattedVersionInfo(\n serverConfigValues: ServerConfigValues\n): Record<string, string> {\n const ua = Bowser.parse(window.navigator.userAgent);\n const browser = `${ua.browser.name ?? ''} ${\n // use only the major version and minor version, rest is usually empty 120.1.0.0 -> 120.1\n Number(parseFloat(ua.browser.version ?? '')) || ''\n }`;\n const os = `${ua.os.name ?? ''} ${ua.os.version ?? ''}`;\n const pythonVersion = serverConfigValues.get('python.version') ?? '';\n return {\n 'Engine Version': serverConfigValues.get('deephaven.version') ?? 'Unknown',\n 'Web UI Version': import.meta.env.npm_package_version ?? 'Unknown',\n // Python version is only available in python sessions\n ...(pythonVersion !== '' ? { 'Python Version': pythonVersion } : {}),\n 'Java Version': serverConfigValues.get('java.version') ?? 'Unknown',\n 'Groovy Version': serverConfigValues.get('groovy.version') ?? 'Unknown',\n 'Barrage Version': serverConfigValues.get('barrage.version') ?? 'Unknown',\n 'Browser Name': browser.trim() || 'Unknown',\n 'User Agent OS': os.trim() || 'Unknown',\n };\n}\n\n/**\n * Get an object containing all JS plugin information formatted for display\n * @param serverConfigValues The information for all plugins\n * @returns The formatted mapping from plugin name to version\n */\nexport function getFormattedPluginInfo(\n pluginDataValues: PluginModuleMap\n): Record<string, string> {\n return Array.from(pluginDataValues.entries())\n .filter(plugin => plugin[1].version !== undefined)\n .reduce((acc, [key, value]) => ({ ...acc, [key]: value.version }), {});\n}\n\nexport function focusFirstInputInContainer(\n container: HTMLElement | null\n): void {\n const input: HTMLElement | null | undefined = container?.querySelector(\n 'input, select, textarea'\n );\n if (input) {\n input.focus();\n }\n}\n\nexport function isSameOptions(\n options1: FormatOption,\n options2: FormatOption\n): boolean {\n return options1.defaultFormatString === options2.defaultFormatString;\n}\n\nexport function isSameDecimalOptions(\n options1: FormatOption,\n options2: FormatOption\n): boolean {\n return isSameOptions(options1, options2);\n}\n\nexport function isSameIntegerOptions(\n options1: FormatOption,\n options2: FormatOption\n): boolean {\n return isSameOptions(options1, options2);\n}\n\nexport function isValidColumnName(name: string): boolean {\n return name !== '' && DbNameValidator.isValidColumnName(name);\n}\n\nexport function isValidFormat(\n dh: typeof DhType,\n columnType: string,\n format: Partial<TableColumnFormat>\n): boolean {\n // Undefined or empty string formats are always invalid\n if (\n !columnType ||\n format.formatString == null ||\n !isFormatStringFormat(format)\n ) {\n return false;\n }\n switch (columnType) {\n case 'datetime':\n return DateTimeColumnFormatter.isValid(dh, format);\n case 'decimal':\n return DecimalColumnFormatter.isValid(dh, format);\n case 'int':\n return IntegerColumnFormatter.isValid(dh, format);\n default: {\n log.warn('Trying to validate format of unknown type');\n return true;\n }\n }\n}\n\nexport function removeFormatRuleExtraProps(\n item: ValidFormatterItem\n): FormattingRule {\n const { id, isNewRule, ...rest } = item;\n return rest;\n}\n\nexport function isFormatRuleValidForSave(\n dh: typeof DhType,\n rule: FormatterItem\n): rule is ValidFormatterItem {\n return (\n isValidColumnName(rule.columnName) &&\n isValidFormat(dh, rule.columnType, rule.format)\n );\n}\n\nexport default {\n focusFirstInputInContainer,\n isSameOptions,\n isSameDecimalOptions,\n isSameIntegerOptions,\n isValidColumnName,\n isValidFormat,\n removeFormatRuleExtraProps,\n isFormatRuleValidForSave,\n};\n","import React, { type ReactElement, useMemo } from 'react';\nimport {\n Formatter,\n DateTimeColumnFormatter,\n TableUtils,\n} from '@deephaven/jsapi-utils';\nimport { useApi } from '@deephaven/jsapi-bootstrap';\n\ninterface DateTimeOptionProps {\n timestamp: Date;\n timeZone: string;\n showTimeZone: boolean;\n showTSeparator: boolean;\n isGlobalOptions: boolean;\n legacyGlobalFormat?: string;\n}\n\nexport default function DateTimeOptions(\n props: DateTimeOptionProps\n): ReactElement {\n const {\n timestamp,\n timeZone,\n showTimeZone,\n showTSeparator,\n isGlobalOptions,\n legacyGlobalFormat,\n } = props;\n\n const dh = useApi();\n\n const formatter = useMemo(\n () =>\n new Formatter(dh, [], {\n timeZone,\n showTimeZone,\n showTSeparator,\n }),\n [dh, showTimeZone, showTSeparator, timeZone]\n );\n const formats = isGlobalOptions\n ? DateTimeColumnFormatter.getGlobalFormats(showTimeZone, showTSeparator)\n : DateTimeColumnFormatter.getFormats(showTimeZone, showTSeparator);\n\n if (legacyGlobalFormat != null && !formats.includes(legacyGlobalFormat)) {\n formats.unshift(legacyGlobalFormat);\n }\n\n return (\n <>\n {formats.map(formatString => {\n const format = DateTimeColumnFormatter.makeFormat(\n '',\n formatString,\n DateTimeColumnFormatter.TYPE_GLOBAL\n );\n return (\n <option\n value={formatString}\n key={formatString}\n data-testid=\"time-format\"\n >\n {formatter.getFormattedString(\n timestamp,\n TableUtils.dataType.DATETIME,\n '',\n format\n )}\n </option>\n );\n })}\n </>\n );\n}\n","import React from 'react';\nimport { TimeUtils } from '@deephaven/utils';\n\nexport default function TimeZoneOptions(): JSX.Element {\n return (\n <>\n {TimeUtils.TIME_ZONES.map(timeZone => {\n const { label, value } = timeZone;\n return (\n <option value={value} key={value}>\n {label}\n </option>\n );\n })}\n </>\n );\n}\n","import React, {\n type ChangeEvent,\n PureComponent,\n type ReactElement,\n type RefObject,\n} from 'react';\nimport { connect } from 'react-redux';\nimport { vsRefresh } from '@deephaven/icons';\nimport memoize from 'memoizee';\nimport debounce from 'lodash.debounce';\nimport classNames from 'classnames';\nimport { Button, Checkbox, Select } from '@deephaven/components';\nimport {\n IntegerColumnFormatter,\n DecimalColumnFormatter,\n TableUtils,\n} from '@deephaven/jsapi-utils';\nimport type { dh as DhType } from '@deephaven/jsapi-types';\nimport Log from '@deephaven/log';\nimport {\n getApi,\n getDefaultDateTimeFormat,\n getDefaultDecimalFormatOptions,\n getDefaultIntegerFormatOptions,\n getTimeZone,\n getShowTimeZone,\n getShowTSeparator,\n getTruncateNumbersWithPound,\n getShowEmptyStrings,\n getShowNullStrings,\n getShowExtraGroupColumn,\n updateSettings as updateSettingsAction,\n type RootState,\n type WorkspaceSettings,\n getDefaultSettings,\n} from '@deephaven/redux';\nimport './FormattingSectionContent.scss';\nimport type { DebouncedFunc } from 'lodash';\nimport {\n focusFirstInputInContainer,\n isSameDecimalOptions,\n isSameIntegerOptions,\n isValidFormat,\n} from './SettingsUtils';\nimport type { FormatOption } from './SettingsUtils';\nimport DateTimeOptions from './DateTimeOptions';\nimport TimeZoneOptions from './TimeZoneOptions';\n\nconst log = Log.module('FormattingSectionContent');\n\ninterface FormattingSectionContentProps {\n dh: typeof DhType;\n defaultDateTimeFormat: string;\n showTimeZone: boolean;\n showTSeparator: boolean;\n timeZone: string;\n truncateNumbersWithPound: boolean;\n showEmptyStrings: boolean;\n showNullStrings: boolean;\n showExtraGroupColumn: boolean;\n updateSettings: (settings: Partial<WorkspaceSettings>) => void;\n defaultDecimalFormatOptions: FormatOption;\n defaultIntegerFormatOptions: FormatOption;\n defaults: WorkspaceSettings;\n}\n\ninterface FormattingSectionContentState {\n showTimeZone: boolean;\n showTSeparator: boolean;\n timeZone: string;\n defaultDateTimeFormat: string;\n defaultDecimalFormatOptions: FormatOption;\n defaultIntegerFormatOptions: FormatOption;\n truncateNumbersWithPound: boolean;\n showEmptyStrings: boolean;\n showNullStrings: boolean;\n showExtraGroupColumn: boolean;\n timestampAtMenuOpen: Date;\n}\n\nexport class FormattingSectionContent extends PureComponent<\n FormattingSectionContentProps,\n FormattingSectionContentState\n> {\n static defaultProps = {\n scrollTo: (): void => undefined,\n };\n\n static inputDebounceTime = 250;\n\n constructor(props: FormattingSectionContentProps) {\n super(props);\n\n this.debouncedCommitChanges = debounce(\n this.commitChanges.bind(this),\n FormattingSectionContent.inputDebounceTime\n );\n this.queueUpdate = this.queueUpdate.bind(this);\n this.handleDefaultDateTimeFormatChange =\n this.handleDefaultDateTimeFormatChange.bind(this);\n this.handleDefaultDecimalFormatChange =\n this.handleDefaultDecimalFormatChange.bind(this);\n this.handleDefaultIntegerFormatChange =\n this.handleDefaultIntegerFormatChange.bind(this);\n this.handleShowTimeZoneChange = this.handleShowTimeZoneChange.bind(this);\n this.handleShowTSeparatorChange =\n this.handleShowTSeparatorChange.bind(this);\n this.handleTimeZoneChange = this.handleTimeZoneChange.bind(this);\n this.handleResetDateTimeFormat = this.handleResetDateTimeFormat.bind(this);\n this.handleResetDecimalFormat = this.handleResetDecimalFormat.bind(this);\n this.handleResetIntegerFormat = this.handleResetIntegerFormat.bind(this);\n this.handleResetTimeZone = this.handleResetTimeZone.bind(this);\n this.handleTruncateNumbersWithPoundChange =\n this.handleTruncateNumbersWithPoundChange.bind(this);\n this.handleShowEmptyStringsChange =\n this.handleShowEmptyStringsChange.bind(this);\n this.handleShowNullStringsChange =\n this.handleShowNullStringsChange.bind(this);\n this.handleShowExtraGroupColumnChange =\n this.handleShowExtraGroupColumnChange.bind(this);\n\n const {\n defaultDateTimeFormat,\n defaultDecimalFormatOptions,\n defaultIntegerFormatOptions,\n showTimeZone,\n showTSeparator,\n timeZone,\n truncateNumbersWithPound,\n showEmptyStrings,\n showNullStrings,\n showExtraGroupColumn,\n } = props;\n\n this.containerRef = React.createRef();\n this.pendingUpdates = [];\n\n this.state = {\n showTimeZone,\n showTSeparator,\n timeZone,\n defaultDateTimeFormat,\n defaultDecimalFormatOptions,\n defaultIntegerFormatOptions,\n truncateNumbersWithPound,\n showEmptyStrings,\n showNullStrings,\n showExtraGroupColumn,\n timestampAtMenuOpen: new Date(),\n };\n }\n\n componentDidMount(): void {\n focusFirstInputInContainer(this.containerRef.current);\n }\n\n componentWillUnmount(): void {\n this.debouncedCommitChanges.flush();\n }\n\n debouncedCommitChanges: DebouncedFunc<() => void>;\n\n pendingUpdates: Partial<WorkspaceSettings>[];\n\n containerRef: RefObject<HTMLDivElement>;\n\n getCachedDateTimeFormatOptions = memoize(\n (\n timeZone: string,\n showTimeZone: boolean,\n showTSeparator: boolean,\n isGlobalOptions = false,\n legacyGlobalFormat?: string\n ) => {\n const { timestampAtMenuOpen } = this.state;\n return (\n <DateTimeOptions\n timestamp={timestampAtMenuOpen}\n timeZone={timeZone}\n showTimeZone={showTimeZone}\n showTSeparator={showTSeparator}\n isGlobalOptions={isGlobalOptions}\n legacyGlobalFormat={legacyGlobalFormat}\n />\n );\n },\n { max: 100 }\n );\n\n queueUpdate(updates: Partial<WorkspaceSettings>): void {\n this.pendingUpdates.push(updates);\n this.debouncedCommitChanges();\n }\n\n handleDefaultDateTimeFormatChange(value: string): void {\n log.debug('handleDefaultDateTimeFormatChange', value);\n const update = {\n defaultDateTimeFormat: value,\n };\n this.setState(update);\n this.queueUpdate(update);\n }\n\n handleDefaultDecimalFormatChange(event: ChangeEvent<HTMLInputElement>): void {\n log.debug('handleDefaultDecimalFormatChange', event.target.value);\n const update = {\n defaultDecimalFormatOptions: {\n defaultFormatString: event.target.value,\n },\n };\n this.setState(update);\n if (\n isValidFormat(\n dh,\n TableUtils.dataType.DECIMAL,\n DecimalColumnFormatter.makeCustomFormat(event.target.value)\n )\n ) {\n this.queueUpdate(update);\n }\n }\n\n handleDefaultIntegerFormatChange(event: ChangeEvent<HTMLInputElement>): void {\n log.debug('handleDefaultIntegerFormatChange', event.target.value);\n const update = {\n defaultIntegerFormatOptions: {\n defaultFormatString: event.target.value,\n },\n };\n this.setState(update);\n if (\n isValidFormat(\n dh,\n TableUtils.dataType.INT,\n IntegerColumnFormatter.makeCustomFormat(event.target.value)\n )\n ) {\n this.queueUpdate(update);\n }\n }\n\n handleShowTimeZoneChange(): void {\n const { showTimeZone } = this.state;\n const update = { showTimeZone: !showTimeZone };\n this.setState(update);\n this.queueUpdate(update);\n }\n\n handleShowTSeparatorChange(): void {\n const { showTSeparator } = this.state;\n const update = { showTSeparator: !showTSeparator };\n this.setState(update);\n this.queueUpdate(update);\n }\n\n handleTimeZoneChange(value: string): void {\n const update = { timeZone: value };\n this.setState(update);\n this.queueUpdate(update);\n }\n\n handleResetDateTimeFormat(): void {\n const { defaults } = this.props;\n const { defaultDateTimeFormat, showTimeZone, showTSeparator } = defaults;\n log.debug('handleResetDateTimeFormat');\n this.setState({\n defaultDateTimeFormat,\n showTimeZone,\n showTSeparator,\n });\n this.queueUpdate({\n defaultDateTimeFormat: undefined,\n showTimeZone: undefined,\n showTSeparator: undefined,\n });\n }\n\n handleResetTimeZone(): void {\n const { defaults } = this.props;\n const { timeZone } = defaults;\n log.debug('handleResetTimeZone');\n this.setState({\n timeZone,\n });\n this.queueUpdate({\n timeZone: undefined,\n });\n }\n\n handleResetDecimalFormat(): void {\n const { defaults } = this.props;\n const { defaultDecimalFormatOptions } = defaults;\n log.debug('handleResetDecimalFormat');\n this.setState({\n defaultDecimalFormatOptions,\n });\n this.queueUpdate({\n defaultDecimalFormatOptions: undefined,\n });\n }\n\n handleResetIntegerFormat(): void {\n const { defaults } = this.props;\n const { defaultIntegerFormatOptions } = defaults;\n log.debug('handleResetIntegerFormat');\n this.setState({\n defaultIntegerFormatOptions,\n });\n this.queueUpdate({\n defaultIntegerFormatOptions: undefined,\n });\n }\n\n handleTruncateNumbersWithPoundChange(): void {\n const { truncateNumbersWithPound } = this.state;\n const update = {\n truncateNumbersWithPound: truncateNumbersWithPound !== true,\n };\n this.setState(update);\n this.queueUpdate(update);\n }\n\n handleShowEmptyStringsChange(): void {\n const { showEmptyStrings } = this.state;\n const update = {\n showEmptyStrings: !showEmptyStrings,\n };\n this.setState(update);\n this.queueUpdate(update);\n }\n\n handleShowNullStringsChange(): void {\n const { showNullStrings } = this.state;\n const update = {\n showNullStrings: !showNullStrings,\n };\n this.setState(update);\n this.queueUpdate(update);\n }\n\n handleShowExtraGroupColumnChange(): void {\n const { showExtraGroupColumn } = this.state;\n const update = {\n showExtraGroupColumn: !showExtraGroupColumn,\n };\n this.setState(update);\n this.queueUpdate(update);\n }\n\n commitChanges(): void {\n const { updateSettings } = this.props;\n const updates = this.pendingUpdates.reduce(\n (acc, update) => ({\n ...acc,\n ...update,\n }),\n {}\n );\n this.pendingUpdates = [];\n\n updateSettings(updates);\n }\n\n render(): ReactElement {\n const { defaults, dh } = this.props;\n const {\n defaultDateTimeFormat,\n defaultDecimalFormatOptions,\n defaultIntegerFormatOptions,\n timeZone,\n showTimeZone,\n showTSeparator,\n truncateNumbersWithPound,\n showEmptyStrings,\n showNullStrings,\n showExtraGroupColumn,\n } = this.state;\n\n const {\n defaultFormatString:\n defaultDecimalFormatString = DecimalColumnFormatter.DEFAULT_FORMAT_STRING,\n } = defaultDecimalFormatOptions ?? {};\n const {\n defaultFormatString:\n defaultIntegerFormatString = IntegerColumnFormatter.DEFAULT_FORMAT_STRING,\n } = defaultIntegerFormatOptions ?? {};\n\n const isTimeZoneDefault = timeZone === defaults.timeZone;\n const isDateTimeOptionsDefault =\n showTSeparator === defaults.showTSeparator &&\n showTimeZone === defaults.showTimeZone &&\n defaultDateTimeFormat === defaults.defaultDateTimeFormat;\n const isDecimalOptionsDefault = isSameDecimalOptions(\n defaultDecimalFormatOptions,\n defaults.defaultDecimalFormatOptions\n );\n const isIntegerOptionsDefault = isSameIntegerOptions(\n defaultIntegerFormatOptions,\n defaults.defaultIntegerFormatOptions\n );\n\n return (\n <div className=\"app-settings-formatting-section\" ref={this.containerRef}>\n <div className=\"container-fluid p-0\">\n <div className=\"app-settings-menu-description mb-3\">\n Choose the default formatting rule to apply to all table columns\n based on their type.\n </div>\n <div className=\"form-row mb-2\">\n <label\n className=\"col-form-label col-3\"\n htmlFor=\"select-reset-timezone\"\n >\n Time zone\n </label>\n <div className=\"col pr-0\">\n <Select\n className=\"custom-select\"\n value={timeZone}\n onChange={this.handleTimeZoneChange}\n id=\"select-reset-timezone\"\n >\n <TimeZoneOptions />\n </Select>\n </div>\n <div className=\"col-1 btn-col\">\n <Button\n kind=\"ghost\"\n icon={vsRefresh}\n onClick={this.handleResetTimeZone}\n tooltip=\"Reset Time Zone\"\n className={classNames('btn-reset', 'btn-reset-time-zone', {\n hidden: isTimeZoneDefault,\n })}\n />\n </div>\n </div>\n <div className=\"form-row mb-2\">\n <label\n className=\"col-form-label col-3\"\n htmlFor=\"select-default-time-format\"\n >\n DateTime\n </label>\n <div className=\"col pr-0\">\n <Select\n className=\"custom-select\"\n value={defaultDateTimeFormat}\n onChange={this.handleDefaultDateTimeFormatChange}\n id=\"select-default-time-format\"\n >\n {this.getCachedDateTimeFormatOptions(\n timeZone,\n showTimeZone,\n showTSeparator,\n true,\n defaultDateTimeFormat\n )}\n </Select>\n </div>\n <div className=\"col-1 btn-col\">\n <Button\n kind=\"ghost\"\n icon={vsRefresh}\n onClick={this.handleResetDateTimeFormat}\n tooltip=\"Reset DateTime Options\"\n className={classNames('btn-reset', 'btn-reset-date-time', {\n hidden: isDateTimeOptionsDefault,\n })}\n />\n </div>\n </div>\n <div className=\"form-row\">\n <div className=\"offset-3 col-9\">\n <Checkbox\n checked={showTimeZone ?? null}\n onChange={this.handleShowTimeZoneChange}\n >\n Show time zone in dates\n </Checkbox>\n </div>\n </div>\n\n <div className=\"form-row mb-3\">\n <div className=\"offset-3 col-9\">\n <Checkbox\n checked={showTSeparator ?? null}\n onChange={this.handleShowTSeparatorChange}\n >\n Show 'T' separator\n </Checkbox>\n </div>\n </div>\n <div className=\"form-row mb-2\">\n <label\n className=\"col-form-label col-3\"\n htmlFor=\"default-decimal-format-input\"\n >\n Decimal\n </label>\n <div className=\"col pr-0\">\n <input\n className={classNames(\n 'form-control',\n 'flex-grow-1',\n 'default-decimal-format-input',\n {\n 'is-invalid': !isValidFormat(\n dh,\n TableUtils.dataType.DECIMAL,\n DecimalColumnFormatter.makeCustomFormat(\n defaultDecimalFormatString\n )\n ),\n }\n )}\n data-lpignore\n placeholder={DecimalColumnFormatter.DEFAULT_FORMAT_STRING}\n type=\"text\"\n id=\"default-decimal-format-input\"\n value={defaultDecimalFormatString}\n onChange={this.handleDefaultDecimalFormatChange}\n />\n </div>\n <div className=\"col-1 btn-col\">\n <Button\n kind=\"ghost\"\n icon={vsRefresh}\n onClick={this.handleResetDecimalFormat}\n tooltip=\"Reset Decimal Formatting\"\n className={classNames('btn-reset', 'btn-reset-decimal', {\n hidden: isDecimalOptionsDefault,\n })}\n data-testid=\"btn-reset-decimal\"\n />\n </div>\n </div>\n <div className=\"form-row mb-2\">\n <label\n className=\"col-form-label col-3\"\n htmlFor=\"default-integer-format-input\"\n >\n Integer\n </label>\n <div className=\"col pr-0\">\n <input\n className={classNames(\n 'form-control',\n 'flex-grow-1',\n 'default-integer-format-input',\n {\n 'is-invalid': !isValidFormat(\n dh,\n TableUtils.dataType.INT,\n IntegerColumnFormatter.makeCustomFormat(\n defaultIntegerFormatString\n )\n ),\n }\n )}\n data-lpignore\n placeholder={IntegerColumnFormatter.DEFAULT_FORMAT_STRING}\n type=\"text\"\n id=\"default-integer-format-input\"\n value={defaultIntegerFormatString}\n onChange={this.handleDefaultIntegerFormatChange}\n />\n </div>\n <div className=\"col-1 btn-col\">\n <Button\n kind=\"ghost\"\n icon={vsRefresh}\n onClick={this.handleResetIntegerFormat}\n tooltip=\"Reset Integer Formatting\"\n className={classNames('btn-reset', 'btn-reset-integer', {\n hidden: isIntegerOptionsDefault,\n })}\n data-testid=\"btn-reset-integer\"\n />\n </div>\n </div>\n <div className=\"form-row mb-2\">\n <div className=\"offset-3 col-9\">\n <Checkbox\n checked={truncateNumbersWithPound ?? null}\n onChange={this.handleTruncateNumbersWithPoundChange}\n >\n Show truncated numbers as ###\n </Checkbox>\n </div>\n </div>\n\n <div className=\"form-row mb-3\">\n <label\n className=\"col-form-label col-3\"\n htmlFor=\"default-integer-format-input\"\n >\n String\n </label>\n <div className=\"col pr-0 pt-2\">\n <Checkbox\n checked={showEmptyStrings ?? null}\n onChange={this.handleShowEmptyStringsChange}\n >\n Show empty strings as{' '}\n <span className=\"font-italic text-muted\">empty</span>\n </Checkbox>\n <Checkbox\n checked={showNullStrings ?? null}\n onChange={this.handleShowNullStringsChange}\n >\n Show null strings as{' '}\n <span className=\"font-italic text-muted\">null</span>\n </Checkbox>\n </div>\n </div>\n\n <div className=\"form-row mb-3\" id=\"show_extra_group_column_div\">\n <label\n className=\"col-form-label col-3\"\n htmlFor=\"default-show-extra-group-column\"\n >\n Rollup\n </label>\n <div className=\"col pr-0 pt-2\" id=\"default-show-extra-group-column\">\n <Checkbox\n checked={showExtraGroupColumn}\n onChange={this.handleShowExtraGroupColumnChange}\n >\n Show extra "group" column\n </Checkbox>\n </div>\n </div>\n </div>\n </div>\n );\n }\n}\n\nconst mapStateToProps = (\n state: RootState\n): Omit<FormattingSectionContentProps, 'updateSettings'> => ({\n defaultDateTimeFormat: getDefaultDateTimeFormat(state),\n defaultDecimalFormatOptions: getDefaultDecimalFormatOptions(state),\n defaultIntegerFormatOptions: getDefaultIntegerFormatOptions(state),\n dh: getApi(state),\n showTimeZone: getShowTimeZone(state),\n showTSeparator: getShowTSeparator(state),\n truncateNumbersWithPound: getTruncateNumbersWithPound(state),\n showEmptyStrings: getShowEmptyStrings(state),\n showNullStrings: getShowNullStrings(state),\n showExtraGroupColumn: getShowExtraGroupColumn(state),\n timeZone: getTimeZone(state),\n defaults: getDefaultSettings(state),\n});\n\nconst ConnectedFormattingSectionContent = connect(mapStateToProps, {\n updateSettings: updateSettingsAction,\n})(FormattingSectionContent);\n\nexport default ConnectedFormattingSectionContent;\n","import React, { type ReactElement, useState } from 'react';\nimport { Button, Modal, ModalBody, ModalHeader } from '@deephaven/components';\nimport { vsLaw } from '@deephaven/icons';\n\nfunction LegalNotice(): ReactElement {\n const [modal, setModal] = useState(false);\n const toggle = (): void => {\n setModal(!modal);\n };\n\n return (\n <>\n <Button kind=\"ghost\" onClick={toggle} icon={vsLaw}>\n Legal Notices\n </Button>\n <Modal isOpen={modal} toggle={toggle}>\n <ModalHeader toggle={toggle}>Legal Notice</ModalHeader>\n <ModalBody>\n <p>\n Deephaven software is protected by U.S. Patent Nos. 9,612,959;\n 9,613,018; 9,613,109; 9,619,210; 9,633,060; 9,639,570; 9,672,238;\n 9,679,006; 9,690,821; 9,710,511; 9,760,591; 9,805,084; 9,836,494;\n 9,836,495; 9,886,469; 9,898,496; 9,934,266; 10,002,153; 10,002,154;\n 10,002,155; 10,003,673; 10,019,138; 10,069,943; 10,176,211;\n 10,198,465; 10,198,466; 10,198,469; 10,212,257; 10,241,960;\n 10,241,965; 10,242,040; 10,242,041; 10,346,394; 10,353,893;\n 10,452,649; 10,496,639; 10,540,351; 10,552,412; 10,565,194;\n 10,565,206; 10,572,474; 10,621,168; 10,642,829; 10,657,184;\n 10,678,787; 10,691,686; 10,783,191; 10,866,943; 10,909,183;\n 10,915,526; 10,922,311; 10,929,394; 11,023,462; 11,126,662;\n 11,151,133; 11,238,036; 11,249,994; 11,263,211; 11,449,557;\n 11,514,037; 11,556,528; and 11,574,018. Other patents pending.\n </p>\n <p>\n © 2016-{new Date().getFullYear()} Deephaven Data Labs LLC. Patent\n Pending.\n </p>\n </ModalBody>\n </Modal>\n </>\n );\n}\n\nexport default LegalNotice;\n","import React, { type ReactElement } from 'react';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { Button, Collapse } from '@deephaven/components';\nimport { vsTriangleDown } from '@deephaven/icons';\n\ntype SettingsMenuSectionProps = React.PropsWithChildren<{\n isExpanded: boolean;\n sectionKey: string;\n title: ReactElement;\n onToggle: (sectionkey: string) => void;\n}>;\n\nfunction SettingsMenuSection(props: SettingsMenuSectionProps): ReactElement {\n const { children, isExpanded, sectionKey, title, onToggle } = props;\n return (\n <>\n <div>\n <Button\n kind=\"ghost\"\n className=\"btn-collapse-trigger\"\n onClick={() => onToggle(sectionKey)}\n >\n <div className=\"d-flex align-items-center flex-grow-1\">{title}</div>\n <div className=\"flex-shrink-0\">\n <FontAwesomeIcon\n transform={isExpanded ? 'flip-v' : ''}\n icon={vsTriangleDown}\n />\n </div>\n </Button>\n </div>\n <Collapse in={isExpanded} autoFocusOnShow>\n {children}\n </Collapse>\n </>\n );\n}\n\nexport default SettingsMenuSection;\n","import React, { useState, useEffect } from 'react';\nimport classNames from 'classnames';\nimport {\n Shortcut,\n Tooltip,\n ShortcutRegistry,\n ContextActionUtils,\n Button,\n KEY,\n} from '@deephaven/components';\nimport type { KeyState } from '@deephaven/components';\nimport { vsRefresh } from '@deephaven/icons';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport './ShortcutItem.scss';\n\ntype ShortcutItemProps = {\n shortcut: Shortcut;\n displayText: string;\n categoryName: string;\n onChange: (shortcut: Shortcut) => void;\n};\n\nexport default function ShortcutItem({\n shortcut,\n displayText: propsDisplayText,\n categoryName,\n onChange,\n}: ShortcutItemProps): JSX.Element {\n const [displayText, setDisplayText] = useState(propsDisplayText);\n const [keyState, setKeyState] = useState<KeyState>(shortcut.getKeyState());\n const [isPending, setIsPending] = useState(false);\n const [error, setError] = useState('');\n\n // If propsDisplayText changes, the shortcut was altered from a conflict state by the parent component\n useEffect(\n function resolveConflictOnPropChange() {\n setDisplayText(propsDisplayText);\n setKeyState(shortcut.getKeyState());\n },\n [propsDisplayText, shortcut]\n );\n\n // Updates displayText when keyState is changed\n useEffect(\n function onNewKeybind() {\n setDisplayText(Shortcut.getDisplayText(keyState));\n if (shortcut.matchesKeyState(keyState)) {\n setIsPending(false);\n }\n },\n [keyState, shortcut]\n );\n\n // Sets error state based on isPending\n useEffect(\n function setErrors() {\n if (isPending) {\n if (!Shortcut.isValidKeyState(keyState)) {\n if (Shortcut.isAllowedKey(keyState.keyValue)) {\n setError('Must contain a modifier key');\n } else {\n setError('Must contain an allowed action key');\n }\n return;\n }\n\n const conflictNames = ShortcutRegistry.getConflictingShortcuts(keyState)\n .filter(\n conflict =>\n conflict.id.startsWith(categoryName) && conflict !== shortcut\n )\n .map(conflict => conflict.name);\n\n if (conflictNames.length) {\n setError(`Conflicts with ${conflictNames.join(', ')}`);\n return;\n }\n\n setError('');\n } else {\n setError('');\n }\n },\n [isPending, keyState, categoryName, shortcut]\n );\n\n // Updates pending key state and sets input display text\n function handleInputKeyDown(e: React.KeyboardEvent<HTMLInputElement>): void {\n e.stopPropagation();\n e.preventDefault();\n\n if (shortcut.isEditable && !e.repeat) {\n const newKeyState = Shortcut.getKeyStateFromEvent(e);\n const backspaceKeyState = Shortcut.createKeyState([KEY.BACKSPACE]);\n\n // Backspace clears the shortcut\n if (Shortcut.doKeyStatesMatch(newKeyState, backspaceKeyState)) {\n setKeyState(Shortcut.NULL_KEY_STATE);\n } else {\n setKeyState(newKeyState);\n }\n }\n }\n\n // Set this shortcut to changing state, check key state validity and set errors\n function handleInputKeyUp(e: React.KeyboardEvent<HTMLInputElement>): void {\n e.stopPropagation();\n e.preventDefault();\n\n if (!shortcut.matchesKeyState(keyState)) {\n setIsPending(true);\n }\n }\n\n function handleInputFocus(): void {\n ContextActionUtils.disableAllActions();\n }\n\n function handleInputBlur(): void {\n ContextActionUtils.enableAllActions();\n }\n\n function handleConfirm(): void {\n shortcut.setKeyState(keyState);\n setIsPending(false);\n onChange(shortcut);\n }\n\n function handleUndo(): void {\n const originalKeyState = shortcut.getKeyState();\n setKeyState(originalKeyState);\n setIsPending(false);\n }\n\n function handleResetToDefaultClick(): void {\n setIsPending(true);\n setKeyState(shortcut.getDefaultKeyState());\n }\n\n return (\n <>\n <div className=\"shortcut-item-container\">\n <label className=\"shortcut-item-name\">\n {shortcut.name}\n {shortcut.tooltip !== undefined && (\n <Tooltip>{shortcut.tooltip}</Tooltip>\n )}\n </label>\n <div className=\"shortcut-item-input-container\">\n <input\n className={classNames('form-control', {\n 'is-invalid': error,\n })}\n onKeyDown={handleInputKeyDown}\n onKeyUp={handleInputKeyUp}\n onFocus={handleInputFocus}\n onBlur={handleInputBlur}\n disabled={!shortcut.isEditable}\n value={displayText}\n readOnly\n />\n {!Shortcut.doKeyStatesMatch(\n keyState,\n shortcut.getDefaultKeyState()\n ) &&\n !error && (\n <Button\n className=\"reset-to-default-button\"\n kind=\"ghost\"\n icon={\n <FontAwesomeIcon\n icon={vsRefresh}\n transform={{ rotate: 90, flipX: true }}\n />\n }\n tooltip=\"Reset to default\"\n onClick={handleResetToDefaultClick}\n />\n )}\n </div>\n </div>\n {isPending && (\n <div\n className={classNames('shortcut-item-message-container', {\n 'is-invalid': error,\n })}\n >\n <div className=\"shortcut-item-message\">{error}</div>\n <div className=\"shortcut-item-message-buttons\">\n {Shortcut.isValidKeyState(keyState) && (\n <Button kind=\"ghost\" onClick={handleConfirm}>\n Confirm\n </Button>\n )}\n <Button kind=\"ghost\" onClick={handleUndo}>\n Undo\n </Button>\n </div>\n </div>\n )}\n </>\n );\n}\n","import React, { useState, useMemo, useCallback } from 'react';\nimport { connect } from 'react-redux';\nimport { Shortcut, ShortcutRegistry } from '@deephaven/components';\nimport {\n getShortcutOverrides,\n type RootState,\n updateSettings as updateSettingsAction,\n type WorkspaceSettings,\n} from '@deephaven/redux';\nimport ShortcutItem from './ShortcutItem';\n\ntype ShortcutSectionContentProps = {\n shortcutOverrides: WorkspaceSettings['shortcutOverrides'];\n updateSettings: typeof updateSettingsAction;\n};\n\nfunction ShortcutSectionContent({\n shortcutOverrides = {},\n updateSettings,\n}: ShortcutSectionContentProps): JSX.Element {\n const saveShortcutOverrides = useCallback(\n (modifiedShortcuts: Shortcut[]) => {\n const isMac = Shortcut.isMacPlatform;\n\n // This ensures mac and windows objects both exist\n const newOverrides: Required<typeof shortcutOverrides> = {\n mac: { ...shortcutOverrides.mac },\n windows: { ...shortcutOverrides.windows },\n };\n const platformOverrides = isMac ? newOverrides.mac : newOverrides.windows;\n\n modifiedShortcuts.forEach(shortcut => {\n if (shortcut.isDefault()) {\n // No need to save overrides that are the default value\n delete platformOverrides[shortcut.id];\n } else {\n platformOverrides[shortcut.id] = shortcut.getKeyState();\n }\n });\n\n updateSettings({\n shortcutOverrides: newOverrides,\n });\n },\n [updateSettings, shortcutOverrides]\n );\n\n let categories = Array.from(\n ShortcutRegistry.shortcutsByCategory.entries()\n ).map(([name, shortcuts]) => ({\n name,\n shortcuts,\n }));\n\n // Move global category to the end\n const globalCategoryIndex = categories.findIndex(\n category => category.name.toUpperCase() === 'GLOBAL'\n );\n const globalCategory = categories.splice(globalCategoryIndex, 1);\n categories = categories.concat(globalCategory);\n\n return (\n <>\n <div className=\"app-settings-menu-description\">\n Customize shortcuts below. To prevent unexpected results, avoid\n conflicting shortcuts with the browser or IDE editor.\n </div>\n {categories.map(category => (\n <ShortcutCategory\n key={category.name}\n name={category.name}\n shortcuts={category.shortcuts}\n saveShortcutOverrides={saveShortcutOverrides}\n />\n ))}\n </>\n );\n}\n\ntype ShortcutCategoryProps = {\n name: string;\n shortcuts: Shortcut[];\n saveShortcutOverrides: (shortcuts: Shortcut[]) => void;\n};\n\nfunction ShortcutCategory({\n name,\n shortcuts: propsShortcuts,\n saveShortcutOverrides,\n}: ShortcutCategoryProps): JSX.Element {\n function formatCategoryName(categoryName: string): string {\n return categoryName\n .split('_')\n .map(word => `${word[0].toUpperCase()}${word.slice(1).toLowerCase()}`)\n .join(' ');\n }\n\n // Used to trigger a re-render when a shortcut is changed\n // Since shortcuts are singletons, React doesn't detect changes for a re-render as easily\n const [shortcuts, setShortcuts] = useState(propsShortcuts);\n\n function handleShortcutChange(shortcut: Shortcut): void {\n const conflictingShortcuts = shortcuts.filter(\n s =>\n s !== shortcut &&\n !s.isNull() &&\n s.matchesKeyState(shortcut.getKeyState())\n );\n\n // Set conflicting shortcuts to null\n conflictingShortcuts.forEach(conflict => conflict.setToNull());\n\n const modifiedShoftcuts = [shortcut, ...conflictingShortcuts];\n\n saveShortcutOverrides(modifiedShoftcuts);\n setShortcuts(s => [...s]);\n }\n\n const displayTexts = useMemo(\n () => shortcuts.map(s => s.getDisplayText()),\n [shortcuts]\n );\n\n return (\n <div className=\"mt-3\">\n <div className=\"font-weight-bold\">{formatCategoryName(name)}</div>\n {shortcuts.map((shortcut, i) => (\n <ShortcutItem\n key={shortcut.id}\n shortcut={shortcut}\n displayText={displayTexts[i]}\n categoryName={name}\n onChange={handleShortcutChange}\n />\n ))}\n </div>\n );\n}\n\nconst mapStateToProps = (\n state: RootState\n): Pick<ShortcutSectionContentProps, 'shortcutOverrides'> => ({\n shortcutOverrides: getShortcutOverrides(state),\n});\n\nconst mapDispatchToProps = { updateSettings: updateSettingsAction };\n\nconst ConnectedShortcutSectionContent = connect(\n mapStateToProps,\n mapDispatchToProps\n)(ShortcutSectionContent);\n\nexport default ConnectedShortcutSectionContent;\n","import React, { type ReactElement } from 'react';\nimport { TableUtils } from '@deephaven/jsapi-utils';\n\nconst columnTypesArray = [\n { value: TableUtils.dataType.DATETIME, label: 'DateTime' },\n { value: TableUtils.dataType.DECIMAL, label: 'Decimal' },\n { value: TableUtils.dataType.INT, label: 'Integer' },\n];\n\nexport default function ColumnTypeOptions(): ReactElement {\n const columnTypeOptions = columnTypesArray.map(item => (\n <option key={`key-columnType-${item.value}`} value={item.value}>\n {item.label}\n </option>\n ));\n\n return (\n <>\n <option key=\"key-columnType-placeholder\" disabled value=\"\">\n Select Type\n </option>\n {columnTypeOptions}\n </>\n );\n}\n","import React, {\n type ChangeEvent,\n PureComponent,\n type ReactElement,\n type RefObject,\n} from 'react';\nimport { connect } from 'react-redux';\nimport { dhNewCircleLargeFilled, vsTrash } from '@deephaven/icons';\nimport memoize from 'memoizee';\nimport { TransitionGroup } from 'react-transition-group';\nimport debounce from 'lodash.debounce';\nimport classNames from 'classnames';\nimport { Button, FadeTransition, Select } from '@deephaven/components';\nimport {\n DateTimeColumnFormatter,\n IntegerColumnFormatter,\n DecimalColumnFormatter,\n TableUtils,\n type TableColumnFormat,\n type FormattingRule,\n} from '@deephaven/jsapi-utils';\nimport type { dh as DhType } from '@deephaven/jsapi-types';\nimport {\n getApi,\n getDefaultDecimalFormatOptions,\n getDefaultIntegerFormatOptions,\n getFormatter,\n getTimeZone,\n getShowTimeZone,\n getShowTSeparator,\n updateSettings as updateSettingsAction,\n type RootState,\n type WorkspaceSettings,\n} from '@deephaven/redux';\nimport { assertNotNull } from '@deephaven/utils';\nimport './FormattingSectionContent.scss';\nimport type { DebouncedFunc } from 'lodash';\nimport {\n focusFirstInputInContainer,\n isValidColumnName,\n isValidFormat,\n removeFormatRuleExtraProps,\n isFormatRuleValidForSave,\n type ValidFormatterItem,\n type FormatterItem,\n type FormatOption,\n} from './SettingsUtils';\nimport ColumnTypeOptions from './ColumnTypeOptions';\nimport DateTimeOptions from './DateTimeOptions';\n\nexport interface ColumnSpecificSectionContentProps {\n dh: typeof DhType;\n formatter: FormatterItem[];\n showTimeZone: boolean;\n showTSeparator: boolean;\n timeZone: string;\n updateSettings: (settings: Partial<WorkspaceSettings>) => void;\n scrollTo: (x: number, y: number) => void;\n defaultDecimalFormatOptions: FormatOption;\n defaultIntegerFormatOptions: FormatOption;\n}\n\ninterface ColumnSpecificSectionContentState {\n formatSettings: FormatterItem[];\n formatRulesChanged: boolean;\n showTimeZone: boolean;\n showTSeparator: boolean;\n timeZone: string;\n timestampAtMenuOpen: Date;\n}\n\nexport class ColumnSpecificSectionContent extends PureComponent<\n ColumnSpecificSectionContentProps,\n ColumnSpecificSectionContentState\n> {\n static defaultProps = {\n scrollTo: (): void => undefined,\n };\n\n static inputDebounceTime = 250;\n\n constructor(props: ColumnSpecificSectionContentProps) {\n super(props);\n\n this.debouncedCommitChanges = debounce(\n this.commitChanges.bind(this),\n ColumnSpecificSectionContent.inputDebounceTime\n );\n\n this.handleFormatRuleEntered = this.handleFormatRuleEntered.bind(this);\n this.handleFormatRuleChange = this.handleFormatRuleChange.bind(this);\n this.handleFormatRuleCreate = this.handleFormatRuleCreate.bind(this);\n this.handleFormatRuleDelete = this.handleFormatRuleDelete.bind(this);\n\n const { formatter, showTimeZone, showTSeparator, timeZone } = props;\n\n const formatSettings = formatter.map((item, i) => ({\n ...item,\n id: i,\n }));\n\n this.containerRef = React.createRef();\n this.addFormatRuleButtonRef = React.createRef();\n\n this.lastFormatRuleIndex = formatSettings.length;\n\n this.state = {\n formatSettings,\n formatRulesChanged: false,\n showTimeZone,\n showTSeparator,\n timeZone,\n timestampAtMenuOpen: new Date(),\n };\n }\n\n componentDidMount(): void {\n focusFirstInputInContainer(this.containerRef.current);\n }\n\n componentWillUnmount(): void {\n this.debouncedCommitChanges.flush();\n }\n\n debouncedCommitChanges: DebouncedFunc<() => void>;\n\n containerRef: RefObject<HTMLDivElement>;\n\n addFormatRuleButtonRef: RefObject<HTMLButtonElement>;\n\n lastFormatRuleIndex: number;\n\n isDuplicateRule(rule: FormatterItem): boolean {\n const { formatSettings } = this.state;\n return (\n formatSettings.some(\n item =>\n item.id !== rule.id &&\n item.columnName === rule.columnName &&\n item.columnType === rule.columnType\n ) ?? false\n );\n }\n\n getAutoIncrementFormatRuleIndex(): number {\n const { lastFormatRuleIndex } = this;\n this.lastFormatRuleIndex += 1;\n return lastFormatRuleIndex;\n }\n\n getCachedColumnTypeOptions = memoize(() => <ColumnTypeOptions />, {\n max: 100,\n });\n\n getCachedDateTimeFormatOptions = memoize(\n (\n timeZone: string,\n showTimeZone: boolean,\n showTSeparator: boolean,\n isGlobalOptions = false,\n legacyGlobalFormat?: string\n ) => {\n const { timestampAtMenuOpen } = this.state;\n return (\n <DateTimeOptions\n timestamp={timestampAtMenuOpen}\n timeZone={timeZone}\n showTimeZone={showTimeZone}\n showTSeparator={showTSeparator}\n isGlobalOptions={isGlobalOptions}\n legacyGlobalFormat={legacyGlobalFormat}\n />\n );\n },\n { max: 100 }\n );\n\n handleFormatRuleChange(\n index: number,\n key: string,\n value: TableColumnFormat | string | boolean\n ): void {\n this.setState(\n state => {\n const { formatSettings: oldFormatSettings } = state;\n assertNotNull(oldFormatSettings);\n const formatSettings = [...oldFormatSettings];\n // Reset format string on type change\n let resetKeys = {};\n if (key === 'columnType') {\n resetKeys = {\n format: this.makeDefaultFormatterItemByType(value as string),\n };\n }\n const newEntry = {\n ...formatSettings[index],\n ...resetKeys,\n [key]: value,\n };\n\n formatSettings[index] = newEntry;\n return {\n formatSettings,\n };\n },\n () => {\n this.debouncedCommitChanges();\n }\n );\n }\n\n handleFormatRuleCreate(): void {\n this.setState(state => {\n const { formatSettings } = state;\n const newFormat = {\n columnType: TableUtils.dataType.DATETIME,\n columnName: '',\n format: {},\n id: this.getAutoIncrementFormatRuleIndex(),\n isNewRule: true,\n };\n return {\n formatSettings: [...formatSettings, newFormat],\n formatRulesChanged: true,\n };\n });\n }\n\n handleFormatRuleDelete(index: number): void {\n this.setState(\n state => {\n const { formatSettings: oldFormatSettings } = state;\n const formatSettings = oldFormatSettings.filter(\n (item, i) => i !== index\n );\n return {\n formatSettings,\n formatRulesChanged: true,\n };\n },\n () => {\n this.debouncedCommitChanges();\n }\n );\n }\n\n handleFormatRuleEntered(elem: HTMLElement): void {\n this.scrollToFormatBlockBottom();\n focusFirstInputInContainer(elem);\n }\n\n commitChanges(): void {\n const { formatSettings } = this.state;\n\n const { dh } = this.props;\n\n const formatter =\n formatSettings\n .filter((format): format is ValidFormatterItem =>\n isFormatRuleValidForSave(dh, format)\n )\n .map(removeFormatRuleExtraProps) ?? [];\n\n const { updateSettings } = this.props;\n const newSettings = {\n formatter: formatter as FormattingRule[],\n };\n updateSettings(newSettings);\n }\n\n scrollToFormatBlockBottom(): void {\n const { scrollTo } = this.props;\n scrollTo(\n 0,\n (this.addFormatRuleButtonRef.current?.offsetHeight ?? 0) +\n (this.addFormatRuleButtonRef.current?.offsetTop ?? 0)\n );\n }\n\n getRuleError(rule: FormatterItem): {\n hasColumnNameError: boolean;\n hasFormatError: boolean;\n message: string;\n } {\n const { dh } = this.props;\n const error = {\n hasColumnNameError: false,\n hasFormatError: false,\n message: '',\n };\n\n const errorMessages = [];\n\n if (rule.isNewRule !== undefined && rule.isNewRule) {\n return error;\n }\n\n if (this.isDuplicateRule(rule)) {\n error.hasColumnNameError = true;\n errorMessages.push('Duplicate column name/type combo.');\n }\n\n if (!isValidColumnName(rule.columnName)) {\n error.hasColumnNameError = true;\n errorMessages.push(\n 'Column names must start with a letter or underscore and contain only alphanumeric characters or underscores.'\n );\n }\n\n if (\n rule.format.formatString != null &&\n rule.format.formatString.length === 0\n ) {\n error.hasFormatError = true;\n errorMessages.push('Empty formatting rule.');\n } else if (!isValidFormat(dh, rule.columnType, rule.format)) {\n error.hasFormatError = true;\n errorMessages.push('Invalid formatting rule.');\n }\n\n error.message = errorMessages.join('\\n');\n return error;\n }\n\n makeDefaultFormatterItemByType(\n columnType: string\n ): TableColumnFormat | string {\n switch (TableUtils.getNormalizedType(columnType)) {\n case TableUtils.dataType.INT: {\n const { defaultIntegerFormatOptions } = this.props;\n const { defaultFormatString: defaultIntegerFormatString } =\n defaultIntegerFormatOptions;\n return IntegerColumnFormatter.makeFormat(\n '',\n defaultIntegerFormatString ??\n IntegerColumnFormatter.DEFAULT_FORMAT_STRING,\n IntegerColumnFormatter.TYPE_GLOBAL,\n undefined\n );\n }\n\n case TableUtils.dataType.DECIMAL: {\n const { defaultDecimalFormatOptions } = this.props;\n const { defaultFormatString: defaultDecimalFormatString } =\n defaultDecimalFormatOptions;\n return DecimalColumnFormatter.makeFormat(\n '',\n defaultDecimalFormatString ??\n DecimalColumnFormatter.DEFAULT_FORMAT_STRING,\n DecimalColumnFormatter.TYPE_GLOBAL,\n undefined\n );\n }\n default: {\n return '';\n }\n }\n }\n\n renderFormatRule(i: number, rule: FormatterItem): ReactElement {\n const columnNameId = `input-${i}-columnName`;\n const columnTypeId = `input-${i}-columnType`;\n const formatId = `input-${i}-format`;\n const columnTypeOptions = this.getCachedColumnTypeOptions();\n const onNameChange = (e: ChangeEvent<HTMLInputElement>): void =>\n this.handleFormatRuleChange(i, 'columnName', e.target.value);\n const onNameBlur = (): void =>\n this.handleFormatRuleChange(i, 'isNewRule', false);\n const onTypeChange = (eventTargetValue: string): void =>\n this.handleFormatRuleChange(i, 'columnType', eventTargetValue);\n\n const ruleError = this.getRuleError(rule);\n\n return (\n <fieldset key={i} className=\"container-fluid format-rule-container\">\n <div className=\"form-row\">\n <div className=\"form-group col-7 mb-2\">\n <label htmlFor={columnNameId}>Column Name</label>\n <input\n id={columnNameId}\n className={classNames('form-control', {\n 'is-invalid': ruleError.hasColumnNameError,\n })}\n data-lpignore\n type=\"text\"\n value={rule.columnName}\n onChange={onNameChange}\n onBlur={onNameBlur}\n />\n </div>\n <div className=\"form-group col mb-2\">\n <Button\n kind=\"ghost\"\n className=\"btn-delete-format-rule float-right\"\n tabIndex={-1}\n onClick={() => this.handleFormatRuleDelete(i)}\n icon={vsTrash}\n tooltip=\"Delete\"\n aria-label=\"Delete Format Rule\"\n />\n\n <label htmlFor={columnTypeId}>Column Type</label>\n <Select\n id={columnTypeId}\n className=\"custom-select\"\n value={rule.columnType}\n onChange={onTypeChange}\n >\n {columnTypeOptions}\n </Select>\n </div>\n </div>\n <div className=\"form-row\">\n <div className=\"form-group col-12 d-flex mb-2\">\n <label\n className=\"flex-shrink-0 col-form-label mr-3\"\n htmlFor={formatId}\n >\n Formatting Rule\n </label>\n {this.renderFormatRuleInput(\n i,\n rule.columnType,\n formatId,\n rule.format,\n ruleError.hasFormatError\n )}\n </div>\n </div>\n <div className=\"form-row\">\n <div className=\"form-group col-12 d-flex mb-2\">\n {ruleError.message && (\n <p className=\"text-danger\">{ruleError.message}</p>\n )}\n </div>\n </div>\n </fieldset>\n );\n }\n\n renderFormatRuleInput(\n i: number,\n columnType: string,\n formatId: string,\n format: Partial<TableColumnFormat>,\n isInvalid: boolean\n ): ReactElement | null {\n switch (TableUtils.getNormalizedType(columnType)) {\n case TableUtils.dataType.DATETIME:\n return this.renderDateTimeFormatRuleInput(\n i,\n formatId,\n format,\n isInvalid\n );\n case TableUtils.dataType.DECIMAL:\n return this.renderDecimalFormatRuleInput(\n i,\n formatId,\n format,\n isInvalid\n );\n case TableUtils.dataType.INT:\n return this.renderIntegerFormatRuleInput(\n i,\n formatId,\n format,\n isInvalid\n );\n default:\n throw new Error(`Unrecognized column type: ${columnType}`);\n }\n }\n\n renderDateTimeFormatRuleInput(\n i: number,\n formatId: string,\n format: Partial<TableColumnFormat>,\n isInvalid: boolean\n ): ReactElement {\n const { showTimeZone, showTSeparator, timeZone } = this.state;\n\n const value = format.formatString ?? '';\n return (\n <Select\n className={classNames('custom-select', { 'is-invalid': isInvalid })}\n value={value}\n id={formatId}\n onChange={eventTargetValue => {\n const selectedFormat = DateTimeColumnFormatter.makeFormat(\n '',\n eventTargetValue,\n DateTimeColumnFormatter.TYPE_GLOBAL\n );\n this.handleFormatRuleChange(i, 'format', selectedFormat);\n }}\n >\n <option key=\"default\" value=\"\" disabled>\n Select format\n </option>\n {this.getCachedDateTimeFormatOptions(\n timeZone,\n showTimeZone,\n showTSeparator\n )}\n </Select>\n );\n }\n\n renderIntegerFormatRuleInput(\n i: number,\n formatId: string,\n format: Partial<TableColumnFormat>,\n isInvalid: boolean\n ): ReactElement {\n const { defaultIntegerFormatOptions } = this.props;\n assertNotNull(defaultIntegerFormatOptions);\n const { defaultFormatString } = defaultIntegerFormatOptions;\n const value = format.formatString ?? '';\n return (\n <input\n className={classNames('form-control', 'flex-grow-1', {\n 'is-invalid': isInvalid,\n })}\n data-lpignore\n id={formatId}\n placeholder={\n defaultFormatString ?? IntegerColumnFormatter.DEFAULT_FORMAT_STRING\n }\n type=\"text\"\n value={value}\n onChange={e => {\n const selectedFormat = IntegerColumnFormatter.makeFormat(\n '',\n e.target.value,\n IntegerColumnFormatter.TYPE_GLOBAL,\n undefined\n );\n this.handleFormatRuleChange(i, 'format', selectedFormat);\n }}\n />\n );\n }\n\n renderDecimalFormatRuleInput(\n i: number,\n formatId: string,\n format: Partial<TableColumnFormat>,\n isInvalid: boolean\n ): ReactElement {\n const { defaultDecimalFormatOptions } = this.props;\n const { defaultFormatString } = defaultDecimalFormatOptions;\n\n const value = format.formatString ?? '';\n return (\n <input\n className={classNames('form-control', 'flex-grow-1', {\n 'is-invalid': isInvalid,\n })}\n data-lpignore\n id={formatId}\n placeholder={\n defaultFormatString ?? DecimalColumnFormatter.DEFAULT_FORMAT_STRING\n }\n type=\"text\"\n value={value}\n onChange={e => {\n const selectedFormat = DecimalColumnFormatter.makeFormat(\n '',\n e.target.value,\n DecimalColumnFormatter.TYPE_GLOBAL,\n undefined\n );\n this.handleFormatRuleChange(i, 'format', selectedFormat);\n }}\n />\n );\n }\n\n render(): ReactElement {\n const { formatRulesChanged, formatSettings } = this.state;\n\n const formatRules = formatSettings.map((rule, index) => (\n <FadeTransition key={rule.id} onEnter={this.handleFormatRuleEntered}>\n {this.renderFormatRule(index, rule)}\n </FadeTransition>\n ));\n\n const addNewRuleButton = (\n <Button\n kind=\"ghost\"\n className=\"mb-3\"\n onClick={this.handleFormatRuleCreate}\n ref={this.addFormatRuleButtonRef}\n icon={dhNewCircleLargeFilled}\n >\n Add New Rule\n </Button>\n );\n\n return (\n <div className=\"app-settings-formatting-section\" ref={this.containerRef}>\n <div className=\"app-settings-menu-description mb-3\">\n Customize the formatting of table columns by applying rules based on\n matching both a column name and column type.\n </div>\n\n <TransitionGroup\n appear={formatRulesChanged}\n enter={formatRulesChanged}\n exit={formatRulesChanged}\n >\n {formatRules}\n </TransitionGroup>\n\n {addNewRuleButton}\n </div>\n );\n }\n}\n\nconst mapStateToProps = (\n state: RootState\n): Omit<ColumnSpecificSectionContentProps, 'updateSettings' | 'scrollTo'> => ({\n formatter: getFormatter(state),\n defaultDecimalFormatOptions: getDefaultDecimalFormatOptions(state),\n defaultIntegerFormatOptions: getDefaultIntegerFormatOptions(state),\n dh: getApi(state),\n showTimeZone: getShowTimeZone(state),\n showTSeparator: getShowTSeparator(state),\n timeZone: getTimeZone(state),\n});\n\nconst ConnectedColumnSpecificSectionContent = connect(mapStateToProps, {\n updateSettings: updateSettingsAction,\n})(ColumnSpecificSectionContent);\n\nexport default ConnectedColumnSpecificSectionContent;\n","import React, { useCallback } from 'react';\nimport { useDispatch } from 'react-redux';\nimport {\n Content,\n ContextualHelp,\n Heading,\n Switch,\n Text,\n} from '@deephaven/components';\nimport { getWebGL, getWebGLEditable, updateSettings } from '@deephaven/redux';\nimport { useAppSelector } from '@deephaven/dashboard';\n\nfunction AdvancedSectionContent(): JSX.Element {\n const dispatch = useDispatch();\n const webgl = useAppSelector(getWebGL);\n const webglEditable = useAppSelector(getWebGLEditable);\n\n const handleWebglChange = useCallback(\n (newValue: boolean) => {\n dispatch(updateSettings({ webgl: newValue }));\n },\n [dispatch]\n );\n\n const helpText = webglEditable ? (\n <Text>\n WebGL in most cases has significant performance improvements, particularly\n when plotting large datasets. However, in some environments (such as\n remote desktop environments), WebGL may not use hardware acceleration and\n have degraded performance. If you are experiencing issues with WebGL, you\n can disable it here.\n </Text>\n ) : (\n <Text>\n WebGL is disabled by your system administrator. Contact your system\n administrator to enable.\n </Text>\n );\n\n return (\n <>\n <div className=\"app-settings-menu-description\">\n Advanced settings here. Be careful!\n </div>\n\n <div className=\"form-row mb-3 pl-1\">\n <Switch\n isSelected={webgl}\n isDisabled={!webglEditable}\n onChange={handleWebglChange}\n marginEnd=\"size-0\"\n >\n Enable WebGL\n </Switch>\n <ContextualHelp variant=\"info\" marginTop=\"size-50\">\n <Heading>Enable WebGL</Heading>\n <Content>\n <Text>{helpText}</Text>\n </Content>\n </ContextualHelp>\n </div>\n </>\n );\n}\n\nexport default AdvancedSectionContent;\n","import React, { useCallback } from 'react';\nimport {\n Item,\n type ItemKey,\n Picker,\n ThemePicker,\n useTheme,\n} from '@deephaven/components';\nimport { assertNotNull } from '@deephaven/utils';\nimport { useDispatch } from 'react-redux';\nimport { getSettings, updateSettings } from '@deephaven/redux';\nimport { useAppSelector } from '@deephaven/dashboard';\n\nexport function ThemeSectionContent(): JSX.Element {\n const theme = useTheme();\n const settings = useAppSelector(getSettings);\n const dispatch = useDispatch();\n\n const updateDensity = useCallback(\n (density: ItemKey | null) => {\n if (\n density !== 'regular' &&\n density !== 'compact' &&\n density !== 'spacious'\n ) {\n throw new Error(`Invalid grid density value: ${density}`);\n }\n dispatch(updateSettings({ gridDensity: density }));\n },\n [dispatch]\n );\n\n const density = settings.gridDensity;\n\n assertNotNull(theme, 'ThemeContext value is null');\n\n return (\n <>\n <ThemePicker />\n <Picker\n label=\"Default table density\"\n selectedKey={density}\n onChange={updateDensity}\n >\n <Item key=\"regular\">Regular</Item>\n <Item key=\"compact\">Compact</Item>\n <Item key=\"spacious\">Spacious</Item>\n </Picker>\n </>\n );\n}\n\nexport default ThemeSectionContent;\n","import React, { useCallback, useState } from 'react';\nimport { useDispatch } from 'react-redux';\nimport {\n Switch,\n ActionButton,\n Icon,\n Text,\n ContextualHelp,\n Heading,\n Content,\n} from '@deephaven/components';\nimport { useAppSelector } from '@deephaven/dashboard';\nimport { getNotebookSettings, updateNotebookSettings } from '@deephaven/redux';\nimport { vsSettings } from '@deephaven/icons';\nimport {\n MonacoProviders,\n RuffSettingsModal,\n RUFF_DEFAULT_SETTINGS,\n} from '@deephaven/console';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\n\nexport function EditorSectionContent(): JSX.Element {\n const notebookSettings = useAppSelector(getNotebookSettings);\n const dispatch = useDispatch();\n const {\n isMinimapEnabled,\n formatOnSave,\n python: { linter: ruffSettings = {} } = {},\n } = notebookSettings;\n const { isEnabled: ruffEnabled, config: ruffConfig = RUFF_DEFAULT_SETTINGS } =\n ruffSettings;\n\n const handleMinimapChange = useCallback(\n (newValue: boolean) =>\n dispatch(updateNotebookSettings({ isMinimapEnabled: newValue })),\n [dispatch]\n );\n\n const handleFormatOnSaveChange = useCallback(\n (newValue: boolean) =>\n dispatch(updateNotebookSettings({ formatOnSave: newValue })),\n [dispatch]\n );\n\n const handleRuffEnabledChange = useCallback(\n (newValue: boolean) => {\n dispatch(\n updateNotebookSettings({\n python: { linter: { ...ruffSettings, isEnabled: newValue } },\n })\n );\n MonacoProviders.isRuffEnabled = newValue;\n MonacoProviders.setRuffSettings(ruffConfig);\n },\n [dispatch, ruffSettings, ruffConfig]\n );\n\n const handleRuffConfigChange = useCallback(\n (newValue: Record<string, unknown>) => {\n dispatch(\n updateNotebookSettings({\n python: {\n linter: {\n ...ruffSettings,\n config:\n JSON.stringify(newValue) ===\n JSON.stringify(RUFF_DEFAULT_SETTINGS)\n ? undefined\n : newValue,\n },\n },\n })\n );\n MonacoProviders.setRuffSettings(newValue);\n },\n [dispatch, ruffSettings]\n );\n\n const val = JSON.stringify(ruffConfig, null, 2);\n\n const [isRuffSettingsOpen, setIsRuffSettingsOpen] = useState(false);\n\n const handleRuffSettingsClose = useCallback(() => {\n setIsRuffSettingsOpen(false);\n }, []);\n\n const handleRuffSettingsSave = useCallback(\n (v: Record<string, unknown>) => {\n handleRuffConfigChange(v);\n handleRuffSettingsClose();\n },\n [handleRuffConfigChange, handleRuffSettingsClose]\n );\n\n return (\n <>\n <div className=\"app-settings-menu-description\">\n Customize the notebook editor.\n </div>\n\n <div className=\"form-row pl-1\">\n <Switch isSelected={isMinimapEnabled} onChange={handleMinimapChange}>\n Enable Minimap\n </Switch>\n </div>\n <div className=\"form-row align-items-center pl-1\">\n <Switch\n isSelected={formatOnSave}\n onChange={handleFormatOnSaveChange}\n margin={0}\n >\n Format on Save\n </Switch>\n <ContextualHelp variant=\"info\">\n <Heading>Format on Save</Heading>\n <Content>\n <Text>\n The Ruff settings control formatting options. Notebooks can be\n formatted manually using the right-click context menu.\n </Text>\n </Content>\n </ContextualHelp>\n </div>\n <div className=\"form-row pl-1\">\n <Switch\n isSelected={ruffEnabled}\n onChange={handleRuffEnabledChange}\n marginEnd={0}\n >\n Enable Ruff Python Linter\n </Switch>\n </div>\n <div className=\"form-row pl-1\">\n <ActionButton onPress={() => setIsRuffSettingsOpen(true)}>\n <Icon>\n <FontAwesomeIcon icon={vsSettings} />\n </Icon>\n <Text>Customize Ruff Settings</Text>\n </ActionButton>\n </div>\n {isRuffSettingsOpen && (\n <RuffSettingsModal\n text={val}\n isOpen={isRuffSettingsOpen}\n onClose={handleRuffSettingsClose}\n onSave={handleRuffSettingsSave}\n />\n )}\n </>\n );\n}\n\nexport default EditorSectionContent;\n","import React, {\n Component,\n Fragment,\n type ReactElement,\n type RefObject,\n} from 'react';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport {\n vsClose,\n vsWatch,\n vsRecordKeys,\n vsLayers,\n vsPaintcan,\n dhUserIncognito,\n dhUser,\n vsTools,\n vsFileCode,\n} from '@deephaven/icons';\nimport {\n Button,\n ContextualHelp,\n Heading,\n Content,\n CopyButton,\n GLOBAL_SHORTCUTS,\n Logo,\n} from '@deephaven/components';\nimport { type ServerConfigValues, type User, store } from '@deephaven/redux';\nimport {\n BROADCAST_CHANNEL_NAME,\n BROADCAST_LOGOUT_MESSAGE,\n} from '@deephaven/jsapi-utils';\nimport { type PluginModuleMap } from '@deephaven/plugin';\nimport { exportLogs, logHistory } from '@deephaven/log';\nimport { makeMessage } from '@deephaven/utils';\nimport FormattingSectionContent from './FormattingSectionContent';\nimport LegalNotice from './LegalNotice';\nimport SettingsMenuSection from './SettingsMenuSection';\nimport ShortcutSectionContent from './ShortcutsSectionContent';\nimport './SettingsMenu.scss';\nimport ColumnSpecificSectionContent from './ColumnSpecificSectionContent';\nimport {\n getFormattedPluginInfo,\n getFormattedVersionInfo,\n} from './SettingsUtils';\nimport AdvancedSectionContent from './AdvancedSectionContent';\nimport ThemeSectionContent from './ThemeSectionContent';\nimport EditorSectionContent from './EditorSectionContent';\n\ninterface SettingsMenuProps {\n serverConfigValues: ServerConfigValues;\n pluginData: PluginModuleMap;\n user: User;\n onDone: () => void;\n}\n\ninterface SettingsMenuState {\n expandedSectionKey?: string;\n}\n\nexport class SettingsMenu extends Component<\n SettingsMenuProps,\n SettingsMenuState\n> {\n static defaultProps = {\n onDone: (): void => undefined,\n };\n\n static FORMATTING_SECTION_KEY = 'SettingsMenu.formatting';\n\n static COLUMN_SPECIFIC_SECTION_KEY = 'SettingsMenu.columnFormatting';\n\n static APPLICATION_SECTION_KEY = 'ApplicationMenu.settings';\n\n static SHORTCUT_SECTION_KEY = 'SettingsMenu.shortcuts';\n\n static THEME_SECTION_KEY = 'SettingsMenu.theme';\n\n static ADVANCED_SECTION_KEY = 'SettingsMenu.advanced';\n\n static EDITOR_SECTION_KEY = 'SettingsMenu.editor';\n\n static focusFirstInputInContainer(container: HTMLDivElement | null): void {\n const input = container?.querySelector('input, select, textarea');\n if (input) {\n (input as HTMLElement).focus();\n }\n }\n\n constructor(props: SettingsMenuProps) {\n super(props);\n\n this.handleClose = this.handleClose.bind(this);\n this.handleScrollTo = this.handleScrollTo.bind(this);\n this.handleSectionToggle = this.handleSectionToggle.bind(this);\n this.handleExportSupportLogs = this.handleExportSupportLogs.bind(this);\n this.handleLogout = this.handleLogout.bind(this);\n\n this.menuContentRef = React.createRef();\n this.broadcastChannel = new BroadcastChannel(BROADCAST_CHANNEL_NAME);\n\n this.state = {\n expandedSectionKey: SettingsMenu.FORMATTING_SECTION_KEY,\n };\n }\n\n componentDidMount(): void {\n SettingsMenu.focusFirstInputInContainer(this.menuContentRef.current);\n }\n\n componentWillUnmount(): void {\n this.broadcastChannel.close();\n }\n\n menuContentRef: RefObject<HTMLDivElement>;\n\n broadcastChannel: BroadcastChannel;\n\n isSectionExpanded(sectionKey: string): boolean {\n const { expandedSectionKey } = this.state;\n return expandedSectionKey === sectionKey;\n }\n\n handleLogout(): void {\n this.broadcastChannel.postMessage(makeMessage(BROADCAST_LOGOUT_MESSAGE));\n }\n\n handleScrollTo(x: number, y: number): void {\n this.menuContentRef.current?.scrollTo(x, y);\n }\n\n handleSectionToggle(sectionKey: string): void {\n this.setState(state => ({\n expandedSectionKey:\n state.expandedSectionKey === sectionKey ? undefined : sectionKey,\n }));\n }\n\n handleClose(): void {\n const { onDone } = this.props;\n onDone();\n }\n\n handleExportSupportLogs(): void {\n const { serverConfigValues, pluginData } = this.props;\n const pluginInfo = getFormattedPluginInfo(pluginData);\n exportLogs(\n logHistory,\n {\n uiVersion: import.meta.env.npm_package_version,\n userAgent: navigator.userAgent,\n ...Object.fromEntries(serverConfigValues),\n pluginInfo,\n },\n store.getState()\n );\n }\n\n render(): ReactElement {\n const supportLink = import.meta.env.VITE_SUPPORT_LINK;\n const docsLink = import.meta.env.VITE_DOCS_LINK;\n\n const { serverConfigValues, pluginData, user } = this.props;\n const versionInfo = getFormattedVersionInfo(serverConfigValues);\n const pluginInfo = getFormattedPluginInfo(pluginData);\n const deephavenVersion = serverConfigValues.get('deephaven.version');\n const copyShortcut = GLOBAL_SHORTCUTS.COPY_VERSION_INFO.getDisplayText();\n\n const getRow = (text: string, ver?: string): JSX.Element => (\n <Fragment key={text}>\n <div>{text}</div>\n <div>{ver}</div>\n </Fragment>\n );\n\n const userDisplayName = user.displayName ?? user.name;\n const hasUserImage = user.image != null && user.image !== '';\n const showUserName = userDisplayName !== '';\n\n return (\n <div className=\"app-settings-menu\">\n <header className=\"app-settings-menu-header\">\n <div className=\"user-info\">\n <div className=\"user-image\">\n {!hasUserImage && (\n <FontAwesomeIcon icon={dhUser} transform=\"grow-8\" />\n )}\n {hasUserImage && <img src={user.image} alt={userDisplayName} />}\n </div>\n <div className=\"user-details\">\n {showUserName && (\n <div className=\"user-name\">\n {userDisplayName}\n {user.operateAs != null && user.name !== user.operateAs && (\n <>\n <span className=\"font-weight-light font-italic\">\n {' '}\n as{' '}\n </span>\n <span className=\"operating-as-user\">\n <FontAwesomeIcon\n icon={dhUserIncognito}\n className=\"mr-1\"\n />\n {user.operateAs}\n </span>\n </>\n )}\n </div>\n )}\n {user.permissions.canLogout && (\n <button\n type=\"button\"\n className=\"btn btn-link\"\n onClick={this.handleLogout}\n >\n logout\n </button>\n )}\n </div>\n </div>\n <Button\n kind=\"ghost\"\n className=\"btn-close-settings-menu\"\n onClick={this.handleClose}\n icon={<FontAwesomeIcon icon={vsClose} transform=\"grow-4\" />}\n tooltip=\"Close\"\n />\n </header>\n <div className=\"app-settings-menu-content\" ref={this.menuContentRef}>\n <h5>Settings</h5>\n\n <hr className=\"my-0\" />\n\n <SettingsMenuSection\n sectionKey={SettingsMenu.FORMATTING_SECTION_KEY}\n isExpanded={this.isSectionExpanded(\n SettingsMenu.FORMATTING_SECTION_KEY\n )}\n title={\n <>\n <FontAwesomeIcon\n icon={vsWatch}\n transform=\"grow-4\"\n className=\"mr-2\"\n />\n Default Format & Time zone\n </>\n }\n onToggle={this.handleSectionToggle}\n >\n <FormattingSectionContent />\n </SettingsMenuSection>\n\n <SettingsMenuSection\n sectionKey={SettingsMenu.COLUMN_SPECIFIC_SECTION_KEY}\n isExpanded={this.isSectionExpanded(\n SettingsMenu.COLUMN_SPECIFIC_SECTION_KEY\n )}\n title={\n <>\n <FontAwesomeIcon\n icon={vsLayers}\n transform=\"grow-4\"\n className=\"mr-2\"\n />\n Format by Column Name & Type\n </>\n }\n onToggle={this.handleSectionToggle}\n >\n <ColumnSpecificSectionContent scrollTo={this.handleScrollTo} />\n </SettingsMenuSection>\n\n <SettingsMenuSection\n sectionKey={SettingsMenu.THEME_SECTION_KEY}\n isExpanded={this.isSectionExpanded(SettingsMenu.THEME_SECTION_KEY)}\n onToggle={this.handleSectionToggle}\n title={\n <>\n <FontAwesomeIcon\n icon={vsPaintcan}\n transform=\"grow-4\"\n className=\"mr-2\"\n />\n Theme\n </>\n }\n >\n <ThemeSectionContent />\n </SettingsMenuSection>\n\n <SettingsMenuSection\n sectionKey={SettingsMenu.EDITOR_SECTION_KEY}\n isExpanded={this.isSectionExpanded(SettingsMenu.EDITOR_SECTION_KEY)}\n onToggle={this.handleSectionToggle}\n title={\n <>\n <FontAwesomeIcon\n icon={vsFileCode}\n transform=\"grow-4\"\n className=\"mr-2\"\n />\n Editor\n </>\n }\n >\n <EditorSectionContent />\n </SettingsMenuSection>\n\n <SettingsMenuSection\n sectionKey={SettingsMenu.SHORTCUT_SECTION_KEY}\n isExpanded={this.isSectionExpanded(\n SettingsMenu.SHORTCUT_SECTION_KEY\n )}\n title={\n <>\n <FontAwesomeIcon\n icon={vsRecordKeys}\n transform=\"grow-4\"\n className=\"mr-2\"\n />\n Keyboard Shortcuts\n </>\n }\n onToggle={this.handleSectionToggle}\n >\n <ShortcutSectionContent />\n </SettingsMenuSection>\n <SettingsMenuSection\n sectionKey={SettingsMenu.ADVANCED_SECTION_KEY}\n isExpanded={this.isSectionExpanded(\n SettingsMenu.ADVANCED_SECTION_KEY\n )}\n title={\n <>\n <FontAwesomeIcon\n icon={vsTools}\n transform=\"grow-4\"\n className=\"mr-2\"\n />\n Advanced\n </>\n }\n onToggle={this.handleSectionToggle}\n >\n <AdvancedSectionContent />\n </SettingsMenuSection>\n\n <div className=\"app-settings-footer\">\n <div className=\"app-settings-footer-section\">\n <div className=\"app-settings-footer-item\">\n <div className=\"font-weight-bold\">Support</div>\n <div>\n GitHub: \n <a\n href={supportLink}\n className=\"custom-link\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {supportLink}\n </a>\n </div>\n <Button\n kind=\"tertiary\"\n className=\"mt-2 py-2\"\n onClick={this.handleExportSupportLogs}\n >\n Export Logs\n </Button>\n </div>\n <div className=\"app-settings-footer-item\">\n <div className=\"font-weight-bold\">Documentation</div>\n <a\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n href={docsLink}\n className=\"custom-link\"\n >\n {docsLink}\n </a>\n </div>\n <div className=\"app-settings-footer-item\">\n <div className=\"font-weight-bold\">Version</div>\n <span className=\"d-inline-block text-muted\">\n {deephavenVersion}\n <ContextualHelp variant=\"info\">\n <Heading>Version Info</Heading>\n <Content>\n <div className=\"detailed-server-config\">\n {Object.entries(versionInfo).map(([key, value]) =>\n getRow(key, value)\n )}\n </div>\n <CopyButton\n copy={Object.entries({\n ...versionInfo,\n ...pluginInfo,\n })\n .map(([key, value]) => `${key}: ${value}`)\n .join('\\n')}\n >\n Copy Versions{' '}\n <small className=\"text-muted\">({copyShortcut})</small>\n </CopyButton>\n </Content>\n </ContextualHelp>\n </span>\n </div>\n <div className=\"app-settings-footer-item\">\n <div className=\"font-weight-bold\">Plugins</div>\n <div className=\"container\">\n {Array.from(pluginData.entries())\n .filter(plugin => plugin[1].version !== undefined)\n .map(([key, value]) => (\n <div\n key={key}\n className=\"row justify-content-start align-items-center\"\n >\n <div className=\"col pl-0\">\n <span className=\"my-0 text-truncate\">{key}</span>\n </div>\n <div className=\"col-auto\">\n <span>{value?.version}</span>\n </div>\n </div>\n ))}\n </div>\n </div>\n <div className=\"app-settings-footer-item\">\n <LegalNotice />\n </div>\n </div>\n <div className=\"app-settings-footer-section\">\n <a\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n href=\"https://deephaven.io\"\n style={{\n display: 'block',\n width: '61.8%',\n }}\n >\n <Logo />\n </a>\n </div>\n </div>\n </div>\n </div>\n );\n }\n}\n\nexport default SettingsMenu;\n","import React, {\n useRef,\n useEffect,\n useCallback,\n useState,\n useMemo,\n type ReactNode,\n type ReactElement,\n} from 'react';\nimport classNames from 'classnames';\nimport {\n type DropdownAction,\n DropdownMenu,\n GLOBAL_SHORTCUTS,\n} from '@deephaven/components';\nimport { ControlType, ToolType } from '@deephaven/dashboard-core-plugins';\nimport { SHORTCUTS as IRIS_GRID_SHORTCUTS } from '@deephaven/iris-grid';\nimport {\n dhInput,\n dhFilterSlash,\n dhTriangleDownSquare,\n vsLink,\n vsMarkdown,\n vsDeviceCamera,\n} from '@deephaven/icons';\nimport { assertNotNull } from '@deephaven/utils';\n\nconst MINIMUM_DRAG_DISTANCE = 10;\n\ninterface DragSourceMenuItemProps {\n forwardedProps?: {\n iconElement: ReactNode;\n displayShortcut: string;\n isMouseSelected: boolean;\n isKeyboardSelected: boolean;\n closeMenu: () => void;\n menuItem: {\n action: (event?: MouseEvent) => void;\n title: string;\n disabled: boolean;\n };\n };\n}\n\n/**\n * helper component that renders a menu item\n * props are fowarded from ContextMenuItem\n * purpose is to add custom mouse handlers\n * for dragging panels directly from menu\n */\n\nfunction DragSourceMenuItem(props: DragSourceMenuItemProps): JSX.Element {\n const { forwardedProps } = props;\n assertNotNull(forwardedProps, 'DragSourceMenuItem forwardedProps'); // These are added by the ContextMenuItem, but not used where we declare the items\n const {\n menuItem: { action, title, disabled: menuItemDisabled },\n iconElement,\n displayShortcut,\n isMouseSelected,\n isKeyboardSelected,\n closeMenu,\n } = forwardedProps;\n\n const startX = useRef<number>();\n const startY = useRef<number>();\n const startObject = useRef<EventTarget | null>(null);\n\n // used to prevent double clicking inserting an object twice\n const [disableDoubleClick, setDisableDoubleClick] = useState(false);\n\n const handleMouseMove = useCallback(\n (event: MouseEvent) => {\n if (\n startX.current != null &&\n startY.current != null &&\n startObject.current &&\n (Math.abs(startX.current - event.clientX) >= MINIMUM_DRAG_DISTANCE ||\n Math.abs(startY.current - event.clientY) >= MINIMUM_DRAG_DISTANCE)\n ) {\n setDisableDoubleClick(true);\n window.removeEventListener('mousemove', handleMouseMove);\n closeMenu();\n action(event);\n startObject.current = null; // null object so mouseUp can't fire\n }\n },\n [action, closeMenu]\n );\n\n function handleMouseDown(event: React.MouseEvent<HTMLButtonElement>): void {\n startX.current = event.clientX;\n startY.current = event.clientY;\n startObject.current = event.target;\n window.addEventListener('mousemove', handleMouseMove);\n }\n\n function handleMouseUp(event: React.MouseEvent<HTMLButtonElement>): void {\n // down and up need to occur on same object to constitute a click event\n if (startObject.current === event.target) {\n setDisableDoubleClick(true);\n closeMenu();\n action();\n window.removeEventListener('mousemove', handleMouseMove);\n }\n startObject.current = null; // null object so mousemove can't fire3\n }\n\n useEffect(\n // funny syntax after prettier, return function for the cleanup function\n function cleanUpMouseEventListener() {\n return function removeOldMouseMoveEventListener() {\n return window.removeEventListener('mousemove', handleMouseMove);\n };\n },\n [handleMouseMove]\n );\n\n return (\n <button\n type=\"button\"\n className={classNames(\n 'btn-context-menu',\n { disabled: menuItemDisabled },\n {\n active: isMouseSelected && !menuItemDisabled,\n },\n { 'keyboard-active': isKeyboardSelected && !menuItemDisabled }\n )}\n onMouseDown={handleMouseDown}\n onMouseUp={handleMouseUp}\n disabled={disableDoubleClick}\n >\n <span className={classNames('icon')}>{iconElement}</span>\n <span className=\"title\">{title}</span>\n <span className=\"shortcut\">{displayShortcut}</span>\n </button>\n );\n}\n\ninterface AppControlsMenuProps {\n handleControlSelect: (type: string, event: Event) => void;\n handleToolSelect: (type: string) => void;\n onClearFilter: () => void;\n}\n\nfunction AppControlsMenu(props: AppControlsMenuProps): ReactElement {\n const { handleControlSelect, handleToolSelect, onClearFilter } = props;\n const controlMenuActions: DropdownAction[] = useMemo(\n () => [\n {\n title: 'Input Filter',\n icon: dhInput,\n menuElement: <DragSourceMenuItem />,\n action: (dragEvent: Event) => {\n handleControlSelect(ControlType.INPUT_FILTER, dragEvent);\n },\n order: 10,\n },\n {\n title: 'Dropdown Filter',\n icon: dhTriangleDownSquare,\n menuElement: <DragSourceMenuItem />,\n action: (dragEvent: Event) => {\n handleControlSelect(ControlType.DROPDOWN_FILTER, dragEvent);\n },\n order: 15,\n },\n {\n title: 'Markdown Widget',\n icon: vsMarkdown,\n menuElement: <DragSourceMenuItem />,\n action: (dragEvent: Event) => {\n handleControlSelect(ControlType.MARKDOWN, dragEvent);\n },\n order: 20,\n },\n {\n title: 'Filter Sets',\n icon: vsDeviceCamera,\n menuElement: <DragSourceMenuItem />,\n action: (dragEvent: Event) => {\n handleControlSelect(ControlType.FILTER_SET_MANAGER, dragEvent);\n },\n order: 25,\n },\n {\n disabled: true,\n menuElement: <div className=\"context-menu-group-header\">Tools</div>,\n order: 30,\n },\n {\n title: 'Linker',\n icon: vsLink,\n action: () => {\n handleToolSelect(ToolType.LINKER);\n },\n order: 40,\n shortcut: GLOBAL_SHORTCUTS.LINKER,\n },\n {\n disabled: true,\n menuElement: <div className=\"context-menu-group-header\">Actions</div>,\n order: 50,\n },\n {\n title: 'Clear All Filters',\n icon: dhFilterSlash,\n action: () => {\n onClearFilter();\n },\n order: 60,\n shortcut: IRIS_GRID_SHORTCUTS.TABLE.CLEAR_ALL_FILTERS,\n },\n ],\n [handleControlSelect, handleToolSelect, onClearFilter]\n );\n\n return (\n <DropdownMenu\n popperClassName=\"controls-menu-popper\"\n actions={controlMenuActions}\n />\n );\n}\n\nexport default AppControlsMenu;\n","/**\n * Set the layout storage object being used to load/save the layout\n */\nimport { replaceReducer } from '@deephaven/redux';\nimport { SET_LAYOUT_STORAGE } from '../actionTypes';\n\nexport default replaceReducer(SET_LAYOUT_STORAGE, null);\n","import layoutStorage from './layoutStorage';\n\nexport default { layoutStorage };\n","import { type RootState } from '@deephaven/redux';\nimport type { LayoutStorage } from '@deephaven/app-utils';\n\n/**\n * Get the layout storage used by the app\n * @param store The redux store\n * @returns The layout storage instance\n */\nexport const getLayoutStorage = <State extends RootState = RootState>(\n store: State\n): LayoutStorage => store.layoutStorage as LayoutStorage;\n\n/**\n * Get the configuration values of the server\n * @param store The redux store\n * @returns The layout storage instance\n */\nexport const getServerConfigValues = <State extends RootState = RootState>(\n store: State\n): State['serverConfigValues'] => store.serverConfigValues;\n","import { reducerRegistry } from '@deephaven/redux';\nimport reducers from './reducers';\n\nObject.entries(reducers).map(([name, reducer]) =>\n reducerRegistry.register(name, reducer)\n);\n\nexport * from './actions';\nexport * from './actionTypes';\nexport * from './selectors';\n","import React, {\n type ChangeEvent,\n type MouseEvent,\n useCallback,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { Button, SearchInput } from '@deephaven/components';\nimport { ObjectIcon } from '@deephaven/console';\nimport {\n vsArrowSmallDown,\n vsArrowSmallUp,\n vsPreview,\n vsRefresh,\n} from '@deephaven/icons';\nimport type { dh } from '@deephaven/jsapi-types';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport './WidgetList.scss';\n\nconst MINIMUM_DRAG_DISTANCE = 10;\n\n// When we're listening on the window, it emits a `globalThis.MouseEvent`\n// `WindowMouseEvent` is just a convenience alias\nexport type WindowMouseEvent = globalThis.MouseEvent;\n\nexport type SelectStartEvent = {\n x: number;\n y: number;\n widget: dh.ide.VariableDefinition;\n};\n\nexport interface WidgetListProps {\n onSelect: (widget: dh.ide.VariableDefinition, e?: WindowMouseEvent) => void;\n onExportLayout: () => void;\n onImportLayout: () => void;\n onResetLayout: () => void;\n widgets?: dh.ide.VariableDefinition[];\n}\n\n/**\n * Display a search field and a list of widgets, as well as layout export/import buttons.\n * @param props The widgets and handlers to use for this list\n * @returns A JSX element for the list of widgets, along with search\n */\nexport function WidgetList(props: WidgetListProps): JSX.Element {\n const {\n onExportLayout,\n onImportLayout,\n onResetLayout,\n onSelect,\n widgets = [],\n } = props;\n const [disableDoubleClick, setDisableDoubleClick] = useState(false);\n const [searchText, setSearchText] = useState('');\n const searchField = useRef<SearchInput>(null);\n const selectStartEvent = useRef<SelectStartEvent>();\n\n /**\n * Send object to be created, if an event is passed object\n * is treated as createDragSourceFromEvent in golden-layout\n * and uses the event as the starting location for the drag.\n * @param widget\n * @param event\n */\n const sendSelect = useCallback(\n (widget: dh.ide.VariableDefinition, event?: WindowMouseEvent) => {\n if (widget != null) onSelect(widget, event);\n },\n [onSelect]\n );\n\n const handleSearchChange = useCallback((e: ChangeEvent<HTMLInputElement>) => {\n setSearchText(e.target.value);\n }, []);\n\n const handleMouseMove = useCallback(\n (e: WindowMouseEvent) => {\n if (selectStartEvent.current == null) {\n return;\n }\n\n if (\n Math.abs(selectStartEvent.current.x - e.clientX) >=\n MINIMUM_DRAG_DISTANCE ||\n Math.abs(selectStartEvent.current.y - e.clientY) >=\n MINIMUM_DRAG_DISTANCE\n ) {\n setDisableDoubleClick(true);\n window.removeEventListener('mousemove', handleMouseMove);\n sendSelect(selectStartEvent.current.widget, e);\n selectStartEvent.current = undefined; // unset so mouseUp can't fire\n }\n },\n [selectStartEvent, sendSelect]\n );\n\n const handleMouseDown = useCallback(\n (e: MouseEvent, widget: dh.ide.VariableDefinition) => {\n selectStartEvent.current = {\n x: e.clientX,\n y: e.clientY,\n widget,\n };\n window.addEventListener('mousemove', handleMouseMove);\n },\n [handleMouseMove]\n );\n\n const handleMouseUp = useCallback(\n (e: MouseEvent, widget: dh.ide.VariableDefinition) => {\n window.removeEventListener('mousemove', handleMouseMove);\n\n // down and up need to occur on same object to constitute a click event\n if (selectStartEvent.current?.widget === widget) {\n setDisableDoubleClick(true);\n sendSelect(widget);\n }\n selectStartEvent.current = undefined;\n },\n [handleMouseMove, selectStartEvent, sendSelect]\n );\n\n const filteredWidgets = useMemo(\n () =>\n widgets.filter(widget =>\n searchText\n ? widget.name?.toLowerCase().includes(searchText.toLowerCase())\n : true\n ),\n [searchText, widgets]\n ).sort((a, b) => a.name?.localeCompare(b.name ?? '') ?? 0);\n\n const widgetElements = useMemo(\n () =>\n filteredWidgets.map(widget => (\n <li key={widget.name}>\n <Button\n kind=\"ghost\"\n data-testid={`panel-list-item-${widget.name ?? ''}-button`}\n onMouseDown={event => {\n handleMouseDown(event, widget);\n }}\n onMouseUp={event => {\n handleMouseUp(event, widget);\n }}\n onKeyDown={event => {\n if (event.key === 'Enter' || event.key === ' ') {\n sendSelect(widget);\n }\n }}\n disabled={disableDoubleClick}\n onClick={() => {\n // no-op: click is handled by onMouseDown and onMouseUp attributes\n }}\n >\n <ObjectIcon type={widget.type} /> {widget.name ?? ''}\n </Button>\n </li>\n )),\n [\n filteredWidgets,\n disableDoubleClick,\n handleMouseDown,\n handleMouseUp,\n sendSelect,\n ]\n );\n\n const errorElement = useMemo(\n () =>\n widgetElements.length === 0 ? (\n <span>No bound variables found.</span>\n ) : null,\n [widgetElements]\n );\n\n return (\n <div className=\"widget-list-container d-flex flex-column\">\n <div className=\"widget-list-header\">\n <SearchInput\n value={searchText}\n placeholder=\"Find Table, Plot or Widget\"\n onChange={handleSearchChange}\n ref={searchField}\n />\n </div>\n <ul className=\"widget-list flex-grow-1\">\n {errorElement && (\n <li className=\"widget-list-message\">{errorElement}</li>\n )}\n {!errorElement && widgetElements}\n </ul>\n <div>\n <hr />\n </div>\n <div className=\"widget-list-footer\">\n <Button kind=\"ghost\" onClick={onExportLayout}>\n <div className=\"fa-md fa-layers mr-1\">\n <FontAwesomeIcon\n mask={vsPreview}\n icon={vsArrowSmallDown}\n transform=\"right-5 down-5\"\n />\n <FontAwesomeIcon\n icon={vsArrowSmallDown}\n transform=\"right-8 down-6\"\n />\n </div>\n Export Layout\n </Button>\n <Button kind=\"ghost\" onClick={onImportLayout}>\n <div className=\"fa-md fa-layers mr-1\">\n <FontAwesomeIcon\n mask={vsPreview}\n icon={vsArrowSmallUp}\n transform=\"right-5 down-5\"\n />\n <FontAwesomeIcon icon={vsArrowSmallUp} transform=\"right-8 down-6\" />\n </div>\n Import Layout\n </Button>\n <Button\n kind=\"ghost\"\n icon={vsRefresh}\n onClick={onResetLayout}\n tooltip=\"Reset Layout\"\n />\n </div>\n </div>\n );\n}\n\nexport default WidgetList;\n","import React from 'react';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { Button } from '@deephaven/components';\nimport { vsArrowUp } from '@deephaven/icons';\nimport './EmptyDashboard.scss';\n\nexport interface EmptyDashboardProps {\n onAutoFillClick?: (event: React.MouseEvent) => void;\n}\n\nexport function EmptyDashboard({\n onAutoFillClick = () => undefined,\n}: EmptyDashboardProps): JSX.Element {\n return (\n <div className=\"empty-dashboard-container\">\n <div className=\"hint-container\">\n <FontAwesomeIcon icon={vsArrowUp} /> <br />\n Use the panel list to add objects from a query.\n </div>\n <div className=\"empty-dashboard\">\n <div className=\"add-panels-hint\">Drag Panels Here</div>\n <Button kind=\"tertiary\" onClick={onAutoFillClick}>\n Auto fill objects\n </Button>\n </div>\n </div>\n );\n}\n\nexport default EmptyDashboard;\n","import React, {\n type ClipboardEvent,\n type ChangeEvent,\n Component,\n type ReactElement,\n type RefObject,\n} from 'react';\nimport { flushSync } from 'react-dom';\nimport classNames from 'classnames';\nimport memoize from 'memoize-one';\nimport { connect } from 'react-redux';\nimport { type RouteComponentProps, withRouter } from 'react-router-dom';\nimport { nanoid } from 'nanoid';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport {\n ContextActions,\n GLOBAL_SHORTCUTS,\n NAVIGATION_SHORTCUTS,\n Popper,\n type ContextAction,\n Button,\n Logo,\n BasicModal,\n NavTabList,\n type NavTabItem,\n SlideTransition,\n LoadingOverlay,\n} from '@deephaven/components';\nimport { SHORTCUTS as IRIS_GRID_SHORTCUTS } from '@deephaven/iris-grid';\nimport {\n type CreateDashboardPayload,\n DashboardUtils,\n DEFAULT_DASHBOARD_ID,\n type DehydratedDashboardPanelProps,\n emitPanelOpen,\n getAllDashboardsData,\n getDashboardData,\n listenForCreateDashboard,\n listenForCloseDashboard,\n PanelEvent,\n setDashboardData as setDashboardDataAction,\n setDashboardPluginData as setDashboardPluginDataAction,\n updateDashboardData as updateDashboardDataAction,\n emitCycleToNextStack,\n emitCycleToPreviousStack,\n emitCycleToNextTab,\n emitCycleToPreviousTab,\n type DehydratedPanelProps,\n} from '@deephaven/dashboard';\nimport {\n ConsolePlugin,\n InputFilterEvent,\n MarkdownEvent,\n NotebookEvent,\n getDashboardSessionWrapper,\n ControlType,\n ToolType,\n getDashboardConnection,\n NotebookPanel,\n} from '@deephaven/dashboard-core-plugins';\nimport { vsGear, dhShapes, dhPanels, vsTerminal } from '@deephaven/icons';\nimport { getVariableDescriptor } from '@deephaven/jsapi-bootstrap';\nimport dh from '@deephaven/jsapi-shim';\nimport type { dh as DhType } from '@deephaven/jsapi-types';\nimport { type SessionConfig } from '@deephaven/jsapi-utils';\nimport Log from '@deephaven/log';\nimport {\n getActiveTool,\n getWorkspace,\n getUser,\n setActiveTool as setActiveToolAction,\n updateWorkspaceData as updateWorkspaceDataAction,\n getPlugins,\n type WorkspaceData,\n type RootState,\n type User,\n type ServerConfigValues,\n type CustomizableWorkspace,\n type DashboardData,\n} from '@deephaven/redux';\nimport {\n bindAllMethods,\n copyToClipboard,\n PromiseUtils,\n EMPTY_ARRAY,\n assertNotNull,\n} from '@deephaven/utils';\nimport type GoldenLayout from '@deephaven/golden-layout';\nimport type { ItemConfig, EventHub } from '@deephaven/golden-layout';\nimport { type PluginModuleMap, getDashboardPlugins } from '@deephaven/plugin';\nimport {\n AppDashboards,\n type LayoutStorage,\n UserLayoutUtils,\n createExportLogsContextAction,\n} from '@deephaven/app-utils';\nimport JSZip from 'jszip';\nimport SettingsMenu from '../settings/SettingsMenu';\nimport AppControlsMenu from './AppControlsMenu';\nimport { getLayoutStorage, getServerConfigValues } from '../redux';\nimport './AppMainContainer.scss';\nimport WidgetList, { type WindowMouseEvent } from './WidgetList';\nimport {\n getFormattedPluginInfo,\n getFormattedVersionInfo,\n} from '../settings/SettingsUtils';\nimport EmptyDashboard from './EmptyDashboard';\n\nenum CycleDirection {\n Next,\n Previous,\n}\n\nconst log = Log.module('AppMainContainer');\n\ntype InputFileFormat =\n | string\n | number[]\n | Uint8Array\n | ArrayBuffer\n | Blob\n | NodeJS.ReadableStream;\n\ninterface AppMainContainerProps {\n activeTool: string;\n allDashboardData: Record<string, DashboardData>;\n dashboardData: DashboardData;\n layoutStorage: LayoutStorage;\n match: {\n params: { notebookPath: string };\n };\n connection?: DhType.IdeConnection;\n session?: DhType.IdeSession;\n sessionConfig?: SessionConfig;\n setActiveTool: (tool: string) => void;\n setDashboardData: (id: string, data: DashboardData) => void;\n setDashboardPluginData: (\n dashboardId: string,\n pluginId: string,\n data: unknown\n ) => void;\n updateDashboardData: (id: string, data: Partial<DashboardData>) => void;\n updateWorkspaceData: (workspaceData: Partial<WorkspaceData>) => void;\n user: User;\n workspace: CustomizableWorkspace;\n plugins: PluginModuleMap;\n serverConfigValues: ServerConfigValues;\n}\n\ninterface AppMainContainerState {\n contextActions: ContextAction[];\n isPanelsMenuShown: boolean;\n isResetLayoutPromptShown: boolean;\n isSettingsMenuShown: boolean;\n unsavedNotebookCount: number;\n widgets: DhType.ide.VariableDefinition[];\n tabs: NavTabItem[];\n activeTabKey: string;\n\n // Number of times the layout has been re-initialized\n layoutIteration: number;\n}\n\nexport class AppMainContainer extends Component<\n AppMainContainerProps & RouteComponentProps,\n AppMainContainerState\n> {\n static handleWindowBeforeUnload(event: BeforeUnloadEvent): void {\n // in development, allow auto-reload\n if (import.meta.env.PROD) {\n event.preventDefault();\n // returnValue is required for beforeReload event prompt\n // https://developer.mozilla.org/en-US/docs/Web/API/WindowEventHandlers/onbeforeunload#example\n // eslint-disable-next-line no-param-reassign\n event.returnValue = '';\n }\n }\n\n static hydrateConsole(\n props: DehydratedPanelProps,\n id: string\n ): DehydratedDashboardPanelProps {\n return DashboardUtils.hydrate(\n {\n ...props,\n unzip: (zipFile: InputFileFormat) =>\n JSZip.loadAsync(zipFile).then(zip => Object.values(zip.files)),\n },\n id\n );\n }\n\n static handleRefresh(): void {\n log.info('Refreshing application');\n window.location.reload();\n }\n\n constructor(props: AppMainContainerProps & RouteComponentProps) {\n super(props);\n\n bindAllMethods(this);\n\n this.importElement = React.createRef();\n\n const { allDashboardData, serverConfigValues, plugins } = this.props;\n\n this.dashboardLayouts = new Map();\n this.createDashboardListenerRemovers = new Map();\n this.closeDashboardListenerRemovers = new Map();\n\n this.state = {\n contextActions: [\n createExportLogsContextAction(\n {\n uiVersion: import.meta.env.npm_package_version,\n userAgent: navigator.userAgent,\n ...Object.fromEntries(serverConfigValues),\n pluginInfo: getFormattedPluginInfo(plugins),\n },\n false // Not global to prevent conflict with export logs action with same shortcut in AppBootstrap.tsx\n ),\n {\n action: () => {\n // Copies the version info to the clipboard for easy pasting into a ticket\n const versionInfo = getFormattedVersionInfo(serverConfigValues);\n const versionInfoText = Object.entries(versionInfo)\n .map(([key, value]) => `${key}: ${value}`)\n .join('\\n');\n copyToClipboard(versionInfoText);\n },\n shortcut: GLOBAL_SHORTCUTS.COPY_VERSION_INFO,\n isGlobal: true,\n },\n {\n action: () => {\n this.handleToolSelect(ToolType.LINKER);\n },\n shortcut: GLOBAL_SHORTCUTS.LINKER,\n isGlobal: true,\n },\n {\n action: () => {\n // triggers clear all filters tab event, which in turn triggers a glEventhub event\n // widget panels can subscribe to his event, and execute their own clearing logic\n this.sendClearFilter();\n },\n shortcut: IRIS_GRID_SHORTCUTS.TABLE.CLEAR_ALL_FILTERS,\n isGlobal: true,\n },\n {\n action: () => {\n this.sendCycleStackForward();\n },\n shortcut: NAVIGATION_SHORTCUTS.CYCLE_TO_NEXT_STACK,\n isGlobal: true,\n },\n {\n action: () => {\n this.sendCycleStackBackward();\n },\n shortcut: NAVIGATION_SHORTCUTS.CYCLE_TO_PREVIOUS_STACK,\n isGlobal: true,\n },\n {\n action: () => {\n this.sendCycleTabForward();\n },\n shortcut: NAVIGATION_SHORTCUTS.CYCLE_TO_NEXT_TAB,\n isGlobal: true,\n },\n {\n action: () => {\n this.sendCycleTabBackward();\n },\n shortcut: NAVIGATION_SHORTCUTS.CYCLE_TO_PREVIOUS_TAB,\n isGlobal: true,\n },\n {\n action: () => {\n this.handleCycleDashboardForward();\n },\n shortcut: NAVIGATION_SHORTCUTS.CYCLE_TO_NEXT_DASHBOARD,\n isGlobal: true,\n },\n {\n action: () => {\n this.handleCycleDashboardBackward();\n },\n shortcut: NAVIGATION_SHORTCUTS.CYCLE_TO_PREVIOUS_DASHBOARD,\n isGlobal: true,\n },\n {\n action: () => {\n this.sendReopenLast();\n },\n shortcut: GLOBAL_SHORTCUTS.REOPEN_CLOSED_PANEL,\n isGlobal: true,\n },\n {\n action: () => {\n log.debug('Consume unhandled save shortcut');\n },\n shortcut: GLOBAL_SHORTCUTS.SAVE,\n isGlobal: true,\n },\n ],\n isPanelsMenuShown: false,\n isResetLayoutPromptShown: false,\n isSettingsMenuShown: false,\n unsavedNotebookCount: 0,\n widgets: [],\n tabs: Object.entries(allDashboardData).map(([key, value]) => ({\n key,\n title: value.title ?? 'Untitled',\n isClosable: key !== DEFAULT_DASHBOARD_ID,\n icon: key === DEFAULT_DASHBOARD_ID ? vsTerminal : undefined,\n })),\n activeTabKey: DEFAULT_DASHBOARD_ID,\n layoutIteration: 0,\n };\n }\n\n componentDidMount(): void {\n this.initWidgets();\n this.initDashboardData();\n\n window.addEventListener(\n 'beforeunload',\n AppMainContainer.handleWindowBeforeUnload\n );\n }\n\n componentDidUpdate(\n prevProps: AppMainContainerProps,\n prevState: AppMainContainerState\n ): void {\n const { dashboardData } = this.props;\n if (prevProps.dashboardData !== dashboardData) {\n this.handleDataChange(dashboardData);\n }\n }\n\n componentWillUnmount(): void {\n this.deinitWidgets();\n\n this.createDashboardListenerRemovers.forEach(rm => rm());\n this.closeDashboardListenerRemovers.forEach(rm => rm());\n\n window.removeEventListener(\n 'beforeunload',\n AppMainContainer.handleWindowBeforeUnload\n );\n }\n\n /** Map from the dashboard ID to the GoldenLayout instance for that dashboard */\n dashboardLayouts: Map<string, GoldenLayout>;\n\n /** Map from dashboard ID to remover functions for create dashboard listener */\n createDashboardListenerRemovers: Map<string, () => void>;\n\n /** Map from dashboard ID to remover functions for close dashboard listener */\n closeDashboardListenerRemovers: Map<string, () => void>;\n\n importElement: RefObject<HTMLInputElement>;\n\n widgetListenerRemover?: () => void;\n\n initWidgets(): void {\n const { connection } = this.props;\n if (connection == null) {\n return;\n }\n\n if (connection.subscribeToFieldUpdates == null) {\n log.warn(\n 'subscribeToFieldUpdates not supported, not initializing widgets'\n );\n return;\n }\n\n this.widgetListenerRemover = connection.subscribeToFieldUpdates(updates => {\n log.debug('Got updates', updates);\n this.setState(({ widgets }) => {\n const { updated, created, removed } = updates;\n\n // Remove from the array if it's been removed OR modified. We'll add it back after if it was modified.\n const widgetsToRemove = [...updated, ...removed];\n const newWidgets = widgets.filter(\n widget =>\n !widgetsToRemove.some(toRemove => toRemove.name === widget.name)\n );\n\n // Now add all the modified and updated widgets back in\n const widgetsToAdd = [...updated, ...created];\n widgetsToAdd.forEach(toAdd => {\n if (toAdd.name != null && toAdd.name !== '') {\n newWidgets.push(toAdd);\n }\n });\n\n return { widgets: newWidgets };\n });\n });\n }\n\n deinitWidgets(): void {\n this.widgetListenerRemover?.();\n }\n\n initDashboardData(): void {\n // TODO: #1746 We should be loading data from a dashboard storage store\n // For now only the default dashboard data is stored with the workspace and set on the default dashboard\n const { setDashboardPluginData, updateDashboardData, workspace } =\n this.props;\n const { data: workspaceData } = workspace;\n const { filterSets, links, pluginDataMap } = workspaceData;\n updateDashboardData(DEFAULT_DASHBOARD_ID, {\n filterSets,\n links,\n });\n if (pluginDataMap != null) {\n const pluginKeys = Object.keys(pluginDataMap);\n for (let i = 0; i < pluginKeys.length; i += 1) {\n const pluginId = pluginKeys[i];\n const pluginData = pluginDataMap[pluginId];\n log.debug('initDashboardData plugin data', pluginId, pluginData);\n setDashboardPluginData(DEFAULT_DASHBOARD_ID, pluginId, pluginData);\n }\n }\n }\n\n openNotebookFromURL(): void {\n const { match } = this.props;\n const { notebookPath } = match.params;\n\n if (notebookPath) {\n const { session, sessionConfig } = this.props;\n if (session == null || sessionConfig == null) {\n log.error('No session available to open notebook URL', notebookPath);\n return;\n }\n const fileMetadata = {\n id: `/${notebookPath}`,\n itemName: `/${notebookPath}`,\n };\n\n const language = sessionConfig.type;\n const notebookSettings = {\n value: null,\n language,\n };\n\n this.emitLayoutEvent(\n NotebookEvent.SELECT_NOTEBOOK,\n session,\n language,\n notebookSettings,\n fileMetadata,\n true\n );\n }\n }\n\n sendClearFilter(): void {\n this.emitLayoutEvent(InputFilterEvent.CLEAR_ALL_FILTERS);\n }\n\n sendCycleStackForward(): void {\n emitCycleToNextStack(this.getActiveEventHub());\n }\n\n sendCycleStackBackward(): void {\n emitCycleToPreviousStack(this.getActiveEventHub());\n }\n\n sendCycleTabForward(): void {\n emitCycleToNextTab(this.getActiveEventHub());\n }\n\n sendCycleTabBackward(): void {\n emitCycleToPreviousTab(this.getActiveEventHub());\n }\n\n sendReopenLast(): void {\n this.emitLayoutEvent(PanelEvent.REOPEN_LAST);\n }\n\n cycleDashboard(direction: CycleDirection): void {\n const { tabs, activeTabKey } = this.state;\n\n if (tabs.length <= 1) {\n return;\n }\n\n const currentIndex = tabs.findIndex(tab => tab.key === activeTabKey);\n if (currentIndex === -1) {\n return;\n }\n\n const targetIndex =\n direction === CycleDirection.Next\n ? (currentIndex + 1) % tabs.length\n : (currentIndex - 1 + tabs.length) % tabs.length;\n\n const targetTab = tabs[targetIndex];\n this.handleTabSelect(targetTab.key);\n }\n\n handleCycleDashboardForward(): void {\n this.cycleDashboard(CycleDirection.Next);\n }\n\n handleCycleDashboardBackward(): void {\n this.cycleDashboard(CycleDirection.Previous);\n }\n\n getActiveEventHub(): EventHub {\n const { activeTabKey } = this.state;\n const layout = this.dashboardLayouts.get(activeTabKey);\n assertNotNull(layout, 'No active layout found');\n return layout.eventHub;\n }\n\n emitLayoutEvent(event: string, ...args: unknown[]): void {\n this.getActiveEventHub().emit(event, ...args);\n }\n\n handleCancelResetLayoutPrompt(): void {\n this.setState({\n isResetLayoutPromptShown: false,\n });\n }\n\n handleConfirmResetLayoutPrompt(): void {\n this.setState({\n isResetLayoutPromptShown: false,\n });\n\n this.resetLayout();\n }\n\n // eslint-disable-next-line class-methods-use-this\n handleError(error: unknown): void {\n if (PromiseUtils.isCanceled(error)) {\n return;\n }\n log.error(error);\n }\n\n handleSettingsMenuHide(): void {\n this.setState({ isSettingsMenuShown: false });\n }\n\n handleSettingsMenuShow(): void {\n this.setState({ isSettingsMenuShown: true });\n }\n\n handleControlSelect(type: string, dragEvent: Event): void {\n log.debug('handleControlSelect', type);\n\n switch (type) {\n case ControlType.DROPDOWN_FILTER:\n this.emitLayoutEvent(InputFilterEvent.OPEN_DROPDOWN, {\n title: 'DropdownFilter',\n type,\n createNewStack: true,\n dragEvent,\n });\n break;\n case ControlType.INPUT_FILTER:\n this.emitLayoutEvent(InputFilterEvent.OPEN_INPUT, {\n title: 'InputFilter',\n type,\n createNewStack: true,\n dragEvent,\n });\n break;\n case ControlType.MARKDOWN:\n this.emitLayoutEvent(MarkdownEvent.OPEN, {\n title: 'Markdown',\n type,\n dragEvent,\n });\n break;\n case ControlType.FILTER_SET_MANAGER:\n this.emitLayoutEvent(InputFilterEvent.OPEN_FILTER_SET_MANAGER, {\n title: 'FilterSets',\n type,\n dragEvent,\n });\n break;\n default:\n throw new Error(`Unrecognized control type ${type}`);\n }\n }\n\n handleToolSelect(toolType: string): void {\n log.debug('handleToolSelect', toolType);\n\n const { activeTool, setActiveTool } = this.props;\n if (activeTool === toolType) {\n setActiveTool(ToolType.DEFAULT);\n } else {\n setActiveTool(toolType);\n }\n }\n\n handleClearFilter(): void {\n this.sendClearFilter();\n }\n\n handleDataChange(data: DashboardData): void {\n const { updateWorkspaceData } = this.props;\n\n // Only save the data that is serializable/we want to persist to the workspace\n const { closed, filterSets, links, pluginDataMap } = data;\n updateWorkspaceData({ closed, filterSets, links, pluginDataMap });\n }\n\n handleGoldenLayoutChange(newLayout: GoldenLayout): void {\n const { activeTabKey } = this.state;\n const oldLayout = this.dashboardLayouts.get(activeTabKey);\n if (oldLayout === newLayout) return;\n\n this.dashboardLayouts.set(activeTabKey, newLayout);\n\n if (oldLayout != null) {\n this.createDashboardListenerRemovers.get(activeTabKey)?.();\n this.closeDashboardListenerRemovers.get(activeTabKey)?.();\n }\n\n this.createDashboardListenerRemovers.set(\n activeTabKey,\n listenForCreateDashboard(newLayout.eventHub, this.handleCreateDashboard)\n );\n this.closeDashboardListenerRemovers.set(\n activeTabKey,\n listenForCloseDashboard(newLayout.eventHub, this.handleCloseDashboard)\n );\n }\n\n handleCreateDashboard({\n pluginId,\n title,\n data,\n }: CreateDashboardPayload): void {\n const newId = nanoid();\n const { setDashboardPluginData } = this.props;\n setDashboardPluginData(newId, pluginId, data);\n this.setState(({ tabs }) => {\n const existingTab = tabs.findIndex(\n ({ title: tabTitle }) => tabTitle === title\n );\n if (existingTab !== -1) {\n // Replace the existing tab\n return {\n tabs: tabs.map((tab, index) =>\n index === existingTab ? { key: newId, title } : tab\n ),\n activeTabKey: newId,\n };\n }\n return {\n tabs: [\n ...tabs,\n {\n key: newId,\n title,\n },\n ],\n activeTabKey: newId,\n };\n });\n }\n\n handleCloseDashboard(title: string): void {\n const { tabs } = this.state;\n const tab = tabs.find(t => t.title === title);\n if (tab != null) {\n this.handleTabClose(tab.key);\n }\n }\n\n handleWidgetMenuClick(): void {\n this.setState(({ isPanelsMenuShown }) => ({\n isPanelsMenuShown: !isPanelsMenuShown,\n }));\n }\n\n handleWidgetSelect(\n widget: DhType.ide.VariableDefinition,\n dragEvent?: WindowMouseEvent\n ): void {\n this.setState({ isPanelsMenuShown: false });\n\n log.debug('handleWidgetSelect', widget, dragEvent);\n\n this.openWidget(widget, dragEvent);\n }\n\n handleWidgetsMenuClose(): void {\n this.setState({ isPanelsMenuShown: false });\n }\n\n handleAutoFillClick(): void {\n const { widgets } = this.state;\n\n log.debug('handleAutoFillClick', widgets);\n\n const sortedWidgets = widgets.sort((a, b) =>\n a.title != null && b.title != null ? a.title.localeCompare(b.title) : 0\n );\n for (let i = 0; i < sortedWidgets.length; i += 1) {\n this.openWidget(sortedWidgets[i]);\n }\n }\n\n handleExportLayoutClick(): void {\n log.debug('handleExportLayoutClick');\n\n this.setState({ isPanelsMenuShown: false });\n\n try {\n const { workspace } = this.props;\n const { data } = workspace;\n const exportedConfig = UserLayoutUtils.exportLayout(data);\n\n log.debug('handleExportLayoutClick exportedConfig', exportedConfig);\n\n const blob = new Blob([JSON.stringify(exportedConfig)], {\n type: 'application/json',\n });\n const timestamp = dh.i18n.DateTimeFormat.format(\n 'yyyy-MM-dd-HHmmss',\n new Date()\n );\n const link = document.createElement('a');\n link.href = URL.createObjectURL(blob);\n link.download = `deephaven-app-layout-${timestamp}.json`;\n link.click();\n } catch (e) {\n log.error('Unable to export layout', e);\n }\n }\n\n handleImportLayoutClick(): void {\n log.debug('handleImportLayoutClick');\n\n this.setState({ isPanelsMenuShown: false });\n\n // Reset the file list on the import element, otherwise user won't be prompted again\n if (this.importElement.current != null) {\n this.importElement.current.value = '';\n this.importElement.current.click();\n }\n }\n\n handleResetLayoutClick(): void {\n log.debug('handleResetLayoutClick');\n\n this.setState({\n isPanelsMenuShown: false,\n isResetLayoutPromptShown: true,\n unsavedNotebookCount: NotebookPanel.unsavedNotebookCount(),\n });\n }\n\n handleImportLayoutFiles(event: ChangeEvent<HTMLInputElement>): void {\n event.stopPropagation();\n event.preventDefault();\n\n if (event.target.files != null) {\n this.importLayoutFile(event.target.files?.[0]);\n }\n }\n\n /**\n * Import the provided file and set it in the workspace data (which should then load it in the dashboard)\n * @param file JSON file to import\n */\n async importLayoutFile(file: File): Promise<void> {\n try {\n const { updateDashboardData, updateWorkspaceData } = this.props;\n const fileText = await file.text();\n const exportedLayout = JSON.parse(fileText);\n const { filterSets, layoutConfig, links, pluginDataMap } =\n UserLayoutUtils.normalizeLayout(exportedLayout);\n\n // When we import a layout, the previous Dashboard flushes changes on unmount.\n // If there were any pending changes, then the new layout is set in redux,\n // the old Dashboard unmounts and flushes its changes which resets the layout in redux,\n // and then the new Dashboard mounts with the old layout.\n flushSync(() => {\n updateWorkspaceData({ layoutConfig });\n updateDashboardData(DEFAULT_DASHBOARD_ID, {\n filterSets,\n links,\n pluginDataMap,\n });\n });\n this.setState(({ layoutIteration }) => ({\n layoutIteration: layoutIteration + 1,\n }));\n } catch (e) {\n log.error('Unable to import layout', e);\n }\n }\n\n /**\n * Resets the users layout to the default layout\n */\n async resetLayout(): Promise<void> {\n const { layoutStorage, session } = this.props;\n const { filterSets, layoutConfig, links } =\n await UserLayoutUtils.getDefaultLayout(\n layoutStorage,\n session !== undefined\n );\n\n const { updateDashboardData, updateWorkspaceData } = this.props;\n updateWorkspaceData({ layoutConfig });\n updateDashboardData(DEFAULT_DASHBOARD_ID, {\n filterSets,\n links,\n });\n }\n\n // eslint-disable-next-line class-methods-use-this\n handlePaste(event: ClipboardEvent<HTMLDivElement>): void {\n if (\n event.target instanceof HTMLElement &&\n event.target.closest('.monaco-editor')\n ) {\n // Skip if this is inside a monaco editor\n return;\n }\n\n const { clipboardData } = event;\n const pastedData = clipboardData.getData('Text');\n const replacedChars = /“|”/g;\n if (replacedChars.test(pastedData)) {\n event.preventDefault();\n event.stopPropagation();\n\n document.execCommand(\n 'insertText',\n false,\n pastedData.replace(replacedChars, '\"')\n );\n }\n }\n\n /**\n * Open a widget up, using a drag event if specified.\n * @param widget The widget to open\n * @param dragEvent The mouse drag event that trigger it, undefined if it was not triggered by a drag\n */\n openWidget(\n widget: DhType.ide.VariableDefinition,\n dragEvent?: WindowMouseEvent\n ): void {\n const { connection } = this.props;\n emitPanelOpen(this.getActiveEventHub(), {\n widget: getVariableDescriptor(widget),\n dragEvent,\n fetch: async () => connection?.getObject(widget),\n });\n }\n\n getDashboardPlugins = memoize((plugins: PluginModuleMap) =>\n getDashboardPlugins(plugins)\n );\n\n handleHomeClick(): void {\n this.handleTabSelect(DEFAULT_DASHBOARD_ID);\n }\n\n handleTabSelect(tabId: string): void {\n this.setState({ activeTabKey: tabId });\n }\n\n handleTabReorder(from: number, to: number): void {\n this.setState(({ tabs: oldTabs }) => {\n const newTabs = [...oldTabs];\n const [t] = newTabs.splice(from, 1);\n newTabs.splice(to, 0, t);\n return { tabs: newTabs };\n });\n }\n\n handleTabClose(tabId: string): void {\n // TODO: #1746 Do something to mark the dashboard as closed\n // Remove any dashboard data we no longer need to keep so\n // the dashboard data store doesn't grow unbounded\n this.setState(({ tabs: oldTabs, activeTabKey }) => {\n const newTabs = oldTabs.filter(tab => tab.key !== tabId);\n let newActiveTabKey = activeTabKey;\n if (activeTabKey === tabId && newTabs.length > 0) {\n const oldActiveTabIndex = oldTabs.findIndex(tab => tab.key === tabId);\n newActiveTabKey =\n oldActiveTabIndex < oldTabs.length - 1\n ? oldTabs[oldActiveTabIndex + 1].key\n : oldTabs[oldActiveTabIndex - 1].key;\n }\n\n if (newTabs.length === 0) {\n newActiveTabKey = DEFAULT_DASHBOARD_ID;\n }\n\n return { tabs: newTabs, activeTabKey: newActiveTabKey };\n });\n }\n\n getDashboards(): {\n id: string;\n layoutConfig: ItemConfig[];\n key?: string;\n }[] {\n const { layoutIteration, tabs } = this.state;\n const { allDashboardData, workspace } = this.props;\n const { data: workspaceData } = workspace;\n const { layoutConfig } = workspaceData;\n // TODO: #1746 Read the default dashboard layout from dashboardData instead of workspaceData\n return [\n {\n id: DEFAULT_DASHBOARD_ID,\n layoutConfig: layoutConfig as ItemConfig[],\n key: `${DEFAULT_DASHBOARD_ID}-${layoutIteration}`,\n },\n ...tabs\n .filter(tab => tab.key !== DEFAULT_DASHBOARD_ID)\n .map(tab => ({\n id: tab.key,\n layoutConfig: (allDashboardData[tab.key]?.layoutConfig ??\n EMPTY_ARRAY) as ItemConfig[],\n key: `${tab.key}-${layoutIteration}`,\n })),\n ];\n }\n\n render(): ReactElement {\n const { activeTool, plugins, user, serverConfigValues } = this.props;\n const { permissions } = user;\n const { canUsePanels } = permissions;\n const {\n contextActions,\n isPanelsMenuShown,\n isResetLayoutPromptShown,\n isSettingsMenuShown,\n unsavedNotebookCount,\n widgets,\n tabs,\n activeTabKey,\n } = this.state;\n const dashboardPlugins = this.getDashboardPlugins(plugins);\n\n return (\n <div\n className={classNames(\n 'app-main-tabs',\n 'w-100',\n 'h-100',\n 'd-flex',\n 'flex-column',\n activeTool ? `active-tool-${activeTool.toLowerCase()}` : ''\n )}\n onPaste={this.handlePaste}\n tabIndex={-1}\n >\n <div className=\"app-main-top-nav-menus\">\n <Logo className=\"ml-1\" style={{ maxHeight: '20px' }} />\n {/* Only show the Code Studio tab if there is also an open dashboard */}\n {tabs.length > 1 && (\n <div\n style={{\n flexShrink: 0,\n flexGrow: 1,\n flexBasis: 0,\n minWidth: 0,\n }}\n >\n <NavTabList\n tabs={tabs}\n activeKey={activeTabKey}\n onSelect={this.handleTabSelect}\n onReorder={this.handleTabReorder}\n onClose={this.handleTabClose}\n />\n </div>\n )}\n <div className=\"app-main-right-menu-buttons\">\n <Button\n kind=\"ghost\"\n className=\"btn-panels-menu\"\n icon={dhShapes}\n onClick={() => {\n // no-op: click is handled in `AppControlsMenu` (which uses a `DropdownMenu`)\n }}\n >\n Controls\n <AppControlsMenu\n handleControlSelect={this.handleControlSelect}\n handleToolSelect={this.handleToolSelect}\n onClearFilter={this.handleClearFilter}\n />\n </Button>\n {canUsePanels && (\n <Button\n kind=\"ghost\"\n className=\"btn-panels-menu btn-show-panels\"\n data-testid=\"app-main-panels-button\"\n onClick={this.handleWidgetMenuClick}\n icon={dhPanels}\n >\n Panels\n <Popper\n isShown={isPanelsMenuShown}\n className=\"panels-menu-popper\"\n onExited={this.handleWidgetsMenuClose}\n options={{\n placement: 'bottom',\n }}\n closeOnBlur\n interactive\n >\n <WidgetList\n widgets={widgets}\n onExportLayout={this.handleExportLayoutClick}\n onImportLayout={this.handleImportLayoutClick}\n onResetLayout={this.handleResetLayoutClick}\n onSelect={this.handleWidgetSelect}\n />\n </Popper>\n </Button>\n )}\n <Button\n kind=\"ghost\"\n className={classNames('btn-settings-menu', {\n 'text-warning':\n user.operateAs != null && user.operateAs !== user.name,\n })}\n onClick={this.handleSettingsMenuShow}\n icon={\n <span className=\"fa-layers\">\n <FontAwesomeIcon icon={vsGear} transform=\"grow-3\" />\n </span>\n }\n tooltip=\"User Settings\"\n />\n </div>\n </div>\n <AppDashboards\n dashboards={this.getDashboards()}\n activeDashboard={activeTabKey}\n onGoldenLayoutChange={this.handleGoldenLayoutChange}\n emptyDashboard={\n activeTabKey === DEFAULT_DASHBOARD_ID ? (\n <EmptyDashboard onAutoFillClick={this.handleAutoFillClick} />\n ) : (\n <LoadingOverlay data-testid=\"app-main-container-loading\" />\n )\n }\n plugins={[\n <ConsolePlugin\n key=\"ConsolePlugin\"\n hydrateConsole={AppMainContainer.hydrateConsole}\n notebooksUrl={\n new URL(\n `${import.meta.env.VITE_ROUTE_NOTEBOOKS}`,\n document.baseURI\n ).href\n }\n />,\n ...dashboardPlugins,\n ]}\n />\n <SlideTransition in={isSettingsMenuShown} mountOnEnter unmountOnExit>\n <SettingsMenu\n serverConfigValues={serverConfigValues}\n pluginData={plugins}\n onDone={this.handleSettingsMenuHide}\n user={user}\n />\n </SlideTransition>\n <ContextActions actions={contextActions} />\n <input\n ref={this.importElement}\n type=\"file\"\n accept=\".json\"\n style={{ display: 'none' }}\n onChange={this.handleImportLayoutFiles}\n data-testid=\"input-import-layout\"\n />\n <BasicModal\n confirmButtonText=\"Reset\"\n onConfirm={this.handleConfirmResetLayoutPrompt}\n onCancel={this.handleCancelResetLayoutPrompt}\n isConfirmDanger\n isOpen={isResetLayoutPromptShown}\n headerText={\n unsavedNotebookCount === 0\n ? 'Reset Layout'\n : 'Reset layout and discard unsaved changes'\n }\n bodyText={\n unsavedNotebookCount === 0\n ? 'Do you want to reset your layout? Your existing layout will be lost.'\n : 'Do you want to reset your layout? Any unsaved notebooks will be lost.'\n }\n />\n </div>\n );\n }\n}\n\nconst mapStateToProps = (\n state: RootState\n): Omit<\n AppMainContainerProps,\n | 'match'\n | 'setActiveTool'\n | 'updateDashboardData'\n | 'updateWorkspaceData'\n | 'setDashboardData'\n | 'setDashboardPluginData'\n> => ({\n activeTool: getActiveTool(state),\n allDashboardData: getAllDashboardsData(state),\n dashboardData: getDashboardData(state, DEFAULT_DASHBOARD_ID),\n layoutStorage: getLayoutStorage(state),\n plugins: getPlugins(state),\n connection: getDashboardConnection(state, DEFAULT_DASHBOARD_ID),\n session: getDashboardSessionWrapper(state, DEFAULT_DASHBOARD_ID)?.session,\n sessionConfig: getDashboardSessionWrapper(state, DEFAULT_DASHBOARD_ID)\n ?.config,\n user: getUser(state),\n workspace: getWorkspace(state),\n serverConfigValues: getServerConfigValues(state),\n});\n\nconst ConnectedAppMainContainer = connect(mapStateToProps, {\n setActiveTool: setActiveToolAction,\n setDashboardData: setDashboardDataAction,\n setDashboardPluginData: setDashboardPluginDataAction,\n updateDashboardData: updateDashboardDataAction,\n updateWorkspaceData: updateWorkspaceDataAction,\n})(withRouter(AppMainContainer));\n\nexport default ConnectedAppMainContainer;\n","import React, { type ReactElement } from 'react';\nimport { ToastContainer } from '@deephaven/components';\nimport AppMainContainer from './AppMainContainer';\n\nfunction App(): ReactElement {\n return (\n <div className=\"app\" data-testid=\"app-loaded\">\n <AppMainContainer />\n <ToastContainer />\n </div>\n );\n}\n\nexport default App;\n","import React, { useEffect, useState } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport {\n LoadingOverlay,\n Shortcut,\n ShortcutRegistry,\n} from '@deephaven/components';\nimport { DEFAULT_DASHBOARD_ID, setDashboardData } from '@deephaven/dashboard';\nimport {\n setDashboardConnection,\n setDashboardSessionWrapper,\n ToolType,\n} from '@deephaven/dashboard-core-plugins';\nimport { useApi, useClient } from '@deephaven/jsapi-bootstrap';\nimport { getSessionDetails, loadSessionWrapper } from '@deephaven/jsapi-utils';\nimport Log from '@deephaven/log';\nimport { PouchCommandHistoryStorage } from '@deephaven/pouch-storage';\nimport {\n getWorkspace,\n type RootState,\n setActiveTool,\n setApi,\n setCommandHistoryStorage,\n setFileStorage,\n setPlugins,\n setWorkspace,\n setDefaultWorkspaceSettings,\n setWorkspaceStorage,\n setServerConfigValues,\n setUser,\n} from '@deephaven/redux';\nimport {\n LocalWorkspaceStorage,\n GrpcFileStorage,\n GrpcLayoutStorage,\n useConnection,\n useServerConfig,\n useUser,\n} from '@deephaven/app-utils';\nimport { usePlugins } from '@deephaven/plugin';\nimport { setLayoutStorage } from '../redux/actions';\nimport App from './App';\n\nconst log = Log.module('AppInit');\n\n/**\n * Component that sets some default values needed\n */\nfunction AppInit(): JSX.Element {\n const api = useApi();\n const client = useClient();\n const connection = useConnection();\n const plugins = usePlugins();\n const serverConfig = useServerConfig();\n const user = useUser();\n const workspace = useSelector<RootState>(getWorkspace);\n const dispatch = useDispatch();\n\n // General error means the app is dead and is unlikely to recover\n const [error, setError] = useState<unknown>();\n\n useEffect(\n function setReduxPlugins() {\n dispatch(setPlugins(plugins));\n },\n [plugins, dispatch]\n );\n\n useEffect(\n function initApp() {\n async function loadApp(): Promise<void> {\n try {\n const sessionDetails = await getSessionDetails();\n const sessionWrapper = await loadSessionWrapper(\n api,\n connection,\n sessionDetails\n );\n\n const storageService = client.getStorageService();\n const layoutStorage = new GrpcLayoutStorage(\n storageService,\n import.meta.env.VITE_STORAGE_PATH_LAYOUTS ?? ''\n );\n const fileStorage = new GrpcFileStorage(\n api,\n storageService,\n import.meta.env.VITE_STORAGE_PATH_NOTEBOOKS ?? ''\n );\n\n const workspaceStorage = new LocalWorkspaceStorage(layoutStorage);\n const commandHistoryStorage = new PouchCommandHistoryStorage();\n\n const loadedWorkspace = await workspaceStorage.load({\n isConsoleAvailable: sessionWrapper !== undefined,\n });\n\n const { data } = loadedWorkspace;\n\n // Fill in settings that have not yet been set\n const { settings } = data;\n\n // Set any shortcuts that user has overridden on this platform\n const { shortcutOverrides = {} } = settings;\n const isMac = Shortcut.isMacPlatform;\n const platformOverrides = isMac\n ? shortcutOverrides.mac ?? {}\n : shortcutOverrides.windows ?? {};\n\n Object.entries(platformOverrides).forEach(([id, keyState]) => {\n ShortcutRegistry.get(id)?.setKeyState(keyState);\n });\n\n const dashboardData = {\n title: 'Code Studio',\n filterSets: data.filterSets,\n links: data.links,\n };\n\n dispatch(setApi(api));\n dispatch(setActiveTool(ToolType.DEFAULT));\n dispatch(setServerConfigValues(serverConfig));\n dispatch(setCommandHistoryStorage(commandHistoryStorage));\n dispatch(setDashboardData(DEFAULT_DASHBOARD_ID, dashboardData));\n dispatch(setFileStorage(fileStorage));\n dispatch(setLayoutStorage(layoutStorage));\n dispatch(setDashboardConnection(DEFAULT_DASHBOARD_ID, connection));\n if (sessionWrapper !== undefined) {\n dispatch(\n setDashboardSessionWrapper(DEFAULT_DASHBOARD_ID, sessionWrapper)\n );\n }\n dispatch(setUser(user));\n dispatch(setWorkspaceStorage(workspaceStorage));\n dispatch(setWorkspace(loadedWorkspace));\n dispatch(\n setDefaultWorkspaceSettings(\n LocalWorkspaceStorage.makeDefaultWorkspaceSettings(serverConfig)\n )\n );\n } catch (e) {\n log.error(e);\n setError(e);\n }\n }\n loadApp();\n },\n [api, client, connection, serverConfig, dispatch, user]\n );\n\n const isLoading = workspace == null && error == null;\n const isLoaded = !isLoading && error == null;\n const errorMessage = error != null ? `${error}` : null;\n\n return (\n <>\n {isLoaded && <App />}\n <LoadingOverlay\n data-testid=\"app-init-loading\"\n isLoading={isLoading && errorMessage == null}\n isLoaded={isLoaded}\n errorMessage={errorMessage}\n />\n </>\n );\n}\n\nexport default AppInit;\n","import React, { type ReactElement } from 'react';\nimport {\n BrowserRouter as Router,\n Route,\n Redirect,\n Switch,\n} from 'react-router-dom';\nimport AppInit from './AppInit';\n\nconst StyleGuideRoot = React.lazy(() => import('../styleguide/StyleGuideRoot'));\n\nconst baseURI = new URL(document.baseURI).pathname.replace(/\\/$/, '');\n\nfunction AppRouter(): ReactElement {\n return (\n <Router basename={baseURI}>\n <Switch>\n <Route exact path=\"/\" component={AppInit} />\n <Route\n path={`/${import.meta.env.VITE_ROUTE_NOTEBOOKS}:notebookPath+`}\n component={AppInit}\n />\n <Route path=\"/styleguide\" component={StyleGuideRoot} />\n <Redirect from=\"*\" to=\"/\" />\n </Switch>\n </Router>\n );\n}\n\nexport default AppRouter;\n","import React, { useEffect } from 'react';\nimport { MonacoUtils } from '@deephaven/console';\nimport { DownloadServiceWorkerUtils } from '@deephaven/iris-grid';\nimport MonacoWorker from 'monaco-editor/esm/vs/editor/editor.worker?worker';\nimport MonacoJsonWorker from 'monaco-editor/esm/vs/language/json/json.worker?worker';\nimport AppRouter from './main/AppRouter';\n\n// load addional css for playwright docker tests\nif (import.meta.env.VITE_PLAYWRIGHT_CSS === '1') {\n await import('./Playwright.css');\n}\n\nexport function AppRoot(): JSX.Element {\n useEffect(function init() {\n DownloadServiceWorkerUtils.register(\n new URL(\n `${import.meta.env.BASE_URL ?? ''}download/serviceWorker.js`,\n window.location.href\n )\n );\n\n MonacoUtils.init({\n getWorker: (id: string, label: string) => {\n if (label === 'json') {\n return new MonacoJsonWorker();\n }\n return new MonacoWorker();\n },\n });\n\n // disable annoying dnd-react warnings\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n window['__@hello-pangea/dnd-disable-dev-warnings'] = true;\n }, []);\n\n return <AppRouter />;\n}\n\nexport default AppRoot;\n"],"file":"assets/AppRoot-yoU6xO7o.js"}
|
|
1
|
+
{"version":3,"mappings":"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","names":["StorageUtils","columnName","direction","filters","filterItems","filterOperators","filterItem","i","FilterOperator","config1","config2","operator","type","value","siftPrunableItems","items","maxItems","pruneItemsCount","pruneCount","ownKeys","e","r","t","o","_objectSpread","_defineProperty","asyncGeneratorStep","a","c","u","n","_asyncToGenerator","_next","_throw","_toPropertyKey","_toPrimitive","log","Log","DB_PREFIX","PouchDB","PouchDBFind","makePouchFilter","FilterType","makePouchSelectorFromConfig","config","filter","newFilter","filterOperator","selectorWithFilters","sortWithConfigs","sorts","_sorts$map","reverse","sort","PouchStorageTable","databaseName","dbOptions","callback","other","id","listener","reversed","viewport","_this","_this$viewportUpdateP","item","_this2","newItem","_this$currentViewport","listeners","data","event","selector","_this3","_this4","_this4$infoUpdateProm","_this4$currentFilter","PromiseUtils","findResult","_this5","_this6","_this6$currentFilter","_this6$viewportUpdate","viewportData","_this7","sortedRanges","_this8","itemMap","_ref2","_ref","_this8$currentFilter","from","to","limit","findSnapshotResult","index","_x","COMMAND_HISTORY_ITEMS_MAX","COMMAND_HISTORY_ITEMS_PRUNE","PouchCommandHistoryTable","language","cache","_this$cache$tableRegi","searchText","_selector","result","allItems","row","name","toKeep","toPrune","_ref3","isReversed","docs","resumeListeners","err","_this$cache$tableRegi2","_this$cache$tableRegi3","_this$changes","PouchCommandHistoryCache","dbName","_this$tableRegistry$g","pausedTables","table","_this$tableRegistry$g2","_this$tableRegistry$g3","PouchCommandHistoryStorage","scope","command","updateTable","dbItem","updatedItem","SET_LAYOUT_STORAGE","setLayoutStorage","layoutStorage","dh","isFormatStringFormat","format","getFormattedVersionInfo","serverConfigValues","ua","Bowser","browser","os","pythonVersion","getFormattedPluginInfo","pluginDataValues","plugin","acc","key","focusFirstInputInContainer","container","input","isSameOptions","options1","options2","isSameDecimalOptions","isSameIntegerOptions","isValidColumnName","DbNameValidator","isValidFormat","columnType","DateTimeColumnFormatter","DecimalColumnFormatter","IntegerColumnFormatter","removeFormatRuleExtraProps","isNewRule","rest","isFormatRuleValidForSave","rule","DateTimeOptions","props","timestamp","timeZone","showTimeZone","showTSeparator","isGlobalOptions","legacyGlobalFormat","useApi","formatter","useMemo","Formatter","formats","jsx","Fragment","formatString","TableUtils","TimeZoneOptions","TimeUtils","label","_FormattingSectionContent","PureComponent","__publicField","memoize","timestampAtMenuOpen","debounce","defaultDateTimeFormat","defaultDecimalFormatOptions","defaultIntegerFormatOptions","truncateNumbersWithPound","showEmptyStrings","showNullStrings","showExtraGroupColumn","React","updates","update","defaults","updateSettings","defaultDecimalFormatString","defaultIntegerFormatString","isTimeZoneDefault","isDateTimeOptionsDefault","isDecimalOptionsDefault","isIntegerOptionsDefault","jsxs","Select","Button","vsRefresh","classNames","Checkbox","FormattingSectionContent","mapStateToProps","state","getDefaultDateTimeFormat","getDefaultDecimalFormatOptions","getDefaultIntegerFormatOptions","getApi","getShowTimeZone","getShowTSeparator","getTruncateNumbersWithPound","getShowEmptyStrings","getShowNullStrings","getShowExtraGroupColumn","getTimeZone","getDefaultSettings","ConnectedFormattingSectionContent","connect","updateSettingsAction","LegalNotice","modal","setModal","useState","toggle","vsLaw","Modal","ModalHeader","ModalBody","SettingsMenuSection","children","isExpanded","sectionKey","title","onToggle","FontAwesomeIcon","vsTriangleDown","Collapse","ShortcutItem","shortcut","propsDisplayText","categoryName","onChange","displayText","setDisplayText","keyState","setKeyState","isPending","setIsPending","error","setError","useEffect","Shortcut","conflictNames","ShortcutRegistry","conflict","handleInputKeyDown","newKeyState","backspaceKeyState","KEY","handleInputKeyUp","handleInputFocus","ContextActionUtils","handleInputBlur","handleConfirm","handleUndo","originalKeyState","handleResetToDefaultClick","Tooltip","ShortcutSectionContent","shortcutOverrides","saveShortcutOverrides","useCallback","modifiedShortcuts","isMac","newOverrides","platformOverrides","categories","shortcuts","globalCategoryIndex","category","globalCategory","ShortcutCategory","propsShortcuts","formatCategoryName","word","setShortcuts","handleShortcutChange","conflictingShortcuts","s","modifiedShoftcuts","displayTexts","getShortcutOverrides","mapDispatchToProps","ConnectedShortcutSectionContent","columnTypesArray","ColumnTypeOptions","columnTypeOptions","_ColumnSpecificSectionContent","formatSettings","lastFormatRuleIndex","oldFormatSettings","assertNotNull","resetKeys","newEntry","newFormat","elem","scrollTo","_a","_b","errorMessages","columnNameId","columnTypeId","formatId","onNameChange","onNameBlur","onTypeChange","eventTargetValue","ruleError","vsTrash","isInvalid","selectedFormat","defaultFormatString","formatRulesChanged","formatRules","FadeTransition","addNewRuleButton","dhNewCircleLargeFilled","TransitionGroup","ColumnSpecificSectionContent","getFormatter","ConnectedColumnSpecificSectionContent","AdvancedSectionContent","dispatch","useDispatch","webgl","useAppSelector","getWebGL","webglEditable","getWebGLEditable","handleWebglChange","newValue","helpText","Text","Switch","ContextualHelp","Heading","Content","ThemeSectionContent","theme","useTheme","settings","getSettings","updateDensity","density","ThemePicker","Picker","Item","EditorSectionContent","notebookSettings","getNotebookSettings","isMinimapEnabled","formatOnSave","ruffSettings","ruffEnabled","ruffConfig","RUFF_DEFAULT_SETTINGS","handleMinimapChange","updateNotebookSettings","handleFormatOnSaveChange","handleRuffEnabledChange","MonacoProviders","handleRuffConfigChange","val","isRuffSettingsOpen","setIsRuffSettingsOpen","handleRuffSettingsClose","handleRuffSettingsSave","v","ActionButton","Icon","vsSettings","RuffSettingsModal","_SettingsMenu","Component","BROADCAST_CHANNEL_NAME","expandedSectionKey","makeMessage","BROADCAST_LOGOUT_MESSAGE","x","y","onDone","pluginData","pluginInfo","exportLogs","logHistory","store","supportLink","docsLink","user","versionInfo","deephavenVersion","copyShortcut","GLOBAL_SHORTCUTS","getRow","text","ver","userDisplayName","hasUserImage","showUserName","dhUser","dhUserIncognito","vsClose","vsWatch","vsLayers","vsPaintcan","vsFileCode","vsRecordKeys","vsTools","CopyButton","Logo","SettingsMenu","MINIMUM_DRAG_DISTANCE","DragSourceMenuItem","forwardedProps","action","menuItemDisabled","iconElement","displayShortcut","isMouseSelected","isKeyboardSelected","closeMenu","startX","useRef","startY","startObject","disableDoubleClick","setDisableDoubleClick","handleMouseMove","handleMouseDown","handleMouseUp","AppControlsMenu","handleControlSelect","handleToolSelect","onClearFilter","controlMenuActions","dhInput","dragEvent","ControlType","dhTriangleDownSquare","vsMarkdown","vsDeviceCamera","vsLink","ToolType","dhFilterSlash","IRIS_GRID_SHORTCUTS","DropdownMenu","replaceReducer","reducers","getLayoutStorage","getServerConfigValues","reducer","reducerRegistry","WidgetList","onExportLayout","onImportLayout","onResetLayout","onSelect","widgets","setSearchText","searchField","selectStartEvent","sendSelect","widget","handleSearchChange","filteredWidgets","b","widgetElements","ObjectIcon","errorElement","SearchInput","vsPreview","vsArrowSmallDown","vsArrowSmallUp","EmptyDashboard","onAutoFillClick","vsArrowUp","AppMainContainer","plugins","getDashboardPlugins","bindAllMethods","allDashboardData","createExportLogsContextAction","versionInfoText","copyToClipboard","NAVIGATION_SHORTCUTS","DEFAULT_DASHBOARD_ID","vsTerminal","DashboardUtils","zipFile","JSZip","zip","prevProps","prevState","dashboardData","rm","connection","updated","created","removed","widgetsToRemove","newWidgets","toRemove","toAdd","setDashboardPluginData","updateDashboardData","workspace","workspaceData","filterSets","links","pluginDataMap","pluginKeys","pluginId","match","notebookPath","session","sessionConfig","fileMetadata","NotebookEvent","InputFilterEvent","emitCycleToNextStack","emitCycleToPreviousStack","emitCycleToNextTab","emitCycleToPreviousTab","PanelEvent","tabs","activeTabKey","currentIndex","tab","targetIndex","targetTab","layout","args","MarkdownEvent","toolType","activeTool","setActiveTool","updateWorkspaceData","closed","newLayout","oldLayout","listenForCreateDashboard","listenForCloseDashboard","newId","nanoid","existingTab","tabTitle","isPanelsMenuShown","sortedWidgets","exportedConfig","UserLayoutUtils","blob","link","NotebookPanel","file","fileText","exportedLayout","layoutConfig","flushSync","layoutIteration","clipboardData","pastedData","replacedChars","emitPanelOpen","getVariableDescriptor","tabId","oldTabs","newTabs","newActiveTabKey","oldActiveTabIndex","EMPTY_ARRAY","permissions","canUsePanels","contextActions","isResetLayoutPromptShown","isSettingsMenuShown","unsavedNotebookCount","dashboardPlugins","NavTabList","dhShapes","dhPanels","Popper","vsGear","AppDashboards","LoadingOverlay","ConsolePlugin","SlideTransition","ContextActions","BasicModal","getActiveTool","getAllDashboardsData","getDashboardData","getPlugins","getDashboardConnection","getDashboardSessionWrapper","getUser","getWorkspace","ConnectedAppMainContainer","setActiveToolAction","setDashboardDataAction","setDashboardPluginDataAction","updateDashboardDataAction","updateWorkspaceDataAction","withRouter","App","ToastContainer","AppInit","api","client","useClient","useConnection","usePlugins","serverConfig","useServerConfig","useUser","useSelector","setPlugins","loadApp","sessionDetails","getSessionDetails","sessionWrapper","loadSessionWrapper","storageService","GrpcLayoutStorage","fileStorage","GrpcFileStorage","workspaceStorage","LocalWorkspaceStorage","commandHistoryStorage","loadedWorkspace","setApi","setServerConfigValues","setCommandHistoryStorage","setDashboardData","setFileStorage","setDashboardConnection","setDashboardSessionWrapper","setUser","setWorkspaceStorage","setWorkspace","setDefaultWorkspaceSettings","isLoading","isLoaded","errorMessage","StyleGuideRoot","__vitePreload","baseURI","AppRouter","Router","Route","Redirect","AppRoot","DownloadServiceWorkerUtils","MonacoUtils","MonacoJsonWorker","MonacoWorker"],"ignoreList":[],"sources":["../../../storage/dist/StorageUtils.js","../../../pouch-storage/dist/pouchCommandHistoryUtils.js","../../../pouch-storage/dist/PouchStorageTable.js","../../../pouch-storage/dist/PouchCommandHistoryTable.js","../../../pouch-storage/dist/PouchCommandHistoryCache.js","../../../pouch-storage/dist/PouchCommandHistoryStorage.js","../../src/redux/actionTypes.ts","../../src/redux/actions.ts","../../../jsapi-shim/dist/dh.js","../../src/settings/SettingsUtils.tsx","../../src/settings/DateTimeOptions.tsx","../../src/settings/TimeZoneOptions.tsx","../../src/settings/FormattingSectionContent.tsx","../../src/settings/LegalNotice.tsx","../../src/settings/SettingsMenuSection.tsx","../../src/settings/ShortcutItem.tsx","../../src/settings/ShortcutsSectionContent.tsx","../../src/settings/ColumnTypeOptions.tsx","../../src/settings/ColumnSpecificSectionContent.tsx","../../src/settings/AdvancedSectionContent.tsx","../../src/settings/ThemeSectionContent.tsx","../../src/settings/EditorSectionContent.tsx","../../src/settings/SettingsMenu.tsx","../../src/main/AppControlsMenu.tsx","../../src/redux/reducers/layoutStorage.ts","../../src/redux/reducers/index.ts","../../src/redux/selectors.ts","../../src/redux/index.ts","../../src/main/WidgetList.tsx","../../src/main/EmptyDashboard.tsx","../../src/main/AppMainContainer.tsx","../../src/main/App.tsx","../../src/main/AppInit.tsx","../../src/main/AppRouter.tsx","../../src/AppRoot.tsx"],"sourcesContent":["import { Operator as FilterOperator } from '@deephaven/filters';\nexport class StorageUtils {\n static makeSortConfig(columnName, direction) {\n return {\n column: columnName,\n direction\n };\n }\n static makeFilterConfig(filters) {\n var filterItems = [];\n var filterOperators = [];\n filters.forEach((filterItem, i) => {\n filterItems.push(filterItem);\n if (i > 0) {\n filterOperators.push(FilterOperator.and);\n }\n });\n return {\n filterItems,\n filterOperators\n };\n }\n static combineFilterConfigs(config1, config2) {\n var operator = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : FilterOperator.and;\n return {\n filterItems: [...config1.filterItems, ...config2.filterItems],\n filterOperators: [...config1.filterOperators, operator, ...config2.filterOperators]\n };\n }\n static makeFilterItem(columnName, type, value) {\n return {\n columnName,\n type,\n value\n };\n }\n}\nexport default StorageUtils;\n//# sourceMappingURL=StorageUtils.js.map","/**\n * Takes an array of items and determines which ones to keep and which ones to\n * prune based on the given thresholds.\n * @param items items to keep or prune\n * @param maxItems maximum number of items to allow before pruning\n * @param pruneItemsCount if the maxItems count is exceeded, the number we want to keep\n */\n// eslint-disable-next-line import/prefer-default-export\nexport function siftPrunableItems(items, maxItems, pruneItemsCount) {\n if (items.length > maxItems) {\n var pruneCount = items.length - pruneItemsCount;\n return {\n toKeep: items.slice(pruneCount),\n toPrune: items.slice(0, pruneCount)\n };\n }\n return {\n toKeep: items,\n toPrune: []\n };\n}\n//# sourceMappingURL=pouchCommandHistoryUtils.js.map","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; }\nfunction _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; }\nfunction asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }\nfunction _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"next\", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"throw\", n); } _next(void 0); }); }; }\nfunction _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; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\nfunction _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); }\nimport PouchDB from 'pouchdb-browser';\nimport PouchDBFind from 'pouchdb-find';\nimport { Operator as FilterOperator, Type as FilterType } from '@deephaven/filters';\nimport Log from '@deephaven/log';\nimport { PromiseUtils } from '@deephaven/utils';\nvar log = Log.module('PouchStorageTable');\nvar DB_PREFIX = 'Deephaven.';\nPouchDB.plugin(PouchDBFind);\nexport function makePouchFilter(type, value) {\n switch (type) {\n case FilterType.in:\n case FilterType.contains:\n return {\n $regex: new RegExp(\"\".concat(value)).toString()\n };\n case FilterType.inIgnoreCase:\n return {\n $regex: new RegExp(\"\".concat(value), 'i').toString()\n };\n case FilterType.eq:\n return {\n $eq: value\n };\n case FilterType.notEq:\n return {\n $ne: value\n };\n case FilterType.greaterThan:\n return {\n $gt: value\n };\n case FilterType.greaterThanOrEqualTo:\n return {\n $gte: value\n };\n case FilterType.lessThan:\n return {\n $lt: value\n };\n case FilterType.lessThanOrEqualTo:\n return {\n $lte: value\n };\n case FilterType.startsWith:\n return {\n $regex: new RegExp(\"^\".concat(value, \".*\")).toString()\n };\n default:\n throw new Error(\"Unsupported type: \".concat(type));\n }\n}\nfunction makePouchSelectorFromConfig(config) {\n var {\n filterItems,\n filterOperators\n } = config;\n var filter = null;\n for (var i = 0; i < filterItems.length; i += 1) {\n var filterItem = filterItems[i];\n var {\n columnName,\n type,\n value\n } = filterItem;\n var newFilter = {\n [columnName]: makePouchFilter(type, value)\n };\n if (i === 0) {\n filter = newFilter;\n } else if (filter !== null && i - 1 < filterOperators.length) {\n var filterOperator = filterOperators[i - 1];\n if (filterOperator === FilterOperator.and) {\n filter = {\n $and: [filter, newFilter]\n };\n } else if (filterOperator === FilterOperator.or) {\n filter = {\n $or: [filter, newFilter]\n };\n } else {\n throw new Error(\"Unexpected filter operator \".concat(filterOperator, \", \").concat(newFilter));\n }\n }\n }\n if (filter == null) {\n throw new Error(\"Invalid filter config \".concat(config));\n }\n return filter;\n}\nfunction selectorWithFilters() {\n var filters = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n return {\n $and: [...filters.map(filter => makePouchSelectorFromConfig(filter)), {\n name: {\n $gt: null\n }\n }, {\n id: {\n $gt: null\n }\n }]\n };\n}\nfunction sortWithConfigs(sorts) {\n var _sorts$map;\n var reverse = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n return [{\n id: reverse ? 'desc' : 'asc'\n }, ...((_sorts$map = sorts === null || sorts === void 0 ? void 0 : sorts.map(sort => ({\n [sort.column]: sort.direction\n }))) !== null && _sorts$map !== void 0 ? _sorts$map : [])];\n}\nexport class PouchStorageTable {\n constructor(databaseName, dbOptions) {\n _defineProperty(this, \"db\", void 0);\n _defineProperty(this, \"changes\", void 0);\n _defineProperty(this, \"listeners\", []);\n _defineProperty(this, \"itemListeners\", new Map());\n _defineProperty(this, \"currentSize\", 0);\n _defineProperty(this, \"currentViewport\", void 0);\n _defineProperty(this, \"currentReverse\", false);\n _defineProperty(this, \"currentFilter\", null);\n _defineProperty(this, \"currentSort\", null);\n _defineProperty(this, \"infoUpdatePromise\", void 0);\n _defineProperty(this, \"viewportUpdatePromise\", void 0);\n _defineProperty(this, \"currentViewportData\", void 0);\n this.db = new PouchDB(\"\".concat(DB_PREFIX).concat(databaseName), dbOptions);\n\n // Need to set `_remote` to false to remove deprecation warnings: https://github.com/pouchdb/pouchdb/issues/6106\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, no-underscore-dangle\n this.db._remote = false;\n this.listenForChanges();\n this.db.createIndex({\n index: {\n fields: ['id', 'name']\n }\n });\n this.refreshInfo();\n }\n\n /**\n * Listen for db changes. This can be cancelled by calling\n * `this.changes?.cancel()`\n */\n listenForChanges() {\n this.changes = this.db.changes({\n live: true,\n since: 'now',\n include_docs: true\n }).on('change', this.dbUpdate.bind(this));\n }\n onUpdate(callback) {\n this.listeners = [...this.listeners, callback];\n return () => {\n this.listeners = this.listeners.filter(other => other !== callback);\n };\n }\n onItemUpdate(id, listener) {\n if (!this.itemListeners.has(id)) {\n this.itemListeners.set(id, []);\n }\n this.itemListeners.set(id, [...this.itemListeners.get(id), listener]);\n this.refreshItem(id);\n return () => {\n this.itemListeners.set(id, this.itemListeners.get(id).filter(other => other !== listener));\n };\n }\n close() {\n this.listeners = [];\n }\n get size() {\n return this.currentSize;\n }\n get viewport() {\n return this.currentViewport;\n }\n setReversed(reversed) {\n this.currentReverse = reversed;\n this.currentViewportData = undefined;\n this.refreshData();\n }\n setViewport(viewport) {\n this.currentViewport = viewport;\n this.refreshInfo();\n this.refreshData();\n }\n setSorts(config) {\n this.currentSort = config;\n this.currentViewportData = undefined;\n this.refreshData();\n }\n setFilters(config) {\n this.currentFilter = config;\n this.currentViewportData = undefined;\n this.refreshInfo();\n this.refreshData();\n }\n get data() {\n return this.currentViewportData;\n }\n getViewportData() {\n var _this = this;\n return _asyncToGenerator(function* () {\n var _this$viewportUpdateP;\n if (!_this.viewportUpdatePromise) {\n _this.refreshData();\n }\n return (_this$viewportUpdateP = _this.viewportUpdatePromise) !== null && _this$viewportUpdateP !== void 0 ? _this$viewportUpdateP : Promise.resolve({\n items: [],\n offset: 0\n });\n })();\n }\n put(item) {\n var _this2 = this;\n return _asyncToGenerator(function* () {\n // Put the item ID in both the _id and the id slot\n // PouchDB uses _id everywhere, StorageTable just uses `id` though\n var newItem = _objectSpread(_objectSpread({}, item), {}, {\n _id: item.id\n });\n yield _this2.db.put(newItem);\n return newItem;\n })();\n }\n sendUpdate() {\n var _this$currentViewport;\n // Retain a reference to it in case a listener gets removed while sending an update\n var {\n listeners\n } = this;\n var data = (_this$currentViewport = this.currentViewportData) !== null && _this$currentViewport !== void 0 ? _this$currentViewport : {\n items: [],\n offset: 0\n };\n for (var i = 0; i < listeners.length; i += 1) {\n listeners[i](data);\n }\n }\n sendItemUpdate(item) {\n var listeners = this.itemListeners.get(item.id);\n if (listeners !== undefined) {\n for (var i = 0; i < listeners.length; i += 1) {\n listeners[i](item);\n }\n }\n }\n dbUpdate(event) {\n log.debug('Update received', event);\n this.refreshInfo();\n if (event.doc !== undefined) {\n this.sendItemUpdate(event.doc);\n }\n this.refreshData();\n }\n\n /**\n * Fetch infor for a given selector.\n * @param selector\n */\n fetchInfo(selector) {\n var _this3 = this;\n return _asyncToGenerator(function* () {\n return _this3.db.find({\n selector,\n fields: []\n });\n })();\n }\n refreshInfo() {\n var _this4 = this;\n return _asyncToGenerator(function* () {\n try {\n var _this4$infoUpdateProm, _this4$currentFilter;\n (_this4$infoUpdateProm = _this4.infoUpdatePromise) === null || _this4$infoUpdateProm === void 0 || _this4$infoUpdateProm.cancel();\n _this4.infoUpdatePromise = PromiseUtils.makeCancelable(_this4.fetchInfo(selectorWithFilters((_this4$currentFilter = _this4.currentFilter) !== null && _this4$currentFilter !== void 0 ? _this4$currentFilter : [])));\n var findResult = yield _this4.infoUpdatePromise;\n _this4.currentSize = findResult.docs.length;\n _this4.sendUpdate();\n } catch (e) {\n if (!PromiseUtils.isCanceled(e)) {\n log.error('Unable to refreshInfo', e);\n throw e;\n }\n }\n })();\n }\n\n /**\n * Fetch data for the given viewport, selector, and sort.\n * @param viewport\n * @param selector\n * @param sort\n */\n fetchViewportData(viewport, selector, sort) {\n var _this5 = this;\n return _asyncToGenerator(function* () {\n return _this5.db.find({\n selector,\n skip: viewport.top,\n limit: viewport.bottom - viewport.top + 1,\n sort,\n fields: ['id', 'name']\n }).then(findResult => ({\n items: findResult.docs,\n offset: viewport.top\n }));\n })();\n }\n refreshData() {\n var _this6 = this;\n return _asyncToGenerator(function* () {\n if (!_this6.currentViewport) {\n return;\n }\n try {\n var _this6$currentFilter, _this6$viewportUpdate;\n var selector = selectorWithFilters((_this6$currentFilter = _this6.currentFilter) !== null && _this6$currentFilter !== void 0 ? _this6$currentFilter : []);\n var sort = sortWithConfigs(_this6.currentSort, _this6.currentReverse);\n (_this6$viewportUpdate = _this6.viewportUpdatePromise) === null || _this6$viewportUpdate === void 0 || _this6$viewportUpdate.cancel();\n _this6.viewportUpdatePromise = PromiseUtils.makeCancelable(_this6.fetchViewportData(_this6.currentViewport, selector, sort));\n var viewportData = yield _this6.viewportUpdatePromise;\n _this6.currentViewportData = viewportData;\n _this6.sendUpdate();\n return viewportData;\n } catch (e) {\n if (!PromiseUtils.isCanceled(e)) {\n log.error('Unable to refreshData', e);\n throw e;\n }\n }\n })();\n }\n refreshItem(id) {\n var _this7 = this;\n return _asyncToGenerator(function* () {\n var findResult = yield _this7.db.find({\n selector: {\n id\n },\n limit: 1\n });\n var item = findResult.docs[0];\n if (item !== undefined) {\n _this7.sendItemUpdate(item);\n }\n return item;\n })();\n }\n getSnapshot(sortedRanges) {\n var _this8 = this;\n return _asyncToGenerator(function* () {\n var itemMap = new Map();\n var sort = [{\n id: _this8.currentReverse ? 'desc' : 'asc'\n }];\n yield Promise.all(sortedRanges.map(/*#__PURE__*/function () {\n var _ref2 = _asyncToGenerator(function* (_ref) {\n var _this8$currentFilter;\n var [from, to] = _ref;\n var limit = to - from + 1;\n return _this8.db.find({\n selector: selectorWithFilters((_this8$currentFilter = _this8.currentFilter) !== null && _this8$currentFilter !== void 0 ? _this8$currentFilter : []),\n skip: from,\n limit,\n sort,\n fields: ['id', 'name']\n }).then(findSnapshotResult => {\n for (var i = 0; i < limit; i += 1) {\n var index = from + i;\n itemMap.set(index, findSnapshotResult.docs[i]);\n }\n });\n });\n return function (_x) {\n return _ref2.apply(this, arguments);\n };\n }()));\n return itemMap;\n })();\n }\n}\nexport default PouchStorageTable;\n//# sourceMappingURL=PouchStorageTable.js.map","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; }\nfunction _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; }\nfunction asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }\nfunction _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"next\", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"throw\", n); } _next(void 0); }); }; }\nfunction _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; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\nfunction _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); }\nimport { Type as FilterType } from '@deephaven/filters';\nimport Log from '@deephaven/log';\nimport { StorageUtils } from '@deephaven/storage';\nimport { PromiseUtils } from '@deephaven/utils';\nimport { siftPrunableItems } from \"./pouchCommandHistoryUtils.js\";\nimport PouchStorageTable from \"./PouchStorageTable.js\";\nvar COMMAND_HISTORY_ITEMS_MAX = 2500;\nvar COMMAND_HISTORY_ITEMS_PRUNE = 2000;\nvar log = Log.module('PouchCommandHistoryTable');\nexport class PouchCommandHistoryTable extends PouchStorageTable {\n constructor(language, cache) {\n var _this$cache$tableRegi;\n super(\"CommandHistoryStorage.\".concat(language), {\n // Optimizations to cut down on growing table size. These should be safe\n // since we don't care about revision history for command history\n // documents.\n auto_compaction: true,\n revs_limit: 1\n });\n\n // Add this table instance to the table registry\n _defineProperty(this, \"searchText\", void 0);\n this.cache = cache;\n if (!this.cache.tableRegistry.has(this.cacheKey)) {\n this.cache.tableRegistry.set(this.cacheKey, new Set());\n }\n log.debug('Adding table to registry', this.cacheKey);\n (_this$cache$tableRegi = this.cache.tableRegistry.get(this.cacheKey)) === null || _this$cache$tableRegi === void 0 || _this$cache$tableRegi.add(this);\n }\n get cacheKey() {\n return this.db.name;\n }\n setSearch(searchText) {\n log.debug('Setting search filters', searchText);\n this.searchText = searchText.trim().toLowerCase();\n this.setFilters(searchText ? [StorageUtils.makeFilterConfig([StorageUtils.makeFilterItem('name', FilterType.contains, searchText)])] : []);\n }\n\n // Our current version of eslint + prettier doesn't always like the `override`\n // keyword. Whenever we upgrade, we should annotate this function with `override`.\n dbUpdate(event) {\n log.debug('Clearing cache and refreshing data', event);\n this.cache.response.delete(this.cacheKey);\n super.dbUpdate(event);\n }\n\n /**\n * Fetch command history data from `this.cache.response` or from\n * PouchDB if data is not found in the cache. If the number of total items in\n * the db exceeds COMMAND_HISTORY_ITEMS_MAX, the database will be pruned down\n * to COMMAND_HISTORY_ITEMS_PRUNE total items. Note that PouchDB doesn't\n * actually remove them from the underlying IndexDB, they are just marked\n * as deleted and won't be present in our query results.\n * @param selector\n */\n fetchData(_selector) {\n var _this = this;\n return _asyncToGenerator(function* () {\n // Wrapping this in a setTimeout so that it executes on next call stack.\n // This is necessary to ensure `this.cache` has been initialized due to some\n // nuances with property initilization with inherited classes.\n return PromiseUtils.withTimeout(0, /*#__PURE__*/_asyncToGenerator(function* () {\n if (_this.cache.response.has(_this.cacheKey)) {\n log.debug('Fetching from cache', _this.searchText, _this.viewport);\n } else {\n log.debug('Fetching from PouchDB', _this.searchText, _this.viewport);\n _this.cache.response.set(_this.cacheKey, _this.db.allDocs({\n include_docs: true\n }).then(result => {\n var allItems = result.rows\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n .map(row => row.doc).filter(_ref2 => {\n var {\n name\n } = _ref2;\n return name;\n });\n log.debug(\"Fetched \".concat(allItems.length, \" command history items\"));\n var {\n toKeep,\n toPrune\n } = siftPrunableItems(allItems, COMMAND_HISTORY_ITEMS_MAX, COMMAND_HISTORY_ITEMS_PRUNE);\n\n // If number of items in PouchDB has exceeded COMMAND_HISTORY_ITEMS_MAX\n // prune them down so we have COMMAND_HISTORY_ITEMS_PRUNE left\n if (toPrune.length) {\n _this.pruneItems(toPrune);\n }\n return {\n docs: toKeep\n };\n }));\n }\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n var result = _this.cache.response.get(_this.cacheKey);\n if (_this.searchText == null || _this.searchText === '') {\n return result;\n }\n return _objectSpread(_objectSpread({}, result), {}, {\n docs: (yield result).docs.filter(_ref3 => {\n var {\n name\n } = _ref3;\n return (\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n name.toLowerCase().includes(_this.searchText)\n );\n })\n });\n }));\n })();\n }\n\n /**\n * Override `PouchStorageTable.fetchInfo` so we can make use of\n * `PouchCommandHistoryCache`\n * @param selector\n */\n // Our current version of eslint + prettier doesn't always like the `override`\n // keyword. Whenever we upgrade, we should annotate this function with `override`.\n fetchInfo(selector) {\n var _this2 = this;\n return _asyncToGenerator(function* () {\n return _this2.fetchData(selector);\n })();\n }\n\n /**\n * Override `PouchStorageTable.fetchViewportData` to fetch command history\n * storage items. This override provides caching + optimizations specific to\n * command history. We cache the results to avoid excessive PouchDB queries\n * during scrolling. The cache should only need to be invalidated when search\n * filter changes or commands are added to the storage history.\n *\n * @param viewport\n * @param selector\n * @param sort\n * @returns Promise to array of command history storage items\n */\n // Our current version of eslint + prettier doesn't always like the `override`\n // keyword. Whenever we upgrade, we should annotate this function with `override`.\n fetchViewportData(viewport, selector, sort) {\n var _this3 = this;\n return _asyncToGenerator(function* () {\n var data = yield _this3.fetchData(selector);\n log.debug('Fetching viewport data', viewport.top, viewport.bottom + 1, sort, data);\n var isReversed = typeof sort[0] === 'object' && sort[0].id === 'desc';\n var docs = isReversed ? data.docs.slice(0).reverse() : data.docs;\n var items = docs.slice(viewport.top, viewport.bottom + 1);\n return {\n items,\n offset: viewport.top\n };\n })();\n }\n\n /**\n * Mark given items as `_deleted` in the database.\n * @param items\n */\n pruneItems(items) {\n var _this4 = this;\n return _asyncToGenerator(function* () {\n if (_this4.cache.isPruning.get(_this4.cacheKey) === true) {\n log.debug('Pruning already in progress. Skipping.');\n return;\n }\n try {\n log.debug(\"Pruning \".concat(items.length, \" command history items\"));\n\n // Disable change notifications while we bulk delete to avoid locking up\n // the app\n var resumeListeners = _this4.cache.pauseChangeListeners(_this4.cacheKey);\n _this4.cache.isPruning.set(_this4.cacheKey, true);\n yield _this4.db.bulkDocs(items.map(item => _objectSpread(_objectSpread({}, item), {}, {\n _deleted: true\n })));\n _this4.cache.isPruning.set(_this4.cacheKey, false);\n resumeListeners();\n log.debug('Finished pruning command history items');\n } catch (err) {\n log.error('An error occurred while pruning db', err);\n }\n })();\n }\n\n // Our current version of eslint + prettier doesn't always like the `override`\n // keyword. Whenever we upgrade, we should annotate this function with `override`.\n close() {\n var _this$cache$tableRegi2, _this$cache$tableRegi3, _this$changes;\n log.debug('Closing table', this, (_this$cache$tableRegi2 = this.cache.tableRegistry.get(this.cacheKey)) === null || _this$cache$tableRegi2 === void 0 ? void 0 : _this$cache$tableRegi2.size);\n (_this$cache$tableRegi3 = this.cache.tableRegistry.get(this.cacheKey)) === null || _this$cache$tableRegi3 === void 0 || _this$cache$tableRegi3.delete(this);\n (_this$changes = this.changes) === null || _this$changes === void 0 || _this$changes.cancel();\n super.close();\n }\n}\nexport default PouchCommandHistoryTable;\n//# sourceMappingURL=PouchCommandHistoryTable.js.map","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; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\nfunction _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); }\nimport Log from '@deephaven/log';\nvar log = Log.module('PouchCommandHistoryCache');\n\n/**\n * Cache for tracking things shared across multiple\n * `PouchCommandHistoryTable` instances.\n */\nclass PouchCommandHistoryCache {\n constructor() {\n /**\n * Keep track of pruning status for a database. This helps ensure only 1\n * pruning operation gets executed if multiple instances of a PouchCommandHistory\n * table load data at the same time.\n */\n _defineProperty(this, \"isPruning\", void 0);\n /**\n * Cache for command history query results keyed by db name. The cached data\n * will be shared across all `PouchCommandHistoryTable` instances that have\n * the same db name.\n */\n _defineProperty(this, \"response\", void 0);\n /**\n * Keeps track of all `PouchCommandHistoryTable` instances.\n */\n _defineProperty(this, \"tableRegistry\", void 0);\n this.isPruning = new Map();\n this.response = new Map();\n this.tableRegistry = new Map();\n }\n /**\n * Pauses PouchDB change listeners for any `PouchCommandHistoryTable` with\n * the given database name. This will cancel existing subscriptions and\n * return a callback that can be used to re-subscribe them.\n * @param dbName\n */\n pauseChangeListeners(dbName) {\n var _this$tableRegistry$g;\n var pausedTables = [];\n (_this$tableRegistry$g = this.tableRegistry.get(dbName)) === null || _this$tableRegistry$g === void 0 || _this$tableRegistry$g.forEach(table => {\n if (table.changes) {\n log.debug(\"Pausing event listeners on '\".concat(dbName, \"' table\"), table);\n table.changes.cancel();\n pausedTables.push(table);\n }\n });\n return () => {\n pausedTables.forEach(table => {\n var _this$tableRegistry$g2, _this$tableRegistry$g3;\n // Resume listening for changes if the table is still in the registry\n if ((_this$tableRegistry$g2 = (_this$tableRegistry$g3 = this.tableRegistry.get(dbName)) === null || _this$tableRegistry$g3 === void 0 ? void 0 : _this$tableRegistry$g3.has(table)) !== null && _this$tableRegistry$g2 !== void 0 ? _this$tableRegistry$g2 : false) {\n log.debug(\"Resuming event listeners on '\".concat(dbName, \"' table\"), table);\n table.listenForChanges();\n }\n });\n };\n }\n}\nexport default PouchCommandHistoryCache;\n//# sourceMappingURL=PouchCommandHistoryCache.js.map","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; }\nfunction _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; }\nfunction asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }\nfunction _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"next\", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"throw\", n); } _next(void 0); }); }; }\nfunction _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; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\nfunction _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); }\n/* eslint-disable class-methods-use-this */\nimport Log from '@deephaven/log';\nimport PouchCommandHistoryTable from \"./PouchCommandHistoryTable.js\";\nimport PouchCommandHistoryCache from \"./PouchCommandHistoryCache.js\";\nvar log = Log.module('PouchCommandHistoryStorage');\nexport class PouchCommandHistoryStorage {\n constructor() {\n _defineProperty(this, \"cache\", new PouchCommandHistoryCache());\n _defineProperty(this, \"updateTableMap\", new Map());\n }\n getUpdateTable(language) {\n if (!this.updateTableMap.has(language)) {\n this.updateTableMap.set(language, new PouchCommandHistoryTable(language, this.cache));\n }\n return this.updateTableMap.get(language);\n }\n getTable(language) {\n var _this = this;\n return _asyncToGenerator(function* () {\n return new PouchCommandHistoryTable(language, _this.cache);\n })();\n }\n addItem(language, scope, command, data) {\n var _this2 = this;\n return _asyncToGenerator(function* () {\n return _this2.updateItem(language, {\n id: \"\".concat(new Date().getTime()),\n name: command,\n data\n });\n })();\n }\n updateItem(language, item) {\n var _this3 = this;\n return _asyncToGenerator(function* () {\n var updateTable = _this3.getUpdateTable(language);\n var dbItem = yield updateTable.refreshItem(item.id);\n var updatedItem = _objectSpread(_objectSpread({}, dbItem !== null && dbItem !== void 0 ? dbItem : {}), item);\n log.debug('Updating item', updatedItem);\n yield updateTable.put(updatedItem);\n log.debug('Update saved');\n return item;\n })();\n }\n listenItem(language, id, listener) {\n var updateTable = this.getUpdateTable(language);\n return updateTable.onItemUpdate(id, listener);\n }\n}\nexport default PouchCommandHistoryStorage;\n//# sourceMappingURL=PouchCommandHistoryStorage.js.map","// eslint-disable-next-line import/prefer-default-export\nexport const SET_LAYOUT_STORAGE = 'SET_LAYOUT_STORAGE';\n","import type { LayoutStorage } from '@deephaven/app-utils';\nimport { SET_LAYOUT_STORAGE } from './actionTypes';\n\n// eslint-disable-next-line import/prefer-default-export\nexport const setLayoutStorage = (\n layoutStorage: LayoutStorage\n): { type: string; payload: LayoutStorage } => ({\n type: SET_LAYOUT_STORAGE,\n payload: layoutStorage,\n});\n","// The Deephaven API script isn't packaged as a module (yet), and is just included in index.html, exported to the global namespace\n// This include file is simply a wrapper so that it behaves like a module, and can be mocked easily for unit tests\n\nvar {\n dh\n} = globalThis;\nexport default dh;\n//# sourceMappingURL=dh.js.map","import { DbNameValidator } from '@deephaven/utils';\nimport {\n DateTimeColumnFormatter,\n IntegerColumnFormatter,\n DecimalColumnFormatter,\n type TableColumnFormat,\n type FormattingRule,\n} from '@deephaven/jsapi-utils';\nimport type { dh as DhType } from '@deephaven/jsapi-types';\nimport Log from '@deephaven/log';\nimport type { ServerConfigValues } from '@deephaven/redux';\nimport Bowser from 'bowser';\nimport { type PluginModuleMap } from '@deephaven/plugin';\n\nconst log = Log.module('SettingsUtils');\n\nexport type FormatOption = {\n defaultFormatString?: string;\n};\n\nexport type ValidFormatterItem = FormattingRule & {\n id?: number;\n isNewRule?: boolean;\n};\n\nexport type FormatterItem = Omit<ValidFormatterItem, 'format'> & {\n format: Partial<TableColumnFormat>;\n};\n\nfunction isFormatStringFormat(\n format: Partial<TableColumnFormat>\n): format is Pick<TableColumnFormat, 'formatString'> {\n return (\n (format as Pick<TableColumnFormat, 'formatString'>).formatString != null\n );\n}\n\n/**\n * Get an object containing all version information formatted for display\n * @param serverConfigValues The server config values\n * @returns The formatted version info or \"Unknown\" for any value not available\n */\nexport function getFormattedVersionInfo(\n serverConfigValues: ServerConfigValues\n): Record<string, string> {\n const ua = Bowser.parse(window.navigator.userAgent);\n const browser = `${ua.browser.name ?? ''} ${\n // use only the major version and minor version, rest is usually empty 120.1.0.0 -> 120.1\n Number(parseFloat(ua.browser.version ?? '')) || ''\n }`;\n const os = `${ua.os.name ?? ''} ${ua.os.version ?? ''}`;\n const pythonVersion = serverConfigValues.get('python.version') ?? '';\n return {\n 'Engine Version': serverConfigValues.get('deephaven.version') ?? 'Unknown',\n 'Web UI Version': import.meta.env.npm_package_version ?? 'Unknown',\n // Python version is only available in python sessions\n ...(pythonVersion !== '' ? { 'Python Version': pythonVersion } : {}),\n 'Java Version': serverConfigValues.get('java.version') ?? 'Unknown',\n 'Groovy Version': serverConfigValues.get('groovy.version') ?? 'Unknown',\n 'Barrage Version': serverConfigValues.get('barrage.version') ?? 'Unknown',\n 'Browser Name': browser.trim() || 'Unknown',\n 'User Agent OS': os.trim() || 'Unknown',\n };\n}\n\n/**\n * Get an object containing all JS plugin information formatted for display\n * @param serverConfigValues The information for all plugins\n * @returns The formatted mapping from plugin name to version\n */\nexport function getFormattedPluginInfo(\n pluginDataValues: PluginModuleMap\n): Record<string, string> {\n return Array.from(pluginDataValues.entries())\n .filter(plugin => plugin[1].version !== undefined)\n .reduce((acc, [key, value]) => ({ ...acc, [key]: value.version }), {});\n}\n\nexport function focusFirstInputInContainer(\n container: HTMLElement | null\n): void {\n const input: HTMLElement | null | undefined = container?.querySelector(\n 'input, select, textarea'\n );\n if (input) {\n input.focus();\n }\n}\n\nexport function isSameOptions(\n options1: FormatOption,\n options2: FormatOption\n): boolean {\n return options1.defaultFormatString === options2.defaultFormatString;\n}\n\nexport function isSameDecimalOptions(\n options1: FormatOption,\n options2: FormatOption\n): boolean {\n return isSameOptions(options1, options2);\n}\n\nexport function isSameIntegerOptions(\n options1: FormatOption,\n options2: FormatOption\n): boolean {\n return isSameOptions(options1, options2);\n}\n\nexport function isValidColumnName(name: string): boolean {\n return name !== '' && DbNameValidator.isValidColumnName(name);\n}\n\nexport function isValidFormat(\n dh: typeof DhType,\n columnType: string,\n format: Partial<TableColumnFormat>\n): boolean {\n // Undefined or empty string formats are always invalid\n if (\n !columnType ||\n format.formatString == null ||\n !isFormatStringFormat(format)\n ) {\n return false;\n }\n switch (columnType) {\n case 'datetime':\n return DateTimeColumnFormatter.isValid(dh, format);\n case 'decimal':\n return DecimalColumnFormatter.isValid(dh, format);\n case 'int':\n return IntegerColumnFormatter.isValid(dh, format);\n default: {\n log.warn('Trying to validate format of unknown type');\n return true;\n }\n }\n}\n\nexport function removeFormatRuleExtraProps(\n item: ValidFormatterItem\n): FormattingRule {\n const { id, isNewRule, ...rest } = item;\n return rest;\n}\n\nexport function isFormatRuleValidForSave(\n dh: typeof DhType,\n rule: FormatterItem\n): rule is ValidFormatterItem {\n return (\n isValidColumnName(rule.columnName) &&\n isValidFormat(dh, rule.columnType, rule.format)\n );\n}\n\nexport default {\n focusFirstInputInContainer,\n isSameOptions,\n isSameDecimalOptions,\n isSameIntegerOptions,\n isValidColumnName,\n isValidFormat,\n removeFormatRuleExtraProps,\n isFormatRuleValidForSave,\n};\n","import React, { type ReactElement, useMemo } from 'react';\nimport {\n Formatter,\n DateTimeColumnFormatter,\n TableUtils,\n} from '@deephaven/jsapi-utils';\nimport { useApi } from '@deephaven/jsapi-bootstrap';\n\ninterface DateTimeOptionProps {\n timestamp: Date;\n timeZone: string;\n showTimeZone: boolean;\n showTSeparator: boolean;\n isGlobalOptions: boolean;\n legacyGlobalFormat?: string;\n}\n\nexport default function DateTimeOptions(\n props: DateTimeOptionProps\n): ReactElement {\n const {\n timestamp,\n timeZone,\n showTimeZone,\n showTSeparator,\n isGlobalOptions,\n legacyGlobalFormat,\n } = props;\n\n const dh = useApi();\n\n const formatter = useMemo(\n () =>\n new Formatter(dh, [], {\n timeZone,\n showTimeZone,\n showTSeparator,\n }),\n [dh, showTimeZone, showTSeparator, timeZone]\n );\n const formats = isGlobalOptions\n ? DateTimeColumnFormatter.getGlobalFormats(showTimeZone, showTSeparator)\n : DateTimeColumnFormatter.getFormats(showTimeZone, showTSeparator);\n\n if (legacyGlobalFormat != null && !formats.includes(legacyGlobalFormat)) {\n formats.unshift(legacyGlobalFormat);\n }\n\n return (\n <>\n {formats.map(formatString => {\n const format = DateTimeColumnFormatter.makeFormat(\n '',\n formatString,\n DateTimeColumnFormatter.TYPE_GLOBAL\n );\n return (\n <option\n value={formatString}\n key={formatString}\n data-testid=\"time-format\"\n >\n {formatter.getFormattedString(\n timestamp,\n TableUtils.dataType.DATETIME,\n '',\n format\n )}\n </option>\n );\n })}\n </>\n );\n}\n","import React from 'react';\nimport { TimeUtils } from '@deephaven/utils';\n\nexport default function TimeZoneOptions(): JSX.Element {\n return (\n <>\n {TimeUtils.TIME_ZONES.map(timeZone => {\n const { label, value } = timeZone;\n return (\n <option value={value} key={value}>\n {label}\n </option>\n );\n })}\n </>\n );\n}\n","import React, {\n type ChangeEvent,\n PureComponent,\n type ReactElement,\n type RefObject,\n} from 'react';\nimport { connect } from 'react-redux';\nimport { vsRefresh } from '@deephaven/icons';\nimport memoize from 'memoizee';\nimport debounce from 'lodash.debounce';\nimport classNames from 'classnames';\nimport { Button, Checkbox, Select } from '@deephaven/components';\nimport {\n IntegerColumnFormatter,\n DecimalColumnFormatter,\n TableUtils,\n} from '@deephaven/jsapi-utils';\nimport type { dh as DhType } from '@deephaven/jsapi-types';\nimport Log from '@deephaven/log';\nimport {\n getApi,\n getDefaultDateTimeFormat,\n getDefaultDecimalFormatOptions,\n getDefaultIntegerFormatOptions,\n getTimeZone,\n getShowTimeZone,\n getShowTSeparator,\n getTruncateNumbersWithPound,\n getShowEmptyStrings,\n getShowNullStrings,\n getShowExtraGroupColumn,\n updateSettings as updateSettingsAction,\n type RootState,\n type WorkspaceSettings,\n getDefaultSettings,\n} from '@deephaven/redux';\nimport './FormattingSectionContent.scss';\nimport type { DebouncedFunc } from 'lodash';\nimport {\n focusFirstInputInContainer,\n isSameDecimalOptions,\n isSameIntegerOptions,\n isValidFormat,\n} from './SettingsUtils';\nimport type { FormatOption } from './SettingsUtils';\nimport DateTimeOptions from './DateTimeOptions';\nimport TimeZoneOptions from './TimeZoneOptions';\n\nconst log = Log.module('FormattingSectionContent');\n\ninterface FormattingSectionContentProps {\n dh: typeof DhType;\n defaultDateTimeFormat: string;\n showTimeZone: boolean;\n showTSeparator: boolean;\n timeZone: string;\n truncateNumbersWithPound: boolean;\n showEmptyStrings: boolean;\n showNullStrings: boolean;\n showExtraGroupColumn: boolean;\n updateSettings: (settings: Partial<WorkspaceSettings>) => void;\n defaultDecimalFormatOptions: FormatOption;\n defaultIntegerFormatOptions: FormatOption;\n defaults: WorkspaceSettings;\n}\n\ninterface FormattingSectionContentState {\n showTimeZone: boolean;\n showTSeparator: boolean;\n timeZone: string;\n defaultDateTimeFormat: string;\n defaultDecimalFormatOptions: FormatOption;\n defaultIntegerFormatOptions: FormatOption;\n truncateNumbersWithPound: boolean;\n showEmptyStrings: boolean;\n showNullStrings: boolean;\n showExtraGroupColumn: boolean;\n timestampAtMenuOpen: Date;\n}\n\nexport class FormattingSectionContent extends PureComponent<\n FormattingSectionContentProps,\n FormattingSectionContentState\n> {\n static defaultProps = {\n scrollTo: (): void => undefined,\n };\n\n static inputDebounceTime = 250;\n\n constructor(props: FormattingSectionContentProps) {\n super(props);\n\n this.debouncedCommitChanges = debounce(\n this.commitChanges.bind(this),\n FormattingSectionContent.inputDebounceTime\n );\n this.queueUpdate = this.queueUpdate.bind(this);\n this.handleDefaultDateTimeFormatChange =\n this.handleDefaultDateTimeFormatChange.bind(this);\n this.handleDefaultDecimalFormatChange =\n this.handleDefaultDecimalFormatChange.bind(this);\n this.handleDefaultIntegerFormatChange =\n this.handleDefaultIntegerFormatChange.bind(this);\n this.handleShowTimeZoneChange = this.handleShowTimeZoneChange.bind(this);\n this.handleShowTSeparatorChange =\n this.handleShowTSeparatorChange.bind(this);\n this.handleTimeZoneChange = this.handleTimeZoneChange.bind(this);\n this.handleResetDateTimeFormat = this.handleResetDateTimeFormat.bind(this);\n this.handleResetDecimalFormat = this.handleResetDecimalFormat.bind(this);\n this.handleResetIntegerFormat = this.handleResetIntegerFormat.bind(this);\n this.handleResetTimeZone = this.handleResetTimeZone.bind(this);\n this.handleTruncateNumbersWithPoundChange =\n this.handleTruncateNumbersWithPoundChange.bind(this);\n this.handleShowEmptyStringsChange =\n this.handleShowEmptyStringsChange.bind(this);\n this.handleShowNullStringsChange =\n this.handleShowNullStringsChange.bind(this);\n this.handleShowExtraGroupColumnChange =\n this.handleShowExtraGroupColumnChange.bind(this);\n\n const {\n defaultDateTimeFormat,\n defaultDecimalFormatOptions,\n defaultIntegerFormatOptions,\n showTimeZone,\n showTSeparator,\n timeZone,\n truncateNumbersWithPound,\n showEmptyStrings,\n showNullStrings,\n showExtraGroupColumn,\n } = props;\n\n this.containerRef = React.createRef();\n this.pendingUpdates = [];\n\n this.state = {\n showTimeZone,\n showTSeparator,\n timeZone,\n defaultDateTimeFormat,\n defaultDecimalFormatOptions,\n defaultIntegerFormatOptions,\n truncateNumbersWithPound,\n showEmptyStrings,\n showNullStrings,\n showExtraGroupColumn,\n timestampAtMenuOpen: new Date(),\n };\n }\n\n componentDidMount(): void {\n focusFirstInputInContainer(this.containerRef.current);\n }\n\n componentWillUnmount(): void {\n this.debouncedCommitChanges.flush();\n }\n\n debouncedCommitChanges: DebouncedFunc<() => void>;\n\n pendingUpdates: Partial<WorkspaceSettings>[];\n\n containerRef: RefObject<HTMLDivElement>;\n\n getCachedDateTimeFormatOptions = memoize(\n (\n timeZone: string,\n showTimeZone: boolean,\n showTSeparator: boolean,\n isGlobalOptions = false,\n legacyGlobalFormat?: string\n ) => {\n const { timestampAtMenuOpen } = this.state;\n return (\n <DateTimeOptions\n timestamp={timestampAtMenuOpen}\n timeZone={timeZone}\n showTimeZone={showTimeZone}\n showTSeparator={showTSeparator}\n isGlobalOptions={isGlobalOptions}\n legacyGlobalFormat={legacyGlobalFormat}\n />\n );\n },\n { max: 100 }\n );\n\n queueUpdate(updates: Partial<WorkspaceSettings>): void {\n this.pendingUpdates.push(updates);\n this.debouncedCommitChanges();\n }\n\n handleDefaultDateTimeFormatChange(value: string): void {\n log.debug('handleDefaultDateTimeFormatChange', value);\n const update = {\n defaultDateTimeFormat: value,\n };\n this.setState(update);\n this.queueUpdate(update);\n }\n\n handleDefaultDecimalFormatChange(event: ChangeEvent<HTMLInputElement>): void {\n log.debug('handleDefaultDecimalFormatChange', event.target.value);\n const update = {\n defaultDecimalFormatOptions: {\n defaultFormatString: event.target.value,\n },\n };\n this.setState(update);\n if (\n isValidFormat(\n dh,\n TableUtils.dataType.DECIMAL,\n DecimalColumnFormatter.makeCustomFormat(event.target.value)\n )\n ) {\n this.queueUpdate(update);\n }\n }\n\n handleDefaultIntegerFormatChange(event: ChangeEvent<HTMLInputElement>): void {\n log.debug('handleDefaultIntegerFormatChange', event.target.value);\n const update = {\n defaultIntegerFormatOptions: {\n defaultFormatString: event.target.value,\n },\n };\n this.setState(update);\n if (\n isValidFormat(\n dh,\n TableUtils.dataType.INT,\n IntegerColumnFormatter.makeCustomFormat(event.target.value)\n )\n ) {\n this.queueUpdate(update);\n }\n }\n\n handleShowTimeZoneChange(): void {\n const { showTimeZone } = this.state;\n const update = { showTimeZone: !showTimeZone };\n this.setState(update);\n this.queueUpdate(update);\n }\n\n handleShowTSeparatorChange(): void {\n const { showTSeparator } = this.state;\n const update = { showTSeparator: !showTSeparator };\n this.setState(update);\n this.queueUpdate(update);\n }\n\n handleTimeZoneChange(value: string): void {\n const update = { timeZone: value };\n this.setState(update);\n this.queueUpdate(update);\n }\n\n handleResetDateTimeFormat(): void {\n const { defaults } = this.props;\n const { defaultDateTimeFormat, showTimeZone, showTSeparator } = defaults;\n log.debug('handleResetDateTimeFormat');\n this.setState({\n defaultDateTimeFormat,\n showTimeZone,\n showTSeparator,\n });\n this.queueUpdate({\n defaultDateTimeFormat: undefined,\n showTimeZone: undefined,\n showTSeparator: undefined,\n });\n }\n\n handleResetTimeZone(): void {\n const { defaults } = this.props;\n const { timeZone } = defaults;\n log.debug('handleResetTimeZone');\n this.setState({\n timeZone,\n });\n this.queueUpdate({\n timeZone: undefined,\n });\n }\n\n handleResetDecimalFormat(): void {\n const { defaults } = this.props;\n const { defaultDecimalFormatOptions } = defaults;\n log.debug('handleResetDecimalFormat');\n this.setState({\n defaultDecimalFormatOptions,\n });\n this.queueUpdate({\n defaultDecimalFormatOptions: undefined,\n });\n }\n\n handleResetIntegerFormat(): void {\n const { defaults } = this.props;\n const { defaultIntegerFormatOptions } = defaults;\n log.debug('handleResetIntegerFormat');\n this.setState({\n defaultIntegerFormatOptions,\n });\n this.queueUpdate({\n defaultIntegerFormatOptions: undefined,\n });\n }\n\n handleTruncateNumbersWithPoundChange(): void {\n const { truncateNumbersWithPound } = this.state;\n const update = {\n truncateNumbersWithPound: truncateNumbersWithPound !== true,\n };\n this.setState(update);\n this.queueUpdate(update);\n }\n\n handleShowEmptyStringsChange(): void {\n const { showEmptyStrings } = this.state;\n const update = {\n showEmptyStrings: !showEmptyStrings,\n };\n this.setState(update);\n this.queueUpdate(update);\n }\n\n handleShowNullStringsChange(): void {\n const { showNullStrings } = this.state;\n const update = {\n showNullStrings: !showNullStrings,\n };\n this.setState(update);\n this.queueUpdate(update);\n }\n\n handleShowExtraGroupColumnChange(): void {\n const { showExtraGroupColumn } = this.state;\n const update = {\n showExtraGroupColumn: !showExtraGroupColumn,\n };\n this.setState(update);\n this.queueUpdate(update);\n }\n\n commitChanges(): void {\n const { updateSettings } = this.props;\n const updates = this.pendingUpdates.reduce(\n (acc, update) => ({\n ...acc,\n ...update,\n }),\n {}\n );\n this.pendingUpdates = [];\n\n updateSettings(updates);\n }\n\n render(): ReactElement {\n const { defaults, dh } = this.props;\n const {\n defaultDateTimeFormat,\n defaultDecimalFormatOptions,\n defaultIntegerFormatOptions,\n timeZone,\n showTimeZone,\n showTSeparator,\n truncateNumbersWithPound,\n showEmptyStrings,\n showNullStrings,\n showExtraGroupColumn,\n } = this.state;\n\n const {\n defaultFormatString:\n defaultDecimalFormatString = DecimalColumnFormatter.DEFAULT_FORMAT_STRING,\n } = defaultDecimalFormatOptions ?? {};\n const {\n defaultFormatString:\n defaultIntegerFormatString = IntegerColumnFormatter.DEFAULT_FORMAT_STRING,\n } = defaultIntegerFormatOptions ?? {};\n\n const isTimeZoneDefault = timeZone === defaults.timeZone;\n const isDateTimeOptionsDefault =\n showTSeparator === defaults.showTSeparator &&\n showTimeZone === defaults.showTimeZone &&\n defaultDateTimeFormat === defaults.defaultDateTimeFormat;\n const isDecimalOptionsDefault = isSameDecimalOptions(\n defaultDecimalFormatOptions,\n defaults.defaultDecimalFormatOptions\n );\n const isIntegerOptionsDefault = isSameIntegerOptions(\n defaultIntegerFormatOptions,\n defaults.defaultIntegerFormatOptions\n );\n\n return (\n <div className=\"app-settings-formatting-section\" ref={this.containerRef}>\n <div className=\"container-fluid p-0\">\n <div className=\"app-settings-menu-description mb-3\">\n Choose the default formatting rule to apply to all table columns\n based on their type.\n </div>\n <div className=\"form-row mb-2\">\n <label\n className=\"col-form-label col-3\"\n htmlFor=\"select-reset-timezone\"\n >\n Time zone\n </label>\n <div className=\"col pr-0\">\n <Select\n className=\"custom-select\"\n value={timeZone}\n onChange={this.handleTimeZoneChange}\n id=\"select-reset-timezone\"\n >\n <TimeZoneOptions />\n </Select>\n </div>\n <div className=\"col-1 btn-col\">\n <Button\n kind=\"ghost\"\n icon={vsRefresh}\n onClick={this.handleResetTimeZone}\n tooltip=\"Reset Time Zone\"\n className={classNames('btn-reset', 'btn-reset-time-zone', {\n hidden: isTimeZoneDefault,\n })}\n />\n </div>\n </div>\n <div className=\"form-row mb-2\">\n <label\n className=\"col-form-label col-3\"\n htmlFor=\"select-default-time-format\"\n >\n DateTime\n </label>\n <div className=\"col pr-0\">\n <Select\n className=\"custom-select\"\n value={defaultDateTimeFormat}\n onChange={this.handleDefaultDateTimeFormatChange}\n id=\"select-default-time-format\"\n >\n {this.getCachedDateTimeFormatOptions(\n timeZone,\n showTimeZone,\n showTSeparator,\n true,\n defaultDateTimeFormat\n )}\n </Select>\n </div>\n <div className=\"col-1 btn-col\">\n <Button\n kind=\"ghost\"\n icon={vsRefresh}\n onClick={this.handleResetDateTimeFormat}\n tooltip=\"Reset DateTime Options\"\n className={classNames('btn-reset', 'btn-reset-date-time', {\n hidden: isDateTimeOptionsDefault,\n })}\n />\n </div>\n </div>\n <div className=\"form-row\">\n <div className=\"offset-3 col-9\">\n <Checkbox\n checked={showTimeZone ?? null}\n onChange={this.handleShowTimeZoneChange}\n >\n Show time zone in dates\n </Checkbox>\n </div>\n </div>\n\n <div className=\"form-row mb-3\">\n <div className=\"offset-3 col-9\">\n <Checkbox\n checked={showTSeparator ?? null}\n onChange={this.handleShowTSeparatorChange}\n >\n Show 'T' separator\n </Checkbox>\n </div>\n </div>\n <div className=\"form-row mb-2\">\n <label\n className=\"col-form-label col-3\"\n htmlFor=\"default-decimal-format-input\"\n >\n Decimal\n </label>\n <div className=\"col pr-0\">\n <input\n className={classNames(\n 'form-control',\n 'flex-grow-1',\n 'default-decimal-format-input',\n {\n 'is-invalid': !isValidFormat(\n dh,\n TableUtils.dataType.DECIMAL,\n DecimalColumnFormatter.makeCustomFormat(\n defaultDecimalFormatString\n )\n ),\n }\n )}\n data-lpignore\n placeholder={DecimalColumnFormatter.DEFAULT_FORMAT_STRING}\n type=\"text\"\n id=\"default-decimal-format-input\"\n value={defaultDecimalFormatString}\n onChange={this.handleDefaultDecimalFormatChange}\n />\n </div>\n <div className=\"col-1 btn-col\">\n <Button\n kind=\"ghost\"\n icon={vsRefresh}\n onClick={this.handleResetDecimalFormat}\n tooltip=\"Reset Decimal Formatting\"\n className={classNames('btn-reset', 'btn-reset-decimal', {\n hidden: isDecimalOptionsDefault,\n })}\n data-testid=\"btn-reset-decimal\"\n />\n </div>\n </div>\n <div className=\"form-row mb-2\">\n <label\n className=\"col-form-label col-3\"\n htmlFor=\"default-integer-format-input\"\n >\n Integer\n </label>\n <div className=\"col pr-0\">\n <input\n className={classNames(\n 'form-control',\n 'flex-grow-1',\n 'default-integer-format-input',\n {\n 'is-invalid': !isValidFormat(\n dh,\n TableUtils.dataType.INT,\n IntegerColumnFormatter.makeCustomFormat(\n defaultIntegerFormatString\n )\n ),\n }\n )}\n data-lpignore\n placeholder={IntegerColumnFormatter.DEFAULT_FORMAT_STRING}\n type=\"text\"\n id=\"default-integer-format-input\"\n value={defaultIntegerFormatString}\n onChange={this.handleDefaultIntegerFormatChange}\n />\n </div>\n <div className=\"col-1 btn-col\">\n <Button\n kind=\"ghost\"\n icon={vsRefresh}\n onClick={this.handleResetIntegerFormat}\n tooltip=\"Reset Integer Formatting\"\n className={classNames('btn-reset', 'btn-reset-integer', {\n hidden: isIntegerOptionsDefault,\n })}\n data-testid=\"btn-reset-integer\"\n />\n </div>\n </div>\n <div className=\"form-row mb-2\">\n <div className=\"offset-3 col-9\">\n <Checkbox\n checked={truncateNumbersWithPound ?? null}\n onChange={this.handleTruncateNumbersWithPoundChange}\n >\n Show truncated numbers as ###\n </Checkbox>\n </div>\n </div>\n\n <div className=\"form-row mb-3\">\n <label\n className=\"col-form-label col-3\"\n htmlFor=\"default-integer-format-input\"\n >\n String\n </label>\n <div className=\"col pr-0 pt-2\">\n <Checkbox\n checked={showEmptyStrings ?? null}\n onChange={this.handleShowEmptyStringsChange}\n >\n Show empty strings as{' '}\n <span className=\"font-italic text-muted\">empty</span>\n </Checkbox>\n <Checkbox\n checked={showNullStrings ?? null}\n onChange={this.handleShowNullStringsChange}\n >\n Show null strings as{' '}\n <span className=\"font-italic text-muted\">null</span>\n </Checkbox>\n </div>\n </div>\n\n <div className=\"form-row mb-3\" id=\"show_extra_group_column_div\">\n <label\n className=\"col-form-label col-3\"\n htmlFor=\"default-show-extra-group-column\"\n >\n Rollup\n </label>\n <div className=\"col pr-0 pt-2\" id=\"default-show-extra-group-column\">\n <Checkbox\n checked={showExtraGroupColumn}\n onChange={this.handleShowExtraGroupColumnChange}\n >\n Show extra "group" column\n </Checkbox>\n </div>\n </div>\n </div>\n </div>\n );\n }\n}\n\nconst mapStateToProps = (\n state: RootState\n): Omit<FormattingSectionContentProps, 'updateSettings'> => ({\n defaultDateTimeFormat: getDefaultDateTimeFormat(state),\n defaultDecimalFormatOptions: getDefaultDecimalFormatOptions(state),\n defaultIntegerFormatOptions: getDefaultIntegerFormatOptions(state),\n dh: getApi(state),\n showTimeZone: getShowTimeZone(state),\n showTSeparator: getShowTSeparator(state),\n truncateNumbersWithPound: getTruncateNumbersWithPound(state),\n showEmptyStrings: getShowEmptyStrings(state),\n showNullStrings: getShowNullStrings(state),\n showExtraGroupColumn: getShowExtraGroupColumn(state),\n timeZone: getTimeZone(state),\n defaults: getDefaultSettings(state),\n});\n\nconst ConnectedFormattingSectionContent = connect(mapStateToProps, {\n updateSettings: updateSettingsAction,\n})(FormattingSectionContent);\n\nexport default ConnectedFormattingSectionContent;\n","import React, { type ReactElement, useState } from 'react';\nimport { Button, Modal, ModalBody, ModalHeader } from '@deephaven/components';\nimport { vsLaw } from '@deephaven/icons';\n\nfunction LegalNotice(): ReactElement {\n const [modal, setModal] = useState(false);\n const toggle = (): void => {\n setModal(!modal);\n };\n\n return (\n <>\n <Button kind=\"ghost\" onClick={toggle} icon={vsLaw}>\n Legal Notices\n </Button>\n <Modal isOpen={modal} toggle={toggle}>\n <ModalHeader toggle={toggle}>Legal Notice</ModalHeader>\n <ModalBody>\n <p>\n Deephaven software is protected by U.S. Patent Nos. 9,612,959;\n 9,613,018; 9,613,109; 9,619,210; 9,633,060; 9,639,570; 9,672,238;\n 9,679,006; 9,690,821; 9,710,511; 9,760,591; 9,805,084; 9,836,494;\n 9,836,495; 9,886,469; 9,898,496; 9,934,266; 10,002,153; 10,002,154;\n 10,002,155; 10,003,673; 10,019,138; 10,069,943; 10,176,211;\n 10,198,465; 10,198,466; 10,198,469; 10,212,257; 10,241,960;\n 10,241,965; 10,242,040; 10,242,041; 10,346,394; 10,353,893;\n 10,452,649; 10,496,639; 10,540,351; 10,552,412; 10,565,194;\n 10,565,206; 10,572,474; 10,621,168; 10,642,829; 10,657,184;\n 10,678,787; 10,691,686; 10,783,191; 10,866,943; 10,909,183;\n 10,915,526; 10,922,311; 10,929,394; 11,023,462; 11,126,662;\n 11,151,133; 11,238,036; 11,249,994; 11,263,211; 11,449,557;\n 11,514,037; 11,556,528; and 11,574,018. Other patents pending.\n </p>\n <p>\n © 2016-{new Date().getFullYear()} Deephaven Data Labs LLC. Patent\n Pending.\n </p>\n </ModalBody>\n </Modal>\n </>\n );\n}\n\nexport default LegalNotice;\n","import React, { type ReactElement } from 'react';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { Button, Collapse } from '@deephaven/components';\nimport { vsTriangleDown } from '@deephaven/icons';\n\ntype SettingsMenuSectionProps = React.PropsWithChildren<{\n isExpanded: boolean;\n sectionKey: string;\n title: ReactElement;\n onToggle: (sectionkey: string) => void;\n}>;\n\nfunction SettingsMenuSection(props: SettingsMenuSectionProps): ReactElement {\n const { children, isExpanded, sectionKey, title, onToggle } = props;\n return (\n <>\n <div>\n <Button\n kind=\"ghost\"\n className=\"btn-collapse-trigger\"\n onClick={() => onToggle(sectionKey)}\n >\n <div className=\"d-flex align-items-center flex-grow-1\">{title}</div>\n <div className=\"flex-shrink-0\">\n <FontAwesomeIcon\n transform={isExpanded ? 'flip-v' : ''}\n icon={vsTriangleDown}\n />\n </div>\n </Button>\n </div>\n <Collapse in={isExpanded} autoFocusOnShow>\n {children}\n </Collapse>\n </>\n );\n}\n\nexport default SettingsMenuSection;\n","import React, { useState, useEffect } from 'react';\nimport classNames from 'classnames';\nimport {\n Shortcut,\n Tooltip,\n ShortcutRegistry,\n ContextActionUtils,\n Button,\n KEY,\n} from '@deephaven/components';\nimport type { KeyState } from '@deephaven/components';\nimport { vsRefresh } from '@deephaven/icons';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport './ShortcutItem.scss';\n\ntype ShortcutItemProps = {\n shortcut: Shortcut;\n displayText: string;\n categoryName: string;\n onChange: (shortcut: Shortcut) => void;\n};\n\nexport default function ShortcutItem({\n shortcut,\n displayText: propsDisplayText,\n categoryName,\n onChange,\n}: ShortcutItemProps): JSX.Element {\n const [displayText, setDisplayText] = useState(propsDisplayText);\n const [keyState, setKeyState] = useState<KeyState>(shortcut.getKeyState());\n const [isPending, setIsPending] = useState(false);\n const [error, setError] = useState('');\n\n // If propsDisplayText changes, the shortcut was altered from a conflict state by the parent component\n useEffect(\n function resolveConflictOnPropChange() {\n setDisplayText(propsDisplayText);\n setKeyState(shortcut.getKeyState());\n },\n [propsDisplayText, shortcut]\n );\n\n // Updates displayText when keyState is changed\n useEffect(\n function onNewKeybind() {\n setDisplayText(Shortcut.getDisplayText(keyState));\n if (shortcut.matchesKeyState(keyState)) {\n setIsPending(false);\n }\n },\n [keyState, shortcut]\n );\n\n // Sets error state based on isPending\n useEffect(\n function setErrors() {\n if (isPending) {\n if (!Shortcut.isValidKeyState(keyState)) {\n if (Shortcut.isAllowedKey(keyState.keyValue)) {\n setError('Must contain a modifier key');\n } else {\n setError('Must contain an allowed action key');\n }\n return;\n }\n\n const conflictNames = ShortcutRegistry.getConflictingShortcuts(keyState)\n .filter(\n conflict =>\n conflict.id.startsWith(categoryName) && conflict !== shortcut\n )\n .map(conflict => conflict.name);\n\n if (conflictNames.length) {\n setError(`Conflicts with ${conflictNames.join(', ')}`);\n return;\n }\n\n setError('');\n } else {\n setError('');\n }\n },\n [isPending, keyState, categoryName, shortcut]\n );\n\n // Updates pending key state and sets input display text\n function handleInputKeyDown(e: React.KeyboardEvent<HTMLInputElement>): void {\n e.stopPropagation();\n e.preventDefault();\n\n if (shortcut.isEditable && !e.repeat) {\n const newKeyState = Shortcut.getKeyStateFromEvent(e);\n const backspaceKeyState = Shortcut.createKeyState([KEY.BACKSPACE]);\n\n // Backspace clears the shortcut\n if (Shortcut.doKeyStatesMatch(newKeyState, backspaceKeyState)) {\n setKeyState(Shortcut.NULL_KEY_STATE);\n } else {\n setKeyState(newKeyState);\n }\n }\n }\n\n // Set this shortcut to changing state, check key state validity and set errors\n function handleInputKeyUp(e: React.KeyboardEvent<HTMLInputElement>): void {\n e.stopPropagation();\n e.preventDefault();\n\n if (!shortcut.matchesKeyState(keyState)) {\n setIsPending(true);\n }\n }\n\n function handleInputFocus(): void {\n ContextActionUtils.disableAllActions();\n }\n\n function handleInputBlur(): void {\n ContextActionUtils.enableAllActions();\n }\n\n function handleConfirm(): void {\n shortcut.setKeyState(keyState);\n setIsPending(false);\n onChange(shortcut);\n }\n\n function handleUndo(): void {\n const originalKeyState = shortcut.getKeyState();\n setKeyState(originalKeyState);\n setIsPending(false);\n }\n\n function handleResetToDefaultClick(): void {\n setIsPending(true);\n setKeyState(shortcut.getDefaultKeyState());\n }\n\n return (\n <>\n <div className=\"shortcut-item-container\">\n <label className=\"shortcut-item-name\">\n {shortcut.name}\n {shortcut.tooltip !== undefined && (\n <Tooltip>{shortcut.tooltip}</Tooltip>\n )}\n </label>\n <div className=\"shortcut-item-input-container\">\n <input\n className={classNames('form-control', {\n 'is-invalid': error,\n })}\n onKeyDown={handleInputKeyDown}\n onKeyUp={handleInputKeyUp}\n onFocus={handleInputFocus}\n onBlur={handleInputBlur}\n disabled={!shortcut.isEditable}\n value={displayText}\n readOnly\n />\n {!Shortcut.doKeyStatesMatch(\n keyState,\n shortcut.getDefaultKeyState()\n ) &&\n !error && (\n <Button\n className=\"reset-to-default-button\"\n kind=\"ghost\"\n icon={\n <FontAwesomeIcon\n icon={vsRefresh}\n transform={{ rotate: 90, flipX: true }}\n />\n }\n tooltip=\"Reset to default\"\n onClick={handleResetToDefaultClick}\n />\n )}\n </div>\n </div>\n {isPending && (\n <div\n className={classNames('shortcut-item-message-container', {\n 'is-invalid': error,\n })}\n >\n <div className=\"shortcut-item-message\">{error}</div>\n <div className=\"shortcut-item-message-buttons\">\n {Shortcut.isValidKeyState(keyState) && (\n <Button kind=\"ghost\" onClick={handleConfirm}>\n Confirm\n </Button>\n )}\n <Button kind=\"ghost\" onClick={handleUndo}>\n Undo\n </Button>\n </div>\n </div>\n )}\n </>\n );\n}\n","import React, { useState, useMemo, useCallback } from 'react';\nimport { connect } from 'react-redux';\nimport { Shortcut, ShortcutRegistry } from '@deephaven/components';\nimport {\n getShortcutOverrides,\n type RootState,\n updateSettings as updateSettingsAction,\n type WorkspaceSettings,\n} from '@deephaven/redux';\nimport ShortcutItem from './ShortcutItem';\n\ntype ShortcutSectionContentProps = {\n shortcutOverrides: WorkspaceSettings['shortcutOverrides'];\n updateSettings: typeof updateSettingsAction;\n};\n\nfunction ShortcutSectionContent({\n shortcutOverrides = {},\n updateSettings,\n}: ShortcutSectionContentProps): JSX.Element {\n const saveShortcutOverrides = useCallback(\n (modifiedShortcuts: Shortcut[]) => {\n const isMac = Shortcut.isMacPlatform;\n\n // This ensures mac and windows objects both exist\n const newOverrides: Required<typeof shortcutOverrides> = {\n mac: { ...shortcutOverrides.mac },\n windows: { ...shortcutOverrides.windows },\n };\n const platformOverrides = isMac ? newOverrides.mac : newOverrides.windows;\n\n modifiedShortcuts.forEach(shortcut => {\n if (shortcut.isDefault()) {\n // No need to save overrides that are the default value\n delete platformOverrides[shortcut.id];\n } else {\n platformOverrides[shortcut.id] = shortcut.getKeyState();\n }\n });\n\n updateSettings({\n shortcutOverrides: newOverrides,\n });\n },\n [updateSettings, shortcutOverrides]\n );\n\n let categories = Array.from(\n ShortcutRegistry.shortcutsByCategory.entries()\n ).map(([name, shortcuts]) => ({\n name,\n shortcuts,\n }));\n\n // Move global category to the end\n const globalCategoryIndex = categories.findIndex(\n category => category.name.toUpperCase() === 'GLOBAL'\n );\n const globalCategory = categories.splice(globalCategoryIndex, 1);\n categories = categories.concat(globalCategory);\n\n return (\n <>\n <div className=\"app-settings-menu-description\">\n Customize shortcuts below. To prevent unexpected results, avoid\n conflicting shortcuts with the browser or IDE editor.\n </div>\n {categories.map(category => (\n <ShortcutCategory\n key={category.name}\n name={category.name}\n shortcuts={category.shortcuts}\n saveShortcutOverrides={saveShortcutOverrides}\n />\n ))}\n </>\n );\n}\n\ntype ShortcutCategoryProps = {\n name: string;\n shortcuts: Shortcut[];\n saveShortcutOverrides: (shortcuts: Shortcut[]) => void;\n};\n\nfunction ShortcutCategory({\n name,\n shortcuts: propsShortcuts,\n saveShortcutOverrides,\n}: ShortcutCategoryProps): JSX.Element {\n function formatCategoryName(categoryName: string): string {\n return categoryName\n .split('_')\n .map(word => `${word[0].toUpperCase()}${word.slice(1).toLowerCase()}`)\n .join(' ');\n }\n\n // Used to trigger a re-render when a shortcut is changed\n // Since shortcuts are singletons, React doesn't detect changes for a re-render as easily\n const [shortcuts, setShortcuts] = useState(propsShortcuts);\n\n function handleShortcutChange(shortcut: Shortcut): void {\n const conflictingShortcuts = shortcuts.filter(\n s =>\n s !== shortcut &&\n !s.isNull() &&\n s.matchesKeyState(shortcut.getKeyState())\n );\n\n // Set conflicting shortcuts to null\n conflictingShortcuts.forEach(conflict => conflict.setToNull());\n\n const modifiedShoftcuts = [shortcut, ...conflictingShortcuts];\n\n saveShortcutOverrides(modifiedShoftcuts);\n setShortcuts(s => [...s]);\n }\n\n const displayTexts = useMemo(\n () => shortcuts.map(s => s.getDisplayText()),\n [shortcuts]\n );\n\n return (\n <div className=\"mt-3\">\n <div className=\"font-weight-bold\">{formatCategoryName(name)}</div>\n {shortcuts.map((shortcut, i) => (\n <ShortcutItem\n key={shortcut.id}\n shortcut={shortcut}\n displayText={displayTexts[i]}\n categoryName={name}\n onChange={handleShortcutChange}\n />\n ))}\n </div>\n );\n}\n\nconst mapStateToProps = (\n state: RootState\n): Pick<ShortcutSectionContentProps, 'shortcutOverrides'> => ({\n shortcutOverrides: getShortcutOverrides(state),\n});\n\nconst mapDispatchToProps = { updateSettings: updateSettingsAction };\n\nconst ConnectedShortcutSectionContent = connect(\n mapStateToProps,\n mapDispatchToProps\n)(ShortcutSectionContent);\n\nexport default ConnectedShortcutSectionContent;\n","import React, { type ReactElement } from 'react';\nimport { TableUtils } from '@deephaven/jsapi-utils';\n\nconst columnTypesArray = [\n { value: TableUtils.dataType.DATETIME, label: 'DateTime' },\n { value: TableUtils.dataType.DECIMAL, label: 'Decimal' },\n { value: TableUtils.dataType.INT, label: 'Integer' },\n];\n\nexport default function ColumnTypeOptions(): ReactElement {\n const columnTypeOptions = columnTypesArray.map(item => (\n <option key={`key-columnType-${item.value}`} value={item.value}>\n {item.label}\n </option>\n ));\n\n return (\n <>\n <option key=\"key-columnType-placeholder\" disabled value=\"\">\n Select Type\n </option>\n {columnTypeOptions}\n </>\n );\n}\n","import React, {\n type ChangeEvent,\n PureComponent,\n type ReactElement,\n type RefObject,\n} from 'react';\nimport { connect } from 'react-redux';\nimport { dhNewCircleLargeFilled, vsTrash } from '@deephaven/icons';\nimport memoize from 'memoizee';\nimport { TransitionGroup } from 'react-transition-group';\nimport debounce from 'lodash.debounce';\nimport classNames from 'classnames';\nimport { Button, FadeTransition, Select } from '@deephaven/components';\nimport {\n DateTimeColumnFormatter,\n IntegerColumnFormatter,\n DecimalColumnFormatter,\n TableUtils,\n type TableColumnFormat,\n type FormattingRule,\n} from '@deephaven/jsapi-utils';\nimport type { dh as DhType } from '@deephaven/jsapi-types';\nimport {\n getApi,\n getDefaultDecimalFormatOptions,\n getDefaultIntegerFormatOptions,\n getFormatter,\n getTimeZone,\n getShowTimeZone,\n getShowTSeparator,\n updateSettings as updateSettingsAction,\n type RootState,\n type WorkspaceSettings,\n} from '@deephaven/redux';\nimport { assertNotNull } from '@deephaven/utils';\nimport './FormattingSectionContent.scss';\nimport type { DebouncedFunc } from 'lodash';\nimport {\n focusFirstInputInContainer,\n isValidColumnName,\n isValidFormat,\n removeFormatRuleExtraProps,\n isFormatRuleValidForSave,\n type ValidFormatterItem,\n type FormatterItem,\n type FormatOption,\n} from './SettingsUtils';\nimport ColumnTypeOptions from './ColumnTypeOptions';\nimport DateTimeOptions from './DateTimeOptions';\n\nexport interface ColumnSpecificSectionContentProps {\n dh: typeof DhType;\n formatter: FormatterItem[];\n showTimeZone: boolean;\n showTSeparator: boolean;\n timeZone: string;\n updateSettings: (settings: Partial<WorkspaceSettings>) => void;\n scrollTo: (x: number, y: number) => void;\n defaultDecimalFormatOptions: FormatOption;\n defaultIntegerFormatOptions: FormatOption;\n}\n\ninterface ColumnSpecificSectionContentState {\n formatSettings: FormatterItem[];\n formatRulesChanged: boolean;\n showTimeZone: boolean;\n showTSeparator: boolean;\n timeZone: string;\n timestampAtMenuOpen: Date;\n}\n\nexport class ColumnSpecificSectionContent extends PureComponent<\n ColumnSpecificSectionContentProps,\n ColumnSpecificSectionContentState\n> {\n static defaultProps = {\n scrollTo: (): void => undefined,\n };\n\n static inputDebounceTime = 250;\n\n constructor(props: ColumnSpecificSectionContentProps) {\n super(props);\n\n this.debouncedCommitChanges = debounce(\n this.commitChanges.bind(this),\n ColumnSpecificSectionContent.inputDebounceTime\n );\n\n this.handleFormatRuleEntered = this.handleFormatRuleEntered.bind(this);\n this.handleFormatRuleChange = this.handleFormatRuleChange.bind(this);\n this.handleFormatRuleCreate = this.handleFormatRuleCreate.bind(this);\n this.handleFormatRuleDelete = this.handleFormatRuleDelete.bind(this);\n\n const { formatter, showTimeZone, showTSeparator, timeZone } = props;\n\n const formatSettings = formatter.map((item, i) => ({\n ...item,\n id: i,\n }));\n\n this.containerRef = React.createRef();\n this.addFormatRuleButtonRef = React.createRef();\n\n this.lastFormatRuleIndex = formatSettings.length;\n\n this.state = {\n formatSettings,\n formatRulesChanged: false,\n showTimeZone,\n showTSeparator,\n timeZone,\n timestampAtMenuOpen: new Date(),\n };\n }\n\n componentDidMount(): void {\n focusFirstInputInContainer(this.containerRef.current);\n }\n\n componentWillUnmount(): void {\n this.debouncedCommitChanges.flush();\n }\n\n debouncedCommitChanges: DebouncedFunc<() => void>;\n\n containerRef: RefObject<HTMLDivElement>;\n\n addFormatRuleButtonRef: RefObject<HTMLButtonElement>;\n\n lastFormatRuleIndex: number;\n\n isDuplicateRule(rule: FormatterItem): boolean {\n const { formatSettings } = this.state;\n return (\n formatSettings.some(\n item =>\n item.id !== rule.id &&\n item.columnName === rule.columnName &&\n item.columnType === rule.columnType\n ) ?? false\n );\n }\n\n getAutoIncrementFormatRuleIndex(): number {\n const { lastFormatRuleIndex } = this;\n this.lastFormatRuleIndex += 1;\n return lastFormatRuleIndex;\n }\n\n getCachedColumnTypeOptions = memoize(() => <ColumnTypeOptions />, {\n max: 100,\n });\n\n getCachedDateTimeFormatOptions = memoize(\n (\n timeZone: string,\n showTimeZone: boolean,\n showTSeparator: boolean,\n isGlobalOptions = false,\n legacyGlobalFormat?: string\n ) => {\n const { timestampAtMenuOpen } = this.state;\n return (\n <DateTimeOptions\n timestamp={timestampAtMenuOpen}\n timeZone={timeZone}\n showTimeZone={showTimeZone}\n showTSeparator={showTSeparator}\n isGlobalOptions={isGlobalOptions}\n legacyGlobalFormat={legacyGlobalFormat}\n />\n );\n },\n { max: 100 }\n );\n\n handleFormatRuleChange(\n index: number,\n key: string,\n value: TableColumnFormat | string | boolean\n ): void {\n this.setState(\n state => {\n const { formatSettings: oldFormatSettings } = state;\n assertNotNull(oldFormatSettings);\n const formatSettings = [...oldFormatSettings];\n // Reset format string on type change\n let resetKeys = {};\n if (key === 'columnType') {\n resetKeys = {\n format: this.makeDefaultFormatterItemByType(value as string),\n };\n }\n const newEntry = {\n ...formatSettings[index],\n ...resetKeys,\n [key]: value,\n };\n\n formatSettings[index] = newEntry;\n return {\n formatSettings,\n };\n },\n () => {\n this.debouncedCommitChanges();\n }\n );\n }\n\n handleFormatRuleCreate(): void {\n this.setState(state => {\n const { formatSettings } = state;\n const newFormat = {\n columnType: TableUtils.dataType.DATETIME,\n columnName: '',\n format: {},\n id: this.getAutoIncrementFormatRuleIndex(),\n isNewRule: true,\n };\n return {\n formatSettings: [...formatSettings, newFormat],\n formatRulesChanged: true,\n };\n });\n }\n\n handleFormatRuleDelete(index: number): void {\n this.setState(\n state => {\n const { formatSettings: oldFormatSettings } = state;\n const formatSettings = oldFormatSettings.filter(\n (item, i) => i !== index\n );\n return {\n formatSettings,\n formatRulesChanged: true,\n };\n },\n () => {\n this.debouncedCommitChanges();\n }\n );\n }\n\n handleFormatRuleEntered(elem: HTMLElement): void {\n this.scrollToFormatBlockBottom();\n focusFirstInputInContainer(elem);\n }\n\n commitChanges(): void {\n const { formatSettings } = this.state;\n\n const { dh } = this.props;\n\n const formatter =\n formatSettings\n .filter((format): format is ValidFormatterItem =>\n isFormatRuleValidForSave(dh, format)\n )\n .map(removeFormatRuleExtraProps) ?? [];\n\n const { updateSettings } = this.props;\n const newSettings = {\n formatter: formatter as FormattingRule[],\n };\n updateSettings(newSettings);\n }\n\n scrollToFormatBlockBottom(): void {\n const { scrollTo } = this.props;\n scrollTo(\n 0,\n (this.addFormatRuleButtonRef.current?.offsetHeight ?? 0) +\n (this.addFormatRuleButtonRef.current?.offsetTop ?? 0)\n );\n }\n\n getRuleError(rule: FormatterItem): {\n hasColumnNameError: boolean;\n hasFormatError: boolean;\n message: string;\n } {\n const { dh } = this.props;\n const error = {\n hasColumnNameError: false,\n hasFormatError: false,\n message: '',\n };\n\n const errorMessages = [];\n\n if (rule.isNewRule !== undefined && rule.isNewRule) {\n return error;\n }\n\n if (this.isDuplicateRule(rule)) {\n error.hasColumnNameError = true;\n errorMessages.push('Duplicate column name/type combo.');\n }\n\n if (!isValidColumnName(rule.columnName)) {\n error.hasColumnNameError = true;\n errorMessages.push(\n 'Column names must start with a letter or underscore and contain only alphanumeric characters or underscores.'\n );\n }\n\n if (\n rule.format.formatString != null &&\n rule.format.formatString.length === 0\n ) {\n error.hasFormatError = true;\n errorMessages.push('Empty formatting rule.');\n } else if (!isValidFormat(dh, rule.columnType, rule.format)) {\n error.hasFormatError = true;\n errorMessages.push('Invalid formatting rule.');\n }\n\n error.message = errorMessages.join('\\n');\n return error;\n }\n\n makeDefaultFormatterItemByType(\n columnType: string\n ): TableColumnFormat | string {\n switch (TableUtils.getNormalizedType(columnType)) {\n case TableUtils.dataType.INT: {\n const { defaultIntegerFormatOptions } = this.props;\n const { defaultFormatString: defaultIntegerFormatString } =\n defaultIntegerFormatOptions;\n return IntegerColumnFormatter.makeFormat(\n '',\n defaultIntegerFormatString ??\n IntegerColumnFormatter.DEFAULT_FORMAT_STRING,\n IntegerColumnFormatter.TYPE_GLOBAL,\n undefined\n );\n }\n\n case TableUtils.dataType.DECIMAL: {\n const { defaultDecimalFormatOptions } = this.props;\n const { defaultFormatString: defaultDecimalFormatString } =\n defaultDecimalFormatOptions;\n return DecimalColumnFormatter.makeFormat(\n '',\n defaultDecimalFormatString ??\n DecimalColumnFormatter.DEFAULT_FORMAT_STRING,\n DecimalColumnFormatter.TYPE_GLOBAL,\n undefined\n );\n }\n default: {\n return '';\n }\n }\n }\n\n renderFormatRule(i: number, rule: FormatterItem): ReactElement {\n const columnNameId = `input-${i}-columnName`;\n const columnTypeId = `input-${i}-columnType`;\n const formatId = `input-${i}-format`;\n const columnTypeOptions = this.getCachedColumnTypeOptions();\n const onNameChange = (e: ChangeEvent<HTMLInputElement>): void =>\n this.handleFormatRuleChange(i, 'columnName', e.target.value);\n const onNameBlur = (): void =>\n this.handleFormatRuleChange(i, 'isNewRule', false);\n const onTypeChange = (eventTargetValue: string): void =>\n this.handleFormatRuleChange(i, 'columnType', eventTargetValue);\n\n const ruleError = this.getRuleError(rule);\n\n return (\n <fieldset key={i} className=\"container-fluid format-rule-container\">\n <div className=\"form-row\">\n <div className=\"form-group col-7 mb-2\">\n <label htmlFor={columnNameId}>Column Name</label>\n <input\n id={columnNameId}\n className={classNames('form-control', {\n 'is-invalid': ruleError.hasColumnNameError,\n })}\n data-lpignore\n type=\"text\"\n value={rule.columnName}\n onChange={onNameChange}\n onBlur={onNameBlur}\n />\n </div>\n <div className=\"form-group col mb-2\">\n <Button\n kind=\"ghost\"\n className=\"btn-delete-format-rule float-right\"\n tabIndex={-1}\n onClick={() => this.handleFormatRuleDelete(i)}\n icon={vsTrash}\n tooltip=\"Delete\"\n aria-label=\"Delete Format Rule\"\n />\n\n <label htmlFor={columnTypeId}>Column Type</label>\n <Select\n id={columnTypeId}\n className=\"custom-select\"\n value={rule.columnType}\n onChange={onTypeChange}\n >\n {columnTypeOptions}\n </Select>\n </div>\n </div>\n <div className=\"form-row\">\n <div className=\"form-group col-12 d-flex mb-2\">\n <label\n className=\"flex-shrink-0 col-form-label mr-3\"\n htmlFor={formatId}\n >\n Formatting Rule\n </label>\n {this.renderFormatRuleInput(\n i,\n rule.columnType,\n formatId,\n rule.format,\n ruleError.hasFormatError\n )}\n </div>\n </div>\n <div className=\"form-row\">\n <div className=\"form-group col-12 d-flex mb-2\">\n {ruleError.message && (\n <p className=\"text-danger\">{ruleError.message}</p>\n )}\n </div>\n </div>\n </fieldset>\n );\n }\n\n renderFormatRuleInput(\n i: number,\n columnType: string,\n formatId: string,\n format: Partial<TableColumnFormat>,\n isInvalid: boolean\n ): ReactElement | null {\n switch (TableUtils.getNormalizedType(columnType)) {\n case TableUtils.dataType.DATETIME:\n return this.renderDateTimeFormatRuleInput(\n i,\n formatId,\n format,\n isInvalid\n );\n case TableUtils.dataType.DECIMAL:\n return this.renderDecimalFormatRuleInput(\n i,\n formatId,\n format,\n isInvalid\n );\n case TableUtils.dataType.INT:\n return this.renderIntegerFormatRuleInput(\n i,\n formatId,\n format,\n isInvalid\n );\n default:\n throw new Error(`Unrecognized column type: ${columnType}`);\n }\n }\n\n renderDateTimeFormatRuleInput(\n i: number,\n formatId: string,\n format: Partial<TableColumnFormat>,\n isInvalid: boolean\n ): ReactElement {\n const { showTimeZone, showTSeparator, timeZone } = this.state;\n\n const value = format.formatString ?? '';\n return (\n <Select\n className={classNames('custom-select', { 'is-invalid': isInvalid })}\n value={value}\n id={formatId}\n onChange={eventTargetValue => {\n const selectedFormat = DateTimeColumnFormatter.makeFormat(\n '',\n eventTargetValue,\n DateTimeColumnFormatter.TYPE_GLOBAL\n );\n this.handleFormatRuleChange(i, 'format', selectedFormat);\n }}\n >\n <option key=\"default\" value=\"\" disabled>\n Select format\n </option>\n {this.getCachedDateTimeFormatOptions(\n timeZone,\n showTimeZone,\n showTSeparator\n )}\n </Select>\n );\n }\n\n renderIntegerFormatRuleInput(\n i: number,\n formatId: string,\n format: Partial<TableColumnFormat>,\n isInvalid: boolean\n ): ReactElement {\n const { defaultIntegerFormatOptions } = this.props;\n assertNotNull(defaultIntegerFormatOptions);\n const { defaultFormatString } = defaultIntegerFormatOptions;\n const value = format.formatString ?? '';\n return (\n <input\n className={classNames('form-control', 'flex-grow-1', {\n 'is-invalid': isInvalid,\n })}\n data-lpignore\n id={formatId}\n placeholder={\n defaultFormatString ?? IntegerColumnFormatter.DEFAULT_FORMAT_STRING\n }\n type=\"text\"\n value={value}\n onChange={e => {\n const selectedFormat = IntegerColumnFormatter.makeFormat(\n '',\n e.target.value,\n IntegerColumnFormatter.TYPE_GLOBAL,\n undefined\n );\n this.handleFormatRuleChange(i, 'format', selectedFormat);\n }}\n />\n );\n }\n\n renderDecimalFormatRuleInput(\n i: number,\n formatId: string,\n format: Partial<TableColumnFormat>,\n isInvalid: boolean\n ): ReactElement {\n const { defaultDecimalFormatOptions } = this.props;\n const { defaultFormatString } = defaultDecimalFormatOptions;\n\n const value = format.formatString ?? '';\n return (\n <input\n className={classNames('form-control', 'flex-grow-1', {\n 'is-invalid': isInvalid,\n })}\n data-lpignore\n id={formatId}\n placeholder={\n defaultFormatString ?? DecimalColumnFormatter.DEFAULT_FORMAT_STRING\n }\n type=\"text\"\n value={value}\n onChange={e => {\n const selectedFormat = DecimalColumnFormatter.makeFormat(\n '',\n e.target.value,\n DecimalColumnFormatter.TYPE_GLOBAL,\n undefined\n );\n this.handleFormatRuleChange(i, 'format', selectedFormat);\n }}\n />\n );\n }\n\n render(): ReactElement {\n const { formatRulesChanged, formatSettings } = this.state;\n\n const formatRules = formatSettings.map((rule, index) => (\n <FadeTransition key={rule.id} onEnter={this.handleFormatRuleEntered}>\n {this.renderFormatRule(index, rule)}\n </FadeTransition>\n ));\n\n const addNewRuleButton = (\n <Button\n kind=\"ghost\"\n className=\"mb-3\"\n onClick={this.handleFormatRuleCreate}\n ref={this.addFormatRuleButtonRef}\n icon={dhNewCircleLargeFilled}\n >\n Add New Rule\n </Button>\n );\n\n return (\n <div className=\"app-settings-formatting-section\" ref={this.containerRef}>\n <div className=\"app-settings-menu-description mb-3\">\n Customize the formatting of table columns by applying rules based on\n matching both a column name and column type.\n </div>\n\n <TransitionGroup\n appear={formatRulesChanged}\n enter={formatRulesChanged}\n exit={formatRulesChanged}\n >\n {formatRules}\n </TransitionGroup>\n\n {addNewRuleButton}\n </div>\n );\n }\n}\n\nconst mapStateToProps = (\n state: RootState\n): Omit<ColumnSpecificSectionContentProps, 'updateSettings' | 'scrollTo'> => ({\n formatter: getFormatter(state),\n defaultDecimalFormatOptions: getDefaultDecimalFormatOptions(state),\n defaultIntegerFormatOptions: getDefaultIntegerFormatOptions(state),\n dh: getApi(state),\n showTimeZone: getShowTimeZone(state),\n showTSeparator: getShowTSeparator(state),\n timeZone: getTimeZone(state),\n});\n\nconst ConnectedColumnSpecificSectionContent = connect(mapStateToProps, {\n updateSettings: updateSettingsAction,\n})(ColumnSpecificSectionContent);\n\nexport default ConnectedColumnSpecificSectionContent;\n","import React, { useCallback } from 'react';\nimport { useDispatch } from 'react-redux';\nimport {\n Content,\n ContextualHelp,\n Heading,\n Switch,\n Text,\n} from '@deephaven/components';\nimport { getWebGL, getWebGLEditable, updateSettings } from '@deephaven/redux';\nimport { useAppSelector } from '@deephaven/dashboard';\n\nfunction AdvancedSectionContent(): JSX.Element {\n const dispatch = useDispatch();\n const webgl = useAppSelector(getWebGL);\n const webglEditable = useAppSelector(getWebGLEditable);\n\n const handleWebglChange = useCallback(\n (newValue: boolean) => {\n dispatch(updateSettings({ webgl: newValue }));\n },\n [dispatch]\n );\n\n const helpText = webglEditable ? (\n <Text>\n WebGL in most cases has significant performance improvements, particularly\n when plotting large datasets. However, in some environments (such as\n remote desktop environments), WebGL may not use hardware acceleration and\n have degraded performance. If you are experiencing issues with WebGL, you\n can disable it here.\n </Text>\n ) : (\n <Text>\n WebGL is disabled by your system administrator. Contact your system\n administrator to enable.\n </Text>\n );\n\n return (\n <>\n <div className=\"app-settings-menu-description\">\n Advanced settings here. Be careful!\n </div>\n\n <div className=\"form-row mb-3 pl-1\">\n <Switch\n isSelected={webgl}\n isDisabled={!webglEditable}\n onChange={handleWebglChange}\n marginEnd=\"size-0\"\n >\n Enable WebGL\n </Switch>\n <ContextualHelp variant=\"info\" marginTop=\"size-50\">\n <Heading>Enable WebGL</Heading>\n <Content>\n <Text>{helpText}</Text>\n </Content>\n </ContextualHelp>\n </div>\n </>\n );\n}\n\nexport default AdvancedSectionContent;\n","import React, { useCallback } from 'react';\nimport {\n Item,\n type ItemKey,\n Picker,\n ThemePicker,\n useTheme,\n} from '@deephaven/components';\nimport { assertNotNull } from '@deephaven/utils';\nimport { useDispatch } from 'react-redux';\nimport { getSettings, updateSettings } from '@deephaven/redux';\nimport { useAppSelector } from '@deephaven/dashboard';\n\nexport function ThemeSectionContent(): JSX.Element {\n const theme = useTheme();\n const settings = useAppSelector(getSettings);\n const dispatch = useDispatch();\n\n const updateDensity = useCallback(\n (density: ItemKey | null) => {\n if (\n density !== 'regular' &&\n density !== 'compact' &&\n density !== 'spacious'\n ) {\n throw new Error(`Invalid grid density value: ${density}`);\n }\n dispatch(updateSettings({ gridDensity: density }));\n },\n [dispatch]\n );\n\n const density = settings.gridDensity;\n\n assertNotNull(theme, 'ThemeContext value is null');\n\n return (\n <>\n <ThemePicker />\n <Picker\n label=\"Default table density\"\n selectedKey={density}\n onChange={updateDensity}\n >\n <Item key=\"regular\">Regular</Item>\n <Item key=\"compact\">Compact</Item>\n <Item key=\"spacious\">Spacious</Item>\n </Picker>\n </>\n );\n}\n\nexport default ThemeSectionContent;\n","import React, { useCallback, useState } from 'react';\nimport { useDispatch } from 'react-redux';\nimport {\n Switch,\n ActionButton,\n Icon,\n Text,\n ContextualHelp,\n Heading,\n Content,\n} from '@deephaven/components';\nimport { useAppSelector } from '@deephaven/dashboard';\nimport { getNotebookSettings, updateNotebookSettings } from '@deephaven/redux';\nimport { vsSettings } from '@deephaven/icons';\nimport {\n MonacoProviders,\n RuffSettingsModal,\n RUFF_DEFAULT_SETTINGS,\n} from '@deephaven/console';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\n\nexport function EditorSectionContent(): JSX.Element {\n const notebookSettings = useAppSelector(getNotebookSettings);\n const dispatch = useDispatch();\n const {\n isMinimapEnabled,\n formatOnSave,\n python: { linter: ruffSettings = {} } = {},\n } = notebookSettings;\n const { isEnabled: ruffEnabled, config: ruffConfig = RUFF_DEFAULT_SETTINGS } =\n ruffSettings;\n\n const handleMinimapChange = useCallback(\n (newValue: boolean) =>\n dispatch(updateNotebookSettings({ isMinimapEnabled: newValue })),\n [dispatch]\n );\n\n const handleFormatOnSaveChange = useCallback(\n (newValue: boolean) =>\n dispatch(updateNotebookSettings({ formatOnSave: newValue })),\n [dispatch]\n );\n\n const handleRuffEnabledChange = useCallback(\n (newValue: boolean) => {\n dispatch(\n updateNotebookSettings({\n python: { linter: { ...ruffSettings, isEnabled: newValue } },\n })\n );\n MonacoProviders.isRuffEnabled = newValue;\n MonacoProviders.setRuffSettings(ruffConfig);\n },\n [dispatch, ruffSettings, ruffConfig]\n );\n\n const handleRuffConfigChange = useCallback(\n (newValue: Record<string, unknown>) => {\n dispatch(\n updateNotebookSettings({\n python: {\n linter: {\n ...ruffSettings,\n config:\n JSON.stringify(newValue) ===\n JSON.stringify(RUFF_DEFAULT_SETTINGS)\n ? undefined\n : newValue,\n },\n },\n })\n );\n MonacoProviders.setRuffSettings(newValue);\n },\n [dispatch, ruffSettings]\n );\n\n const val = JSON.stringify(ruffConfig, null, 2);\n\n const [isRuffSettingsOpen, setIsRuffSettingsOpen] = useState(false);\n\n const handleRuffSettingsClose = useCallback(() => {\n setIsRuffSettingsOpen(false);\n }, []);\n\n const handleRuffSettingsSave = useCallback(\n (v: Record<string, unknown>) => {\n handleRuffConfigChange(v);\n handleRuffSettingsClose();\n },\n [handleRuffConfigChange, handleRuffSettingsClose]\n );\n\n return (\n <>\n <div className=\"app-settings-menu-description\">\n Customize the notebook editor.\n </div>\n\n <div className=\"form-row pl-1\">\n <Switch isSelected={isMinimapEnabled} onChange={handleMinimapChange}>\n Enable Minimap\n </Switch>\n </div>\n <div className=\"form-row align-items-center pl-1\">\n <Switch\n isSelected={formatOnSave}\n onChange={handleFormatOnSaveChange}\n margin={0}\n >\n Format on Save\n </Switch>\n <ContextualHelp variant=\"info\">\n <Heading>Format on Save</Heading>\n <Content>\n <Text>\n The Ruff settings control formatting options. Notebooks can be\n formatted manually using the right-click context menu.\n </Text>\n </Content>\n </ContextualHelp>\n </div>\n <div className=\"form-row pl-1\">\n <Switch\n isSelected={ruffEnabled}\n onChange={handleRuffEnabledChange}\n marginEnd={0}\n >\n Enable Ruff Python Linter\n </Switch>\n </div>\n <div className=\"form-row pl-1\">\n <ActionButton onPress={() => setIsRuffSettingsOpen(true)}>\n <Icon>\n <FontAwesomeIcon icon={vsSettings} />\n </Icon>\n <Text>Customize Ruff Settings</Text>\n </ActionButton>\n </div>\n {isRuffSettingsOpen && (\n <RuffSettingsModal\n text={val}\n isOpen={isRuffSettingsOpen}\n onClose={handleRuffSettingsClose}\n onSave={handleRuffSettingsSave}\n />\n )}\n </>\n );\n}\n\nexport default EditorSectionContent;\n","import React, {\n Component,\n Fragment,\n type ReactElement,\n type RefObject,\n} from 'react';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport {\n vsClose,\n vsWatch,\n vsRecordKeys,\n vsLayers,\n vsPaintcan,\n dhUserIncognito,\n dhUser,\n vsTools,\n vsFileCode,\n} from '@deephaven/icons';\nimport {\n Button,\n ContextualHelp,\n Heading,\n Content,\n CopyButton,\n GLOBAL_SHORTCUTS,\n Logo,\n} from '@deephaven/components';\nimport { type ServerConfigValues, type User, store } from '@deephaven/redux';\nimport {\n BROADCAST_CHANNEL_NAME,\n BROADCAST_LOGOUT_MESSAGE,\n} from '@deephaven/jsapi-utils';\nimport { type PluginModuleMap } from '@deephaven/plugin';\nimport { exportLogs, logHistory } from '@deephaven/log';\nimport { makeMessage } from '@deephaven/utils';\nimport FormattingSectionContent from './FormattingSectionContent';\nimport LegalNotice from './LegalNotice';\nimport SettingsMenuSection from './SettingsMenuSection';\nimport ShortcutSectionContent from './ShortcutsSectionContent';\nimport './SettingsMenu.scss';\nimport ColumnSpecificSectionContent from './ColumnSpecificSectionContent';\nimport {\n getFormattedPluginInfo,\n getFormattedVersionInfo,\n} from './SettingsUtils';\nimport AdvancedSectionContent from './AdvancedSectionContent';\nimport ThemeSectionContent from './ThemeSectionContent';\nimport EditorSectionContent from './EditorSectionContent';\n\ninterface SettingsMenuProps {\n serverConfigValues: ServerConfigValues;\n pluginData: PluginModuleMap;\n user: User;\n onDone: () => void;\n}\n\ninterface SettingsMenuState {\n expandedSectionKey?: string;\n}\n\nexport class SettingsMenu extends Component<\n SettingsMenuProps,\n SettingsMenuState\n> {\n static defaultProps = {\n onDone: (): void => undefined,\n };\n\n static FORMATTING_SECTION_KEY = 'SettingsMenu.formatting';\n\n static COLUMN_SPECIFIC_SECTION_KEY = 'SettingsMenu.columnFormatting';\n\n static APPLICATION_SECTION_KEY = 'ApplicationMenu.settings';\n\n static SHORTCUT_SECTION_KEY = 'SettingsMenu.shortcuts';\n\n static THEME_SECTION_KEY = 'SettingsMenu.theme';\n\n static ADVANCED_SECTION_KEY = 'SettingsMenu.advanced';\n\n static EDITOR_SECTION_KEY = 'SettingsMenu.editor';\n\n static focusFirstInputInContainer(container: HTMLDivElement | null): void {\n const input = container?.querySelector('input, select, textarea');\n if (input) {\n (input as HTMLElement).focus();\n }\n }\n\n constructor(props: SettingsMenuProps) {\n super(props);\n\n this.handleClose = this.handleClose.bind(this);\n this.handleScrollTo = this.handleScrollTo.bind(this);\n this.handleSectionToggle = this.handleSectionToggle.bind(this);\n this.handleExportSupportLogs = this.handleExportSupportLogs.bind(this);\n this.handleLogout = this.handleLogout.bind(this);\n\n this.menuContentRef = React.createRef();\n this.broadcastChannel = new BroadcastChannel(BROADCAST_CHANNEL_NAME);\n\n this.state = {\n expandedSectionKey: SettingsMenu.FORMATTING_SECTION_KEY,\n };\n }\n\n componentDidMount(): void {\n SettingsMenu.focusFirstInputInContainer(this.menuContentRef.current);\n }\n\n componentWillUnmount(): void {\n this.broadcastChannel.close();\n }\n\n menuContentRef: RefObject<HTMLDivElement>;\n\n broadcastChannel: BroadcastChannel;\n\n isSectionExpanded(sectionKey: string): boolean {\n const { expandedSectionKey } = this.state;\n return expandedSectionKey === sectionKey;\n }\n\n handleLogout(): void {\n this.broadcastChannel.postMessage(makeMessage(BROADCAST_LOGOUT_MESSAGE));\n }\n\n handleScrollTo(x: number, y: number): void {\n this.menuContentRef.current?.scrollTo(x, y);\n }\n\n handleSectionToggle(sectionKey: string): void {\n this.setState(state => ({\n expandedSectionKey:\n state.expandedSectionKey === sectionKey ? undefined : sectionKey,\n }));\n }\n\n handleClose(): void {\n const { onDone } = this.props;\n onDone();\n }\n\n handleExportSupportLogs(): void {\n const { serverConfigValues, pluginData } = this.props;\n const pluginInfo = getFormattedPluginInfo(pluginData);\n exportLogs(\n logHistory,\n {\n uiVersion: import.meta.env.npm_package_version,\n userAgent: navigator.userAgent,\n ...Object.fromEntries(serverConfigValues),\n pluginInfo,\n },\n store.getState()\n );\n }\n\n render(): ReactElement {\n const supportLink = import.meta.env.VITE_SUPPORT_LINK;\n const docsLink = import.meta.env.VITE_DOCS_LINK;\n\n const { serverConfigValues, pluginData, user } = this.props;\n const versionInfo = getFormattedVersionInfo(serverConfigValues);\n const pluginInfo = getFormattedPluginInfo(pluginData);\n const deephavenVersion = serverConfigValues.get('deephaven.version');\n const copyShortcut = GLOBAL_SHORTCUTS.COPY_VERSION_INFO.getDisplayText();\n\n const getRow = (text: string, ver?: string): JSX.Element => (\n <Fragment key={text}>\n <div>{text}</div>\n <div>{ver}</div>\n </Fragment>\n );\n\n const userDisplayName = user.displayName ?? user.name;\n const hasUserImage = user.image != null && user.image !== '';\n const showUserName = userDisplayName !== '';\n\n return (\n <div className=\"app-settings-menu\">\n <header className=\"app-settings-menu-header\">\n <div className=\"user-info\">\n <div className=\"user-image\">\n {!hasUserImage && (\n <FontAwesomeIcon icon={dhUser} transform=\"grow-8\" />\n )}\n {hasUserImage && <img src={user.image} alt={userDisplayName} />}\n </div>\n <div className=\"user-details\">\n {showUserName && (\n <div className=\"user-name\">\n {userDisplayName}\n {user.operateAs != null && user.name !== user.operateAs && (\n <>\n <span className=\"font-weight-light font-italic\">\n {' '}\n as{' '}\n </span>\n <span className=\"operating-as-user\">\n <FontAwesomeIcon\n icon={dhUserIncognito}\n className=\"mr-1\"\n />\n {user.operateAs}\n </span>\n </>\n )}\n </div>\n )}\n {user.permissions.canLogout && (\n <button\n type=\"button\"\n className=\"btn btn-link\"\n onClick={this.handleLogout}\n >\n logout\n </button>\n )}\n </div>\n </div>\n <Button\n kind=\"ghost\"\n className=\"btn-close-settings-menu\"\n onClick={this.handleClose}\n icon={<FontAwesomeIcon icon={vsClose} transform=\"grow-4\" />}\n tooltip=\"Close\"\n />\n </header>\n <div className=\"app-settings-menu-content\" ref={this.menuContentRef}>\n <h5>Settings</h5>\n\n <hr className=\"my-0\" />\n\n <SettingsMenuSection\n sectionKey={SettingsMenu.FORMATTING_SECTION_KEY}\n isExpanded={this.isSectionExpanded(\n SettingsMenu.FORMATTING_SECTION_KEY\n )}\n title={\n <>\n <FontAwesomeIcon\n icon={vsWatch}\n transform=\"grow-4\"\n className=\"mr-2\"\n />\n Default Format & Time zone\n </>\n }\n onToggle={this.handleSectionToggle}\n >\n <FormattingSectionContent />\n </SettingsMenuSection>\n\n <SettingsMenuSection\n sectionKey={SettingsMenu.COLUMN_SPECIFIC_SECTION_KEY}\n isExpanded={this.isSectionExpanded(\n SettingsMenu.COLUMN_SPECIFIC_SECTION_KEY\n )}\n title={\n <>\n <FontAwesomeIcon\n icon={vsLayers}\n transform=\"grow-4\"\n className=\"mr-2\"\n />\n Format by Column Name & Type\n </>\n }\n onToggle={this.handleSectionToggle}\n >\n <ColumnSpecificSectionContent scrollTo={this.handleScrollTo} />\n </SettingsMenuSection>\n\n <SettingsMenuSection\n sectionKey={SettingsMenu.THEME_SECTION_KEY}\n isExpanded={this.isSectionExpanded(SettingsMenu.THEME_SECTION_KEY)}\n onToggle={this.handleSectionToggle}\n title={\n <>\n <FontAwesomeIcon\n icon={vsPaintcan}\n transform=\"grow-4\"\n className=\"mr-2\"\n />\n Theme\n </>\n }\n >\n <ThemeSectionContent />\n </SettingsMenuSection>\n\n <SettingsMenuSection\n sectionKey={SettingsMenu.EDITOR_SECTION_KEY}\n isExpanded={this.isSectionExpanded(SettingsMenu.EDITOR_SECTION_KEY)}\n onToggle={this.handleSectionToggle}\n title={\n <>\n <FontAwesomeIcon\n icon={vsFileCode}\n transform=\"grow-4\"\n className=\"mr-2\"\n />\n Editor\n </>\n }\n >\n <EditorSectionContent />\n </SettingsMenuSection>\n\n <SettingsMenuSection\n sectionKey={SettingsMenu.SHORTCUT_SECTION_KEY}\n isExpanded={this.isSectionExpanded(\n SettingsMenu.SHORTCUT_SECTION_KEY\n )}\n title={\n <>\n <FontAwesomeIcon\n icon={vsRecordKeys}\n transform=\"grow-4\"\n className=\"mr-2\"\n />\n Keyboard Shortcuts\n </>\n }\n onToggle={this.handleSectionToggle}\n >\n <ShortcutSectionContent />\n </SettingsMenuSection>\n <SettingsMenuSection\n sectionKey={SettingsMenu.ADVANCED_SECTION_KEY}\n isExpanded={this.isSectionExpanded(\n SettingsMenu.ADVANCED_SECTION_KEY\n )}\n title={\n <>\n <FontAwesomeIcon\n icon={vsTools}\n transform=\"grow-4\"\n className=\"mr-2\"\n />\n Advanced\n </>\n }\n onToggle={this.handleSectionToggle}\n >\n <AdvancedSectionContent />\n </SettingsMenuSection>\n\n <div className=\"app-settings-footer\">\n <div className=\"app-settings-footer-section\">\n <div className=\"app-settings-footer-item\">\n <div className=\"font-weight-bold\">Support</div>\n <div>\n GitHub: \n <a\n href={supportLink}\n className=\"custom-link\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {supportLink}\n </a>\n </div>\n <Button\n kind=\"tertiary\"\n className=\"mt-2 py-2\"\n onClick={this.handleExportSupportLogs}\n >\n Export Logs\n </Button>\n </div>\n <div className=\"app-settings-footer-item\">\n <div className=\"font-weight-bold\">Documentation</div>\n <a\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n href={docsLink}\n className=\"custom-link\"\n >\n {docsLink}\n </a>\n </div>\n <div className=\"app-settings-footer-item\">\n <div className=\"font-weight-bold\">Version</div>\n <span className=\"d-inline-block text-muted\">\n {deephavenVersion}\n <ContextualHelp variant=\"info\">\n <Heading>Version Info</Heading>\n <Content>\n <div className=\"detailed-server-config\">\n {Object.entries(versionInfo).map(([key, value]) =>\n getRow(key, value)\n )}\n </div>\n <CopyButton\n copy={Object.entries({\n ...versionInfo,\n ...pluginInfo,\n })\n .map(([key, value]) => `${key}: ${value}`)\n .join('\\n')}\n >\n Copy Versions{' '}\n <small className=\"text-muted\">({copyShortcut})</small>\n </CopyButton>\n </Content>\n </ContextualHelp>\n </span>\n </div>\n <div className=\"app-settings-footer-item\">\n <div className=\"font-weight-bold\">Plugins</div>\n <div className=\"container\">\n {Array.from(pluginData.entries())\n .filter(plugin => plugin[1].version !== undefined)\n .map(([key, value]) => (\n <div\n key={key}\n className=\"row justify-content-start align-items-center\"\n >\n <div className=\"col pl-0\">\n <span className=\"my-0 text-truncate\">{key}</span>\n </div>\n <div className=\"col-auto\">\n <span>{value?.version}</span>\n </div>\n </div>\n ))}\n </div>\n </div>\n <div className=\"app-settings-footer-item\">\n <LegalNotice />\n </div>\n </div>\n <div className=\"app-settings-footer-section\">\n <a\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n href=\"https://deephaven.io\"\n style={{\n display: 'block',\n width: '61.8%',\n }}\n >\n <Logo />\n </a>\n </div>\n </div>\n </div>\n </div>\n );\n }\n}\n\nexport default SettingsMenu;\n","import React, {\n useRef,\n useEffect,\n useCallback,\n useState,\n useMemo,\n type ReactNode,\n type ReactElement,\n} from 'react';\nimport classNames from 'classnames';\nimport {\n type DropdownAction,\n DropdownMenu,\n GLOBAL_SHORTCUTS,\n} from '@deephaven/components';\nimport { ControlType, ToolType } from '@deephaven/dashboard-core-plugins';\nimport { SHORTCUTS as IRIS_GRID_SHORTCUTS } from '@deephaven/iris-grid';\nimport {\n dhInput,\n dhFilterSlash,\n dhTriangleDownSquare,\n vsLink,\n vsMarkdown,\n vsDeviceCamera,\n} from '@deephaven/icons';\nimport { assertNotNull } from '@deephaven/utils';\n\nconst MINIMUM_DRAG_DISTANCE = 10;\n\ninterface DragSourceMenuItemProps {\n forwardedProps?: {\n iconElement: ReactNode;\n displayShortcut: string;\n isMouseSelected: boolean;\n isKeyboardSelected: boolean;\n closeMenu: () => void;\n menuItem: {\n action: (event?: MouseEvent) => void;\n title: string;\n disabled: boolean;\n };\n };\n}\n\n/**\n * helper component that renders a menu item\n * props are fowarded from ContextMenuItem\n * purpose is to add custom mouse handlers\n * for dragging panels directly from menu\n */\n\nfunction DragSourceMenuItem(props: DragSourceMenuItemProps): JSX.Element {\n const { forwardedProps } = props;\n assertNotNull(forwardedProps, 'DragSourceMenuItem forwardedProps'); // These are added by the ContextMenuItem, but not used where we declare the items\n const {\n menuItem: { action, title, disabled: menuItemDisabled },\n iconElement,\n displayShortcut,\n isMouseSelected,\n isKeyboardSelected,\n closeMenu,\n } = forwardedProps;\n\n const startX = useRef<number>();\n const startY = useRef<number>();\n const startObject = useRef<EventTarget | null>(null);\n\n // used to prevent double clicking inserting an object twice\n const [disableDoubleClick, setDisableDoubleClick] = useState(false);\n\n const handleMouseMove = useCallback(\n (event: MouseEvent) => {\n if (\n startX.current != null &&\n startY.current != null &&\n startObject.current &&\n (Math.abs(startX.current - event.clientX) >= MINIMUM_DRAG_DISTANCE ||\n Math.abs(startY.current - event.clientY) >= MINIMUM_DRAG_DISTANCE)\n ) {\n setDisableDoubleClick(true);\n window.removeEventListener('mousemove', handleMouseMove);\n closeMenu();\n action(event);\n startObject.current = null; // null object so mouseUp can't fire\n }\n },\n [action, closeMenu]\n );\n\n function handleMouseDown(event: React.MouseEvent<HTMLButtonElement>): void {\n startX.current = event.clientX;\n startY.current = event.clientY;\n startObject.current = event.target;\n window.addEventListener('mousemove', handleMouseMove);\n }\n\n function handleMouseUp(event: React.MouseEvent<HTMLButtonElement>): void {\n // down and up need to occur on same object to constitute a click event\n if (startObject.current === event.target) {\n setDisableDoubleClick(true);\n closeMenu();\n action();\n window.removeEventListener('mousemove', handleMouseMove);\n }\n startObject.current = null; // null object so mousemove can't fire3\n }\n\n useEffect(\n // funny syntax after prettier, return function for the cleanup function\n function cleanUpMouseEventListener() {\n return function removeOldMouseMoveEventListener() {\n return window.removeEventListener('mousemove', handleMouseMove);\n };\n },\n [handleMouseMove]\n );\n\n return (\n <button\n type=\"button\"\n className={classNames(\n 'btn-context-menu',\n { disabled: menuItemDisabled },\n {\n active: isMouseSelected && !menuItemDisabled,\n },\n { 'keyboard-active': isKeyboardSelected && !menuItemDisabled }\n )}\n onMouseDown={handleMouseDown}\n onMouseUp={handleMouseUp}\n disabled={disableDoubleClick}\n >\n <span className={classNames('icon')}>{iconElement}</span>\n <span className=\"title\">{title}</span>\n <span className=\"shortcut\">{displayShortcut}</span>\n </button>\n );\n}\n\ninterface AppControlsMenuProps {\n handleControlSelect: (type: string, event: Event) => void;\n handleToolSelect: (type: string) => void;\n onClearFilter: () => void;\n}\n\nfunction AppControlsMenu(props: AppControlsMenuProps): ReactElement {\n const { handleControlSelect, handleToolSelect, onClearFilter } = props;\n const controlMenuActions: DropdownAction[] = useMemo(\n () => [\n {\n title: 'Input Filter',\n icon: dhInput,\n menuElement: <DragSourceMenuItem />,\n action: (dragEvent: Event) => {\n handleControlSelect(ControlType.INPUT_FILTER, dragEvent);\n },\n order: 10,\n },\n {\n title: 'Dropdown Filter',\n icon: dhTriangleDownSquare,\n menuElement: <DragSourceMenuItem />,\n action: (dragEvent: Event) => {\n handleControlSelect(ControlType.DROPDOWN_FILTER, dragEvent);\n },\n order: 15,\n },\n {\n title: 'Markdown Widget',\n icon: vsMarkdown,\n menuElement: <DragSourceMenuItem />,\n action: (dragEvent: Event) => {\n handleControlSelect(ControlType.MARKDOWN, dragEvent);\n },\n order: 20,\n },\n {\n title: 'Filter Sets',\n icon: vsDeviceCamera,\n menuElement: <DragSourceMenuItem />,\n action: (dragEvent: Event) => {\n handleControlSelect(ControlType.FILTER_SET_MANAGER, dragEvent);\n },\n order: 25,\n },\n {\n disabled: true,\n menuElement: <div className=\"context-menu-group-header\">Tools</div>,\n order: 30,\n },\n {\n title: 'Linker',\n icon: vsLink,\n action: () => {\n handleToolSelect(ToolType.LINKER);\n },\n order: 40,\n shortcut: GLOBAL_SHORTCUTS.LINKER,\n },\n {\n disabled: true,\n menuElement: <div className=\"context-menu-group-header\">Actions</div>,\n order: 50,\n },\n {\n title: 'Clear All Filters',\n icon: dhFilterSlash,\n action: () => {\n onClearFilter();\n },\n order: 60,\n shortcut: IRIS_GRID_SHORTCUTS.TABLE.CLEAR_ALL_FILTERS,\n },\n ],\n [handleControlSelect, handleToolSelect, onClearFilter]\n );\n\n return (\n <DropdownMenu\n popperClassName=\"controls-menu-popper\"\n actions={controlMenuActions}\n />\n );\n}\n\nexport default AppControlsMenu;\n","/**\n * Set the layout storage object being used to load/save the layout\n */\nimport { replaceReducer } from '@deephaven/redux';\nimport { SET_LAYOUT_STORAGE } from '../actionTypes';\n\nexport default replaceReducer(SET_LAYOUT_STORAGE, null);\n","import layoutStorage from './layoutStorage';\n\nexport default { layoutStorage };\n","import { type RootState } from '@deephaven/redux';\nimport type { LayoutStorage } from '@deephaven/app-utils';\n\n/**\n * Get the layout storage used by the app\n * @param store The redux store\n * @returns The layout storage instance\n */\nexport const getLayoutStorage = <State extends RootState = RootState>(\n store: State\n): LayoutStorage => store.layoutStorage as LayoutStorage;\n\n/**\n * Get the configuration values of the server\n * @param store The redux store\n * @returns The layout storage instance\n */\nexport const getServerConfigValues = <State extends RootState = RootState>(\n store: State\n): State['serverConfigValues'] => store.serverConfigValues;\n","import { reducerRegistry } from '@deephaven/redux';\nimport reducers from './reducers';\n\nObject.entries(reducers).map(([name, reducer]) =>\n reducerRegistry.register(name, reducer)\n);\n\nexport * from './actions';\nexport * from './actionTypes';\nexport * from './selectors';\n","import React, {\n type ChangeEvent,\n type MouseEvent,\n useCallback,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { Button, SearchInput } from '@deephaven/components';\nimport { ObjectIcon } from '@deephaven/console';\nimport {\n vsArrowSmallDown,\n vsArrowSmallUp,\n vsPreview,\n vsRefresh,\n} from '@deephaven/icons';\nimport type { dh } from '@deephaven/jsapi-types';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport './WidgetList.scss';\n\nconst MINIMUM_DRAG_DISTANCE = 10;\n\n// When we're listening on the window, it emits a `globalThis.MouseEvent`\n// `WindowMouseEvent` is just a convenience alias\nexport type WindowMouseEvent = globalThis.MouseEvent;\n\nexport type SelectStartEvent = {\n x: number;\n y: number;\n widget: dh.ide.VariableDefinition;\n};\n\nexport interface WidgetListProps {\n onSelect: (widget: dh.ide.VariableDefinition, e?: WindowMouseEvent) => void;\n onExportLayout: () => void;\n onImportLayout: () => void;\n onResetLayout: () => void;\n widgets?: dh.ide.VariableDefinition[];\n}\n\n/**\n * Display a search field and a list of widgets, as well as layout export/import buttons.\n * @param props The widgets and handlers to use for this list\n * @returns A JSX element for the list of widgets, along with search\n */\nexport function WidgetList(props: WidgetListProps): JSX.Element {\n const {\n onExportLayout,\n onImportLayout,\n onResetLayout,\n onSelect,\n widgets = [],\n } = props;\n const [disableDoubleClick, setDisableDoubleClick] = useState(false);\n const [searchText, setSearchText] = useState('');\n const searchField = useRef<SearchInput>(null);\n const selectStartEvent = useRef<SelectStartEvent>();\n\n /**\n * Send object to be created, if an event is passed object\n * is treated as createDragSourceFromEvent in golden-layout\n * and uses the event as the starting location for the drag.\n * @param widget\n * @param event\n */\n const sendSelect = useCallback(\n (widget: dh.ide.VariableDefinition, event?: WindowMouseEvent) => {\n if (widget != null) onSelect(widget, event);\n },\n [onSelect]\n );\n\n const handleSearchChange = useCallback((e: ChangeEvent<HTMLInputElement>) => {\n setSearchText(e.target.value);\n }, []);\n\n const handleMouseMove = useCallback(\n (e: WindowMouseEvent) => {\n if (selectStartEvent.current == null) {\n return;\n }\n\n if (\n Math.abs(selectStartEvent.current.x - e.clientX) >=\n MINIMUM_DRAG_DISTANCE ||\n Math.abs(selectStartEvent.current.y - e.clientY) >=\n MINIMUM_DRAG_DISTANCE\n ) {\n setDisableDoubleClick(true);\n window.removeEventListener('mousemove', handleMouseMove);\n sendSelect(selectStartEvent.current.widget, e);\n selectStartEvent.current = undefined; // unset so mouseUp can't fire\n }\n },\n [selectStartEvent, sendSelect]\n );\n\n const handleMouseDown = useCallback(\n (e: MouseEvent, widget: dh.ide.VariableDefinition) => {\n selectStartEvent.current = {\n x: e.clientX,\n y: e.clientY,\n widget,\n };\n window.addEventListener('mousemove', handleMouseMove);\n },\n [handleMouseMove]\n );\n\n const handleMouseUp = useCallback(\n (e: MouseEvent, widget: dh.ide.VariableDefinition) => {\n window.removeEventListener('mousemove', handleMouseMove);\n\n // down and up need to occur on same object to constitute a click event\n if (selectStartEvent.current?.widget === widget) {\n setDisableDoubleClick(true);\n sendSelect(widget);\n }\n selectStartEvent.current = undefined;\n },\n [handleMouseMove, selectStartEvent, sendSelect]\n );\n\n const filteredWidgets = useMemo(\n () =>\n widgets.filter(widget =>\n searchText\n ? widget.name?.toLowerCase().includes(searchText.toLowerCase())\n : true\n ),\n [searchText, widgets]\n ).sort((a, b) => a.name?.localeCompare(b.name ?? '') ?? 0);\n\n const widgetElements = useMemo(\n () =>\n filteredWidgets.map(widget => (\n <li key={widget.name}>\n <Button\n kind=\"ghost\"\n data-testid={`panel-list-item-${widget.name ?? ''}-button`}\n onMouseDown={event => {\n handleMouseDown(event, widget);\n }}\n onMouseUp={event => {\n handleMouseUp(event, widget);\n }}\n onKeyDown={event => {\n if (event.key === 'Enter' || event.key === ' ') {\n sendSelect(widget);\n }\n }}\n disabled={disableDoubleClick}\n onClick={() => {\n // no-op: click is handled by onMouseDown and onMouseUp attributes\n }}\n >\n <ObjectIcon type={widget.type} /> {widget.name ?? ''}\n </Button>\n </li>\n )),\n [\n filteredWidgets,\n disableDoubleClick,\n handleMouseDown,\n handleMouseUp,\n sendSelect,\n ]\n );\n\n const errorElement = useMemo(\n () =>\n widgetElements.length === 0 ? (\n <span>No bound variables found.</span>\n ) : null,\n [widgetElements]\n );\n\n return (\n <div className=\"widget-list-container d-flex flex-column\">\n <div className=\"widget-list-header\">\n <SearchInput\n value={searchText}\n placeholder=\"Find Table, Plot or Widget\"\n onChange={handleSearchChange}\n ref={searchField}\n />\n </div>\n <ul className=\"widget-list flex-grow-1\">\n {errorElement && (\n <li className=\"widget-list-message\">{errorElement}</li>\n )}\n {!errorElement && widgetElements}\n </ul>\n <div>\n <hr />\n </div>\n <div className=\"widget-list-footer\">\n <Button kind=\"ghost\" onClick={onExportLayout}>\n <div className=\"fa-md fa-layers mr-1\">\n <FontAwesomeIcon\n mask={vsPreview}\n icon={vsArrowSmallDown}\n transform=\"right-5 down-5\"\n />\n <FontAwesomeIcon\n icon={vsArrowSmallDown}\n transform=\"right-8 down-6\"\n />\n </div>\n Export Layout\n </Button>\n <Button kind=\"ghost\" onClick={onImportLayout}>\n <div className=\"fa-md fa-layers mr-1\">\n <FontAwesomeIcon\n mask={vsPreview}\n icon={vsArrowSmallUp}\n transform=\"right-5 down-5\"\n />\n <FontAwesomeIcon icon={vsArrowSmallUp} transform=\"right-8 down-6\" />\n </div>\n Import Layout\n </Button>\n <Button\n kind=\"ghost\"\n icon={vsRefresh}\n onClick={onResetLayout}\n tooltip=\"Reset Layout\"\n />\n </div>\n </div>\n );\n}\n\nexport default WidgetList;\n","import React from 'react';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { Button } from '@deephaven/components';\nimport { vsArrowUp } from '@deephaven/icons';\nimport './EmptyDashboard.scss';\n\nexport interface EmptyDashboardProps {\n onAutoFillClick?: (event: React.MouseEvent) => void;\n}\n\nexport function EmptyDashboard({\n onAutoFillClick = () => undefined,\n}: EmptyDashboardProps): JSX.Element {\n return (\n <div className=\"empty-dashboard-container\">\n <div className=\"hint-container\">\n <FontAwesomeIcon icon={vsArrowUp} /> <br />\n Use the panel list to add objects from a query.\n </div>\n <div className=\"empty-dashboard\">\n <div className=\"add-panels-hint\">Drag Panels Here</div>\n <Button kind=\"tertiary\" onClick={onAutoFillClick}>\n Auto fill objects\n </Button>\n </div>\n </div>\n );\n}\n\nexport default EmptyDashboard;\n","import React, {\n type ClipboardEvent,\n type ChangeEvent,\n Component,\n type ReactElement,\n type RefObject,\n} from 'react';\nimport { flushSync } from 'react-dom';\nimport classNames from 'classnames';\nimport memoize from 'memoize-one';\nimport { connect } from 'react-redux';\nimport { type RouteComponentProps, withRouter } from 'react-router-dom';\nimport { nanoid } from 'nanoid';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport {\n ContextActions,\n GLOBAL_SHORTCUTS,\n NAVIGATION_SHORTCUTS,\n Popper,\n type ContextAction,\n Button,\n Logo,\n BasicModal,\n NavTabList,\n type NavTabItem,\n SlideTransition,\n LoadingOverlay,\n} from '@deephaven/components';\nimport { SHORTCUTS as IRIS_GRID_SHORTCUTS } from '@deephaven/iris-grid';\nimport {\n type CreateDashboardPayload,\n DashboardUtils,\n DEFAULT_DASHBOARD_ID,\n type DehydratedDashboardPanelProps,\n emitPanelOpen,\n getAllDashboardsData,\n getDashboardData,\n listenForCreateDashboard,\n listenForCloseDashboard,\n PanelEvent,\n setDashboardData as setDashboardDataAction,\n setDashboardPluginData as setDashboardPluginDataAction,\n updateDashboardData as updateDashboardDataAction,\n emitCycleToNextStack,\n emitCycleToPreviousStack,\n emitCycleToNextTab,\n emitCycleToPreviousTab,\n type DehydratedPanelProps,\n} from '@deephaven/dashboard';\nimport {\n ConsolePlugin,\n InputFilterEvent,\n MarkdownEvent,\n NotebookEvent,\n getDashboardSessionWrapper,\n ControlType,\n ToolType,\n getDashboardConnection,\n NotebookPanel,\n} from '@deephaven/dashboard-core-plugins';\nimport { vsGear, dhShapes, dhPanels, vsTerminal } from '@deephaven/icons';\nimport { getVariableDescriptor } from '@deephaven/jsapi-bootstrap';\nimport dh from '@deephaven/jsapi-shim';\nimport type { dh as DhType } from '@deephaven/jsapi-types';\nimport { type SessionConfig } from '@deephaven/jsapi-utils';\nimport Log from '@deephaven/log';\nimport {\n getActiveTool,\n getWorkspace,\n getUser,\n setActiveTool as setActiveToolAction,\n updateWorkspaceData as updateWorkspaceDataAction,\n getPlugins,\n type WorkspaceData,\n type RootState,\n type User,\n type ServerConfigValues,\n type CustomizableWorkspace,\n type DashboardData,\n} from '@deephaven/redux';\nimport {\n bindAllMethods,\n copyToClipboard,\n PromiseUtils,\n EMPTY_ARRAY,\n assertNotNull,\n} from '@deephaven/utils';\nimport type GoldenLayout from '@deephaven/golden-layout';\nimport type { ItemConfig, EventHub } from '@deephaven/golden-layout';\nimport { type PluginModuleMap, getDashboardPlugins } from '@deephaven/plugin';\nimport {\n AppDashboards,\n type LayoutStorage,\n UserLayoutUtils,\n createExportLogsContextAction,\n} from '@deephaven/app-utils';\nimport JSZip from 'jszip';\nimport SettingsMenu from '../settings/SettingsMenu';\nimport AppControlsMenu from './AppControlsMenu';\nimport { getLayoutStorage, getServerConfigValues } from '../redux';\nimport './AppMainContainer.scss';\nimport WidgetList, { type WindowMouseEvent } from './WidgetList';\nimport {\n getFormattedPluginInfo,\n getFormattedVersionInfo,\n} from '../settings/SettingsUtils';\nimport EmptyDashboard from './EmptyDashboard';\n\nenum CycleDirection {\n Next,\n Previous,\n}\n\nconst log = Log.module('AppMainContainer');\n\ntype InputFileFormat =\n | string\n | number[]\n | Uint8Array\n | ArrayBuffer\n | Blob\n | NodeJS.ReadableStream;\n\ninterface AppMainContainerProps {\n activeTool: string;\n allDashboardData: Record<string, DashboardData>;\n dashboardData: DashboardData;\n layoutStorage: LayoutStorage;\n match: {\n params: { notebookPath: string };\n };\n connection?: DhType.IdeConnection;\n session?: DhType.IdeSession;\n sessionConfig?: SessionConfig;\n setActiveTool: (tool: string) => void;\n setDashboardData: (id: string, data: DashboardData) => void;\n setDashboardPluginData: (\n dashboardId: string,\n pluginId: string,\n data: unknown\n ) => void;\n updateDashboardData: (id: string, data: Partial<DashboardData>) => void;\n updateWorkspaceData: (workspaceData: Partial<WorkspaceData>) => void;\n user: User;\n workspace: CustomizableWorkspace;\n plugins: PluginModuleMap;\n serverConfigValues: ServerConfigValues;\n}\n\ninterface AppMainContainerState {\n contextActions: ContextAction[];\n isPanelsMenuShown: boolean;\n isResetLayoutPromptShown: boolean;\n isSettingsMenuShown: boolean;\n unsavedNotebookCount: number;\n widgets: DhType.ide.VariableDefinition[];\n tabs: NavTabItem[];\n activeTabKey: string;\n\n // Number of times the layout has been re-initialized\n layoutIteration: number;\n}\n\nexport class AppMainContainer extends Component<\n AppMainContainerProps & RouteComponentProps,\n AppMainContainerState\n> {\n static handleWindowBeforeUnload(event: BeforeUnloadEvent): void {\n // in development, allow auto-reload\n if (import.meta.env.PROD) {\n event.preventDefault();\n // returnValue is required for beforeReload event prompt\n // https://developer.mozilla.org/en-US/docs/Web/API/WindowEventHandlers/onbeforeunload#example\n // eslint-disable-next-line no-param-reassign\n event.returnValue = '';\n }\n }\n\n static hydrateConsole(\n props: DehydratedPanelProps,\n id: string\n ): DehydratedDashboardPanelProps {\n return DashboardUtils.hydrate(\n {\n ...props,\n unzip: (zipFile: InputFileFormat) =>\n JSZip.loadAsync(zipFile).then(zip => Object.values(zip.files)),\n },\n id\n );\n }\n\n static handleRefresh(): void {\n log.info('Refreshing application');\n window.location.reload();\n }\n\n constructor(props: AppMainContainerProps & RouteComponentProps) {\n super(props);\n\n bindAllMethods(this);\n\n this.importElement = React.createRef();\n\n const { allDashboardData, serverConfigValues, plugins } = this.props;\n\n this.dashboardLayouts = new Map();\n this.createDashboardListenerRemovers = new Map();\n this.closeDashboardListenerRemovers = new Map();\n\n this.state = {\n contextActions: [\n createExportLogsContextAction(\n {\n uiVersion: import.meta.env.npm_package_version,\n userAgent: navigator.userAgent,\n ...Object.fromEntries(serverConfigValues),\n pluginInfo: getFormattedPluginInfo(plugins),\n },\n false // Not global to prevent conflict with export logs action with same shortcut in AppBootstrap.tsx\n ),\n {\n action: () => {\n // Copies the version info to the clipboard for easy pasting into a ticket\n const versionInfo = getFormattedVersionInfo(serverConfigValues);\n const versionInfoText = Object.entries(versionInfo)\n .map(([key, value]) => `${key}: ${value}`)\n .join('\\n');\n copyToClipboard(versionInfoText);\n },\n shortcut: GLOBAL_SHORTCUTS.COPY_VERSION_INFO,\n isGlobal: true,\n },\n {\n action: () => {\n this.handleToolSelect(ToolType.LINKER);\n },\n shortcut: GLOBAL_SHORTCUTS.LINKER,\n isGlobal: true,\n },\n {\n action: () => {\n // triggers clear all filters tab event, which in turn triggers a glEventhub event\n // widget panels can subscribe to his event, and execute their own clearing logic\n this.sendClearFilter();\n },\n shortcut: IRIS_GRID_SHORTCUTS.TABLE.CLEAR_ALL_FILTERS,\n isGlobal: true,\n },\n {\n action: () => {\n this.sendCycleStackForward();\n },\n shortcut: NAVIGATION_SHORTCUTS.CYCLE_TO_NEXT_STACK,\n isGlobal: true,\n },\n {\n action: () => {\n this.sendCycleStackBackward();\n },\n shortcut: NAVIGATION_SHORTCUTS.CYCLE_TO_PREVIOUS_STACK,\n isGlobal: true,\n },\n {\n action: () => {\n this.sendCycleTabForward();\n },\n shortcut: NAVIGATION_SHORTCUTS.CYCLE_TO_NEXT_TAB,\n isGlobal: true,\n },\n {\n action: () => {\n this.sendCycleTabBackward();\n },\n shortcut: NAVIGATION_SHORTCUTS.CYCLE_TO_PREVIOUS_TAB,\n isGlobal: true,\n },\n {\n action: () => {\n this.handleCycleDashboardForward();\n },\n shortcut: NAVIGATION_SHORTCUTS.CYCLE_TO_NEXT_DASHBOARD,\n isGlobal: true,\n },\n {\n action: () => {\n this.handleCycleDashboardBackward();\n },\n shortcut: NAVIGATION_SHORTCUTS.CYCLE_TO_PREVIOUS_DASHBOARD,\n isGlobal: true,\n },\n {\n action: () => {\n this.sendReopenLast();\n },\n shortcut: GLOBAL_SHORTCUTS.REOPEN_CLOSED_PANEL,\n isGlobal: true,\n },\n {\n action: () => {\n log.debug('Consume unhandled save shortcut');\n },\n shortcut: GLOBAL_SHORTCUTS.SAVE,\n isGlobal: true,\n },\n ],\n isPanelsMenuShown: false,\n isResetLayoutPromptShown: false,\n isSettingsMenuShown: false,\n unsavedNotebookCount: 0,\n widgets: [],\n tabs: Object.entries(allDashboardData).map(([key, value]) => ({\n key,\n title: value.title ?? 'Untitled',\n isClosable: key !== DEFAULT_DASHBOARD_ID,\n icon: key === DEFAULT_DASHBOARD_ID ? vsTerminal : undefined,\n })),\n activeTabKey: DEFAULT_DASHBOARD_ID,\n layoutIteration: 0,\n };\n }\n\n componentDidMount(): void {\n this.initWidgets();\n this.initDashboardData();\n\n window.addEventListener(\n 'beforeunload',\n AppMainContainer.handleWindowBeforeUnload\n );\n }\n\n componentDidUpdate(\n prevProps: AppMainContainerProps,\n prevState: AppMainContainerState\n ): void {\n const { dashboardData } = this.props;\n if (prevProps.dashboardData !== dashboardData) {\n this.handleDataChange(dashboardData);\n }\n }\n\n componentWillUnmount(): void {\n this.deinitWidgets();\n\n this.createDashboardListenerRemovers.forEach(rm => rm());\n this.closeDashboardListenerRemovers.forEach(rm => rm());\n\n window.removeEventListener(\n 'beforeunload',\n AppMainContainer.handleWindowBeforeUnload\n );\n }\n\n /** Map from the dashboard ID to the GoldenLayout instance for that dashboard */\n dashboardLayouts: Map<string, GoldenLayout>;\n\n /** Map from dashboard ID to remover functions for create dashboard listener */\n createDashboardListenerRemovers: Map<string, () => void>;\n\n /** Map from dashboard ID to remover functions for close dashboard listener */\n closeDashboardListenerRemovers: Map<string, () => void>;\n\n importElement: RefObject<HTMLInputElement>;\n\n widgetListenerRemover?: () => void;\n\n initWidgets(): void {\n const { connection } = this.props;\n if (connection == null) {\n return;\n }\n\n if (connection.subscribeToFieldUpdates == null) {\n log.warn(\n 'subscribeToFieldUpdates not supported, not initializing widgets'\n );\n return;\n }\n\n this.widgetListenerRemover = connection.subscribeToFieldUpdates(updates => {\n log.debug('Got updates', updates);\n this.setState(({ widgets }) => {\n const { updated, created, removed } = updates;\n\n // Remove from the array if it's been removed OR modified. We'll add it back after if it was modified.\n const widgetsToRemove = [...updated, ...removed];\n const newWidgets = widgets.filter(\n widget =>\n !widgetsToRemove.some(toRemove => toRemove.name === widget.name)\n );\n\n // Now add all the modified and updated widgets back in\n const widgetsToAdd = [...updated, ...created];\n widgetsToAdd.forEach(toAdd => {\n if (toAdd.name != null && toAdd.name !== '') {\n newWidgets.push(toAdd);\n }\n });\n\n return { widgets: newWidgets };\n });\n });\n }\n\n deinitWidgets(): void {\n this.widgetListenerRemover?.();\n }\n\n initDashboardData(): void {\n // TODO: #1746 We should be loading data from a dashboard storage store\n // For now only the default dashboard data is stored with the workspace and set on the default dashboard\n const { setDashboardPluginData, updateDashboardData, workspace } =\n this.props;\n const { data: workspaceData } = workspace;\n const { filterSets, links, pluginDataMap } = workspaceData;\n updateDashboardData(DEFAULT_DASHBOARD_ID, {\n filterSets,\n links,\n });\n if (pluginDataMap != null) {\n const pluginKeys = Object.keys(pluginDataMap);\n for (let i = 0; i < pluginKeys.length; i += 1) {\n const pluginId = pluginKeys[i];\n const pluginData = pluginDataMap[pluginId];\n log.debug('initDashboardData plugin data', pluginId, pluginData);\n setDashboardPluginData(DEFAULT_DASHBOARD_ID, pluginId, pluginData);\n }\n }\n }\n\n openNotebookFromURL(): void {\n const { match } = this.props;\n const { notebookPath } = match.params;\n\n if (notebookPath) {\n const { session, sessionConfig } = this.props;\n if (session == null || sessionConfig == null) {\n log.error('No session available to open notebook URL', notebookPath);\n return;\n }\n const fileMetadata = {\n id: `/${notebookPath}`,\n itemName: `/${notebookPath}`,\n };\n\n const language = sessionConfig.type;\n const notebookSettings = {\n value: null,\n language,\n };\n\n this.emitLayoutEvent(\n NotebookEvent.SELECT_NOTEBOOK,\n session,\n language,\n notebookSettings,\n fileMetadata,\n true\n );\n }\n }\n\n sendClearFilter(): void {\n this.emitLayoutEvent(InputFilterEvent.CLEAR_ALL_FILTERS);\n }\n\n sendCycleStackForward(): void {\n emitCycleToNextStack(this.getActiveEventHub());\n }\n\n sendCycleStackBackward(): void {\n emitCycleToPreviousStack(this.getActiveEventHub());\n }\n\n sendCycleTabForward(): void {\n emitCycleToNextTab(this.getActiveEventHub());\n }\n\n sendCycleTabBackward(): void {\n emitCycleToPreviousTab(this.getActiveEventHub());\n }\n\n sendReopenLast(): void {\n this.emitLayoutEvent(PanelEvent.REOPEN_LAST);\n }\n\n cycleDashboard(direction: CycleDirection): void {\n const { tabs, activeTabKey } = this.state;\n\n if (tabs.length <= 1) {\n return;\n }\n\n const currentIndex = tabs.findIndex(tab => tab.key === activeTabKey);\n if (currentIndex === -1) {\n return;\n }\n\n const targetIndex =\n direction === CycleDirection.Next\n ? (currentIndex + 1) % tabs.length\n : (currentIndex - 1 + tabs.length) % tabs.length;\n\n const targetTab = tabs[targetIndex];\n this.handleTabSelect(targetTab.key);\n }\n\n handleCycleDashboardForward(): void {\n this.cycleDashboard(CycleDirection.Next);\n }\n\n handleCycleDashboardBackward(): void {\n this.cycleDashboard(CycleDirection.Previous);\n }\n\n getActiveEventHub(): EventHub {\n const { activeTabKey } = this.state;\n const layout = this.dashboardLayouts.get(activeTabKey);\n assertNotNull(layout, 'No active layout found');\n return layout.eventHub;\n }\n\n emitLayoutEvent(event: string, ...args: unknown[]): void {\n this.getActiveEventHub().emit(event, ...args);\n }\n\n handleCancelResetLayoutPrompt(): void {\n this.setState({\n isResetLayoutPromptShown: false,\n });\n }\n\n handleConfirmResetLayoutPrompt(): void {\n this.setState({\n isResetLayoutPromptShown: false,\n });\n\n this.resetLayout();\n }\n\n // eslint-disable-next-line class-methods-use-this\n handleError(error: unknown): void {\n if (PromiseUtils.isCanceled(error)) {\n return;\n }\n log.error(error);\n }\n\n handleSettingsMenuHide(): void {\n this.setState({ isSettingsMenuShown: false });\n }\n\n handleSettingsMenuShow(): void {\n this.setState({ isSettingsMenuShown: true });\n }\n\n handleControlSelect(type: string, dragEvent: Event): void {\n log.debug('handleControlSelect', type);\n\n switch (type) {\n case ControlType.DROPDOWN_FILTER:\n this.emitLayoutEvent(InputFilterEvent.OPEN_DROPDOWN, {\n title: 'DropdownFilter',\n type,\n createNewStack: true,\n dragEvent,\n });\n break;\n case ControlType.INPUT_FILTER:\n this.emitLayoutEvent(InputFilterEvent.OPEN_INPUT, {\n title: 'InputFilter',\n type,\n createNewStack: true,\n dragEvent,\n });\n break;\n case ControlType.MARKDOWN:\n this.emitLayoutEvent(MarkdownEvent.OPEN, {\n title: 'Markdown',\n type,\n dragEvent,\n });\n break;\n case ControlType.FILTER_SET_MANAGER:\n this.emitLayoutEvent(InputFilterEvent.OPEN_FILTER_SET_MANAGER, {\n title: 'FilterSets',\n type,\n dragEvent,\n });\n break;\n default:\n throw new Error(`Unrecognized control type ${type}`);\n }\n }\n\n handleToolSelect(toolType: string): void {\n log.debug('handleToolSelect', toolType);\n\n const { activeTool, setActiveTool } = this.props;\n if (activeTool === toolType) {\n setActiveTool(ToolType.DEFAULT);\n } else {\n setActiveTool(toolType);\n }\n }\n\n handleClearFilter(): void {\n this.sendClearFilter();\n }\n\n handleDataChange(data: DashboardData): void {\n const { updateWorkspaceData } = this.props;\n\n // Only save the data that is serializable/we want to persist to the workspace\n const { closed, filterSets, links, pluginDataMap } = data;\n updateWorkspaceData({ closed, filterSets, links, pluginDataMap });\n }\n\n handleGoldenLayoutChange(newLayout: GoldenLayout): void {\n const { activeTabKey } = this.state;\n const oldLayout = this.dashboardLayouts.get(activeTabKey);\n if (oldLayout === newLayout) return;\n\n this.dashboardLayouts.set(activeTabKey, newLayout);\n\n if (oldLayout != null) {\n this.createDashboardListenerRemovers.get(activeTabKey)?.();\n this.closeDashboardListenerRemovers.get(activeTabKey)?.();\n }\n\n this.createDashboardListenerRemovers.set(\n activeTabKey,\n listenForCreateDashboard(newLayout.eventHub, this.handleCreateDashboard)\n );\n this.closeDashboardListenerRemovers.set(\n activeTabKey,\n listenForCloseDashboard(newLayout.eventHub, this.handleCloseDashboard)\n );\n }\n\n handleCreateDashboard({\n pluginId,\n title,\n data,\n }: CreateDashboardPayload): void {\n const newId = nanoid();\n const { setDashboardPluginData } = this.props;\n setDashboardPluginData(newId, pluginId, data);\n this.setState(({ tabs }) => {\n const existingTab = tabs.findIndex(\n ({ title: tabTitle }) => tabTitle === title\n );\n if (existingTab !== -1) {\n // Replace the existing tab\n return {\n tabs: tabs.map((tab, index) =>\n index === existingTab ? { key: newId, title } : tab\n ),\n activeTabKey: newId,\n };\n }\n return {\n tabs: [\n ...tabs,\n {\n key: newId,\n title,\n },\n ],\n activeTabKey: newId,\n };\n });\n }\n\n handleCloseDashboard(title: string): void {\n const { tabs } = this.state;\n const tab = tabs.find(t => t.title === title);\n if (tab != null) {\n this.handleTabClose(tab.key);\n }\n }\n\n handleWidgetMenuClick(): void {\n this.setState(({ isPanelsMenuShown }) => ({\n isPanelsMenuShown: !isPanelsMenuShown,\n }));\n }\n\n handleWidgetSelect(\n widget: DhType.ide.VariableDefinition,\n dragEvent?: WindowMouseEvent\n ): void {\n this.setState({ isPanelsMenuShown: false });\n\n log.debug('handleWidgetSelect', widget, dragEvent);\n\n this.openWidget(widget, dragEvent);\n }\n\n handleWidgetsMenuClose(): void {\n this.setState({ isPanelsMenuShown: false });\n }\n\n handleAutoFillClick(): void {\n const { widgets } = this.state;\n\n log.debug('handleAutoFillClick', widgets);\n\n const sortedWidgets = widgets.sort((a, b) =>\n a.title != null && b.title != null ? a.title.localeCompare(b.title) : 0\n );\n for (let i = 0; i < sortedWidgets.length; i += 1) {\n this.openWidget(sortedWidgets[i]);\n }\n }\n\n handleExportLayoutClick(): void {\n log.debug('handleExportLayoutClick');\n\n this.setState({ isPanelsMenuShown: false });\n\n try {\n const { workspace } = this.props;\n const { data } = workspace;\n const exportedConfig = UserLayoutUtils.exportLayout(data);\n\n log.debug('handleExportLayoutClick exportedConfig', exportedConfig);\n\n const blob = new Blob([JSON.stringify(exportedConfig)], {\n type: 'application/json',\n });\n const timestamp = dh.i18n.DateTimeFormat.format(\n 'yyyy-MM-dd-HHmmss',\n new Date()\n );\n const link = document.createElement('a');\n link.href = URL.createObjectURL(blob);\n link.download = `deephaven-app-layout-${timestamp}.json`;\n link.click();\n } catch (e) {\n log.error('Unable to export layout', e);\n }\n }\n\n handleImportLayoutClick(): void {\n log.debug('handleImportLayoutClick');\n\n this.setState({ isPanelsMenuShown: false });\n\n // Reset the file list on the import element, otherwise user won't be prompted again\n if (this.importElement.current != null) {\n this.importElement.current.value = '';\n this.importElement.current.click();\n }\n }\n\n handleResetLayoutClick(): void {\n log.debug('handleResetLayoutClick');\n\n this.setState({\n isPanelsMenuShown: false,\n isResetLayoutPromptShown: true,\n unsavedNotebookCount: NotebookPanel.unsavedNotebookCount(),\n });\n }\n\n handleImportLayoutFiles(event: ChangeEvent<HTMLInputElement>): void {\n event.stopPropagation();\n event.preventDefault();\n\n if (event.target.files != null) {\n this.importLayoutFile(event.target.files?.[0]);\n }\n }\n\n /**\n * Import the provided file and set it in the workspace data (which should then load it in the dashboard)\n * @param file JSON file to import\n */\n async importLayoutFile(file: File): Promise<void> {\n try {\n const { updateDashboardData, updateWorkspaceData } = this.props;\n const fileText = await file.text();\n const exportedLayout = JSON.parse(fileText);\n const { filterSets, layoutConfig, links, pluginDataMap } =\n UserLayoutUtils.normalizeLayout(exportedLayout);\n\n // When we import a layout, the previous Dashboard flushes changes on unmount.\n // If there were any pending changes, then the new layout is set in redux,\n // the old Dashboard unmounts and flushes its changes which resets the layout in redux,\n // and then the new Dashboard mounts with the old layout.\n flushSync(() => {\n updateWorkspaceData({ layoutConfig });\n updateDashboardData(DEFAULT_DASHBOARD_ID, {\n filterSets,\n links,\n pluginDataMap,\n });\n });\n this.setState(({ layoutIteration }) => ({\n layoutIteration: layoutIteration + 1,\n }));\n } catch (e) {\n log.error('Unable to import layout', e);\n }\n }\n\n /**\n * Resets the users layout to the default layout\n */\n async resetLayout(): Promise<void> {\n const { layoutStorage, session } = this.props;\n const { filterSets, layoutConfig, links } =\n await UserLayoutUtils.getDefaultLayout(\n layoutStorage,\n session !== undefined\n );\n\n const { updateDashboardData, updateWorkspaceData } = this.props;\n updateWorkspaceData({ layoutConfig });\n updateDashboardData(DEFAULT_DASHBOARD_ID, {\n filterSets,\n links,\n });\n }\n\n // eslint-disable-next-line class-methods-use-this\n handlePaste(event: ClipboardEvent<HTMLDivElement>): void {\n if (\n event.target instanceof HTMLElement &&\n event.target.closest('.monaco-editor')\n ) {\n // Skip if this is inside a monaco editor\n return;\n }\n\n const { clipboardData } = event;\n const pastedData = clipboardData.getData('Text');\n const replacedChars = /“|”/g;\n if (replacedChars.test(pastedData)) {\n event.preventDefault();\n event.stopPropagation();\n\n document.execCommand(\n 'insertText',\n false,\n pastedData.replace(replacedChars, '\"')\n );\n }\n }\n\n /**\n * Open a widget up, using a drag event if specified.\n * @param widget The widget to open\n * @param dragEvent The mouse drag event that trigger it, undefined if it was not triggered by a drag\n */\n openWidget(\n widget: DhType.ide.VariableDefinition,\n dragEvent?: WindowMouseEvent\n ): void {\n const { connection } = this.props;\n emitPanelOpen(this.getActiveEventHub(), {\n widget: getVariableDescriptor(widget),\n dragEvent,\n fetch: async () => connection?.getObject(widget),\n });\n }\n\n getDashboardPlugins = memoize((plugins: PluginModuleMap) =>\n getDashboardPlugins(plugins)\n );\n\n handleHomeClick(): void {\n this.handleTabSelect(DEFAULT_DASHBOARD_ID);\n }\n\n handleTabSelect(tabId: string): void {\n this.setState({ activeTabKey: tabId });\n }\n\n handleTabReorder(from: number, to: number): void {\n this.setState(({ tabs: oldTabs }) => {\n const newTabs = [...oldTabs];\n const [t] = newTabs.splice(from, 1);\n newTabs.splice(to, 0, t);\n return { tabs: newTabs };\n });\n }\n\n handleTabClose(tabId: string): void {\n // TODO: #1746 Do something to mark the dashboard as closed\n // Remove any dashboard data we no longer need to keep so\n // the dashboard data store doesn't grow unbounded\n this.setState(({ tabs: oldTabs, activeTabKey }) => {\n const newTabs = oldTabs.filter(tab => tab.key !== tabId);\n let newActiveTabKey = activeTabKey;\n if (activeTabKey === tabId && newTabs.length > 0) {\n const oldActiveTabIndex = oldTabs.findIndex(tab => tab.key === tabId);\n newActiveTabKey =\n oldActiveTabIndex < oldTabs.length - 1\n ? oldTabs[oldActiveTabIndex + 1].key\n : oldTabs[oldActiveTabIndex - 1].key;\n }\n\n if (newTabs.length === 0) {\n newActiveTabKey = DEFAULT_DASHBOARD_ID;\n }\n\n return { tabs: newTabs, activeTabKey: newActiveTabKey };\n });\n }\n\n getDashboards(): {\n id: string;\n layoutConfig: ItemConfig[];\n key?: string;\n }[] {\n const { layoutIteration, tabs } = this.state;\n const { allDashboardData, workspace } = this.props;\n const { data: workspaceData } = workspace;\n const { layoutConfig } = workspaceData;\n // TODO: #1746 Read the default dashboard layout from dashboardData instead of workspaceData\n return [\n {\n id: DEFAULT_DASHBOARD_ID,\n layoutConfig: layoutConfig as ItemConfig[],\n key: `${DEFAULT_DASHBOARD_ID}-${layoutIteration}`,\n },\n ...tabs\n .filter(tab => tab.key !== DEFAULT_DASHBOARD_ID)\n .map(tab => ({\n id: tab.key,\n layoutConfig: (allDashboardData[tab.key]?.layoutConfig ??\n EMPTY_ARRAY) as ItemConfig[],\n key: `${tab.key}-${layoutIteration}`,\n })),\n ];\n }\n\n render(): ReactElement {\n const { activeTool, plugins, user, serverConfigValues } = this.props;\n const { permissions } = user;\n const { canUsePanels } = permissions;\n const {\n contextActions,\n isPanelsMenuShown,\n isResetLayoutPromptShown,\n isSettingsMenuShown,\n unsavedNotebookCount,\n widgets,\n tabs,\n activeTabKey,\n } = this.state;\n const dashboardPlugins = this.getDashboardPlugins(plugins);\n\n return (\n <div\n className={classNames(\n 'app-main-tabs',\n 'w-100',\n 'h-100',\n 'd-flex',\n 'flex-column',\n activeTool ? `active-tool-${activeTool.toLowerCase()}` : ''\n )}\n onPaste={this.handlePaste}\n tabIndex={-1}\n >\n <div className=\"app-main-top-nav-menus\">\n <Logo className=\"ml-1\" style={{ maxHeight: '20px' }} />\n {/* Only show the Code Studio tab if there is also an open dashboard */}\n {tabs.length > 1 && (\n <div\n style={{\n flexShrink: 0,\n flexGrow: 1,\n flexBasis: 0,\n minWidth: 0,\n }}\n >\n <NavTabList\n tabs={tabs}\n activeKey={activeTabKey}\n onSelect={this.handleTabSelect}\n onReorder={this.handleTabReorder}\n onClose={this.handleTabClose}\n />\n </div>\n )}\n <div className=\"app-main-right-menu-buttons\">\n <Button\n kind=\"ghost\"\n className=\"btn-panels-menu\"\n icon={dhShapes}\n onClick={() => {\n // no-op: click is handled in `AppControlsMenu` (which uses a `DropdownMenu`)\n }}\n >\n Controls\n <AppControlsMenu\n handleControlSelect={this.handleControlSelect}\n handleToolSelect={this.handleToolSelect}\n onClearFilter={this.handleClearFilter}\n />\n </Button>\n {canUsePanels && (\n <Button\n kind=\"ghost\"\n className=\"btn-panels-menu btn-show-panels\"\n data-testid=\"app-main-panels-button\"\n onClick={this.handleWidgetMenuClick}\n icon={dhPanels}\n >\n Panels\n <Popper\n isShown={isPanelsMenuShown}\n className=\"panels-menu-popper\"\n onExited={this.handleWidgetsMenuClose}\n options={{\n placement: 'bottom',\n }}\n closeOnBlur\n interactive\n >\n <WidgetList\n widgets={widgets}\n onExportLayout={this.handleExportLayoutClick}\n onImportLayout={this.handleImportLayoutClick}\n onResetLayout={this.handleResetLayoutClick}\n onSelect={this.handleWidgetSelect}\n />\n </Popper>\n </Button>\n )}\n <Button\n kind=\"ghost\"\n className={classNames('btn-settings-menu', {\n 'text-warning':\n user.operateAs != null && user.operateAs !== user.name,\n })}\n onClick={this.handleSettingsMenuShow}\n icon={\n <span className=\"fa-layers\">\n <FontAwesomeIcon icon={vsGear} transform=\"grow-3\" />\n </span>\n }\n tooltip=\"User Settings\"\n />\n </div>\n </div>\n <AppDashboards\n dashboards={this.getDashboards()}\n activeDashboard={activeTabKey}\n onGoldenLayoutChange={this.handleGoldenLayoutChange}\n emptyDashboard={\n activeTabKey === DEFAULT_DASHBOARD_ID ? (\n <EmptyDashboard onAutoFillClick={this.handleAutoFillClick} />\n ) : (\n <LoadingOverlay data-testid=\"app-main-container-loading\" />\n )\n }\n plugins={[\n <ConsolePlugin\n key=\"ConsolePlugin\"\n hydrateConsole={AppMainContainer.hydrateConsole}\n notebooksUrl={\n new URL(\n `${import.meta.env.VITE_ROUTE_NOTEBOOKS}`,\n document.baseURI\n ).href\n }\n />,\n ...dashboardPlugins,\n ]}\n />\n <SlideTransition in={isSettingsMenuShown} mountOnEnter unmountOnExit>\n <SettingsMenu\n serverConfigValues={serverConfigValues}\n pluginData={plugins}\n onDone={this.handleSettingsMenuHide}\n user={user}\n />\n </SlideTransition>\n <ContextActions actions={contextActions} />\n <input\n ref={this.importElement}\n type=\"file\"\n accept=\".json\"\n style={{ display: 'none' }}\n onChange={this.handleImportLayoutFiles}\n data-testid=\"input-import-layout\"\n />\n <BasicModal\n confirmButtonText=\"Reset\"\n onConfirm={this.handleConfirmResetLayoutPrompt}\n onCancel={this.handleCancelResetLayoutPrompt}\n isConfirmDanger\n isOpen={isResetLayoutPromptShown}\n headerText={\n unsavedNotebookCount === 0\n ? 'Reset Layout'\n : 'Reset layout and discard unsaved changes'\n }\n bodyText={\n unsavedNotebookCount === 0\n ? 'Do you want to reset your layout? Your existing layout will be lost.'\n : 'Do you want to reset your layout? Any unsaved notebooks will be lost.'\n }\n />\n </div>\n );\n }\n}\n\nconst mapStateToProps = (\n state: RootState\n): Omit<\n AppMainContainerProps,\n | 'match'\n | 'setActiveTool'\n | 'updateDashboardData'\n | 'updateWorkspaceData'\n | 'setDashboardData'\n | 'setDashboardPluginData'\n> => ({\n activeTool: getActiveTool(state),\n allDashboardData: getAllDashboardsData(state),\n dashboardData: getDashboardData(state, DEFAULT_DASHBOARD_ID),\n layoutStorage: getLayoutStorage(state),\n plugins: getPlugins(state),\n connection: getDashboardConnection(state, DEFAULT_DASHBOARD_ID),\n session: getDashboardSessionWrapper(state, DEFAULT_DASHBOARD_ID)?.session,\n sessionConfig: getDashboardSessionWrapper(state, DEFAULT_DASHBOARD_ID)\n ?.config,\n user: getUser(state),\n workspace: getWorkspace(state),\n serverConfigValues: getServerConfigValues(state),\n});\n\nconst ConnectedAppMainContainer = connect(mapStateToProps, {\n setActiveTool: setActiveToolAction,\n setDashboardData: setDashboardDataAction,\n setDashboardPluginData: setDashboardPluginDataAction,\n updateDashboardData: updateDashboardDataAction,\n updateWorkspaceData: updateWorkspaceDataAction,\n})(withRouter(AppMainContainer));\n\nexport default ConnectedAppMainContainer;\n","import React, { type ReactElement } from 'react';\nimport { ToastContainer } from '@deephaven/components';\nimport AppMainContainer from './AppMainContainer';\n\nfunction App(): ReactElement {\n return (\n <div className=\"app\" data-testid=\"app-loaded\">\n <AppMainContainer />\n <ToastContainer />\n </div>\n );\n}\n\nexport default App;\n","import React, { useEffect, useState } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport {\n LoadingOverlay,\n Shortcut,\n ShortcutRegistry,\n} from '@deephaven/components';\nimport { DEFAULT_DASHBOARD_ID, setDashboardData } from '@deephaven/dashboard';\nimport {\n setDashboardConnection,\n setDashboardSessionWrapper,\n ToolType,\n} from '@deephaven/dashboard-core-plugins';\nimport { useApi, useClient } from '@deephaven/jsapi-bootstrap';\nimport { getSessionDetails, loadSessionWrapper } from '@deephaven/jsapi-utils';\nimport Log from '@deephaven/log';\nimport { PouchCommandHistoryStorage } from '@deephaven/pouch-storage';\nimport {\n getWorkspace,\n type RootState,\n setActiveTool,\n setApi,\n setCommandHistoryStorage,\n setFileStorage,\n setPlugins,\n setWorkspace,\n setDefaultWorkspaceSettings,\n setWorkspaceStorage,\n setServerConfigValues,\n setUser,\n} from '@deephaven/redux';\nimport {\n LocalWorkspaceStorage,\n GrpcFileStorage,\n GrpcLayoutStorage,\n useConnection,\n useServerConfig,\n useUser,\n} from '@deephaven/app-utils';\nimport { usePlugins } from '@deephaven/plugin';\nimport { setLayoutStorage } from '../redux/actions';\nimport App from './App';\n\nconst log = Log.module('AppInit');\n\n/**\n * Component that sets some default values needed\n */\nfunction AppInit(): JSX.Element {\n const api = useApi();\n const client = useClient();\n const connection = useConnection();\n const plugins = usePlugins();\n const serverConfig = useServerConfig();\n const user = useUser();\n const workspace = useSelector<RootState>(getWorkspace);\n const dispatch = useDispatch();\n\n // General error means the app is dead and is unlikely to recover\n const [error, setError] = useState<unknown>();\n\n useEffect(\n function setReduxPlugins() {\n dispatch(setPlugins(plugins));\n },\n [plugins, dispatch]\n );\n\n useEffect(\n function initApp() {\n async function loadApp(): Promise<void> {\n try {\n const sessionDetails = await getSessionDetails();\n const sessionWrapper = await loadSessionWrapper(\n api,\n connection,\n sessionDetails\n );\n\n const storageService = client.getStorageService();\n const layoutStorage = new GrpcLayoutStorage(\n storageService,\n import.meta.env.VITE_STORAGE_PATH_LAYOUTS ?? ''\n );\n const fileStorage = new GrpcFileStorage(\n api,\n storageService,\n import.meta.env.VITE_STORAGE_PATH_NOTEBOOKS ?? ''\n );\n\n const workspaceStorage = new LocalWorkspaceStorage(layoutStorage);\n const commandHistoryStorage = new PouchCommandHistoryStorage();\n\n const loadedWorkspace = await workspaceStorage.load({\n isConsoleAvailable: sessionWrapper !== undefined,\n });\n\n const { data } = loadedWorkspace;\n\n // Fill in settings that have not yet been set\n const { settings } = data;\n\n // Set any shortcuts that user has overridden on this platform\n const { shortcutOverrides = {} } = settings;\n const isMac = Shortcut.isMacPlatform;\n const platformOverrides = isMac\n ? shortcutOverrides.mac ?? {}\n : shortcutOverrides.windows ?? {};\n\n Object.entries(platformOverrides).forEach(([id, keyState]) => {\n ShortcutRegistry.get(id)?.setKeyState(keyState);\n });\n\n const dashboardData = {\n title: 'Code Studio',\n filterSets: data.filterSets,\n links: data.links,\n };\n\n dispatch(setApi(api));\n dispatch(setActiveTool(ToolType.DEFAULT));\n dispatch(setServerConfigValues(serverConfig));\n dispatch(setCommandHistoryStorage(commandHistoryStorage));\n dispatch(setDashboardData(DEFAULT_DASHBOARD_ID, dashboardData));\n dispatch(setFileStorage(fileStorage));\n dispatch(setLayoutStorage(layoutStorage));\n dispatch(setDashboardConnection(DEFAULT_DASHBOARD_ID, connection));\n if (sessionWrapper !== undefined) {\n dispatch(\n setDashboardSessionWrapper(DEFAULT_DASHBOARD_ID, sessionWrapper)\n );\n }\n dispatch(setUser(user));\n dispatch(setWorkspaceStorage(workspaceStorage));\n dispatch(setWorkspace(loadedWorkspace));\n dispatch(\n setDefaultWorkspaceSettings(\n LocalWorkspaceStorage.makeDefaultWorkspaceSettings(serverConfig)\n )\n );\n } catch (e) {\n log.error(e);\n setError(e);\n }\n }\n loadApp();\n },\n [api, client, connection, serverConfig, dispatch, user]\n );\n\n const isLoading = workspace == null && error == null;\n const isLoaded = !isLoading && error == null;\n const errorMessage = error != null ? `${error}` : null;\n\n return (\n <>\n {isLoaded && <App />}\n <LoadingOverlay\n data-testid=\"app-init-loading\"\n isLoading={isLoading && errorMessage == null}\n isLoaded={isLoaded}\n errorMessage={errorMessage}\n />\n </>\n );\n}\n\nexport default AppInit;\n","import React, { type ReactElement } from 'react';\nimport {\n BrowserRouter as Router,\n Route,\n Redirect,\n Switch,\n} from 'react-router-dom';\nimport AppInit from './AppInit';\n\nconst StyleGuideRoot = React.lazy(() => import('../styleguide/StyleGuideRoot'));\n\nconst baseURI = new URL(document.baseURI).pathname.replace(/\\/$/, '');\n\nfunction AppRouter(): ReactElement {\n return (\n <Router basename={baseURI}>\n <Switch>\n <Route exact path=\"/\" component={AppInit} />\n <Route\n path={`/${import.meta.env.VITE_ROUTE_NOTEBOOKS}:notebookPath+`}\n component={AppInit}\n />\n <Route path=\"/styleguide\" component={StyleGuideRoot} />\n <Redirect from=\"*\" to=\"/\" />\n </Switch>\n </Router>\n );\n}\n\nexport default AppRouter;\n","import React, { useEffect } from 'react';\nimport { MonacoUtils } from '@deephaven/console';\nimport { DownloadServiceWorkerUtils } from '@deephaven/iris-grid';\nimport MonacoWorker from 'monaco-editor/esm/vs/editor/editor.worker?worker';\nimport MonacoJsonWorker from 'monaco-editor/esm/vs/language/json/json.worker?worker';\nimport AppRouter from './main/AppRouter';\n\n// load addional css for playwright docker tests\nif (import.meta.env.VITE_PLAYWRIGHT_CSS === '1') {\n await import('./Playwright.css');\n}\n\nexport function AppRoot(): JSX.Element {\n useEffect(function init() {\n DownloadServiceWorkerUtils.register(\n new URL(\n `${import.meta.env.BASE_URL ?? ''}download/serviceWorker.js`,\n window.location.href\n )\n );\n\n MonacoUtils.init({\n getWorker: (id: string, label: string) => {\n if (label === 'json') {\n return new MonacoJsonWorker();\n }\n return new MonacoWorker();\n },\n });\n\n // disable annoying dnd-react warnings\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n window['__@hello-pangea/dnd-disable-dev-warnings'] = true;\n }, []);\n\n return <AppRouter />;\n}\n\nexport default AppRoot;\n"],"file":"assets/AppRoot-DwJuOWo6.js"}
|