优化任务状态投影和部署文档
This commit is contained in:
+6
-1
@@ -8,6 +8,7 @@ import type {
|
||||
AdminCloudtentaclesValidateSessionResult,
|
||||
} from '@/types/admin'
|
||||
import { formatAdminDateTime } from '@/utils/admin-time'
|
||||
import { useRememberedCollapse } from '../../composables/useRememberedCollapse'
|
||||
|
||||
type CloudtentaclesForm = {
|
||||
baseUrl: string
|
||||
@@ -50,6 +51,10 @@ type Props = {
|
||||
}
|
||||
|
||||
defineProps<Props>()
|
||||
|
||||
const advancedCollapseNames = useRememberedCollapse(
|
||||
'admin:platform-config:cloudtentacles:config:collapse',
|
||||
)
|
||||
</script>
|
||||
|
||||
<template>
|
||||
@@ -245,7 +250,7 @@ defineProps<Props>()
|
||||
</el-form>
|
||||
</div>
|
||||
|
||||
<el-collapse class="advanced-collapse">
|
||||
<el-collapse v-model="advancedCollapseNames" class="advanced-collapse">
|
||||
<el-collapse-item name="advanced" title="高级参数与调试字段">
|
||||
<el-form label-width="auto" label-position="top">
|
||||
<div class="form-grid">
|
||||
|
||||
+7
-1
@@ -1,4 +1,6 @@
|
||||
<script setup lang="ts">
|
||||
import { useRememberedCollapse } from '../../composables/useRememberedCollapse'
|
||||
|
||||
type Props = {
|
||||
cloudtentaclesDebugLoading: boolean
|
||||
handleCloudtentaclesFetchAsset: () => void | Promise<void>
|
||||
@@ -19,11 +21,15 @@ type Props = {
|
||||
}
|
||||
|
||||
defineProps<Props>()
|
||||
|
||||
const debugCollapseNames = useRememberedCollapse(
|
||||
'admin:platform-config:cloudtentacles:debug:collapse',
|
||||
)
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<el-card class="debug-card">
|
||||
<el-collapse>
|
||||
<el-collapse v-model="debugCollapseNames">
|
||||
<el-collapse-item name="debug">
|
||||
<template #title>
|
||||
<div class="debug-title">
|
||||
|
||||
@@ -0,0 +1,57 @@
|
||||
import { ref, watch, type Ref } from 'vue'
|
||||
|
||||
export function useRememberedCollapse(storageKey: string, defaultValue: string[] = []): Ref<string[]> {
|
||||
const activeNames = ref<string[]>(readStoredCollapseNames(storageKey, defaultValue))
|
||||
|
||||
watch(
|
||||
activeNames,
|
||||
(names) => {
|
||||
writeStoredCollapseNames(storageKey, names)
|
||||
},
|
||||
{ deep: true },
|
||||
)
|
||||
|
||||
return activeNames
|
||||
}
|
||||
|
||||
function readStoredCollapseNames(storageKey: string, defaultValue: string[]): string[] {
|
||||
if (!canUseLocalStorage()) {
|
||||
return [...defaultValue]
|
||||
}
|
||||
|
||||
try {
|
||||
const rawValue = window.localStorage.getItem(storageKey)
|
||||
if (!rawValue) {
|
||||
return [...defaultValue]
|
||||
}
|
||||
|
||||
const parsed = JSON.parse(rawValue)
|
||||
return normalizeCollapseNames(parsed, defaultValue)
|
||||
} catch {
|
||||
return [...defaultValue]
|
||||
}
|
||||
}
|
||||
|
||||
function writeStoredCollapseNames(storageKey: string, names: string[]): void {
|
||||
if (!canUseLocalStorage()) {
|
||||
return
|
||||
}
|
||||
|
||||
try {
|
||||
window.localStorage.setItem(storageKey, JSON.stringify(normalizeCollapseNames(names)))
|
||||
} catch {
|
||||
// 浏览器禁用存储时忽略,折叠状态退化为本次会话内有效。
|
||||
}
|
||||
}
|
||||
|
||||
function normalizeCollapseNames(value: unknown, fallback: string[] = []): string[] {
|
||||
if (!Array.isArray(value)) {
|
||||
return [...fallback]
|
||||
}
|
||||
|
||||
return Array.from(new Set(value.map((item) => String(item || '').trim()).filter(Boolean)))
|
||||
}
|
||||
|
||||
function canUseLocalStorage(): boolean {
|
||||
return typeof window !== 'undefined' && Boolean(window.localStorage)
|
||||
}
|
||||
Reference in New Issue
Block a user