Skip to content

Commit af91f08

Browse files
authored
Merge pull request #1694 from iamfaran/fix/environments-new
Add error component on invalid URL and managed-obj endpoint
2 parents f30fbd4 + 392a4ad commit af91f08

13 files changed

+71
-79
lines changed

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

Lines changed: 7 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ import UserGroupsTab from "./components/UserGroupsTab";
2727
import EnvironmentHeader from "./components/EnvironmentHeader";
2828
import ModernBreadcrumbs from "./components/ModernBreadcrumbs";
2929
import { getEnvironmentTagColor } from "./utils/environmentUtils";
30-
const { Title, Text } = Typography;
30+
import ErrorComponent from './components/ErrorComponent';
3131
const { TabPane } = Tabs;
3232

3333
/**
@@ -80,50 +80,18 @@ const EnvironmentDetail: React.FC = () => {
8080
if (isLoading) {
8181
return (
8282
<div style={{ display: 'flex', justifyContent: 'center', padding: '50px' }}>
83-
<Spin size="large" tip="Loading environment..." />
83+
<Spin size="large" tip="Loading environment..." style={{ display: 'block', textAlign: 'center' }} />
8484
</div>
8585
);
8686
}
8787

8888
if (error || !environment) {
89-
const errorItems = [
90-
{
91-
key: 'environments',
92-
title: (
93-
<span>
94-
<HomeOutlined /> Environments
95-
</span>
96-
),
97-
onClick: () => history.push("/setting/environments")
98-
},
99-
{
100-
key: 'notFound',
101-
title: 'Not Found'
102-
}
103-
];
104-
10589
return (
106-
<div style={{ padding: "24px", flex: 1 }}>
107-
<ModernBreadcrumbs items={errorItems} />
108-
109-
<Card style={{ borderRadius: '8px', boxShadow: '0 2px 8px rgba(0,0,0,0.05)' }}>
110-
<div style={{ textAlign: "center", padding: "40px 0" }}>
111-
<Title level={3} style={{ color: "#ff4d4f" }}>
112-
Environment Not Found
113-
</Title>
114-
<Text type="secondary" style={{ display: "block", margin: "16px 0" }}>
115-
{error || "The environment you're looking for doesn't exist or you don't have permission to view it."}
116-
</Text>
117-
<Button
118-
type="primary"
119-
onClick={() => history.push("/setting/environments")}
120-
style={{ marginTop: "16px" }}
121-
>
122-
Return to Environments List
123-
</Button>
124-
</div>
125-
</Card>
126-
</div>
90+
<ErrorComponent
91+
errorMessage={"Environment Not Found"}
92+
returnPath="/setting/environments"
93+
returnLabel="Return to Environments List"
94+
/>
12795
);
12896
}
12997

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

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -139,10 +139,7 @@ const EnvironmentsList: React.FC = () => {
139139
borderRadius: '12px',
140140
boxShadow: '0 2px 8px rgba(0,0,0,0.05)'
141141
}}
142-
headStyle={{
143-
borderBottom: '1px solid #f0f0f0',
144-
padding: '16px 24px'
145-
}}
142+
styles={{ header: { borderBottom: '1px solid #f0f0f0', padding: '16px 24px' } }}
146143
bodyStyle={{ padding: '24px' }}
147144
>
148145
<Row gutter={[32, 16]} justify="space-around">
@@ -191,10 +188,7 @@ const EnvironmentsList: React.FC = () => {
191188
borderRadius: '12px',
192189
boxShadow: '0 2px 8px rgba(0,0,0,0.05)',
193190
}}
194-
headStyle={{
195-
borderBottom: '1px solid #f0f0f0',
196-
padding: '16px 24px'
197-
}}
191+
styles={{ header: { borderBottom: '1px solid #f0f0f0', padding: '16px 24px' } }}
198192
bodyStyle={{ padding: '24px' }}
199193
extra={
200194
<Input

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

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import DataSourcesTab from "./components/DataSourcesTab";
2525
import QueriesTab from "./components/QueriesTab";
2626
import ModernBreadcrumbs from "./components/ModernBreadcrumbs";
2727
import WorkspaceHeader from "./components/WorkspaceHeader";
28+
import ErrorComponent from "./components/ErrorComponent";
2829

2930
const { TabPane } = Tabs;
3031

@@ -34,7 +35,6 @@ const WorkspaceDetail: React.FC = () => {
3435
const { workspace, isLoading, error, toggleManagedStatus } = useWorkspaceContext();
3536
const { openDeployModal } = useDeployModal();
3637

37-
console.log("workspace render", workspace);
3838

3939
const [isToggling, setIsToggling] = useState(false);
4040

@@ -58,18 +58,18 @@ const WorkspaceDetail: React.FC = () => {
5858
if (isLoading) {
5959
return (
6060
<div style={{ display: 'flex', justifyContent: 'center', alignItems: 'center', height: '100%', padding: '50px' }}>
61-
<Spin size="large" tip="Loading workspace details..." />
61+
<Spin size="large" tip="Loading workspace details..." style={{ display: 'block', textAlign: 'center' }} />
6262
</div>
6363
);
6464
}
6565

6666
if (error || !environment || !workspace) {
6767
return (
68-
<div style={{ display: 'flex', justifyContent: 'center', alignItems: 'center', height: '100%', padding: '50px' }}>
69-
<Typography.Title level={3}>
70-
{error || "Workspace not found"}
71-
</Typography.Title>
72-
</div>
68+
<ErrorComponent
69+
errorMessage={"Workspace not found"}
70+
returnPath="/setting/environments"
71+
returnLabel="Return to Environments List"
72+
/>
7373
);
7474
}
7575

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import React from 'react';
2+
import { Card, Button, Typography } from 'antd';
3+
import { HomeOutlined } from '@ant-design/icons';
4+
import history from '@lowcoder-ee/util/history';
5+
6+
const { Title, Text } = Typography;
7+
8+
interface ErrorComponentProps {
9+
errorMessage: string;
10+
returnPath: string;
11+
returnLabel: string;
12+
}
13+
14+
const ErrorComponent: React.FC<ErrorComponentProps> = ({ errorMessage, returnPath, returnLabel }) => {
15+
return (
16+
<div style={{ padding: '24px', flex: 1 }}>
17+
<Card style={{ borderRadius: '8px', boxShadow: '0 2px 8px rgba(0,0,0,0.05)' }}>
18+
<div style={{ textAlign: 'center', padding: '40px 0' }}>
19+
<Title level={3} style={{ color: '#ff4d4f' }}>
20+
{errorMessage}
21+
</Title>
22+
<Text type="secondary" style={{ display: 'block', margin: '16px 0' }}>
23+
The item you're looking for doesn't exist or you don't have permission to view it.
24+
</Text>
25+
<Button
26+
type="primary"
27+
onClick={() => history.push(returnPath)}
28+
style={{ marginTop: '16px' }}
29+
>
30+
<HomeOutlined /> {returnLabel}
31+
</Button>
32+
</div>
33+
</Card>
34+
</div>
35+
);
36+
};
37+
38+
export default ErrorComponent;

client/packages/lowcoder/src/pages/setting/environments/config/apps.config.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ export const appsConfig: DeployableItemConfig = {
5050
publishOnTarget: values.publishOnTarget,
5151
publicToAll: values.publicToAll,
5252
publicToMarketplace: values.publicToMarketplace,
53+
applicationGid: item.applicationGid,
5354
};
5455
},
5556
execute: (params: any) => deployApp(params)

client/packages/lowcoder/src/pages/setting/environments/config/data-sources.config.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@ export const dataSourcesConfig: DeployableItemConfig = {
2323
envId: sourceEnv.environmentId,
2424
targetEnvId: targetEnv.environmentId,
2525
datasourceId: item.id,
26-
updateDependenciesIfNeeded: values.updateDependenciesIfNeeded
26+
updateDependenciesIfNeeded: values.updateDependenciesIfNeeded,
27+
datasourceGid: item.gid
2728
};
2829
},
2930
execute: (params: any) => deployDataSource(params)

client/packages/lowcoder/src/pages/setting/environments/config/query.config.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@ export const queryConfig: DeployableItemConfig = {
2424
envId: sourceEnv.environmentId,
2525
targetEnvId: targetEnv.environmentId,
2626
queryId: item.id,
27-
updateDependenciesIfNeeded: values.updateDependenciesIfNeeded
27+
updateDependenciesIfNeeded: values.updateDependenciesIfNeeded,
28+
queryGid: item.gid,
2829
};
2930
},
3031
execute: (params: any) => deployQuery(params)

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ export interface DeployAppParams {
1818
envId: string;
1919
targetEnvId: string;
2020
applicationId: string;
21+
applicationGid: string;
2122
updateDependenciesIfNeeded?: boolean;
2223
publishOnTarget?: boolean;
2324
publicToAll?: boolean;
@@ -79,7 +80,7 @@ export async function getMergedWorkspaceApps(
7980
// Fetch managed objects instead of managed apps
8081
let managedObjects: ManagedObject[] = [];
8182
try {
82-
managedObjects = await getManagedObjects(environmentId);
83+
managedObjects = await getManagedObjects(environmentId, ManagedObjectType.APP);
8384
} catch (error) {
8485
console.error("Failed to fetch managed objects:", error);
8586
// Continue with empty managed list
@@ -125,7 +126,7 @@ export const deployApp = async (params: DeployAppParams): Promise<boolean> => {
125126

126127
if (response.status === 200) {
127128
await transferManagedObject(
128-
params.applicationId,
129+
params.applicationGid,
129130
params.envId,
130131
params.targetEnvId,
131132
ManagedObjectType.APP

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@ export interface DeployDataSourceParams {
2020
envId: string;
2121
targetEnvId: string;
2222
datasourceId: string;
23+
datasourceGid: string;
2324
updateDependenciesIfNeeded?: boolean;
25+
2426
}
2527
// Get data sources for a workspace - using your correct implementation
2628
export async function getWorkspaceDataSources(
@@ -54,7 +56,6 @@ export async function getWorkspaceDataSources(
5456
orgId: workspaceId
5557
}
5658
});
57-
console.log("data source response",response);
5859

5960
// Check if response is valid
6061
if (!response.data) {
@@ -157,12 +158,12 @@ export async function deployDataSource(params: DeployDataSourceParams): Promise<
157158
envId: params.envId,
158159
targetEnvId: params.targetEnvId,
159160
datasourceId: params.datasourceId,
160-
updateDependenciesIfNeeded: params.updateDependenciesIfNeeded ?? false
161+
updateDependenciesIfNeeded: params.updateDependenciesIfNeeded ?? false,
161162
}
162163
});
163164
if (response.status === 200) {
164165
await transferManagedObject(
165-
params.datasourceId,
166+
params.datasourceGid,
166167
params.envId,
167168
params.targetEnvId,
168169
ManagedObjectType.DATASOURCE

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,6 @@ export async function getManagedQueries(environmentId: string): Promise<Query[]>
204204
environmentId
205205
}
206206
});
207-
console.log("Managed queries response function:", response.data);
208207

209208
if (!response.data.data || !Array.isArray(response.data.data)) {
210209
return [];

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

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,6 @@ export async function getEnvironmentUserGroups(
195195

196196
// Make the API request to get user groups
197197
const response = await axios.get(`${apiServiceUrl}/api/groups/list`, { headers });
198-
console.log(response);
199198

200199
// Check if response is valid
201200
if (!response.data) {
@@ -359,8 +358,7 @@ export async function getWorkspaceDataSources(
359358
orgId: workspaceId
360359
}
361360
});
362-
console.log("data source response",response);
363-
361+
364362
// Check if response is valid
365363
if (!response.data) {
366364
return [];
@@ -434,7 +432,7 @@ export async function getWorkspaceQueries(
434432
if (!response.data) {
435433
return { queries: [], total: 0 };
436434
}
437-
console.log("RESPONSE DATA QUERIES",response.data.data);
435+
438436
// Map the response to include id field required by DeployableItem
439437
const queries = response.data.data.map(query => ({
440438
...query,
@@ -444,8 +442,6 @@ export async function getWorkspaceQueries(
444442
managed: false // Default to unmanaged
445443
}));
446444

447-
console.log("queries",queries);
448-
449445
return {
450446
queries,
451447
total: response.data.total

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

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ export interface MergedQueriesResult {
1515
targetEnvId: string;
1616
queryId: string;
1717
updateDependenciesIfNeeded?: boolean;
18+
queryGid: string;
1819
}
1920

2021

@@ -28,19 +29,15 @@ export interface MergedQueriesResult {
2829
// Fetch regular queries
2930

3031
const regularQueries = await getWorkspaceQueries(workspaceId, apiKey, apiServiceUrl);
31-
console.log("Regular queries response:", regularQueries);
3232

3333
const managedObjects = await getManagedObjects(environmentId, ManagedObjectType.QUERY);
34-
console.log("Managed queries response:", managedObjects);
3534

3635
// Create a set of managed query GIDs for quick lookup
3736
const managedQueryGids = new Set(managedObjects.map(obj => obj.objGid));
38-
console.log("Managed query GIDs:", Array.from(managedQueryGids));
3937

4038
// Mark regular queries as managed if they exist in managed queries
4139
const mergedQueries = regularQueries.queries.map((query: Query) => {
4240
const isManaged = managedQueryGids.has(query.gid);
43-
console.log(`Query ${query.name} (gid: ${query.gid}) is ${isManaged ? "managed" : "not managed"}`);
4441

4542
return {
4643
...query,
@@ -51,11 +48,6 @@ export interface MergedQueriesResult {
5148
// Calculate stats
5249
const total = mergedQueries.length;
5350
const managed = mergedQueries.filter(query => query.managed).length;
54-
console.log("Generated stats:", {
55-
total,
56-
managed,
57-
unmanaged: total - managed
58-
});
5951

6052
return {
6153
queries: mergedQueries,
@@ -84,7 +76,7 @@ export interface MergedQueriesResult {
8476
});
8577
if (response.status === 200) {
8678
await transferManagedObject(
87-
params.queryId,
79+
params.queryGid,
8880
params.envId,
8981
params.targetEnvId,
9082
ManagedObjectType.QUERY

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ export async function deployWorkspace(params: {
9999
// After successful deployment, set the managed object in target environment
100100
if (response.status === 200) {
101101
await transferManagedObject(
102-
params.workspaceId,
102+
params.workspaceId, // first param has to be GID
103103
params.envId,
104104
params.targetEnvId,
105105
ManagedObjectType.ORG

0 commit comments

Comments
 (0)