dce-reactkit 3.5.2 → 3.5.4

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/cjs/index.js CHANGED
@@ -319,7 +319,7 @@ const ModalButtonTypeToLabelAndVariant = {
319
319
  /*------------------------------------------------------------------------*/
320
320
  /* Style */
321
321
  /*------------------------------------------------------------------------*/
322
- const style$8 = `
322
+ const style$9 = `
323
323
  .Modal-backdrop {
324
324
  position: fixed;
325
325
  top: 0;
@@ -493,7 +493,7 @@ const Modal = (props) => {
493
493
  left: 0,
494
494
  right: 0,
495
495
  } },
496
- React__default["default"].createElement("style", null, style$8),
496
+ React__default["default"].createElement("style", null, style$9),
497
497
  React__default["default"].createElement("div", { className: `Modal-backdrop ${backdropAnimationClass}`, style: {
498
498
  zIndex: 5000000003,
499
499
  }, onClick: () => __awaiter(void 0, void 0, void 0, function* () {
@@ -992,7 +992,7 @@ const AppWrapper = (props) => {
992
992
  /*------------------------------------------------------------------------*/
993
993
  /* Style */
994
994
  /*------------------------------------------------------------------------*/
995
- const style$7 = `
995
+ const style$8 = `
996
996
  /* Container fades in */
997
997
  .LoadingSpinner-container {
998
998
  animation-name: LoadingSpinner-container-fade-in;
@@ -1070,7 +1070,7 @@ const LoadingSpinner = () => {
1070
1070
  /*------------------------------------------------------------------------*/
1071
1071
  // Add all four blips to a container
1072
1072
  return (React__default["default"].createElement("div", { className: "text-center LoadingSpinner LoadingSpinner-container" },
1073
- React__default["default"].createElement("style", null, style$7),
1073
+ React__default["default"].createElement("style", null, style$8),
1074
1074
  React__default["default"].createElement(reactFontawesome.FontAwesomeIcon, { icon: freeSolidSvgIcons.faCircle, className: "LoadingSpinner-blip-1 me-1" }),
1075
1075
  React__default["default"].createElement(reactFontawesome.FontAwesomeIcon, { icon: freeSolidSvgIcons.faCircle, className: "LoadingSpinner-blip-2 me-1" }),
1076
1076
  React__default["default"].createElement(reactFontawesome.FontAwesomeIcon, { icon: freeSolidSvgIcons.faCircle, className: "LoadingSpinner-blip-3 me-1" }),
@@ -1084,7 +1084,7 @@ const LoadingSpinner = () => {
1084
1084
  /*------------------------------------------------------------------------*/
1085
1085
  /* Style */
1086
1086
  /*------------------------------------------------------------------------*/
1087
- const style$6 = `
1087
+ const style$7 = `
1088
1088
  /* Tab Box */
1089
1089
  .TabBox-box {
1090
1090
  /* Light Border */
@@ -1164,7 +1164,7 @@ const TabBox = (props) => {
1164
1164
  /*----------------------------------------*/
1165
1165
  // Full UI
1166
1166
  return (React__default["default"].createElement("div", { className: `TabBox-container ${noBottomMargin ? '' : 'mb-2'}` },
1167
- React__default["default"].createElement("style", null, style$6),
1167
+ React__default["default"].createElement("style", null, style$7),
1168
1168
  React__default["default"].createElement("div", { className: "TabBox-title-container" },
1169
1169
  React__default["default"].createElement("div", { className: "TabBox-title" }, title)),
1170
1170
  React__default["default"].createElement("div", { className: `TabBox-box ps-2 pt-2 pe-2 ${noBottomPadding ? '' : 'pb-2'}` },
@@ -1486,7 +1486,7 @@ const SimpleDateChooser = (props) => {
1486
1486
  /*------------------------------------------------------------------------*/
1487
1487
  /* Style */
1488
1488
  /*------------------------------------------------------------------------*/
1489
- const style$5 = `
1489
+ const style$6 = `
1490
1490
  .Drawer-container {
1491
1491
  margin-left: 1rem;
1492
1492
  margin-right: 1rem;
@@ -1520,7 +1520,7 @@ const Drawer = (props) => {
1520
1520
  return (React__default["default"].createElement("div", { className: "Drawer-container", style: {
1521
1521
  backgroundColor: (customBackgroundColor !== null && customBackgroundColor !== void 0 ? customBackgroundColor : undefined),
1522
1522
  } },
1523
- React__default["default"].createElement("style", null, style$5),
1523
+ React__default["default"].createElement("style", null, style$6),
1524
1524
  children));
1525
1525
  };
1526
1526
 
@@ -1531,7 +1531,7 @@ const Drawer = (props) => {
1531
1531
  /*------------------------------------------------------------------------*/
1532
1532
  /* Style */
1533
1533
  /*------------------------------------------------------------------------*/
1534
- const style$4 = `
1534
+ const style$5 = `
1535
1535
  .PopSuccessMark-outer-container {
1536
1536
  position: relative;
1537
1537
  display: inline-block;
@@ -1636,7 +1636,7 @@ const PopSuccessMark = (props) => {
1636
1636
  width: `${sizeRem}rem`,
1637
1637
  height: `${sizeRem}rem`,
1638
1638
  }, "aria-label": "checkmark indicating success" },
1639
- React__default["default"].createElement("style", null, style$4),
1639
+ React__default["default"].createElement("style", null, style$5),
1640
1640
  React__default["default"].createElement("div", { className: `PopSuccessMark-check-stroke-1 bg-${checkVariant}`, style: {
1641
1641
  borderRadius: `${sizeRem / 5}rem`,
1642
1642
  } }),
@@ -1652,7 +1652,7 @@ const PopSuccessMark = (props) => {
1652
1652
  /*------------------------------------------------------------------------*/
1653
1653
  /* Style */
1654
1654
  /*------------------------------------------------------------------------*/
1655
- const style$3 = `
1655
+ const style$4 = `
1656
1656
  .PopFailureMark-outer-container {
1657
1657
  position: relative;
1658
1658
  display: inline-block;
@@ -1756,7 +1756,7 @@ const PopFailureMark = (props) => {
1756
1756
  width: `${sizeRem}rem`,
1757
1757
  height: `${sizeRem}rem`,
1758
1758
  }, "aria-label": "mark indicating failure" },
1759
- React__default["default"].createElement("style", null, style$3),
1759
+ React__default["default"].createElement("style", null, style$4),
1760
1760
  React__default["default"].createElement("div", { className: `PopFailureMark-x-stroke-1 bg-${xVariant}`, style: {
1761
1761
  borderRadius: `${sizeRem / 5}rem`,
1762
1762
  } }),
@@ -1772,7 +1772,7 @@ const PopFailureMark = (props) => {
1772
1772
  /*------------------------------------------------------------------------*/
1773
1773
  /* Style */
1774
1774
  /*------------------------------------------------------------------------*/
1775
- const style$2 = `
1775
+ const style$3 = `
1776
1776
  .PopPendingMark-outer-container {
1777
1777
  position: relative;
1778
1778
  display: inline-block;
@@ -1845,7 +1845,7 @@ const PopPendingMark = (props) => {
1845
1845
  width: `${sizeRem}rem`,
1846
1846
  height: `${sizeRem}rem`,
1847
1847
  }, "aria-label": "mark indicating that the item is pending" },
1848
- React__default["default"].createElement("style", null, style$2),
1848
+ React__default["default"].createElement("style", null, style$3),
1849
1849
  React__default["default"].createElement("div", null,
1850
1850
  React__default["default"].createElement(reactFontawesome.FontAwesomeIcon, { icon: freeSolidSvgIcons.faHourglass, className: `PopPendingMark-hourglass text-${hourglassVariant}`, style: {
1851
1851
  fontSize: `${sizeRem * 0.6}rem`,
@@ -1858,27 +1858,27 @@ const PopPendingMark = (props) => {
1858
1858
  */
1859
1859
  /* ------------- Actions ------------ */
1860
1860
  // Types of actions
1861
- var ActionType$6;
1861
+ var ActionType$7;
1862
1862
  (function (ActionType) {
1863
1863
  // Indicate that the text was recently copied
1864
1864
  ActionType["IndicateRecentlyCopied"] = "indicate-recently-copied";
1865
1865
  // Clear the status
1866
1866
  ActionType["ClearRecentlyCopiedStatus"] = "clear-recently-copied-status";
1867
- })(ActionType$6 || (ActionType$6 = {}));
1867
+ })(ActionType$7 || (ActionType$7 = {}));
1868
1868
  /**
1869
1869
  * Reducer that executes actions
1870
1870
  * @author Gabe Abrams
1871
1871
  * @param state current state
1872
1872
  * @param action action to execute
1873
1873
  */
1874
- const reducer$6 = (state, action) => {
1874
+ const reducer$7 = (state, action) => {
1875
1875
  switch (action.type) {
1876
- case ActionType$6.IndicateRecentlyCopied: {
1876
+ case ActionType$7.IndicateRecentlyCopied: {
1877
1877
  return {
1878
1878
  recentlyCopied: true,
1879
1879
  };
1880
1880
  }
1881
- case ActionType$6.ClearRecentlyCopiedStatus: {
1881
+ case ActionType$7.ClearRecentlyCopiedStatus: {
1882
1882
  return {
1883
1883
  recentlyCopied: false,
1884
1884
  };
@@ -1904,7 +1904,7 @@ const CopiableBox = (props) => {
1904
1904
  recentlyCopied: false,
1905
1905
  };
1906
1906
  // Initialize state
1907
- const [state, dispatch] = React.useReducer(reducer$6, initialState);
1907
+ const [state, dispatch] = React.useReducer(reducer$7, initialState);
1908
1908
  // Destructure common state
1909
1909
  const { recentlyCopied, } = state;
1910
1910
  /*------------------------------------------------------------------------*/
@@ -1924,13 +1924,13 @@ const CopiableBox = (props) => {
1924
1924
  }
1925
1925
  // Show copied notice
1926
1926
  dispatch({
1927
- type: ActionType$6.IndicateRecentlyCopied,
1927
+ type: ActionType$7.IndicateRecentlyCopied,
1928
1928
  });
1929
1929
  // Wait a moment
1930
1930
  yield waitMs(4000);
1931
1931
  // Hide copied notice
1932
1932
  dispatch({
1933
- type: ActionType$6.ClearRecentlyCopiedStatus,
1933
+ type: ActionType$7.ClearRecentlyCopiedStatus,
1934
1934
  });
1935
1935
  });
1936
1936
  /*------------------------------------------------------------------------*/
@@ -1986,20 +1986,20 @@ const CopiableBox = (props) => {
1986
1986
  */
1987
1987
  /* ------------- Actions ------------ */
1988
1988
  // Types of actions
1989
- var ActionType$5;
1989
+ var ActionType$6;
1990
1990
  (function (ActionType) {
1991
1991
  // Toggle whether a child are being shown
1992
1992
  ActionType["ToggleChild"] = "toggle-child";
1993
- })(ActionType$5 || (ActionType$5 = {}));
1993
+ })(ActionType$6 || (ActionType$6 = {}));
1994
1994
  /**
1995
1995
  * Reducer that executes actions
1996
1996
  * @author Gabe Abrams
1997
1997
  * @param state current state
1998
1998
  * @param action action to execute
1999
1999
  */
2000
- const reducer$5 = (state, action) => {
2000
+ const reducer$6 = (state, action) => {
2001
2001
  switch (action.type) {
2002
- case ActionType$5.ToggleChild: {
2002
+ case ActionType$6.ToggleChild: {
2003
2003
  return Object.assign(Object.assign({}, state), { childExpanded: Object.assign(Object.assign({}, state.childExpanded), { [String(action.id)]: !state.childExpanded[String(action.id)] }) });
2004
2004
  }
2005
2005
  default: {
@@ -2028,7 +2028,7 @@ const NestableItemList = (props) => {
2028
2028
  childExpanded: initChildExpanded,
2029
2029
  };
2030
2030
  // Initialize state
2031
- const [state, dispatch] = React.useReducer(reducer$5, initialState);
2031
+ const [state, dispatch] = React.useReducer(reducer$6, initialState);
2032
2032
  // Destructure common state
2033
2033
  const { childExpanded, } = state;
2034
2034
  /*------------------------------------------------------------------------*/
@@ -2118,7 +2118,7 @@ const NestableItemList = (props) => {
2118
2118
  backgroundColor: 'transparent',
2119
2119
  }, type: "button", onClick: () => {
2120
2120
  dispatch({
2121
- type: ActionType$5.ToggleChild,
2121
+ type: ActionType$6.ToggleChild,
2122
2122
  id: item.id,
2123
2123
  });
2124
2124
  }, "aria-label": `${childExpanded[item.id] ? 'Hide' : 'Show'} items in ${item.name}` },
@@ -2394,7 +2394,7 @@ var SortType;
2394
2394
  })(SortType || (SortType = {}));
2395
2395
  /* ------------- Actions ------------ */
2396
2396
  // Types of actions
2397
- var ActionType$4;
2397
+ var ActionType$5;
2398
2398
  (function (ActionType) {
2399
2399
  // Toggle sort column param
2400
2400
  ActionType["ToggleSortColumn"] = "toggle-sort-column";
@@ -2406,16 +2406,16 @@ var ActionType$4;
2406
2406
  ActionType["ShowAllColumns"] = "show-all-columns";
2407
2407
  // Hide all columns
2408
2408
  ActionType["HideAllColumns"] = "hide-all-columns";
2409
- })(ActionType$4 || (ActionType$4 = {}));
2409
+ })(ActionType$5 || (ActionType$5 = {}));
2410
2410
  /**
2411
2411
  * Reducer that executes actions
2412
2412
  * @author Gabe Abrams
2413
2413
  * @param state current state
2414
2414
  * @param action action to execute
2415
2415
  */
2416
- const reducer$4 = (state, action) => {
2416
+ const reducer$5 = (state, action) => {
2417
2417
  switch (action.type) {
2418
- case ActionType$4.ToggleSortColumn: {
2418
+ case ActionType$5.ToggleSortColumn: {
2419
2419
  if (action.param !== state.sortColumnParam) {
2420
2420
  // Different column param
2421
2421
  return Object.assign(Object.assign({}, state), { sortColumnParam: action.param, sortType: SortType.Ascending });
@@ -2427,22 +2427,22 @@ const reducer$4 = (state, action) => {
2427
2427
  // Stop sorting by column
2428
2428
  return Object.assign(Object.assign({}, state), { sortColumnParam: undefined, sortType: SortType.Ascending });
2429
2429
  }
2430
- case ActionType$4.UpdateColumnVisibility: {
2430
+ case ActionType$5.UpdateColumnVisibility: {
2431
2431
  const { columnVisibilityMap } = state;
2432
2432
  columnVisibilityMap[action.param] = action.visible;
2433
2433
  return Object.assign(Object.assign({}, state), { columnVisibilityMap });
2434
2434
  }
2435
- case ActionType$4.ToggleColVisCusModalVisibility: {
2435
+ case ActionType$5.ToggleColVisCusModalVisibility: {
2436
2436
  return Object.assign(Object.assign({}, state), { columnVisibilityCustomizationModalVisible: !state.columnVisibilityCustomizationModalVisible });
2437
2437
  }
2438
- case ActionType$4.ShowAllColumns: {
2438
+ case ActionType$5.ShowAllColumns: {
2439
2439
  const { columnVisibilityMap } = state;
2440
2440
  Object.keys(columnVisibilityMap).forEach((param) => {
2441
2441
  columnVisibilityMap[param] = true;
2442
2442
  });
2443
2443
  return Object.assign(Object.assign({}, state), { columnVisibilityMap });
2444
2444
  }
2445
- case ActionType$4.HideAllColumns: {
2445
+ case ActionType$5.HideAllColumns: {
2446
2446
  const { columnVisibilityMap } = state;
2447
2447
  Object.keys(columnVisibilityMap).forEach((param) => {
2448
2448
  columnVisibilityMap[param] = false;
@@ -2489,7 +2489,7 @@ const IntelliTable = (props) => {
2489
2489
  columnVisibilityCustomizationModalVisible: false,
2490
2490
  };
2491
2491
  // Initialize state
2492
- const [state, dispatch] = React.useReducer(reducer$4, initialState);
2492
+ const [state, dispatch] = React.useReducer(reducer$5, initialState);
2493
2493
  // Destructure common state
2494
2494
  const { sortColumnParam, sortType, columnVisibilityMap, columnVisibilityCustomizationModalVisible, } = state;
2495
2495
  /*------------------------------------------------------------------------*/
@@ -2512,13 +2512,13 @@ const IntelliTable = (props) => {
2512
2512
  return alert$1('Choose at least one column', 'To continue, you have to choose at least one column to show');
2513
2513
  }
2514
2514
  dispatch({
2515
- type: ActionType$4.ToggleColVisCusModalVisibility,
2515
+ type: ActionType$5.ToggleColVisCusModalVisibility,
2516
2516
  });
2517
2517
  }, okayVariant: Variant$1.Light },
2518
2518
  columns.map((column) => {
2519
2519
  return (React__default["default"].createElement(CheckboxButton, { key: column.param, id: `IntelliTable-${id}-toggle-visibility-${column.param}`, className: "mb-2", text: column.title, onChanged: (checked) => {
2520
2520
  dispatch({
2521
- type: ActionType$4.UpdateColumnVisibility,
2521
+ type: ActionType$5.UpdateColumnVisibility,
2522
2522
  param: column.param,
2523
2523
  visible: checked,
2524
2524
  });
@@ -2527,12 +2527,12 @@ const IntelliTable = (props) => {
2527
2527
  React__default["default"].createElement("div", { className: "mt-3" }, "Or you can:"),
2528
2528
  React__default["default"].createElement("button", { type: "button", id: `IntelliTable-${id}-select-all-columns`, className: "btn btn-secondary me-2", "aria-label": `show all columns in the ${title} table`, onClick: () => {
2529
2529
  dispatch({
2530
- type: ActionType$4.ShowAllColumns,
2530
+ type: ActionType$5.ShowAllColumns,
2531
2531
  });
2532
2532
  } }, "Select All"),
2533
2533
  React__default["default"].createElement("button", { type: "button", id: `IntelliTable-${id}-select-none-columns`, className: "btn btn-secondary", "aria-label": `hide all columns in the ${title} table`, onClick: () => {
2534
2534
  dispatch({
2535
- type: ActionType$4.HideAllColumns,
2535
+ type: ActionType$5.HideAllColumns,
2536
2536
  });
2537
2537
  } }, "Deselect All")));
2538
2538
  }
@@ -2583,7 +2583,7 @@ const IntelliTable = (props) => {
2583
2583
  React__default["default"].createElement("div", null,
2584
2584
  React__default["default"].createElement("button", { type: "button", id: `IntelliTable-${id}-sort-by-${column.param}-button`, className: `btn btn-${sortingByThisColumn ? 'light' : 'secondary'} btn-sm ms-1 ps-1 pe-1 pt-0 pb-0`, "aria-label": sortButtonAriaLabel, onClick: () => {
2585
2585
  dispatch({
2586
- type: ActionType$4.ToggleSortColumn,
2586
+ type: ActionType$5.ToggleSortColumn,
2587
2587
  param: column.param,
2588
2588
  });
2589
2589
  } },
@@ -2772,7 +2772,7 @@ const IntelliTable = (props) => {
2772
2772
  React__default["default"].createElement(CSVDownloadButton, { "aria-label": `download data as csv for ${title}`, id: `IntelliTable-${id}-download-as-csv`, filename: filename, csv: csv }),
2773
2773
  React__default["default"].createElement("button", { type: "button", className: "btn btn-secondary ms-2", "aria-label": `show panel for customizing which columns show in table ${title}`, id: `IntelliTable-${id}-show-column-customization-modal`, onClick: () => {
2774
2774
  dispatch({
2775
- type: ActionType$4.ToggleColVisCusModalVisibility,
2775
+ type: ActionType$5.ToggleColVisCusModalVisibility,
2776
2776
  });
2777
2777
  } },
2778
2778
  "Show/Hide Cols",
@@ -2804,7 +2804,7 @@ var FilterDrawer;
2804
2804
  /*------------------------------------------------------------------------*/
2805
2805
  /* Style */
2806
2806
  /*------------------------------------------------------------------------*/
2807
- const style$1 = `
2807
+ const style$2 = `
2808
2808
  .LogReviewer-outer-container {
2809
2809
  /* Full Screen */
2810
2810
  display: inline-block;
@@ -3138,7 +3138,7 @@ const genHumanReadableName = (machineReadableName) => {
3138
3138
  };
3139
3139
  /* ------------- Actions ------------ */
3140
3140
  // Types of actions
3141
- var ActionType$3;
3141
+ var ActionType$4;
3142
3142
  (function (ActionType) {
3143
3143
  // Show the loading bar
3144
3144
  ActionType["StartLoading"] = "start-loading";
@@ -3160,45 +3160,45 @@ var ActionType$3;
3160
3160
  ActionType["UpdateActionErrorFilterState"] = "update-action-error-filter-state";
3161
3161
  // Update the advanced filter state
3162
3162
  ActionType["UpdateAdvancedFilterState"] = "update-advanced-filter-state";
3163
- })(ActionType$3 || (ActionType$3 = {}));
3163
+ })(ActionType$4 || (ActionType$4 = {}));
3164
3164
  /**
3165
3165
  * Reducer that executes actions
3166
3166
  * @author Gabe Abrams
3167
3167
  * @param state current state
3168
3168
  * @param action action to execute
3169
3169
  */
3170
- const reducer$3 = (state, action) => {
3170
+ const reducer$4 = (state, action) => {
3171
3171
  switch (action.type) {
3172
- case ActionType$3.StartLoading: {
3172
+ case ActionType$4.StartLoading: {
3173
3173
  return Object.assign(Object.assign({}, state), { loading: true });
3174
3174
  }
3175
- case ActionType$3.FinishLoading: {
3175
+ case ActionType$4.FinishLoading: {
3176
3176
  return Object.assign(Object.assign({}, state), { loading: false, logMap: action.logMap });
3177
3177
  }
3178
- case ActionType$3.ToggleFilterDrawer: {
3178
+ case ActionType$4.ToggleFilterDrawer: {
3179
3179
  return Object.assign(Object.assign({}, state), { expandedFilterDrawer: (state.expandedFilterDrawer === action.filterDrawer
3180
3180
  ? undefined // hide
3181
3181
  : action.filterDrawer) });
3182
3182
  }
3183
- case ActionType$3.HideFilterDrawer: {
3183
+ case ActionType$4.HideFilterDrawer: {
3184
3184
  return Object.assign(Object.assign({}, state), { expandedFilterDrawer: undefined });
3185
3185
  }
3186
- case ActionType$3.ResetFilters: {
3186
+ case ActionType$4.ResetFilters: {
3187
3187
  return Object.assign(Object.assign({}, state), { dateFilterState: action.initDateFilterState, contextFilterState: action.initContextFilterState, tagFilterState: action.initTagFilterState, actionErrorFilterState: action.initActionErrorFilterState, advancedFilterState: action.initAdvancedFilterState });
3188
3188
  }
3189
- case ActionType$3.UpdateDateFilterState: {
3189
+ case ActionType$4.UpdateDateFilterState: {
3190
3190
  return Object.assign(Object.assign({}, state), { dateFilterState: action.dateFilterState });
3191
3191
  }
3192
- case ActionType$3.UpdateContextFilterState: {
3192
+ case ActionType$4.UpdateContextFilterState: {
3193
3193
  return Object.assign(Object.assign({}, state), { contextFilterState: action.contextFilterState });
3194
3194
  }
3195
- case ActionType$3.UpdateTagFilterState: {
3195
+ case ActionType$4.UpdateTagFilterState: {
3196
3196
  return Object.assign(Object.assign({}, state), { tagFilterState: action.tagFilterState });
3197
3197
  }
3198
- case ActionType$3.UpdateActionErrorFilterState: {
3198
+ case ActionType$4.UpdateActionErrorFilterState: {
3199
3199
  return Object.assign(Object.assign({}, state), { actionErrorFilterState: action.actionErrorFilterState });
3200
3200
  }
3201
- case ActionType$3.UpdateAdvancedFilterState: {
3201
+ case ActionType$4.UpdateAdvancedFilterState: {
3202
3202
  return Object.assign(Object.assign({}, state), { advancedFilterState: action.advancedFilterState });
3203
3203
  }
3204
3204
  default: {
@@ -3327,7 +3327,7 @@ const LogReviewer = (props) => {
3327
3327
  advancedFilterState: initAdvancedFilterState,
3328
3328
  };
3329
3329
  // Initialize state
3330
- const [state, dispatch] = React.useReducer(reducer$3, initialState);
3330
+ const [state, dispatch] = React.useReducer(reducer$4, initialState);
3331
3331
  // Destructure common state
3332
3332
  const { loading, logMap, expandedFilterDrawer, dateFilterState, contextFilterState, tagFilterState, actionErrorFilterState, advancedFilterState, } = state;
3333
3333
  /*------------------------------------------------------------------------*/
@@ -3378,7 +3378,7 @@ const LogReviewer = (props) => {
3378
3378
  const handleDateRangeUpdated = (newDateFilterState) => __awaiter(void 0, void 0, void 0, function* () {
3379
3379
  // Update state
3380
3380
  dispatch({
3381
- type: ActionType$3.UpdateDateFilterState,
3381
+ type: ActionType$4.UpdateDateFilterState,
3382
3382
  dateFilterState: newDateFilterState,
3383
3383
  });
3384
3384
  // Check which year/month combos we need to load
@@ -3389,7 +3389,7 @@ const LogReviewer = (props) => {
3389
3389
  }
3390
3390
  // Start loading
3391
3391
  dispatch({
3392
- type: ActionType$3.StartLoading,
3392
+ type: ActionType$4.StartLoading,
3393
3393
  });
3394
3394
  // Load required months
3395
3395
  try {
@@ -3413,7 +3413,7 @@ const LogReviewer = (props) => {
3413
3413
  }
3414
3414
  // Finish loading
3415
3415
  dispatch({
3416
- type: ActionType$3.FinishLoading,
3416
+ type: ActionType$4.FinishLoading,
3417
3417
  logMap,
3418
3418
  });
3419
3419
  });
@@ -3452,7 +3452,7 @@ const LogReviewer = (props) => {
3452
3452
  React__default["default"].createElement("div", { className: "LogReviewer-filter-toggle-buttons alert alert-secondary p-2 m-0" },
3453
3453
  React__default["default"].createElement("button", { type: "button", id: "LogReviewer-toggle-date-filter-drawer", className: `btn btn-${FilterDrawer.Date === expandedFilterDrawer ? 'warning' : 'light'} me-2`, "aria-label": "toggle date filter drawer", onClick: () => {
3454
3454
  dispatch({
3455
- type: ActionType$3.ToggleFilterDrawer,
3455
+ type: ActionType$4.ToggleFilterDrawer,
3456
3456
  filterDrawer: FilterDrawer.Date,
3457
3457
  });
3458
3458
  } },
@@ -3460,7 +3460,7 @@ const LogReviewer = (props) => {
3460
3460
  "Date"),
3461
3461
  React__default["default"].createElement("button", { type: "button", id: "LogReviewer-toggle-context-filter-drawer", className: `btn btn-${FilterDrawer.Context === expandedFilterDrawer ? 'warning' : 'light'} me-2`, "aria-label": "toggle context filter drawer", onClick: () => {
3462
3462
  dispatch({
3463
- type: ActionType$3.ToggleFilterDrawer,
3463
+ type: ActionType$4.ToggleFilterDrawer,
3464
3464
  filterDrawer: FilterDrawer.Context,
3465
3465
  });
3466
3466
  } },
@@ -3468,7 +3468,7 @@ const LogReviewer = (props) => {
3468
3468
  "Context"),
3469
3469
  (LogMetadata.Tag && Object.keys(LogMetadata.Tag).length > 0) && (React__default["default"].createElement("button", { type: "button", id: "LogReviewer-toggle-tag-filter-drawer", className: `btn btn-${FilterDrawer.Tag === expandedFilterDrawer ? 'warning' : 'light'} me-2`, "aria-label": "toggle tag filter drawer", onClick: () => {
3470
3470
  dispatch({
3471
- type: ActionType$3.ToggleFilterDrawer,
3471
+ type: ActionType$4.ToggleFilterDrawer,
3472
3472
  filterDrawer: FilterDrawer.Tag,
3473
3473
  });
3474
3474
  } },
@@ -3476,7 +3476,7 @@ const LogReviewer = (props) => {
3476
3476
  "Tag")),
3477
3477
  React__default["default"].createElement("button", { type: "button", id: "LogReviewer-toggle-action-filter-drawer", className: `btn btn-${FilterDrawer.Action === expandedFilterDrawer ? 'warning' : 'light'} me-2`, "aria-label": "toggle action and error filter drawer", onClick: () => {
3478
3478
  dispatch({
3479
- type: ActionType$3.ToggleFilterDrawer,
3479
+ type: ActionType$4.ToggleFilterDrawer,
3480
3480
  filterDrawer: FilterDrawer.Action,
3481
3481
  });
3482
3482
  } },
@@ -3484,7 +3484,7 @@ const LogReviewer = (props) => {
3484
3484
  "Action"),
3485
3485
  React__default["default"].createElement("button", { type: "button", id: "LogReviewer-toggle-advanced-filter-drawer", className: `btn btn-${FilterDrawer.Advanced === expandedFilterDrawer ? 'warning' : 'light'} me-2`, "aria-label": "toggle advanced filter drawer", onClick: () => {
3486
3486
  dispatch({
3487
- type: ActionType$3.ToggleFilterDrawer,
3487
+ type: ActionType$4.ToggleFilterDrawer,
3488
3488
  filterDrawer: FilterDrawer.Advanced,
3489
3489
  });
3490
3490
  } },
@@ -3492,7 +3492,7 @@ const LogReviewer = (props) => {
3492
3492
  "Advanced"),
3493
3493
  React__default["default"].createElement("button", { type: "button", id: "LogReviewer-reset-filters-button", className: "btn btn-light", "aria-label": "reset filters", onClick: () => {
3494
3494
  dispatch({
3495
- type: ActionType$3.ResetFilters,
3495
+ type: ActionType$4.ResetFilters,
3496
3496
  initActionErrorFilterState,
3497
3497
  initAdvancedFilterState,
3498
3498
  initContextFilterState,
@@ -3614,7 +3614,7 @@ const LogReviewer = (props) => {
3614
3614
  }
3615
3615
  });
3616
3616
  dispatch({
3617
- type: ActionType$3.UpdateContextFilterState,
3617
+ type: ActionType$4.UpdateContextFilterState,
3618
3618
  contextFilterState,
3619
3619
  });
3620
3620
  } }));
@@ -3629,7 +3629,7 @@ const LogReviewer = (props) => {
3629
3629
  return (React__default["default"].createElement(CheckboxButton, { key: tag, id: `LogReviewer-tag-${tag}-checkbox`, text: description, ariaLabel: `require that logs be tagged with "${description}" or any other selected tag`, checked: tagFilterState[tag], onChanged: (checked) => {
3630
3630
  tagFilterState[tag] = checked;
3631
3631
  dispatch({
3632
- type: ActionType$3.UpdateTagFilterState,
3632
+ type: ActionType$4.UpdateTagFilterState,
3633
3633
  tagFilterState,
3634
3634
  });
3635
3635
  } }));
@@ -3642,21 +3642,21 @@ const LogReviewer = (props) => {
3642
3642
  React__default["default"].createElement(RadioButton, { id: "LogReviewer-type-all", text: "All Logs", onSelected: () => {
3643
3643
  actionErrorFilterState.type = undefined;
3644
3644
  dispatch({
3645
- type: ActionType$3.UpdateActionErrorFilterState,
3645
+ type: ActionType$4.UpdateActionErrorFilterState,
3646
3646
  actionErrorFilterState,
3647
3647
  });
3648
3648
  }, ariaLabel: "show logs of all types", selected: actionErrorFilterState.type === undefined }),
3649
3649
  React__default["default"].createElement(RadioButton, { id: "LogReviewer-type-action-only", text: "Action Logs Only", onSelected: () => {
3650
3650
  actionErrorFilterState.type = LogType$1.Action;
3651
3651
  dispatch({
3652
- type: ActionType$3.UpdateActionErrorFilterState,
3652
+ type: ActionType$4.UpdateActionErrorFilterState,
3653
3653
  actionErrorFilterState,
3654
3654
  });
3655
3655
  }, ariaLabel: "only show action logs", selected: actionErrorFilterState.type === LogType$1.Action }),
3656
3656
  React__default["default"].createElement(RadioButton, { id: "LogReviewer-type-error-only", text: "Action Error Only", onSelected: () => {
3657
3657
  actionErrorFilterState.type = LogType$1.Error;
3658
3658
  dispatch({
3659
- type: ActionType$3.UpdateActionErrorFilterState,
3659
+ type: ActionType$4.UpdateActionErrorFilterState,
3660
3660
  actionErrorFilterState,
3661
3661
  });
3662
3662
  }, ariaLabel: "only show error logs", selected: actionErrorFilterState.type === LogType$1.Error, noMarginOnRight: true })),
@@ -3668,7 +3668,7 @@ const LogReviewer = (props) => {
3668
3668
  return (React__default["default"].createElement(CheckboxButton, { key: action, id: `LogReviewer-action-${action}-checkbox`, text: description, ariaLabel: `include logs with action type "${description}" in results`, noMarginOnRight: true, checked: actionErrorFilterState.action[action], onChanged: (checked) => {
3669
3669
  actionErrorFilterState.action[action] = checked;
3670
3670
  dispatch({
3671
- type: ActionType$3.UpdateActionErrorFilterState,
3671
+ type: ActionType$4.UpdateActionErrorFilterState,
3672
3672
  actionErrorFilterState,
3673
3673
  });
3674
3674
  } }));
@@ -3679,7 +3679,7 @@ const LogReviewer = (props) => {
3679
3679
  return (React__default["default"].createElement(CheckboxButton, { key: target, id: `LogReviewer-target-${target}-checkbox`, text: description, ariaLabel: `include logs with target "${description}" in results`, checked: actionErrorFilterState.target[target], noMarginOnRight: true, onChanged: (checked) => {
3680
3680
  actionErrorFilterState.target[target] = checked;
3681
3681
  dispatch({
3682
- type: ActionType$3.UpdateActionErrorFilterState,
3682
+ type: ActionType$4.UpdateActionErrorFilterState,
3683
3683
  actionErrorFilterState,
3684
3684
  });
3685
3685
  } }));
@@ -3691,7 +3691,7 @@ const LogReviewer = (props) => {
3691
3691
  React__default["default"].createElement("input", { type: "text", className: "form-control", "aria-label": "query for error message", value: actionErrorFilterState.errorMessage, placeholder: "e.g. undefined is not a function", onChange: (e) => {
3692
3692
  actionErrorFilterState.errorMessage = e.target.value;
3693
3693
  dispatch({
3694
- type: ActionType$3.UpdateActionErrorFilterState,
3694
+ type: ActionType$4.UpdateActionErrorFilterState,
3695
3695
  actionErrorFilterState,
3696
3696
  });
3697
3697
  } })),
@@ -3702,7 +3702,7 @@ const LogReviewer = (props) => {
3702
3702
  .trim()
3703
3703
  .toUpperCase());
3704
3704
  dispatch({
3705
- type: ActionType$3.UpdateActionErrorFilterState,
3705
+ type: ActionType$4.UpdateActionErrorFilterState,
3706
3706
  actionErrorFilterState,
3707
3707
  });
3708
3708
  } }))))));
@@ -3716,7 +3716,7 @@ const LogReviewer = (props) => {
3716
3716
  React__default["default"].createElement("input", { type: "text", className: "form-control", "aria-label": "query for user first name", value: advancedFilterState.userFirstName, placeholder: "e.g. Divardo", onChange: (e) => {
3717
3717
  advancedFilterState.userFirstName = e.target.value;
3718
3718
  dispatch({
3719
- type: ActionType$3.UpdateAdvancedFilterState,
3719
+ type: ActionType$4.UpdateAdvancedFilterState,
3720
3720
  advancedFilterState,
3721
3721
  });
3722
3722
  } })),
@@ -3725,7 +3725,7 @@ const LogReviewer = (props) => {
3725
3725
  React__default["default"].createElement("input", { type: "text", className: "form-control", "aria-label": "query for user last name", value: advancedFilterState.userLastName, placeholder: "e.g. Calicci", onChange: (e) => {
3726
3726
  advancedFilterState.userLastName = e.target.value;
3727
3727
  dispatch({
3728
- type: ActionType$3.UpdateAdvancedFilterState,
3728
+ type: ActionType$4.UpdateAdvancedFilterState,
3729
3729
  advancedFilterState,
3730
3730
  });
3731
3731
  } })),
@@ -3735,7 +3735,7 @@ const LogReviewer = (props) => {
3735
3735
  advancedFilterState.userEmail = ((e.target.value)
3736
3736
  .trim());
3737
3737
  dispatch({
3738
- type: ActionType$3.UpdateAdvancedFilterState,
3738
+ type: ActionType$4.UpdateAdvancedFilterState,
3739
3739
  advancedFilterState,
3740
3740
  });
3741
3741
  } })),
@@ -3749,7 +3749,7 @@ const LogReviewer = (props) => {
3749
3749
  .trim());
3750
3750
  }
3751
3751
  dispatch({
3752
- type: ActionType$3.UpdateAdvancedFilterState,
3752
+ type: ActionType$4.UpdateAdvancedFilterState,
3753
3753
  advancedFilterState,
3754
3754
  });
3755
3755
  } })),
@@ -3757,21 +3757,21 @@ const LogReviewer = (props) => {
3757
3757
  React__default["default"].createElement(CheckboxButton, { text: "Students", onChanged: (checked) => {
3758
3758
  advancedFilterState.includeLearners = checked;
3759
3759
  dispatch({
3760
- type: ActionType$3.UpdateAdvancedFilterState,
3760
+ type: ActionType$4.UpdateAdvancedFilterState,
3761
3761
  advancedFilterState,
3762
3762
  });
3763
3763
  }, checked: advancedFilterState.includeLearners, ariaLabel: "show logs from students" }),
3764
3764
  React__default["default"].createElement(CheckboxButton, { text: "Teaching Team Members", onChanged: (checked) => {
3765
3765
  advancedFilterState.includeTTMs = checked;
3766
3766
  dispatch({
3767
- type: ActionType$3.UpdateAdvancedFilterState,
3767
+ type: ActionType$4.UpdateAdvancedFilterState,
3768
3768
  advancedFilterState,
3769
3769
  });
3770
3770
  }, checked: advancedFilterState.includeTTMs, ariaLabel: "show logs from teaching team members" }),
3771
3771
  React__default["default"].createElement(CheckboxButton, { text: "Admins", onChanged: (checked) => {
3772
3772
  advancedFilterState.includeAdmins = checked;
3773
3773
  dispatch({
3774
- type: ActionType$3.UpdateAdvancedFilterState,
3774
+ type: ActionType$4.UpdateAdvancedFilterState,
3775
3775
  advancedFilterState,
3776
3776
  });
3777
3777
  }, checked: advancedFilterState.includeAdmins, ariaLabel: "show logs from admins" }))),
@@ -3781,7 +3781,7 @@ const LogReviewer = (props) => {
3781
3781
  React__default["default"].createElement("input", { type: "text", className: "form-control", "aria-label": "query for course name", value: advancedFilterState.courseName, placeholder: "e.g. GLC 200", onChange: (e) => {
3782
3782
  advancedFilterState.courseName = e.target.value;
3783
3783
  dispatch({
3784
- type: ActionType$3.UpdateAdvancedFilterState,
3784
+ type: ActionType$4.UpdateAdvancedFilterState,
3785
3785
  advancedFilterState,
3786
3786
  });
3787
3787
  } })),
@@ -3795,7 +3795,7 @@ const LogReviewer = (props) => {
3795
3795
  .trim());
3796
3796
  }
3797
3797
  dispatch({
3798
- type: ActionType$3.UpdateAdvancedFilterState,
3798
+ type: ActionType$4.UpdateAdvancedFilterState,
3799
3799
  advancedFilterState,
3800
3800
  });
3801
3801
  } }))),
@@ -3804,21 +3804,21 @@ const LogReviewer = (props) => {
3804
3804
  React__default["default"].createElement(RadioButton, { text: "All Devices", ariaLabel: "show logs from all devices", selected: advancedFilterState.isMobile === undefined, onSelected: () => {
3805
3805
  advancedFilterState.isMobile = undefined;
3806
3806
  dispatch({
3807
- type: ActionType$3.UpdateAdvancedFilterState,
3807
+ type: ActionType$4.UpdateAdvancedFilterState,
3808
3808
  advancedFilterState,
3809
3809
  });
3810
3810
  } }),
3811
3811
  React__default["default"].createElement(RadioButton, { text: "Mobile Only", ariaLabel: "show logs from mobile devices", selected: advancedFilterState.isMobile === true, onSelected: () => {
3812
3812
  advancedFilterState.isMobile = true;
3813
3813
  dispatch({
3814
- type: ActionType$3.UpdateAdvancedFilterState,
3814
+ type: ActionType$4.UpdateAdvancedFilterState,
3815
3815
  advancedFilterState,
3816
3816
  });
3817
3817
  } }),
3818
3818
  React__default["default"].createElement(RadioButton, { text: "Desktop Only", ariaLabel: "show logs from desktop devices", selected: advancedFilterState.isMobile === false, onSelected: () => {
3819
3819
  advancedFilterState.isMobile = false;
3820
3820
  dispatch({
3821
- type: ActionType$3.UpdateAdvancedFilterState,
3821
+ type: ActionType$4.UpdateAdvancedFilterState,
3822
3822
  advancedFilterState,
3823
3823
  });
3824
3824
  }, noMarginOnRight: true }))),
@@ -3827,21 +3827,21 @@ const LogReviewer = (props) => {
3827
3827
  React__default["default"].createElement(RadioButton, { text: "Both", ariaLabel: "show logs from all sources", selected: advancedFilterState.source === undefined, onSelected: () => {
3828
3828
  advancedFilterState.source = undefined;
3829
3829
  dispatch({
3830
- type: ActionType$3.UpdateAdvancedFilterState,
3830
+ type: ActionType$4.UpdateAdvancedFilterState,
3831
3831
  advancedFilterState,
3832
3832
  });
3833
3833
  } }),
3834
3834
  React__default["default"].createElement(RadioButton, { text: "Client Only", ariaLabel: "show logs from client source", selected: advancedFilterState.source === LogSource$1.Client, onSelected: () => {
3835
3835
  advancedFilterState.source = LogSource$1.Client;
3836
3836
  dispatch({
3837
- type: ActionType$3.UpdateAdvancedFilterState,
3837
+ type: ActionType$4.UpdateAdvancedFilterState,
3838
3838
  advancedFilterState,
3839
3839
  });
3840
3840
  } }),
3841
3841
  React__default["default"].createElement(RadioButton, { text: "Server Only", ariaLabel: "show logs from server source", selected: advancedFilterState.source === LogSource$1.Server, onSelected: () => {
3842
3842
  advancedFilterState.source = LogSource$1.Server;
3843
3843
  dispatch({
3844
- type: ActionType$3.UpdateAdvancedFilterState,
3844
+ type: ActionType$4.UpdateAdvancedFilterState,
3845
3845
  advancedFilterState,
3846
3846
  });
3847
3847
  }, noMarginOnRight: true })),
@@ -3852,7 +3852,7 @@ const LogReviewer = (props) => {
3852
3852
  advancedFilterState.courseName = ((e.target.value)
3853
3853
  .trim());
3854
3854
  dispatch({
3855
- type: ActionType$3.UpdateAdvancedFilterState,
3855
+ type: ActionType$4.UpdateAdvancedFilterState,
3856
3856
  advancedFilterState,
3857
3857
  });
3858
3858
  } })),
@@ -3862,7 +3862,7 @@ const LogReviewer = (props) => {
3862
3862
  advancedFilterState.courseName = ((e.target.value)
3863
3863
  .trim());
3864
3864
  dispatch({
3865
- type: ActionType$3.UpdateAdvancedFilterState,
3865
+ type: ActionType$4.UpdateAdvancedFilterState,
3866
3866
  advancedFilterState,
3867
3867
  });
3868
3868
  } })))))));
@@ -4141,7 +4141,7 @@ const LogReviewer = (props) => {
4141
4141
  }
4142
4142
  /* ---------- Wrap in Modal --------- */
4143
4143
  return (React__default["default"].createElement("div", { className: "LogReviewer-outer-container" },
4144
- React__default["default"].createElement("style", null, style$1),
4144
+ React__default["default"].createElement("style", null, style$2),
4145
4145
  React__default["default"].createElement("div", { className: "LogReviewer-inner-container" },
4146
4146
  React__default["default"].createElement("div", { className: "LogReviewer-header" },
4147
4147
  React__default["default"].createElement("div", { className: "LogReviewer-header-title" },
@@ -39467,11 +39467,11 @@ var CreatableSelect$1 = CreatableSelect;
39467
39467
  */
39468
39468
  /* ------------- Actions ------------ */
39469
39469
  // Types of actions
39470
- var ActionType$2;
39470
+ var ActionType$3;
39471
39471
  (function (ActionType) {
39472
39472
  // Update the input value
39473
39473
  ActionType["SetInputValue"] = "SetInputValue";
39474
- })(ActionType$2 || (ActionType$2 = {}));
39474
+ })(ActionType$3 || (ActionType$3 = {}));
39475
39475
  /**
39476
39476
  * Reducer that executes actions
39477
39477
  * @author Yuen Ler Chow
@@ -39479,9 +39479,9 @@ var ActionType$2;
39479
39479
  * @param action action to execute
39480
39480
  * @returns updated state
39481
39481
  */
39482
- const reducer$2 = (state, action) => {
39482
+ const reducer$3 = (state, action) => {
39483
39483
  switch (action.type) {
39484
- case ActionType$2.SetInputValue: {
39484
+ case ActionType$3.SetInputValue: {
39485
39485
  return Object.assign(Object.assign({}, state), { inputValue: action.value });
39486
39486
  }
39487
39487
  default: {
@@ -39501,7 +39501,7 @@ const CreatableMultiselect = (props) => {
39501
39501
  inputValue: '',
39502
39502
  };
39503
39503
  // Initialize state
39504
- const [state, dispatch] = React.useReducer(reducer$2, initialState);
39504
+ const [state, dispatch] = React.useReducer(reducer$3, initialState);
39505
39505
  // Destructure common state
39506
39506
  const { inputValue } = state;
39507
39507
  /*------------------------------------------------------------------------*/
@@ -39578,7 +39578,7 @@ const CreatableMultiselect = (props) => {
39578
39578
  }
39579
39579
  // Reset text field to empty because the values have been added
39580
39580
  dispatch({
39581
- type: ActionType$2.SetInputValue,
39581
+ type: ActionType$3.SetInputValue,
39582
39582
  value: '',
39583
39583
  });
39584
39584
  };
@@ -39617,7 +39617,7 @@ const CreatableMultiselect = (props) => {
39617
39617
  else {
39618
39618
  // simply update the input value to the new input value
39619
39619
  dispatch({
39620
- type: ActionType$2.SetInputValue,
39620
+ type: ActionType$3.SetInputValue,
39621
39621
  value: newValue,
39622
39622
  });
39623
39623
  }
@@ -39662,20 +39662,20 @@ const CreatableMultiselect = (props) => {
39662
39662
  /*------------------------------------------------------------------------*/
39663
39663
  /* -------------------------------- Style ------------------------------- */
39664
39664
  /*------------------------------------------------------------------------*/
39665
- const style = `
39665
+ const style$1 = `
39666
39666
  .AddOrEditDBEntry-input-label {
39667
39667
  min-width: 7rem;
39668
39668
  }
39669
39669
  `;
39670
39670
  /* ------------- Actions ------------ */
39671
39671
  // Types of actions
39672
- var ActionType$1;
39672
+ var ActionType$2;
39673
39673
  (function (ActionType) {
39674
39674
  // Update the DBEntry
39675
39675
  ActionType["UpdateDBEntry"] = "UpdateDBEntry";
39676
39676
  // Start the save spinner
39677
39677
  ActionType["StartSave"] = "StartSave";
39678
- })(ActionType$1 || (ActionType$1 = {}));
39678
+ })(ActionType$2 || (ActionType$2 = {}));
39679
39679
  /**
39680
39680
  * Reducer that executes actions
39681
39681
  * @author Yuen Ler Chow
@@ -39683,12 +39683,12 @@ var ActionType$1;
39683
39683
  * @param action action to execute
39684
39684
  * @returns updated state
39685
39685
  */
39686
- const reducer$1 = (state, action) => {
39686
+ const reducer$2 = (state, action) => {
39687
39687
  switch (action.type) {
39688
- case ActionType$1.UpdateDBEntry: {
39688
+ case ActionType$2.UpdateDBEntry: {
39689
39689
  return Object.assign(Object.assign({}, state), { entry: action.dbEntry });
39690
39690
  }
39691
- case ActionType$1.StartSave: {
39691
+ case ActionType$2.StartSave: {
39692
39692
  return Object.assign(Object.assign({}, state), { saving: true });
39693
39693
  }
39694
39694
  default: {
@@ -39713,7 +39713,7 @@ const AddOrEditDBEntry = (props) => {
39713
39713
  saving: false,
39714
39714
  };
39715
39715
  // Initialize state
39716
- const [state, dispatch] = React.useReducer(reducer$1, initialState);
39716
+ const [state, dispatch] = React.useReducer(reducer$2, initialState);
39717
39717
  // Destructure common state
39718
39718
  const { entry, saving, } = state;
39719
39719
  /*------------------------------------------------------------------------*/
@@ -39725,7 +39725,7 @@ const AddOrEditDBEntry = (props) => {
39725
39725
  */
39726
39726
  const save = () => __awaiter(void 0, void 0, void 0, function* () {
39727
39727
  // Start the save loading indicator
39728
- dispatch({ type: ActionType$1.StartSave });
39728
+ dispatch({ type: ActionType$2.StartSave });
39729
39729
  // add all default values to the entry
39730
39730
  entryFields.forEach((field) => {
39731
39731
  if (field.defaultValue && !entry[field.objectKey]) {
@@ -39908,7 +39908,7 @@ const AddOrEditDBEntry = (props) => {
39908
39908
  return (React__default["default"].createElement(RadioButton, { key: choice.value, text: choice.title, selected: entry[field.objectKey] === choice.value, onSelected: () => {
39909
39909
  entry[field.objectKey] = choice.value;
39910
39910
  dispatch({
39911
- type: ActionType$1.UpdateDBEntry,
39911
+ type: ActionType$2.UpdateDBEntry,
39912
39912
  dbEntry: entry,
39913
39913
  });
39914
39914
  }, ariaLabel: choice.title }));
@@ -39920,7 +39920,7 @@ const AddOrEditDBEntry = (props) => {
39920
39920
  React__default["default"].createElement("input", { disabled: disabled, type: "text", className: "form-control", placeholder: field.placeholder, "aria-describedby": "AddOrEditDBEntry-form-name-label", value: entry[field.objectKey] || '', onChange: (e) => {
39921
39921
  entry[field.objectKey] = (e.target.value);
39922
39922
  dispatch({
39923
- type: ActionType$1.UpdateDBEntry,
39923
+ type: ActionType$2.UpdateDBEntry,
39924
39924
  dbEntry: entry,
39925
39925
  });
39926
39926
  } }))));
@@ -39933,7 +39933,7 @@ const AddOrEditDBEntry = (props) => {
39933
39933
  entry[field.objectKey] = (e.target.value
39934
39934
  .replace(/[^0-9]/g, ''));
39935
39935
  dispatch({
39936
- type: ActionType$1.UpdateDBEntry,
39936
+ type: ActionType$2.UpdateDBEntry,
39937
39937
  dbEntry: entry,
39938
39938
  });
39939
39939
  } }))));
@@ -39963,7 +39963,7 @@ const AddOrEditDBEntry = (props) => {
39963
39963
  }
39964
39964
  // Save
39965
39965
  dispatch({
39966
- type: ActionType$1.UpdateDBEntry,
39966
+ type: ActionType$2.UpdateDBEntry,
39967
39967
  dbEntry: entry,
39968
39968
  });
39969
39969
  }, ariaLabel: choice.title }));
@@ -39978,7 +39978,7 @@ const AddOrEditDBEntry = (props) => {
39978
39978
  // Update entry and save
39979
39979
  entry[field.objectKey] = values;
39980
39980
  dispatch({
39981
- type: ActionType$1.UpdateDBEntry,
39981
+ type: ActionType$2.UpdateDBEntry,
39982
39982
  dbEntry: entry,
39983
39983
  });
39984
39984
  } })))));
@@ -39991,7 +39991,7 @@ const AddOrEditDBEntry = (props) => {
39991
39991
  React__default["default"].createElement(CreatableMultiselect, { disabled: disabled, type: DBEntryFieldType$1.NumberArray, values: entry[field.objectKey] || [], onChange: (values) => {
39992
39992
  entry[field.objectKey] = values;
39993
39993
  dispatch({
39994
- type: ActionType$1.UpdateDBEntry,
39994
+ type: ActionType$2.UpdateDBEntry,
39995
39995
  dbEntry: entry,
39996
39996
  });
39997
39997
  } })))));
@@ -40040,7 +40040,7 @@ const AddOrEditDBEntry = (props) => {
40040
40040
  /* --------------- Main UI -------------- */
40041
40041
  /*----------------------------------------*/
40042
40042
  return (React__default["default"].createElement("div", { className: "alert alert-light text-black" },
40043
- React__default["default"].createElement("style", null, style),
40043
+ React__default["default"].createElement("style", null, style$1),
40044
40044
  body));
40045
40045
  };
40046
40046
 
@@ -40065,7 +40065,7 @@ const generateEndpointPath = (collectionName, adminsOnly) => {
40065
40065
  */
40066
40066
  /* ------------- Actions ------------ */
40067
40067
  // Types of actions
40068
- var ActionType;
40068
+ var ActionType$1;
40069
40069
  (function (ActionType) {
40070
40070
  // Show adder
40071
40071
  ActionType["ShowAdder"] = "ShowAdder";
@@ -40079,7 +40079,7 @@ var ActionType;
40079
40079
  ActionType["StartDelete"] = "StartDelete";
40080
40080
  // Finish deletion process
40081
40081
  ActionType["FinishDelete"] = "FinishDelete";
40082
- })(ActionType || (ActionType = {}));
40082
+ })(ActionType$1 || (ActionType$1 = {}));
40083
40083
  /**
40084
40084
  * Reducer that executes actions
40085
40085
  * @author Yuen Ler Chow
@@ -40087,18 +40087,18 @@ var ActionType;
40087
40087
  * @param action action to execute
40088
40088
  * @returns updated state
40089
40089
  */
40090
- const reducer = (state, action) => {
40090
+ const reducer$1 = (state, action) => {
40091
40091
  switch (action.type) {
40092
- case ActionType.FinishLoading: {
40092
+ case ActionType$1.FinishLoading: {
40093
40093
  return Object.assign(Object.assign({}, state), { loading: false, dbEntries: action.dbEntries });
40094
40094
  }
40095
- case ActionType.ShowAdder: {
40095
+ case ActionType$1.ShowAdder: {
40096
40096
  return Object.assign(Object.assign({}, state), { adding: true, dbEntryToEdit: undefined });
40097
40097
  }
40098
- case ActionType.ShowEditor: {
40098
+ case ActionType$1.ShowEditor: {
40099
40099
  return Object.assign(Object.assign({}, state), { adding: false, dbEntryToEdit: action.dbEntry });
40100
40100
  }
40101
- case ActionType.FinishAdd: {
40101
+ case ActionType$1.FinishAdd: {
40102
40102
  // Handle cancel
40103
40103
  const finishedEntry = action.dbEntry;
40104
40104
  if (!finishedEntry) {
@@ -40122,10 +40122,10 @@ const reducer = (state, action) => {
40122
40122
  // Update the state
40123
40123
  return Object.assign(Object.assign({}, state), { adding: false, dbEntryToEdit: undefined, dbEntries: updatedDbEntries });
40124
40124
  }
40125
- case ActionType.StartDelete: {
40125
+ case ActionType$1.StartDelete: {
40126
40126
  return Object.assign(Object.assign({}, state), { loading: true });
40127
40127
  }
40128
- case ActionType.FinishDelete: {
40128
+ case ActionType$1.FinishDelete: {
40129
40129
  return Object.assign(Object.assign({}, state), { loading: false,
40130
40130
  // Remove the deleted entry from the list
40131
40131
  dbEntries: state.dbEntries.filter((entry) => {
@@ -40151,7 +40151,7 @@ const DBEntryManagerPanel = (props) => {
40151
40151
  loading: true,
40152
40152
  };
40153
40153
  // Initialize state
40154
- const [state, dispatch] = React.useReducer(reducer, initialState);
40154
+ const [state, dispatch] = React.useReducer(reducer$1, initialState);
40155
40155
  // Destructure common state
40156
40156
  const { adding, dbEntryToEdit, dbEntries, loading, } = state;
40157
40157
  /*------------------------------------------------------------------------*/
@@ -40177,7 +40177,7 @@ const DBEntryManagerPanel = (props) => {
40177
40177
  try {
40178
40178
  // Start loader
40179
40179
  dispatch({
40180
- type: ActionType.StartDelete,
40180
+ type: ActionType$1.StartDelete,
40181
40181
  });
40182
40182
  // Perform deletion
40183
40183
  yield visitServerEndpoint({
@@ -40186,7 +40186,7 @@ const DBEntryManagerPanel = (props) => {
40186
40186
  });
40187
40187
  // Finish loader
40188
40188
  dispatch({
40189
- type: ActionType.FinishDelete,
40189
+ type: ActionType$1.FinishDelete,
40190
40190
  dbEntry: entry,
40191
40191
  idPropName,
40192
40192
  });
@@ -40215,7 +40215,7 @@ const DBEntryManagerPanel = (props) => {
40215
40215
  });
40216
40216
  // Save loaded data
40217
40217
  dispatch({
40218
- type: ActionType.FinishLoading,
40218
+ type: ActionType$1.FinishLoading,
40219
40219
  dbEntries: data,
40220
40220
  });
40221
40221
  }
@@ -40258,7 +40258,7 @@ const DBEntryManagerPanel = (props) => {
40258
40258
  React__default["default"].createElement("span", { className: "d-none d-md-inline ms-1" }, "Remove")),
40259
40259
  !disableEdit && (React__default["default"].createElement("button", { type: "button", id: `DBEntryManagerPanel-edit-with-id-${entry[idPropName]}`, className: "btn btn-primary", "aria-label": `edit db entry: ${entry[titlePropName]}`, onClick: () => {
40260
40260
  dispatch({
40261
- type: ActionType.ShowEditor,
40261
+ type: ActionType$1.ShowEditor,
40262
40262
  dbEntry: entry,
40263
40263
  });
40264
40264
  } },
@@ -40268,7 +40268,7 @@ const DBEntryManagerPanel = (props) => {
40268
40268
  React__default["default"].createElement("div", { className: "d-grid" },
40269
40269
  React__default["default"].createElement("button", { type: "button", id: "DBEntryManagerPanel-add-entry", className: "btn btn-lg btn-primary", "aria-label": `add a new ${itemName} entry to the list of entries`, onClick: () => {
40270
40270
  dispatch({
40271
- type: ActionType.ShowAdder,
40271
+ type: ActionType$1.ShowAdder,
40272
40272
  });
40273
40273
  } },
40274
40274
  React__default["default"].createElement(reactFontawesome.FontAwesomeIcon, { icon: freeSolidSvgIcons.faPlus, className: "me-2" }),
@@ -40280,7 +40280,7 @@ const DBEntryManagerPanel = (props) => {
40280
40280
  if (!loading && (adding || dbEntryToEdit)) {
40281
40281
  body = (React__default["default"].createElement(AddOrEditDBEntry, { saveEndpointPath: endpoint, validateEntry: validateEntry, modifyEntry: modifyEntry, entryFields: entryFields, dbEntryToEdit: dbEntryToEdit, idPropName: idPropName, entries: dbEntries, itemName: itemName, onFinished: (entry) => {
40282
40282
  dispatch({
40283
- type: ActionType.FinishAdd,
40283
+ type: ActionType$1.FinishAdd,
40284
40284
  dbEntry: entry,
40285
40285
  idPropName,
40286
40286
  });
@@ -40292,6 +40292,370 @@ const DBEntryManagerPanel = (props) => {
40292
40292
  return (React__default["default"].createElement("div", null, body));
40293
40293
  };
40294
40294
 
40295
+ /**
40296
+ * Simple tooltip component
40297
+ * @author Gabe Abrams
40298
+ */
40299
+ /*------------------------------------------------------------------------*/
40300
+ /* ------------------------------ Constants ----------------------------- */
40301
+ /*------------------------------------------------------------------------*/
40302
+ // Tooltip widths
40303
+ const TOOLTIP_WIDTH_THIN_REM = 5;
40304
+ const TOOLTIP_WIDTH_NORMAL_REM = 7;
40305
+ const TOOLTIP_WIDTH_WIDE_REM = 10;
40306
+ // Tooltip border radius
40307
+ const TOOLTIP_BORDER_RADIUS_REM = 0.3;
40308
+ /*------------------------------------------------------------------------*/
40309
+ /* -------------------------------- Style ------------------------------- */
40310
+ /*------------------------------------------------------------------------*/
40311
+ const style = `
40312
+ /* Container for contents and tooltip */
40313
+ .Tooltip-outer-container {
40314
+ display: inline-block;
40315
+ position: relative;
40316
+ }
40317
+
40318
+ /* Container for just tooltip */
40319
+ .Tooltip-tooltip-container {
40320
+ /* Position in middle but take no space */
40321
+ /* (so layout of page is unaffected) */
40322
+ position: absolute;
40323
+ display: inline-block;
40324
+ top: 0;
40325
+ left: 50%;
40326
+ height: 0;
40327
+ width: 0;
40328
+ overflow: visible;
40329
+ }
40330
+
40331
+ /* Tooltip */
40332
+ .Tooltip-tooltip {
40333
+ /* Position above item */
40334
+ display: inline-block;
40335
+ position: absolute;
40336
+ top: -2.3rem;
40337
+ height: 1.8rem;
40338
+ z-index: 1;
40339
+
40340
+ /* Use standard black font */
40341
+ font-size: 1rem;
40342
+ color: black;
40343
+
40344
+ /* Non-interactive */
40345
+ pointer-events: none;
40346
+ }
40347
+
40348
+ /* Tooltip box (the rectangle surrounding the text) */
40349
+ .Tooltip-box,
40350
+ .Tooltip-box-shadow,
40351
+ .Tooltip-box-highlight {
40352
+ /* Fill all space with rectangle */
40353
+ position: absolute;
40354
+ left: 0;
40355
+ top: 0;
40356
+ display: inline-block;
40357
+ width: 100%;
40358
+ height: 100%;
40359
+
40360
+ /* Rounded border */
40361
+ border: 0.15rem solid black;
40362
+ border-radius: ${TOOLTIP_BORDER_RADIUS_REM}rem;
40363
+ }
40364
+
40365
+ /* Tooltip highlight (the bright background to the text) */
40366
+ .Tooltip-box-highlight {
40367
+ /* Bootstrap warning variant background */
40368
+ background-color: rgb(255, 193, 7);
40369
+ border-radius: ${TOOLTIP_BORDER_RADIUS_REM}rem;
40370
+
40371
+ /* Place on top */
40372
+ z-index: -1;
40373
+ }
40374
+
40375
+ /* Tooltip box (the black rectangle) */
40376
+ .Tooltip-box {
40377
+ /* Plain black background */
40378
+ background-color: black;
40379
+
40380
+ /* Place in middle */
40381
+ z-index: -2;
40382
+ }
40383
+
40384
+ /* Tooltip box shadow (the white shadow beneath the box) */
40385
+ .Tooltip-box-shadow {
40386
+ /* White shadow */
40387
+ box-shadow: 0 0 0.3rem white;
40388
+
40389
+ /* Place beneath */
40390
+ z-index: -3;
40391
+ }
40392
+
40393
+ /* Tooltip contents (the text and icon) */
40394
+ .Tooltip-contents {
40395
+ /* Center text, don't allow overflow */
40396
+ white-space: nowrap;
40397
+ overflow: hidden;
40398
+ text-align: center;
40399
+ text-overflow: ellipsis;
40400
+ display: flex;
40401
+ align-items: center;
40402
+ justify-content: center;
40403
+
40404
+ /* Space within parent */
40405
+ z-index: 1;
40406
+ padding-left: 0.2rem;
40407
+ padding-right: 0.2rem;
40408
+ height: 100%;
40409
+ }
40410
+
40411
+ /* Tooltip text */
40412
+ .Tooltip-text {
40413
+ /* Center text, add ellipsis */
40414
+ overflow: hidden;
40415
+ text-align: center;
40416
+ text-overflow: ellipsis;
40417
+ }
40418
+
40419
+ /* Classes to switch between tooltip visible/hidden */
40420
+ .Tooltip-tooltip-visible-true {
40421
+ opacity: 1;
40422
+ }
40423
+ .Tooltip-tooltip-visible-false {
40424
+ opacity: 0;
40425
+ }
40426
+
40427
+ /* Classes to switch between tooltip sizes */
40428
+ .Tooltip-size-thin {
40429
+ width: ${TOOLTIP_WIDTH_THIN_REM}rem;
40430
+ left: calc(50% - ${TOOLTIP_WIDTH_THIN_REM / 2}rem);
40431
+ }
40432
+ .Tooltip-size-normal {
40433
+ width: ${TOOLTIP_WIDTH_NORMAL_REM}rem;
40434
+ left: calc(50% - ${TOOLTIP_WIDTH_NORMAL_REM / 2}rem);
40435
+ }
40436
+ .Tooltip-size-wide {
40437
+ width: ${TOOLTIP_WIDTH_WIDE_REM}rem;
40438
+ left: calc(50% - ${TOOLTIP_WIDTH_WIDE_REM / 2}rem);
40439
+ }
40440
+
40441
+ /* Arrow (beneath tooltip) */
40442
+ .Tooltip-arrow,
40443
+ .Tooltip-arrow-shadow {
40444
+ /* Position beneath tooltip */
40445
+ position: absolute;
40446
+ top: -1.5rem;
40447
+ font-size: 1.5rem;
40448
+ left: calc(50% - 0.5rem);
40449
+ width: 0;
40450
+ display: inline-block;
40451
+
40452
+ /* Non-interactive */
40453
+ pointer-events: none;
40454
+ }
40455
+
40456
+ /* Arrow itself */
40457
+ .Tooltip-arrow {
40458
+ color: black;
40459
+ z-index: 4;
40460
+ }
40461
+
40462
+ /* Arrow shadow */
40463
+ .Tooltip-arrow-shadow {
40464
+ z-index: -1;
40465
+
40466
+ /* Blur a white version of the caret as a shadow */
40467
+ color: white;
40468
+ filter: blur(0.2rem);
40469
+ }
40470
+
40471
+ /* Classes to switch between arrow visible/hidden */
40472
+ .Tooltip-arrow-visible-true {
40473
+ opacity: 1;
40474
+ }
40475
+ .Tooltip-arrow-visible-false {
40476
+ opacity: 0;
40477
+ }
40478
+ `;
40479
+ /* ------------- Actions ------------ */
40480
+ // Types of actions
40481
+ var ActionType;
40482
+ (function (ActionType) {
40483
+ // Make the tooltip visible
40484
+ ActionType["Show"] = "Show";
40485
+ // Make the tooltip invisible
40486
+ ActionType["Hide"] = "Hide";
40487
+ // Set nudge pixels
40488
+ ActionType["SetNudgePx"] = "SetNudgePx";
40489
+ // Set whether bottom left corner should be square
40490
+ ActionType["SetSquareBottomLeft"] = "SetSquareBottomLeft";
40491
+ // Set whether bottom right corner should be square
40492
+ ActionType["SetSquareBottomRight"] = "SetSquareBottomRight";
40493
+ })(ActionType || (ActionType = {}));
40494
+ /**
40495
+ * Reducer that executes actions
40496
+ * @author Gabe Abrams
40497
+ * @param state current state
40498
+ * @param action action to execute
40499
+ */
40500
+ const reducer = (state, action) => {
40501
+ switch (action.type) {
40502
+ case ActionType.Show: {
40503
+ return Object.assign(Object.assign({}, state), { isVisible: true });
40504
+ }
40505
+ case ActionType.Hide: {
40506
+ return Object.assign(Object.assign({}, state), { isVisible: false, nudgePx: 0 });
40507
+ }
40508
+ case ActionType.SetNudgePx: {
40509
+ return Object.assign(Object.assign({}, state), { nudgePx: action.nudgePx });
40510
+ }
40511
+ case ActionType.SetSquareBottomLeft: {
40512
+ return Object.assign(Object.assign({}, state), { squareBottomLeft: action.squareBottomLeft });
40513
+ }
40514
+ case ActionType.SetSquareBottomRight: {
40515
+ return Object.assign(Object.assign({}, state), { squareBottomRight: action.squareBottomRight });
40516
+ }
40517
+ default: {
40518
+ return state;
40519
+ }
40520
+ }
40521
+ };
40522
+ /*------------------------------------------------------------------------*/
40523
+ /* ------------------------------ Component ----------------------------- */
40524
+ /*------------------------------------------------------------------------*/
40525
+ const Tooltip = (props) => {
40526
+ /*------------------------------------------------------------------------*/
40527
+ /* -------------------------------- Setup ------------------------------- */
40528
+ /*------------------------------------------------------------------------*/
40529
+ /* -------------- Props ------------- */
40530
+ // Destructure all props
40531
+ const { icon, text, children, wide, thin, } = props;
40532
+ /* -------------- State ------------- */
40533
+ // Initial state
40534
+ const initialState = {
40535
+ isVisible: false,
40536
+ nudgePx: 0,
40537
+ };
40538
+ // Initialize state
40539
+ const [state, dispatch] = React.useReducer(reducer, initialState);
40540
+ // Destructure common state
40541
+ const { isVisible, nudgePx, squareBottomLeft, squareBottomRight, } = state;
40542
+ /* -------------- Refs -------------- */
40543
+ // Initialize refs
40544
+ const tooltipContainer = React.useRef(null);
40545
+ const arrowElement = React.useRef(null);
40546
+ /*------------------------------------------------------------------------*/
40547
+ /* ------------------------- Lifecycle Functions ------------------------ */
40548
+ /*------------------------------------------------------------------------*/
40549
+ /**
40550
+ * Update (also called on mount)
40551
+ * @author Gabe Abrams
40552
+ */
40553
+ React.useEffect(() => {
40554
+ // Update tooltip container position
40555
+ if (tooltipContainer.current && isVisible) {
40556
+ // Get the tooltip container location
40557
+ const tooltipContainerRect = (tooltipContainer
40558
+ .current
40559
+ .getBoundingClientRect());
40560
+ // Get the window width
40561
+ const windowWidth = window.innerWidth;
40562
+ // Calculate new nudge value
40563
+ let newNudgePx;
40564
+ if (tooltipContainerRect.left < 0) {
40565
+ // Tooltip is off the left side of the screen
40566
+ newNudgePx = -1 * tooltipContainerRect.left;
40567
+ }
40568
+ else if (tooltipContainerRect.right > windowWidth) {
40569
+ // Tooltip is off the right side of the screen
40570
+ newNudgePx = -1 * (tooltipContainerRect.right - windowWidth);
40571
+ }
40572
+ else {
40573
+ // Tooltip is in the middle of the screen
40574
+ newNudgePx = 0;
40575
+ }
40576
+ // Update state
40577
+ dispatch({
40578
+ type: ActionType.SetNudgePx,
40579
+ nudgePx: newNudgePx,
40580
+ });
40581
+ }
40582
+ // Update border rounding
40583
+ if (arrowElement.current && isVisible) {
40584
+ // Get the arrow location
40585
+ const arrowRect = (arrowElement
40586
+ .current
40587
+ .getBoundingClientRect());
40588
+ // REM in pixels given font size
40589
+ const remInPixels = Number.parseInt(getComputedStyle(document.documentElement).fontSize, 10);
40590
+ // Set bottom left corner rounding
40591
+ dispatch({
40592
+ type: ActionType.SetSquareBottomLeft,
40593
+ squareBottomLeft: (arrowRect.left < (TOOLTIP_BORDER_RADIUS_REM * remInPixels)),
40594
+ });
40595
+ // Set bottom right corner rounding
40596
+ dispatch({
40597
+ type: ActionType.SetSquareBottomRight,
40598
+ squareBottomRight: (arrowRect.right
40599
+ > window.innerWidth - (TOOLTIP_BORDER_RADIUS_REM * remInPixels)),
40600
+ });
40601
+ }
40602
+ }, [isVisible]);
40603
+ /*------------------------------------------------------------------------*/
40604
+ /* ------------------------------- Render ------------------------------- */
40605
+ /*------------------------------------------------------------------------*/
40606
+ /*----------------------------------------*/
40607
+ /* --------------- Main UI -------------- */
40608
+ /*----------------------------------------*/
40609
+ // Determine size
40610
+ let size = 'normal';
40611
+ if (wide) {
40612
+ size = 'wide';
40613
+ }
40614
+ else if (thin) {
40615
+ size = 'thin';
40616
+ }
40617
+ // Render
40618
+ return (React__default["default"].createElement("div", { className: "Tooltip-outer-container", "aria-label": text, onMouseEnter: () => {
40619
+ dispatch({
40620
+ type: ActionType.Show,
40621
+ });
40622
+ }, onMouseLeave: () => {
40623
+ dispatch({
40624
+ type: ActionType.Hide,
40625
+ });
40626
+ }, onFocus: () => {
40627
+ dispatch({
40628
+ type: ActionType.Show,
40629
+ });
40630
+ }, onBlur: () => {
40631
+ dispatch({
40632
+ type: ActionType.Hide,
40633
+ });
40634
+ } },
40635
+ React__default["default"].createElement("style", null, style),
40636
+ children,
40637
+ React__default["default"].createElement("div", { className: `Tooltip-arrow Tooltip-arrow-visible-${isVisible ? 'true' : 'false'}`, ref: arrowElement },
40638
+ React__default["default"].createElement(reactFontawesome.FontAwesomeIcon, { icon: freeSolidSvgIcons.faCaretDown })),
40639
+ React__default["default"].createElement("div", { className: `Tooltip-arrow-shadow Tooltip-arrow-visible-${isVisible ? 'true' : 'false'}` },
40640
+ React__default["default"].createElement(reactFontawesome.FontAwesomeIcon, { icon: freeSolidSvgIcons.faCaretDown })),
40641
+ React__default["default"].createElement("div", { className: "Tooltip-tooltip-container" },
40642
+ React__default["default"].createElement("div", { className: `Tooltip-tooltip Tooltip-tooltip-visible-${isVisible ? 'true' : 'false'} Tooltip-size-${size}`, role: "tooltip", ref: tooltipContainer, style: {
40643
+ transform: `translateX(${nudgePx}px)`,
40644
+ } },
40645
+ React__default["default"].createElement("div", { className: "Tooltip-box-highlight" }),
40646
+ React__default["default"].createElement("div", { className: "Tooltip-box", style: {
40647
+ borderBottomLeftRadius: squareBottomLeft ? 0 : undefined,
40648
+ borderBottomRightRadius: squareBottomRight ? 0 : undefined,
40649
+ } }),
40650
+ React__default["default"].createElement("div", { className: "Tooltip-box-shadow", style: {
40651
+ borderBottomLeftRadius: squareBottomLeft ? 0 : undefined,
40652
+ borderBottomRightRadius: squareBottomRight ? 0 : undefined,
40653
+ } }),
40654
+ React__default["default"].createElement("div", { className: "Tooltip-contents" },
40655
+ icon && (React__default["default"].createElement(reactFontawesome.FontAwesomeIcon, { icon: icon, className: "me-1" })),
40656
+ React__default["default"].createElement("span", { className: "Tooltip-text" }, text))))));
40657
+ };
40658
+
40295
40659
  /**
40296
40660
  * One minute in ms
40297
40661
  * @author Gabe Abrams
@@ -41762,7 +42126,6 @@ const extractProp = (arr, prop) => {
41762
42126
  });
41763
42127
  };
41764
42128
 
41765
- // Import shared helpers
41766
42129
  /**
41767
42130
  * Compare two arrays of objects by only comparing the values in a specific
41768
42131
  * property (e.g. compare user arrays by comparing their user.id values)
@@ -41789,8 +42152,9 @@ const compareArraysByProp = (a, b, prop) => {
41789
42152
  const matchingIndex = bCloned.findIndex((bItem) => {
41790
42153
  // Compare based on all props
41791
42154
  return props.every((propToCompareBy) => {
41792
- const aVal = extractProp(a[i], propToCompareBy);
41793
- const bVal = extractProp(bItem, propToCompareBy);
42155
+ var _a;
42156
+ const aVal = ((_a = a[i]) !== null && _a !== void 0 ? _a : {})[propToCompareBy];
42157
+ const bVal = (bItem !== null && bItem !== void 0 ? bItem : {})[propToCompareBy];
41794
42158
  return aVal === bVal;
41795
42159
  });
41796
42160
  });
@@ -42206,6 +42570,7 @@ exports.RadioButton = RadioButton;
42206
42570
  exports.ReactKitErrorCode = ReactKitErrorCode$1;
42207
42571
  exports.SimpleDateChooser = SimpleDateChooser;
42208
42572
  exports.TabBox = TabBox;
42573
+ exports.Tooltip = Tooltip;
42209
42574
  exports.Variant = Variant$1;
42210
42575
  exports.abbreviate = abbreviate;
42211
42576
  exports.addDBEditorEndpoints = addDBEditorEndpoints;