dce-reactkit 3.8.6 → 3.9.0-beta-loading-modal.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. package/dist/cjs/index.js +253 -381
  2. package/dist/cjs/index.js.map +1 -1
  3. package/dist/cjs/types/components/Modal/ModalProps.d.ts +2 -0
  4. package/dist/cjs/types/index.d.ts +1 -3
  5. package/dist/esm/index.js +255 -381
  6. package/dist/esm/index.js.map +1 -1
  7. package/dist/esm/types/components/Modal/ModalProps.d.ts +2 -0
  8. package/dist/esm/types/index.d.ts +1 -3
  9. package/dist/index.d.ts +45 -79
  10. package/package.json +1 -1
  11. package/src/components/Modal/ModalProps.ts +4 -0
  12. package/src/components/Modal/index.tsx +49 -21
  13. package/src/components/MultiSwitch.tsx +1 -1
  14. package/src/index.ts +0 -4
  15. package/dist/cjs/types/components/Dropdown.d.ts +0 -32
  16. package/dist/cjs/types/helpers/validators/ChicagoTitleCase.d.ts +0 -9
  17. package/dist/cjs/types/helpers/validators/validURL.d.ts +0 -8
  18. package/dist/cjs/types/types/DropdownItemType.d.ts +0 -6
  19. package/dist/esm/types/components/Dropdown.d.ts +0 -32
  20. package/dist/esm/types/helpers/validators/ChicagoTitleCase.d.ts +0 -9
  21. package/dist/esm/types/helpers/validators/validURL.d.ts +0 -8
  22. package/dist/esm/types/types/DropdownItemType.d.ts +0 -6
  23. package/src/components/Dropdown.tsx +0 -317
  24. package/src/helpers/validators/ChicagoTitleCase.test.ts +0 -85
  25. package/src/helpers/validators/ChicagoTitleCase.ts +0 -32
  26. package/src/helpers/validators/findURL.test.ts +0 -83
  27. package/src/helpers/validators/findURL.ts +0 -43
  28. package/src/helpers/validators/validURL.test.ts +0 -90
  29. package/src/helpers/validators/validURL.ts +0 -18
  30. package/src/types/DropdownItemType.ts +0 -11
package/dist/cjs/index.js CHANGED
@@ -207,6 +207,98 @@ const LogBuiltInMetadata = {
207
207
  },
208
208
  };
209
209
 
210
+ /**
211
+ * Loading spinner/indicator
212
+ * @author Gabe Abrams
213
+ */
214
+ /*------------------------------------------------------------------------*/
215
+ /* -------------------------------- Style ------------------------------- */
216
+ /*------------------------------------------------------------------------*/
217
+ const style$a = `
218
+ /* Container fades in */
219
+ .LoadingSpinner-container {
220
+ animation-name: LoadingSpinner-container-fade-in;
221
+ animation-duration: 0.3s;
222
+ animation-delay: 0.4s;
223
+ animation-fill-mode: both;
224
+ animation-timing-function: ease-out;
225
+ }
226
+ @keyframes LoadingSpinner-container-fade-in {
227
+ 0% {
228
+ opacity: 0;
229
+ }
230
+ 100% {
231
+ opacity: 1;
232
+ }
233
+ }
234
+
235
+ /* Blips */
236
+ .LoadingSpinner-blip-1,
237
+ .LoadingSpinner-blip-2,
238
+ .LoadingSpinner-blip-3,
239
+ .LoadingSpinner-blip-4 {
240
+ font-size: 1.8rem;
241
+ opacity: 0.6;
242
+ margin-top: 1rem;
243
+ margin-bottom: 1rem;
244
+ }
245
+
246
+ /* First Blip */
247
+ .LoadingSpinner-blip-1 {
248
+ animation: LoadingSpinner-pop-animation 2s infinite;
249
+ }
250
+
251
+ /* Second Blip */
252
+ .LoadingSpinner-blip-2 {
253
+ animation: LoadingSpinner-pop-animation 2s infinite;
254
+ -webkit-animation-delay: 0.1s;
255
+ animation-delay: 0.1s;
256
+ }
257
+
258
+ /* Third Blip */
259
+ .LoadingSpinner-blip-3 {
260
+ animation: LoadingSpinner-pop-animation 2s infinite;
261
+ animation-delay: 0.2s;
262
+ }
263
+
264
+ /* Fourth Blip */
265
+ .LoadingSpinner-blip-4 {
266
+ animation: LoadingSpinner-pop-animation 2s infinite;
267
+ animation-delay: 0.3s;
268
+ }
269
+
270
+ /* Pop Animation for Each Blip */
271
+ @keyframes LoadingSpinner-pop-animation {
272
+ 0% {
273
+ transform: scale(1.0);
274
+ }
275
+ 10% {
276
+ transform: scale(1.5);
277
+ }
278
+ 30% {
279
+ transform: scale(1.0);
280
+ }
281
+ 100% {
282
+ transform: scale(1.0);
283
+ }
284
+ }
285
+ `;
286
+ /*------------------------------------------------------------------------*/
287
+ /* ------------------------------ Component ----------------------------- */
288
+ /*------------------------------------------------------------------------*/
289
+ const LoadingSpinner = () => {
290
+ /*------------------------------------------------------------------------*/
291
+ /* ------------------------------- Render ------------------------------- */
292
+ /*------------------------------------------------------------------------*/
293
+ // Add all four blips to a container
294
+ return (React__default["default"].createElement("div", { className: "text-center LoadingSpinner LoadingSpinner-container" },
295
+ React__default["default"].createElement("style", null, style$a),
296
+ React__default["default"].createElement(reactFontawesome.FontAwesomeIcon, { icon: freeSolidSvgIcons.faCircle, className: "LoadingSpinner-blip-1 me-1" }),
297
+ React__default["default"].createElement(reactFontawesome.FontAwesomeIcon, { icon: freeSolidSvgIcons.faCircle, className: "LoadingSpinner-blip-2 me-1" }),
298
+ React__default["default"].createElement(reactFontawesome.FontAwesomeIcon, { icon: freeSolidSvgIcons.faCircle, className: "LoadingSpinner-blip-3 me-1" }),
299
+ React__default["default"].createElement(reactFontawesome.FontAwesomeIcon, { icon: freeSolidSvgIcons.faCircle, className: "LoadingSpinner-blip-4" })));
300
+ };
301
+
210
302
  /**
211
303
  * Wait for a certain number of ms
212
304
  * @author Gabe Abrams
@@ -327,6 +419,7 @@ const BASE_Z_INDEX = 1000000000;
327
419
  const BASE_Z_INDEX_ON_TOP = 2000000000;
328
420
  // Constants
329
421
  const MS_TO_ANIMATE = 200; // Animation duration
422
+ const MS_TO_WAIT_BEFORE_SHOWING_LOADING_INDICATOR = 1000;
330
423
  // Modal type to list of buttons
331
424
  const modalTypeToModalButtonTypes = {
332
425
  [ModalType$1.Okay]: [
@@ -437,7 +530,7 @@ const getNextUniqueId = () => {
437
530
  /*------------------------------------------------------------------------*/
438
531
  /* -------------------------------- Style ------------------------------- */
439
532
  /*------------------------------------------------------------------------*/
440
- const style$a = `
533
+ const style$9 = `
441
534
  .Modal-backdrop {
442
535
  position: fixed;
443
536
  top: 0;
@@ -509,13 +602,14 @@ const Modal = (props) => {
509
602
  /*------------------------------------------------------------------------*/
510
603
  var _a;
511
604
  /* -------------- Props ------------- */
512
- const { type = ModalType$1.NoButtons, size = ModalSize$1.Large, title, largeTitle, children, onClose, dontAllowBackdropExit, dontShowXButton, onTopOfOtherModals, } = props;
605
+ const { type = ModalType$1.NoButtons, size = ModalSize$1.Large, title, largeTitle, children, onClose, dontAllowBackdropExit, dontShowXButton, onTopOfOtherModals, isLoading, isLoadingCancelable, } = props;
513
606
  // Determine if no header either
514
607
  const noHeader = (!title && type === ModalType$1.NoButtons);
515
608
  /* -------------- State ------------- */
516
609
  // True if animation is in use
517
610
  const [animatingIn, setAnimatingIn] = React.useState(true);
518
611
  const [animatingPop, setAnimatingPop] = React.useState(false);
612
+ const [showModal, setShowModal] = React.useState(false);
519
613
  /* -------------- Refs -------------- */
520
614
  // Keep track of whether modal is still mounted
521
615
  const mounted = React.useRef(false);
@@ -542,6 +636,14 @@ const Modal = (props) => {
542
636
  if (mounted.current) {
543
637
  setAnimatingIn(false);
544
638
  }
639
+ if (isLoading) {
640
+ // wait before showing modal
641
+ yield waitMs(MS_TO_WAIT_BEFORE_SHOWING_LOADING_INDICATOR);
642
+ setShowModal(true);
643
+ }
644
+ else {
645
+ setShowModal(true);
646
+ }
545
647
  }))();
546
648
  return () => {
547
649
  mounted.current = false;
@@ -608,6 +710,9 @@ const Modal = (props) => {
608
710
  else if (animatingPop) {
609
711
  animationClass = 'Modal-animating-pop';
610
712
  }
713
+ // default to show close button when not loading and not show close button when loading
714
+ // unless downShowXButton or isLoadingCancelable
715
+ const showCloseButton = onClose && !dontShowXButton && !(isLoading && !isLoadingCancelable);
611
716
  // Render the modal
612
717
  const contentToRender = (React__default["default"].createElement("div", { className: "modal show", tabIndex: -1, style: {
613
718
  zIndex: baseZIndex,
@@ -616,7 +721,7 @@ const Modal = (props) => {
616
721
  left: 0,
617
722
  right: 0,
618
723
  } },
619
- React__default["default"].createElement("style", null, style$a),
724
+ React__default["default"].createElement("style", null, style$9),
620
725
  React__default["default"].createElement("div", { className: `Modal-backdrop ${backdropAnimationClass}`, style: {
621
726
  zIndex: baseZIndex + 1,
622
727
  }, onClick: () => __awaiter(void 0, void 0, void 0, function* () {
@@ -634,11 +739,11 @@ const Modal = (props) => {
634
739
  // Handle close
635
740
  handleClose(ModalButtonType$1.Cancel);
636
741
  }) }),
637
- React__default["default"].createElement("div", { className: `modal-dialog modal-${size} ${animationClass} modal-dialog-scrollable modal-dialog-centered`, style: {
742
+ showModal && (React__default["default"].createElement("div", { className: `modal-dialog modal-${size} ${animationClass} modal-dialog-scrollable modal-dialog-centered`, style: {
638
743
  zIndex: baseZIndex + 2,
639
744
  // Override sizes for even larger for XL
640
745
  width: (size === ModalSize$1.ExtraLarge
641
- ? 'calc(100vw - 1rem)'
746
+ ? 'calc(100vw - 3rem)'
642
747
  : undefined),
643
748
  maxWidth: (size === ModalSize$1.ExtraLarge
644
749
  ? '80rem'
@@ -666,7 +771,7 @@ const Modal = (props) => {
666
771
  ? '1.6rem'
667
772
  : undefined),
668
773
  } }, title),
669
- (onClose && !dontShowXButton) && (React__default["default"].createElement("button", { type: "button", className: "Modal-x-button btn-close", "aria-label": "Close", style: {
774
+ showCloseButton && (React__default["default"].createElement("button", { type: "button", className: "Modal-x-button btn-close", "aria-label": "Close", style: {
670
775
  backgroundColor: (isDarkModeOn()
671
776
  ? 'white'
672
777
  : undefined),
@@ -674,14 +779,16 @@ const Modal = (props) => {
674
779
  // Handle close
675
780
  handleClose(ModalButtonType$1.Cancel);
676
781
  } })))),
677
- children && (React__default["default"].createElement("div", { className: "modal-body", style: {
782
+ React__default["default"].createElement("div", { className: "modal-body", style: {
678
783
  color: (isDarkModeOn()
679
784
  ? 'white'
680
785
  : undefined),
681
786
  backgroundColor: (isDarkModeOn()
682
787
  ? '#444'
683
788
  : undefined),
684
- } }, children)),
789
+ } }, isLoading && !children ? (React__default["default"].createElement(React__default["default"].Fragment, null,
790
+ React__default["default"].createElement(LoadingSpinner, null),
791
+ React__default["default"].createElement("span", { className: "sr-only" }, "Content loading"))) : (children)),
685
792
  footer && (React__default["default"].createElement("div", { className: "modal-footer pt-1 pb-1", style: {
686
793
  color: (isDarkModeOn()
687
794
  ? 'white'
@@ -692,7 +799,7 @@ const Modal = (props) => {
692
799
  borderTop: (isDarkModeOn()
693
800
  ? '0.1rem solid gray'
694
801
  : undefined),
695
- } }, footer))))));
802
+ } }, footer)))))));
696
803
  // Determine which portal to use
697
804
  const portalNumber = id.current % NUM_MODAL_PORTALS;
698
805
  // Render in a portal
@@ -1172,7 +1279,7 @@ const showSessionExpiredMessage = () => __awaiter(void 0, void 0, void 0, functi
1172
1279
  /*------------------------------------------------------------------------*/
1173
1280
  /* -------------------------------- Style ------------------------------- */
1174
1281
  /*------------------------------------------------------------------------*/
1175
- const style$9 = `
1282
+ const style$8 = `
1176
1283
  .AppWrapper-leave-to-url-notice {
1177
1284
  opacity: 0;
1178
1285
 
@@ -1347,105 +1454,13 @@ const AppWrapper = (props) => {
1347
1454
  /* --------------- Main UI -------------- */
1348
1455
  /*----------------------------------------*/
1349
1456
  return (React__default["default"].createElement(React__default["default"].Fragment, null,
1350
- React__default["default"].createElement("style", null, style$9),
1457
+ React__default["default"].createElement("style", null, style$8),
1351
1458
  React__default["default"].createElement("style", null, tooltipStyle),
1352
1459
  modal,
1353
1460
  customModalPortals,
1354
1461
  body));
1355
1462
  };
1356
1463
 
1357
- /**
1358
- * Loading spinner/indicator
1359
- * @author Gabe Abrams
1360
- */
1361
- /*------------------------------------------------------------------------*/
1362
- /* -------------------------------- Style ------------------------------- */
1363
- /*------------------------------------------------------------------------*/
1364
- const style$8 = `
1365
- /* Container fades in */
1366
- .LoadingSpinner-container {
1367
- animation-name: LoadingSpinner-container-fade-in;
1368
- animation-duration: 0.3s;
1369
- animation-delay: 0.4s;
1370
- animation-fill-mode: both;
1371
- animation-timing-function: ease-out;
1372
- }
1373
- @keyframes LoadingSpinner-container-fade-in {
1374
- 0% {
1375
- opacity: 0;
1376
- }
1377
- 100% {
1378
- opacity: 1;
1379
- }
1380
- }
1381
-
1382
- /* Blips */
1383
- .LoadingSpinner-blip-1,
1384
- .LoadingSpinner-blip-2,
1385
- .LoadingSpinner-blip-3,
1386
- .LoadingSpinner-blip-4 {
1387
- font-size: 1.8rem;
1388
- opacity: 0.6;
1389
- margin-top: 1rem;
1390
- margin-bottom: 1rem;
1391
- }
1392
-
1393
- /* First Blip */
1394
- .LoadingSpinner-blip-1 {
1395
- animation: LoadingSpinner-pop-animation 2s infinite;
1396
- }
1397
-
1398
- /* Second Blip */
1399
- .LoadingSpinner-blip-2 {
1400
- animation: LoadingSpinner-pop-animation 2s infinite;
1401
- -webkit-animation-delay: 0.1s;
1402
- animation-delay: 0.1s;
1403
- }
1404
-
1405
- /* Third Blip */
1406
- .LoadingSpinner-blip-3 {
1407
- animation: LoadingSpinner-pop-animation 2s infinite;
1408
- animation-delay: 0.2s;
1409
- }
1410
-
1411
- /* Fourth Blip */
1412
- .LoadingSpinner-blip-4 {
1413
- animation: LoadingSpinner-pop-animation 2s infinite;
1414
- animation-delay: 0.3s;
1415
- }
1416
-
1417
- /* Pop Animation for Each Blip */
1418
- @keyframes LoadingSpinner-pop-animation {
1419
- 0% {
1420
- transform: scale(1.0);
1421
- }
1422
- 10% {
1423
- transform: scale(1.5);
1424
- }
1425
- 30% {
1426
- transform: scale(1.0);
1427
- }
1428
- 100% {
1429
- transform: scale(1.0);
1430
- }
1431
- }
1432
- `;
1433
- /*------------------------------------------------------------------------*/
1434
- /* ------------------------------ Component ----------------------------- */
1435
- /*------------------------------------------------------------------------*/
1436
- const LoadingSpinner = () => {
1437
- /*------------------------------------------------------------------------*/
1438
- /* ------------------------------- Render ------------------------------- */
1439
- /*------------------------------------------------------------------------*/
1440
- // Add all four blips to a container
1441
- return (React__default["default"].createElement("div", { className: "text-center LoadingSpinner LoadingSpinner-container" },
1442
- React__default["default"].createElement("style", null, style$8),
1443
- React__default["default"].createElement(reactFontawesome.FontAwesomeIcon, { icon: freeSolidSvgIcons.faCircle, className: "LoadingSpinner-blip-1 me-1" }),
1444
- React__default["default"].createElement(reactFontawesome.FontAwesomeIcon, { icon: freeSolidSvgIcons.faCircle, className: "LoadingSpinner-blip-2 me-1" }),
1445
- React__default["default"].createElement(reactFontawesome.FontAwesomeIcon, { icon: freeSolidSvgIcons.faCircle, className: "LoadingSpinner-blip-3 me-1" }),
1446
- React__default["default"].createElement(reactFontawesome.FontAwesomeIcon, { icon: freeSolidSvgIcons.faCircle, className: "LoadingSpinner-blip-4" })));
1447
- };
1448
-
1449
1464
  /**
1450
1465
  * A box with a tab on the top that holds buttons and other content
1451
1466
  * @author Gabe Abrams
@@ -2237,27 +2252,27 @@ const PopPendingMark = (props) => {
2237
2252
  */
2238
2253
  /* ------------- Actions ------------ */
2239
2254
  // Types of actions
2240
- var ActionType$9;
2255
+ var ActionType$8;
2241
2256
  (function (ActionType) {
2242
2257
  // Indicate that the text was recently copied
2243
2258
  ActionType["IndicateRecentlyCopied"] = "indicate-recently-copied";
2244
2259
  // Clear the status
2245
2260
  ActionType["ClearRecentlyCopiedStatus"] = "clear-recently-copied-status";
2246
- })(ActionType$9 || (ActionType$9 = {}));
2261
+ })(ActionType$8 || (ActionType$8 = {}));
2247
2262
  /**
2248
2263
  * Reducer that executes actions
2249
2264
  * @author Gabe Abrams
2250
2265
  * @param state current state
2251
2266
  * @param action action to execute
2252
2267
  */
2253
- const reducer$a = (state, action) => {
2268
+ const reducer$9 = (state, action) => {
2254
2269
  switch (action.type) {
2255
- case ActionType$9.IndicateRecentlyCopied: {
2270
+ case ActionType$8.IndicateRecentlyCopied: {
2256
2271
  return {
2257
2272
  recentlyCopied: true,
2258
2273
  };
2259
2274
  }
2260
- case ActionType$9.ClearRecentlyCopiedStatus: {
2275
+ case ActionType$8.ClearRecentlyCopiedStatus: {
2261
2276
  return {
2262
2277
  recentlyCopied: false,
2263
2278
  };
@@ -2283,7 +2298,7 @@ const CopiableBox = (props) => {
2283
2298
  recentlyCopied: false,
2284
2299
  };
2285
2300
  // Initialize state
2286
- const [state, dispatch] = React.useReducer(reducer$a, initialState);
2301
+ const [state, dispatch] = React.useReducer(reducer$9, initialState);
2287
2302
  // Destructure common state
2288
2303
  const { recentlyCopied, } = state;
2289
2304
  /*------------------------------------------------------------------------*/
@@ -2303,13 +2318,13 @@ const CopiableBox = (props) => {
2303
2318
  }
2304
2319
  // Show copied notice
2305
2320
  dispatch({
2306
- type: ActionType$9.IndicateRecentlyCopied,
2321
+ type: ActionType$8.IndicateRecentlyCopied,
2307
2322
  });
2308
2323
  // Wait a moment
2309
2324
  yield waitMs(4000);
2310
2325
  // Hide copied notice
2311
2326
  dispatch({
2312
- type: ActionType$9.ClearRecentlyCopiedStatus,
2327
+ type: ActionType$8.ClearRecentlyCopiedStatus,
2313
2328
  });
2314
2329
  });
2315
2330
  /*------------------------------------------------------------------------*/
@@ -2365,20 +2380,20 @@ const CopiableBox = (props) => {
2365
2380
  */
2366
2381
  /* ------------- Actions ------------ */
2367
2382
  // Types of actions
2368
- var ActionType$8;
2383
+ var ActionType$7;
2369
2384
  (function (ActionType) {
2370
2385
  // Toggle whether a child are being shown
2371
2386
  ActionType["ToggleChild"] = "toggle-child";
2372
- })(ActionType$8 || (ActionType$8 = {}));
2387
+ })(ActionType$7 || (ActionType$7 = {}));
2373
2388
  /**
2374
2389
  * Reducer that executes actions
2375
2390
  * @author Gabe Abrams
2376
2391
  * @param state current state
2377
2392
  * @param action action to execute
2378
2393
  */
2379
- const reducer$9 = (state, action) => {
2394
+ const reducer$8 = (state, action) => {
2380
2395
  switch (action.type) {
2381
- case ActionType$8.ToggleChild: {
2396
+ case ActionType$7.ToggleChild: {
2382
2397
  return Object.assign(Object.assign({}, state), { childExpanded: Object.assign(Object.assign({}, state.childExpanded), { [String(action.id)]: !state.childExpanded[String(action.id)] }) });
2383
2398
  }
2384
2399
  default: {
@@ -2407,7 +2422,7 @@ const NestableItemList = (props) => {
2407
2422
  childExpanded: initChildExpanded,
2408
2423
  };
2409
2424
  // Initialize state
2410
- const [state, dispatch] = React.useReducer(reducer$9, initialState);
2425
+ const [state, dispatch] = React.useReducer(reducer$8, initialState);
2411
2426
  // Destructure common state
2412
2427
  const { childExpanded, } = state;
2413
2428
  /*------------------------------------------------------------------------*/
@@ -2497,7 +2512,7 @@ const NestableItemList = (props) => {
2497
2512
  backgroundColor: 'transparent',
2498
2513
  }, type: "button", onClick: () => {
2499
2514
  dispatch({
2500
- type: ActionType$8.ToggleChild,
2515
+ type: ActionType$7.ToggleChild,
2501
2516
  id: item.id,
2502
2517
  });
2503
2518
  }, "aria-label": `${childExpanded[item.id] ? 'Hide' : 'Show'} items in ${item.name}` },
@@ -2781,7 +2796,7 @@ var SortType;
2781
2796
  })(SortType || (SortType = {}));
2782
2797
  /* ------------- Actions ------------ */
2783
2798
  // Types of actions
2784
- var ActionType$7;
2799
+ var ActionType$6;
2785
2800
  (function (ActionType) {
2786
2801
  // Toggle sort column param
2787
2802
  ActionType["ToggleSortColumn"] = "toggle-sort-column";
@@ -2793,16 +2808,16 @@ var ActionType$7;
2793
2808
  ActionType["ShowAllColumns"] = "show-all-columns";
2794
2809
  // Hide all columns
2795
2810
  ActionType["HideAllColumns"] = "hide-all-columns";
2796
- })(ActionType$7 || (ActionType$7 = {}));
2811
+ })(ActionType$6 || (ActionType$6 = {}));
2797
2812
  /**
2798
2813
  * Reducer that executes actions
2799
2814
  * @author Gabe Abrams
2800
2815
  * @param state current state
2801
2816
  * @param action action to execute
2802
2817
  */
2803
- const reducer$8 = (state, action) => {
2818
+ const reducer$7 = (state, action) => {
2804
2819
  switch (action.type) {
2805
- case ActionType$7.ToggleSortColumn: {
2820
+ case ActionType$6.ToggleSortColumn: {
2806
2821
  if (action.param !== state.sortColumnParam) {
2807
2822
  // Different column param
2808
2823
  return Object.assign(Object.assign({}, state), { sortColumnParam: action.param, sortType: SortType.Ascending });
@@ -2814,22 +2829,22 @@ const reducer$8 = (state, action) => {
2814
2829
  // Stop sorting by column
2815
2830
  return Object.assign(Object.assign({}, state), { sortColumnParam: undefined, sortType: SortType.Ascending });
2816
2831
  }
2817
- case ActionType$7.UpdateColumnVisibility: {
2832
+ case ActionType$6.UpdateColumnVisibility: {
2818
2833
  const { columnVisibilityMap } = state;
2819
2834
  columnVisibilityMap[action.param] = action.visible;
2820
2835
  return Object.assign(Object.assign({}, state), { columnVisibilityMap });
2821
2836
  }
2822
- case ActionType$7.ToggleColVisCusModalVisibility: {
2837
+ case ActionType$6.ToggleColVisCusModalVisibility: {
2823
2838
  return Object.assign(Object.assign({}, state), { columnVisibilityCustomizationModalVisible: !state.columnVisibilityCustomizationModalVisible });
2824
2839
  }
2825
- case ActionType$7.ShowAllColumns: {
2840
+ case ActionType$6.ShowAllColumns: {
2826
2841
  const { columnVisibilityMap } = state;
2827
2842
  Object.keys(columnVisibilityMap).forEach((param) => {
2828
2843
  columnVisibilityMap[param] = true;
2829
2844
  });
2830
2845
  return Object.assign(Object.assign({}, state), { columnVisibilityMap });
2831
2846
  }
2832
- case ActionType$7.HideAllColumns: {
2847
+ case ActionType$6.HideAllColumns: {
2833
2848
  const { columnVisibilityMap } = state;
2834
2849
  Object.keys(columnVisibilityMap).forEach((param) => {
2835
2850
  columnVisibilityMap[param] = false;
@@ -2876,7 +2891,7 @@ const IntelliTable = (props) => {
2876
2891
  columnVisibilityCustomizationModalVisible: false,
2877
2892
  };
2878
2893
  // Initialize state
2879
- const [state, dispatch] = React.useReducer(reducer$8, initialState);
2894
+ const [state, dispatch] = React.useReducer(reducer$7, initialState);
2880
2895
  // Destructure common state
2881
2896
  const { sortColumnParam, sortType, columnVisibilityMap, columnVisibilityCustomizationModalVisible, } = state;
2882
2897
  /*------------------------------------------------------------------------*/
@@ -2899,13 +2914,13 @@ const IntelliTable = (props) => {
2899
2914
  return alert('Choose at least one column', 'To continue, you have to choose at least one column to show');
2900
2915
  }
2901
2916
  dispatch({
2902
- type: ActionType$7.ToggleColVisCusModalVisibility,
2917
+ type: ActionType$6.ToggleColVisCusModalVisibility,
2903
2918
  });
2904
2919
  }, okayVariant: Variant$1.Light },
2905
2920
  columns.map((column) => {
2906
2921
  return (React__default["default"].createElement(CheckboxButton, { key: column.param, id: `IntelliTable-${id}-toggle-visibility-${column.param}`, className: "mb-2", text: column.title, onChanged: (checked) => {
2907
2922
  dispatch({
2908
- type: ActionType$7.UpdateColumnVisibility,
2923
+ type: ActionType$6.UpdateColumnVisibility,
2909
2924
  param: column.param,
2910
2925
  visible: checked,
2911
2926
  });
@@ -2914,12 +2929,12 @@ const IntelliTable = (props) => {
2914
2929
  React__default["default"].createElement("div", { className: "mt-3" }, "Or you can:"),
2915
2930
  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: () => {
2916
2931
  dispatch({
2917
- type: ActionType$7.ShowAllColumns,
2932
+ type: ActionType$6.ShowAllColumns,
2918
2933
  });
2919
2934
  } }, "Select All"),
2920
2935
  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: () => {
2921
2936
  dispatch({
2922
- type: ActionType$7.HideAllColumns,
2937
+ type: ActionType$6.HideAllColumns,
2923
2938
  });
2924
2939
  } }, "Deselect All")));
2925
2940
  }
@@ -2970,7 +2985,7 @@ const IntelliTable = (props) => {
2970
2985
  React__default["default"].createElement("div", null,
2971
2986
  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: () => {
2972
2987
  dispatch({
2973
- type: ActionType$7.ToggleSortColumn,
2988
+ type: ActionType$6.ToggleSortColumn,
2974
2989
  param: column.param,
2975
2990
  });
2976
2991
  } },
@@ -3159,7 +3174,7 @@ const IntelliTable = (props) => {
3159
3174
  React__default["default"].createElement(CSVDownloadButton, { "aria-label": `download data as csv for ${title}`, id: `IntelliTable-${id}-download-as-csv`, filename: filename, csv: csv }),
3160
3175
  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: () => {
3161
3176
  dispatch({
3162
- type: ActionType$7.ToggleColVisCusModalVisibility,
3177
+ type: ActionType$6.ToggleColVisCusModalVisibility,
3163
3178
  });
3164
3179
  } },
3165
3180
  "Show/Hide Cols",
@@ -3525,7 +3540,7 @@ const genHumanReadableName = (machineReadableName) => {
3525
3540
  };
3526
3541
  /* ------------- Actions ------------ */
3527
3542
  // Types of actions
3528
- var ActionType$6;
3543
+ var ActionType$5;
3529
3544
  (function (ActionType) {
3530
3545
  // Show the loading bar
3531
3546
  ActionType["StartLoading"] = "start-loading";
@@ -3547,45 +3562,45 @@ var ActionType$6;
3547
3562
  ActionType["UpdateActionErrorFilterState"] = "update-action-error-filter-state";
3548
3563
  // Update the advanced filter state
3549
3564
  ActionType["UpdateAdvancedFilterState"] = "update-advanced-filter-state";
3550
- })(ActionType$6 || (ActionType$6 = {}));
3565
+ })(ActionType$5 || (ActionType$5 = {}));
3551
3566
  /**
3552
3567
  * Reducer that executes actions
3553
3568
  * @author Gabe Abrams
3554
3569
  * @param state current state
3555
3570
  * @param action action to execute
3556
3571
  */
3557
- const reducer$7 = (state, action) => {
3572
+ const reducer$6 = (state, action) => {
3558
3573
  switch (action.type) {
3559
- case ActionType$6.StartLoading: {
3574
+ case ActionType$5.StartLoading: {
3560
3575
  return Object.assign(Object.assign({}, state), { loading: true });
3561
3576
  }
3562
- case ActionType$6.FinishLoading: {
3577
+ case ActionType$5.FinishLoading: {
3563
3578
  return Object.assign(Object.assign({}, state), { loading: false, logMap: action.logMap });
3564
3579
  }
3565
- case ActionType$6.ToggleFilterDrawer: {
3580
+ case ActionType$5.ToggleFilterDrawer: {
3566
3581
  return Object.assign(Object.assign({}, state), { expandedFilterDrawer: (state.expandedFilterDrawer === action.filterDrawer
3567
3582
  ? undefined // hide
3568
3583
  : action.filterDrawer) });
3569
3584
  }
3570
- case ActionType$6.HideFilterDrawer: {
3585
+ case ActionType$5.HideFilterDrawer: {
3571
3586
  return Object.assign(Object.assign({}, state), { expandedFilterDrawer: undefined });
3572
3587
  }
3573
- case ActionType$6.ResetFilters: {
3588
+ case ActionType$5.ResetFilters: {
3574
3589
  return Object.assign(Object.assign({}, state), { dateFilterState: action.initDateFilterState, contextFilterState: action.initContextFilterState, tagFilterState: action.initTagFilterState, actionErrorFilterState: action.initActionErrorFilterState, advancedFilterState: action.initAdvancedFilterState });
3575
3590
  }
3576
- case ActionType$6.UpdateDateFilterState: {
3591
+ case ActionType$5.UpdateDateFilterState: {
3577
3592
  return Object.assign(Object.assign({}, state), { dateFilterState: action.dateFilterState });
3578
3593
  }
3579
- case ActionType$6.UpdateContextFilterState: {
3594
+ case ActionType$5.UpdateContextFilterState: {
3580
3595
  return Object.assign(Object.assign({}, state), { contextFilterState: action.contextFilterState });
3581
3596
  }
3582
- case ActionType$6.UpdateTagFilterState: {
3597
+ case ActionType$5.UpdateTagFilterState: {
3583
3598
  return Object.assign(Object.assign({}, state), { tagFilterState: action.tagFilterState });
3584
3599
  }
3585
- case ActionType$6.UpdateActionErrorFilterState: {
3600
+ case ActionType$5.UpdateActionErrorFilterState: {
3586
3601
  return Object.assign(Object.assign({}, state), { actionErrorFilterState: action.actionErrorFilterState });
3587
3602
  }
3588
- case ActionType$6.UpdateAdvancedFilterState: {
3603
+ case ActionType$5.UpdateAdvancedFilterState: {
3589
3604
  return Object.assign(Object.assign({}, state), { advancedFilterState: action.advancedFilterState });
3590
3605
  }
3591
3606
  default: {
@@ -3714,7 +3729,7 @@ const LogReviewer = (props) => {
3714
3729
  advancedFilterState: initAdvancedFilterState,
3715
3730
  };
3716
3731
  // Initialize state
3717
- const [state, dispatch] = React.useReducer(reducer$7, initialState);
3732
+ const [state, dispatch] = React.useReducer(reducer$6, initialState);
3718
3733
  // Destructure common state
3719
3734
  const { loading, logMap, expandedFilterDrawer, dateFilterState, contextFilterState, tagFilterState, actionErrorFilterState, advancedFilterState, } = state;
3720
3735
  /*------------------------------------------------------------------------*/
@@ -3764,7 +3779,7 @@ const LogReviewer = (props) => {
3764
3779
  const handleDateRangeUpdated = (newDateFilterState) => __awaiter(void 0, void 0, void 0, function* () {
3765
3780
  // Update state
3766
3781
  dispatch({
3767
- type: ActionType$6.UpdateDateFilterState,
3782
+ type: ActionType$5.UpdateDateFilterState,
3768
3783
  dateFilterState: newDateFilterState,
3769
3784
  });
3770
3785
  // Check which year/month combos we need to load
@@ -3775,7 +3790,7 @@ const LogReviewer = (props) => {
3775
3790
  }
3776
3791
  // Start loading
3777
3792
  dispatch({
3778
- type: ActionType$6.StartLoading,
3793
+ type: ActionType$5.StartLoading,
3779
3794
  });
3780
3795
  // Load required months
3781
3796
  try {
@@ -3799,7 +3814,7 @@ const LogReviewer = (props) => {
3799
3814
  }
3800
3815
  // Finish loading
3801
3816
  dispatch({
3802
- type: ActionType$6.FinishLoading,
3817
+ type: ActionType$5.FinishLoading,
3803
3818
  logMap,
3804
3819
  });
3805
3820
  });
@@ -3838,7 +3853,7 @@ const LogReviewer = (props) => {
3838
3853
  React__default["default"].createElement("div", { className: "LogReviewer-filter-toggle-buttons alert alert-secondary p-2 m-0" },
3839
3854
  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: () => {
3840
3855
  dispatch({
3841
- type: ActionType$6.ToggleFilterDrawer,
3856
+ type: ActionType$5.ToggleFilterDrawer,
3842
3857
  filterDrawer: FilterDrawer.Date,
3843
3858
  });
3844
3859
  } },
@@ -3846,7 +3861,7 @@ const LogReviewer = (props) => {
3846
3861
  "Date"),
3847
3862
  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: () => {
3848
3863
  dispatch({
3849
- type: ActionType$6.ToggleFilterDrawer,
3864
+ type: ActionType$5.ToggleFilterDrawer,
3850
3865
  filterDrawer: FilterDrawer.Context,
3851
3866
  });
3852
3867
  } },
@@ -3854,7 +3869,7 @@ const LogReviewer = (props) => {
3854
3869
  "Context"),
3855
3870
  (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: () => {
3856
3871
  dispatch({
3857
- type: ActionType$6.ToggleFilterDrawer,
3872
+ type: ActionType$5.ToggleFilterDrawer,
3858
3873
  filterDrawer: FilterDrawer.Tag,
3859
3874
  });
3860
3875
  } },
@@ -3862,7 +3877,7 @@ const LogReviewer = (props) => {
3862
3877
  "Tag")),
3863
3878
  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: () => {
3864
3879
  dispatch({
3865
- type: ActionType$6.ToggleFilterDrawer,
3880
+ type: ActionType$5.ToggleFilterDrawer,
3866
3881
  filterDrawer: FilterDrawer.Action,
3867
3882
  });
3868
3883
  } },
@@ -3870,7 +3885,7 @@ const LogReviewer = (props) => {
3870
3885
  "Action"),
3871
3886
  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: () => {
3872
3887
  dispatch({
3873
- type: ActionType$6.ToggleFilterDrawer,
3888
+ type: ActionType$5.ToggleFilterDrawer,
3874
3889
  filterDrawer: FilterDrawer.Advanced,
3875
3890
  });
3876
3891
  } },
@@ -3878,7 +3893,7 @@ const LogReviewer = (props) => {
3878
3893
  "Advanced"),
3879
3894
  React__default["default"].createElement("button", { type: "button", id: "LogReviewer-reset-filters-button", className: "btn btn-light", "aria-label": "reset filters", onClick: () => {
3880
3895
  dispatch({
3881
- type: ActionType$6.ResetFilters,
3896
+ type: ActionType$5.ResetFilters,
3882
3897
  initActionErrorFilterState,
3883
3898
  initAdvancedFilterState,
3884
3899
  initContextFilterState,
@@ -4000,7 +4015,7 @@ const LogReviewer = (props) => {
4000
4015
  }
4001
4016
  });
4002
4017
  dispatch({
4003
- type: ActionType$6.UpdateContextFilterState,
4018
+ type: ActionType$5.UpdateContextFilterState,
4004
4019
  contextFilterState,
4005
4020
  });
4006
4021
  } }));
@@ -4015,7 +4030,7 @@ const LogReviewer = (props) => {
4015
4030
  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) => {
4016
4031
  tagFilterState[tag] = checked;
4017
4032
  dispatch({
4018
- type: ActionType$6.UpdateTagFilterState,
4033
+ type: ActionType$5.UpdateTagFilterState,
4019
4034
  tagFilterState,
4020
4035
  });
4021
4036
  } }));
@@ -4028,21 +4043,21 @@ const LogReviewer = (props) => {
4028
4043
  React__default["default"].createElement(RadioButton, { id: "LogReviewer-type-all", text: "All Logs", onSelected: () => {
4029
4044
  actionErrorFilterState.type = undefined;
4030
4045
  dispatch({
4031
- type: ActionType$6.UpdateActionErrorFilterState,
4046
+ type: ActionType$5.UpdateActionErrorFilterState,
4032
4047
  actionErrorFilterState,
4033
4048
  });
4034
4049
  }, ariaLabel: "show logs of all types", selected: actionErrorFilterState.type === undefined }),
4035
4050
  React__default["default"].createElement(RadioButton, { id: "LogReviewer-type-action-only", text: "Action Logs Only", onSelected: () => {
4036
4051
  actionErrorFilterState.type = LogType$1.Action;
4037
4052
  dispatch({
4038
- type: ActionType$6.UpdateActionErrorFilterState,
4053
+ type: ActionType$5.UpdateActionErrorFilterState,
4039
4054
  actionErrorFilterState,
4040
4055
  });
4041
4056
  }, ariaLabel: "only show action logs", selected: actionErrorFilterState.type === LogType$1.Action }),
4042
4057
  React__default["default"].createElement(RadioButton, { id: "LogReviewer-type-error-only", text: "Action Error Only", onSelected: () => {
4043
4058
  actionErrorFilterState.type = LogType$1.Error;
4044
4059
  dispatch({
4045
- type: ActionType$6.UpdateActionErrorFilterState,
4060
+ type: ActionType$5.UpdateActionErrorFilterState,
4046
4061
  actionErrorFilterState,
4047
4062
  });
4048
4063
  }, ariaLabel: "only show error logs", selected: actionErrorFilterState.type === LogType$1.Error, noMarginOnRight: true })),
@@ -4054,7 +4069,7 @@ const LogReviewer = (props) => {
4054
4069
  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) => {
4055
4070
  actionErrorFilterState.action[action] = checked;
4056
4071
  dispatch({
4057
- type: ActionType$6.UpdateActionErrorFilterState,
4072
+ type: ActionType$5.UpdateActionErrorFilterState,
4058
4073
  actionErrorFilterState,
4059
4074
  });
4060
4075
  } }));
@@ -4065,7 +4080,7 @@ const LogReviewer = (props) => {
4065
4080
  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) => {
4066
4081
  actionErrorFilterState.target[target] = checked;
4067
4082
  dispatch({
4068
- type: ActionType$6.UpdateActionErrorFilterState,
4083
+ type: ActionType$5.UpdateActionErrorFilterState,
4069
4084
  actionErrorFilterState,
4070
4085
  });
4071
4086
  } }));
@@ -4077,7 +4092,7 @@ const LogReviewer = (props) => {
4077
4092
  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) => {
4078
4093
  actionErrorFilterState.errorMessage = e.target.value;
4079
4094
  dispatch({
4080
- type: ActionType$6.UpdateActionErrorFilterState,
4095
+ type: ActionType$5.UpdateActionErrorFilterState,
4081
4096
  actionErrorFilterState,
4082
4097
  });
4083
4098
  } })),
@@ -4088,7 +4103,7 @@ const LogReviewer = (props) => {
4088
4103
  .trim()
4089
4104
  .toUpperCase());
4090
4105
  dispatch({
4091
- type: ActionType$6.UpdateActionErrorFilterState,
4106
+ type: ActionType$5.UpdateActionErrorFilterState,
4092
4107
  actionErrorFilterState,
4093
4108
  });
4094
4109
  } }))))));
@@ -4102,7 +4117,7 @@ const LogReviewer = (props) => {
4102
4117
  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) => {
4103
4118
  advancedFilterState.userFirstName = e.target.value;
4104
4119
  dispatch({
4105
- type: ActionType$6.UpdateAdvancedFilterState,
4120
+ type: ActionType$5.UpdateAdvancedFilterState,
4106
4121
  advancedFilterState,
4107
4122
  });
4108
4123
  } })),
@@ -4111,7 +4126,7 @@ const LogReviewer = (props) => {
4111
4126
  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) => {
4112
4127
  advancedFilterState.userLastName = e.target.value;
4113
4128
  dispatch({
4114
- type: ActionType$6.UpdateAdvancedFilterState,
4129
+ type: ActionType$5.UpdateAdvancedFilterState,
4115
4130
  advancedFilterState,
4116
4131
  });
4117
4132
  } })),
@@ -4121,7 +4136,7 @@ const LogReviewer = (props) => {
4121
4136
  advancedFilterState.userEmail = ((e.target.value)
4122
4137
  .trim());
4123
4138
  dispatch({
4124
- type: ActionType$6.UpdateAdvancedFilterState,
4139
+ type: ActionType$5.UpdateAdvancedFilterState,
4125
4140
  advancedFilterState,
4126
4141
  });
4127
4142
  } })),
@@ -4135,7 +4150,7 @@ const LogReviewer = (props) => {
4135
4150
  .trim());
4136
4151
  }
4137
4152
  dispatch({
4138
- type: ActionType$6.UpdateAdvancedFilterState,
4153
+ type: ActionType$5.UpdateAdvancedFilterState,
4139
4154
  advancedFilterState,
4140
4155
  });
4141
4156
  } })),
@@ -4143,21 +4158,21 @@ const LogReviewer = (props) => {
4143
4158
  React__default["default"].createElement(CheckboxButton, { text: "Students", onChanged: (checked) => {
4144
4159
  advancedFilterState.includeLearners = checked;
4145
4160
  dispatch({
4146
- type: ActionType$6.UpdateAdvancedFilterState,
4161
+ type: ActionType$5.UpdateAdvancedFilterState,
4147
4162
  advancedFilterState,
4148
4163
  });
4149
4164
  }, checked: advancedFilterState.includeLearners, ariaLabel: "show logs from students" }),
4150
4165
  React__default["default"].createElement(CheckboxButton, { text: "Teaching Team Members", onChanged: (checked) => {
4151
4166
  advancedFilterState.includeTTMs = checked;
4152
4167
  dispatch({
4153
- type: ActionType$6.UpdateAdvancedFilterState,
4168
+ type: ActionType$5.UpdateAdvancedFilterState,
4154
4169
  advancedFilterState,
4155
4170
  });
4156
4171
  }, checked: advancedFilterState.includeTTMs, ariaLabel: "show logs from teaching team members" }),
4157
4172
  React__default["default"].createElement(CheckboxButton, { text: "Admins", onChanged: (checked) => {
4158
4173
  advancedFilterState.includeAdmins = checked;
4159
4174
  dispatch({
4160
- type: ActionType$6.UpdateAdvancedFilterState,
4175
+ type: ActionType$5.UpdateAdvancedFilterState,
4161
4176
  advancedFilterState,
4162
4177
  });
4163
4178
  }, checked: advancedFilterState.includeAdmins, ariaLabel: "show logs from admins" }))),
@@ -4167,7 +4182,7 @@ const LogReviewer = (props) => {
4167
4182
  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) => {
4168
4183
  advancedFilterState.courseName = e.target.value;
4169
4184
  dispatch({
4170
- type: ActionType$6.UpdateAdvancedFilterState,
4185
+ type: ActionType$5.UpdateAdvancedFilterState,
4171
4186
  advancedFilterState,
4172
4187
  });
4173
4188
  } })),
@@ -4181,7 +4196,7 @@ const LogReviewer = (props) => {
4181
4196
  .trim());
4182
4197
  }
4183
4198
  dispatch({
4184
- type: ActionType$6.UpdateAdvancedFilterState,
4199
+ type: ActionType$5.UpdateAdvancedFilterState,
4185
4200
  advancedFilterState,
4186
4201
  });
4187
4202
  } }))),
@@ -4190,21 +4205,21 @@ const LogReviewer = (props) => {
4190
4205
  React__default["default"].createElement(RadioButton, { text: "All Devices", ariaLabel: "show logs from all devices", selected: advancedFilterState.isMobile === undefined, onSelected: () => {
4191
4206
  advancedFilterState.isMobile = undefined;
4192
4207
  dispatch({
4193
- type: ActionType$6.UpdateAdvancedFilterState,
4208
+ type: ActionType$5.UpdateAdvancedFilterState,
4194
4209
  advancedFilterState,
4195
4210
  });
4196
4211
  } }),
4197
4212
  React__default["default"].createElement(RadioButton, { text: "Mobile Only", ariaLabel: "show logs from mobile devices", selected: advancedFilterState.isMobile === true, onSelected: () => {
4198
4213
  advancedFilterState.isMobile = true;
4199
4214
  dispatch({
4200
- type: ActionType$6.UpdateAdvancedFilterState,
4215
+ type: ActionType$5.UpdateAdvancedFilterState,
4201
4216
  advancedFilterState,
4202
4217
  });
4203
4218
  } }),
4204
4219
  React__default["default"].createElement(RadioButton, { text: "Desktop Only", ariaLabel: "show logs from desktop devices", selected: advancedFilterState.isMobile === false, onSelected: () => {
4205
4220
  advancedFilterState.isMobile = false;
4206
4221
  dispatch({
4207
- type: ActionType$6.UpdateAdvancedFilterState,
4222
+ type: ActionType$5.UpdateAdvancedFilterState,
4208
4223
  advancedFilterState,
4209
4224
  });
4210
4225
  }, noMarginOnRight: true }))),
@@ -4213,21 +4228,21 @@ const LogReviewer = (props) => {
4213
4228
  React__default["default"].createElement(RadioButton, { text: "Both", ariaLabel: "show logs from all sources", selected: advancedFilterState.source === undefined, onSelected: () => {
4214
4229
  advancedFilterState.source = undefined;
4215
4230
  dispatch({
4216
- type: ActionType$6.UpdateAdvancedFilterState,
4231
+ type: ActionType$5.UpdateAdvancedFilterState,
4217
4232
  advancedFilterState,
4218
4233
  });
4219
4234
  } }),
4220
4235
  React__default["default"].createElement(RadioButton, { text: "Client Only", ariaLabel: "show logs from client source", selected: advancedFilterState.source === LogSource$1.Client, onSelected: () => {
4221
4236
  advancedFilterState.source = LogSource$1.Client;
4222
4237
  dispatch({
4223
- type: ActionType$6.UpdateAdvancedFilterState,
4238
+ type: ActionType$5.UpdateAdvancedFilterState,
4224
4239
  advancedFilterState,
4225
4240
  });
4226
4241
  } }),
4227
4242
  React__default["default"].createElement(RadioButton, { text: "Server Only", ariaLabel: "show logs from server source", selected: advancedFilterState.source === LogSource$1.Server, onSelected: () => {
4228
4243
  advancedFilterState.source = LogSource$1.Server;
4229
4244
  dispatch({
4230
- type: ActionType$6.UpdateAdvancedFilterState,
4245
+ type: ActionType$5.UpdateAdvancedFilterState,
4231
4246
  advancedFilterState,
4232
4247
  });
4233
4248
  }, noMarginOnRight: true })),
@@ -4238,7 +4253,7 @@ const LogReviewer = (props) => {
4238
4253
  advancedFilterState.courseName = ((e.target.value)
4239
4254
  .trim());
4240
4255
  dispatch({
4241
- type: ActionType$6.UpdateAdvancedFilterState,
4256
+ type: ActionType$5.UpdateAdvancedFilterState,
4242
4257
  advancedFilterState,
4243
4258
  });
4244
4259
  } })),
@@ -4248,7 +4263,7 @@ const LogReviewer = (props) => {
4248
4263
  advancedFilterState.courseName = ((e.target.value)
4249
4264
  .trim());
4250
4265
  dispatch({
4251
- type: ActionType$6.UpdateAdvancedFilterState,
4266
+ type: ActionType$5.UpdateAdvancedFilterState,
4252
4267
  advancedFilterState,
4253
4268
  });
4254
4269
  } })))))));
@@ -12068,11 +12083,11 @@ var CreatableSelect$1 = CreatableSelect;
12068
12083
  */
12069
12084
  /* ------------- Actions ------------ */
12070
12085
  // Types of actions
12071
- var ActionType$5;
12086
+ var ActionType$4;
12072
12087
  (function (ActionType) {
12073
12088
  // Update the input value
12074
12089
  ActionType["SetInputValue"] = "SetInputValue";
12075
- })(ActionType$5 || (ActionType$5 = {}));
12090
+ })(ActionType$4 || (ActionType$4 = {}));
12076
12091
  /**
12077
12092
  * Reducer that executes actions
12078
12093
  * @author Yuen Ler Chow
@@ -12080,9 +12095,9 @@ var ActionType$5;
12080
12095
  * @param action action to execute
12081
12096
  * @returns updated state
12082
12097
  */
12083
- const reducer$6 = (state, action) => {
12098
+ const reducer$5 = (state, action) => {
12084
12099
  switch (action.type) {
12085
- case ActionType$5.SetInputValue: {
12100
+ case ActionType$4.SetInputValue: {
12086
12101
  return Object.assign(Object.assign({}, state), { inputValue: action.value });
12087
12102
  }
12088
12103
  default: {
@@ -12102,7 +12117,7 @@ const CreatableMultiselect = (props) => {
12102
12117
  inputValue: '',
12103
12118
  };
12104
12119
  // Initialize state
12105
- const [state, dispatch] = React.useReducer(reducer$6, initialState);
12120
+ const [state, dispatch] = React.useReducer(reducer$5, initialState);
12106
12121
  // Destructure common state
12107
12122
  const { inputValue } = state;
12108
12123
  /*------------------------------------------------------------------------*/
@@ -12179,7 +12194,7 @@ const CreatableMultiselect = (props) => {
12179
12194
  }
12180
12195
  // Reset text field to empty because the values have been added
12181
12196
  dispatch({
12182
- type: ActionType$5.SetInputValue,
12197
+ type: ActionType$4.SetInputValue,
12183
12198
  value: '',
12184
12199
  });
12185
12200
  };
@@ -12218,7 +12233,7 @@ const CreatableMultiselect = (props) => {
12218
12233
  else {
12219
12234
  // simply update the input value to the new input value
12220
12235
  dispatch({
12221
- type: ActionType$5.SetInputValue,
12236
+ type: ActionType$4.SetInputValue,
12222
12237
  value: newValue,
12223
12238
  });
12224
12239
  }
@@ -12270,13 +12285,13 @@ const style$1 = `
12270
12285
  `;
12271
12286
  /* ------------- Actions ------------ */
12272
12287
  // Types of actions
12273
- var ActionType$4;
12288
+ var ActionType$3;
12274
12289
  (function (ActionType) {
12275
12290
  // Update the DBEntry
12276
12291
  ActionType["UpdateDBEntry"] = "UpdateDBEntry";
12277
12292
  // Start the save spinner
12278
12293
  ActionType["StartSave"] = "StartSave";
12279
- })(ActionType$4 || (ActionType$4 = {}));
12294
+ })(ActionType$3 || (ActionType$3 = {}));
12280
12295
  /**
12281
12296
  * Reducer that executes actions
12282
12297
  * @author Yuen Ler Chow
@@ -12284,12 +12299,12 @@ var ActionType$4;
12284
12299
  * @param action action to execute
12285
12300
  * @returns updated state
12286
12301
  */
12287
- const reducer$5 = (state, action) => {
12302
+ const reducer$4 = (state, action) => {
12288
12303
  switch (action.type) {
12289
- case ActionType$4.UpdateDBEntry: {
12304
+ case ActionType$3.UpdateDBEntry: {
12290
12305
  return Object.assign(Object.assign({}, state), { entry: action.dbEntry });
12291
12306
  }
12292
- case ActionType$4.StartSave: {
12307
+ case ActionType$3.StartSave: {
12293
12308
  return Object.assign(Object.assign({}, state), { saving: true });
12294
12309
  }
12295
12310
  default: {
@@ -12314,7 +12329,7 @@ const AddOrEditDBEntry = (props) => {
12314
12329
  saving: false,
12315
12330
  };
12316
12331
  // Initialize state
12317
- const [state, dispatch] = React.useReducer(reducer$5, initialState);
12332
+ const [state, dispatch] = React.useReducer(reducer$4, initialState);
12318
12333
  // Destructure common state
12319
12334
  const { entry, saving, } = state;
12320
12335
  /*------------------------------------------------------------------------*/
@@ -12326,7 +12341,7 @@ const AddOrEditDBEntry = (props) => {
12326
12341
  */
12327
12342
  const save = () => __awaiter(void 0, void 0, void 0, function* () {
12328
12343
  // Start the save loading indicator
12329
- dispatch({ type: ActionType$4.StartSave });
12344
+ dispatch({ type: ActionType$3.StartSave });
12330
12345
  // add all default values to the entry
12331
12346
  entryFields.forEach((field) => {
12332
12347
  if (field.defaultValue && !entry[field.objectKey]) {
@@ -12509,7 +12524,7 @@ const AddOrEditDBEntry = (props) => {
12509
12524
  return (React__default["default"].createElement(RadioButton, { key: choice.value, text: choice.title, selected: entry[field.objectKey] === choice.value, onSelected: () => {
12510
12525
  entry[field.objectKey] = choice.value;
12511
12526
  dispatch({
12512
- type: ActionType$4.UpdateDBEntry,
12527
+ type: ActionType$3.UpdateDBEntry,
12513
12528
  dbEntry: entry,
12514
12529
  });
12515
12530
  }, ariaLabel: choice.title }));
@@ -12521,7 +12536,7 @@ const AddOrEditDBEntry = (props) => {
12521
12536
  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) => {
12522
12537
  entry[field.objectKey] = (e.target.value);
12523
12538
  dispatch({
12524
- type: ActionType$4.UpdateDBEntry,
12539
+ type: ActionType$3.UpdateDBEntry,
12525
12540
  dbEntry: entry,
12526
12541
  });
12527
12542
  } }))));
@@ -12534,7 +12549,7 @@ const AddOrEditDBEntry = (props) => {
12534
12549
  entry[field.objectKey] = (e.target.value
12535
12550
  .replace(/[^0-9]/g, ''));
12536
12551
  dispatch({
12537
- type: ActionType$4.UpdateDBEntry,
12552
+ type: ActionType$3.UpdateDBEntry,
12538
12553
  dbEntry: entry,
12539
12554
  });
12540
12555
  } }))));
@@ -12564,7 +12579,7 @@ const AddOrEditDBEntry = (props) => {
12564
12579
  }
12565
12580
  // Save
12566
12581
  dispatch({
12567
- type: ActionType$4.UpdateDBEntry,
12582
+ type: ActionType$3.UpdateDBEntry,
12568
12583
  dbEntry: entry,
12569
12584
  });
12570
12585
  }, ariaLabel: choice.title }));
@@ -12579,7 +12594,7 @@ const AddOrEditDBEntry = (props) => {
12579
12594
  // Update entry and save
12580
12595
  entry[field.objectKey] = values;
12581
12596
  dispatch({
12582
- type: ActionType$4.UpdateDBEntry,
12597
+ type: ActionType$3.UpdateDBEntry,
12583
12598
  dbEntry: entry,
12584
12599
  });
12585
12600
  } })))));
@@ -12592,7 +12607,7 @@ const AddOrEditDBEntry = (props) => {
12592
12607
  React__default["default"].createElement(CreatableMultiselect, { disabled: disabled, type: DBEntryFieldType$1.NumberArray, values: entry[field.objectKey] || [], onChange: (values) => {
12593
12608
  entry[field.objectKey] = values;
12594
12609
  dispatch({
12595
- type: ActionType$4.UpdateDBEntry,
12610
+ type: ActionType$3.UpdateDBEntry,
12596
12611
  dbEntry: entry,
12597
12612
  });
12598
12613
  } })))));
@@ -12666,7 +12681,7 @@ const generateEndpointPath = (collectionName, adminsOnly) => {
12666
12681
  */
12667
12682
  /* ------------- Actions ------------ */
12668
12683
  // Types of actions
12669
- var ActionType$3;
12684
+ var ActionType$2;
12670
12685
  (function (ActionType) {
12671
12686
  // Show adder
12672
12687
  ActionType["ShowAdder"] = "ShowAdder";
@@ -12680,7 +12695,7 @@ var ActionType$3;
12680
12695
  ActionType["StartDelete"] = "StartDelete";
12681
12696
  // Finish deletion process
12682
12697
  ActionType["FinishDelete"] = "FinishDelete";
12683
- })(ActionType$3 || (ActionType$3 = {}));
12698
+ })(ActionType$2 || (ActionType$2 = {}));
12684
12699
  /**
12685
12700
  * Reducer that executes actions
12686
12701
  * @author Yuen Ler Chow
@@ -12688,18 +12703,18 @@ var ActionType$3;
12688
12703
  * @param action action to execute
12689
12704
  * @returns updated state
12690
12705
  */
12691
- const reducer$4 = (state, action) => {
12706
+ const reducer$3 = (state, action) => {
12692
12707
  switch (action.type) {
12693
- case ActionType$3.FinishLoading: {
12708
+ case ActionType$2.FinishLoading: {
12694
12709
  return Object.assign(Object.assign({}, state), { loading: false, dbEntries: action.dbEntries });
12695
12710
  }
12696
- case ActionType$3.ShowAdder: {
12711
+ case ActionType$2.ShowAdder: {
12697
12712
  return Object.assign(Object.assign({}, state), { adding: true, dbEntryToEdit: undefined });
12698
12713
  }
12699
- case ActionType$3.ShowEditor: {
12714
+ case ActionType$2.ShowEditor: {
12700
12715
  return Object.assign(Object.assign({}, state), { adding: false, dbEntryToEdit: action.dbEntry });
12701
12716
  }
12702
- case ActionType$3.FinishAdd: {
12717
+ case ActionType$2.FinishAdd: {
12703
12718
  // Handle cancel
12704
12719
  const finishedEntry = action.dbEntry;
12705
12720
  if (!finishedEntry) {
@@ -12723,10 +12738,10 @@ const reducer$4 = (state, action) => {
12723
12738
  // Update the state
12724
12739
  return Object.assign(Object.assign({}, state), { adding: false, dbEntryToEdit: undefined, dbEntries: updatedDbEntries });
12725
12740
  }
12726
- case ActionType$3.StartDelete: {
12741
+ case ActionType$2.StartDelete: {
12727
12742
  return Object.assign(Object.assign({}, state), { loading: true });
12728
12743
  }
12729
- case ActionType$3.FinishDelete: {
12744
+ case ActionType$2.FinishDelete: {
12730
12745
  return Object.assign(Object.assign({}, state), { loading: false,
12731
12746
  // Remove the deleted entry from the list
12732
12747
  dbEntries: state.dbEntries.filter((entry) => {
@@ -12752,7 +12767,7 @@ const DBEntryManagerPanel = (props) => {
12752
12767
  loading: true,
12753
12768
  };
12754
12769
  // Initialize state
12755
- const [state, dispatch] = React.useReducer(reducer$4, initialState);
12770
+ const [state, dispatch] = React.useReducer(reducer$3, initialState);
12756
12771
  // Destructure common state
12757
12772
  const { adding, dbEntryToEdit, dbEntries, loading, } = state;
12758
12773
  /*------------------------------------------------------------------------*/
@@ -12778,7 +12793,7 @@ const DBEntryManagerPanel = (props) => {
12778
12793
  try {
12779
12794
  // Start loader
12780
12795
  dispatch({
12781
- type: ActionType$3.StartDelete,
12796
+ type: ActionType$2.StartDelete,
12782
12797
  });
12783
12798
  // Perform deletion
12784
12799
  yield visitServerEndpoint({
@@ -12787,7 +12802,7 @@ const DBEntryManagerPanel = (props) => {
12787
12802
  });
12788
12803
  // Finish loader
12789
12804
  dispatch({
12790
- type: ActionType$3.FinishDelete,
12805
+ type: ActionType$2.FinishDelete,
12791
12806
  dbEntry: entry,
12792
12807
  idPropName,
12793
12808
  });
@@ -12816,7 +12831,7 @@ const DBEntryManagerPanel = (props) => {
12816
12831
  });
12817
12832
  // Save loaded data
12818
12833
  dispatch({
12819
- type: ActionType$3.FinishLoading,
12834
+ type: ActionType$2.FinishLoading,
12820
12835
  dbEntries: data,
12821
12836
  });
12822
12837
  }
@@ -12859,7 +12874,7 @@ const DBEntryManagerPanel = (props) => {
12859
12874
  React__default["default"].createElement("span", { className: "d-none d-md-inline ms-1" }, "Remove")),
12860
12875
  !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: () => {
12861
12876
  dispatch({
12862
- type: ActionType$3.ShowEditor,
12877
+ type: ActionType$2.ShowEditor,
12863
12878
  dbEntry: entry,
12864
12879
  });
12865
12880
  } },
@@ -12869,7 +12884,7 @@ const DBEntryManagerPanel = (props) => {
12869
12884
  React__default["default"].createElement("div", { className: "d-grid" },
12870
12885
  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: () => {
12871
12886
  dispatch({
12872
- type: ActionType$3.ShowAdder,
12887
+ type: ActionType$2.ShowAdder,
12873
12888
  });
12874
12889
  } },
12875
12890
  React__default["default"].createElement(reactFontawesome.FontAwesomeIcon, { icon: freeSolidSvgIcons.faPlus, className: "me-2" }),
@@ -12881,7 +12896,7 @@ const DBEntryManagerPanel = (props) => {
12881
12896
  if (!loading && (adding || dbEntryToEdit)) {
12882
12897
  body = (React__default["default"].createElement(AddOrEditDBEntry, { saveEndpointPath: endpoint, validateEntry: validateEntry, modifyEntry: modifyEntry, entryFields: entryFields, dbEntryToEdit: dbEntryToEdit, idPropName: idPropName, entries: dbEntries, itemName: itemName, onFinished: (entry) => {
12883
12898
  dispatch({
12884
- type: ActionType$3.FinishAdd,
12899
+ type: ActionType$2.FinishAdd,
12885
12900
  dbEntry: entry,
12886
12901
  idPropName,
12887
12902
  });
@@ -13078,25 +13093,25 @@ const getItemIds = (items) => {
13078
13093
  };
13079
13094
  /* ------------- Actions ------------ */
13080
13095
  // Types of actions
13081
- var ActionType$2;
13096
+ var ActionType$1;
13082
13097
  (function (ActionType) {
13083
13098
  // Hide the "jump to bottom" button
13084
13099
  ActionType["HideJumpToBottomButton"] = "HideJumpToBottomButton";
13085
13100
  // Show the "jump to bottom" button
13086
13101
  ActionType["ShowJumpToBottomButton"] = "ShowJumpToBottomButton";
13087
- })(ActionType$2 || (ActionType$2 = {}));
13102
+ })(ActionType$1 || (ActionType$1 = {}));
13088
13103
  /**
13089
13104
  * Reducer that executes actions
13090
13105
  * @author Gabe Abrams
13091
13106
  * @param state current state
13092
13107
  * @param action action to execute
13093
13108
  */
13094
- const reducer$3 = (state, action) => {
13109
+ const reducer$2 = (state, action) => {
13095
13110
  switch (action.type) {
13096
- case ActionType$2.HideJumpToBottomButton: {
13111
+ case ActionType$1.HideJumpToBottomButton: {
13097
13112
  return Object.assign(Object.assign({}, state), { jumpToBottomButtonVisible: false });
13098
13113
  }
13099
- case ActionType$2.ShowJumpToBottomButton: {
13114
+ case ActionType$1.ShowJumpToBottomButton: {
13100
13115
  return Object.assign(Object.assign({}, state), { jumpToBottomButtonVisible: true });
13101
13116
  }
13102
13117
  default: {
@@ -13120,7 +13135,7 @@ const AutoscrollToBottomContainer = (props) => {
13120
13135
  jumpToBottomButtonVisible: false,
13121
13136
  };
13122
13137
  // Initialize state
13123
- const [state, dispatch] = React.useReducer(reducer$3, initialState);
13138
+ const [state, dispatch] = React.useReducer(reducer$2, initialState);
13124
13139
  // Destructure common state
13125
13140
  const { jumpToBottomButtonVisible, } = state;
13126
13141
  /* -------------- Refs -------------- */
@@ -13166,7 +13181,7 @@ const AutoscrollToBottomContainer = (props) => {
13166
13181
  }
13167
13182
  // Update state
13168
13183
  dispatch({
13169
- type: ActionType$2.HideJumpToBottomButton,
13184
+ type: ActionType$1.HideJumpToBottomButton,
13170
13185
  });
13171
13186
  // Scroll to bottom
13172
13187
  container.current.scrollTop = (container.current.scrollHeight
@@ -13190,7 +13205,7 @@ const AutoscrollToBottomContainer = (props) => {
13190
13205
  if (isScrolledToBottom()) {
13191
13206
  // Hide button
13192
13207
  dispatch({
13193
- type: ActionType$2.HideJumpToBottomButton,
13208
+ type: ActionType$1.HideJumpToBottomButton,
13194
13209
  });
13195
13210
  }
13196
13211
  };
@@ -13232,7 +13247,7 @@ const AutoscrollToBottomContainer = (props) => {
13232
13247
  else {
13233
13248
  // Not scrolled to bottom. Show "jump to bottom" button.
13234
13249
  dispatch({
13235
- type: ActionType$2.ShowJumpToBottomButton,
13250
+ type: ActionType$1.ShowJumpToBottomButton,
13236
13251
  });
13237
13252
  }
13238
13253
  }, [items]);
@@ -13302,25 +13317,25 @@ const combineClassNames = (classNames) => {
13302
13317
  */
13303
13318
  /* ------------- Actions ------------ */
13304
13319
  // Types of actions
13305
- var ActionType$1;
13320
+ var ActionType;
13306
13321
  (function (ActionType) {
13307
13322
  // Start hovering on an option
13308
13323
  ActionType["StartHover"] = "StartHover";
13309
13324
  // Stop hovering on an option
13310
13325
  ActionType["StopHover"] = "StopHover";
13311
- })(ActionType$1 || (ActionType$1 = {}));
13326
+ })(ActionType || (ActionType = {}));
13312
13327
  /**
13313
13328
  * Reducer that executes actions
13314
13329
  * @author Gabe Abrams
13315
13330
  * @param state current state
13316
13331
  * @param action action to execute
13317
13332
  */
13318
- const reducer$2 = (state, action) => {
13333
+ const reducer$1 = (state, action) => {
13319
13334
  switch (action.type) {
13320
- case ActionType$1.StartHover: {
13335
+ case ActionType.StartHover: {
13321
13336
  return Object.assign(Object.assign({}, state), { hoveredOptionId: action.hoveredOptionId });
13322
13337
  }
13323
- case ActionType$1.StopHover: {
13338
+ case ActionType.StopHover: {
13324
13339
  return Object.assign(Object.assign({}, state), { hoveredOptionId: undefined });
13325
13340
  }
13326
13341
  default: {
@@ -13344,7 +13359,7 @@ const MultiSwitch = (props) => {
13344
13359
  hoveredOptionId: undefined,
13345
13360
  };
13346
13361
  // Initialize state
13347
- const [state, dispatch] = React.useReducer(reducer$2, initialState);
13362
+ const [state, dispatch] = React.useReducer(reducer$1, initialState);
13348
13363
  // Destructure common state
13349
13364
  const { hoveredOptionId, } = state;
13350
13365
  /*------------------------------------------------------------------------*/
@@ -13356,7 +13371,7 @@ const MultiSwitch = (props) => {
13356
13371
  });
13357
13372
  // Constants
13358
13373
  const gutterRems = heightRem * 0.1;
13359
- const itemWidthRems = heightRem * 2.2;
13374
+ const itemWidthRems = heightRem * 1.3;
13360
13375
  const textFontSize = heightRem / 3.5;
13361
13376
  const iconFontSize = heightRem / 2;
13362
13377
  const borderWidthRems = 0.05;
@@ -13476,27 +13491,27 @@ const MultiSwitch = (props) => {
13476
13491
  : `click to select option "${option.label}"`), onClick: () => {
13477
13492
  // Remove hover
13478
13493
  dispatch({
13479
- type: ActionType$1.StopHover,
13494
+ type: ActionType.StopHover,
13480
13495
  });
13481
13496
  // Notify parent
13482
13497
  onChange(option.id);
13483
13498
  }, onMouseEnter: () => {
13484
13499
  dispatch({
13485
- type: ActionType$1.StartHover,
13500
+ type: ActionType.StartHover,
13486
13501
  hoveredOptionId: option.id,
13487
13502
  });
13488
13503
  }, onMouseLeave: () => {
13489
13504
  dispatch({
13490
- type: ActionType$1.StopHover,
13505
+ type: ActionType.StopHover,
13491
13506
  });
13492
13507
  }, onFocus: () => {
13493
13508
  dispatch({
13494
- type: ActionType$1.StartHover,
13509
+ type: ActionType.StartHover,
13495
13510
  hoveredOptionId: option.id,
13496
13511
  });
13497
13512
  }, onBlur: () => {
13498
13513
  dispatch({
13499
- type: ActionType$1.StopHover,
13514
+ type: ActionType.StopHover,
13500
13515
  });
13501
13516
  }, style: {
13502
13517
  pointerEvents: ((option.id === selectedOptionId)
@@ -13515,147 +13530,6 @@ const MultiSwitch = (props) => {
13515
13530
  React__default["default"].createElement("div", { className: "MultiSwitch-highlight-container" }, highlight)));
13516
13531
  };
13517
13532
 
13518
- // Types of dropdown items
13519
- var DropdownItemType;
13520
- (function (DropdownItemType) {
13521
- // Dropdown header
13522
- DropdownItemType["Header"] = "Header";
13523
- // Dropdown divider
13524
- DropdownItemType["Divider"] = "Divider";
13525
- // Dropdown item
13526
- DropdownItemType["Item"] = "Item";
13527
- })(DropdownItemType || (DropdownItemType = {}));
13528
- var DropdownItemType$1 = DropdownItemType;
13529
-
13530
- /**
13531
- * A simple dropdown menu
13532
- * @author Alessandra De Lucas
13533
- * @author Yuen Ler Chow
13534
- * @author Gabe Abrams
13535
- */
13536
- /* ------------- Actions ------------ */
13537
- // Types of actions
13538
- var ActionType;
13539
- (function (ActionType) {
13540
- // Toggle opening the dropdown menu
13541
- ActionType["ToggleDropdown"] = "ToggleDropdown";
13542
- // Close the dropdown menu
13543
- ActionType["CloseDropdown"] = "CloseDropdown";
13544
- })(ActionType || (ActionType = {}));
13545
- /**
13546
- * Reducer that executes actions
13547
- * @author Alessandra De Lucas
13548
- * @author Yuen Ler Chow
13549
- * @param state current state
13550
- * @param action action to execute
13551
- */
13552
- const reducer$1 = (state, action) => {
13553
- switch (action.type) {
13554
- case ActionType.ToggleDropdown: {
13555
- return Object.assign(Object.assign({}, state), { isDropdownOpen: !state.isDropdownOpen });
13556
- }
13557
- case ActionType.CloseDropdown: {
13558
- return Object.assign(Object.assign({}, state), { isDropdownOpen: false });
13559
- }
13560
- default: {
13561
- return state;
13562
- }
13563
- }
13564
- };
13565
- /*------------------------------------------------------------------------*/
13566
- /* ------------------------------ Component ----------------------------- */
13567
- /*------------------------------------------------------------------------*/
13568
- const Dropdown = (props) => {
13569
- /*------------------------------------------------------------------------*/
13570
- /* -------------------------------- Setup ------------------------------- */
13571
- /*------------------------------------------------------------------------*/
13572
- /* -------------- Props ------------- */
13573
- // Destructure all props
13574
- const { dropdownButton, items, } = props;
13575
- /* -------------- State ------------- */
13576
- // Initial state
13577
- const initialState = {
13578
- isDropdownOpen: false,
13579
- };
13580
- // Initialize state
13581
- const [state, dispatch] = React.useReducer(reducer$1, initialState);
13582
- // Destructure common state
13583
- const { isDropdownOpen, } = state;
13584
- /* -------------- Refs -------------- */
13585
- // Initialize refs
13586
- const dropdownRef = React.useRef(null);
13587
- /*------------------------------------------------------------------------*/
13588
- /* ------------------------- Component Functions ------------------------ */
13589
- /*------------------------------------------------------------------------*/
13590
- /**
13591
- * Handle clicking outside of the dropdown menu to close it
13592
- * @author Yuen Ler Chow
13593
- * @param event the mouse event
13594
- */
13595
- const handleClickOutside = (event) => {
13596
- if (
13597
- // Dropdown has been rendered
13598
- dropdownRef.current
13599
- // Click occurred outside the dropdown
13600
- && !dropdownRef.current.contains(event.target)) {
13601
- dispatch({ type: ActionType.CloseDropdown });
13602
- }
13603
- };
13604
- /*------------------------------------------------------------------------*/
13605
- /* ------------------------- Lifecycle Functions ------------------------ */
13606
- /*------------------------------------------------------------------------*/
13607
- /**
13608
- * Mount
13609
- * @author Yuen Ler Chow
13610
- */
13611
- React.useEffect(() => {
13612
- // Add event listener to close dropdown when clicking outside
13613
- document.addEventListener('mousedown', handleClickOutside);
13614
- // Cleanup
13615
- return () => {
13616
- document.removeEventListener('mousedown', handleClickOutside);
13617
- };
13618
- }, []);
13619
- /*----------------------------------------*/
13620
- /* --------------- Main UI -------------- */
13621
- /*----------------------------------------*/
13622
- return (React__default["default"].createElement("div", { className: "dropdown", ref: dropdownRef, "data-bs-theme": isDarkModeOn() ? 'dark' : undefined },
13623
- React__default["default"].createElement("button", { className: combineClassNames([
13624
- 'btn dropdown-toggle border',
13625
- isDropdownOpen && 'show',
13626
- `btn-${dropdownButton.variant}`,
13627
- dropdownButton.variant === Variant$1.Light && 'text-dark',
13628
- ]), type: "button", id: dropdownButton.id, "aria-expanded": isDropdownOpen, "aria-label": dropdownButton.ariaLabel, onClick: () => {
13629
- dispatch({
13630
- type: ActionType.ToggleDropdown,
13631
- });
13632
- } }, dropdownButton.content),
13633
- React__default["default"].createElement("ul", { className: combineClassNames([
13634
- 'dropdown-menu',
13635
- isDarkModeOn() && 'dropdown-menu-dark',
13636
- isDropdownOpen && 'show',
13637
- ]) }, Object.values(items).map((item) => {
13638
- if (item.type === DropdownItemType$1.Header) {
13639
- return (
13640
- // TODO: Implement header
13641
- React__default["default"].createElement("span", null));
13642
- }
13643
- if (item.type === DropdownItemType$1.Divider) {
13644
- return (
13645
- // TODO: Implement divider
13646
- React__default["default"].createElement("span", null));
13647
- }
13648
- return (React__default["default"].createElement("li", { key: item.id },
13649
- React__default["default"].createElement("button", { type: "button", "aria-label": item.ariaLabel, className: "dropdown-item", onClick: (e) => {
13650
- e.preventDefault();
13651
- dispatch({
13652
- type: ActionType.CloseDropdown,
13653
- });
13654
- item.onClick();
13655
- } }, item.content)));
13656
- }))));
13657
- };
13658
-
13659
13533
  /**
13660
13534
  * One minute in ms
13661
13535
  * @author Gabe Abrams
@@ -15992,8 +15866,6 @@ exports.DBEntryFieldType = DBEntryFieldType$1;
15992
15866
  exports.DBEntryManagerPanel = DBEntryManagerPanel;
15993
15867
  exports.DayOfWeek = DayOfWeek$1;
15994
15868
  exports.Drawer = Drawer;
15995
- exports.Dropdown = Dropdown;
15996
- exports.DropdownItemType = DropdownItemType$1;
15997
15869
  exports.DynamicWord = DynamicWord;
15998
15870
  exports.ErrorBox = ErrorBox;
15999
15871
  exports.ErrorWithCode = ErrorWithCode;