3 Commits

Author SHA1 Message Date
Harry-zklcdc 011827f5c7 [Fix] 🐛 PreCheck the Config if Instance has Changed #21 2025-03-30 01:25:21 +08:00
Harry-zklcdc 69554b5e39 [Fix] 🐛 Ignore GpuCount Value at Instance Modify to CpuOnly #21 2025-03-30 01:24:12 +08:00
Harry-zklcdc a24fb8e8ad [Feat] Add Auto Dark Mode 2025-03-17 13:39:20 +08:00
6 changed files with 80 additions and 25 deletions
+27 -16
View File
@@ -4,10 +4,36 @@ const layoutConfig = reactive({
preset: 'Aura', preset: 'Aura',
primary: 'blue', primary: 'blue',
surface: null, surface: null,
darkTheme: false, darkTheme: window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches,
menuMode: 'static' menuMode: 'static'
}); });
// Listen for changes to the prefers-color-scheme media query
if (window.matchMedia) {
window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', (e) => {
layoutConfig.darkTheme = e.matches;
toggleDarkMode();
});
}
const toggleDarkMode = () => {
if (!document.startViewTransition) {
executeDarkModeToggle();
return;
}
document.startViewTransition(() => executeDarkModeToggle(event));
};
if (layoutConfig.darkTheme) {
toggleDarkMode()
}
const executeDarkModeToggle = () => {
layoutConfig.darkTheme = !layoutConfig.darkTheme;
document.documentElement.classList.toggle('app-dark');
};
const layoutState = reactive({ const layoutState = reactive({
staticMenuDesktopInactive: false, staticMenuDesktopInactive: false,
overlayMenuActive: false, overlayMenuActive: false,
@@ -39,21 +65,6 @@ export function useLayout() {
layoutConfig.menuMode = mode; layoutConfig.menuMode = mode;
}; };
const toggleDarkMode = () => {
if (!document.startViewTransition) {
executeDarkModeToggle();
return;
}
document.startViewTransition(() => executeDarkModeToggle(event));
};
const executeDarkModeToggle = () => {
layoutConfig.darkTheme = !layoutConfig.darkTheme;
document.documentElement.classList.toggle('app-dark');
};
const onMenuToggle = () => { const onMenuToggle = () => {
if (layoutConfig.menuMode === 'overlay') { if (layoutConfig.menuMode === 'overlay') {
layoutState.overlayMenuActive = !layoutState.overlayMenuActive; layoutState.overlayMenuActive = !layoutState.overlayMenuActive;
+3
View File
@@ -498,6 +498,9 @@ const instanceModify = async () => {
setTimeout(() => { setTimeout(() => {
getInstances() getInstances()
}, 100); }, 100);
if (instanceConfiguration.value.cpu_only) {
delete instanceConfiguration.value.gpu_count
}
await api.AdminInstancesModify(instanceDetail.value.id, instanceConfiguration.value).then(async (res) => { await api.AdminInstancesModify(instanceDetail.value.id, instanceConfiguration.value).then(async (res) => {
toast.add({ severity: 'success', summary: '调整配置', detail: '已调整配置', life: 3000 }); toast.add({ severity: 'success', summary: '调整配置', detail: '已调整配置', life: 3000 });
instanceModifyVisible.value = false instanceModifyVisible.value = false
@@ -501,6 +501,9 @@ const instanceModify = async () => {
setTimeout(() => { setTimeout(() => {
getInstances() getInstances()
}, 100); }, 100);
if (instanceConfiguration.value.cpu_only) {
delete instanceConfiguration.value.gpu_count
}
await api.UserInstancesModify(instanceDetail.value.id, instanceConfiguration.value).then(async (res) => { await api.UserInstancesModify(instanceDetail.value.id, instanceConfiguration.value).then(async (res) => {
toast.add({ severity: 'success', summary: '调整配置', detail: '已调整配置', life: 3000 }); toast.add({ severity: 'success', summary: '调整配置', detail: '已调整配置', life: 3000 });
instanceModifyVisible.value = false instanceModifyVisible.value = false
+15 -1
View File
@@ -33,6 +33,10 @@ func modifyHandler(ctx iris.Context) {
return return
} }
if req.CpuOnly {
req.GpuCount = nil
}
if req.GpuCount != nil { if req.GpuCount != nil {
if *req.GpuCount < 0 { if *req.GpuCount < 0 {
middleware.Error(ctx, middleware.CodeBadRequest, iris.StatusBadRequest) middleware.Error(ctx, middleware.CodeBadRequest, iris.StatusBadRequest)
@@ -62,7 +66,17 @@ func modifyHandler(ctx iris.Context) {
return return
} }
if req.CpuOnly == instance.CpuOnly && req.CpuOnly { hasChanges := false
if req.CpuOnly != instance.CpuOnly {
hasChanges = true
}
if req.GpuCount != nil && *req.GpuCount != instance.GpuCount {
hasChanges = true
}
if req.VolumeSize != nil && *req.VolumeSize != instance.VolumeSize {
hasChanges = true
}
if !hasChanges {
middleware.Error(ctx, middleware.CodeBadRequest, iris.StatusBadRequest) middleware.Error(ctx, middleware.CodeBadRequest, iris.StatusBadRequest)
return return
} }
+15 -1
View File
@@ -39,6 +39,10 @@ func modifyHandler(ctx iris.Context) {
return return
} }
if req.CpuOnly {
req.GpuCount = nil
}
if req.GpuCount != nil { if req.GpuCount != nil {
if *req.GpuCount < 0 { if *req.GpuCount < 0 {
middleware.Error(ctx, middleware.CodeBadRequest, iris.StatusBadRequest) middleware.Error(ctx, middleware.CodeBadRequest, iris.StatusBadRequest)
@@ -68,7 +72,17 @@ func modifyHandler(ctx iris.Context) {
return return
} }
if req.CpuOnly == instance.CpuOnly && req.CpuOnly { hasChanges := false
if req.CpuOnly != instance.CpuOnly {
hasChanges = true
}
if req.GpuCount != nil && *req.GpuCount != instance.GpuCount {
hasChanges = true
}
if req.VolumeSize != nil && *req.VolumeSize != instance.VolumeSize {
hasChanges = true
}
if !hasChanges {
middleware.Error(ctx, middleware.CodeBadRequest, iris.StatusBadRequest) middleware.Error(ctx, middleware.CodeBadRequest, iris.StatusBadRequest)
return return
} }
+13 -3
View File
@@ -43,9 +43,19 @@ func modify(serverID uint, data Data) (err error) {
return errors.New("instance status error") return errors.New("instance status error")
} }
if data.CpuOnly == instance.CpuOnly && data.CpuOnly { hasChanges := false
lc.Error("instance already cpu_only mode") if data.CpuOnly != instance.CpuOnly {
return errors.New("instance already cpu_only mode") hasChanges = true
}
if data.GpuCount != nil && *data.GpuCount != instance.GpuCount {
hasChanges = true
}
if data.VolumeSize != nil && *data.VolumeSize != instance.VolumeSize {
hasChanges = true
}
if !hasChanges {
lc.Error("no changes")
return errors.New("no changes")
} }
oldVolumeSize := instance.VolumeSize oldVolumeSize := instance.VolumeSize