@dexteel/mesf-core 7.10.1 → 7.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/.release-please-manifest.json +1 -1
  2. package/CHANGELOG.md +19 -0
  3. package/dist/MESFMain.d.ts +1 -1
  4. package/dist/account/login.d.ts +1 -1
  5. package/dist/account/models/login.models.d.ts +1 -0
  6. package/dist/components/navigation/Header.d.ts +1 -2
  7. package/dist/components/navigation/Navigation.d.ts +1 -2
  8. package/dist/index.d.ts +0 -1
  9. package/dist/index.esm.js +691 -3364
  10. package/dist/index.esm.js.map +1 -1
  11. package/dist/pages/trendings-v2/TrendingsPageV2.d.ts +2 -2
  12. package/dist/pages/trendings-v2/components/chart/components/TagFolderCustomNodeV2.d.ts +1 -1
  13. package/dist/pages/trendings-v2/components/chart/components/TagSearchInput.d.ts +1 -1
  14. package/dist/pages/trendings-v2/components/chart/components/TagsTreeModalV2.d.ts +1 -1
  15. package/dist/pages/{trendings/components/chart/components/modals/tagsTreeModal/ContextMenu → trendings-v2/components/chart/components/modals/tagsTreeModal}/ContextMenu.d.ts +1 -1
  16. package/dist/pages/{trendings → trendings-v2}/components/chart/components/modals/tagsTreeModal/CustomDragView.d.ts +1 -1
  17. package/dist/pages/{trendings/components/chart/components/modals/tagsTreeModal/ContextMenu/NewFolder/NewFolder.d.ts → trendings-v2/components/chart/components/modals/tagsTreeModal/NewFolderModal.d.ts} +1 -1
  18. package/dist/pages/{trendings/components/chart/components/modals/tagsTreeModal/ContextMenu/RemoveFolder/RemoveFolder.d.ts → trendings-v2/components/chart/components/modals/tagsTreeModal/RemoveFolderModal.d.ts} +1 -1
  19. package/dist/pages/trendings-v2/components/chart/context/TrendingContextV2.d.ts +1 -2
  20. package/dist/pages/trendings-v2/components/chart/hooks/useTagSearch.d.ts +1 -1
  21. package/dist/pages/trendings-v2/components/chart/models/TrendingModelsV2.d.ts +1 -0
  22. package/dist/pages/trendings-v2/components/chart/repository/TrendingRepositoryV2.d.ts +47 -1
  23. package/dist/pages/trendings-v2/components/chart/utils/buildTagsTree.d.ts +3 -0
  24. package/dist/pages/trendings-v2/components/chart/utils/calculateDateFromPeriod.d.ts +1 -1
  25. package/dist/pages/{trendings → trendings-v2}/components/chart/utils/dateNavigator.d.ts +1 -1
  26. package/package.json +1 -1
  27. package/dist/pages/trendings/TrendingsPage.d.ts +0 -3
  28. package/dist/pages/trendings/components/chart/DateComponent.d.ts +0 -6
  29. package/dist/pages/trendings/components/chart/TableComponent.d.ts +0 -14
  30. package/dist/pages/trendings/components/chart/Trending.d.ts +0 -9
  31. package/dist/pages/trendings/components/chart/components/CellComponent.d.ts +0 -11
  32. package/dist/pages/trendings/components/chart/components/ColorPicker.d.ts +0 -8
  33. package/dist/pages/trendings/components/chart/components/DraggableLineControl.d.ts +0 -11
  34. package/dist/pages/trendings/components/chart/components/modals/deleteViewModal/DeleteViewModal.d.ts +0 -9
  35. package/dist/pages/trendings/components/chart/components/modals/editViewModal/EditViewModal.d.ts +0 -9
  36. package/dist/pages/trendings/components/chart/components/modals/loadView/LoadViewModal.d.ts +0 -7
  37. package/dist/pages/trendings/components/chart/components/modals/saveAsView/SaveAsViewModal.d.ts +0 -7
  38. package/dist/pages/trendings/components/chart/components/modals/saveView/SaveViewModal.d.ts +0 -7
  39. package/dist/pages/trendings/components/chart/components/modals/tagsTreeModal/TagFolderCustomNode.d.ts +0 -20
  40. package/dist/pages/trendings/components/chart/components/modals/tagsTreeModal/TagSelectionModal.d.ts +0 -9
  41. package/dist/pages/trendings/components/chart/components/modals/tagsTreeModal/TagsTreeModal.d.ts +0 -9
  42. package/dist/pages/trendings/components/chart/context/TrendingContext.d.ts +0 -120
  43. package/dist/pages/trendings/components/chart/customOptionsComponent.d.ts +0 -10
  44. package/dist/pages/trendings/components/chart/hooks/useGetVerticalLinePlugin.d.ts +0 -2
  45. package/dist/pages/trendings/components/chart/hooks/useTagsDataTable.d.ts +0 -24
  46. package/dist/pages/trendings/components/chart/hooks/useUpdateCursorData.d.ts +0 -2
  47. package/dist/pages/trendings/components/chart/hooks/useXAxisDatePlugin.d.ts +0 -2
  48. package/dist/pages/trendings/components/chart/hooks/useYAxisPlugin.d.ts +0 -2
  49. package/dist/pages/trendings/components/chart/models/TagsTree.model.d.ts +0 -12
  50. package/dist/pages/trendings/components/chart/models/TrendingModels.d.ts +0 -65
  51. package/dist/pages/trendings/components/chart/models/scopes.model.d.ts +0 -1
  52. package/dist/pages/trendings/components/chart/repository/TrendingRepository.d.ts +0 -48
  53. package/dist/pages/trendings/components/chart/sections/chart/hooks/useChartOptions.d.ts +0 -105
  54. package/dist/pages/trendings/components/chart/sections/header.d.ts +0 -8
  55. package/dist/pages/trendings/components/chart/sections/trending-chart.d.ts +0 -12
  56. package/dist/pages/trendings/components/chart/utils/areRangeSimilar.d.ts +0 -2
  57. package/dist/pages/trendings/components/chart/utils/buildTagsTree.d.ts +0 -4
  58. package/dist/pages/trendings/components/chart/utils/calculateScales.d.ts +0 -4
  59. package/dist/pages/trendings/components/chart/utils/formatDateTimeToString.d.ts +0 -4
  60. package/dist/pages/trendings/components/chart/utils/formatTimeDiffWithMs.d.ts +0 -1
  61. package/dist/pages/trendings/components/chart/utils/timeDifference.d.ts +0 -1
  62. package/dist/pages/trendings/hooks/useTrendingQueries.d.ts +0 -15
  63. package/dist/pages/trendings/index.d.ts +0 -3
  64. package/dist/pages/trendings/reducers/trendings.reducer.d.ts +0 -115
  65. /package/dist/pages/{trendings → trendings-v2}/components/chart/utils/tagColors.d.ts +0 -0
package/dist/index.esm.js CHANGED
@@ -1,14 +1,14 @@
1
1
  import { HubConnectionBuilder, LogLevel } from '@microsoft/signalr';
2
2
  export * from '@microsoft/signalr';
3
3
  export { LicenseManager } from 'ag-grid-enterprise';
4
- import { styled, DialogTitle as DialogTitle$1, DialogContent as DialogContent$1, DialogActions as DialogActions$1, Grid2, Button, Box, MenuItem, ListItemIcon, createTheme, TextField, Alert as Alert$2, useTheme, InputAdornment, Popover, MenuList, ListItemText, alpha, Dialog as Dialog$1, Paper, List, ListItem, Chip, SvgIcon, Typography as Typography$1, Checkbox, IconButton as IconButton$1, CircularProgress, FormControl, FormHelperText, FormControlLabel, Snackbar, DialogContentText, Badge, InputLabel, Select, Input, Divider, Card, CardContent, CardActions, Collapse, Tooltip, CssBaseline, AppBar, Toolbar, Container, Menu, Switch, Hidden, Drawer, Grid, Accordion, AccordionSummary, AccordionDetails, Tabs, Tab, Autocomplete as Autocomplete$1, useMediaQuery, ListSubheader, ListItemButton, TableContainer, Table, TableHead, TableRow, TableCell, TableBody, debounce, StyledEngineProvider, ThemeProvider, ListItemSecondaryAction } from '@mui/material';
4
+ import { styled, DialogTitle as DialogTitle$1, DialogContent as DialogContent$1, DialogActions as DialogActions$1, Grid2, Button, Box, MenuItem, ListItemIcon, createTheme, TextField, Alert as Alert$2, useTheme, InputAdornment, Popover, MenuList, ListItemText, alpha, Dialog as Dialog$1, Paper, List, ListItem, Chip, SvgIcon, Typography as Typography$1, Checkbox, IconButton as IconButton$1, CircularProgress, FormControl, FormHelperText, FormControlLabel, Snackbar, DialogContentText, Badge, InputLabel, Select, Input, Divider, Card, CardContent, CardActions, Collapse, Tooltip, CssBaseline, AppBar, Toolbar, Container, Menu, Switch, Hidden, Drawer, Grid, Accordion, AccordionSummary, AccordionDetails, Tabs, Tab, Autocomplete as Autocomplete$1, useMediaQuery, ListSubheader, ListItemButton, StyledEngineProvider, ThemeProvider, ListItemSecondaryAction } from '@mui/material';
5
5
  import { useMutation, useQuery, useQueryClient, QueryClient, QueryClientProvider } from '@tanstack/react-query';
6
6
  import * as React from 'react';
7
7
  import React__default, { createContext, useContext, useRef, useState, useEffect, useCallback, useMemo, Component, lazy, Suspense } from 'react';
8
8
  import SearchIcon from '@mui/icons-material/Search';
9
9
  import { AgGridReact } from 'ag-grid-react';
10
10
  import { createPart, themeMaterial, provideGlobalGridOptions } from 'ag-grid-community';
11
- import { values, get, isEmpty, isNil, round, isNaN as isNaN$1, isNumber } from 'lodash-es';
11
+ import { values, get, isEmpty, isNil } from 'lodash-es';
12
12
  import { useForm, Controller } from 'react-hook-form';
13
13
  import { isAncestor, Tree, DndProvider as DndProvider$1 } from '@minoru/react-dnd-treeview';
14
14
  import { Alert as Alert$4, AlertTitle, Autocomplete } from '@mui/lab';
@@ -54,7 +54,6 @@ import { AdapterMoment } from '@mui/x-date-pickers/AdapterMoment';
54
54
  import { DndProvider } from 'react-dnd';
55
55
  import { HTML5Backend } from 'react-dnd-html5-backend';
56
56
  import MenuIcon from '@mui/icons-material/Menu';
57
- import ShowChartIcon from '@mui/icons-material/ShowChart';
58
57
  import { DateTimePicker as DateTimePicker$1 } from '@mui/x-date-pickers/DateTimePicker';
59
58
  import ClearAllIcon from '@mui/icons-material/ClearAll';
60
59
  import ExpandMoreIcon from '@mui/icons-material/ExpandMore';
@@ -63,14 +62,6 @@ import { Group as Group$1, Panel, Separator, useDefaultLayout } from 'react-resi
63
62
  import { LocalizationProvider as LocalizationProvider$1 } from '@mui/x-date-pickers/LocalizationProvider';
64
63
  import InsertChartIcon from '@mui/icons-material/InsertChart';
65
64
  import ReactECharts from 'echarts-for-react';
66
- import { _adapters, Chart, CategoryScale, LinearScale, PointElement, LineElement, Title, Tooltip as Tooltip$1, Legend, TimeScale } from 'chart.js';
67
- import zoomPlugin from 'chartjs-plugin-zoom';
68
- import SaveIcon from '@mui/icons-material/Save';
69
- import Button$1 from '@mui/material/Button';
70
- import Popover$1 from '@mui/material/Popover';
71
- import CreateIcon from '@mui/icons-material/Create';
72
- import ArrowDropDownIcon$1 from '@mui/icons-material/ArrowDropDown';
73
- import { Line } from 'react-chartjs-2';
74
65
  import MarkdownIt from 'markdown-it';
75
66
  import MdEditor, { PluginComponent } from 'react-markdown-editor-lite';
76
67
  import 'react-markdown-editor-lite/lib/index.css';
@@ -291,8 +282,8 @@ var HelmetDexteel = function (_a) {
291
282
 
292
283
  var e=[],t=[];function n(n,r){if(n&&"undefined"!=typeof document){var a,s=!0===r.prepend?"prepend":"append",d=!0===r.singleTag,i="string"==typeof r.container?document.querySelector(r.container):document.getElementsByTagName("head")[0];if(d){var u=e.indexOf(i);-1===u&&(u=e.push(i)-1,t[u]={}),a=t[u]&&t[u][s]?t[u][s]:t[u][s]=c();}else a=c();65279===n.charCodeAt(0)&&(n=n.substring(1)),a.styleSheet?a.styleSheet.cssText+=n:a.appendChild(document.createTextNode(n));}function c(){var e=document.createElement("style");if(e.setAttribute("type","text/css"),r.attributes)for(var t=Object.keys(r.attributes),n=0;n<t.length;n++)e.setAttribute(t[n],r.attributes[t[n]]);var a="prepend"===s?"afterbegin":"beforeend";return i.insertAdjacentElement(a,e),e}}
293
284
 
294
- var css$1 = ".lds-ring {\n\tdisplay: inline-block;\n\tposition: relative;\n\twidth: 80px;\n\theight: 80px;\n}\n.lds-ring div {\n\tbox-sizing: border-box;\n\tdisplay: block;\n\tposition: absolute;\n\twidth: 64px;\n\theight: 64px;\n\tmargin: 8px;\n\tborder: 5px solid rgb(63, 81, 181);\n\tborder-radius: 50%;\n\tanimation: lds-ring 1.2s cubic-bezier(0.5, 0, 0.5, 1) infinite;\n\tborder-color: rgb(63, 81, 181) transparent transparent transparent;\n}\n.lds-ring div:nth-child(1) {\n\tanimation-delay: -0.45s;\n}\n.lds-ring div:nth-child(2) {\n\tanimation-delay: -0.3s;\n}\n.lds-ring div:nth-child(3) {\n\tanimation-delay: -0.15s;\n}\n@keyframes lds-ring {\n\t0% {\n\t\ttransform: rotate(0deg);\n\t}\n\t100% {\n\t\ttransform: rotate(360deg);\n\t}\n}\n";
295
- n(css$1,{});
285
+ var css = ".lds-ring {\n\tdisplay: inline-block;\n\tposition: relative;\n\twidth: 80px;\n\theight: 80px;\n}\n.lds-ring div {\n\tbox-sizing: border-box;\n\tdisplay: block;\n\tposition: absolute;\n\twidth: 64px;\n\theight: 64px;\n\tmargin: 8px;\n\tborder: 5px solid rgb(63, 81, 181);\n\tborder-radius: 50%;\n\tanimation: lds-ring 1.2s cubic-bezier(0.5, 0, 0.5, 1) infinite;\n\tborder-color: rgb(63, 81, 181) transparent transparent transparent;\n}\n.lds-ring div:nth-child(1) {\n\tanimation-delay: -0.45s;\n}\n.lds-ring div:nth-child(2) {\n\tanimation-delay: -0.3s;\n}\n.lds-ring div:nth-child(3) {\n\tanimation-delay: -0.15s;\n}\n@keyframes lds-ring {\n\t0% {\n\t\ttransform: rotate(0deg);\n\t}\n\t100% {\n\t\ttransform: rotate(360deg);\n\t}\n}\n";
286
+ n(css,{});
296
287
 
297
288
  var LazyLoading = function () {
298
289
  return (React__default.createElement(React__default.Fragment, null,
@@ -3330,7 +3321,7 @@ var useAssetOptionsFunctions = function (_a) {
3330
3321
  };
3331
3322
  };
3332
3323
 
3333
- var customStyles$2 = "\n ul, ol {\n list-style-type: none;\n margin: 0;\n padding: 0;\n }\n";
3324
+ var customStyles$1 = "\n ul, ol {\n list-style-type: none;\n margin: 0;\n padding: 0;\n }\n";
3334
3325
  var CustomNode = function (_a) {
3335
3326
  var openAssets = _a.openAssets, setOpenAssets = _a.setOpenAssets, setContextMenuOver = _a.setContextMenuOver, onDoubleClick = _a.onDoubleClick; _a.testIdPrefix; var isSelected = _a.isSelected, props = __rest(_a, ["openAssets", "setOpenAssets", "setContextMenuOver", "onDoubleClick", "testIdPrefix", "isSelected"]);
3336
3327
  var _c = props.node, id = _c.id, droppable = _c.droppable, data = _c.data;
@@ -3384,7 +3375,7 @@ var CustomNode = function (_a) {
3384
3375
  listStyleType: "none",
3385
3376
  backgroundColor: isSelected ? "#e8f0fe" : "",
3386
3377
  }, style: { paddingInlineStart: indent }, "data-node-id": id, onClick: handleClick, title: "".concat(props.node.id, " - ").concat(props.node.text) },
3387
- React__default.createElement("style", null, customStyles$2),
3378
+ React__default.createElement("style", null, customStyles$1),
3388
3379
  props.node.droppable ? (React__default.createElement(Box, { sx: {
3389
3380
  alignItems: "center",
3390
3381
  cursor: "pointer",
@@ -7271,26 +7262,44 @@ var LoginWithAzureAD = function (_a) {
7271
7262
  };
7272
7263
 
7273
7264
  function Login(_a) {
7274
- var authConfig = _a.authConfig;
7265
+ var authConfig = _a.authConfig, initialError = _a.initialError;
7275
7266
  var params = useRef(new URL(document.location).searchParams);
7276
7267
  var _b = useState(false), open = _b[0], setOpen = _b[1];
7277
7268
  var _c = useState(""), message = _c[0], setMessage = _c[1];
7269
+ var _d = useState("info"), severity = _d[0], setSeverity = _d[1];
7278
7270
  var useEmailAndPassword = get(authConfig, "useEmailAndPassword", true);
7279
7271
  var useAzureAD = get(authConfig, "useAzureAD", false);
7280
7272
  var useWindowsAuth = get(authConfig, "useWindowsAuth", false);
7281
7273
  var guestIsEnabled = get(authConfig, "guestIsEnabled", false);
7274
+ var getBase = function () { var _a; return ((_a = document.getElementsByTagName("base")[0]) === null || _a === void 0 ? void 0 : _a.getAttribute("href")) || "/"; };
7282
7275
  var handleClose = function () {
7283
7276
  setOpen(false);
7284
- params.current.delete("message");
7285
- var newUrl = window.location.origin + "?" + params.current.toString();
7277
+ // Read current URL params (not the ref) to preserve redirectTo
7278
+ var currentParams = new URL(document.location).searchParams;
7279
+ currentParams.delete("message");
7280
+ currentParams.delete("error");
7281
+ var base = getBase();
7282
+ var queryString = currentParams.toString();
7283
+ var newUrl = "".concat(window.location.origin).concat(base).concat(queryString ? "?".concat(queryString) : "");
7286
7284
  window.history.replaceState({ path: newUrl }, "", newUrl);
7287
7285
  };
7288
7286
  useEffect(function () {
7289
- if (params.current.has("message")) {
7287
+ if (initialError) {
7288
+ setMessage(initialError);
7289
+ setSeverity("error");
7290
+ setOpen(true);
7291
+ }
7292
+ else if (params.current.has("error")) {
7293
+ setMessage(params.current.get("error"));
7294
+ setSeverity("error");
7295
+ setOpen(true);
7296
+ }
7297
+ else if (params.current.has("message")) {
7290
7298
  setMessage(params.current.get("message"));
7299
+ setSeverity("info");
7291
7300
  setOpen(true);
7292
7301
  }
7293
- }, [params.toString()]);
7302
+ }, [initialError]);
7294
7303
  return (React__default.createElement(Box, { sx: {
7295
7304
  minHeight: "100vh",
7296
7305
  backgroundImage: "linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%)",
@@ -7384,9 +7393,10 @@ function Login(_a) {
7384
7393
  useAzureAD && (React__default.createElement(LoginWithAzureAD, { config: authConfig.AzureConfig })),
7385
7394
  guestIsEnabled && React__default.createElement(LoginAsGuest, null))))))))),
7386
7395
  React__default.createElement(Snackbar, { open: open, autoHideDuration: 6000, onClose: handleClose, anchorOrigin: { vertical: "bottom", horizontal: "center" } },
7387
- React__default.createElement(Alert$4, { onClose: handleClose, severity: "info", variant: "filled" }, message))));
7396
+ React__default.createElement(Alert$4, { onClose: handleClose, severity: severity, variant: "filled" }, message))));
7388
7397
  }
7389
7398
 
7399
+ var getBase = function () { var _a; return ((_a = document.getElementsByTagName("base")[0]) === null || _a === void 0 ? void 0 : _a.getAttribute("href")) || "/"; };
7390
7400
  var AuthProvider = function (_a) {
7391
7401
  var children = _a.children, authConfig = _a.authConfig;
7392
7402
  var useTokenHook = useToken();
@@ -7397,18 +7407,42 @@ var AuthProvider = function (_a) {
7397
7407
  };
7398
7408
  var Authenticated = function (_a) {
7399
7409
  var children = _a.children;
7410
+ var redirectTo = new URL(document.location).searchParams.get("redirectTo");
7411
+ useEffect(function () {
7412
+ if (redirectTo) {
7413
+ window.location.href = decodeURIComponent(redirectTo);
7414
+ }
7415
+ }, []);
7416
+ if (redirectTo) {
7417
+ return null;
7418
+ }
7400
7419
  return React__default.createElement(React__default.Fragment, null, children);
7401
7420
  };
7402
7421
  var Unauthenticated = function (_a) {
7403
7422
  var authConfig = _a.authConfig;
7404
7423
  var clearUserData = useContext(AuthContext).clearUserData;
7405
- var params = useRef(new URL(document.location).searchParams);
7424
+ var currentUrl = new URL(document.location);
7425
+ var base = getBase();
7426
+ var basePath = base.endsWith("/") ? base.slice(0, -1) : base;
7427
+ var isRootPath = currentUrl.pathname === "/" ||
7428
+ currentUrl.pathname === base ||
7429
+ currentUrl.pathname === basePath;
7430
+ var hasRedirectTo = currentUrl.searchParams.has("redirectTo");
7431
+ var shouldShowError = !isRootPath && !hasRedirectTo;
7406
7432
  useEffect(function () {
7407
7433
  clearUserData();
7408
- var newUrl = window.location.origin + "?" + params.current.toString();
7409
- window.history.replaceState({ path: newUrl }, "", newUrl);
7434
+ if (shouldShowError) {
7435
+ var fullPath = currentUrl.pathname + currentUrl.search;
7436
+ var newParams = new URLSearchParams();
7437
+ newParams.set("redirectTo", fullPath);
7438
+ newParams.set("error", "Session expired. Please log in to continue");
7439
+ var newUrl = "".concat(window.location.origin).concat(base, "?").concat(newParams.toString());
7440
+ window.history.replaceState({ path: newUrl }, "", newUrl);
7441
+ }
7410
7442
  }, []);
7411
- return React__default.createElement(Login, { authConfig: authConfig });
7443
+ return (React__default.createElement(Login, { authConfig: authConfig, initialError: shouldShowError
7444
+ ? "Session expired. Please log in to continue"
7445
+ : undefined }));
7412
7446
  };
7413
7447
 
7414
7448
  function Logout() {
@@ -7506,7 +7540,7 @@ var TimeAndUserMenu = function () {
7506
7540
 
7507
7541
  var ButtonWithLoading = function (_a) {
7508
7542
  var children = _a.children, isLoading = _a.isLoading, props = __rest(_a, ["children", "isLoading"]);
7509
- return (React__default.createElement(Button, __assign({}, props, { disabled: isLoading }),
7543
+ return (React__default.createElement(Button, __assign({}, props, { disabled: isLoading || props.disabled }),
7510
7544
  isLoading && React__default.createElement(CircularProgress, { size: "1rem" }),
7511
7545
  children));
7512
7546
  };
@@ -10526,11 +10560,11 @@ var AreaSelector$1 = lazy(function () {
10526
10560
  default: mod.AreaSelector,
10527
10561
  }); });
10528
10562
  });
10529
- function Header$1(_a) {
10530
- var _b = _a.showAreaSelector, showAreaSelector = _b === void 0 ? false : _b, _c = _a.showTrendingsIcon, showTrendingsIcon = _c === void 0 ? true : _c, _d = _a.showTrendingsV2Icon, showTrendingsV2Icon = _d === void 0 ? true : _d, _e = _a.navbarTitle, navbarTitle = _e === void 0 ? "MESF" : _e;
10531
- var _f = useState(""), error = _f[0], setError = _f[1];
10563
+ function Header(_a) {
10564
+ var _b = _a.showAreaSelector, showAreaSelector = _b === void 0 ? false : _b, _c = _a.showTrendingsV2Icon, showTrendingsV2Icon = _c === void 0 ? true : _c, _d = _a.navbarTitle, navbarTitle = _d === void 0 ? "MESF" : _d;
10565
+ var _e = useState(""), error = _e[0], setError = _e[1];
10532
10566
  var CustomNavbar = useContext(NavbarContext);
10533
- var _g = useState(false), drawerOpen = _g[0], setDrawerOpen = _g[1];
10567
+ var _f = useState(false), drawerOpen = _f[0], setDrawerOpen = _f[1];
10534
10568
  var hasPermissionTo = useHasPermission();
10535
10569
  useUserContext().state.userLogged;
10536
10570
  var handleDrawerToggle = function () {
@@ -10588,9 +10622,6 @@ function Header$1(_a) {
10588
10622
  alignItems: "center",
10589
10623
  color: "white",
10590
10624
  } },
10591
- showTrendingsIcon && (React__default.createElement(Tooltip, { title: "Trendings", placement: "bottom", arrow: true, enterDelay: 1500 },
10592
- React__default.createElement(IconButton$1, { color: "inherit", component: Link, to: "/trendings" },
10593
- React__default.createElement(ShowChartIcon, null)))),
10594
10625
  showTrendingsV2Icon && (React__default.createElement(Tooltip, { title: "Trendings V2 (ECharts)", placement: "bottom", arrow: true, enterDelay: 1500 },
10595
10626
  React__default.createElement(IconButton$1, { color: "inherit", component: Link, to: "/trendings-v2" },
10596
10627
  React__default.createElement(Timeline, null)))),
@@ -11629,45 +11660,7 @@ var Configuration = function () {
11629
11660
  React__default.createElement(route.main, null)) })); })))));
11630
11661
  };
11631
11662
 
11632
- var tagColors$1 = [
11633
- "#00AA00", // green
11634
- "#0000FF", // blue
11635
- "#FF0000", // red
11636
- "#9C27B0", // purple
11637
- "#FFA500", // orange
11638
- "#397234", // forest green
11639
- "#283F23", // dark olive
11640
- "#3F2617", // dark brown
11641
- "#0B0F08", // charcoal black
11642
- "#889c2dff", // olive green
11643
- "#B78449", // tan brown
11644
- "#5D9F96", // teal
11645
- "#1d5e74ff", // dark teal
11646
- "#FA7305", // bright orange
11647
- "#072684", // navy blue
11648
- "#269473ff", // emerald green
11649
- "#5d74b9ff", // slate blue
11650
- "#0C8EF4", // sky blue
11651
- "#8d481cff", // rust brown
11652
- "#2B384C", // dark slate
11653
- ];
11654
- var availableColors = __spreadArray([], tagColors$1, true);
11655
- var lastColor = null;
11656
- var getRandomColor = function () {
11657
- if (availableColors.length === 0) {
11658
- availableColors = __spreadArray([], tagColors$1, true);
11659
- if (lastColor && availableColors.length > 1) {
11660
- availableColors.splice(availableColors.indexOf(lastColor), 1);
11661
- }
11662
- }
11663
- var randomIndex = Math.floor(Math.random() * availableColors.length);
11664
- var color = availableColors[randomIndex];
11665
- availableColors.splice(randomIndex, 1);
11666
- lastColor = color;
11667
- return color;
11668
- };
11669
-
11670
- var TrendingContext$1 = createContext(undefined);
11663
+ var TrendingContext = createContext(undefined);
11671
11664
  var getDefaultTimeScope = function () {
11672
11665
  var end = new Date();
11673
11666
  var start = new Date(end.getTime() - 8 * 60 * 60 * 1000); // 8 hours ago
@@ -11818,10 +11811,10 @@ var TrendingProviderV2 = function (_a) {
11818
11811
  state: state,
11819
11812
  actions: actions,
11820
11813
  }); }, [state, actions]);
11821
- return (React__default.createElement(TrendingContext$1.Provider, { value: value }, children));
11814
+ return (React__default.createElement(TrendingContext.Provider, { value: value }, children));
11822
11815
  };
11823
11816
  var useTrendingContextV2 = function () {
11824
- var context = useContext(TrendingContext$1);
11817
+ var context = useContext(TrendingContext);
11825
11818
  if (!context) {
11826
11819
  throw new Error("useTrendingContextV2 must be used within TrendingProviderV2");
11827
11820
  }
@@ -12123,39 +12116,6 @@ var deleteAllViewTagsFromView = function (ViewId) { return __awaiter(void 0, voi
12123
12116
  });
12124
12117
  }); };
12125
12118
 
12126
- var dateNavigator = function (startDate, endDate, scope, operator, current) {
12127
- if (current === void 0) { current = false; }
12128
- var newStartDate;
12129
- var newEndDate = endDate;
12130
- if (current) {
12131
- newEndDate = new Date();
12132
- if (scope === "custom") {
12133
- // If scope is custom, keep the same startDate
12134
- newStartDate = startDate;
12135
- }
12136
- else {
12137
- var _a = scope.split(" "), quantity = _a[0], duration = _a[1];
12138
- newStartDate = moment$f(newEndDate)
12139
- .subtract(quantity, duration[0])
12140
- .toDate();
12141
- }
12142
- }
12143
- else {
12144
- if (scope === "custom") {
12145
- var durationInMs = moment$f(endDate).diff(moment$f(startDate));
12146
- newStartDate = moment$f(startDate)[operator](durationInMs).toDate();
12147
- }
12148
- else {
12149
- var _b = scope.split(" "), quantity = _b[0], duration = _b[1];
12150
- newStartDate = moment$f(startDate)[operator](quantity, duration[0])
12151
- .toDate();
12152
- newEndDate = moment$f(endDate)[operator](quantity, duration[0])
12153
- .toDate();
12154
- }
12155
- }
12156
- return { newStartDate: newStartDate, newEndDate: newEndDate };
12157
- };
12158
-
12159
12119
  var ConfirmationDialogRaw = function (_a) {
12160
12120
  var title = _a.title, message = _a.message, open = _a.open, onClose = _a.onClose, suffixTitle = _a.suffixTitle, other = __rest(_a, ["title", "message", "open", "onClose", "suffixTitle"]);
12161
12121
  var handleCancel = function () {
@@ -12561,6 +12521,39 @@ var calculateCounterpartDate = function (changedDate, changedField, scope) {
12561
12521
  }
12562
12522
  };
12563
12523
 
12524
+ var dateNavigator = function (startDate, endDate, scope, operator, current) {
12525
+ if (current === void 0) { current = false; }
12526
+ var newStartDate;
12527
+ var newEndDate = endDate;
12528
+ if (current) {
12529
+ newEndDate = new Date();
12530
+ if (scope === "custom") {
12531
+ // If scope is custom, keep the same startDate
12532
+ newStartDate = startDate;
12533
+ }
12534
+ else {
12535
+ var _a = scope.split(" "), quantity = _a[0], duration = _a[1];
12536
+ newStartDate = moment$f(newEndDate)
12537
+ .subtract(quantity, duration[0])
12538
+ .toDate();
12539
+ }
12540
+ }
12541
+ else {
12542
+ if (scope === "custom") {
12543
+ var durationInMs = moment$f(endDate).diff(moment$f(startDate));
12544
+ newStartDate = moment$f(startDate)[operator](durationInMs).toDate();
12545
+ }
12546
+ else {
12547
+ var _b = scope.split(" "), quantity = _b[0], duration = _b[1];
12548
+ newStartDate = moment$f(startDate)[operator](quantity, duration[0])
12549
+ .toDate();
12550
+ newEndDate = moment$f(endDate)[operator](quantity, duration[0])
12551
+ .toDate();
12552
+ }
12553
+ }
12554
+ return { newStartDate: newStartDate, newEndDate: newEndDate };
12555
+ };
12556
+
12564
12557
  var HeaderSectionV2 = React__default.memo(function (_a) {
12565
12558
  var autoRefresh = _a.autoRefresh, setAutoRefresh = _a.setAutoRefresh, setChartOptions = _a.setChartOptions, chartInstance = _a.chartInstance;
12566
12559
  var queryClient = useQueryClient();
@@ -12891,7 +12884,7 @@ var HeaderSectionV2 = React__default.memo(function (_a) {
12891
12884
  });
12892
12885
  HeaderSectionV2.displayName = "HeaderSectionV2";
12893
12886
 
12894
- var tagColors = [
12887
+ var tagColors$1 = [
12895
12888
  "#5eaf60", // light green
12896
12889
  "green", // green
12897
12890
  "#62bd9c", // turquoise green
@@ -12960,7 +12953,7 @@ var ColorPickerV2 = function (_a) {
12960
12953
  flexWrap: "wrap",
12961
12954
  padding: "10px",
12962
12955
  maxWidth: "165px",
12963
- } }, tagColors.map(function (tagColor) { return (React__default.createElement(ColorSwatch, { key: tagColor, color: tagColor, onSelect: handleColorSelect })); })))));
12956
+ } }, tagColors$1.map(function (tagColor) { return (React__default.createElement(ColorSwatch, { key: tagColor, color: tagColor, onSelect: handleColorSelect })); })))));
12964
12957
  };
12965
12958
 
12966
12959
  var NotificationSnackBar = function (_a) {
@@ -12979,274 +12972,88 @@ var NotificationSnackBar = function (_a) {
12979
12972
  React__default.createElement(Alert$3, { elevation: 6, variant: "filled", severity: severity, onClose: handleClose }, message)));
12980
12973
  };
12981
12974
 
12982
- var NewFolderModal = function (_a) {
12983
- var open = _a.open, handleClose = _a.handleClose, tagNodeSelectedInTree = _a.tagNodeSelectedInTree;
12984
- var _b = useState(), name = _b[0], setName = _b[1];
12985
- var _c = useState(""), error = _c[0], setError = _c[1];
12986
- var _d = useState(false), isLoading = _d[0], setIsLoading = _d[1];
12987
- var updateTagFolder = useMutation({
12988
- mutationFn: upsertTagFolder,
12989
- onError: function (error) {
12990
- setError(error.message);
12991
- },
12975
+ function buildTagsTreeV2(data) {
12976
+ var tagsForTree = [];
12977
+ data.forEach(function (el) {
12978
+ var tagForTree = {
12979
+ id: el.TagId,
12980
+ parent: el.ParentTagFolderId || 0,
12981
+ text: el.TagName,
12982
+ data: el,
12983
+ droppable: el.TagTypeCode === "F",
12984
+ };
12985
+ return tagsForTree.push(tagForTree);
12992
12986
  });
12993
- var onSubmit = function (e) { return __awaiter(void 0, void 0, void 0, function () {
12994
- var parentId, parentTagId;
12987
+ return tagsForTree;
12988
+ }
12989
+
12990
+ var customStyles = "\n ul, ol {\n list-style-type: none;\n margin: 0;\n padding: 0;\n }\n";
12991
+ var TagFolderCustomNodeV2 = function (_a) {
12992
+ var _b, _c, _d, _e, _f, _g, _h, _j;
12993
+ var node = _a.node, _k = _a.options, depth = _k.depth, isOpen = _k.isOpen, onToggle = _k.onToggle, containerRef = _k.containerRef, options = _a.options, setOpenTagFolders = _a.setOpenTagFolders, openTagFolders = _a.openTagFolders, handleSelect = _a.handleSelect, setContextMenuOver = _a.setContextMenuOver, isSelected = _a.isSelected;
12994
+ var onClickHandler = function () {
12995
12995
  var _a;
12996
- return __generator(this, function (_b) {
12997
- switch (_b.label) {
12998
- case 0:
12999
- e.preventDefault();
13000
- parentId = Number(tagNodeSelectedInTree === null || tagNodeSelectedInTree === void 0 ? void 0 : tagNodeSelectedInTree.parent) || null;
13001
- parentTagId = ((_a = tagNodeSelectedInTree === null || tagNodeSelectedInTree === void 0 ? void 0 : tagNodeSelectedInTree.data) === null || _a === void 0 ? void 0 : _a.TagTypeCode) === "F"
13002
- ? Number(tagNodeSelectedInTree.id)
13003
- : parentId;
13004
- setIsLoading(true);
13005
- if (!name) return [3 /*break*/, 2];
13006
- return [4 /*yield*/, updateTagFolder.mutate({
13007
- tagFolderId: null,
13008
- parentTagFolderId: parentTagId,
13009
- tagFolderName: name,
13010
- isActive: true,
13011
- })];
13012
- case 1:
13013
- _b.sent();
13014
- _b.label = 2;
13015
- case 2:
13016
- handleClose(true);
13017
- setName("");
13018
- setIsLoading(false);
13019
- return [2 /*return*/];
12996
+ var _b;
12997
+ if (options.hasChild || ((_b = node.data) === null || _b === void 0 ? void 0 : _b.TagTypeCode) === "F") {
12998
+ if (openTagFolders[node.id]) {
12999
+ var newOpenTagFolders = __assign({}, openTagFolders);
13000
+ delete newOpenTagFolders[node.id];
13001
+ setOpenTagFolders(newOpenTagFolders);
13020
13002
  }
13021
- });
13022
- }); };
13023
- return (React__default.createElement(React__default.Fragment, null,
13024
- React__default.createElement(MesfModal, { open: open, handleClose: function () { return handleClose(false); }, maxWidth: "lg", "aria-labelledby": "modal-modal-title", "aria-describedby": "modal-modal-description", title: "New folder" },
13025
- React__default.createElement(MesfModal.Content, null,
13026
- React__default.createElement(Box, null,
13027
- React__default.createElement(TextField, { style: { minWidth: "600px" }, id: "outlined-basic", label: "Folder name", variant: "outlined", value: name, onChange: function (e) { return setName(e.target.value); } }))),
13028
- React__default.createElement(MesfModal.Actions, null,
13029
- React__default.createElement("div", null,
13030
- React__default.createElement(Button, { color: "secondary", variant: "outlined", onClick: function () { return handleClose(false); } }, "Cancel")),
13031
- React__default.createElement("div", null,
13032
- React__default.createElement(ButtonWithLoading, { isLoading: isLoading, onClick: onSubmit, color: "primary", variant: "contained" }, "Save")))),
13033
- React__default.createElement(ErrorModal, { error: error, onHide: function () { return setError(""); } })));
13034
- };
13035
-
13036
- var RemoveFolderModal = function (_a) {
13037
- var open = _a.open, handleClose = _a.handleClose, tagNodeSelectedInTree = _a.tagNodeSelectedInTree;
13038
- var _b = useState(""), error = _b[0], setError = _b[1];
13039
- var _c = useState(false), isLoading = _c[0], setIsLoading = _c[1];
13040
- var updateTagFolder = useMutation({
13041
- mutationFn: upsertTagFolder,
13042
- onError: function (error) {
13043
- setError(error.message);
13044
- },
13045
- });
13046
- var removeFolder = useMutation({
13047
- mutationFn: deleteTagFolder,
13048
- onError: function (error) {
13049
- setError(error.message);
13050
- },
13051
- });
13052
- var onSubmit = function (e) { return __awaiter(void 0, void 0, void 0, function () {
13053
- var parentId, name_1, id;
13054
- return __generator(this, function (_a) {
13055
- switch (_a.label) {
13056
- case 0:
13057
- e.preventDefault();
13058
- if (!tagNodeSelectedInTree) return [3 /*break*/, 4];
13059
- parentId = Number(tagNodeSelectedInTree === null || tagNodeSelectedInTree === void 0 ? void 0 : tagNodeSelectedInTree.parent) || null;
13060
- name_1 = tagNodeSelectedInTree === null || tagNodeSelectedInTree === void 0 ? void 0 : tagNodeSelectedInTree.text;
13061
- id = Number(tagNodeSelectedInTree === null || tagNodeSelectedInTree === void 0 ? void 0 : tagNodeSelectedInTree.id);
13062
- setIsLoading(true);
13063
- if (!parentId) return [3 /*break*/, 2];
13064
- return [4 /*yield*/, removeFolder.mutate(id)];
13065
- case 1:
13066
- _a.sent();
13067
- return [3 /*break*/, 4];
13068
- case 2: return [4 /*yield*/, updateTagFolder.mutate({
13069
- tagFolderId: id,
13070
- parentTagFolderId: parentId,
13071
- tagFolderName: name_1,
13072
- isActive: false,
13073
- })];
13074
- case 3:
13075
- _a.sent();
13076
- _a.label = 4;
13077
- case 4:
13078
- handleClose(true);
13079
- setIsLoading(false);
13080
- return [2 /*return*/];
13081
- }
13082
- });
13083
- }); };
13084
- return (React__default.createElement(React__default.Fragment, null,
13085
- React__default.createElement(MesfModal, { open: open, handleClose: function () { return handleClose(false); }, maxWidth: "lg", "aria-labelledby": "modal-modal-title", "aria-describedby": "modal-modal-description", title: "Remove Folder" },
13086
- React__default.createElement(MesfModal.Content, null,
13087
- React__default.createElement(Box, null,
13088
- React__default.createElement(Typography$1, null,
13089
- "Are you sure you want to remove",
13090
- " ",
13091
- React__default.createElement("strong", null, tagNodeSelectedInTree === null || tagNodeSelectedInTree === void 0 ? void 0 : tagNodeSelectedInTree.text),
13092
- " folder?"))),
13093
- React__default.createElement(MesfModal.Actions, null,
13094
- React__default.createElement("div", null,
13095
- React__default.createElement(Button, { color: "secondary", variant: "outlined", onClick: function () { return handleClose(false); } }, "Cancel")),
13096
- React__default.createElement("div", null,
13097
- React__default.createElement(ButtonWithLoading, { isLoading: isLoading, onClick: onSubmit, color: "primary", variant: "contained" }, "Remove")))),
13098
- React__default.createElement(ErrorModal, { error: error, onHide: function () { return setError(""); } })));
13099
- };
13100
-
13101
- var ContextMenu = function (_a) {
13102
- var _b;
13103
- var isOpen = _a.isOpen, anchorPoint = _a.anchorPoint, tagNodeSelectedInTree = _a.tagNodeSelectedInTree, getTagsTreeData = _a.getTagsTreeData, setShowContextMenu = _a.setShowContextMenu;
13104
- var _c = useState(false), showNewTagModal = _c[0], setShowNewTagModal = _c[1];
13105
- var _d = useState(false), showRemoveTagModal = _d[0], setShowRemoveTagModal = _d[1];
13106
- var isFolder = ((_b = tagNodeSelectedInTree === null || tagNodeSelectedInTree === void 0 ? void 0 : tagNodeSelectedInTree.data) === null || _b === void 0 ? void 0 : _b.TagTypeCode) === "F";
13107
- return (React__default.createElement(React__default.Fragment, null,
13108
- isOpen && anchorPoint ? (React__default.createElement("ul", { style: {
13109
- top: anchorPoint.y,
13110
- left: anchorPoint.x,
13111
- fontSize: "0.875rem",
13112
- backgroundColor: "#fff",
13113
- borderRadius: "2px",
13114
- padding: "5px 10px;",
13115
- width: "140px",
13116
- height: "auto",
13117
- margin: "0",
13118
- position: "fixed",
13119
- boxShadow: "0 0 20px 0 #ccc",
13120
- display: "flex",
13121
- flexDirection: "column",
13122
- } },
13123
- React__default.createElement(MenuItem, { style: { width: "100%", justifyContent: "left" }, onClick: function () { return setShowNewTagModal(true); } }, "New Folder"),
13124
- tagNodeSelectedInTree && isFolder && (React__default.createElement(MenuItem, { style: { width: "100%", justifyContent: "left" }, onClick: function () { return setShowRemoveTagModal(true); } }, "Remove Folder")))) : null,
13125
- React__default.createElement(NewFolderModal, { open: showNewTagModal, handleClose: function (shouldUpdate) {
13126
- if (shouldUpdate) {
13127
- getTagsTreeData();
13128
- }
13129
- setShowContextMenu(false);
13130
- setShowNewTagModal(false);
13131
- }, tagNodeSelectedInTree: tagNodeSelectedInTree }),
13132
- React__default.createElement(RemoveFolderModal, { open: showRemoveTagModal, handleClose: function (shouldUpdate) {
13133
- if (shouldUpdate) {
13134
- getTagsTreeData();
13135
- }
13136
- setShowContextMenu(false);
13137
- setShowRemoveTagModal(false);
13138
- }, tagNodeSelectedInTree: tagNodeSelectedInTree })));
13139
- };
13140
-
13141
- var CustomDragPreview = function (props) {
13142
- var _a, _b, _c;
13143
- var item = props.monitorProps.item;
13144
- var isFolder = ((_a = item.data) === null || _a === void 0 ? void 0 : _a.TagTypeCode) === "F" ? true : false;
13145
- return (React__default.createElement(Box, { sx: {
13146
- alignItems: "center",
13147
- backgroundColor: "#1967d2",
13148
- borderRadius: "4px",
13149
- boxShadow: " 0 12px 24px -6px rgba(0, 0, 0, .25); 0 0 0 1px rgba(0, 0, 0, .08)",
13150
- color: "#fff",
13151
- display: "inline-grid",
13152
- fontSize: "0.875rem",
13153
- gap: "8px",
13154
- gridTemplateColumns: "auto auto",
13155
- padding: "4px 8px",
13156
- pointerEvents: "none",
13157
- } },
13158
- React__default.createElement(Box, { sx: {
13159
- alignItems: "center",
13160
- display: "flex",
13161
- } }, isFolder ? React__default.createElement(FolderIcon, null) : React__default.createElement(InsertChartIcon, { fontSize: "small" })),
13162
- React__default.createElement(Box, { sx: {
13163
- alignItems: "center",
13164
- display: "flex",
13165
- } }, ((_b = item.data) === null || _b === void 0 ? void 0 : _b.Alias) || ((_c = item.data) === null || _c === void 0 ? void 0 : _c.TagName))));
13166
- };
13167
-
13168
- function buildTagsTreeV2(data) {
13169
- var tagsForTree = [];
13170
- data.forEach(function (el) {
13171
- var tagForTree = {
13172
- id: el.TagId,
13173
- parent: el.ParentTagId || 0,
13174
- text: el.TagName,
13175
- data: el,
13176
- droppable: el.TagTypeCode === "F",
13177
- };
13178
- return tagsForTree.push(tagForTree);
13179
- });
13180
- return tagsForTree;
13181
- }
13182
-
13183
- var customStyles$1 = "\n ul, ol {\n list-style-type: none;\n margin: 0;\n padding: 0;\n }\n";
13184
- var TagFolderCustomNodeV2 = function (_a) {
13185
- var _b, _c, _d, _e, _f, _g, _h, _j;
13186
- var node = _a.node, _k = _a.options, depth = _k.depth, isOpen = _k.isOpen, onToggle = _k.onToggle, containerRef = _k.containerRef, options = _a.options, setOpenTagFolders = _a.setOpenTagFolders, openTagFolders = _a.openTagFolders, handleSelect = _a.handleSelect, setContextMenuOver = _a.setContextMenuOver, isSelected = _a.isSelected;
13187
- var onClickHandler = function () {
13188
- var _a;
13189
- var _b;
13190
- if (options.hasChild || ((_b = node.data) === null || _b === void 0 ? void 0 : _b.TagTypeCode) === "F") {
13191
- if (openTagFolders[node.id]) {
13192
- var newOpenTagFolders = __assign({}, openTagFolders);
13193
- delete newOpenTagFolders[node.id];
13194
- setOpenTagFolders(newOpenTagFolders);
13195
- }
13196
- else {
13197
- setOpenTagFolders(__assign(__assign({}, openTagFolders), (_a = {}, _a[node.id] = node.id, _a)));
13198
- }
13199
- onToggle();
13200
- return;
13201
- }
13202
- if (!options.hasChild) {
13203
- handleSelect(node);
13204
- }
13205
- };
13206
- var handleContextMenu = useCallback(function (ev) {
13207
- ev.stopPropagation();
13208
- ev.preventDefault();
13209
- setContextMenuOver(node, ev);
13210
- }, [node.id, setContextMenuOver]);
13211
- useEffect(function () {
13212
- var _a;
13213
- (_a = containerRef.current) === null || _a === void 0 ? void 0 : _a.addEventListener("contextmenu", handleContextMenu);
13214
- return function () {
13215
- var _a;
13216
- (_a = containerRef.current) === null || _a === void 0 ? void 0 : _a.removeEventListener("contextmenu", handleContextMenu);
13217
- };
13218
- }, []);
13219
- return (React__default.createElement(Box, { "data-node-id": node.id, onClick: onClickHandler, sx: {
13220
- paddingInlineStart: depth * 2,
13221
- cursor: "pointer",
13222
- alignItems: "center",
13223
- display: "flex",
13224
- height: "32px",
13225
- backgroundColor: isSelected ? "#e8f0fe" : "",
13226
- "&:hover": {
13227
- backgroundColor: "#f2f2f2",
13228
- },
13229
- } },
13230
- React__default.createElement("style", null, customStyles$1),
13231
- React__default.createElement(React__default.Fragment, null,
13232
- options.hasChild ? (React__default.createElement("div", null, isOpen ? React__default.createElement(ArrowDropDownIcon, null) : React__default.createElement(ArrowRight, null))) : null,
13233
- React__default.createElement("div", null, options.hasChild || ((_b = node.data) === null || _b === void 0 ? void 0 : _b.TagTypeCode) === "F" ? (React__default.createElement(Folder, null)) : (React__default.createElement(InsertChart, { fontSize: "small" })))),
13234
- ((_c = node.data) === null || _c === void 0 ? void 0 : _c.TagName) && (React__default.createElement(React__default.Fragment, null,
13235
- ((_d = node.data) === null || _d === void 0 ? void 0 : _d.TagTypeCode) && ((_e = node.data) === null || _e === void 0 ? void 0 : _e.TagTypeCode) !== "F" && (React__default.createElement(Box, { sx: {
13236
- width: "20px",
13237
- height: "20px",
13238
- color: "white",
13239
- display: "flex",
13240
- justifyContent: "center",
13241
- alignItems: "center",
13242
- fontSize: "10px",
13243
- fontWeight: "bold",
13244
- borderRadius: "3px",
13245
- border: "1px solid rgba(0, 0, 0, 0.2)",
13246
- backgroundColor: ((_f = node.data) === null || _f === void 0 ? void 0 : _f.TagTypeCode) === "A" ? "#AD48C4" : "#C46F48",
13247
- } }, (_g = node.data) === null || _g === void 0 ? void 0 : _g.TagTypeCode)),
13248
- React__default.createElement(Tooltip, { title: node.data.TagName, placement: "top", arrow: true },
13249
- React__default.createElement(Typography$1, { variant: "body2" }, ((_h = node.data) === null || _h === void 0 ? void 0 : _h.Alias) || ((_j = node.data) === null || _j === void 0 ? void 0 : _j.TagName)))))));
13003
+ else {
13004
+ setOpenTagFolders(__assign(__assign({}, openTagFolders), (_a = {}, _a[node.id] = node.id, _a)));
13005
+ }
13006
+ onToggle();
13007
+ return;
13008
+ }
13009
+ if (!options.hasChild) {
13010
+ handleSelect(node);
13011
+ }
13012
+ };
13013
+ var handleContextMenu = useCallback(function (ev) {
13014
+ ev.stopPropagation();
13015
+ ev.preventDefault();
13016
+ setContextMenuOver(node, ev);
13017
+ }, [node.id, setContextMenuOver]);
13018
+ useEffect(function () {
13019
+ var _a;
13020
+ (_a = containerRef.current) === null || _a === void 0 ? void 0 : _a.addEventListener("contextmenu", handleContextMenu);
13021
+ return function () {
13022
+ var _a;
13023
+ (_a = containerRef.current) === null || _a === void 0 ? void 0 : _a.removeEventListener("contextmenu", handleContextMenu);
13024
+ };
13025
+ }, []);
13026
+ return (React__default.createElement(Box, { "data-node-id": node.id, onClick: onClickHandler, sx: {
13027
+ paddingInlineStart: depth * 2,
13028
+ cursor: "pointer",
13029
+ alignItems: "center",
13030
+ display: "flex",
13031
+ height: "32px",
13032
+ backgroundColor: isSelected ? "#e8f0fe" : "",
13033
+ "&:hover": {
13034
+ backgroundColor: "#f2f2f2",
13035
+ },
13036
+ } },
13037
+ React__default.createElement("style", null, customStyles),
13038
+ React__default.createElement(React__default.Fragment, null,
13039
+ options.hasChild ? (React__default.createElement("div", null, isOpen ? React__default.createElement(ArrowDropDownIcon, null) : React__default.createElement(ArrowRight, null))) : null,
13040
+ React__default.createElement("div", null, options.hasChild || ((_b = node.data) === null || _b === void 0 ? void 0 : _b.TagTypeCode) === "F" ? (React__default.createElement(Folder, null)) : (React__default.createElement(InsertChart, { fontSize: "small" })))),
13041
+ ((_c = node.data) === null || _c === void 0 ? void 0 : _c.TagName) && (React__default.createElement(React__default.Fragment, null,
13042
+ ((_d = node.data) === null || _d === void 0 ? void 0 : _d.TagTypeCode) && ((_e = node.data) === null || _e === void 0 ? void 0 : _e.TagTypeCode) !== "F" && (React__default.createElement(Box, { sx: {
13043
+ width: "20px",
13044
+ height: "20px",
13045
+ color: "white",
13046
+ display: "flex",
13047
+ justifyContent: "center",
13048
+ alignItems: "center",
13049
+ fontSize: "10px",
13050
+ fontWeight: "bold",
13051
+ borderRadius: "3px",
13052
+ border: "1px solid rgba(0, 0, 0, 0.2)",
13053
+ backgroundColor: ((_f = node.data) === null || _f === void 0 ? void 0 : _f.TagTypeCode) === "A" ? "#AD48C4" : "#C46F48",
13054
+ } }, (_g = node.data) === null || _g === void 0 ? void 0 : _g.TagTypeCode)),
13055
+ React__default.createElement(Tooltip, { title: node.data.TagName, placement: "top", arrow: true },
13056
+ React__default.createElement(Typography$1, { variant: "body2" }, ((_h = node.data) === null || _h === void 0 ? void 0 : _h.Alias) || ((_j = node.data) === null || _j === void 0 ? void 0 : _j.TagName)))))));
13250
13057
  };
13251
13058
 
13252
13059
  var useTagSearch = function (_a) {
@@ -13485,56 +13292,242 @@ var TagSearchInput = function (_a) {
13485
13292
  } }))); })))));
13486
13293
  };
13487
13294
 
13488
- // React Query hook for fetching tags tree
13489
- var useSearchTagsTree$1 = function () {
13490
- return useQuery({
13491
- queryKey: ["tagsTree-v2"],
13492
- queryFn: function () { return getTagsTree(); },
13493
- enabled: false, // Only fetch when explicitly called
13494
- });
13495
- };
13496
- var TagsTreeModalV2 = function (_a) {
13497
- var open = _a.open, handleClose = _a.handleClose, onTagSelect = _a.onTagSelect;
13498
- var _b = useState(false), isLoading = _b[0], setIsLoading = _b[1];
13295
+ var NewFolderModal = function (_a) {
13296
+ var open = _a.open, handleClose = _a.handleClose, tagNodeSelectedInTree = _a.tagNodeSelectedInTree;
13297
+ var _b = useState(), name = _b[0], setName = _b[1];
13499
13298
  var _c = useState(""), error = _c[0], setError = _c[1];
13500
- var _d = useState(null), snackbarMessage = _d[0], setSnackbarMessage = _d[1];
13501
- var _e = useState([]), tagsTreeData = _e[0], setTagsTreeData = _e[1];
13502
- var _f = useState(null), tagNodeSelectedInTree = _f[0], setTagNodeSelectedInTree = _f[1];
13503
- var _g = useState(null), anchorPoint = _g[0], setAnchorPoint = _g[1];
13504
- var _h = useState(false), showContextMenu = _h[0], setShowContextMenu = _h[1];
13505
- var backendOffset = 1000000;
13506
- var _j = useState({}), openTagFolders = _j[0], setOpenTagFolders = _j[1];
13507
- var _k = useState([]), selectedNodes = _k[0], setSelectedNodes = _k[1];
13508
- var handleContextMenu = function (data, e) {
13509
- e.preventDefault();
13510
- var top = e.clientY;
13511
- var left = e.clientX;
13512
- setAnchorPoint({ x: left, y: top });
13513
- setSelectedNodes([data]);
13514
- setShowContextMenu(true);
13515
- var selectedNode = tagsTreeData.find(function (node) { var _a; return ((_a = node.data) === null || _a === void 0 ? void 0 : _a.TagId) === data.id; });
13516
- if (selectedNode) {
13517
- setTagNodeSelectedInTree(selectedNode);
13518
- }
13519
- };
13520
- var _l = useSearchTagsTree$1(), tagsTree = _l.data, tagsTreeLoading = _l.isLoading, tagsTreeIsError = _l.isError, tagsTreeError = _l.error, tagsTreeIsSuccess = _l.isSuccess, tagsTreeIsFetched = _l.isFetched, refetch = _l.refetch;
13299
+ var _d = useState(false), isLoading = _d[0], setIsLoading = _d[1];
13521
13300
  var updateTagFolder = useMutation({
13522
- mutationFn: function (_a) {
13523
- var tagFolderId = _a.tagFolderId, parentTagFolderId = _a.parentTagFolderId, tagFolderName = _a.tagFolderName, isActive = _a.isActive;
13524
- return upsertTagFolder({
13525
- tagFolderId: tagFolderId,
13526
- parentTagFolderId: parentTagFolderId,
13527
- tagFolderName: tagFolderName,
13528
- isActive: isActive,
13529
- });
13530
- },
13301
+ mutationFn: upsertTagFolder,
13531
13302
  onError: function (error) {
13532
13303
  setError(error.message);
13533
13304
  },
13534
13305
  });
13535
- var changeTagFolderTag = useMutation({
13536
- mutationFn: function (_a) {
13537
- var tagId = _a.tagId, tagFolderId = _a.tagFolderId;
13306
+ var onSubmit = function (e) { return __awaiter(void 0, void 0, void 0, function () {
13307
+ var parentId, parentTagId;
13308
+ var _a;
13309
+ return __generator(this, function (_b) {
13310
+ switch (_b.label) {
13311
+ case 0:
13312
+ e.preventDefault();
13313
+ parentId = Number(tagNodeSelectedInTree === null || tagNodeSelectedInTree === void 0 ? void 0 : tagNodeSelectedInTree.parent) || null;
13314
+ parentTagId = ((_a = tagNodeSelectedInTree === null || tagNodeSelectedInTree === void 0 ? void 0 : tagNodeSelectedInTree.data) === null || _a === void 0 ? void 0 : _a.TagTypeCode) === "F"
13315
+ ? Number(tagNodeSelectedInTree.id)
13316
+ : parentId;
13317
+ setIsLoading(true);
13318
+ if (!name) return [3 /*break*/, 2];
13319
+ return [4 /*yield*/, updateTagFolder.mutate({
13320
+ tagFolderId: null,
13321
+ parentTagFolderId: parentTagId,
13322
+ tagFolderName: name,
13323
+ isActive: true,
13324
+ })];
13325
+ case 1:
13326
+ _b.sent();
13327
+ _b.label = 2;
13328
+ case 2:
13329
+ handleClose(true);
13330
+ setName("");
13331
+ setIsLoading(false);
13332
+ return [2 /*return*/];
13333
+ }
13334
+ });
13335
+ }); };
13336
+ return (React__default.createElement(React__default.Fragment, null,
13337
+ React__default.createElement(MesfModal, { open: open, handleClose: function () { return handleClose(false); }, maxWidth: "lg", "aria-labelledby": "modal-modal-title", "aria-describedby": "modal-modal-description", title: "New folder" },
13338
+ React__default.createElement(MesfModal.Content, null,
13339
+ React__default.createElement(Box, null,
13340
+ React__default.createElement(TextField, { style: { minWidth: "600px" }, id: "outlined-basic", label: "Folder name", variant: "outlined", value: name, onChange: function (e) { return setName(e.target.value); } }))),
13341
+ React__default.createElement(MesfModal.Actions, null,
13342
+ React__default.createElement("div", null,
13343
+ React__default.createElement(Button, { color: "secondary", variant: "outlined", onClick: function () { return handleClose(false); } }, "Cancel")),
13344
+ React__default.createElement("div", null,
13345
+ React__default.createElement(ButtonWithLoading, { isLoading: isLoading, onClick: onSubmit, color: "primary", variant: "contained" }, "Save")))),
13346
+ React__default.createElement(ErrorModal, { error: error, onHide: function () { return setError(""); } })));
13347
+ };
13348
+
13349
+ var RemoveFolderModal = function (_a) {
13350
+ var open = _a.open, handleClose = _a.handleClose, tagNodeSelectedInTree = _a.tagNodeSelectedInTree;
13351
+ var _b = useState(""), error = _b[0], setError = _b[1];
13352
+ var _c = useState(false), isLoading = _c[0], setIsLoading = _c[1];
13353
+ var updateTagFolder = useMutation({
13354
+ mutationFn: upsertTagFolder,
13355
+ onError: function (error) {
13356
+ setError(error.message);
13357
+ },
13358
+ });
13359
+ var removeFolder = useMutation({
13360
+ mutationFn: deleteTagFolder,
13361
+ onError: function (error) {
13362
+ setError(error.message);
13363
+ },
13364
+ });
13365
+ var onSubmit = function (e) { return __awaiter(void 0, void 0, void 0, function () {
13366
+ var parentId, name_1, id;
13367
+ return __generator(this, function (_a) {
13368
+ switch (_a.label) {
13369
+ case 0:
13370
+ e.preventDefault();
13371
+ if (!tagNodeSelectedInTree) return [3 /*break*/, 4];
13372
+ parentId = Number(tagNodeSelectedInTree === null || tagNodeSelectedInTree === void 0 ? void 0 : tagNodeSelectedInTree.parent) || null;
13373
+ name_1 = tagNodeSelectedInTree === null || tagNodeSelectedInTree === void 0 ? void 0 : tagNodeSelectedInTree.text;
13374
+ id = Number(tagNodeSelectedInTree === null || tagNodeSelectedInTree === void 0 ? void 0 : tagNodeSelectedInTree.id);
13375
+ setIsLoading(true);
13376
+ if (!parentId) return [3 /*break*/, 2];
13377
+ return [4 /*yield*/, removeFolder.mutate(id)];
13378
+ case 1:
13379
+ _a.sent();
13380
+ return [3 /*break*/, 4];
13381
+ case 2: return [4 /*yield*/, updateTagFolder.mutate({
13382
+ tagFolderId: id,
13383
+ parentTagFolderId: parentId,
13384
+ tagFolderName: name_1,
13385
+ isActive: false,
13386
+ })];
13387
+ case 3:
13388
+ _a.sent();
13389
+ _a.label = 4;
13390
+ case 4:
13391
+ handleClose(true);
13392
+ setIsLoading(false);
13393
+ return [2 /*return*/];
13394
+ }
13395
+ });
13396
+ }); };
13397
+ return (React__default.createElement(React__default.Fragment, null,
13398
+ React__default.createElement(MesfModal, { open: open, handleClose: function () { return handleClose(false); }, maxWidth: "lg", "aria-labelledby": "modal-modal-title", "aria-describedby": "modal-modal-description", title: "Remove Folder" },
13399
+ React__default.createElement(MesfModal.Content, null,
13400
+ React__default.createElement(Box, null,
13401
+ React__default.createElement(Typography$1, null,
13402
+ "Are you sure you want to remove",
13403
+ " ",
13404
+ React__default.createElement("strong", null, tagNodeSelectedInTree === null || tagNodeSelectedInTree === void 0 ? void 0 : tagNodeSelectedInTree.text),
13405
+ " folder?"))),
13406
+ React__default.createElement(MesfModal.Actions, null,
13407
+ React__default.createElement("div", null,
13408
+ React__default.createElement(Button, { color: "secondary", variant: "outlined", onClick: function () { return handleClose(false); } }, "Cancel")),
13409
+ React__default.createElement("div", null,
13410
+ React__default.createElement(ButtonWithLoading, { isLoading: isLoading, onClick: onSubmit, color: "primary", variant: "contained" }, "Remove")))),
13411
+ React__default.createElement(ErrorModal, { error: error, onHide: function () { return setError(""); } })));
13412
+ };
13413
+
13414
+ var ContextMenu = function (_a) {
13415
+ var _b;
13416
+ var isOpen = _a.isOpen, anchorPoint = _a.anchorPoint, tagNodeSelectedInTree = _a.tagNodeSelectedInTree, getTagsTreeData = _a.getTagsTreeData, setShowContextMenu = _a.setShowContextMenu;
13417
+ var _c = useState(false), showNewTagModal = _c[0], setShowNewTagModal = _c[1];
13418
+ var _d = useState(false), showRemoveTagModal = _d[0], setShowRemoveTagModal = _d[1];
13419
+ var isFolder = ((_b = tagNodeSelectedInTree === null || tagNodeSelectedInTree === void 0 ? void 0 : tagNodeSelectedInTree.data) === null || _b === void 0 ? void 0 : _b.TagTypeCode) === "F";
13420
+ return (React__default.createElement(React__default.Fragment, null,
13421
+ isOpen && anchorPoint ? (React__default.createElement("ul", { style: {
13422
+ top: anchorPoint.y,
13423
+ left: anchorPoint.x,
13424
+ fontSize: "0.875rem",
13425
+ backgroundColor: "#fff",
13426
+ borderRadius: "2px",
13427
+ padding: "5px 10px;",
13428
+ width: "140px",
13429
+ height: "auto",
13430
+ margin: "0",
13431
+ position: "fixed",
13432
+ boxShadow: "0 0 20px 0 #ccc",
13433
+ display: "flex",
13434
+ flexDirection: "column",
13435
+ } },
13436
+ React__default.createElement(MenuItem, { style: { width: "100%", justifyContent: "left" }, onClick: function () { return setShowNewTagModal(true); } }, "New Folder"),
13437
+ tagNodeSelectedInTree && isFolder && (React__default.createElement(MenuItem, { style: { width: "100%", justifyContent: "left" }, onClick: function () { return setShowRemoveTagModal(true); } }, "Remove Folder")))) : null,
13438
+ React__default.createElement(NewFolderModal, { open: showNewTagModal, handleClose: function (shouldUpdate) {
13439
+ if (shouldUpdate) {
13440
+ getTagsTreeData();
13441
+ }
13442
+ setShowContextMenu(false);
13443
+ setShowNewTagModal(false);
13444
+ }, tagNodeSelectedInTree: tagNodeSelectedInTree }),
13445
+ React__default.createElement(RemoveFolderModal, { open: showRemoveTagModal, handleClose: function (shouldUpdate) {
13446
+ if (shouldUpdate) {
13447
+ getTagsTreeData();
13448
+ }
13449
+ setShowContextMenu(false);
13450
+ setShowRemoveTagModal(false);
13451
+ }, tagNodeSelectedInTree: tagNodeSelectedInTree })));
13452
+ };
13453
+
13454
+ var CustomDragPreview = function (props) {
13455
+ var _a, _b, _c;
13456
+ var item = props.monitorProps.item;
13457
+ var isFolder = ((_a = item.data) === null || _a === void 0 ? void 0 : _a.TagTypeCode) === "F" ? true : false;
13458
+ return (React__default.createElement(Box, { sx: {
13459
+ alignItems: "center",
13460
+ backgroundColor: "#1967d2",
13461
+ borderRadius: "4px",
13462
+ boxShadow: " 0 12px 24px -6px rgba(0, 0, 0, .25); 0 0 0 1px rgba(0, 0, 0, .08)",
13463
+ color: "#fff",
13464
+ display: "inline-grid",
13465
+ fontSize: "0.875rem",
13466
+ gap: "8px",
13467
+ gridTemplateColumns: "auto auto",
13468
+ padding: "4px 8px",
13469
+ pointerEvents: "none",
13470
+ } },
13471
+ React__default.createElement(Box, { sx: {
13472
+ alignItems: "center",
13473
+ display: "flex",
13474
+ } }, isFolder ? React__default.createElement(FolderIcon, null) : React__default.createElement(InsertChartIcon, { fontSize: "small" })),
13475
+ React__default.createElement(Box, { sx: {
13476
+ alignItems: "center",
13477
+ display: "flex",
13478
+ } }, ((_b = item.data) === null || _b === void 0 ? void 0 : _b.Alias) || ((_c = item.data) === null || _c === void 0 ? void 0 : _c.TagName))));
13479
+ };
13480
+
13481
+ // React Query hook for fetching tags tree
13482
+ var useSearchTagsTree = function () {
13483
+ return useQuery({
13484
+ queryKey: ["tagsTree-v2"],
13485
+ queryFn: function () { return getTagsTree(); },
13486
+ enabled: false, // Only fetch when explicitly called
13487
+ });
13488
+ };
13489
+ var TagsTreeModalV2 = function (_a) {
13490
+ var open = _a.open, handleClose = _a.handleClose, onTagSelect = _a.onTagSelect;
13491
+ var _b = useState(false), isLoading = _b[0], setIsLoading = _b[1];
13492
+ var _c = useState(""), error = _c[0], setError = _c[1];
13493
+ var _d = useState(null), snackbarMessage = _d[0], setSnackbarMessage = _d[1];
13494
+ var _e = useState([]), tagsTreeData = _e[0], setTagsTreeData = _e[1];
13495
+ var _f = useState(null), tagNodeSelectedInTree = _f[0], setTagNodeSelectedInTree = _f[1];
13496
+ var _g = useState(null), anchorPoint = _g[0], setAnchorPoint = _g[1];
13497
+ var _h = useState(false), showContextMenu = _h[0], setShowContextMenu = _h[1];
13498
+ var backendOffset = 1000000;
13499
+ var _j = useState({}), openTagFolders = _j[0], setOpenTagFolders = _j[1];
13500
+ var _k = useState([]), selectedNodes = _k[0], setSelectedNodes = _k[1];
13501
+ var handleContextMenu = function (data, e) {
13502
+ e.preventDefault();
13503
+ var top = e.clientY;
13504
+ var left = e.clientX;
13505
+ setAnchorPoint({ x: left, y: top });
13506
+ setSelectedNodes([data]);
13507
+ setShowContextMenu(true);
13508
+ var selectedNode = tagsTreeData.find(function (node) { var _a; return ((_a = node.data) === null || _a === void 0 ? void 0 : _a.TagId) === data.id; });
13509
+ if (selectedNode) {
13510
+ setTagNodeSelectedInTree(selectedNode);
13511
+ }
13512
+ };
13513
+ var _l = useSearchTagsTree(), tagsTree = _l.data, tagsTreeLoading = _l.isLoading, tagsTreeIsError = _l.isError, tagsTreeError = _l.error, tagsTreeIsSuccess = _l.isSuccess, tagsTreeIsFetched = _l.isFetched, refetch = _l.refetch;
13514
+ var updateTagFolder = useMutation({
13515
+ mutationFn: function (_a) {
13516
+ var tagFolderId = _a.tagFolderId, parentTagFolderId = _a.parentTagFolderId, tagFolderName = _a.tagFolderName, isActive = _a.isActive;
13517
+ return upsertTagFolder({
13518
+ tagFolderId: tagFolderId,
13519
+ parentTagFolderId: parentTagFolderId,
13520
+ tagFolderName: tagFolderName,
13521
+ isActive: isActive,
13522
+ });
13523
+ },
13524
+ onError: function (error) {
13525
+ setError(error.message);
13526
+ },
13527
+ });
13528
+ var changeTagFolderTag = useMutation({
13529
+ mutationFn: function (_a) {
13530
+ var tagId = _a.tagId, tagFolderId = _a.tagFolderId;
13538
13531
  return changeTagFolderToTag({ tagId: tagId, tagFolderId: tagFolderId });
13539
13532
  },
13540
13533
  onError: function (error) {
@@ -14015,38 +14008,76 @@ var LoadViewModalV2 = function (_a) {
14015
14008
  React__default.createElement(ErrorModal, { error: error, onHide: function () { return setError(""); } })));
14016
14009
  };
14017
14010
 
14018
- var TagsTableV2 = function () {
14019
- var queryClient = useQueryClient();
14020
- var _a = useContextMenuMESF(), registerConfig = _a.registerConfig, showContextMenu = _a.showContextMenu;
14021
- var _b = useTrendingContextV2(), _c = _b.state, viewTags = _c.viewTags, cursorData = _c.cursorData, viewSelected = _c.viewSelected; _c.views; var seriesMinMax = _c.seriesMinMax, _d = _b.actions, setViewTags = _d.setViewTags, setViewTagsAndRefetch = _d.setViewTagsAndRefetch; _d.setViewSelected; _d.setViews; var highlightSeries = _d.highlightSeries;
14022
- // Number formatters for consistent thousand separator and decimal formatting
14023
- var numberFormatterOneDecimal = useMemo(function () {
14024
- return new Intl.NumberFormat("en-US", {
14025
- minimumFractionDigits: 1,
14026
- maximumFractionDigits: 1,
14027
- });
14028
- }, []);
14029
- var numberFormatterNoDecimal = useMemo(function () {
14030
- return new Intl.NumberFormat("en-US", {
14031
- minimumFractionDigits: 0,
14032
- maximumFractionDigits: 0,
14033
- });
14034
- }, []);
14035
- // State management
14036
- var _e = useState(""), error = _e[0], setError = _e[1];
14037
- var _f = useState(false); _f[0]; var setIsLoading = _f[1];
14038
- var _g = useState(null); _g[0]; var setSelectedRowTagId = _g[1];
14039
- var _h = useState(false), tagsTreeModalOpen = _h[0], setTagsTreeModalOpen = _h[1];
14040
- var _j = useState(false), bitSelectorModalOpen = _j[0], setBitSelectorModalOpen = _j[1];
14041
- var _k = useState(false), saveAsViewModalOpen = _k[0], setSaveAsViewModalOpen = _k[1];
14042
- var _l = useState(false), loadViewOpen = _l[0], setLoadViewOpen = _l[1];
14043
- var _m = useState(""), snackbarMessage = _m[0], setSnackbarMessage = _m[1];
14044
- var _o = useState(null), draggedRowId = _o[0], setDraggedRowId = _o[1];
14045
- var _p = useState(null), dragOverRowId = _p[0], setDragOverRowId = _p[1];
14046
- // Mutations
14047
- var deleteAllViewTags = useMutation({
14048
- mutationFn: function (viewId) { return deleteAllViewTagsFromView(viewId); },
14049
- onError: function (error) {
14011
+ var tagColors = [
14012
+ "#00AA00", // green
14013
+ "#0000FF", // blue
14014
+ "#FF0000", // red
14015
+ "#9C27B0", // purple
14016
+ "#FFA500", // orange
14017
+ "#397234", // forest green
14018
+ "#283F23", // dark olive
14019
+ "#3F2617", // dark brown
14020
+ "#0B0F08", // charcoal black
14021
+ "#889c2dff", // olive green
14022
+ "#B78449", // tan brown
14023
+ "#5D9F96", // teal
14024
+ "#1d5e74ff", // dark teal
14025
+ "#FA7305", // bright orange
14026
+ "#072684", // navy blue
14027
+ "#269473ff", // emerald green
14028
+ "#5d74b9ff", // slate blue
14029
+ "#0C8EF4", // sky blue
14030
+ "#8d481cff", // rust brown
14031
+ "#2B384C", // dark slate
14032
+ ];
14033
+ var availableColors = __spreadArray([], tagColors, true);
14034
+ var lastColor = null;
14035
+ var getRandomColor = function () {
14036
+ if (availableColors.length === 0) {
14037
+ availableColors = __spreadArray([], tagColors, true);
14038
+ if (lastColor && availableColors.length > 1) {
14039
+ availableColors.splice(availableColors.indexOf(lastColor), 1);
14040
+ }
14041
+ }
14042
+ var randomIndex = Math.floor(Math.random() * availableColors.length);
14043
+ var color = availableColors[randomIndex];
14044
+ availableColors.splice(randomIndex, 1);
14045
+ lastColor = color;
14046
+ return color;
14047
+ };
14048
+
14049
+ var TagsTableV2 = function () {
14050
+ var queryClient = useQueryClient();
14051
+ var _a = useContextMenuMESF(), registerConfig = _a.registerConfig, showContextMenu = _a.showContextMenu;
14052
+ var _b = useTrendingContextV2(), _c = _b.state, viewTags = _c.viewTags, cursorData = _c.cursorData, viewSelected = _c.viewSelected; _c.views; var seriesMinMax = _c.seriesMinMax, _d = _b.actions, setViewTags = _d.setViewTags, setViewTagsAndRefetch = _d.setViewTagsAndRefetch; _d.setViewSelected; _d.setViews; var highlightSeries = _d.highlightSeries;
14053
+ // Number formatters for consistent thousand separator and decimal formatting
14054
+ var numberFormatterOneDecimal = useMemo(function () {
14055
+ return new Intl.NumberFormat("en-US", {
14056
+ minimumFractionDigits: 1,
14057
+ maximumFractionDigits: 1,
14058
+ });
14059
+ }, []);
14060
+ var numberFormatterNoDecimal = useMemo(function () {
14061
+ return new Intl.NumberFormat("en-US", {
14062
+ minimumFractionDigits: 0,
14063
+ maximumFractionDigits: 0,
14064
+ });
14065
+ }, []);
14066
+ // State management
14067
+ var _e = useState(""), error = _e[0], setError = _e[1];
14068
+ var _f = useState(false); _f[0]; var setIsLoading = _f[1];
14069
+ var _g = useState(null); _g[0]; var setSelectedRowTagId = _g[1];
14070
+ var _h = useState(false), tagsTreeModalOpen = _h[0], setTagsTreeModalOpen = _h[1];
14071
+ var _j = useState(false), bitSelectorModalOpen = _j[0], setBitSelectorModalOpen = _j[1];
14072
+ var _k = useState(false), saveAsViewModalOpen = _k[0], setSaveAsViewModalOpen = _k[1];
14073
+ var _l = useState(false), loadViewOpen = _l[0], setLoadViewOpen = _l[1];
14074
+ var _m = useState(""), snackbarMessage = _m[0], setSnackbarMessage = _m[1];
14075
+ var _o = useState(null), draggedRowId = _o[0], setDraggedRowId = _o[1];
14076
+ var _p = useState(null), dragOverRowId = _p[0], setDragOverRowId = _p[1];
14077
+ // Mutations
14078
+ var deleteAllViewTags = useMutation({
14079
+ mutationFn: function (viewId) { return deleteAllViewTagsFromView(viewId); },
14080
+ onError: function (error) {
14050
14081
  setError(error.message);
14051
14082
  },
14052
14083
  });
@@ -16289,7 +16320,7 @@ var TrendingChartV2 = function (_a) {
16289
16320
  };
16290
16321
 
16291
16322
  // React Query hooks for data fetching
16292
- var useSearchViews$1 = function (_a) {
16323
+ var useSearchViews = function (_a) {
16293
16324
  var _b = _a.autoRefresh, autoRefresh = _b === void 0 ? false : _b;
16294
16325
  return useQuery({
16295
16326
  queryKey: ["views-v2"],
@@ -16297,7 +16328,7 @@ var useSearchViews$1 = function (_a) {
16297
16328
  refetchInterval: autoRefresh ? 10000 : false,
16298
16329
  });
16299
16330
  };
16300
- var useSearchViewTags$1 = function (_a) {
16331
+ var useSearchViewTags = function (_a) {
16301
16332
  var viewId = _a.viewId;
16302
16333
  return useQuery({
16303
16334
  queryKey: ["viewTags-v2", viewId],
@@ -16310,7 +16341,7 @@ var useSearchViewTags$1 = function (_a) {
16310
16341
  enabled: viewId !== null,
16311
16342
  });
16312
16343
  };
16313
- var useSearchSeries$1 = function (_a) {
16344
+ var useSearchSeries = function (_a) {
16314
16345
  var start = _a.start, end = _a.end, tagIds = _a.tagIds, _b = _a.autoRefresh, autoRefresh = _b === void 0 ? false : _b;
16315
16346
  return useQuery({
16316
16347
  queryKey: ["series-v2", start, end, tagIds],
@@ -16358,9 +16389,9 @@ var TrendingsPageV2 = function () {
16358
16389
  var _f = useState(0), dataLoadedTrigger = _f[0], setDataLoadedTrigger = _f[1];
16359
16390
  var _g = useTrendingContextV2(), _h = _g.state, viewSelected = _h.viewSelected, viewTags = _h.viewTags, timeScopeStart = _h.timeScopeStart, timeScopeEnd = _h.timeScopeEnd, _j = _g.actions, setViews = _j.setViews, setViewTagsAndRefetch = _j.setViewTagsAndRefetch, setViewSelected = _j.setViewSelected, setSeriesMinMax = _j.setSeriesMinMax, resetCursors = _j.resetCursors;
16360
16391
  // Fetch views
16361
- var _k = useSearchViews$1({ autoRefresh: autoRefresh }), views = _k.data, viewsLoading = _k.isLoading, viewsIsError = _k.isError, viewsError = _k.error, viewSuccess = _k.isSuccess;
16392
+ var _k = useSearchViews({ autoRefresh: autoRefresh }), views = _k.data, viewsLoading = _k.isLoading, viewsIsError = _k.isError, viewsError = _k.error, viewSuccess = _k.isSuccess;
16362
16393
  // Fetch view tags
16363
- var _l = useSearchViewTags$1({ viewId: viewId }), viewTagsData = _l.data, viewTagsLoading = _l.isLoading, viewTagsIsError = _l.isError, viewTagsError = _l.error, viewTagsSuccess = _l.isSuccess;
16394
+ var _l = useSearchViewTags({ viewId: viewId }), viewTagsData = _l.data, viewTagsLoading = _l.isLoading, viewTagsIsError = _l.isError, viewTagsError = _l.error, viewTagsSuccess = _l.isSuccess;
16364
16395
  // Memoize tagIds for series query
16365
16396
  // Tags are sorted in DESCENDING order to match TrendingChartV2 processing
16366
16397
  var tagIds = useMemo(function () {
@@ -16401,7 +16432,7 @@ var TrendingsPageV2 = function () {
16401
16432
  return stableTagIdsRef.current;
16402
16433
  }, [realTagIds, timeScopeStart, timeScopeEnd]);
16403
16434
  // Fetch series data using stable query key
16404
- var _m = useSearchSeries$1({
16435
+ var _m = useSearchSeries({
16405
16436
  start: timeScopeStart.getTime(),
16406
16437
  end: timeScopeEnd.getTime(),
16407
16438
  tagIds: queryTagIds,
@@ -16447,2891 +16478,96 @@ var TrendingsPageV2 = function () {
16447
16478
  // BitIndex 0 = LSB (least significant bit)
16448
16479
  return sourceData.map(function (point) { return ({
16449
16480
  timestamp: point.timestamp,
16450
- value: point.value !== null
16451
- ? (Math.floor(point.value) >> viewTag.BitIndex) & 1
16452
- : null,
16453
- }); });
16454
- }
16455
- // Regular tag - use series data directly
16456
- return seriesMap.get(tagId);
16457
- })
16458
- .filter(Boolean);
16459
- }, [series, tagIds, queryTagIds, viewTags]);
16460
- // Calculate overall min/max values from filtered series data
16461
- var seriesMinMaxData = useSeriesMinMax(filteredSeries, tagIds);
16462
- // Load initial view when views are fetched
16463
- useEffect(function () {
16464
- if (!viewSuccess || !views || !Array.isArray(views))
16465
- return;
16466
- // Always update the views list in context
16467
- setViews(views);
16468
- // Only set initial view if none is selected
16469
- if (!viewSelected) {
16470
- var lastCreated = views.reduce(function (prev, current) {
16471
- return prev && prev.ViewId > current.ViewId ? prev : current;
16472
- }, null);
16473
- if (lastCreated) {
16474
- setViewId(lastCreated.ViewId);
16475
- setViewSelected(lastCreated);
16476
- }
16477
- }
16478
- }, [viewSuccess, views, viewSelected, setViews, setViewSelected]);
16479
- // Update viewId when viewSelected changes (e.g., from LoadViewModal)
16480
- useEffect(function () {
16481
- if (viewSelected) {
16482
- setViewId(viewSelected.ViewId);
16483
- }
16484
- }, [viewSelected]);
16485
- // Load view tags when fetched - ONLY when viewId changes, not on every data refetch
16486
- // This preserves local order changes (from drag-and-drop) until a new view is loaded
16487
- var loadedViewIdRef = useRef(null);
16488
- useEffect(function () {
16489
- if (!viewTagsSuccess ||
16490
- !viewTagsData ||
16491
- !Array.isArray(viewTagsData) ||
16492
- viewId === null)
16493
- return;
16494
- // Only reset viewTags when viewId actually changes (loading a different view)
16495
- // Do NOT reset if viewId is the same (data is just refetching)
16496
- if (viewId === loadedViewIdRef.current)
16497
- return;
16498
- loadedViewIdRef.current = viewId;
16499
- var backendTags = viewTagsData;
16500
- var localViewTags = getViewFromLocal(viewId);
16501
- var mergedTags = {};
16502
- if (localViewTags) {
16503
- // If local storage exists, use it as the source of truth for metadata (Order, Alias)
16504
- // and for virtual tags (Bit Extracted)
16505
- var backendTagIds_1 = new Set(backendTags.map(function (t) { return t.TagId; }));
16506
- // 1. Process local tags
16507
- Object.values(localViewTags).forEach(function (entry) {
16508
- var viewTag = entry.viewTag;
16509
- // If it's a backend tag, check if it still exists in the backend response
16510
- // (Permission check or tag deletion check)
16511
- if (!viewTag.IsBitExtracted) {
16512
- if (backendTagIds_1.has(viewTag.TagId)) {
16513
- mergedTags[viewTag.TagId] = entry;
16514
- }
16515
- }
16516
- else {
16517
- // Virtual tags are always added from local storage
16518
- mergedTags[viewTag.TagId] = entry;
16519
- }
16520
- });
16521
- // 2. Add any new backend tags that might be missing from local storage
16522
- // (Rare case, but possible if added by another user/session)
16523
- backendTags.forEach(function (backendTag) {
16524
- if (!mergedTags[backendTag.TagId]) {
16525
- // Add with default order at the end
16526
- var maxOrder = Math.max.apply(Math, __spreadArray(__spreadArray([], Object.values(mergedTags).map(function (t) { return t.order; }), false), [0], false));
16527
- if (isNil(backendTag.Color)) {
16528
- backendTag.Color = getRandomColor();
16529
- }
16530
- mergedTags[backendTag.TagId] = {
16531
- viewTag: backendTag,
16532
- order: maxOrder + 1,
16533
- };
16534
- }
16535
- });
16536
- }
16537
- else {
16538
- // No local storage -> Use backend tags with default ordering
16539
- mergedTags = backendTags.reduce(function (carr, curr, idx) {
16540
- if (isNil(curr.Color)) {
16541
- curr.Color = getRandomColor();
16542
- }
16543
- carr[curr.TagId] = {
16544
- viewTag: curr,
16545
- order: idx,
16546
- };
16547
- return carr;
16548
- }, {});
16549
- }
16550
- // Reset stable ref when loading new view
16551
- stableTagIdsRef.current = [];
16552
- setViewTagsAndRefetch(mergedTags);
16553
- }, [viewTagsSuccess, viewTagsData, setViewTagsAndRefetch, viewId]);
16554
- // Update context with calculated min/max values
16555
- // Use ref to prevent infinite loop from object reference changes
16556
- var seriesMinMaxDataRef = useRef("");
16557
- useEffect(function () {
16558
- var serialized = JSON.stringify(seriesMinMaxData);
16559
- if (serialized !== seriesMinMaxDataRef.current) {
16560
- seriesMinMaxDataRef.current = serialized;
16561
- setSeriesMinMax(seriesMinMaxData);
16562
- }
16563
- }, [seriesMinMaxData, setSeriesMinMax]);
16564
- // Reset cursors when view changes or time scope changes significantly
16565
- var prevViewIdRef = useRef(null);
16566
- useEffect(function () {
16567
- // Reset cursors when switching views or when time scope changes significantly
16568
- if (viewSelected && viewSelected.ViewId !== prevViewIdRef.current) {
16569
- prevViewIdRef.current = viewSelected.ViewId;
16570
- resetCursors();
16571
- }
16572
- }, [viewSelected, resetCursors]);
16573
- // Also reset cursors when time scope changes (zoom/pan)
16574
- useEffect(function () {
16575
- resetCursors();
16576
- }, [timeScopeStart, timeScopeEnd, resetCursors]);
16577
- // Increment trigger when series data finishes loading
16578
- // This ensures cursors re-render AFTER chart has new data
16579
- var prevSeriesLoadingRef = useRef(false);
16580
- useEffect(function () {
16581
- if (prevSeriesLoadingRef.current && !seriesLoading) {
16582
- // Transition from loading to not loading - data just loaded
16583
- setDataLoadedTrigger(function (prev) { return prev + 1; });
16584
- }
16585
- prevSeriesLoadingRef.current = seriesLoading;
16586
- }, [seriesLoading]);
16587
- // Handle errors
16588
- useEffect(function () {
16589
- if (viewTagsError && viewTagsIsError) {
16590
- setError(viewTagsError instanceof Error
16591
- ? viewTagsError.message
16592
- : String(viewTagsError));
16593
- }
16594
- if (viewsError && viewsIsError) {
16595
- setError(viewsError instanceof Error ? viewsError.message : String(viewsError));
16596
- }
16597
- if (seriesError && seriesIsError) {
16598
- setError(seriesError instanceof Error
16599
- ? seriesError.message
16600
- : String(seriesError));
16601
- }
16602
- }, [
16603
- viewsError,
16604
- viewsIsError,
16605
- viewTagsError,
16606
- viewTagsIsError,
16607
- seriesError,
16608
- seriesIsError,
16609
- ]);
16610
- var isLoading = viewsLoading || viewTagsLoading;
16611
- return (React__default.createElement(React__default.Fragment, null,
16612
- React__default.createElement(HelmetDexteel, { title: "Trendings" }),
16613
- React__default.createElement("div", { style: {
16614
- padding: "16px",
16615
- width: "100%",
16616
- height: "92vh",
16617
- position: "relative",
16618
- backgroundColor: "#FAFAFA",
16619
- display: "flex",
16620
- flexDirection: "column",
16621
- } },
16622
- isLoading && (React__default.createElement("div", { style: {
16623
- position: "absolute",
16624
- top: 0,
16625
- left: 0,
16626
- width: "100%",
16627
- height: "100%",
16628
- background: "rgba(255, 255, 255, 0.7)",
16629
- display: "flex",
16630
- justifyContent: "center",
16631
- alignItems: "center",
16632
- zIndex: 1000,
16633
- } },
16634
- React__default.createElement(CircularProgress, { size: "3rem" }))),
16635
- React__default.createElement("div", { style: { flexShrink: 0 } },
16636
- React__default.createElement(HeaderSectionV2, { autoRefresh: autoRefresh, setAutoRefresh: setAutoRefresh, setChartOptions: setChartOptions, chartInstance: chartInstance })),
16637
- React__default.createElement(Divider, { sx: { my: 2 } }),
16638
- React__default.createElement("div", { style: {
16639
- flexGrow: 1,
16640
- minHeight: 0,
16641
- display: "flex",
16642
- width: "100%",
16643
- } },
16644
- React__default.createElement(Group$1, { orientation: "vertical", style: { width: "100%", height: "100%" } },
16645
- React__default.createElement(Panel, { defaultSize: 80, minSize: 20 },
16646
- React__default.createElement("div", { style: { height: "100%", width: "100%" } },
16647
- React__default.createElement(TrendingChartV2, { customOptions: chartOptions, series: filteredSeries, isLoading: seriesLoading, onChartReady: setChartInstance, dataLoadedTrigger: dataLoadedTrigger }))),
16648
- React__default.createElement(Separator, { style: {
16649
- height: "10px",
16650
- background: "#f0f0f0",
16651
- cursor: "row-resize",
16652
- display: "flex",
16653
- alignItems: "center",
16654
- justifyContent: "center",
16655
- borderTop: "1px solid #e0e0e0",
16656
- borderBottom: "1px solid #e0e0e0",
16657
- } },
16658
- React__default.createElement("div", { style: {
16659
- width: "40px",
16660
- height: "4px",
16661
- backgroundColor: "#ccc",
16662
- borderRadius: "2px",
16663
- } })),
16664
- React__default.createElement(Panel, { defaultSize: 20, minSize: 10 },
16665
- React__default.createElement("div", { style: { height: "100%", width: "100%", overflow: "auto" } },
16666
- React__default.createElement(TagsTableV2, null)))))),
16667
- React__default.createElement(ErrorModal, { error: error, onHide: function () { return setError(""); }, size: "xl", title: "ERROR" })));
16668
- };
16669
-
16670
- var TrendingsV2Index = function () {
16671
- var _a = useState(false), ihPathLoaded = _a[0], setIhPathLoaded = _a[1];
16672
- useEffect(function () {
16673
- var getIhPath = function () { return __awaiter(void 0, void 0, void 0, function () {
16674
- var resp;
16675
- return __generator(this, function (_a) {
16676
- switch (_a.label) {
16677
- case 0: return [4 /*yield*/, axiosInstance.get("/backend/ih-path")];
16678
- case 1:
16679
- resp = _a.sent();
16680
- localStorage.setItem("ihPath", resp.data);
16681
- setIhPathLoaded(true);
16682
- return [2 /*return*/];
16683
- }
16684
- });
16685
- }); };
16686
- getIhPath();
16687
- }, []);
16688
- if (!ihPathLoaded) {
16689
- return (React__default.createElement("div", { className: "d-flex justify-content-center align-items-center" }, "Loading..."));
16690
- }
16691
- return (React__default.createElement(TrendingProviderV2, null,
16692
- React__default.createElement(TrendingsPageV2, null)));
16693
- };
16694
-
16695
- /*!
16696
- * chartjs-adapter-moment v1.0.1
16697
- * https://www.chartjs.org
16698
- * (c) 2022 chartjs-adapter-moment Contributors
16699
- * Released under the MIT license
16700
- */
16701
-
16702
- const FORMATS = {
16703
- datetime: 'MMM D, YYYY, h:mm:ss a',
16704
- millisecond: 'h:mm:ss.SSS a',
16705
- second: 'h:mm:ss a',
16706
- minute: 'h:mm a',
16707
- hour: 'hA',
16708
- day: 'MMM D',
16709
- week: 'll',
16710
- month: 'MMM YYYY',
16711
- quarter: '[Q]Q - YYYY',
16712
- year: 'YYYY'
16713
- };
16714
-
16715
- _adapters._date.override(typeof moment$f === 'function' ? {
16716
- _id: 'moment', // DEBUG ONLY
16717
-
16718
- formats: function() {
16719
- return FORMATS;
16720
- },
16721
-
16722
- parse: function(value, format) {
16723
- if (typeof value === 'string' && typeof format === 'string') {
16724
- value = moment$f(value, format);
16725
- } else if (!(value instanceof moment$f)) {
16726
- value = moment$f(value);
16727
- }
16728
- return value.isValid() ? value.valueOf() : null;
16729
- },
16730
-
16731
- format: function(time, format) {
16732
- return moment$f(time).format(format);
16733
- },
16734
-
16735
- add: function(time, amount, unit) {
16736
- return moment$f(time).add(amount, unit).valueOf();
16737
- },
16738
-
16739
- diff: function(max, min, unit) {
16740
- return moment$f(max).diff(moment$f(min), unit);
16741
- },
16742
-
16743
- startOf: function(time, unit, weekday) {
16744
- time = moment$f(time);
16745
- if (unit === 'isoWeek') {
16746
- weekday = Math.trunc(Math.min(Math.max(0, weekday), 6));
16747
- return time.isoWeekday(weekday).startOf('day').valueOf();
16748
- }
16749
- return time.startOf(unit).valueOf();
16750
- },
16751
-
16752
- endOf: function(time, unit) {
16753
- return moment$f(time).endOf(unit).valueOf();
16754
- }
16755
- } : {});
16756
-
16757
- var css = "/* ContextMenu.css */ .context-menu {\n\tposition: absolute;\n\tz-index: 1000;\n\tbackground-color: #fff;\n\tborder: 1px solid #ddd;\n\tbox-shadow: 0px 0px 10px rgba(0, 0, 0, 0.1);\n\tborder-radius: 4px;\n\toverflow: hidden;\n}\n\n.context-menu ul {\n\tlist-style: none;\n\tmargin: 0;\n\tpadding: 0;\n}\n\n.context-menu li {\n\tpadding: 8px 15px;\n\tcursor: pointer;\n\tborder-bottom: 1px solid #eee;\n\tbackground-color: #fff;\n\tcolor: #333;\n\tfontSize: 0.875rem;\n}\n\n.context-menu li:hover {\n\tbackground-color: #f5f5f5;\n}\n";
16758
- n(css,{});
16759
-
16760
- var Swatch = function (_a) {
16761
- var color = _a.color, onSelect = _a.onSelect;
16762
- return (React__default.createElement("div", { style: {
16763
- backgroundColor: color,
16764
- width: "25px",
16765
- height: "25px",
16766
- display: "inline-block",
16767
- margin: "2px",
16768
- borderRadius: "4px",
16769
- cursor: "pointer",
16770
- }, onClick: function () { return onSelect(color); } }));
16771
- };
16772
- var ColorPicker = function (_a) {
16773
- var onChange = _a.onChange, color = _a.color, elementId = _a.elementId;
16774
- var _b = useState(null), anchorEl = _b[0], setAnchorEl = _b[1];
16775
- var handleClick = function (event) {
16776
- setAnchorEl(event.currentTarget);
16777
- };
16778
- var handleClose = function () {
16779
- setAnchorEl(null);
16780
- };
16781
- var open = Boolean(anchorEl);
16782
- var id = open ? "simple-popover" : undefined;
16783
- return (React__default.createElement("div", null,
16784
- React__default.createElement(Button$1, { "aria-describedby": id, variant: "outlined", onClick: handleClick, style: {
16785
- backgroundColor: color,
16786
- width: "20px",
16787
- height: "20px",
16788
- minWidth: "20px",
16789
- padding: 0,
16790
- margin: "4px",
16791
- } }),
16792
- React__default.createElement(Popover$1, { id: id, open: open, anchorEl: anchorEl, onClose: handleClose, anchorOrigin: {
16793
- vertical: "bottom",
16794
- horizontal: "left",
16795
- } },
16796
- React__default.createElement("div", { style: {
16797
- display: "flex",
16798
- flexWrap: "wrap",
16799
- padding: "10px",
16800
- maxWidth: "165px",
16801
- } }, tagColors$1.map(function (color) { return (React__default.createElement(Swatch, { key: color, color: color, onSelect: function (color) {
16802
- onChange(elementId, color);
16803
- handleClose();
16804
- } })); })))));
16805
- };
16806
-
16807
- var TrendingsInitialState = {
16808
- timeScopeStart: moment$f(new Date()).subtract(1, "days").toDate(),
16809
- timeScopeEnd: new Date(),
16810
- scope: "1 day",
16811
- graphPan: false,
16812
- graphShouldUpdate: 0,
16813
- views: [
16814
- {
16815
- ViewId: 0,
16816
- ViewName: "",
16817
- UserName: null,
16818
- IsPublic: false,
16819
- LastModified: null,
16820
- LastModifiedBy: null,
16821
- },
16822
- ],
16823
- viewSelected: null,
16824
- viewTags: {},
16825
- shouldRefetchSeries: 1,
16826
- };
16827
- var TrendingsReducer = createSlice({
16828
- name: "__",
16829
- initialState: TrendingsInitialState,
16830
- reducers: {
16831
- setTotalScope: function (state, _a) {
16832
- var payload = _a.payload; _a.type;
16833
- state.shouldRefetchSeries += 1;
16834
- state.graphShouldUpdate += 1;
16835
- if (!isNil(payload.start) &&
16836
- !isNil(payload.end) &&
16837
- !isNil(payload.scope)) {
16838
- //from arrow navigators
16839
- state.timeScopeStart = payload.start;
16840
- state.timeScopeEnd = payload.end;
16841
- state.scope = payload.scope;
16842
- return;
16843
- }
16844
- if (!isNil(payload.scope)) {
16845
- if (payload.scope !== "custom") {
16846
- switch (payload.scope) {
16847
- case "10 min":
16848
- state.timeScopeStart = moment$f(state.timeScopeEnd)
16849
- .subtract(10, "minutes")
16850
- .toDate();
16851
- break;
16852
- case "1 hour":
16853
- state.timeScopeStart = moment$f(state.timeScopeEnd)
16854
- .subtract(1, "hours")
16855
- .toDate();
16856
- break;
16857
- case "4 hours":
16858
- state.timeScopeStart = moment$f(state.timeScopeEnd)
16859
- .subtract(4, "hours")
16860
- .toDate();
16861
- break;
16862
- case "12 hours":
16863
- state.timeScopeStart = moment$f(state.timeScopeEnd)
16864
- .subtract(12, "hours")
16865
- .toDate();
16866
- break;
16867
- case "1 day":
16868
- state.timeScopeStart = moment$f(state.timeScopeEnd)
16869
- .subtract(1, "days")
16870
- .toDate();
16871
- break;
16872
- case "10 days":
16873
- state.timeScopeStart = moment$f(state.timeScopeEnd)
16874
- .subtract(10, "days")
16875
- .toDate();
16876
- break;
16877
- }
16878
- }
16879
- state.scope = payload.scope;
16880
- return;
16881
- }
16882
- if (!isNil(payload.start) &&
16883
- !isNil(payload.end) &&
16884
- isNil(payload.graphPan)) {
16885
- // from zoom
16886
- state.timeScopeStart = payload.start;
16887
- state.timeScopeEnd = payload.end;
16888
- state.scope = "custom";
16889
- return;
16890
- }
16891
- if (!isNil(payload.start) &&
16892
- !isNil(payload.end) &&
16893
- !isNil(payload.graphPan)) {
16894
- // from pan
16895
- state.timeScopeStart = payload.start;
16896
- state.timeScopeEnd = payload.end;
16897
- return;
16898
- }
16899
- if (!isNil(payload.start)) {
16900
- state.timeScopeStart = payload.start;
16901
- if (state.scope !== "custom") {
16902
- switch (state.scope) {
16903
- case "10 min":
16904
- state.timeScopeEnd = moment$f(payload.start)
16905
- .add(10, "minutes")
16906
- .toDate();
16907
- break;
16908
- case "1 hour":
16909
- state.timeScopeEnd = moment$f(payload.start)
16910
- .add(1, "hours")
16911
- .toDate();
16912
- break;
16913
- case "4 hours":
16914
- state.timeScopeEnd = moment$f(payload.start)
16915
- .add(4, "hours")
16916
- .toDate();
16917
- break;
16918
- case "12 hours":
16919
- state.timeScopeEnd = moment$f(payload.start)
16920
- .add(12, "hours")
16921
- .toDate();
16922
- break;
16923
- case "1 day":
16924
- state.timeScopeEnd = moment$f(payload.start)
16925
- .add(1, "days")
16926
- .toDate();
16927
- break;
16928
- case "10 days":
16929
- state.timeScopeEnd = moment$f(payload.start)
16930
- .add(10, "days")
16931
- .toDate();
16932
- break;
16933
- }
16934
- }
16935
- return;
16936
- }
16937
- if (!isNil(payload.end)) {
16938
- state.timeScopeEnd = payload.end;
16939
- if (state.scope !== "custom") {
16940
- switch (state.scope) {
16941
- case "10 min":
16942
- state.timeScopeStart = moment$f(payload.end)
16943
- .subtract(10, "minutes")
16944
- .toDate();
16945
- break;
16946
- case "1 hour":
16947
- state.timeScopeStart = moment$f(payload.end)
16948
- .subtract(1, "hours")
16949
- .toDate();
16950
- break;
16951
- case "4 hours":
16952
- state.timeScopeStart = moment$f(payload.end)
16953
- .subtract(4, "hours")
16954
- .toDate();
16955
- break;
16956
- case "12 hours":
16957
- state.timeScopeStart = moment$f(payload.end)
16958
- .subtract(12, "hours")
16959
- .toDate();
16960
- break;
16961
- case "1 day":
16962
- state.timeScopeStart = moment$f(payload.end)
16963
- .subtract(1, "days")
16964
- .toDate();
16965
- break;
16966
- case "10 days":
16967
- state.timeScopeStart = moment$f(payload.end)
16968
- .subtract(10, "days")
16969
- .toDate();
16970
- break;
16971
- }
16972
- }
16973
- return;
16974
- }
16975
- },
16976
- setViews: function (state, _a) {
16977
- var payload = _a.payload;
16978
- state.views = payload;
16979
- },
16980
- setViewSelected: function (state, _a) {
16981
- var payload = _a.payload;
16982
- state.viewSelected = payload;
16983
- },
16984
- setViewTags: function (state, _a) {
16985
- var payload = _a.payload;
16986
- state.viewTags = payload;
16987
- state.graphShouldUpdate += 1;
16988
- },
16989
- setViewTagsAndRefetch: function (state, _a) {
16990
- var payload = _a.payload;
16991
- var newTags = structuredClone(payload);
16992
- __spreadArray([], Object.values(payload), true).sort(function (a, b) { return b.order - a.order; })
16993
- .forEach(function (vtMap, idx) {
16994
- newTags[vtMap.viewTag.TagId]["order"] = idx;
16995
- });
16996
- state.viewTags = newTags;
16997
- state.shouldRefetchSeries += 1;
16998
- },
16999
- setGraphShouldUpdate: function (state) {
17000
- state.graphShouldUpdate = +1;
17001
- },
17002
- },
17003
- });
17004
-
17005
- var TrendingContext = createContext({
17006
- state: TrendingsReducer.getInitialState(),
17007
- actions: TrendingsReducer.actions,
17008
- });
17009
- var useTrendingContext = function () { return useContext(TrendingContext); };
17010
- var TrendingProvider = function (_a) {
17011
- var children = _a.children;
17012
- var _b = useComplexState({
17013
- initialState: TrendingsReducer.getInitialState(),
17014
- reducers: TrendingsReducer.caseReducers,
17015
- }), state = _b[0], actions = _b[1];
17016
- var contextValue = useMemo(function () { return ({ state: state, actions: actions }); }, [state, actions]);
17017
- return (React__default.createElement(TrendingContext.Provider, { value: contextValue }, children));
17018
- };
17019
-
17020
- var useSearchViews = function (_a) {
17021
- var _b = _a.autoRefresh, autoRefresh = _b === void 0 ? false : _b;
17022
- return useQuery({
17023
- queryKey: ["views"],
17024
- queryFn: function () { return getViews(null); },
17025
- refetchInterval: autoRefresh ? 10000 : false,
17026
- });
17027
- };
17028
- var useSearchViewTags = function (_a) {
17029
- var viewId = _a.viewId;
17030
- return useQuery({
17031
- queryKey: ["viewTags", viewId],
17032
- queryFn: function () {
17033
- if (viewId) {
17034
- return getViewTags(viewId);
17035
- }
17036
- else {
17037
- return [];
17038
- }
17039
- },
17040
- });
17041
- };
17042
- var useSearchTagsTree = function () {
17043
- return useQuery({
17044
- queryKey: ["tagsTree"],
17045
- queryFn: function () { return getTagsTree(); },
17046
- });
17047
- };
17048
- var useSearchSeries = function (_a) {
17049
- var start = _a.start, end = _a.end, tagIds = _a.tagIds, _b = _a.autoRefresh, autoRefresh = _b === void 0 ? false : _b;
17050
- return useQuery({
17051
- queryKey: ["series", start, end, tagIds],
17052
- queryFn: function (_a) { return __awaiter(void 0, [_a], void 0, function (_b) {
17053
- var resp, error_1;
17054
- var signal = _b.signal;
17055
- return __generator(this, function (_c) {
17056
- switch (_c.label) {
17057
- case 0:
17058
- _c.trys.push([0, 2, , 3]);
17059
- return [4 /*yield*/, axios.post("/series?nodeName=null", {
17060
- start: start,
17061
- end: end ? end : new Date().getTime(),
17062
- tagIds: tagIds,
17063
- sampleCount: 1000,
17064
- }, {
17065
- signal: signal,
17066
- })];
17067
- case 1:
17068
- resp = _c.sent();
17069
- return [2 /*return*/, get(resp, "data", [])];
17070
- case 2:
17071
- error_1 = _c.sent();
17072
- // Ignore abort errors
17073
- if (axios.isCancel(error_1) || error_1.name === "AbortError") {
17074
- return [2 /*return*/, []];
17075
- }
17076
- throw new Error(getError(error_1));
17077
- case 3: return [2 /*return*/];
17078
- }
17079
- });
17080
- }); },
17081
- refetchInterval: autoRefresh ? 10000 : false,
17082
- });
17083
- };
17084
-
17085
- var DeleteViewModal = function (_a) {
17086
- var open = _a.open, handleClose = _a.handleClose, view = _a.view;
17087
- var _b = useState(false), isLoading = _b[0], setIsLoading = _b[1];
17088
- var _c = useState(""), error = _c[0], setError = _c[1];
17089
- var removeView = useMutation({
17090
- mutationFn: deleteView,
17091
- onSuccess: function () {
17092
- handleClose(true);
17093
- },
17094
- onError: function (error) {
17095
- setError(error.message);
17096
- },
17097
- });
17098
- var handleSubmit = function () { return __awaiter(void 0, void 0, void 0, function () {
17099
- return __generator(this, function (_a) {
17100
- switch (_a.label) {
17101
- case 0:
17102
- setIsLoading(true);
17103
- if (!!isNil(view)) return [3 /*break*/, 2];
17104
- return [4 /*yield*/, removeView.mutate(view.ViewId)];
17105
- case 1:
17106
- _a.sent();
17107
- _a.label = 2;
17108
- case 2:
17109
- setIsLoading(false);
17110
- return [2 /*return*/];
17111
- }
17112
- });
17113
- }); };
17114
- return (React__default.createElement(React__default.Fragment, null,
17115
- React__default.createElement(MesfModal, { open: open, handleClose: function () { return handleClose(false); }, maxWidth: "xl", "aria-labelledby": "modal-modal-title", "aria-describedby": "modal-modal-description", title: "Delete View" },
17116
- React__default.createElement(Divider, null),
17117
- React__default.createElement(MesfModal.Content, null, !isNil(view) ? (React__default.createElement(Grid2, { container: true, spacing: 5, style: { padding: "2rem" } },
17118
- React__default.createElement(Grid2, { size: { md: 12, xs: 12 }, style: { padding: "10px", width: "100%" } },
17119
- React__default.createElement(Typography$1, null,
17120
- "Are yu sure you want to delete",
17121
- " ",
17122
- React__default.createElement("strong", null, view === null || view === void 0 ? void 0 : view.ViewName),
17123
- " ?")))) : (React__default.createElement(Typography$1, null, "ERROR: No view detected, please select one"))),
17124
- React__default.createElement(Divider, null),
17125
- React__default.createElement(MesfModal.Actions, null,
17126
- React__default.createElement(Grid2, { container: true, spacing: 1, style: {
17127
- display: "flex",
17128
- alignItems: "flex-end",
17129
- justifyContent: "flex-end",
17130
- } },
17131
- React__default.createElement(Grid2, null,
17132
- React__default.createElement(Button, { variant: "outlined", color: "secondary", onClick: function () { return handleClose(false); } }, "Cancel")),
17133
- React__default.createElement(Grid2, null, !isNil(view) ? (React__default.createElement(ButtonWithLoading, { variant: "contained", color: "secondary", onClick: handleSubmit, isLoading: isLoading }, "Delete")) : (React__default.createElement(Button, { variant: "contained", style: { marginRight: "1rem" }, color: "primary", onClick: function () { return handleClose(false); } }, "Ok")))))),
17134
- React__default.createElement(ErrorModal, { error: error, onHide: function () { return setError(""); } })));
17135
- };
17136
-
17137
- var EditViewModal = function (_a) {
17138
- var open = _a.open, handleClose = _a.handleClose, view = _a.view;
17139
- var _b = useState(""), newName = _b[0], setNewName = _b[1];
17140
- var _c = useState(true), isPublic = _c[0], setIsPublic = _c[1];
17141
- var _d = useState(false), isLoading = _d[0], setIsLoading = _d[1];
17142
- var _e = useState(""), error = _e[0], setError = _e[1];
17143
- var updateView = useMutation({
17144
- mutationFn: upsertView,
17145
- onSuccess: function () {
17146
- handleClose(true);
17147
- },
17148
- onError: function (error) {
17149
- setError(error.message);
17150
- },
17151
- });
17152
- var handleSubmit = function () { return __awaiter(void 0, void 0, void 0, function () {
17153
- return __generator(this, function (_a) {
17154
- switch (_a.label) {
17155
- case 0:
17156
- setIsLoading(true);
17157
- if (!!isNil(view)) return [3 /*break*/, 2];
17158
- return [4 /*yield*/, updateView.mutate({
17159
- viewId: view.ViewId,
17160
- viewName: newName,
17161
- isPublic: isPublic,
17162
- })];
17163
- case 1:
17164
- _a.sent();
17165
- _a.label = 2;
17166
- case 2:
17167
- setIsLoading(false);
17168
- return [2 /*return*/];
17169
- }
17170
- });
17171
- }); };
17172
- var handleChangeInput = function (e) {
17173
- e.preventDefault();
17174
- var name = e.target.value;
17175
- setNewName(name);
17176
- };
17177
- var handleCheck = function () { return setIsPublic(!isPublic); };
17178
- useEffect(function () {
17179
- if (view) {
17180
- setIsPublic(view.IsPublic);
17181
- setNewName(view.ViewName);
17182
- }
17183
- }, [view]);
17184
- return (React__default.createElement(React__default.Fragment, null,
17185
- React__default.createElement(MesfModal, { open: open, handleClose: function () { return handleClose(false); }, maxWidth: "xl", "aria-labelledby": "modal-modal-title", "aria-describedby": "modal-modal-description", title: "Update View" },
17186
- React__default.createElement(Divider, null),
17187
- React__default.createElement(MesfModal.Content, null, !isNil(view) ? (React__default.createElement(Grid2, { container: true, spacing: 5, style: { padding: "2rem" } },
17188
- React__default.createElement(Grid2, { size: { md: 12, xs: 12 }, style: { padding: "10px", width: "100%" } },
17189
- React__default.createElement(TextField, { required: true, sx: {
17190
- color: "rgba(0, 0, 0, 0.87)",
17191
- cursor: "text",
17192
- fontSize: "0.7rem",
17193
- boxSizing: "border-box",
17194
- fontFamily: '"Roboto", "Helvetica", "Arial", sans-serif',
17195
- fontWeight: 400,
17196
- lineHeight: 1.1876,
17197
- letterSpacing: "0.00938em",
17198
- "& .MuiOutlinedInput-input": {
17199
- padding: "10px 10px",
17200
- },
17201
- }, id: "viewName", label: "Name", variant: "outlined", onChange: handleChangeInput, value: newName })),
17202
- React__default.createElement(Grid2, { size: { md: 12, xs: 12 }, sx: {
17203
- paddingTop: "2rem",
17204
- userSelect: "none",
17205
- paddingLeft: "1rem",
17206
- "& > label": {
17207
- display: "flex",
17208
- alignItems: "center",
17209
- gap: "15px",
17210
- },
17211
- '& input[type="checkbox"]': {
17212
- zoom: 1.5,
17213
- },
17214
- } },
17215
- React__default.createElement("label", null,
17216
- React__default.createElement("input", { type: "checkbox", checked: isPublic, onChange: handleCheck }),
17217
- React__default.createElement(Typography$1, null, "Public"))))) : (React__default.createElement(Typography$1, null, "ERROR: No view detected, please select one"))),
17218
- React__default.createElement(Divider, null),
17219
- React__default.createElement(MesfModal.Actions, null,
17220
- React__default.createElement(Grid2, { container: true, spacing: 1, style: {
17221
- display: "flex",
17222
- alignItems: "flex-end",
17223
- justifyContent: "flex-end",
17224
- } },
17225
- React__default.createElement(Grid2, null,
17226
- React__default.createElement(Button, { variant: "outlined", color: "secondary", onClick: function () { return handleClose(false); } }, "Cancel")),
17227
- React__default.createElement(Grid2, null, !isNil(view) ? (React__default.createElement(ButtonWithLoading, { variant: "contained", color: "primary", onClick: handleSubmit, isLoading: isLoading }, "Update")) : (React__default.createElement(Button, { variant: "contained", style: { marginRight: "1rem" }, color: "primary", onClick: function () { return handleClose(false); } }, "Ok")))))),
17228
- React__default.createElement(ErrorModal, { error: error, onHide: function () { return setError(""); } })));
17229
- };
17230
-
17231
- var LoadViewModal = function (_a) {
17232
- var _b;
17233
- var open = _a.open, handleClose = _a.handleClose;
17234
- var queryClient = useQueryClient();
17235
- var _c = useTrendingContext(), _d = _c.state, views = _d.views, viewSelected = _d.viewSelected, _e = _c.actions, setViewTagsAndRefetch = _e.setViewTagsAndRefetch, setViewSelected = _e.setViewSelected;
17236
- var _f = useState(null), viewForDelete = _f[0], setViewForDelete = _f[1];
17237
- var _g = useState(null), viewForEdit = _g[0], setViewForEdit = _g[1];
17238
- var _h = useState(null), optionSelected = _h[0], setOptionSelected = _h[1];
17239
- var _j = useState(false), deleteViewModalOpen = _j[0], setDeleteViewModalOpen = _j[1];
17240
- var _k = useState(false), editViewModalOpen = _k[0], setEditViewModalOpen = _k[1];
17241
- var _l = useState(false), allViewsChecked = _l[0], setAllViewsChecked = _l[1];
17242
- var _m = useState(""), error = _m[0], setError = _m[1];
17243
- var _o = useSearchViewTags({ viewId: (_b = viewSelected === null || viewSelected === void 0 ? void 0 : viewSelected.ViewId) !== null && _b !== void 0 ? _b : null }), viewTags = _o.data, viewTagsLoading = _o.isLoading; _o.isError; _o.error; var viewTagsSuccess = _o.isSuccess, viewTagsFetched = _o.isFetched;
17244
- var handleSelect = function () { return __awaiter(void 0, void 0, void 0, function () {
17245
- return __generator(this, function (_a) {
17246
- switch (_a.label) {
17247
- case 0:
17248
- if (!optionSelected) return [3 /*break*/, 2];
17249
- setViewSelected(optionSelected);
17250
- return [4 /*yield*/, queryClient.invalidateQueries({
17251
- queryKey: ["viewTags", viewSelected.ViewId],
17252
- })];
17253
- case 1:
17254
- _a.sent();
17255
- handleClose(true);
17256
- return [2 /*return*/];
17257
- case 2:
17258
- handleClose(false);
17259
- return [2 /*return*/];
17260
- }
17261
- });
17262
- }); };
17263
- var handleDeleteView = function (view, e) { return __awaiter(void 0, void 0, void 0, function () {
17264
- return __generator(this, function (_a) {
17265
- e.stopPropagation();
17266
- if (view.ViewId === (viewSelected === null || viewSelected === void 0 ? void 0 : viewSelected.ViewId)) {
17267
- setError("Can not delete current view");
17268
- }
17269
- else {
17270
- setViewForDelete(view);
17271
- setDeleteViewModalOpen(true);
17272
- }
17273
- return [2 /*return*/];
17274
- });
17275
- }); };
17276
- var handleEditView = function (view, e) { return __awaiter(void 0, void 0, void 0, function () {
17277
- return __generator(this, function (_a) {
17278
- setViewForEdit(view);
17279
- setEditViewModalOpen(true);
17280
- return [2 /*return*/];
17281
- });
17282
- }); };
17283
- var handleAllViewsCheckbox = function () {
17284
- setAllViewsChecked(function (prev) { return !prev; });
17285
- };
17286
- var publicViews = useMemo(function () {
17287
- return views.filter(function (v) { return v.IsPublic === true; });
17288
- }, [views, allViewsChecked]);
17289
- useEffect(function () {
17290
- if (viewTagsSuccess && viewTagsFetched) {
17291
- setViewTagsAndRefetch((viewTags !== null && viewTags !== void 0 ? viewTags : []).reduce(function (carr, curr, idx) {
17292
- if (isNil(curr.Color)) {
17293
- curr.Color = getRandomColor();
17294
- }
17295
- carr[curr.TagId] = {
17296
- viewTag: curr,
17297
- order: idx,
17298
- };
17299
- return carr;
17300
- }, {}));
17301
- }
17302
- }, [viewTagsSuccess, viewTagsFetched]);
17303
- return (React__default.createElement("div", null,
17304
- React__default.createElement(MesfModal, { open: open, handleClose: function () { return handleClose(false); }, maxWidth: "xl", "aria-labelledby": "modal-modal-title", "aria-describedby": "modal-modal-description", title: "Views" },
17305
- React__default.createElement(MesfModal.Content, null,
17306
- React__default.createElement(Grid2, { container: true }, views.length ? (React__default.createElement(React__default.Fragment, null,
17307
- React__default.createElement(Grid2, { size: { md: 12 } },
17308
- React__default.createElement(Box, { sx: {
17309
- paddingBottom: "1rem",
17310
- userSelect: "none",
17311
- paddingLeft: "1rem",
17312
- "& > label": {
17313
- display: "flex",
17314
- alignItems: "center",
17315
- gap: "15px",
17316
- },
17317
- '& input[type="checkbox"]': {
17318
- zoom: 1.5,
17319
- },
17320
- } },
17321
- React__default.createElement("label", { htmlFor: "" },
17322
- React__default.createElement("input", { type: "checkbox", checked: allViewsChecked, onChange: handleAllViewsCheckbox }),
17323
- React__default.createElement(Typography$1, null, "All Views")))),
17324
- React__default.createElement(Grid2, { size: { md: 12 } },
17325
- React__default.createElement(Autocomplete$1, { size: "small", id: "list-of-views", noOptionsText: allViewsChecked
17326
- ? "No views detected, please create a new view"
17327
- : "No private views detected, please create a new view .", options: allViewsChecked ? views : publicViews, getOptionLabel: function (option) { return option.ViewName; }, onChange: function (ev, val) { return setOptionSelected(val); }, defaultValue: optionSelected || viewSelected, style: { width: "100%" }, renderOption: function (props, option) { return (React__default.createElement("li", __assign({}, props, { key: option.ViewId }),
17328
- React__default.createElement("div", { style: {
17329
- display: "flex",
17330
- justifyContent: "flex-start",
17331
- alignItems: "center",
17332
- width: "100%",
17333
- } },
17334
- React__default.createElement("div", { style: {
17335
- flexGrow: 1,
17336
- } }, option.ViewName),
17337
- React__default.createElement("div", { style: {
17338
- display: "flex",
17339
- justifyContent: "flex-end",
17340
- alignItems: "center",
17341
- flex: 1,
17342
- } },
17343
- option.IsPublic ? ("") : (React__default.createElement(React__default.Fragment, null,
17344
- React__default.createElement(Tooltip, { title: "Private", arrow: true },
17345
- React__default.createElement(LockIcon, { fontSize: "small", style: {
17346
- color: "black",
17347
- height: "18px",
17348
- width: "18px",
17349
- cursor: "auto",
17350
- } })))),
17351
- React__default.createElement(IconButton$1, { onClick: function (e) { return handleEditView(option); } },
17352
- React__default.createElement(CreateIcon, { fontSize: "small", color: "primary", style: {
17353
- height: "18px",
17354
- width: "18px",
17355
- cursor: "pointer",
17356
- } })),
17357
- React__default.createElement(IconButton$1, { onClick: function (e) { return handleDeleteView(option, e); } },
17358
- React__default.createElement(DeleteIcon, { fontSize: "small", color: "secondary", style: {
17359
- height: "18px",
17360
- width: "18px",
17361
- cursor: "pointer",
17362
- } })))))); }, renderInput: function (params) { return (React__default.createElement(TextField, __assign({}, params, { label: "Views", variant: "outlined" }))); } })))) : (React__default.createElement(Typography$1, null, "No views detected, please add one")))),
17363
- React__default.createElement(MesfModal.Actions, null,
17364
- React__default.createElement("div", { style: { paddingTop: "1rem" } },
17365
- React__default.createElement(Button, { variant: "outlined", style: { marginRight: "1rem" }, color: "secondary", onClick: function () { return handleClose(false); } }, "Cancel"),
17366
- views.length ? (React__default.createElement(ButtonWithLoading, { onClick: handleSelect, variant: "contained", color: "primary", isLoading: viewTagsLoading, style: { marginRight: "1rem" } }, "Apply")) : (React__default.createElement(Button, { variant: "contained", style: { marginRight: "1rem" }, color: "primary", onClick: function () { return handleClose(false); } }, "Ok"))))),
17367
- React__default.createElement(DeleteViewModal, { open: deleteViewModalOpen, view: viewForDelete, handleClose: function (shouldUpdate) { return __awaiter(void 0, void 0, void 0, function () {
17368
- return __generator(this, function (_a) {
17369
- switch (_a.label) {
17370
- case 0:
17371
- setDeleteViewModalOpen(false);
17372
- if (!shouldUpdate) return [3 /*break*/, 2];
17373
- return [4 /*yield*/, queryClient.invalidateQueries({ queryKey: ["views"] })];
17374
- case 1:
17375
- _a.sent();
17376
- _a.label = 2;
17377
- case 2: return [2 /*return*/];
17378
- }
17379
- });
17380
- }); } }),
17381
- React__default.createElement(EditViewModal, { open: editViewModalOpen, view: viewForEdit, handleClose: function (shouldUpdate) { return __awaiter(void 0, void 0, void 0, function () {
17382
- return __generator(this, function (_a) {
17383
- switch (_a.label) {
17384
- case 0:
17385
- setEditViewModalOpen(false);
17386
- if (!shouldUpdate) return [3 /*break*/, 2];
17387
- return [4 /*yield*/, queryClient.invalidateQueries({ queryKey: ["views"] })];
17388
- case 1:
17389
- _a.sent();
17390
- _a.label = 2;
17391
- case 2: return [2 /*return*/];
17392
- }
17393
- });
17394
- }); } }),
17395
- React__default.createElement(ErrorModal, { error: error, onHide: function () { return setError(""); } })));
17396
- };
17397
-
17398
- var SaveAsViewModal = function (_a) {
17399
- var open = _a.open, handleClose = _a.handleClose;
17400
- var _b = useState(false), isLoading = _b[0], setIsLoading = _b[1];
17401
- var _c = useState(""), error = _c[0], setError = _c[1];
17402
- var _d = useTrendingContext(), _e = _d.state, viewTags = _e.viewTags, views = _e.views, viewSelected = _e.viewSelected, _f = _d.actions, setViewSelected = _f.setViewSelected; _f.setViewTags;
17403
- var _g = useState(true), isPublic = _g[0], setIsPublic = _g[1];
17404
- var _h = useState(""), newView = _h[0], setNewView = _h[1];
17405
- var handleCheck = function () { return setIsPublic(!isPublic); };
17406
- var updateViewTag = useMutation({
17407
- mutationFn: upsertViewTag,
17408
- onError: function (error) {
17409
- setError(error.message);
17410
- },
17411
- });
17412
- var updateView = useMutation({
17413
- mutationFn: upsertView,
17414
- onSuccess: function (viewId) { return __awaiter(void 0, void 0, void 0, function () {
17415
- var shouldClose;
17416
- return __generator(this, function (_a) {
17417
- switch (_a.label) {
17418
- case 0:
17419
- shouldClose = true;
17420
- return [4 /*yield*/, Promise.allSettled(Object.values(viewTags).map(function (_a) { return __awaiter(void 0, [_a], void 0, function (_b) {
17421
- var _c = _b.viewTag, TagId = _c.TagId, Color = _c.Color, MinScale = _c.MinScale, MaxScale = _c.MaxScale, IsAutoScale = _c.IsAutoScale, IsVisible = _c.IsVisible, Unit = _c.Unit;
17422
- return __generator(this, function (_d) {
17423
- switch (_d.label) {
17424
- case 0: return [4 /*yield*/, updateViewTag.mutate({
17425
- viewId: viewId,
17426
- tagId: TagId,
17427
- color: Color,
17428
- minScale: MinScale,
17429
- maxScale: MaxScale,
17430
- isVisible: IsVisible,
17431
- isAutoScale: IsAutoScale,
17432
- unit: Unit,
17433
- })];
17434
- case 1:
17435
- _d.sent();
17436
- return [2 /*return*/];
17437
- }
17438
- });
17439
- }); }))];
17440
- case 1:
17441
- _a.sent();
17442
- handleClose(shouldClose);
17443
- return [2 /*return*/];
17444
- }
17445
- });
17446
- }); },
17447
- onError: function (error) {
17448
- setError(error.message);
17449
- },
17450
- });
17451
- var handleSubmit = function () { return __awaiter(void 0, void 0, void 0, function () {
17452
- return __generator(this, function (_a) {
17453
- switch (_a.label) {
17454
- case 0:
17455
- setIsLoading(true);
17456
- return [4 /*yield*/, updateView.mutate({
17457
- viewId: null,
17458
- viewName: newView,
17459
- isPublic: isPublic,
17460
- })];
17461
- case 1:
17462
- _a.sent();
17463
- setIsLoading(false);
17464
- return [2 /*return*/];
17465
- }
17466
- });
17467
- }); };
17468
- return (React__default.createElement(React__default.Fragment, null,
17469
- React__default.createElement(MesfModal, { open: open, handleClose: function () { return handleClose(false); }, maxWidth: "xl", "aria-labelledby": "modal-modal-title", "aria-describedby": "modal-modal-description", title: "Save View As" },
17470
- React__default.createElement(Divider, null),
17471
- React__default.createElement(MesfModal.Content, null,
17472
- React__default.createElement(Grid2, { container: true, spacing: 5, style: { padding: "1rem" } },
17473
- React__default.createElement(Grid2, { size: { md: 12, xs: 12 }, style: { padding: "10px", width: "100%" } }, views.length && viewSelected ? (React__default.createElement(Autocomplete$1, { size: "small", id: "list-of-views", options: views, defaultValue: viewSelected, getOptionLabel: function (option) {
17474
- if (typeof option === "string") {
17475
- return option;
17476
- }
17477
- return option.ViewName;
17478
- }, freeSolo: true, onChange: function (ev, val) {
17479
- setViewSelected(val);
17480
- if (val) {
17481
- setNewView("");
17482
- }
17483
- }, onInputChange: function (event, newInputValue) {
17484
- var isValueInViews = views.some(function (view) { return view.ViewName === newInputValue; });
17485
- if (!isValueInViews) {
17486
- setNewView(newInputValue);
17487
- }
17488
- }, style: { width: "100%" }, renderInput: function (params) { return (React__default.createElement(TextField, __assign({}, params, { label: "Views", variant: "outlined" }))); } })) : (React__default.createElement(Box, null,
17489
- React__default.createElement(TextField, { style: { minWidth: "600px" }, size: "small", id: "outlined-basic", label: "View name", variant: "outlined", value: newView, onChange: function (e) { return setNewView(e.target.value); } }))))),
17490
- React__default.createElement(Grid2, { size: { md: 12, xs: 12 }, sx: {
17491
- paddingTop: "2rem",
17492
- userSelect: "none",
17493
- paddingLeft: "1rem",
17494
- "& > label": {
17495
- display: "flex",
17496
- alignItems: "center",
17497
- gap: "15px",
17498
- },
17499
- '& input[type="checkbox"]': {
17500
- zoom: 1.5,
17501
- },
17502
- } },
17503
- React__default.createElement("label", null,
17504
- "Public",
17505
- React__default.createElement("input", { type: "checkbox", checked: isPublic, onChange: handleCheck })))),
17506
- React__default.createElement(Divider, null),
17507
- React__default.createElement(MesfModal.Actions, null,
17508
- React__default.createElement(Grid2, { container: true, spacing: 1, style: {
17509
- display: "flex",
17510
- alignItems: "flex-end",
17511
- justifyContent: "flex-end",
17512
- } },
17513
- React__default.createElement(Grid2, null,
17514
- React__default.createElement(Button, { variant: "outlined", color: "secondary", onClick: function () { return handleClose(false); } }, "Cancel")),
17515
- React__default.createElement(Grid2, null,
17516
- React__default.createElement(ButtonWithLoading, { variant: "contained", color: "primary", onClick: handleSubmit, isLoading: isLoading }, "Save"))))),
17517
- React__default.createElement(ErrorModal, { error: error, onHide: function () { return setError(""); } })));
17518
- };
17519
-
17520
- var customStyles = "\n ul, ol {\n list-style-type: none;\n margin: 0;\n padding: 0;\n }\n";
17521
- var TagFolderCustomNode = function (_a) {
17522
- var _b, _c, _d, _e, _f, _g, _h, _j;
17523
- var node = _a.node, _k = _a.options, depth = _k.depth, isOpen = _k.isOpen, onToggle = _k.onToggle, containerRef = _k.containerRef, options = _a.options, setOpenTagFolders = _a.setOpenTagFolders, openTagFolders = _a.openTagFolders, handleSelect = _a.handleSelect, setContextMenuOver = _a.setContextMenuOver, isSelected = _a.isSelected;
17524
- var onClickHandler = function () {
17525
- var _a;
17526
- var _b;
17527
- if (options.hasChild || ((_b = node.data) === null || _b === void 0 ? void 0 : _b.TagTypeCode) === "F") {
17528
- if (openTagFolders[node.id]) {
17529
- var newOpenTagFolders = __assign({}, openTagFolders);
17530
- delete newOpenTagFolders[node.id];
17531
- setOpenTagFolders(newOpenTagFolders);
17532
- }
17533
- else {
17534
- setOpenTagFolders(__assign(__assign({}, openTagFolders), (_a = {}, _a[node.id] = node.id, _a)));
17535
- }
17536
- onToggle();
17537
- return;
17538
- }
17539
- if (!options.hasChild) {
17540
- handleSelect(node);
17541
- }
17542
- };
17543
- var handleContextMenu = useCallback(function (ev) {
17544
- ev.stopPropagation();
17545
- ev.preventDefault();
17546
- setContextMenuOver(node, ev);
17547
- }, [node.id, setContextMenuOver]);
17548
- useEffect(function () {
17549
- var _a;
17550
- (_a = containerRef.current) === null || _a === void 0 ? void 0 : _a.addEventListener("contextmenu", handleContextMenu);
17551
- return function () {
17552
- var _a;
17553
- (_a = containerRef.current) === null || _a === void 0 ? void 0 : _a.removeEventListener("contextmenu", handleContextMenu);
17554
- };
17555
- }, []);
17556
- return (React__default.createElement(Box, { onClick: onClickHandler, sx: {
17557
- paddingLeft: depth * 20,
17558
- cursor: "pointer",
17559
- listStyleType: "none",
17560
- margin: 0,
17561
- padding: 0,
17562
- alignItems: "center",
17563
- display: "flex",
17564
- height: "32px",
17565
- backgroundColor: isSelected ? "#e8f0fe" : "",
17566
- "&:hover": {
17567
- backgroundColor: "#f2f2f2",
17568
- },
17569
- } },
17570
- React__default.createElement("style", null, customStyles),
17571
- React__default.createElement(React__default.Fragment, null,
17572
- options.hasChild ? (React__default.createElement("div", null, isOpen ? React__default.createElement(ArrowDropDownIcon$1, null) : React__default.createElement(ArrowRight, null))) : null,
17573
- React__default.createElement("div", null, options.hasChild || ((_b = node.data) === null || _b === void 0 ? void 0 : _b.TagTypeCode) === "F" ? (React__default.createElement(FolderIcon, null)) : (React__default.createElement(InsertChartIcon, { fontSize: "small" })))),
17574
- ((_c = node.data) === null || _c === void 0 ? void 0 : _c.TagName) && (React__default.createElement(React__default.Fragment, null,
17575
- ((_d = node.data) === null || _d === void 0 ? void 0 : _d.TagTypeCode) && ((_e = node.data) === null || _e === void 0 ? void 0 : _e.TagTypeCode) !== "F" && (React__default.createElement("div", { style: {
17576
- backgroundColor: ((_f = node.data) === null || _f === void 0 ? void 0 : _f.TagTypeCode) === "A" ? "#AD48C4" : "#C46F48",
17577
- margin: "0 5px",
17578
- width: "25px",
17579
- height: "25px",
17580
- color: "white",
17581
- display: "flex",
17582
- justifyContent: "center",
17583
- alignItems: "center",
17584
- cursor: "pointer",
17585
- border: "1px black solid",
17586
- } }, (_g = node.data) === null || _g === void 0 ? void 0 : _g.TagTypeCode)),
17587
- React__default.createElement(Tooltip, { title: node.data.TagName, placement: "top", arrow: true },
17588
- React__default.createElement(Typography$1, { variant: "body2" }, ((_h = node.data) === null || _h === void 0 ? void 0 : _h.Alias) || ((_j = node.data) === null || _j === void 0 ? void 0 : _j.TagName)))))));
17589
- };
17590
-
17591
- var TagSelectionModal = function (_a) {
17592
- var isOpen = _a.isOpen; _a.onClose; var onTagSelect = _a.onTagSelect;
17593
- var _b = useState(false), isLoading = _b[0], setIsLoading = _b[1];
17594
- var _c = useState(""), error = _c[0], setError = _c[1];
17595
- var _d = useState([]), tagsTreeData = _d[0], setTagsTreeData = _d[1];
17596
- var _e = useState(null), tagNodeSelectedInTree = _e[0], setTagNodeSelectedInTree = _e[1];
17597
- var _f = useState(null), anchorPoint = _f[0], setAnchorPoint = _f[1];
17598
- var _g = useState(false), showContextMenu = _g[0], setShowContextMenu = _g[1];
17599
- var backendOffset = 1000000;
17600
- var _h = useState({}), openTagFolders = _h[0], setOpenTagFolders = _h[1];
17601
- var _j = useState([]), selectedNodes = _j[0], setSelectedNodes = _j[1];
17602
- var handleContextMenu = function (data, e) {
17603
- e.preventDefault();
17604
- var top = e.clientY;
17605
- var left = e.clientX;
17606
- setAnchorPoint({ x: left, y: top });
17607
- setSelectedNodes([data]);
17608
- setShowContextMenu(true);
17609
- var selectedNode = tagsTreeData.find(function (node) { var _a; return ((_a = node.data) === null || _a === void 0 ? void 0 : _a.TagId) === data.id; });
17610
- if (selectedNode) {
17611
- setTagNodeSelectedInTree(selectedNode);
17612
- }
17613
- };
17614
- var _k = useSearchTagsTree(), tagsTree = _k.data, tagsTreeLoading = _k.isLoading, tagsTreeIsError = _k.isError, tagsTreeError = _k.error, tagsTreeIsSuccess = _k.isSuccess, tagsTreeIsFetched = _k.isFetched, refetch = _k.refetch;
17615
- var updateTagFolder = useMutation({
17616
- mutationFn: upsertTagFolder,
17617
- onError: function (error) {
17618
- setError(error.message);
17619
- },
17620
- });
17621
- var changeTagFolderTag = useMutation({
17622
- mutationFn: changeTagFolderToTag,
17623
- onError: function (error) {
17624
- setError(error.message);
17625
- },
17626
- });
17627
- var expanded = useMemo(function () {
17628
- return Object.keys(openTagFolders).map(function (el) { return Number.parseInt(el); });
17629
- }, [openTagFolders]);
17630
- var handleDrop = function (tree, options) { return __awaiter(void 0, void 0, void 0, function () {
17631
- var tagId, newFolderId;
17632
- var _a, _b;
17633
- return __generator(this, function (_c) {
17634
- switch (_c.label) {
17635
- case 0:
17636
- setIsLoading(true);
17637
- if (!options.dragSource) return [3 /*break*/, 5];
17638
- tagId = Number(options.dragSource.id);
17639
- newFolderId = Number((_a = options.dropTarget) === null || _a === void 0 ? void 0 : _a.id) || null;
17640
- if (tagId === newFolderId) {
17641
- setIsLoading(false);
17642
- return [2 /*return*/];
17643
- }
17644
- if (!(((_b = options.dragSource.data) === null || _b === void 0 ? void 0 : _b.TagTypeCode) === "F")) return [3 /*break*/, 2];
17645
- return [4 /*yield*/, updateTagFolder.mutate({
17646
- tagFolderId: tagId,
17647
- parentTagFolderId: newFolderId,
17648
- tagFolderName: options.dragSource.text,
17649
- isActive: true,
17650
- })];
17651
- case 1:
17652
- _c.sent();
17653
- return [3 /*break*/, 4];
17654
- case 2: return [4 /*yield*/, changeTagFolderTag.mutate({ tagId: tagId, tagFolderId: newFolderId })];
17655
- case 3:
17656
- _c.sent();
17657
- _c.label = 4;
17658
- case 4:
17659
- setTagsTreeData(tree);
17660
- _c.label = 5;
17661
- case 5:
17662
- setIsLoading(false);
17663
- return [2 /*return*/];
17664
- }
17665
- });
17666
- }); };
17667
- var handleClick = function (node) {
17668
- if (node.data) {
17669
- onTagSelect(node.data);
17670
- }
17671
- };
17672
- var handleCloseContextMenu = function (e) {
17673
- if (showContextMenu) {
17674
- setShowContextMenu(false);
17675
- }
17676
- };
17677
- useEffect(function () {
17678
- if (isOpen) {
17679
- refetch();
17680
- }
17681
- }, [isOpen]);
17682
- useEffect(function () {
17683
- if (isOpen) {
17684
- var tree = buildTagsTreeV2(tagsTree !== null && tagsTree !== void 0 ? tagsTree : []);
17685
- setTagsTreeData(tree);
17686
- }
17687
- }, [tagsTreeIsSuccess, tagsTreeIsFetched]);
17688
- useEffect(function () {
17689
- if (tagsTreeError && tagsTreeIsError) {
17690
- setError(tagsTreeError.message);
17691
- }
17692
- }, [tagsTreeError, tagsTreeIsError]);
17693
- return (React__default.createElement(React__default.Fragment, null,
17694
- React__default.createElement("div", { style: {
17695
- display: isOpen ? "block" : "none",
17696
- minHeight: "700px",
17697
- minWidth: "800px",
17698
- }, onClick: handleCloseContextMenu },
17699
- React__default.createElement("div", { style: { overflowY: "auto", maxHeight: "700px" } }, isLoading || tagsTreeLoading ? (React__default.createElement(Grid2, { container: true, justifyContent: "center", alignItems: "center", style: { minHeight: "100px" } },
17700
- React__default.createElement(CircularProgress, { size: "2rem" }))) : (React__default.createElement(DndProvider$1, { backend: HTML5Backend },
17701
- React__default.createElement(Box, { sx: {
17702
- "& .root": {
17703
- boxSizing: "border-box",
17704
- height: "100%",
17705
- padding: "32px",
17706
- },
17707
- "& .dropTarget": {
17708
- boxShadow: "0 0 0 1px #1967d2 inset",
17709
- },
17710
- } },
17711
- React__default.createElement(Tree, { classes: {
17712
- root: "root",
17713
- dropTarget: "dropTarget",
17714
- }, initialOpen: expanded, tree: tagsTreeData, rootId: backendOffset, onDrop: handleDrop, canDrop: function (tag, options) {
17715
- return !selectedNodes.some(function (selectedNode) {
17716
- return Number(selectedNode.id) ===
17717
- Number(options.dropTargetId);
17718
- });
17719
- }, render: function (node, options) {
17720
- var selected = selectedNodes.some(function (selectedNode) {
17721
- return Number(selectedNode.id) === Number(node.id);
17722
- });
17723
- return (React__default.createElement(TagFolderCustomNode, { setContextMenuOver: handleContextMenu, node: node, options: options, isSelected: selected, openTagFolders: openTagFolders, setOpenTagFolders: setOpenTagFolders, handleSelect: handleClick }));
17724
- }, dragPreviewRender: function (monitorProps) { return (React__default.createElement(CustomDragPreview, { monitorProps: monitorProps })
17725
- // <div>{monitorProps.item.data?.TagName}</div>
17726
- ); } })))))),
17727
- React__default.createElement(ContextMenu, { anchorPoint: anchorPoint, isOpen: showContextMenu, setShowContextMenu: setShowContextMenu, tagNodeSelectedInTree: tagNodeSelectedInTree, getTagsTreeData: function () { return refetch(); } }),
17728
- React__default.createElement(ErrorModal, { error: error, onHide: function () { return setError(""); } })));
17729
- };
17730
-
17731
- var TagsTreeModal = function (_a) {
17732
- var open = _a.open, handleClose = _a.handleClose, onTagSelect = _a.onTagSelect;
17733
- return (React__default.createElement(React__default.Fragment, null,
17734
- React__default.createElement(MesfModal, { open: open, handleClose: handleClose, maxWidth: "lg", "aria-labelledby": "modal-modal-title", "aria-describedby": "modal-modal-description", title: "Tags" },
17735
- React__default.createElement(MesfModal.Content, null,
17736
- React__default.createElement(Box, null,
17737
- React__default.createElement(Typography$1, { id: "modal-modal-description" },
17738
- React__default.createElement(TagSelectionModal, { isOpen: open, onClose: function () { return handleClose; }, onTagSelect: onTagSelect })))))));
17739
- };
17740
-
17741
- var useTagsDataTable = function (_a) {
17742
- var cursorData = _a.cursorData, viewTagsMap = _a.viewTagsMap, chartData = _a.chartData;
17743
- return useMemo(function () {
17744
- var _a;
17745
- var dataTable = {};
17746
- if (cursorData) {
17747
- var _loop_1 = function (viewTagEntry) {
17748
- var tag = viewTagsMap[viewTagEntry].viewTag;
17749
- var datasetForTag = ((_a = chartData.datasets.find(function (ds) {
17750
- return ds.tagId === (tag === null || tag === void 0 ? void 0 : tag.TagId);
17751
- })) === null || _a === void 0 ? void 0 : _a.data) || [];
17752
- var p1 = { x: new Date("1900-01-01"), y: 0 };
17753
- var p2 = { x: new Date("1900-01-01"), y: 0 };
17754
- var p1Found = false;
17755
- var pmin = { x: 0, y: Number.POSITIVE_INFINITY };
17756
- var pmax = { x: 0, y: Number.NEGATIVE_INFINITY };
17757
- for (var idx = 0; idx < datasetForTag.length; idx++) {
17758
- var curr = datasetForTag[idx];
17759
- var currentVal = curr.x;
17760
- if (!p1Found) {
17761
- if (currentVal < cursorData.x1) {
17762
- p1 = curr;
17763
- p2 = JSON.parse(JSON.stringify(p1));
17764
- pmin = JSON.parse(JSON.stringify(p1));
17765
- pmax = JSON.parse(JSON.stringify(p1));
17766
- continue;
17767
- }
17768
- else {
17769
- p1Found = true;
17770
- }
17771
- }
17772
- else {
17773
- if (currentVal < cursorData.x2) {
17774
- p2 = curr;
17775
- if (pmin["y"] > curr["y"]) {
17776
- pmin = JSON.parse(JSON.stringify(curr));
17777
- }
17778
- if (pmax["y"] < curr["y"]) {
17779
- pmax = JSON.parse(JSON.stringify(curr));
17780
- }
17781
- }
17782
- else {
17783
- break;
17784
- }
17785
- }
17786
- }
17787
- dataTable[tag === null || tag === void 0 ? void 0 : tag.TagName] = {
17788
- y1: p1.y,
17789
- y2: p2.y,
17790
- y2y1: Number(p2.y) - Number(p1.y),
17791
- pmin: pmin,
17792
- pmax: pmax,
17793
- };
17794
- };
17795
- for (var viewTagEntry in viewTagsMap) {
17796
- _loop_1(viewTagEntry);
17797
- }
17798
- }
17799
- return dataTable;
17800
- }, [viewTagsMap, chartData, cursorData]);
17801
- };
17802
-
17803
- var formatTimeDiffWithMs = function (start, end) {
17804
- // Calculate total difference in milliseconds
17805
- var totalMilliseconds = end - start;
17806
- // Convert milliseconds to seconds, minutes, hours, days, and months for comparison
17807
- var seconds = totalMilliseconds / 1000;
17808
- var minutes = seconds / 60;
17809
- var hours = minutes / 60;
17810
- var days = hours / 24;
17811
- var months = days / 30; // Approximation of a month
17812
- var remainingSeconds = seconds % 60; // Remaining seconds after full minutes
17813
- if (months > 12) {
17814
- var years = months / 12;
17815
- return "".concat(Math.floor(years), " years, ").concat(Math.floor(months % 12), " months");
17816
- }
17817
- else if (months > 6) {
17818
- return "".concat(Math.floor(months), " months, ").concat(Math.floor(days % 30), " days");
17819
- }
17820
- else if (days > 10) {
17821
- return "".concat(Math.floor(days), " days, ").concat(Math.floor(hours % 24), " hours");
17822
- }
17823
- else if (days > 1) {
17824
- return "".concat(Math.floor(days), " days, ").concat(Math.floor(hours % 24), " hours");
17825
- }
17826
- else if (hours > 12) {
17827
- return "".concat(Math.floor(hours), " hours, ").concat(Math.floor(minutes % 60), " minutes, ").concat(remainingSeconds.toFixed(2), " seconds");
17828
- }
17829
- else if (hours < 1) {
17830
- // If there are 0 hours, return just minutes and remaining seconds
17831
- return "".concat(Math.floor(minutes), " minutes, ").concat(remainingSeconds.toFixed(2), " seconds");
17832
- }
17833
- else {
17834
- // For time intervals less than 12 hours but more than 1 hour, return hours, minutes, and remaining seconds
17835
- return "".concat(Math.floor(hours), " hours, ").concat(Math.floor(minutes % 60), " minutes, ").concat(remainingSeconds.toFixed(2), " seconds");
17836
- }
17837
- };
17838
-
17839
- var TableComponent = function (_a) {
17840
- var chartData = _a.chartData, cursorData = _a.cursorData; _a.viewTagForDelete; var setViewTagForDelete = _a.setViewTagForDelete, selectedRowTagId = _a.selectedRowTagId, setSelectedRowTagId = _a.setSelectedRowTagId;
17841
- var queryClient = useQueryClient();
17842
- var _b = useContextMenuMESF(), registerConfig = _b.registerConfig, showContextMenu = _b.showContextMenu;
17843
- var _c = useTrendingContext(), _d = _c.state, viewTags = _d.viewTags, viewSelected = _d.viewSelected, _e = _c.actions, setViewTags = _e.setViewTags, setViewTagsAndRefetch = _e.setViewTagsAndRefetch;
17844
- var _f = useState(""), error = _f[0], setError = _f[1];
17845
- var _g = useState(false); _g[0]; var setIsLoading = _g[1];
17846
- var _h = useState(false), tagsTreeModalOpen = _h[0], setTagsTreeModalOpen = _h[1];
17847
- var _j = useState(false), saveAsViewModalOpen = _j[0], setSaveAsViewModalOpen = _j[1];
17848
- var _k = useState(false), loadViewOpen = _k[0], setLoadViewOpen = _k[1];
17849
- var _l = useState(""), snackbarMessage = _l[0], setSnackbarMessage = _l[1];
17850
- var deleteAllViewTags = useMutation({
17851
- mutationFn: deleteAllViewTagsFromView,
17852
- onError: function (error) {
17853
- setError(error.message);
17854
- },
17855
- });
17856
- var updateView = useMutation({
17857
- mutationFn: upsertView,
17858
- onSuccess: function () { return __awaiter(void 0, void 0, void 0, function () {
17859
- var results;
17860
- var _a;
17861
- return __generator(this, function (_b) {
17862
- switch (_b.label) {
17863
- case 0: return [4 /*yield*/, deleteAllViewTags.mutate((_a = viewSelected === null || viewSelected === void 0 ? void 0 : viewSelected.ViewId) !== null && _a !== void 0 ? _a : 0)];
17864
- case 1:
17865
- _b.sent();
17866
- return [4 /*yield*/, Promise.allSettled(Object.values(viewTags)
17867
- .sort(function (a, b) { return b.order - a.order; })
17868
- .map(function (_a) {
17869
- var _b;
17870
- var _c = _a.viewTag, TagId = _c.TagId, Color = _c.Color, MinScale = _c.MinScale, MaxScale = _c.MaxScale, IsAutoScale = _c.IsAutoScale, IsVisible = _c.IsVisible, Unit = _c.Unit;
17871
- updateViewTag.mutate({
17872
- viewId: (_b = viewSelected === null || viewSelected === void 0 ? void 0 : viewSelected.ViewId) !== null && _b !== void 0 ? _b : 0,
17873
- tagId: TagId,
17874
- color: Color,
17875
- minScale: MinScale,
17876
- maxScale: MaxScale,
17877
- isVisible: IsVisible,
17878
- isAutoScale: IsAutoScale,
17879
- unit: Unit,
17880
- });
17881
- }))];
17882
- case 2:
17883
- results = _b.sent();
17884
- results.forEach(function (result, index) {
17885
- if (result.status === "rejected") {
17886
- setError("Tag ".concat(index, " failed with reason: ").concat(result.reason));
17887
- }
17888
- else {
17889
- setSelectedRowTagId(null);
17890
- setSnackbarMessage("View saved successfully");
17891
- }
17892
- });
17893
- return [2 /*return*/];
17894
- }
17895
- });
17896
- }); },
17897
- onError: function (error) {
17898
- setError(error.message);
17899
- },
17900
- });
17901
- var saveTags = useMutation({
17902
- mutationFn: saveTagDefaults,
17903
- onError: function (error) {
17904
- setError(error.message);
17905
- },
17906
- });
17907
- var updateViewTag = useMutation({
17908
- mutationFn: upsertViewTag,
17909
- onError: function (error) {
17910
- setError(error.message);
17911
- },
17912
- });
17913
- var dataTable = useTagsDataTable({
17914
- viewTagsMap: viewTags,
17915
- chartData: chartData,
17916
- cursorData: cursorData,
17917
- });
17918
- var handleChange = function (tagId, value, property) {
17919
- var _a, _b;
17920
- setViewTags(__assign(__assign({}, viewTags), (_a = {}, _a[tagId] = __assign(__assign({}, viewTags[tagId]), { viewTag: __assign(__assign({}, viewTags[tagId].viewTag), (_b = {}, _b[property] = value, _b.IsAutoScale = false, _b)) }), _a)));
17921
- };
17922
- var handleChangeScale = function (value, scale, tagId) {
17923
- handleChange(tagId, value, scale);
17924
- };
17925
- var handleChangeAlias = function (tagId, newName) {
17926
- var _a;
17927
- setViewTags(__assign(__assign({}, viewTags), (_a = {}, _a[tagId] = __assign(__assign({}, viewTags[tagId]), { viewTag: __assign(__assign({}, viewTags[tagId].viewTag), { Alias: newName }) }), _a)));
17928
- };
17929
- var handleVisibilityChange = function (tagId, value) {
17930
- var _a;
17931
- setViewTags(__assign(__assign({}, viewTags), (_a = {}, _a[tagId] = __assign(__assign({}, viewTags[tagId]), { viewTag: __assign(__assign({}, viewTags[tagId].viewTag), { IsVisible: value }) }), _a)));
17932
- };
17933
- var handleUnitChange = function (tagId, newUnit) {
17934
- var _a;
17935
- setViewTags(__assign(__assign({}, viewTags), (_a = {}, _a[tagId] = __assign(__assign({}, viewTags[tagId]), { viewTag: __assign(__assign({}, viewTags[tagId].viewTag), { Unit: newUnit }) }), _a)));
17936
- };
17937
- var handleAutoScaleChange = function (tagId, checked) {
17938
- var _a;
17939
- setViewTags(__assign(__assign({}, viewTags), (_a = {}, _a[tagId] = __assign(__assign({}, viewTags[tagId]), { viewTag: __assign(__assign({}, viewTags[tagId].viewTag), { IsAutoScale: !checked }) }), _a)));
17940
- };
17941
- var handleColorChange = function (tagId, value) {
17942
- var _a;
17943
- setViewTags(__assign(__assign({}, viewTags), (_a = {}, _a[tagId] = __assign(__assign({}, viewTags[tagId]), { viewTag: __assign(__assign({}, viewTags[tagId].viewTag), { Color: value }) }), _a)));
17944
- };
17945
- var handleDeleteTag = function (tagId) {
17946
- var _a = viewTags, _b = tagId; _a[_b]; var newTags = __rest(_a, [typeof _b === "symbol" ? _b : _b + ""]);
17947
- setViewTagsAndRefetch(newTags);
17948
- };
17949
- var handleAddTag = function (newTag) {
17950
- var _a;
17951
- setViewTagsAndRefetch(__assign(__assign({}, viewTags), (_a = {}, _a[newTag.TagId] = {
17952
- viewTag: __assign(__assign({}, newTag), { IsVisible: true, TagType: newTag.TagTypeCode, Color: newTag.Color || getRandomColor(), IsAutoScale: newTag.MinScale || newTag.MaxScale ? false : true }),
17953
- order: Object.keys(viewTags).length,
17954
- }, _a)));
17955
- };
17956
- var handleAbleScales = function (tagId, checked) {
17957
- if (checked) {
17958
- handleAutoScaleChange(tagId, checked);
17959
- }
17960
- };
17961
- var handleClose = function () { return setTagsTreeModalOpen(false); };
17962
- var getMenuOptions = function (data) {
17963
- var options = [];
17964
- if (data) {
17965
- options.push({
17966
- key: "delete",
17967
- name: "Remove Tag",
17968
- onClick: function () {
17969
- if (!isNil(data)) {
17970
- handleDeleteTag(data.TagId);
17971
- setSelectedRowTagId(null);
17972
- setViewTagForDelete(null);
17973
- }
17974
- },
17975
- });
17976
- }
17977
- options = options.concat([
17978
- {
17979
- key: "add",
17980
- name: "Tags Tree",
17981
- onClick: function () {
17982
- setTagsTreeModalOpen(true);
17983
- },
17984
- },
17985
- {
17986
- key: "saveDefault",
17987
- name: "Save Default To Tag",
17988
- onClick: function () {
17989
- handleSaveDefaultToTag(data.TagId);
17990
- },
17991
- },
17992
- {
17993
- key: "saveView",
17994
- name: "Save View",
17995
- onClick: function () {
17996
- handleSaveView();
17997
- },
17998
- },
17999
- {
18000
- key: "saveViewAs",
18001
- name: "Save View as",
18002
- onClick: function () {
18003
- setSaveAsViewModalOpen(true);
18004
- },
18005
- },
18006
- {
18007
- key: "loadView",
18008
- name: "Load View",
18009
- onClick: function () {
18010
- setLoadViewOpen(true);
18011
- },
18012
- },
18013
- ]);
18014
- return options;
18015
- };
18016
- var handleTagSelect = function (selectedTag) {
18017
- var alreadySelected = viewTags[selectedTag.Tagkey];
18018
- if (!alreadySelected) {
18019
- handleAddTag(selectedTag);
18020
- }
18021
- else {
18022
- setError("".concat(selectedTag.TagName, " is already selected"));
18023
- }
18024
- };
18025
- var handleSaveView = function () { return __awaiter(void 0, void 0, void 0, function () {
18026
- return __generator(this, function (_a) {
18027
- switch (_a.label) {
18028
- case 0:
18029
- if (!!viewSelected) return [3 /*break*/, 1];
18030
- setSaveAsViewModalOpen(true);
18031
- return [2 /*return*/];
18032
- case 1:
18033
- setIsLoading(true);
18034
- if (!(viewSelected === null || viewSelected === void 0 ? void 0 : viewSelected.ViewId)) return [3 /*break*/, 3];
18035
- return [4 /*yield*/, updateView.mutate({
18036
- viewId: viewSelected === null || viewSelected === void 0 ? void 0 : viewSelected.ViewId,
18037
- viewName: viewSelected.ViewName,
18038
- isPublic: viewSelected.IsPublic,
18039
- })];
18040
- case 2:
18041
- _a.sent();
18042
- _a.label = 3;
18043
- case 3:
18044
- setIsLoading(false);
18045
- _a.label = 4;
18046
- case 4: return [2 /*return*/];
18047
- }
18048
- });
18049
- }); };
18050
- var handleCloseSnackbar = function (event, reason) {
18051
- if (reason === "clickaway") {
18052
- return;
18053
- }
18054
- setSnackbarMessage("");
18055
- };
18056
- useEffect(function () {
18057
- var handleGlobalClick = function (e) {
18058
- if (selectedRowTagId !== null) {
18059
- setSelectedRowTagId(null);
18060
- }
18061
- };
18062
- var handleKeyDown = function (e) {
18063
- if (e.key === "Escape" && selectedRowTagId !== null) {
18064
- setSelectedRowTagId(null);
18065
- }
18066
- };
18067
- // Attach event listeners
18068
- document.addEventListener("click", handleGlobalClick);
18069
- document.addEventListener("keydown", handleKeyDown);
18070
- // Cleanup function
18071
- return function () {
18072
- document.removeEventListener("click", handleGlobalClick);
18073
- document.removeEventListener("keydown", handleKeyDown);
18074
- };
18075
- }, [selectedRowTagId]);
18076
- var handleSaveDefaultToTag = function (selectedRowTagId) { return __awaiter(void 0, void 0, void 0, function () {
18077
- var _a, TagId, Alias, Color, MinScale, MaxScale, Unit, IsVisible, IsAutoScale;
18078
- return __generator(this, function (_b) {
18079
- switch (_b.label) {
18080
- case 0:
18081
- if (!(viewSelected && selectedRowTagId !== null)) return [3 /*break*/, 3];
18082
- _a = viewTags[selectedRowTagId].viewTag, TagId = _a.TagId, Alias = _a.Alias, Color = _a.Color, MinScale = _a.MinScale, MaxScale = _a.MaxScale, Unit = _a.Unit, IsVisible = _a.IsVisible, IsAutoScale = _a.IsAutoScale;
18083
- return [4 /*yield*/, saveTags.mutate({
18084
- tagId: TagId,
18085
- alias: Alias,
18086
- color: Color,
18087
- minScale: MinScale,
18088
- maxScale: MaxScale,
18089
- unit: Unit,
18090
- })];
18091
- case 1:
18092
- _b.sent();
18093
- return [4 /*yield*/, updateViewTag.mutate({
18094
- viewId: viewSelected === null || viewSelected === void 0 ? void 0 : viewSelected.ViewId,
18095
- tagId: TagId,
18096
- color: Color,
18097
- minScale: MinScale,
18098
- maxScale: MaxScale,
18099
- isVisible: IsVisible,
18100
- isAutoScale: IsAutoScale,
18101
- unit: Unit,
18102
- })];
18103
- case 2:
18104
- _b.sent();
18105
- setSelectedRowTagId(null);
18106
- _b.label = 3;
18107
- case 3: return [2 /*return*/];
18108
- }
18109
- });
18110
- }); };
18111
- useEffect(function () {
18112
- registerConfig({
18113
- id: "chartContext",
18114
- getOptions: getMenuOptions,
18115
- });
18116
- }, [viewTags, selectedRowTagId]);
18117
- return (React__default.createElement(React__default.Fragment, null,
18118
- React__default.createElement(Grid2, { container: true, spacing: 1, alignContent: "flex-start", style: {
18119
- height: "100%",
18120
- maxHeight: "100%",
18121
- overflowY: "auto",
18122
- } },
18123
- React__default.createElement(Grid2, { size: { xs: 12 }, style: {
18124
- position: "sticky",
18125
- background: "white",
18126
- top: 0,
18127
- left: 0,
18128
- zIndex: 1000,
18129
- } },
18130
- React__default.createElement(TableContainer, { component: Paper, style: {
18131
- overflowX: "auto",
18132
- width: "100%",
18133
- boxShadow: "none",
18134
- border: "none",
18135
- } },
18136
- React__default.createElement(Table, { size: "small", style: { width: "100%", tableLayout: "fixed" } },
18137
- React__default.createElement(TableHead, null,
18138
- React__default.createElement(TableRow, null,
18139
- React__default.createElement(TableCell, { align: "center", sx: {
18140
- border: "0.0625rem solid black",
18141
- borderBottom: "none",
18142
- backgroundColor: "#f5f7f7",
18143
- color: "#333",
18144
- fontWeight: "normal",
18145
- textAlign: "center",
18146
- width: "26.125rem",
18147
- padding: "0",
18148
- } }, viewSelected ? (React__default.createElement(Button, { variant: "text", style: {
18149
- color: "#0075ff",
18150
- width: "26.125rem",
18151
- padding: "0",
18152
- }, onClick: function () { return setLoadViewOpen(true); }, startIcon: viewSelected.IsPublic ? (React__default.createElement(React__default.Fragment, null)) : (React__default.createElement(LockIcon, { fontSize: "small" })) }, (viewSelected === null || viewSelected === void 0 ? void 0 : viewSelected.ViewName) || "")) : (React__default.createElement(Button, { variant: "text", style: {
18153
- color: "#0075ff",
18154
- width: "26.125rem",
18155
- padding: "0",
18156
- }, onClick: function () { return setSaveAsViewModalOpen(true); } },
18157
- React__default.createElement("i", null,
18158
- React__default.createElement(SaveIcon, null),
18159
- "(Save view as)")))),
18160
- React__default.createElement(TableCell, { align: "center", colSpan: 4, sx: {
18161
- border: "0.0625rem solid black",
18162
- borderBottom: "none",
18163
- backgroundColor: "#f5f7f7",
18164
- color: "#333",
18165
- fontWeight: "normal",
18166
- textAlign: "center",
18167
- width: "37.5rem",
18168
- padding: "0",
18169
- } }, "Scale"),
18170
- React__default.createElement(TableCell, { align: "center", sx: {
18171
- border: "0.0625rem solid black",
18172
- borderBottom: "none",
18173
- backgroundColor: "#f5f7f7",
18174
- color: "#333",
18175
- fontWeight: "normal",
18176
- textAlign: "center",
18177
- padding: "6px 0",
18178
- } }, cursorData
18179
- ? (function () {
18180
- var dateX1 = new Date(cursorData.x1);
18181
- var dateX2 = new Date(cursorData.x2);
18182
- var formattedDate = dateX1.toLocaleString("en-US", __assign({ hour12: false, month: "short", day: "numeric" }, (dateX1.getFullYear() !==
18183
- dateX2.getFullYear() && { year: "numeric" })));
18184
- var dateText = "".concat(formattedDate);
18185
- return (React__default.createElement(React__default.Fragment, null,
18186
- React__default.createElement("span", { style: {
18187
- height: "10px",
18188
- width: "10px",
18189
- backgroundColor: "red",
18190
- borderRadius: "50%",
18191
- display: "inline-block",
18192
- marginRight: "5px",
18193
- } }),
18194
- dateText));
18195
- })()
18196
- : null),
18197
- React__default.createElement(TableCell, { align: "center", sx: {
18198
- border: "0.0625rem solid black",
18199
- borderBottom: "none",
18200
- backgroundColor: "#f5f7f7",
18201
- color: "#333",
18202
- fontWeight: "normal",
18203
- textAlign: "center",
18204
- padding: "6px 0",
18205
- } }, cursorData
18206
- ? (function () {
18207
- var dateX1 = new Date(cursorData.x1);
18208
- var dateX2 = new Date(cursorData.x2);
18209
- var formattedDate = dateX2.toLocaleString("en-US", __assign({ hour12: false, month: "short", day: "numeric" }, (dateX1.getFullYear() !==
18210
- dateX2.getFullYear() && { year: "numeric" })));
18211
- var dateText = "".concat(formattedDate);
18212
- return (React__default.createElement(React__default.Fragment, null,
18213
- React__default.createElement("span", { style: {
18214
- height: "10px",
18215
- width: "10px",
18216
- backgroundColor: "blue",
18217
- borderRadius: "50%",
18218
- display: "inline-block",
18219
- marginRight: "5px",
18220
- } }),
18221
- dateText));
18222
- })()
18223
- : null),
18224
- React__default.createElement(TableCell, { align: "center", colSpan: 3, sx: {
18225
- border: "0.0625rem solid black",
18226
- borderBottom: "none",
18227
- backgroundColor: "#f5f7f7",
18228
- color: "#333",
18229
- fontWeight: "normal",
18230
- textAlign: "center",
18231
- padding: "6px 0",
18232
- } }, cursorData
18233
- ? formatTimeDiffWithMs(cursorData.x1, cursorData.x2)
18234
- : null)))),
18235
- React__default.createElement(Table, { size: "small", style: { width: "100%", tableLayout: "fixed" } },
18236
- React__default.createElement(TableHead, null,
18237
- React__default.createElement(TableRow, { sx: {
18238
- "& th": {
18239
- border: "0.0625rem solid black",
18240
- backgroundColor: "#f5f7f7",
18241
- color: "#333",
18242
- fontWeight: "normal",
18243
- textAlign: "center",
18244
- padding: "6px 0",
18245
- },
18246
- } },
18247
- React__default.createElement(TableCell, { align: "center", sx: {
18248
- width: "3.75rem", // 60px / 16px
18249
- fontSize: "0.75rem",
18250
- } }, "Visible"),
18251
- React__default.createElement(TableCell, { align: "center", sx: {
18252
- width: "18rem",
18253
- overflow: "hidden",
18254
- textOverflow: "ellipsis",
18255
- whiteSpace: "nowrap",
18256
- } }, "Alias / Tagname"),
18257
- React__default.createElement(TableCell, { align: "center", sx: {
18258
- width: "4.375rem", // 70px / 16px
18259
- } }, "Color"),
18260
- React__default.createElement(TableCell, { align: "center", sx: {
18261
- width: "11.25rem", // 180px / 16px
18262
- overflow: "hidden",
18263
- textOverflow: "ellipsis",
18264
- whiteSpace: "nowrap",
18265
- } }, "Min Scale"),
18266
- React__default.createElement(TableCell, { align: "center", sx: {
18267
- width: "11.25rem", // 180px / 16px
18268
- overflow: "hidden",
18269
- textOverflow: "ellipsis",
18270
- whiteSpace: "nowrap",
18271
- } }, "Max Scale"),
18272
- React__default.createElement(TableCell, { align: "center", sx: {
18273
- width: "7.5rem", // 120px / 16px
18274
- } }, "AutoScale"),
18275
- React__default.createElement(TableCell, { align: "center", sx: {
18276
- width: "7.5rem", // 120px / 16px
18277
- } }, "Unit"),
18278
- React__default.createElement(TableCell, { align: "center" },
18279
- " ",
18280
- cursorData
18281
- ? (function () {
18282
- var date = new Date(cursorData.x1);
18283
- var formattedHour = date.toLocaleString("en-US", {
18284
- hour12: false,
18285
- hour: "2-digit",
18286
- minute: "2-digit",
18287
- second: "2-digit",
18288
- });
18289
- var milliseconds = (date.getMilliseconds() / 1000)
18290
- .toFixed(2)
18291
- .substring(2);
18292
- var dateText = "".concat(formattedHour, ".").concat(milliseconds, " hs");
18293
- return React__default.createElement(React__default.Fragment, null, dateText);
18294
- })()
18295
- : null,
18296
- " "),
18297
- React__default.createElement(TableCell, { align: "center" },
18298
- " ",
18299
- cursorData
18300
- ? (function () {
18301
- var date = new Date(cursorData.x2);
18302
- var formattedHour = date.toLocaleString("en-US", {
18303
- hour12: false,
18304
- hour: "2-digit",
18305
- minute: "2-digit",
18306
- second: "2-digit",
18307
- });
18308
- var milliseconds = (date.getMilliseconds() / 1000)
18309
- .toFixed(2)
18310
- .substring(2);
18311
- var dateText = "".concat(formattedHour, ".").concat(milliseconds, " hs");
18312
- return React__default.createElement(React__default.Fragment, null, dateText);
18313
- })()
18314
- : null,
18315
- " "),
18316
- React__default.createElement(TableCell, { align: "center" }, "Y2-Y1"),
18317
- React__default.createElement(TableCell, { align: "center" }, "Min"),
18318
- React__default.createElement(TableCell, { align: "center" }, "Max")))))),
18319
- React__default.createElement(Grid2, { size: { xs: 12 } },
18320
- React__default.createElement(TableContainer, { component: Paper, style: {
18321
- width: "100%",
18322
- height: "100%",
18323
- maxHeight: "100%",
18324
- boxShadow: "none",
18325
- border: "none",
18326
- } },
18327
- React__default.createElement(Table, { size: "small", style: { width: "100%", tableLayout: "fixed" } },
18328
- React__default.createElement(TableBody, null, Object.values(viewTags).length ? (Object.values(viewTags).map(function (_a) {
18329
- var _b, _c, _d, _e, _f, _g, _h;
18330
- var tag = _a.viewTag;
18331
- return (React__default.createElement(TableRow, { key: tag.TagName, onContextMenu: function (e) {
18332
- showContextMenu(e, tag, "chartContext");
18333
- }, sx: {
18334
- "&:hover": {
18335
- backgroundColor: "#f2f2f2",
18336
- },
18337
- } },
18338
- React__default.createElement(TableCell, { align: "center", sx: {
18339
- width: "3.75rem", // 60px / 16px
18340
- fontSize: "0.75rem",
18341
- '& input[type="checkbox"]': {
18342
- zoom: 1.5,
18343
- },
18344
- textAlign: "center",
18345
- } },
18346
- React__default.createElement("input", { type: "checkbox", checked: tag.IsVisible, onChange: function (e) {
18347
- return handleVisibilityChange(tag.TagId, e.target.checked);
18348
- } })),
18349
- React__default.createElement(TableCell, { sx: {
18350
- width: "18rem",
18351
- overflow: "hidden",
18352
- textOverflow: "ellipsis",
18353
- whiteSpace: "nowrap",
18354
- } },
18355
- React__default.createElement(Tooltip, { title: tag.TagName, placement: "top", arrow: true, enterDelay: 500 },
18356
- React__default.createElement("div", { style: { display: "flex", alignItems: "center" } },
18357
- tag.TagType && (React__default.createElement("div", { style: {
18358
- backgroundColor: tag.TagType === "A" ? "#AD48C4" : "#C46F48",
18359
- width: "30px",
18360
- height: "30px",
18361
- color: "white",
18362
- display: "flex",
18363
- justifyContent: "center",
18364
- alignItems: "center",
18365
- cursor: "pointer",
18366
- border: "1px black solid",
18367
- } }, tag.TagType)),
18368
- React__default.createElement("input", { type: "text", style: { width: "100%" }, value: tag.Alias || tag.TagName, onFocus: function (e) { return e.target.select(); }, onChange: function (e) {
18369
- var newAlias = e.target.value;
18370
- handleChangeAlias(tag.TagId, newAlias);
18371
- } })))),
18372
- React__default.createElement(TableCell, { align: "center", sx: {
18373
- width: "4.375rem", // 70px / 16px
18374
- } },
18375
- React__default.createElement(ColorPicker, { onChange: handleColorChange, color: tag.Color, elementId: tag.TagId })),
18376
- React__default.createElement(TableCell, { sx: {
18377
- width: "11.25rem", // 180px / 16px
18378
- overflow: "hidden",
18379
- textOverflow: "ellipsis",
18380
- whiteSpace: "nowrap",
18381
- } },
18382
- React__default.createElement(Box, { component: "input", type: "number", sx: __assign({ "&::-webkit-inner-spin-button, &::-webkit-outer-spin-button": {
18383
- "-webkit-appearance": "none",
18384
- margin: 0,
18385
- }, "&": {
18386
- "-moz-appearance": "textfield", // to Firefox
18387
- }, width: "100%" }, (tag.IsAutoScale
18388
- ? {
18389
- backgroundColor: "rgba(239, 239, 239, 0.3)",
18390
- color: "rgba(84, 84, 84, 1)",
18391
- border: "1px solid rgba(118, 118, 118, 0.3)",
18392
- }
18393
- : {})), value: tag.MinScale, onClick: function () {
18394
- return handleAbleScales(tag.TagId, tag.IsAutoScale);
18395
- }, onFocus: function (e) { return e.target.select(); }, onChange: function (e) {
18396
- return handleChangeScale(e.target.value, "MinScale", tag.TagId);
18397
- } })),
18398
- React__default.createElement(TableCell, { sx: {
18399
- width: "11.25rem", // 180px / 16px
18400
- overflow: "hidden",
18401
- textOverflow: "ellipsis",
18402
- whiteSpace: "nowrap",
18403
- } },
18404
- React__default.createElement(Box, { component: "input", type: "number", sx: __assign({ "&::-webkit-inner-spin-button, &::-webkit-outer-spin-button": {
18405
- "-webkit-appearance": "none",
18406
- margin: 0,
18407
- }, "&": {
18408
- "-moz-appearance": "textfield", // to Firefox
18409
- }, width: "100%", WebkitAppearance: "none" }, (tag.IsAutoScale
18410
- ? {
18411
- backgroundColor: "rgba(239, 239, 239, 0.3)",
18412
- color: "rgba(84, 84, 84, 1)",
18413
- border: "1px solid rgba(118, 118, 118, 0.3)",
18414
- }
18415
- : {})), value: tag.MaxScale, onClick: function () {
18416
- return handleAbleScales(tag.TagId, tag.IsAutoScale);
18417
- }, onFocus: function (e) { return e.target.select(); }, onChange: function (e) {
18418
- handleChangeScale(e.target.value, "MaxScale", tag.TagId);
18419
- } })),
18420
- React__default.createElement(TableCell, { align: "center", sx: {
18421
- width: "7.5rem", // 120px / 16px
18422
- '& input[type="checkbox"]': {
18423
- zoom: 1.5,
18424
- },
18425
- textAlign: "center",
18426
- } },
18427
- React__default.createElement("input", { type: "checkbox", checked: !!tag.IsAutoScale, onChange: function (e) {
18428
- return handleAutoScaleChange(tag.TagId, tag.IsAutoScale);
18429
- } })),
18430
- React__default.createElement(TableCell, { sx: {
18431
- width: "7.5rem", // 120px / 16px
18432
- '& input[type="checkbox"]': {
18433
- zoom: 1.5,
18434
- },
18435
- textAlign: "center",
18436
- } },
18437
- React__default.createElement("input", { type: "text", style: {
18438
- width: "100%",
18439
- }, onClick: function () {
18440
- return handleAbleScales(tag.TagId, tag.IsAutoScale);
18441
- }, onChange: function (e) {
18442
- var value = e.target.value;
18443
- handleUnitChange(tag.TagId, value);
18444
- }, value: tag.Unit === "-" ? "" : tag.Unit, onFocus: function (e) { return e.target.select(); } })),
18445
- React__default.createElement(TableCell, { align: "center" }, round((_b = dataTable[tag.TagName]) === null || _b === void 0 ? void 0 : _b.y1, 3) || 0),
18446
- React__default.createElement(TableCell, { align: "center", sx: {
18447
- padding: "0",
18448
- '& input[type="text"] ': {
18449
- width: "100%", // 180px / 16px,
18450
- height: "17px",
18451
- display: "block",
18452
- margin: "0",
18453
- padding: "0",
18454
- },
18455
- } }, round((_c = dataTable[tag.TagName]) === null || _c === void 0 ? void 0 : _c.y2, 3) || 0),
18456
- React__default.createElement(TableCell, { align: "center" }, round((_d = dataTable[tag.TagName]) === null || _d === void 0 ? void 0 : _d.y2y1, 3) || 0),
18457
- React__default.createElement(TableCell, { align: "center" },
18458
- !isNaN$1(((_e = dataTable[tag.TagName]) === null || _e === void 0 ? void 0 : _e.pmin.y) * 0)
18459
- ? round((_f = dataTable[tag.TagName]) === null || _f === void 0 ? void 0 : _f.pmin.y, 3)
18460
- : 0,
18461
- " "),
18462
- React__default.createElement(TableCell, { align: "center" },
18463
- !isNaN$1(((_g = dataTable[tag.TagName]) === null || _g === void 0 ? void 0 : _g.pmax.y) * 0)
18464
- ? round((_h = dataTable[tag.TagName]) === null || _h === void 0 ? void 0 : _h.pmax.y)
18465
- : 0,
18466
- " ")));
18467
- })) : (React__default.createElement(TableRow, null,
18468
- React__default.createElement(TableCell, { colSpan: 12 },
18469
- React__default.createElement(Box, { sx: {
18470
- display: "flex",
18471
- flexDirection: "column",
18472
- alignItems: "center",
18473
- justifyContent: "center",
18474
- padding: 4,
18475
- gap: 2,
18476
- } },
18477
- React__default.createElement("div", null, "No tag view detected."),
18478
- React__default.createElement(Button, { onClick: function () { return setTagsTreeModalOpen(true); }, variant: "contained", color: "primary" }, "Add tag"),
18479
- React__default.createElement(Button, { onClick: function () { return setLoadViewOpen(true); }, variant: "outlined", color: "primary" }, "Load view"))))))))),
18480
- React__default.createElement(TagsTreeModal, { open: tagsTreeModalOpen, handleClose: handleClose, onTagSelect: handleTagSelect }),
18481
- React__default.createElement(SaveAsViewModal, { open: saveAsViewModalOpen, handleClose: function (shouldUpdate) { return __awaiter(void 0, void 0, void 0, function () {
18482
- return __generator(this, function (_a) {
18483
- switch (_a.label) {
18484
- case 0:
18485
- setSaveAsViewModalOpen(false);
18486
- if (!shouldUpdate) return [3 /*break*/, 2];
18487
- return [4 /*yield*/, queryClient.invalidateQueries({ queryKey: ["views"] })];
18488
- case 1:
18489
- _a.sent();
18490
- _a.label = 2;
18491
- case 2: return [2 /*return*/];
18492
- }
18493
- });
18494
- }); } }),
18495
- React__default.createElement(LoadViewModal, { open: loadViewOpen, handleClose: function (shouldUpdate) {
18496
- setLoadViewOpen(false);
18497
- } })),
18498
- React__default.createElement(ErrorModal, { error: error, onHide: function () { return setError(""); } }),
18499
- React__default.createElement(Snackbar, { open: !!snackbarMessage, autoHideDuration: 800, onClose: handleCloseSnackbar, anchorOrigin: { vertical: "bottom", horizontal: "center" } },
18500
- React__default.createElement(Alert$2, { onClose: handleCloseSnackbar, severity: "success" }, snackbarMessage))));
18501
- };
18502
-
18503
- var formatDateTimeToString = function (date) {
18504
- var hour = date.getHours().toString().padStart(2, "0");
18505
- var minute = date.getMinutes().toString().padStart(2, "0");
18506
- var second = date.getSeconds().toString().padStart(2, "0");
18507
- if (hour === "24") {
18508
- hour = "00";
18509
- }
18510
- var formattedDate = date.toLocaleDateString("en-US", {
18511
- month: "short",
18512
- day: "numeric",
18513
- });
18514
- var formattedTime = "".concat(hour, ":").concat(minute, ":").concat(second);
18515
- return { formattedDate: formattedDate, formattedTime: formattedTime };
18516
- };
18517
-
18518
- var useChartOptions = function () {
18519
- var _a = useTrendingContext(); _a.state; var actions = _a.actions;
18520
- var debounceTimerRef = useRef(null);
18521
- var handleZoom = useCallback(function (_a) {
18522
- var chart = _a.chart;
18523
- if (debounceTimerRef.current) {
18524
- clearTimeout(debounceTimerRef.current);
18525
- }
18526
- debounceTimerRef.current = setTimeout(function () {
18527
- // Handle zoom event and execute fetch
18528
- var newStart = new Date(chart.scales.x.min);
18529
- var newEnd = new Date(chart.scales.x.max);
18530
- actions.setTotalScope({
18531
- start: newStart,
18532
- end: newEnd,
18533
- });
18534
- }, 1000);
18535
- }, [actions]);
18536
- var handlePan = useCallback(function (_a) {
18537
- var chart = _a.chart;
18538
- if (debounceTimerRef.current) {
18539
- clearTimeout(debounceTimerRef.current);
18540
- }
18541
- debounceTimerRef.current = setTimeout(function () {
18542
- // Handle pan event and execute fetch
18543
- var newStart = new Date(chart.scales.x.min);
18544
- var newEnd = new Date(chart.scales.x.max);
18545
- actions.setTotalScope({
18546
- start: newStart,
18547
- end: newEnd,
18548
- graphPan: true,
18549
- });
18550
- }, 1000);
18551
- }, [actions]);
18552
- var initialOptions = useMemo(function () { return ({
18553
- animation: {
18554
- duration: 0, // No animation
18555
- },
18556
- responsive: true,
18557
- maintainAspectRatio: false,
18558
- scales: {
18559
- x: {
18560
- type: "time",
18561
- ticks: {
18562
- autoSkip: true,
18563
- maxTicksLimit: 20,
18564
- callback: function (value, index, ticks) {
18565
- var currentDate = new Date(value);
18566
- var time = formatDateTimeToString(currentDate).formattedTime;
18567
- var date = formatDateTimeToString(currentDate).formattedDate;
18568
- // Si es el primer tick, siempre muestra la fecha y hora
18569
- if (index === 0) {
18570
- return [time, date];
18571
- }
18572
- // De lo contrario, solo muestra la hora
18573
- return time;
18574
- },
18575
- },
18576
- grid: {
18577
- display: true,
18578
- },
18579
- },
18580
- y: {
18581
- grid: {
18582
- display: true,
18583
- },
18584
- afterUpdate: function (axis) {
18585
- var chart = axis.chart;
18586
- var keys = Object.keys(chart.scales).filter(function (sc) { return sc !== "x"; });
18587
- if (keys.length > 1) {
18588
- for (var scaleKey in chart.scales) {
18589
- var scale = chart.scales[scaleKey];
18590
- if (scale.max === 1 && scale.min === 0) {
18591
- chart.scales[scaleKey].display = false;
18592
- chart.scales[scaleKey].options.display = false;
18593
- }
18594
- else {
18595
- chart.scales[scaleKey].display = true;
18596
- chart.scales[scaleKey].options.display = true;
18597
- }
18598
- }
18599
- }
18600
- },
18601
- },
18602
- },
18603
- plugins: {
18604
- tooltip: { enabled: false },
18605
- legend: { display: false },
18606
- zoom: {
18607
- zoom: {
18608
- wheel: { enabled: true, mode: "x" },
18609
- pinch: { enabled: true, mode: "x" },
18610
- onZoom: handleZoom,
18611
- mode: "x",
18612
- },
18613
- pan: {
18614
- enabled: true,
18615
- mode: "x",
18616
- onPan: handlePan,
18617
- },
18618
- },
18619
- },
18620
- }); }, [handleZoom, handlePan]);
18621
- return useState(initialOptions);
18622
- };
18623
-
18624
- var CustomOptionsComponent = function (_a) {
18625
- var customOptions = _a.customOptions, setCustomOptions = _a.setCustomOptions, autoRefresh = _a.autoRefresh, setAutoRefresh = _a.setAutoRefresh;
18626
- var handleGridChange = function (value) {
18627
- setCustomOptions(function (prevOptions) { return (__assign(__assign({}, prevOptions), { showGrid: value })); });
18628
- };
18629
- var handleSteppedChange = function (value) {
18630
- setCustomOptions(function (prevOptions) { return (__assign(__assign({}, prevOptions), { stepped: value })); });
18631
- };
18632
- return (React__default.createElement(React__default.Fragment, null,
18633
- React__default.createElement(Grid2, { sx: {
18634
- paddingLeft: "2rem",
18635
- userSelect: "none",
18636
- "& > label": {
18637
- display: "flex",
18638
- alignItems: "center",
18639
- gap: "5px",
18640
- },
18641
- '& input[type="checkbox"]': {
18642
- zoom: 1.5,
18643
- },
18644
- } },
18645
- React__default.createElement(FormControlLabel, { checked: customOptions.showGrid, control: React__default.createElement(Checkbox, { color: "primary" }), label: "Show Grid", onChange: function (e, checked) {
18646
- handleGridChange(checked);
18647
- } })),
18648
- React__default.createElement(Grid2, { sx: {
18649
- paddingLeft: "2rem",
18650
- userSelect: "none",
18651
- "& > label": {
18652
- display: "flex",
18653
- alignItems: "center",
18654
- gap: "5px",
18655
- },
18656
- '& input[type="checkbox"]': {
18657
- zoom: 1.5,
18658
- },
18659
- } },
18660
- React__default.createElement(FormControlLabel, { checked: customOptions.stepped, control: React__default.createElement(Checkbox, { color: "primary" }), label: "Stepped", onChange: function (e, checked) {
18661
- handleSteppedChange(checked);
18662
- } })),
18663
- React__default.createElement(Grid2, { sx: {
18664
- paddingLeft: "2rem",
18665
- userSelect: "none",
18666
- "& > label": {
18667
- display: "flex",
18668
- alignItems: "center",
18669
- gap: "5px",
18670
- },
18671
- '& input[type="checkbox"]': {
18672
- zoom: 1.5,
18673
- },
18674
- } },
18675
- React__default.createElement(FormControlLabel, { checked: autoRefresh, control: React__default.createElement(Switch, { color: "primary" }), label: "Auto Refresh", onChange: function (e, checked) {
18676
- setAutoRefresh(checked);
18677
- } }))));
18678
- };
18679
-
18680
- var Header = React__default.memo(function (_a) {
18681
- var setChartOptions = _a.setChartOptions, autoRefresh = _a.autoRefresh, setAutoRefresh = _a.setAutoRefresh;
18682
- var _b = useTrendingContext(), state = _b.state, actions = _b.actions;
18683
- var _c = useState({
18684
- showGrid: true,
18685
- stepped: false,
18686
- }), customOptions = _c[0], setCustomOptions = _c[1];
18687
- var handleDateNavigator = function (operator, current) {
18688
- if (current === void 0) { current = false; }
18689
- var newDates = dateNavigator(state.timeScopeStart, state.timeScopeEnd, state.scope, operator, current);
18690
- if (newDates) {
18691
- actions.setTotalScope({
18692
- start: newDates.newStartDate,
18693
- end: newDates.newEndDate,
18694
- scope: state.scope,
18695
- });
18696
- }
18697
- };
18698
- var handleDateChange = function (newValue, key) {
18699
- var _a;
18700
- //@ts-ignore
18701
- actions.setTotalScope((_a = {}, _a[key] = moment$f(newValue).toDate(), _a));
18702
- };
18703
- var handleChangeScope = function (value) {
18704
- actions.setTotalScope({
18705
- scope: value,
18706
- });
18707
- };
18708
- useEffect(function () {
18709
- var changeOptions = function () {
18710
- setChartOptions(function (prevOptions) {
18711
- var newScales = __assign({}, prevOptions.scales);
18712
- Object.keys(newScales).forEach(function (key) {
18713
- if (key) {
18714
- newScales[key] = __assign(__assign({}, newScales[key]), { grid: __assign(__assign({}, newScales[key].grid), { display: customOptions.showGrid }) });
18715
- }
18716
- });
18717
- return __assign(__assign({}, prevOptions), { elements: {
18718
- line: {
18719
- stepped: customOptions.stepped,
18720
- lineTension: 0.1,
18721
- },
18722
- }, scales: newScales });
18723
- });
18724
- };
18725
- changeOptions();
18726
- }, [customOptions]);
18727
- useEffect(function () {
18728
- setChartOptions(function (prevOptions) { return (__assign(__assign({}, prevOptions), { scales: __assign(__assign({}, prevOptions.scales), { x: __assign(__assign({}, prevOptions.scales.x), { min: state.timeScopeStart.getTime(), max: state.timeScopeEnd.getTime() }) }) })); });
18729
- }, [state.timeScopeStart, state.timeScopeEnd]);
18730
- return (React__default.createElement(LocalizationProvider$1, { dateAdapter: AdapterMoment },
18731
- React__default.createElement(Grid2, { size: { xs: 12 }, container: true, justifyContent: "space-between", alignItems: "center", style: { height: "8%" } },
18732
- React__default.createElement(Grid2, { size: { md: 4 }, container: true, spacing: 1, justifyContent: "flex-start", alignItems: "center", wrap: "wrap" },
18733
- React__default.createElement(Grid2, null,
18734
- React__default.createElement(IconButton$1, { color: "primary", onClick: function () { return handleDateNavigator("subtract"); }, size: "small", sx: {
18735
- padding: 0.5,
18736
- color: "black",
18737
- } },
18738
- React__default.createElement(ChevronLeft, { fontSize: "medium" }))),
18739
- React__default.createElement(Grid2, { size: { md: 4 } },
18740
- React__default.createElement(DateTimePicker, { label: "Start", format: "MM/DD/YYYY HH:mm:ss", value: moment$f(state.timeScopeStart), onChange: function (newValue) {
18741
- if (newValue) {
18742
- handleDateChange(newValue.toDate(), "start");
18743
- }
18744
- }, minutesStep: 1, slotProps: {
18745
- textField: {
18746
- size: "small",
18747
- variant: "outlined",
18748
- fullWidth: true,
18749
- },
18750
- } })),
18751
- React__default.createElement(Grid2, { size: { md: 2 }, marginTop: 0.5 },
18752
- React__default.createElement(FormControl, { variant: "outlined", size: "small", fullWidth: true },
18753
- React__default.createElement(Select, { value: state.scope, onChange: function (e) {
18754
- return handleChangeScope(e.target.value);
18755
- }, displayEmpty: true },
18756
- React__default.createElement(MenuItem, { value: "10 min" }, "10 min"),
18757
- React__default.createElement(MenuItem, { value: "1 hour" }, "1 hour"),
18758
- React__default.createElement(MenuItem, { value: "4 hours" }, "4 hours"),
18759
- React__default.createElement(MenuItem, { value: "12 hours" }, "12 hours"),
18760
- React__default.createElement(MenuItem, { value: "1 day" }, "1 day"),
18761
- React__default.createElement(MenuItem, { value: "10 days" }, "10 days"),
18762
- React__default.createElement(MenuItem, { value: "custom" }, "Custom")))),
18763
- React__default.createElement(Grid2, { size: { md: 4 } },
18764
- React__default.createElement(DateTimePicker, { label: "End", format: "MM/DD/YYYY HH:mm:ss", value: autoRefresh ? null : moment$f(state.timeScopeEnd), onChange: function (newValue) {
18765
- if (newValue) {
18766
- handleDateChange(newValue.toDate(), "end");
18767
- }
18768
- }, minutesStep: 1, slotProps: {
18769
- textField: {
18770
- size: "small",
18771
- variant: "outlined",
18772
- fullWidth: true,
18773
- },
18774
- }, disabled: autoRefresh })),
18775
- React__default.createElement(Grid2, null,
18776
- React__default.createElement(IconButton$1, { onClick: function () { return handleDateNavigator("add"); }, sx: {
18777
- "& .MuiSvgIcon-root": {
18778
- cursor: "pointer !important",
18779
- height: "24px",
18780
- width: "24px",
18781
- "& svg": {
18782
- // Adjust the icon size as well
18783
- fontSize: "1.5rem",
18784
- },
18785
- },
18786
- color: "black",
18787
- } },
18788
- React__default.createElement(ChevronRight, { fontSize: "large" }))),
18789
- React__default.createElement(Grid2, null,
18790
- React__default.createElement(IconButton$1, { onClick: function () { return handleDateNavigator("subtract", true); }, sx: {
18791
- "& .MuiSvgIcon-root": {
18792
- cursor: "pointer !important",
18793
- height: "24px",
18794
- width: "24px",
18795
- "& svg": {
18796
- // Adjust the icon size as well
18797
- fontSize: "1.5rem",
18798
- },
18799
- },
18800
- color: "black",
18801
- } },
18802
- React__default.createElement(SkipNextIcon, { fontSize: "large" })))),
18803
- React__default.createElement(Grid2, { size: { md: 6 }, container: true, justifyContent: "space-between" },
18804
- React__default.createElement(Grid2, { container: true, wrap: "nowrap", spacing: 1 },
18805
- React__default.createElement(Grid2, { container: true },
18806
- React__default.createElement(CustomOptionsComponent, { customOptions: customOptions, setCustomOptions: setCustomOptions, autoRefresh: autoRefresh, setAutoRefresh: function (autoRefresh) {
18807
- if (autoRefresh) {
18808
- handleChangeScope("custom");
18809
- handleDateChange(new Date(), "end");
18810
- }
18811
- setAutoRefresh(autoRefresh);
18812
- } })))))));
18813
- });
18814
- Header.displayName = "Header";
18815
-
18816
- var DraggableLineControl = React__default.memo(function (_a) {
18817
- var initialLeft = _a.initialLeft, otherLineCoord = _a.otherLineCoord, onUpdate = _a.onUpdate, color = _a.color, chartArea = _a.chartArea;
18818
- var _b = useState(false), isDragging = _b[0], setIsDragging = _b[1];
18819
- var _c = useState(initialLeft), left = _c[0], setLeft = _c[1];
18820
- var ref = useRef(null);
18821
- var handleMouseDown = function (e) {
18822
- setIsDragging(true);
18823
- e.stopPropagation();
18824
- e.preventDefault();
18825
- };
18826
- var handleMouseMove = function (e) {
18827
- if (!isDragging || !ref.current)
18828
- return;
18829
- chartArea.width - chartArea.right;
18830
- chartArea.left;
18831
- var newLeft = Math.min(Math.max(e.clientX - ref.current.offsetParent.getBoundingClientRect().left, chartArea.left), chartArea.right);
18832
- // Line limit
18833
- if (color === "red" && newLeft > otherLineCoord - 20) {
18834
- newLeft = otherLineCoord - 20;
18835
- }
18836
- else if (color === "blue" && newLeft < otherLineCoord + 20) {
18837
- newLeft = otherLineCoord + 20;
18838
- }
18839
- setLeft(newLeft);
18840
- onUpdate(newLeft); // Actualiza la posición de la línea en el gráfico
18841
- };
18842
- var handleMouseUp = function () {
18843
- setIsDragging(false);
18844
- };
18845
- useEffect(function () {
18846
- var mouseMoveHandler = function (e) { return handleMouseMove(e); };
18847
- var mouseUpHandler = function () { return handleMouseUp(); };
18848
- if (isDragging) {
18849
- window.addEventListener("mousemove", mouseMoveHandler);
18850
- window.addEventListener("mouseup", mouseUpHandler);
18851
- }
18852
- return function () {
18853
- window.removeEventListener("mousemove", mouseMoveHandler);
18854
- window.removeEventListener("mouseup", mouseUpHandler);
18855
- };
18856
- }, [isDragging]);
18857
- return (React__default.createElement("div", { ref: ref, style: {
18858
- height: 20,
18859
- width: 20,
18860
- background: color,
18861
- position: "absolute",
18862
- top: -10,
18863
- left: left - 10,
18864
- }, onMouseDown: handleMouseDown },
18865
- React__default.createElement("div", { style: {
18866
- height: chartArea.height,
18867
- width: 2,
18868
- background: color,
18869
- position: "relative",
18870
- top: 20,
18871
- left: 0,
18872
- right: 0,
18873
- margin: "auto",
18874
- } })));
18875
- });
18876
- DraggableLineControl.displayName = "DraggableLineControl";
18877
-
18878
- var useGetVerticalLinePlugin = function (setChartArea, setCoords) {
18879
- var chartPlugin = useMemo(function () { return ({
18880
- id: "verticalLinePlugin",
18881
- afterUpdate: function (chart) {
18882
- if (chart.chartArea) {
18883
- // console.log("after update");
18884
- if (chart.mouseX === null) {
18885
- chart.mouseX = chart.chartArea.left + chart.chartArea.width / 10;
18886
- // chart.mouseX = chart.chartArea.left + 30.9
18887
- }
18888
- if (chart.secondLineX === null) {
18889
- chart.secondLineX =
18890
- chart.chartArea.left + chart.chartArea.width * 0.9;
18891
- // chart.secondLineX = chart.chartArea.right
18892
- }
18893
- }
18894
- },
18895
- beforeInit: function (chart) {
18896
- chart.mouseX = null;
18897
- chart.secondLineX = null;
18898
- },
18899
- afterDatasetsDraw: function (chart) {
18900
- var x1 = chart.mouseX;
18901
- var x2 = chart.secondLineX;
18902
- setChartArea(chart.chartArea);
18903
- setCoords({ x1: x1, x2: x2 });
18904
- },
18905
- }); }, [setChartArea, setCoords]);
18906
- return chartPlugin;
18907
- };
18908
-
18909
- var getValuesAtCursor = function (chart, timeAtCursor) {
18910
- var valuesAtCursor = [];
18911
- chart.data.datasets.forEach(function (dataset) {
18912
- var previousDataPoint = null;
18913
- for (var i = 0; i < dataset.data.length; i++) {
18914
- if (dataset.data[i].x.getTime() <= timeAtCursor) {
18915
- previousDataPoint = dataset.data[i];
18916
- }
18917
- else {
18918
- break;
18919
- }
18920
- }
18921
- if (previousDataPoint) {
18922
- valuesAtCursor.push(previousDataPoint.y);
18923
- }
18924
- });
18925
- return valuesAtCursor;
18926
- };
18927
- var updateCursorData = function (chart, setCursorData) {
18928
- var xScale = chart.scales.x;
18929
- // Coordenadas para la primera y segunda línea
18930
- var timeAtCursor1 = xScale.getValueForPixel(chart.mouseX);
18931
- var timeAtCursor2 = xScale.getValueForPixel(chart.secondLineX);
18932
- // Los valores en el punto del cursor pueden ser diferentes
18933
- var valuesAtCursor1 = getValuesAtCursor(chart, timeAtCursor1);
18934
- var valuesAtCursor2 = getValuesAtCursor(chart, timeAtCursor2);
18935
- setCursorData({
18936
- x1: timeAtCursor1,
18937
- x2: timeAtCursor2,
18938
- values: __spreadArray(__spreadArray([], valuesAtCursor1, true), valuesAtCursor2, true),
18939
- });
18940
- };
18941
-
18942
- var useXAxisDatePlugin = function () {
18943
- var chartPlugin = useMemo(function () { return ({
18944
- id: "xAxisDatePlugin",
18945
- afterBuildTicks: function (chart) {
18946
- var oldTicks = chart.scales.x.ticks;
18947
- var newTicks = [];
18948
- newTicks.push(oldTicks[0]);
18949
- for (var i = 1; i < oldTicks.length; i++) {
18950
- var current = new Date(oldTicks[i].value);
18951
- var previous = new Date(oldTicks[i - 1].value);
18952
- var time = formatDateTimeToString(current).formattedTime;
18953
- var date = formatDateTimeToString(current).formattedDate;
18954
- var newLabel = void 0;
18955
- if (current.getDate() !== previous.getDate()) {
18956
- newLabel = [time, date];
18957
- }
18958
- else {
18959
- newLabel = time;
18960
- }
18961
- newTicks.push({
18962
- value: oldTicks[i].value,
18963
- major: oldTicks[i].major,
18964
- label: newLabel,
18965
- });
18966
- }
18967
- chart.scales.x.ticks = newTicks;
18968
- },
18969
- }); }, []);
18970
- return chartPlugin;
18971
- };
18972
-
18973
- var useYAxisPlugin = function () {
18974
- var chartPlugin = useMemo(function () { return ({
18975
- id: "yAxisPlugin",
18976
- }); }, []);
18977
- return chartPlugin;
18978
- };
18979
-
18980
- var areRangesSimilar = function (tag1, tag2) {
18981
- if (isNil(tag1.MaxScale) ||
18982
- isNil(tag1.MinScale) ||
18983
- isNil(tag2.MaxScale) ||
18984
- isNil(tag2.MinScale))
18985
- return;
18986
- var range1 = tag1.MaxScale - tag1.MinScale; // Rango de la primera etiqueta
18987
- var range2 = tag2.MaxScale - tag2.MinScale; // Rango de la segunda etiqueta
18988
- // Determina los límites para la comparación
18989
- var lowerBound = Math.max(tag1.MinScale, tag2.MinScale);
18990
- var upperBound = Math.min(tag1.MaxScale, tag2.MaxScale);
18991
- // Calcula el solapamiento entre los dos rangos
18992
- var overlap = Math.max(0, upperBound - lowerBound);
18993
- // Determina si el solapamiento es significativo comparado con los rangos individuales
18994
- var isSignificantOverlap = overlap / range1 > 0.5 && overlap / range2 > 0.5;
18995
- return isSignificantOverlap;
18996
- };
18997
-
18998
- var TrendingChart = React__default.memo(function (_a) {
18999
- var series = _a.series, chartOptions = _a.chartOptions, setChartOptions = _a.setChartOptions, chartData = _a.chartData, setCursorData = _a.setCursorData, setChartData = _a.setChartData;
19000
- var _b = useTrendingContext(), state = _b.state, viewTags = _b.state.viewTags; _b.actions;
19001
- var _c = useState(null), lineTabCoords = _c[0], setLineTabCoords = _c[1];
19002
- var _d = useState(null), chartArea = _d[0], setChartArea = _d[1];
19003
- var chartRef = useRef(null);
19004
- var forDebounce = useRef({
19005
- viewTags: viewTags,
19006
- series: series,
19007
- setChartOptions: setChartOptions,
19008
- setChartData: setChartData,
19009
- });
19010
- var debouncedUpdateChart = useRef(debounce(function () {
19011
- if (chartRef.current) {
19012
- updateCursorData(chartRef.current, setCursorData);
19013
- chartRef.current.update();
19014
- }
19015
- }, 250));
19016
- forDebounce.current = {
19017
- viewTags: viewTags,
19018
- series: series,
19019
- setChartOptions: setChartOptions,
19020
- setChartData: setChartData,
19021
- };
19022
- var debouncedUpdateChartBasedOnData = useRef(debounce(function () {
19023
- var _a = forDebounce.current, viewTags = _a.viewTags, series = _a.series, setChartOptions = _a.setChartOptions, setChartData = _a.setChartData;
19024
- var axes = [];
19025
- if (!series.length) {
19026
- return;
19027
- }
19028
- Object.values(viewTags).forEach(function (_a, index) {
19029
- var tag = _a.viewTag;
19030
- var existingAxis = axes.findIndex(function (existingTag) {
19031
- return areRangesSimilar(existingTag, tag);
19032
- });
19033
- if (existingAxis === -1) {
19034
- axes.push(tag); // Add new axis if no similar one exists
19035
- seriesVsTags.current[tag.TagId] = tag.TagId;
19036
- }
19037
- else {
19038
- seriesVsTags.current[tag.TagId] = axes[existingAxis].TagId;
19039
- }
19040
- });
19041
- // Configure yAxes based on grouped axes
19042
- var yAxesConfig = axes.map(function (axis) {
19043
- var min = Number(axis.MinScale);
19044
- var max = Number(axis.MaxScale);
19045
- if (!min && !max) {
19046
- max = 1;
19047
- }
19048
- return {
19049
- id: "y-axis-".concat(axis.TagId),
19050
- type: "linear",
19051
- display: axis.IsVisible,
19052
- title: {
19053
- display: true,
19054
- text: axis.TagName,
19055
- },
19056
- min: axis.IsAutoScale ? undefined : min,
19057
- max: axis.IsAutoScale ? undefined : max,
19058
- suggestedMin: axis.IsAutoScale ? undefined : min,
19059
- suggestedMax: axis.IsAutoScale ? undefined : max,
19060
- stepSize: 10,
19061
- grid: {
19062
- display: true,
19063
- },
19064
- afterUpdate: function (a) {
19065
- var chart = a.chart;
19066
- var keys = Object.keys(chart.scales).filter(function (sc) { return sc !== "x"; });
19067
- var counterOfDefaultsScales = 0;
19068
- if (keys.length > 1) {
19069
- for (var scaleKey in chart.scales) {
19070
- var scale = chart.scales[scaleKey];
19071
- if (scale.max === 1 && scale.min === 0) {
19072
- chart.scales[scaleKey].display = false;
19073
- chart.scales[scaleKey].options.display = false;
19074
- counterOfDefaultsScales++;
19075
- }
19076
- else {
19077
- chart.scales[scaleKey].display = true;
19078
- chart.scales[scaleKey].options.display = true;
19079
- }
19080
- if (counterOfDefaultsScales === keys.length) {
19081
- chart.scales[keys[0]].display = true;
19082
- chart.scales[keys[0]].options.display = true;
19083
- }
19084
- }
19085
- }
19086
- },
19087
- };
19088
- });
19089
- setChartOptions(function (prevOptions) {
19090
- var newResp = __assign(__assign({}, prevOptions), { scales: __assign({ x: __assign({}, prevOptions.scales.x) }, yAxesConfig.reduce(function (acc, cur) {
19091
- var _a;
19092
- return (__assign(__assign({}, acc), (_a = {}, _a[cur.id] = cur, _a)));
19093
- }, {})) });
19094
- return newResp;
19095
- });
19096
- var updatedSeries = series.map(function (serie, index) {
19097
- var _a;
19098
- var tagsSortedArray = Object.values(viewTags).sort(function (a, b) { return b.order - a.order; });
19099
- var tag = (_a = tagsSortedArray[index]) === null || _a === void 0 ? void 0 : _a.viewTag;
19100
- var yAxisTagId = seriesVsTags.current[tag === null || tag === void 0 ? void 0 : tag.TagId];
19101
- return {
19102
- yAxisID: "y-axis-".concat(yAxisTagId),
19103
- data: serie.map(function (sample) { return ({
19104
- x: new Date(sample.timestamp),
19105
- y: sample.value,
19106
- }); }),
19107
- tagId: tag === null || tag === void 0 ? void 0 : tag.TagId,
19108
- borderColor: tag === null || tag === void 0 ? void 0 : tag.Color,
19109
- hidden: !(tag === null || tag === void 0 ? void 0 : tag.IsVisible),
19110
- pointRadius: serie.length <= 50 ? 3 : 0,
19111
- };
19112
- });
19113
- setChartShouldInitCursors(true);
19114
- setChartData({
19115
- labels: [],
19116
- datasets: updatedSeries,
19117
- });
19118
- }, 1000));
19119
- var _e = useState(false), chartShouldInitCursors = _e[0], setChartShouldInitCursors = _e[1];
19120
- var memoizedSetChartArea = useCallback(function (area) { return setChartArea(area); }, []);
19121
- var memoizedSetLineTabCoords = useCallback(function (coords) { return setLineTabCoords(coords); }, []);
19122
- var verticalLinePlugin = useGetVerticalLinePlugin(memoizedSetChartArea, memoizedSetLineTabCoords);
19123
- var xAxisDatePlugin = useXAxisDatePlugin();
19124
- var yAxisPlugin = useYAxisPlugin();
19125
- var plugins = useMemo(function () { return [verticalLinePlugin, xAxisDatePlugin, yAxisPlugin]; }, [verticalLinePlugin, xAxisDatePlugin, yAxisPlugin]);
19126
- var seriesVsTags = useRef({});
19127
- useEffect(function () {
19128
- // Only run debounced update when series data actually changes
19129
- // Display property changes (color, visibility, scales) are handled by immediate useEffects
19130
- debouncedUpdateChartBasedOnData.current();
19131
- }, [series]); // Removed state.graphShouldUpdate to prevent running on display-only changes
16481
+ value: point.value !== null
16482
+ ? (Math.floor(point.value) >> viewTag.BitIndex) & 1
16483
+ : null,
16484
+ }); });
16485
+ }
16486
+ // Regular tag - use series data directly
16487
+ return seriesMap.get(tagId);
16488
+ })
16489
+ .filter(Boolean);
16490
+ }, [series, tagIds, queryTagIds, viewTags]);
16491
+ // Calculate overall min/max values from filtered series data
16492
+ var seriesMinMaxData = useSeriesMinMax(filteredSeries, tagIds);
16493
+ // Load initial view when views are fetched
19132
16494
  useEffect(function () {
19133
- if (chartShouldInitCursors) {
19134
- if (chartRef.current) {
19135
- updateCursorData(chartRef.current, setCursorData);
19136
- chartRef.current.update();
16495
+ if (!viewSuccess || !views || !Array.isArray(views))
16496
+ return;
16497
+ // Always update the views list in context
16498
+ setViews(views);
16499
+ // Only set initial view if none is selected
16500
+ if (!viewSelected) {
16501
+ var lastCreated = views.reduce(function (prev, current) {
16502
+ return prev && prev.ViewId > current.ViewId ? prev : current;
16503
+ }, null);
16504
+ if (lastCreated) {
16505
+ setViewId(lastCreated.ViewId);
16506
+ setViewSelected(lastCreated);
19137
16507
  }
19138
16508
  }
19139
- }, [chartShouldInitCursors, state.graphShouldUpdate]);
19140
- // Update colors and visibility immediately without debounce
16509
+ }, [viewSuccess, views, viewSelected, setViews, setViewSelected]);
16510
+ // Update viewId when viewSelected changes (e.g., from LoadViewModal)
19141
16511
  useEffect(function () {
19142
- setChartData(function (prevData) {
19143
- if (!prevData.datasets || !prevData.datasets.length)
19144
- return prevData;
19145
- var updatedDatasets = prevData.datasets.map(function (dataset) {
19146
- var tag = viewTags[dataset.tagId];
19147
- if (tag) {
19148
- return __assign(__assign({}, dataset), { borderColor: tag.viewTag.Color, hidden: !tag.viewTag.IsVisible });
19149
- }
19150
- return dataset;
19151
- });
19152
- return __assign(__assign({}, prevData), { datasets: updatedDatasets });
19153
- });
19154
- }, [viewTags, setChartData]);
19155
- // Update Y-axis scales immediately when AutoScale or Min/Max changes
16512
+ if (viewSelected) {
16513
+ setViewId(viewSelected.ViewId);
16514
+ }
16515
+ }, [viewSelected]);
16516
+ // Load view tags when fetched - ONLY when viewId changes, not on every data refetch
16517
+ // This preserves local order changes (from drag-and-drop) until a new view is loaded
16518
+ var loadedViewIdRef = useRef(null);
19156
16519
  useEffect(function () {
19157
- var axes = [];
19158
- Object.values(viewTags).forEach(function (_a) {
19159
- var tag = _a.viewTag;
19160
- var existingAxis = axes.findIndex(function (existingTag) {
19161
- return areRangesSimilar(existingTag, tag);
16520
+ if (!viewTagsSuccess ||
16521
+ !viewTagsData ||
16522
+ !Array.isArray(viewTagsData) ||
16523
+ viewId === null)
16524
+ return;
16525
+ // Only reset viewTags when viewId actually changes (loading a different view)
16526
+ // Do NOT reset if viewId is the same (data is just refetching)
16527
+ if (viewId === loadedViewIdRef.current)
16528
+ return;
16529
+ loadedViewIdRef.current = viewId;
16530
+ var backendTags = viewTagsData;
16531
+ var localViewTags = getViewFromLocal(viewId);
16532
+ var mergedTags = {};
16533
+ if (localViewTags) {
16534
+ // If local storage exists, use it as the source of truth for metadata (Order, Alias)
16535
+ // and for virtual tags (Bit Extracted)
16536
+ var backendTagIds_1 = new Set(backendTags.map(function (t) { return t.TagId; }));
16537
+ // 1. Process local tags
16538
+ Object.values(localViewTags).forEach(function (entry) {
16539
+ var viewTag = entry.viewTag;
16540
+ // If it's a backend tag, check if it still exists in the backend response
16541
+ // (Permission check or tag deletion check)
16542
+ if (!viewTag.IsBitExtracted) {
16543
+ if (backendTagIds_1.has(viewTag.TagId)) {
16544
+ mergedTags[viewTag.TagId] = entry;
16545
+ }
16546
+ }
16547
+ else {
16548
+ // Virtual tags are always added from local storage
16549
+ mergedTags[viewTag.TagId] = entry;
16550
+ }
19162
16551
  });
19163
- if (existingAxis === -1) {
19164
- axes.push(tag);
19165
- }
19166
- });
19167
- var yAxesConfig = axes.map(function (axis) {
19168
- var min = Number(axis.MinScale);
19169
- var max = Number(axis.MaxScale);
19170
- if (!min && !max) {
19171
- max = 1;
19172
- }
19173
- return {
19174
- id: "y-axis-".concat(axis.TagId),
19175
- type: "linear",
19176
- display: axis.IsVisible,
19177
- title: {
19178
- display: true,
19179
- text: axis.TagName,
19180
- },
19181
- min: axis.IsAutoScale ? undefined : min,
19182
- max: axis.IsAutoScale ? undefined : max,
19183
- suggestedMin: axis.IsAutoScale ? undefined : min,
19184
- suggestedMax: axis.IsAutoScale ? undefined : max,
19185
- stepSize: 10,
19186
- grid: {
19187
- display: true,
19188
- },
19189
- afterUpdate: function (a) {
19190
- var chart = a.chart;
19191
- var keys = Object.keys(chart.scales).filter(function (sc) { return sc !== "x"; });
19192
- var counterOfDefaultsScales = 0;
19193
- if (keys.length > 1) {
19194
- for (var scaleKey in chart.scales) {
19195
- var scale = chart.scales[scaleKey];
19196
- if (scale.max === 1 && scale.min === 0) {
19197
- chart.scales[scaleKey].display = false;
19198
- chart.scales[scaleKey].options.display = false;
19199
- counterOfDefaultsScales++;
19200
- }
19201
- else {
19202
- chart.scales[scaleKey].display = true;
19203
- chart.scales[scaleKey].options.display = true;
19204
- }
19205
- if (counterOfDefaultsScales === keys.length) {
19206
- chart.scales[keys[0]].display = true;
19207
- chart.scales[keys[0]].options.display = true;
19208
- }
19209
- }
16552
+ // 2. Add any new backend tags that might be missing from local storage
16553
+ // (Rare case, but possible if added by another user/session)
16554
+ backendTags.forEach(function (backendTag) {
16555
+ if (!mergedTags[backendTag.TagId]) {
16556
+ // Add with default order at the end
16557
+ var maxOrder = Math.max.apply(Math, __spreadArray(__spreadArray([], Object.values(mergedTags).map(function (t) { return t.order; }), false), [0], false));
16558
+ if (isNil(backendTag.Color)) {
16559
+ backendTag.Color = getRandomColor();
19210
16560
  }
19211
- },
19212
- };
19213
- });
19214
- setChartOptions(function (prevOptions) { return (__assign(__assign({}, prevOptions), { scales: __assign({ x: __assign({}, prevOptions.scales.x) }, yAxesConfig.reduce(function (acc, cur) {
19215
- var _a;
19216
- return (__assign(__assign({}, acc), (_a = {}, _a[cur.id] = cur, _a)));
19217
- }, {})) })); });
19218
- }, [viewTags, setChartOptions]);
19219
- return (React__default.createElement(Paper, { style: { height: "100%", position: "relative" } },
19220
- lineTabCoords && chartArea ? (React__default.createElement(DraggableLineControl, { color: "red", chartArea: chartArea, initialLeft: lineTabCoords === null || lineTabCoords === void 0 ? void 0 : lineTabCoords.x1, otherLineCoord: lineTabCoords === null || lineTabCoords === void 0 ? void 0 : lineTabCoords.x2, onUpdate: function (newLeft) {
19221
- setLineTabCoords(function (prevCoords) {
19222
- prevCoords.x1 = newLeft;
19223
- return prevCoords;
19224
- });
19225
- // @ts-ignore
19226
- chartRef.current.mouseX = newLeft;
19227
- debouncedUpdateChart.current();
19228
- } })) : null,
19229
- lineTabCoords && chartArea ? (React__default.createElement(DraggableLineControl, { color: "blue", initialLeft: lineTabCoords === null || lineTabCoords === void 0 ? void 0 : lineTabCoords.x2, otherLineCoord: lineTabCoords === null || lineTabCoords === void 0 ? void 0 : lineTabCoords.x1, chartArea: chartArea, onUpdate: function (newLeft) {
19230
- setLineTabCoords(function (prevCoords) {
19231
- prevCoords.x2 = newLeft;
19232
- return prevCoords;
19233
- });
19234
- // @ts-ignore
19235
- chartRef.current.secondLineX = newLeft;
19236
- debouncedUpdateChart.current();
19237
- } })) : null,
19238
- React__default.createElement(Line, { ref: chartRef, data: chartData, options: chartOptions, plugins: plugins })));
19239
- });
19240
- TrendingChart.displayName = "TrendingChart";
19241
-
19242
- Chart.register(CategoryScale, LinearScale, PointElement, LineElement, Title, Tooltip$1, Legend, TimeScale, zoomPlugin);
19243
- var Trending = React__default.memo(function (_a) {
19244
- _a.title; var autoRefresh = _a.autoRefresh, setAutoRefresh = _a.setAutoRefresh;
19245
- var _b = useTrendingContext(), state = _b.state, _c = _b.state, viewTags = _c.viewTags; _c.shouldRefetchSeries;
19246
- var _d = useState(""), error = _d[0], setError = _d[1];
19247
- var _e = useState(null), selectedRowTagId = _e[0], setSelectedRowTagId = _e[1];
19248
- var _f = useState(null), viewTagForDelete = _f[0], setViewTagForDelete = _f[1];
19249
- var _g = useChartOptions(), chartOptions = _g[0], setChartOptions = _g[1];
19250
- var _h = useState({
19251
- labels: [],
19252
- datasets: [],
19253
- }), chartData = _h[0], setChartData = _h[1];
19254
- var _j = useState(null), cursorData = _j[0], setCursorData = _j[1];
19255
- var handleRightClick = function (event, tagId) {
19256
- event.preventDefault();
19257
- event.stopPropagation(); // Prevent the click event from propagating to the document
19258
- if (isNumber(tagId)) {
19259
- setViewTagForDelete(viewTags[tagId].viewTag);
19260
- }
19261
- else {
19262
- setViewTagForDelete(null);
19263
- }
19264
- setSelectedRowTagId(tagId);
19265
- };
19266
- var _k = useSearchSeries({
19267
- start: state.timeScopeStart.getTime(),
19268
- end: state.timeScopeEnd.getTime(),
19269
- tagIds: Object.values(viewTags).map(function (tag) { return tag.viewTag.TagId; }),
19270
- autoRefresh: autoRefresh,
19271
- }), series = _k.data, seriesLoading = _k.isLoading; _k.isError; _k.error; _k.isSuccess;
19272
- return (React__default.createElement(React__default.Fragment, null,
19273
- React__default.createElement(Grid2, { container: true, style: { width: "95svw", height: "88svh", margin: 0 } },
19274
- React__default.createElement(Header, { setChartOptions: setChartOptions, autoRefresh: autoRefresh, setAutoRefresh: setAutoRefresh }),
19275
- React__default.createElement(Grid2, { size: { md: 12 } },
19276
- React__default.createElement(Divider, { style: { margin: "10px 0 20px" } })),
19277
- React__default.createElement(Grid2, { size: { xs: 12 }, style: { height: "45%" } },
19278
- React__default.createElement(TrendingChart, { series: series !== null && series !== void 0 ? series : [], chartData: chartData, setChartData: setChartData, chartOptions: chartOptions, setChartOptions: setChartOptions, setCursorData: setCursorData })),
19279
- React__default.createElement(Grid2, { container: true, size: { xs: 12 }, onContextMenu: function (e) { return handleRightClick(e, null); }, style: {
19280
- height: "40%",
19281
- minWidth: "100%",
19282
- borderRadius: 10,
19283
- margin: "10px 0 10px",
19284
- position: seriesLoading ? "relative" : "inherit",
19285
- } },
19286
- seriesLoading && (React__default.createElement("div", { style: {
19287
- position: "absolute",
19288
- top: 0,
19289
- left: 0,
19290
- width: "100%",
19291
- height: "100%",
19292
- background: "rgba(255, 255, 255, 0.7)", // fondo semitransparente
19293
- display: "flex", // Centra el CircularProgress
19294
- justifyContent: "center", // Centra horizontalmente
19295
- alignItems: "center", // Centra verticalmente
19296
- zIndex: 2,
19297
- } },
19298
- React__default.createElement(CircularProgress, { size: "2rem" }))),
19299
- React__default.createElement(TableComponent, { chartData: chartData, cursorData: cursorData, viewTagForDelete: viewTagForDelete, setViewTagForDelete: setViewTagForDelete, selectedRowTagId: selectedRowTagId, setSelectedRowTagId: setSelectedRowTagId }))),
19300
- React__default.createElement(ErrorModal, { error: error, onHide: function () { return setError(""); }, title: "ERROR" })));
19301
- });
19302
- Trending.displayName = "Trending";
19303
-
19304
- // @flow
19305
- var TrendingsPage = function () {
19306
- var _a = useState(false), autoRefresh = _a[0], setAutoRefresh = _a[1];
19307
- var _b = useState(""), error = _b[0], setError = _b[1];
19308
- var _c = useState(null), viewId = _c[0], setViewId = _c[1];
19309
- var _d = useTrendingContext(), viewSelected = _d.state.viewSelected, _e = _d.actions, setViews = _e.setViews, setViewTagsAndRefetch = _e.setViewTagsAndRefetch, setViewSelected = _e.setViewSelected;
19310
- var _f = useSearchViews({ autoRefresh: autoRefresh }), views = _f.data; _f.isLoading; var viewsIsError = _f.isError, viewsError = _f.error, viewSuccess = _f.isSuccess;
19311
- var _g = useSearchViewTags({ viewId: viewId }), viewTags = _g.data; _g.isLoading; var viewTagsIsError = _g.isError, viewTagsError = _g.error, viewTagsSuccess = _g.isSuccess;
19312
- useEffect(function () {
19313
- var lastCreated;
19314
- if (!viewSelected) {
19315
- if (!views)
19316
- return;
19317
- setViews(views);
19318
- lastCreated = views.reduce(function (prev, current) {
19319
- return prev && prev.ViewId > current.ViewId ? prev : current;
19320
- }, null);
19321
- setViewId(lastCreated.ViewId);
19322
- //viewSelected
19323
- setViewSelected(lastCreated);
16561
+ mergedTags[backendTag.TagId] = {
16562
+ viewTag: backendTag,
16563
+ order: maxOrder + 1,
16564
+ };
16565
+ }
16566
+ });
19324
16567
  }
19325
16568
  else {
19326
- lastCreated = viewSelected;
19327
- setViewId(lastCreated.ViewId);
19328
- }
19329
- }, [viewSuccess]);
19330
- useEffect(function () {
19331
- if (viewTags) {
19332
- if (!viewTags)
19333
- return;
19334
- var vTags = viewTags.reduce(function (carr, curr, idx) {
16569
+ // No local storage -> Use backend tags with default ordering
16570
+ mergedTags = backendTags.reduce(function (carr, curr, idx) {
19335
16571
  if (isNil(curr.Color)) {
19336
16572
  curr.Color = getRandomColor();
19337
16573
  }
@@ -19341,25 +16577,128 @@ var TrendingsPage = function () {
19341
16577
  };
19342
16578
  return carr;
19343
16579
  }, {});
19344
- setViewTagsAndRefetch(vTags);
19345
16580
  }
19346
- }, [viewTagsSuccess]);
16581
+ // Reset stable ref when loading new view
16582
+ stableTagIdsRef.current = [];
16583
+ setViewTagsAndRefetch(mergedTags);
16584
+ }, [viewTagsSuccess, viewTagsData, setViewTagsAndRefetch, viewId]);
16585
+ // Update context with calculated min/max values
16586
+ // Use ref to prevent infinite loop from object reference changes
16587
+ var seriesMinMaxDataRef = useRef("");
16588
+ useEffect(function () {
16589
+ var serialized = JSON.stringify(seriesMinMaxData);
16590
+ if (serialized !== seriesMinMaxDataRef.current) {
16591
+ seriesMinMaxDataRef.current = serialized;
16592
+ setSeriesMinMax(seriesMinMaxData);
16593
+ }
16594
+ }, [seriesMinMaxData, setSeriesMinMax]);
16595
+ // Reset cursors when view changes or time scope changes significantly
16596
+ var prevViewIdRef = useRef(null);
16597
+ useEffect(function () {
16598
+ // Reset cursors when switching views or when time scope changes significantly
16599
+ if (viewSelected && viewSelected.ViewId !== prevViewIdRef.current) {
16600
+ prevViewIdRef.current = viewSelected.ViewId;
16601
+ resetCursors();
16602
+ }
16603
+ }, [viewSelected, resetCursors]);
16604
+ // Also reset cursors when time scope changes (zoom/pan)
16605
+ useEffect(function () {
16606
+ resetCursors();
16607
+ }, [timeScopeStart, timeScopeEnd, resetCursors]);
16608
+ // Increment trigger when series data finishes loading
16609
+ // This ensures cursors re-render AFTER chart has new data
16610
+ var prevSeriesLoadingRef = useRef(false);
16611
+ useEffect(function () {
16612
+ if (prevSeriesLoadingRef.current && !seriesLoading) {
16613
+ // Transition from loading to not loading - data just loaded
16614
+ setDataLoadedTrigger(function (prev) { return prev + 1; });
16615
+ }
16616
+ prevSeriesLoadingRef.current = seriesLoading;
16617
+ }, [seriesLoading]);
16618
+ // Handle errors
19347
16619
  useEffect(function () {
19348
16620
  if (viewTagsError && viewTagsIsError) {
19349
- setError(viewTagsError.message);
16621
+ setError(viewTagsError instanceof Error
16622
+ ? viewTagsError.message
16623
+ : String(viewTagsError));
19350
16624
  }
19351
16625
  if (viewsError && viewsIsError) {
19352
- setError(viewsError.message);
16626
+ setError(viewsError instanceof Error ? viewsError.message : String(viewsError));
16627
+ }
16628
+ if (seriesError && seriesIsError) {
16629
+ setError(seriesError instanceof Error
16630
+ ? seriesError.message
16631
+ : String(seriesError));
19353
16632
  }
19354
- }, [viewsError, viewsIsError, viewTagsError, viewTagsIsError]);
16633
+ }, [
16634
+ viewsError,
16635
+ viewsIsError,
16636
+ viewTagsError,
16637
+ viewTagsIsError,
16638
+ seriesError,
16639
+ seriesIsError,
16640
+ ]);
16641
+ var isLoading = viewsLoading || viewTagsLoading;
19355
16642
  return (React__default.createElement(React__default.Fragment, null,
19356
- React__default.createElement(HelmetDexteel, { title: "Trending Chart" }),
19357
- React__default.createElement(Grid2, { style: { padding: "20px", justifyContent: "center", display: "flex" } },
19358
- React__default.createElement(Trending, { title: "Trending Chart", autoRefresh: autoRefresh, setAutoRefresh: setAutoRefresh })),
16643
+ React__default.createElement(HelmetDexteel, { title: "Trendings" }),
16644
+ React__default.createElement("div", { style: {
16645
+ padding: "16px",
16646
+ width: "100%",
16647
+ height: "92vh",
16648
+ position: "relative",
16649
+ backgroundColor: "#FAFAFA",
16650
+ display: "flex",
16651
+ flexDirection: "column",
16652
+ } },
16653
+ isLoading && (React__default.createElement("div", { style: {
16654
+ position: "absolute",
16655
+ top: 0,
16656
+ left: 0,
16657
+ width: "100%",
16658
+ height: "100%",
16659
+ background: "rgba(255, 255, 255, 0.7)",
16660
+ display: "flex",
16661
+ justifyContent: "center",
16662
+ alignItems: "center",
16663
+ zIndex: 1000,
16664
+ } },
16665
+ React__default.createElement(CircularProgress, { size: "3rem" }))),
16666
+ React__default.createElement("div", { style: { flexShrink: 0 } },
16667
+ React__default.createElement(HeaderSectionV2, { autoRefresh: autoRefresh, setAutoRefresh: setAutoRefresh, setChartOptions: setChartOptions, chartInstance: chartInstance })),
16668
+ React__default.createElement(Divider, { sx: { my: 2 } }),
16669
+ React__default.createElement("div", { style: {
16670
+ flexGrow: 1,
16671
+ minHeight: 0,
16672
+ display: "flex",
16673
+ width: "100%",
16674
+ } },
16675
+ React__default.createElement(Group$1, { orientation: "vertical", style: { width: "100%", height: "100%" } },
16676
+ React__default.createElement(Panel, { defaultSize: 80, minSize: 20 },
16677
+ React__default.createElement("div", { style: { height: "100%", width: "100%" } },
16678
+ React__default.createElement(TrendingChartV2, { customOptions: chartOptions, series: filteredSeries, isLoading: seriesLoading, onChartReady: setChartInstance, dataLoadedTrigger: dataLoadedTrigger }))),
16679
+ React__default.createElement(Separator, { style: {
16680
+ height: "10px",
16681
+ background: "#f0f0f0",
16682
+ cursor: "row-resize",
16683
+ display: "flex",
16684
+ alignItems: "center",
16685
+ justifyContent: "center",
16686
+ borderTop: "1px solid #e0e0e0",
16687
+ borderBottom: "1px solid #e0e0e0",
16688
+ } },
16689
+ React__default.createElement("div", { style: {
16690
+ width: "40px",
16691
+ height: "4px",
16692
+ backgroundColor: "#ccc",
16693
+ borderRadius: "2px",
16694
+ } })),
16695
+ React__default.createElement(Panel, { defaultSize: 20, minSize: 10 },
16696
+ React__default.createElement("div", { style: { height: "100%", width: "100%", overflow: "auto" } },
16697
+ React__default.createElement(TagsTableV2, null)))))),
19359
16698
  React__default.createElement(ErrorModal, { error: error, onHide: function () { return setError(""); }, size: "xl", title: "ERROR" })));
19360
16699
  };
19361
16700
 
19362
- var index = function () {
16701
+ var TrendingsV2Index = function () {
19363
16702
  var _a = useState(false), ihPathLoaded = _a[0], setIhPathLoaded = _a[1];
19364
16703
  useEffect(function () {
19365
16704
  var getIhPath = function () { return __awaiter(void 0, void 0, void 0, function () {
@@ -19375,15 +16714,13 @@ var index = function () {
19375
16714
  }
19376
16715
  });
19377
16716
  }); };
19378
- getIhPath().then(function () {
19379
- console.log("ih path loaded");
19380
- });
16717
+ getIhPath();
19381
16718
  }, []);
19382
16719
  if (!ihPathLoaded) {
19383
16720
  return (React__default.createElement("div", { className: "d-flex justify-content-center align-items-center" }, "Loading..."));
19384
16721
  }
19385
- return (React__default.createElement(TrendingProvider, null,
19386
- React__default.createElement(TrendingsPage, null)));
16722
+ return (React__default.createElement(TrendingProviderV2, null,
16723
+ React__default.createElement(TrendingsPageV2, null)));
19387
16724
  };
19388
16725
 
19389
16726
  var MESFMainRouter = function () {
@@ -19395,7 +16732,6 @@ var MESFMainRouter = function () {
19395
16732
  React__default.createElement(Route, { path: "/", element: React__default.createElement(Navigate, { replace: true, to: "/home" }) }),
19396
16733
  canShowSettings && (React__default.createElement(Route, { path: "/configuration/*", element: React__default.createElement(Configuration, null) })),
19397
16734
  React__default.createElement(Route, { path: "/account", element: React__default.createElement(Account, null) }),
19398
- React__default.createElement(Route, { path: "/trendings", element: React__default.createElement(index, null) }),
19399
16735
  React__default.createElement(Route, { path: "/trendings-v2", element: React__default.createElement(TrendingsV2Index, null) }),
19400
16736
  React__default.createElement(Route, { path: "/home", element: React__default.createElement(Home, null) })),
19401
16737
  React__default.createElement(CustomRoutes, null)));
@@ -19405,8 +16741,8 @@ var MESFMainContainer = function () { return (React__default.createElement("div"
19405
16741
  React__default.createElement(MESFMainRouter, null))); };
19406
16742
 
19407
16743
  var Navigation = function (_a) {
19408
- var _b = _a.showAreaSelector, showAreaSelector = _b === void 0 ? false : _b, _c = _a.showTrendingsIcon, showTrendingsIcon = _c === void 0 ? true : _c, _d = _a.showTrendingsV2Icon, showTrendingsV2Icon = _d === void 0 ? true : _d, _e = _a.navbarTitle, navbarTitle = _e === void 0 ? "MESF" : _e, _f = _a.byPassHeaderRoutes, byPassHeaderRoutes = _f === void 0 ? [] : _f;
19409
- var _g = useSearchParams(), params = _g[0]; _g[1];
16744
+ var _b = _a.showAreaSelector, showAreaSelector = _b === void 0 ? false : _b, _c = _a.showTrendingsV2Icon, showTrendingsV2Icon = _c === void 0 ? true : _c, _d = _a.navbarTitle, navbarTitle = _d === void 0 ? "MESF" : _d, _e = _a.byPassHeaderRoutes, byPassHeaderRoutes = _e === void 0 ? [] : _e;
16745
+ var _f = useSearchParams(), params = _f[0]; _f[1];
19410
16746
  var mounted = useRef(true);
19411
16747
  var location = useLocation();
19412
16748
  useEffect(function () {
@@ -19425,7 +16761,7 @@ var Navigation = function (_a) {
19425
16761
  return location.pathname.startsWith(route);
19426
16762
  });
19427
16763
  return (React__default.createElement("div", { className: "wrapper" },
19428
- !byPassHeader && (React__default.createElement(Header$1, { showAreaSelector: showAreaSelector, navbarTitle: navbarTitle, showTrendingsIcon: showTrendingsIcon, showTrendingsV2Icon: showTrendingsV2Icon })),
16764
+ !byPassHeader && (React__default.createElement(Header, { showAreaSelector: showAreaSelector, navbarTitle: navbarTitle, showTrendingsV2Icon: showTrendingsV2Icon })),
19429
16765
  React__default.createElement(MESFMainContainer, null)));
19430
16766
  };
19431
16767
 
@@ -19457,7 +16793,7 @@ var queryClient = new QueryClient({
19457
16793
  },
19458
16794
  });
19459
16795
  function MESFMain(_a) {
19460
- var authentication = _a.authentication, routes = _a.routes, navbar = _a.navbar, _b = _a.navbarTitle, navbarTitle = _b === void 0 ? "MESF" : _b, configurations = _a.configurations, _c = _a.showAreaSelector, showAreaSelector = _c === void 0 ? false : _c, _d = _a.showTrendingsIcon, showTrendingsIcon = _d === void 0 ? true : _d, _e = _a.showTrendingsV2Icon, showTrendingsV2Icon = _e === void 0 ? true : _e, _f = _a.byPassHeaderRoutes, byPassHeaderRoutes = _f === void 0 ? [] : _f, _g = _a.plantAssetId, plantAssetId = _g === void 0 ? 1 : _g, _h = _a.theme, theme = _h === void 0 ? themeMESF : _h, _j = _a.logbookSettings, logbookSettings = _j === void 0 ? {} : _j;
16796
+ var authentication = _a.authentication, routes = _a.routes, navbar = _a.navbar, _b = _a.navbarTitle, navbarTitle = _b === void 0 ? "MESF" : _b, configurations = _a.configurations, _c = _a.showAreaSelector, showAreaSelector = _c === void 0 ? false : _c, _d = _a.showTrendingsV2Icon, showTrendingsV2Icon = _d === void 0 ? true : _d, _e = _a.byPassHeaderRoutes, byPassHeaderRoutes = _e === void 0 ? [] : _e, _f = _a.plantAssetId, plantAssetId = _f === void 0 ? 1 : _f, _g = _a.theme, theme = _g === void 0 ? themeMESF : _g, _h = _a.logbookSettings, logbookSettings = _h === void 0 ? {} : _h;
19461
16797
  return (React__default.createElement(React__default.Fragment, null,
19462
16798
  React__default.createElement(CssBaseline, null),
19463
16799
  React__default.createElement(StyledEngineProvider, { injectFirst: true },
@@ -19480,7 +16816,7 @@ function MESFMain(_a) {
19480
16816
  React__default.createElement(BrowserRouter, { basename: base },
19481
16817
  React__default.createElement(Routes, null,
19482
16818
  React__default.createElement(Route, { path: "/logout", element: React__default.createElement(Logout, null) })),
19483
- React__default.createElement(Navigation, { showAreaSelector: showAreaSelector, showTrendingsIcon: showTrendingsIcon, navbarTitle: navbarTitle, byPassHeaderRoutes: byPassHeaderRoutes, showTrendingsV2Icon: showTrendingsV2Icon })))))))))))))))))))));
16819
+ React__default.createElement(Navigation, { showAreaSelector: showAreaSelector, navbarTitle: navbarTitle, byPassHeaderRoutes: byPassHeaderRoutes, showTrendingsV2Icon: showTrendingsV2Icon })))))))))))))))))))));
19484
16820
  }
19485
16821
 
19486
16822
  var ExcelButton = function (_a) {
@@ -21561,6 +18897,7 @@ var useEntriesReport$1 = function (_a) {
21561
18897
  return useQuery({
21562
18898
  queryKey: ["entriesReport", startShiftId, endShiftId, assetId],
21563
18899
  queryFn: function () { return getEntriesReport$1({ startShiftId: startShiftId, endShiftId: endShiftId, assetId: assetId }); },
18900
+ enabled: !!startShiftId && !!endShiftId && !!assetId,
21564
18901
  });
21565
18902
  };
21566
18903
  var routeLogbookReport = "/logbook/report";
@@ -21880,7 +19217,7 @@ var Logbook$2 = function () {
21880
19217
  startShiftId: shiftPeriod.StartShiftId,
21881
19218
  endShiftId: shiftPeriod.EndShiftId,
21882
19219
  assetId: assetId,
21883
- }), rows = _h.data, isLoading = _h.isLoading, e = _h.error, isError = _h.isError, refetch = _h.refetch;
19220
+ }), rows = _h.data, isLoading = _h.isLoading, e = _h.error, isError = _h.isError; _h.refetch;
21884
19221
  var columnDefs = useTableData$2({
21885
19222
  showAttachments: showAttachments,
21886
19223
  showAsset: showAsset,
@@ -22002,16 +19339,6 @@ var Logbook$2 = function () {
22002
19339
  if (shiftPeriod.StartShiftId !== null || shiftPeriod.EndShiftId !== null) {
22003
19340
  setShow("");
22004
19341
  setSelectedRowData(null);
22005
- (function () { return __awaiter(void 0, void 0, void 0, function () {
22006
- return __generator(this, function (_a) {
22007
- switch (_a.label) {
22008
- case 0: return [4 /*yield*/, refetch()];
22009
- case 1:
22010
- _a.sent();
22011
- return [2 /*return*/];
22012
- }
22013
- });
22014
- }); })();
22015
19342
  }
22016
19343
  }, [shiftPeriod.StartShiftId, shiftPeriod.EndShiftId]);
22017
19344
  return (React__default.createElement(Box, { sx: {
@@ -24957,5 +22284,5 @@ var areaSelector = /*#__PURE__*/Object.freeze({
24957
22284
  AreaSelector: AreaSelector
24958
22285
  });
24959
22286
 
24960
- export { Account, AssetProvider, AssetTreePicker, AuthContext, AuthProvider, ButtonWithLoading, ChangePassword, CheckBoxControl, Configuration$1 as Configuration, ContextMenu$1 as ContextMenu, ContextMenuMESFProvider, CreateNewAssetDialog, CurrencyFormatter, DataGridControl, DateFormatter, DateTimeFormatter, ENTRY_INITIAL_VALUES$1 as ENTRY_INITIAL_VALUES, EditAssetDialog, ErrorModal, ExcelIcon, FetchError, FilterPanel, GenericPanel, GenericTable, GetCrewColor, GetShiftColor, HelmetDexteel, IntegerFormatter, LogbookSettingsInitialState, LogbookSettingsProvider, Login, Logout, LongFilterPanel, MESApiService, MESFLogbookEntry$1 as MESFLogbookEntry, MESFLogbookReport$1 as MESFLogbookReport, MESFMain, MESSAGE_API, MESSAGE_ERRORS, MasterDetailPanel, MesfModal, ModalTreeFilterControl, MultipleSelectorControl, NumberFormatter, RemoveAssetDialog, SPExecutorPage, ShiftDayNavigatorControl, ShiftNavigatorProvider, ShiftPeriodNavigatorControl, SimplePasswordControl, SimpleSelectorControl, TimeAndUserMenu, TimeFormatter, TimeService, TreePickerControl, TreePickerControlV2, TrendingsPage, USER_LABELS, UTLSettingsProvider, UserProvider, axiosInstance, deleteUser, dxtServerTimeZone, dxtToLocalServerTime, dxtToUTC, formatNumber, getAuthTypes, getCrewStyle, getDataUser, getEntries$1 as getEntries, getError, getMomentTz, getShiftByParameters, getShiftStyle, getShiftsRangeByParameters, getTokenFromLS, getUserPermissionsFromAPI, getUsers, logbookNavbar, logbookRoutesMESF, renewToken, routeLogbookEntry$1 as routeLogbookEntry, routeLogbookReport, useSearchAssets as searchAssets, useSearchSeries as searchSeries, useSearchTagsTree as searchTagsTree, useSearchViewTags as searchViewTags, useSearchViews as searchViews, sectionLogbookNavbar, sectionLogbookRoutesMESF, setPassword, setProfilesToUser, themeDXT, themeMESF, upsertUser, useAssetContext, useContextMenuMESF, useHasPermission, useHasProfile, useLogbookSettings, useMesfRealtime, useShiftNavigator, useShiftNavigatorManager, useToken, useUTLSettingsContext, useUserContext };
22287
+ export { Account, AssetProvider, AssetTreePicker, AuthContext, AuthProvider, ButtonWithLoading, ChangePassword, CheckBoxControl, Configuration$1 as Configuration, ContextMenu$1 as ContextMenu, ContextMenuMESFProvider, CreateNewAssetDialog, CurrencyFormatter, DataGridControl, DateFormatter, DateTimeFormatter, ENTRY_INITIAL_VALUES$1 as ENTRY_INITIAL_VALUES, EditAssetDialog, ErrorModal, ExcelIcon, FetchError, FilterPanel, GenericPanel, GenericTable, GetCrewColor, GetShiftColor, HelmetDexteel, IntegerFormatter, LogbookSettingsInitialState, LogbookSettingsProvider, Login, Logout, LongFilterPanel, MESApiService, MESFLogbookEntry$1 as MESFLogbookEntry, MESFLogbookReport$1 as MESFLogbookReport, MESFMain, MESSAGE_API, MESSAGE_ERRORS, MasterDetailPanel, MesfModal, ModalTreeFilterControl, MultipleSelectorControl, NumberFormatter, RemoveAssetDialog, SPExecutorPage, ShiftDayNavigatorControl, ShiftNavigatorProvider, ShiftPeriodNavigatorControl, SimplePasswordControl, SimpleSelectorControl, TimeAndUserMenu, TimeFormatter, TimeService, TreePickerControl, TreePickerControlV2, USER_LABELS, UTLSettingsProvider, UserProvider, axiosInstance, deleteUser, dxtServerTimeZone, dxtToLocalServerTime, dxtToUTC, formatNumber, getAuthTypes, getCrewStyle, getDataUser, getEntries$1 as getEntries, getError, getMomentTz, getShiftByParameters, getShiftStyle, getShiftsRangeByParameters, getTokenFromLS, getUserPermissionsFromAPI, getUsers, logbookNavbar, logbookRoutesMESF, renewToken, routeLogbookEntry$1 as routeLogbookEntry, routeLogbookReport, useSearchAssets as searchAssets, sectionLogbookNavbar, sectionLogbookRoutesMESF, setPassword, setProfilesToUser, themeDXT, themeMESF, upsertUser, useAssetContext, useContextMenuMESF, useHasPermission, useHasProfile, useLogbookSettings, useMesfRealtime, useShiftNavigator, useShiftNavigatorManager, useToken, useUTLSettingsContext, useUserContext };
24961
22288
  //# sourceMappingURL=index.esm.js.map