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 CHANGED
@@ -3131,34 +3131,34 @@ const LogReviewer = (props) => {
3131
3131
  /*------------------------------------------------------------------------*/
3132
3132
  /* Setup */
3133
3133
  /*------------------------------------------------------------------------*/
3134
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
3134
+ var _a, _b, _c, _d, _e, _f;
3135
3135
  /* -------------- Props ------------- */
3136
3136
  // Destructure props
3137
3137
  const { LogMetadata, onClose, } = props;
3138
- // Add built-in LogMetadata
3139
- // > Add "uncategorized" subcontext to each context
3140
- Object.keys((_a = LogMetadata.Context) !== null && _a !== void 0 ? _a : {}).forEach((context) => {
3141
- if (
3142
- // Context exists
3143
- LogMetadata.Context
3144
- // Context has children already
3145
- && typeof LogMetadata.Context[context] !== 'string') {
3146
- LogMetadata.Context[context][LogBuiltInMetadata.Context.Uncategorized] = (LogBuiltInMetadata.Context.Uncategorized);
3147
- }
3148
- });
3149
- // > Add built-in contexts
3150
- LogMetadata.Context = ((_b = LogMetadata.Context) !== null && _b !== void 0 ? _b : {});
3151
- Object.keys(LogBuiltInMetadata.Context).forEach((context) => {
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
- // > Add built-in targets
3157
- LogMetadata.Target = ((_c = LogMetadata.Target) !== null && _c !== void 0 ? _c : {});
3158
- Object.keys(LogBuiltInMetadata.Target).forEach((target) => {
3159
- if (LogMetadata.Target) {
3160
- LogMetadata.Target[target] = target;
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((_d = LogMetadata.Context) !== null && _d !== void 0 ? _d : {}).forEach((context) => {
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((_e = LogMetadata.Tag) !== null && _e !== void 0 ? _e : {}).forEach((tag) => {
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((_f = LogMetadata.Target) !== null && _f !== void 0 ? _f : {}).forEach((target) => {
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 All"))));
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 pickableItems = (Object.keys((_g = LogMetadata.Context) !== null && _g !== void 0 ? _g : {})
3454
- .map((context) => {
3455
- var _a;
3456
- const value = ((_a = LogMetadata.Context) !== null && _a !== void 0 ? _a : {})[context];
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
- return item;
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
- return item;
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.children.forEach((subcontextItem) => {
3495
- if (!subcontextItem.isGroup) {
3496
- contextFilterState[pickableItem.id][subcontextItem.id] = (subcontextItem.checked);
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" }, Object.keys((_h = LogMetadata.Tag) !== null && _h !== void 0 ? _h : {})
3514
- .map((tag, i) => {
3515
- const description = genHumanReadableName(tag);
3516
- 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) => {
3517
- tagFilterState[tag] = checked;
3518
- dispatch({
3519
- type: ActionType.UpdateTagFilterState,
3520
- tagFilterState,
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" }, Object.keys(LogAction$1)
3553
- .map((action, i) => {
3554
- const description = genHumanReadableName(action);
3555
- 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: i === Object.keys(LogAction$1).length - 1, checked: actionErrorFilterState.action[action], onChanged: (checked) => {
3556
- actionErrorFilterState.action[action] = checked;
3557
- console.log(actionErrorFilterState, action, checked);
3558
- dispatch({
3559
- type: ActionType.UpdateActionErrorFilterState,
3560
- actionErrorFilterState,
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
- (Object.keys((_j = LogMetadata.Target) !== null && _j !== void 0 ? _j : {}).length === 0) && (React__default["default"].createElement("div", null, "This app does not have any targets yet.")),
3566
- Object.keys((_k = LogMetadata.Target) !== null && _k !== void 0 ? _k : {})
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
- }, noMarginOnRight: i === Object.keys((_a = LogMetadata.Target) !== null && _a !== void 0 ? _a : {}).length - 1 }));
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", value: advancedFilterState.routePath, onChange: (e) => {
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({