mirror of
https://github.com/jxxghp/MoviePilot-Frontend.git
synced 2026-09-08 09:16:58 +08:00
Refine dashboard profile persistence and radius tokens
This commit is contained in:
@@ -742,23 +742,28 @@ async function handleResetSettings() {
|
|||||||
inline-size: 100%;
|
inline-size: 100%;
|
||||||
min-inline-size: 0;
|
min-inline-size: 0;
|
||||||
|
|
||||||
--theme-customizer-preview-radius: var(--app-vuetify-rounded);
|
--theme-customizer-preview-control-radius: var(--app-vuetify-rounded);
|
||||||
|
--theme-customizer-preview-surface-radius: var(--app-vuetify-rounded-lg);
|
||||||
}
|
}
|
||||||
|
|
||||||
.theme-customizer-radius-scene--none {
|
.theme-customizer-radius-scene--none {
|
||||||
--theme-customizer-preview-radius: var(--app-vuetify-rounded-0);
|
--theme-customizer-preview-control-radius: var(--app-vuetify-rounded-sm);
|
||||||
|
--theme-customizer-preview-surface-radius: var(--app-vuetify-rounded-sm);
|
||||||
}
|
}
|
||||||
|
|
||||||
.theme-customizer-radius-scene--small {
|
.theme-customizer-radius-scene--small {
|
||||||
--theme-customizer-preview-radius: var(--app-vuetify-rounded-sm);
|
--theme-customizer-preview-control-radius: var(--app-vuetify-rounded);
|
||||||
|
--theme-customizer-preview-surface-radius: var(--app-vuetify-rounded);
|
||||||
}
|
}
|
||||||
|
|
||||||
.theme-customizer-radius-scene--large {
|
.theme-customizer-radius-scene--large {
|
||||||
--theme-customizer-preview-radius: var(--app-vuetify-rounded-lg);
|
--theme-customizer-preview-control-radius: var(--app-vuetify-rounded-lg);
|
||||||
|
--theme-customizer-preview-surface-radius: var(--app-vuetify-rounded-lg);
|
||||||
}
|
}
|
||||||
|
|
||||||
.theme-customizer-radius-scene--extra {
|
.theme-customizer-radius-scene--extra {
|
||||||
--theme-customizer-preview-radius: var(--app-vuetify-rounded-xl);
|
--theme-customizer-preview-control-radius: var(--app-vuetify-rounded-xl);
|
||||||
|
--theme-customizer-preview-surface-radius: var(--app-vuetify-rounded-xl);
|
||||||
}
|
}
|
||||||
|
|
||||||
.theme-customizer-radius-scene__card {
|
.theme-customizer-radius-scene__card {
|
||||||
@@ -766,7 +771,7 @@ async function handleResetSettings() {
|
|||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
border: 1px solid rgba(var(--v-theme-on-surface), 0.08);
|
border: 1px solid rgba(var(--v-theme-on-surface), 0.08);
|
||||||
border-radius: var(--theme-customizer-preview-radius);
|
border-radius: var(--theme-customizer-preview-surface-radius);
|
||||||
background: rgb(var(--v-theme-surface));
|
background: rgb(var(--v-theme-surface));
|
||||||
gap: 8px;
|
gap: 8px;
|
||||||
inset: 16px;
|
inset: 16px;
|
||||||
@@ -781,14 +786,14 @@ async function handleResetSettings() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.theme-customizer-radius-scene__badge {
|
.theme-customizer-radius-scene__badge {
|
||||||
border-radius: var(--theme-customizer-preview-radius);
|
border-radius: var(--theme-customizer-preview-control-radius);
|
||||||
block-size: 8px;
|
block-size: 8px;
|
||||||
inline-size: 42%;
|
inline-size: 42%;
|
||||||
min-inline-size: 28px;
|
min-inline-size: 28px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.theme-customizer-radius-scene__line {
|
.theme-customizer-radius-scene__line {
|
||||||
border-radius: var(--theme-customizer-preview-radius);
|
border-radius: var(--theme-customizer-preview-control-radius);
|
||||||
block-size: 7px;
|
block-size: 7px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+170
-51
@@ -63,6 +63,12 @@ interface DashboardGridLayoutItem {
|
|||||||
h?: number
|
h?: number
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 单个设备档位的仪表盘配置,将布局与显示项绑定到同一份持久化数据。
|
||||||
|
interface DashboardProfileConfig {
|
||||||
|
enabled?: DashboardEnableConfig
|
||||||
|
items: DashboardGridLayoutConfig
|
||||||
|
}
|
||||||
|
|
||||||
interface DashboardGridItem {
|
interface DashboardGridItem {
|
||||||
config: DashboardItem
|
config: DashboardItem
|
||||||
id: string
|
id: string
|
||||||
@@ -91,7 +97,7 @@ const loadedDashboardGridItemIds = ref<Set<string>>(new Set())
|
|||||||
const isSyncingDashboardGrid = ref(false)
|
const isSyncingDashboardGrid = ref(false)
|
||||||
|
|
||||||
// 仪表板本地布局覆盖配置
|
// 仪表板本地布局覆盖配置
|
||||||
const dashboardGridLayout = ref<Record<string, DashboardGridLayoutItem>>({})
|
const dashboardGridLayout = ref<DashboardGridLayoutConfig>({})
|
||||||
|
|
||||||
// 当前仪表板布局档位,按 GridStack 响应式列数拆分跨端配置。
|
// 当前仪表板布局档位,按 GridStack 响应式列数拆分跨端配置。
|
||||||
const dashboardLayoutProfile = ref<DashboardLayoutProfile>('desktop')
|
const dashboardLayoutProfile = ref<DashboardLayoutProfile>('desktop')
|
||||||
@@ -99,6 +105,10 @@ const dashboardLayoutProfile = ref<DashboardLayoutProfile>('desktop')
|
|||||||
// 是否刚恢复过默认布局,用于避免退出编辑时立即把默认布局写回本地覆盖。
|
// 是否刚恢复过默认布局,用于避免退出编辑时立即把默认布局写回本地覆盖。
|
||||||
const isDashboardGridLayoutResetPending = ref(false)
|
const isDashboardGridLayoutResetPending = ref(false)
|
||||||
|
|
||||||
|
// 旧版跨设备显示项配置,仅用于首次迁移到按设备拆分的仪表盘配置。
|
||||||
|
let legacyDashboardEnableConfig: DashboardEnableConfig | undefined
|
||||||
|
let isLegacyDashboardEnableConfigLoaded = false
|
||||||
|
|
||||||
const dashboardGridResizeStartHeights = new Map<string, number | undefined>()
|
const dashboardGridResizeStartHeights = new Map<string, number | undefined>()
|
||||||
const dashboardGridPendingContentResize = new Set<GridItemHTMLElement>()
|
const dashboardGridPendingContentResize = new Set<GridItemHTMLElement>()
|
||||||
const dashboardGridObservedContentHeights = new Map<string, number>()
|
const dashboardGridObservedContentHeights = new Map<string, number>()
|
||||||
@@ -116,22 +126,10 @@ const isDashboardGridResizing = ref(false)
|
|||||||
const refreshTimers = ref<{ [key: string]: NodeJS.Timeout }>({})
|
const refreshTimers = ref<{ [key: string]: NodeJS.Timeout }>({})
|
||||||
|
|
||||||
// 仪表板启用配置
|
// 仪表板启用配置
|
||||||
const enableConfig = ref<{ [key: string]: boolean }>({
|
const enableConfig = ref<DashboardEnableConfig>(getDefaultDashboardEnableConfig())
|
||||||
mediaStatistic: true,
|
|
||||||
scheduler: false,
|
|
||||||
speed: false,
|
|
||||||
storage: true,
|
|
||||||
weeklyOverview: false,
|
|
||||||
cpu: false,
|
|
||||||
memory: false,
|
|
||||||
network: false,
|
|
||||||
library: true,
|
|
||||||
playing: true,
|
|
||||||
latest: true,
|
|
||||||
})
|
|
||||||
|
|
||||||
// 仪表板顺序配置
|
// 仪表板顺序配置
|
||||||
const orderConfig = ref<{ id: string; key: string }[]>([])
|
const orderConfig = ref<DashboardOrderConfig>([])
|
||||||
|
|
||||||
// 仪表板配置
|
// 仪表板配置
|
||||||
const dashboardConfigs = ref<DashboardItem[]>([
|
const dashboardConfigs = ref<DashboardItem[]>([
|
||||||
@@ -332,6 +330,23 @@ function clampGridNumber(value: unknown, min: number, max: number, fallback: num
|
|||||||
return Math.min(max, Math.max(min, Math.round(numericValue)))
|
return Math.min(max, Math.max(min, Math.round(numericValue)))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 获取仪表盘内置组件的默认显示配置。
|
||||||
|
function getDefaultDashboardEnableConfig(): DashboardEnableConfig {
|
||||||
|
return {
|
||||||
|
mediaStatistic: true,
|
||||||
|
scheduler: false,
|
||||||
|
speed: false,
|
||||||
|
storage: true,
|
||||||
|
weeklyOverview: false,
|
||||||
|
cpu: false,
|
||||||
|
memory: false,
|
||||||
|
network: false,
|
||||||
|
library: true,
|
||||||
|
playing: true,
|
||||||
|
latest: true,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// 校验并归一化仪表板显示配置,避免异常用户配置影响页面渲染。
|
// 校验并归一化仪表板显示配置,避免异常用户配置影响页面渲染。
|
||||||
function normalizeDashboardEnableConfig(value: unknown): DashboardEnableConfig | undefined {
|
function normalizeDashboardEnableConfig(value: unknown): DashboardEnableConfig | undefined {
|
||||||
if (!value || typeof value !== 'object' || Array.isArray(value)) return undefined
|
if (!value || typeof value !== 'object' || Array.isArray(value)) return undefined
|
||||||
@@ -362,12 +377,17 @@ function normalizeDashboardOrderConfig(value: unknown): DashboardOrderConfig | u
|
|||||||
}, [])
|
}, [])
|
||||||
}
|
}
|
||||||
|
|
||||||
// 校验并归一化仪表板 Grid 布局覆盖配置,兼容旧版裸布局和新版服务端包装结构。
|
// 校验并归一化仪表板 Grid 布局覆盖配置,兼容旧版裸布局和新版 profile 包装结构。
|
||||||
function normalizeDashboardGridLayout(value: unknown): DashboardGridLayoutConfig | undefined {
|
function normalizeDashboardGridLayout(value: unknown): DashboardGridLayoutConfig | undefined {
|
||||||
if (!value || typeof value !== 'object' || Array.isArray(value)) return undefined
|
if (!value || typeof value !== 'object' || Array.isArray(value)) return undefined
|
||||||
|
|
||||||
const configValue = value as { items?: unknown }
|
const configValue = value as { items?: unknown }
|
||||||
const layoutValue = configValue.items && typeof configValue.items === 'object' ? configValue.items : value
|
const hasWrappedLayout = Object.prototype.hasOwnProperty.call(configValue, 'items')
|
||||||
|
const layoutValue = hasWrappedLayout ? configValue.items : value
|
||||||
|
if (!layoutValue || typeof layoutValue !== 'object' || Array.isArray(layoutValue)) {
|
||||||
|
return hasWrappedLayout ? {} : undefined
|
||||||
|
}
|
||||||
|
|
||||||
const normalizedLayout: DashboardGridLayoutConfig = {}
|
const normalizedLayout: DashboardGridLayoutConfig = {}
|
||||||
|
|
||||||
Object.entries(layoutValue).forEach(([id, layout]) => {
|
Object.entries(layoutValue).forEach(([id, layout]) => {
|
||||||
@@ -391,9 +411,47 @@ function normalizeDashboardGridLayout(value: unknown): DashboardGridLayoutConfig
|
|||||||
return normalizedLayout
|
return normalizedLayout
|
||||||
}
|
}
|
||||||
|
|
||||||
// 构造服务端 Grid 布局配置,避免空布局被后端按空值删除后又被其他浏览器旧缓存回填。
|
// 校验并归一化单个设备档位的仪表盘配置,兼容旧版只保存 Grid 布局的数据。
|
||||||
function buildRemoteDashboardGridLayout(layout: DashboardGridLayoutConfig) {
|
function normalizeDashboardProfileConfig(value: unknown): DashboardProfileConfig | undefined {
|
||||||
return { items: layout }
|
if (!value || typeof value !== 'object' || Array.isArray(value)) return undefined
|
||||||
|
|
||||||
|
const configValue = value as { enabled?: unknown; items?: unknown }
|
||||||
|
const hasProfileField =
|
||||||
|
Object.prototype.hasOwnProperty.call(configValue, 'items') ||
|
||||||
|
Object.prototype.hasOwnProperty.call(configValue, 'enabled')
|
||||||
|
const items = normalizeDashboardGridLayout(hasProfileField ? { items: configValue.items ?? {} } : value)
|
||||||
|
if (items === undefined) return undefined
|
||||||
|
|
||||||
|
const enabled = normalizeDashboardEnableConfig(configValue.enabled)
|
||||||
|
const profileConfig: DashboardProfileConfig = { items }
|
||||||
|
|
||||||
|
if (enabled !== undefined) {
|
||||||
|
profileConfig.enabled = enabled
|
||||||
|
}
|
||||||
|
|
||||||
|
return profileConfig
|
||||||
|
}
|
||||||
|
|
||||||
|
// 构造设备档位仪表盘配置,让显示项和 Grid 布局始终作为一个整体持久化。
|
||||||
|
function buildDashboardProfileConfig(
|
||||||
|
layout: DashboardGridLayoutConfig = dashboardGridLayout.value,
|
||||||
|
enabled: DashboardEnableConfig = enableConfig.value,
|
||||||
|
): DashboardProfileConfig {
|
||||||
|
return {
|
||||||
|
enabled,
|
||||||
|
items: layout,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 构造服务端设备档位配置,避免空布局被后端按空值删除后又被其他浏览器旧缓存回填。
|
||||||
|
function buildRemoteDashboardProfileConfig(config: DashboardProfileConfig) {
|
||||||
|
const remoteConfig: DashboardProfileConfig = { items: config.items }
|
||||||
|
|
||||||
|
if (config.enabled !== undefined) {
|
||||||
|
remoteConfig.enabled = config.enabled
|
||||||
|
}
|
||||||
|
|
||||||
|
return remoteConfig
|
||||||
}
|
}
|
||||||
|
|
||||||
// 根据当前视口判断仪表板布局档位,避免手机和桌面共用 Grid 坐标。
|
// 根据当前视口判断仪表板布局档位,避免手机和桌面共用 Grid 坐标。
|
||||||
@@ -439,14 +497,41 @@ function getDashboardGridLayoutConfigKey(profile: DashboardLayoutProfile) {
|
|||||||
return `${DASHBOARD_GRID_LAYOUT_CONFIG_KEY_PREFIX}${profile === 'mobile' ? 'Mobile' : 'Tablet'}`
|
return `${DASHBOARD_GRID_LAYOUT_CONFIG_KEY_PREFIX}${profile === 'mobile' ? 'Mobile' : 'Tablet'}`
|
||||||
}
|
}
|
||||||
|
|
||||||
// 加载指定布局档位的 Grid 布局配置。
|
// 加载指定设备档位的仪表盘配置,远端旧布局缺少显示项时保留本地新版显示项。
|
||||||
async function loadDashboardGridLayoutConfig(profile: DashboardLayoutProfile) {
|
async function loadDashboardProfileConfig(profile: DashboardLayoutProfile) {
|
||||||
return await loadSharedDashboardConfig(
|
const configKey = getDashboardGridLayoutConfigKey(profile)
|
||||||
getDashboardGridLayoutConfigKey(profile),
|
const storageKey = getDashboardGridLayoutStorageKey(profile)
|
||||||
getDashboardGridLayoutStorageKey(profile),
|
const localConfig = readLocalDashboardConfig(storageKey, normalizeDashboardProfileConfig)
|
||||||
normalizeDashboardGridLayout,
|
|
||||||
buildRemoteDashboardGridLayout,
|
try {
|
||||||
)
|
const response = await api.get(`/user/config/${configKey}`)
|
||||||
|
const remoteConfig = normalizeDashboardProfileConfig(response?.data?.value)
|
||||||
|
|
||||||
|
if (remoteConfig !== undefined) {
|
||||||
|
const profileConfig: DashboardProfileConfig = { items: remoteConfig.items }
|
||||||
|
const enabled = remoteConfig.enabled ?? localConfig?.enabled
|
||||||
|
|
||||||
|
if (enabled !== undefined) {
|
||||||
|
profileConfig.enabled = enabled
|
||||||
|
}
|
||||||
|
|
||||||
|
saveLocalDashboardConfig(storageKey, profileConfig)
|
||||||
|
|
||||||
|
if (remoteConfig.enabled === undefined && localConfig?.enabled !== undefined) {
|
||||||
|
await saveUserDashboardConfig(configKey, buildRemoteDashboardProfileConfig(profileConfig))
|
||||||
|
}
|
||||||
|
|
||||||
|
return profileConfig
|
||||||
|
}
|
||||||
|
|
||||||
|
if (localConfig !== undefined) {
|
||||||
|
await saveUserDashboardConfig(configKey, buildRemoteDashboardProfileConfig(localConfig))
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error(error)
|
||||||
|
}
|
||||||
|
|
||||||
|
return localConfig
|
||||||
}
|
}
|
||||||
|
|
||||||
// 从本地存储读取并归一化指定的仪表板配置。
|
// 从本地存储读取并归一化指定的仪表板配置。
|
||||||
@@ -473,6 +558,25 @@ async function saveUserDashboardConfig(configKey: string, value: unknown) {
|
|||||||
await api.post(`/user/config/${configKey}`, value)
|
await api.post(`/user/config/${configKey}`, value)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 读取旧版全局显示项配置,用于设备档位配置还没有 enabled 字段时迁移。
|
||||||
|
async function loadLegacyDashboardEnableConfig() {
|
||||||
|
if (isLegacyDashboardEnableConfigLoaded) return legacyDashboardEnableConfig
|
||||||
|
|
||||||
|
const localConfig = readLocalDashboardConfig(DASHBOARD_ENABLE_STORAGE_KEY, normalizeDashboardEnableConfig)
|
||||||
|
|
||||||
|
try {
|
||||||
|
const response = await api.get(`/user/config/${DASHBOARD_ENABLE_CONFIG_KEY}`)
|
||||||
|
legacyDashboardEnableConfig = normalizeDashboardEnableConfig(response?.data?.value) ?? localConfig
|
||||||
|
} catch (error) {
|
||||||
|
console.error(error)
|
||||||
|
legacyDashboardEnableConfig = localConfig
|
||||||
|
}
|
||||||
|
|
||||||
|
isLegacyDashboardEnableConfigLoaded = true
|
||||||
|
|
||||||
|
return legacyDashboardEnableConfig
|
||||||
|
}
|
||||||
|
|
||||||
// 优先加载用户配置;服务端缺失时使用本地历史配置并回填到用户配置。
|
// 优先加载用户配置;服务端缺失时使用本地历史配置并回填到用户配置。
|
||||||
async function loadSharedDashboardConfig<T>(
|
async function loadSharedDashboardConfig<T>(
|
||||||
configKey: string,
|
configKey: string,
|
||||||
@@ -503,12 +607,20 @@ async function loadSharedDashboardConfig<T>(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 将当前仪表板布局覆盖配置保存到本地和用户配置。
|
// 将当前仪表板布局覆盖配置保存到本地和用户配置。
|
||||||
function saveDashboardGridLayout(layout: Record<string, DashboardGridLayoutItem>) {
|
function saveDashboardProfileConfig(layout = dashboardGridLayout.value, enabled = enableConfig.value) {
|
||||||
const profile = dashboardLayoutProfile.value
|
const profile = dashboardLayoutProfile.value
|
||||||
saveLocalDashboardConfig(getDashboardGridLayoutStorageKey(profile), layout)
|
const profileConfig = buildDashboardProfileConfig(layout, enabled)
|
||||||
void saveUserDashboardConfig(getDashboardGridLayoutConfigKey(profile), buildRemoteDashboardGridLayout(layout)).catch(
|
|
||||||
error => console.error(error),
|
saveLocalDashboardConfig(getDashboardGridLayoutStorageKey(profile), profileConfig)
|
||||||
)
|
void saveUserDashboardConfig(
|
||||||
|
getDashboardGridLayoutConfigKey(profile),
|
||||||
|
buildRemoteDashboardProfileConfig(profileConfig),
|
||||||
|
).catch(error => console.error(error))
|
||||||
|
}
|
||||||
|
|
||||||
|
// 将当前仪表板布局覆盖配置保存到本地和用户配置。
|
||||||
|
function saveDashboardGridLayout(layout: DashboardGridLayoutConfig) {
|
||||||
|
saveDashboardProfileConfig(layout)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取仪表板组件的默认宽度,优先兼容插件旧版 cols.md / cols.cols 配置。
|
// 获取仪表板组件的默认宽度,优先兼容插件旧版 cols.md / cols.cols 配置。
|
||||||
@@ -585,6 +697,14 @@ function openDashboardSettings() {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 同步已打开的仪表盘设置弹窗,避免设备档位切换后继续显示旧档位的开关副本。
|
||||||
|
function updateDashboardSettingsDialog() {
|
||||||
|
settingsDialogController?.updateProps({
|
||||||
|
enabled: enableConfig.value,
|
||||||
|
items: dashboardConfigs.value,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
// 退出仪表板布局编辑模式;如果刚恢复默认布局,则跳过本次本地持久化。
|
// 退出仪表板布局编辑模式;如果刚恢复默认布局,则跳过本次本地持久化。
|
||||||
function exitDashboardLayoutEditing() {
|
function exitDashboardLayoutEditing() {
|
||||||
if (isDashboardGridLayoutResetPending.value) {
|
if (isDashboardGridLayoutResetPending.value) {
|
||||||
@@ -675,15 +795,6 @@ function toggleDashboardLayoutEditing() {
|
|||||||
// 加载用户监控面板配置,优先使用服务端用户配置以支持跨浏览器同步。
|
// 加载用户监控面板配置,优先使用服务端用户配置以支持跨浏览器同步。
|
||||||
async function loadDashboardConfig() {
|
async function loadDashboardConfig() {
|
||||||
dashboardLayoutProfile.value = resolveDashboardLayoutProfile()
|
dashboardLayoutProfile.value = resolveDashboardLayoutProfile()
|
||||||
// 显示配置
|
|
||||||
const enable = await loadSharedDashboardConfig(
|
|
||||||
DASHBOARD_ENABLE_CONFIG_KEY,
|
|
||||||
DASHBOARD_ENABLE_STORAGE_KEY,
|
|
||||||
normalizeDashboardEnableConfig,
|
|
||||||
)
|
|
||||||
if (enable !== undefined) {
|
|
||||||
enableConfig.value = enable
|
|
||||||
}
|
|
||||||
// 顺序配置
|
// 顺序配置
|
||||||
const order = await loadSharedDashboardConfig(
|
const order = await loadSharedDashboardConfig(
|
||||||
DASHBOARD_ORDER_CONFIG_KEY,
|
DASHBOARD_ORDER_CONFIG_KEY,
|
||||||
@@ -693,10 +804,14 @@ async function loadDashboardConfig() {
|
|||||||
if (order !== undefined) {
|
if (order !== undefined) {
|
||||||
orderConfig.value = order
|
orderConfig.value = order
|
||||||
}
|
}
|
||||||
// Grid 布局覆盖
|
// 设备档位配置同时承载 Grid 布局和显示项,显示项缺失时从旧版全局配置迁移。
|
||||||
const gridLayoutProfile = dashboardLayoutProfile.value
|
const profileConfig = await loadDashboardProfileConfig(dashboardLayoutProfile.value)
|
||||||
const gridLayout = await loadDashboardGridLayoutConfig(gridLayoutProfile)
|
const legacyEnable = profileConfig?.enabled === undefined ? await loadLegacyDashboardEnableConfig() : undefined
|
||||||
dashboardGridLayout.value = gridLayout ?? {}
|
dashboardGridLayout.value = profileConfig?.items ?? {}
|
||||||
|
enableConfig.value = profileConfig?.enabled ?? legacyEnable ?? getDefaultDashboardEnableConfig()
|
||||||
|
if (profileConfig?.enabled === undefined && legacyEnable !== undefined) {
|
||||||
|
saveDashboardProfileConfig()
|
||||||
|
}
|
||||||
// 排序
|
// 排序
|
||||||
if (orderConfig.value) {
|
if (orderConfig.value) {
|
||||||
sortDashboardConfigs()
|
sortDashboardConfigs()
|
||||||
@@ -722,16 +837,13 @@ async function saveDashboardConfig(payload?: { enabled?: Record<string, boolean>
|
|||||||
enableConfig.value = payload.enabled
|
enableConfig.value = payload.enabled
|
||||||
}
|
}
|
||||||
|
|
||||||
// 启用配置
|
|
||||||
saveLocalDashboardConfig(DASHBOARD_ENABLE_STORAGE_KEY, enableConfig.value)
|
|
||||||
|
|
||||||
// 顺序配置,从dashboardConfigs中提取
|
// 顺序配置,从dashboardConfigs中提取
|
||||||
const orderObj = dashboardConfigs.value.map(item => ({ id: item.id, key: item.key }))
|
const orderObj = dashboardConfigs.value.map(item => ({ id: item.id, key: item.key }))
|
||||||
saveLocalDashboardConfig(DASHBOARD_ORDER_STORAGE_KEY, orderObj)
|
saveLocalDashboardConfig(DASHBOARD_ORDER_STORAGE_KEY, orderObj)
|
||||||
|
saveDashboardProfileConfig()
|
||||||
|
|
||||||
// 保存到服务端
|
// 保存到服务端
|
||||||
try {
|
try {
|
||||||
await saveUserDashboardConfig(DASHBOARD_ENABLE_CONFIG_KEY, enableConfig.value)
|
|
||||||
await saveUserDashboardConfig(DASHBOARD_ORDER_CONFIG_KEY, orderObj)
|
await saveUserDashboardConfig(DASHBOARD_ORDER_CONFIG_KEY, orderObj)
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error(error)
|
console.error(error)
|
||||||
@@ -1167,7 +1279,14 @@ watch(
|
|||||||
}
|
}
|
||||||
|
|
||||||
dashboardLayoutProfile.value = nextProfile
|
dashboardLayoutProfile.value = nextProfile
|
||||||
dashboardGridLayout.value = (await loadDashboardGridLayoutConfig(nextProfile)) ?? {}
|
const profileConfig = await loadDashboardProfileConfig(nextProfile)
|
||||||
|
const legacyEnable = profileConfig?.enabled === undefined ? await loadLegacyDashboardEnableConfig() : undefined
|
||||||
|
dashboardGridLayout.value = profileConfig?.items ?? {}
|
||||||
|
enableConfig.value = profileConfig?.enabled ?? legacyEnable ?? getDefaultDashboardEnableConfig()
|
||||||
|
if (profileConfig?.enabled === undefined && legacyEnable !== undefined) {
|
||||||
|
saveDashboardProfileConfig()
|
||||||
|
}
|
||||||
|
updateDashboardSettingsDialog()
|
||||||
dashboardGrid.value?.column(
|
dashboardGrid.value?.column(
|
||||||
getDashboardGridColumnsForProfile(nextProfile),
|
getDashboardGridColumnsForProfile(nextProfile),
|
||||||
getDashboardGridColumnLayout(nextProfile),
|
getDashboardGridColumnLayout(nextProfile),
|
||||||
|
|||||||
+17
-9
@@ -75,11 +75,11 @@ html {
|
|||||||
--app-elevation-#{$level}: #{app-vuetify-elevation($level)};
|
--app-elevation-#{$level}: #{app-vuetify-elevation($level)};
|
||||||
}
|
}
|
||||||
|
|
||||||
--app-theme-surface-radius: var(--app-vuetify-rounded);
|
--app-theme-surface-radius: var(--app-vuetify-rounded-lg);
|
||||||
--app-surface-radius: var(--app-theme-surface-radius);
|
--app-surface-radius: var(--app-theme-surface-radius);
|
||||||
--app-field-radius: var(--app-vuetify-rounded);
|
--app-field-radius: var(--app-vuetify-rounded-lg);
|
||||||
--app-control-radius: var(--app-vuetify-rounded);
|
--app-control-radius: var(--app-vuetify-rounded);
|
||||||
--app-overlay-radius: var(--app-vuetify-rounded);
|
--app-overlay-radius: var(--app-vuetify-rounded-lg);
|
||||||
--app-surface-border-opacity: 0.06;
|
--app-surface-border-opacity: 0.06;
|
||||||
--app-surface-border: 1px solid rgba(var(--v-theme-on-surface), var(--app-surface-border-opacity));
|
--app-surface-border: 1px solid rgba(var(--v-theme-on-surface), var(--app-surface-border-opacity));
|
||||||
--app-card-rest-shadow: var(--app-elevation-0);
|
--app-card-rest-shadow: var(--app-elevation-0);
|
||||||
@@ -102,20 +102,28 @@ html[data-theme-skin='bordered'] {
|
|||||||
--app-surface-border-opacity: 0.1;
|
--app-surface-border-opacity: 0.1;
|
||||||
}
|
}
|
||||||
|
|
||||||
html[data-theme-radius='none'] {
|
// 默认档位保留按钮等 control 的 Vuetify 原始圆角,同时让卡片、列表、弹窗和输入区使用更舒展的大圆角。
|
||||||
--app-theme-surface-radius: var(--app-vuetify-rounded-0);
|
html[data-theme-radius='default'] {
|
||||||
--app-field-radius: var(--app-vuetify-rounded-0);
|
--app-theme-surface-radius: var(--app-vuetify-rounded-lg);
|
||||||
--app-control-radius: var(--app-vuetify-rounded-0);
|
--app-field-radius: var(--app-vuetify-rounded-lg);
|
||||||
--app-overlay-radius: var(--app-vuetify-rounded-0);
|
--app-control-radius: var(--app-vuetify-rounded);
|
||||||
|
--app-overlay-radius: var(--app-vuetify-rounded-lg);
|
||||||
}
|
}
|
||||||
|
|
||||||
html[data-theme-radius='small'] {
|
html[data-theme-radius='none'] {
|
||||||
--app-theme-surface-radius: var(--app-vuetify-rounded-sm);
|
--app-theme-surface-radius: var(--app-vuetify-rounded-sm);
|
||||||
--app-field-radius: var(--app-vuetify-rounded-sm);
|
--app-field-radius: var(--app-vuetify-rounded-sm);
|
||||||
--app-control-radius: var(--app-vuetify-rounded-sm);
|
--app-control-radius: var(--app-vuetify-rounded-sm);
|
||||||
--app-overlay-radius: var(--app-vuetify-rounded-sm);
|
--app-overlay-radius: var(--app-vuetify-rounded-sm);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
html[data-theme-radius='small'] {
|
||||||
|
--app-theme-surface-radius: var(--app-vuetify-rounded);
|
||||||
|
--app-field-radius: var(--app-vuetify-rounded);
|
||||||
|
--app-control-radius: var(--app-vuetify-rounded);
|
||||||
|
--app-overlay-radius: var(--app-vuetify-rounded);
|
||||||
|
}
|
||||||
|
|
||||||
html[data-theme-radius='large'] {
|
html[data-theme-radius='large'] {
|
||||||
--app-theme-surface-radius: var(--app-vuetify-rounded-lg);
|
--app-theme-surface-radius: var(--app-vuetify-rounded-lg);
|
||||||
--app-field-radius: var(--app-vuetify-rounded-lg);
|
--app-field-radius: var(--app-vuetify-rounded-lg);
|
||||||
|
|||||||
Reference in New Issue
Block a user