Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

[Fix]: Update more UI Pages for the Environments + Add API Call Count in UI#1724

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 ourterms of service andprivacy statement. We’ll occasionally send you account related emails.

Already on GitHub?Sign in to your account

Merged
Merged
Show file tree
Hide file tree
Changes fromall commits
Commits
Show all changes
16 commits
Select commitHold shift + click to select a range
0ee3f1f
Add api calls count
iamfaranMay 29, 2025
49d8481
update alert texts for environment modals
iamfaranMay 29, 2025
2252d2c
add less aggressive license messages
iamfaranMay 29, 2025
0009f4a
Merge branch 'fix/environment-type' into fix/antD-errrors-environments
iamfaranMay 29, 2025
b7109c5
[Fix]: antd errors for environments
iamfaranMay 29, 2025
55ff3e5
[Fix] tabs and breadcrumbs error
iamfaranMay 29, 2025
880a4fb
[FIx]: improve UI for environments
iamfaranMay 29, 2025
f507287
fix environment detail width issue
iamfaranMay 29, 2025
b35861b
[Fix] Workspace Detail Page UI
iamfaranMay 29, 2025
5b54276
[Fix]: query deployment param
iamfaranMay 29, 2025
e54c63f
[Fix] remove updated dependenceis need for DS and QL
iamfaranMay 29, 2025
2714dde
[Fix] unlicensed environment page UI
iamfaranMay 29, 2025
ed8459b
Merge UI, deploy endpoints, Add API count and update license messages
iamfaranMay 29, 2025
f823ecd
Merge branch 'dev' of github.com:lowcoder-org/lowcoder into fix/ui-an…
iamfaranMay 29, 2025
540af6f
change progressbar direction
iamfaranMay 29, 2025
c28c62f
[Fix] antD deprecated properties
iamfaranMay 29, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
View file
Open in desktop
Original file line numberDiff line numberDiff line change
Expand Up@@ -10,6 +10,10 @@ import {
Button,
Tag,
Result,
Row,
Col,
Statistic,
Progress,
}from"antd";
import{
LinkOutlined,
Expand All@@ -21,6 +25,11 @@ import {
CloseCircleOutlined,
ExclamationCircleOutlined,
SyncOutlined,
CloudServerOutlined,
UserOutlined,
SafetyOutlined,
CrownOutlined,
ApiOutlined,
}from"@ant-design/icons";

import{useSingleEnvironmentContext}from"./context/SingleEnvironmentContext";
Expand All@@ -31,10 +40,12 @@ import history from "@lowcoder-ee/util/history";
importWorkspacesTabfrom"./components/WorkspacesTab";
importUserGroupsTabfrom"./components/UserGroupsTab";
importEnvironmentHeaderfrom"./components/EnvironmentHeader";
importStatsCardfrom"./components/StatsCard";
importModernBreadcrumbsfrom"./components/ModernBreadcrumbs";
import{getEnvironmentTagColor}from"./utils/environmentUtils";
import{formatAPICalls,getAPICallsStatusColor}from"./services/license.service";
importErrorComponentfrom'./components/ErrorComponent';
const{TabPane}=Tabs;
import{Level1SettingPageContent}from"../styled";

/**
* Environment Detail Page Component
Expand DownExpand Up@@ -124,33 +135,80 @@ const EnvironmentDetail: React.FC = () => {
);
}

constbreadcrumbItems=[
// Stats data for the cards
conststatsData=[
{
key:'environments',
title:(
title:"Type",
value:environment.environmentType||"Unknown",
icon:<CloudServerOutlined/>,
color:getEnvironmentTagColor(environment.environmentType)
},
{
title:"Status",
value:environment.isLicensed ?"Licensed" :"Unlicensed",
icon:environment.isLicensed ?<CheckCircleOutlined/> :<CloseCircleOutlined/>,
color:environment.isLicensed ?"#52c41a" :"#ff4d4f"
},
{
title:"API Key",
value:environment.environmentApikey ?"Configured" :"Not Set",
icon:<SafetyOutlined/>,
color:environment.environmentApikey ?"#1890ff" :"#faad14"
},
{
title:"Master Env",
value:environment.isMaster ?"Yes" :"No",
icon:<UserOutlined/>,
color:environment.isMaster ?"#722ed1" :"#8c8c8c"
}
];

consttabItems=[
{
key:'workspaces',
label:(
<span>
<HomeOutlined/>Environments
<AppstoreOutlined/>Workspaces
</span>
),
onClick:()=>history.push("/setting/environments")
children:<WorkspacesTabenvironment={environment}/>
},
{
key:'currentEnvironment',
title:environment.environmentName
key:'userGroups',
label:(
<span>
<UsergroupAddOutlined/> User Groups
</span>
),
children:<UserGroupsTabenvironment={environment}/>
}
];

return(
<div
className="environment-detail-container"
style={{padding:"24px",flex:1,minWidth:"1000px"}}
>
<Level1SettingPageContentstyle={{minWidth:"1000px"}}>
{/* Breadcrumbs */}


{/* Environment Header Component */}
<EnvironmentHeader
environment={environment}
onEditClick={handleEditClick}
/>

{/* Stats Cards Row */}
<Rowgutter={[16,16]}style={{marginBottom:"24px"}}>
{statsData.map((stat,index)=>(
<Colxs={24}sm={12}lg={6}key={index}>
<StatsCard
title={stat.title}
value={stat.value}
icon={stat.icon}
color={stat.color}
/>
</Col>
))}
</Row>

{/* Basic Environment Information Card */}
<Card
title="Environment Overview"
Expand DownExpand Up@@ -180,13 +238,10 @@ const EnvironmentDetail: React.FC = () => {
"No domain set"
)}
</Descriptions.Item>
<Descriptions.Itemlabel="Environment Type">
<Tag
color={getEnvironmentTagColor(environment.environmentType)}
style={{borderRadius:'4px'}}
>
{environment.environmentType}
</Tag>
<Descriptions.Itemlabel="Environment ID">
<codestyle={{padding:'2px 6px',background:'#f5f5f5',borderRadius:'3px'}}>
{environment.environmentId}
</code>
</Descriptions.Item>
<Descriptions.Itemlabel="License Status">
{(()=>{
Expand All@@ -196,29 +251,178 @@ const EnvironmentDetail: React.FC = () => {
case'licensed':
return<Tagicon={<CheckCircleOutlined/>}color="green"style={{borderRadius:'4px'}}>Licensed</Tag>;
case'unlicensed':
return<Tagicon={<CloseCircleOutlined/>}color="red"style={{borderRadius:'4px'}}>Not Licensed</Tag>;
return<Tagicon={<CloseCircleOutlined/>}color="orange"style={{borderRadius:'4px'}}>License Needed</Tag>;
case'error':
return<Tagicon={<ExclamationCircleOutlined/>}color="orange"style={{borderRadius:'4px'}}>License Error</Tag>;
return<Tagicon={<ExclamationCircleOutlined/>}color="orange"style={{borderRadius:'4px'}}>Setup Required</Tag>;
default:
return<Tagcolor="default"style={{borderRadius:'4px'}}>Unknown</Tag>;
}
})()}
</Descriptions.Item>
<Descriptions.Itemlabel="API Key Status">
{environment.environmentApikey ?(
<Tagcolor="green"style={{borderRadius:'4px'}}>Configured</Tag>
) :(
<Tagcolor="red"style={{borderRadius:'4px'}}>Not Configured</Tag>
)}
</Descriptions.Item>
<Descriptions.Itemlabel="Master Environment">
{environment.isMaster ?"Yes" :"No"}
<Descriptions.Itemlabel="Created">
{environment.createdAt ?newDate(environment.createdAt).toLocaleDateString() :"Unknown"}
</Descriptions.Item>
</Descriptions>
</Card>

{/* Modern Breadcrumbs navigation */}
<ModernBreadcrumbsitems={breadcrumbItems}/>
<ModernBreadcrumbs
items={[
{
key:'environments',
title:'Environments',
onClick:()=>history.push('/setting/environments')
},
{
key:'current',
title:environment.environmentName||"Environment Detail"
}
]}
/>
{/* Detailed License Information Card - only show for licensed environments with details */}
{environment.isLicensed&&environment.licenseDetails&&(
<Card
title={
<span>
<CrownOutlinedstyle={{color:'#52c41a',marginRight:'8px'}}/>
License Details
</span>
}
style={{
marginBottom:"24px",
borderRadius:'4px',
border:'1px solid #f0f0f0'
}}
className="license-details-card"
>
<Rowgutter={[24,16]}>
{/* API Calls Status */}
<Colxs={24}sm={12}md={8}>
<Card
size="small"
style={{height:'100%',textAlign:'center'}}
styles={{body:{padding:'16px'}}}
>
<Statistic
title="API Calls Remaining"
value={environment.licenseDetails.remainingAPICalls}
formatter={(value)=>(
<spanstyle={{
color:getAPICallsStatusColor(
environment.licenseDetails?.remainingAPICalls||0,
environment.licenseDetails?.totalAPICallsLimit||0
)
}}>
{value?.toLocaleString()}
</span>
)}
prefix={<ApiOutlined/>}
/>
<divstyle={{marginTop:'12px'}}>
<Progress
percent={environment.licenseDetails.apiCallsUsage||0}
strokeColor={getAPICallsStatusColor(
environment.licenseDetails.remainingAPICalls,
environment.licenseDetails.totalAPICallsLimit||0
)}
size="small"
showInfo={false}
/>
<divstyle={{
fontSize:'12px',
color:'#8c8c8c',
marginTop:'4px'
}}>
{environment.licenseDetails.apiCallsUsage||0}% used
</div>
</div>
</Card>
</Col>

{/* Total License Limit */}
<Colxs={24}sm={12}md={8}>
<Card
size="small"
style={{height:'100%',textAlign:'center'}}
styles={{body:{padding:'16px'}}}
>
<Statistic
title="Total API Calls Limit"
value={environment.licenseDetails.totalAPICallsLimit}
formatter={(value)=>value?.toLocaleString()}
prefix={<ApiOutlined/>}
/>
<Tag
color="blue"
style={{marginTop:'12px'}}
>
{environment.licenseDetails.eeLicenses.length} License{environment.licenseDetails.eeLicenses.length!==1 ?'s' :''}
</Tag>
</Card>
</Col>

{/* Enterprise Edition Status */}
<Colxs={24}sm={12}md={8}>
<Card
size="small"
style={{height:'100%',textAlign:'center'}}
styles={{body:{padding:'16px'}}}
>
<Statistic
title="Enterprise Edition"
value={environment.licenseDetails.eeActive ?"Active" :"Inactive"}
formatter={(value)=>(
<Tag
color={environment.licenseDetails?.eeActive ?"green" :"red"}
icon={environment.licenseDetails?.eeActive ?<CheckCircleOutlined/> :<CloseCircleOutlined/>}
>
{value}
</Tag>
)}
/>
</Card>
</Col>
</Row>

{/* License Details */}
<divstyle={{marginTop:'24px'}}>
<Typography.Titlelevel={5}style={{marginBottom:'16px'}}>
<UserOutlinedstyle={{marginRight:'8px'}}/>
License Information
</Typography.Title>

<Rowgutter={[16,16]}>
{environment.licenseDetails.eeLicenses.map((license,index)=>(
<Colxs={24}sm={12}md={8}key={license.uuid}>
<Card
size="small"
style={{
border:'1px solid #f0f0f0',
borderRadius:'6px'
}}
styles={{body:{padding:'12px'}}}
>
<divstyle={{marginBottom:'8px'}}>
<strongstyle={{color:'#262626'}}>
{license.customerName}
</strong>
</div>
<divstyle={{fontSize:'12px',color:'#8c8c8c',marginBottom:'8px'}}>
ID:{license.customerId}
</div>
<divstyle={{fontSize:'12px',color:'#8c8c8c',marginBottom:'8px'}}>
UUID:<spanstyle={{fontFamily:'monospace'}}>{license.uuid.substring(0,8)}...</span>
</div>
<Tagcolor="blue">
{license.apiCallsLimit.toLocaleString()} calls
</Tag>
</Card>
</Col>
))}
</Row>
</div>
</Card>
)}


{/* Tabs for Workspaces and User Groups */}
<Tabs
Expand All@@ -227,29 +431,8 @@ const EnvironmentDetail: React.FC = () => {
onChange={setActiveTab}
className="modern-tabs"
type="line"
>
<TabPane
tab={
<span>
<AppstoreOutlined/> Workspaces
</span>
}
key="workspaces"
>
<WorkspacesTabenvironment={environment}/>
</TabPane>

<TabPane
tab={
<span>
<UsergroupAddOutlined/> User Groups
</span>
}
key="userGroups"
>
<UserGroupsTabenvironment={environment}/>
</TabPane>
</Tabs>
items={tabItems}
/>

{/* Edit Environment Modal */}
{environment&&(
Expand All@@ -261,7 +444,7 @@ const EnvironmentDetail: React.FC = () => {
loading={isUpdating}
/>
)}
</div>
</Level1SettingPageContent>
);
};

Expand Down
Loading
Loading

[8]ページ先頭

©2009-2025 Movatter.jp