Skip to content

Commit 606351c

Browse files
committed
Implemented pagination in Query Library and made fetchJsDatasourcePaginationByApp function.
1 parent ea6d088 commit 606351c

File tree

9 files changed

+209
-36
lines changed

9 files changed

+209
-36
lines changed

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

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,11 @@ import { JSONArray } from "util/jsonTypes";
88
import { AuthType, HttpOAuthGrantType } from "pages/datasource/form/httpDatasourceForm";
99
import { Datasource } from "@lowcoder-ee/constants/datasourceConstants";
1010
import { DataSourcePluginMeta } from "lowcoder-sdk/dataSource";
11-
import {fetchDBRequestType, GenericApiPaginationResponse} from "@lowcoder-ee/util/pagination/type";
11+
import {
12+
fetchDataSourcePaginationRequestType,
13+
fetchDBRequestType,
14+
GenericApiPaginationResponse
15+
} from "@lowcoder-ee/util/pagination/type";
1216

1317
export interface PreparedStatementConfig {
1418
enableTurnOffPreparedStatement: boolean;
@@ -165,6 +169,11 @@ export class DatasourceApi extends Api {
165169
return Api.get(DatasourceApi.url + `/jsDatasourcePlugins?appId=${appId}`);
166170
}
167171

172+
static fetchJsDatasourcePaginationByApp( request: fetchDataSourcePaginationRequestType ): AxiosPromise<GenericApiPaginationResponse<NodePluginDatasourceInfo[]>> {
173+
const {appId, ...res} = request
174+
return Api.get(DatasourceApi.url + `/jsDatasourcePlugins?appId=${appId}` ,{...res});
175+
}
176+
168177
static fetchDatasourceByApp(appId: string): AxiosPromise<GenericApiResponse<DatasourceInfo[]>> {
169178
return Api.get(DatasourceApi.url + `/listByApp?appId=${appId}`);
170179
}

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import Api from "./api";
22
import { AxiosPromise } from "axios";
33
import { GenericApiResponse } from "./apiResponses";
44
import { DatasourceType } from "@lowcoder-ee/constants/queryConstants";
5+
import {fetchQueryLibraryPaginationRequestType, GenericApiPaginationResponse} from "@lowcoder-ee/util/pagination/type";
56

67
export interface LibraryQuery {
78
id: string;
@@ -49,6 +50,10 @@ export class QueryLibraryApi extends Api {
4950
return Api.get(QueryLibraryApi.url + `/listByOrg`);
5051
}
5152

53+
static fetchQueryLibraryPaginationByOrg(request: fetchQueryLibraryPaginationRequestType): AxiosPromise<GenericApiPaginationResponse<Array<LibraryQuery>>> {
54+
return Api.get(QueryLibraryApi.url + `/listByOrg`, {...request});
55+
}
56+
5257
static fetchQueryLibraryDropdown(): AxiosPromise<
5358
GenericApiResponse<Array<LibraryQueryDropdownInfo>>
5459
> {

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

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,6 @@ export function HomeView() {
4141
}, [currentPage, pageSize, searchValues, typeFilter]
4242
);
4343

44-
console.log(currentPage, pageSize);
45-
4644
const user = useSelector(getUser);
4745

4846
if (!user.currentOrgId) {

client/packages/lowcoder/src/pages/editor/AppEditor.tsx

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ import { currentApplication } from "@lowcoder-ee/redux/selectors/applicationSele
3737
import { notificationInstance } from "components/GlobalInstances";
3838
import { AppState } from "@lowcoder-ee/redux/reducers";
3939
import { resetIconDictionary } from "@lowcoder-ee/constants/iconConstants";
40+
import {fetchJsDSPaginationByApp} from "@lowcoder-ee/util/pagination/axios";
41+
import PaginationComp from "@lowcoder-ee/util/pagination/Pagination";
4042

4143
const AppSnapshot = lazy(() => {
4244
return import("pages/editor/appSnapshot")
@@ -57,6 +59,9 @@ const AppEditor = React.memo(() => {
5759
const fetchOrgGroupsFinished = useSelector(getFetchOrgGroupsFinished);
5860
const isCommonSettingsFetching = useSelector(getIsCommonSettingFetching);
5961
const application = useSelector(currentApplication);
62+
const [currentPage, setCurrentPage] = useState(1);
63+
const [pageSize, setPageSize] = useState(10);
64+
const [elements, setElements] = useState({ elements: [], total: 1 })
6065
const isLowcoderCompLoading = useSelector((state: AppState) => state.npmPlugin.loading.lowcoderComps);
6166

6267
const isUserViewMode = useMemo(
@@ -140,8 +145,13 @@ const AppEditor = React.memo(() => {
140145
}, [dispatch, applicationId, paramViewMode]);
141146

142147
const fetchJSDataSourceByApp = useCallback(() => {
143-
DatasourceApi.fetchJsDatasourceByApp(applicationId).then((res) => {
144-
res.data.data.forEach((i) => {
148+
fetchJsDSPaginationByApp({
149+
appId: applicationId,
150+
pageNum: currentPage,
151+
pageSize: pageSize
152+
}).then((res) => {
153+
setElements({elements: [], total: res.total || 1})
154+
res.data!.forEach((i: any) => {
145155
registryDataSourcePlugin(i.type, i.id, i.pluginDefinition);
146156
});
147157
setIsDataSourcePluginRegistered(true);
@@ -153,6 +163,8 @@ const AppEditor = React.memo(() => {
153163
setIsDataSourcePluginRegistered,
154164
setShowAppSnapshot,
155165
dispatch,
166+
currentPage,
167+
pageSize
156168
]);
157169

158170
useEffect(() => {
@@ -219,6 +231,13 @@ const AppEditor = React.memo(() => {
219231

220232
return (
221233
<ErrorBoundary fallback={fallbackUI}>
234+
{/*<PaginationComp*/}
235+
{/* currentPage={currentPage}*/}
236+
{/* pageSize={pageSize}*/}
237+
{/* setPageSize={setPageSize}*/}
238+
{/* setCurrentPage={setCurrentPage}*/}
239+
{/* total={elements.total}*/}
240+
{/*/>*/}
222241
{showAppSnapshot ? (
223242
<Suspense fallback={<EditorSkeletonView />}>
224243
<AppSnapshot

client/packages/lowcoder/src/pages/queryLibrary/LeftNav.tsx

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import { trans } from "i18n";
2121
import { DatasourceType } from "@lowcoder-ee/constants/queryConstants";
2222
import { saveAs } from "file-saver";
2323
import DataSourceIcon from "components/DataSourceIcon";
24+
import PaginationComp from "@lowcoder-ee/util/pagination/Pagination";
2425

2526
const Wrapper = styled.div<{ $readOnly?: boolean }>`
2627
display: flex;
@@ -72,7 +73,7 @@ const CreateBtn = styled(TacoButton)<{ $readOnly?: boolean }>`
7273
`;
7374

7475
const Body = styled.div`
75-
height: calc(100% - 80px);
76+
height: calc(100% - 120px);
7677
display: flex;
7778
flex-direction: column;
7879
`;
@@ -158,7 +159,13 @@ export const LeftNav = (props: {
158159
addQuery: () => void;
159160
onSelect: (queryId: string) => void;
160161
readOnly?: boolean;
162+
setCurrentPage: (page: number) => void;
163+
setPageSize: (size: number) => void;
164+
currentPage: number;
165+
pageSize: number;
166+
total: number;
161167
}) => {
168+
const {currentPage, setCurrentPage, pageSize, setPageSize, total } = props
162169
const dispatch = useDispatch();
163170
const [searchValue, setSearchValue] = useState("");
164171
const datasourceTypes = useSelector(getDataSourceTypesMap);
@@ -272,6 +279,17 @@ export const LeftNav = (props: {
272279
</ScrollBar>
273280
</SelectListWrapper>
274281
</Body>
282+
<PaginationComp
283+
height={40}
284+
marginTop={0}
285+
marginBottom={0}
286+
currentPage={currentPage}
287+
setCurrentPage={setCurrentPage}
288+
pageSize={pageSize}
289+
setPageSize={setPageSize}
290+
total={total}
291+
simple={true}
292+
/>
275293
</Wrapper>
276294
</ReadOnlyMask>
277295
);

client/packages/lowcoder/src/pages/queryLibrary/QueryLibraryEditor.tsx

Lines changed: 49 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import { useCompInstance } from "../../comps/utils/useCompInstance";
2222
import { QueryLibraryComp } from "../../comps/comps/queryLibrary/queryLibraryComp";
2323
import { useSearchParam, useThrottle } from "react-use";
2424
import { Comp } from "lowcoder-core";
25-
import { LibraryQuery } from "../../api/queryLibraryApi";
25+
import {LibraryQuery} from "../../api/queryLibraryApi";
2626
import { NameGenerator } from "../../comps/utils";
2727
import { QueryLibraryHistoryView } from "./QueryLibraryHistoryView";
2828
import { default as Form } from "antd/es/form";
@@ -46,6 +46,7 @@ import { importQueryLibrary } from "./importQueryLibrary";
4646
import { registryDataSourcePlugin } from "constants/queryConstants";
4747
import { messageInstance } from "lowcoder-design/src/components/GlobalInstances";
4848
import { Helmet } from "react-helmet";
49+
import {fetchQLPaginationByOrg} from "@lowcoder-ee/util/pagination/axios";
4950

5051
const Wrapper = styled.div`
5152
display: flex;
@@ -59,9 +60,21 @@ const RightContent = styled.div`
5960
position: relative;
6061
`;
6162

63+
interface ElementsState {
64+
elements: LibraryQuery[];
65+
total: number;
66+
}
67+
68+
function transformData(input: LibraryQuery[]) {
69+
const output: any = {};
70+
input.forEach(item => {
71+
output[item.id] = item;
72+
});
73+
return output;
74+
}
75+
6276
export const QueryLibraryEditor = () => {
6377
const dispatch = useDispatch();
64-
const queryLibrary = useSelector(getQueryLibrary);
6578
const queryLibraryRecords = useSelector(getQueryLibraryRecords);
6679
const originDatasourceInfo = useSelector(getDataSource);
6780
const currentUser = useSelector(getUser);
@@ -74,6 +87,10 @@ export const QueryLibraryEditor = () => {
7487
const [publishModalVisible, setPublishModalVisible] = useState(false);
7588
const [showHistory, setShowHistory] = useState(false);
7689
const [isDataSourceReady, setIsDataSourceReady] = useState(false);
90+
const [elements, setElements] = useState<ElementsState>({ elements: [], total: 0 });
91+
const [queryLibrary, setQueryLibrary] = useState<any>({});
92+
const [currentPage, setCurrentPage] = useState(1);
93+
const [pageSize, setPageSize] = useState(10);
7794

7895
const selectedRecords = queryLibraryRecords[selectedQuery] ?? {};
7996
const libraryQuery = queryLibrary[selectedQuery];
@@ -98,6 +115,25 @@ export const QueryLibraryEditor = () => {
98115
const [comp, container] = useCompInstance(params);
99116
useSaveQueryLibrary(libraryQuery, comp);
100117

118+
useEffect(() => {
119+
try {
120+
fetchQLPaginationByOrg(
121+
{
122+
name: "",
123+
pageNum: currentPage,
124+
pageSize: pageSize,
125+
}
126+
).then(result => {
127+
if (result.success){
128+
setElements({elements: result.data || [], total: result.total || 1})
129+
setQueryLibrary(transformData(result.data || []));
130+
}
131+
});
132+
} catch (error) {
133+
console.error(error)
134+
}
135+
}, [currentPage, pageSize])
136+
101137
useEffect(() => {
102138
if (orgId) {
103139
dispatch(fetchQueryLibrary());
@@ -125,7 +161,8 @@ export const QueryLibraryEditor = () => {
125161

126162
useEffect(() => {
127163
if (!forwardQueryId && !queryLibrary[selectedQuery]) {
128-
setSelectedQuery(Object.values(queryLibrary)?.[0]?.id);
164+
// @ts-ignore
165+
setSelectedQuery(Object.values(queryLibrary)?.[0]?.id);
129166
}
130167
}, [dispatch, Object.keys(queryLibrary).length]);
131168

@@ -145,13 +182,13 @@ export const QueryLibraryEditor = () => {
145182
})
146183
.map((info) => info.datasource);
147184

148-
const recentlyUsed = Object.values(queryLibrary)
149-
.map((i) => i.libraryQueryDSL?.query.datasourceId)
185+
const recentlyUsed = Object.values(queryLibrary)
186+
.map((i: any) => i.libraryQueryDSL?.query.datasourceId)
150187
.map((id) => datasource.find((d) => d.id === id))
151188
.filter((i) => !!i) as Datasource[];
152189

153190
const nameGenerator = new NameGenerator();
154-
nameGenerator.init(Object.values(queryLibrary).map((t) => t.name));
191+
nameGenerator.init(Object.values(queryLibrary).map((t: any) => t.name));
155192
const newName = nameGenerator.genItemName(trans("queryLibrary.unnamed"));
156193

157194
const handleAdd = (type: BottomResTypeEnum, extraInfo?: any) => {
@@ -189,7 +226,12 @@ export const QueryLibraryEditor = () => {
189226
setSelectedQuery(id);
190227
showCreatePanel(false);
191228
} }
192-
readOnly={showHistory} />
229+
setCurrentPage={setCurrentPage}
230+
setPageSize={setPageSize}
231+
currentPage={currentPage}
232+
pageSize={pageSize}
233+
total={elements.total}
234+
/>
193235
<RightContent>
194236
{!selectedQuery || !comp?.children.query.children.id.getView() ? (
195237
EmptyQueryWithoutTab

client/packages/lowcoder/src/util/pagination/Pagination.tsx

Lines changed: 45 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,19 @@
11
import styled from "styled-components";
22
import { Pagination } from "antd";
33

4-
const PaginationLayout = styled(Pagination)`
4+
interface PaginationLayoutProps {
5+
height?: number;
6+
marginTop?: number;
7+
marginBottom?: number;
8+
}
9+
10+
const PaginationLayout = styled(Pagination)<PaginationLayoutProps>`
511
display: flex;
612
justify-content: center;
7-
margin-top: 40px;
8-
margin-bottom: 20px;
13+
align-items: center;
14+
margin-top: ${(props) => props.marginTop !== undefined ? props.marginTop : 40}px !important;
15+
margin-bottom: ${(props) => props.marginBottom !== undefined ? props.marginBottom : 20}px !important;
16+
height: ${(props) => props.height}px;
917
`;
1018

1119
interface PaginationCompProps {
@@ -14,6 +22,10 @@ interface PaginationCompProps {
1422
currentPage: number;
1523
pageSize: number;
1624
total: number;
25+
height?: number;
26+
marginTop?: number;
27+
marginBottom?: number;
28+
simple?: boolean;
1729
}
1830

1931
const PaginationComp = (props: PaginationCompProps) => {
@@ -23,6 +35,10 @@ const PaginationComp = (props: PaginationCompProps) => {
2335
currentPage,
2436
pageSize,
2537
total,
38+
height,
39+
marginTop,
40+
marginBottom,
41+
simple,
2642
} = props;
2743

2844
const handlePageChange = (page: number, pageSize: number | undefined) => {
@@ -38,14 +54,32 @@ const PaginationComp = (props: PaginationCompProps) => {
3854
};
3955

4056
return (
41-
<PaginationLayout
42-
current={currentPage}
43-
pageSize={pageSize}
44-
onChange={handlePageChange}
45-
onShowSizeChange={handlePageSizeChange}
46-
total={total}
47-
showSizeChanger
48-
/>
57+
<>
58+
{simple ?
59+
<PaginationLayout
60+
height={height}
61+
marginTop={marginTop}
62+
marginBottom={marginBottom}
63+
current={currentPage}
64+
pageSize={pageSize}
65+
onChange={handlePageChange}
66+
onShowSizeChange={handlePageSizeChange}
67+
total={total}
68+
simple
69+
/> :
70+
<PaginationLayout
71+
height={height}
72+
marginTop={marginTop}
73+
marginBottom={marginBottom}
74+
current={currentPage}
75+
pageSize={pageSize}
76+
onChange={handlePageChange}
77+
onShowSizeChange={handlePageSizeChange}
78+
total={total}
79+
showSizeChanger
80+
/>
81+
}
82+
</>
4983
);
5084
};
5185

0 commit comments

Comments
 (0)