Skip to content

Commit 63c376d

Browse files
committed
Implemented pagination in trash.
1 parent 3d6254b commit 63c376d

File tree

7 files changed

+127
-27
lines changed

7 files changed

+127
-27
lines changed

client/packages/lowcoder/src/api/applicationApi.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,15 @@ import {
55
DeleteApplicationPayload,
66
DeleteAppPermissionPayload,
77
FetchAppInfoPayload,
8+
FetchApplicationElementsPaginationPayload,
89
HomeDataPayload,
910
PublishApplicationPayload,
1011
RecycleApplicationPayload,
1112
RestoreApplicationPayload,
1213
SetAppEditingStatePayload,
1314
UpdateAppPermissionPayload,
1415
} from "redux/reduxActions/applicationActions";
15-
import { ApiResponse, GenericApiResponse } from "./apiResponses";
16+
import {ApiResponse, GenericApiPaginationResponse, GenericApiResponse} from "./apiResponses";
1617
import { JSONObject, JSONValue } from "util/jsonTypes";
1718
import {
1819
ApplicationDetail,
@@ -108,6 +109,10 @@ class ApplicationApi extends Api {
108109
return Api.get(ApplicationApi.newURLPrefix + "/list", { ...request, withContainerSize: false });
109110
}
110111

112+
static fetchAllApplicationsPagination(request: FetchApplicationElementsPaginationPayload): AxiosPromise<GenericApiPaginationResponse<ApplicationMeta[]>> {
113+
return Api.get(ApplicationApi.newURLPrefix + "/list", { ...request, withContainerSize: false, applicationStatus: "RECYCLED" });
114+
}
115+
111116
static fetchAllModules(request: HomeDataPayload): AxiosPromise<ApplicationMeta[]> {
112117
return Api.get(ApplicationApi.newURLPrefix + "/list", {
113118
applicationType: AppTypeEnum.Module,
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
export const BackButton = () =>{
2+
return
3+
<div>123</div>
4+
}

client/packages/lowcoder/src/pages/ApplicationV2/HomeLayout.tsx

Lines changed: 42 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -313,9 +313,9 @@ export interface HomeLayoutProps {
313313
currentPage?: number;
314314
pageSize?: number;
315315
total?: number;
316+
searchValues?: number;
316317
setSearchValues?: any;
317-
typeFilter?: number;
318-
setTypeFilter?: any;
318+
setTypeFilterPagination?: any;
319319
}
320320

321321
export function HomeLayout(props: HomeLayoutProps) {
@@ -328,10 +328,11 @@ export function HomeLayout(props: HomeLayoutProps) {
328328
setPageSize,
329329
pageSize,
330330
currentPage,
331+
searchValues,
331332
setSearchValues,
332333
total,
333-
typeFilter,
334-
setTypeFilter,
334+
setTypeFilterPagination,
335+
335336
} = props;
336337
console.log("elements", elements, total);
337338
const handlePageChange = (page: number) => {
@@ -357,9 +358,10 @@ export function HomeLayout(props: HomeLayoutProps) {
357358
const user = useSelector(getUser);
358359
const isFetching = useSelector(isFetchingFolderElements);
359360
const isSelfHost = window.location.host !== 'app.lowcoder.cloud';
361+
const [typeFilter, setTypeFilter] = useState<HomeResKey>("All");
360362
const [categoryFilter, setCategoryFilter] = useState<ApplicationCategoriesEnum | "All">("All");
361363
const [searchValue, setSearchValue] = useState("");
362-
const [visibility, setVisibility] = useState(mode !== "marketplace");
364+
const [visibility, setVisibility] = useState(mode === "view" || mode === "trash");
363365
const [layout, setLayout] = useState<HomeLayoutType>(
364366
checkIsMobile(window.innerWidth) ? "card" : getHomeLayout()
365367
);
@@ -379,11 +381,11 @@ export function HomeLayout(props: HomeLayoutProps) {
379381

380382
var displayElements = elements.sort((a, b) => {
381383
if (a.folder && !b.folder) {
382-
return -1; // a is a folder and should come first
384+
return -1;
383385
} else if (!a.folder && b.folder) {
384-
return 1; // b is a folder and should come first
386+
return 1;
385387
} else {
386-
return 0; // both are folders or both are not, keep original order
388+
return 0;
387389
}
388390
});
389391

@@ -398,6 +400,33 @@ export function HomeLayout(props: HomeLayoutProps) {
398400
displayElements = [...markedLocalApps];
399401
}
400402
const resList: HomeRes[] = displayElements
403+
.filter((e) => {
404+
if (!visibility) {
405+
if (searchValue) {
406+
const lowerCaseSearchValue = searchValue.toLocaleLowerCase();
407+
return e.name?.toLocaleLowerCase().includes(lowerCaseSearchValue) ||
408+
e.createBy?.toLocaleLowerCase().includes(lowerCaseSearchValue);
409+
}
410+
return true;
411+
}
412+
return true;
413+
})
414+
.filter((e) => {
415+
if(!visibility) {
416+
if (HomeResTypeEnum[typeFilter].valueOf() === HomeResTypeEnum.All) {
417+
return true;
418+
}
419+
if (e.folder) {
420+
return HomeResTypeEnum[typeFilter] === HomeResTypeEnum.Folder;
421+
} else {
422+
if (typeFilter === "Navigation") {
423+
return NavigationTypes.map((t) => t.valueOf()).includes(e.applicationType);
424+
}
425+
return HomeResTypeEnum[typeFilter].valueOf() === e.applicationType;
426+
}
427+
}
428+
return true;
429+
})
401430
.filter((e) => {
402431
// If "All" is selected, do not filter out any elements based on category
403432
if (categoryFilter === 'All' || !categoryFilter) {
@@ -503,10 +532,12 @@ export function HomeLayout(props: HomeLayoutProps) {
503532
{mode !== "folders" && mode !== "module" && (
504533
<FilterDropdown
505534
variant="borderless"
506-
value={HomeResTypeEnum[typeFilter || 0]}
535+
value={typeFilter}
507536
onChange={(value: any) => {
508-
console.log(HomeResTypeEnum[value])
509-
setTypeFilter(HomeResTypeEnum[value])}
537+
setTypeFilter(value as HomeResKey);
538+
if(visibility)
539+
setTypeFilterPagination(HomeResTypeEnum[value])
540+
}
510541
}
511542
options={[
512543
getFilterMenuItem(HomeResTypeEnum.All),

client/packages/lowcoder/src/pages/ApplicationV2/HomeView.tsx

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,13 @@ export function HomeView() {
2121
const [typeFilter, setTypeFilter] = useState<number>(0);
2222
useEffect( () => {
2323
try{
24-
2524
fetchFolderElements({
2625
pageNum:currentPage,
2726
pageSize:pageSize,
2827
applicationType: ApplicationPaginationType[typeFilter],
2928
name: searchValues,
3029
}).then(
3130
data => {
32-
console.log(data)
3331
if (data.success) {
3432
setElements({elements: data.data || [], total: data.total || 1})
3533
}
@@ -63,8 +61,7 @@ export function HomeView() {
6361
setPageSize={setPageSize}
6462
total={elements.total}
6563
setSearchValues={setSearchValues}
66-
typeFilter={typeFilter}
67-
setTypeFilter={setTypeFilter}
64+
setTypeFilterPagination={setTypeFilter}
6865
/>
6966
</>
7067
);
Lines changed: 45 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,61 @@
11
import { HomeLayout } from "./HomeLayout";
2-
import { useDispatch, useSelector } from "react-redux";
3-
import { recycleListSelector } from "../../redux/selectors/applicationSelector";
42
import { TRASH_URL } from "../../constants/routesURL";
5-
import { useEffect } from "react";
6-
import { fetchApplicationRecycleList } from "../../redux/reduxActions/applicationActions";
3+
import {useEffect, useState} from "react";
74
import { trans } from "../../i18n";
85
import { Helmet } from "react-helmet";
6+
import {fetchApplicationElements} from "@lowcoder-ee/util/pagination/axios";
7+
8+
interface ElementsState {
9+
elements: any;
10+
total: number;
11+
}
912

1013
export function TrashView() {
11-
const dispatch = useDispatch();
12-
const recycleList = useSelector(recycleListSelector);
14+
const [elements, setElements] = useState<ElementsState>({ elements: [], total: 1 });
15+
const [currentPage, setCurrentPage] = useState(1);
16+
const [pageSize, setPageSize] = useState(10);
17+
const [searchValues, setSearchValues] = useState("");
18+
const [typeFilter, setTypeFilter] = useState<number>(0);
1319

14-
useEffect(() => {
15-
dispatch(fetchApplicationRecycleList());
16-
}, [dispatch]);
20+
useEffect( () => {
21+
if (typeFilter === 7) // Application of Navigation is 3 in API.
22+
setTypeFilter(3);
23+
try{
24+
fetchApplicationElements({
25+
pageNum:currentPage,
26+
pageSize:pageSize,
27+
applicationType: typeFilter,
28+
name: searchValues,
29+
}).then(
30+
data => {
31+
if (data.success) {
32+
setElements({elements: data.data || [], total: data.total || 1})
33+
}
34+
else
35+
console.error("ERROR: fetchFolderElements", data.error)
36+
}
37+
);
38+
} catch (error) {
39+
console.error('Failed to fetch data:', error);
40+
}
41+
}, [currentPage, pageSize, searchValues, typeFilter]
42+
);
1743

1844
return (
1945
<>
2046
<Helmet>{<title>{trans("home.trash")}</title>}</Helmet>
2147
<HomeLayout
22-
elements={recycleList}
48+
elements={elements.elements}
2349
breadcrumb={[{ text: trans("home.trash"), path: TRASH_URL }]}
24-
mode={"trash"} />
50+
mode={"trash"}
51+
currentPage ={currentPage}
52+
setCurrentPage={setCurrentPage}
53+
pageSize={pageSize}
54+
setPageSize={setPageSize}
55+
total={elements.total}
56+
setSearchValues={setSearchValues}
57+
setTypeFilterPagination={setTypeFilter}
58+
/>
2559
</>
2660
);
2761
}

client/packages/lowcoder/src/redux/reduxActions/applicationActions.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,13 @@ export type SetAppEditingStatePayload = {
140140
editingFinished: boolean;
141141
};
142142

143+
export interface FetchApplicationElementsPaginationPayload {
144+
pageNum?: number;
145+
pageSize?: number;
146+
name?: string;
147+
applicationType?: number;
148+
}
149+
143150
export const fetchApplicationInfo = (payload: FetchAppInfoPayload) => ({
144151
type: ReduxActionTypes.FETCH_APPLICATION_DETAIL,
145152
payload: payload,

client/packages/lowcoder/src/util/pagination/axios.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
import { FolderApi } from "@lowcoder-ee/api/folderApi";
22
import { FetchFolderElementsPaginationPayload } from "@lowcoder-ee/redux/reduxActions/folderActions";
3+
import {
4+
FetchApplicationElementsPaginationPayload,
5+
} from "@lowcoder-ee/redux/reduxActions/applicationActions";
6+
import ApplicationApi from "@lowcoder-ee/api/applicationApi";
37

48
export const fetchFolderElements = async (request: FetchFolderElementsPaginationPayload) => {
59
try {
@@ -17,3 +21,21 @@ export const fetchFolderElements = async (request: FetchFolderElementsPagination
1721
};
1822
}
1923
}
24+
25+
26+
export const fetchApplicationElements = async (request: FetchApplicationElementsPaginationPayload)=> {
27+
try {
28+
const response = await ApplicationApi.fetchAllApplicationsPagination(request);
29+
return {
30+
success: true,
31+
data: response.data.data,
32+
total: response.data.total
33+
}
34+
} catch (error: any) {
35+
console.error('Failed to fetch data:', error);
36+
return {
37+
success: false,
38+
error: error
39+
};
40+
}
41+
}

0 commit comments

Comments
 (0)