@dexteel/mesf-core 7.16.1 → 7.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.esm.js CHANGED
@@ -1,7 +1,7 @@
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, Autocomplete, useMediaQuery, Drawer, Grid, Accordion, AccordionSummary, AccordionDetails, Tabs, Tab, ListSubheader, ListItemButton, 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, Autocomplete as Autocomplete$1, useMediaQuery, Drawer, Grid, Accordion, AccordionSummary, AccordionDetails, Tabs, Tab, 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';
@@ -11,7 +11,7 @@ import { createPart, themeMaterial, provideGlobalGridOptions } from 'ag-grid-com
11
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
- import { Alert as Alert$4, AlertTitle, Autocomplete as Autocomplete$1 } from '@mui/lab';
14
+ import { Alert as Alert$4, Autocomplete, AlertTitle } from '@mui/lab';
15
15
  import { Helmet, HelmetProvider } from 'react-helmet-async';
16
16
  import AccountTree from '@mui/icons-material/AccountTree';
17
17
  import Settings$1 from '@mui/icons-material/Settings';
@@ -2207,9 +2207,15 @@ const ModalTreeFilterControl = (props) => {
2207
2207
  } },
2208
2208
  allowSearch && (React__default.createElement(Grid2, { ref: searchContainerRef, style: {
2209
2209
  position: "sticky",
2210
- top: 0,
2210
+ top: -16,
2211
2211
  zIndex: 1000,
2212
2212
  backgroundColor: "#fff",
2213
+ paddingTop: 5,
2214
+ paddingBottom: 5,
2215
+ marginLeft: -24,
2216
+ marginRight: -24,
2217
+ paddingLeft: 24,
2218
+ paddingRight: 24,
2213
2219
  } },
2214
2220
  React__default.createElement(TextField, { sx: {
2215
2221
  marginBottom: 1,
@@ -5562,7 +5568,7 @@ const LongFilterPanel = (props) => {
5562
5568
  };
5563
5569
 
5564
5570
  const getShiftByParameters = (parameters) => __awaiter(void 0, void 0, void 0, function* () {
5565
- var _a;
5571
+ var _a, _b;
5566
5572
  const utcString = (_a = parameters.productionDate) === null || _a === void 0 ? void 0 : _a.toISOString();
5567
5573
  try {
5568
5574
  const sqlParameters = [];
@@ -5574,6 +5580,10 @@ const getShiftByParameters = (parameters) => __awaiter(void 0, void 0, void 0, f
5574
5580
  name: "@ProductionDate",
5575
5581
  value: utcString,
5576
5582
  });
5583
+ sqlParameters.push({
5584
+ name: "@AssetId",
5585
+ value: (_b = parameters.assetId) !== null && _b !== void 0 ? _b : null,
5586
+ });
5577
5587
  const apiService = new MESApiService();
5578
5588
  const resp = yield apiService.callV2("[MES].[GetShiftByParameters]", sqlParameters);
5579
5589
  if (resp.ok) {
@@ -5598,7 +5608,7 @@ const useShiftNavigatorManager = () => {
5598
5608
  const [shiftInfo, setShiftInfo] = useState(null);
5599
5609
  const [isShiftInfoLoading, setIsShiftInfoLoading] = useState(false);
5600
5610
  const [error, setError] = useState("");
5601
- const moveShift = (direction) => __awaiter(void 0, void 0, void 0, function* () {
5611
+ const moveShift = (direction, assetId) => __awaiter(void 0, void 0, void 0, function* () {
5602
5612
  if (isNil(shiftInfo)) {
5603
5613
  return;
5604
5614
  }
@@ -5617,6 +5627,7 @@ const useShiftNavigatorManager = () => {
5617
5627
  const resp = yield getShiftByParameters({
5618
5628
  productionDate: null,
5619
5629
  shiftId: shiftId,
5630
+ assetId,
5620
5631
  });
5621
5632
  if (resp.ok) {
5622
5633
  const shift = Object.assign(Object.assign({}, resp.data), { CurrentProductionDate: moment$f
@@ -5629,12 +5640,13 @@ const useShiftNavigatorManager = () => {
5629
5640
  }
5630
5641
  }
5631
5642
  });
5632
- const getShiftDataFromAPI = (productionDate, shiftId) => __awaiter(void 0, void 0, void 0, function* () {
5643
+ const getShiftDataFromAPI = (productionDate, shiftId, assetId) => __awaiter(void 0, void 0, void 0, function* () {
5633
5644
  setIsShiftInfoLoading(true);
5634
5645
  try {
5635
5646
  const resp = yield getShiftByParameters({
5636
5647
  productionDate: productionDate,
5637
5648
  shiftId: shiftId,
5649
+ assetId,
5638
5650
  });
5639
5651
  if (resp.ok) {
5640
5652
  const shift = Object.assign(Object.assign({}, resp.data), { CurrentProductionDate: moment$f
@@ -5651,10 +5663,11 @@ const useShiftNavigatorManager = () => {
5651
5663
  }
5652
5664
  setIsShiftInfoLoading(false);
5653
5665
  });
5654
- const initShiftNavigator = () => __awaiter(void 0, void 0, void 0, function* () {
5666
+ const initShiftNavigator = (assetId) => __awaiter(void 0, void 0, void 0, function* () {
5655
5667
  const resp = yield getShiftByParameters({
5656
5668
  productionDate: new Date(),
5657
5669
  shiftId: 0,
5670
+ assetId,
5658
5671
  });
5659
5672
  if (resp.ok) {
5660
5673
  const shift = Object.assign(Object.assign({}, resp.data), { CurrentProductionDate: moment$f
@@ -5717,7 +5730,7 @@ const ShiftNavigatorProvider = ({ children }) => {
5717
5730
 
5718
5731
  const ShiftDayNavigatorControl = (_a) => {
5719
5732
  var _b;
5720
- var { useRouter, onShiftChange, preventInit, withPaper = true, margin = "1rem 1rem 1rem 1rem" } = _a, props = __rest(_a, ["useRouter", "onShiftChange", "preventInit", "withPaper", "margin"]);
5733
+ var { useRouter, onShiftChange, preventInit, withPaper = true, margin = "1rem 1rem 1rem 1rem", assetId } = _a, props = __rest(_a, ["useRouter", "onShiftChange", "preventInit", "withPaper", "margin", "assetId"]);
5721
5734
  const { shiftInfo, initShiftNavigator, moveShift, getShiftDataFromAPI } = useShiftNavigator();
5722
5735
  const [shiftInfoCopy, setShiftInfoCopy] = useState(shiftInfo);
5723
5736
  const [error, setError] = useState("");
@@ -5769,12 +5782,12 @@ const ShiftDayNavigatorControl = (_a) => {
5769
5782
  return;
5770
5783
  }
5771
5784
  if (useRouter && shiftId) {
5772
- getShiftDataFromAPI(null, Number(shiftId)).then(() => {
5785
+ getShiftDataFromAPI(null, Number(shiftId), assetId).then(() => {
5773
5786
  onShiftChange && onShiftChange(Number(shiftId));
5774
5787
  });
5775
5788
  }
5776
5789
  else {
5777
- initShiftNavigator().then(() => {
5790
+ initShiftNavigator(assetId).then(() => {
5778
5791
  onShiftChange && onShiftChange(Number(shiftId));
5779
5792
  });
5780
5793
  }
@@ -5784,13 +5797,13 @@ const ShiftDayNavigatorControl = (_a) => {
5784
5797
  React__default.createElement(Grid2, { size: "auto" },
5785
5798
  React__default.createElement(Tooltip, { title: "Previous Shift" },
5786
5799
  React__default.createElement(IconButton$1, { "aria-label": "Previous Shift", color: "primary", disabled: !(shiftInfo === null || shiftInfo === void 0 ? void 0 : shiftInfo.PreviousShiftId), onClick: () => {
5787
- moveShift("Previous").then(() => { });
5800
+ moveShift("Previous", assetId).then(() => { });
5788
5801
  }, size: "small" },
5789
5802
  React__default.createElement(ArrowBackRounded, null)))),
5790
5803
  React__default.createElement(Grid2, { size: "auto" },
5791
5804
  React__default.createElement(DatePicker, { label: "Current Date", timezone: "UTC", format: "MM/DD/YYYY", maxDate: moment$g(), closeOnSelect: true, formatDensity: "dense", value: moment$g(shiftInfo === null || shiftInfo === void 0 ? void 0 : shiftInfo.CurrentProductionDate), onChange: (date) => {
5792
5805
  if (date) {
5793
- getShiftDataFromAPI(date.toDate(), 0).then(() => { });
5806
+ getShiftDataFromAPI(date.toDate(), 0, assetId).then(() => { });
5794
5807
  }
5795
5808
  }, slots: {
5796
5809
  textField: TextField,
@@ -5811,13 +5824,13 @@ const ShiftDayNavigatorControl = (_a) => {
5811
5824
  React__default.createElement(Grid2, { size: "auto" },
5812
5825
  React__default.createElement(Tooltip, { title: "Next Shift" },
5813
5826
  React__default.createElement(IconButton$1, { "aria-label": "next", color: "primary", disabled: !(shiftInfoCopy === null || shiftInfoCopy === void 0 ? void 0 : shiftInfoCopy.NextShiftId), onClick: () => {
5814
- moveShift("Next").then(() => { });
5827
+ moveShift("Next", assetId).then(() => { });
5815
5828
  }, size: "small" },
5816
5829
  React__default.createElement(ArrowForwardRounded, null)))),
5817
5830
  React__default.createElement(Grid2, null,
5818
5831
  React__default.createElement(Tooltip, { title: "Last Shift" },
5819
5832
  React__default.createElement(IconButton$1, { "aria-label": "delete", color: "primary", disabled: !(shiftInfoCopy === null || shiftInfoCopy === void 0 ? void 0 : shiftInfoCopy.LastShiftId) || !(shiftInfoCopy === null || shiftInfoCopy === void 0 ? void 0 : shiftInfoCopy.NextShiftId), onClick: () => {
5820
- moveShift("Last").then(() => { });
5833
+ moveShift("Last", assetId).then(() => { });
5821
5834
  }, size: "small" },
5822
5835
  React__default.createElement(SkipNext, null))))));
5823
5836
  return withPaper !== false ? React__default.createElement(Paper, null, gridContent) : gridContent;
@@ -6136,6 +6149,170 @@ const ShiftPeriodNavigatorControl = ({ value, actualPeriod, onChange, showShiftA
6136
6149
  React__default.createElement(SkipNextIcon, null)))));
6137
6150
  };
6138
6151
 
6152
+ const moment$e = getMomentTz();
6153
+ const getShifts = (params, signal) => __awaiter(void 0, void 0, void 0, function* () {
6154
+ var _a;
6155
+ const apiService = new MESApiService();
6156
+ const parameters = [
6157
+ {
6158
+ name: "ShiftId",
6159
+ value: (_a = params.shiftId) !== null && _a !== void 0 ? _a : null,
6160
+ },
6161
+ ];
6162
+ const resp = yield apiService.callV2(`[MES].[GetShiftByParameters]`, parameters, signal);
6163
+ if (resp.ok) {
6164
+ let rows = get(resp, "data.tables[0].rows", []);
6165
+ rows = rows.map((row) => {
6166
+ (row.CurrentProductionDate = moment$e
6167
+ .utc(row["CurrentProductionDate"])
6168
+ .toDate()),
6169
+ (row.CurrentStart = moment$e.utc(row["CurrentStart"]).toDate()),
6170
+ (row.CurrentEnd = moment$e.utc(row["CurrentEnd"]).toDate()),
6171
+ (row.PreviousProductionDate = moment$e
6172
+ .utc(row["PreviousProductionDate"])
6173
+ .toDate()),
6174
+ (row.PreviousStart = moment$e.utc(row["PreviousStart"]).toDate()),
6175
+ (row.PreviousEnd = moment$e.utc(row["PreviousEnd"]).toDate()),
6176
+ (row.NextProductionDate = moment$e
6177
+ .utc(row["NextProductionDate"])
6178
+ .toDate()),
6179
+ (row.NextStart = moment$e.utc(row["NextStart"]).toDate()),
6180
+ (row.NextEnd = moment$e.utc(row["NextEnd"]).toDate()),
6181
+ (row.LastProductionDate = moment$e
6182
+ .utc(row["LastProductionDate"])
6183
+ .toDate()),
6184
+ (row.LastStart = moment$e.utc(row["LastStart"]).toDate()),
6185
+ (row.LastEnd = moment$e.utc(row["LastEnd"]).toDate());
6186
+ return row;
6187
+ });
6188
+ return rows;
6189
+ }
6190
+ else {
6191
+ throw new Error(resp.message || "Error fetching shifts");
6192
+ }
6193
+ });
6194
+ const getShiftsByRange = (_a) => __awaiter(void 0, [_a], void 0, function* ({ shiftId, assetId, shiftsBefore, shiftsAfter, }) {
6195
+ const apiService = new MESApiService();
6196
+ const parameters = [
6197
+ { name: "ShiftId", value: shiftId !== null && shiftId !== void 0 ? shiftId : null },
6198
+ { name: "AssetId", value: assetId !== null && assetId !== void 0 ? assetId : null },
6199
+ ];
6200
+ if (shiftsBefore !== undefined) {
6201
+ parameters.push({ name: "ShiftsBefore", value: shiftsBefore });
6202
+ }
6203
+ if (shiftsAfter !== undefined) {
6204
+ parameters.push({ name: "ShiftsAfter", value: shiftsAfter });
6205
+ }
6206
+ const resp = yield apiService.callV2("[MES].[GetShiftsByRange]", parameters);
6207
+ if (resp.ok) {
6208
+ let rows = get(resp, "data.tables[0].rows", []);
6209
+ rows = rows.map((row) => (Object.assign(Object.assign({}, row), { Start: moment$e.utc(row.Start).toDate(), End: moment$e.utc(row.End).toDate() })));
6210
+ return rows;
6211
+ }
6212
+ else {
6213
+ throw new Error(resp.message || "Error fetching shifts by range");
6214
+ }
6215
+ });
6216
+ const getShiftsAroundCurrent = (_a) => __awaiter(void 0, [_a], void 0, function* ({ currentShiftId, shiftsRange, }) {
6217
+ const apiService = new MESApiService();
6218
+ const parameters = [
6219
+ { name: "CurrentShiftId", value: currentShiftId || null },
6220
+ ];
6221
+ if (shiftsRange) {
6222
+ parameters.push({ name: "ShiftsRange", value: shiftsRange });
6223
+ }
6224
+ const resp = yield apiService.callV2("[MES].[GetShiftsAroundCurrent]", parameters);
6225
+ if (resp.ok) {
6226
+ let rows = get(resp, "data.tables[0].rows", []);
6227
+ rows = rows.map((row) => (Object.assign(Object.assign({}, row), { Start: moment$e.utc(row.Start).toDate(), End: moment$e.utc(row.End).toDate() })));
6228
+ return rows;
6229
+ }
6230
+ else {
6231
+ throw new Error(resp.message || "Error fetching shifts");
6232
+ }
6233
+ });
6234
+
6235
+ const moment$d = getMomentTz();
6236
+ const useShiftsAroundCurrent = ({ currentShiftId, shiftsRange, enabled = true, }) => {
6237
+ return useQuery({
6238
+ queryKey: ["shiftsAroundCurrent", currentShiftId, shiftsRange],
6239
+ queryFn: ({ signal }) => getShiftsAroundCurrent({ currentShiftId, shiftsRange }),
6240
+ enabled,
6241
+ });
6242
+ };
6243
+ const useShiftsByRange = ({ shiftId, assetId, shiftsBefore, shiftsAfter, enabled = true, }) => {
6244
+ return useQuery({
6245
+ queryKey: ["shiftsByRange", shiftId, assetId, shiftsBefore, shiftsAfter],
6246
+ queryFn: () => getShiftsByRange({ shiftId, assetId, shiftsBefore, shiftsAfter }),
6247
+ enabled,
6248
+ });
6249
+ };
6250
+ const ShiftAutocomplete = ({ currentShiftId, value, onShiftSelected, disabled, shiftsRange, assetId, shiftsAfter, }) => {
6251
+ const [error, setError] = useState("");
6252
+ const useNewPath = assetId !== undefined;
6253
+ // Legacy path (existing consumers)
6254
+ const { data: legacyRows, isLoading: legacyLoading, error: legacyError, isError: legacyIsError, } = useShiftsAroundCurrent({
6255
+ currentShiftId,
6256
+ shiftsRange,
6257
+ enabled: !useNewPath,
6258
+ });
6259
+ // New path (asset-filtered, count-based)
6260
+ const { data: rangeRows, isLoading: rangeLoading, error: rangeError, isError: rangeIsError, } = useShiftsByRange({
6261
+ shiftId: currentShiftId,
6262
+ assetId,
6263
+ shiftsBefore: shiftsRange !== null && shiftsRange !== void 0 ? shiftsRange : 10,
6264
+ shiftsAfter: shiftsAfter !== null && shiftsAfter !== void 0 ? shiftsAfter : 0,
6265
+ enabled: useNewPath,
6266
+ });
6267
+ // Unified variables
6268
+ const rows = useNewPath ? rangeRows : legacyRows;
6269
+ const isLoading = useNewPath ? rangeLoading : legacyLoading;
6270
+ const e = useNewPath ? rangeError : legacyError;
6271
+ const isError = useNewPath ? rangeIsError : legacyIsError;
6272
+ const selectedShift = (rows === null || rows === void 0 ? void 0 : rows.find((type) => type.ShiftId === value)) || null;
6273
+ useEffect(() => {
6274
+ if (e && isError) {
6275
+ setError(e.message);
6276
+ }
6277
+ }, [e, isError]);
6278
+ return (React__default.createElement(React__default.Fragment, null,
6279
+ React__default.createElement(Grid2, { container: true },
6280
+ React__default.createElement(Grid2, { size: { xs: 12 } },
6281
+ React__default.createElement(Autocomplete, { loading: isLoading, options: rows || [], getOptionLabel: (option) => {
6282
+ return `${moment$d
6283
+ .utc(option.ProductionDate)
6284
+ .format("MM/DD/YYYY")} - ${option.Shift} - ${option.Crew}`;
6285
+ }, value: selectedShift, onChange: (event, newValue) => {
6286
+ if (newValue) {
6287
+ onShiftSelected(newValue);
6288
+ }
6289
+ }, disabled: disabled, renderInput: (params) => (React__default.createElement(TextField, Object.assign({}, params, { label: "Shift", variant: "outlined", size: "small", fullWidth: true, InputProps: Object.assign(Object.assign({}, params.InputProps), { endAdornment: (React__default.createElement(React__default.Fragment, null, isLoading ? (React__default.createElement(CircularProgress, { color: "inherit", size: 20 })) : null)) }) }))) }))),
6290
+ React__default.createElement(ErrorModal, { error: error, onHide: () => setError("") })));
6291
+ };
6292
+
6293
+ const useShifts = (shiftId) => {
6294
+ return useQuery({
6295
+ queryKey: ["shifts", shiftId],
6296
+ queryFn: ({ signal }) => getShifts({ shiftId }, signal),
6297
+ });
6298
+ };
6299
+ const ShiftSelector = ({ label = "Shift - Crew", value, onChange = () => { }, fieldError, disabled = false, }) => {
6300
+ const [error, setError] = useState("");
6301
+ const { data: shifts, isLoading, isError, error: e } = useShifts(value);
6302
+ const selectedShift = (shifts === null || shifts === void 0 ? void 0 : shifts.find((s) => s.CurrentShiftId === value)) || null;
6303
+ useEffect(() => {
6304
+ if (isError) {
6305
+ setError(e.message);
6306
+ }
6307
+ }, [isError, e]);
6308
+ return (React__default.createElement(React__default.Fragment, null,
6309
+ React__default.createElement(Autocomplete, { id: "clear-on-escape", clearOnEscape: true, options: shifts || [], getOptionLabel: (option) => `${option.CurrentShift} - ${option.CurrentCrew}`, disabled: disabled, renderInput: (params) => (React__default.createElement(TextField, Object.assign({}, params, { label: label, variant: "outlined", fullWidth: true, size: "small", error: !!fieldError, helperText: fieldError === null || fieldError === void 0 ? void 0 : fieldError.message, InputProps: Object.assign(Object.assign({}, params.InputProps), { endAdornment: (React__default.createElement(React__default.Fragment, null, isLoading ? (React__default.createElement(CircularProgress, { color: "inherit", size: 20 })) : (React__default.createElement(React__default.Fragment, null, params.InputProps.endAdornment)))) }) }))), value: selectedShift, onChange: (event, newValue) => {
6310
+ var _a;
6311
+ onChange((_a = newValue === null || newValue === void 0 ? void 0 : newValue.CurrentShiftId) !== null && _a !== void 0 ? _a : null);
6312
+ } }),
6313
+ React__default.createElement(ErrorModal, { error: error, onHide: () => setError(""), title: "Error loading shifts" })));
6314
+ };
6315
+
6139
6316
  function ChangePassword(props) {
6140
6317
  const { onClose, userId, open } = props;
6141
6318
  //states
@@ -6687,7 +6864,7 @@ function Logout() {
6687
6864
  React__default.createElement(Typography$1, { variant: "h6" }, "Logging out..."))));
6688
6865
  }
6689
6866
 
6690
- function NavbarMenuBar({ menus, isMobile = false, closeDrawer, hoverSwitchDelayMs = 100, }) {
6867
+ function NavbarMenuBar({ menus, isMobile = false, closeDrawer, hoverSwitchDelayMs = 10, }) {
6691
6868
  const hasPermissionTo = useHasPermission();
6692
6869
  const [openMenuId, setOpenMenuId] = useState(null);
6693
6870
  const [menuAnchorEl, setMenuAnchorEl] = useState(null);
@@ -7733,14 +7910,14 @@ const TagFilter = ({ tagFilters, setTagFilters, filterContext, }) => {
7733
7910
  } },
7734
7911
  React__default.createElement(Typography$1, { variant: "subtitle2" }, selectedTag ? "Edit Tag Filter" : "Add Tag Filter"),
7735
7912
  React__default.createElement(FormControlLabel, { control: React__default.createElement(Checkbox, { size: "small", checked: showOnlyWithData, onChange: (e) => setShowOnlyWithData(e.target.checked) }), label: React__default.createElement(Typography$1, { variant: "caption" }, "Only with data"), sx: { mr: 0 } })),
7736
- React__default.createElement(Autocomplete, { size: "small", options: availableTagsForSelection, getOptionLabel: (option) => option.TagName, value: selectedTag, onChange: (_, newValue) => {
7913
+ React__default.createElement(Autocomplete$1, { size: "small", options: availableTagsForSelection, getOptionLabel: (option) => option.TagName, value: selectedTag, onChange: (_, newValue) => {
7737
7914
  setSelectedTag(newValue);
7738
7915
  setSelectedValues([]);
7739
7916
  }, renderOption: (props, option) => (React__default.createElement("li", Object.assign({}, props, { style: {
7740
7917
  opacity: option.HasData ? 1 : 0.8,
7741
7918
  } }), option.TagName)), renderInput: (params) => (React__default.createElement(TextField, Object.assign({}, params, { label: "Tag Name", variant: "outlined" }))) }),
7742
7919
  selectedTag && (React__default.createElement(React__default.Fragment, null, isLoadingValues ? (React__default.createElement(Box, { sx: { display: "flex", justifyContent: "center", py: 2 } },
7743
- React__default.createElement(CircularProgress, { size: 24 }))) : (React__default.createElement(Autocomplete, { multiple: true, size: "small", options: availableTagValues, getOptionLabel: (option) => option.Value, value: selectedValues, onChange: (_, newValue) => setSelectedValues(newValue), isOptionEqualToValue: (option, value) => option.Value === value.Value, disableCloseOnSelect: true, renderOption: (props, option, { selected }) => (React__default.createElement("li", Object.assign({}, props, { style: {
7920
+ React__default.createElement(CircularProgress, { size: 24 }))) : (React__default.createElement(Autocomplete$1, { multiple: true, size: "small", options: availableTagValues, getOptionLabel: (option) => option.Value, value: selectedValues, onChange: (_, newValue) => setSelectedValues(newValue), isOptionEqualToValue: (option, value) => option.Value === value.Value, disableCloseOnSelect: true, renderOption: (props, option, { selected }) => (React__default.createElement("li", Object.assign({}, props, { style: {
7744
7921
  opacity: option.HasData ? 1 : 0.8,
7745
7922
  } }),
7746
7923
  React__default.createElement(Checkbox, { icon: icon, checkedIcon: checkedIcon, style: { marginRight: 8 }, checked: selected, size: "small" }),
@@ -8227,259 +8404,249 @@ const ProfilesPage = (props) => {
8227
8404
  return React.createElement(Profiles, null);
8228
8405
  };
8229
8406
 
8230
- const getShiftParameters = (signal) => __awaiter(void 0, void 0, void 0, function* () {
8231
- const apiService = new MESApiService();
8232
- const resp = yield apiService.callV2("[MES].[GetShiftParameters]", [], signal);
8233
- if (resp.ok) {
8234
- return get(resp, "data.tables[0].rows", []);
8235
- }
8236
- else {
8237
- throw new Error(resp.message || "Error fetching shifts");
8238
- }
8239
- });
8240
- const upsertShiftParameters = (_a, ...args_1) => __awaiter(void 0, [_a, ...args_1], void 0, function* ({ PatternStart, ShiftCodes, Crews, CrewRotation, Comments }, isUpdate = false) {
8241
- const apiService = new MESApiService();
8242
- const parameters = [
8243
- { name: "AssetId", value: null },
8244
- { name: "PatternStart", value: PatternStart },
8245
- { name: "ShiftCodes", value: ShiftCodes },
8246
- { name: "Crews", value: Crews },
8247
- { name: "CrewRotation", value: CrewRotation },
8248
- { name: "Comments", value: Comments },
8249
- { name: "IsUpdate", value: isUpdate },
8250
- ];
8251
- const resp = yield apiService.callV2("[MES].[UpsertShiftParameters]", parameters);
8252
- if (!resp.ok) {
8253
- throw new Error(resp.message || "Error when upsert shift");
8254
- }
8255
- });
8256
- const deleteShiftParameters = (PatternStart) => __awaiter(void 0, void 0, void 0, function* () {
8257
- const apiService = new MESApiService();
8258
- const parameters = [];
8259
- parameters.push({ name: "AssetId", value: null });
8260
- parameters.push({ name: "PatternStart", value: PatternStart });
8261
- const resp = yield apiService.callV2("[MES].[DeleteShiftParameters]", parameters);
8262
- if (!resp.ok) {
8263
- throw new Error(resp.message || "Error when delete shift");
8264
- }
8265
- });
8266
-
8267
- const INITIAL_VALUES$1 = {
8268
- PatternStart: new Date(),
8269
- ShiftCodes: "",
8270
- Crews: "",
8271
- User: "",
8272
- PatternDays: 5,
8273
- CrewRotation: "",
8274
- Comments: "",
8275
- CanEdit: false,
8276
- ShiftsPerDay: 1,
8277
- NumberOfCrews: 1,
8407
+ const useSettingsOptionsFunctions = ({ setSettingId, setShowDeleteModal, setShowCreateModal, setShowEditModal, }) => {
8408
+ const getMenuOptions = (data) => {
8409
+ let options = [];
8410
+ if (!data) {
8411
+ options = options.concat([
8412
+ {
8413
+ name: "New Setting",
8414
+ key: "new_setting",
8415
+ onClick: () => {
8416
+ setShowCreateModal(true);
8417
+ },
8418
+ icon: React__default.createElement(PlaylistAddIcon, null),
8419
+ },
8420
+ ]);
8421
+ }
8422
+ else {
8423
+ options = options.concat([
8424
+ {
8425
+ name: "New Setting",
8426
+ key: "new_setting",
8427
+ onClick: () => {
8428
+ setShowCreateModal(true);
8429
+ },
8430
+ icon: React__default.createElement(PlaylistAddIcon, null),
8431
+ },
8432
+ {
8433
+ name: "Edit Setting",
8434
+ key: "edit_setting",
8435
+ onClick: () => {
8436
+ setSettingId(data);
8437
+ setShowEditModal(true);
8438
+ },
8439
+ icon: React__default.createElement(EditIcon, null),
8440
+ },
8441
+ {
8442
+ name: "Delete Setting",
8443
+ key: "delete_setting",
8444
+ onClick: () => {
8445
+ setSettingId(data);
8446
+ setShowDeleteModal(true);
8447
+ },
8448
+ icon: React__default.createElement(DeleteIcon, null),
8449
+ },
8450
+ ]);
8451
+ }
8452
+ return options;
8453
+ };
8454
+ return {
8455
+ getMenuOptions,
8456
+ };
8278
8457
  };
8279
8458
 
8280
- const CreateShift = ({ shiftSelected, show, onHide, suffixTitle, }) => {
8281
- var _a, _b;
8282
- const theme = useTheme();
8283
- const [open, setOpen] = useState(false);
8284
- const [isSubmitLoading, setIsSubmitLoading] = useState(false);
8285
- const [error, setError] = useState("");
8286
- const { control, handleSubmit, reset, watch, setValue, formState: { errors }, } = useForm({
8287
- defaultValues: shiftSelected ? shiftSelected : INITIAL_VALUES$1,
8288
- });
8289
- // Progress bar
8290
- const calculatePercentage = () => ((crewRotation === null || crewRotation === void 0 ? void 0 : crewRotation.length) / maxCrewRotationLength) * 100;
8291
- const createShift = useMutation({
8292
- mutationFn: upsertShiftParameters,
8293
- onSuccess: () => {
8294
- setOpen(true);
8295
- onHide(true);
8459
+ const useTableData$5 = ({ setOpenModalEditSetting, setOpenModalDeleteSetting, showContextMenu, setSettingSelected, }) => {
8460
+ const columnDefs = [
8461
+ {
8462
+ field: "SettingName",
8463
+ headerName: "Name",
8464
+ minWidth: 180,
8465
+ flex: 4,
8296
8466
  },
8297
- onError: (error) => {
8298
- setError(error.message);
8467
+ {
8468
+ field: "Value",
8469
+ headerName: "Value",
8470
+ minWidth: 180,
8471
+ flex: 2,
8299
8472
  },
8300
- onSettled: () => {
8301
- setIsSubmitLoading(false);
8473
+ {
8474
+ field: "Description",
8475
+ headerName: "Description",
8476
+ minWidth: 150,
8477
+ flex: 4,
8302
8478
  },
8303
- });
8304
- const onSubmit = (data) => __awaiter(void 0, void 0, void 0, function* () {
8305
- setIsSubmitLoading(true);
8306
- yield createShift.mutate(data);
8307
- });
8308
- const handleClose = (event, reason) => {
8309
- if (reason === "clickaway") {
8310
- return;
8311
- }
8479
+ {
8480
+ cellRenderer: (params) => {
8481
+ return (React__default.createElement(Grid2, { container: true, sx: {
8482
+ height: "100%",
8483
+ display: "flex",
8484
+ justifyContent: "center",
8485
+ alignItems: "center",
8486
+ opacity: 0,
8487
+ transition: "opacity 0.1s ease-in-out",
8488
+ ".ag-row-hover &": {
8489
+ opacity: 1,
8490
+ },
8491
+ ".ag-row-focus &": {
8492
+ opacity: 1,
8493
+ },
8494
+ ".ag-row-selected &": {
8495
+ opacity: 1,
8496
+ },
8497
+ } },
8498
+ React__default.createElement(Grid2, { size: { xs: 12, md: 12 }, style: {
8499
+ display: "flex",
8500
+ justifyContent: "space-evenly",
8501
+ alignItems: "center",
8502
+ } },
8503
+ React__default.createElement(IconButton$1, { size: "small", onClick: () => {
8504
+ setSettingSelected(params === null || params === void 0 ? void 0 : params.data);
8505
+ setOpenModalEditSetting(true);
8506
+ } },
8507
+ React__default.createElement(EditIcon, { color: "primary" })),
8508
+ React__default.createElement(IconButton$1, { size: "small", onClick: () => {
8509
+ setSettingSelected(params === null || params === void 0 ? void 0 : params.data);
8510
+ setOpenModalDeleteSetting(true);
8511
+ } },
8512
+ React__default.createElement(DeleteIcon, { color: "secondary" })),
8513
+ React__default.createElement(IconButton$1, { size: "small", onClick: (e) => showContextMenu(e, params.data, "TableSettings") },
8514
+ React__default.createElement(FormatListBulletedSharpIcon, { color: "action" })))));
8515
+ },
8516
+ field: "",
8517
+ flex: 1,
8518
+ minWidth: 240,
8519
+ editable: false,
8520
+ autoHeight: false,
8521
+ suppressNavigable: true,
8522
+ },
8523
+ ];
8524
+ const defaultColDef = useMemo(() => {
8525
+ return {
8526
+ sortable: true,
8527
+ wrapText: true,
8528
+ autoHeight: true,
8529
+ wrapHeaderText: true,
8530
+ suppressHeaderMenuButton: true,
8531
+ cellStyle: {
8532
+ display: "flex",
8533
+ alignItems: "center",
8534
+ justifyContent: "center",
8535
+ },
8536
+ };
8537
+ }, []);
8538
+ return { columnDefs, defaultColDef };
8539
+ };
8540
+
8541
+ const INITIAL_VALUES$1 = {
8542
+ SettingName: "",
8543
+ Value: "",
8544
+ Description: "",
8545
+ };
8546
+
8547
+ const upsertSettings = (_a) => __awaiter(void 0, [_a], void 0, function* ({ oldName, newName, description, value, }) {
8548
+ const apiService = new MESApiService();
8549
+ const parameters = [
8550
+ { name: "OldName", value: oldName },
8551
+ { name: "NewName", value: newName },
8552
+ { name: "Description", value: description },
8553
+ { name: "Value", value: value },
8554
+ ];
8555
+ const resp = yield apiService.callV2("[UTL].[SetSetting]", parameters);
8556
+ if (!resp.ok) {
8557
+ throw new Error(resp.message || "Error when upsert setting");
8558
+ }
8559
+ });
8560
+ const deleteSetting = (settingName) => __awaiter(void 0, void 0, void 0, function* () {
8561
+ const apiService = new MESApiService();
8562
+ const parameters = [
8563
+ { name: "SettingName", value: settingName },
8564
+ ];
8565
+ const resp = yield apiService.callV2("[UTL].[DeleteSetting]", parameters);
8566
+ if (!resp.ok) {
8567
+ throw new Error(resp.message || "Error when delete setting");
8568
+ }
8569
+ });
8570
+
8571
+ const CreateSetting = ({ settingSelected, show, onHide, suffixTitle, }) => {
8572
+ const [open, setOpen] = useState(false);
8573
+ const [isSubmitLoading, setIsSubmitLoading] = useState(false);
8574
+ const [error, setError] = useState("");
8575
+ const { control, handleSubmit, reset } = useForm({
8576
+ defaultValues: settingSelected ? settingSelected : INITIAL_VALUES$1,
8577
+ });
8578
+ const updateSetting = useMutation({
8579
+ mutationFn: upsertSettings,
8580
+ onSuccess: () => {
8581
+ setOpen(true);
8582
+ onHide(true);
8583
+ },
8584
+ onError: (error) => {
8585
+ setError(error.message);
8586
+ },
8587
+ onSettled: () => {
8588
+ setIsSubmitLoading(false);
8589
+ },
8590
+ });
8591
+ const onSubmit = (data) => __awaiter(void 0, void 0, void 0, function* () {
8592
+ setIsSubmitLoading(true);
8593
+ yield updateSetting.mutate({
8594
+ oldName: "",
8595
+ newName: data.SettingName,
8596
+ description: data.Description,
8597
+ value: data.Value,
8598
+ });
8599
+ });
8600
+ const handleClose = (event, reason) => {
8601
+ if (reason === "clickaway") {
8602
+ return;
8603
+ }
8312
8604
  setOpen(false);
8313
8605
  };
8314
- // const patternStart = watch('PatternStart');
8315
- const shiftsPerDay = watch("ShiftsPerDay");
8316
- const shiftCodes = watch("ShiftCodes");
8317
- const numberOfCrews = watch("NumberOfCrews");
8318
- const crewsCodes = watch("Crews");
8319
- const rotationPattern = watch("PatternDays");
8320
- const crewRotation = watch("CrewRotation");
8321
- const comments = watch("Comments");
8322
- const maxCrewRotationLength = shiftsPerDay * rotationPattern;
8323
8606
  useEffect(() => {
8324
8607
  if (show) {
8325
8608
  reset();
8326
- setValue("PatternStart", new Date());
8327
8609
  }
8328
8610
  }, [show]);
8329
8611
  return (React.createElement(React.Fragment, null,
8330
- show && (React.createElement(HelmetDexteel, { title: `New Shift/Crew${suffixTitle ? ` - ${suffixTitle}` : ""}` })),
8331
- React.createElement(MesfModal, { title: "NEW SHIFT/CREW", open: show, handleClose: () => onHide(false), id: "create-shift-modal", maxWidth: "md" },
8332
- React.createElement("form", { onSubmit: handleSubmit(onSubmit) },
8333
- React.createElement(MesfModal.Content, null,
8334
- React.createElement(Grid2, { container: true, spacing: 2, p: 1 },
8335
- React.createElement(Controller, { name: "PatternStart", control: control, render: ({ field: { value, onChange } }) => (React.createElement(LocalizationProvider, { dateAdapter: AdapterMoment },
8336
- React.createElement(Grid2, { size: { md: 6, xs: 12 } },
8337
- React.createElement(DatePicker$1, { format: "MM/DD/YYYY", sx: {
8338
- minWidth: "100%",
8339
- borderTopLeftRadius: 3,
8340
- borderTopRightRadius: 3,
8341
- }, label: "Start", value: value ? moment$f(value) : value, onChange: (evt) => onChange(evt === null || evt === void 0 ? void 0 : evt.toDate()), slotProps: {
8342
- textField: {
8343
- fullWidth: true,
8344
- variant: "standard",
8345
- },
8346
- } })),
8347
- React.createElement(Grid2, { size: { md: 6, xs: 12 } },
8348
- React.createElement(DatePicker$1, { label: "Time", value: value ? moment$f(value) : value, onChange: (evt) => onChange(evt === null || evt === void 0 ? void 0 : evt.toDate()), slotProps: {
8349
- textField: {
8350
- fullWidth: true,
8351
- variant: "standard",
8352
- },
8353
- } })))) }),
8354
- React.createElement(Grid2, { size: { md: 6, xs: 6 } },
8355
- React.createElement(Controller, { name: "ShiftsPerDay", control: control, rules: {
8356
- min: 1,
8357
- }, render: ({ field: { onChange, value } }) => (React.createElement(TextField, { label: `# ${shiftsPerDay > 1 ? "Shifts" : "Shift"} per day`, variant: "outlined", error: !!errors.ShiftsPerDay, fullWidth: true, margin: "dense", autoComplete: "off", type: "number", value: value, onChange: (evt) => parseInt(evt.target.value) >= 1 &&
8358
- parseInt(evt.target.value) <= 10 &&
8359
- onChange(evt) })) }),
8360
- ((_a = errors.ShiftsPerDay) === null || _a === void 0 ? void 0 : _a.type) === "min" && (React.createElement(ErrorLabel, { text: "Shift per day is required" }))),
8361
- React.createElement(Grid2, { size: { md: 6, xs: 6 } },
8362
- React.createElement(Controller, { name: "ShiftCodes", control: control, rules: {
8363
- validate: (value) => value.length == shiftsPerDay,
8364
- }, render: ({ field: { onChange, value } }) => (React.createElement(TextField, { label: "Shifts Ids", variant: "outlined", error: !!errors.ShiftCodes, fullWidth: true, margin: "dense", autoComplete: "off", value: value, onChange: (evt) => {
8365
- // TODO: aquí podriamos hacer que no pueda haber dos valores iguales, para prevenir errores. Ej. dos DNN
8366
- if (evt.target.value.length <= shiftsPerDay)
8367
- onChange(evt.target.value.toString().toUpperCase());
8368
- } })) }),
8369
- !!errors.ShiftCodes && (React.createElement("span", { style: {
8370
- fontSize: 12,
8371
- } },
8372
- "Please put ",
8373
- shiftsPerDay,
8374
- " shifts")),
8375
- shiftCodes.length < shiftsPerDay &&
8376
- !!errors.ShiftCodes === false && (React.createElement("span", { style: {
8377
- fontSize: 12,
8378
- color: theme.palette.info.main,
8379
- } }, `Insert: ${shiftsPerDay} ${shiftsPerDay == 1 ? "Id" : "Ids"}. ${shiftsPerDay > 1 ? "The Ids must be differents" : ""}`))),
8380
- React.createElement(Grid2, { size: { md: 6, xs: 6 } },
8381
- React.createElement(Controller, { name: "NumberOfCrews", control: control, rules: {
8382
- min: 1,
8383
- max: 9,
8384
- }, render: ({ field: { onChange, value } }) => (React.createElement(TextField, { label: `# ${numberOfCrews > 1 ? "Crews" : "Crew"}`, variant: "outlined", error: !!errors.NumberOfCrews, fullWidth: true, margin: "dense", autoComplete: "off", type: "number", onChange: (evt) => {
8385
- // max. crew 15
8386
- if (parseInt(evt.target.value) >= 1 &&
8387
- parseInt(evt.target.value) <= 15)
8388
- onChange(evt);
8389
- }, value: value })) }),
8390
- ((_b = errors.NumberOfCrews) === null || _b === void 0 ? void 0 : _b.type) === "min" && (React.createElement(ErrorLabel, { text: "# Crews days is required" }))),
8391
- React.createElement(Grid2, { size: { md: 6, xs: 6 } },
8392
- React.createElement(Controller, { name: "Crews", control: control, rules: {
8393
- validate: (value) => value.length == numberOfCrews,
8394
- }, render: ({ field: { onChange, value } }) => (React.createElement(TextField, { label: "Crews Ids", variant: "outlined", error: !!errors.Crews, fullWidth: true, margin: "dense", autoComplete: "off", value: value, onChange: (evt) => {
8395
- if (evt.target.value.length <= numberOfCrews)
8396
- onChange(evt.target.value.toString().toUpperCase());
8397
- } })) }),
8398
- !!errors.Crews && (React.createElement("span", { style: {
8399
- fontSize: 12,
8400
- } },
8401
- "Please put ",
8402
- numberOfCrews,
8403
- " crews")),
8404
- crewsCodes.length < numberOfCrews &&
8405
- !!errors.Crews === false && (React.createElement("span", { style: {
8406
- fontSize: 12,
8407
- color: theme.palette.info.main,
8408
- } }, `Insert: ${numberOfCrews} ${numberOfCrews == 1 ? "Crew" : "Crews"}. ${numberOfCrews > 1 ? "The Crews must be differents" : ""}`))),
8409
- React.createElement(Grid2, { size: { md: 6, xs: 6 } },
8410
- React.createElement(Controller, { name: "PatternDays", control: control, render: ({ field: { value, onChange } }) => (React.createElement(TextField, { label: "Rotation Pattern", variant: "outlined", error: !!errors.PatternDays, fullWidth: true, type: "number", margin: "dense", autoComplete: "off", value: value, onChange: (evt) => {
8411
- if (parseInt(evt.target.value) >= 5 &&
8412
- parseInt(evt.target.value) <= 60)
8413
- onChange(evt);
8414
- } })) })),
8415
- React.createElement(Grid2, { size: { md: 12, xs: 12 } },
8416
- React.createElement(Controller, { name: "CrewRotation", control: control, rules: {
8417
- validate: (value) => value.length == maxCrewRotationLength,
8418
- }, render: ({ field: { value, onChange } }) => (React.createElement(TextField, { value: value, onChange: (evt) => {
8419
- if (evt.target.value.length <= maxCrewRotationLength)
8420
- onChange(evt.target.value.toString().toUpperCase());
8421
- }, label: "Crew rotation", variant: "outlined", fullWidth: true, error: !!errors.CrewRotation, margin: "dense", autoComplete: "off" })) }),
8422
- React.createElement(Grid2, { container: true, height: 2 },
8423
- React.createElement(Grid2, { style: {
8424
- height: 2,
8425
- width: `${calculatePercentage()}% `,
8426
- backgroundColor: `${crewRotation.length == maxCrewRotationLength
8427
- ? "#4CAF50"
8428
- : "#F44336"}`,
8429
- transition: " 0.2s ease",
8430
- margin: "0 5px",
8431
- } })),
8432
- React.createElement(Grid2, { container: true, style: { margin: "4px 0 0" } },
8433
- React.createElement(Grid2, null, (crewRotation === null || crewRotation === void 0 ? void 0 : crewRotation.length) >= 1 &&
8434
- (crewRotation === null || crewRotation === void 0 ? void 0 : crewRotation.length) !==
8435
- maxCrewRotationLength && (React.createElement("span", { style: {
8436
- fontSize: 12,
8437
- color: theme.palette.info.main,
8438
- marginLeft: 5,
8439
- } }, `${crewRotation === null || crewRotation === void 0 ? void 0 : crewRotation.length}/${maxCrewRotationLength}`)))),
8440
- !!errors.CrewRotation && (React.createElement(ErrorLabel, { text: `Please put ${maxCrewRotationLength} crews` })),
8441
- numberOfCrews > 0 &&
8442
- Number.isInteger(maxCrewRotationLength / numberOfCrews) ===
8443
- false && (React.createElement(Grid2, { container: true, style: { padding: "0", marginLeft: 5 } },
8444
- React.createElement(ErrorLabel, { text: `Rotation # not a multiple of Shifts (${maxCrewRotationLength}) / Crews (${numberOfCrews})` })))),
8445
- React.createElement(Grid2, { size: { md: 12, xs: 12 } },
8446
- React.createElement(Controller, { name: "Comments", control: control, render: ({ field: { value, onChange } }) => (React.createElement(TextField, { style: { margin: "8px 0" }, size: "medium", maxRows: 5, label: "Comments", multiline: true, variant: "outlined", fullWidth: true, autoComplete: "off", value: value, onChange: (evt) => {
8447
- if (evt.target.value.length <= 200)
8448
- onChange(evt);
8449
- } })) }),
8450
- React.createElement(Grid2, { container: true, style: { marginBottom: 18 } },
8451
- React.createElement(Grid2, null,
8452
- (comments === null || comments === void 0 ? void 0 : comments.length) >= 1 &&
8453
- (comments === null || comments === void 0 ? void 0 : comments.length) !== 200 && (React.createElement("span", { style: {
8454
- fontSize: 12,
8455
- color: theme.palette.info.main,
8456
- marginLeft: 5,
8457
- } }, `${comments === null || comments === void 0 ? void 0 : comments.length}/200 max.`)),
8458
- (comments === null || comments === void 0 ? void 0 : comments.length) == 200 && (React.createElement("span", { style: {
8459
- fontSize: 12,
8460
- color: theme.palette.info.main,
8461
- marginLeft: 5,
8462
- } }, "Max. 200"))))))),
8463
- React.createElement(MesfModal.Actions, null,
8464
- React.createElement(Grid2, { container: true, spacing: 2, justifyContent: "flex-end" },
8465
- React.createElement(Grid2, { size: { md: 3, xs: 12 } },
8466
- React.createElement(Button, { fullWidth: true, variant: "contained", color: "inherit", onClick: () => onHide(false) }, "Cancel")),
8467
- React.createElement(Grid2, { size: { md: 3, xs: 12 } },
8468
- React.createElement(Button, { fullWidth: true, startIcon: isSubmitLoading && React.createElement(CircularProgress, { size: "1rem" }), disabled: isSubmitLoading, variant: "contained", color: "primary", type: "submit" }, "Save")))))),
8469
- React.createElement(ErrorModal, { error: error, onHide: () => setError(""), title: "Error Creating Shift" }),
8612
+ show && (React.createElement(HelmetDexteel, { title: `New Setting${suffixTitle ? ` - ${suffixTitle}` : ""}` })),
8613
+ React.createElement(Grid2, { container: true },
8614
+ React.createElement(Grid2, null,
8615
+ React.createElement(MesfModal, { title: "NEW SETTING", open: show, handleClose: () => onHide(false), id: "create-setting-modal", maxWidth: "md" },
8616
+ React.createElement("form", { onSubmit: handleSubmit(onSubmit) },
8617
+ React.createElement(MesfModal.Content, null,
8618
+ React.createElement(Grid2, { container: true, spacing: 2 },
8619
+ React.createElement(Grid2, { size: { xs: 12, md: 6 } },
8620
+ React.createElement(Controller, { name: "SettingName", control: control, rules: { required: "Name is required" }, render: ({ field, fieldState: { error } }) => (React.createElement(TextField, Object.assign({}, field, { label: "Name", error: !!error, helperText: error ? error.message : null, autoComplete: "off" }))) })),
8621
+ React.createElement(Grid2, { size: { xs: 12, md: 6 } },
8622
+ React.createElement(Controller, { name: "Value", control: control, rules: {
8623
+ required: "Value is required",
8624
+ }, render: ({ field, fieldState: { error } }) => (React.createElement(TextField, Object.assign({}, field, { label: "Value", error: !!error, helperText: error ? error.message : null, autoComplete: "off" }))) })),
8625
+ React.createElement(Grid2, { size: { md: 12, xs: 12 } },
8626
+ React.createElement(Controller, { name: "Description", control: control, render: ({ field: { value, onChange } }) => (React.createElement(TextField, { size: "medium", maxRows: 5, label: "Description", multiline: true, autoComplete: "off", value: value, onChange: (evt) => {
8627
+ if (evt.target.value.length <= 200)
8628
+ onChange(evt);
8629
+ } })) })))),
8630
+ React.createElement(MesfModal.Actions, null,
8631
+ React.createElement(Grid2, { container: true, spacing: 2, justifyContent: "flex-end" },
8632
+ React.createElement(Grid2, { size: { md: 3, xs: 12 } },
8633
+ React.createElement(Button, { fullWidth: true, variant: "contained", color: "inherit", onClick: () => onHide(false) }, "Cancel")),
8634
+ React.createElement(Grid2, { size: { md: 3, xs: 12 } },
8635
+ React.createElement(Button, { fullWidth: true, startIcon: isSubmitLoading && React.createElement(CircularProgress, { size: "1rem" }), disabled: isSubmitLoading, variant: "contained", color: "primary", type: "submit" }, "Save")))))))),
8636
+ React.createElement(ErrorModal, { error: error, onHide: () => setError(""), title: "Error Creating Setting" }),
8470
8637
  React.createElement(Snackbar, { open: open, autoHideDuration: 2500, onClose: handleClose, anchorOrigin: { vertical: "bottom", horizontal: "center" } },
8471
- React.createElement(Alert$1, { severity: "success", onClose: handleClose }, "The shift was created successfully"))));
8638
+ React.createElement(Alert$1, { severity: "success", onClose: handleClose }, "The setting was created successfully"))));
8472
8639
  };
8473
8640
 
8474
- const DeleteShift = ({ shiftSelected, show, onHide, suffixTitle, }) => {
8475
- var _a;
8641
+ const DeleteSetting = ({ settingSelected, show, onHide, suffixTitle, }) => {
8476
8642
  const [open, setOpen] = useState(false);
8477
8643
  const [isSubmitLoading, setIsSubmitLoading] = useState(false);
8478
- const [deleteAlert, setDeleteAlert] = useState(false);
8479
8644
  const [error, setError] = useState("");
8480
- const { control, setValue, reset, watch, formState: { errors }, } = useForm({ defaultValues: INITIAL_VALUES$1 });
8481
- const deleteShift = useMutation({
8482
- mutationFn: deleteShiftParameters,
8645
+ const { control, handleSubmit, reset, setValue } = useForm({
8646
+ defaultValues: settingSelected ? settingSelected : INITIAL_VALUES$1,
8647
+ });
8648
+ const removeSetting = useMutation({
8649
+ mutationFn: deleteSetting,
8483
8650
  onSuccess: () => {
8484
8651
  setOpen(true);
8485
8652
  onHide(true);
@@ -8489,122 +8656,65 @@ const DeleteShift = ({ shiftSelected, show, onHide, suffixTitle, }) => {
8489
8656
  },
8490
8657
  onSettled: () => {
8491
8658
  setIsSubmitLoading(false);
8492
- setDeleteAlert(false);
8493
8659
  },
8494
8660
  });
8495
- const onDelete = (data) => __awaiter(void 0, void 0, void 0, function* () {
8661
+ const onSubmit = (data) => __awaiter(void 0, void 0, void 0, function* () {
8496
8662
  setIsSubmitLoading(true);
8497
- yield deleteShift.mutate(data);
8663
+ yield removeSetting.mutate(data.SettingName);
8498
8664
  });
8499
8665
  const handleClose = (event, reason) => {
8500
8666
  if (reason === "clickaway") {
8501
8667
  return;
8502
8668
  }
8503
8669
  setOpen(false);
8504
- setDeleteAlert(false);
8505
8670
  };
8506
- const patternStart = watch("PatternStart");
8507
- const shiftsPerDay = watch("ShiftsPerDay");
8508
- const crewRotation = watch("CrewRotation");
8509
- const numberOfCrews = watch("NumberOfCrews");
8510
- const crewsCodes = watch("Crews");
8511
- const rotationPattern = watch("PatternDays");
8512
8671
  useEffect(() => {
8513
- var _a, _b, _c, _d, _e, _f;
8514
8672
  if (show) {
8515
8673
  reset();
8516
- setValue("PatternStart", (_a = shiftSelected === null || shiftSelected === void 0 ? void 0 : shiftSelected.PatternStart) !== null && _a !== void 0 ? _a : new Date());
8517
- setValue("ShiftCodes", (_b = shiftSelected === null || shiftSelected === void 0 ? void 0 : shiftSelected.ShiftCodes) !== null && _b !== void 0 ? _b : "");
8518
- setValue("Crews", (_c = shiftSelected === null || shiftSelected === void 0 ? void 0 : shiftSelected.Crews) !== null && _c !== void 0 ? _c : "");
8519
- setValue("PatternDays", (_d = shiftSelected === null || shiftSelected === void 0 ? void 0 : shiftSelected.PatternDays) !== null && _d !== void 0 ? _d : 0);
8520
- setValue("CrewRotation", (_e = shiftSelected === null || shiftSelected === void 0 ? void 0 : shiftSelected.CrewRotation) !== null && _e !== void 0 ? _e : "");
8521
- setValue("Comments", (_f = shiftSelected === null || shiftSelected === void 0 ? void 0 : shiftSelected.Comments) !== null && _f !== void 0 ? _f : "");
8674
+ if (settingSelected) {
8675
+ setValue("SettingName", settingSelected.SettingName);
8676
+ setValue("Value", settingSelected.Value);
8677
+ setValue("Description", settingSelected.Description);
8678
+ }
8522
8679
  }
8523
8680
  }, [show]);
8524
8681
  return (React.createElement(React.Fragment, null,
8525
- show && (React.createElement(HelmetDexteel, { title: `Delete Shift${suffixTitle ? ` - ${suffixTitle}` : ""}` })),
8526
- React.createElement(MesfModal, { title: "DELETE SHIFT", open: show, handleClose: () => onHide(false), id: "delete-shift-MesfModal", maxWidth: "md" },
8527
- React.createElement("form", null,
8528
- React.createElement(MesfModal.Content, null,
8529
- React.createElement(Grid2, { container: true, spacing: 2, p: 1 },
8530
- React.createElement(Controller, { name: "PatternStart", control: control, render: ({ field: { value, onChange } }) => (React.createElement(LocalizationProvider, { dateAdapter: AdapterMoment },
8531
- React.createElement(Grid2, { size: { md: 6, xs: 12 } },
8532
- React.createElement(DatePicker$1, { format: "MM/DD/YYYY", sx: {
8533
- minWidth: "100%",
8534
- borderTopLeftRadius: 3,
8535
- borderTopRightRadius: 3,
8536
- }, label: "Start", value: value ? moment$f(value) : value, onChange: (evt) => onChange(evt === null || evt === void 0 ? void 0 : evt.toDate()), slotProps: {
8537
- textField: {
8538
- fullWidth: true,
8539
- variant: "standard",
8540
- disabled: true,
8541
- },
8542
- } })),
8543
- React.createElement(Grid2, { size: { md: 6, xs: 12 } },
8544
- React.createElement(DatePicker$1, { label: "Time", value: value ? moment$f(value) : value, onChange: (evt) => onChange(evt === null || evt === void 0 ? void 0 : evt.toDate()), slotProps: {
8545
- textField: {
8546
- fullWidth: true,
8547
- variant: "standard",
8548
- disabled: true,
8549
- },
8550
- } })))) }),
8551
- React.createElement(Grid2, { size: { md: 6, xs: 6 } },
8552
- React.createElement(Controller, { name: "ShiftsPerDay", control: control, rules: {
8553
- min: 1,
8554
- }, render: ({ field: { onChange, value } }) => (React.createElement(TextField, { label: `# ${shiftsPerDay > 1 ? "Shifts" : "Shift"} per day`, variant: "outlined", error: !!errors.ShiftsPerDay, fullWidth: true, margin: "dense", autoComplete: "off", type: "number", value: crewRotation.length / rotationPattern, disabled: !!shiftSelected })) }),
8555
- ((_a = errors.ShiftsPerDay) === null || _a === void 0 ? void 0 : _a.type) === "min" && (React.createElement(ErrorLabel, { text: "Shift per day is required" }))),
8556
- React.createElement(Grid2, { size: { md: 6, xs: 6 }, style: { paddingBottom: "0" } },
8557
- React.createElement(Controller, { name: "ShiftCodes", control: control, render: ({ field: { value } }) => (React.createElement(TextField, { label: "Shifts Ids", variant: "outlined", error: !!errors.ShiftCodes, fullWidth: true, margin: "dense", autoComplete: "off", value: value, disabled: !!shiftSelected })) })),
8558
- React.createElement(Grid2, { size: { md: 6, xs: 6 } },
8559
- React.createElement(Controller, { name: "NumberOfCrews", control: control, rules: {
8560
- min: 1,
8561
- max: 9,
8562
- }, render: ({ field: { value } }) => (React.createElement(TextField, { label: `# ${numberOfCrews > 1 ? "Crews" : "Crew"}`, variant: "outlined", error: !!errors.NumberOfCrews, fullWidth: true, margin: "dense", autoComplete: "off", type: "number", value: crewsCodes.length, disabled: !!shiftSelected })) })),
8563
- React.createElement(Grid2, { size: { md: 6, xs: 6 }, style: { paddingBottom: "0" } },
8564
- React.createElement(Controller, { name: "Crews", control: control, render: ({ field: { value } }) => (React.createElement(TextField, { label: "Crews Ids", variant: "outlined", error: !!errors.Crews, fullWidth: true, margin: "dense", autoComplete: "off", value: value, disabled: !!shiftSelected })) })),
8565
- React.createElement(Grid2, { size: { md: 6, xs: 6 } },
8566
- React.createElement(Controller, { name: "PatternDays", control: control, render: ({ field: { value } }) => (React.createElement(TextField, { label: "Rotation Pattern", variant: "outlined", error: !!errors.PatternDays, fullWidth: true, type: "number", margin: "dense", autoComplete: "off", value: value, disabled: !!shiftSelected })) })),
8567
- React.createElement(Grid2, { size: { md: 12, xs: 12 } },
8568
- React.createElement(Controller, { name: "CrewRotation", control: control, render: ({ field: { value, onChange } }) => (React.createElement(TextField, { label: "Crew rotation", variant: "outlined", fullWidth: true, margin: "dense", autoComplete: "off", value: value, disabled: !!shiftSelected })) })),
8569
- React.createElement(Grid2, { size: { md: 12, xs: 12 } },
8570
- React.createElement(Controller, { name: "Comments", control: control, render: ({ field: { value, onChange } }) => (React.createElement(TextField, { style: { margin: "8px 0" }, size: "medium", maxRows: 5, label: "Comments", multiline: true, variant: "outlined", fullWidth: true, autoComplete: "off", value: value, disabled: !!shiftSelected })) })))),
8571
- React.createElement(MesfModal.Actions, null,
8572
- React.createElement(Grid2, { container: true, spacing: 2, justifyContent: "flex-end" },
8573
- React.createElement(Grid2, { size: { md: 3, xs: 12 }, style: { margin: 0 } },
8574
- React.createElement(Button, { fullWidth: true, variant: "contained", color: "inherit", onClick: () => onHide(false) }, "Cancel")),
8575
- React.createElement(Grid2, { size: { md: 3, xs: 12 }, style: { margin: 0 } },
8576
- React.createElement(Button, { fullWidth: true, startIcon: isSubmitLoading && React.createElement(CircularProgress, { size: "1rem" }), disabled: isSubmitLoading
8577
- ? isSubmitLoading
8578
- : shiftSelected
8579
- ? new Date(shiftSelected.PatternStart) < new Date() &&
8580
- true
8581
- : false, variant: "contained", color: "secondary", onClick: () => setDeleteAlert(true) }, "Delete"),
8582
- shiftSelected &&
8583
- new Date(shiftSelected === null || shiftSelected === void 0 ? void 0 : shiftSelected.PatternStart) < new Date() && (React.createElement(Grid2, null,
8584
- React.createElement(ErrorLabel, { text: "Can not delete before the current date" })))))),
8585
- React.createElement(Dialog$1, { open: deleteAlert, onClose: () => handleClose(), "aria-labelledby": "responsive-dialog-title" },
8586
- React.createElement(DialogTitle$1, { id: "responsive-dialog-title" }, "WARNING"),
8587
- React.createElement(DialogContent$1, null,
8588
- React.createElement(DialogContentText, { style: { padding: 0, margin: 0 } }, "Be careful, once deleted you will not be able to recover this shift, are you sure you want to delete it?")),
8589
- React.createElement(DialogActions$1, { style: { padding: "16px 24px" } },
8590
- React.createElement(Button, { onClick: () => setDeleteAlert(false), autoFocus: true, color: "inherit" }, "CANCEL"),
8591
- React.createElement(Button, { startIcon: isSubmitLoading && React.createElement(CircularProgress, { size: "1rem" }), autoFocus: true, color: "secondary", onClick: () => onDelete(patternStart) }, "Delete"))))),
8592
- React.createElement(ErrorModal, { error: error, onHide: () => setError("") }),
8682
+ show && (React.createElement(HelmetDexteel, { title: `Delete Setting${suffixTitle ? ` - ${suffixTitle}` : ""}` })),
8683
+ React.createElement(Grid2, { container: true },
8684
+ React.createElement(Grid2, null,
8685
+ React.createElement(MesfModal, { title: "DELETE SETTING", open: show, handleClose: () => onHide(false), id: "delete-setting-modal", maxWidth: "md" },
8686
+ React.createElement("form", { onSubmit: handleSubmit(onSubmit) },
8687
+ React.createElement(MesfModal.Content, null,
8688
+ React.createElement(Grid2, { container: true, spacing: 2 },
8689
+ React.createElement(Grid2, { size: { xs: 12, md: 6 } },
8690
+ React.createElement(Controller, { name: "SettingName", control: control, rules: { required: "Name is required" }, render: ({ field, fieldState: { error } }) => (React.createElement(TextField, Object.assign({ disabled: true }, field, { label: "Name", variant: "outlined", error: !!error, helperText: error ? error.message : null, fullWidth: true, margin: "dense", autoComplete: "off" }))) })),
8691
+ React.createElement(Grid2, { size: { xs: 12, md: 6 } },
8692
+ React.createElement(Controller, { name: "Value", control: control, rules: { required: "Value is required" }, render: ({ field, fieldState: { error } }) => (React.createElement(TextField, Object.assign({ disabled: true }, field, { label: "Value", variant: "outlined", error: !!error, helperText: error ? error.message : null, fullWidth: true, margin: "dense", autoComplete: "off" }))) })),
8693
+ React.createElement(Grid2, { size: { md: 12, xs: 12 } },
8694
+ React.createElement(Controller, { name: "Description", control: control, render: ({ field: { value, onChange } }) => (React.createElement(TextField, { disabled: true, size: "medium", maxRows: 5, label: "Description", multiline: true, autoComplete: "off", value: value, onChange: (evt) => {
8695
+ if (evt.target.value.length <= 200)
8696
+ onChange(evt);
8697
+ } })) })))),
8698
+ React.createElement(MesfModal.Actions, null,
8699
+ React.createElement(Grid2, { container: true, spacing: 2, justifyContent: "flex-end" },
8700
+ React.createElement(Grid2, { size: { md: 3, xs: 12 } },
8701
+ React.createElement(Button, { fullWidth: true, variant: "contained", color: "inherit", onClick: () => onHide(false) }, "Cancel")),
8702
+ React.createElement(Grid2, { size: { md: 3, xs: 12 } },
8703
+ React.createElement(Button, { fullWidth: true, startIcon: isSubmitLoading && React.createElement(CircularProgress, { size: "1rem" }), disabled: isSubmitLoading, variant: "contained", color: "secondary", type: "submit" }, "Delete")))))))),
8704
+ React.createElement(ErrorModal, { error: error, onHide: () => setError(""), title: "Error deleting Setting" }),
8593
8705
  React.createElement(Snackbar, { open: open, autoHideDuration: 2500, onClose: handleClose, anchorOrigin: { vertical: "bottom", horizontal: "center" } },
8594
- React.createElement(Alert$1, { severity: "warning", onClose: handleClose }, "The shift was deleted successfully"))));
8706
+ React.createElement(Alert$1, { severity: "success", onClose: handleClose }, "The setting was deleted successfully"))));
8595
8707
  };
8596
8708
 
8597
- const EditShift = ({ shiftSelected, show, onHide, suffixTitle, }) => {
8598
- const theme = useTheme();
8709
+ const EditSetting = ({ settingSelected, show, onHide, suffixTitle, }) => {
8599
8710
  const [open, setOpen] = useState(false);
8600
- const [error, setError] = useState("");
8601
8711
  const [isSubmitLoading, setIsSubmitLoading] = useState(false);
8602
- const [initialShiftPerDayAndCrewsNumber, setInitialShiftPerDayAndCrewsNumber,] = useState(false);
8603
- const { control, setValue, handleSubmit, reset, watch, formState: { errors }, } = useForm({ defaultValues: INITIAL_VALUES$1 });
8604
- // Progress bar
8605
- const calculatePercentage = () => ((crewRotation === null || crewRotation === void 0 ? void 0 : crewRotation.length) / maxCrewRotationLength) * 100;
8606
- const createShift = useMutation({
8607
- mutationFn: ({ shiftData, isUpdate, }) => upsertShiftParameters(shiftData, isUpdate),
8712
+ const [error, setError] = useState("");
8713
+ const { control, handleSubmit, reset, setValue } = useForm({
8714
+ defaultValues: settingSelected ? settingSelected : INITIAL_VALUES$1,
8715
+ });
8716
+ const updateSetting = useMutation({
8717
+ mutationFn: upsertSettings,
8608
8718
  onSuccess: () => {
8609
8719
  setOpen(true);
8610
8720
  onHide(true);
@@ -8617,8 +8727,14 @@ const EditShift = ({ shiftSelected, show, onHide, suffixTitle, }) => {
8617
8727
  },
8618
8728
  });
8619
8729
  const onSubmit = (data) => __awaiter(void 0, void 0, void 0, function* () {
8730
+ var _a;
8620
8731
  setIsSubmitLoading(true);
8621
- yield createShift.mutate({ shiftData: data, isUpdate: true });
8732
+ yield updateSetting.mutate({
8733
+ oldName: (_a = settingSelected === null || settingSelected === void 0 ? void 0 : settingSelected.SettingName) !== null && _a !== void 0 ? _a : null,
8734
+ newName: data.SettingName,
8735
+ description: data.Description,
8736
+ value: data.Value,
8737
+ });
8622
8738
  });
8623
8739
  const handleClose = (event, reason) => {
8624
8740
  if (reason === "clickaway") {
@@ -8626,377 +8742,84 @@ const EditShift = ({ shiftSelected, show, onHide, suffixTitle, }) => {
8626
8742
  }
8627
8743
  setOpen(false);
8628
8744
  };
8629
- // const patternStart = watch('PatternStart');
8630
- const shiftsPerDay = watch("ShiftsPerDay");
8631
- const shiftCodes = watch("ShiftCodes");
8632
- const numberOfCrews = watch("NumberOfCrews");
8633
- const crewsCodes = watch("Crews");
8634
- const rotationPattern = watch("PatternDays");
8635
- const comments = watch("Comments");
8636
- const crewRotation = watch("CrewRotation");
8637
- const maxCrewRotationLength = shiftsPerDay * rotationPattern;
8638
8745
  useEffect(() => {
8639
- var _a, _b, _c, _d, _e, _f;
8640
8746
  if (show) {
8641
8747
  reset();
8642
- setValue("PatternStart", (_a = shiftSelected === null || shiftSelected === void 0 ? void 0 : shiftSelected.PatternStart) !== null && _a !== void 0 ? _a : new Date());
8643
- setValue("ShiftCodes", (_b = shiftSelected === null || shiftSelected === void 0 ? void 0 : shiftSelected.ShiftCodes) !== null && _b !== void 0 ? _b : "");
8644
- setValue("Crews", (_c = shiftSelected === null || shiftSelected === void 0 ? void 0 : shiftSelected.Crews) !== null && _c !== void 0 ? _c : "");
8645
- setValue("PatternDays", (_d = shiftSelected === null || shiftSelected === void 0 ? void 0 : shiftSelected.PatternDays) !== null && _d !== void 0 ? _d : 0);
8646
- setValue("CrewRotation", (_e = shiftSelected === null || shiftSelected === void 0 ? void 0 : shiftSelected.CrewRotation) !== null && _e !== void 0 ? _e : "");
8647
- setValue("Comments", (_f = shiftSelected === null || shiftSelected === void 0 ? void 0 : shiftSelected.Comments) !== null && _f !== void 0 ? _f : "");
8648
- setInitialShiftPerDayAndCrewsNumber(!initialShiftPerDayAndCrewsNumber);
8748
+ if (settingSelected) {
8749
+ setValue("SettingName", settingSelected.SettingName);
8750
+ setValue("Value", settingSelected.Value);
8751
+ setValue("Description", settingSelected.Description);
8752
+ }
8649
8753
  }
8650
8754
  }, [show]);
8651
- useEffect(() => {
8652
- setValue("ShiftsPerDay", crewRotation.length / rotationPattern);
8653
- setValue("NumberOfCrews", crewsCodes.length);
8654
- }, [initialShiftPerDayAndCrewsNumber]);
8655
8755
  return (React.createElement(React.Fragment, null,
8656
- show && (React.createElement(HelmetDexteel, { title: `Edit Shift${suffixTitle ? ` - ${suffixTitle}` : ""}` })),
8657
- React.createElement(MesfModal, { title: "EDIT SHIFT", open: show, handleClose: () => onHide(false), id: "edit-shift-modal", maxWidth: "md" },
8756
+ show && (React.createElement(HelmetDexteel, { title: `Edit Setting${suffixTitle ? ` - ${suffixTitle}` : ""}` })),
8757
+ React.createElement(MesfModal, { title: "EDIT SETTING", open: show, handleClose: () => onHide(false), id: "edit-setting-modal", maxWidth: "md" },
8658
8758
  React.createElement("form", { onSubmit: handleSubmit(onSubmit) },
8659
8759
  React.createElement(MesfModal.Content, null,
8660
- React.createElement(Grid2, { container: true, spacing: 2, p: 1 },
8661
- React.createElement(Controller, { name: "PatternStart", control: control, render: ({ field: { value, onChange } }) => (React.createElement(LocalizationProvider, { dateAdapter: AdapterMoment },
8662
- React.createElement(Grid2, { size: { md: 6, xs: 12 } },
8663
- React.createElement(DatePicker$1, { format: "MM/DD/YYYY", sx: {
8664
- minWidth: "100%",
8665
- borderTopLeftRadius: 3,
8666
- borderTopRightRadius: 3,
8667
- }, label: "Start", value: value ? moment$f(value) : value, onChange: (evt) => onChange(evt === null || evt === void 0 ? void 0 : evt.toDate()), slotProps: {
8668
- textField: {
8669
- fullWidth: true,
8670
- variant: "standard",
8671
- },
8672
- } })),
8673
- React.createElement(Grid2, { size: { md: 6, xs: 12 } },
8674
- React.createElement(DatePicker$1, { label: "Time", value: value ? moment$f(value) : value, onChange: (evt) => onChange(evt === null || evt === void 0 ? void 0 : evt.toDate()), slotProps: {
8675
- textField: {
8676
- fullWidth: true,
8677
- variant: "standard",
8678
- },
8679
- } })))) }),
8680
- React.createElement(Grid2, { size: { md: 6, xs: 6 } },
8681
- React.createElement(Controller, { name: "ShiftsPerDay", control: control, rules: {
8682
- min: 1,
8683
- }, render: ({ field: { onChange, value } }) => (React.createElement(TextField, { label: `# ${shiftsPerDay > 1 ? "Shifts" : "Shift"} per day`, variant: "outlined", error: !!errors.ShiftsPerDay, fullWidth: true, margin: "dense", autoComplete: "off", type: "number", value: value, onChange:
8684
- // FIXME: límite de 10?
8685
- (evt) => parseInt(evt.target.value) >= 1 &&
8686
- parseInt(evt.target.value) <= 10 &&
8687
- onChange(evt) })) })),
8688
- React.createElement(Grid2, { size: { md: 6, xs: 6 } },
8689
- React.createElement(Controller, { name: "ShiftCodes", control: control, rules: {
8690
- required: `Please put ${shiftsPerDay} shifts`,
8691
- validate: (value) => value.length == shiftsPerDay,
8692
- }, render: ({ field: { onChange, value }, fieldState: { error }, }) => (React.createElement(TextField, { label: "Shifts Ids", variant: "outlined", error: !!error, helperText: error === null || error === void 0 ? void 0 : error.message, fullWidth: true, margin: "dense", autoComplete: "off", value: value, onChange: (evt) => {
8693
- // TODO: aquí deberíamos prevenir, que no pueda haber dos valores iguales, . Ej. dos DNN
8694
- if (evt.target.value.length <= shiftsPerDay)
8695
- onChange(evt.target.value.toString().toUpperCase());
8696
- } })) }),
8697
- shiftCodes.length < shiftsPerDay &&
8698
- !!errors.ShiftCodes === false && (React.createElement(ErrorLabel, { text: `Insert: ${shiftsPerDay} ${shiftsPerDay == 1 ? "Id" : "Ids"}. ${shiftsPerDay > 1 ? "The Ids must be differents" : ""}` }))),
8699
- React.createElement(Grid2, { size: { md: 6, xs: 6 } },
8700
- React.createElement(Controller, { name: "NumberOfCrews", control: control, rules: {
8701
- required: "# Crews day is required",
8702
- min: 1,
8703
- max: 9,
8704
- }, render: ({ field: { onChange, value }, fieldState: { error }, }) => (React.createElement(TextField, { label: `# ${numberOfCrews > 1 ? "Crews" : "Crew"}`, variant: "outlined", error: !!error, helperText: error === null || error === void 0 ? void 0 : error.message, fullWidth: true, margin: "dense", autoComplete: "off", type: "number", value: value, onChange: (evt) => {
8705
- if (parseInt(evt.target.value) >= 1 &&
8706
- parseInt(evt.target.value) <= 9)
8707
- onChange(evt);
8708
- } })) })),
8709
- React.createElement(Grid2, { size: { md: 6, xs: 6 } },
8710
- React.createElement(Controller, { name: "Crews", control: control, rules: {
8711
- required: `Please put ${numberOfCrews} crews`,
8712
- validate: (value) => value.length == numberOfCrews,
8713
- }, render: ({ field: { onChange, value }, fieldState: { error }, }) => (React.createElement(TextField, { label: "Crews Ids", variant: "outlined", error: !!error, helperText: error === null || error === void 0 ? void 0 : error.message, disabled: numberOfCrews <= 0, fullWidth: true, margin: "dense", autoComplete: "off", value: value, onChange: (evt) => {
8714
- if (evt.target.value.length <= numberOfCrews)
8715
- onChange(evt.target.value.toString().toUpperCase());
8716
- } })) }),
8717
- crewsCodes.length < numberOfCrews &&
8718
- !!errors.Crews === false && (React.createElement(ErrorLabel, { text: `Insert: ${numberOfCrews} ${numberOfCrews == 1 ? "Crew" : "Crews"}. ${numberOfCrews > 1 ? "The Crews must be differents" : ""}` }))),
8719
- React.createElement(Grid2, { size: { md: 6, xs: 6 } },
8720
- React.createElement(Controller, { name: "PatternDays", control: control,
8721
- // rules={{
8722
- // required: true
8723
- // }}
8724
- render: ({ field: { value, onChange } }) => (React.createElement(TextField, { label: "Rotation Pattern", variant: "outlined", error: !!errors.PatternDays, fullWidth: true, type: "number", margin: "dense", autoComplete: "off", value: value, onChange: (evt) => {
8725
- // FIXME: consultar si estos valores están bien, son los limites del sP
8726
- if (parseInt(evt.target.value) >= 5 &&
8727
- parseInt(evt.target.value) <= 60)
8728
- onChange(evt);
8729
- } })) })),
8730
- React.createElement(Grid2, { size: { md: 12, xs: 12 } },
8731
- React.createElement(Controller, { name: "CrewRotation", control: control, rules: {
8732
- validate: (value) => value.length == maxCrewRotationLength,
8733
- }, render: ({ field: { value, onChange } }) => (React.createElement(TextField, { value: value, onChange: (evt) => {
8734
- if (evt.target.value.length <= maxCrewRotationLength)
8735
- onChange(evt.target.value.toString().toUpperCase());
8736
- }, error: !!errors.CrewRotation, label: "Crew rotation", variant: "outlined", fullWidth: true, margin: "dense", autoComplete: "off" })) }),
8737
- React.createElement(Grid2, { container: true, height: 2 },
8738
- React.createElement(Grid2, { style: {
8739
- height: 2,
8740
- width: `${calculatePercentage()}% `,
8741
- backgroundColor: `${crewRotation.length == maxCrewRotationLength
8742
- ? "#4CAF50"
8743
- : "#F44336"}`,
8744
- transition: " 0.2s ease",
8745
- margin: "0 5px",
8746
- } })),
8747
- React.createElement(Grid2, { container: true },
8748
- React.createElement(Grid2, null, (crewRotation === null || crewRotation === void 0 ? void 0 : crewRotation.length) >= 1 &&
8749
- (crewRotation === null || crewRotation === void 0 ? void 0 : crewRotation.length) !==
8750
- maxCrewRotationLength && (React.createElement("span", { style: {
8751
- fontSize: 12,
8752
- color: theme.palette.info.main,
8753
- marginLeft: 5,
8754
- } }, `${crewRotation === null || crewRotation === void 0 ? void 0 : crewRotation.length}/${maxCrewRotationLength}`)))),
8755
- !!errors.CrewRotation && (React.createElement(ErrorLabel, { text: `Please put ${maxCrewRotationLength} crews` })),
8756
- numberOfCrews > 0 &&
8757
- Number.isInteger(maxCrewRotationLength / numberOfCrews) ===
8758
- false && (React.createElement(Grid2, { container: true, style: { padding: "0", marginLeft: 5 } },
8759
- React.createElement(ErrorLabel, { text: `Rotation # not a multiple of Shifts (${maxCrewRotationLength}) / Crews (${numberOfCrews})` })))),
8760
+ React.createElement(Grid2, { container: true, spacing: 2 },
8761
+ React.createElement(Grid2, { size: { xs: 12, md: 6 } },
8762
+ React.createElement(Controller, { name: "SettingName", control: control, rules: { required: "Name is required" }, render: ({ field, fieldState: { error } }) => (React.createElement(TextField, Object.assign({}, field, { label: "Name", error: !!error, helperText: error ? error.message : null, autoComplete: "off" }))) })),
8763
+ React.createElement(Grid2, { size: { xs: 12, md: 6 } },
8764
+ React.createElement(Controller, { name: "Value", control: control, rules: {
8765
+ required: "Value is required",
8766
+ }, render: ({ field, fieldState: { error } }) => (React.createElement(TextField, Object.assign({}, field, { label: "Value", error: !!error, helperText: error ? error.message : null, autoComplete: "off" }))) })),
8760
8767
  React.createElement(Grid2, { size: { md: 12, xs: 12 } },
8761
- React.createElement(Controller, { name: "Comments", control: control, render: ({ field: { value, onChange } }) => (React.createElement(TextField, { style: { margin: "8px 0" }, size: "medium", maxRows: 5, label: "Comments", multiline: true, variant: "outlined", fullWidth: true, autoComplete: "off", value: value, onChange: (evt) => {
8768
+ React.createElement(Controller, { name: "Description", control: control, render: ({ field: { value, onChange } }) => (React.createElement(TextField, { size: "medium", maxRows: 5, label: "Description", multiline: true, variant: "outlined", fullWidth: true, autoComplete: "off", value: value, onChange: (evt) => {
8762
8769
  if (evt.target.value.length <= 200)
8763
8770
  onChange(evt);
8764
- } })) }),
8765
- React.createElement(Grid2, { container: true, style: { marginBottom: 18 } },
8766
- React.createElement(Grid2, null,
8767
- (comments === null || comments === void 0 ? void 0 : comments.length) >= 1 &&
8768
- (comments === null || comments === void 0 ? void 0 : comments.length) !== 200 && (React.createElement("span", { style: {
8769
- fontSize: 12,
8770
- color: theme.palette.info.main,
8771
- marginLeft: 5,
8772
- } }, `${comments === null || comments === void 0 ? void 0 : comments.length}/200`)),
8773
- (comments === null || comments === void 0 ? void 0 : comments.length) == 200 && (React.createElement("span", { style: {
8774
- fontSize: 12,
8775
- color: theme.palette.info.main,
8776
- marginLeft: 5,
8777
- } }, "Max. 200"))))))),
8771
+ } })) })))),
8778
8772
  React.createElement(MesfModal.Actions, null,
8779
8773
  React.createElement(Grid2, { container: true, spacing: 2, justifyContent: "flex-end" },
8780
- React.createElement(Grid2, { size: { md: 3, xs: 12 }, style: { margin: 0 } },
8774
+ React.createElement(Grid2, { size: { md: 3, xs: 12 } },
8781
8775
  React.createElement(Button, { fullWidth: true, variant: "contained", color: "inherit", onClick: () => onHide(false) }, "Cancel")),
8782
- React.createElement(Grid2, { size: { md: 3, xs: 12 }, style: { margin: 0 } },
8776
+ React.createElement(Grid2, { size: { md: 3, xs: 12 } },
8783
8777
  React.createElement(Button, { fullWidth: true, startIcon: isSubmitLoading && React.createElement(CircularProgress, { size: "1rem" }), disabled: isSubmitLoading, variant: "contained", color: "primary", type: "submit" }, "Save")))))),
8784
- React.createElement(ErrorModal, { error: error, onHide: () => setError("") }),
8778
+ React.createElement(ErrorModal, { error: error, onHide: () => setError(""), title: "Error updating Setting" }),
8785
8779
  React.createElement(Snackbar, { open: open, autoHideDuration: 2500, onClose: handleClose, anchorOrigin: { vertical: "bottom", horizontal: "center" } },
8786
- React.createElement(Alert$1, { severity: "success", onClose: handleClose }, "The shift was created successfully"))));
8787
- };
8788
-
8789
- const useShiftsOptionsFunctions = ({ setShiftId, setShowDeleteModal, setShowCreateModal, setShowEditModal, }) => {
8790
- const getMenuOptions = (data) => {
8791
- let options = [];
8792
- if (!data) {
8793
- options = options.concat([
8794
- {
8795
- name: "New Shift",
8796
- key: "new_shift",
8797
- onClick: () => {
8798
- setShowCreateModal(true);
8799
- },
8800
- icon: React__default.createElement(PlaylistAddIcon, null),
8801
- },
8802
- ]);
8803
- }
8804
- else {
8805
- options = options.concat([
8806
- {
8807
- name: "New Shift",
8808
- key: "new_shift",
8809
- onClick: () => {
8810
- setShowCreateModal(true);
8811
- },
8812
- icon: React__default.createElement(PlaylistAddIcon, null),
8813
- },
8814
- {
8815
- name: "Edit Shift",
8816
- key: "edit_shift",
8817
- onClick: () => {
8818
- setShiftId(data);
8819
- setShowEditModal(true);
8820
- },
8821
- icon: React__default.createElement(EditIcon, null),
8822
- },
8823
- {
8824
- name: "Delete Shift",
8825
- key: "delete_shift",
8826
- onClick: () => {
8827
- setShiftId(data);
8828
- setShowDeleteModal(true);
8829
- },
8830
- icon: React__default.createElement(DeleteIcon, null),
8831
- },
8832
- ]);
8833
- }
8834
- return options;
8835
- };
8836
- return {
8837
- getMenuOptions,
8838
- };
8839
- };
8840
-
8841
- const useTableData$5 = ({ setShiftSelected, setOpenModalEditShift, setOpenModalDeleteShift, showContextMenu, }) => {
8842
- const columnDefs = [
8843
- {
8844
- field: "PatternStart",
8845
- headerName: "Pattern Start",
8846
- valueFormatter: ({ value }) => `${moment$f(value).format("L")}, ${moment$f(value).format("LTS")}`,
8847
- minWidth: 180,
8848
- flex: 4,
8849
- cellStyle: {
8850
- display: "flex",
8851
- alignItems: "center",
8852
- justifyContent: "center",
8853
- },
8854
- },
8855
- {
8856
- field: "ShiftCodes",
8857
- headerName: "Shift Codes",
8858
- minWidth: 150,
8859
- flex: 2,
8860
- cellStyle: {
8861
- display: "flex",
8862
- alignItems: "center",
8863
- justifyContent: "center",
8864
- },
8865
- },
8866
- {
8867
- field: "Crews",
8868
- headerName: "Crews",
8869
- minWidth: 150,
8870
- flex: 2,
8871
- cellStyle: {
8872
- display: "flex",
8873
- alignItems: "center",
8874
- justifyContent: "center",
8875
- },
8876
- },
8877
- {
8878
- sortable: false,
8879
- field: "PatternDays",
8880
- headerName: "Shifts",
8881
- minWidth: 130,
8882
- flex: 1,
8883
- cellStyle: {
8884
- display: "flex",
8885
- alignItems: "center",
8886
- justifyContent: "center",
8887
- },
8888
- },
8889
- {
8890
- cellRenderer: (params) => {
8891
- return (React__default.createElement(Grid2, { container: true, style: {
8892
- height: "100%",
8893
- display: "flex",
8894
- justifyContent: "center",
8895
- alignItems: "center",
8896
- }, sx: {
8897
- opacity: 0,
8898
- transition: "opacity 0.1s ease-in-out",
8899
- ".ag-row-hover &": {
8900
- opacity: 1,
8901
- },
8902
- ".ag-row-focus &": {
8903
- opacity: 1,
8904
- },
8905
- ".ag-row-selected &": {
8906
- opacity: 1,
8907
- },
8908
- } },
8909
- React__default.createElement(Grid2, { size: { xs: 12, md: 12 }, style: {
8910
- display: "flex",
8911
- justifyContent: "center",
8912
- alignItems: "center",
8913
- } },
8914
- React__default.createElement(Button, { style: {}, onClick: () => {
8915
- setShiftSelected(params === null || params === void 0 ? void 0 : params.data);
8916
- setOpenModalEditShift(true);
8917
- } },
8918
- React__default.createElement(EditIcon, { color: "primary" })),
8919
- React__default.createElement(Button, { style: {}, onClick: () => {
8920
- setShiftSelected(params === null || params === void 0 ? void 0 : params.data);
8921
- setOpenModalDeleteShift(true);
8922
- } },
8923
- React__default.createElement(DeleteIcon, { color: "secondary" })),
8924
- React__default.createElement(Button, { style: {}, onClick: (e) => showContextMenu(e, params.data, "TableShifts") },
8925
- React__default.createElement(FormatListBulletedSharpIcon, { color: "action" })))));
8926
- },
8927
- field: "",
8928
- flex: 3,
8929
- minWidth: 240,
8930
- editable: false,
8931
- autoHeight: false,
8932
- suppressNavigable: true,
8933
- },
8934
- ];
8935
- return { columnDefs };
8780
+ React.createElement(Alert$1, { severity: "success", onClose: handleClose }, "The setting was edited successfully"))));
8936
8781
  };
8937
8782
 
8938
- const useSearchShifts = () => {
8783
+ const useSearchSettings = () => {
8939
8784
  return useQuery({
8940
- queryKey: ["shifts"],
8941
- queryFn: ({ signal }) => getShiftParameters(signal),
8785
+ queryKey: ["settings"],
8786
+ queryFn: ({ signal }) => getUTLSettings(signal),
8942
8787
  });
8943
8788
  };
8944
- const TableShiftsCrews = () => {
8945
- const gridRef = useRef(null);
8789
+ const TableSettings = () => {
8790
+ const queryClient = useQueryClient();
8791
+ const { showContextMenu, registerConfig } = useContextMenuMESF();
8946
8792
  const [error, setError] = useState("");
8793
+ const [gridApi, setGridApi] = useState(null);
8794
+ const [filterValue, setFilterValue] = useState("");
8795
+ const [settingSelected, setSettingSelected] = useState(null);
8947
8796
  const [openModalNew, setOpenModalNew] = useState(false);
8948
- const [openModalEditShift, setOpenModalEditShift] = useState(false);
8949
- const [openModalDeleteShift, setOpenModalDeleteShift] = useState(false);
8950
- const [shiftSelected, setShiftSelected] = useState(null);
8951
- const { data: rows, isLoading, isError, error: e, refetch, } = useSearchShifts();
8952
- const formattedRows = rows === null || rows === void 0 ? void 0 : rows.map(({ PatternStart, ShiftCodes, Crews, PatternDays, CrewRotation, Comments, CanEdit, }) => ({
8953
- id: ShiftCodes,
8954
- PatternStart,
8955
- ShiftCodes,
8956
- Crews,
8957
- PatternDays,
8958
- CrewRotation,
8959
- Comments,
8960
- CanEdit,
8961
- }));
8962
- const defaultColDef = useMemo(() => {
8963
- return {
8964
- sortable: true,
8965
- wrapText: true,
8966
- autoHeight: true,
8967
- wrapHeaderText: true,
8968
- suppressHeaderMenuButton: true,
8969
- cellStyle: {
8970
- display: "flex",
8971
- alignItems: "center",
8972
- justifyContent: "center",
8973
- },
8974
- };
8975
- }, []);
8976
- const { getMenuOptions } = useShiftsOptionsFunctions({
8977
- setShiftId: setShiftSelected,
8797
+ const [openModalEditSetting, setOpenModalEditSetting] = useState(false);
8798
+ const [openModalDeleteSetting, setOpenModalDeleteSetting] = useState(false);
8799
+ const { data: rows, isLoading, isError, error: e } = useSearchSettings();
8800
+ const { getMenuOptions } = useSettingsOptionsFunctions({
8801
+ setSettingId: setSettingSelected,
8802
+ setShowDeleteModal: setOpenModalDeleteSetting,
8978
8803
  setShowCreateModal: setOpenModalNew,
8979
- setShowDeleteModal: setOpenModalDeleteShift,
8980
- setShowEditModal: setOpenModalEditShift,
8804
+ setShowEditModal: setOpenModalEditSetting,
8981
8805
  });
8982
- const { showContextMenu, registerConfig } = useContextMenuMESF();
8983
- const { columnDefs } = useTableData$5({
8984
- setShiftSelected,
8985
- setOpenModalEditShift,
8986
- setOpenModalDeleteShift,
8806
+ const { columnDefs, defaultColDef } = useTableData$5({
8807
+ setOpenModalEditSetting,
8808
+ setOpenModalDeleteSetting,
8987
8809
  showContextMenu,
8810
+ setSettingSelected,
8988
8811
  });
8989
8812
  const getContextMenuItems = (params) => {
8990
8813
  var _a, _b;
8991
8814
  const data = (_a = params.node) === null || _a === void 0 ? void 0 : _a.data;
8992
8815
  params.api.deselectAll();
8993
8816
  (_b = params.node) === null || _b === void 0 ? void 0 : _b.setSelected(true);
8994
- showContextMenu(event, data, "TableShifts");
8817
+ showContextMenu(event, data, "TableSettings");
8995
8818
  return [];
8996
8819
  };
8997
8820
  useEffect(() => {
8998
8821
  registerConfig({
8999
- id: "TableShifts",
8822
+ id: "TableSettings",
9000
8823
  getOptions: getMenuOptions,
9001
8824
  });
9002
8825
  }, []);
@@ -9005,225 +8828,700 @@ const TableShiftsCrews = () => {
9005
8828
  setError(e.message);
9006
8829
  }
9007
8830
  }, [e, isError]);
9008
- return (React.createElement(React.Fragment, null,
9009
- React.createElement(Grid2, { container: true, justifyContent: "center", alignItems: "center", p: 1, spacing: 1 },
9010
- React.createElement(Grid2, { size: { md: 12, xs: 12 } },
9011
- React.createElement(Typography$1, { variant: "h5", fontWeight: 600 }, "Shifts / Crew")),
9012
- React.createElement(Grid2, { container: true, justifyContent: "center", alignItems: "center" },
9013
- React.createElement(Grid2, { container: true, size: { md: 12, xs: 12 } },
9014
- React.createElement(Grid2, { component: Paper, size: { md: 12, xs: 12 }, style: {
9015
- height: "70vh",
9016
- } },
9017
- React.createElement(AgGridReact, { loading: isLoading, gridOptions: {
8831
+ return (React__default.createElement(React__default.Fragment, null,
8832
+ React__default.createElement(Grid2, { container: true, justifyContent: "center", p: 1, spacing: 1 },
8833
+ React__default.createElement(Grid2, { size: { md: 12, xs: 12 } },
8834
+ React__default.createElement(Typography$1, { variant: "h5", fontWeight: 600 }, "Settings")),
8835
+ React__default.createElement(Grid2, { size: { md: 12, xs: 12 } },
8836
+ React__default.createElement(TextField, { fullWidth: true, label: "Search", variant: "outlined", size: "small", margin: "dense", value: filterValue, onChange: (event) => {
8837
+ setFilterValue(event.target.value);
8838
+ gridApi === null || gridApi === void 0 ? void 0 : gridApi.setGridOption("quickFilterText", event.target.value);
8839
+ }, slotProps: {
8840
+ input: {
8841
+ startAdornment: (React__default.createElement(InputAdornment, { position: "start" },
8842
+ React__default.createElement(IconButton$1, { edge: "start", type: "submit" },
8843
+ React__default.createElement(SearchIcon, null)))),
8844
+ },
8845
+ } })),
8846
+ React__default.createElement(Grid2, { container: true, size: { md: 12, xs: 12 } },
8847
+ React__default.createElement(Grid2, { size: { md: 12, xs: 12 }, style: {
8848
+ height: "70vh",
8849
+ } },
8850
+ React__default.createElement(Paper, { style: { height: "100%", width: "100%" } },
8851
+ React__default.createElement(AgGridReact, { loading: isLoading, gridOptions: {
9018
8852
  theme: themeDXT,
9019
- }, ref: gridRef, rowData: formattedRows || [], columnDefs: columnDefs, defaultColDef: defaultColDef, rowHeight: 34, headerHeight: 34, animateRows: true, loadingOverlayComponent: CenteredLazyLoading, getContextMenuItems: (e) => getContextMenuItems(e), rowSelection: "single", onRowDoubleClicked: (event) => {
9020
- setShiftSelected(event.data);
9021
- setOpenModalEditShift(true);
9022
- } })),
9023
- React.createElement(Grid2, { container: true, justifyContent: "flex-end" },
9024
- React.createElement(Grid2, { size: { md: 2, xs: 12 } },
9025
- React.createElement(Button, { variant: "contained", color: "primary", onClick: () => setOpenModalNew(!openModalNew), fullWidth: true }, "NEW SHIFT")))))),
9026
- React.createElement(CreateShift, { shiftSelected: shiftSelected, show: openModalNew, onHide: (shouldUpdate) => {
8853
+ }, rowData: rows, columnDefs: columnDefs, defaultColDef: defaultColDef, rowHeight: 34, headerHeight: 34, animateRows: true, loadingOverlayComponent: CenteredLazyLoading, getContextMenuItems: (e) => getContextMenuItems(e), rowSelection: "single", onRowDoubleClicked: (event) => {
8854
+ setSettingSelected(event.data);
8855
+ setOpenModalEditSetting(true);
8856
+ }, onGridReady: (params) => setGridApi(params.api) }))),
8857
+ React__default.createElement(Grid2, { container: true, justifyContent: "flex-end" },
8858
+ React__default.createElement(Grid2, { size: { md: 2, xs: 12 } },
8859
+ React__default.createElement(Button, { variant: "contained", color: "primary", onClick: () => setOpenModalNew(!openModalNew), fullWidth: true }, "NEW SETTING"))))),
8860
+ React__default.createElement(CreateSetting, { settingSelected: settingSelected, show: openModalNew, onHide: (shouldUpdate) => __awaiter(void 0, void 0, void 0, function* () {
9027
8861
  setOpenModalNew(false);
9028
8862
  if (shouldUpdate)
9029
- refetch();
9030
- }, suffixTitle: "Shifts / Crew" }),
9031
- React.createElement(EditShift, { shiftSelected: shiftSelected, show: openModalEditShift, onHide: (shouldUpdate) => {
9032
- setOpenModalEditShift(false);
8863
+ yield queryClient.invalidateQueries({ queryKey: ["settings"] });
8864
+ }), suffixTitle: "Settings" }),
8865
+ React__default.createElement(EditSetting, { settingSelected: settingSelected, show: openModalEditSetting, onHide: (shouldUpdate) => __awaiter(void 0, void 0, void 0, function* () {
8866
+ setOpenModalEditSetting(false);
9033
8867
  if (shouldUpdate)
9034
- refetch();
9035
- }, suffixTitle: "Shifts / Crew" }),
9036
- React.createElement(DeleteShift, { shiftSelected: shiftSelected, show: openModalDeleteShift, onHide: (shouldUpdate) => {
9037
- setOpenModalDeleteShift(false);
8868
+ yield queryClient.invalidateQueries({ queryKey: ["settings"] });
8869
+ }), suffixTitle: "Settings" }),
8870
+ React__default.createElement(DeleteSetting, { settingSelected: settingSelected, show: openModalDeleteSetting, onHide: (shouldUpdate) => __awaiter(void 0, void 0, void 0, function* () {
8871
+ setOpenModalDeleteSetting(false);
9038
8872
  if (shouldUpdate)
9039
- refetch();
9040
- }, suffixTitle: "Shifts / Crew" })));
9041
- };
9042
-
9043
- const ShiftsCrews = () => {
9044
- return (React.createElement(React.Fragment, null,
9045
- React.createElement(HelmetDexteel, { title: "Shifts and Crews" }),
9046
- React.createElement(TableShiftsCrews, null)));
9047
- };
9048
-
9049
- const ShiftsCrewsPage = (props) => {
9050
- return React.createElement(ShiftsCrews, null);
9051
- };
9052
-
9053
- const AssetPage = () => {
9054
- return (React__default.createElement(React__default.Fragment, null,
9055
- React__default.createElement(DndProvider, { backend: HTML5Backend },
9056
- React__default.createElement(TreeAsset, null))));
9057
- };
9058
-
9059
- const Asset = (props) => {
9060
- return React.createElement(AssetPage, null);
9061
- };
9062
-
9063
- const UsersPage = (props) => {
9064
- return React.createElement(Users, null);
8873
+ yield queryClient.invalidateQueries({ queryKey: ["settings"] });
8874
+ }), suffixTitle: "Settings" }),
8875
+ React__default.createElement(ErrorModal, { error: error, onHide: () => setError("") })));
9065
8876
  };
9066
8877
 
9067
- const CurrencyFormatter = new Intl.NumberFormat("en-US", {
9068
- style: "currency",
9069
- currency: "USD",
9070
- });
9071
- const NumberFormatter = new Intl.NumberFormat("en-US", {
9072
- style: "currency",
9073
- currency: "USD",
9074
- });
9075
- const IntegerFormatter = new Intl.NumberFormat("en-US", {});
9076
- const DateTimeFormatter = new Intl.DateTimeFormat("en-US-u-hc-h23", {
9077
- year: "numeric",
9078
- month: "2-digit",
9079
- day: "2-digit",
9080
- hour: "numeric",
9081
- minute: "numeric",
9082
- second: "numeric",
9083
- hour12: false,
9084
- // timeZone: 'America/Los_Angeles'
9085
- });
9086
- const DateFormatter = new Intl.DateTimeFormat("en-US", {
9087
- year: "numeric",
9088
- month: "2-digit",
9089
- day: "2-digit",
9090
- // timeZone: 'America/Los_Angeles'
9091
- });
9092
- const TimeFormatter = new Intl.DateTimeFormat("en-US-u-hc-h23", {
9093
- hour: "2-digit",
9094
- minute: "numeric",
9095
- second: "numeric",
9096
- hour12: false,
9097
- // timeZone: 'America/Los_Angeles'
9098
- });
9099
-
9100
- const getShiftStyle = (shift) => {
9101
- if (shift === "D") {
9102
- return { color: "#52a8b7" };
9103
- }
9104
- else if (shift === "N") {
9105
- return { color: "#A5A5A5" };
9106
- }
9107
- else {
9108
- return {};
9109
- }
9110
- };
9111
- const getCrewStyle = (crew) => {
9112
- if (crew === "A") {
9113
- return { color: "#0070C0" };
9114
- }
9115
- else if (crew === "B") {
9116
- return { color: "#FFD24A" };
9117
- }
9118
- else if (crew === "C") {
9119
- return { color: "#FD8359" };
9120
- }
9121
- else if (crew === "D") {
9122
- return { color: "#00B050" };
9123
- }
9124
- else {
9125
- return {};
9126
- }
9127
- };
9128
- const GetShiftColor = (props) => {
9129
- return (React__default.createElement(React__default.Fragment, null,
9130
- React__default.createElement(Square$1, { sx: Object.assign({ mr: 1 }, getShiftStyle(props.value)), fontSize: "small" })));
8878
+ const searchSettings = () => {
8879
+ return useQuery({
8880
+ queryKey: ["settings"],
8881
+ queryFn: ({ signal }) => getUTLSettings(signal),
8882
+ });
9131
8883
  };
9132
- const GetCrewColor = (props) => {
8884
+ const SettingsPage = () => {
9133
8885
  return (React__default.createElement(React__default.Fragment, null,
9134
- React__default.createElement(Square$1, { sx: Object.assign({ mr: 1 }, getCrewStyle(props.value)), fontSize: "small" })));
8886
+ React__default.createElement(HelmetDexteel, { title: "Settings" }),
8887
+ React__default.createElement(TableSettings, null)));
9135
8888
  };
9136
8889
 
9137
- const AssetInitialState = {
9138
- areasList: [],
9139
- allAssets: [],
9140
- plantAssetId: 1,
8890
+ const UTLSettingsInitialState = {
8891
+ serverTimeZone: Intl.DateTimeFormat().resolvedOptions().timeZone,
8892
+ settings: {},
9141
8893
  };
9142
- const AssetReducer = createSlice({
8894
+ const UTLSettingsReducer = createSlice({
9143
8895
  name: "__",
9144
- initialState: AssetInitialState,
8896
+ initialState: UTLSettingsInitialState,
9145
8897
  reducers: {
9146
- setAreasList(state, { payload }) {
9147
- state.areasList = payload;
8898
+ setServerTimeZone(state, { payload }) {
8899
+ state.serverTimeZone = payload;
9148
8900
  },
9149
- setAllAssets(state, { payload }) {
9150
- state.allAssets = payload;
8901
+ setSetting(state, { payload }) {
8902
+ state.settings[payload.key] = payload.value;
9151
8903
  },
9152
- setPlantAssetId(state, { payload }) {
9153
- state.plantAssetId = payload;
8904
+ initSettings(state, { payload }) {
8905
+ state.settings = payload.reduce((acc, cur) => {
8906
+ if (cur.SettingName.trim().toLowerCase() === "timezone") {
8907
+ const timeService = TimeService.getInstance();
8908
+ timeService.setTimeZone(cur.Value);
8909
+ }
8910
+ acc[cur.SettingName.trim()] = cur.Value;
8911
+ return acc;
8912
+ }, {});
9154
8913
  },
9155
8914
  },
9156
8915
  });
9157
8916
 
9158
- const AssetContext = createContext({
9159
- state: AssetReducer.getInitialState(),
9160
- actions: AssetReducer.actions,
8917
+ const UTLSettingsContext = createContext({
8918
+ state: UTLSettingsReducer.getInitialState(),
8919
+ actions: UTLSettingsReducer.actions,
8920
+ isLoading: true,
9161
8921
  });
9162
- const useAssetContext = () => useContext(AssetContext);
9163
- const AssetProvider = ({ children, plantAssetId = 1, }) => {
8922
+ const useUTLSettingsContext = () => useContext(UTLSettingsContext);
8923
+ const UTLSettingsProvider = ({ children }) => {
9164
8924
  const [state, actions] = useComplexState({
9165
- initialState: {
9166
- areasList: [],
9167
- allAssets: [],
9168
- plantAssetId,
9169
- },
9170
- reducers: AssetReducer.caseReducers,
8925
+ initialState: UTLSettingsReducer.getInitialState(),
8926
+ reducers: UTLSettingsReducer.caseReducers,
9171
8927
  });
9172
- return (React__default.createElement(AssetContext.Provider, { value: { state, actions } }, children));
8928
+ const { data: rows, isLoading, isError, error: e, isSuccess, refetch, } = searchSettings();
8929
+ useEffect(() => {
8930
+ if (isSuccess) {
8931
+ const settings = rows;
8932
+ const settingsTrimmed = settings.map((setting) => (Object.assign(Object.assign({}, setting), { SettingName: setting.SettingName.trim() })));
8933
+ actions.initSettings(settingsTrimmed);
8934
+ }
8935
+ }, [isSuccess]);
8936
+ useEffect(() => {
8937
+ if (e && isError) {
8938
+ console.error(e.message);
8939
+ }
8940
+ }, [e, isError]);
8941
+ useMesfRealtime({
8942
+ onReceiveMessage: (author, message) => {
8943
+ if (message === "UTL.GetSettings") {
8944
+ refetch();
8945
+ }
8946
+ },
8947
+ });
8948
+ return (React__default.createElement(UTLSettingsContext.Provider, { value: { state, actions, isLoading } }, children));
9173
8949
  };
9174
8950
 
9175
- const LogbookSettingsInitialState = {
9176
- entry: {
9177
- withAssetFilter: undefined,
9178
- filterAssets: undefined,
9179
- canEditAsset: false,
9180
- allowAttachments: false,
9181
- canEditShift: false,
9182
- showShiftCrew: false,
9183
- exportToExcel: false,
9184
- shiftsRange: 7,
9185
- presetAssetId: undefined,
9186
- },
9187
- report: {
9188
- withAssetFilter: undefined,
9189
- filterAssets: undefined,
9190
- showAttachments: false,
9191
- showAsset: false,
9192
- showShiftCrew: false,
9193
- exportToExcel: false,
9194
- },
9195
- section: {
9196
- schema: undefined,
9197
- withAssetFilter: undefined,
9198
- filterAssets: undefined,
9199
- canEditAsset: false,
9200
- allowAttachments: false,
9201
- showShiftCrew: false,
9202
- exportToExcel: false,
9203
- topSectionsCount: 5,
9204
- },
8951
+ const getShiftParameters = (assetId, signal) => __awaiter(void 0, void 0, void 0, function* () {
8952
+ const apiService = new MESApiService();
8953
+ const parameters = [{ name: "AssetId", value: assetId }];
8954
+ const resp = yield apiService.callV2("[MES].[GetShiftParameters]", parameters, signal);
8955
+ if (resp.ok) {
8956
+ return get(resp, "data.tables[0].rows", []);
8957
+ }
8958
+ else {
8959
+ throw new Error(resp.message || "Error fetching shifts");
8960
+ }
8961
+ });
8962
+ const upsertShiftParameters = (_a, assetId_1, ...args_1) => __awaiter(void 0, [_a, assetId_1, ...args_1], void 0, function* ({ PatternStart, ShiftCodes, Crews, CrewRotation, Comments }, assetId, isUpdate = false) {
8963
+ const apiService = new MESApiService();
8964
+ const parameters = [
8965
+ { name: "AssetId", value: assetId },
8966
+ { name: "PatternStart", value: PatternStart },
8967
+ { name: "ShiftCodes", value: ShiftCodes },
8968
+ { name: "Crews", value: Crews },
8969
+ { name: "CrewRotation", value: CrewRotation },
8970
+ { name: "Comments", value: Comments },
8971
+ { name: "IsUpdate", value: isUpdate },
8972
+ ];
8973
+ const resp = yield apiService.callV2("[MES].[UpsertShiftParameters]", parameters);
8974
+ if (!resp.ok) {
8975
+ throw new Error(resp.message || "Error when upsert shift");
8976
+ }
8977
+ });
8978
+ const deleteShiftParameters = (assetId, PatternStart) => __awaiter(void 0, void 0, void 0, function* () {
8979
+ const apiService = new MESApiService();
8980
+ const parameters = [];
8981
+ parameters.push({ name: "AssetId", value: assetId });
8982
+ parameters.push({ name: "PatternStart", value: PatternStart });
8983
+ const resp = yield apiService.callV2("[MES].[DeleteShiftParameters]", parameters);
8984
+ if (!resp.ok) {
8985
+ throw new Error(resp.message || "Error when delete shift");
8986
+ }
8987
+ });
8988
+
8989
+ const INITIAL_VALUES = {
8990
+ PatternStart: new Date(),
8991
+ ShiftCodes: "",
8992
+ Crews: "",
8993
+ User: "",
8994
+ PatternDays: 5,
8995
+ CrewRotation: "",
8996
+ Comments: "",
8997
+ CanEdit: false,
8998
+ ShiftsPerDay: 1,
8999
+ NumberOfCrews: 1,
9000
+ };
9001
+
9002
+ const CreateShift = ({ shiftSelected, show, onHide, suffixTitle, assetId, assetName, }) => {
9003
+ var _a, _b;
9004
+ const theme = useTheme();
9005
+ const [open, setOpen] = useState(false);
9006
+ const [isSubmitLoading, setIsSubmitLoading] = useState(false);
9007
+ const [error, setError] = useState("");
9008
+ const { control, handleSubmit, reset, watch, setValue, formState: { errors }, } = useForm({
9009
+ defaultValues: shiftSelected ? shiftSelected : INITIAL_VALUES,
9010
+ });
9011
+ // Progress bar
9012
+ const calculatePercentage = () => ((crewRotation === null || crewRotation === void 0 ? void 0 : crewRotation.length) / maxCrewRotationLength) * 100;
9013
+ const createShift = useMutation({
9014
+ mutationFn: (data) => upsertShiftParameters(data, assetId),
9015
+ onSuccess: () => {
9016
+ setOpen(true);
9017
+ onHide(true);
9018
+ },
9019
+ onError: (error) => {
9020
+ setError(error.message);
9021
+ },
9022
+ onSettled: () => {
9023
+ setIsSubmitLoading(false);
9024
+ },
9025
+ });
9026
+ const onSubmit = (data) => __awaiter(void 0, void 0, void 0, function* () {
9027
+ setIsSubmitLoading(true);
9028
+ yield createShift.mutate(data);
9029
+ });
9030
+ const handleClose = (event, reason) => {
9031
+ if (reason === "clickaway") {
9032
+ return;
9033
+ }
9034
+ setOpen(false);
9035
+ };
9036
+ // const patternStart = watch('PatternStart');
9037
+ const shiftsPerDay = watch("ShiftsPerDay");
9038
+ const shiftCodes = watch("ShiftCodes");
9039
+ const numberOfCrews = watch("NumberOfCrews");
9040
+ const crewsCodes = watch("Crews");
9041
+ const rotationPattern = watch("PatternDays");
9042
+ const crewRotation = watch("CrewRotation");
9043
+ const comments = watch("Comments");
9044
+ const maxCrewRotationLength = shiftsPerDay * rotationPattern;
9045
+ useEffect(() => {
9046
+ if (show) {
9047
+ reset();
9048
+ setValue("PatternStart", new Date());
9049
+ }
9050
+ }, [show]);
9051
+ return (React.createElement(React.Fragment, null,
9052
+ show && (React.createElement(HelmetDexteel, { title: `New Shift/Crew${suffixTitle ? ` - ${suffixTitle}` : ""}` })),
9053
+ React.createElement(MesfModal, { title: "NEW SHIFT/CREW", open: show, handleClose: () => onHide(false), id: "create-shift-modal", maxWidth: "md" },
9054
+ React.createElement("form", { onSubmit: handleSubmit(onSubmit) },
9055
+ React.createElement(MesfModal.Content, null,
9056
+ React.createElement(Grid2, { container: true, spacing: 2, p: 1 },
9057
+ React.createElement(Grid2, { size: { md: 12, xs: 12 } },
9058
+ React.createElement(TextField, { label: "Asset", value: assetName, disabled: true, fullWidth: true, variant: "outlined", margin: "dense" })),
9059
+ React.createElement(Controller, { name: "PatternStart", control: control, render: ({ field: { value, onChange } }) => (React.createElement(LocalizationProvider, { dateAdapter: AdapterMoment },
9060
+ React.createElement(Grid2, { size: { md: 6, xs: 12 } },
9061
+ React.createElement(DatePicker$1, { format: "MM/DD/YYYY", sx: {
9062
+ minWidth: "100%",
9063
+ borderTopLeftRadius: 3,
9064
+ borderTopRightRadius: 3,
9065
+ }, label: "Start", value: value ? moment$f(value) : value, onChange: (evt) => onChange(evt === null || evt === void 0 ? void 0 : evt.toDate()), slotProps: {
9066
+ textField: {
9067
+ fullWidth: true,
9068
+ variant: "standard",
9069
+ },
9070
+ } })),
9071
+ React.createElement(Grid2, { size: { md: 6, xs: 12 } },
9072
+ React.createElement(DatePicker$1, { label: "Time", value: value ? moment$f(value) : value, onChange: (evt) => onChange(evt === null || evt === void 0 ? void 0 : evt.toDate()), slotProps: {
9073
+ textField: {
9074
+ fullWidth: true,
9075
+ variant: "standard",
9076
+ },
9077
+ } })))) }),
9078
+ React.createElement(Grid2, { size: { md: 6, xs: 6 } },
9079
+ React.createElement(Controller, { name: "ShiftsPerDay", control: control, rules: {
9080
+ min: 1,
9081
+ }, render: ({ field: { onChange, value } }) => (React.createElement(TextField, { label: `# ${shiftsPerDay > 1 ? "Shifts" : "Shift"} per day`, variant: "outlined", error: !!errors.ShiftsPerDay, fullWidth: true, margin: "dense", autoComplete: "off", type: "number", value: value, onChange: (evt) => parseInt(evt.target.value) >= 1 &&
9082
+ parseInt(evt.target.value) <= 10 &&
9083
+ onChange(evt) })) }),
9084
+ ((_a = errors.ShiftsPerDay) === null || _a === void 0 ? void 0 : _a.type) === "min" && (React.createElement(ErrorLabel, { text: "Shift per day is required" }))),
9085
+ React.createElement(Grid2, { size: { md: 6, xs: 6 } },
9086
+ React.createElement(Controller, { name: "ShiftCodes", control: control, rules: {
9087
+ validate: (value) => value.length == shiftsPerDay,
9088
+ }, render: ({ field: { onChange, value } }) => (React.createElement(TextField, { label: "Shifts Ids", variant: "outlined", error: !!errors.ShiftCodes, fullWidth: true, margin: "dense", autoComplete: "off", value: value, onChange: (evt) => {
9089
+ // TODO: aquí podriamos hacer que no pueda haber dos valores iguales, para prevenir errores. Ej. dos DNN
9090
+ if (evt.target.value.length <= shiftsPerDay)
9091
+ onChange(evt.target.value.toString().toUpperCase());
9092
+ } })) }),
9093
+ !!errors.ShiftCodes && (React.createElement("span", { style: {
9094
+ fontSize: 12,
9095
+ } },
9096
+ "Please put ",
9097
+ shiftsPerDay,
9098
+ " shifts")),
9099
+ shiftCodes.length < shiftsPerDay &&
9100
+ !!errors.ShiftCodes === false && (React.createElement("span", { style: {
9101
+ fontSize: 12,
9102
+ color: theme.palette.info.main,
9103
+ } }, `Insert: ${shiftsPerDay} ${shiftsPerDay == 1 ? "Id" : "Ids"}. ${shiftsPerDay > 1 ? "The Ids must be differents" : ""}`))),
9104
+ React.createElement(Grid2, { size: { md: 6, xs: 6 } },
9105
+ React.createElement(Controller, { name: "NumberOfCrews", control: control, rules: {
9106
+ min: 1,
9107
+ max: 9,
9108
+ }, render: ({ field: { onChange, value } }) => (React.createElement(TextField, { label: `# ${numberOfCrews > 1 ? "Crews" : "Crew"}`, variant: "outlined", error: !!errors.NumberOfCrews, fullWidth: true, margin: "dense", autoComplete: "off", type: "number", onChange: (evt) => {
9109
+ // max. crew 15
9110
+ if (parseInt(evt.target.value) >= 1 &&
9111
+ parseInt(evt.target.value) <= 15)
9112
+ onChange(evt);
9113
+ }, value: value })) }),
9114
+ ((_b = errors.NumberOfCrews) === null || _b === void 0 ? void 0 : _b.type) === "min" && (React.createElement(ErrorLabel, { text: "# Crews days is required" }))),
9115
+ React.createElement(Grid2, { size: { md: 6, xs: 6 } },
9116
+ React.createElement(Controller, { name: "Crews", control: control, rules: {
9117
+ validate: (value) => value.length == numberOfCrews,
9118
+ }, render: ({ field: { onChange, value } }) => (React.createElement(TextField, { label: "Crews Ids", variant: "outlined", error: !!errors.Crews, fullWidth: true, margin: "dense", autoComplete: "off", value: value, onChange: (evt) => {
9119
+ if (evt.target.value.length <= numberOfCrews)
9120
+ onChange(evt.target.value.toString().toUpperCase());
9121
+ } })) }),
9122
+ !!errors.Crews && (React.createElement("span", { style: {
9123
+ fontSize: 12,
9124
+ } },
9125
+ "Please put ",
9126
+ numberOfCrews,
9127
+ " crews")),
9128
+ crewsCodes.length < numberOfCrews &&
9129
+ !!errors.Crews === false && (React.createElement("span", { style: {
9130
+ fontSize: 12,
9131
+ color: theme.palette.info.main,
9132
+ } }, `Insert: ${numberOfCrews} ${numberOfCrews == 1 ? "Crew" : "Crews"}. ${numberOfCrews > 1 ? "The Crews must be differents" : ""}`))),
9133
+ React.createElement(Grid2, { size: { md: 6, xs: 6 } },
9134
+ React.createElement(Controller, { name: "PatternDays", control: control, render: ({ field: { value, onChange } }) => (React.createElement(TextField, { label: "Rotation Pattern", variant: "outlined", error: !!errors.PatternDays, fullWidth: true, type: "number", margin: "dense", autoComplete: "off", value: value, onChange: (evt) => {
9135
+ if (parseInt(evt.target.value) >= 5 &&
9136
+ parseInt(evt.target.value) <= 60)
9137
+ onChange(evt);
9138
+ } })) })),
9139
+ React.createElement(Grid2, { size: { md: 12, xs: 12 } },
9140
+ React.createElement(Controller, { name: "CrewRotation", control: control, rules: {
9141
+ validate: (value) => value.length == maxCrewRotationLength,
9142
+ }, render: ({ field: { value, onChange } }) => (React.createElement(TextField, { value: value, onChange: (evt) => {
9143
+ if (evt.target.value.length <= maxCrewRotationLength)
9144
+ onChange(evt.target.value.toString().toUpperCase());
9145
+ }, label: "Crew rotation", variant: "outlined", fullWidth: true, error: !!errors.CrewRotation, margin: "dense", autoComplete: "off" })) }),
9146
+ React.createElement(Grid2, { container: true, height: 2 },
9147
+ React.createElement(Grid2, { style: {
9148
+ height: 2,
9149
+ width: `${calculatePercentage()}% `,
9150
+ backgroundColor: `${crewRotation.length == maxCrewRotationLength
9151
+ ? "#4CAF50"
9152
+ : "#F44336"}`,
9153
+ transition: " 0.2s ease",
9154
+ margin: "0 5px",
9155
+ } })),
9156
+ React.createElement(Grid2, { container: true, style: { margin: "4px 0 0" } },
9157
+ React.createElement(Grid2, null, (crewRotation === null || crewRotation === void 0 ? void 0 : crewRotation.length) >= 1 &&
9158
+ (crewRotation === null || crewRotation === void 0 ? void 0 : crewRotation.length) !==
9159
+ maxCrewRotationLength && (React.createElement("span", { style: {
9160
+ fontSize: 12,
9161
+ color: theme.palette.info.main,
9162
+ marginLeft: 5,
9163
+ } }, `${crewRotation === null || crewRotation === void 0 ? void 0 : crewRotation.length}/${maxCrewRotationLength}`)))),
9164
+ !!errors.CrewRotation && (React.createElement(ErrorLabel, { text: `Please put ${maxCrewRotationLength} crews` })),
9165
+ numberOfCrews > 0 &&
9166
+ Number.isInteger(maxCrewRotationLength / numberOfCrews) ===
9167
+ false && (React.createElement(Grid2, { container: true, style: { padding: "0", marginLeft: 5 } },
9168
+ React.createElement(ErrorLabel, { text: `Rotation # not a multiple of Shifts (${maxCrewRotationLength}) / Crews (${numberOfCrews})` })))),
9169
+ React.createElement(Grid2, { size: { md: 12, xs: 12 } },
9170
+ React.createElement(Controller, { name: "Comments", control: control, render: ({ field: { value, onChange } }) => (React.createElement(TextField, { style: { margin: "8px 0" }, size: "medium", maxRows: 5, label: "Comments", multiline: true, variant: "outlined", fullWidth: true, autoComplete: "off", value: value, onChange: (evt) => {
9171
+ if (evt.target.value.length <= 200)
9172
+ onChange(evt);
9173
+ } })) }),
9174
+ React.createElement(Grid2, { container: true, style: { marginBottom: 18 } },
9175
+ React.createElement(Grid2, null,
9176
+ (comments === null || comments === void 0 ? void 0 : comments.length) >= 1 &&
9177
+ (comments === null || comments === void 0 ? void 0 : comments.length) !== 200 && (React.createElement("span", { style: {
9178
+ fontSize: 12,
9179
+ color: theme.palette.info.main,
9180
+ marginLeft: 5,
9181
+ } }, `${comments === null || comments === void 0 ? void 0 : comments.length}/200 max.`)),
9182
+ (comments === null || comments === void 0 ? void 0 : comments.length) == 200 && (React.createElement("span", { style: {
9183
+ fontSize: 12,
9184
+ color: theme.palette.info.main,
9185
+ marginLeft: 5,
9186
+ } }, "Max. 200"))))))),
9187
+ React.createElement(MesfModal.Actions, null,
9188
+ React.createElement(Grid2, { container: true, spacing: 2, justifyContent: "flex-end" },
9189
+ React.createElement(Grid2, { size: { md: 3, xs: 12 } },
9190
+ React.createElement(Button, { fullWidth: true, variant: "contained", color: "inherit", onClick: () => onHide(false) }, "Cancel")),
9191
+ React.createElement(Grid2, { size: { md: 3, xs: 12 } },
9192
+ React.createElement(Button, { fullWidth: true, startIcon: isSubmitLoading && React.createElement(CircularProgress, { size: "1rem" }), disabled: isSubmitLoading, variant: "contained", color: "primary", type: "submit" }, "Save")))))),
9193
+ React.createElement(ErrorModal, { error: error, onHide: () => setError(""), title: "Error Creating Shift" }),
9194
+ React.createElement(Snackbar, { open: open, autoHideDuration: 2500, onClose: handleClose, anchorOrigin: { vertical: "bottom", horizontal: "center" } },
9195
+ React.createElement(Alert$1, { severity: "success", onClose: handleClose }, "The shift was created successfully"))));
9196
+ };
9197
+
9198
+ const DeleteShift = ({ shiftSelected, show, onHide, suffixTitle, assetId, assetName, }) => {
9199
+ var _a;
9200
+ const [open, setOpen] = useState(false);
9201
+ const [isSubmitLoading, setIsSubmitLoading] = useState(false);
9202
+ const [deleteAlert, setDeleteAlert] = useState(false);
9203
+ const [error, setError] = useState("");
9204
+ const { control, setValue, reset, watch, formState: { errors }, } = useForm({ defaultValues: INITIAL_VALUES });
9205
+ const deleteShift = useMutation({
9206
+ mutationFn: (patternStart) => deleteShiftParameters(assetId, patternStart),
9207
+ onSuccess: () => {
9208
+ setOpen(true);
9209
+ onHide(true);
9210
+ },
9211
+ onError: (error) => {
9212
+ setError(error.message);
9213
+ },
9214
+ onSettled: () => {
9215
+ setIsSubmitLoading(false);
9216
+ setDeleteAlert(false);
9217
+ },
9218
+ });
9219
+ const onDelete = (data) => __awaiter(void 0, void 0, void 0, function* () {
9220
+ setIsSubmitLoading(true);
9221
+ yield deleteShift.mutate(data);
9222
+ });
9223
+ const handleClose = (event, reason) => {
9224
+ if (reason === "clickaway") {
9225
+ return;
9226
+ }
9227
+ setOpen(false);
9228
+ setDeleteAlert(false);
9229
+ };
9230
+ const patternStart = watch("PatternStart");
9231
+ const shiftsPerDay = watch("ShiftsPerDay");
9232
+ const crewRotation = watch("CrewRotation");
9233
+ const numberOfCrews = watch("NumberOfCrews");
9234
+ const crewsCodes = watch("Crews");
9235
+ const rotationPattern = watch("PatternDays");
9236
+ useEffect(() => {
9237
+ var _a, _b, _c, _d, _e, _f;
9238
+ if (show) {
9239
+ reset();
9240
+ setValue("PatternStart", (_a = shiftSelected === null || shiftSelected === void 0 ? void 0 : shiftSelected.PatternStart) !== null && _a !== void 0 ? _a : new Date());
9241
+ setValue("ShiftCodes", (_b = shiftSelected === null || shiftSelected === void 0 ? void 0 : shiftSelected.ShiftCodes) !== null && _b !== void 0 ? _b : "");
9242
+ setValue("Crews", (_c = shiftSelected === null || shiftSelected === void 0 ? void 0 : shiftSelected.Crews) !== null && _c !== void 0 ? _c : "");
9243
+ setValue("PatternDays", (_d = shiftSelected === null || shiftSelected === void 0 ? void 0 : shiftSelected.PatternDays) !== null && _d !== void 0 ? _d : 0);
9244
+ setValue("CrewRotation", (_e = shiftSelected === null || shiftSelected === void 0 ? void 0 : shiftSelected.CrewRotation) !== null && _e !== void 0 ? _e : "");
9245
+ setValue("Comments", (_f = shiftSelected === null || shiftSelected === void 0 ? void 0 : shiftSelected.Comments) !== null && _f !== void 0 ? _f : "");
9246
+ }
9247
+ }, [show]);
9248
+ return (React.createElement(React.Fragment, null,
9249
+ show && (React.createElement(HelmetDexteel, { title: `Delete Shift${suffixTitle ? ` - ${suffixTitle}` : ""}` })),
9250
+ React.createElement(MesfModal, { title: "DELETE SHIFT", open: show, handleClose: () => onHide(false), id: "delete-shift-MesfModal", maxWidth: "md" },
9251
+ React.createElement("form", null,
9252
+ React.createElement(MesfModal.Content, null,
9253
+ React.createElement(Grid2, { container: true, spacing: 2, p: 1 },
9254
+ React.createElement(Grid2, { size: { md: 12, xs: 12 } },
9255
+ React.createElement(TextField, { label: "Asset", value: assetName, disabled: true, fullWidth: true, variant: "outlined", margin: "dense" })),
9256
+ React.createElement(Controller, { name: "PatternStart", control: control, render: ({ field: { value, onChange } }) => (React.createElement(LocalizationProvider, { dateAdapter: AdapterMoment },
9257
+ React.createElement(Grid2, { size: { md: 6, xs: 12 } },
9258
+ React.createElement(DatePicker$1, { format: "MM/DD/YYYY", sx: {
9259
+ minWidth: "100%",
9260
+ borderTopLeftRadius: 3,
9261
+ borderTopRightRadius: 3,
9262
+ }, label: "Start", value: value ? moment$f(value) : value, onChange: (evt) => onChange(evt === null || evt === void 0 ? void 0 : evt.toDate()), slotProps: {
9263
+ textField: {
9264
+ fullWidth: true,
9265
+ variant: "standard",
9266
+ disabled: true,
9267
+ },
9268
+ } })),
9269
+ React.createElement(Grid2, { size: { md: 6, xs: 12 } },
9270
+ React.createElement(DatePicker$1, { label: "Time", value: value ? moment$f(value) : value, onChange: (evt) => onChange(evt === null || evt === void 0 ? void 0 : evt.toDate()), slotProps: {
9271
+ textField: {
9272
+ fullWidth: true,
9273
+ variant: "standard",
9274
+ disabled: true,
9275
+ },
9276
+ } })))) }),
9277
+ React.createElement(Grid2, { size: { md: 6, xs: 6 } },
9278
+ React.createElement(Controller, { name: "ShiftsPerDay", control: control, rules: {
9279
+ min: 1,
9280
+ }, render: ({ field: { onChange, value } }) => (React.createElement(TextField, { label: `# ${shiftsPerDay > 1 ? "Shifts" : "Shift"} per day`, variant: "outlined", error: !!errors.ShiftsPerDay, fullWidth: true, margin: "dense", autoComplete: "off", type: "number", value: crewRotation.length / rotationPattern, disabled: !!shiftSelected })) }),
9281
+ ((_a = errors.ShiftsPerDay) === null || _a === void 0 ? void 0 : _a.type) === "min" && (React.createElement(ErrorLabel, { text: "Shift per day is required" }))),
9282
+ React.createElement(Grid2, { size: { md: 6, xs: 6 }, style: { paddingBottom: "0" } },
9283
+ React.createElement(Controller, { name: "ShiftCodes", control: control, render: ({ field: { value } }) => (React.createElement(TextField, { label: "Shifts Ids", variant: "outlined", error: !!errors.ShiftCodes, fullWidth: true, margin: "dense", autoComplete: "off", value: value, disabled: !!shiftSelected })) })),
9284
+ React.createElement(Grid2, { size: { md: 6, xs: 6 } },
9285
+ React.createElement(Controller, { name: "NumberOfCrews", control: control, rules: {
9286
+ min: 1,
9287
+ max: 9,
9288
+ }, render: ({ field: { value } }) => (React.createElement(TextField, { label: `# ${numberOfCrews > 1 ? "Crews" : "Crew"}`, variant: "outlined", error: !!errors.NumberOfCrews, fullWidth: true, margin: "dense", autoComplete: "off", type: "number", value: crewsCodes.length, disabled: !!shiftSelected })) })),
9289
+ React.createElement(Grid2, { size: { md: 6, xs: 6 }, style: { paddingBottom: "0" } },
9290
+ React.createElement(Controller, { name: "Crews", control: control, render: ({ field: { value } }) => (React.createElement(TextField, { label: "Crews Ids", variant: "outlined", error: !!errors.Crews, fullWidth: true, margin: "dense", autoComplete: "off", value: value, disabled: !!shiftSelected })) })),
9291
+ React.createElement(Grid2, { size: { md: 6, xs: 6 } },
9292
+ React.createElement(Controller, { name: "PatternDays", control: control, render: ({ field: { value } }) => (React.createElement(TextField, { label: "Rotation Pattern", variant: "outlined", error: !!errors.PatternDays, fullWidth: true, type: "number", margin: "dense", autoComplete: "off", value: value, disabled: !!shiftSelected })) })),
9293
+ React.createElement(Grid2, { size: { md: 12, xs: 12 } },
9294
+ React.createElement(Controller, { name: "CrewRotation", control: control, render: ({ field: { value, onChange } }) => (React.createElement(TextField, { label: "Crew rotation", variant: "outlined", fullWidth: true, margin: "dense", autoComplete: "off", value: value, disabled: !!shiftSelected })) })),
9295
+ React.createElement(Grid2, { size: { md: 12, xs: 12 } },
9296
+ React.createElement(Controller, { name: "Comments", control: control, render: ({ field: { value, onChange } }) => (React.createElement(TextField, { style: { margin: "8px 0" }, size: "medium", maxRows: 5, label: "Comments", multiline: true, variant: "outlined", fullWidth: true, autoComplete: "off", value: value, disabled: !!shiftSelected })) })))),
9297
+ React.createElement(MesfModal.Actions, null,
9298
+ React.createElement(Grid2, { container: true, spacing: 2, justifyContent: "flex-end" },
9299
+ React.createElement(Grid2, { size: { md: 3, xs: 12 }, style: { margin: 0 } },
9300
+ React.createElement(Button, { fullWidth: true, variant: "contained", color: "inherit", onClick: () => onHide(false) }, "Cancel")),
9301
+ React.createElement(Grid2, { size: { md: 3, xs: 12 }, style: { margin: 0 } },
9302
+ React.createElement(Button, { fullWidth: true, startIcon: isSubmitLoading && React.createElement(CircularProgress, { size: "1rem" }), disabled: isSubmitLoading
9303
+ ? isSubmitLoading
9304
+ : shiftSelected
9305
+ ? new Date(shiftSelected.PatternStart) < new Date() &&
9306
+ true
9307
+ : false, variant: "contained", color: "secondary", onClick: () => setDeleteAlert(true) }, "Delete"),
9308
+ shiftSelected &&
9309
+ new Date(shiftSelected === null || shiftSelected === void 0 ? void 0 : shiftSelected.PatternStart) < new Date() && (React.createElement(Grid2, null,
9310
+ React.createElement(ErrorLabel, { text: "Can not delete before the current date" })))))),
9311
+ React.createElement(Dialog$1, { open: deleteAlert, onClose: () => handleClose(), "aria-labelledby": "responsive-dialog-title" },
9312
+ React.createElement(DialogTitle$1, { id: "responsive-dialog-title" }, "WARNING"),
9313
+ React.createElement(DialogContent$1, null,
9314
+ React.createElement(DialogContentText, { style: { padding: 0, margin: 0 } }, "Be careful, once deleted you will not be able to recover this shift, are you sure you want to delete it?")),
9315
+ React.createElement(DialogActions$1, { style: { padding: "16px 24px" } },
9316
+ React.createElement(Button, { onClick: () => setDeleteAlert(false), autoFocus: true, color: "inherit" }, "CANCEL"),
9317
+ React.createElement(Button, { startIcon: isSubmitLoading && React.createElement(CircularProgress, { size: "1rem" }), autoFocus: true, color: "secondary", onClick: () => onDelete(patternStart) }, "Delete"))))),
9318
+ React.createElement(ErrorModal, { error: error, onHide: () => setError("") }),
9319
+ React.createElement(Snackbar, { open: open, autoHideDuration: 2500, onClose: handleClose, anchorOrigin: { vertical: "bottom", horizontal: "center" } },
9320
+ React.createElement(Alert$1, { severity: "warning", onClose: handleClose }, "The shift was deleted successfully"))));
9205
9321
  };
9206
9322
 
9207
- const LogbookSettingsContext = createContext(LogbookSettingsInitialState);
9208
- const useLogbookSettings = () => useContext(LogbookSettingsContext);
9209
- const LogbookSettingsProvider = ({ children, logbookSettings = {}, }) => {
9210
- // Merge default settings with provided settings
9211
- const settings = useMemo(() => ({
9212
- entry: Object.assign(Object.assign({}, LogbookSettingsInitialState.entry), (logbookSettings.entry || {})),
9213
- report: Object.assign(Object.assign({}, LogbookSettingsInitialState.report), (logbookSettings.report || {})),
9214
- section: Object.assign(Object.assign({}, LogbookSettingsInitialState.section), (logbookSettings.section || {})),
9215
- }), [logbookSettings]);
9216
- return (React__default.createElement(LogbookSettingsContext.Provider, { value: settings }, children));
9323
+ const EditShift = ({ shiftSelected, show, onHide, suffixTitle, assetId, assetName, }) => {
9324
+ const theme = useTheme();
9325
+ const [open, setOpen] = useState(false);
9326
+ const [error, setError] = useState("");
9327
+ const [isSubmitLoading, setIsSubmitLoading] = useState(false);
9328
+ const [initialShiftPerDayAndCrewsNumber, setInitialShiftPerDayAndCrewsNumber,] = useState(false);
9329
+ const { control, setValue, handleSubmit, reset, watch, formState: { errors }, } = useForm({ defaultValues: INITIAL_VALUES });
9330
+ // Progress bar
9331
+ const calculatePercentage = () => ((crewRotation === null || crewRotation === void 0 ? void 0 : crewRotation.length) / maxCrewRotationLength) * 100;
9332
+ const createShift = useMutation({
9333
+ mutationFn: ({ shiftData, isUpdate, }) => upsertShiftParameters(shiftData, assetId, isUpdate),
9334
+ onSuccess: () => {
9335
+ setOpen(true);
9336
+ onHide(true);
9337
+ },
9338
+ onError: (error) => {
9339
+ setError(error.message);
9340
+ },
9341
+ onSettled: () => {
9342
+ setIsSubmitLoading(false);
9343
+ },
9344
+ });
9345
+ const onSubmit = (data) => __awaiter(void 0, void 0, void 0, function* () {
9346
+ setIsSubmitLoading(true);
9347
+ yield createShift.mutate({ shiftData: data, isUpdate: true });
9348
+ });
9349
+ const handleClose = (event, reason) => {
9350
+ if (reason === "clickaway") {
9351
+ return;
9352
+ }
9353
+ setOpen(false);
9354
+ };
9355
+ // const patternStart = watch('PatternStart');
9356
+ const shiftsPerDay = watch("ShiftsPerDay");
9357
+ const shiftCodes = watch("ShiftCodes");
9358
+ const numberOfCrews = watch("NumberOfCrews");
9359
+ const crewsCodes = watch("Crews");
9360
+ const rotationPattern = watch("PatternDays");
9361
+ const comments = watch("Comments");
9362
+ const crewRotation = watch("CrewRotation");
9363
+ const maxCrewRotationLength = shiftsPerDay * rotationPattern;
9364
+ useEffect(() => {
9365
+ var _a, _b, _c, _d, _e, _f;
9366
+ if (show) {
9367
+ reset();
9368
+ setValue("PatternStart", (_a = shiftSelected === null || shiftSelected === void 0 ? void 0 : shiftSelected.PatternStart) !== null && _a !== void 0 ? _a : new Date());
9369
+ setValue("ShiftCodes", (_b = shiftSelected === null || shiftSelected === void 0 ? void 0 : shiftSelected.ShiftCodes) !== null && _b !== void 0 ? _b : "");
9370
+ setValue("Crews", (_c = shiftSelected === null || shiftSelected === void 0 ? void 0 : shiftSelected.Crews) !== null && _c !== void 0 ? _c : "");
9371
+ setValue("PatternDays", (_d = shiftSelected === null || shiftSelected === void 0 ? void 0 : shiftSelected.PatternDays) !== null && _d !== void 0 ? _d : 0);
9372
+ setValue("CrewRotation", (_e = shiftSelected === null || shiftSelected === void 0 ? void 0 : shiftSelected.CrewRotation) !== null && _e !== void 0 ? _e : "");
9373
+ setValue("Comments", (_f = shiftSelected === null || shiftSelected === void 0 ? void 0 : shiftSelected.Comments) !== null && _f !== void 0 ? _f : "");
9374
+ setInitialShiftPerDayAndCrewsNumber(!initialShiftPerDayAndCrewsNumber);
9375
+ }
9376
+ }, [show]);
9377
+ useEffect(() => {
9378
+ setValue("ShiftsPerDay", crewRotation.length / rotationPattern);
9379
+ setValue("NumberOfCrews", crewsCodes.length);
9380
+ }, [initialShiftPerDayAndCrewsNumber]);
9381
+ return (React.createElement(React.Fragment, null,
9382
+ show && (React.createElement(HelmetDexteel, { title: `Edit Shift${suffixTitle ? ` - ${suffixTitle}` : ""}` })),
9383
+ React.createElement(MesfModal, { title: "EDIT SHIFT", open: show, handleClose: () => onHide(false), id: "edit-shift-modal", maxWidth: "md" },
9384
+ React.createElement("form", { onSubmit: handleSubmit(onSubmit) },
9385
+ React.createElement(MesfModal.Content, null,
9386
+ React.createElement(Grid2, { container: true, spacing: 2, p: 1 },
9387
+ React.createElement(Grid2, { size: { md: 12, xs: 12 } },
9388
+ React.createElement(TextField, { label: "Asset", value: assetName, disabled: true, fullWidth: true, variant: "outlined", margin: "dense" })),
9389
+ React.createElement(Controller, { name: "PatternStart", control: control, render: ({ field: { value, onChange } }) => (React.createElement(LocalizationProvider, { dateAdapter: AdapterMoment },
9390
+ React.createElement(Grid2, { size: { md: 6, xs: 12 } },
9391
+ React.createElement(DatePicker$1, { format: "MM/DD/YYYY", sx: {
9392
+ minWidth: "100%",
9393
+ borderTopLeftRadius: 3,
9394
+ borderTopRightRadius: 3,
9395
+ }, label: "Start", value: value ? moment$f(value) : value, onChange: (evt) => onChange(evt === null || evt === void 0 ? void 0 : evt.toDate()), slotProps: {
9396
+ textField: {
9397
+ fullWidth: true,
9398
+ variant: "standard",
9399
+ },
9400
+ } })),
9401
+ React.createElement(Grid2, { size: { md: 6, xs: 12 } },
9402
+ React.createElement(DatePicker$1, { label: "Time", value: value ? moment$f(value) : value, onChange: (evt) => onChange(evt === null || evt === void 0 ? void 0 : evt.toDate()), slotProps: {
9403
+ textField: {
9404
+ fullWidth: true,
9405
+ variant: "standard",
9406
+ },
9407
+ } })))) }),
9408
+ React.createElement(Grid2, { size: { md: 6, xs: 6 } },
9409
+ React.createElement(Controller, { name: "ShiftsPerDay", control: control, rules: {
9410
+ min: 1,
9411
+ }, render: ({ field: { onChange, value } }) => (React.createElement(TextField, { label: `# ${shiftsPerDay > 1 ? "Shifts" : "Shift"} per day`, variant: "outlined", error: !!errors.ShiftsPerDay, fullWidth: true, margin: "dense", autoComplete: "off", type: "number", value: value, onChange:
9412
+ // FIXME: límite de 10?
9413
+ (evt) => parseInt(evt.target.value) >= 1 &&
9414
+ parseInt(evt.target.value) <= 10 &&
9415
+ onChange(evt) })) })),
9416
+ React.createElement(Grid2, { size: { md: 6, xs: 6 } },
9417
+ React.createElement(Controller, { name: "ShiftCodes", control: control, rules: {
9418
+ required: `Please put ${shiftsPerDay} shifts`,
9419
+ validate: (value) => value.length == shiftsPerDay,
9420
+ }, render: ({ field: { onChange, value }, fieldState: { error }, }) => (React.createElement(TextField, { label: "Shifts Ids", variant: "outlined", error: !!error, helperText: error === null || error === void 0 ? void 0 : error.message, fullWidth: true, margin: "dense", autoComplete: "off", value: value, onChange: (evt) => {
9421
+ // TODO: aquí deberíamos prevenir, que no pueda haber dos valores iguales, . Ej. dos DNN
9422
+ if (evt.target.value.length <= shiftsPerDay)
9423
+ onChange(evt.target.value.toString().toUpperCase());
9424
+ } })) }),
9425
+ shiftCodes.length < shiftsPerDay &&
9426
+ !!errors.ShiftCodes === false && (React.createElement(ErrorLabel, { text: `Insert: ${shiftsPerDay} ${shiftsPerDay == 1 ? "Id" : "Ids"}. ${shiftsPerDay > 1 ? "The Ids must be differents" : ""}` }))),
9427
+ React.createElement(Grid2, { size: { md: 6, xs: 6 } },
9428
+ React.createElement(Controller, { name: "NumberOfCrews", control: control, rules: {
9429
+ required: "# Crews day is required",
9430
+ min: 1,
9431
+ max: 9,
9432
+ }, render: ({ field: { onChange, value }, fieldState: { error }, }) => (React.createElement(TextField, { label: `# ${numberOfCrews > 1 ? "Crews" : "Crew"}`, variant: "outlined", error: !!error, helperText: error === null || error === void 0 ? void 0 : error.message, fullWidth: true, margin: "dense", autoComplete: "off", type: "number", value: value, onChange: (evt) => {
9433
+ if (parseInt(evt.target.value) >= 1 &&
9434
+ parseInt(evt.target.value) <= 9)
9435
+ onChange(evt);
9436
+ } })) })),
9437
+ React.createElement(Grid2, { size: { md: 6, xs: 6 } },
9438
+ React.createElement(Controller, { name: "Crews", control: control, rules: {
9439
+ required: `Please put ${numberOfCrews} crews`,
9440
+ validate: (value) => value.length == numberOfCrews,
9441
+ }, render: ({ field: { onChange, value }, fieldState: { error }, }) => (React.createElement(TextField, { label: "Crews Ids", variant: "outlined", error: !!error, helperText: error === null || error === void 0 ? void 0 : error.message, disabled: numberOfCrews <= 0, fullWidth: true, margin: "dense", autoComplete: "off", value: value, onChange: (evt) => {
9442
+ if (evt.target.value.length <= numberOfCrews)
9443
+ onChange(evt.target.value.toString().toUpperCase());
9444
+ } })) }),
9445
+ crewsCodes.length < numberOfCrews &&
9446
+ !!errors.Crews === false && (React.createElement(ErrorLabel, { text: `Insert: ${numberOfCrews} ${numberOfCrews == 1 ? "Crew" : "Crews"}. ${numberOfCrews > 1 ? "The Crews must be differents" : ""}` }))),
9447
+ React.createElement(Grid2, { size: { md: 6, xs: 6 } },
9448
+ React.createElement(Controller, { name: "PatternDays", control: control,
9449
+ // rules={{
9450
+ // required: true
9451
+ // }}
9452
+ render: ({ field: { value, onChange } }) => (React.createElement(TextField, { label: "Rotation Pattern", variant: "outlined", error: !!errors.PatternDays, fullWidth: true, type: "number", margin: "dense", autoComplete: "off", value: value, onChange: (evt) => {
9453
+ // FIXME: consultar si estos valores están bien, son los limites del sP
9454
+ if (parseInt(evt.target.value) >= 5 &&
9455
+ parseInt(evt.target.value) <= 60)
9456
+ onChange(evt);
9457
+ } })) })),
9458
+ React.createElement(Grid2, { size: { md: 12, xs: 12 } },
9459
+ React.createElement(Controller, { name: "CrewRotation", control: control, rules: {
9460
+ validate: (value) => value.length == maxCrewRotationLength,
9461
+ }, render: ({ field: { value, onChange } }) => (React.createElement(TextField, { value: value, onChange: (evt) => {
9462
+ if (evt.target.value.length <= maxCrewRotationLength)
9463
+ onChange(evt.target.value.toString().toUpperCase());
9464
+ }, error: !!errors.CrewRotation, label: "Crew rotation", variant: "outlined", fullWidth: true, margin: "dense", autoComplete: "off" })) }),
9465
+ React.createElement(Grid2, { container: true, height: 2 },
9466
+ React.createElement(Grid2, { style: {
9467
+ height: 2,
9468
+ width: `${calculatePercentage()}% `,
9469
+ backgroundColor: `${crewRotation.length == maxCrewRotationLength
9470
+ ? "#4CAF50"
9471
+ : "#F44336"}`,
9472
+ transition: " 0.2s ease",
9473
+ margin: "0 5px",
9474
+ } })),
9475
+ React.createElement(Grid2, { container: true },
9476
+ React.createElement(Grid2, null, (crewRotation === null || crewRotation === void 0 ? void 0 : crewRotation.length) >= 1 &&
9477
+ (crewRotation === null || crewRotation === void 0 ? void 0 : crewRotation.length) !==
9478
+ maxCrewRotationLength && (React.createElement("span", { style: {
9479
+ fontSize: 12,
9480
+ color: theme.palette.info.main,
9481
+ marginLeft: 5,
9482
+ } }, `${crewRotation === null || crewRotation === void 0 ? void 0 : crewRotation.length}/${maxCrewRotationLength}`)))),
9483
+ !!errors.CrewRotation && (React.createElement(ErrorLabel, { text: `Please put ${maxCrewRotationLength} crews` })),
9484
+ numberOfCrews > 0 &&
9485
+ Number.isInteger(maxCrewRotationLength / numberOfCrews) ===
9486
+ false && (React.createElement(Grid2, { container: true, style: { padding: "0", marginLeft: 5 } },
9487
+ React.createElement(ErrorLabel, { text: `Rotation # not a multiple of Shifts (${maxCrewRotationLength}) / Crews (${numberOfCrews})` })))),
9488
+ React.createElement(Grid2, { size: { md: 12, xs: 12 } },
9489
+ React.createElement(Controller, { name: "Comments", control: control, render: ({ field: { value, onChange } }) => (React.createElement(TextField, { style: { margin: "8px 0" }, size: "medium", maxRows: 5, label: "Comments", multiline: true, variant: "outlined", fullWidth: true, autoComplete: "off", value: value, onChange: (evt) => {
9490
+ if (evt.target.value.length <= 200)
9491
+ onChange(evt);
9492
+ } })) }),
9493
+ React.createElement(Grid2, { container: true, style: { marginBottom: 18 } },
9494
+ React.createElement(Grid2, null,
9495
+ (comments === null || comments === void 0 ? void 0 : comments.length) >= 1 &&
9496
+ (comments === null || comments === void 0 ? void 0 : comments.length) !== 200 && (React.createElement("span", { style: {
9497
+ fontSize: 12,
9498
+ color: theme.palette.info.main,
9499
+ marginLeft: 5,
9500
+ } }, `${comments === null || comments === void 0 ? void 0 : comments.length}/200`)),
9501
+ (comments === null || comments === void 0 ? void 0 : comments.length) == 200 && (React.createElement("span", { style: {
9502
+ fontSize: 12,
9503
+ color: theme.palette.info.main,
9504
+ marginLeft: 5,
9505
+ } }, "Max. 200"))))))),
9506
+ React.createElement(MesfModal.Actions, null,
9507
+ React.createElement(Grid2, { container: true, spacing: 2, justifyContent: "flex-end" },
9508
+ React.createElement(Grid2, { size: { md: 3, xs: 12 }, style: { margin: 0 } },
9509
+ React.createElement(Button, { fullWidth: true, variant: "contained", color: "inherit", onClick: () => onHide(false) }, "Cancel")),
9510
+ React.createElement(Grid2, { size: { md: 3, xs: 12 }, style: { margin: 0 } },
9511
+ React.createElement(Button, { fullWidth: true, startIcon: isSubmitLoading && React.createElement(CircularProgress, { size: "1rem" }), disabled: isSubmitLoading, variant: "contained", color: "primary", type: "submit" }, "Save")))))),
9512
+ React.createElement(ErrorModal, { error: error, onHide: () => setError("") }),
9513
+ React.createElement(Snackbar, { open: open, autoHideDuration: 2500, onClose: handleClose, anchorOrigin: { vertical: "bottom", horizontal: "center" } },
9514
+ React.createElement(Alert$1, { severity: "success", onClose: handleClose }, "The shift was created successfully"))));
9217
9515
  };
9218
9516
 
9219
- const useSettingsOptionsFunctions = ({ setSettingId, setShowDeleteModal, setShowCreateModal, setShowEditModal, }) => {
9517
+ const useShiftsOptionsFunctions = ({ setShiftId, setShowDeleteModal, setShowCreateModal, setShowEditModal, }) => {
9220
9518
  const getMenuOptions = (data) => {
9221
9519
  let options = [];
9222
9520
  if (!data) {
9223
9521
  options = options.concat([
9224
9522
  {
9225
- name: "New Setting",
9226
- key: "new_setting",
9523
+ name: "New Shift",
9524
+ key: "new_shift",
9227
9525
  onClick: () => {
9228
9526
  setShowCreateModal(true);
9229
9527
  },
@@ -9234,27 +9532,27 @@ const useSettingsOptionsFunctions = ({ setSettingId, setShowDeleteModal, setShow
9234
9532
  else {
9235
9533
  options = options.concat([
9236
9534
  {
9237
- name: "New Setting",
9238
- key: "new_setting",
9535
+ name: "New Shift",
9536
+ key: "new_shift",
9239
9537
  onClick: () => {
9240
9538
  setShowCreateModal(true);
9241
9539
  },
9242
9540
  icon: React__default.createElement(PlaylistAddIcon, null),
9243
9541
  },
9244
9542
  {
9245
- name: "Edit Setting",
9246
- key: "edit_setting",
9543
+ name: "Edit Shift",
9544
+ key: "edit_shift",
9247
9545
  onClick: () => {
9248
- setSettingId(data);
9546
+ setShiftId(data);
9249
9547
  setShowEditModal(true);
9250
9548
  },
9251
9549
  icon: React__default.createElement(EditIcon, null),
9252
9550
  },
9253
9551
  {
9254
- name: "Delete Setting",
9255
- key: "delete_setting",
9552
+ name: "Delete Shift",
9553
+ key: "delete_shift",
9256
9554
  onClick: () => {
9257
- setSettingId(data);
9555
+ setShiftId(data);
9258
9556
  setShowDeleteModal(true);
9259
9557
  },
9260
9558
  icon: React__default.createElement(DeleteIcon, null),
@@ -9268,33 +9566,62 @@ const useSettingsOptionsFunctions = ({ setSettingId, setShowDeleteModal, setShow
9268
9566
  };
9269
9567
  };
9270
9568
 
9271
- const useTableData$4 = ({ setOpenModalEditSetting, setOpenModalDeleteSetting, showContextMenu, setSettingSelected, }) => {
9569
+ const useTableData$4 = ({ setShiftSelected, setOpenModalEditShift, setOpenModalDeleteShift, showContextMenu, }) => {
9272
9570
  const columnDefs = [
9273
9571
  {
9274
- field: "SettingName",
9275
- headerName: "Name",
9572
+ field: "PatternStart",
9573
+ headerName: "Pattern Start",
9574
+ valueFormatter: ({ value }) => `${moment$f(value).format("L")}, ${moment$f(value).format("LTS")}`,
9276
9575
  minWidth: 180,
9277
9576
  flex: 4,
9577
+ cellStyle: {
9578
+ display: "flex",
9579
+ alignItems: "center",
9580
+ justifyContent: "center",
9581
+ },
9582
+ },
9583
+ {
9584
+ field: "ShiftCodes",
9585
+ headerName: "Shift Codes",
9586
+ minWidth: 150,
9587
+ flex: 2,
9588
+ cellStyle: {
9589
+ display: "flex",
9590
+ alignItems: "center",
9591
+ justifyContent: "center",
9592
+ },
9278
9593
  },
9279
9594
  {
9280
- field: "Value",
9281
- headerName: "Value",
9282
- minWidth: 180,
9595
+ field: "Crews",
9596
+ headerName: "Crews",
9597
+ minWidth: 150,
9283
9598
  flex: 2,
9599
+ cellStyle: {
9600
+ display: "flex",
9601
+ alignItems: "center",
9602
+ justifyContent: "center",
9603
+ },
9284
9604
  },
9285
9605
  {
9286
- field: "Description",
9287
- headerName: "Description",
9288
- minWidth: 150,
9289
- flex: 4,
9606
+ sortable: false,
9607
+ field: "PatternDays",
9608
+ headerName: "Shifts",
9609
+ minWidth: 130,
9610
+ flex: 1,
9611
+ cellStyle: {
9612
+ display: "flex",
9613
+ alignItems: "center",
9614
+ justifyContent: "center",
9615
+ },
9290
9616
  },
9291
9617
  {
9292
9618
  cellRenderer: (params) => {
9293
- return (React__default.createElement(Grid2, { container: true, sx: {
9619
+ return (React__default.createElement(Grid2, { container: true, style: {
9294
9620
  height: "100%",
9295
9621
  display: "flex",
9296
9622
  justifyContent: "center",
9297
9623
  alignItems: "center",
9624
+ }, sx: {
9298
9625
  opacity: 0,
9299
9626
  transition: "opacity 0.1s ease-in-out",
9300
9627
  ".ag-row-hover &": {
@@ -9309,329 +9636,101 @@ const useTableData$4 = ({ setOpenModalEditSetting, setOpenModalDeleteSetting, sh
9309
9636
  } },
9310
9637
  React__default.createElement(Grid2, { size: { xs: 12, md: 12 }, style: {
9311
9638
  display: "flex",
9312
- justifyContent: "space-evenly",
9639
+ justifyContent: "center",
9313
9640
  alignItems: "center",
9314
9641
  } },
9315
- React__default.createElement(IconButton$1, { size: "small", onClick: () => {
9316
- setSettingSelected(params === null || params === void 0 ? void 0 : params.data);
9317
- setOpenModalEditSetting(true);
9642
+ React__default.createElement(Button, { style: {}, onClick: () => {
9643
+ setShiftSelected(params === null || params === void 0 ? void 0 : params.data);
9644
+ setOpenModalEditShift(true);
9318
9645
  } },
9319
9646
  React__default.createElement(EditIcon, { color: "primary" })),
9320
- React__default.createElement(IconButton$1, { size: "small", onClick: () => {
9321
- setSettingSelected(params === null || params === void 0 ? void 0 : params.data);
9322
- setOpenModalDeleteSetting(true);
9647
+ React__default.createElement(Button, { style: {}, onClick: () => {
9648
+ setShiftSelected(params === null || params === void 0 ? void 0 : params.data);
9649
+ setOpenModalDeleteShift(true);
9323
9650
  } },
9324
9651
  React__default.createElement(DeleteIcon, { color: "secondary" })),
9325
- React__default.createElement(IconButton$1, { size: "small", onClick: (e) => showContextMenu(e, params.data, "TableSettings") },
9652
+ React__default.createElement(Button, { style: {}, onClick: (e) => showContextMenu(e, params.data, "TableShifts") },
9326
9653
  React__default.createElement(FormatListBulletedSharpIcon, { color: "action" })))));
9327
9654
  },
9328
9655
  field: "",
9329
- flex: 1,
9656
+ flex: 3,
9330
9657
  minWidth: 240,
9331
9658
  editable: false,
9332
9659
  autoHeight: false,
9333
- suppressNavigable: true,
9334
- },
9335
- ];
9336
- const defaultColDef = useMemo(() => {
9337
- return {
9338
- sortable: true,
9339
- wrapText: true,
9340
- autoHeight: true,
9341
- wrapHeaderText: true,
9342
- suppressHeaderMenuButton: true,
9343
- cellStyle: {
9344
- display: "flex",
9345
- alignItems: "center",
9346
- justifyContent: "center",
9347
- },
9348
- };
9349
- }, []);
9350
- return { columnDefs, defaultColDef };
9351
- };
9352
-
9353
- const INITIAL_VALUES = {
9354
- SettingName: "",
9355
- Value: "",
9356
- Description: "",
9357
- };
9358
-
9359
- const upsertSettings = (_a) => __awaiter(void 0, [_a], void 0, function* ({ oldName, newName, description, value, }) {
9360
- const apiService = new MESApiService();
9361
- const parameters = [
9362
- { name: "OldName", value: oldName },
9363
- { name: "NewName", value: newName },
9364
- { name: "Description", value: description },
9365
- { name: "Value", value: value },
9366
- ];
9367
- const resp = yield apiService.callV2("[UTL].[SetSetting]", parameters);
9368
- if (!resp.ok) {
9369
- throw new Error(resp.message || "Error when upsert setting");
9370
- }
9371
- });
9372
- const deleteSetting = (settingName) => __awaiter(void 0, void 0, void 0, function* () {
9373
- const apiService = new MESApiService();
9374
- const parameters = [
9375
- { name: "SettingName", value: settingName },
9376
- ];
9377
- const resp = yield apiService.callV2("[UTL].[DeleteSetting]", parameters);
9378
- if (!resp.ok) {
9379
- throw new Error(resp.message || "Error when delete setting");
9380
- }
9381
- });
9382
-
9383
- const CreateSetting = ({ settingSelected, show, onHide, suffixTitle, }) => {
9384
- const [open, setOpen] = useState(false);
9385
- const [isSubmitLoading, setIsSubmitLoading] = useState(false);
9386
- const [error, setError] = useState("");
9387
- const { control, handleSubmit, reset } = useForm({
9388
- defaultValues: settingSelected ? settingSelected : INITIAL_VALUES,
9389
- });
9390
- const updateSetting = useMutation({
9391
- mutationFn: upsertSettings,
9392
- onSuccess: () => {
9393
- setOpen(true);
9394
- onHide(true);
9395
- },
9396
- onError: (error) => {
9397
- setError(error.message);
9398
- },
9399
- onSettled: () => {
9400
- setIsSubmitLoading(false);
9401
- },
9402
- });
9403
- const onSubmit = (data) => __awaiter(void 0, void 0, void 0, function* () {
9404
- setIsSubmitLoading(true);
9405
- yield updateSetting.mutate({
9406
- oldName: "",
9407
- newName: data.SettingName,
9408
- description: data.Description,
9409
- value: data.Value,
9410
- });
9411
- });
9412
- const handleClose = (event, reason) => {
9413
- if (reason === "clickaway") {
9414
- return;
9415
- }
9416
- setOpen(false);
9417
- };
9418
- useEffect(() => {
9419
- if (show) {
9420
- reset();
9421
- }
9422
- }, [show]);
9423
- return (React.createElement(React.Fragment, null,
9424
- show && (React.createElement(HelmetDexteel, { title: `New Setting${suffixTitle ? ` - ${suffixTitle}` : ""}` })),
9425
- React.createElement(Grid2, { container: true },
9426
- React.createElement(Grid2, null,
9427
- React.createElement(MesfModal, { title: "NEW SETTING", open: show, handleClose: () => onHide(false), id: "create-setting-modal", maxWidth: "md" },
9428
- React.createElement("form", { onSubmit: handleSubmit(onSubmit) },
9429
- React.createElement(MesfModal.Content, null,
9430
- React.createElement(Grid2, { container: true, spacing: 2 },
9431
- React.createElement(Grid2, { size: { xs: 12, md: 6 } },
9432
- React.createElement(Controller, { name: "SettingName", control: control, rules: { required: "Name is required" }, render: ({ field, fieldState: { error } }) => (React.createElement(TextField, Object.assign({}, field, { label: "Name", error: !!error, helperText: error ? error.message : null, autoComplete: "off" }))) })),
9433
- React.createElement(Grid2, { size: { xs: 12, md: 6 } },
9434
- React.createElement(Controller, { name: "Value", control: control, rules: {
9435
- required: "Value is required",
9436
- }, render: ({ field, fieldState: { error } }) => (React.createElement(TextField, Object.assign({}, field, { label: "Value", error: !!error, helperText: error ? error.message : null, autoComplete: "off" }))) })),
9437
- React.createElement(Grid2, { size: { md: 12, xs: 12 } },
9438
- React.createElement(Controller, { name: "Description", control: control, render: ({ field: { value, onChange } }) => (React.createElement(TextField, { size: "medium", maxRows: 5, label: "Description", multiline: true, autoComplete: "off", value: value, onChange: (evt) => {
9439
- if (evt.target.value.length <= 200)
9440
- onChange(evt);
9441
- } })) })))),
9442
- React.createElement(MesfModal.Actions, null,
9443
- React.createElement(Grid2, { container: true, spacing: 2, justifyContent: "flex-end" },
9444
- React.createElement(Grid2, { size: { md: 3, xs: 12 } },
9445
- React.createElement(Button, { fullWidth: true, variant: "contained", color: "inherit", onClick: () => onHide(false) }, "Cancel")),
9446
- React.createElement(Grid2, { size: { md: 3, xs: 12 } },
9447
- React.createElement(Button, { fullWidth: true, startIcon: isSubmitLoading && React.createElement(CircularProgress, { size: "1rem" }), disabled: isSubmitLoading, variant: "contained", color: "primary", type: "submit" }, "Save")))))))),
9448
- React.createElement(ErrorModal, { error: error, onHide: () => setError(""), title: "Error Creating Setting" }),
9449
- React.createElement(Snackbar, { open: open, autoHideDuration: 2500, onClose: handleClose, anchorOrigin: { vertical: "bottom", horizontal: "center" } },
9450
- React.createElement(Alert$1, { severity: "success", onClose: handleClose }, "The setting was created successfully"))));
9451
- };
9452
-
9453
- const DeleteSetting = ({ settingSelected, show, onHide, suffixTitle, }) => {
9454
- const [open, setOpen] = useState(false);
9455
- const [isSubmitLoading, setIsSubmitLoading] = useState(false);
9456
- const [error, setError] = useState("");
9457
- const { control, handleSubmit, reset, setValue } = useForm({
9458
- defaultValues: settingSelected ? settingSelected : INITIAL_VALUES,
9459
- });
9460
- const removeSetting = useMutation({
9461
- mutationFn: deleteSetting,
9462
- onSuccess: () => {
9463
- setOpen(true);
9464
- onHide(true);
9465
- },
9466
- onError: (error) => {
9467
- setError(error.message);
9468
- },
9469
- onSettled: () => {
9470
- setIsSubmitLoading(false);
9471
- },
9472
- });
9473
- const onSubmit = (data) => __awaiter(void 0, void 0, void 0, function* () {
9474
- setIsSubmitLoading(true);
9475
- yield removeSetting.mutate(data.SettingName);
9476
- });
9477
- const handleClose = (event, reason) => {
9478
- if (reason === "clickaway") {
9479
- return;
9480
- }
9481
- setOpen(false);
9482
- };
9483
- useEffect(() => {
9484
- if (show) {
9485
- reset();
9486
- if (settingSelected) {
9487
- setValue("SettingName", settingSelected.SettingName);
9488
- setValue("Value", settingSelected.Value);
9489
- setValue("Description", settingSelected.Description);
9490
- }
9491
- }
9492
- }, [show]);
9493
- return (React.createElement(React.Fragment, null,
9494
- show && (React.createElement(HelmetDexteel, { title: `Delete Setting${suffixTitle ? ` - ${suffixTitle}` : ""}` })),
9495
- React.createElement(Grid2, { container: true },
9496
- React.createElement(Grid2, null,
9497
- React.createElement(MesfModal, { title: "DELETE SETTING", open: show, handleClose: () => onHide(false), id: "delete-setting-modal", maxWidth: "md" },
9498
- React.createElement("form", { onSubmit: handleSubmit(onSubmit) },
9499
- React.createElement(MesfModal.Content, null,
9500
- React.createElement(Grid2, { container: true, spacing: 2 },
9501
- React.createElement(Grid2, { size: { xs: 12, md: 6 } },
9502
- React.createElement(Controller, { name: "SettingName", control: control, rules: { required: "Name is required" }, render: ({ field, fieldState: { error } }) => (React.createElement(TextField, Object.assign({ disabled: true }, field, { label: "Name", variant: "outlined", error: !!error, helperText: error ? error.message : null, fullWidth: true, margin: "dense", autoComplete: "off" }))) })),
9503
- React.createElement(Grid2, { size: { xs: 12, md: 6 } },
9504
- React.createElement(Controller, { name: "Value", control: control, rules: { required: "Value is required" }, render: ({ field, fieldState: { error } }) => (React.createElement(TextField, Object.assign({ disabled: true }, field, { label: "Value", variant: "outlined", error: !!error, helperText: error ? error.message : null, fullWidth: true, margin: "dense", autoComplete: "off" }))) })),
9505
- React.createElement(Grid2, { size: { md: 12, xs: 12 } },
9506
- React.createElement(Controller, { name: "Description", control: control, render: ({ field: { value, onChange } }) => (React.createElement(TextField, { disabled: true, size: "medium", maxRows: 5, label: "Description", multiline: true, autoComplete: "off", value: value, onChange: (evt) => {
9507
- if (evt.target.value.length <= 200)
9508
- onChange(evt);
9509
- } })) })))),
9510
- React.createElement(MesfModal.Actions, null,
9511
- React.createElement(Grid2, { container: true, spacing: 2, justifyContent: "flex-end" },
9512
- React.createElement(Grid2, { size: { md: 3, xs: 12 } },
9513
- React.createElement(Button, { fullWidth: true, variant: "contained", color: "inherit", onClick: () => onHide(false) }, "Cancel")),
9514
- React.createElement(Grid2, { size: { md: 3, xs: 12 } },
9515
- React.createElement(Button, { fullWidth: true, startIcon: isSubmitLoading && React.createElement(CircularProgress, { size: "1rem" }), disabled: isSubmitLoading, variant: "contained", color: "secondary", type: "submit" }, "Delete")))))))),
9516
- React.createElement(ErrorModal, { error: error, onHide: () => setError(""), title: "Error deleting Setting" }),
9517
- React.createElement(Snackbar, { open: open, autoHideDuration: 2500, onClose: handleClose, anchorOrigin: { vertical: "bottom", horizontal: "center" } },
9518
- React.createElement(Alert$1, { severity: "success", onClose: handleClose }, "The setting was deleted successfully"))));
9519
- };
9520
-
9521
- const EditSetting = ({ settingSelected, show, onHide, suffixTitle, }) => {
9522
- const [open, setOpen] = useState(false);
9523
- const [isSubmitLoading, setIsSubmitLoading] = useState(false);
9524
- const [error, setError] = useState("");
9525
- const { control, handleSubmit, reset, setValue } = useForm({
9526
- defaultValues: settingSelected ? settingSelected : INITIAL_VALUES,
9527
- });
9528
- const updateSetting = useMutation({
9529
- mutationFn: upsertSettings,
9530
- onSuccess: () => {
9531
- setOpen(true);
9532
- onHide(true);
9533
- },
9534
- onError: (error) => {
9535
- setError(error.message);
9536
- },
9537
- onSettled: () => {
9538
- setIsSubmitLoading(false);
9660
+ suppressNavigable: true,
9539
9661
  },
9540
- });
9541
- const onSubmit = (data) => __awaiter(void 0, void 0, void 0, function* () {
9542
- var _a;
9543
- setIsSubmitLoading(true);
9544
- yield updateSetting.mutate({
9545
- oldName: (_a = settingSelected === null || settingSelected === void 0 ? void 0 : settingSelected.SettingName) !== null && _a !== void 0 ? _a : null,
9546
- newName: data.SettingName,
9547
- description: data.Description,
9548
- value: data.Value,
9549
- });
9550
- });
9551
- const handleClose = (event, reason) => {
9552
- if (reason === "clickaway") {
9553
- return;
9554
- }
9555
- setOpen(false);
9556
- };
9557
- useEffect(() => {
9558
- if (show) {
9559
- reset();
9560
- if (settingSelected) {
9561
- setValue("SettingName", settingSelected.SettingName);
9562
- setValue("Value", settingSelected.Value);
9563
- setValue("Description", settingSelected.Description);
9564
- }
9565
- }
9566
- }, [show]);
9567
- return (React.createElement(React.Fragment, null,
9568
- show && (React.createElement(HelmetDexteel, { title: `Edit Setting${suffixTitle ? ` - ${suffixTitle}` : ""}` })),
9569
- React.createElement(MesfModal, { title: "EDIT SETTING", open: show, handleClose: () => onHide(false), id: "edit-setting-modal", maxWidth: "md" },
9570
- React.createElement("form", { onSubmit: handleSubmit(onSubmit) },
9571
- React.createElement(MesfModal.Content, null,
9572
- React.createElement(Grid2, { container: true, spacing: 2 },
9573
- React.createElement(Grid2, { size: { xs: 12, md: 6 } },
9574
- React.createElement(Controller, { name: "SettingName", control: control, rules: { required: "Name is required" }, render: ({ field, fieldState: { error } }) => (React.createElement(TextField, Object.assign({}, field, { label: "Name", error: !!error, helperText: error ? error.message : null, autoComplete: "off" }))) })),
9575
- React.createElement(Grid2, { size: { xs: 12, md: 6 } },
9576
- React.createElement(Controller, { name: "Value", control: control, rules: {
9577
- required: "Value is required",
9578
- }, render: ({ field, fieldState: { error } }) => (React.createElement(TextField, Object.assign({}, field, { label: "Value", error: !!error, helperText: error ? error.message : null, autoComplete: "off" }))) })),
9579
- React.createElement(Grid2, { size: { md: 12, xs: 12 } },
9580
- React.createElement(Controller, { name: "Description", control: control, render: ({ field: { value, onChange } }) => (React.createElement(TextField, { size: "medium", maxRows: 5, label: "Description", multiline: true, variant: "outlined", fullWidth: true, autoComplete: "off", value: value, onChange: (evt) => {
9581
- if (evt.target.value.length <= 200)
9582
- onChange(evt);
9583
- } })) })))),
9584
- React.createElement(MesfModal.Actions, null,
9585
- React.createElement(Grid2, { container: true, spacing: 2, justifyContent: "flex-end" },
9586
- React.createElement(Grid2, { size: { md: 3, xs: 12 } },
9587
- React.createElement(Button, { fullWidth: true, variant: "contained", color: "inherit", onClick: () => onHide(false) }, "Cancel")),
9588
- React.createElement(Grid2, { size: { md: 3, xs: 12 } },
9589
- React.createElement(Button, { fullWidth: true, startIcon: isSubmitLoading && React.createElement(CircularProgress, { size: "1rem" }), disabled: isSubmitLoading, variant: "contained", color: "primary", type: "submit" }, "Save")))))),
9590
- React.createElement(ErrorModal, { error: error, onHide: () => setError(""), title: "Error updating Setting" }),
9591
- React.createElement(Snackbar, { open: open, autoHideDuration: 2500, onClose: handleClose, anchorOrigin: { vertical: "bottom", horizontal: "center" } },
9592
- React.createElement(Alert$1, { severity: "success", onClose: handleClose }, "The setting was edited successfully"))));
9662
+ ];
9663
+ return { columnDefs };
9593
9664
  };
9594
9665
 
9595
- const useSearchSettings = () => {
9666
+ const useSearchShifts = (assetId) => {
9596
9667
  return useQuery({
9597
- queryKey: ["settings"],
9598
- queryFn: ({ signal }) => getUTLSettings(signal),
9668
+ queryKey: ["shifts", assetId],
9669
+ queryFn: ({ signal }) => getShiftParameters(assetId, signal),
9599
9670
  });
9600
9671
  };
9601
- const TableSettings = () => {
9602
- const queryClient = useQueryClient();
9603
- const { showContextMenu, registerConfig } = useContextMenuMESF();
9672
+ const TableShiftsCrews = () => {
9673
+ const gridRef = useRef(null);
9604
9674
  const [error, setError] = useState("");
9605
- const [gridApi, setGridApi] = useState(null);
9606
- const [filterValue, setFilterValue] = useState("");
9607
- const [settingSelected, setSettingSelected] = useState(null);
9608
9675
  const [openModalNew, setOpenModalNew] = useState(false);
9609
- const [openModalEditSetting, setOpenModalEditSetting] = useState(false);
9610
- const [openModalDeleteSetting, setOpenModalDeleteSetting] = useState(false);
9611
- const { data: rows, isLoading, isError, error: e } = useSearchSettings();
9612
- const { getMenuOptions } = useSettingsOptionsFunctions({
9613
- setSettingId: setSettingSelected,
9614
- setShowDeleteModal: setOpenModalDeleteSetting,
9676
+ const [openModalEditShift, setOpenModalEditShift] = useState(false);
9677
+ const [openModalDeleteShift, setOpenModalDeleteShift] = useState(false);
9678
+ const [shiftSelected, setShiftSelected] = useState(null);
9679
+ const { state: { settings }, } = useUTLSettingsContext();
9680
+ const defaultAssetId = Number(get(settings, "DefaultAssetId", null));
9681
+ const [selectedAssetId, setSelectedAssetId] = useState(defaultAssetId || null);
9682
+ const { data: assets } = useSearchAssets();
9683
+ const assetsList = useMemo(() => { var _a; return (_a = assets === null || assets === void 0 ? void 0 : assets.filter((a) => a.CanBeDefaultAsset)) !== null && _a !== void 0 ? _a : []; }, [assets]);
9684
+ const selectedAssetName = useMemo(() => { var _a, _b; return (_b = (_a = assetsList.find((a) => a.AssetId === selectedAssetId)) === null || _a === void 0 ? void 0 : _a.AssetName) !== null && _b !== void 0 ? _b : ""; }, [assetsList, selectedAssetId]);
9685
+ const { data: rows, isLoading, isError, error: e, refetch, } = useSearchShifts(selectedAssetId);
9686
+ const formattedRows = rows === null || rows === void 0 ? void 0 : rows.map(({ PatternStart, ShiftCodes, Crews, PatternDays, CrewRotation, Comments, CanEdit, }) => ({
9687
+ id: ShiftCodes,
9688
+ PatternStart,
9689
+ ShiftCodes,
9690
+ Crews,
9691
+ PatternDays,
9692
+ CrewRotation,
9693
+ Comments,
9694
+ CanEdit,
9695
+ }));
9696
+ const defaultColDef = useMemo(() => {
9697
+ return {
9698
+ sortable: true,
9699
+ wrapText: true,
9700
+ autoHeight: true,
9701
+ wrapHeaderText: true,
9702
+ suppressHeaderMenuButton: true,
9703
+ cellStyle: {
9704
+ display: "flex",
9705
+ alignItems: "center",
9706
+ justifyContent: "center",
9707
+ },
9708
+ };
9709
+ }, []);
9710
+ const { getMenuOptions } = useShiftsOptionsFunctions({
9711
+ setShiftId: setShiftSelected,
9615
9712
  setShowCreateModal: setOpenModalNew,
9616
- setShowEditModal: setOpenModalEditSetting,
9713
+ setShowDeleteModal: setOpenModalDeleteShift,
9714
+ setShowEditModal: setOpenModalEditShift,
9617
9715
  });
9618
- const { columnDefs, defaultColDef } = useTableData$4({
9619
- setOpenModalEditSetting,
9620
- setOpenModalDeleteSetting,
9716
+ const { showContextMenu, registerConfig } = useContextMenuMESF();
9717
+ const { columnDefs } = useTableData$4({
9718
+ setShiftSelected,
9719
+ setOpenModalEditShift,
9720
+ setOpenModalDeleteShift,
9621
9721
  showContextMenu,
9622
- setSettingSelected,
9623
9722
  });
9624
9723
  const getContextMenuItems = (params) => {
9625
9724
  var _a, _b;
9626
9725
  const data = (_a = params.node) === null || _a === void 0 ? void 0 : _a.data;
9627
9726
  params.api.deselectAll();
9628
9727
  (_b = params.node) === null || _b === void 0 ? void 0 : _b.setSelected(true);
9629
- showContextMenu(event, data, "TableSettings");
9728
+ showContextMenu(event, data, "TableShifts");
9630
9729
  return [];
9631
9730
  };
9632
9731
  useEffect(() => {
9633
9732
  registerConfig({
9634
- id: "TableSettings",
9733
+ id: "TableShifts",
9635
9734
  getOptions: getMenuOptions,
9636
9735
  });
9637
9736
  }, []);
@@ -9640,124 +9739,219 @@ const TableSettings = () => {
9640
9739
  setError(e.message);
9641
9740
  }
9642
9741
  }, [e, isError]);
9643
- return (React__default.createElement(React__default.Fragment, null,
9644
- React__default.createElement(Grid2, { container: true, justifyContent: "center", p: 1, spacing: 1 },
9645
- React__default.createElement(Grid2, { size: { md: 12, xs: 12 } },
9646
- React__default.createElement(Typography$1, { variant: "h5", fontWeight: 600 }, "Settings")),
9647
- React__default.createElement(Grid2, { size: { md: 12, xs: 12 } },
9648
- React__default.createElement(TextField, { fullWidth: true, label: "Search", variant: "outlined", size: "small", margin: "dense", value: filterValue, onChange: (event) => {
9649
- setFilterValue(event.target.value);
9650
- gridApi === null || gridApi === void 0 ? void 0 : gridApi.setGridOption("quickFilterText", event.target.value);
9651
- }, slotProps: {
9652
- input: {
9653
- startAdornment: (React__default.createElement(InputAdornment, { position: "start" },
9654
- React__default.createElement(IconButton$1, { edge: "start", type: "submit" },
9655
- React__default.createElement(SearchIcon, null)))),
9656
- },
9657
- } })),
9658
- React__default.createElement(Grid2, { container: true, size: { md: 12, xs: 12 } },
9659
- React__default.createElement(Grid2, { size: { md: 12, xs: 12 }, style: {
9660
- height: "70vh",
9661
- } },
9662
- React__default.createElement(Paper, { style: { height: "100%", width: "100%" } },
9663
- React__default.createElement(AgGridReact, { loading: isLoading, gridOptions: {
9742
+ return (React.createElement(React.Fragment, null,
9743
+ React.createElement(Grid2, { container: true, justifyContent: "flex-start", p: 1, spacing: 1 },
9744
+ React.createElement(Grid2, { size: { md: 12, xs: 12 } },
9745
+ React.createElement(Typography$1, { variant: "h5", fontWeight: 600 }, "Shifts / Crew")),
9746
+ React.createElement(Grid2, { size: { md: 12, xs: 12 } },
9747
+ React.createElement(FormControl, { size: "small", sx: { minWidth: 200 } },
9748
+ React.createElement(InputLabel, null, "Asset"),
9749
+ React.createElement(Select, { value: selectedAssetId !== null && selectedAssetId !== void 0 ? selectedAssetId : "", onChange: (e) => setSelectedAssetId(Number(e.target.value)), label: "Asset" }, assetsList.map((asset) => (React.createElement(MenuItem, { key: asset.AssetId, value: asset.AssetId }, asset.AssetName)))))),
9750
+ React.createElement(Grid2, { container: true, justifyContent: "center", alignItems: "center" },
9751
+ React.createElement(Grid2, { container: true, size: { md: 12, xs: 12 } },
9752
+ React.createElement(Grid2, { component: Paper, size: { md: 12, xs: 12 }, style: {
9753
+ height: "70vh",
9754
+ } },
9755
+ React.createElement(AgGridReact, { loading: isLoading, gridOptions: {
9664
9756
  theme: themeDXT,
9665
- }, rowData: rows, columnDefs: columnDefs, defaultColDef: defaultColDef, rowHeight: 34, headerHeight: 34, animateRows: true, loadingOverlayComponent: CenteredLazyLoading, getContextMenuItems: (e) => getContextMenuItems(e), rowSelection: "single", onRowDoubleClicked: (event) => {
9666
- setSettingSelected(event.data);
9667
- setOpenModalEditSetting(true);
9668
- }, onGridReady: (params) => setGridApi(params.api) }))),
9669
- React__default.createElement(Grid2, { container: true, justifyContent: "flex-end" },
9670
- React__default.createElement(Grid2, { size: { md: 2, xs: 12 } },
9671
- React__default.createElement(Button, { variant: "contained", color: "primary", onClick: () => setOpenModalNew(!openModalNew), fullWidth: true }, "NEW SETTING"))))),
9672
- React__default.createElement(CreateSetting, { settingSelected: settingSelected, show: openModalNew, onHide: (shouldUpdate) => __awaiter(void 0, void 0, void 0, function* () {
9757
+ }, ref: gridRef, rowData: formattedRows || [], columnDefs: columnDefs, defaultColDef: defaultColDef, rowHeight: 34, headerHeight: 34, animateRows: true, loadingOverlayComponent: CenteredLazyLoading, getContextMenuItems: (e) => getContextMenuItems(e), rowSelection: "single", onRowDoubleClicked: (event) => {
9758
+ setShiftSelected(event.data);
9759
+ setOpenModalEditShift(true);
9760
+ } })),
9761
+ React.createElement(Grid2, { container: true, justifyContent: "flex-end" },
9762
+ React.createElement(Grid2, { size: { md: 2, xs: 12 } },
9763
+ React.createElement(Button, { variant: "contained", color: "primary", onClick: () => setOpenModalNew(!openModalNew), fullWidth: true }, "NEW SHIFT")))))),
9764
+ React.createElement(CreateShift, { shiftSelected: shiftSelected, show: openModalNew, onHide: (shouldUpdate) => {
9673
9765
  setOpenModalNew(false);
9674
9766
  if (shouldUpdate)
9675
- yield queryClient.invalidateQueries({ queryKey: ["settings"] });
9676
- }), suffixTitle: "Settings" }),
9677
- React__default.createElement(EditSetting, { settingSelected: settingSelected, show: openModalEditSetting, onHide: (shouldUpdate) => __awaiter(void 0, void 0, void 0, function* () {
9678
- setOpenModalEditSetting(false);
9767
+ refetch();
9768
+ }, suffixTitle: "Shifts / Crew", assetId: selectedAssetId, assetName: selectedAssetName }),
9769
+ React.createElement(EditShift, { shiftSelected: shiftSelected, show: openModalEditShift, onHide: (shouldUpdate) => {
9770
+ setOpenModalEditShift(false);
9679
9771
  if (shouldUpdate)
9680
- yield queryClient.invalidateQueries({ queryKey: ["settings"] });
9681
- }), suffixTitle: "Settings" }),
9682
- React__default.createElement(DeleteSetting, { settingSelected: settingSelected, show: openModalDeleteSetting, onHide: (shouldUpdate) => __awaiter(void 0, void 0, void 0, function* () {
9683
- setOpenModalDeleteSetting(false);
9772
+ refetch();
9773
+ }, suffixTitle: "Shifts / Crew", assetId: selectedAssetId, assetName: selectedAssetName }),
9774
+ React.createElement(DeleteShift, { shiftSelected: shiftSelected, show: openModalDeleteShift, onHide: (shouldUpdate) => {
9775
+ setOpenModalDeleteShift(false);
9684
9776
  if (shouldUpdate)
9685
- yield queryClient.invalidateQueries({ queryKey: ["settings"] });
9686
- }), suffixTitle: "Settings" }),
9687
- React__default.createElement(ErrorModal, { error: error, onHide: () => setError("") })));
9777
+ refetch();
9778
+ }, suffixTitle: "Shifts / Crew", assetId: selectedAssetId, assetName: selectedAssetName })));
9779
+ };
9780
+
9781
+ const ShiftsCrews = () => {
9782
+ return (React.createElement(React.Fragment, null,
9783
+ React.createElement(HelmetDexteel, { title: "Shifts and Crews" }),
9784
+ React.createElement(TableShiftsCrews, null)));
9785
+ };
9786
+
9787
+ const ShiftsCrewsPage = (props) => {
9788
+ return React.createElement(ShiftsCrews, null);
9789
+ };
9790
+
9791
+ const AssetPage = () => {
9792
+ return (React__default.createElement(React__default.Fragment, null,
9793
+ React__default.createElement(DndProvider, { backend: HTML5Backend },
9794
+ React__default.createElement(TreeAsset, null))));
9795
+ };
9796
+
9797
+ const Asset = (props) => {
9798
+ return React.createElement(AssetPage, null);
9799
+ };
9800
+
9801
+ const UsersPage = (props) => {
9802
+ return React.createElement(Users, null);
9803
+ };
9804
+
9805
+ const CurrencyFormatter = new Intl.NumberFormat("en-US", {
9806
+ style: "currency",
9807
+ currency: "USD",
9808
+ });
9809
+ const NumberFormatter = new Intl.NumberFormat("en-US", {
9810
+ style: "currency",
9811
+ currency: "USD",
9812
+ });
9813
+ const IntegerFormatter = new Intl.NumberFormat("en-US", {});
9814
+ const DateTimeFormatter = new Intl.DateTimeFormat("en-US-u-hc-h23", {
9815
+ year: "numeric",
9816
+ month: "2-digit",
9817
+ day: "2-digit",
9818
+ hour: "numeric",
9819
+ minute: "numeric",
9820
+ second: "numeric",
9821
+ hour12: false,
9822
+ // timeZone: 'America/Los_Angeles'
9823
+ });
9824
+ const DateFormatter = new Intl.DateTimeFormat("en-US", {
9825
+ year: "numeric",
9826
+ month: "2-digit",
9827
+ day: "2-digit",
9828
+ // timeZone: 'America/Los_Angeles'
9829
+ });
9830
+ const TimeFormatter = new Intl.DateTimeFormat("en-US-u-hc-h23", {
9831
+ hour: "2-digit",
9832
+ minute: "numeric",
9833
+ second: "numeric",
9834
+ hour12: false,
9835
+ // timeZone: 'America/Los_Angeles'
9836
+ });
9837
+
9838
+ const getShiftStyle = (shift) => {
9839
+ if (shift === "D") {
9840
+ return { color: "#52a8b7" };
9841
+ }
9842
+ else if (shift === "N") {
9843
+ return { color: "#A5A5A5" };
9844
+ }
9845
+ else {
9846
+ return {};
9847
+ }
9848
+ };
9849
+ const getCrewStyle = (crew) => {
9850
+ if (crew === "A") {
9851
+ return { color: "#0070C0" };
9852
+ }
9853
+ else if (crew === "B") {
9854
+ return { color: "#FFD24A" };
9855
+ }
9856
+ else if (crew === "C") {
9857
+ return { color: "#FD8359" };
9858
+ }
9859
+ else if (crew === "D") {
9860
+ return { color: "#00B050" };
9861
+ }
9862
+ else {
9863
+ return {};
9864
+ }
9688
9865
  };
9689
-
9690
- const searchSettings = () => {
9691
- return useQuery({
9692
- queryKey: ["settings"],
9693
- queryFn: ({ signal }) => getUTLSettings(signal),
9694
- });
9866
+ const GetShiftColor = (props) => {
9867
+ return (React__default.createElement(React__default.Fragment, null,
9868
+ React__default.createElement(Square$1, { sx: Object.assign({ mr: 1 }, getShiftStyle(props.value)), fontSize: "small" })));
9695
9869
  };
9696
- const SettingsPage = () => {
9870
+ const GetCrewColor = (props) => {
9697
9871
  return (React__default.createElement(React__default.Fragment, null,
9698
- React__default.createElement(HelmetDexteel, { title: "Settings" }),
9699
- React__default.createElement(TableSettings, null)));
9872
+ React__default.createElement(Square$1, { sx: Object.assign({ mr: 1 }, getCrewStyle(props.value)), fontSize: "small" })));
9700
9873
  };
9701
9874
 
9702
- const UTLSettingsInitialState = {
9703
- serverTimeZone: Intl.DateTimeFormat().resolvedOptions().timeZone,
9704
- settings: {},
9875
+ const AssetInitialState = {
9876
+ areasList: [],
9877
+ allAssets: [],
9878
+ plantAssetId: 1,
9705
9879
  };
9706
- const UTLSettingsReducer = createSlice({
9880
+ const AssetReducer = createSlice({
9707
9881
  name: "__",
9708
- initialState: UTLSettingsInitialState,
9882
+ initialState: AssetInitialState,
9709
9883
  reducers: {
9710
- setServerTimeZone(state, { payload }) {
9711
- state.serverTimeZone = payload;
9884
+ setAreasList(state, { payload }) {
9885
+ state.areasList = payload;
9712
9886
  },
9713
- setSetting(state, { payload }) {
9714
- state.settings[payload.key] = payload.value;
9887
+ setAllAssets(state, { payload }) {
9888
+ state.allAssets = payload;
9715
9889
  },
9716
- initSettings(state, { payload }) {
9717
- state.settings = payload.reduce((acc, cur) => {
9718
- if (cur.SettingName.trim().toLowerCase() === "timezone") {
9719
- const timeService = TimeService.getInstance();
9720
- timeService.setTimeZone(cur.Value);
9721
- }
9722
- acc[cur.SettingName.trim()] = cur.Value;
9723
- return acc;
9724
- }, {});
9890
+ setPlantAssetId(state, { payload }) {
9891
+ state.plantAssetId = payload;
9725
9892
  },
9726
9893
  },
9727
9894
  });
9728
9895
 
9729
- const UTLSettingsContext = createContext({
9730
- state: UTLSettingsReducer.getInitialState(),
9731
- actions: UTLSettingsReducer.actions,
9732
- isLoading: true,
9896
+ const AssetContext = createContext({
9897
+ state: AssetReducer.getInitialState(),
9898
+ actions: AssetReducer.actions,
9733
9899
  });
9734
- const useUTLSettingsContext = () => useContext(UTLSettingsContext);
9735
- const UTLSettingsProvider = ({ children }) => {
9900
+ const useAssetContext = () => useContext(AssetContext);
9901
+ const AssetProvider = ({ children, plantAssetId = 1, }) => {
9736
9902
  const [state, actions] = useComplexState({
9737
- initialState: UTLSettingsReducer.getInitialState(),
9738
- reducers: UTLSettingsReducer.caseReducers,
9739
- });
9740
- const { data: rows, isLoading, isError, error: e, isSuccess, refetch, } = searchSettings();
9741
- useEffect(() => {
9742
- if (isSuccess) {
9743
- const settings = rows;
9744
- const settingsTrimmed = settings.map((setting) => (Object.assign(Object.assign({}, setting), { SettingName: setting.SettingName.trim() })));
9745
- actions.initSettings(settingsTrimmed);
9746
- }
9747
- }, [isSuccess]);
9748
- useEffect(() => {
9749
- if (e && isError) {
9750
- console.error(e.message);
9751
- }
9752
- }, [e, isError]);
9753
- useMesfRealtime({
9754
- onReceiveMessage: (author, message) => {
9755
- if (message === "UTL.GetSettings") {
9756
- refetch();
9757
- }
9903
+ initialState: {
9904
+ areasList: [],
9905
+ allAssets: [],
9906
+ plantAssetId,
9758
9907
  },
9908
+ reducers: AssetReducer.caseReducers,
9759
9909
  });
9760
- return (React__default.createElement(UTLSettingsContext.Provider, { value: { state, actions, isLoading } }, children));
9910
+ return (React__default.createElement(AssetContext.Provider, { value: { state, actions } }, children));
9911
+ };
9912
+
9913
+ const LogbookSettingsInitialState = {
9914
+ entry: {
9915
+ withAssetFilter: undefined,
9916
+ filterAssets: undefined,
9917
+ canEditAsset: false,
9918
+ allowAttachments: false,
9919
+ canEditShift: false,
9920
+ showShiftCrew: false,
9921
+ exportToExcel: false,
9922
+ shiftsRange: 7,
9923
+ presetAssetId: undefined,
9924
+ },
9925
+ report: {
9926
+ withAssetFilter: undefined,
9927
+ filterAssets: undefined,
9928
+ showAttachments: false,
9929
+ showAsset: false,
9930
+ showShiftCrew: false,
9931
+ exportToExcel: false,
9932
+ },
9933
+ section: {
9934
+ schema: undefined,
9935
+ withAssetFilter: undefined,
9936
+ filterAssets: undefined,
9937
+ canEditAsset: false,
9938
+ allowAttachments: false,
9939
+ showShiftCrew: false,
9940
+ exportToExcel: false,
9941
+ topSectionsCount: 5,
9942
+ },
9943
+ };
9944
+
9945
+ const LogbookSettingsContext = createContext(LogbookSettingsInitialState);
9946
+ const useLogbookSettings = () => useContext(LogbookSettingsContext);
9947
+ const LogbookSettingsProvider = ({ children, logbookSettings = {}, }) => {
9948
+ // Merge default settings with provided settings
9949
+ const settings = useMemo(() => ({
9950
+ entry: Object.assign(Object.assign({}, LogbookSettingsInitialState.entry), (logbookSettings.entry || {})),
9951
+ report: Object.assign(Object.assign({}, LogbookSettingsInitialState.report), (logbookSettings.report || {})),
9952
+ section: Object.assign(Object.assign({}, LogbookSettingsInitialState.section), (logbookSettings.section || {})),
9953
+ }), [logbookSettings]);
9954
+ return (React__default.createElement(LogbookSettingsContext.Provider, { value: settings }, children));
9761
9955
  };
9762
9956
 
9763
9957
  const useFrontendVersionCheck = ({ endpoint = "/frontend/version", intervalMs = 60000, enabled = true, onUpdate, } = {}) => {
@@ -9847,10 +10041,25 @@ function Header({ showAreaSelector = false, showTrendingsV2Icon = true, navbarTi
9847
10041
  const [drawerOpen, setDrawerOpen] = useState(false);
9848
10042
  const hasPermissionTo = useHasPermission();
9849
10043
  const theme = useTheme();
9850
- const isCompactNavigation = useMediaQuery(theme.breakpoints.down("lg"));
10044
+ const navContainerRef = useRef(null);
10045
+ const [isOverflowing, setIsOverflowing] = useState(false);
10046
+ const isMobileBreakpoint = useMediaQuery(theme.breakpoints.down("lg"));
9851
10047
  const handleDrawerToggle = () => {
9852
10048
  setDrawerOpen(!drawerOpen);
9853
10049
  };
10050
+ const closeDrawer = () => {
10051
+ setDrawerOpen(false);
10052
+ };
10053
+ useEffect(() => {
10054
+ const container = navContainerRef.current;
10055
+ if (!container)
10056
+ return;
10057
+ const observer = new ResizeObserver(() => {
10058
+ setIsOverflowing(container.scrollWidth > container.offsetWidth);
10059
+ });
10060
+ observer.observe(container);
10061
+ return () => observer.disconnect();
10062
+ }, []);
9854
10063
  useEffect(() => {
9855
10064
  const handleMenuItemClick = (event) => {
9856
10065
  const target = event.target;
@@ -9868,6 +10077,7 @@ function Header({ showAreaSelector = false, showTrendingsV2Icon = true, navbarTi
9868
10077
  };
9869
10078
  }, []);
9870
10079
  const canShowSettings = hasPermissionTo("ui.navbar.settings");
10080
+ const isCompactNavigation = isMobileBreakpoint || isOverflowing;
9871
10081
  return (React__default.createElement(React__default.Fragment, null,
9872
10082
  React__default.createElement(AppBar, { position: "static", sx: {
9873
10083
  backgroundColor: (theme) => theme.palette.primary.main,
@@ -9893,19 +10103,21 @@ function Header({ showAreaSelector = false, showTrendingsV2Icon = true, navbarTi
9893
10103
  color: "white",
9894
10104
  textWrap: "nowrap",
9895
10105
  } }, navbarTitle),
9896
- React__default.createElement(Box, { sx: {
10106
+ React__default.createElement(Box, { ref: navContainerRef, sx: {
9897
10107
  display: "flex",
9898
10108
  flexGrow: 1,
9899
10109
  minWidth: 0,
9900
10110
  overflow: "hidden",
10111
+ visibility: isCompactNavigation ? "hidden" : "visible",
10112
+ pointerEvents: isCompactNavigation ? "none" : "auto",
9901
10113
  "& a": {
9902
10114
  color: "white",
9903
10115
  },
9904
10116
  "& > *": {
9905
- minWidth: 0,
9906
- maxWidth: "100%",
10117
+ flexShrink: 0,
9907
10118
  },
9908
- } }, !isCompactNavigation && (React__default.createElement(CustomNavbar, { closeDrawer: handleDrawerToggle }))),
10119
+ }, "aria-hidden": isCompactNavigation },
10120
+ React__default.createElement(CustomNavbar, { closeDrawer: closeDrawer })),
9909
10121
  React__default.createElement(Box, { sx: {
9910
10122
  display: "flex",
9911
10123
  alignItems: "center",
@@ -9948,7 +10160,7 @@ function Header({ showAreaSelector = false, showTrendingsV2Icon = true, navbarTi
9948
10160
  color: (theme) => theme.palette.text.primary,
9949
10161
  },
9950
10162
  } },
9951
- React__default.createElement(CustomNavbar, { isMobile: true }))),
10163
+ React__default.createElement(CustomNavbar, { isMobile: true, closeDrawer: closeDrawer }))),
9952
10164
  React__default.createElement(ErrorModal, { error: error, onHide: () => setError("") })));
9953
10165
  }
9954
10166
 
@@ -10240,9 +10452,9 @@ const QueryCacheInvalidations = () => {
10240
10452
  React__default.createElement(MesfModal.Content, { dividers: true },
10241
10453
  React__default.createElement(Grid2, { container: true, spacing: 3 },
10242
10454
  React__default.createElement(Grid2, { size: { xs: 12 } },
10243
- React__default.createElement(Controller, { control: control, name: "source", render: (params) => (React__default.createElement(Autocomplete$1, { options: actions, getOptionLabel: (option) => `${option.ActionName}`, value: params.field.value, onChange: (_, value) => params.field.onChange(value), renderInput: (params) => (React__default.createElement(TextField, Object.assign({}, params, { label: "Select Source Action", variant: "outlined", size: "medium" }))), disabled: modal === "edit" })) })),
10455
+ React__default.createElement(Controller, { control: control, name: "source", render: (params) => (React__default.createElement(Autocomplete, { options: actions, getOptionLabel: (option) => `${option.ActionName}`, value: params.field.value, onChange: (_, value) => params.field.onChange(value), renderInput: (params) => (React__default.createElement(TextField, Object.assign({}, params, { label: "Select Source Action", variant: "outlined", size: "medium" }))), disabled: modal === "edit" })) })),
10244
10456
  React__default.createElement(Grid2, { size: { xs: 12 } },
10245
- React__default.createElement(Controller, { control: control, name: "targets", render: (params) => (React__default.createElement(Autocomplete$1, { multiple: true, options: actions.filter((a) => { var _a; return a.ActionId !== ((_a = control._formValues.source) === null || _a === void 0 ? void 0 : _a.ActionId); }), getOptionLabel: (option) => {
10457
+ React__default.createElement(Controller, { control: control, name: "targets", render: (params) => (React__default.createElement(Autocomplete, { multiple: true, options: actions.filter((a) => { var _a; return a.ActionId !== ((_a = control._formValues.source) === null || _a === void 0 ? void 0 : _a.ActionId); }), getOptionLabel: (option) => {
10246
10458
  if (typeof option === "string") {
10247
10459
  return option;
10248
10460
  }
@@ -10541,7 +10753,7 @@ const ResultsList = ({ results, onDeleteResult, onClearAll }) => {
10541
10753
  };
10542
10754
 
10543
10755
  const SPAutocomplete = ({ procedures, value, onChange, isLoading, disabled = false, }) => {
10544
- return (React__default.createElement(Autocomplete, { options: procedures, value: value, onChange: (_, newValue) => onChange(newValue), getOptionLabel: (option) => option.FullName, groupBy: (option) => option.SchemaName, disabled: disabled, isOptionEqualToValue: (option, val) => option.FullName === val.FullName, renderInput: (params) => (React__default.createElement(TextField, Object.assign({}, params, { label: "Select Stored Procedure", variant: "outlined", fullWidth: true, slotProps: {
10756
+ return (React__default.createElement(Autocomplete$1, { options: procedures, value: value, onChange: (_, newValue) => onChange(newValue), getOptionLabel: (option) => option.FullName, groupBy: (option) => option.SchemaName, disabled: disabled, isOptionEqualToValue: (option, val) => option.FullName === val.FullName, renderInput: (params) => (React__default.createElement(TextField, Object.assign({}, params, { label: "Select Stored Procedure", variant: "outlined", fullWidth: true, slotProps: {
10545
10757
  input: Object.assign(Object.assign({}, params.InputProps), { endAdornment: (React__default.createElement(React__default.Fragment, null, isLoading ? (React__default.createElement(CircularProgress, { color: "inherit", size: 20 })) : (params.InputProps.endAdornment))) }),
10546
10758
  } }))), renderOption: (props, option) => (React__default.createElement("li", Object.assign({}, props, { key: option.FullName }),
10547
10759
  option.SchemaName,
@@ -11430,7 +11642,7 @@ const SaveUpdateDeleteViewModalV2 = ({ open, mode, handleClose, view, }) => {
11430
11642
  React__default.createElement("form", { onSubmit: handleSubmit(onSubmit) },
11431
11643
  React__default.createElement(MesfModal.Content, { dividers: true, style: { padding: "15px 30px" } },
11432
11644
  React__default.createElement(Grid2, { container: true, spacing: 1 },
11433
- React__default.createElement(Grid2, { size: 12 }, mode === "create" && views.length > 0 && viewSelected ? (React__default.createElement(Autocomplete, { size: "small", id: "list-of-views", options: views, defaultValue: viewSelected, getOptionLabel: (option) => {
11645
+ React__default.createElement(Grid2, { size: 12 }, mode === "create" && views.length > 0 && viewSelected ? (React__default.createElement(Autocomplete$1, { size: "small", id: "list-of-views", options: views, defaultValue: viewSelected, getOptionLabel: (option) => {
11434
11646
  if (typeof option === "string") {
11435
11647
  return option;
11436
11648
  }
@@ -11860,7 +12072,7 @@ const HeaderSectionV2 = React__default.memo(({ autoRefresh, setAutoRefresh, setC
11860
12072
  backgroundColor: "white",
11861
12073
  width: "100%",
11862
12074
  } },
11863
- React__default.createElement(Autocomplete, { size: "small", id: "view-selector", options: views, getOptionLabel: (option) => option.ViewName, value: viewSelected, isOptionEqualToValue: (option, value) => option.ViewId === (value === null || value === void 0 ? void 0 : value.ViewId), onChange: handleViewChange, noOptionsText: "No views available", renderOption: (props, option) => (React__default.createElement(Box, Object.assign({}, props, { component: "li", style: {
12075
+ React__default.createElement(Autocomplete$1, { size: "small", id: "view-selector", options: views, getOptionLabel: (option) => option.ViewName, value: viewSelected, isOptionEqualToValue: (option, value) => option.ViewId === (value === null || value === void 0 ? void 0 : value.ViewId), onChange: handleViewChange, noOptionsText: "No views available", renderOption: (props, option) => (React__default.createElement(Box, Object.assign({}, props, { component: "li", style: {
11864
12076
  display: "flex",
11865
12077
  justifyContent: "space-between",
11866
12078
  width: "100%",
@@ -12782,7 +12994,7 @@ const BitSelectorModal = ({ open, handleClose, viewTags, onAddBits, existingBitT
12782
12994
  React__default.createElement(Grid2, { container: true, spacing: 2 },
12783
12995
  React__default.createElement(Grid2, { size: 12 },
12784
12996
  React__default.createElement(Typography$1, { variant: "subtitle2", sx: { mb: 1 } }, "Select Source Tag"),
12785
- React__default.createElement(Autocomplete, { size: "small", id: "source-tag-selector", options: availableTags, getOptionLabel: (option) => option.Alias || option.TagName, value: selectedTag, onChange: handleTagChange, noOptionsText: "No tags available in current view", renderOption: (props, option) => (React__default.createElement(Box, Object.assign({}, props, { component: "li" }),
12997
+ React__default.createElement(Autocomplete$1, { size: "small", id: "source-tag-selector", options: availableTags, getOptionLabel: (option) => option.Alias || option.TagName, value: selectedTag, onChange: handleTagChange, noOptionsText: "No tags available in current view", renderOption: (props, option) => (React__default.createElement(Box, Object.assign({}, props, { component: "li" }),
12786
12998
  React__default.createElement(Box, { sx: {
12787
12999
  display: "flex",
12788
13000
  justifyContent: "space-between",
@@ -12892,7 +13104,7 @@ const LoadViewModalV2 = ({ open, handleClose }) => {
12892
13104
  React__default.createElement("input", { type: "checkbox", checked: allViewsChecked, onChange: handleAllViewsCheckbox }),
12893
13105
  React__default.createElement(Typography$1, null, "All Views")))),
12894
13106
  React__default.createElement(Grid2, { size: 12 },
12895
- React__default.createElement(Autocomplete, { size: "small", id: "list-of-views", noOptionsText: allViewsChecked
13107
+ React__default.createElement(Autocomplete$1, { size: "small", id: "list-of-views", noOptionsText: allViewsChecked
12896
13108
  ? "No views detected, please create a new view"
12897
13109
  : "No public views detected, please create a new view", options: displayedViews, getOptionLabel: (option) => option.ViewName, onChange: (ev, val) => setOptionSelected(val), defaultValue: optionSelected || viewSelected, style: { width: "100%" }, renderOption: (props, option) => (React__default.createElement(Box, Object.assign({}, props, { component: "li" }),
12898
13110
  React__default.createElement(Box, { sx: {
@@ -15723,22 +15935,22 @@ const useGridDefinitions$1 = ({ OnEdit, OnSend }) => {
15723
15935
  };
15724
15936
  };
15725
15937
 
15726
- const moment$e = getMomentTz();
15938
+ const moment$c = getMomentTz();
15727
15939
  const getEntries$1 = (_a) => __awaiter(void 0, [_a], void 0, function* ({ shiftId, assetId, signal, }) {
15728
15940
  const apiService = new MESApiService();
15729
15941
  const parameters = [
15730
15942
  { name: "ShiftId", value: shiftId },
15731
15943
  ];
15732
- if (assetId) {
15944
+ if (assetId != null) {
15733
15945
  parameters.push({ name: "AssetId", value: assetId });
15734
15946
  }
15735
15947
  const resp = yield apiService.callV2("[LB].[GetEntries]", parameters, signal);
15736
15948
  if (resp.ok) {
15737
15949
  let rows = get(resp, "data.tables[0].rows", []);
15738
15950
  rows = rows.map((entry) => (Object.assign(Object.assign({}, entry), { CreateTimestamp: entry.CreateTimestamp
15739
- ? moment$e.utc(entry["CreateTimestamp"]).toDate()
15951
+ ? moment$c.utc(entry["CreateTimestamp"]).toDate()
15740
15952
  : null, UpdateTimestamp: entry.UpdateTimestamp
15741
- ? moment$e.utc(entry["UpdateTimestamp"]).toDate()
15953
+ ? moment$c.utc(entry["UpdateTimestamp"]).toDate()
15742
15954
  : null })));
15743
15955
  return rows;
15744
15956
  }
@@ -15832,7 +16044,7 @@ const getEntryAttachments$1 = (params, signal) => __awaiter(void 0, void 0, void
15832
16044
  if (resp.ok) {
15833
16045
  let rows = get(resp, "data.tables[0].rows", []);
15834
16046
  rows = rows.map((attachment) => (Object.assign(Object.assign({}, attachment), { CreationTime: attachment.CreationTime
15835
- ? moment$e.utc(attachment.CreationTime).toDate()
16047
+ ? moment$c.utc(attachment.CreationTime).toDate()
15836
16048
  : new Date() })));
15837
16049
  return rows;
15838
16050
  }
@@ -15853,7 +16065,7 @@ const upsertEntryAttachment$1 = (_a) => __awaiter(void 0, [_a], void 0, function
15853
16065
  const attachment = get(resp, "data.tables[0].rows[0]", null);
15854
16066
  if (attachment) {
15855
16067
  return Object.assign(Object.assign({}, attachment), { CreationTime: attachment.CreationTime
15856
- ? moment$e.utc(attachment.CreationTime).toDate()
16068
+ ? moment$c.utc(attachment.CreationTime).toDate()
15857
16069
  : new Date() });
15858
16070
  }
15859
16071
  return null;
@@ -15892,6 +16104,7 @@ const useEntries$1 = ({ shiftId, assetId }) => {
15892
16104
  return useQuery({
15893
16105
  queryKey: ["entries", shiftId, assetId],
15894
16106
  queryFn: ({ signal }) => getEntries$1({ shiftId, assetId, signal }),
16107
+ enabled: shiftId != null,
15895
16108
  });
15896
16109
  };
15897
16110
  const routeLogbookEntry$1 = "/logbook/entry";
@@ -16148,7 +16361,7 @@ const AssetsFilter = ({ label = "Asset", value, onChange, filterAreaAssets = fal
16148
16361
  ];
16149
16362
  const selectedOption = options.find((option) => option.value === (value || null)) || options[0];
16150
16363
  return (React__default.createElement(React__default.Fragment, null,
16151
- React__default.createElement(Autocomplete, { options: filterAreaAssets ? options.filter((o) => o.isAreaAsset) : options, value: selectedOption, onChange: (event, newValue) => {
16364
+ React__default.createElement(Autocomplete$1, { size: "small", options: filterAreaAssets ? options.filter((o) => o.isAreaAsset) : options, value: selectedOption, onChange: (event, newValue) => {
16152
16365
  var _a;
16153
16366
  if (newValue) {
16154
16367
  onChange((_a = newValue.value) !== null && _a !== void 0 ? _a : null);
@@ -16157,124 +16370,6 @@ const AssetsFilter = ({ label = "Asset", value, onChange, filterAreaAssets = fal
16157
16370
  React__default.createElement(ErrorModal, { error: error, onHide: () => setError("") })));
16158
16371
  };
16159
16372
 
16160
- const moment$d = getMomentTz();
16161
- const getShifts = (params, signal) => __awaiter(void 0, void 0, void 0, function* () {
16162
- var _a;
16163
- const apiService = new MESApiService();
16164
- const parameters = [
16165
- {
16166
- name: "ShiftId",
16167
- value: (_a = params.shiftId) !== null && _a !== void 0 ? _a : null,
16168
- },
16169
- ];
16170
- const resp = yield apiService.callV2(`[MES].[GetShiftByParameters]`, parameters, signal);
16171
- if (resp.ok) {
16172
- let rows = get(resp, "data.tables[0].rows", []);
16173
- rows = rows.map((row) => {
16174
- (row.CurrentProductionDate = moment$d
16175
- .utc(row["CurrentProductionDate"])
16176
- .toDate()),
16177
- (row.CurrentStart = moment$d.utc(row["CurrentStart"]).toDate()),
16178
- (row.CurrentEnd = moment$d.utc(row["CurrentEnd"]).toDate()),
16179
- (row.PreviousProductionDate = moment$d
16180
- .utc(row["PreviousProductionDate"])
16181
- .toDate()),
16182
- (row.PreviousStart = moment$d.utc(row["PreviousStart"]).toDate()),
16183
- (row.PreviousEnd = moment$d.utc(row["PreviousEnd"]).toDate()),
16184
- (row.NextProductionDate = moment$d
16185
- .utc(row["NextProductionDate"])
16186
- .toDate()),
16187
- (row.NextStart = moment$d.utc(row["NextStart"]).toDate()),
16188
- (row.NextEnd = moment$d.utc(row["NextEnd"]).toDate()),
16189
- (row.LastProductionDate = moment$d
16190
- .utc(row["LastProductionDate"])
16191
- .toDate()),
16192
- (row.LastStart = moment$d.utc(row["LastStart"]).toDate()),
16193
- (row.LastEnd = moment$d.utc(row["LastEnd"]).toDate());
16194
- return row;
16195
- });
16196
- return rows;
16197
- }
16198
- else {
16199
- throw new Error(resp.message || "Error fetching shifts");
16200
- }
16201
- });
16202
- const getShiftsAroundCurrent = (_a) => __awaiter(void 0, [_a], void 0, function* ({ currentShiftId, shiftsRange, }) {
16203
- const apiService = new MESApiService();
16204
- const parameters = [
16205
- { name: "CurrentShiftId", value: currentShiftId || null },
16206
- ];
16207
- if (shiftsRange) {
16208
- parameters.push({ name: "ShiftsRange", value: shiftsRange });
16209
- }
16210
- const resp = yield apiService.callV2("[MES].[GetShiftsAroundCurrent]", parameters);
16211
- if (resp.ok) {
16212
- let rows = get(resp, "data.tables[0].rows", []);
16213
- rows = rows.map((row) => (Object.assign(Object.assign({}, row), { Start: moment$d.utc(row.Start).toDate(), End: moment$d.utc(row.End).toDate() })));
16214
- return rows;
16215
- }
16216
- else {
16217
- throw new Error(resp.message || "Error fetching shifts");
16218
- }
16219
- });
16220
-
16221
- const moment$c = getMomentTz();
16222
- const useShiftsAroundCurrent = ({ currentShiftId, shiftsRange, }) => {
16223
- return useQuery({
16224
- queryKey: ["shiftsAroundCurrent", currentShiftId, shiftsRange],
16225
- queryFn: ({ signal }) => getShiftsAroundCurrent({ currentShiftId, shiftsRange }),
16226
- });
16227
- };
16228
- const ShiftAutocomplete = ({ currentShiftId, value, onShiftSelected, disabled, shiftsRange, }) => {
16229
- const [error, setError] = useState("");
16230
- const { data: rows, isLoading, error: e, isError, } = useShiftsAroundCurrent({
16231
- currentShiftId,
16232
- shiftsRange: shiftsRange,
16233
- });
16234
- const selectedShift = (rows === null || rows === void 0 ? void 0 : rows.find((type) => type.ShiftId === value)) || null;
16235
- useEffect(() => {
16236
- if (e && isError) {
16237
- setError(e.message);
16238
- }
16239
- }, [e, isError]);
16240
- return (React__default.createElement(React__default.Fragment, null,
16241
- React__default.createElement(Grid2, { container: true },
16242
- React__default.createElement(Grid2, { size: { xs: 12 } },
16243
- React__default.createElement(Autocomplete$1, { loading: isLoading, options: rows || [], getOptionLabel: (option) => {
16244
- return `${moment$c
16245
- .utc(option.ProductionDate)
16246
- .format("MM/DD/YYYY")} - ${option.Shift} - ${option.Crew}`;
16247
- }, value: selectedShift, onChange: (event, newValue) => {
16248
- if (newValue) {
16249
- onShiftSelected(newValue);
16250
- }
16251
- }, disabled: disabled, renderInput: (params) => (React__default.createElement(TextField, Object.assign({}, params, { label: "Shift", variant: "outlined", size: "small", fullWidth: true, InputProps: Object.assign(Object.assign({}, params.InputProps), { endAdornment: (React__default.createElement(React__default.Fragment, null, isLoading ? (React__default.createElement(CircularProgress, { color: "inherit", size: 20 })) : null)) }) }))) }))),
16252
- React__default.createElement(ErrorModal, { error: error, onHide: () => setError("") })));
16253
- };
16254
-
16255
- const useShifts = (shiftId) => {
16256
- return useQuery({
16257
- queryKey: ["shifts", shiftId],
16258
- queryFn: ({ signal }) => getShifts({ shiftId }, signal),
16259
- });
16260
- };
16261
- const ShiftSelector = ({ label = "Shift - Crew", value, onChange = () => { }, fieldError, disabled = false, }) => {
16262
- const [error, setError] = useState("");
16263
- const { data: shifts, isLoading, isError, error: e } = useShifts(value);
16264
- const selectedShift = (shifts === null || shifts === void 0 ? void 0 : shifts.find((s) => s.CurrentShiftId === value)) || null;
16265
- useEffect(() => {
16266
- if (isError) {
16267
- setError(e.message);
16268
- }
16269
- }, [isError, e]);
16270
- return (React__default.createElement(React__default.Fragment, null,
16271
- React__default.createElement(Autocomplete$1, { id: "clear-on-escape", clearOnEscape: true, options: shifts || [], getOptionLabel: (option) => `${option.CurrentShift} - ${option.CurrentCrew}`, disabled: disabled, renderInput: (params) => (React__default.createElement(TextField, Object.assign({}, params, { label: label, variant: "outlined", fullWidth: true, size: "small", error: !!fieldError, helperText: fieldError === null || fieldError === void 0 ? void 0 : fieldError.message, InputProps: Object.assign(Object.assign({}, params.InputProps), { endAdornment: (React__default.createElement(React__default.Fragment, null, isLoading ? (React__default.createElement(CircularProgress, { color: "inherit", size: 20 })) : (React__default.createElement(React__default.Fragment, null, params.InputProps.endAdornment)))) }) }))), value: selectedShift, onChange: (event, newValue) => {
16272
- var _a;
16273
- onChange((_a = newValue === null || newValue === void 0 ? void 0 : newValue.CurrentShiftId) !== null && _a !== void 0 ? _a : null);
16274
- } }),
16275
- React__default.createElement(ErrorModal, { error: error, onHide: () => setError(""), title: "Error loading shifts" })));
16276
- };
16277
-
16278
16373
  const useEntrySubmission$1 = ({ onSuccess, onError, isNewEntry = false, onHide = () => { }, } = {}) => {
16279
16374
  const [isSubmitLoading, setIsSubmitLoading] = useState(false);
16280
16375
  const [showConfirmationDialog, setShowConfirmationDialog] = useState(false);
@@ -17431,7 +17526,7 @@ const getEntriesReport$1 = (params, signal) => __awaiter(void 0, void 0, void 0,
17431
17526
  { name: "StartShiftId", value: params.startShiftId },
17432
17527
  { name: "EndShiftId", value: params.endShiftId },
17433
17528
  ];
17434
- if (params.assetId) {
17529
+ if (params.assetId != null) {
17435
17530
  parameters.push({ name: "AssetId", value: params.assetId });
17436
17531
  }
17437
17532
  const resp = yield apiService.callV2("[LB].[GetEntries]", parameters);
@@ -17453,7 +17548,7 @@ const useEntriesReport$1 = ({ startShiftId, endShiftId, assetId, }) => {
17453
17548
  return useQuery({
17454
17549
  queryKey: ["entriesReport", startShiftId, endShiftId, assetId],
17455
17550
  queryFn: ({ signal }) => getEntriesReport$1({ startShiftId, endShiftId, assetId }),
17456
- enabled: !!startShiftId && !!endShiftId && !!assetId,
17551
+ enabled: !!startShiftId && !!endShiftId && assetId != null,
17457
17552
  });
17458
17553
  };
17459
17554
  const routeLogbookReport = "/logbook/report";
@@ -17668,12 +17763,13 @@ const Filters$2 = ({ withAssetFilter, filterAssets, quickFilter, onQuickFilterCh
17668
17763
  React__default.createElement(Grid2, { size: { xs: 12 }, alignItems: "center", justifyContent: "center" },
17669
17764
  React__default.createElement(ShiftPeriodNavigatorControl, { onChange: handleShiftPeriodChange, value: shiftPeriod, actualPeriod: actualPeriod, showShiftAndCrews: false, dateFormat: "MM/DD/YYYY", periodOptions: customPeriodOptions$1 })),
17670
17765
  React__default.createElement(Grid2, { size: { xs: 12, md: withAssetFilter ? 6 : 12 } },
17671
- React__default.createElement(TextField, { fullWidth: true, label: "Search", variant: "outlined", size: "small", margin: "dense", value: quickFilter, onChange: (event) => {
17766
+ React__default.createElement(TextField, { fullWidth: true, label: "Search", variant: "outlined", size: "small", value: quickFilter, onChange: (event) => {
17672
17767
  onQuickFilterChange(event === null || event === void 0 ? void 0 : event.target.value);
17673
- }, InputProps: {
17674
- startAdornment: (React__default.createElement(InputAdornment, { position: "start" },
17675
- React__default.createElement(IconButton$1, { edge: "start", type: "submit" },
17676
- React__default.createElement(SearchIcon, null)))),
17768
+ }, slotProps: {
17769
+ input: {
17770
+ startAdornment: (React__default.createElement(InputAdornment, { position: "start" },
17771
+ React__default.createElement(SearchIcon, { fontSize: "small" }))),
17772
+ },
17677
17773
  } })),
17678
17774
  withAssetFilter === "tree" && assets && (React__default.createElement(Grid2, { size: { xs: 12, md: 6 }, style: {
17679
17775
  alignItems: "center",
@@ -17683,7 +17779,6 @@ const Filters$2 = ({ withAssetFilter, filterAssets, quickFilter, onQuickFilterCh
17683
17779
  withAssetFilter === "selector" && (React__default.createElement(Grid2, { size: { xs: 12, md: 6 }, style: {
17684
17780
  alignItems: "center",
17685
17781
  justifyContent: "center",
17686
- marginTop: 6,
17687
17782
  } },
17688
17783
  React__default.createElement(AssetsFilter, { value: assetId !== null && assetId !== void 0 ? assetId : null, onChange: (newValue) => {
17689
17784
  setAssetId(newValue !== null && newValue !== void 0 ? newValue : null);
@@ -18508,7 +18603,7 @@ const SectionSelector = ({ value, onChange, topSectionsCount = 5, disabled = fal
18508
18603
  gap: 1,
18509
18604
  flexWrap: "wrap",
18510
18605
  } },
18511
- React__default.createElement(Autocomplete, { open: open, onOpen: () => setOpen(true), onClose: () => setOpen(false), value: value, onChange: (_, newValue) => onChange(newValue), inputValue: inputValue, onInputChange: (_, newInputValue) => setInputValue(newInputValue), options: options, loading: loading, disabled: disabled, getOptionLabel: (option) => option.SectionName, isOptionEqualToValue: (option, value) => option.SectionId === value.SectionId, sx: { minWidth: 120, maxWidth: 150 }, renderOption: (props, option) => (React__default.createElement(Box, Object.assign({ component: "li" }, props, { key: option.SectionId, sx: { display: "flex", justifyContent: "space-between" } }),
18606
+ React__default.createElement(Autocomplete$1, { open: open, onOpen: () => setOpen(true), onClose: () => setOpen(false), value: value, onChange: (_, newValue) => onChange(newValue), inputValue: inputValue, onInputChange: (_, newInputValue) => setInputValue(newInputValue), options: options, loading: loading, disabled: disabled, getOptionLabel: (option) => option.SectionName, isOptionEqualToValue: (option, value) => option.SectionId === value.SectionId, sx: { minWidth: 120, maxWidth: 150 }, renderOption: (props, option) => (React__default.createElement(Box, Object.assign({ component: "li" }, props, { key: option.SectionId, sx: { display: "flex", justifyContent: "space-between" } }),
18512
18607
  React__default.createElement(Typography$1, { fontWeight: 500 }, option.SectionName))), renderInput: (params) => (React__default.createElement(TextField, Object.assign({}, params, { label: label, placeholder: "####", size: "small", slotProps: {
18513
18608
  input: Object.assign(Object.assign({}, params.InputProps), { endAdornment: (React__default.createElement(React__default.Fragment, null,
18514
18609
  loading ? (React__default.createElement(CircularProgress, { color: "inherit", size: 16 })) : null,
@@ -18554,7 +18649,7 @@ const SectionMultiSelect = ({ value, onChange, topSectionsCount = 5, disabled =
18554
18649
  gap: 1,
18555
18650
  flexWrap: "wrap",
18556
18651
  } },
18557
- React__default.createElement(Autocomplete, { multiple: true, open: open, onOpen: () => setOpen(true), onClose: () => setOpen(false), value: value, onChange: (_, newValue) => onChange(newValue), inputValue: inputValue, onInputChange: (_, newInputValue) => setInputValue(newInputValue), options: options, loading: loading, disabled: disabled, getOptionLabel: (option) => option.SectionName, isOptionEqualToValue: (option, val) => option.SectionId === val.SectionId, limitTags: 2, size: "small", sx: { minWidth: 200, flex: 1 }, renderOption: (props, option) => (React__default.createElement(Box, Object.assign({ component: "li" }, props, { key: option.SectionId, sx: { display: "flex", justifyContent: "space-between" } }),
18652
+ React__default.createElement(Autocomplete$1, { multiple: true, open: open, onOpen: () => setOpen(true), onClose: () => setOpen(false), value: value, onChange: (_, newValue) => onChange(newValue), inputValue: inputValue, onInputChange: (_, newInputValue) => setInputValue(newInputValue), options: options, loading: loading, disabled: disabled, getOptionLabel: (option) => option.SectionName, isOptionEqualToValue: (option, val) => option.SectionId === val.SectionId, limitTags: 2, size: "small", sx: { minWidth: 200, flex: 1 }, renderOption: (props, option) => (React__default.createElement(Box, Object.assign({ component: "li" }, props, { key: option.SectionId, sx: { display: "flex", justifyContent: "space-between" } }),
18558
18653
  React__default.createElement(Typography$1, { fontWeight: 500 }, option.SectionName))), renderInput: (params) => (React__default.createElement(TextField, Object.assign({}, params, { label: label, placeholder: value.length === 0 ? "All sections" : "", size: "small", slotProps: {
18559
18654
  input: Object.assign(Object.assign({}, params.InputProps), { endAdornment: (React__default.createElement(React__default.Fragment, null,
18560
18655
  loading ? (React__default.createElement(CircularProgress, { color: "inherit", size: 16 })) : null,
@@ -20449,5 +20544,5 @@ var areaSelector = /*#__PURE__*/Object.freeze({
20449
20544
  AreaSelector: AreaSelector
20450
20545
  });
20451
20546
 
20452
- 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, NavbarMenuBar, 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, useEntries$1 as useEntries, useFrontendVersionCheck, useHasPermission, useHasProfile, useLogbookSettings, useMesfRealtime, useShiftNavigator, useShiftNavigatorManager, useToken, useUTLSettingsContext, useUserContext };
20547
+ 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, NavbarMenuBar, NumberFormatter, RemoveAssetDialog, SPExecutorPage, ShiftAutocomplete, ShiftDayNavigatorControl, ShiftNavigatorProvider, ShiftPeriodNavigatorControl, ShiftSelector, 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, useEntries$1 as useEntries, useFrontendVersionCheck, useHasPermission, useHasProfile, useLogbookSettings, useMesfRealtime, useShiftNavigator, useShiftNavigatorManager, useShifts, useShiftsAroundCurrent, useShiftsByRange, useToken, useUTLSettingsContext, useUserContext };
20453
20548
  //# sourceMappingURL=index.esm.js.map