Skip to content

Commit b4b8c1c

Browse files
committed
add query service tab
1 parent f2dd6a5 commit b4b8c1c

File tree

5 files changed

+162
-22
lines changed

5 files changed

+162
-22
lines changed

client/packages/lowcoder/src/pages/setting/environments/WorkspaceDetail.tsx

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import DataSourcesTab from "./components/DataSourcesTab";
2828
import DeployableItemsTab from "./components/DeployableItemsTab";
2929
import { appsConfig } from "./config/apps.config";
3030
import { dataSourcesConfig } from "./config/data-sources.config";
31+
import { queryConfig } from "./config/query.config";
3132

3233
const { Title, Text } = Typography;
3334
const { TabPane } = Tabs;
@@ -140,14 +141,12 @@ const WorkspaceDetail: React.FC = () => {
140141
tab={<span><CodeOutlined /> Queries</span>}
141142
key="queries"
142143
>
143-
<Card>
144-
<Alert
145-
message="Queries"
146-
description="Queries feature will be implemented in the next phase."
147-
type="info"
148-
showIcon
149-
/>
150-
</Card>
144+
<DeployableItemsTab
145+
environment={environment}
146+
config={queryConfig}
147+
additionalParams={{ workspaceId }}
148+
title="Queries in this Workspace"
149+
/>
151150
</TabPane>
152151
</Tabs>
153152
</div>
Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
// config/query.config.tsx
2+
import React from 'react';
3+
import { Row, Col, Statistic, Tag } from 'antd';
4+
import { ApiOutlined } from '@ant-design/icons';
5+
import { DeployableItemConfig } from '../types/deployable-item.types';
6+
import { Query } from '../types/query.types';
7+
import { connectManagedQuery, unconnectManagedQuery } from '../services/enterprise.service';
8+
import { getMergedWorkspaceQueries } from '../services/query.service';
9+
10+
// Define QueryStats interface
11+
export interface QueryStats {
12+
total: number;
13+
managed: number;
14+
unmanaged: number;
15+
}
16+
17+
export const queryConfig: DeployableItemConfig<Query, QueryStats> = {
18+
// Basic info
19+
type: 'queries',
20+
singularLabel: 'Query',
21+
pluralLabel: 'Queries',
22+
icon: <ApiOutlined />,
23+
idField: 'id',
24+
25+
// Navigation - queries don't have detail pages in this implementation
26+
buildDetailRoute: () => '#',
27+
28+
// Configuration
29+
requiredEnvProps: ['environmentApikey', 'environmentApiServiceUrl'],
30+
31+
// Stats rendering
32+
renderStats: (stats) => (
33+
<Row gutter={16}>
34+
<Col span={8}>
35+
<Statistic title="Total Queries" value={stats.total} prefix={<ApiOutlined />} />
36+
</Col>
37+
<Col span={8}>
38+
<Statistic title="Managed Queries" value={stats.managed} prefix={<ApiOutlined />} />
39+
</Col>
40+
<Col span={8}>
41+
<Statistic title="Unmanaged Queries" value={stats.unmanaged} prefix={<ApiOutlined />} />
42+
</Col>
43+
</Row>
44+
),
45+
46+
// Stats calculation
47+
calculateStats: (queries) => {
48+
const total = queries.length;
49+
const managed = queries.filter(q => q.managed).length;
50+
51+
return {
52+
total,
53+
managed,
54+
unmanaged: total - managed
55+
};
56+
},
57+
58+
// Table configuration
59+
columns: [
60+
{
61+
title: 'Name',
62+
dataIndex: 'name',
63+
key: 'name',
64+
},
65+
{
66+
title: 'Creator',
67+
dataIndex: 'creatorName',
68+
key: 'creatorName',
69+
},
70+
{
71+
title: 'Creation Date',
72+
key: 'createTime',
73+
render: (_, record: Query) => {
74+
if (!record.createTime) return 'N/A';
75+
const date = new Date(record.createTime);
76+
return `${date.getMonth() + 1}/${date.getDate()}/${date.getFullYear()}`;
77+
},
78+
},
79+
{
80+
title: 'Query Type',
81+
key: 'queryType',
82+
render: (_, record: Query) => {
83+
const queryType = record.libraryQueryDSL?.query?.compType || 'Unknown';
84+
return <Tag color="blue">{queryType}</Tag>;
85+
},
86+
}
87+
],
88+
89+
// Deployment options
90+
enableManaged: true,
91+
92+
// Service functions
93+
fetchItems: async ({ environment, workspaceId }) => {
94+
if (!workspaceId) {
95+
throw new Error("Workspace ID is required to fetch queries");
96+
}
97+
98+
const result = await getMergedWorkspaceQueries(
99+
workspaceId,
100+
environment.environmentId,
101+
environment.environmentApikey,
102+
environment.environmentApiServiceUrl!
103+
);
104+
105+
return result.queries;
106+
},
107+
108+
toggleManaged: async ({ item, checked, environment }) => {
109+
try {
110+
if (checked) {
111+
await connectManagedQuery(environment.environmentId, item.name, item.gid);
112+
} else {
113+
await unconnectManagedQuery(item.gid);
114+
}
115+
return true;
116+
} catch (error) {
117+
console.error('Error toggling managed status:', error);
118+
return false;
119+
}
120+
}
121+
};

client/packages/lowcoder/src/pages/setting/environments/services/environments.service.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -392,12 +392,12 @@ export async function getWorkspaceQueries(
392392
headers,
393393
params
394394
});
395-
395+
debugger
396396
// Check if response is valid
397-
if (!response.data || !response.data.success === false) {
397+
if (!response.data) {
398398
return { queries: [], total: 0 };
399399
}
400-
400+
console.log("RESPONSE DATA QUERIES",response.data.data);
401401
// Map the response to include id field required by DeployableItem
402402
const queries = response.data.data.map(query => ({
403403
...query,

client/packages/lowcoder/src/pages/setting/environments/services/query.service.ts

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,24 +20,37 @@ export interface MergedQueriesResult {
2020
apiServiceUrl: string
2121
): Promise<MergedQueriesResult> {
2222
try {
23-
// Fetch both regular and managed queries
24-
const [regularQueries, managedQueries] = await Promise.all([
25-
getWorkspaceQueries(workspaceId, apiKey, apiServiceUrl),
26-
getManagedQueries(environmentId)
27-
]);
23+
// Fetch regular queries
24+
25+
const regularQueries = await getWorkspaceQueries(workspaceId, apiKey, apiServiceUrl);
26+
console.log("Regular queries response:", regularQueries);
27+
28+
const managedQueries = await getManagedQueries(environmentId);
29+
console.log("Managed queries response:", managedQueries);
2830

2931
// Create a map of managed queries by GID for quick lookup
3032
const managedQueryGids = new Set(managedQueries.map(query => query.gid));
33+
console.log("Managed query GIDs:", Array.from(managedQueryGids));
3134

3235
// Mark regular queries as managed if they exist in managed queries
33-
const mergedQueries = regularQueries.queries.map((query: Query ) => ({
34-
...query,
35-
managed: managedQueryGids.has(query.gid)
36-
}));
36+
const mergedQueries = regularQueries.queries.map((query: Query) => {
37+
const isManaged = managedQueryGids.has(query.gid);
38+
console.log(`Query ${query.name} (gid: ${query.gid}) is ${isManaged ? "managed" : "not managed"}`);
39+
40+
return {
41+
...query,
42+
managed: isManaged
43+
};
44+
});
3745

3846
// Calculate stats
3947
const total = mergedQueries.length;
4048
const managed = mergedQueries.filter(query => query.managed).length;
49+
console.log("Generated stats:", {
50+
total,
51+
managed,
52+
unmanaged: total - managed
53+
});
4154

4255
return {
4356
queries: mergedQueries,
@@ -49,6 +62,7 @@ export interface MergedQueriesResult {
4962
};
5063

5164
} catch (error) {
65+
console.error("Error in getMergedWorkspaceQueries:", error);
5266
throw error;
5367
}
5468
}

client/packages/lowcoder/src/pages/setting/environments/types/query.types.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
// types/query.types.ts
2-
import { DeployableItem } from './deployable-item.types';
2+
import { DeployableItem, BaseStats } from './deployable-item.types';
33

44
export interface LibraryQueryDSL {
55
query: {
@@ -32,6 +32,7 @@ export interface LibraryQueryDSL {
3232
cancelPrevious: boolean;
3333
depQueryName: string;
3434
delayTime: string;
35+
managed?: boolean;
3536
};
3637
}
3738

@@ -43,7 +44,12 @@ export interface Query extends DeployableItem {
4344
libraryQueryDSL: LibraryQueryDSL;
4445
createTime: number;
4546
creatorName: string;
46-
managed?: boolean;
47+
}
48+
49+
export interface QueryStats extends BaseStats {
50+
total: number;
51+
managed: number;
52+
unmanaged: number;
4753
}
4854

4955
export interface QueryResponse {

0 commit comments

Comments
 (0)