Skip to content

[Feat] Add Environments Manually #1712

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 11 commits into from
May 26, 2025
Next Next commit
Fix apps endpoint for other Types and message for newer antD version
  • Loading branch information
iamfaran committed May 26, 2025
commit 5b4e521db01a013b4f5555c39bff08672289019c
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ import {
Spin,
Typography,
Tabs,
message,
} from "antd";
import { messageInstance } from "lowcoder-design/src/components/GlobalInstances";
import {
AppstoreOutlined,
DatabaseOutlined,
Expand Down Expand Up @@ -46,9 +46,9 @@ const WorkspaceDetail: React.FC = () => {
try {
const success = await toggleManagedStatus(checked);
if (success) {
message.success(`Workspace is now ${checked ? 'Managed' : 'Unmanaged'}`);
messageInstance.success(`Workspace is now ${checked ? 'Managed' : 'Unmanaged'}`);
} else {
message.error('Failed to change managed status');
messageInstance.error('Failed to change managed status');
}
} finally {
setIsToggling(false);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import React, { useState, useEffect } from 'react';
import { Card, Button, Divider, Alert, message, Table, Tag, Input, Space, Tooltip, Row, Col } from 'antd';
import { Card, Button, Divider, Alert, Table, Tag, Input, Space, Tooltip, Row, Col } from 'antd';
import { SyncOutlined, CloudUploadOutlined, AuditOutlined, AppstoreOutlined, CheckCircleFilled, CloudServerOutlined, DisconnectOutlined, FilterOutlined } from '@ant-design/icons';
import Title from 'antd/lib/typography/Title';
import { Environment } from '../types/environment.types';
Expand All @@ -10,6 +10,7 @@ import { ManagedObjectType, setManagedObject, unsetManagedObject } from '../serv
import { useDeployModal } from '../context/DeployModalContext';
import { appsConfig } from '../config/apps.config';
import history from "@lowcoder-ee/util/history";
import { messageInstance } from 'lowcoder-design/src/components/GlobalInstances';

const { Search } = Input;

Expand Down Expand Up @@ -116,10 +117,10 @@ const AppsTab: React.FC<AppsTabProps> = ({ environment, workspaceId }) => {
unmanaged: prev.total - managed
}));

message.success(`${app.name} is now ${checked ? 'Managed' : 'Unmanaged'}`);
messageInstance.success(`${app.name} is now ${checked ? 'Managed' : 'Unmanaged'}`);
return true;
} catch (error) {
message.error(`Failed to change managed status for ${app.name}`);
messageInstance.error(`Failed to change managed status for ${app.name}`);
return false;
} finally {
setRefreshing(false);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import React, { useState, useEffect } from 'react';
import { Card, Button, Divider, Alert, message, Table, Tag, Input, Space, Tooltip, Row, Col, Avatar } from 'antd';
import { Card, Button, Divider, Alert, Table, Tag, Input, Space, Tooltip, Row, Col, Avatar } from 'antd';
import { messageInstance } from 'lowcoder-design/src/components/GlobalInstances';
import {
SyncOutlined,
CloudUploadOutlined,
Expand Down Expand Up @@ -114,10 +115,10 @@ const DataSourcesTab: React.FC<DataSourcesTabProps> = ({ environment, workspaceI
unmanaged: prev.total - managed
}));

message.success(`${dataSource.name} is now ${checked ? 'Managed' : 'Unmanaged'}`);
messageInstance.success(`${dataSource.name} is now ${checked ? 'Managed' : 'Unmanaged'}`);
return true;
} catch (error) {
message.error(`Failed to change managed status for ${dataSource.name}`);
messageInstance.error(`Failed to change managed status for ${dataSource.name}`);
return false;
} finally {
setRefreshing(false);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
// components/DeployItemModal.tsx
import React, { useState, useEffect } from 'react';
import { Modal, Form, Select, Checkbox, Button, message, Spin, Input, Tag, Space } from 'antd';
import { Modal, Form, Select, Checkbox, Button, Spin, Input, Tag, Space } from 'antd';
import { messageInstance } from 'lowcoder-design/src/components/GlobalInstances';
import { Environment } from '../types/environment.types';
import { DeployableItemConfig } from '../types/deployable-item.types';
import { useEnvironmentContext } from '../context/EnvironmentContext';
Expand Down Expand Up @@ -46,7 +47,7 @@ function DeployItemModal({
const targetEnv = environments.find(env => env.environmentId === values.targetEnvId);

if (!targetEnv) {
message.error('Target environment not found');
messageInstance.error('Target environment not found');
return;
}

Expand All @@ -58,12 +59,12 @@ function DeployItemModal({
// Execute deployment
await config.deploy.execute(params);

message.success(`Successfully deployed ${item.name} to target environment`);
messageInstance.success(`Successfully deployed ${item.name} to target environment`);
if (onSuccess) onSuccess();
onClose();
} catch (error) {
console.error('Deployment error:', error);
message.error(`Failed to deploy ${config.deploy.singularLabel.toLowerCase()}`);
messageInstance.error(`Failed to deploy ${config.deploy.singularLabel.toLowerCase()}`);
} finally {
setDeploying(false);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import React, { useState, useEffect } from 'react';
import { Modal, Form, Input, Select, Switch, Button, message } from 'antd';
import { Modal, Form, Input, Select, Switch, Button } from 'antd';
import { Environment } from '../types/environment.types';

const { Option } = Select;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import React, { useState, useEffect } from 'react';
import { Card, Button, Divider, Alert, message, Table, Tag, Input, Space, Tooltip, Row, Col } from 'antd';
import { Card, Button, Divider, Alert, Table, Tag, Input, Space, Tooltip, Row, Col } from 'antd';
import { messageInstance } from 'lowcoder-design/src/components/GlobalInstances';
import {
SyncOutlined,
CloudUploadOutlined,
Expand Down Expand Up @@ -115,10 +116,10 @@ const QueriesTab: React.FC<QueriesTabProps> = ({ environment, workspaceId }) =>
unmanaged: prev.total - managed
}));

message.success(`${query.name} is now ${checked ? 'Managed' : 'Unmanaged'}`);
messageInstance.success(`${query.name} is now ${checked ? 'Managed' : 'Unmanaged'}`);
return true;
} catch (error) {
message.error(`Failed to change managed status for ${query.name}`);
messageInstance.error(`Failed to change managed status for ${query.name}`);
return false;
} finally {
setRefreshing(false);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import React, { useState, useEffect } from 'react';
import { Card, Button, Alert, message, Table, Tag, Input, Space, Row, Col, Avatar, Tooltip } from 'antd';
import { Card, Button, Alert, Table, Tag, Input, Space, Row, Col, Avatar, Tooltip } from 'antd';
import { SyncOutlined, TeamOutlined, UserOutlined, UsergroupAddOutlined, SettingOutlined, CodeOutlined } from '@ant-design/icons';
import Title from 'antd/lib/typography/Title';
import { Environment } from '../types/environment.types';
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import React, { useState, useEffect } from 'react';
import { Card, Button, Divider, Alert, message, Table, Tag, Input, Space, Tooltip, Row, Col, Avatar } from 'antd';
import { Card, Button, Divider, Alert, Table, Tag, Input, Space, Tooltip, Row, Col, Avatar } from 'antd';
import { SyncOutlined, AuditOutlined, TeamOutlined, CheckCircleFilled, CloudServerOutlined, DisconnectOutlined, FilterOutlined } from '@ant-design/icons';
import Title from 'antd/lib/typography/Title';
import { Environment } from '../types/environment.types';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import React, {
useCallback,
ReactNode,
} from "react";
import { message } from "antd";
import { messageInstance } from "lowcoder-design/src/components/GlobalInstances";
import { getEnvironments } from "../services/environments.service";
import { Environment } from "../types/environment.types";

Expand Down Expand Up @@ -61,10 +61,10 @@ export const EnvironmentProvider: React.FC<ProviderProps> = ({
try {
const data = await getEnvironments();
setEnvironments(data);
} catch (err) {
const errorMessage = err instanceof Error ? err.message : "Failed to load environments list";
setError(errorMessage);
message.error(errorMessage);
} catch (error) {
const errorMessage = error instanceof Error ? error.message : 'Failed to fetch environments';
messageInstance.error(errorMessage);
console.error('Error fetching environments:', error);
} finally {
setIsLoading(false);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import React, {
useCallback,
ReactNode,
} from "react";
import { message } from "antd";
import { messageInstance } from "lowcoder-design/src/components/GlobalInstances";
import { useParams } from "react-router-dom";
import { getEnvironmentById, updateEnvironment } from "../services/environments.service";
import { Environment } from "../types/environment.types";
Expand Down Expand Up @@ -100,7 +100,7 @@ import React, {
const updatedEnv = await updateEnvironment(environmentId, data);

// Show success message
message.success("Environment updated successfully");
messageInstance.success("Environment updated successfully");

// Refresh both the single environment and environments list
await Promise.all([
Expand All @@ -111,7 +111,7 @@ import React, {
return updatedEnv;
} catch (err) {
const errorMessage = err instanceof Error ? err.message : "Failed to update environment";
message.error(errorMessage);
messageInstance.error(errorMessage);
throw err;
}
}, [environment, environmentId, fetchEnvironment, refreshEnvironments]);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import React, {
useCallback,
ReactNode,
} from "react";
import { message } from "antd";
import { messageInstance } from "lowcoder-design/src/components/GlobalInstances";
import { useParams } from "react-router-dom";
import { useSingleEnvironmentContext } from "./SingleEnvironmentContext";
import { fetchWorkspaceById } from "../services/environments.service";
Expand Down Expand Up @@ -96,8 +96,9 @@ import React, {
...workspaceData,
managed: isManaged
});
} catch (err) {
const errorMessage = err instanceof Error ? err.message : "Workspace not found or failed to load";
} catch (error) {
const errorMessage = error instanceof Error ? error.message : 'Failed to fetch workspace';
messageInstance.error(errorMessage);
setError(errorMessage);
} finally {
setIsLoading(false);
Expand Down Expand Up @@ -135,7 +136,7 @@ import React, {
return true;
} catch (err) {
const errorMessage = err instanceof Error ? err.message : "Failed to update managed status";
message.error(errorMessage);
messageInstance.error(errorMessage);
return false;
}
}, [workspace, environment]);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
// services/appService.ts
import { message } from "antd";
import { messageInstance } from "lowcoder-design/src/components/GlobalInstances";
import { getWorkspaceApps } from "./environments.service";
import { getManagedApps } from "./enterprise.service";
import { App, AppStats } from "../types/app.types";
Expand Down Expand Up @@ -99,7 +99,7 @@ export async function getMergedWorkspaceApps(
} catch (error) {
const errorMessage =
error instanceof Error ? error.message : "Failed to fetch apps";
message.error(errorMessage);
messageInstance.error(errorMessage);
throw error;
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
// services/dataSources.service.ts
import axios from 'axios';
import { message } from "antd";
import { messageInstance } from "lowcoder-design/src/components/GlobalInstances";
import { DataSource, DataSourceWithMeta } from "../types/datasource.types";
import { getManagedObjects, ManagedObject, ManagedObjectType , transferManagedObject } from "./managed-objects.service";

Expand Down Expand Up @@ -66,7 +66,7 @@ export async function getWorkspaceDataSources(
} catch (error) {
// Handle and transform error
const errorMessage = error instanceof Error ? error.message : 'Failed to fetch data sources';
message.error(errorMessage);
messageInstance.error(errorMessage);
throw error;
}
}
Expand Down Expand Up @@ -145,7 +145,7 @@ export async function getMergedWorkspaceDataSources(
} catch (error) {
const errorMessage =
error instanceof Error ? error.message : "Failed to fetch data sources";
message.error(errorMessage);
messageInstance.error(errorMessage);
throw error;
}
}
Expand All @@ -171,7 +171,8 @@ export async function deployDataSource(params: DeployDataSourceParams): Promise<
}
return response.status === 200;
} catch (error) {
console.error('Error deploying data source:', error);
const errorMessage = error instanceof Error ? error.message : 'Failed to deploy data source';
messageInstance.error(errorMessage);
throw error;
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import axios from "axios";
import { message } from "antd";
import { messageInstance } from "lowcoder-design/src/components/GlobalInstances";
import { ManagedOrg } from "../types/enterprise.types";
import { Query } from "../types/query.types";

Expand All @@ -26,7 +26,7 @@ export async function getManagedWorkspaces(
return all.filter(org => org.environmentId === environmentId);
} catch (err) {
const errorMsg = err instanceof Error ? err.message : "Failed to fetch managed workspaces";
message.error(errorMsg);
messageInstance.error(errorMsg);
throw err;
}
}
Expand Down Expand Up @@ -63,7 +63,7 @@ export async function connectManagedWorkspace(
return res.data;
} catch (err) {
const errorMsg = err instanceof Error ? err.message : "Failed to connect org";
message.error(errorMsg);
messageInstance.error(errorMsg);
throw err;
}
}
Expand All @@ -88,7 +88,7 @@ export async function unconnectManagedWorkspace(orgGid: string) {
} catch (err) {
const errorMsg =
err instanceof Error ? err.message : "Failed to unconnect org";
message.error(errorMsg);
messageInstance.error(errorMsg);
throw err;
}
}
Expand Down Expand Up @@ -124,7 +124,7 @@ export async function connectManagedApp(
} catch (err) {
const errorMsg =
err instanceof Error ? err.message : "Failed to connect app";
message.error(errorMsg);
messageInstance.error(errorMsg);
throw err;
}
}
Expand All @@ -137,7 +137,7 @@ export async function unconnectManagedApp(appGid: string) {
});
} catch (err) {
const errorMsg = err instanceof Error ? err.message : "Failed to unconnect app";
message.error(errorMsg);
messageInstance.error(errorMsg);
throw err;
}
}
Expand All @@ -151,7 +151,8 @@ export const getManagedDataSources = async (environmentId: string): Promise<any[
);
return response.data.data || [];
} catch (error) {
console.error("Error fetching managed data sources:", error);
const errorMsg = error instanceof Error ? error.message : 'Failed to fetch data sources';
messageInstance.error(errorMsg);
throw error;
}
};
Expand All @@ -172,7 +173,8 @@ export const connectManagedDataSource = async (

await axios.post(`/api/plugins/enterprise/datasource`, payload);
} catch (error) {
console.error("Error connecting managed data source:", error);
const errorMsg = error instanceof Error ? error.message : 'Failed to deploy data source';
messageInstance.error(errorMsg);
throw error;
}
};
Expand All @@ -184,7 +186,8 @@ export const unconnectManagedDataSource = async (
try {
await axios.delete(`/api/plugins/enterprise/datasource?datasourceGid=${datasourceGid}`);
} catch (error) {
console.error("Error disconnecting managed data source:", error);
const errorMsg = error instanceof Error ? error.message : 'Failed to disconnect managed data source';
messageInstance.error(errorMsg);
throw error;
}
};
Expand Down Expand Up @@ -223,8 +226,8 @@ export async function getManagedQueries(environmentId: string): Promise<Query[]>
}));

} catch (error) {
const errorMessage = error instanceof Error ? error.message : 'Failed to fetch managed queries';
message.error(errorMessage);
const errorMsg = error instanceof Error ? error.message : 'Failed to fetch queries';
messageInstance.error(errorMsg);
throw error;
}
}
Expand All @@ -250,8 +253,8 @@ export async function connectManagedQuery(
return response.status === 200;

} catch (error) {
const errorMessage = error instanceof Error ? error.message : 'Failed to connect query';
message.error(errorMessage);
const errorMsg = error instanceof Error ? error.message : 'Failed to deploy query';
messageInstance.error(errorMsg);
throw error;
}
}
Expand All @@ -272,8 +275,8 @@ export async function unconnectManagedQuery(queryGid: string): Promise<boolean>
return response.status === 200;

} catch (error) {
const errorMessage = error instanceof Error ? error.message : 'Failed to disconnect query';
message.error(errorMessage);
const errorMsg = error instanceof Error ? error.message : 'Failed to disconnect query';
messageInstance.error(errorMsg);
throw error;
}
}
Loading