dce-reactkit 3.9.4-beta-logreviewer.4 → 3.9.4-beta-logreviewer.6

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
@@ -3555,12 +3555,12 @@ var ActionType$6;
3555
3555
  ActionType["UpdateActionErrorFilterState"] = "update-action-error-filter-state";
3556
3556
  // Update the advanced filter state
3557
3557
  ActionType["UpdateAdvancedFilterState"] = "update-advanced-filter-state";
3558
- // Increment the page number
3559
- ActionType["IncrementPageNumber"] = "increment-page-number";
3560
- // Decrement the page number
3561
- ActionType["DecrementPageNumber"] = "decrement-page-number";
3562
3558
  // Set has another page
3563
3559
  ActionType["SetHasAnotherPage"] = "set-has-another-page";
3560
+ // Set the number of pages
3561
+ ActionType["SetNumPages"] = "set-num-pages";
3562
+ // Set page number
3563
+ ActionType["SetPageNumber"] = "set-page-number";
3564
3564
  })(ActionType$6 || (ActionType$6 = {}));
3565
3565
  /**
3566
3566
  * Reducer that executes actions
@@ -3571,10 +3571,10 @@ var ActionType$6;
3571
3571
  const reducer$7 = (state, action) => {
3572
3572
  switch (action.type) {
3573
3573
  case ActionType$6.StartLoading: {
3574
- return Object.assign(Object.assign({}, state), { loading: true });
3574
+ return Object.assign(Object.assign({}, state), { loading: true, showSpinner: action.filtersChanged });
3575
3575
  }
3576
3576
  case ActionType$6.FinishLoading: {
3577
- return Object.assign(Object.assign({}, state), { loading: false, logs: action.logs });
3577
+ return Object.assign(Object.assign({}, state), { loading: false, showSpinner: false, logs: action.logs });
3578
3578
  }
3579
3579
  case ActionType$6.ToggleFilterDrawer: {
3580
3580
  return Object.assign(Object.assign({}, state), { expandedFilterDrawer: (state.expandedFilterDrawer === action.filterDrawer
@@ -3585,7 +3585,7 @@ const reducer$7 = (state, action) => {
3585
3585
  return Object.assign(Object.assign({}, state), { expandedFilterDrawer: undefined });
3586
3586
  }
3587
3587
  case ActionType$6.ResetFilters: {
3588
- return Object.assign(Object.assign({}, state), { dateFilterState: action.initDateFilterState, contextFilterState: action.initContextFilterState, tagFilterState: action.initTagFilterState, actionErrorFilterState: action.initActionErrorFilterState, advancedFilterState: action.initAdvancedFilterState, numTimesFiltersReset: state.numTimesFiltersReset + 1 });
3588
+ return Object.assign(Object.assign({}, state), { dateFilterState: action.initDateFilterState, contextFilterState: action.initContextFilterState, tagFilterState: action.initTagFilterState, actionErrorFilterState: action.initActionErrorFilterState, advancedFilterState: action.initAdvancedFilterState, pageNumber: 1 });
3589
3589
  }
3590
3590
  case ActionType$6.UpdateDateFilterState: {
3591
3591
  return Object.assign(Object.assign({}, state), { dateFilterState: action.dateFilterState });
@@ -3602,15 +3602,15 @@ const reducer$7 = (state, action) => {
3602
3602
  case ActionType$6.UpdateAdvancedFilterState: {
3603
3603
  return Object.assign(Object.assign({}, state), { advancedFilterState: action.advancedFilterState });
3604
3604
  }
3605
- case ActionType$6.IncrementPageNumber: {
3606
- return Object.assign(Object.assign({}, state), { pageNumber: state.pageNumber + 1 });
3607
- }
3608
- case ActionType$6.DecrementPageNumber: {
3609
- return Object.assign(Object.assign({}, state), { pageNumber: state.pageNumber - 1 });
3610
- }
3611
3605
  case ActionType$6.SetHasAnotherPage: {
3612
3606
  return Object.assign(Object.assign({}, state), { hasAnotherPage: action.hasAnotherPage });
3613
3607
  }
3608
+ case ActionType$6.SetNumPages: {
3609
+ return Object.assign(Object.assign({}, state), { numPages: action.numPages });
3610
+ }
3611
+ case ActionType$6.SetPageNumber: {
3612
+ return Object.assign(Object.assign({}, state), { pageNumber: action.pageNumber });
3613
+ }
3614
3614
  default: {
3615
3615
  return state;
3616
3616
  }
@@ -3728,6 +3728,7 @@ const LogReviewer = (props) => {
3728
3728
  // Initial state
3729
3729
  const initialState = {
3730
3730
  loading: true,
3731
+ showSpinner: true,
3731
3732
  logs: [],
3732
3733
  expandedFilterDrawer: undefined,
3733
3734
  dateFilterState: initDateFilterState,
@@ -3737,29 +3738,25 @@ const LogReviewer = (props) => {
3737
3738
  advancedFilterState: initAdvancedFilterState,
3738
3739
  pageNumber: 1,
3739
3740
  hasAnotherPage: false,
3740
- numTimesFiltersReset: 0,
3741
+ numPages: 1,
3741
3742
  };
3742
3743
  // Initialize state
3743
3744
  const [state, dispatch] = React.useReducer(reducer$7, initialState);
3744
3745
  // Destructure common state
3745
- const { loading, logs, expandedFilterDrawer, dateFilterState, contextFilterState, tagFilterState, actionErrorFilterState, advancedFilterState, pageNumber, hasAnotherPage, numTimesFiltersReset, } = state;
3746
+ const { loading, showSpinner, logs, expandedFilterDrawer, dateFilterState, contextFilterState, tagFilterState, actionErrorFilterState, advancedFilterState, pageNumber, hasAnotherPage, numPages, } = state;
3746
3747
  /*------------------------------------------------------------------------*/
3747
3748
  /* ------------------------- Component Functions ------------------------ */
3748
3749
  /*------------------------------------------------------------------------*/
3749
3750
  /**
3750
3751
  * Fetch logs from the server based on current filters
3751
3752
  */
3752
- const fetchLogs = () => __awaiter(void 0, void 0, void 0, function* () {
3753
- dispatch({ type: ActionType$6.StartLoading });
3753
+ const fetchLogs = (opts) => __awaiter(void 0, void 0, void 0, function* () {
3754
+ const { filters, pageNum, filtersChanged, } = opts;
3755
+ dispatch({
3756
+ type: ActionType$6.StartLoading,
3757
+ filtersChanged,
3758
+ });
3754
3759
  try {
3755
- // Prepare filter parameters
3756
- const filters = {
3757
- dateFilterState,
3758
- contextFilterState,
3759
- tagFilterState,
3760
- actionErrorFilterState,
3761
- advancedFilterState,
3762
- };
3763
3760
  // Send filters to the server
3764
3761
  let fetchedLogs = [];
3765
3762
  // Get logs from server
@@ -3767,8 +3764,9 @@ const LogReviewer = (props) => {
3767
3764
  path: LOG_REVIEW_GET_LOGS_ROUTE,
3768
3765
  method: 'GET',
3769
3766
  params: {
3770
- pageNumber,
3767
+ pageNumber: pageNum,
3771
3768
  filters,
3769
+ countDocuments: filtersChanged,
3772
3770
  },
3773
3771
  });
3774
3772
  fetchedLogs = fetchedLogs.concat(response.items);
@@ -3776,11 +3774,22 @@ const LogReviewer = (props) => {
3776
3774
  type: ActionType$6.SetHasAnotherPage,
3777
3775
  hasAnotherPage: response.hasAnotherPage,
3778
3776
  });
3777
+ if (filtersChanged && response.numPages) {
3778
+ dispatch({
3779
+ type: ActionType$6.SetNumPages,
3780
+ numPages: response.numPages,
3781
+ });
3782
+ }
3779
3783
  // Update logs in state
3780
3784
  dispatch({
3781
3785
  type: ActionType$6.FinishLoading,
3782
3786
  logs: fetchedLogs,
3783
3787
  });
3788
+ // Update page number
3789
+ dispatch({
3790
+ type: ActionType$6.SetPageNumber,
3791
+ pageNumber: pageNum,
3792
+ });
3784
3793
  }
3785
3794
  catch (err) {
3786
3795
  return showFatalError(err);
@@ -3789,14 +3798,20 @@ const LogReviewer = (props) => {
3789
3798
  /*------------------------------------------------------------------------*/
3790
3799
  /* ------------------------- Lifecycle Functions ------------------------ */
3791
3800
  /*------------------------------------------------------------------------*/
3792
- /**
3793
- * Fetch logs whenever page number changes or filters are reset
3794
- */
3801
+ // Fetch logs on mount
3795
3802
  React.useEffect(() => {
3796
- fetchLogs();
3797
- }, [
3798
- pageNumber, numTimesFiltersReset,
3799
- ]);
3803
+ fetchLogs({
3804
+ filters: {
3805
+ dateFilterState,
3806
+ contextFilterState,
3807
+ tagFilterState,
3808
+ actionErrorFilterState,
3809
+ advancedFilterState,
3810
+ },
3811
+ pageNum: 1,
3812
+ filtersChanged: true,
3813
+ });
3814
+ }, []);
3800
3815
  /*------------------------------------------------------------------------*/
3801
3816
  /* ------------------------------- Render ------------------------------- */
3802
3817
  /*------------------------------------------------------------------------*/
@@ -3806,7 +3821,7 @@ const LogReviewer = (props) => {
3806
3821
  // Body that will be filled with the contents of the panel
3807
3822
  let body;
3808
3823
  /* ------------- Loading ------------ */
3809
- if (loading) {
3824
+ if (showSpinner) {
3810
3825
  body = (React__default["default"].createElement("div", { className: "text-center p-5" },
3811
3826
  React__default["default"].createElement(LoadingSpinner, null)));
3812
3827
  }
@@ -3815,9 +3830,17 @@ const LogReviewer = (props) => {
3815
3830
  /* ------------ Pagination -------------- */
3816
3831
  /*----------------------------------------*/
3817
3832
  const paginationControls = logs.length > 0 && (React__default["default"].createElement("div", { className: "text-center mt-3" },
3818
- React__default["default"].createElement("button", { type: "button", className: "btn btn-secondary me-2", disabled: pageNumber <= 1, onClick: () => {
3819
- dispatch({
3820
- type: ActionType$6.DecrementPageNumber,
3833
+ React__default["default"].createElement("button", { type: "button", className: "btn btn-secondary me-2", disabled: pageNumber <= 1 || loading, onClick: () => {
3834
+ fetchLogs({
3835
+ filters: {
3836
+ dateFilterState,
3837
+ contextFilterState,
3838
+ tagFilterState,
3839
+ actionErrorFilterState,
3840
+ advancedFilterState,
3841
+ },
3842
+ pageNum: pageNumber - 1,
3843
+ filtersChanged: false,
3821
3844
  });
3822
3845
  } },
3823
3846
  React__default["default"].createElement(reactFontawesome.FontAwesomeIcon, { icon: freeSolidSvgIcons.faArrowLeft, className: "me-2" }),
@@ -3825,10 +3848,22 @@ const LogReviewer = (props) => {
3825
3848
  React__default["default"].createElement("span", { className: "mx-3" },
3826
3849
  "Page",
3827
3850
  ' ',
3828
- pageNumber),
3829
- React__default["default"].createElement("button", { type: "button", className: "btn btn-secondary ms-2", disabled: !hasAnotherPage, onClick: () => {
3830
- dispatch({
3831
- type: ActionType$6.IncrementPageNumber,
3851
+ pageNumber,
3852
+ ' ',
3853
+ "of",
3854
+ ' ',
3855
+ numPages),
3856
+ React__default["default"].createElement("button", { type: "button", className: "btn btn-secondary ms-2", disabled: !hasAnotherPage || loading, onClick: () => {
3857
+ fetchLogs({
3858
+ filters: {
3859
+ dateFilterState,
3860
+ contextFilterState,
3861
+ tagFilterState,
3862
+ actionErrorFilterState,
3863
+ advancedFilterState,
3864
+ },
3865
+ pageNum: pageNumber + 1,
3866
+ filtersChanged: false,
3832
3867
  });
3833
3868
  } },
3834
3869
  "Next Page",
@@ -3881,6 +3916,17 @@ const LogReviewer = (props) => {
3881
3916
  React__default["default"].createElement(reactFontawesome.FontAwesomeIcon, { icon: freeSolidSvgIcons.faList, className: "me-2" }),
3882
3917
  "Advanced"),
3883
3918
  React__default["default"].createElement("button", { type: "button", id: "LogReviewer-reset-filters-button", className: "btn btn-light", "aria-label": "reset filters", onClick: () => {
3919
+ fetchLogs({
3920
+ filters: {
3921
+ dateFilterState: initDateFilterState,
3922
+ contextFilterState: initContextFilterState,
3923
+ tagFilterState: initTagFilterState,
3924
+ actionErrorFilterState: initActionErrorFilterState,
3925
+ advancedFilterState: initAdvancedFilterState,
3926
+ },
3927
+ pageNum: 1,
3928
+ filtersChanged: true,
3929
+ });
3884
3930
  dispatch({
3885
3931
  type: ActionType$6.ResetFilters,
3886
3932
  initActionErrorFilterState,
@@ -3900,7 +3946,17 @@ const LogReviewer = (props) => {
3900
3946
  dispatch({
3901
3947
  type: ActionType$6.HideFilterDrawer,
3902
3948
  });
3903
- fetchLogs();
3949
+ fetchLogs({
3950
+ filters: {
3951
+ dateFilterState,
3952
+ contextFilterState,
3953
+ tagFilterState,
3954
+ actionErrorFilterState,
3955
+ advancedFilterState,
3956
+ },
3957
+ pageNum: 1,
3958
+ filtersChanged: true,
3959
+ });
3904
3960
  } },
3905
3961
  React__default["default"].createElement(reactFontawesome.FontAwesomeIcon, { icon: freeSolidSvgIcons.faSearch }),
3906
3962
  ' ',
@@ -4281,14 +4337,16 @@ const LogReviewer = (props) => {
4281
4337
  filterToggles,
4282
4338
  filterDrawer && (React__default["default"].createElement(Drawer, { customBackgroundColor: "#eee" }, filterDrawer))));
4283
4339
  // Main body
4284
- body = (React__default["default"].createElement(React__default["default"].Fragment, null,
4285
- filters,
4286
- React__default["default"].createElement("div", { className: "mt-2" },
4287
- React__default["default"].createElement(IntelliTable, { title: "Matching Logs:", csvName: `Logs from ${getHumanReadableDate()}`, id: "logs", data: logs, columns: columns }),
4288
- logs.length === 0 && (React__default["default"].createElement("div", { className: "alert alert-warning text-center mt-2" },
4289
- React__default["default"].createElement("h4", { className: "m-1" }, "No Logs to Show"),
4290
- React__default["default"].createElement("div", null, "Either your filters are too strict or no matching logs have been created yet."))),
4291
- paginationControls)));
4340
+ if (!showSpinner) {
4341
+ body = (React__default["default"].createElement(React__default["default"].Fragment, null,
4342
+ filters,
4343
+ React__default["default"].createElement("div", { className: "mt-2" },
4344
+ React__default["default"].createElement(IntelliTable, { title: "Matching Logs:", csvName: `Logs from ${getHumanReadableDate()}`, id: "logs", data: logs, columns: columns }),
4345
+ logs.length === 0 && (React__default["default"].createElement("div", { className: "alert alert-warning text-center mt-2" },
4346
+ React__default["default"].createElement("h4", { className: "m-1" }, "No Logs to Show"),
4347
+ React__default["default"].createElement("div", null, "Either your filters are too strict or no matching logs have been created yet."))),
4348
+ paginationControls)));
4349
+ }
4292
4350
  /* ---------- Wrap in Modal --------- */
4293
4351
  return (React__default["default"].createElement("div", { className: "LogReviewer-outer-container" },
4294
4352
  React__default["default"].createElement("style", null, style$2),
@@ -13810,10 +13868,11 @@ const initServer = (opts) => {
13810
13868
  paramTypes: {
13811
13869
  pageNumber: ParamType$1.Int,
13812
13870
  filters: ParamType$1.JSON,
13871
+ countDocuments: ParamType$1.Boolean,
13813
13872
  },
13814
13873
  handler: ({ params }) => __awaiter(void 0, void 0, void 0, function* () {
13815
13874
  // Get user info
13816
- const { pageNumber, userId, isAdmin, filters, } = params;
13875
+ const { pageNumber, userId, isAdmin, filters, countDocuments, } = params;
13817
13876
  const { dateFilterState, contextFilterState, tagFilterState, actionErrorFilterState, advancedFilterState, } = filters;
13818
13877
  // Validate user
13819
13878
  const canReview = yield canReviewLogs(userId, isAdmin);
@@ -13980,6 +14039,10 @@ const initServer = (opts) => {
13980
14039
  perPage: 50,
13981
14040
  pageNumber,
13982
14041
  });
14042
+ // Count documents if requested
14043
+ if (countDocuments) {
14044
+ response.numPages = Math.ceil((yield _logCollection.count(query)) / 50);
14045
+ }
13983
14046
  // Return response
13984
14047
  return response;
13985
14048
  }),