@dexteel/mesf-core 7.7.0 → 7.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,3 +1,3 @@
1
1
  {
2
- ".": "7.7.0"
2
+ ".": "7.8.0"
3
3
  }
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # Changelog
2
2
 
3
+ ## [7.8.0](https://github.com/dexteel/mesf-core-frontend/compare/@dexteel/mesf-core-v7.7.0...@dexteel/mesf-core-v7.8.0) (2025-12-22)
4
+
5
+
6
+ ### Features
7
+
8
+ * **Trendings V2:** auto-scroll, select, and toast on tag search result click in Tags Tree V2 ([5b869fb](https://github.com/dexteel/mesf-core-frontend/commit/5b869fb6ef38b7f4f7ad8e9b8c101db774970b52))
9
+
10
+
11
+ ### Bug Fixes
12
+
13
+ * **Trendings V2:** Fix wiping of views when saving ([33ca2d4](https://github.com/dexteel/mesf-core-frontend/commit/33ca2d413b4adddc48692f93eb1f3804339a9bc3))
14
+
3
15
  ## [7.7.0](https://github.com/dexteel/mesf-core-frontend/compare/@dexteel/mesf-core-v7.6.0...@dexteel/mesf-core-v7.7.0) (2025-12-22)
4
16
 
5
17
 
package/dist/index.esm.js CHANGED
@@ -12062,7 +12062,7 @@ var getViewTags = function (ViewId) { return __awaiter(void 0, void 0, void 0, f
12062
12062
  }); };
12063
12063
  var upsertViewTag = function (_a) { return __awaiter(void 0, [_a], void 0, function (_b) {
12064
12064
  var apiService, parameters, resp;
12065
- var viewId = _b.viewId, tagId = _b.tagId, color = _b.color, minScale = _b.minScale, maxScale = _b.maxScale, isVisible = _b.isVisible, isAutoScale = _b.isAutoScale, unit = _b.unit;
12065
+ var viewId = _b.viewId, tagId = _b.tagId, color = _b.color, minScale = _b.minScale, maxScale = _b.maxScale, isVisible = _b.isVisible, isAutoScale = _b.isAutoScale, unit = _b.unit; _b.order; _b.alias; _b.tagType; _b.sourceTagId; _b.bitIndex;
12066
12066
  return __generator(this, function (_c) {
12067
12067
  switch (_c.label) {
12068
12068
  case 0:
@@ -12158,6 +12158,37 @@ var ConfirmationDialogRaw = function (_a) {
12158
12158
  React__default.createElement(Button, { variant: "contained", size: "small", color: "primary", onClick: handleOk }, "Ok")))));
12159
12159
  };
12160
12160
 
12161
+ var STORAGE_PREFIX = "mesf_trending_view_v2_";
12162
+ var saveViewToLocal = function (viewId, viewTags) {
12163
+ try {
12164
+ var key = "".concat(STORAGE_PREFIX).concat(viewId);
12165
+ localStorage.setItem(key, JSON.stringify(viewTags));
12166
+ }
12167
+ catch (e) {
12168
+ console.error("Failed to save view to local storage", e);
12169
+ }
12170
+ };
12171
+ var getViewFromLocal = function (viewId) {
12172
+ try {
12173
+ var key = "".concat(STORAGE_PREFIX).concat(viewId);
12174
+ var data = localStorage.getItem(key);
12175
+ return data ? JSON.parse(data) : null;
12176
+ }
12177
+ catch (e) {
12178
+ console.error("Failed to load view from local storage", e);
12179
+ return null;
12180
+ }
12181
+ };
12182
+ var removeViewFromLocal = function (viewId) {
12183
+ try {
12184
+ var key = "".concat(STORAGE_PREFIX).concat(viewId);
12185
+ localStorage.removeItem(key);
12186
+ }
12187
+ catch (e) {
12188
+ console.error("Failed to remove view from local storage", e);
12189
+ }
12190
+ };
12191
+
12161
12192
  var SaveUpdateDeleteViewModalV2 = function (_a) {
12162
12193
  var _b, _c, _d;
12163
12194
  var open = _a.open, mode = _a.mode, handleClose = _a.handleClose, view = _a.view;
@@ -12195,7 +12226,7 @@ var SaveUpdateDeleteViewModalV2 = function (_a) {
12195
12226
  };
12196
12227
  var updateViewTag = useMutation({
12197
12228
  mutationFn: function (_a) {
12198
- var viewId = _a.viewId, tagId = _a.tagId, color = _a.color, minScale = _a.minScale, maxScale = _a.maxScale, isVisible = _a.isVisible, isAutoScale = _a.isAutoScale, unit = _a.unit;
12229
+ var viewId = _a.viewId, tagId = _a.tagId, color = _a.color, minScale = _a.minScale, maxScale = _a.maxScale, isVisible = _a.isVisible, isAutoScale = _a.isAutoScale, unit = _a.unit, order = _a.order, alias = _a.alias, tagType = _a.tagType, sourceTagId = _a.sourceTagId, bitIndex = _a.bitIndex;
12199
12230
  return upsertViewTag({
12200
12231
  viewId: viewId,
12201
12232
  tagId: tagId,
@@ -12205,6 +12236,11 @@ var SaveUpdateDeleteViewModalV2 = function (_a) {
12205
12236
  isVisible: isVisible,
12206
12237
  isAutoScale: isAutoScale,
12207
12238
  unit: unit,
12239
+ order: order,
12240
+ alias: alias,
12241
+ tagType: tagType,
12242
+ sourceTagId: sourceTagId,
12243
+ bitIndex: bitIndex,
12208
12244
  });
12209
12245
  },
12210
12246
  onError: function (error) {
@@ -12217,6 +12253,12 @@ var SaveUpdateDeleteViewModalV2 = function (_a) {
12217
12253
  return __generator(this, function (_a) {
12218
12254
  switch (_a.label) {
12219
12255
  case 0:
12256
+ if (view === null || view === void 0 ? void 0 : view.ViewId) {
12257
+ removeViewFromLocal(view.ViewId);
12258
+ }
12259
+ else if (viewSelected === null || viewSelected === void 0 ? void 0 : viewSelected.ViewId) {
12260
+ removeViewFromLocal(viewSelected.ViewId);
12261
+ }
12220
12262
  setSnackbarMessage("The view was deleted successfully");
12221
12263
  setSnackbarOpen(true);
12222
12264
  return [4 /*yield*/, queryClient.invalidateQueries({ queryKey: ["views-v2"] })];
@@ -12239,31 +12281,43 @@ var SaveUpdateDeleteViewModalV2 = function (_a) {
12239
12281
  });
12240
12282
  }); },
12241
12283
  onSuccess: function (viewId) { return __awaiter(void 0, void 0, void 0, function () {
12242
- var results, failed;
12284
+ var backendTags, results, failed;
12243
12285
  return __generator(this, function (_a) {
12244
12286
  switch (_a.label) {
12245
- case 0: return [4 /*yield*/, Promise.allSettled(Object.values(viewTags)
12246
- .sort(function (a, b) { return a.order - b.order; })
12247
- .map(function (_a) { return __awaiter(void 0, [_a], void 0, function (_b) {
12248
- var viewTag = _b.viewTag;
12249
- return __generator(this, function (_c) {
12250
- switch (_c.label) {
12251
- case 0: return [4 /*yield*/, updateViewTag.mutate({
12252
- viewId: viewId,
12253
- tagId: viewTag.TagId,
12254
- color: viewTag.Color,
12255
- minScale: viewTag.MinScale,
12256
- maxScale: viewTag.MaxScale,
12257
- isVisible: viewTag.IsVisible,
12258
- isAutoScale: viewTag.IsAutoScale,
12259
- unit: viewTag.Unit,
12260
- })];
12261
- case 1:
12262
- _c.sent();
12263
- return [2 /*return*/];
12264
- }
12265
- });
12266
- }); }))];
12287
+ case 0:
12288
+ // Save complete state to local storage (metadata + virtual tags)
12289
+ saveViewToLocal(viewId, viewTags);
12290
+ backendTags = Object.values(viewTags).filter(function (_a) {
12291
+ var viewTag = _a.viewTag;
12292
+ return !viewTag.IsBitExtracted;
12293
+ });
12294
+ return [4 /*yield*/, Promise.allSettled(backendTags
12295
+ .sort(function (a, b) { return a.order - b.order; })
12296
+ .map(function (_a) { return __awaiter(void 0, [_a], void 0, function (_b) {
12297
+ var viewTag = _b.viewTag, order = _b.order;
12298
+ return __generator(this, function (_c) {
12299
+ switch (_c.label) {
12300
+ case 0: return [4 /*yield*/, updateViewTag.mutateAsync({
12301
+ viewId: viewId,
12302
+ tagId: viewTag.TagId,
12303
+ color: viewTag.Color,
12304
+ minScale: viewTag.MinScale,
12305
+ maxScale: viewTag.MaxScale,
12306
+ isVisible: viewTag.IsVisible,
12307
+ isAutoScale: viewTag.IsAutoScale,
12308
+ unit: viewTag.Unit,
12309
+ order: order,
12310
+ alias: viewTag.Alias,
12311
+ tagType: viewTag.TagType,
12312
+ sourceTagId: viewTag.SourceTagId,
12313
+ bitIndex: viewTag.BitIndex,
12314
+ })];
12315
+ case 1:
12316
+ _c.sent();
12317
+ return [2 /*return*/];
12318
+ }
12319
+ });
12320
+ }); }))];
12267
12321
  case 1:
12268
12322
  results = _a.sent();
12269
12323
  failed = results.filter(function (r) { return r.status === "rejected"; });
@@ -12301,7 +12355,7 @@ var SaveUpdateDeleteViewModalV2 = function (_a) {
12301
12355
  setIsSubmitLoading(true);
12302
12356
  viewToDelete = view || viewSelected;
12303
12357
  if (!!isNil(viewToDelete)) return [3 /*break*/, 2];
12304
- return [4 /*yield*/, removeView.mutate(viewToDelete.ViewId)];
12358
+ return [4 /*yield*/, removeView.mutateAsync(viewToDelete.ViewId)];
12305
12359
  case 1:
12306
12360
  _a.sent();
12307
12361
  _a.label = 2;
@@ -12892,6 +12946,22 @@ var ColorPickerV2 = function (_a) {
12892
12946
  } }, tagColors.map(function (tagColor) { return (React__default.createElement(ColorSwatch, { key: tagColor, color: tagColor, onSelect: handleColorSelect })); })))));
12893
12947
  };
12894
12948
 
12949
+ var NotificationSnackBar = function (_a) {
12950
+ var message = _a.message, _b = _a.onHide, onHide = _b === void 0 ? function () { } : _b, _c = _a.severity, severity = _c === void 0 ? "success" : _c;
12951
+ var handleClose = function (event, reason) {
12952
+ if (reason === "clickaway") {
12953
+ return;
12954
+ }
12955
+ onHide();
12956
+ };
12957
+ var _d = useState(true), open = _d[0], setOpen = _d[1];
12958
+ useEffect(function () {
12959
+ setOpen(!!message);
12960
+ }, [message]);
12961
+ return (React__default.createElement(Snackbar, { open: open, autoHideDuration: 2500, onClose: handleClose, anchorOrigin: { vertical: "bottom", horizontal: "center" } },
12962
+ React__default.createElement(Alert$3, { elevation: 6, variant: "filled", severity: severity, onClose: handleClose }, message)));
12963
+ };
12964
+
12895
12965
  var NewFolderModal = function (_a) {
12896
12966
  var open = _a.open, handleClose = _a.handleClose, tagNodeSelectedInTree = _a.tagNodeSelectedInTree;
12897
12967
  var _b = useState(), name = _b[0], setName = _b[1];
@@ -13129,7 +13199,7 @@ var TagFolderCustomNodeV2 = function (_a) {
13129
13199
  (_a = containerRef.current) === null || _a === void 0 ? void 0 : _a.removeEventListener("contextmenu", handleContextMenu);
13130
13200
  };
13131
13201
  }, []);
13132
- return (React__default.createElement(Box, { onClick: onClickHandler, sx: {
13202
+ return (React__default.createElement(Box, { "data-node-id": node.id, onClick: onClickHandler, sx: {
13133
13203
  paddingInlineStart: depth * 2,
13134
13204
  cursor: "pointer",
13135
13205
  alignItems: "center",
@@ -13410,13 +13480,14 @@ var TagsTreeModalV2 = function (_a) {
13410
13480
  var open = _a.open, handleClose = _a.handleClose, onTagSelect = _a.onTagSelect;
13411
13481
  var _b = useState(false), isLoading = _b[0], setIsLoading = _b[1];
13412
13482
  var _c = useState(""), error = _c[0], setError = _c[1];
13413
- var _d = useState([]), tagsTreeData = _d[0], setTagsTreeData = _d[1];
13414
- var _e = useState(null), tagNodeSelectedInTree = _e[0], setTagNodeSelectedInTree = _e[1];
13415
- var _f = useState(null), anchorPoint = _f[0], setAnchorPoint = _f[1];
13416
- var _g = useState(false), showContextMenu = _g[0], setShowContextMenu = _g[1];
13483
+ var _d = useState(null), snackbarMessage = _d[0], setSnackbarMessage = _d[1];
13484
+ var _e = useState([]), tagsTreeData = _e[0], setTagsTreeData = _e[1];
13485
+ var _f = useState(null), tagNodeSelectedInTree = _f[0], setTagNodeSelectedInTree = _f[1];
13486
+ var _g = useState(null), anchorPoint = _g[0], setAnchorPoint = _g[1];
13487
+ var _h = useState(false), showContextMenu = _h[0], setShowContextMenu = _h[1];
13417
13488
  var backendOffset = 1000000;
13418
- var _h = useState({}), openTagFolders = _h[0], setOpenTagFolders = _h[1];
13419
- var _j = useState([]), selectedNodes = _j[0], setSelectedNodes = _j[1];
13489
+ var _j = useState({}), openTagFolders = _j[0], setOpenTagFolders = _j[1];
13490
+ var _k = useState([]), selectedNodes = _k[0], setSelectedNodes = _k[1];
13420
13491
  var handleContextMenu = function (data, e) {
13421
13492
  e.preventDefault();
13422
13493
  var top = e.clientY;
@@ -13429,7 +13500,7 @@ var TagsTreeModalV2 = function (_a) {
13429
13500
  setTagNodeSelectedInTree(selectedNode);
13430
13501
  }
13431
13502
  };
13432
- var _k = useSearchTagsTree$1(), tagsTree = _k.data, tagsTreeLoading = _k.isLoading, tagsTreeIsError = _k.isError, tagsTreeError = _k.error, tagsTreeIsSuccess = _k.isSuccess, tagsTreeIsFetched = _k.isFetched, refetch = _k.refetch;
13503
+ 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;
13433
13504
  var updateTagFolder = useMutation({
13434
13505
  mutationFn: function (_a) {
13435
13506
  var tagFolderId = _a.tagFolderId, parentTagFolderId = _a.parentTagFolderId, tagFolderName = _a.tagFolderName, isActive = _a.isActive;
@@ -13528,6 +13599,10 @@ var TagsTreeModalV2 = function (_a) {
13528
13599
  });
13529
13600
  setOpenTagFolders(newOpenTagFolders);
13530
13601
  setSelectedNodes([result.node]);
13602
+ if (result.node.data && result.node.data.TagTypeCode !== "F") {
13603
+ onTagSelect(result.node.data);
13604
+ setSnackbarMessage("Tag \"".concat(result.node.data.TagName, "\" added"));
13605
+ }
13531
13606
  // Scroll to the node after expansion
13532
13607
  setTimeout(function () {
13533
13608
  var nodeElement = document.querySelector("[data-node-id=\"".concat(result.id, "\"]"));
@@ -13615,7 +13690,8 @@ var TagsTreeModalV2 = function (_a) {
13615
13690
  return (React__default.createElement(TagFolderCustomNodeV2, { setContextMenuOver: handleContextMenu, node: node, options: options, isSelected: selected, openTagFolders: openTagFolders, setOpenTagFolders: setOpenTagFolders, handleSelect: handleClick }));
13616
13691
  }, dragPreviewRender: function (monitorProps) { return React__default.createElement(CustomDragPreview, { monitorProps: monitorProps }); } })))))),
13617
13692
  React__default.createElement(ContextMenu, { anchorPoint: anchorPoint, isOpen: showContextMenu, setShowContextMenu: setShowContextMenu, tagNodeSelectedInTree: tagNodeSelectedInTree, getTagsTreeData: function () { return refetch(); } }),
13618
- React__default.createElement(ErrorModal, { error: error, onHide: function () { return setError(""); } })))));
13693
+ React__default.createElement(ErrorModal, { error: error, onHide: function () { return setError(""); } }),
13694
+ React__default.createElement(NotificationSnackBar, { message: snackbarMessage, onHide: function () { return setSnackbarMessage(null); } })))));
13619
13695
  };
13620
13696
 
13621
13697
  var BitSelectorModal = function (_a) {
@@ -13962,20 +14038,31 @@ var TagsTableV2 = function () {
13962
14038
  var viewId = _a.viewId, viewName = _a.viewName, isPublic = _a.isPublic;
13963
14039
  return upsertView({ viewId: viewId, viewName: viewName, isPublic: isPublic });
13964
14040
  },
13965
- onSuccess: function () { return __awaiter(void 0, void 0, void 0, function () {
13966
- var results, failed;
14041
+ onSuccess: function (viewId) { return __awaiter(void 0, void 0, void 0, function () {
14042
+ var backendTags, results, failed;
13967
14043
  var _a;
13968
14044
  return __generator(this, function (_b) {
13969
14045
  switch (_b.label) {
13970
- case 0: return [4 /*yield*/, deleteAllViewTags.mutate((_a = viewSelected === null || viewSelected === void 0 ? void 0 : viewSelected.ViewId) !== null && _a !== void 0 ? _a : 0)];
14046
+ case 0:
14047
+ // Save complete state to local storage (metadata + virtual tags)
14048
+ if (viewSelected === null || viewSelected === void 0 ? void 0 : viewSelected.ViewId) {
14049
+ saveViewToLocal(viewSelected.ViewId, viewTags);
14050
+ }
14051
+ // Wait for delete to finish before inserting new tags
14052
+ return [4 /*yield*/, deleteAllViewTags.mutateAsync((_a = viewSelected === null || viewSelected === void 0 ? void 0 : viewSelected.ViewId) !== null && _a !== void 0 ? _a : 0)];
13971
14053
  case 1:
14054
+ // Wait for delete to finish before inserting new tags
13972
14055
  _b.sent();
13973
- return [4 /*yield*/, Promise.allSettled(Object.values(viewTags)
14056
+ backendTags = Object.values(viewTags).filter(function (_a) {
14057
+ var viewTag = _a.viewTag;
14058
+ return !viewTag.IsBitExtracted;
14059
+ });
14060
+ return [4 /*yield*/, Promise.allSettled(backendTags
13974
14061
  .sort(function (a, b) { return b.order - a.order; })
13975
14062
  .map(function (_a) {
13976
14063
  var _b;
13977
- var viewTag = _a.viewTag;
13978
- return upsertViewTag({
14064
+ var viewTag = _a.viewTag, order = _a.order;
14065
+ return updateViewTag.mutateAsync({
13979
14066
  viewId: (_b = viewSelected === null || viewSelected === void 0 ? void 0 : viewSelected.ViewId) !== null && _b !== void 0 ? _b : 0,
13980
14067
  tagId: viewTag.TagId,
13981
14068
  color: viewTag.Color,
@@ -13984,6 +14071,11 @@ var TagsTableV2 = function () {
13984
14071
  isVisible: viewTag.IsVisible,
13985
14072
  isAutoScale: viewTag.IsAutoScale,
13986
14073
  unit: viewTag.Unit,
14074
+ order: order,
14075
+ alias: viewTag.Alias,
14076
+ tagType: viewTag.TagType,
14077
+ sourceTagId: viewTag.SourceTagId,
14078
+ bitIndex: viewTag.BitIndex,
13987
14079
  });
13988
14080
  }))];
13989
14081
  case 2:
@@ -14005,7 +14097,7 @@ var TagsTableV2 = function () {
14005
14097
  });
14006
14098
  var updateViewTag = useMutation({
14007
14099
  mutationFn: function (_a) {
14008
- var viewId = _a.viewId, tagId = _a.tagId, color = _a.color, minScale = _a.minScale, maxScale = _a.maxScale, isVisible = _a.isVisible, isAutoScale = _a.isAutoScale, unit = _a.unit;
14100
+ var viewId = _a.viewId, tagId = _a.tagId, color = _a.color, minScale = _a.minScale, maxScale = _a.maxScale, isVisible = _a.isVisible, isAutoScale = _a.isAutoScale, unit = _a.unit, order = _a.order, alias = _a.alias, tagType = _a.tagType, sourceTagId = _a.sourceTagId, bitIndex = _a.bitIndex;
14009
14101
  return upsertViewTag({
14010
14102
  viewId: viewId,
14011
14103
  tagId: tagId,
@@ -14015,6 +14107,11 @@ var TagsTableV2 = function () {
14015
14107
  isVisible: isVisible,
14016
14108
  isAutoScale: isAutoScale,
14017
14109
  unit: unit,
14110
+ order: order,
14111
+ alias: alias,
14112
+ tagType: tagType,
14113
+ sourceTagId: sourceTagId,
14114
+ bitIndex: bitIndex,
14018
14115
  });
14019
14116
  },
14020
14117
  onError: function (error) {
@@ -16313,26 +16410,70 @@ var TrendingsPageV2 = function () {
16313
16410
  // This preserves local order changes (from drag-and-drop) until a new view is loaded
16314
16411
  var loadedViewIdRef = useRef(null);
16315
16412
  useEffect(function () {
16316
- if (!viewTagsSuccess || !viewTagsData || !Array.isArray(viewTagsData))
16413
+ if (!viewTagsSuccess ||
16414
+ !viewTagsData ||
16415
+ !Array.isArray(viewTagsData) ||
16416
+ viewId === null)
16317
16417
  return;
16318
16418
  // Only reset viewTags when viewId actually changes (loading a different view)
16319
16419
  // Do NOT reset if viewId is the same (data is just refetching)
16320
16420
  if (viewId === loadedViewIdRef.current)
16321
16421
  return;
16322
16422
  loadedViewIdRef.current = viewId;
16323
- var vTags = viewTagsData.reduce(function (carr, curr, idx) {
16324
- if (isNil(curr.Color)) {
16325
- curr.Color = getRandomColor();
16326
- }
16327
- carr[curr.TagId] = {
16328
- viewTag: curr,
16329
- order: idx,
16330
- };
16331
- return carr;
16332
- }, {});
16423
+ var backendTags = viewTagsData;
16424
+ var localViewTags = getViewFromLocal(viewId);
16425
+ var mergedTags = {};
16426
+ if (localViewTags) {
16427
+ // If local storage exists, use it as the source of truth for metadata (Order, Alias)
16428
+ // and for virtual tags (Bit Extracted)
16429
+ var backendTagIds_1 = new Set(backendTags.map(function (t) { return t.TagId; }));
16430
+ // 1. Process local tags
16431
+ Object.values(localViewTags).forEach(function (entry) {
16432
+ var viewTag = entry.viewTag;
16433
+ // If it's a backend tag, check if it still exists in the backend response
16434
+ // (Permission check or tag deletion check)
16435
+ if (!viewTag.IsBitExtracted) {
16436
+ if (backendTagIds_1.has(viewTag.TagId)) {
16437
+ mergedTags[viewTag.TagId] = entry;
16438
+ }
16439
+ }
16440
+ else {
16441
+ // Virtual tags are always added from local storage
16442
+ mergedTags[viewTag.TagId] = entry;
16443
+ }
16444
+ });
16445
+ // 2. Add any new backend tags that might be missing from local storage
16446
+ // (Rare case, but possible if added by another user/session)
16447
+ backendTags.forEach(function (backendTag) {
16448
+ if (!mergedTags[backendTag.TagId]) {
16449
+ // Add with default order at the end
16450
+ var maxOrder = Math.max.apply(Math, __spreadArray(__spreadArray([], Object.values(mergedTags).map(function (t) { return t.order; }), false), [0], false));
16451
+ if (isNil(backendTag.Color)) {
16452
+ backendTag.Color = getRandomColor();
16453
+ }
16454
+ mergedTags[backendTag.TagId] = {
16455
+ viewTag: backendTag,
16456
+ order: maxOrder + 1,
16457
+ };
16458
+ }
16459
+ });
16460
+ }
16461
+ else {
16462
+ // No local storage -> Use backend tags with default ordering
16463
+ mergedTags = backendTags.reduce(function (carr, curr, idx) {
16464
+ if (isNil(curr.Color)) {
16465
+ curr.Color = getRandomColor();
16466
+ }
16467
+ carr[curr.TagId] = {
16468
+ viewTag: curr,
16469
+ order: idx,
16470
+ };
16471
+ return carr;
16472
+ }, {});
16473
+ }
16333
16474
  // Reset stable ref when loading new view
16334
16475
  stableTagIdsRef.current = [];
16335
- setViewTagsAndRefetch(vTags);
16476
+ setViewTagsAndRefetch(mergedTags);
16336
16477
  }, [viewTagsSuccess, viewTagsData, setViewTagsAndRefetch, viewId]);
16337
16478
  // Update context with calculated min/max values
16338
16479
  // Use ref to prevent infinite loop from object reference changes
@@ -19984,22 +20125,6 @@ var ShiftSelector = function (_a) {
19984
20125
  React__default.createElement(ErrorModal, { error: error, onHide: function () { return setError(""); }, title: "Error loading shifts" })));
19985
20126
  };
19986
20127
 
19987
- var NotificationSnackBar = function (_a) {
19988
- var message = _a.message, _b = _a.onHide, onHide = _b === void 0 ? function () { } : _b, _c = _a.severity, severity = _c === void 0 ? "success" : _c;
19989
- var handleClose = function (event, reason) {
19990
- if (reason === "clickaway") {
19991
- return;
19992
- }
19993
- onHide();
19994
- };
19995
- var _d = useState(true), open = _d[0], setOpen = _d[1];
19996
- useEffect(function () {
19997
- setOpen(!!message);
19998
- }, [message]);
19999
- return (React__default.createElement(Snackbar, { open: open, autoHideDuration: 2500, onClose: handleClose, anchorOrigin: { vertical: "bottom", horizontal: "center" } },
20000
- React__default.createElement(Alert$3, { elevation: 6, variant: "filled", severity: severity, onClose: handleClose }, message)));
20001
- };
20002
-
20003
20128
  var useEntrySubmission = function (_a) {
20004
20129
  var _b = _a === void 0 ? {} : _a, onSuccess = _b.onSuccess, onError = _b.onError, _c = _b.isNewEntry, isNewEntry = _c === void 0 ? false : _c, _d = _b.onHide, onHide = _d === void 0 ? function () { } : _d;
20005
20130
  var _e = useState(false), isSubmitLoading = _e[0], setIsSubmitLoading = _e[1];