feat(web): 优化差旅详情、风险建议卡片与文档中心交互

- 拆分阶段风险建议卡片样式到独立文件
- 完善差旅申请审批对话框与详情视图交互
- 调整文档中心列表共享样式与状态筛选
- 同步应用外壳、视图初始化与系统状态 composables
This commit is contained in:
caoxiaozhu
2026-06-17 14:39:12 +08:00
parent a3e5295915
commit 0fac8b615f
19 changed files with 1415 additions and 558 deletions

View File

@@ -31,16 +31,27 @@
class="shared-confirm-btn cancel"
:disabled="busy"
@click="handleCancel"
>
{{ cancelText }}
</button>
<button
type="button"
class="shared-confirm-btn confirm"
:class="confirmTone"
:disabled="busy"
@click="$emit('confirm')"
>
>
{{ cancelText }}
</button>
<button
v-if="secondaryText"
type="button"
class="shared-confirm-btn secondary"
:class="secondaryTone"
:disabled="busy"
@click="$emit('secondary')"
>
<i v-if="secondaryIcon" :class="secondaryIcon"></i>
<span>{{ secondaryText }}</span>
</button>
<button
type="button"
class="shared-confirm-btn confirm"
:class="confirmTone"
:disabled="busy || confirmDisabled"
@click="$emit('confirm')"
>
<i v-if="confirmIcon" :class="busy ? 'mdi mdi-loading mdi-spin' : confirmIcon"></i>
<span>{{ busy ? busyText : confirmText }}</span>
</button>
@@ -60,18 +71,22 @@ const props = defineProps({
badgeTone: { type: String, default: 'info' },
title: { type: String, required: true },
description: { type: String, default: '' },
cancelText: { type: String, default: '取消' },
confirmText: { type: String, default: '确认' },
cancelText: { type: String, default: '取消' },
secondaryText: { type: String, default: '' },
secondaryTone: { type: String, default: 'warning' },
secondaryIcon: { type: String, default: '' },
confirmText: { type: String, default: '确认' },
busyText: { type: String, default: '处理中...' },
confirmTone: { type: String, default: 'primary' },
confirmIcon: { type: String, default: '' },
confirmDisabled: { type: Boolean, default: false },
busy: { type: Boolean, default: false },
closeOnMask: { type: Boolean, default: true },
size: { type: String, default: 'default' },
actionsAlign: { type: String, default: 'end' }
})
const emit = defineEmits(['close', 'cancel', 'confirm'])
const emit = defineEmits(['close', 'cancel', 'secondary', 'confirm'])
const instance = getCurrentInstance()
const titleId = computed(() => `shared-confirm-title-${instance?.uid || 'dialog'}`)
@@ -213,15 +228,33 @@ function handleCancel() {
transition: transform 160ms ease, box-shadow 160ms ease, border-color 160ms ease, background 160ms ease;
}
.shared-confirm-btn.cancel {
border: 1px solid #d7e0ea;
background: rgba(255, 255, 255, 0.92);
color: #475569;
}
.shared-confirm-btn.confirm {
border: 1px solid transparent;
color: #fff;
.shared-confirm-btn.cancel {
border: 1px solid #d7e0ea;
background: rgba(255, 255, 255, 0.92);
color: #475569;
}
.shared-confirm-btn.secondary {
border: 1px solid rgba(245, 158, 11, 0.28);
background: rgba(255, 251, 235, 0.92);
color: #b45309;
}
.shared-confirm-btn.secondary.primary {
border-color: rgba(var(--theme-primary-rgb, 58, 124, 165), 0.28);
background: var(--theme-primary-soft);
color: var(--theme-primary-active);
}
.shared-confirm-btn.secondary.danger {
border-color: rgba(var(--danger-rgb), 0.24);
background: var(--danger-soft);
color: var(--danger-hover);
}
.shared-confirm-btn.confirm {
border: 1px solid transparent;
color: #fff;
}
.shared-confirm-btn.confirm.primary {
@@ -238,10 +271,15 @@ function handleCancel() {
border-color: rgba(var(--theme-primary-rgb, 58, 124, 165), 0.3);
color: var(--theme-primary-active);
}
.shared-confirm-btn.confirm:hover:not(:disabled) {
transform: translateY(-1px);
}
.shared-confirm-btn.secondary:hover:not(:disabled) {
border-color: rgba(245, 158, 11, 0.42);
background: rgba(254, 243, 199, 0.96);
}
.shared-confirm-btn.confirm:hover:not(:disabled) {
transform: translateY(-1px);
}
.shared-confirm-btn:disabled {
cursor: not-allowed;