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