dce-reactkit 3.2.2-beta.46 → 3.2.2-beta.48
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 +109 -78
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/types/types/LogMetadataContextMap.d.ts +11 -0
- package/dist/cjs/types/types/LogMetadataTagMap.d.ts +8 -0
- package/dist/cjs/types/types/LogMetadataTargetMap.d.ts +8 -0
- package/dist/cjs/types/types/LogMetadataType.d.ts +6 -12
- package/dist/esm/index.js +109 -78
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/types/types/LogMetadataContextMap.d.ts +11 -0
- package/dist/esm/types/types/LogMetadataTagMap.d.ts +8 -0
- package/dist/esm/types/types/LogMetadataTargetMap.d.ts +8 -0
- package/dist/esm/types/types/LogMetadataType.d.ts +6 -12
- package/dist/index.d.ts +30 -12
- package/package.json +1 -1
- package/src/components/LogReviewer.tsx +171 -125
- package/src/types/LogMetadataContextMap.ts +15 -0
- package/src/types/LogMetadataTagMap.ts +9 -0
- package/src/types/LogMetadataTargetMap.ts +9 -0
- package/src/types/LogMetadataType.ts +8 -15
package/dist/cjs/index.js
CHANGED
|
@@ -3131,34 +3131,34 @@ const LogReviewer = (props) => {
|
|
|
3131
3131
|
/*------------------------------------------------------------------------*/
|
|
3132
3132
|
/* Setup */
|
|
3133
3133
|
/*------------------------------------------------------------------------*/
|
|
3134
|
-
var _a, _b, _c, _d, _e, _f
|
|
3134
|
+
var _a, _b, _c, _d, _e, _f;
|
|
3135
3135
|
/* -------------- Props ------------- */
|
|
3136
3136
|
// Destructure props
|
|
3137
3137
|
const { LogMetadata, onClose, } = props;
|
|
3138
|
-
//
|
|
3139
|
-
|
|
3140
|
-
|
|
3141
|
-
|
|
3142
|
-
|
|
3143
|
-
|
|
3144
|
-
|
|
3145
|
-
|
|
3146
|
-
|
|
3147
|
-
|
|
3148
|
-
|
|
3149
|
-
|
|
3150
|
-
|
|
3151
|
-
|
|
3152
|
-
if (LogMetadata.Context) {
|
|
3153
|
-
LogMetadata.Context[context] = context;
|
|
3154
|
-
}
|
|
3138
|
+
// Create complete map of contexts
|
|
3139
|
+
const contextMap = {};
|
|
3140
|
+
[
|
|
3141
|
+
((_a = LogMetadata.Context) !== null && _a !== void 0 ? _a : {}),
|
|
3142
|
+
LogBuiltInMetadata.Context,
|
|
3143
|
+
].forEach((partialContextMap) => {
|
|
3144
|
+
Object.keys(partialContextMap).forEach((context) => {
|
|
3145
|
+
// Add context
|
|
3146
|
+
contextMap[context] = context;
|
|
3147
|
+
// If context has children, add an "uncategorized" subcontext
|
|
3148
|
+
if (typeof contextMap[context] !== 'string') {
|
|
3149
|
+
contextMap[context][LogBuiltInMetadata.Context.Uncategorized] = (LogBuiltInMetadata.Context.Uncategorized);
|
|
3150
|
+
}
|
|
3151
|
+
});
|
|
3155
3152
|
});
|
|
3156
|
-
//
|
|
3157
|
-
|
|
3158
|
-
|
|
3159
|
-
|
|
3160
|
-
|
|
3161
|
-
|
|
3153
|
+
// Create complete map of targets
|
|
3154
|
+
const targetMap = {};
|
|
3155
|
+
[
|
|
3156
|
+
((_b = LogMetadata.Target) !== null && _b !== void 0 ? _b : {}),
|
|
3157
|
+
LogBuiltInMetadata.Target,
|
|
3158
|
+
].forEach((partialTargetMap) => {
|
|
3159
|
+
Object.keys(partialTargetMap).forEach((target) => {
|
|
3160
|
+
targetMap[target] = target;
|
|
3161
|
+
});
|
|
3162
3162
|
});
|
|
3163
3163
|
/* -------------- State ------------- */
|
|
3164
3164
|
// Create initial date filter state
|
|
@@ -3179,7 +3179,7 @@ const LogReviewer = (props) => {
|
|
|
3179
3179
|
};
|
|
3180
3180
|
// Create initial context filter state
|
|
3181
3181
|
const initContextFilterState = {};
|
|
3182
|
-
Object.keys((
|
|
3182
|
+
Object.keys((_c = LogMetadata.Context) !== null && _c !== void 0 ? _c : {}).forEach((context) => {
|
|
3183
3183
|
var _a, _b;
|
|
3184
3184
|
const contextValue = ((_a = LogMetadata.Context) !== null && _a !== void 0 ? _a : {})[context];
|
|
3185
3185
|
if (typeof contextValue === 'string') {
|
|
@@ -3201,7 +3201,7 @@ const LogReviewer = (props) => {
|
|
|
3201
3201
|
});
|
|
3202
3202
|
// Create initial tag filter state
|
|
3203
3203
|
const initTagFilterState = {};
|
|
3204
|
-
Object.keys((
|
|
3204
|
+
Object.keys((_d = LogMetadata.Tag) !== null && _d !== void 0 ? _d : {}).forEach((tag) => {
|
|
3205
3205
|
initTagFilterState[tag] = false;
|
|
3206
3206
|
});
|
|
3207
3207
|
// Create advanced filter state
|
|
@@ -3228,7 +3228,7 @@ const LogReviewer = (props) => {
|
|
|
3228
3228
|
target: {},
|
|
3229
3229
|
action: {},
|
|
3230
3230
|
};
|
|
3231
|
-
Object.values((
|
|
3231
|
+
Object.values((_e = LogMetadata.Target) !== null && _e !== void 0 ? _e : {}).forEach((target) => {
|
|
3232
3232
|
initActionErrorFilterState.target[target] = true;
|
|
3233
3233
|
});
|
|
3234
3234
|
Object.values(LogAction$1).forEach((action) => {
|
|
@@ -3422,7 +3422,7 @@ const LogReviewer = (props) => {
|
|
|
3422
3422
|
initDateFilterState,
|
|
3423
3423
|
initTagFilterState,
|
|
3424
3424
|
});
|
|
3425
|
-
} }, "Reset
|
|
3425
|
+
} }, "Reset"))));
|
|
3426
3426
|
// Filter drawer
|
|
3427
3427
|
let filterDrawer;
|
|
3428
3428
|
if (expandedFilterDrawer) {
|
|
@@ -3450,10 +3450,16 @@ const LogReviewer = (props) => {
|
|
|
3450
3450
|
}
|
|
3451
3451
|
else if (expandedFilterDrawer === FilterDrawer.Context) {
|
|
3452
3452
|
// Create item picker items
|
|
3453
|
-
const
|
|
3454
|
-
|
|
3455
|
-
|
|
3456
|
-
|
|
3453
|
+
const builtInPickableItem = {
|
|
3454
|
+
id: '_',
|
|
3455
|
+
name: 'Auto-logged',
|
|
3456
|
+
isGroup: true,
|
|
3457
|
+
children: [],
|
|
3458
|
+
};
|
|
3459
|
+
const pickableItems = [];
|
|
3460
|
+
Object.keys(contextMap)
|
|
3461
|
+
.forEach((context) => {
|
|
3462
|
+
const value = (contextMap)[context];
|
|
3457
3463
|
if (typeof value === 'string') {
|
|
3458
3464
|
// No subcategories
|
|
3459
3465
|
const item = {
|
|
@@ -3462,13 +3468,24 @@ const LogReviewer = (props) => {
|
|
|
3462
3468
|
isGroup: false,
|
|
3463
3469
|
checked: !!contextFilterState[context],
|
|
3464
3470
|
};
|
|
3465
|
-
|
|
3471
|
+
// Add built-in items to its own folder
|
|
3472
|
+
const isBuiltIn = context in LogBuiltInMetadata.Context;
|
|
3473
|
+
if (isBuiltIn) {
|
|
3474
|
+
// Add to built-in pickable item
|
|
3475
|
+
builtInPickableItem.children.push(item);
|
|
3476
|
+
}
|
|
3477
|
+
else {
|
|
3478
|
+
// Add to pickable items list
|
|
3479
|
+
pickableItems.push(item);
|
|
3480
|
+
}
|
|
3466
3481
|
}
|
|
3467
3482
|
// Has subcategories
|
|
3468
3483
|
const children = (Object.keys(value)
|
|
3484
|
+
// Remove parent name
|
|
3469
3485
|
.filter((subcontext) => {
|
|
3470
3486
|
return subcontext !== '_';
|
|
3471
3487
|
})
|
|
3488
|
+
// Create child pickable items
|
|
3472
3489
|
.map((subcontext) => {
|
|
3473
3490
|
return {
|
|
3474
3491
|
id: subcontext,
|
|
@@ -3483,19 +3500,32 @@ const LogReviewer = (props) => {
|
|
|
3483
3500
|
isGroup: true,
|
|
3484
3501
|
children,
|
|
3485
3502
|
};
|
|
3486
|
-
|
|
3487
|
-
})
|
|
3503
|
+
pickableItems.push(item);
|
|
3504
|
+
});
|
|
3505
|
+
// Add built-in contexts to end ofl ist
|
|
3506
|
+
pickableItems.push(builtInPickableItem);
|
|
3488
3507
|
// Create filter UI
|
|
3489
3508
|
filterDrawer = (React__default["default"].createElement(ItemPicker, { title: "Context", items: pickableItems, onChanged: (updatedItems) => {
|
|
3490
3509
|
// Update our state
|
|
3491
3510
|
updatedItems.forEach((pickableItem) => {
|
|
3492
3511
|
if (pickableItem.isGroup) {
|
|
3493
3512
|
// Has subcontexts
|
|
3494
|
-
pickableItem.
|
|
3495
|
-
|
|
3496
|
-
|
|
3497
|
-
|
|
3498
|
-
|
|
3513
|
+
if (pickableItem.id === '_') {
|
|
3514
|
+
// Built-in
|
|
3515
|
+
// Treat as if these were top-level contexts
|
|
3516
|
+
pickableItem.children.forEach((subcontextItem) => {
|
|
3517
|
+
contextFilterState[subcontextItem.id] = ('checked' in subcontextItem
|
|
3518
|
+
&& subcontextItem.checked);
|
|
3519
|
+
});
|
|
3520
|
+
}
|
|
3521
|
+
else {
|
|
3522
|
+
// Not built-in
|
|
3523
|
+
pickableItem.children.forEach((subcontextItem) => {
|
|
3524
|
+
if (!subcontextItem.isGroup) {
|
|
3525
|
+
contextFilterState[pickableItem.id][subcontextItem.id] = (subcontextItem.checked);
|
|
3526
|
+
}
|
|
3527
|
+
});
|
|
3528
|
+
}
|
|
3499
3529
|
}
|
|
3500
3530
|
else {
|
|
3501
3531
|
// No subcontexts
|
|
@@ -3510,17 +3540,19 @@ const LogReviewer = (props) => {
|
|
|
3510
3540
|
}
|
|
3511
3541
|
else if (expandedFilterDrawer === FilterDrawer.Tag) {
|
|
3512
3542
|
// Create filter UI
|
|
3513
|
-
filterDrawer = (React__default["default"].createElement(TabBox, { title: "Tags" },
|
|
3514
|
-
.
|
|
3515
|
-
|
|
3516
|
-
|
|
3517
|
-
|
|
3518
|
-
|
|
3519
|
-
|
|
3520
|
-
|
|
3521
|
-
|
|
3522
|
-
|
|
3523
|
-
|
|
3543
|
+
filterDrawer = (React__default["default"].createElement(TabBox, { title: "Tags" },
|
|
3544
|
+
React__default["default"].createElement("div", null, "If any are selected, logs must contain at least one but not necessarily all of the selected tags."),
|
|
3545
|
+
Object.keys((_f = LogMetadata.Tag) !== null && _f !== void 0 ? _f : {})
|
|
3546
|
+
.map((tag, i) => {
|
|
3547
|
+
const description = genHumanReadableName(tag);
|
|
3548
|
+
return (React__default["default"].createElement(CheckboxButton, { id: `LogReviewer-tag-${tag}-checkbox`, text: description, ariaLabel: `require that logs be tagged with "${description}" or any other selected tag`, noMarginOnRight: i === Object.keys(tagFilterState).length - 1, checked: tagFilterState[tag], onChanged: (checked) => {
|
|
3549
|
+
tagFilterState[tag] = checked;
|
|
3550
|
+
dispatch({
|
|
3551
|
+
type: ActionType.UpdateTagFilterState,
|
|
3552
|
+
tagFilterState,
|
|
3553
|
+
});
|
|
3554
|
+
} }));
|
|
3555
|
+
})));
|
|
3524
3556
|
}
|
|
3525
3557
|
else if (expandedFilterDrawer === FilterDrawer.Action) {
|
|
3526
3558
|
// Create filter UI
|
|
@@ -3549,23 +3581,22 @@ const LogReviewer = (props) => {
|
|
|
3549
3581
|
}, ariaLabel: "only show error logs", selected: actionErrorFilterState.type === LogType$1.Error, noMarginOnRight: true })),
|
|
3550
3582
|
(actionErrorFilterState.type === undefined
|
|
3551
3583
|
|| actionErrorFilterState.type === LogType$1.Action) && (React__default["default"].createElement(TabBox, { title: "Action Log Details" },
|
|
3552
|
-
React__default["default"].createElement(ButtonInputGroup, { label: "Action", className: "mb-2" },
|
|
3553
|
-
.
|
|
3554
|
-
|
|
3555
|
-
|
|
3556
|
-
|
|
3557
|
-
|
|
3558
|
-
|
|
3559
|
-
|
|
3560
|
-
|
|
3561
|
-
|
|
3562
|
-
|
|
3563
|
-
|
|
3584
|
+
React__default["default"].createElement(ButtonInputGroup, { label: "Action", className: "mb-2" },
|
|
3585
|
+
React__default["default"].createElement("div", { className: "grid gap-1" }, Object.keys(LogAction$1)
|
|
3586
|
+
.map((action) => {
|
|
3587
|
+
const description = genHumanReadableName(action);
|
|
3588
|
+
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) => {
|
|
3589
|
+
actionErrorFilterState.action[action] = checked;
|
|
3590
|
+
console.log(actionErrorFilterState, action, checked);
|
|
3591
|
+
dispatch({
|
|
3592
|
+
type: ActionType.UpdateActionErrorFilterState,
|
|
3593
|
+
actionErrorFilterState,
|
|
3594
|
+
});
|
|
3595
|
+
} }));
|
|
3596
|
+
}))),
|
|
3564
3597
|
React__default["default"].createElement(ButtonInputGroup, { label: "Target" },
|
|
3565
|
-
|
|
3566
|
-
|
|
3567
|
-
.map((target, i) => {
|
|
3568
|
-
var _a;
|
|
3598
|
+
React__default["default"].createElement("div", { className: "grid gap-1" }, Object.keys(targetMap)
|
|
3599
|
+
.map((target) => {
|
|
3569
3600
|
const description = genHumanReadableName(target);
|
|
3570
3601
|
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], onChanged: (checked) => {
|
|
3571
3602
|
actionErrorFilterState.target[target] = checked;
|
|
@@ -3574,13 +3605,13 @@ const LogReviewer = (props) => {
|
|
|
3574
3605
|
type: ActionType.UpdateActionErrorFilterState,
|
|
3575
3606
|
actionErrorFilterState,
|
|
3576
3607
|
});
|
|
3577
|
-
}
|
|
3578
|
-
})))),
|
|
3608
|
+
} }));
|
|
3609
|
+
}))))),
|
|
3579
3610
|
(actionErrorFilterState.type === undefined
|
|
3580
3611
|
|| actionErrorFilterState.type === LogType$1.Error) && (React__default["default"].createElement(TabBox, { title: "Error Log Details" },
|
|
3581
3612
|
React__default["default"].createElement("div", { className: "input-group mb-2" },
|
|
3582
3613
|
React__default["default"].createElement("span", { className: "input-group-text" }, "Error Message"),
|
|
3583
|
-
React__default["default"].createElement("input", { type: "text", className: "form-control", "aria-label": "query for error message", value: actionErrorFilterState.errorMessage, onChange: (e) => {
|
|
3614
|
+
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) => {
|
|
3584
3615
|
actionErrorFilterState.errorMessage = e.target.value;
|
|
3585
3616
|
dispatch({
|
|
3586
3617
|
type: ActionType.UpdateActionErrorFilterState,
|
|
@@ -3589,7 +3620,7 @@ const LogReviewer = (props) => {
|
|
|
3589
3620
|
} })),
|
|
3590
3621
|
React__default["default"].createElement("div", { className: "input-group mb-2" },
|
|
3591
3622
|
React__default["default"].createElement("span", { className: "input-group-text" }, "Error Code"),
|
|
3592
|
-
React__default["default"].createElement("input", { type: "text", className: "form-control", "aria-label": "query for error code", value: actionErrorFilterState.errorCode, onChange: (e) => {
|
|
3623
|
+
React__default["default"].createElement("input", { type: "text", className: "form-control", "aria-label": "query for error code", value: actionErrorFilterState.errorCode, placeholder: "e.g. GC22", onChange: (e) => {
|
|
3593
3624
|
actionErrorFilterState.errorCode = ((e.target.value)
|
|
3594
3625
|
.trim()
|
|
3595
3626
|
.toUpperCase());
|
|
@@ -3605,7 +3636,7 @@ const LogReviewer = (props) => {
|
|
|
3605
3636
|
React__default["default"].createElement(TabBox, { title: "User Info" },
|
|
3606
3637
|
React__default["default"].createElement("div", { className: "input-group mb-2" },
|
|
3607
3638
|
React__default["default"].createElement("span", { className: "input-group-text" }, "User First Name"),
|
|
3608
|
-
React__default["default"].createElement("input", { type: "text", className: "form-control", "aria-label": "query for user first name", value: advancedFilterState.userFirstName, onChange: (e) => {
|
|
3639
|
+
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) => {
|
|
3609
3640
|
advancedFilterState.userFirstName = e.target.value;
|
|
3610
3641
|
dispatch({
|
|
3611
3642
|
type: ActionType.UpdateAdvancedFilterState,
|
|
@@ -3614,7 +3645,7 @@ const LogReviewer = (props) => {
|
|
|
3614
3645
|
} })),
|
|
3615
3646
|
React__default["default"].createElement("div", { className: "input-group mb-2" },
|
|
3616
3647
|
React__default["default"].createElement("span", { className: "input-group-text" }, "User Last Name"),
|
|
3617
|
-
React__default["default"].createElement("input", { type: "text", className: "form-control", "aria-label": "query for user last name", value: advancedFilterState.userLastName, onChange: (e) => {
|
|
3648
|
+
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) => {
|
|
3618
3649
|
advancedFilterState.userLastName = e.target.value;
|
|
3619
3650
|
dispatch({
|
|
3620
3651
|
type: ActionType.UpdateAdvancedFilterState,
|
|
@@ -3623,7 +3654,7 @@ const LogReviewer = (props) => {
|
|
|
3623
3654
|
} })),
|
|
3624
3655
|
React__default["default"].createElement("div", { className: "input-group mb-2" },
|
|
3625
3656
|
React__default["default"].createElement("span", { className: "input-group-text" }, "User Email"),
|
|
3626
|
-
React__default["default"].createElement("input", { type: "text", className: "form-control", "aria-label": "query for user email", value: advancedFilterState.userEmail, onChange: (e) => {
|
|
3657
|
+
React__default["default"].createElement("input", { type: "text", className: "form-control", "aria-label": "query for user email", value: advancedFilterState.userEmail, placeholder: "e.g. calicci@fas.harvard.edu", onChange: (e) => {
|
|
3627
3658
|
advancedFilterState.userEmail = ((e.target.value)
|
|
3628
3659
|
.trim());
|
|
3629
3660
|
dispatch({
|
|
@@ -3633,7 +3664,7 @@ const LogReviewer = (props) => {
|
|
|
3633
3664
|
} })),
|
|
3634
3665
|
React__default["default"].createElement("div", { className: "input-group mb-2" },
|
|
3635
3666
|
React__default["default"].createElement("span", { className: "input-group-text" }, "User Canvas Id"),
|
|
3636
|
-
React__default["default"].createElement("input", { type: "text", className: "form-control", "aria-label": "query for user canvas id", value: advancedFilterState.userId, onChange: (e) => {
|
|
3667
|
+
React__default["default"].createElement("input", { type: "text", className: "form-control", "aria-label": "query for user canvas id", value: advancedFilterState.userId, placeholder: "e.g. 104985", onChange: (e) => {
|
|
3637
3668
|
const { value } = e.target;
|
|
3638
3669
|
// Only update if value contains only numbers
|
|
3639
3670
|
if (/^\d+$/.test(value)) {
|
|
@@ -3670,7 +3701,7 @@ const LogReviewer = (props) => {
|
|
|
3670
3701
|
React__default["default"].createElement(TabBox, { title: "Course Info" },
|
|
3671
3702
|
React__default["default"].createElement("div", { className: "input-group mb-2" },
|
|
3672
3703
|
React__default["default"].createElement("span", { className: "input-group-text" }, "Course Name"),
|
|
3673
|
-
React__default["default"].createElement("input", { type: "text", className: "form-control", "aria-label": "query for course name", value: advancedFilterState.courseName, onChange: (e) => {
|
|
3704
|
+
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) => {
|
|
3674
3705
|
advancedFilterState.courseName = e.target.value;
|
|
3675
3706
|
dispatch({
|
|
3676
3707
|
type: ActionType.UpdateAdvancedFilterState,
|
|
@@ -3679,7 +3710,7 @@ const LogReviewer = (props) => {
|
|
|
3679
3710
|
} })),
|
|
3680
3711
|
React__default["default"].createElement("div", { className: "input-group mb-2" },
|
|
3681
3712
|
React__default["default"].createElement("span", { className: "input-group-text" }, "Course Canvas Id"),
|
|
3682
|
-
React__default["default"].createElement("input", { type: "text", className: "form-control", "aria-label": "query for course canvas id", value: advancedFilterState.courseId, onChange: (e) => {
|
|
3713
|
+
React__default["default"].createElement("input", { type: "text", className: "form-control", "aria-label": "query for course canvas id", value: advancedFilterState.courseId, placeholder: "e.g. 15948", onChange: (e) => {
|
|
3683
3714
|
const { value } = e.target;
|
|
3684
3715
|
// Only update if value contains only numbers
|
|
3685
3716
|
if (/^\d+$/.test(value)) {
|
|
@@ -3740,7 +3771,7 @@ const LogReviewer = (props) => {
|
|
|
3740
3771
|
advancedFilterState.source !== LogSource$1.Client && (React__default["default"].createElement("div", { className: "mt-2" },
|
|
3741
3772
|
React__default["default"].createElement("div", { className: "input-group mb-2" },
|
|
3742
3773
|
React__default["default"].createElement("span", { className: "input-group-text" }, "Server Route Path"),
|
|
3743
|
-
React__default["default"].createElement("input", { type: "text", className: "form-control", "aria-label": "query for server route path", placeholder: "e.g. /api/ttm/courses/12345",
|
|
3774
|
+
React__default["default"].createElement("input", { type: "text", className: "form-control", "aria-label": "query for server route path", value: advancedFilterState.routePath, placeholder: "e.g. /api/ttm/courses/12345", onChange: (e) => {
|
|
3744
3775
|
advancedFilterState.courseName = ((e.target.value)
|
|
3745
3776
|
.trim());
|
|
3746
3777
|
dispatch({
|