Skip to content

Commit bbfe90a

Browse files
authored
FWF-4400 [added] added persist Task list data (#561)
* FWF-4400 [added] added persist tasklist data * code optimized based on sonar qube [modified] replace || with ?? operator * Fixed [modified] typo fixed of resetTaskListParams * replace || with ?? in filterService fetchServiceTaskList function
1 parent 259401a commit bbfe90a

File tree

10 files changed

+86
-27
lines changed

10 files changed

+86
-27
lines changed

forms-flow-nav/src/sidenav/Sidebar.jsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,7 @@ const Sidebar = React.memo(({ props, sidenavHeight="100%" }) => {
206206
},
207207
REVIEW: {
208208
value: "review",
209-
supportedRoutes: ["task"],
209+
supportedRoutes: ["task","review"],
210210
},
211211
ANALYZE: {
212212
value: "analyze",
@@ -364,6 +364,10 @@ const Sidebar = React.memo(({ props, sidenavHeight="100%" }) => {
364364
name: "Tasks",
365365
path: "task",
366366
},
367+
{
368+
name: "Review",
369+
path: "review",
370+
},
367371
]}
368372
subscribe={props.subscribe}
369373
/>

forms-flow-review/src/actions/actionConstants.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ export default {
2727
UPDATE_FILTER_LIST_SORT_PARAMS: "UPDATE_FILTER_LIST_SORT_PARAMS",
2828
IS_BPM_TASK_DETAIL_LOADING: "IS_BPM_TASK_DETAIL_LOADING",
2929
LIST_APPLICATION_HISTORY: "LIST_APPLICATION_HISTORY",
30+
RESET_TASK_LIST_PARAMS: "RESET_TASK_LIST_PARAMS",
3031
ATTRIBUTE_FILTER_LIST: "ATTRIBUTE_FILTER_LIST",
3132
BPM_SELECTED_ATTRIBUTE_FILTER: "BPM_SELECTED_ATTRIBUTE_FILTER",
3233
};

forms-flow-review/src/actions/taskActions.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,3 +174,8 @@ export const setBPMFilterSearchParams = (data) => (dispatch) => {
174174
payload: data,
175175
});
176176
};
177+
178+
export const resetTaskListParams = (data) =>({
179+
type: ACTION_CONSTANTS.RESET_TASK_LIST_PARAMS,
180+
payload: data,
181+
})

forms-flow-review/src/api/services/filterServices.ts

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,22 @@ export const fetchUserList = (...rest) => {
4040
};
4141

4242

43-
export const fetchServiceTaskList = (reqData, taskIdToRemove, firstResult, maxResults, ...rest) => {
43+
/**
44+
* Fetches the task list from the server and updates the redux store with the task list and count.
45+
* @param {Object} reqData - The request data to be sent to the server.
46+
* @param {string} taskIdToRemove - The task ID to be removed from the task list.
47+
* @param {number} pageNo - The current page number.
48+
* @param {number} maxResults - The maximum number of results to be fetched.
49+
* @param {function} done - A callback function to be called after the request is completed.
50+
*/
51+
export const fetchServiceTaskList = (reqData, taskIdToRemove, pageNo, maxResults, ...rest) => {
4452
const done = rest.length ? rest[0] : () => {};
53+
// create the firstResult value based on the page number and maxResults
54+
// firstResult = (pageNo - 1) * maxResults
55+
const firstResultIndex = getFirstResultIndex(pageNo,maxResults);
56+
4557
const apiUrlgetTaskList =
46-
`${API.GET_BPM_TASK_FILTERS}?firstResult=${firstResult}&maxResults=${maxResults ?? MAX_RESULTS}`
58+
`${API.GET_BPM_TASK_FILTERS}?firstResult=${firstResultIndex}&maxResults=${maxResults ?? MAX_RESULTS}`;
4759
return (dispatch) => {
4860
RequestService.httpPOSTRequestWithHAL(
4961
apiUrlgetTaskList,
@@ -100,8 +112,9 @@ export const fetchUserList = (...rest) => {
100112
);
101113
};
102114

103-
export const getFirstResultIndex = (activePage) => {
104-
return (activePage * MAX_RESULTS) - MAX_RESULTS;
115+
export const getFirstResultIndex = (activePage,limit) => {
116+
const limits = limit ?? MAX_RESULTS;
117+
return (activePage * limits) - limits;
105118
};
106119

107120

forms-flow-review/src/components/AttributeFilterModal.tsx

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import { useTranslation } from "react-i18next";
1111
import PropTypes from "prop-types";
1212
import { useState, useMemo } from "react";
1313
import { useSelector, useDispatch } from "react-redux";
14-
import { MAX_RESULTS, PRIVATE_ONLY_YOU } from "../constants/index";
14+
import { PRIVATE_ONLY_YOU } from "../constants/index";
1515
import { StorageService, StyleServices } from "@formsflow/service";
1616
import { Filter, FilterCriteria } from "../types/taskFilter";
1717
import {
@@ -38,7 +38,8 @@ export const AttributeFilterModal = ({
3838
const [filterNameError, setFilterNameError] = useState("");
3939
const [filterName, setFilterName] = useState("");
4040
const [shareAttrFilter, setShareAttrFilter] = useState(PRIVATE_ONLY_YOU);
41-
const firstResult = useSelector((state: any) => state.task.firstResult);
41+
const activePage = useSelector((state: any) => state.task.activePage);
42+
const limit = useSelector((state: any) => state.task.limit);
4243
const userRoles = StorageService.getParsedData(StorageService.User.USER_ROLE);
4344
const isCreateFilters = userRoles?.includes("create_filters");
4445
const filterNameLength = 50;
@@ -213,8 +214,8 @@ export const AttributeFilterModal = ({
213214
fetchServiceTaskList(
214215
getFilterData(updatedParams),
215216
null,
216-
firstResult,
217-
MAX_RESULTS
217+
activePage,
218+
limit,
218219
)
219220
);
220221

forms-flow-review/src/components/ResizableTable/ResizableTable.tsx

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@ import {
2626
setFilterListParams,
2727
setFilterListSortParams,
2828
setTaskListLimit,
29-
setDefaultFilter,
29+
setDefaultFilter,
30+
resetTaskListParams,
3031
setSelectedBpmAttributeFilter,
3132
} from "../../actions/taskActions";
3233

@@ -287,7 +288,6 @@ export function ResizableTable(): JSX.Element {
287288
selectedFilter = null,
288289
selectedAttributeFilter = null,
289290
taskId: bpmTaskId = null,
290-
firstResult = 0,
291291
limit,
292292
tasksList: taskList = [],
293293
defaultFilter = null,
@@ -298,6 +298,7 @@ export function ResizableTable(): JSX.Element {
298298
activePage,
299299
tasksCount,
300300
isTaskListLoading,
301+
filterCached,
301302
} = useSelector((state: any) => state.task ?? {});
302303
const selectedFilterId = selectedFilter?.id ?? null;
303304
const selectedAttributeFilterId = selectedAttributeFilter?.id ?? null;
@@ -412,7 +413,7 @@ export function ResizableTable(): JSX.Element {
412413
},
413414
};
414415
dispatch(setBPMTaskLoader(true));
415-
dispatch(fetchServiceTaskList(updatedFilter, null, firstResult, limit));
416+
dispatch(fetchServiceTaskList(updatedFilter, null, activePage, limit));
416417
}
417418
}, [isAssigned]);
418419

@@ -728,8 +729,13 @@ const extraItems = isFilterCreator ? [
728729
dispatch(setBPMTaskLoader(true));
729730
dispatch(setBPMTaskListActivePage(1));
730731
dispatch(
731-
fetchServiceTaskList(cloneDeep(updatedParams), null, firstResult, limit)
732+
fetchServiceTaskList(cloneDeep(updatedParams), null, activePage, limit)
732733
);
734+
}else if(filterCached){
735+
dispatch(resetTaskListParams({filterCached:false}));
736+
dispatch(
737+
fetchServiceTaskList(cloneDeep(updatedParams), null, activePage, limit)
738+
);
733739
}
734740
}, [
735741
selectedAttributeFilterId,
@@ -740,8 +746,6 @@ const extraItems = isFilterCreator ? [
740746
bpmattributeFilterList,
741747
selectedFilter,
742748
sortParams,
743-
firstResult,
744-
limit,
745749
reqData,
746750
]);
747751

@@ -800,14 +804,14 @@ const extraItems = isFilterCreator ? [
800804
dispatch(setBPMTaskLoader(true));
801805
dispatch(setBPMTaskListActivePage(1));
802806
dispatch(
803-
fetchServiceTaskList(formattedReqData, null, firstResult, limit)
807+
fetchServiceTaskList(formattedReqData, null, activePage, limit)
804808
);
805809
}
806810
}, [
807811
dispatch,
808812
reqData,
809813
selectedFilter,
810-
firstResult,
814+
activePage,
811815
limit,
812816
searchParams,
813817
bpmFiltersList,
@@ -885,17 +889,17 @@ const extraItems = isFilterCreator ? [
885889
(newLimit) => {
886890
dispatch(setBPMTaskLoader(true));
887891
dispatch(setTaskListLimit(newLimit));
888-
dispatch(fetchServiceTaskList(reqData, null, firstResult, newLimit));
892+
dispatch(setBPMTaskListActivePage(1));
893+
dispatch(fetchServiceTaskList(reqData, null, 1, newLimit));
889894
},
890-
[dispatch, reqData, firstResult]
895+
[dispatch, reqData, activePage]
891896
);
892897

893898
const handlePageChange = useCallback(
894899
(pageNumber) => {
895900
dispatch(setBPMTaskListActivePage(pageNumber));
896901
dispatch(setBPMTaskLoader(true));
897-
const firstResultIndex = limit * pageNumber - limit;
898-
dispatch(fetchServiceTaskList(reqData, null, firstResultIndex, limit));
902+
dispatch(fetchServiceTaskList(reqData, null, pageNumber, limit));
899903
},
900904
[dispatch, limit, reqData]
901905
);

forms-flow-review/src/components/TaskFilterModal.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ import {
2020
import { removeTenantKey, trimFirstSlash } from "../helper/helper.js";
2121
import {
2222
ACCESSIBLE_FOR_ALL_GROUPS,
23-
MAX_RESULTS,
2423
MULTITENANCY_ENABLED,
2524
PRIVATE_ONLY_YOU,
2625
SPECIFIC_USER_OR_GROUP,
@@ -74,8 +73,9 @@ export function TaskFilterModal({ show, onClose, filter, canEdit }) {
7473
const {
7574
userList = { data: [] },
7675
userGroups: candidateGroups = { data: [] },
77-
firstResult,
76+
activePage,
7877
defaultFilter,
78+
limit
7979
} = useSelector((state: any) => state.task);
8080
const { successState, startSuccessCountdown } = useSuccessCountdown();
8181
const userListData = userList.data ?? [];
@@ -522,7 +522,7 @@ export function TaskFilterModal({ show, onClose, filter, canEdit }) {
522522
const selectedFilter =
523523
filters.find((i) => defaultFilterId === i.id) ?? filters[0];
524524

525-
dispatch(fetchServiceTaskList(selectedFilter, null, firstResult, 15));
525+
dispatch(fetchServiceTaskList(selectedFilter, null, activePage, limit));
526526
};
527527

528528

@@ -548,7 +548,7 @@ export function TaskFilterModal({ show, onClose, filter, canEdit }) {
548548

549549

550550
const filterResults = () => {
551-
dispatch(fetchServiceTaskList(getData(), null, firstResult, MAX_RESULTS, (error) => {
551+
dispatch(fetchServiceTaskList(getData(), null, activePage, limit, (error) => {
552552
if (error) {
553553
console.error("Error fetching tasks:", error);
554554
return;

forms-flow-review/src/reducers/taskReducer.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ const initialState = {
1515
name: { sortOrder: "asc" },
1616
assignee: { sortOrder: "asc" },
1717
},
18-
firstResult: 0,
1918
limit: 5,
19+
activePage: 1,
2020
selectedFilter: {},
2121
selectedAttributeFilter: {},
2222
taskId: null,
@@ -94,6 +94,8 @@ const TaskHandler = (state = initialState, action: TaskAction) => {
9494
return { ...state, limit: action.payload };
9595
case ACTION_CONSTANTS.UPDATE_FILTER_SEARCH_PARAMS:
9696
return { ...state, filterListSearchParams: action.payload };
97+
case ACTION_CONSTANTS.RESET_TASK_LIST_PARAMS:
98+
return {...state, ...action.payload}
9799
default:
98100
return state;
99101
}

forms-flow-review/src/root.component.tsx

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,29 @@ import { BASE_ROUTE } from "./constants";
44
import { Provider } from "react-redux";
55
import StoreService from "./services/StoreService";
66
import { ConnectedRouter } from "connected-react-router";
7-
7+
import { useEffect } from "react";
8+
import { StorageService} from "@formsflow/service";
9+
import { resetTaskListParams } from "./actions/taskActions";
810
export default function Root(props: any) {
11+
const REVIEW_APP_KEY = "TASK_APP_DATA";
912
const store = StoreService.configureStore();
1013
const history = StoreService.history;
14+
15+
useEffect(()=>{
16+
/**
17+
* * This is to check if the user has come from the review app and if so, we need to set the task list params in the redux store.
18+
* * This is done to avoid the user from going back to the review app and losing the data in the redux store.
19+
*/
20+
const existingTaskData = StorageService.getParsedData(REVIEW_APP_KEY);
21+
if(existingTaskData){
22+
store.dispatch(resetTaskListParams({...existingTaskData,filterCached:true}));
23+
}
24+
StorageService.delete(REVIEW_APP_KEY);
25+
return()=>{
26+
StorageService.saveDataToSessionStorage(REVIEW_APP_KEY,store.getState().task);
27+
}
28+
},[])
29+
1130
return (
1231
<Provider store={store}>
1332
<ConnectedRouter history={history}>

forms-flow-service/src/storage/storageService.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,13 +36,23 @@ class StorageService {
3636
sessionStorage.setItem(key, value);
3737
localStorage.setItem(key,value);
3838
}
39+
/**
40+
* sets a new value for the key if present in the session storage
41+
* new key/value pair is created if the key is not present
42+
* @param key - key to be set in the session storage
43+
* @param value - value to be set in the session storage don't need to be stringified
44+
*/
45+
public static saveDataToSessionStorage(key: string, value: Object): void {
46+
sessionStorage.setItem(key, JSON.stringify(value));
47+
}
3948
/**
4049
* removes the key value pair from the session storage if
4150
* the key is present.
4251
* @param key
4352
*/
4453
public static delete(key: string): void {
4554
sessionStorage.removeItem(key);
55+
localStorage.removeItem(key);
4656
}
4757
/**
4858
* Removes all key/value pairs present in the session storage

0 commit comments

Comments
 (0)