@dexteel/mesf-core 7.11.0 → 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 (63) hide show
  1. package/.release-please-manifest.json +1 -1
  2. package/CHANGELOG.md +7 -0
  3. package/dist/MESFMain.d.ts +1 -1
  4. package/dist/components/navigation/Header.d.ts +1 -2
  5. package/dist/components/navigation/Navigation.d.ts +1 -2
  6. package/dist/index.d.ts +0 -1
  7. package/dist/index.esm.js +637 -3353
  8. package/dist/index.esm.js.map +1 -1
  9. package/dist/pages/trendings-v2/TrendingsPageV2.d.ts +2 -2
  10. package/dist/pages/trendings-v2/components/chart/components/TagFolderCustomNodeV2.d.ts +1 -1
  11. package/dist/pages/trendings-v2/components/chart/components/TagSearchInput.d.ts +1 -1
  12. package/dist/pages/trendings-v2/components/chart/components/TagsTreeModalV2.d.ts +1 -1
  13. package/dist/pages/{trendings/components/chart/components/modals/tagsTreeModal/ContextMenu → trendings-v2/components/chart/components/modals/tagsTreeModal}/ContextMenu.d.ts +1 -1
  14. package/dist/pages/{trendings → trendings-v2}/components/chart/components/modals/tagsTreeModal/CustomDragView.d.ts +1 -1
  15. 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
  16. 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
  17. package/dist/pages/trendings-v2/components/chart/context/TrendingContextV2.d.ts +1 -2
  18. package/dist/pages/trendings-v2/components/chart/hooks/useTagSearch.d.ts +1 -1
  19. package/dist/pages/trendings-v2/components/chart/models/TrendingModelsV2.d.ts +1 -0
  20. package/dist/pages/trendings-v2/components/chart/repository/TrendingRepositoryV2.d.ts +47 -1
  21. package/dist/pages/trendings-v2/components/chart/utils/buildTagsTree.d.ts +3 -0
  22. package/dist/pages/trendings-v2/components/chart/utils/calculateDateFromPeriod.d.ts +1 -1
  23. package/dist/pages/{trendings → trendings-v2}/components/chart/utils/dateNavigator.d.ts +1 -1
  24. package/package.json +1 -1
  25. package/dist/pages/trendings/TrendingsPage.d.ts +0 -3
  26. package/dist/pages/trendings/components/chart/DateComponent.d.ts +0 -6
  27. package/dist/pages/trendings/components/chart/TableComponent.d.ts +0 -14
  28. package/dist/pages/trendings/components/chart/Trending.d.ts +0 -9
  29. package/dist/pages/trendings/components/chart/components/CellComponent.d.ts +0 -11
  30. package/dist/pages/trendings/components/chart/components/ColorPicker.d.ts +0 -8
  31. package/dist/pages/trendings/components/chart/components/DraggableLineControl.d.ts +0 -11
  32. package/dist/pages/trendings/components/chart/components/modals/deleteViewModal/DeleteViewModal.d.ts +0 -9
  33. package/dist/pages/trendings/components/chart/components/modals/editViewModal/EditViewModal.d.ts +0 -9
  34. package/dist/pages/trendings/components/chart/components/modals/loadView/LoadViewModal.d.ts +0 -7
  35. package/dist/pages/trendings/components/chart/components/modals/saveAsView/SaveAsViewModal.d.ts +0 -7
  36. package/dist/pages/trendings/components/chart/components/modals/saveView/SaveViewModal.d.ts +0 -7
  37. package/dist/pages/trendings/components/chart/components/modals/tagsTreeModal/TagFolderCustomNode.d.ts +0 -20
  38. package/dist/pages/trendings/components/chart/components/modals/tagsTreeModal/TagSelectionModal.d.ts +0 -9
  39. package/dist/pages/trendings/components/chart/components/modals/tagsTreeModal/TagsTreeModal.d.ts +0 -9
  40. package/dist/pages/trendings/components/chart/context/TrendingContext.d.ts +0 -120
  41. package/dist/pages/trendings/components/chart/customOptionsComponent.d.ts +0 -10
  42. package/dist/pages/trendings/components/chart/hooks/useGetVerticalLinePlugin.d.ts +0 -2
  43. package/dist/pages/trendings/components/chart/hooks/useTagsDataTable.d.ts +0 -24
  44. package/dist/pages/trendings/components/chart/hooks/useUpdateCursorData.d.ts +0 -2
  45. package/dist/pages/trendings/components/chart/hooks/useXAxisDatePlugin.d.ts +0 -2
  46. package/dist/pages/trendings/components/chart/hooks/useYAxisPlugin.d.ts +0 -2
  47. package/dist/pages/trendings/components/chart/models/TagsTree.model.d.ts +0 -12
  48. package/dist/pages/trendings/components/chart/models/TrendingModels.d.ts +0 -65
  49. package/dist/pages/trendings/components/chart/models/scopes.model.d.ts +0 -1
  50. package/dist/pages/trendings/components/chart/repository/TrendingRepository.d.ts +0 -48
  51. package/dist/pages/trendings/components/chart/sections/chart/hooks/useChartOptions.d.ts +0 -105
  52. package/dist/pages/trendings/components/chart/sections/header.d.ts +0 -8
  53. package/dist/pages/trendings/components/chart/sections/trending-chart.d.ts +0 -12
  54. package/dist/pages/trendings/components/chart/utils/areRangeSimilar.d.ts +0 -2
  55. package/dist/pages/trendings/components/chart/utils/buildTagsTree.d.ts +0 -4
  56. package/dist/pages/trendings/components/chart/utils/calculateScales.d.ts +0 -4
  57. package/dist/pages/trendings/components/chart/utils/formatDateTimeToString.d.ts +0 -4
  58. package/dist/pages/trendings/components/chart/utils/formatTimeDiffWithMs.d.ts +0 -1
  59. package/dist/pages/trendings/components/chart/utils/timeDifference.d.ts +0 -1
  60. package/dist/pages/trendings/hooks/useTrendingQueries.d.ts +0 -15
  61. package/dist/pages/trendings/index.d.ts +0 -3
  62. package/dist/pages/trendings/reducers/trendings.reducer.d.ts +0 -115
  63. /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",
@@ -10569,11 +10560,11 @@ var AreaSelector$1 = lazy(function () {
10569
10560
  default: mod.AreaSelector,
10570
10561
  }); });
10571
10562
  });
10572
- function Header$1(_a) {
10573
- 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;
10574
- 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];
10575
10566
  var CustomNavbar = useContext(NavbarContext);
10576
- var _g = useState(false), drawerOpen = _g[0], setDrawerOpen = _g[1];
10567
+ var _f = useState(false), drawerOpen = _f[0], setDrawerOpen = _f[1];
10577
10568
  var hasPermissionTo = useHasPermission();
10578
10569
  useUserContext().state.userLogged;
10579
10570
  var handleDrawerToggle = function () {
@@ -10631,9 +10622,6 @@ function Header$1(_a) {
10631
10622
  alignItems: "center",
10632
10623
  color: "white",
10633
10624
  } },
10634
- showTrendingsIcon && (React__default.createElement(Tooltip, { title: "Trendings", placement: "bottom", arrow: true, enterDelay: 1500 },
10635
- React__default.createElement(IconButton$1, { color: "inherit", component: Link, to: "/trendings" },
10636
- React__default.createElement(ShowChartIcon, null)))),
10637
10625
  showTrendingsV2Icon && (React__default.createElement(Tooltip, { title: "Trendings V2 (ECharts)", placement: "bottom", arrow: true, enterDelay: 1500 },
10638
10626
  React__default.createElement(IconButton$1, { color: "inherit", component: Link, to: "/trendings-v2" },
10639
10627
  React__default.createElement(Timeline, null)))),
@@ -11672,45 +11660,7 @@ var Configuration = function () {
11672
11660
  React__default.createElement(route.main, null)) })); })))));
11673
11661
  };
11674
11662
 
11675
- var tagColors$1 = [
11676
- "#00AA00", // green
11677
- "#0000FF", // blue
11678
- "#FF0000", // red
11679
- "#9C27B0", // purple
11680
- "#FFA500", // orange
11681
- "#397234", // forest green
11682
- "#283F23", // dark olive
11683
- "#3F2617", // dark brown
11684
- "#0B0F08", // charcoal black
11685
- "#889c2dff", // olive green
11686
- "#B78449", // tan brown
11687
- "#5D9F96", // teal
11688
- "#1d5e74ff", // dark teal
11689
- "#FA7305", // bright orange
11690
- "#072684", // navy blue
11691
- "#269473ff", // emerald green
11692
- "#5d74b9ff", // slate blue
11693
- "#0C8EF4", // sky blue
11694
- "#8d481cff", // rust brown
11695
- "#2B384C", // dark slate
11696
- ];
11697
- var availableColors = __spreadArray([], tagColors$1, true);
11698
- var lastColor = null;
11699
- var getRandomColor = function () {
11700
- if (availableColors.length === 0) {
11701
- availableColors = __spreadArray([], tagColors$1, true);
11702
- if (lastColor && availableColors.length > 1) {
11703
- availableColors.splice(availableColors.indexOf(lastColor), 1);
11704
- }
11705
- }
11706
- var randomIndex = Math.floor(Math.random() * availableColors.length);
11707
- var color = availableColors[randomIndex];
11708
- availableColors.splice(randomIndex, 1);
11709
- lastColor = color;
11710
- return color;
11711
- };
11712
-
11713
- var TrendingContext$1 = createContext(undefined);
11663
+ var TrendingContext = createContext(undefined);
11714
11664
  var getDefaultTimeScope = function () {
11715
11665
  var end = new Date();
11716
11666
  var start = new Date(end.getTime() - 8 * 60 * 60 * 1000); // 8 hours ago
@@ -11861,10 +11811,10 @@ var TrendingProviderV2 = function (_a) {
11861
11811
  state: state,
11862
11812
  actions: actions,
11863
11813
  }); }, [state, actions]);
11864
- return (React__default.createElement(TrendingContext$1.Provider, { value: value }, children));
11814
+ return (React__default.createElement(TrendingContext.Provider, { value: value }, children));
11865
11815
  };
11866
11816
  var useTrendingContextV2 = function () {
11867
- var context = useContext(TrendingContext$1);
11817
+ var context = useContext(TrendingContext);
11868
11818
  if (!context) {
11869
11819
  throw new Error("useTrendingContextV2 must be used within TrendingProviderV2");
11870
11820
  }
@@ -12166,39 +12116,6 @@ var deleteAllViewTagsFromView = function (ViewId) { return __awaiter(void 0, voi
12166
12116
  });
12167
12117
  }); };
12168
12118
 
12169
- var dateNavigator = function (startDate, endDate, scope, operator, current) {
12170
- if (current === void 0) { current = false; }
12171
- var newStartDate;
12172
- var newEndDate = endDate;
12173
- if (current) {
12174
- newEndDate = new Date();
12175
- if (scope === "custom") {
12176
- // If scope is custom, keep the same startDate
12177
- newStartDate = startDate;
12178
- }
12179
- else {
12180
- var _a = scope.split(" "), quantity = _a[0], duration = _a[1];
12181
- newStartDate = moment$f(newEndDate)
12182
- .subtract(quantity, duration[0])
12183
- .toDate();
12184
- }
12185
- }
12186
- else {
12187
- if (scope === "custom") {
12188
- var durationInMs = moment$f(endDate).diff(moment$f(startDate));
12189
- newStartDate = moment$f(startDate)[operator](durationInMs).toDate();
12190
- }
12191
- else {
12192
- var _b = scope.split(" "), quantity = _b[0], duration = _b[1];
12193
- newStartDate = moment$f(startDate)[operator](quantity, duration[0])
12194
- .toDate();
12195
- newEndDate = moment$f(endDate)[operator](quantity, duration[0])
12196
- .toDate();
12197
- }
12198
- }
12199
- return { newStartDate: newStartDate, newEndDate: newEndDate };
12200
- };
12201
-
12202
12119
  var ConfirmationDialogRaw = function (_a) {
12203
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"]);
12204
12121
  var handleCancel = function () {
@@ -12604,6 +12521,39 @@ var calculateCounterpartDate = function (changedDate, changedField, scope) {
12604
12521
  }
12605
12522
  };
12606
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
+
12607
12557
  var HeaderSectionV2 = React__default.memo(function (_a) {
12608
12558
  var autoRefresh = _a.autoRefresh, setAutoRefresh = _a.setAutoRefresh, setChartOptions = _a.setChartOptions, chartInstance = _a.chartInstance;
12609
12559
  var queryClient = useQueryClient();
@@ -12934,7 +12884,7 @@ var HeaderSectionV2 = React__default.memo(function (_a) {
12934
12884
  });
12935
12885
  HeaderSectionV2.displayName = "HeaderSectionV2";
12936
12886
 
12937
- var tagColors = [
12887
+ var tagColors$1 = [
12938
12888
  "#5eaf60", // light green
12939
12889
  "green", // green
12940
12890
  "#62bd9c", // turquoise green
@@ -13003,7 +12953,7 @@ var ColorPickerV2 = function (_a) {
13003
12953
  flexWrap: "wrap",
13004
12954
  padding: "10px",
13005
12955
  maxWidth: "165px",
13006
- } }, 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 })); })))));
13007
12957
  };
13008
12958
 
13009
12959
  var NotificationSnackBar = function (_a) {
@@ -13022,274 +12972,88 @@ var NotificationSnackBar = function (_a) {
13022
12972
  React__default.createElement(Alert$3, { elevation: 6, variant: "filled", severity: severity, onClose: handleClose }, message)));
13023
12973
  };
13024
12974
 
13025
- var NewFolderModal = function (_a) {
13026
- var open = _a.open, handleClose = _a.handleClose, tagNodeSelectedInTree = _a.tagNodeSelectedInTree;
13027
- var _b = useState(), name = _b[0], setName = _b[1];
13028
- var _c = useState(""), error = _c[0], setError = _c[1];
13029
- var _d = useState(false), isLoading = _d[0], setIsLoading = _d[1];
13030
- var updateTagFolder = useMutation({
13031
- mutationFn: upsertTagFolder,
13032
- onError: function (error) {
13033
- setError(error.message);
13034
- },
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);
13035
12986
  });
13036
- var onSubmit = function (e) { return __awaiter(void 0, void 0, void 0, function () {
13037
- 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 () {
13038
12995
  var _a;
13039
- return __generator(this, function (_b) {
13040
- switch (_b.label) {
13041
- case 0:
13042
- e.preventDefault();
13043
- parentId = Number(tagNodeSelectedInTree === null || tagNodeSelectedInTree === void 0 ? void 0 : tagNodeSelectedInTree.parent) || null;
13044
- parentTagId = ((_a = tagNodeSelectedInTree === null || tagNodeSelectedInTree === void 0 ? void 0 : tagNodeSelectedInTree.data) === null || _a === void 0 ? void 0 : _a.TagTypeCode) === "F"
13045
- ? Number(tagNodeSelectedInTree.id)
13046
- : parentId;
13047
- setIsLoading(true);
13048
- if (!name) return [3 /*break*/, 2];
13049
- return [4 /*yield*/, updateTagFolder.mutate({
13050
- tagFolderId: null,
13051
- parentTagFolderId: parentTagId,
13052
- tagFolderName: name,
13053
- isActive: true,
13054
- })];
13055
- case 1:
13056
- _b.sent();
13057
- _b.label = 2;
13058
- case 2:
13059
- handleClose(true);
13060
- setName("");
13061
- setIsLoading(false);
13062
- 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);
13063
13002
  }
13064
- });
13065
- }); };
13066
- return (React__default.createElement(React__default.Fragment, null,
13067
- 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" },
13068
- React__default.createElement(MesfModal.Content, null,
13069
- React__default.createElement(Box, null,
13070
- 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); } }))),
13071
- React__default.createElement(MesfModal.Actions, null,
13072
- React__default.createElement("div", null,
13073
- React__default.createElement(Button, { color: "secondary", variant: "outlined", onClick: function () { return handleClose(false); } }, "Cancel")),
13074
- React__default.createElement("div", null,
13075
- React__default.createElement(ButtonWithLoading, { isLoading: isLoading, onClick: onSubmit, color: "primary", variant: "contained" }, "Save")))),
13076
- React__default.createElement(ErrorModal, { error: error, onHide: function () { return setError(""); } })));
13077
- };
13078
-
13079
- var RemoveFolderModal = function (_a) {
13080
- var open = _a.open, handleClose = _a.handleClose, tagNodeSelectedInTree = _a.tagNodeSelectedInTree;
13081
- var _b = useState(""), error = _b[0], setError = _b[1];
13082
- var _c = useState(false), isLoading = _c[0], setIsLoading = _c[1];
13083
- var updateTagFolder = useMutation({
13084
- mutationFn: upsertTagFolder,
13085
- onError: function (error) {
13086
- setError(error.message);
13087
- },
13088
- });
13089
- var removeFolder = useMutation({
13090
- mutationFn: deleteTagFolder,
13091
- onError: function (error) {
13092
- setError(error.message);
13093
- },
13094
- });
13095
- var onSubmit = function (e) { return __awaiter(void 0, void 0, void 0, function () {
13096
- var parentId, name_1, id;
13097
- return __generator(this, function (_a) {
13098
- switch (_a.label) {
13099
- case 0:
13100
- e.preventDefault();
13101
- if (!tagNodeSelectedInTree) return [3 /*break*/, 4];
13102
- parentId = Number(tagNodeSelectedInTree === null || tagNodeSelectedInTree === void 0 ? void 0 : tagNodeSelectedInTree.parent) || null;
13103
- name_1 = tagNodeSelectedInTree === null || tagNodeSelectedInTree === void 0 ? void 0 : tagNodeSelectedInTree.text;
13104
- id = Number(tagNodeSelectedInTree === null || tagNodeSelectedInTree === void 0 ? void 0 : tagNodeSelectedInTree.id);
13105
- setIsLoading(true);
13106
- if (!parentId) return [3 /*break*/, 2];
13107
- return [4 /*yield*/, removeFolder.mutate(id)];
13108
- case 1:
13109
- _a.sent();
13110
- return [3 /*break*/, 4];
13111
- case 2: return [4 /*yield*/, updateTagFolder.mutate({
13112
- tagFolderId: id,
13113
- parentTagFolderId: parentId,
13114
- tagFolderName: name_1,
13115
- isActive: false,
13116
- })];
13117
- case 3:
13118
- _a.sent();
13119
- _a.label = 4;
13120
- case 4:
13121
- handleClose(true);
13122
- setIsLoading(false);
13123
- return [2 /*return*/];
13124
- }
13125
- });
13126
- }); };
13127
- return (React__default.createElement(React__default.Fragment, null,
13128
- 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" },
13129
- React__default.createElement(MesfModal.Content, null,
13130
- React__default.createElement(Box, null,
13131
- React__default.createElement(Typography$1, null,
13132
- "Are you sure you want to remove",
13133
- " ",
13134
- React__default.createElement("strong", null, tagNodeSelectedInTree === null || tagNodeSelectedInTree === void 0 ? void 0 : tagNodeSelectedInTree.text),
13135
- " folder?"))),
13136
- React__default.createElement(MesfModal.Actions, null,
13137
- React__default.createElement("div", null,
13138
- React__default.createElement(Button, { color: "secondary", variant: "outlined", onClick: function () { return handleClose(false); } }, "Cancel")),
13139
- React__default.createElement("div", null,
13140
- React__default.createElement(ButtonWithLoading, { isLoading: isLoading, onClick: onSubmit, color: "primary", variant: "contained" }, "Remove")))),
13141
- React__default.createElement(ErrorModal, { error: error, onHide: function () { return setError(""); } })));
13142
- };
13143
-
13144
- var ContextMenu = function (_a) {
13145
- var _b;
13146
- var isOpen = _a.isOpen, anchorPoint = _a.anchorPoint, tagNodeSelectedInTree = _a.tagNodeSelectedInTree, getTagsTreeData = _a.getTagsTreeData, setShowContextMenu = _a.setShowContextMenu;
13147
- var _c = useState(false), showNewTagModal = _c[0], setShowNewTagModal = _c[1];
13148
- var _d = useState(false), showRemoveTagModal = _d[0], setShowRemoveTagModal = _d[1];
13149
- var isFolder = ((_b = tagNodeSelectedInTree === null || tagNodeSelectedInTree === void 0 ? void 0 : tagNodeSelectedInTree.data) === null || _b === void 0 ? void 0 : _b.TagTypeCode) === "F";
13150
- return (React__default.createElement(React__default.Fragment, null,
13151
- isOpen && anchorPoint ? (React__default.createElement("ul", { style: {
13152
- top: anchorPoint.y,
13153
- left: anchorPoint.x,
13154
- fontSize: "0.875rem",
13155
- backgroundColor: "#fff",
13156
- borderRadius: "2px",
13157
- padding: "5px 10px;",
13158
- width: "140px",
13159
- height: "auto",
13160
- margin: "0",
13161
- position: "fixed",
13162
- boxShadow: "0 0 20px 0 #ccc",
13163
- display: "flex",
13164
- flexDirection: "column",
13165
- } },
13166
- React__default.createElement(MenuItem, { style: { width: "100%", justifyContent: "left" }, onClick: function () { return setShowNewTagModal(true); } }, "New Folder"),
13167
- tagNodeSelectedInTree && isFolder && (React__default.createElement(MenuItem, { style: { width: "100%", justifyContent: "left" }, onClick: function () { return setShowRemoveTagModal(true); } }, "Remove Folder")))) : null,
13168
- React__default.createElement(NewFolderModal, { open: showNewTagModal, handleClose: function (shouldUpdate) {
13169
- if (shouldUpdate) {
13170
- getTagsTreeData();
13171
- }
13172
- setShowContextMenu(false);
13173
- setShowNewTagModal(false);
13174
- }, tagNodeSelectedInTree: tagNodeSelectedInTree }),
13175
- React__default.createElement(RemoveFolderModal, { open: showRemoveTagModal, handleClose: function (shouldUpdate) {
13176
- if (shouldUpdate) {
13177
- getTagsTreeData();
13178
- }
13179
- setShowContextMenu(false);
13180
- setShowRemoveTagModal(false);
13181
- }, tagNodeSelectedInTree: tagNodeSelectedInTree })));
13182
- };
13183
-
13184
- var CustomDragPreview = function (props) {
13185
- var _a, _b, _c;
13186
- var item = props.monitorProps.item;
13187
- var isFolder = ((_a = item.data) === null || _a === void 0 ? void 0 : _a.TagTypeCode) === "F" ? true : false;
13188
- return (React__default.createElement(Box, { sx: {
13189
- alignItems: "center",
13190
- backgroundColor: "#1967d2",
13191
- borderRadius: "4px",
13192
- boxShadow: " 0 12px 24px -6px rgba(0, 0, 0, .25); 0 0 0 1px rgba(0, 0, 0, .08)",
13193
- color: "#fff",
13194
- display: "inline-grid",
13195
- fontSize: "0.875rem",
13196
- gap: "8px",
13197
- gridTemplateColumns: "auto auto",
13198
- padding: "4px 8px",
13199
- pointerEvents: "none",
13200
- } },
13201
- React__default.createElement(Box, { sx: {
13202
- alignItems: "center",
13203
- display: "flex",
13204
- } }, isFolder ? React__default.createElement(FolderIcon, null) : React__default.createElement(InsertChartIcon, { fontSize: "small" })),
13205
- React__default.createElement(Box, { sx: {
13206
- alignItems: "center",
13207
- display: "flex",
13208
- } }, ((_b = item.data) === null || _b === void 0 ? void 0 : _b.Alias) || ((_c = item.data) === null || _c === void 0 ? void 0 : _c.TagName))));
13209
- };
13210
-
13211
- function buildTagsTreeV2(data) {
13212
- var tagsForTree = [];
13213
- data.forEach(function (el) {
13214
- var tagForTree = {
13215
- id: el.TagId,
13216
- parent: el.ParentTagId || 0,
13217
- text: el.TagName,
13218
- data: el,
13219
- droppable: el.TagTypeCode === "F",
13220
- };
13221
- return tagsForTree.push(tagForTree);
13222
- });
13223
- return tagsForTree;
13224
- }
13225
-
13226
- var customStyles$1 = "\n ul, ol {\n list-style-type: none;\n margin: 0;\n padding: 0;\n }\n";
13227
- var TagFolderCustomNodeV2 = function (_a) {
13228
- var _b, _c, _d, _e, _f, _g, _h, _j;
13229
- 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;
13230
- var onClickHandler = function () {
13231
- var _a;
13232
- var _b;
13233
- if (options.hasChild || ((_b = node.data) === null || _b === void 0 ? void 0 : _b.TagTypeCode) === "F") {
13234
- if (openTagFolders[node.id]) {
13235
- var newOpenTagFolders = __assign({}, openTagFolders);
13236
- delete newOpenTagFolders[node.id];
13237
- setOpenTagFolders(newOpenTagFolders);
13238
- }
13239
- else {
13240
- setOpenTagFolders(__assign(__assign({}, openTagFolders), (_a = {}, _a[node.id] = node.id, _a)));
13241
- }
13242
- onToggle();
13243
- return;
13244
- }
13245
- if (!options.hasChild) {
13246
- handleSelect(node);
13247
- }
13248
- };
13249
- var handleContextMenu = useCallback(function (ev) {
13250
- ev.stopPropagation();
13251
- ev.preventDefault();
13252
- setContextMenuOver(node, ev);
13253
- }, [node.id, setContextMenuOver]);
13254
- useEffect(function () {
13255
- var _a;
13256
- (_a = containerRef.current) === null || _a === void 0 ? void 0 : _a.addEventListener("contextmenu", handleContextMenu);
13257
- return function () {
13258
- var _a;
13259
- (_a = containerRef.current) === null || _a === void 0 ? void 0 : _a.removeEventListener("contextmenu", handleContextMenu);
13260
- };
13261
- }, []);
13262
- return (React__default.createElement(Box, { "data-node-id": node.id, onClick: onClickHandler, sx: {
13263
- paddingInlineStart: depth * 2,
13264
- cursor: "pointer",
13265
- alignItems: "center",
13266
- display: "flex",
13267
- height: "32px",
13268
- backgroundColor: isSelected ? "#e8f0fe" : "",
13269
- "&:hover": {
13270
- backgroundColor: "#f2f2f2",
13271
- },
13272
- } },
13273
- React__default.createElement("style", null, customStyles$1),
13274
- React__default.createElement(React__default.Fragment, null,
13275
- options.hasChild ? (React__default.createElement("div", null, isOpen ? React__default.createElement(ArrowDropDownIcon, null) : React__default.createElement(ArrowRight, null))) : null,
13276
- 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" })))),
13277
- ((_c = node.data) === null || _c === void 0 ? void 0 : _c.TagName) && (React__default.createElement(React__default.Fragment, null,
13278
- ((_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: {
13279
- width: "20px",
13280
- height: "20px",
13281
- color: "white",
13282
- display: "flex",
13283
- justifyContent: "center",
13284
- alignItems: "center",
13285
- fontSize: "10px",
13286
- fontWeight: "bold",
13287
- borderRadius: "3px",
13288
- border: "1px solid rgba(0, 0, 0, 0.2)",
13289
- backgroundColor: ((_f = node.data) === null || _f === void 0 ? void 0 : _f.TagTypeCode) === "A" ? "#AD48C4" : "#C46F48",
13290
- } }, (_g = node.data) === null || _g === void 0 ? void 0 : _g.TagTypeCode)),
13291
- React__default.createElement(Tooltip, { title: node.data.TagName, placement: "top", arrow: true },
13292
- 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)))))));
13293
13057
  };
13294
13058
 
13295
13059
  var useTagSearch = function (_a) {
@@ -13528,70 +13292,256 @@ var TagSearchInput = function (_a) {
13528
13292
  } }))); })))));
13529
13293
  };
13530
13294
 
13531
- // React Query hook for fetching tags tree
13532
- var useSearchTagsTree$1 = function () {
13533
- return useQuery({
13534
- queryKey: ["tagsTree-v2"],
13535
- queryFn: function () { return getTagsTree(); },
13536
- enabled: false, // Only fetch when explicitly called
13537
- });
13538
- };
13539
- var TagsTreeModalV2 = function (_a) {
13540
- var open = _a.open, handleClose = _a.handleClose, onTagSelect = _a.onTagSelect;
13541
- 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];
13542
13298
  var _c = useState(""), error = _c[0], setError = _c[1];
13543
- var _d = useState(null), snackbarMessage = _d[0], setSnackbarMessage = _d[1];
13544
- var _e = useState([]), tagsTreeData = _e[0], setTagsTreeData = _e[1];
13545
- var _f = useState(null), tagNodeSelectedInTree = _f[0], setTagNodeSelectedInTree = _f[1];
13546
- var _g = useState(null), anchorPoint = _g[0], setAnchorPoint = _g[1];
13547
- var _h = useState(false), showContextMenu = _h[0], setShowContextMenu = _h[1];
13548
- var backendOffset = 1000000;
13549
- var _j = useState({}), openTagFolders = _j[0], setOpenTagFolders = _j[1];
13550
- var _k = useState([]), selectedNodes = _k[0], setSelectedNodes = _k[1];
13551
- var handleContextMenu = function (data, e) {
13552
- e.preventDefault();
13553
- var top = e.clientY;
13554
- var left = e.clientX;
13555
- setAnchorPoint({ x: left, y: top });
13556
- setSelectedNodes([data]);
13557
- setShowContextMenu(true);
13558
- var selectedNode = tagsTreeData.find(function (node) { var _a; return ((_a = node.data) === null || _a === void 0 ? void 0 : _a.TagId) === data.id; });
13559
- if (selectedNode) {
13560
- setTagNodeSelectedInTree(selectedNode);
13561
- }
13562
- };
13563
- 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];
13564
13300
  var updateTagFolder = useMutation({
13565
- mutationFn: function (_a) {
13566
- var tagFolderId = _a.tagFolderId, parentTagFolderId = _a.parentTagFolderId, tagFolderName = _a.tagFolderName, isActive = _a.isActive;
13567
- return upsertTagFolder({
13568
- tagFolderId: tagFolderId,
13569
- parentTagFolderId: parentTagFolderId,
13570
- tagFolderName: tagFolderName,
13571
- isActive: isActive,
13572
- });
13573
- },
13574
- onError: function (error) {
13575
- setError(error.message);
13576
- },
13577
- });
13578
- var changeTagFolderTag = useMutation({
13579
- mutationFn: function (_a) {
13580
- var tagId = _a.tagId, tagFolderId = _a.tagFolderId;
13581
- return changeTagFolderToTag({ tagId: tagId, tagFolderId: tagFolderId });
13582
- },
13301
+ mutationFn: upsertTagFolder,
13583
13302
  onError: function (error) {
13584
13303
  setError(error.message);
13585
13304
  },
13586
13305
  });
13587
- var expanded = useMemo(function () {
13588
- return Object.keys(openTagFolders).map(function (el) { return Number.parseInt(el); });
13589
- }, [openTagFolders]);
13590
- var handleDrop = function (tree, options) { return __awaiter(void 0, void 0, void 0, function () {
13591
- var tagId, newFolderId;
13592
- var _a, _b;
13593
- return __generator(this, function (_c) {
13594
- switch (_c.label) {
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;
13531
+ return changeTagFolderToTag({ tagId: tagId, tagFolderId: tagFolderId });
13532
+ },
13533
+ onError: function (error) {
13534
+ setError(error.message);
13535
+ },
13536
+ });
13537
+ var expanded = useMemo(function () {
13538
+ return Object.keys(openTagFolders).map(function (el) { return Number.parseInt(el); });
13539
+ }, [openTagFolders]);
13540
+ var handleDrop = function (tree, options) { return __awaiter(void 0, void 0, void 0, function () {
13541
+ var tagId, newFolderId;
13542
+ var _a, _b;
13543
+ return __generator(this, function (_c) {
13544
+ switch (_c.label) {
13595
13545
  case 0:
13596
13546
  setIsLoading(true);
13597
13547
  if (!options.dragSource) return [3 /*break*/, 5];
@@ -14058,24 +14008,62 @@ var LoadViewModalV2 = function (_a) {
14058
14008
  React__default.createElement(ErrorModal, { error: error, onHide: function () { return setError(""); } })));
14059
14009
  };
14060
14010
 
14061
- var TagsTableV2 = function () {
14062
- var queryClient = useQueryClient();
14063
- var _a = useContextMenuMESF(), registerConfig = _a.registerConfig, showContextMenu = _a.showContextMenu;
14064
- 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;
14065
- // Number formatters for consistent thousand separator and decimal formatting
14066
- var numberFormatterOneDecimal = useMemo(function () {
14067
- return new Intl.NumberFormat("en-US", {
14068
- minimumFractionDigits: 1,
14069
- maximumFractionDigits: 1,
14070
- });
14071
- }, []);
14072
- var numberFormatterNoDecimal = useMemo(function () {
14073
- return new Intl.NumberFormat("en-US", {
14074
- minimumFractionDigits: 0,
14075
- maximumFractionDigits: 0,
14076
- });
14077
- }, []);
14078
- // State management
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
14079
14067
  var _e = useState(""), error = _e[0], setError = _e[1];
14080
14068
  var _f = useState(false); _f[0]; var setIsLoading = _f[1];
14081
14069
  var _g = useState(null); _g[0]; var setSelectedRowTagId = _g[1];
@@ -16332,7 +16320,7 @@ var TrendingChartV2 = function (_a) {
16332
16320
  };
16333
16321
 
16334
16322
  // React Query hooks for data fetching
16335
- var useSearchViews$1 = function (_a) {
16323
+ var useSearchViews = function (_a) {
16336
16324
  var _b = _a.autoRefresh, autoRefresh = _b === void 0 ? false : _b;
16337
16325
  return useQuery({
16338
16326
  queryKey: ["views-v2"],
@@ -16340,7 +16328,7 @@ var useSearchViews$1 = function (_a) {
16340
16328
  refetchInterval: autoRefresh ? 10000 : false,
16341
16329
  });
16342
16330
  };
16343
- var useSearchViewTags$1 = function (_a) {
16331
+ var useSearchViewTags = function (_a) {
16344
16332
  var viewId = _a.viewId;
16345
16333
  return useQuery({
16346
16334
  queryKey: ["viewTags-v2", viewId],
@@ -16353,7 +16341,7 @@ var useSearchViewTags$1 = function (_a) {
16353
16341
  enabled: viewId !== null,
16354
16342
  });
16355
16343
  };
16356
- var useSearchSeries$1 = function (_a) {
16344
+ var useSearchSeries = function (_a) {
16357
16345
  var start = _a.start, end = _a.end, tagIds = _a.tagIds, _b = _a.autoRefresh, autoRefresh = _b === void 0 ? false : _b;
16358
16346
  return useQuery({
16359
16347
  queryKey: ["series-v2", start, end, tagIds],
@@ -16401,9 +16389,9 @@ var TrendingsPageV2 = function () {
16401
16389
  var _f = useState(0), dataLoadedTrigger = _f[0], setDataLoadedTrigger = _f[1];
16402
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;
16403
16391
  // Fetch views
16404
- 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;
16405
16393
  // Fetch view tags
16406
- 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;
16407
16395
  // Memoize tagIds for series query
16408
16396
  // Tags are sorted in DESCENDING order to match TrendingChartV2 processing
16409
16397
  var tagIds = useMemo(function () {
@@ -16444,7 +16432,7 @@ var TrendingsPageV2 = function () {
16444
16432
  return stableTagIdsRef.current;
16445
16433
  }, [realTagIds, timeScopeStart, timeScopeEnd]);
16446
16434
  // Fetch series data using stable query key
16447
- var _m = useSearchSeries$1({
16435
+ var _m = useSearchSeries({
16448
16436
  start: timeScopeStart.getTime(),
16449
16437
  end: timeScopeEnd.getTime(),
16450
16438
  tagIds: queryTagIds,
@@ -16490,2891 +16478,96 @@ var TrendingsPageV2 = function () {
16490
16478
  // BitIndex 0 = LSB (least significant bit)
16491
16479
  return sourceData.map(function (point) { return ({
16492
16480
  timestamp: point.timestamp,
16493
- value: point.value !== null
16494
- ? (Math.floor(point.value) >> viewTag.BitIndex) & 1
16495
- : null,
16496
- }); });
16497
- }
16498
- // Regular tag - use series data directly
16499
- return seriesMap.get(tagId);
16500
- })
16501
- .filter(Boolean);
16502
- }, [series, tagIds, queryTagIds, viewTags]);
16503
- // Calculate overall min/max values from filtered series data
16504
- var seriesMinMaxData = useSeriesMinMax(filteredSeries, tagIds);
16505
- // Load initial view when views are fetched
16506
- useEffect(function () {
16507
- if (!viewSuccess || !views || !Array.isArray(views))
16508
- return;
16509
- // Always update the views list in context
16510
- setViews(views);
16511
- // Only set initial view if none is selected
16512
- if (!viewSelected) {
16513
- var lastCreated = views.reduce(function (prev, current) {
16514
- return prev && prev.ViewId > current.ViewId ? prev : current;
16515
- }, null);
16516
- if (lastCreated) {
16517
- setViewId(lastCreated.ViewId);
16518
- setViewSelected(lastCreated);
16519
- }
16520
- }
16521
- }, [viewSuccess, views, viewSelected, setViews, setViewSelected]);
16522
- // Update viewId when viewSelected changes (e.g., from LoadViewModal)
16523
- useEffect(function () {
16524
- if (viewSelected) {
16525
- setViewId(viewSelected.ViewId);
16526
- }
16527
- }, [viewSelected]);
16528
- // Load view tags when fetched - ONLY when viewId changes, not on every data refetch
16529
- // This preserves local order changes (from drag-and-drop) until a new view is loaded
16530
- var loadedViewIdRef = useRef(null);
16531
- useEffect(function () {
16532
- if (!viewTagsSuccess ||
16533
- !viewTagsData ||
16534
- !Array.isArray(viewTagsData) ||
16535
- viewId === null)
16536
- return;
16537
- // Only reset viewTags when viewId actually changes (loading a different view)
16538
- // Do NOT reset if viewId is the same (data is just refetching)
16539
- if (viewId === loadedViewIdRef.current)
16540
- return;
16541
- loadedViewIdRef.current = viewId;
16542
- var backendTags = viewTagsData;
16543
- var localViewTags = getViewFromLocal(viewId);
16544
- var mergedTags = {};
16545
- if (localViewTags) {
16546
- // If local storage exists, use it as the source of truth for metadata (Order, Alias)
16547
- // and for virtual tags (Bit Extracted)
16548
- var backendTagIds_1 = new Set(backendTags.map(function (t) { return t.TagId; }));
16549
- // 1. Process local tags
16550
- Object.values(localViewTags).forEach(function (entry) {
16551
- var viewTag = entry.viewTag;
16552
- // If it's a backend tag, check if it still exists in the backend response
16553
- // (Permission check or tag deletion check)
16554
- if (!viewTag.IsBitExtracted) {
16555
- if (backendTagIds_1.has(viewTag.TagId)) {
16556
- mergedTags[viewTag.TagId] = entry;
16557
- }
16558
- }
16559
- else {
16560
- // Virtual tags are always added from local storage
16561
- mergedTags[viewTag.TagId] = entry;
16562
- }
16563
- });
16564
- // 2. Add any new backend tags that might be missing from local storage
16565
- // (Rare case, but possible if added by another user/session)
16566
- backendTags.forEach(function (backendTag) {
16567
- if (!mergedTags[backendTag.TagId]) {
16568
- // Add with default order at the end
16569
- var maxOrder = Math.max.apply(Math, __spreadArray(__spreadArray([], Object.values(mergedTags).map(function (t) { return t.order; }), false), [0], false));
16570
- if (isNil(backendTag.Color)) {
16571
- backendTag.Color = getRandomColor();
16572
- }
16573
- mergedTags[backendTag.TagId] = {
16574
- viewTag: backendTag,
16575
- order: maxOrder + 1,
16576
- };
16577
- }
16578
- });
16579
- }
16580
- else {
16581
- // No local storage -> Use backend tags with default ordering
16582
- mergedTags = backendTags.reduce(function (carr, curr, idx) {
16583
- if (isNil(curr.Color)) {
16584
- curr.Color = getRandomColor();
16585
- }
16586
- carr[curr.TagId] = {
16587
- viewTag: curr,
16588
- order: idx,
16589
- };
16590
- return carr;
16591
- }, {});
16592
- }
16593
- // Reset stable ref when loading new view
16594
- stableTagIdsRef.current = [];
16595
- setViewTagsAndRefetch(mergedTags);
16596
- }, [viewTagsSuccess, viewTagsData, setViewTagsAndRefetch, viewId]);
16597
- // Update context with calculated min/max values
16598
- // Use ref to prevent infinite loop from object reference changes
16599
- var seriesMinMaxDataRef = useRef("");
16600
- useEffect(function () {
16601
- var serialized = JSON.stringify(seriesMinMaxData);
16602
- if (serialized !== seriesMinMaxDataRef.current) {
16603
- seriesMinMaxDataRef.current = serialized;
16604
- setSeriesMinMax(seriesMinMaxData);
16605
- }
16606
- }, [seriesMinMaxData, setSeriesMinMax]);
16607
- // Reset cursors when view changes or time scope changes significantly
16608
- var prevViewIdRef = useRef(null);
16609
- useEffect(function () {
16610
- // Reset cursors when switching views or when time scope changes significantly
16611
- if (viewSelected && viewSelected.ViewId !== prevViewIdRef.current) {
16612
- prevViewIdRef.current = viewSelected.ViewId;
16613
- resetCursors();
16614
- }
16615
- }, [viewSelected, resetCursors]);
16616
- // Also reset cursors when time scope changes (zoom/pan)
16617
- useEffect(function () {
16618
- resetCursors();
16619
- }, [timeScopeStart, timeScopeEnd, resetCursors]);
16620
- // Increment trigger when series data finishes loading
16621
- // This ensures cursors re-render AFTER chart has new data
16622
- var prevSeriesLoadingRef = useRef(false);
16623
- useEffect(function () {
16624
- if (prevSeriesLoadingRef.current && !seriesLoading) {
16625
- // Transition from loading to not loading - data just loaded
16626
- setDataLoadedTrigger(function (prev) { return prev + 1; });
16627
- }
16628
- prevSeriesLoadingRef.current = seriesLoading;
16629
- }, [seriesLoading]);
16630
- // Handle errors
16631
- useEffect(function () {
16632
- if (viewTagsError && viewTagsIsError) {
16633
- setError(viewTagsError instanceof Error
16634
- ? viewTagsError.message
16635
- : String(viewTagsError));
16636
- }
16637
- if (viewsError && viewsIsError) {
16638
- setError(viewsError instanceof Error ? viewsError.message : String(viewsError));
16639
- }
16640
- if (seriesError && seriesIsError) {
16641
- setError(seriesError instanceof Error
16642
- ? seriesError.message
16643
- : String(seriesError));
16644
- }
16645
- }, [
16646
- viewsError,
16647
- viewsIsError,
16648
- viewTagsError,
16649
- viewTagsIsError,
16650
- seriesError,
16651
- seriesIsError,
16652
- ]);
16653
- var isLoading = viewsLoading || viewTagsLoading;
16654
- return (React__default.createElement(React__default.Fragment, null,
16655
- React__default.createElement(HelmetDexteel, { title: "Trendings" }),
16656
- React__default.createElement("div", { style: {
16657
- padding: "16px",
16658
- width: "100%",
16659
- height: "92vh",
16660
- position: "relative",
16661
- backgroundColor: "#FAFAFA",
16662
- display: "flex",
16663
- flexDirection: "column",
16664
- } },
16665
- isLoading && (React__default.createElement("div", { style: {
16666
- position: "absolute",
16667
- top: 0,
16668
- left: 0,
16669
- width: "100%",
16670
- height: "100%",
16671
- background: "rgba(255, 255, 255, 0.7)",
16672
- display: "flex",
16673
- justifyContent: "center",
16674
- alignItems: "center",
16675
- zIndex: 1000,
16676
- } },
16677
- React__default.createElement(CircularProgress, { size: "3rem" }))),
16678
- React__default.createElement("div", { style: { flexShrink: 0 } },
16679
- React__default.createElement(HeaderSectionV2, { autoRefresh: autoRefresh, setAutoRefresh: setAutoRefresh, setChartOptions: setChartOptions, chartInstance: chartInstance })),
16680
- React__default.createElement(Divider, { sx: { my: 2 } }),
16681
- React__default.createElement("div", { style: {
16682
- flexGrow: 1,
16683
- minHeight: 0,
16684
- display: "flex",
16685
- width: "100%",
16686
- } },
16687
- React__default.createElement(Group$1, { orientation: "vertical", style: { width: "100%", height: "100%" } },
16688
- React__default.createElement(Panel, { defaultSize: 80, minSize: 20 },
16689
- React__default.createElement("div", { style: { height: "100%", width: "100%" } },
16690
- React__default.createElement(TrendingChartV2, { customOptions: chartOptions, series: filteredSeries, isLoading: seriesLoading, onChartReady: setChartInstance, dataLoadedTrigger: dataLoadedTrigger }))),
16691
- React__default.createElement(Separator, { style: {
16692
- height: "10px",
16693
- background: "#f0f0f0",
16694
- cursor: "row-resize",
16695
- display: "flex",
16696
- alignItems: "center",
16697
- justifyContent: "center",
16698
- borderTop: "1px solid #e0e0e0",
16699
- borderBottom: "1px solid #e0e0e0",
16700
- } },
16701
- React__default.createElement("div", { style: {
16702
- width: "40px",
16703
- height: "4px",
16704
- backgroundColor: "#ccc",
16705
- borderRadius: "2px",
16706
- } })),
16707
- React__default.createElement(Panel, { defaultSize: 20, minSize: 10 },
16708
- React__default.createElement("div", { style: { height: "100%", width: "100%", overflow: "auto" } },
16709
- React__default.createElement(TagsTableV2, null)))))),
16710
- React__default.createElement(ErrorModal, { error: error, onHide: function () { return setError(""); }, size: "xl", title: "ERROR" })));
16711
- };
16712
-
16713
- var TrendingsV2Index = function () {
16714
- var _a = useState(false), ihPathLoaded = _a[0], setIhPathLoaded = _a[1];
16715
- useEffect(function () {
16716
- var getIhPath = function () { return __awaiter(void 0, void 0, void 0, function () {
16717
- var resp;
16718
- return __generator(this, function (_a) {
16719
- switch (_a.label) {
16720
- case 0: return [4 /*yield*/, axiosInstance.get("/backend/ih-path")];
16721
- case 1:
16722
- resp = _a.sent();
16723
- localStorage.setItem("ihPath", resp.data);
16724
- setIhPathLoaded(true);
16725
- return [2 /*return*/];
16726
- }
16727
- });
16728
- }); };
16729
- getIhPath();
16730
- }, []);
16731
- if (!ihPathLoaded) {
16732
- return (React__default.createElement("div", { className: "d-flex justify-content-center align-items-center" }, "Loading..."));
16733
- }
16734
- return (React__default.createElement(TrendingProviderV2, null,
16735
- React__default.createElement(TrendingsPageV2, null)));
16736
- };
16737
-
16738
- /*!
16739
- * chartjs-adapter-moment v1.0.1
16740
- * https://www.chartjs.org
16741
- * (c) 2022 chartjs-adapter-moment Contributors
16742
- * Released under the MIT license
16743
- */
16744
-
16745
- const FORMATS = {
16746
- datetime: 'MMM D, YYYY, h:mm:ss a',
16747
- millisecond: 'h:mm:ss.SSS a',
16748
- second: 'h:mm:ss a',
16749
- minute: 'h:mm a',
16750
- hour: 'hA',
16751
- day: 'MMM D',
16752
- week: 'll',
16753
- month: 'MMM YYYY',
16754
- quarter: '[Q]Q - YYYY',
16755
- year: 'YYYY'
16756
- };
16757
-
16758
- _adapters._date.override(typeof moment$f === 'function' ? {
16759
- _id: 'moment', // DEBUG ONLY
16760
-
16761
- formats: function() {
16762
- return FORMATS;
16763
- },
16764
-
16765
- parse: function(value, format) {
16766
- if (typeof value === 'string' && typeof format === 'string') {
16767
- value = moment$f(value, format);
16768
- } else if (!(value instanceof moment$f)) {
16769
- value = moment$f(value);
16770
- }
16771
- return value.isValid() ? value.valueOf() : null;
16772
- },
16773
-
16774
- format: function(time, format) {
16775
- return moment$f(time).format(format);
16776
- },
16777
-
16778
- add: function(time, amount, unit) {
16779
- return moment$f(time).add(amount, unit).valueOf();
16780
- },
16781
-
16782
- diff: function(max, min, unit) {
16783
- return moment$f(max).diff(moment$f(min), unit);
16784
- },
16785
-
16786
- startOf: function(time, unit, weekday) {
16787
- time = moment$f(time);
16788
- if (unit === 'isoWeek') {
16789
- weekday = Math.trunc(Math.min(Math.max(0, weekday), 6));
16790
- return time.isoWeekday(weekday).startOf('day').valueOf();
16791
- }
16792
- return time.startOf(unit).valueOf();
16793
- },
16794
-
16795
- endOf: function(time, unit) {
16796
- return moment$f(time).endOf(unit).valueOf();
16797
- }
16798
- } : {});
16799
-
16800
- 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";
16801
- n(css,{});
16802
-
16803
- var Swatch = function (_a) {
16804
- var color = _a.color, onSelect = _a.onSelect;
16805
- return (React__default.createElement("div", { style: {
16806
- backgroundColor: color,
16807
- width: "25px",
16808
- height: "25px",
16809
- display: "inline-block",
16810
- margin: "2px",
16811
- borderRadius: "4px",
16812
- cursor: "pointer",
16813
- }, onClick: function () { return onSelect(color); } }));
16814
- };
16815
- var ColorPicker = function (_a) {
16816
- var onChange = _a.onChange, color = _a.color, elementId = _a.elementId;
16817
- var _b = useState(null), anchorEl = _b[0], setAnchorEl = _b[1];
16818
- var handleClick = function (event) {
16819
- setAnchorEl(event.currentTarget);
16820
- };
16821
- var handleClose = function () {
16822
- setAnchorEl(null);
16823
- };
16824
- var open = Boolean(anchorEl);
16825
- var id = open ? "simple-popover" : undefined;
16826
- return (React__default.createElement("div", null,
16827
- React__default.createElement(Button$1, { "aria-describedby": id, variant: "outlined", onClick: handleClick, style: {
16828
- backgroundColor: color,
16829
- width: "20px",
16830
- height: "20px",
16831
- minWidth: "20px",
16832
- padding: 0,
16833
- margin: "4px",
16834
- } }),
16835
- React__default.createElement(Popover$1, { id: id, open: open, anchorEl: anchorEl, onClose: handleClose, anchorOrigin: {
16836
- vertical: "bottom",
16837
- horizontal: "left",
16838
- } },
16839
- React__default.createElement("div", { style: {
16840
- display: "flex",
16841
- flexWrap: "wrap",
16842
- padding: "10px",
16843
- maxWidth: "165px",
16844
- } }, tagColors$1.map(function (color) { return (React__default.createElement(Swatch, { key: color, color: color, onSelect: function (color) {
16845
- onChange(elementId, color);
16846
- handleClose();
16847
- } })); })))));
16848
- };
16849
-
16850
- var TrendingsInitialState = {
16851
- timeScopeStart: moment$f(new Date()).subtract(1, "days").toDate(),
16852
- timeScopeEnd: new Date(),
16853
- scope: "1 day",
16854
- graphPan: false,
16855
- graphShouldUpdate: 0,
16856
- views: [
16857
- {
16858
- ViewId: 0,
16859
- ViewName: "",
16860
- UserName: null,
16861
- IsPublic: false,
16862
- LastModified: null,
16863
- LastModifiedBy: null,
16864
- },
16865
- ],
16866
- viewSelected: null,
16867
- viewTags: {},
16868
- shouldRefetchSeries: 1,
16869
- };
16870
- var TrendingsReducer = createSlice({
16871
- name: "__",
16872
- initialState: TrendingsInitialState,
16873
- reducers: {
16874
- setTotalScope: function (state, _a) {
16875
- var payload = _a.payload; _a.type;
16876
- state.shouldRefetchSeries += 1;
16877
- state.graphShouldUpdate += 1;
16878
- if (!isNil(payload.start) &&
16879
- !isNil(payload.end) &&
16880
- !isNil(payload.scope)) {
16881
- //from arrow navigators
16882
- state.timeScopeStart = payload.start;
16883
- state.timeScopeEnd = payload.end;
16884
- state.scope = payload.scope;
16885
- return;
16886
- }
16887
- if (!isNil(payload.scope)) {
16888
- if (payload.scope !== "custom") {
16889
- switch (payload.scope) {
16890
- case "10 min":
16891
- state.timeScopeStart = moment$f(state.timeScopeEnd)
16892
- .subtract(10, "minutes")
16893
- .toDate();
16894
- break;
16895
- case "1 hour":
16896
- state.timeScopeStart = moment$f(state.timeScopeEnd)
16897
- .subtract(1, "hours")
16898
- .toDate();
16899
- break;
16900
- case "4 hours":
16901
- state.timeScopeStart = moment$f(state.timeScopeEnd)
16902
- .subtract(4, "hours")
16903
- .toDate();
16904
- break;
16905
- case "12 hours":
16906
- state.timeScopeStart = moment$f(state.timeScopeEnd)
16907
- .subtract(12, "hours")
16908
- .toDate();
16909
- break;
16910
- case "1 day":
16911
- state.timeScopeStart = moment$f(state.timeScopeEnd)
16912
- .subtract(1, "days")
16913
- .toDate();
16914
- break;
16915
- case "10 days":
16916
- state.timeScopeStart = moment$f(state.timeScopeEnd)
16917
- .subtract(10, "days")
16918
- .toDate();
16919
- break;
16920
- }
16921
- }
16922
- state.scope = payload.scope;
16923
- return;
16924
- }
16925
- if (!isNil(payload.start) &&
16926
- !isNil(payload.end) &&
16927
- isNil(payload.graphPan)) {
16928
- // from zoom
16929
- state.timeScopeStart = payload.start;
16930
- state.timeScopeEnd = payload.end;
16931
- state.scope = "custom";
16932
- return;
16933
- }
16934
- if (!isNil(payload.start) &&
16935
- !isNil(payload.end) &&
16936
- !isNil(payload.graphPan)) {
16937
- // from pan
16938
- state.timeScopeStart = payload.start;
16939
- state.timeScopeEnd = payload.end;
16940
- return;
16941
- }
16942
- if (!isNil(payload.start)) {
16943
- state.timeScopeStart = payload.start;
16944
- if (state.scope !== "custom") {
16945
- switch (state.scope) {
16946
- case "10 min":
16947
- state.timeScopeEnd = moment$f(payload.start)
16948
- .add(10, "minutes")
16949
- .toDate();
16950
- break;
16951
- case "1 hour":
16952
- state.timeScopeEnd = moment$f(payload.start)
16953
- .add(1, "hours")
16954
- .toDate();
16955
- break;
16956
- case "4 hours":
16957
- state.timeScopeEnd = moment$f(payload.start)
16958
- .add(4, "hours")
16959
- .toDate();
16960
- break;
16961
- case "12 hours":
16962
- state.timeScopeEnd = moment$f(payload.start)
16963
- .add(12, "hours")
16964
- .toDate();
16965
- break;
16966
- case "1 day":
16967
- state.timeScopeEnd = moment$f(payload.start)
16968
- .add(1, "days")
16969
- .toDate();
16970
- break;
16971
- case "10 days":
16972
- state.timeScopeEnd = moment$f(payload.start)
16973
- .add(10, "days")
16974
- .toDate();
16975
- break;
16976
- }
16977
- }
16978
- return;
16979
- }
16980
- if (!isNil(payload.end)) {
16981
- state.timeScopeEnd = payload.end;
16982
- if (state.scope !== "custom") {
16983
- switch (state.scope) {
16984
- case "10 min":
16985
- state.timeScopeStart = moment$f(payload.end)
16986
- .subtract(10, "minutes")
16987
- .toDate();
16988
- break;
16989
- case "1 hour":
16990
- state.timeScopeStart = moment$f(payload.end)
16991
- .subtract(1, "hours")
16992
- .toDate();
16993
- break;
16994
- case "4 hours":
16995
- state.timeScopeStart = moment$f(payload.end)
16996
- .subtract(4, "hours")
16997
- .toDate();
16998
- break;
16999
- case "12 hours":
17000
- state.timeScopeStart = moment$f(payload.end)
17001
- .subtract(12, "hours")
17002
- .toDate();
17003
- break;
17004
- case "1 day":
17005
- state.timeScopeStart = moment$f(payload.end)
17006
- .subtract(1, "days")
17007
- .toDate();
17008
- break;
17009
- case "10 days":
17010
- state.timeScopeStart = moment$f(payload.end)
17011
- .subtract(10, "days")
17012
- .toDate();
17013
- break;
17014
- }
17015
- }
17016
- return;
17017
- }
17018
- },
17019
- setViews: function (state, _a) {
17020
- var payload = _a.payload;
17021
- state.views = payload;
17022
- },
17023
- setViewSelected: function (state, _a) {
17024
- var payload = _a.payload;
17025
- state.viewSelected = payload;
17026
- },
17027
- setViewTags: function (state, _a) {
17028
- var payload = _a.payload;
17029
- state.viewTags = payload;
17030
- state.graphShouldUpdate += 1;
17031
- },
17032
- setViewTagsAndRefetch: function (state, _a) {
17033
- var payload = _a.payload;
17034
- var newTags = structuredClone(payload);
17035
- __spreadArray([], Object.values(payload), true).sort(function (a, b) { return b.order - a.order; })
17036
- .forEach(function (vtMap, idx) {
17037
- newTags[vtMap.viewTag.TagId]["order"] = idx;
17038
- });
17039
- state.viewTags = newTags;
17040
- state.shouldRefetchSeries += 1;
17041
- },
17042
- setGraphShouldUpdate: function (state) {
17043
- state.graphShouldUpdate = +1;
17044
- },
17045
- },
17046
- });
17047
-
17048
- var TrendingContext = createContext({
17049
- state: TrendingsReducer.getInitialState(),
17050
- actions: TrendingsReducer.actions,
17051
- });
17052
- var useTrendingContext = function () { return useContext(TrendingContext); };
17053
- var TrendingProvider = function (_a) {
17054
- var children = _a.children;
17055
- var _b = useComplexState({
17056
- initialState: TrendingsReducer.getInitialState(),
17057
- reducers: TrendingsReducer.caseReducers,
17058
- }), state = _b[0], actions = _b[1];
17059
- var contextValue = useMemo(function () { return ({ state: state, actions: actions }); }, [state, actions]);
17060
- return (React__default.createElement(TrendingContext.Provider, { value: contextValue }, children));
17061
- };
17062
-
17063
- var useSearchViews = function (_a) {
17064
- var _b = _a.autoRefresh, autoRefresh = _b === void 0 ? false : _b;
17065
- return useQuery({
17066
- queryKey: ["views"],
17067
- queryFn: function () { return getViews(null); },
17068
- refetchInterval: autoRefresh ? 10000 : false,
17069
- });
17070
- };
17071
- var useSearchViewTags = function (_a) {
17072
- var viewId = _a.viewId;
17073
- return useQuery({
17074
- queryKey: ["viewTags", viewId],
17075
- queryFn: function () {
17076
- if (viewId) {
17077
- return getViewTags(viewId);
17078
- }
17079
- else {
17080
- return [];
17081
- }
17082
- },
17083
- });
17084
- };
17085
- var useSearchTagsTree = function () {
17086
- return useQuery({
17087
- queryKey: ["tagsTree"],
17088
- queryFn: function () { return getTagsTree(); },
17089
- });
17090
- };
17091
- var useSearchSeries = function (_a) {
17092
- var start = _a.start, end = _a.end, tagIds = _a.tagIds, _b = _a.autoRefresh, autoRefresh = _b === void 0 ? false : _b;
17093
- return useQuery({
17094
- queryKey: ["series", start, end, tagIds],
17095
- queryFn: function (_a) { return __awaiter(void 0, [_a], void 0, function (_b) {
17096
- var resp, error_1;
17097
- var signal = _b.signal;
17098
- return __generator(this, function (_c) {
17099
- switch (_c.label) {
17100
- case 0:
17101
- _c.trys.push([0, 2, , 3]);
17102
- return [4 /*yield*/, axios.post("/series?nodeName=null", {
17103
- start: start,
17104
- end: end ? end : new Date().getTime(),
17105
- tagIds: tagIds,
17106
- sampleCount: 1000,
17107
- }, {
17108
- signal: signal,
17109
- })];
17110
- case 1:
17111
- resp = _c.sent();
17112
- return [2 /*return*/, get(resp, "data", [])];
17113
- case 2:
17114
- error_1 = _c.sent();
17115
- // Ignore abort errors
17116
- if (axios.isCancel(error_1) || error_1.name === "AbortError") {
17117
- return [2 /*return*/, []];
17118
- }
17119
- throw new Error(getError(error_1));
17120
- case 3: return [2 /*return*/];
17121
- }
17122
- });
17123
- }); },
17124
- refetchInterval: autoRefresh ? 10000 : false,
17125
- });
17126
- };
17127
-
17128
- var DeleteViewModal = function (_a) {
17129
- var open = _a.open, handleClose = _a.handleClose, view = _a.view;
17130
- var _b = useState(false), isLoading = _b[0], setIsLoading = _b[1];
17131
- var _c = useState(""), error = _c[0], setError = _c[1];
17132
- var removeView = useMutation({
17133
- mutationFn: deleteView,
17134
- onSuccess: function () {
17135
- handleClose(true);
17136
- },
17137
- onError: function (error) {
17138
- setError(error.message);
17139
- },
17140
- });
17141
- var handleSubmit = function () { return __awaiter(void 0, void 0, void 0, function () {
17142
- return __generator(this, function (_a) {
17143
- switch (_a.label) {
17144
- case 0:
17145
- setIsLoading(true);
17146
- if (!!isNil(view)) return [3 /*break*/, 2];
17147
- return [4 /*yield*/, removeView.mutate(view.ViewId)];
17148
- case 1:
17149
- _a.sent();
17150
- _a.label = 2;
17151
- case 2:
17152
- setIsLoading(false);
17153
- return [2 /*return*/];
17154
- }
17155
- });
17156
- }); };
17157
- return (React__default.createElement(React__default.Fragment, null,
17158
- 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" },
17159
- React__default.createElement(Divider, null),
17160
- React__default.createElement(MesfModal.Content, null, !isNil(view) ? (React__default.createElement(Grid2, { container: true, spacing: 5, style: { padding: "2rem" } },
17161
- React__default.createElement(Grid2, { size: { md: 12, xs: 12 }, style: { padding: "10px", width: "100%" } },
17162
- React__default.createElement(Typography$1, null,
17163
- "Are yu sure you want to delete",
17164
- " ",
17165
- React__default.createElement("strong", null, view === null || view === void 0 ? void 0 : view.ViewName),
17166
- " ?")))) : (React__default.createElement(Typography$1, null, "ERROR: No view detected, please select one"))),
17167
- React__default.createElement(Divider, null),
17168
- React__default.createElement(MesfModal.Actions, null,
17169
- React__default.createElement(Grid2, { container: true, spacing: 1, style: {
17170
- display: "flex",
17171
- alignItems: "flex-end",
17172
- justifyContent: "flex-end",
17173
- } },
17174
- React__default.createElement(Grid2, null,
17175
- React__default.createElement(Button, { variant: "outlined", color: "secondary", onClick: function () { return handleClose(false); } }, "Cancel")),
17176
- 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")))))),
17177
- React__default.createElement(ErrorModal, { error: error, onHide: function () { return setError(""); } })));
17178
- };
17179
-
17180
- var EditViewModal = function (_a) {
17181
- var open = _a.open, handleClose = _a.handleClose, view = _a.view;
17182
- var _b = useState(""), newName = _b[0], setNewName = _b[1];
17183
- var _c = useState(true), isPublic = _c[0], setIsPublic = _c[1];
17184
- var _d = useState(false), isLoading = _d[0], setIsLoading = _d[1];
17185
- var _e = useState(""), error = _e[0], setError = _e[1];
17186
- var updateView = useMutation({
17187
- mutationFn: upsertView,
17188
- onSuccess: function () {
17189
- handleClose(true);
17190
- },
17191
- onError: function (error) {
17192
- setError(error.message);
17193
- },
17194
- });
17195
- var handleSubmit = function () { return __awaiter(void 0, void 0, void 0, function () {
17196
- return __generator(this, function (_a) {
17197
- switch (_a.label) {
17198
- case 0:
17199
- setIsLoading(true);
17200
- if (!!isNil(view)) return [3 /*break*/, 2];
17201
- return [4 /*yield*/, updateView.mutate({
17202
- viewId: view.ViewId,
17203
- viewName: newName,
17204
- isPublic: isPublic,
17205
- })];
17206
- case 1:
17207
- _a.sent();
17208
- _a.label = 2;
17209
- case 2:
17210
- setIsLoading(false);
17211
- return [2 /*return*/];
17212
- }
17213
- });
17214
- }); };
17215
- var handleChangeInput = function (e) {
17216
- e.preventDefault();
17217
- var name = e.target.value;
17218
- setNewName(name);
17219
- };
17220
- var handleCheck = function () { return setIsPublic(!isPublic); };
17221
- useEffect(function () {
17222
- if (view) {
17223
- setIsPublic(view.IsPublic);
17224
- setNewName(view.ViewName);
17225
- }
17226
- }, [view]);
17227
- return (React__default.createElement(React__default.Fragment, null,
17228
- 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" },
17229
- React__default.createElement(Divider, null),
17230
- React__default.createElement(MesfModal.Content, null, !isNil(view) ? (React__default.createElement(Grid2, { container: true, spacing: 5, style: { padding: "2rem" } },
17231
- React__default.createElement(Grid2, { size: { md: 12, xs: 12 }, style: { padding: "10px", width: "100%" } },
17232
- React__default.createElement(TextField, { required: true, sx: {
17233
- color: "rgba(0, 0, 0, 0.87)",
17234
- cursor: "text",
17235
- fontSize: "0.7rem",
17236
- boxSizing: "border-box",
17237
- fontFamily: '"Roboto", "Helvetica", "Arial", sans-serif',
17238
- fontWeight: 400,
17239
- lineHeight: 1.1876,
17240
- letterSpacing: "0.00938em",
17241
- "& .MuiOutlinedInput-input": {
17242
- padding: "10px 10px",
17243
- },
17244
- }, id: "viewName", label: "Name", variant: "outlined", onChange: handleChangeInput, value: newName })),
17245
- React__default.createElement(Grid2, { size: { md: 12, xs: 12 }, sx: {
17246
- paddingTop: "2rem",
17247
- userSelect: "none",
17248
- paddingLeft: "1rem",
17249
- "& > label": {
17250
- display: "flex",
17251
- alignItems: "center",
17252
- gap: "15px",
17253
- },
17254
- '& input[type="checkbox"]': {
17255
- zoom: 1.5,
17256
- },
17257
- } },
17258
- React__default.createElement("label", null,
17259
- React__default.createElement("input", { type: "checkbox", checked: isPublic, onChange: handleCheck }),
17260
- React__default.createElement(Typography$1, null, "Public"))))) : (React__default.createElement(Typography$1, null, "ERROR: No view detected, please select one"))),
17261
- React__default.createElement(Divider, null),
17262
- React__default.createElement(MesfModal.Actions, null,
17263
- React__default.createElement(Grid2, { container: true, spacing: 1, style: {
17264
- display: "flex",
17265
- alignItems: "flex-end",
17266
- justifyContent: "flex-end",
17267
- } },
17268
- React__default.createElement(Grid2, null,
17269
- React__default.createElement(Button, { variant: "outlined", color: "secondary", onClick: function () { return handleClose(false); } }, "Cancel")),
17270
- 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")))))),
17271
- React__default.createElement(ErrorModal, { error: error, onHide: function () { return setError(""); } })));
17272
- };
17273
-
17274
- var LoadViewModal = function (_a) {
17275
- var _b;
17276
- var open = _a.open, handleClose = _a.handleClose;
17277
- var queryClient = useQueryClient();
17278
- var _c = useTrendingContext(), _d = _c.state, views = _d.views, viewSelected = _d.viewSelected, _e = _c.actions, setViewTagsAndRefetch = _e.setViewTagsAndRefetch, setViewSelected = _e.setViewSelected;
17279
- var _f = useState(null), viewForDelete = _f[0], setViewForDelete = _f[1];
17280
- var _g = useState(null), viewForEdit = _g[0], setViewForEdit = _g[1];
17281
- var _h = useState(null), optionSelected = _h[0], setOptionSelected = _h[1];
17282
- var _j = useState(false), deleteViewModalOpen = _j[0], setDeleteViewModalOpen = _j[1];
17283
- var _k = useState(false), editViewModalOpen = _k[0], setEditViewModalOpen = _k[1];
17284
- var _l = useState(false), allViewsChecked = _l[0], setAllViewsChecked = _l[1];
17285
- var _m = useState(""), error = _m[0], setError = _m[1];
17286
- 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;
17287
- var handleSelect = function () { return __awaiter(void 0, void 0, void 0, function () {
17288
- return __generator(this, function (_a) {
17289
- switch (_a.label) {
17290
- case 0:
17291
- if (!optionSelected) return [3 /*break*/, 2];
17292
- setViewSelected(optionSelected);
17293
- return [4 /*yield*/, queryClient.invalidateQueries({
17294
- queryKey: ["viewTags", viewSelected.ViewId],
17295
- })];
17296
- case 1:
17297
- _a.sent();
17298
- handleClose(true);
17299
- return [2 /*return*/];
17300
- case 2:
17301
- handleClose(false);
17302
- return [2 /*return*/];
17303
- }
17304
- });
17305
- }); };
17306
- var handleDeleteView = function (view, e) { return __awaiter(void 0, void 0, void 0, function () {
17307
- return __generator(this, function (_a) {
17308
- e.stopPropagation();
17309
- if (view.ViewId === (viewSelected === null || viewSelected === void 0 ? void 0 : viewSelected.ViewId)) {
17310
- setError("Can not delete current view");
17311
- }
17312
- else {
17313
- setViewForDelete(view);
17314
- setDeleteViewModalOpen(true);
17315
- }
17316
- return [2 /*return*/];
17317
- });
17318
- }); };
17319
- var handleEditView = function (view, e) { return __awaiter(void 0, void 0, void 0, function () {
17320
- return __generator(this, function (_a) {
17321
- setViewForEdit(view);
17322
- setEditViewModalOpen(true);
17323
- return [2 /*return*/];
17324
- });
17325
- }); };
17326
- var handleAllViewsCheckbox = function () {
17327
- setAllViewsChecked(function (prev) { return !prev; });
17328
- };
17329
- var publicViews = useMemo(function () {
17330
- return views.filter(function (v) { return v.IsPublic === true; });
17331
- }, [views, allViewsChecked]);
17332
- useEffect(function () {
17333
- if (viewTagsSuccess && viewTagsFetched) {
17334
- setViewTagsAndRefetch((viewTags !== null && viewTags !== void 0 ? viewTags : []).reduce(function (carr, curr, idx) {
17335
- if (isNil(curr.Color)) {
17336
- curr.Color = getRandomColor();
17337
- }
17338
- carr[curr.TagId] = {
17339
- viewTag: curr,
17340
- order: idx,
17341
- };
17342
- return carr;
17343
- }, {}));
17344
- }
17345
- }, [viewTagsSuccess, viewTagsFetched]);
17346
- return (React__default.createElement("div", null,
17347
- 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" },
17348
- React__default.createElement(MesfModal.Content, null,
17349
- React__default.createElement(Grid2, { container: true }, views.length ? (React__default.createElement(React__default.Fragment, null,
17350
- React__default.createElement(Grid2, { size: { md: 12 } },
17351
- React__default.createElement(Box, { sx: {
17352
- paddingBottom: "1rem",
17353
- userSelect: "none",
17354
- paddingLeft: "1rem",
17355
- "& > label": {
17356
- display: "flex",
17357
- alignItems: "center",
17358
- gap: "15px",
17359
- },
17360
- '& input[type="checkbox"]': {
17361
- zoom: 1.5,
17362
- },
17363
- } },
17364
- React__default.createElement("label", { htmlFor: "" },
17365
- React__default.createElement("input", { type: "checkbox", checked: allViewsChecked, onChange: handleAllViewsCheckbox }),
17366
- React__default.createElement(Typography$1, null, "All Views")))),
17367
- React__default.createElement(Grid2, { size: { md: 12 } },
17368
- React__default.createElement(Autocomplete$1, { size: "small", id: "list-of-views", noOptionsText: allViewsChecked
17369
- ? "No views detected, please create a new view"
17370
- : "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 }),
17371
- React__default.createElement("div", { style: {
17372
- display: "flex",
17373
- justifyContent: "flex-start",
17374
- alignItems: "center",
17375
- width: "100%",
17376
- } },
17377
- React__default.createElement("div", { style: {
17378
- flexGrow: 1,
17379
- } }, option.ViewName),
17380
- React__default.createElement("div", { style: {
17381
- display: "flex",
17382
- justifyContent: "flex-end",
17383
- alignItems: "center",
17384
- flex: 1,
17385
- } },
17386
- option.IsPublic ? ("") : (React__default.createElement(React__default.Fragment, null,
17387
- React__default.createElement(Tooltip, { title: "Private", arrow: true },
17388
- React__default.createElement(LockIcon, { fontSize: "small", style: {
17389
- color: "black",
17390
- height: "18px",
17391
- width: "18px",
17392
- cursor: "auto",
17393
- } })))),
17394
- React__default.createElement(IconButton$1, { onClick: function (e) { return handleEditView(option); } },
17395
- React__default.createElement(CreateIcon, { fontSize: "small", color: "primary", style: {
17396
- height: "18px",
17397
- width: "18px",
17398
- cursor: "pointer",
17399
- } })),
17400
- React__default.createElement(IconButton$1, { onClick: function (e) { return handleDeleteView(option, e); } },
17401
- React__default.createElement(DeleteIcon, { fontSize: "small", color: "secondary", style: {
17402
- height: "18px",
17403
- width: "18px",
17404
- cursor: "pointer",
17405
- } })))))); }, 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")))),
17406
- React__default.createElement(MesfModal.Actions, null,
17407
- React__default.createElement("div", { style: { paddingTop: "1rem" } },
17408
- React__default.createElement(Button, { variant: "outlined", style: { marginRight: "1rem" }, color: "secondary", onClick: function () { return handleClose(false); } }, "Cancel"),
17409
- 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"))))),
17410
- React__default.createElement(DeleteViewModal, { open: deleteViewModalOpen, view: viewForDelete, handleClose: function (shouldUpdate) { return __awaiter(void 0, void 0, void 0, function () {
17411
- return __generator(this, function (_a) {
17412
- switch (_a.label) {
17413
- case 0:
17414
- setDeleteViewModalOpen(false);
17415
- if (!shouldUpdate) return [3 /*break*/, 2];
17416
- return [4 /*yield*/, queryClient.invalidateQueries({ queryKey: ["views"] })];
17417
- case 1:
17418
- _a.sent();
17419
- _a.label = 2;
17420
- case 2: return [2 /*return*/];
17421
- }
17422
- });
17423
- }); } }),
17424
- React__default.createElement(EditViewModal, { open: editViewModalOpen, view: viewForEdit, handleClose: function (shouldUpdate) { return __awaiter(void 0, void 0, void 0, function () {
17425
- return __generator(this, function (_a) {
17426
- switch (_a.label) {
17427
- case 0:
17428
- setEditViewModalOpen(false);
17429
- if (!shouldUpdate) return [3 /*break*/, 2];
17430
- return [4 /*yield*/, queryClient.invalidateQueries({ queryKey: ["views"] })];
17431
- case 1:
17432
- _a.sent();
17433
- _a.label = 2;
17434
- case 2: return [2 /*return*/];
17435
- }
17436
- });
17437
- }); } }),
17438
- React__default.createElement(ErrorModal, { error: error, onHide: function () { return setError(""); } })));
17439
- };
17440
-
17441
- var SaveAsViewModal = function (_a) {
17442
- var open = _a.open, handleClose = _a.handleClose;
17443
- var _b = useState(false), isLoading = _b[0], setIsLoading = _b[1];
17444
- var _c = useState(""), error = _c[0], setError = _c[1];
17445
- var _d = useTrendingContext(), _e = _d.state, viewTags = _e.viewTags, views = _e.views, viewSelected = _e.viewSelected, _f = _d.actions, setViewSelected = _f.setViewSelected; _f.setViewTags;
17446
- var _g = useState(true), isPublic = _g[0], setIsPublic = _g[1];
17447
- var _h = useState(""), newView = _h[0], setNewView = _h[1];
17448
- var handleCheck = function () { return setIsPublic(!isPublic); };
17449
- var updateViewTag = useMutation({
17450
- mutationFn: upsertViewTag,
17451
- onError: function (error) {
17452
- setError(error.message);
17453
- },
17454
- });
17455
- var updateView = useMutation({
17456
- mutationFn: upsertView,
17457
- onSuccess: function (viewId) { return __awaiter(void 0, void 0, void 0, function () {
17458
- var shouldClose;
17459
- return __generator(this, function (_a) {
17460
- switch (_a.label) {
17461
- case 0:
17462
- shouldClose = true;
17463
- return [4 /*yield*/, Promise.allSettled(Object.values(viewTags).map(function (_a) { return __awaiter(void 0, [_a], void 0, function (_b) {
17464
- 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;
17465
- return __generator(this, function (_d) {
17466
- switch (_d.label) {
17467
- case 0: return [4 /*yield*/, updateViewTag.mutate({
17468
- viewId: viewId,
17469
- tagId: TagId,
17470
- color: Color,
17471
- minScale: MinScale,
17472
- maxScale: MaxScale,
17473
- isVisible: IsVisible,
17474
- isAutoScale: IsAutoScale,
17475
- unit: Unit,
17476
- })];
17477
- case 1:
17478
- _d.sent();
17479
- return [2 /*return*/];
17480
- }
17481
- });
17482
- }); }))];
17483
- case 1:
17484
- _a.sent();
17485
- handleClose(shouldClose);
17486
- return [2 /*return*/];
17487
- }
17488
- });
17489
- }); },
17490
- onError: function (error) {
17491
- setError(error.message);
17492
- },
17493
- });
17494
- var handleSubmit = function () { return __awaiter(void 0, void 0, void 0, function () {
17495
- return __generator(this, function (_a) {
17496
- switch (_a.label) {
17497
- case 0:
17498
- setIsLoading(true);
17499
- return [4 /*yield*/, updateView.mutate({
17500
- viewId: null,
17501
- viewName: newView,
17502
- isPublic: isPublic,
17503
- })];
17504
- case 1:
17505
- _a.sent();
17506
- setIsLoading(false);
17507
- return [2 /*return*/];
17508
- }
17509
- });
17510
- }); };
17511
- return (React__default.createElement(React__default.Fragment, null,
17512
- 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" },
17513
- React__default.createElement(Divider, null),
17514
- React__default.createElement(MesfModal.Content, null,
17515
- React__default.createElement(Grid2, { container: true, spacing: 5, style: { padding: "1rem" } },
17516
- 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) {
17517
- if (typeof option === "string") {
17518
- return option;
17519
- }
17520
- return option.ViewName;
17521
- }, freeSolo: true, onChange: function (ev, val) {
17522
- setViewSelected(val);
17523
- if (val) {
17524
- setNewView("");
17525
- }
17526
- }, onInputChange: function (event, newInputValue) {
17527
- var isValueInViews = views.some(function (view) { return view.ViewName === newInputValue; });
17528
- if (!isValueInViews) {
17529
- setNewView(newInputValue);
17530
- }
17531
- }, style: { width: "100%" }, renderInput: function (params) { return (React__default.createElement(TextField, __assign({}, params, { label: "Views", variant: "outlined" }))); } })) : (React__default.createElement(Box, null,
17532
- 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); } }))))),
17533
- React__default.createElement(Grid2, { size: { md: 12, xs: 12 }, sx: {
17534
- paddingTop: "2rem",
17535
- userSelect: "none",
17536
- paddingLeft: "1rem",
17537
- "& > label": {
17538
- display: "flex",
17539
- alignItems: "center",
17540
- gap: "15px",
17541
- },
17542
- '& input[type="checkbox"]': {
17543
- zoom: 1.5,
17544
- },
17545
- } },
17546
- React__default.createElement("label", null,
17547
- "Public",
17548
- React__default.createElement("input", { type: "checkbox", checked: isPublic, onChange: handleCheck })))),
17549
- React__default.createElement(Divider, null),
17550
- React__default.createElement(MesfModal.Actions, null,
17551
- React__default.createElement(Grid2, { container: true, spacing: 1, style: {
17552
- display: "flex",
17553
- alignItems: "flex-end",
17554
- justifyContent: "flex-end",
17555
- } },
17556
- React__default.createElement(Grid2, null,
17557
- React__default.createElement(Button, { variant: "outlined", color: "secondary", onClick: function () { return handleClose(false); } }, "Cancel")),
17558
- React__default.createElement(Grid2, null,
17559
- React__default.createElement(ButtonWithLoading, { variant: "contained", color: "primary", onClick: handleSubmit, isLoading: isLoading }, "Save"))))),
17560
- React__default.createElement(ErrorModal, { error: error, onHide: function () { return setError(""); } })));
17561
- };
17562
-
17563
- var customStyles = "\n ul, ol {\n list-style-type: none;\n margin: 0;\n padding: 0;\n }\n";
17564
- var TagFolderCustomNode = function (_a) {
17565
- var _b, _c, _d, _e, _f, _g, _h, _j;
17566
- 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;
17567
- var onClickHandler = function () {
17568
- var _a;
17569
- var _b;
17570
- if (options.hasChild || ((_b = node.data) === null || _b === void 0 ? void 0 : _b.TagTypeCode) === "F") {
17571
- if (openTagFolders[node.id]) {
17572
- var newOpenTagFolders = __assign({}, openTagFolders);
17573
- delete newOpenTagFolders[node.id];
17574
- setOpenTagFolders(newOpenTagFolders);
17575
- }
17576
- else {
17577
- setOpenTagFolders(__assign(__assign({}, openTagFolders), (_a = {}, _a[node.id] = node.id, _a)));
17578
- }
17579
- onToggle();
17580
- return;
17581
- }
17582
- if (!options.hasChild) {
17583
- handleSelect(node);
17584
- }
17585
- };
17586
- var handleContextMenu = useCallback(function (ev) {
17587
- ev.stopPropagation();
17588
- ev.preventDefault();
17589
- setContextMenuOver(node, ev);
17590
- }, [node.id, setContextMenuOver]);
17591
- useEffect(function () {
17592
- var _a;
17593
- (_a = containerRef.current) === null || _a === void 0 ? void 0 : _a.addEventListener("contextmenu", handleContextMenu);
17594
- return function () {
17595
- var _a;
17596
- (_a = containerRef.current) === null || _a === void 0 ? void 0 : _a.removeEventListener("contextmenu", handleContextMenu);
17597
- };
17598
- }, []);
17599
- return (React__default.createElement(Box, { onClick: onClickHandler, sx: {
17600
- paddingLeft: depth * 20,
17601
- cursor: "pointer",
17602
- listStyleType: "none",
17603
- margin: 0,
17604
- padding: 0,
17605
- alignItems: "center",
17606
- display: "flex",
17607
- height: "32px",
17608
- backgroundColor: isSelected ? "#e8f0fe" : "",
17609
- "&:hover": {
17610
- backgroundColor: "#f2f2f2",
17611
- },
17612
- } },
17613
- React__default.createElement("style", null, customStyles),
17614
- React__default.createElement(React__default.Fragment, null,
17615
- options.hasChild ? (React__default.createElement("div", null, isOpen ? React__default.createElement(ArrowDropDownIcon$1, null) : React__default.createElement(ArrowRight, null))) : null,
17616
- 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" })))),
17617
- ((_c = node.data) === null || _c === void 0 ? void 0 : _c.TagName) && (React__default.createElement(React__default.Fragment, null,
17618
- ((_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: {
17619
- backgroundColor: ((_f = node.data) === null || _f === void 0 ? void 0 : _f.TagTypeCode) === "A" ? "#AD48C4" : "#C46F48",
17620
- margin: "0 5px",
17621
- width: "25px",
17622
- height: "25px",
17623
- color: "white",
17624
- display: "flex",
17625
- justifyContent: "center",
17626
- alignItems: "center",
17627
- cursor: "pointer",
17628
- border: "1px black solid",
17629
- } }, (_g = node.data) === null || _g === void 0 ? void 0 : _g.TagTypeCode)),
17630
- React__default.createElement(Tooltip, { title: node.data.TagName, placement: "top", arrow: true },
17631
- 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)))))));
17632
- };
17633
-
17634
- var TagSelectionModal = function (_a) {
17635
- var isOpen = _a.isOpen; _a.onClose; var onTagSelect = _a.onTagSelect;
17636
- var _b = useState(false), isLoading = _b[0], setIsLoading = _b[1];
17637
- var _c = useState(""), error = _c[0], setError = _c[1];
17638
- var _d = useState([]), tagsTreeData = _d[0], setTagsTreeData = _d[1];
17639
- var _e = useState(null), tagNodeSelectedInTree = _e[0], setTagNodeSelectedInTree = _e[1];
17640
- var _f = useState(null), anchorPoint = _f[0], setAnchorPoint = _f[1];
17641
- var _g = useState(false), showContextMenu = _g[0], setShowContextMenu = _g[1];
17642
- var backendOffset = 1000000;
17643
- var _h = useState({}), openTagFolders = _h[0], setOpenTagFolders = _h[1];
17644
- var _j = useState([]), selectedNodes = _j[0], setSelectedNodes = _j[1];
17645
- var handleContextMenu = function (data, e) {
17646
- e.preventDefault();
17647
- var top = e.clientY;
17648
- var left = e.clientX;
17649
- setAnchorPoint({ x: left, y: top });
17650
- setSelectedNodes([data]);
17651
- setShowContextMenu(true);
17652
- var selectedNode = tagsTreeData.find(function (node) { var _a; return ((_a = node.data) === null || _a === void 0 ? void 0 : _a.TagId) === data.id; });
17653
- if (selectedNode) {
17654
- setTagNodeSelectedInTree(selectedNode);
17655
- }
17656
- };
17657
- var _k = useSearchTagsTree(), tagsTree = _k.data, tagsTreeLoading = _k.isLoading, tagsTreeIsError = _k.isError, tagsTreeError = _k.error, tagsTreeIsSuccess = _k.isSuccess, tagsTreeIsFetched = _k.isFetched, refetch = _k.refetch;
17658
- var updateTagFolder = useMutation({
17659
- mutationFn: upsertTagFolder,
17660
- onError: function (error) {
17661
- setError(error.message);
17662
- },
17663
- });
17664
- var changeTagFolderTag = useMutation({
17665
- mutationFn: changeTagFolderToTag,
17666
- onError: function (error) {
17667
- setError(error.message);
17668
- },
17669
- });
17670
- var expanded = useMemo(function () {
17671
- return Object.keys(openTagFolders).map(function (el) { return Number.parseInt(el); });
17672
- }, [openTagFolders]);
17673
- var handleDrop = function (tree, options) { return __awaiter(void 0, void 0, void 0, function () {
17674
- var tagId, newFolderId;
17675
- var _a, _b;
17676
- return __generator(this, function (_c) {
17677
- switch (_c.label) {
17678
- case 0:
17679
- setIsLoading(true);
17680
- if (!options.dragSource) return [3 /*break*/, 5];
17681
- tagId = Number(options.dragSource.id);
17682
- newFolderId = Number((_a = options.dropTarget) === null || _a === void 0 ? void 0 : _a.id) || null;
17683
- if (tagId === newFolderId) {
17684
- setIsLoading(false);
17685
- return [2 /*return*/];
17686
- }
17687
- if (!(((_b = options.dragSource.data) === null || _b === void 0 ? void 0 : _b.TagTypeCode) === "F")) return [3 /*break*/, 2];
17688
- return [4 /*yield*/, updateTagFolder.mutate({
17689
- tagFolderId: tagId,
17690
- parentTagFolderId: newFolderId,
17691
- tagFolderName: options.dragSource.text,
17692
- isActive: true,
17693
- })];
17694
- case 1:
17695
- _c.sent();
17696
- return [3 /*break*/, 4];
17697
- case 2: return [4 /*yield*/, changeTagFolderTag.mutate({ tagId: tagId, tagFolderId: newFolderId })];
17698
- case 3:
17699
- _c.sent();
17700
- _c.label = 4;
17701
- case 4:
17702
- setTagsTreeData(tree);
17703
- _c.label = 5;
17704
- case 5:
17705
- setIsLoading(false);
17706
- return [2 /*return*/];
17707
- }
17708
- });
17709
- }); };
17710
- var handleClick = function (node) {
17711
- if (node.data) {
17712
- onTagSelect(node.data);
17713
- }
17714
- };
17715
- var handleCloseContextMenu = function (e) {
17716
- if (showContextMenu) {
17717
- setShowContextMenu(false);
17718
- }
17719
- };
17720
- useEffect(function () {
17721
- if (isOpen) {
17722
- refetch();
17723
- }
17724
- }, [isOpen]);
17725
- useEffect(function () {
17726
- if (isOpen) {
17727
- var tree = buildTagsTreeV2(tagsTree !== null && tagsTree !== void 0 ? tagsTree : []);
17728
- setTagsTreeData(tree);
17729
- }
17730
- }, [tagsTreeIsSuccess, tagsTreeIsFetched]);
17731
- useEffect(function () {
17732
- if (tagsTreeError && tagsTreeIsError) {
17733
- setError(tagsTreeError.message);
17734
- }
17735
- }, [tagsTreeError, tagsTreeIsError]);
17736
- return (React__default.createElement(React__default.Fragment, null,
17737
- React__default.createElement("div", { style: {
17738
- display: isOpen ? "block" : "none",
17739
- minHeight: "700px",
17740
- minWidth: "800px",
17741
- }, onClick: handleCloseContextMenu },
17742
- React__default.createElement("div", { style: { overflowY: "auto", maxHeight: "700px" } }, isLoading || tagsTreeLoading ? (React__default.createElement(Grid2, { container: true, justifyContent: "center", alignItems: "center", style: { minHeight: "100px" } },
17743
- React__default.createElement(CircularProgress, { size: "2rem" }))) : (React__default.createElement(DndProvider$1, { backend: HTML5Backend },
17744
- React__default.createElement(Box, { sx: {
17745
- "& .root": {
17746
- boxSizing: "border-box",
17747
- height: "100%",
17748
- padding: "32px",
17749
- },
17750
- "& .dropTarget": {
17751
- boxShadow: "0 0 0 1px #1967d2 inset",
17752
- },
17753
- } },
17754
- React__default.createElement(Tree, { classes: {
17755
- root: "root",
17756
- dropTarget: "dropTarget",
17757
- }, initialOpen: expanded, tree: tagsTreeData, rootId: backendOffset, onDrop: handleDrop, canDrop: function (tag, options) {
17758
- return !selectedNodes.some(function (selectedNode) {
17759
- return Number(selectedNode.id) ===
17760
- Number(options.dropTargetId);
17761
- });
17762
- }, render: function (node, options) {
17763
- var selected = selectedNodes.some(function (selectedNode) {
17764
- return Number(selectedNode.id) === Number(node.id);
17765
- });
17766
- return (React__default.createElement(TagFolderCustomNode, { setContextMenuOver: handleContextMenu, node: node, options: options, isSelected: selected, openTagFolders: openTagFolders, setOpenTagFolders: setOpenTagFolders, handleSelect: handleClick }));
17767
- }, dragPreviewRender: function (monitorProps) { return (React__default.createElement(CustomDragPreview, { monitorProps: monitorProps })
17768
- // <div>{monitorProps.item.data?.TagName}</div>
17769
- ); } })))))),
17770
- React__default.createElement(ContextMenu, { anchorPoint: anchorPoint, isOpen: showContextMenu, setShowContextMenu: setShowContextMenu, tagNodeSelectedInTree: tagNodeSelectedInTree, getTagsTreeData: function () { return refetch(); } }),
17771
- React__default.createElement(ErrorModal, { error: error, onHide: function () { return setError(""); } })));
17772
- };
17773
-
17774
- var TagsTreeModal = function (_a) {
17775
- var open = _a.open, handleClose = _a.handleClose, onTagSelect = _a.onTagSelect;
17776
- return (React__default.createElement(React__default.Fragment, null,
17777
- React__default.createElement(MesfModal, { open: open, handleClose: handleClose, maxWidth: "lg", "aria-labelledby": "modal-modal-title", "aria-describedby": "modal-modal-description", title: "Tags" },
17778
- React__default.createElement(MesfModal.Content, null,
17779
- React__default.createElement(Box, null,
17780
- React__default.createElement(Typography$1, { id: "modal-modal-description" },
17781
- React__default.createElement(TagSelectionModal, { isOpen: open, onClose: function () { return handleClose; }, onTagSelect: onTagSelect })))))));
17782
- };
17783
-
17784
- var useTagsDataTable = function (_a) {
17785
- var cursorData = _a.cursorData, viewTagsMap = _a.viewTagsMap, chartData = _a.chartData;
17786
- return useMemo(function () {
17787
- var _a;
17788
- var dataTable = {};
17789
- if (cursorData) {
17790
- var _loop_1 = function (viewTagEntry) {
17791
- var tag = viewTagsMap[viewTagEntry].viewTag;
17792
- var datasetForTag = ((_a = chartData.datasets.find(function (ds) {
17793
- return ds.tagId === (tag === null || tag === void 0 ? void 0 : tag.TagId);
17794
- })) === null || _a === void 0 ? void 0 : _a.data) || [];
17795
- var p1 = { x: new Date("1900-01-01"), y: 0 };
17796
- var p2 = { x: new Date("1900-01-01"), y: 0 };
17797
- var p1Found = false;
17798
- var pmin = { x: 0, y: Number.POSITIVE_INFINITY };
17799
- var pmax = { x: 0, y: Number.NEGATIVE_INFINITY };
17800
- for (var idx = 0; idx < datasetForTag.length; idx++) {
17801
- var curr = datasetForTag[idx];
17802
- var currentVal = curr.x;
17803
- if (!p1Found) {
17804
- if (currentVal < cursorData.x1) {
17805
- p1 = curr;
17806
- p2 = JSON.parse(JSON.stringify(p1));
17807
- pmin = JSON.parse(JSON.stringify(p1));
17808
- pmax = JSON.parse(JSON.stringify(p1));
17809
- continue;
17810
- }
17811
- else {
17812
- p1Found = true;
17813
- }
17814
- }
17815
- else {
17816
- if (currentVal < cursorData.x2) {
17817
- p2 = curr;
17818
- if (pmin["y"] > curr["y"]) {
17819
- pmin = JSON.parse(JSON.stringify(curr));
17820
- }
17821
- if (pmax["y"] < curr["y"]) {
17822
- pmax = JSON.parse(JSON.stringify(curr));
17823
- }
17824
- }
17825
- else {
17826
- break;
17827
- }
17828
- }
17829
- }
17830
- dataTable[tag === null || tag === void 0 ? void 0 : tag.TagName] = {
17831
- y1: p1.y,
17832
- y2: p2.y,
17833
- y2y1: Number(p2.y) - Number(p1.y),
17834
- pmin: pmin,
17835
- pmax: pmax,
17836
- };
17837
- };
17838
- for (var viewTagEntry in viewTagsMap) {
17839
- _loop_1(viewTagEntry);
17840
- }
17841
- }
17842
- return dataTable;
17843
- }, [viewTagsMap, chartData, cursorData]);
17844
- };
17845
-
17846
- var formatTimeDiffWithMs = function (start, end) {
17847
- // Calculate total difference in milliseconds
17848
- var totalMilliseconds = end - start;
17849
- // Convert milliseconds to seconds, minutes, hours, days, and months for comparison
17850
- var seconds = totalMilliseconds / 1000;
17851
- var minutes = seconds / 60;
17852
- var hours = minutes / 60;
17853
- var days = hours / 24;
17854
- var months = days / 30; // Approximation of a month
17855
- var remainingSeconds = seconds % 60; // Remaining seconds after full minutes
17856
- if (months > 12) {
17857
- var years = months / 12;
17858
- return "".concat(Math.floor(years), " years, ").concat(Math.floor(months % 12), " months");
17859
- }
17860
- else if (months > 6) {
17861
- return "".concat(Math.floor(months), " months, ").concat(Math.floor(days % 30), " days");
17862
- }
17863
- else if (days > 10) {
17864
- return "".concat(Math.floor(days), " days, ").concat(Math.floor(hours % 24), " hours");
17865
- }
17866
- else if (days > 1) {
17867
- return "".concat(Math.floor(days), " days, ").concat(Math.floor(hours % 24), " hours");
17868
- }
17869
- else if (hours > 12) {
17870
- return "".concat(Math.floor(hours), " hours, ").concat(Math.floor(minutes % 60), " minutes, ").concat(remainingSeconds.toFixed(2), " seconds");
17871
- }
17872
- else if (hours < 1) {
17873
- // If there are 0 hours, return just minutes and remaining seconds
17874
- return "".concat(Math.floor(minutes), " minutes, ").concat(remainingSeconds.toFixed(2), " seconds");
17875
- }
17876
- else {
17877
- // For time intervals less than 12 hours but more than 1 hour, return hours, minutes, and remaining seconds
17878
- return "".concat(Math.floor(hours), " hours, ").concat(Math.floor(minutes % 60), " minutes, ").concat(remainingSeconds.toFixed(2), " seconds");
17879
- }
17880
- };
17881
-
17882
- var TableComponent = function (_a) {
17883
- var chartData = _a.chartData, cursorData = _a.cursorData; _a.viewTagForDelete; var setViewTagForDelete = _a.setViewTagForDelete, selectedRowTagId = _a.selectedRowTagId, setSelectedRowTagId = _a.setSelectedRowTagId;
17884
- var queryClient = useQueryClient();
17885
- var _b = useContextMenuMESF(), registerConfig = _b.registerConfig, showContextMenu = _b.showContextMenu;
17886
- var _c = useTrendingContext(), _d = _c.state, viewTags = _d.viewTags, viewSelected = _d.viewSelected, _e = _c.actions, setViewTags = _e.setViewTags, setViewTagsAndRefetch = _e.setViewTagsAndRefetch;
17887
- var _f = useState(""), error = _f[0], setError = _f[1];
17888
- var _g = useState(false); _g[0]; var setIsLoading = _g[1];
17889
- var _h = useState(false), tagsTreeModalOpen = _h[0], setTagsTreeModalOpen = _h[1];
17890
- var _j = useState(false), saveAsViewModalOpen = _j[0], setSaveAsViewModalOpen = _j[1];
17891
- var _k = useState(false), loadViewOpen = _k[0], setLoadViewOpen = _k[1];
17892
- var _l = useState(""), snackbarMessage = _l[0], setSnackbarMessage = _l[1];
17893
- var deleteAllViewTags = useMutation({
17894
- mutationFn: deleteAllViewTagsFromView,
17895
- onError: function (error) {
17896
- setError(error.message);
17897
- },
17898
- });
17899
- var updateView = useMutation({
17900
- mutationFn: upsertView,
17901
- onSuccess: function () { return __awaiter(void 0, void 0, void 0, function () {
17902
- var results;
17903
- var _a;
17904
- return __generator(this, function (_b) {
17905
- switch (_b.label) {
17906
- case 0: return [4 /*yield*/, deleteAllViewTags.mutate((_a = viewSelected === null || viewSelected === void 0 ? void 0 : viewSelected.ViewId) !== null && _a !== void 0 ? _a : 0)];
17907
- case 1:
17908
- _b.sent();
17909
- return [4 /*yield*/, Promise.allSettled(Object.values(viewTags)
17910
- .sort(function (a, b) { return b.order - a.order; })
17911
- .map(function (_a) {
17912
- var _b;
17913
- 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;
17914
- updateViewTag.mutate({
17915
- viewId: (_b = viewSelected === null || viewSelected === void 0 ? void 0 : viewSelected.ViewId) !== null && _b !== void 0 ? _b : 0,
17916
- tagId: TagId,
17917
- color: Color,
17918
- minScale: MinScale,
17919
- maxScale: MaxScale,
17920
- isVisible: IsVisible,
17921
- isAutoScale: IsAutoScale,
17922
- unit: Unit,
17923
- });
17924
- }))];
17925
- case 2:
17926
- results = _b.sent();
17927
- results.forEach(function (result, index) {
17928
- if (result.status === "rejected") {
17929
- setError("Tag ".concat(index, " failed with reason: ").concat(result.reason));
17930
- }
17931
- else {
17932
- setSelectedRowTagId(null);
17933
- setSnackbarMessage("View saved successfully");
17934
- }
17935
- });
17936
- return [2 /*return*/];
17937
- }
17938
- });
17939
- }); },
17940
- onError: function (error) {
17941
- setError(error.message);
17942
- },
17943
- });
17944
- var saveTags = useMutation({
17945
- mutationFn: saveTagDefaults,
17946
- onError: function (error) {
17947
- setError(error.message);
17948
- },
17949
- });
17950
- var updateViewTag = useMutation({
17951
- mutationFn: upsertViewTag,
17952
- onError: function (error) {
17953
- setError(error.message);
17954
- },
17955
- });
17956
- var dataTable = useTagsDataTable({
17957
- viewTagsMap: viewTags,
17958
- chartData: chartData,
17959
- cursorData: cursorData,
17960
- });
17961
- var handleChange = function (tagId, value, property) {
17962
- var _a, _b;
17963
- 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)));
17964
- };
17965
- var handleChangeScale = function (value, scale, tagId) {
17966
- handleChange(tagId, value, scale);
17967
- };
17968
- var handleChangeAlias = function (tagId, newName) {
17969
- var _a;
17970
- setViewTags(__assign(__assign({}, viewTags), (_a = {}, _a[tagId] = __assign(__assign({}, viewTags[tagId]), { viewTag: __assign(__assign({}, viewTags[tagId].viewTag), { Alias: newName }) }), _a)));
17971
- };
17972
- var handleVisibilityChange = function (tagId, value) {
17973
- var _a;
17974
- setViewTags(__assign(__assign({}, viewTags), (_a = {}, _a[tagId] = __assign(__assign({}, viewTags[tagId]), { viewTag: __assign(__assign({}, viewTags[tagId].viewTag), { IsVisible: value }) }), _a)));
17975
- };
17976
- var handleUnitChange = function (tagId, newUnit) {
17977
- var _a;
17978
- setViewTags(__assign(__assign({}, viewTags), (_a = {}, _a[tagId] = __assign(__assign({}, viewTags[tagId]), { viewTag: __assign(__assign({}, viewTags[tagId].viewTag), { Unit: newUnit }) }), _a)));
17979
- };
17980
- var handleAutoScaleChange = function (tagId, checked) {
17981
- var _a;
17982
- setViewTags(__assign(__assign({}, viewTags), (_a = {}, _a[tagId] = __assign(__assign({}, viewTags[tagId]), { viewTag: __assign(__assign({}, viewTags[tagId].viewTag), { IsAutoScale: !checked }) }), _a)));
17983
- };
17984
- var handleColorChange = function (tagId, value) {
17985
- var _a;
17986
- setViewTags(__assign(__assign({}, viewTags), (_a = {}, _a[tagId] = __assign(__assign({}, viewTags[tagId]), { viewTag: __assign(__assign({}, viewTags[tagId].viewTag), { Color: value }) }), _a)));
17987
- };
17988
- var handleDeleteTag = function (tagId) {
17989
- var _a = viewTags, _b = tagId; _a[_b]; var newTags = __rest(_a, [typeof _b === "symbol" ? _b : _b + ""]);
17990
- setViewTagsAndRefetch(newTags);
17991
- };
17992
- var handleAddTag = function (newTag) {
17993
- var _a;
17994
- setViewTagsAndRefetch(__assign(__assign({}, viewTags), (_a = {}, _a[newTag.TagId] = {
17995
- viewTag: __assign(__assign({}, newTag), { IsVisible: true, TagType: newTag.TagTypeCode, Color: newTag.Color || getRandomColor(), IsAutoScale: newTag.MinScale || newTag.MaxScale ? false : true }),
17996
- order: Object.keys(viewTags).length,
17997
- }, _a)));
17998
- };
17999
- var handleAbleScales = function (tagId, checked) {
18000
- if (checked) {
18001
- handleAutoScaleChange(tagId, checked);
18002
- }
18003
- };
18004
- var handleClose = function () { return setTagsTreeModalOpen(false); };
18005
- var getMenuOptions = function (data) {
18006
- var options = [];
18007
- if (data) {
18008
- options.push({
18009
- key: "delete",
18010
- name: "Remove Tag",
18011
- onClick: function () {
18012
- if (!isNil(data)) {
18013
- handleDeleteTag(data.TagId);
18014
- setSelectedRowTagId(null);
18015
- setViewTagForDelete(null);
18016
- }
18017
- },
18018
- });
18019
- }
18020
- options = options.concat([
18021
- {
18022
- key: "add",
18023
- name: "Tags Tree",
18024
- onClick: function () {
18025
- setTagsTreeModalOpen(true);
18026
- },
18027
- },
18028
- {
18029
- key: "saveDefault",
18030
- name: "Save Default To Tag",
18031
- onClick: function () {
18032
- handleSaveDefaultToTag(data.TagId);
18033
- },
18034
- },
18035
- {
18036
- key: "saveView",
18037
- name: "Save View",
18038
- onClick: function () {
18039
- handleSaveView();
18040
- },
18041
- },
18042
- {
18043
- key: "saveViewAs",
18044
- name: "Save View as",
18045
- onClick: function () {
18046
- setSaveAsViewModalOpen(true);
18047
- },
18048
- },
18049
- {
18050
- key: "loadView",
18051
- name: "Load View",
18052
- onClick: function () {
18053
- setLoadViewOpen(true);
18054
- },
18055
- },
18056
- ]);
18057
- return options;
18058
- };
18059
- var handleTagSelect = function (selectedTag) {
18060
- var alreadySelected = viewTags[selectedTag.Tagkey];
18061
- if (!alreadySelected) {
18062
- handleAddTag(selectedTag);
18063
- }
18064
- else {
18065
- setError("".concat(selectedTag.TagName, " is already selected"));
18066
- }
18067
- };
18068
- var handleSaveView = function () { return __awaiter(void 0, void 0, void 0, function () {
18069
- return __generator(this, function (_a) {
18070
- switch (_a.label) {
18071
- case 0:
18072
- if (!!viewSelected) return [3 /*break*/, 1];
18073
- setSaveAsViewModalOpen(true);
18074
- return [2 /*return*/];
18075
- case 1:
18076
- setIsLoading(true);
18077
- if (!(viewSelected === null || viewSelected === void 0 ? void 0 : viewSelected.ViewId)) return [3 /*break*/, 3];
18078
- return [4 /*yield*/, updateView.mutate({
18079
- viewId: viewSelected === null || viewSelected === void 0 ? void 0 : viewSelected.ViewId,
18080
- viewName: viewSelected.ViewName,
18081
- isPublic: viewSelected.IsPublic,
18082
- })];
18083
- case 2:
18084
- _a.sent();
18085
- _a.label = 3;
18086
- case 3:
18087
- setIsLoading(false);
18088
- _a.label = 4;
18089
- case 4: return [2 /*return*/];
18090
- }
18091
- });
18092
- }); };
18093
- var handleCloseSnackbar = function (event, reason) {
18094
- if (reason === "clickaway") {
18095
- return;
18096
- }
18097
- setSnackbarMessage("");
18098
- };
18099
- useEffect(function () {
18100
- var handleGlobalClick = function (e) {
18101
- if (selectedRowTagId !== null) {
18102
- setSelectedRowTagId(null);
18103
- }
18104
- };
18105
- var handleKeyDown = function (e) {
18106
- if (e.key === "Escape" && selectedRowTagId !== null) {
18107
- setSelectedRowTagId(null);
18108
- }
18109
- };
18110
- // Attach event listeners
18111
- document.addEventListener("click", handleGlobalClick);
18112
- document.addEventListener("keydown", handleKeyDown);
18113
- // Cleanup function
18114
- return function () {
18115
- document.removeEventListener("click", handleGlobalClick);
18116
- document.removeEventListener("keydown", handleKeyDown);
18117
- };
18118
- }, [selectedRowTagId]);
18119
- var handleSaveDefaultToTag = function (selectedRowTagId) { return __awaiter(void 0, void 0, void 0, function () {
18120
- var _a, TagId, Alias, Color, MinScale, MaxScale, Unit, IsVisible, IsAutoScale;
18121
- return __generator(this, function (_b) {
18122
- switch (_b.label) {
18123
- case 0:
18124
- if (!(viewSelected && selectedRowTagId !== null)) return [3 /*break*/, 3];
18125
- _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;
18126
- return [4 /*yield*/, saveTags.mutate({
18127
- tagId: TagId,
18128
- alias: Alias,
18129
- color: Color,
18130
- minScale: MinScale,
18131
- maxScale: MaxScale,
18132
- unit: Unit,
18133
- })];
18134
- case 1:
18135
- _b.sent();
18136
- return [4 /*yield*/, updateViewTag.mutate({
18137
- viewId: viewSelected === null || viewSelected === void 0 ? void 0 : viewSelected.ViewId,
18138
- tagId: TagId,
18139
- color: Color,
18140
- minScale: MinScale,
18141
- maxScale: MaxScale,
18142
- isVisible: IsVisible,
18143
- isAutoScale: IsAutoScale,
18144
- unit: Unit,
18145
- })];
18146
- case 2:
18147
- _b.sent();
18148
- setSelectedRowTagId(null);
18149
- _b.label = 3;
18150
- case 3: return [2 /*return*/];
18151
- }
18152
- });
18153
- }); };
18154
- useEffect(function () {
18155
- registerConfig({
18156
- id: "chartContext",
18157
- getOptions: getMenuOptions,
18158
- });
18159
- }, [viewTags, selectedRowTagId]);
18160
- return (React__default.createElement(React__default.Fragment, null,
18161
- React__default.createElement(Grid2, { container: true, spacing: 1, alignContent: "flex-start", style: {
18162
- height: "100%",
18163
- maxHeight: "100%",
18164
- overflowY: "auto",
18165
- } },
18166
- React__default.createElement(Grid2, { size: { xs: 12 }, style: {
18167
- position: "sticky",
18168
- background: "white",
18169
- top: 0,
18170
- left: 0,
18171
- zIndex: 1000,
18172
- } },
18173
- React__default.createElement(TableContainer, { component: Paper, style: {
18174
- overflowX: "auto",
18175
- width: "100%",
18176
- boxShadow: "none",
18177
- border: "none",
18178
- } },
18179
- React__default.createElement(Table, { size: "small", style: { width: "100%", tableLayout: "fixed" } },
18180
- React__default.createElement(TableHead, null,
18181
- React__default.createElement(TableRow, null,
18182
- React__default.createElement(TableCell, { align: "center", sx: {
18183
- border: "0.0625rem solid black",
18184
- borderBottom: "none",
18185
- backgroundColor: "#f5f7f7",
18186
- color: "#333",
18187
- fontWeight: "normal",
18188
- textAlign: "center",
18189
- width: "26.125rem",
18190
- padding: "0",
18191
- } }, viewSelected ? (React__default.createElement(Button, { variant: "text", style: {
18192
- color: "#0075ff",
18193
- width: "26.125rem",
18194
- padding: "0",
18195
- }, 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: {
18196
- color: "#0075ff",
18197
- width: "26.125rem",
18198
- padding: "0",
18199
- }, onClick: function () { return setSaveAsViewModalOpen(true); } },
18200
- React__default.createElement("i", null,
18201
- React__default.createElement(SaveIcon, null),
18202
- "(Save view as)")))),
18203
- React__default.createElement(TableCell, { align: "center", colSpan: 4, sx: {
18204
- border: "0.0625rem solid black",
18205
- borderBottom: "none",
18206
- backgroundColor: "#f5f7f7",
18207
- color: "#333",
18208
- fontWeight: "normal",
18209
- textAlign: "center",
18210
- width: "37.5rem",
18211
- padding: "0",
18212
- } }, "Scale"),
18213
- React__default.createElement(TableCell, { align: "center", sx: {
18214
- border: "0.0625rem solid black",
18215
- borderBottom: "none",
18216
- backgroundColor: "#f5f7f7",
18217
- color: "#333",
18218
- fontWeight: "normal",
18219
- textAlign: "center",
18220
- padding: "6px 0",
18221
- } }, cursorData
18222
- ? (function () {
18223
- var dateX1 = new Date(cursorData.x1);
18224
- var dateX2 = new Date(cursorData.x2);
18225
- var formattedDate = dateX1.toLocaleString("en-US", __assign({ hour12: false, month: "short", day: "numeric" }, (dateX1.getFullYear() !==
18226
- dateX2.getFullYear() && { year: "numeric" })));
18227
- var dateText = "".concat(formattedDate);
18228
- return (React__default.createElement(React__default.Fragment, null,
18229
- React__default.createElement("span", { style: {
18230
- height: "10px",
18231
- width: "10px",
18232
- backgroundColor: "red",
18233
- borderRadius: "50%",
18234
- display: "inline-block",
18235
- marginRight: "5px",
18236
- } }),
18237
- dateText));
18238
- })()
18239
- : null),
18240
- React__default.createElement(TableCell, { align: "center", sx: {
18241
- border: "0.0625rem solid black",
18242
- borderBottom: "none",
18243
- backgroundColor: "#f5f7f7",
18244
- color: "#333",
18245
- fontWeight: "normal",
18246
- textAlign: "center",
18247
- padding: "6px 0",
18248
- } }, cursorData
18249
- ? (function () {
18250
- var dateX1 = new Date(cursorData.x1);
18251
- var dateX2 = new Date(cursorData.x2);
18252
- var formattedDate = dateX2.toLocaleString("en-US", __assign({ hour12: false, month: "short", day: "numeric" }, (dateX1.getFullYear() !==
18253
- dateX2.getFullYear() && { year: "numeric" })));
18254
- var dateText = "".concat(formattedDate);
18255
- return (React__default.createElement(React__default.Fragment, null,
18256
- React__default.createElement("span", { style: {
18257
- height: "10px",
18258
- width: "10px",
18259
- backgroundColor: "blue",
18260
- borderRadius: "50%",
18261
- display: "inline-block",
18262
- marginRight: "5px",
18263
- } }),
18264
- dateText));
18265
- })()
18266
- : null),
18267
- React__default.createElement(TableCell, { align: "center", colSpan: 3, sx: {
18268
- border: "0.0625rem solid black",
18269
- borderBottom: "none",
18270
- backgroundColor: "#f5f7f7",
18271
- color: "#333",
18272
- fontWeight: "normal",
18273
- textAlign: "center",
18274
- padding: "6px 0",
18275
- } }, cursorData
18276
- ? formatTimeDiffWithMs(cursorData.x1, cursorData.x2)
18277
- : null)))),
18278
- React__default.createElement(Table, { size: "small", style: { width: "100%", tableLayout: "fixed" } },
18279
- React__default.createElement(TableHead, null,
18280
- React__default.createElement(TableRow, { sx: {
18281
- "& th": {
18282
- border: "0.0625rem solid black",
18283
- backgroundColor: "#f5f7f7",
18284
- color: "#333",
18285
- fontWeight: "normal",
18286
- textAlign: "center",
18287
- padding: "6px 0",
18288
- },
18289
- } },
18290
- React__default.createElement(TableCell, { align: "center", sx: {
18291
- width: "3.75rem", // 60px / 16px
18292
- fontSize: "0.75rem",
18293
- } }, "Visible"),
18294
- React__default.createElement(TableCell, { align: "center", sx: {
18295
- width: "18rem",
18296
- overflow: "hidden",
18297
- textOverflow: "ellipsis",
18298
- whiteSpace: "nowrap",
18299
- } }, "Alias / Tagname"),
18300
- React__default.createElement(TableCell, { align: "center", sx: {
18301
- width: "4.375rem", // 70px / 16px
18302
- } }, "Color"),
18303
- React__default.createElement(TableCell, { align: "center", sx: {
18304
- width: "11.25rem", // 180px / 16px
18305
- overflow: "hidden",
18306
- textOverflow: "ellipsis",
18307
- whiteSpace: "nowrap",
18308
- } }, "Min Scale"),
18309
- React__default.createElement(TableCell, { align: "center", sx: {
18310
- width: "11.25rem", // 180px / 16px
18311
- overflow: "hidden",
18312
- textOverflow: "ellipsis",
18313
- whiteSpace: "nowrap",
18314
- } }, "Max Scale"),
18315
- React__default.createElement(TableCell, { align: "center", sx: {
18316
- width: "7.5rem", // 120px / 16px
18317
- } }, "AutoScale"),
18318
- React__default.createElement(TableCell, { align: "center", sx: {
18319
- width: "7.5rem", // 120px / 16px
18320
- } }, "Unit"),
18321
- React__default.createElement(TableCell, { align: "center" },
18322
- " ",
18323
- cursorData
18324
- ? (function () {
18325
- var date = new Date(cursorData.x1);
18326
- var formattedHour = date.toLocaleString("en-US", {
18327
- hour12: false,
18328
- hour: "2-digit",
18329
- minute: "2-digit",
18330
- second: "2-digit",
18331
- });
18332
- var milliseconds = (date.getMilliseconds() / 1000)
18333
- .toFixed(2)
18334
- .substring(2);
18335
- var dateText = "".concat(formattedHour, ".").concat(milliseconds, " hs");
18336
- return React__default.createElement(React__default.Fragment, null, dateText);
18337
- })()
18338
- : null,
18339
- " "),
18340
- React__default.createElement(TableCell, { align: "center" },
18341
- " ",
18342
- cursorData
18343
- ? (function () {
18344
- var date = new Date(cursorData.x2);
18345
- var formattedHour = date.toLocaleString("en-US", {
18346
- hour12: false,
18347
- hour: "2-digit",
18348
- minute: "2-digit",
18349
- second: "2-digit",
18350
- });
18351
- var milliseconds = (date.getMilliseconds() / 1000)
18352
- .toFixed(2)
18353
- .substring(2);
18354
- var dateText = "".concat(formattedHour, ".").concat(milliseconds, " hs");
18355
- return React__default.createElement(React__default.Fragment, null, dateText);
18356
- })()
18357
- : null,
18358
- " "),
18359
- React__default.createElement(TableCell, { align: "center" }, "Y2-Y1"),
18360
- React__default.createElement(TableCell, { align: "center" }, "Min"),
18361
- React__default.createElement(TableCell, { align: "center" }, "Max")))))),
18362
- React__default.createElement(Grid2, { size: { xs: 12 } },
18363
- React__default.createElement(TableContainer, { component: Paper, style: {
18364
- width: "100%",
18365
- height: "100%",
18366
- maxHeight: "100%",
18367
- boxShadow: "none",
18368
- border: "none",
18369
- } },
18370
- React__default.createElement(Table, { size: "small", style: { width: "100%", tableLayout: "fixed" } },
18371
- React__default.createElement(TableBody, null, Object.values(viewTags).length ? (Object.values(viewTags).map(function (_a) {
18372
- var _b, _c, _d, _e, _f, _g, _h;
18373
- var tag = _a.viewTag;
18374
- return (React__default.createElement(TableRow, { key: tag.TagName, onContextMenu: function (e) {
18375
- showContextMenu(e, tag, "chartContext");
18376
- }, sx: {
18377
- "&:hover": {
18378
- backgroundColor: "#f2f2f2",
18379
- },
18380
- } },
18381
- React__default.createElement(TableCell, { align: "center", sx: {
18382
- width: "3.75rem", // 60px / 16px
18383
- fontSize: "0.75rem",
18384
- '& input[type="checkbox"]': {
18385
- zoom: 1.5,
18386
- },
18387
- textAlign: "center",
18388
- } },
18389
- React__default.createElement("input", { type: "checkbox", checked: tag.IsVisible, onChange: function (e) {
18390
- return handleVisibilityChange(tag.TagId, e.target.checked);
18391
- } })),
18392
- React__default.createElement(TableCell, { sx: {
18393
- width: "18rem",
18394
- overflow: "hidden",
18395
- textOverflow: "ellipsis",
18396
- whiteSpace: "nowrap",
18397
- } },
18398
- React__default.createElement(Tooltip, { title: tag.TagName, placement: "top", arrow: true, enterDelay: 500 },
18399
- React__default.createElement("div", { style: { display: "flex", alignItems: "center" } },
18400
- tag.TagType && (React__default.createElement("div", { style: {
18401
- backgroundColor: tag.TagType === "A" ? "#AD48C4" : "#C46F48",
18402
- width: "30px",
18403
- height: "30px",
18404
- color: "white",
18405
- display: "flex",
18406
- justifyContent: "center",
18407
- alignItems: "center",
18408
- cursor: "pointer",
18409
- border: "1px black solid",
18410
- } }, tag.TagType)),
18411
- React__default.createElement("input", { type: "text", style: { width: "100%" }, value: tag.Alias || tag.TagName, onFocus: function (e) { return e.target.select(); }, onChange: function (e) {
18412
- var newAlias = e.target.value;
18413
- handleChangeAlias(tag.TagId, newAlias);
18414
- } })))),
18415
- React__default.createElement(TableCell, { align: "center", sx: {
18416
- width: "4.375rem", // 70px / 16px
18417
- } },
18418
- React__default.createElement(ColorPicker, { onChange: handleColorChange, color: tag.Color, elementId: tag.TagId })),
18419
- React__default.createElement(TableCell, { sx: {
18420
- width: "11.25rem", // 180px / 16px
18421
- overflow: "hidden",
18422
- textOverflow: "ellipsis",
18423
- whiteSpace: "nowrap",
18424
- } },
18425
- React__default.createElement(Box, { component: "input", type: "number", sx: __assign({ "&::-webkit-inner-spin-button, &::-webkit-outer-spin-button": {
18426
- "-webkit-appearance": "none",
18427
- margin: 0,
18428
- }, "&": {
18429
- "-moz-appearance": "textfield", // to Firefox
18430
- }, width: "100%" }, (tag.IsAutoScale
18431
- ? {
18432
- backgroundColor: "rgba(239, 239, 239, 0.3)",
18433
- color: "rgba(84, 84, 84, 1)",
18434
- border: "1px solid rgba(118, 118, 118, 0.3)",
18435
- }
18436
- : {})), value: tag.MinScale, onClick: function () {
18437
- return handleAbleScales(tag.TagId, tag.IsAutoScale);
18438
- }, onFocus: function (e) { return e.target.select(); }, onChange: function (e) {
18439
- return handleChangeScale(e.target.value, "MinScale", tag.TagId);
18440
- } })),
18441
- React__default.createElement(TableCell, { sx: {
18442
- width: "11.25rem", // 180px / 16px
18443
- overflow: "hidden",
18444
- textOverflow: "ellipsis",
18445
- whiteSpace: "nowrap",
18446
- } },
18447
- React__default.createElement(Box, { component: "input", type: "number", sx: __assign({ "&::-webkit-inner-spin-button, &::-webkit-outer-spin-button": {
18448
- "-webkit-appearance": "none",
18449
- margin: 0,
18450
- }, "&": {
18451
- "-moz-appearance": "textfield", // to Firefox
18452
- }, width: "100%", WebkitAppearance: "none" }, (tag.IsAutoScale
18453
- ? {
18454
- backgroundColor: "rgba(239, 239, 239, 0.3)",
18455
- color: "rgba(84, 84, 84, 1)",
18456
- border: "1px solid rgba(118, 118, 118, 0.3)",
18457
- }
18458
- : {})), value: tag.MaxScale, onClick: function () {
18459
- return handleAbleScales(tag.TagId, tag.IsAutoScale);
18460
- }, onFocus: function (e) { return e.target.select(); }, onChange: function (e) {
18461
- handleChangeScale(e.target.value, "MaxScale", tag.TagId);
18462
- } })),
18463
- React__default.createElement(TableCell, { align: "center", sx: {
18464
- width: "7.5rem", // 120px / 16px
18465
- '& input[type="checkbox"]': {
18466
- zoom: 1.5,
18467
- },
18468
- textAlign: "center",
18469
- } },
18470
- React__default.createElement("input", { type: "checkbox", checked: !!tag.IsAutoScale, onChange: function (e) {
18471
- return handleAutoScaleChange(tag.TagId, tag.IsAutoScale);
18472
- } })),
18473
- React__default.createElement(TableCell, { sx: {
18474
- width: "7.5rem", // 120px / 16px
18475
- '& input[type="checkbox"]': {
18476
- zoom: 1.5,
18477
- },
18478
- textAlign: "center",
18479
- } },
18480
- React__default.createElement("input", { type: "text", style: {
18481
- width: "100%",
18482
- }, onClick: function () {
18483
- return handleAbleScales(tag.TagId, tag.IsAutoScale);
18484
- }, onChange: function (e) {
18485
- var value = e.target.value;
18486
- handleUnitChange(tag.TagId, value);
18487
- }, value: tag.Unit === "-" ? "" : tag.Unit, onFocus: function (e) { return e.target.select(); } })),
18488
- React__default.createElement(TableCell, { align: "center" }, round((_b = dataTable[tag.TagName]) === null || _b === void 0 ? void 0 : _b.y1, 3) || 0),
18489
- React__default.createElement(TableCell, { align: "center", sx: {
18490
- padding: "0",
18491
- '& input[type="text"] ': {
18492
- width: "100%", // 180px / 16px,
18493
- height: "17px",
18494
- display: "block",
18495
- margin: "0",
18496
- padding: "0",
18497
- },
18498
- } }, round((_c = dataTable[tag.TagName]) === null || _c === void 0 ? void 0 : _c.y2, 3) || 0),
18499
- React__default.createElement(TableCell, { align: "center" }, round((_d = dataTable[tag.TagName]) === null || _d === void 0 ? void 0 : _d.y2y1, 3) || 0),
18500
- React__default.createElement(TableCell, { align: "center" },
18501
- !isNaN$1(((_e = dataTable[tag.TagName]) === null || _e === void 0 ? void 0 : _e.pmin.y) * 0)
18502
- ? round((_f = dataTable[tag.TagName]) === null || _f === void 0 ? void 0 : _f.pmin.y, 3)
18503
- : 0,
18504
- " "),
18505
- React__default.createElement(TableCell, { align: "center" },
18506
- !isNaN$1(((_g = dataTable[tag.TagName]) === null || _g === void 0 ? void 0 : _g.pmax.y) * 0)
18507
- ? round((_h = dataTable[tag.TagName]) === null || _h === void 0 ? void 0 : _h.pmax.y)
18508
- : 0,
18509
- " ")));
18510
- })) : (React__default.createElement(TableRow, null,
18511
- React__default.createElement(TableCell, { colSpan: 12 },
18512
- React__default.createElement(Box, { sx: {
18513
- display: "flex",
18514
- flexDirection: "column",
18515
- alignItems: "center",
18516
- justifyContent: "center",
18517
- padding: 4,
18518
- gap: 2,
18519
- } },
18520
- React__default.createElement("div", null, "No tag view detected."),
18521
- React__default.createElement(Button, { onClick: function () { return setTagsTreeModalOpen(true); }, variant: "contained", color: "primary" }, "Add tag"),
18522
- React__default.createElement(Button, { onClick: function () { return setLoadViewOpen(true); }, variant: "outlined", color: "primary" }, "Load view"))))))))),
18523
- React__default.createElement(TagsTreeModal, { open: tagsTreeModalOpen, handleClose: handleClose, onTagSelect: handleTagSelect }),
18524
- React__default.createElement(SaveAsViewModal, { open: saveAsViewModalOpen, handleClose: function (shouldUpdate) { return __awaiter(void 0, void 0, void 0, function () {
18525
- return __generator(this, function (_a) {
18526
- switch (_a.label) {
18527
- case 0:
18528
- setSaveAsViewModalOpen(false);
18529
- if (!shouldUpdate) return [3 /*break*/, 2];
18530
- return [4 /*yield*/, queryClient.invalidateQueries({ queryKey: ["views"] })];
18531
- case 1:
18532
- _a.sent();
18533
- _a.label = 2;
18534
- case 2: return [2 /*return*/];
18535
- }
18536
- });
18537
- }); } }),
18538
- React__default.createElement(LoadViewModal, { open: loadViewOpen, handleClose: function (shouldUpdate) {
18539
- setLoadViewOpen(false);
18540
- } })),
18541
- React__default.createElement(ErrorModal, { error: error, onHide: function () { return setError(""); } }),
18542
- React__default.createElement(Snackbar, { open: !!snackbarMessage, autoHideDuration: 800, onClose: handleCloseSnackbar, anchorOrigin: { vertical: "bottom", horizontal: "center" } },
18543
- React__default.createElement(Alert$2, { onClose: handleCloseSnackbar, severity: "success" }, snackbarMessage))));
18544
- };
18545
-
18546
- var formatDateTimeToString = function (date) {
18547
- var hour = date.getHours().toString().padStart(2, "0");
18548
- var minute = date.getMinutes().toString().padStart(2, "0");
18549
- var second = date.getSeconds().toString().padStart(2, "0");
18550
- if (hour === "24") {
18551
- hour = "00";
18552
- }
18553
- var formattedDate = date.toLocaleDateString("en-US", {
18554
- month: "short",
18555
- day: "numeric",
18556
- });
18557
- var formattedTime = "".concat(hour, ":").concat(minute, ":").concat(second);
18558
- return { formattedDate: formattedDate, formattedTime: formattedTime };
18559
- };
18560
-
18561
- var useChartOptions = function () {
18562
- var _a = useTrendingContext(); _a.state; var actions = _a.actions;
18563
- var debounceTimerRef = useRef(null);
18564
- var handleZoom = useCallback(function (_a) {
18565
- var chart = _a.chart;
18566
- if (debounceTimerRef.current) {
18567
- clearTimeout(debounceTimerRef.current);
18568
- }
18569
- debounceTimerRef.current = setTimeout(function () {
18570
- // Handle zoom event and execute fetch
18571
- var newStart = new Date(chart.scales.x.min);
18572
- var newEnd = new Date(chart.scales.x.max);
18573
- actions.setTotalScope({
18574
- start: newStart,
18575
- end: newEnd,
18576
- });
18577
- }, 1000);
18578
- }, [actions]);
18579
- var handlePan = useCallback(function (_a) {
18580
- var chart = _a.chart;
18581
- if (debounceTimerRef.current) {
18582
- clearTimeout(debounceTimerRef.current);
18583
- }
18584
- debounceTimerRef.current = setTimeout(function () {
18585
- // Handle pan event and execute fetch
18586
- var newStart = new Date(chart.scales.x.min);
18587
- var newEnd = new Date(chart.scales.x.max);
18588
- actions.setTotalScope({
18589
- start: newStart,
18590
- end: newEnd,
18591
- graphPan: true,
18592
- });
18593
- }, 1000);
18594
- }, [actions]);
18595
- var initialOptions = useMemo(function () { return ({
18596
- animation: {
18597
- duration: 0, // No animation
18598
- },
18599
- responsive: true,
18600
- maintainAspectRatio: false,
18601
- scales: {
18602
- x: {
18603
- type: "time",
18604
- ticks: {
18605
- autoSkip: true,
18606
- maxTicksLimit: 20,
18607
- callback: function (value, index, ticks) {
18608
- var currentDate = new Date(value);
18609
- var time = formatDateTimeToString(currentDate).formattedTime;
18610
- var date = formatDateTimeToString(currentDate).formattedDate;
18611
- // Si es el primer tick, siempre muestra la fecha y hora
18612
- if (index === 0) {
18613
- return [time, date];
18614
- }
18615
- // De lo contrario, solo muestra la hora
18616
- return time;
18617
- },
18618
- },
18619
- grid: {
18620
- display: true,
18621
- },
18622
- },
18623
- y: {
18624
- grid: {
18625
- display: true,
18626
- },
18627
- afterUpdate: function (axis) {
18628
- var chart = axis.chart;
18629
- var keys = Object.keys(chart.scales).filter(function (sc) { return sc !== "x"; });
18630
- if (keys.length > 1) {
18631
- for (var scaleKey in chart.scales) {
18632
- var scale = chart.scales[scaleKey];
18633
- if (scale.max === 1 && scale.min === 0) {
18634
- chart.scales[scaleKey].display = false;
18635
- chart.scales[scaleKey].options.display = false;
18636
- }
18637
- else {
18638
- chart.scales[scaleKey].display = true;
18639
- chart.scales[scaleKey].options.display = true;
18640
- }
18641
- }
18642
- }
18643
- },
18644
- },
18645
- },
18646
- plugins: {
18647
- tooltip: { enabled: false },
18648
- legend: { display: false },
18649
- zoom: {
18650
- zoom: {
18651
- wheel: { enabled: true, mode: "x" },
18652
- pinch: { enabled: true, mode: "x" },
18653
- onZoom: handleZoom,
18654
- mode: "x",
18655
- },
18656
- pan: {
18657
- enabled: true,
18658
- mode: "x",
18659
- onPan: handlePan,
18660
- },
18661
- },
18662
- },
18663
- }); }, [handleZoom, handlePan]);
18664
- return useState(initialOptions);
18665
- };
18666
-
18667
- var CustomOptionsComponent = function (_a) {
18668
- var customOptions = _a.customOptions, setCustomOptions = _a.setCustomOptions, autoRefresh = _a.autoRefresh, setAutoRefresh = _a.setAutoRefresh;
18669
- var handleGridChange = function (value) {
18670
- setCustomOptions(function (prevOptions) { return (__assign(__assign({}, prevOptions), { showGrid: value })); });
18671
- };
18672
- var handleSteppedChange = function (value) {
18673
- setCustomOptions(function (prevOptions) { return (__assign(__assign({}, prevOptions), { stepped: value })); });
18674
- };
18675
- return (React__default.createElement(React__default.Fragment, null,
18676
- React__default.createElement(Grid2, { sx: {
18677
- paddingLeft: "2rem",
18678
- userSelect: "none",
18679
- "& > label": {
18680
- display: "flex",
18681
- alignItems: "center",
18682
- gap: "5px",
18683
- },
18684
- '& input[type="checkbox"]': {
18685
- zoom: 1.5,
18686
- },
18687
- } },
18688
- React__default.createElement(FormControlLabel, { checked: customOptions.showGrid, control: React__default.createElement(Checkbox, { color: "primary" }), label: "Show Grid", onChange: function (e, checked) {
18689
- handleGridChange(checked);
18690
- } })),
18691
- React__default.createElement(Grid2, { sx: {
18692
- paddingLeft: "2rem",
18693
- userSelect: "none",
18694
- "& > label": {
18695
- display: "flex",
18696
- alignItems: "center",
18697
- gap: "5px",
18698
- },
18699
- '& input[type="checkbox"]': {
18700
- zoom: 1.5,
18701
- },
18702
- } },
18703
- React__default.createElement(FormControlLabel, { checked: customOptions.stepped, control: React__default.createElement(Checkbox, { color: "primary" }), label: "Stepped", onChange: function (e, checked) {
18704
- handleSteppedChange(checked);
18705
- } })),
18706
- React__default.createElement(Grid2, { sx: {
18707
- paddingLeft: "2rem",
18708
- userSelect: "none",
18709
- "& > label": {
18710
- display: "flex",
18711
- alignItems: "center",
18712
- gap: "5px",
18713
- },
18714
- '& input[type="checkbox"]': {
18715
- zoom: 1.5,
18716
- },
18717
- } },
18718
- React__default.createElement(FormControlLabel, { checked: autoRefresh, control: React__default.createElement(Switch, { color: "primary" }), label: "Auto Refresh", onChange: function (e, checked) {
18719
- setAutoRefresh(checked);
18720
- } }))));
18721
- };
18722
-
18723
- var Header = React__default.memo(function (_a) {
18724
- var setChartOptions = _a.setChartOptions, autoRefresh = _a.autoRefresh, setAutoRefresh = _a.setAutoRefresh;
18725
- var _b = useTrendingContext(), state = _b.state, actions = _b.actions;
18726
- var _c = useState({
18727
- showGrid: true,
18728
- stepped: false,
18729
- }), customOptions = _c[0], setCustomOptions = _c[1];
18730
- var handleDateNavigator = function (operator, current) {
18731
- if (current === void 0) { current = false; }
18732
- var newDates = dateNavigator(state.timeScopeStart, state.timeScopeEnd, state.scope, operator, current);
18733
- if (newDates) {
18734
- actions.setTotalScope({
18735
- start: newDates.newStartDate,
18736
- end: newDates.newEndDate,
18737
- scope: state.scope,
18738
- });
18739
- }
18740
- };
18741
- var handleDateChange = function (newValue, key) {
18742
- var _a;
18743
- //@ts-ignore
18744
- actions.setTotalScope((_a = {}, _a[key] = moment$f(newValue).toDate(), _a));
18745
- };
18746
- var handleChangeScope = function (value) {
18747
- actions.setTotalScope({
18748
- scope: value,
18749
- });
18750
- };
18751
- useEffect(function () {
18752
- var changeOptions = function () {
18753
- setChartOptions(function (prevOptions) {
18754
- var newScales = __assign({}, prevOptions.scales);
18755
- Object.keys(newScales).forEach(function (key) {
18756
- if (key) {
18757
- newScales[key] = __assign(__assign({}, newScales[key]), { grid: __assign(__assign({}, newScales[key].grid), { display: customOptions.showGrid }) });
18758
- }
18759
- });
18760
- return __assign(__assign({}, prevOptions), { elements: {
18761
- line: {
18762
- stepped: customOptions.stepped,
18763
- lineTension: 0.1,
18764
- },
18765
- }, scales: newScales });
18766
- });
18767
- };
18768
- changeOptions();
18769
- }, [customOptions]);
18770
- useEffect(function () {
18771
- 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() }) }) })); });
18772
- }, [state.timeScopeStart, state.timeScopeEnd]);
18773
- return (React__default.createElement(LocalizationProvider$1, { dateAdapter: AdapterMoment },
18774
- React__default.createElement(Grid2, { size: { xs: 12 }, container: true, justifyContent: "space-between", alignItems: "center", style: { height: "8%" } },
18775
- React__default.createElement(Grid2, { size: { md: 4 }, container: true, spacing: 1, justifyContent: "flex-start", alignItems: "center", wrap: "wrap" },
18776
- React__default.createElement(Grid2, null,
18777
- React__default.createElement(IconButton$1, { color: "primary", onClick: function () { return handleDateNavigator("subtract"); }, size: "small", sx: {
18778
- padding: 0.5,
18779
- color: "black",
18780
- } },
18781
- React__default.createElement(ChevronLeft, { fontSize: "medium" }))),
18782
- React__default.createElement(Grid2, { size: { md: 4 } },
18783
- React__default.createElement(DateTimePicker, { label: "Start", format: "MM/DD/YYYY HH:mm:ss", value: moment$f(state.timeScopeStart), onChange: function (newValue) {
18784
- if (newValue) {
18785
- handleDateChange(newValue.toDate(), "start");
18786
- }
18787
- }, minutesStep: 1, slotProps: {
18788
- textField: {
18789
- size: "small",
18790
- variant: "outlined",
18791
- fullWidth: true,
18792
- },
18793
- } })),
18794
- React__default.createElement(Grid2, { size: { md: 2 }, marginTop: 0.5 },
18795
- React__default.createElement(FormControl, { variant: "outlined", size: "small", fullWidth: true },
18796
- React__default.createElement(Select, { value: state.scope, onChange: function (e) {
18797
- return handleChangeScope(e.target.value);
18798
- }, displayEmpty: true },
18799
- React__default.createElement(MenuItem, { value: "10 min" }, "10 min"),
18800
- React__default.createElement(MenuItem, { value: "1 hour" }, "1 hour"),
18801
- React__default.createElement(MenuItem, { value: "4 hours" }, "4 hours"),
18802
- React__default.createElement(MenuItem, { value: "12 hours" }, "12 hours"),
18803
- React__default.createElement(MenuItem, { value: "1 day" }, "1 day"),
18804
- React__default.createElement(MenuItem, { value: "10 days" }, "10 days"),
18805
- React__default.createElement(MenuItem, { value: "custom" }, "Custom")))),
18806
- React__default.createElement(Grid2, { size: { md: 4 } },
18807
- React__default.createElement(DateTimePicker, { label: "End", format: "MM/DD/YYYY HH:mm:ss", value: autoRefresh ? null : moment$f(state.timeScopeEnd), onChange: function (newValue) {
18808
- if (newValue) {
18809
- handleDateChange(newValue.toDate(), "end");
18810
- }
18811
- }, minutesStep: 1, slotProps: {
18812
- textField: {
18813
- size: "small",
18814
- variant: "outlined",
18815
- fullWidth: true,
18816
- },
18817
- }, disabled: autoRefresh })),
18818
- React__default.createElement(Grid2, null,
18819
- React__default.createElement(IconButton$1, { onClick: function () { return handleDateNavigator("add"); }, sx: {
18820
- "& .MuiSvgIcon-root": {
18821
- cursor: "pointer !important",
18822
- height: "24px",
18823
- width: "24px",
18824
- "& svg": {
18825
- // Adjust the icon size as well
18826
- fontSize: "1.5rem",
18827
- },
18828
- },
18829
- color: "black",
18830
- } },
18831
- React__default.createElement(ChevronRight, { fontSize: "large" }))),
18832
- React__default.createElement(Grid2, null,
18833
- React__default.createElement(IconButton$1, { onClick: function () { return handleDateNavigator("subtract", true); }, sx: {
18834
- "& .MuiSvgIcon-root": {
18835
- cursor: "pointer !important",
18836
- height: "24px",
18837
- width: "24px",
18838
- "& svg": {
18839
- // Adjust the icon size as well
18840
- fontSize: "1.5rem",
18841
- },
18842
- },
18843
- color: "black",
18844
- } },
18845
- React__default.createElement(SkipNextIcon, { fontSize: "large" })))),
18846
- React__default.createElement(Grid2, { size: { md: 6 }, container: true, justifyContent: "space-between" },
18847
- React__default.createElement(Grid2, { container: true, wrap: "nowrap", spacing: 1 },
18848
- React__default.createElement(Grid2, { container: true },
18849
- React__default.createElement(CustomOptionsComponent, { customOptions: customOptions, setCustomOptions: setCustomOptions, autoRefresh: autoRefresh, setAutoRefresh: function (autoRefresh) {
18850
- if (autoRefresh) {
18851
- handleChangeScope("custom");
18852
- handleDateChange(new Date(), "end");
18853
- }
18854
- setAutoRefresh(autoRefresh);
18855
- } })))))));
18856
- });
18857
- Header.displayName = "Header";
18858
-
18859
- var DraggableLineControl = React__default.memo(function (_a) {
18860
- var initialLeft = _a.initialLeft, otherLineCoord = _a.otherLineCoord, onUpdate = _a.onUpdate, color = _a.color, chartArea = _a.chartArea;
18861
- var _b = useState(false), isDragging = _b[0], setIsDragging = _b[1];
18862
- var _c = useState(initialLeft), left = _c[0], setLeft = _c[1];
18863
- var ref = useRef(null);
18864
- var handleMouseDown = function (e) {
18865
- setIsDragging(true);
18866
- e.stopPropagation();
18867
- e.preventDefault();
18868
- };
18869
- var handleMouseMove = function (e) {
18870
- if (!isDragging || !ref.current)
18871
- return;
18872
- chartArea.width - chartArea.right;
18873
- chartArea.left;
18874
- var newLeft = Math.min(Math.max(e.clientX - ref.current.offsetParent.getBoundingClientRect().left, chartArea.left), chartArea.right);
18875
- // Line limit
18876
- if (color === "red" && newLeft > otherLineCoord - 20) {
18877
- newLeft = otherLineCoord - 20;
18878
- }
18879
- else if (color === "blue" && newLeft < otherLineCoord + 20) {
18880
- newLeft = otherLineCoord + 20;
18881
- }
18882
- setLeft(newLeft);
18883
- onUpdate(newLeft); // Actualiza la posición de la línea en el gráfico
18884
- };
18885
- var handleMouseUp = function () {
18886
- setIsDragging(false);
18887
- };
18888
- useEffect(function () {
18889
- var mouseMoveHandler = function (e) { return handleMouseMove(e); };
18890
- var mouseUpHandler = function () { return handleMouseUp(); };
18891
- if (isDragging) {
18892
- window.addEventListener("mousemove", mouseMoveHandler);
18893
- window.addEventListener("mouseup", mouseUpHandler);
18894
- }
18895
- return function () {
18896
- window.removeEventListener("mousemove", mouseMoveHandler);
18897
- window.removeEventListener("mouseup", mouseUpHandler);
18898
- };
18899
- }, [isDragging]);
18900
- return (React__default.createElement("div", { ref: ref, style: {
18901
- height: 20,
18902
- width: 20,
18903
- background: color,
18904
- position: "absolute",
18905
- top: -10,
18906
- left: left - 10,
18907
- }, onMouseDown: handleMouseDown },
18908
- React__default.createElement("div", { style: {
18909
- height: chartArea.height,
18910
- width: 2,
18911
- background: color,
18912
- position: "relative",
18913
- top: 20,
18914
- left: 0,
18915
- right: 0,
18916
- margin: "auto",
18917
- } })));
18918
- });
18919
- DraggableLineControl.displayName = "DraggableLineControl";
18920
-
18921
- var useGetVerticalLinePlugin = function (setChartArea, setCoords) {
18922
- var chartPlugin = useMemo(function () { return ({
18923
- id: "verticalLinePlugin",
18924
- afterUpdate: function (chart) {
18925
- if (chart.chartArea) {
18926
- // console.log("after update");
18927
- if (chart.mouseX === null) {
18928
- chart.mouseX = chart.chartArea.left + chart.chartArea.width / 10;
18929
- // chart.mouseX = chart.chartArea.left + 30.9
18930
- }
18931
- if (chart.secondLineX === null) {
18932
- chart.secondLineX =
18933
- chart.chartArea.left + chart.chartArea.width * 0.9;
18934
- // chart.secondLineX = chart.chartArea.right
18935
- }
18936
- }
18937
- },
18938
- beforeInit: function (chart) {
18939
- chart.mouseX = null;
18940
- chart.secondLineX = null;
18941
- },
18942
- afterDatasetsDraw: function (chart) {
18943
- var x1 = chart.mouseX;
18944
- var x2 = chart.secondLineX;
18945
- setChartArea(chart.chartArea);
18946
- setCoords({ x1: x1, x2: x2 });
18947
- },
18948
- }); }, [setChartArea, setCoords]);
18949
- return chartPlugin;
18950
- };
18951
-
18952
- var getValuesAtCursor = function (chart, timeAtCursor) {
18953
- var valuesAtCursor = [];
18954
- chart.data.datasets.forEach(function (dataset) {
18955
- var previousDataPoint = null;
18956
- for (var i = 0; i < dataset.data.length; i++) {
18957
- if (dataset.data[i].x.getTime() <= timeAtCursor) {
18958
- previousDataPoint = dataset.data[i];
18959
- }
18960
- else {
18961
- break;
18962
- }
18963
- }
18964
- if (previousDataPoint) {
18965
- valuesAtCursor.push(previousDataPoint.y);
18966
- }
18967
- });
18968
- return valuesAtCursor;
18969
- };
18970
- var updateCursorData = function (chart, setCursorData) {
18971
- var xScale = chart.scales.x;
18972
- // Coordenadas para la primera y segunda línea
18973
- var timeAtCursor1 = xScale.getValueForPixel(chart.mouseX);
18974
- var timeAtCursor2 = xScale.getValueForPixel(chart.secondLineX);
18975
- // Los valores en el punto del cursor pueden ser diferentes
18976
- var valuesAtCursor1 = getValuesAtCursor(chart, timeAtCursor1);
18977
- var valuesAtCursor2 = getValuesAtCursor(chart, timeAtCursor2);
18978
- setCursorData({
18979
- x1: timeAtCursor1,
18980
- x2: timeAtCursor2,
18981
- values: __spreadArray(__spreadArray([], valuesAtCursor1, true), valuesAtCursor2, true),
18982
- });
18983
- };
18984
-
18985
- var useXAxisDatePlugin = function () {
18986
- var chartPlugin = useMemo(function () { return ({
18987
- id: "xAxisDatePlugin",
18988
- afterBuildTicks: function (chart) {
18989
- var oldTicks = chart.scales.x.ticks;
18990
- var newTicks = [];
18991
- newTicks.push(oldTicks[0]);
18992
- for (var i = 1; i < oldTicks.length; i++) {
18993
- var current = new Date(oldTicks[i].value);
18994
- var previous = new Date(oldTicks[i - 1].value);
18995
- var time = formatDateTimeToString(current).formattedTime;
18996
- var date = formatDateTimeToString(current).formattedDate;
18997
- var newLabel = void 0;
18998
- if (current.getDate() !== previous.getDate()) {
18999
- newLabel = [time, date];
19000
- }
19001
- else {
19002
- newLabel = time;
19003
- }
19004
- newTicks.push({
19005
- value: oldTicks[i].value,
19006
- major: oldTicks[i].major,
19007
- label: newLabel,
19008
- });
19009
- }
19010
- chart.scales.x.ticks = newTicks;
19011
- },
19012
- }); }, []);
19013
- return chartPlugin;
19014
- };
19015
-
19016
- var useYAxisPlugin = function () {
19017
- var chartPlugin = useMemo(function () { return ({
19018
- id: "yAxisPlugin",
19019
- }); }, []);
19020
- return chartPlugin;
19021
- };
19022
-
19023
- var areRangesSimilar = function (tag1, tag2) {
19024
- if (isNil(tag1.MaxScale) ||
19025
- isNil(tag1.MinScale) ||
19026
- isNil(tag2.MaxScale) ||
19027
- isNil(tag2.MinScale))
19028
- return;
19029
- var range1 = tag1.MaxScale - tag1.MinScale; // Rango de la primera etiqueta
19030
- var range2 = tag2.MaxScale - tag2.MinScale; // Rango de la segunda etiqueta
19031
- // Determina los límites para la comparación
19032
- var lowerBound = Math.max(tag1.MinScale, tag2.MinScale);
19033
- var upperBound = Math.min(tag1.MaxScale, tag2.MaxScale);
19034
- // Calcula el solapamiento entre los dos rangos
19035
- var overlap = Math.max(0, upperBound - lowerBound);
19036
- // Determina si el solapamiento es significativo comparado con los rangos individuales
19037
- var isSignificantOverlap = overlap / range1 > 0.5 && overlap / range2 > 0.5;
19038
- return isSignificantOverlap;
19039
- };
19040
-
19041
- var TrendingChart = React__default.memo(function (_a) {
19042
- var series = _a.series, chartOptions = _a.chartOptions, setChartOptions = _a.setChartOptions, chartData = _a.chartData, setCursorData = _a.setCursorData, setChartData = _a.setChartData;
19043
- var _b = useTrendingContext(), state = _b.state, viewTags = _b.state.viewTags; _b.actions;
19044
- var _c = useState(null), lineTabCoords = _c[0], setLineTabCoords = _c[1];
19045
- var _d = useState(null), chartArea = _d[0], setChartArea = _d[1];
19046
- var chartRef = useRef(null);
19047
- var forDebounce = useRef({
19048
- viewTags: viewTags,
19049
- series: series,
19050
- setChartOptions: setChartOptions,
19051
- setChartData: setChartData,
19052
- });
19053
- var debouncedUpdateChart = useRef(debounce(function () {
19054
- if (chartRef.current) {
19055
- updateCursorData(chartRef.current, setCursorData);
19056
- chartRef.current.update();
19057
- }
19058
- }, 250));
19059
- forDebounce.current = {
19060
- viewTags: viewTags,
19061
- series: series,
19062
- setChartOptions: setChartOptions,
19063
- setChartData: setChartData,
19064
- };
19065
- var debouncedUpdateChartBasedOnData = useRef(debounce(function () {
19066
- var _a = forDebounce.current, viewTags = _a.viewTags, series = _a.series, setChartOptions = _a.setChartOptions, setChartData = _a.setChartData;
19067
- var axes = [];
19068
- if (!series.length) {
19069
- return;
19070
- }
19071
- Object.values(viewTags).forEach(function (_a, index) {
19072
- var tag = _a.viewTag;
19073
- var existingAxis = axes.findIndex(function (existingTag) {
19074
- return areRangesSimilar(existingTag, tag);
19075
- });
19076
- if (existingAxis === -1) {
19077
- axes.push(tag); // Add new axis if no similar one exists
19078
- seriesVsTags.current[tag.TagId] = tag.TagId;
19079
- }
19080
- else {
19081
- seriesVsTags.current[tag.TagId] = axes[existingAxis].TagId;
19082
- }
19083
- });
19084
- // Configure yAxes based on grouped axes
19085
- var yAxesConfig = axes.map(function (axis) {
19086
- var min = Number(axis.MinScale);
19087
- var max = Number(axis.MaxScale);
19088
- if (!min && !max) {
19089
- max = 1;
19090
- }
19091
- return {
19092
- id: "y-axis-".concat(axis.TagId),
19093
- type: "linear",
19094
- display: axis.IsVisible,
19095
- title: {
19096
- display: true,
19097
- text: axis.TagName,
19098
- },
19099
- min: axis.IsAutoScale ? undefined : min,
19100
- max: axis.IsAutoScale ? undefined : max,
19101
- suggestedMin: axis.IsAutoScale ? undefined : min,
19102
- suggestedMax: axis.IsAutoScale ? undefined : max,
19103
- stepSize: 10,
19104
- grid: {
19105
- display: true,
19106
- },
19107
- afterUpdate: function (a) {
19108
- var chart = a.chart;
19109
- var keys = Object.keys(chart.scales).filter(function (sc) { return sc !== "x"; });
19110
- var counterOfDefaultsScales = 0;
19111
- if (keys.length > 1) {
19112
- for (var scaleKey in chart.scales) {
19113
- var scale = chart.scales[scaleKey];
19114
- if (scale.max === 1 && scale.min === 0) {
19115
- chart.scales[scaleKey].display = false;
19116
- chart.scales[scaleKey].options.display = false;
19117
- counterOfDefaultsScales++;
19118
- }
19119
- else {
19120
- chart.scales[scaleKey].display = true;
19121
- chart.scales[scaleKey].options.display = true;
19122
- }
19123
- if (counterOfDefaultsScales === keys.length) {
19124
- chart.scales[keys[0]].display = true;
19125
- chart.scales[keys[0]].options.display = true;
19126
- }
19127
- }
19128
- }
19129
- },
19130
- };
19131
- });
19132
- setChartOptions(function (prevOptions) {
19133
- var newResp = __assign(__assign({}, prevOptions), { scales: __assign({ x: __assign({}, prevOptions.scales.x) }, yAxesConfig.reduce(function (acc, cur) {
19134
- var _a;
19135
- return (__assign(__assign({}, acc), (_a = {}, _a[cur.id] = cur, _a)));
19136
- }, {})) });
19137
- return newResp;
19138
- });
19139
- var updatedSeries = series.map(function (serie, index) {
19140
- var _a;
19141
- var tagsSortedArray = Object.values(viewTags).sort(function (a, b) { return b.order - a.order; });
19142
- var tag = (_a = tagsSortedArray[index]) === null || _a === void 0 ? void 0 : _a.viewTag;
19143
- var yAxisTagId = seriesVsTags.current[tag === null || tag === void 0 ? void 0 : tag.TagId];
19144
- return {
19145
- yAxisID: "y-axis-".concat(yAxisTagId),
19146
- data: serie.map(function (sample) { return ({
19147
- x: new Date(sample.timestamp),
19148
- y: sample.value,
19149
- }); }),
19150
- tagId: tag === null || tag === void 0 ? void 0 : tag.TagId,
19151
- borderColor: tag === null || tag === void 0 ? void 0 : tag.Color,
19152
- hidden: !(tag === null || tag === void 0 ? void 0 : tag.IsVisible),
19153
- pointRadius: serie.length <= 50 ? 3 : 0,
19154
- };
19155
- });
19156
- setChartShouldInitCursors(true);
19157
- setChartData({
19158
- labels: [],
19159
- datasets: updatedSeries,
19160
- });
19161
- }, 1000));
19162
- var _e = useState(false), chartShouldInitCursors = _e[0], setChartShouldInitCursors = _e[1];
19163
- var memoizedSetChartArea = useCallback(function (area) { return setChartArea(area); }, []);
19164
- var memoizedSetLineTabCoords = useCallback(function (coords) { return setLineTabCoords(coords); }, []);
19165
- var verticalLinePlugin = useGetVerticalLinePlugin(memoizedSetChartArea, memoizedSetLineTabCoords);
19166
- var xAxisDatePlugin = useXAxisDatePlugin();
19167
- var yAxisPlugin = useYAxisPlugin();
19168
- var plugins = useMemo(function () { return [verticalLinePlugin, xAxisDatePlugin, yAxisPlugin]; }, [verticalLinePlugin, xAxisDatePlugin, yAxisPlugin]);
19169
- var seriesVsTags = useRef({});
19170
- useEffect(function () {
19171
- // Only run debounced update when series data actually changes
19172
- // Display property changes (color, visibility, scales) are handled by immediate useEffects
19173
- debouncedUpdateChartBasedOnData.current();
19174
- }, [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
19175
16494
  useEffect(function () {
19176
- if (chartShouldInitCursors) {
19177
- if (chartRef.current) {
19178
- updateCursorData(chartRef.current, setCursorData);
19179
- 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);
19180
16507
  }
19181
16508
  }
19182
- }, [chartShouldInitCursors, state.graphShouldUpdate]);
19183
- // Update colors and visibility immediately without debounce
16509
+ }, [viewSuccess, views, viewSelected, setViews, setViewSelected]);
16510
+ // Update viewId when viewSelected changes (e.g., from LoadViewModal)
19184
16511
  useEffect(function () {
19185
- setChartData(function (prevData) {
19186
- if (!prevData.datasets || !prevData.datasets.length)
19187
- return prevData;
19188
- var updatedDatasets = prevData.datasets.map(function (dataset) {
19189
- var tag = viewTags[dataset.tagId];
19190
- if (tag) {
19191
- return __assign(__assign({}, dataset), { borderColor: tag.viewTag.Color, hidden: !tag.viewTag.IsVisible });
19192
- }
19193
- return dataset;
19194
- });
19195
- return __assign(__assign({}, prevData), { datasets: updatedDatasets });
19196
- });
19197
- }, [viewTags, setChartData]);
19198
- // 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);
19199
16519
  useEffect(function () {
19200
- var axes = [];
19201
- Object.values(viewTags).forEach(function (_a) {
19202
- var tag = _a.viewTag;
19203
- var existingAxis = axes.findIndex(function (existingTag) {
19204
- 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
+ }
19205
16551
  });
19206
- if (existingAxis === -1) {
19207
- axes.push(tag);
19208
- }
19209
- });
19210
- var yAxesConfig = axes.map(function (axis) {
19211
- var min = Number(axis.MinScale);
19212
- var max = Number(axis.MaxScale);
19213
- if (!min && !max) {
19214
- max = 1;
19215
- }
19216
- return {
19217
- id: "y-axis-".concat(axis.TagId),
19218
- type: "linear",
19219
- display: axis.IsVisible,
19220
- title: {
19221
- display: true,
19222
- text: axis.TagName,
19223
- },
19224
- min: axis.IsAutoScale ? undefined : min,
19225
- max: axis.IsAutoScale ? undefined : max,
19226
- suggestedMin: axis.IsAutoScale ? undefined : min,
19227
- suggestedMax: axis.IsAutoScale ? undefined : max,
19228
- stepSize: 10,
19229
- grid: {
19230
- display: true,
19231
- },
19232
- afterUpdate: function (a) {
19233
- var chart = a.chart;
19234
- var keys = Object.keys(chart.scales).filter(function (sc) { return sc !== "x"; });
19235
- var counterOfDefaultsScales = 0;
19236
- if (keys.length > 1) {
19237
- for (var scaleKey in chart.scales) {
19238
- var scale = chart.scales[scaleKey];
19239
- if (scale.max === 1 && scale.min === 0) {
19240
- chart.scales[scaleKey].display = false;
19241
- chart.scales[scaleKey].options.display = false;
19242
- counterOfDefaultsScales++;
19243
- }
19244
- else {
19245
- chart.scales[scaleKey].display = true;
19246
- chart.scales[scaleKey].options.display = true;
19247
- }
19248
- if (counterOfDefaultsScales === keys.length) {
19249
- chart.scales[keys[0]].display = true;
19250
- chart.scales[keys[0]].options.display = true;
19251
- }
19252
- }
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();
19253
16560
  }
19254
- },
19255
- };
19256
- });
19257
- setChartOptions(function (prevOptions) { return (__assign(__assign({}, prevOptions), { scales: __assign({ x: __assign({}, prevOptions.scales.x) }, yAxesConfig.reduce(function (acc, cur) {
19258
- var _a;
19259
- return (__assign(__assign({}, acc), (_a = {}, _a[cur.id] = cur, _a)));
19260
- }, {})) })); });
19261
- }, [viewTags, setChartOptions]);
19262
- return (React__default.createElement(Paper, { style: { height: "100%", position: "relative" } },
19263
- 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) {
19264
- setLineTabCoords(function (prevCoords) {
19265
- prevCoords.x1 = newLeft;
19266
- return prevCoords;
19267
- });
19268
- // @ts-ignore
19269
- chartRef.current.mouseX = newLeft;
19270
- debouncedUpdateChart.current();
19271
- } })) : null,
19272
- 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) {
19273
- setLineTabCoords(function (prevCoords) {
19274
- prevCoords.x2 = newLeft;
19275
- return prevCoords;
19276
- });
19277
- // @ts-ignore
19278
- chartRef.current.secondLineX = newLeft;
19279
- debouncedUpdateChart.current();
19280
- } })) : null,
19281
- React__default.createElement(Line, { ref: chartRef, data: chartData, options: chartOptions, plugins: plugins })));
19282
- });
19283
- TrendingChart.displayName = "TrendingChart";
19284
-
19285
- Chart.register(CategoryScale, LinearScale, PointElement, LineElement, Title, Tooltip$1, Legend, TimeScale, zoomPlugin);
19286
- var Trending = React__default.memo(function (_a) {
19287
- _a.title; var autoRefresh = _a.autoRefresh, setAutoRefresh = _a.setAutoRefresh;
19288
- var _b = useTrendingContext(), state = _b.state, _c = _b.state, viewTags = _c.viewTags; _c.shouldRefetchSeries;
19289
- var _d = useState(""), error = _d[0], setError = _d[1];
19290
- var _e = useState(null), selectedRowTagId = _e[0], setSelectedRowTagId = _e[1];
19291
- var _f = useState(null), viewTagForDelete = _f[0], setViewTagForDelete = _f[1];
19292
- var _g = useChartOptions(), chartOptions = _g[0], setChartOptions = _g[1];
19293
- var _h = useState({
19294
- labels: [],
19295
- datasets: [],
19296
- }), chartData = _h[0], setChartData = _h[1];
19297
- var _j = useState(null), cursorData = _j[0], setCursorData = _j[1];
19298
- var handleRightClick = function (event, tagId) {
19299
- event.preventDefault();
19300
- event.stopPropagation(); // Prevent the click event from propagating to the document
19301
- if (isNumber(tagId)) {
19302
- setViewTagForDelete(viewTags[tagId].viewTag);
19303
- }
19304
- else {
19305
- setViewTagForDelete(null);
19306
- }
19307
- setSelectedRowTagId(tagId);
19308
- };
19309
- var _k = useSearchSeries({
19310
- start: state.timeScopeStart.getTime(),
19311
- end: state.timeScopeEnd.getTime(),
19312
- tagIds: Object.values(viewTags).map(function (tag) { return tag.viewTag.TagId; }),
19313
- autoRefresh: autoRefresh,
19314
- }), series = _k.data, seriesLoading = _k.isLoading; _k.isError; _k.error; _k.isSuccess;
19315
- return (React__default.createElement(React__default.Fragment, null,
19316
- React__default.createElement(Grid2, { container: true, style: { width: "95svw", height: "88svh", margin: 0 } },
19317
- React__default.createElement(Header, { setChartOptions: setChartOptions, autoRefresh: autoRefresh, setAutoRefresh: setAutoRefresh }),
19318
- React__default.createElement(Grid2, { size: { md: 12 } },
19319
- React__default.createElement(Divider, { style: { margin: "10px 0 20px" } })),
19320
- React__default.createElement(Grid2, { size: { xs: 12 }, style: { height: "45%" } },
19321
- React__default.createElement(TrendingChart, { series: series !== null && series !== void 0 ? series : [], chartData: chartData, setChartData: setChartData, chartOptions: chartOptions, setChartOptions: setChartOptions, setCursorData: setCursorData })),
19322
- React__default.createElement(Grid2, { container: true, size: { xs: 12 }, onContextMenu: function (e) { return handleRightClick(e, null); }, style: {
19323
- height: "40%",
19324
- minWidth: "100%",
19325
- borderRadius: 10,
19326
- margin: "10px 0 10px",
19327
- position: seriesLoading ? "relative" : "inherit",
19328
- } },
19329
- seriesLoading && (React__default.createElement("div", { style: {
19330
- position: "absolute",
19331
- top: 0,
19332
- left: 0,
19333
- width: "100%",
19334
- height: "100%",
19335
- background: "rgba(255, 255, 255, 0.7)", // fondo semitransparente
19336
- display: "flex", // Centra el CircularProgress
19337
- justifyContent: "center", // Centra horizontalmente
19338
- alignItems: "center", // Centra verticalmente
19339
- zIndex: 2,
19340
- } },
19341
- React__default.createElement(CircularProgress, { size: "2rem" }))),
19342
- React__default.createElement(TableComponent, { chartData: chartData, cursorData: cursorData, viewTagForDelete: viewTagForDelete, setViewTagForDelete: setViewTagForDelete, selectedRowTagId: selectedRowTagId, setSelectedRowTagId: setSelectedRowTagId }))),
19343
- React__default.createElement(ErrorModal, { error: error, onHide: function () { return setError(""); }, title: "ERROR" })));
19344
- });
19345
- Trending.displayName = "Trending";
19346
-
19347
- // @flow
19348
- var TrendingsPage = function () {
19349
- var _a = useState(false), autoRefresh = _a[0], setAutoRefresh = _a[1];
19350
- var _b = useState(""), error = _b[0], setError = _b[1];
19351
- var _c = useState(null), viewId = _c[0], setViewId = _c[1];
19352
- var _d = useTrendingContext(), viewSelected = _d.state.viewSelected, _e = _d.actions, setViews = _e.setViews, setViewTagsAndRefetch = _e.setViewTagsAndRefetch, setViewSelected = _e.setViewSelected;
19353
- var _f = useSearchViews({ autoRefresh: autoRefresh }), views = _f.data; _f.isLoading; var viewsIsError = _f.isError, viewsError = _f.error, viewSuccess = _f.isSuccess;
19354
- var _g = useSearchViewTags({ viewId: viewId }), viewTags = _g.data; _g.isLoading; var viewTagsIsError = _g.isError, viewTagsError = _g.error, viewTagsSuccess = _g.isSuccess;
19355
- useEffect(function () {
19356
- var lastCreated;
19357
- if (!viewSelected) {
19358
- if (!views)
19359
- return;
19360
- setViews(views);
19361
- lastCreated = views.reduce(function (prev, current) {
19362
- return prev && prev.ViewId > current.ViewId ? prev : current;
19363
- }, null);
19364
- setViewId(lastCreated.ViewId);
19365
- //viewSelected
19366
- setViewSelected(lastCreated);
16561
+ mergedTags[backendTag.TagId] = {
16562
+ viewTag: backendTag,
16563
+ order: maxOrder + 1,
16564
+ };
16565
+ }
16566
+ });
19367
16567
  }
19368
16568
  else {
19369
- lastCreated = viewSelected;
19370
- setViewId(lastCreated.ViewId);
19371
- }
19372
- }, [viewSuccess]);
19373
- useEffect(function () {
19374
- if (viewTags) {
19375
- if (!viewTags)
19376
- return;
19377
- 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) {
19378
16571
  if (isNil(curr.Color)) {
19379
16572
  curr.Color = getRandomColor();
19380
16573
  }
@@ -19384,25 +16577,128 @@ var TrendingsPage = function () {
19384
16577
  };
19385
16578
  return carr;
19386
16579
  }, {});
19387
- setViewTagsAndRefetch(vTags);
19388
16580
  }
19389
- }, [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
19390
16619
  useEffect(function () {
19391
16620
  if (viewTagsError && viewTagsIsError) {
19392
- setError(viewTagsError.message);
16621
+ setError(viewTagsError instanceof Error
16622
+ ? viewTagsError.message
16623
+ : String(viewTagsError));
19393
16624
  }
19394
16625
  if (viewsError && viewsIsError) {
19395
- 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));
19396
16632
  }
19397
- }, [viewsError, viewsIsError, viewTagsError, viewTagsIsError]);
16633
+ }, [
16634
+ viewsError,
16635
+ viewsIsError,
16636
+ viewTagsError,
16637
+ viewTagsIsError,
16638
+ seriesError,
16639
+ seriesIsError,
16640
+ ]);
16641
+ var isLoading = viewsLoading || viewTagsLoading;
19398
16642
  return (React__default.createElement(React__default.Fragment, null,
19399
- React__default.createElement(HelmetDexteel, { title: "Trending Chart" }),
19400
- React__default.createElement(Grid2, { style: { padding: "20px", justifyContent: "center", display: "flex" } },
19401
- 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)))))),
19402
16698
  React__default.createElement(ErrorModal, { error: error, onHide: function () { return setError(""); }, size: "xl", title: "ERROR" })));
19403
16699
  };
19404
16700
 
19405
- var index = function () {
16701
+ var TrendingsV2Index = function () {
19406
16702
  var _a = useState(false), ihPathLoaded = _a[0], setIhPathLoaded = _a[1];
19407
16703
  useEffect(function () {
19408
16704
  var getIhPath = function () { return __awaiter(void 0, void 0, void 0, function () {
@@ -19418,15 +16714,13 @@ var index = function () {
19418
16714
  }
19419
16715
  });
19420
16716
  }); };
19421
- getIhPath().then(function () {
19422
- console.log("ih path loaded");
19423
- });
16717
+ getIhPath();
19424
16718
  }, []);
19425
16719
  if (!ihPathLoaded) {
19426
16720
  return (React__default.createElement("div", { className: "d-flex justify-content-center align-items-center" }, "Loading..."));
19427
16721
  }
19428
- return (React__default.createElement(TrendingProvider, null,
19429
- React__default.createElement(TrendingsPage, null)));
16722
+ return (React__default.createElement(TrendingProviderV2, null,
16723
+ React__default.createElement(TrendingsPageV2, null)));
19430
16724
  };
19431
16725
 
19432
16726
  var MESFMainRouter = function () {
@@ -19438,7 +16732,6 @@ var MESFMainRouter = function () {
19438
16732
  React__default.createElement(Route, { path: "/", element: React__default.createElement(Navigate, { replace: true, to: "/home" }) }),
19439
16733
  canShowSettings && (React__default.createElement(Route, { path: "/configuration/*", element: React__default.createElement(Configuration, null) })),
19440
16734
  React__default.createElement(Route, { path: "/account", element: React__default.createElement(Account, null) }),
19441
- React__default.createElement(Route, { path: "/trendings", element: React__default.createElement(index, null) }),
19442
16735
  React__default.createElement(Route, { path: "/trendings-v2", element: React__default.createElement(TrendingsV2Index, null) }),
19443
16736
  React__default.createElement(Route, { path: "/home", element: React__default.createElement(Home, null) })),
19444
16737
  React__default.createElement(CustomRoutes, null)));
@@ -19448,8 +16741,8 @@ var MESFMainContainer = function () { return (React__default.createElement("div"
19448
16741
  React__default.createElement(MESFMainRouter, null))); };
19449
16742
 
19450
16743
  var Navigation = function (_a) {
19451
- 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;
19452
- 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];
19453
16746
  var mounted = useRef(true);
19454
16747
  var location = useLocation();
19455
16748
  useEffect(function () {
@@ -19468,7 +16761,7 @@ var Navigation = function (_a) {
19468
16761
  return location.pathname.startsWith(route);
19469
16762
  });
19470
16763
  return (React__default.createElement("div", { className: "wrapper" },
19471
- !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 })),
19472
16765
  React__default.createElement(MESFMainContainer, null)));
19473
16766
  };
19474
16767
 
@@ -19500,7 +16793,7 @@ var queryClient = new QueryClient({
19500
16793
  },
19501
16794
  });
19502
16795
  function MESFMain(_a) {
19503
- 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;
19504
16797
  return (React__default.createElement(React__default.Fragment, null,
19505
16798
  React__default.createElement(CssBaseline, null),
19506
16799
  React__default.createElement(StyledEngineProvider, { injectFirst: true },
@@ -19523,7 +16816,7 @@ function MESFMain(_a) {
19523
16816
  React__default.createElement(BrowserRouter, { basename: base },
19524
16817
  React__default.createElement(Routes, null,
19525
16818
  React__default.createElement(Route, { path: "/logout", element: React__default.createElement(Logout, null) })),
19526
- 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 })))))))))))))))))))));
19527
16820
  }
19528
16821
 
19529
16822
  var ExcelButton = function (_a) {
@@ -21604,6 +18897,7 @@ var useEntriesReport$1 = function (_a) {
21604
18897
  return useQuery({
21605
18898
  queryKey: ["entriesReport", startShiftId, endShiftId, assetId],
21606
18899
  queryFn: function () { return getEntriesReport$1({ startShiftId: startShiftId, endShiftId: endShiftId, assetId: assetId }); },
18900
+ enabled: !!startShiftId && !!endShiftId && !!assetId,
21607
18901
  });
21608
18902
  };
21609
18903
  var routeLogbookReport = "/logbook/report";
@@ -21923,7 +19217,7 @@ var Logbook$2 = function () {
21923
19217
  startShiftId: shiftPeriod.StartShiftId,
21924
19218
  endShiftId: shiftPeriod.EndShiftId,
21925
19219
  assetId: assetId,
21926
- }), 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;
21927
19221
  var columnDefs = useTableData$2({
21928
19222
  showAttachments: showAttachments,
21929
19223
  showAsset: showAsset,
@@ -22045,16 +19339,6 @@ var Logbook$2 = function () {
22045
19339
  if (shiftPeriod.StartShiftId !== null || shiftPeriod.EndShiftId !== null) {
22046
19340
  setShow("");
22047
19341
  setSelectedRowData(null);
22048
- (function () { return __awaiter(void 0, void 0, void 0, function () {
22049
- return __generator(this, function (_a) {
22050
- switch (_a.label) {
22051
- case 0: return [4 /*yield*/, refetch()];
22052
- case 1:
22053
- _a.sent();
22054
- return [2 /*return*/];
22055
- }
22056
- });
22057
- }); })();
22058
19342
  }
22059
19343
  }, [shiftPeriod.StartShiftId, shiftPeriod.EndShiftId]);
22060
19344
  return (React__default.createElement(Box, { sx: {
@@ -25000,5 +22284,5 @@ var areaSelector = /*#__PURE__*/Object.freeze({
25000
22284
  AreaSelector: AreaSelector
25001
22285
  });
25002
22286
 
25003
- 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 };
25004
22288
  //# sourceMappingURL=index.esm.js.map