@@ -3,29 +3,30 @@ import {
33 Spin ,
44 Typography ,
55 Card ,
6- Tag ,
76 Tabs ,
87 Alert ,
98 Descriptions ,
109 Menu ,
1110 Button ,
12- Breadcrumb ,
11+ Tag ,
1312} from "antd" ;
1413import {
1514 LinkOutlined ,
16- TeamOutlined ,
15+ HomeOutlined ,
16+ AppstoreOutlined ,
17+ UsergroupAddOutlined ,
1718 EditOutlined ,
18- HomeOutlined
1919} from "@ant-design/icons" ;
2020
2121import { useSingleEnvironmentContext } from "./context/SingleEnvironmentContext" ;
22- import { workspaceConfig } from "./config/workspace.config" ;
23- import { userGroupsConfig } from "./config/usergroups.config" ;
24- import DeployableItemsTab from "./components/DeployableItemsTab" ;
2522import EditEnvironmentModal from "./components/EditEnvironmentModal" ;
2623import { Environment } from "./types/environment.types" ;
2724import history from "@lowcoder-ee/util/history" ;
28-
25+ import WorkspacesTab from "./components/WorkspacesTab" ;
26+ import UserGroupsTab from "./components/UserGroupsTab" ;
27+ import EnvironmentHeader from "./components/EnvironmentHeader" ;
28+ import ModernBreadcrumbs from "./components/ModernBreadcrumbs" ;
29+ import { getEnvironmentTagColor } from "./utils/environmentUtils" ;
2930const { Title, Text } = Typography ;
3031const { TabPane } = Tabs ;
3132
@@ -44,6 +45,7 @@ const EnvironmentDetail: React.FC = () => {
4445
4546 const [ isEditModalVisible , setIsEditModalVisible ] = useState ( false ) ;
4647 const [ isUpdating , setIsUpdating ] = useState ( false ) ;
48+ const [ activeTab , setActiveTab ] = useState ( 'workspaces' ) ;
4749
4850 // Handle edit menu item click
4951 const handleEditClick = ( ) => {
@@ -73,15 +75,7 @@ const EnvironmentDetail: React.FC = () => {
7375 }
7476 } ;
7577
76- // Dropdown menu for environment actions
77- const actionsMenu = (
78- < Menu >
79- < Menu . Item key = "edit" icon = { < EditOutlined /> } onClick = { handleEditClick } >
80- Edit Environment
81- </ Menu . Item >
82- { /* Add more menu items here if needed */ }
83- </ Menu >
84- ) ;
78+
8579
8680 if ( isLoading ) {
8781 return (
@@ -92,67 +86,81 @@ const EnvironmentDetail: React.FC = () => {
9286 }
9387
9488 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+
95105 return (
96- < Alert
97- message = "Error loading environment"
98- description = { error || "Environment not found" }
99- type = "error"
100- showIcon
101- />
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 >
102127 ) ;
103128 }
104-
129+
130+ const breadcrumbItems = [
131+ {
132+ key : 'environments' ,
133+ title : (
134+ < span >
135+ < HomeOutlined /> Environments
136+ </ span >
137+ ) ,
138+ onClick : ( ) => history . push ( "/setting/environments" )
139+ } ,
140+ {
141+ key : 'currentEnvironment' ,
142+ title : environment . environmentName
143+ }
144+ ] ;
145+
105146 return (
106147 < div
107148 className = "environment-detail-container"
108149 style = { { padding : "24px" , flex : 1 } }
109150 >
110- < Breadcrumb style = { { marginBottom : "16px" } } >
111- < Breadcrumb . Item >
112- < span
113- style = { { cursor : "pointer" } }
114- onClick = { ( ) => history . push ( "/setting/environments" ) }
115- >
116- < HomeOutlined /> Environments
117- </ span >
118- </ Breadcrumb . Item >
119- < Breadcrumb . Item > { environment . environmentName } </ Breadcrumb . Item >
120- </ Breadcrumb >
151+ { /* Environment Header Component */ }
152+ < EnvironmentHeader
153+ environment = { environment }
154+ onEditClick = { handleEditClick }
155+ />
121156
122- { /* Header with environment name and controls */ }
123- < div
124- className = "environment-header"
125- style = { {
126- marginBottom : "24px" ,
127- display : "flex" ,
128- justifyContent : "space-between" ,
129- alignItems : "flex-start" ,
130- flexWrap : "wrap" ,
131- gap : "16px" ,
132- } }
133- >
134- < div style = { { flex : "1 1 auto" , minWidth : "200px" } } >
135- < Title level = { 3 } style = { { margin : 0 , wordBreak : "break-word" } } >
136- { environment . environmentName || "Unnamed Environment" }
137- </ Title >
138- < Text type = "secondary" > ID: { environment . environmentId } </ Text >
139- </ div >
140- < div style = { { flexShrink : 0 } } >
141- < Button
142- icon = { < EditOutlined /> }
143- onClick = { handleEditClick }
144- type = "primary"
145- >
146- Edit Environment
147- </ Button >
148- </ div >
149- </ div >
157+
150158
151159 { /* Basic Environment Information Card - improved responsiveness */ }
152160 < Card
153161 title = "Environment Overview"
154- style = { { marginBottom : "24px" } }
155- extra = { environment . isMaster && < Tag color = "green" > Master </ Tag > }
162+ style = { { marginBottom : "24px" , borderRadius : '8px' , boxShadow : '0 2px 8px rgba(0,0,0,0.05)' } }
163+ className = " environment-overview-card"
156164 >
157165 < Descriptions
158166 bordered
@@ -175,22 +183,17 @@ const EnvironmentDetail: React.FC = () => {
175183 </ Descriptions . Item >
176184 < Descriptions . Item label = "Environment Type" >
177185 < Tag
178- color = {
179- environment . environmentType === "production"
180- ? "red"
181- : environment . environmentType === "testing"
182- ? "orange"
183- : "blue"
184- }
186+ color = { getEnvironmentTagColor ( environment . environmentType ) }
187+ style = { { borderRadius : '12px' } }
185188 >
186189 { environment . environmentType }
187190 </ Tag >
188191 </ Descriptions . Item >
189192 < Descriptions . Item label = "API Key Status" >
190193 { environment . environmentApikey ? (
191- < Tag color = "green" > Configured</ Tag >
194+ < Tag color = "green" style = { { borderRadius : '12px' } } > Configured</ Tag >
192195 ) : (
193- < Tag color = "red" > Not Configured</ Tag >
196+ < Tag color = "red" style = { { borderRadius : '12px' } } > Not Configured</ Tag >
194197 ) }
195198 </ Descriptions . Item >
196199 < Descriptions . Item label = "Master Environment" >
@@ -199,33 +202,41 @@ const EnvironmentDetail: React.FC = () => {
199202 </ Descriptions >
200203 </ Card >
201204
205+ { /* Modern Breadcrumbs navigation */ }
206+ < ModernBreadcrumbs items = { breadcrumbItems } />
202207 { /* Tabs for Workspaces and User Groups */ }
203- < Tabs defaultActiveKey = "workspaces" >
204- < TabPane tab = "Workspaces" key = "workspaces" >
205- { /* Using our new generic component with the workspace config */ }
206- < DeployableItemsTab
207- environment = { environment }
208- config = { workspaceConfig }
209- title = "Workspaces in this Environment"
210- />
208+ < Tabs
209+ defaultActiveKey = "workspaces"
210+ activeKey = { activeTab }
211+ onChange = { setActiveTab }
212+ className = "modern-tabs"
213+ type = "card"
214+ >
215+ < TabPane
216+ tab = {
217+ < span >
218+ < AppstoreOutlined /> Workspaces
219+ </ span >
220+ }
221+ key = "workspaces"
222+ >
223+ { /* Using our new standalone WorkspacesTab component */ }
224+ < WorkspacesTab environment = { environment } />
211225 </ TabPane >
226+
212227 < TabPane
213228 tab = {
214229 < span >
215- < TeamOutlined /> User Groups
230+ < UsergroupAddOutlined /> User Groups
216231 </ span >
217232 }
218233 key = "userGroups"
219234 >
220- { /* Using our new generic component with the user group config */ }
221- < DeployableItemsTab
222- environment = { environment }
223- config = { userGroupsConfig }
224- title = "User Groups in this Environment"
225- />
235+ { /* Now using our standalone UserGroupsTab component */ }
236+ < UserGroupsTab environment = { environment } />
226237 </ TabPane >
227238 </ Tabs >
228-
239+
229240 { /* Edit Environment Modal */ }
230241 { environment && (
231242 < EditEnvironmentModal
0 commit comments