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/esm/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import * as React from 'react';
2
2
  import React__default, { useState, useRef, useEffect, useReducer, forwardRef, useContext, useLayoutEffect, createContext, useMemo, useCallback, Component, Fragment } from 'react';
3
- import { faExclamationTriangle, faHourglassEnd, faCircle, faDotCircle, faCheckSquare, faHourglass, faClipboard, faChevronDown, faChevronRight, faCloudDownloadAlt, faMinus, faCheckCircle, faXmarkCircle, faSort, faSortDown, faSortUp, faCalendar, faTag, faHammer, faList, faTimes, faSave, faTrash, faCog, faPlus } from '@fortawesome/free-solid-svg-icons';
3
+ import { faExclamationTriangle, faCircle, faHourglassEnd, faDotCircle, faCheckSquare, faHourglass, faClipboard, faChevronDown, faChevronRight, faCloudDownloadAlt, faMinus, faCheckCircle, faXmarkCircle, faSort, faSortDown, faSortUp, faCalendar, faTag, faHammer, faList, faTimes, faSave, faTrash, faCog, faPlus } from '@fortawesome/free-solid-svg-icons';
4
4
  import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
5
5
  import ReactDOM, { createPortal } from 'react-dom';
6
6
  import { faCircle as faCircle$1, faSquareMinus, faSquare } from '@fortawesome/free-regular-svg-icons';
@@ -180,6 +180,98 @@ const LogBuiltInMetadata = {
180
180
  },
181
181
  };
182
182
 
183
+ /**
184
+ * Loading spinner/indicator
185
+ * @author Gabe Abrams
186
+ */
187
+ /*------------------------------------------------------------------------*/
188
+ /* -------------------------------- Style ------------------------------- */
189
+ /*------------------------------------------------------------------------*/
190
+ const style$a = `
191
+ /* Container fades in */
192
+ .LoadingSpinner-container {
193
+ animation-name: LoadingSpinner-container-fade-in;
194
+ animation-duration: 0.3s;
195
+ animation-delay: 0.4s;
196
+ animation-fill-mode: both;
197
+ animation-timing-function: ease-out;
198
+ }
199
+ @keyframes LoadingSpinner-container-fade-in {
200
+ 0% {
201
+ opacity: 0;
202
+ }
203
+ 100% {
204
+ opacity: 1;
205
+ }
206
+ }
207
+
208
+ /* Blips */
209
+ .LoadingSpinner-blip-1,
210
+ .LoadingSpinner-blip-2,
211
+ .LoadingSpinner-blip-3,
212
+ .LoadingSpinner-blip-4 {
213
+ font-size: 1.8rem;
214
+ opacity: 0.6;
215
+ margin-top: 1rem;
216
+ margin-bottom: 1rem;
217
+ }
218
+
219
+ /* First Blip */
220
+ .LoadingSpinner-blip-1 {
221
+ animation: LoadingSpinner-pop-animation 2s infinite;
222
+ }
223
+
224
+ /* Second Blip */
225
+ .LoadingSpinner-blip-2 {
226
+ animation: LoadingSpinner-pop-animation 2s infinite;
227
+ -webkit-animation-delay: 0.1s;
228
+ animation-delay: 0.1s;
229
+ }
230
+
231
+ /* Third Blip */
232
+ .LoadingSpinner-blip-3 {
233
+ animation: LoadingSpinner-pop-animation 2s infinite;
234
+ animation-delay: 0.2s;
235
+ }
236
+
237
+ /* Fourth Blip */
238
+ .LoadingSpinner-blip-4 {
239
+ animation: LoadingSpinner-pop-animation 2s infinite;
240
+ animation-delay: 0.3s;
241
+ }
242
+
243
+ /* Pop Animation for Each Blip */
244
+ @keyframes LoadingSpinner-pop-animation {
245
+ 0% {
246
+ transform: scale(1.0);
247
+ }
248
+ 10% {
249
+ transform: scale(1.5);
250
+ }
251
+ 30% {
252
+ transform: scale(1.0);
253
+ }
254
+ 100% {
255
+ transform: scale(1.0);
256
+ }
257
+ }
258
+ `;
259
+ /*------------------------------------------------------------------------*/
260
+ /* ------------------------------ Component ----------------------------- */
261
+ /*------------------------------------------------------------------------*/
262
+ const LoadingSpinner = () => {
263
+ /*------------------------------------------------------------------------*/
264
+ /* ------------------------------- Render ------------------------------- */
265
+ /*------------------------------------------------------------------------*/
266
+ // Add all four blips to a container
267
+ return (React__default.createElement("div", { className: "text-center LoadingSpinner LoadingSpinner-container" },
268
+ React__default.createElement("style", null, style$a),
269
+ React__default.createElement(FontAwesomeIcon, { icon: faCircle, className: "LoadingSpinner-blip-1 me-1" }),
270
+ React__default.createElement(FontAwesomeIcon, { icon: faCircle, className: "LoadingSpinner-blip-2 me-1" }),
271
+ React__default.createElement(FontAwesomeIcon, { icon: faCircle, className: "LoadingSpinner-blip-3 me-1" }),
272
+ React__default.createElement(FontAwesomeIcon, { icon: faCircle, className: "LoadingSpinner-blip-4" })));
273
+ };
274
+
183
275
  /**
184
276
  * Wait for a certain number of ms
185
277
  * @author Gabe Abrams
@@ -300,6 +392,7 @@ const BASE_Z_INDEX = 1000000000;
300
392
  const BASE_Z_INDEX_ON_TOP = 2000000000;
301
393
  // Constants
302
394
  const MS_TO_ANIMATE = 200; // Animation duration
395
+ const MS_TO_WAIT_BEFORE_SHOWING_LOADING_INDICATOR = 1000;
303
396
  // Modal type to list of buttons
304
397
  const modalTypeToModalButtonTypes = {
305
398
  [ModalType$1.Okay]: [
@@ -410,7 +503,7 @@ const getNextUniqueId = () => {
410
503
  /*------------------------------------------------------------------------*/
411
504
  /* -------------------------------- Style ------------------------------- */
412
505
  /*------------------------------------------------------------------------*/
413
- const style$a = `
506
+ const style$9 = `
414
507
  .Modal-backdrop {
415
508
  position: fixed;
416
509
  top: 0;
@@ -482,13 +575,14 @@ const Modal = (props) => {
482
575
  /*------------------------------------------------------------------------*/
483
576
  var _a;
484
577
  /* -------------- Props ------------- */
485
- const { type = ModalType$1.NoButtons, size = ModalSize$1.Large, title, largeTitle, children, onClose, dontAllowBackdropExit, dontShowXButton, onTopOfOtherModals, } = props;
578
+ const { type = ModalType$1.NoButtons, size = ModalSize$1.Large, title, largeTitle, children, onClose, dontAllowBackdropExit, dontShowXButton, onTopOfOtherModals, isLoading, isLoadingCancelable, } = props;
486
579
  // Determine if no header either
487
580
  const noHeader = (!title && type === ModalType$1.NoButtons);
488
581
  /* -------------- State ------------- */
489
582
  // True if animation is in use
490
583
  const [animatingIn, setAnimatingIn] = useState(true);
491
584
  const [animatingPop, setAnimatingPop] = useState(false);
585
+ const [showModal, setShowModal] = useState(false);
492
586
  /* -------------- Refs -------------- */
493
587
  // Keep track of whether modal is still mounted
494
588
  const mounted = useRef(false);
@@ -515,6 +609,14 @@ const Modal = (props) => {
515
609
  if (mounted.current) {
516
610
  setAnimatingIn(false);
517
611
  }
612
+ if (isLoading) {
613
+ // wait before showing modal
614
+ yield waitMs(MS_TO_WAIT_BEFORE_SHOWING_LOADING_INDICATOR);
615
+ setShowModal(true);
616
+ }
617
+ else {
618
+ setShowModal(true);
619
+ }
518
620
  }))();
519
621
  return () => {
520
622
  mounted.current = false;
@@ -581,6 +683,9 @@ const Modal = (props) => {
581
683
  else if (animatingPop) {
582
684
  animationClass = 'Modal-animating-pop';
583
685
  }
686
+ // default to show close button when not loading and not show close button when loading
687
+ // unless downShowXButton or isLoadingCancelable
688
+ const showCloseButton = onClose && !dontShowXButton && !(isLoading && !isLoadingCancelable);
584
689
  // Render the modal
585
690
  const contentToRender = (React__default.createElement("div", { className: "modal show", tabIndex: -1, style: {
586
691
  zIndex: baseZIndex,
@@ -589,7 +694,7 @@ const Modal = (props) => {
589
694
  left: 0,
590
695
  right: 0,
591
696
  } },
592
- React__default.createElement("style", null, style$a),
697
+ React__default.createElement("style", null, style$9),
593
698
  React__default.createElement("div", { className: `Modal-backdrop ${backdropAnimationClass}`, style: {
594
699
  zIndex: baseZIndex + 1,
595
700
  }, onClick: () => __awaiter(void 0, void 0, void 0, function* () {
@@ -607,11 +712,11 @@ const Modal = (props) => {
607
712
  // Handle close
608
713
  handleClose(ModalButtonType$1.Cancel);
609
714
  }) }),
610
- React__default.createElement("div", { className: `modal-dialog modal-${size} ${animationClass} modal-dialog-scrollable modal-dialog-centered`, style: {
715
+ showModal && (React__default.createElement("div", { className: `modal-dialog modal-${size} ${animationClass} modal-dialog-scrollable modal-dialog-centered`, style: {
611
716
  zIndex: baseZIndex + 2,
612
717
  // Override sizes for even larger for XL
613
718
  width: (size === ModalSize$1.ExtraLarge
614
- ? 'calc(100vw - 1rem)'
719
+ ? 'calc(100vw - 3rem)'
615
720
  : undefined),
616
721
  maxWidth: (size === ModalSize$1.ExtraLarge
617
722
  ? '80rem'
@@ -639,7 +744,7 @@ const Modal = (props) => {
639
744
  ? '1.6rem'
640
745
  : undefined),
641
746
  } }, title),
642
- (onClose && !dontShowXButton) && (React__default.createElement("button", { type: "button", className: "Modal-x-button btn-close", "aria-label": "Close", style: {
747
+ showCloseButton && (React__default.createElement("button", { type: "button", className: "Modal-x-button btn-close", "aria-label": "Close", style: {
643
748
  backgroundColor: (isDarkModeOn()
644
749
  ? 'white'
645
750
  : undefined),
@@ -647,14 +752,16 @@ const Modal = (props) => {
647
752
  // Handle close
648
753
  handleClose(ModalButtonType$1.Cancel);
649
754
  } })))),
650
- children && (React__default.createElement("div", { className: "modal-body", style: {
755
+ React__default.createElement("div", { className: "modal-body", style: {
651
756
  color: (isDarkModeOn()
652
757
  ? 'white'
653
758
  : undefined),
654
759
  backgroundColor: (isDarkModeOn()
655
760
  ? '#444'
656
761
  : undefined),
657
- } }, children)),
762
+ } }, isLoading && !children ? (React__default.createElement(React__default.Fragment, null,
763
+ React__default.createElement(LoadingSpinner, null),
764
+ React__default.createElement("span", { className: "sr-only" }, "Content loading"))) : (children)),
658
765
  footer && (React__default.createElement("div", { className: "modal-footer pt-1 pb-1", style: {
659
766
  color: (isDarkModeOn()
660
767
  ? 'white'
@@ -665,7 +772,7 @@ const Modal = (props) => {
665
772
  borderTop: (isDarkModeOn()
666
773
  ? '0.1rem solid gray'
667
774
  : undefined),
668
- } }, footer))))));
775
+ } }, footer)))))));
669
776
  // Determine which portal to use
670
777
  const portalNumber = id.current % NUM_MODAL_PORTALS;
671
778
  // Render in a portal
@@ -1145,7 +1252,7 @@ const showSessionExpiredMessage = () => __awaiter(void 0, void 0, void 0, functi
1145
1252
  /*------------------------------------------------------------------------*/
1146
1253
  /* -------------------------------- Style ------------------------------- */
1147
1254
  /*------------------------------------------------------------------------*/
1148
- const style$9 = `
1255
+ const style$8 = `
1149
1256
  .AppWrapper-leave-to-url-notice {
1150
1257
  opacity: 0;
1151
1258
 
@@ -1320,105 +1427,13 @@ const AppWrapper = (props) => {
1320
1427
  /* --------------- Main UI -------------- */
1321
1428
  /*----------------------------------------*/
1322
1429
  return (React__default.createElement(React__default.Fragment, null,
1323
- React__default.createElement("style", null, style$9),
1430
+ React__default.createElement("style", null, style$8),
1324
1431
  React__default.createElement("style", null, tooltipStyle),
1325
1432
  modal,
1326
1433
  customModalPortals,
1327
1434
  body));
1328
1435
  };
1329
1436
 
1330
- /**
1331
- * Loading spinner/indicator
1332
- * @author Gabe Abrams
1333
- */
1334
- /*------------------------------------------------------------------------*/
1335
- /* -------------------------------- Style ------------------------------- */
1336
- /*------------------------------------------------------------------------*/
1337
- const style$8 = `
1338
- /* Container fades in */
1339
- .LoadingSpinner-container {
1340
- animation-name: LoadingSpinner-container-fade-in;
1341
- animation-duration: 0.3s;
1342
- animation-delay: 0.4s;
1343
- animation-fill-mode: both;
1344
- animation-timing-function: ease-out;
1345
- }
1346
- @keyframes LoadingSpinner-container-fade-in {
1347
- 0% {
1348
- opacity: 0;
1349
- }
1350
- 100% {
1351
- opacity: 1;
1352
- }
1353
- }
1354
-
1355
- /* Blips */
1356
- .LoadingSpinner-blip-1,
1357
- .LoadingSpinner-blip-2,
1358
- .LoadingSpinner-blip-3,
1359
- .LoadingSpinner-blip-4 {
1360
- font-size: 1.8rem;
1361
- opacity: 0.6;
1362
- margin-top: 1rem;
1363
- margin-bottom: 1rem;
1364
- }
1365
-
1366
- /* First Blip */
1367
- .LoadingSpinner-blip-1 {
1368
- animation: LoadingSpinner-pop-animation 2s infinite;
1369
- }
1370
-
1371
- /* Second Blip */
1372
- .LoadingSpinner-blip-2 {
1373
- animation: LoadingSpinner-pop-animation 2s infinite;
1374
- -webkit-animation-delay: 0.1s;
1375
- animation-delay: 0.1s;
1376
- }
1377
-
1378
- /* Third Blip */
1379
- .LoadingSpinner-blip-3 {
1380
- animation: LoadingSpinner-pop-animation 2s infinite;
1381
- animation-delay: 0.2s;
1382
- }
1383
-
1384
- /* Fourth Blip */
1385
- .LoadingSpinner-blip-4 {
1386
- animation: LoadingSpinner-pop-animation 2s infinite;
1387
- animation-delay: 0.3s;
1388
- }
1389
-
1390
- /* Pop Animation for Each Blip */
1391
- @keyframes LoadingSpinner-pop-animation {
1392
- 0% {
1393
- transform: scale(1.0);
1394
- }
1395
- 10% {
1396
- transform: scale(1.5);
1397
- }
1398
- 30% {
1399
- transform: scale(1.0);
1400
- }
1401
- 100% {
1402
- transform: scale(1.0);
1403
- }
1404
- }
1405
- `;
1406
- /*------------------------------------------------------------------------*/
1407
- /* ------------------------------ Component ----------------------------- */
1408
- /*------------------------------------------------------------------------*/
1409
- const LoadingSpinner = () => {
1410
- /*------------------------------------------------------------------------*/
1411
- /* ------------------------------- Render ------------------------------- */
1412
- /*------------------------------------------------------------------------*/
1413
- // Add all four blips to a container
1414
- return (React__default.createElement("div", { className: "text-center LoadingSpinner LoadingSpinner-container" },
1415
- React__default.createElement("style", null, style$8),
1416
- React__default.createElement(FontAwesomeIcon, { icon: faCircle, className: "LoadingSpinner-blip-1 me-1" }),
1417
- React__default.createElement(FontAwesomeIcon, { icon: faCircle, className: "LoadingSpinner-blip-2 me-1" }),
1418
- React__default.createElement(FontAwesomeIcon, { icon: faCircle, className: "LoadingSpinner-blip-3 me-1" }),
1419
- React__default.createElement(FontAwesomeIcon, { icon: faCircle, className: "LoadingSpinner-blip-4" })));
1420
- };
1421
-
1422
1437
  /**
1423
1438
  * A box with a tab on the top that holds buttons and other content
1424
1439
  * @author Gabe Abrams
@@ -2210,27 +2225,27 @@ const PopPendingMark = (props) => {
2210
2225
  */
2211
2226
  /* ------------- Actions ------------ */
2212
2227
  // Types of actions
2213
- var ActionType$9;
2228
+ var ActionType$8;
2214
2229
  (function (ActionType) {
2215
2230
  // Indicate that the text was recently copied
2216
2231
  ActionType["IndicateRecentlyCopied"] = "indicate-recently-copied";
2217
2232
  // Clear the status
2218
2233
  ActionType["ClearRecentlyCopiedStatus"] = "clear-recently-copied-status";
2219
- })(ActionType$9 || (ActionType$9 = {}));
2234
+ })(ActionType$8 || (ActionType$8 = {}));
2220
2235
  /**
2221
2236
  * Reducer that executes actions
2222
2237
  * @author Gabe Abrams
2223
2238
  * @param state current state
2224
2239
  * @param action action to execute
2225
2240
  */
2226
- const reducer$a = (state, action) => {
2241
+ const reducer$9 = (state, action) => {
2227
2242
  switch (action.type) {
2228
- case ActionType$9.IndicateRecentlyCopied: {
2243
+ case ActionType$8.IndicateRecentlyCopied: {
2229
2244
  return {
2230
2245
  recentlyCopied: true,
2231
2246
  };
2232
2247
  }
2233
- case ActionType$9.ClearRecentlyCopiedStatus: {
2248
+ case ActionType$8.ClearRecentlyCopiedStatus: {
2234
2249
  return {
2235
2250
  recentlyCopied: false,
2236
2251
  };
@@ -2256,7 +2271,7 @@ const CopiableBox = (props) => {
2256
2271
  recentlyCopied: false,
2257
2272
  };
2258
2273
  // Initialize state
2259
- const [state, dispatch] = useReducer(reducer$a, initialState);
2274
+ const [state, dispatch] = useReducer(reducer$9, initialState);
2260
2275
  // Destructure common state
2261
2276
  const { recentlyCopied, } = state;
2262
2277
  /*------------------------------------------------------------------------*/
@@ -2276,13 +2291,13 @@ const CopiableBox = (props) => {
2276
2291
  }
2277
2292
  // Show copied notice
2278
2293
  dispatch({
2279
- type: ActionType$9.IndicateRecentlyCopied,
2294
+ type: ActionType$8.IndicateRecentlyCopied,
2280
2295
  });
2281
2296
  // Wait a moment
2282
2297
  yield waitMs(4000);
2283
2298
  // Hide copied notice
2284
2299
  dispatch({
2285
- type: ActionType$9.ClearRecentlyCopiedStatus,
2300
+ type: ActionType$8.ClearRecentlyCopiedStatus,
2286
2301
  });
2287
2302
  });
2288
2303
  /*------------------------------------------------------------------------*/
@@ -2338,20 +2353,20 @@ const CopiableBox = (props) => {
2338
2353
  */
2339
2354
  /* ------------- Actions ------------ */
2340
2355
  // Types of actions
2341
- var ActionType$8;
2356
+ var ActionType$7;
2342
2357
  (function (ActionType) {
2343
2358
  // Toggle whether a child are being shown
2344
2359
  ActionType["ToggleChild"] = "toggle-child";
2345
- })(ActionType$8 || (ActionType$8 = {}));
2360
+ })(ActionType$7 || (ActionType$7 = {}));
2346
2361
  /**
2347
2362
  * Reducer that executes actions
2348
2363
  * @author Gabe Abrams
2349
2364
  * @param state current state
2350
2365
  * @param action action to execute
2351
2366
  */
2352
- const reducer$9 = (state, action) => {
2367
+ const reducer$8 = (state, action) => {
2353
2368
  switch (action.type) {
2354
- case ActionType$8.ToggleChild: {
2369
+ case ActionType$7.ToggleChild: {
2355
2370
  return Object.assign(Object.assign({}, state), { childExpanded: Object.assign(Object.assign({}, state.childExpanded), { [String(action.id)]: !state.childExpanded[String(action.id)] }) });
2356
2371
  }
2357
2372
  default: {
@@ -2380,7 +2395,7 @@ const NestableItemList = (props) => {
2380
2395
  childExpanded: initChildExpanded,
2381
2396
  };
2382
2397
  // Initialize state
2383
- const [state, dispatch] = useReducer(reducer$9, initialState);
2398
+ const [state, dispatch] = useReducer(reducer$8, initialState);
2384
2399
  // Destructure common state
2385
2400
  const { childExpanded, } = state;
2386
2401
  /*------------------------------------------------------------------------*/
@@ -2470,7 +2485,7 @@ const NestableItemList = (props) => {
2470
2485
  backgroundColor: 'transparent',
2471
2486
  }, type: "button", onClick: () => {
2472
2487
  dispatch({
2473
- type: ActionType$8.ToggleChild,
2488
+ type: ActionType$7.ToggleChild,
2474
2489
  id: item.id,
2475
2490
  });
2476
2491
  }, "aria-label": `${childExpanded[item.id] ? 'Hide' : 'Show'} items in ${item.name}` },
@@ -2754,7 +2769,7 @@ var SortType;
2754
2769
  })(SortType || (SortType = {}));
2755
2770
  /* ------------- Actions ------------ */
2756
2771
  // Types of actions
2757
- var ActionType$7;
2772
+ var ActionType$6;
2758
2773
  (function (ActionType) {
2759
2774
  // Toggle sort column param
2760
2775
  ActionType["ToggleSortColumn"] = "toggle-sort-column";
@@ -2766,16 +2781,16 @@ var ActionType$7;
2766
2781
  ActionType["ShowAllColumns"] = "show-all-columns";
2767
2782
  // Hide all columns
2768
2783
  ActionType["HideAllColumns"] = "hide-all-columns";
2769
- })(ActionType$7 || (ActionType$7 = {}));
2784
+ })(ActionType$6 || (ActionType$6 = {}));
2770
2785
  /**
2771
2786
  * Reducer that executes actions
2772
2787
  * @author Gabe Abrams
2773
2788
  * @param state current state
2774
2789
  * @param action action to execute
2775
2790
  */
2776
- const reducer$8 = (state, action) => {
2791
+ const reducer$7 = (state, action) => {
2777
2792
  switch (action.type) {
2778
- case ActionType$7.ToggleSortColumn: {
2793
+ case ActionType$6.ToggleSortColumn: {
2779
2794
  if (action.param !== state.sortColumnParam) {
2780
2795
  // Different column param
2781
2796
  return Object.assign(Object.assign({}, state), { sortColumnParam: action.param, sortType: SortType.Ascending });
@@ -2787,22 +2802,22 @@ const reducer$8 = (state, action) => {
2787
2802
  // Stop sorting by column
2788
2803
  return Object.assign(Object.assign({}, state), { sortColumnParam: undefined, sortType: SortType.Ascending });
2789
2804
  }
2790
- case ActionType$7.UpdateColumnVisibility: {
2805
+ case ActionType$6.UpdateColumnVisibility: {
2791
2806
  const { columnVisibilityMap } = state;
2792
2807
  columnVisibilityMap[action.param] = action.visible;
2793
2808
  return Object.assign(Object.assign({}, state), { columnVisibilityMap });
2794
2809
  }
2795
- case ActionType$7.ToggleColVisCusModalVisibility: {
2810
+ case ActionType$6.ToggleColVisCusModalVisibility: {
2796
2811
  return Object.assign(Object.assign({}, state), { columnVisibilityCustomizationModalVisible: !state.columnVisibilityCustomizationModalVisible });
2797
2812
  }
2798
- case ActionType$7.ShowAllColumns: {
2813
+ case ActionType$6.ShowAllColumns: {
2799
2814
  const { columnVisibilityMap } = state;
2800
2815
  Object.keys(columnVisibilityMap).forEach((param) => {
2801
2816
  columnVisibilityMap[param] = true;
2802
2817
  });
2803
2818
  return Object.assign(Object.assign({}, state), { columnVisibilityMap });
2804
2819
  }
2805
- case ActionType$7.HideAllColumns: {
2820
+ case ActionType$6.HideAllColumns: {
2806
2821
  const { columnVisibilityMap } = state;
2807
2822
  Object.keys(columnVisibilityMap).forEach((param) => {
2808
2823
  columnVisibilityMap[param] = false;
@@ -2849,7 +2864,7 @@ const IntelliTable = (props) => {
2849
2864
  columnVisibilityCustomizationModalVisible: false,
2850
2865
  };
2851
2866
  // Initialize state
2852
- const [state, dispatch] = useReducer(reducer$8, initialState);
2867
+ const [state, dispatch] = useReducer(reducer$7, initialState);
2853
2868
  // Destructure common state
2854
2869
  const { sortColumnParam, sortType, columnVisibilityMap, columnVisibilityCustomizationModalVisible, } = state;
2855
2870
  /*------------------------------------------------------------------------*/
@@ -2872,13 +2887,13 @@ const IntelliTable = (props) => {
2872
2887
  return alert('Choose at least one column', 'To continue, you have to choose at least one column to show');
2873
2888
  }
2874
2889
  dispatch({
2875
- type: ActionType$7.ToggleColVisCusModalVisibility,
2890
+ type: ActionType$6.ToggleColVisCusModalVisibility,
2876
2891
  });
2877
2892
  }, okayVariant: Variant$1.Light },
2878
2893
  columns.map((column) => {
2879
2894
  return (React__default.createElement(CheckboxButton, { key: column.param, id: `IntelliTable-${id}-toggle-visibility-${column.param}`, className: "mb-2", text: column.title, onChanged: (checked) => {
2880
2895
  dispatch({
2881
- type: ActionType$7.UpdateColumnVisibility,
2896
+ type: ActionType$6.UpdateColumnVisibility,
2882
2897
  param: column.param,
2883
2898
  visible: checked,
2884
2899
  });
@@ -2887,12 +2902,12 @@ const IntelliTable = (props) => {
2887
2902
  React__default.createElement("div", { className: "mt-3" }, "Or you can:"),
2888
2903
  React__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: () => {
2889
2904
  dispatch({
2890
- type: ActionType$7.ShowAllColumns,
2905
+ type: ActionType$6.ShowAllColumns,
2891
2906
  });
2892
2907
  } }, "Select All"),
2893
2908
  React__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: () => {
2894
2909
  dispatch({
2895
- type: ActionType$7.HideAllColumns,
2910
+ type: ActionType$6.HideAllColumns,
2896
2911
  });
2897
2912
  } }, "Deselect All")));
2898
2913
  }
@@ -2943,7 +2958,7 @@ const IntelliTable = (props) => {
2943
2958
  React__default.createElement("div", null,
2944
2959
  React__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: () => {
2945
2960
  dispatch({
2946
- type: ActionType$7.ToggleSortColumn,
2961
+ type: ActionType$6.ToggleSortColumn,
2947
2962
  param: column.param,
2948
2963
  });
2949
2964
  } },
@@ -3132,7 +3147,7 @@ const IntelliTable = (props) => {
3132
3147
  React__default.createElement(CSVDownloadButton, { "aria-label": `download data as csv for ${title}`, id: `IntelliTable-${id}-download-as-csv`, filename: filename, csv: csv }),
3133
3148
  React__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: () => {
3134
3149
  dispatch({
3135
- type: ActionType$7.ToggleColVisCusModalVisibility,
3150
+ type: ActionType$6.ToggleColVisCusModalVisibility,
3136
3151
  });
3137
3152
  } },
3138
3153
  "Show/Hide Cols",
@@ -3498,7 +3513,7 @@ const genHumanReadableName = (machineReadableName) => {
3498
3513
  };
3499
3514
  /* ------------- Actions ------------ */
3500
3515
  // Types of actions
3501
- var ActionType$6;
3516
+ var ActionType$5;
3502
3517
  (function (ActionType) {
3503
3518
  // Show the loading bar
3504
3519
  ActionType["StartLoading"] = "start-loading";
@@ -3520,45 +3535,45 @@ var ActionType$6;
3520
3535
  ActionType["UpdateActionErrorFilterState"] = "update-action-error-filter-state";
3521
3536
  // Update the advanced filter state
3522
3537
  ActionType["UpdateAdvancedFilterState"] = "update-advanced-filter-state";
3523
- })(ActionType$6 || (ActionType$6 = {}));
3538
+ })(ActionType$5 || (ActionType$5 = {}));
3524
3539
  /**
3525
3540
  * Reducer that executes actions
3526
3541
  * @author Gabe Abrams
3527
3542
  * @param state current state
3528
3543
  * @param action action to execute
3529
3544
  */
3530
- const reducer$7 = (state, action) => {
3545
+ const reducer$6 = (state, action) => {
3531
3546
  switch (action.type) {
3532
- case ActionType$6.StartLoading: {
3547
+ case ActionType$5.StartLoading: {
3533
3548
  return Object.assign(Object.assign({}, state), { loading: true });
3534
3549
  }
3535
- case ActionType$6.FinishLoading: {
3550
+ case ActionType$5.FinishLoading: {
3536
3551
  return Object.assign(Object.assign({}, state), { loading: false, logMap: action.logMap });
3537
3552
  }
3538
- case ActionType$6.ToggleFilterDrawer: {
3553
+ case ActionType$5.ToggleFilterDrawer: {
3539
3554
  return Object.assign(Object.assign({}, state), { expandedFilterDrawer: (state.expandedFilterDrawer === action.filterDrawer
3540
3555
  ? undefined // hide
3541
3556
  : action.filterDrawer) });
3542
3557
  }
3543
- case ActionType$6.HideFilterDrawer: {
3558
+ case ActionType$5.HideFilterDrawer: {
3544
3559
  return Object.assign(Object.assign({}, state), { expandedFilterDrawer: undefined });
3545
3560
  }
3546
- case ActionType$6.ResetFilters: {
3561
+ case ActionType$5.ResetFilters: {
3547
3562
  return Object.assign(Object.assign({}, state), { dateFilterState: action.initDateFilterState, contextFilterState: action.initContextFilterState, tagFilterState: action.initTagFilterState, actionErrorFilterState: action.initActionErrorFilterState, advancedFilterState: action.initAdvancedFilterState });
3548
3563
  }
3549
- case ActionType$6.UpdateDateFilterState: {
3564
+ case ActionType$5.UpdateDateFilterState: {
3550
3565
  return Object.assign(Object.assign({}, state), { dateFilterState: action.dateFilterState });
3551
3566
  }
3552
- case ActionType$6.UpdateContextFilterState: {
3567
+ case ActionType$5.UpdateContextFilterState: {
3553
3568
  return Object.assign(Object.assign({}, state), { contextFilterState: action.contextFilterState });
3554
3569
  }
3555
- case ActionType$6.UpdateTagFilterState: {
3570
+ case ActionType$5.UpdateTagFilterState: {
3556
3571
  return Object.assign(Object.assign({}, state), { tagFilterState: action.tagFilterState });
3557
3572
  }
3558
- case ActionType$6.UpdateActionErrorFilterState: {
3573
+ case ActionType$5.UpdateActionErrorFilterState: {
3559
3574
  return Object.assign(Object.assign({}, state), { actionErrorFilterState: action.actionErrorFilterState });
3560
3575
  }
3561
- case ActionType$6.UpdateAdvancedFilterState: {
3576
+ case ActionType$5.UpdateAdvancedFilterState: {
3562
3577
  return Object.assign(Object.assign({}, state), { advancedFilterState: action.advancedFilterState });
3563
3578
  }
3564
3579
  default: {
@@ -3687,7 +3702,7 @@ const LogReviewer = (props) => {
3687
3702
  advancedFilterState: initAdvancedFilterState,
3688
3703
  };
3689
3704
  // Initialize state
3690
- const [state, dispatch] = useReducer(reducer$7, initialState);
3705
+ const [state, dispatch] = useReducer(reducer$6, initialState);
3691
3706
  // Destructure common state
3692
3707
  const { loading, logMap, expandedFilterDrawer, dateFilterState, contextFilterState, tagFilterState, actionErrorFilterState, advancedFilterState, } = state;
3693
3708
  /*------------------------------------------------------------------------*/
@@ -3737,7 +3752,7 @@ const LogReviewer = (props) => {
3737
3752
  const handleDateRangeUpdated = (newDateFilterState) => __awaiter(void 0, void 0, void 0, function* () {
3738
3753
  // Update state
3739
3754
  dispatch({
3740
- type: ActionType$6.UpdateDateFilterState,
3755
+ type: ActionType$5.UpdateDateFilterState,
3741
3756
  dateFilterState: newDateFilterState,
3742
3757
  });
3743
3758
  // Check which year/month combos we need to load
@@ -3748,7 +3763,7 @@ const LogReviewer = (props) => {
3748
3763
  }
3749
3764
  // Start loading
3750
3765
  dispatch({
3751
- type: ActionType$6.StartLoading,
3766
+ type: ActionType$5.StartLoading,
3752
3767
  });
3753
3768
  // Load required months
3754
3769
  try {
@@ -3772,7 +3787,7 @@ const LogReviewer = (props) => {
3772
3787
  }
3773
3788
  // Finish loading
3774
3789
  dispatch({
3775
- type: ActionType$6.FinishLoading,
3790
+ type: ActionType$5.FinishLoading,
3776
3791
  logMap,
3777
3792
  });
3778
3793
  });
@@ -3811,7 +3826,7 @@ const LogReviewer = (props) => {
3811
3826
  React__default.createElement("div", { className: "LogReviewer-filter-toggle-buttons alert alert-secondary p-2 m-0" },
3812
3827
  React__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: () => {
3813
3828
  dispatch({
3814
- type: ActionType$6.ToggleFilterDrawer,
3829
+ type: ActionType$5.ToggleFilterDrawer,
3815
3830
  filterDrawer: FilterDrawer.Date,
3816
3831
  });
3817
3832
  } },
@@ -3819,7 +3834,7 @@ const LogReviewer = (props) => {
3819
3834
  "Date"),
3820
3835
  React__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: () => {
3821
3836
  dispatch({
3822
- type: ActionType$6.ToggleFilterDrawer,
3837
+ type: ActionType$5.ToggleFilterDrawer,
3823
3838
  filterDrawer: FilterDrawer.Context,
3824
3839
  });
3825
3840
  } },
@@ -3827,7 +3842,7 @@ const LogReviewer = (props) => {
3827
3842
  "Context"),
3828
3843
  (LogMetadata.Tag && Object.keys(LogMetadata.Tag).length > 0) && (React__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: () => {
3829
3844
  dispatch({
3830
- type: ActionType$6.ToggleFilterDrawer,
3845
+ type: ActionType$5.ToggleFilterDrawer,
3831
3846
  filterDrawer: FilterDrawer.Tag,
3832
3847
  });
3833
3848
  } },
@@ -3835,7 +3850,7 @@ const LogReviewer = (props) => {
3835
3850
  "Tag")),
3836
3851
  React__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: () => {
3837
3852
  dispatch({
3838
- type: ActionType$6.ToggleFilterDrawer,
3853
+ type: ActionType$5.ToggleFilterDrawer,
3839
3854
  filterDrawer: FilterDrawer.Action,
3840
3855
  });
3841
3856
  } },
@@ -3843,7 +3858,7 @@ const LogReviewer = (props) => {
3843
3858
  "Action"),
3844
3859
  React__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: () => {
3845
3860
  dispatch({
3846
- type: ActionType$6.ToggleFilterDrawer,
3861
+ type: ActionType$5.ToggleFilterDrawer,
3847
3862
  filterDrawer: FilterDrawer.Advanced,
3848
3863
  });
3849
3864
  } },
@@ -3851,7 +3866,7 @@ const LogReviewer = (props) => {
3851
3866
  "Advanced"),
3852
3867
  React__default.createElement("button", { type: "button", id: "LogReviewer-reset-filters-button", className: "btn btn-light", "aria-label": "reset filters", onClick: () => {
3853
3868
  dispatch({
3854
- type: ActionType$6.ResetFilters,
3869
+ type: ActionType$5.ResetFilters,
3855
3870
  initActionErrorFilterState,
3856
3871
  initAdvancedFilterState,
3857
3872
  initContextFilterState,
@@ -3973,7 +3988,7 @@ const LogReviewer = (props) => {
3973
3988
  }
3974
3989
  });
3975
3990
  dispatch({
3976
- type: ActionType$6.UpdateContextFilterState,
3991
+ type: ActionType$5.UpdateContextFilterState,
3977
3992
  contextFilterState,
3978
3993
  });
3979
3994
  } }));
@@ -3988,7 +4003,7 @@ const LogReviewer = (props) => {
3988
4003
  return (React__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) => {
3989
4004
  tagFilterState[tag] = checked;
3990
4005
  dispatch({
3991
- type: ActionType$6.UpdateTagFilterState,
4006
+ type: ActionType$5.UpdateTagFilterState,
3992
4007
  tagFilterState,
3993
4008
  });
3994
4009
  } }));
@@ -4001,21 +4016,21 @@ const LogReviewer = (props) => {
4001
4016
  React__default.createElement(RadioButton, { id: "LogReviewer-type-all", text: "All Logs", onSelected: () => {
4002
4017
  actionErrorFilterState.type = undefined;
4003
4018
  dispatch({
4004
- type: ActionType$6.UpdateActionErrorFilterState,
4019
+ type: ActionType$5.UpdateActionErrorFilterState,
4005
4020
  actionErrorFilterState,
4006
4021
  });
4007
4022
  }, ariaLabel: "show logs of all types", selected: actionErrorFilterState.type === undefined }),
4008
4023
  React__default.createElement(RadioButton, { id: "LogReviewer-type-action-only", text: "Action Logs Only", onSelected: () => {
4009
4024
  actionErrorFilterState.type = LogType$1.Action;
4010
4025
  dispatch({
4011
- type: ActionType$6.UpdateActionErrorFilterState,
4026
+ type: ActionType$5.UpdateActionErrorFilterState,
4012
4027
  actionErrorFilterState,
4013
4028
  });
4014
4029
  }, ariaLabel: "only show action logs", selected: actionErrorFilterState.type === LogType$1.Action }),
4015
4030
  React__default.createElement(RadioButton, { id: "LogReviewer-type-error-only", text: "Action Error Only", onSelected: () => {
4016
4031
  actionErrorFilterState.type = LogType$1.Error;
4017
4032
  dispatch({
4018
- type: ActionType$6.UpdateActionErrorFilterState,
4033
+ type: ActionType$5.UpdateActionErrorFilterState,
4019
4034
  actionErrorFilterState,
4020
4035
  });
4021
4036
  }, ariaLabel: "only show error logs", selected: actionErrorFilterState.type === LogType$1.Error, noMarginOnRight: true })),
@@ -4027,7 +4042,7 @@ const LogReviewer = (props) => {
4027
4042
  return (React__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) => {
4028
4043
  actionErrorFilterState.action[action] = checked;
4029
4044
  dispatch({
4030
- type: ActionType$6.UpdateActionErrorFilterState,
4045
+ type: ActionType$5.UpdateActionErrorFilterState,
4031
4046
  actionErrorFilterState,
4032
4047
  });
4033
4048
  } }));
@@ -4038,7 +4053,7 @@ const LogReviewer = (props) => {
4038
4053
  return (React__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) => {
4039
4054
  actionErrorFilterState.target[target] = checked;
4040
4055
  dispatch({
4041
- type: ActionType$6.UpdateActionErrorFilterState,
4056
+ type: ActionType$5.UpdateActionErrorFilterState,
4042
4057
  actionErrorFilterState,
4043
4058
  });
4044
4059
  } }));
@@ -4050,7 +4065,7 @@ const LogReviewer = (props) => {
4050
4065
  React__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) => {
4051
4066
  actionErrorFilterState.errorMessage = e.target.value;
4052
4067
  dispatch({
4053
- type: ActionType$6.UpdateActionErrorFilterState,
4068
+ type: ActionType$5.UpdateActionErrorFilterState,
4054
4069
  actionErrorFilterState,
4055
4070
  });
4056
4071
  } })),
@@ -4061,7 +4076,7 @@ const LogReviewer = (props) => {
4061
4076
  .trim()
4062
4077
  .toUpperCase());
4063
4078
  dispatch({
4064
- type: ActionType$6.UpdateActionErrorFilterState,
4079
+ type: ActionType$5.UpdateActionErrorFilterState,
4065
4080
  actionErrorFilterState,
4066
4081
  });
4067
4082
  } }))))));
@@ -4075,7 +4090,7 @@ const LogReviewer = (props) => {
4075
4090
  React__default.createElement("input", { type: "text", className: "form-control", "aria-label": "query for user first name", value: advancedFilterState.userFirstName, placeholder: "e.g. Divardo", onChange: (e) => {
4076
4091
  advancedFilterState.userFirstName = e.target.value;
4077
4092
  dispatch({
4078
- type: ActionType$6.UpdateAdvancedFilterState,
4093
+ type: ActionType$5.UpdateAdvancedFilterState,
4079
4094
  advancedFilterState,
4080
4095
  });
4081
4096
  } })),
@@ -4084,7 +4099,7 @@ const LogReviewer = (props) => {
4084
4099
  React__default.createElement("input", { type: "text", className: "form-control", "aria-label": "query for user last name", value: advancedFilterState.userLastName, placeholder: "e.g. Calicci", onChange: (e) => {
4085
4100
  advancedFilterState.userLastName = e.target.value;
4086
4101
  dispatch({
4087
- type: ActionType$6.UpdateAdvancedFilterState,
4102
+ type: ActionType$5.UpdateAdvancedFilterState,
4088
4103
  advancedFilterState,
4089
4104
  });
4090
4105
  } })),
@@ -4094,7 +4109,7 @@ const LogReviewer = (props) => {
4094
4109
  advancedFilterState.userEmail = ((e.target.value)
4095
4110
  .trim());
4096
4111
  dispatch({
4097
- type: ActionType$6.UpdateAdvancedFilterState,
4112
+ type: ActionType$5.UpdateAdvancedFilterState,
4098
4113
  advancedFilterState,
4099
4114
  });
4100
4115
  } })),
@@ -4108,7 +4123,7 @@ const LogReviewer = (props) => {
4108
4123
  .trim());
4109
4124
  }
4110
4125
  dispatch({
4111
- type: ActionType$6.UpdateAdvancedFilterState,
4126
+ type: ActionType$5.UpdateAdvancedFilterState,
4112
4127
  advancedFilterState,
4113
4128
  });
4114
4129
  } })),
@@ -4116,21 +4131,21 @@ const LogReviewer = (props) => {
4116
4131
  React__default.createElement(CheckboxButton, { text: "Students", onChanged: (checked) => {
4117
4132
  advancedFilterState.includeLearners = checked;
4118
4133
  dispatch({
4119
- type: ActionType$6.UpdateAdvancedFilterState,
4134
+ type: ActionType$5.UpdateAdvancedFilterState,
4120
4135
  advancedFilterState,
4121
4136
  });
4122
4137
  }, checked: advancedFilterState.includeLearners, ariaLabel: "show logs from students" }),
4123
4138
  React__default.createElement(CheckboxButton, { text: "Teaching Team Members", onChanged: (checked) => {
4124
4139
  advancedFilterState.includeTTMs = checked;
4125
4140
  dispatch({
4126
- type: ActionType$6.UpdateAdvancedFilterState,
4141
+ type: ActionType$5.UpdateAdvancedFilterState,
4127
4142
  advancedFilterState,
4128
4143
  });
4129
4144
  }, checked: advancedFilterState.includeTTMs, ariaLabel: "show logs from teaching team members" }),
4130
4145
  React__default.createElement(CheckboxButton, { text: "Admins", onChanged: (checked) => {
4131
4146
  advancedFilterState.includeAdmins = checked;
4132
4147
  dispatch({
4133
- type: ActionType$6.UpdateAdvancedFilterState,
4148
+ type: ActionType$5.UpdateAdvancedFilterState,
4134
4149
  advancedFilterState,
4135
4150
  });
4136
4151
  }, checked: advancedFilterState.includeAdmins, ariaLabel: "show logs from admins" }))),
@@ -4140,7 +4155,7 @@ const LogReviewer = (props) => {
4140
4155
  React__default.createElement("input", { type: "text", className: "form-control", "aria-label": "query for course name", value: advancedFilterState.courseName, placeholder: "e.g. GLC 200", onChange: (e) => {
4141
4156
  advancedFilterState.courseName = e.target.value;
4142
4157
  dispatch({
4143
- type: ActionType$6.UpdateAdvancedFilterState,
4158
+ type: ActionType$5.UpdateAdvancedFilterState,
4144
4159
  advancedFilterState,
4145
4160
  });
4146
4161
  } })),
@@ -4154,7 +4169,7 @@ const LogReviewer = (props) => {
4154
4169
  .trim());
4155
4170
  }
4156
4171
  dispatch({
4157
- type: ActionType$6.UpdateAdvancedFilterState,
4172
+ type: ActionType$5.UpdateAdvancedFilterState,
4158
4173
  advancedFilterState,
4159
4174
  });
4160
4175
  } }))),
@@ -4163,21 +4178,21 @@ const LogReviewer = (props) => {
4163
4178
  React__default.createElement(RadioButton, { text: "All Devices", ariaLabel: "show logs from all devices", selected: advancedFilterState.isMobile === undefined, onSelected: () => {
4164
4179
  advancedFilterState.isMobile = undefined;
4165
4180
  dispatch({
4166
- type: ActionType$6.UpdateAdvancedFilterState,
4181
+ type: ActionType$5.UpdateAdvancedFilterState,
4167
4182
  advancedFilterState,
4168
4183
  });
4169
4184
  } }),
4170
4185
  React__default.createElement(RadioButton, { text: "Mobile Only", ariaLabel: "show logs from mobile devices", selected: advancedFilterState.isMobile === true, onSelected: () => {
4171
4186
  advancedFilterState.isMobile = true;
4172
4187
  dispatch({
4173
- type: ActionType$6.UpdateAdvancedFilterState,
4188
+ type: ActionType$5.UpdateAdvancedFilterState,
4174
4189
  advancedFilterState,
4175
4190
  });
4176
4191
  } }),
4177
4192
  React__default.createElement(RadioButton, { text: "Desktop Only", ariaLabel: "show logs from desktop devices", selected: advancedFilterState.isMobile === false, onSelected: () => {
4178
4193
  advancedFilterState.isMobile = false;
4179
4194
  dispatch({
4180
- type: ActionType$6.UpdateAdvancedFilterState,
4195
+ type: ActionType$5.UpdateAdvancedFilterState,
4181
4196
  advancedFilterState,
4182
4197
  });
4183
4198
  }, noMarginOnRight: true }))),
@@ -4186,21 +4201,21 @@ const LogReviewer = (props) => {
4186
4201
  React__default.createElement(RadioButton, { text: "Both", ariaLabel: "show logs from all sources", selected: advancedFilterState.source === undefined, onSelected: () => {
4187
4202
  advancedFilterState.source = undefined;
4188
4203
  dispatch({
4189
- type: ActionType$6.UpdateAdvancedFilterState,
4204
+ type: ActionType$5.UpdateAdvancedFilterState,
4190
4205
  advancedFilterState,
4191
4206
  });
4192
4207
  } }),
4193
4208
  React__default.createElement(RadioButton, { text: "Client Only", ariaLabel: "show logs from client source", selected: advancedFilterState.source === LogSource$1.Client, onSelected: () => {
4194
4209
  advancedFilterState.source = LogSource$1.Client;
4195
4210
  dispatch({
4196
- type: ActionType$6.UpdateAdvancedFilterState,
4211
+ type: ActionType$5.UpdateAdvancedFilterState,
4197
4212
  advancedFilterState,
4198
4213
  });
4199
4214
  } }),
4200
4215
  React__default.createElement(RadioButton, { text: "Server Only", ariaLabel: "show logs from server source", selected: advancedFilterState.source === LogSource$1.Server, onSelected: () => {
4201
4216
  advancedFilterState.source = LogSource$1.Server;
4202
4217
  dispatch({
4203
- type: ActionType$6.UpdateAdvancedFilterState,
4218
+ type: ActionType$5.UpdateAdvancedFilterState,
4204
4219
  advancedFilterState,
4205
4220
  });
4206
4221
  }, noMarginOnRight: true })),
@@ -4211,7 +4226,7 @@ const LogReviewer = (props) => {
4211
4226
  advancedFilterState.courseName = ((e.target.value)
4212
4227
  .trim());
4213
4228
  dispatch({
4214
- type: ActionType$6.UpdateAdvancedFilterState,
4229
+ type: ActionType$5.UpdateAdvancedFilterState,
4215
4230
  advancedFilterState,
4216
4231
  });
4217
4232
  } })),
@@ -4221,7 +4236,7 @@ const LogReviewer = (props) => {
4221
4236
  advancedFilterState.courseName = ((e.target.value)
4222
4237
  .trim());
4223
4238
  dispatch({
4224
- type: ActionType$6.UpdateAdvancedFilterState,
4239
+ type: ActionType$5.UpdateAdvancedFilterState,
4225
4240
  advancedFilterState,
4226
4241
  });
4227
4242
  } })))))));
@@ -12041,11 +12056,11 @@ var CreatableSelect$1 = CreatableSelect;
12041
12056
  */
12042
12057
  /* ------------- Actions ------------ */
12043
12058
  // Types of actions
12044
- var ActionType$5;
12059
+ var ActionType$4;
12045
12060
  (function (ActionType) {
12046
12061
  // Update the input value
12047
12062
  ActionType["SetInputValue"] = "SetInputValue";
12048
- })(ActionType$5 || (ActionType$5 = {}));
12063
+ })(ActionType$4 || (ActionType$4 = {}));
12049
12064
  /**
12050
12065
  * Reducer that executes actions
12051
12066
  * @author Yuen Ler Chow
@@ -12053,9 +12068,9 @@ var ActionType$5;
12053
12068
  * @param action action to execute
12054
12069
  * @returns updated state
12055
12070
  */
12056
- const reducer$6 = (state, action) => {
12071
+ const reducer$5 = (state, action) => {
12057
12072
  switch (action.type) {
12058
- case ActionType$5.SetInputValue: {
12073
+ case ActionType$4.SetInputValue: {
12059
12074
  return Object.assign(Object.assign({}, state), { inputValue: action.value });
12060
12075
  }
12061
12076
  default: {
@@ -12075,7 +12090,7 @@ const CreatableMultiselect = (props) => {
12075
12090
  inputValue: '',
12076
12091
  };
12077
12092
  // Initialize state
12078
- const [state, dispatch] = useReducer(reducer$6, initialState);
12093
+ const [state, dispatch] = useReducer(reducer$5, initialState);
12079
12094
  // Destructure common state
12080
12095
  const { inputValue } = state;
12081
12096
  /*------------------------------------------------------------------------*/
@@ -12152,7 +12167,7 @@ const CreatableMultiselect = (props) => {
12152
12167
  }
12153
12168
  // Reset text field to empty because the values have been added
12154
12169
  dispatch({
12155
- type: ActionType$5.SetInputValue,
12170
+ type: ActionType$4.SetInputValue,
12156
12171
  value: '',
12157
12172
  });
12158
12173
  };
@@ -12191,7 +12206,7 @@ const CreatableMultiselect = (props) => {
12191
12206
  else {
12192
12207
  // simply update the input value to the new input value
12193
12208
  dispatch({
12194
- type: ActionType$5.SetInputValue,
12209
+ type: ActionType$4.SetInputValue,
12195
12210
  value: newValue,
12196
12211
  });
12197
12212
  }
@@ -12243,13 +12258,13 @@ const style$1 = `
12243
12258
  `;
12244
12259
  /* ------------- Actions ------------ */
12245
12260
  // Types of actions
12246
- var ActionType$4;
12261
+ var ActionType$3;
12247
12262
  (function (ActionType) {
12248
12263
  // Update the DBEntry
12249
12264
  ActionType["UpdateDBEntry"] = "UpdateDBEntry";
12250
12265
  // Start the save spinner
12251
12266
  ActionType["StartSave"] = "StartSave";
12252
- })(ActionType$4 || (ActionType$4 = {}));
12267
+ })(ActionType$3 || (ActionType$3 = {}));
12253
12268
  /**
12254
12269
  * Reducer that executes actions
12255
12270
  * @author Yuen Ler Chow
@@ -12257,12 +12272,12 @@ var ActionType$4;
12257
12272
  * @param action action to execute
12258
12273
  * @returns updated state
12259
12274
  */
12260
- const reducer$5 = (state, action) => {
12275
+ const reducer$4 = (state, action) => {
12261
12276
  switch (action.type) {
12262
- case ActionType$4.UpdateDBEntry: {
12277
+ case ActionType$3.UpdateDBEntry: {
12263
12278
  return Object.assign(Object.assign({}, state), { entry: action.dbEntry });
12264
12279
  }
12265
- case ActionType$4.StartSave: {
12280
+ case ActionType$3.StartSave: {
12266
12281
  return Object.assign(Object.assign({}, state), { saving: true });
12267
12282
  }
12268
12283
  default: {
@@ -12287,7 +12302,7 @@ const AddOrEditDBEntry = (props) => {
12287
12302
  saving: false,
12288
12303
  };
12289
12304
  // Initialize state
12290
- const [state, dispatch] = useReducer(reducer$5, initialState);
12305
+ const [state, dispatch] = useReducer(reducer$4, initialState);
12291
12306
  // Destructure common state
12292
12307
  const { entry, saving, } = state;
12293
12308
  /*------------------------------------------------------------------------*/
@@ -12299,7 +12314,7 @@ const AddOrEditDBEntry = (props) => {
12299
12314
  */
12300
12315
  const save = () => __awaiter(void 0, void 0, void 0, function* () {
12301
12316
  // Start the save loading indicator
12302
- dispatch({ type: ActionType$4.StartSave });
12317
+ dispatch({ type: ActionType$3.StartSave });
12303
12318
  // add all default values to the entry
12304
12319
  entryFields.forEach((field) => {
12305
12320
  if (field.defaultValue && !entry[field.objectKey]) {
@@ -12482,7 +12497,7 @@ const AddOrEditDBEntry = (props) => {
12482
12497
  return (React__default.createElement(RadioButton, { key: choice.value, text: choice.title, selected: entry[field.objectKey] === choice.value, onSelected: () => {
12483
12498
  entry[field.objectKey] = choice.value;
12484
12499
  dispatch({
12485
- type: ActionType$4.UpdateDBEntry,
12500
+ type: ActionType$3.UpdateDBEntry,
12486
12501
  dbEntry: entry,
12487
12502
  });
12488
12503
  }, ariaLabel: choice.title }));
@@ -12494,7 +12509,7 @@ const AddOrEditDBEntry = (props) => {
12494
12509
  React__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) => {
12495
12510
  entry[field.objectKey] = (e.target.value);
12496
12511
  dispatch({
12497
- type: ActionType$4.UpdateDBEntry,
12512
+ type: ActionType$3.UpdateDBEntry,
12498
12513
  dbEntry: entry,
12499
12514
  });
12500
12515
  } }))));
@@ -12507,7 +12522,7 @@ const AddOrEditDBEntry = (props) => {
12507
12522
  entry[field.objectKey] = (e.target.value
12508
12523
  .replace(/[^0-9]/g, ''));
12509
12524
  dispatch({
12510
- type: ActionType$4.UpdateDBEntry,
12525
+ type: ActionType$3.UpdateDBEntry,
12511
12526
  dbEntry: entry,
12512
12527
  });
12513
12528
  } }))));
@@ -12537,7 +12552,7 @@ const AddOrEditDBEntry = (props) => {
12537
12552
  }
12538
12553
  // Save
12539
12554
  dispatch({
12540
- type: ActionType$4.UpdateDBEntry,
12555
+ type: ActionType$3.UpdateDBEntry,
12541
12556
  dbEntry: entry,
12542
12557
  });
12543
12558
  }, ariaLabel: choice.title }));
@@ -12552,7 +12567,7 @@ const AddOrEditDBEntry = (props) => {
12552
12567
  // Update entry and save
12553
12568
  entry[field.objectKey] = values;
12554
12569
  dispatch({
12555
- type: ActionType$4.UpdateDBEntry,
12570
+ type: ActionType$3.UpdateDBEntry,
12556
12571
  dbEntry: entry,
12557
12572
  });
12558
12573
  } })))));
@@ -12565,7 +12580,7 @@ const AddOrEditDBEntry = (props) => {
12565
12580
  React__default.createElement(CreatableMultiselect, { disabled: disabled, type: DBEntryFieldType$1.NumberArray, values: entry[field.objectKey] || [], onChange: (values) => {
12566
12581
  entry[field.objectKey] = values;
12567
12582
  dispatch({
12568
- type: ActionType$4.UpdateDBEntry,
12583
+ type: ActionType$3.UpdateDBEntry,
12569
12584
  dbEntry: entry,
12570
12585
  });
12571
12586
  } })))));
@@ -12639,7 +12654,7 @@ const generateEndpointPath = (collectionName, adminsOnly) => {
12639
12654
  */
12640
12655
  /* ------------- Actions ------------ */
12641
12656
  // Types of actions
12642
- var ActionType$3;
12657
+ var ActionType$2;
12643
12658
  (function (ActionType) {
12644
12659
  // Show adder
12645
12660
  ActionType["ShowAdder"] = "ShowAdder";
@@ -12653,7 +12668,7 @@ var ActionType$3;
12653
12668
  ActionType["StartDelete"] = "StartDelete";
12654
12669
  // Finish deletion process
12655
12670
  ActionType["FinishDelete"] = "FinishDelete";
12656
- })(ActionType$3 || (ActionType$3 = {}));
12671
+ })(ActionType$2 || (ActionType$2 = {}));
12657
12672
  /**
12658
12673
  * Reducer that executes actions
12659
12674
  * @author Yuen Ler Chow
@@ -12661,18 +12676,18 @@ var ActionType$3;
12661
12676
  * @param action action to execute
12662
12677
  * @returns updated state
12663
12678
  */
12664
- const reducer$4 = (state, action) => {
12679
+ const reducer$3 = (state, action) => {
12665
12680
  switch (action.type) {
12666
- case ActionType$3.FinishLoading: {
12681
+ case ActionType$2.FinishLoading: {
12667
12682
  return Object.assign(Object.assign({}, state), { loading: false, dbEntries: action.dbEntries });
12668
12683
  }
12669
- case ActionType$3.ShowAdder: {
12684
+ case ActionType$2.ShowAdder: {
12670
12685
  return Object.assign(Object.assign({}, state), { adding: true, dbEntryToEdit: undefined });
12671
12686
  }
12672
- case ActionType$3.ShowEditor: {
12687
+ case ActionType$2.ShowEditor: {
12673
12688
  return Object.assign(Object.assign({}, state), { adding: false, dbEntryToEdit: action.dbEntry });
12674
12689
  }
12675
- case ActionType$3.FinishAdd: {
12690
+ case ActionType$2.FinishAdd: {
12676
12691
  // Handle cancel
12677
12692
  const finishedEntry = action.dbEntry;
12678
12693
  if (!finishedEntry) {
@@ -12696,10 +12711,10 @@ const reducer$4 = (state, action) => {
12696
12711
  // Update the state
12697
12712
  return Object.assign(Object.assign({}, state), { adding: false, dbEntryToEdit: undefined, dbEntries: updatedDbEntries });
12698
12713
  }
12699
- case ActionType$3.StartDelete: {
12714
+ case ActionType$2.StartDelete: {
12700
12715
  return Object.assign(Object.assign({}, state), { loading: true });
12701
12716
  }
12702
- case ActionType$3.FinishDelete: {
12717
+ case ActionType$2.FinishDelete: {
12703
12718
  return Object.assign(Object.assign({}, state), { loading: false,
12704
12719
  // Remove the deleted entry from the list
12705
12720
  dbEntries: state.dbEntries.filter((entry) => {
@@ -12725,7 +12740,7 @@ const DBEntryManagerPanel = (props) => {
12725
12740
  loading: true,
12726
12741
  };
12727
12742
  // Initialize state
12728
- const [state, dispatch] = useReducer(reducer$4, initialState);
12743
+ const [state, dispatch] = useReducer(reducer$3, initialState);
12729
12744
  // Destructure common state
12730
12745
  const { adding, dbEntryToEdit, dbEntries, loading, } = state;
12731
12746
  /*------------------------------------------------------------------------*/
@@ -12751,7 +12766,7 @@ const DBEntryManagerPanel = (props) => {
12751
12766
  try {
12752
12767
  // Start loader
12753
12768
  dispatch({
12754
- type: ActionType$3.StartDelete,
12769
+ type: ActionType$2.StartDelete,
12755
12770
  });
12756
12771
  // Perform deletion
12757
12772
  yield visitServerEndpoint({
@@ -12760,7 +12775,7 @@ const DBEntryManagerPanel = (props) => {
12760
12775
  });
12761
12776
  // Finish loader
12762
12777
  dispatch({
12763
- type: ActionType$3.FinishDelete,
12778
+ type: ActionType$2.FinishDelete,
12764
12779
  dbEntry: entry,
12765
12780
  idPropName,
12766
12781
  });
@@ -12789,7 +12804,7 @@ const DBEntryManagerPanel = (props) => {
12789
12804
  });
12790
12805
  // Save loaded data
12791
12806
  dispatch({
12792
- type: ActionType$3.FinishLoading,
12807
+ type: ActionType$2.FinishLoading,
12793
12808
  dbEntries: data,
12794
12809
  });
12795
12810
  }
@@ -12832,7 +12847,7 @@ const DBEntryManagerPanel = (props) => {
12832
12847
  React__default.createElement("span", { className: "d-none d-md-inline ms-1" }, "Remove")),
12833
12848
  !disableEdit && (React__default.createElement("button", { type: "button", id: `DBEntryManagerPanel-edit-with-id-${entry[idPropName]}`, className: "btn btn-primary", "aria-label": `edit db entry: ${entry[titlePropName]}`, onClick: () => {
12834
12849
  dispatch({
12835
- type: ActionType$3.ShowEditor,
12850
+ type: ActionType$2.ShowEditor,
12836
12851
  dbEntry: entry,
12837
12852
  });
12838
12853
  } },
@@ -12842,7 +12857,7 @@ const DBEntryManagerPanel = (props) => {
12842
12857
  React__default.createElement("div", { className: "d-grid" },
12843
12858
  React__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: () => {
12844
12859
  dispatch({
12845
- type: ActionType$3.ShowAdder,
12860
+ type: ActionType$2.ShowAdder,
12846
12861
  });
12847
12862
  } },
12848
12863
  React__default.createElement(FontAwesomeIcon, { icon: faPlus, className: "me-2" }),
@@ -12854,7 +12869,7 @@ const DBEntryManagerPanel = (props) => {
12854
12869
  if (!loading && (adding || dbEntryToEdit)) {
12855
12870
  body = (React__default.createElement(AddOrEditDBEntry, { saveEndpointPath: endpoint, validateEntry: validateEntry, modifyEntry: modifyEntry, entryFields: entryFields, dbEntryToEdit: dbEntryToEdit, idPropName: idPropName, entries: dbEntries, itemName: itemName, onFinished: (entry) => {
12856
12871
  dispatch({
12857
- type: ActionType$3.FinishAdd,
12872
+ type: ActionType$2.FinishAdd,
12858
12873
  dbEntry: entry,
12859
12874
  idPropName,
12860
12875
  });
@@ -13051,25 +13066,25 @@ const getItemIds = (items) => {
13051
13066
  };
13052
13067
  /* ------------- Actions ------------ */
13053
13068
  // Types of actions
13054
- var ActionType$2;
13069
+ var ActionType$1;
13055
13070
  (function (ActionType) {
13056
13071
  // Hide the "jump to bottom" button
13057
13072
  ActionType["HideJumpToBottomButton"] = "HideJumpToBottomButton";
13058
13073
  // Show the "jump to bottom" button
13059
13074
  ActionType["ShowJumpToBottomButton"] = "ShowJumpToBottomButton";
13060
- })(ActionType$2 || (ActionType$2 = {}));
13075
+ })(ActionType$1 || (ActionType$1 = {}));
13061
13076
  /**
13062
13077
  * Reducer that executes actions
13063
13078
  * @author Gabe Abrams
13064
13079
  * @param state current state
13065
13080
  * @param action action to execute
13066
13081
  */
13067
- const reducer$3 = (state, action) => {
13082
+ const reducer$2 = (state, action) => {
13068
13083
  switch (action.type) {
13069
- case ActionType$2.HideJumpToBottomButton: {
13084
+ case ActionType$1.HideJumpToBottomButton: {
13070
13085
  return Object.assign(Object.assign({}, state), { jumpToBottomButtonVisible: false });
13071
13086
  }
13072
- case ActionType$2.ShowJumpToBottomButton: {
13087
+ case ActionType$1.ShowJumpToBottomButton: {
13073
13088
  return Object.assign(Object.assign({}, state), { jumpToBottomButtonVisible: true });
13074
13089
  }
13075
13090
  default: {
@@ -13093,7 +13108,7 @@ const AutoscrollToBottomContainer = (props) => {
13093
13108
  jumpToBottomButtonVisible: false,
13094
13109
  };
13095
13110
  // Initialize state
13096
- const [state, dispatch] = useReducer(reducer$3, initialState);
13111
+ const [state, dispatch] = useReducer(reducer$2, initialState);
13097
13112
  // Destructure common state
13098
13113
  const { jumpToBottomButtonVisible, } = state;
13099
13114
  /* -------------- Refs -------------- */
@@ -13139,7 +13154,7 @@ const AutoscrollToBottomContainer = (props) => {
13139
13154
  }
13140
13155
  // Update state
13141
13156
  dispatch({
13142
- type: ActionType$2.HideJumpToBottomButton,
13157
+ type: ActionType$1.HideJumpToBottomButton,
13143
13158
  });
13144
13159
  // Scroll to bottom
13145
13160
  container.current.scrollTop = (container.current.scrollHeight
@@ -13163,7 +13178,7 @@ const AutoscrollToBottomContainer = (props) => {
13163
13178
  if (isScrolledToBottom()) {
13164
13179
  // Hide button
13165
13180
  dispatch({
13166
- type: ActionType$2.HideJumpToBottomButton,
13181
+ type: ActionType$1.HideJumpToBottomButton,
13167
13182
  });
13168
13183
  }
13169
13184
  };
@@ -13205,7 +13220,7 @@ const AutoscrollToBottomContainer = (props) => {
13205
13220
  else {
13206
13221
  // Not scrolled to bottom. Show "jump to bottom" button.
13207
13222
  dispatch({
13208
- type: ActionType$2.ShowJumpToBottomButton,
13223
+ type: ActionType$1.ShowJumpToBottomButton,
13209
13224
  });
13210
13225
  }
13211
13226
  }, [items]);
@@ -13275,25 +13290,25 @@ const combineClassNames = (classNames) => {
13275
13290
  */
13276
13291
  /* ------------- Actions ------------ */
13277
13292
  // Types of actions
13278
- var ActionType$1;
13293
+ var ActionType;
13279
13294
  (function (ActionType) {
13280
13295
  // Start hovering on an option
13281
13296
  ActionType["StartHover"] = "StartHover";
13282
13297
  // Stop hovering on an option
13283
13298
  ActionType["StopHover"] = "StopHover";
13284
- })(ActionType$1 || (ActionType$1 = {}));
13299
+ })(ActionType || (ActionType = {}));
13285
13300
  /**
13286
13301
  * Reducer that executes actions
13287
13302
  * @author Gabe Abrams
13288
13303
  * @param state current state
13289
13304
  * @param action action to execute
13290
13305
  */
13291
- const reducer$2 = (state, action) => {
13306
+ const reducer$1 = (state, action) => {
13292
13307
  switch (action.type) {
13293
- case ActionType$1.StartHover: {
13308
+ case ActionType.StartHover: {
13294
13309
  return Object.assign(Object.assign({}, state), { hoveredOptionId: action.hoveredOptionId });
13295
13310
  }
13296
- case ActionType$1.StopHover: {
13311
+ case ActionType.StopHover: {
13297
13312
  return Object.assign(Object.assign({}, state), { hoveredOptionId: undefined });
13298
13313
  }
13299
13314
  default: {
@@ -13317,7 +13332,7 @@ const MultiSwitch = (props) => {
13317
13332
  hoveredOptionId: undefined,
13318
13333
  };
13319
13334
  // Initialize state
13320
- const [state, dispatch] = useReducer(reducer$2, initialState);
13335
+ const [state, dispatch] = useReducer(reducer$1, initialState);
13321
13336
  // Destructure common state
13322
13337
  const { hoveredOptionId, } = state;
13323
13338
  /*------------------------------------------------------------------------*/
@@ -13329,7 +13344,7 @@ const MultiSwitch = (props) => {
13329
13344
  });
13330
13345
  // Constants
13331
13346
  const gutterRems = heightRem * 0.1;
13332
- const itemWidthRems = heightRem * 2.2;
13347
+ const itemWidthRems = heightRem * 1.3;
13333
13348
  const textFontSize = heightRem / 3.5;
13334
13349
  const iconFontSize = heightRem / 2;
13335
13350
  const borderWidthRems = 0.05;
@@ -13449,27 +13464,27 @@ const MultiSwitch = (props) => {
13449
13464
  : `click to select option "${option.label}"`), onClick: () => {
13450
13465
  // Remove hover
13451
13466
  dispatch({
13452
- type: ActionType$1.StopHover,
13467
+ type: ActionType.StopHover,
13453
13468
  });
13454
13469
  // Notify parent
13455
13470
  onChange(option.id);
13456
13471
  }, onMouseEnter: () => {
13457
13472
  dispatch({
13458
- type: ActionType$1.StartHover,
13473
+ type: ActionType.StartHover,
13459
13474
  hoveredOptionId: option.id,
13460
13475
  });
13461
13476
  }, onMouseLeave: () => {
13462
13477
  dispatch({
13463
- type: ActionType$1.StopHover,
13478
+ type: ActionType.StopHover,
13464
13479
  });
13465
13480
  }, onFocus: () => {
13466
13481
  dispatch({
13467
- type: ActionType$1.StartHover,
13482
+ type: ActionType.StartHover,
13468
13483
  hoveredOptionId: option.id,
13469
13484
  });
13470
13485
  }, onBlur: () => {
13471
13486
  dispatch({
13472
- type: ActionType$1.StopHover,
13487
+ type: ActionType.StopHover,
13473
13488
  });
13474
13489
  }, style: {
13475
13490
  pointerEvents: ((option.id === selectedOptionId)
@@ -13488,147 +13503,6 @@ const MultiSwitch = (props) => {
13488
13503
  React__default.createElement("div", { className: "MultiSwitch-highlight-container" }, highlight)));
13489
13504
  };
13490
13505
 
13491
- // Types of dropdown items
13492
- var DropdownItemType;
13493
- (function (DropdownItemType) {
13494
- // Dropdown header
13495
- DropdownItemType["Header"] = "Header";
13496
- // Dropdown divider
13497
- DropdownItemType["Divider"] = "Divider";
13498
- // Dropdown item
13499
- DropdownItemType["Item"] = "Item";
13500
- })(DropdownItemType || (DropdownItemType = {}));
13501
- var DropdownItemType$1 = DropdownItemType;
13502
-
13503
- /**
13504
- * A simple dropdown menu
13505
- * @author Alessandra De Lucas
13506
- * @author Yuen Ler Chow
13507
- * @author Gabe Abrams
13508
- */
13509
- /* ------------- Actions ------------ */
13510
- // Types of actions
13511
- var ActionType;
13512
- (function (ActionType) {
13513
- // Toggle opening the dropdown menu
13514
- ActionType["ToggleDropdown"] = "ToggleDropdown";
13515
- // Close the dropdown menu
13516
- ActionType["CloseDropdown"] = "CloseDropdown";
13517
- })(ActionType || (ActionType = {}));
13518
- /**
13519
- * Reducer that executes actions
13520
- * @author Alessandra De Lucas
13521
- * @author Yuen Ler Chow
13522
- * @param state current state
13523
- * @param action action to execute
13524
- */
13525
- const reducer$1 = (state, action) => {
13526
- switch (action.type) {
13527
- case ActionType.ToggleDropdown: {
13528
- return Object.assign(Object.assign({}, state), { isDropdownOpen: !state.isDropdownOpen });
13529
- }
13530
- case ActionType.CloseDropdown: {
13531
- return Object.assign(Object.assign({}, state), { isDropdownOpen: false });
13532
- }
13533
- default: {
13534
- return state;
13535
- }
13536
- }
13537
- };
13538
- /*------------------------------------------------------------------------*/
13539
- /* ------------------------------ Component ----------------------------- */
13540
- /*------------------------------------------------------------------------*/
13541
- const Dropdown = (props) => {
13542
- /*------------------------------------------------------------------------*/
13543
- /* -------------------------------- Setup ------------------------------- */
13544
- /*------------------------------------------------------------------------*/
13545
- /* -------------- Props ------------- */
13546
- // Destructure all props
13547
- const { dropdownButton, items, } = props;
13548
- /* -------------- State ------------- */
13549
- // Initial state
13550
- const initialState = {
13551
- isDropdownOpen: false,
13552
- };
13553
- // Initialize state
13554
- const [state, dispatch] = useReducer(reducer$1, initialState);
13555
- // Destructure common state
13556
- const { isDropdownOpen, } = state;
13557
- /* -------------- Refs -------------- */
13558
- // Initialize refs
13559
- const dropdownRef = useRef(null);
13560
- /*------------------------------------------------------------------------*/
13561
- /* ------------------------- Component Functions ------------------------ */
13562
- /*------------------------------------------------------------------------*/
13563
- /**
13564
- * Handle clicking outside of the dropdown menu to close it
13565
- * @author Yuen Ler Chow
13566
- * @param event the mouse event
13567
- */
13568
- const handleClickOutside = (event) => {
13569
- if (
13570
- // Dropdown has been rendered
13571
- dropdownRef.current
13572
- // Click occurred outside the dropdown
13573
- && !dropdownRef.current.contains(event.target)) {
13574
- dispatch({ type: ActionType.CloseDropdown });
13575
- }
13576
- };
13577
- /*------------------------------------------------------------------------*/
13578
- /* ------------------------- Lifecycle Functions ------------------------ */
13579
- /*------------------------------------------------------------------------*/
13580
- /**
13581
- * Mount
13582
- * @author Yuen Ler Chow
13583
- */
13584
- useEffect(() => {
13585
- // Add event listener to close dropdown when clicking outside
13586
- document.addEventListener('mousedown', handleClickOutside);
13587
- // Cleanup
13588
- return () => {
13589
- document.removeEventListener('mousedown', handleClickOutside);
13590
- };
13591
- }, []);
13592
- /*----------------------------------------*/
13593
- /* --------------- Main UI -------------- */
13594
- /*----------------------------------------*/
13595
- return (React__default.createElement("div", { className: "dropdown", ref: dropdownRef, "data-bs-theme": isDarkModeOn() ? 'dark' : undefined },
13596
- React__default.createElement("button", { className: combineClassNames([
13597
- 'btn dropdown-toggle border',
13598
- isDropdownOpen && 'show',
13599
- `btn-${dropdownButton.variant}`,
13600
- dropdownButton.variant === Variant$1.Light && 'text-dark',
13601
- ]), type: "button", id: dropdownButton.id, "aria-expanded": isDropdownOpen, "aria-label": dropdownButton.ariaLabel, onClick: () => {
13602
- dispatch({
13603
- type: ActionType.ToggleDropdown,
13604
- });
13605
- } }, dropdownButton.content),
13606
- React__default.createElement("ul", { className: combineClassNames([
13607
- 'dropdown-menu',
13608
- isDarkModeOn() && 'dropdown-menu-dark',
13609
- isDropdownOpen && 'show',
13610
- ]) }, Object.values(items).map((item) => {
13611
- if (item.type === DropdownItemType$1.Header) {
13612
- return (
13613
- // TODO: Implement header
13614
- React__default.createElement("span", null));
13615
- }
13616
- if (item.type === DropdownItemType$1.Divider) {
13617
- return (
13618
- // TODO: Implement divider
13619
- React__default.createElement("span", null));
13620
- }
13621
- return (React__default.createElement("li", { key: item.id },
13622
- React__default.createElement("button", { type: "button", "aria-label": item.ariaLabel, className: "dropdown-item", onClick: (e) => {
13623
- e.preventDefault();
13624
- dispatch({
13625
- type: ActionType.CloseDropdown,
13626
- });
13627
- item.onClick();
13628
- } }, item.content)));
13629
- }))));
13630
- };
13631
-
13632
13506
  /**
13633
13507
  * One minute in ms
13634
13508
  * @author Gabe Abrams
@@ -15954,5 +15828,5 @@ var DayOfWeek;
15954
15828
  })(DayOfWeek || (DayOfWeek = {}));
15955
15829
  var DayOfWeek$1 = DayOfWeek;
15956
15830
 
15957
- export { AppWrapper, AutoscrollToBottomContainer, ButtonInputGroup, CSVDownloadButton, CheckboxButton, CopiableBox, DAY_IN_MS, DBEntryFieldType$1 as DBEntryFieldType, DBEntryManagerPanel, DayOfWeek$1 as DayOfWeek, Drawer, Dropdown, DropdownItemType$1 as DropdownItemType, DynamicWord, ErrorBox, ErrorWithCode, HOUR_IN_MS, IntelliTable, ItemPicker, LoadingSpinner, LogAction$1 as LogAction, LogBuiltInMetadata, LogReviewer, LogSource$1 as LogSource, LogType$1 as LogType, MINUTE_IN_MS, Modal, ModalButtonType$1 as ModalButtonType, ModalSize$1 as ModalSize, ModalType$1 as ModalType, MultiSwitch, ParamType$1 as ParamType, PopFailureMark, PopPendingMark, PopSuccessMark, RadioButton, ReactKitErrorCode$1 as ReactKitErrorCode, SimpleDateChooser, TabBox, ToggleSwitch, Tooltip, Variant$1 as Variant, abbreviate, addDBEditorEndpoints, addFatalErrorHandler, alert, avg, canReviewLogs, capitalize, ceilToNumDecimals, combineClassNames, compareArraysByProp, confirm, everyAsync, extractProp, filterAsync, floorToNumDecimals, forEachAsync, forceNumIntoBounds, genCSV, genCommaList, genRouteHandler, getHumanReadableDate, getLocalTimeInfo, getMonthName, getOrdinal, getPartOfDay, getTimeInfoInET, handleError, handleSuccess, idify, initClient, initLogCollection, initServer, isMobileOrTablet, leaveToURL, logClientEvent, makeLinksClickable, mapAsync, onlyKeepLetters, padDecimalZeros, padZerosLeft, parallelLimit, prefixWithAOrAn, roundToNumDecimals, setClientEventMetadataPopulator, showFatalError, shuffleArray, someAsync, startMinWait, stringsToHumanReadableList, stubServerEndpoint, sum, useForceRender, validateEmail, validatePhoneNumber, validateString, visitServerEndpoint, waitMs };
15831
+ export { AppWrapper, AutoscrollToBottomContainer, ButtonInputGroup, CSVDownloadButton, CheckboxButton, CopiableBox, DAY_IN_MS, DBEntryFieldType$1 as DBEntryFieldType, DBEntryManagerPanel, DayOfWeek$1 as DayOfWeek, Drawer, DynamicWord, ErrorBox, ErrorWithCode, HOUR_IN_MS, IntelliTable, ItemPicker, LoadingSpinner, LogAction$1 as LogAction, LogBuiltInMetadata, LogReviewer, LogSource$1 as LogSource, LogType$1 as LogType, MINUTE_IN_MS, Modal, ModalButtonType$1 as ModalButtonType, ModalSize$1 as ModalSize, ModalType$1 as ModalType, MultiSwitch, ParamType$1 as ParamType, PopFailureMark, PopPendingMark, PopSuccessMark, RadioButton, ReactKitErrorCode$1 as ReactKitErrorCode, SimpleDateChooser, TabBox, ToggleSwitch, Tooltip, Variant$1 as Variant, abbreviate, addDBEditorEndpoints, addFatalErrorHandler, alert, avg, canReviewLogs, capitalize, ceilToNumDecimals, combineClassNames, compareArraysByProp, confirm, everyAsync, extractProp, filterAsync, floorToNumDecimals, forEachAsync, forceNumIntoBounds, genCSV, genCommaList, genRouteHandler, getHumanReadableDate, getLocalTimeInfo, getMonthName, getOrdinal, getPartOfDay, getTimeInfoInET, handleError, handleSuccess, idify, initClient, initLogCollection, initServer, isMobileOrTablet, leaveToURL, logClientEvent, makeLinksClickable, mapAsync, onlyKeepLetters, padDecimalZeros, padZerosLeft, parallelLimit, prefixWithAOrAn, roundToNumDecimals, setClientEventMetadataPopulator, showFatalError, shuffleArray, someAsync, startMinWait, stringsToHumanReadableList, stubServerEndpoint, sum, useForceRender, validateEmail, validatePhoneNumber, validateString, visitServerEndpoint, waitMs };
15958
15832
  //# sourceMappingURL=index.js.map