feat: add skill center navigation and travel request detail view

- Refactor audit to skill center for skill management
- Add TravelRequestDetailView for requests detail page
- Update PersonalWorkbench with enhanced features
- Add UI preview screenshots

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-05-05 22:35:38 +08:00
parent ab9f132192
commit 2d2ed27861
10 changed files with 3870 additions and 591 deletions

View File

@@ -24,7 +24,8 @@
'workbench-main': activeView === 'workbench',
'requests-main': activeView === 'requests',
'approval-main': activeView === 'approval',
'policies-main': activeView === 'policies'
'policies-main': activeView === 'policies',
'audit-main': activeView === 'audit'
}"
>
<TopBar
@@ -43,7 +44,7 @@
/>
<FilterBar
v-if="activeView !== 'chat' && activeView !== 'overview' && activeView !== 'workbench' && activeView !== 'requests' && activeView !== 'approval' && activeView !== 'policies'"
v-if="activeView !== 'chat' && activeView !== 'overview' && activeView !== 'workbench' && activeView !== 'requests' && activeView !== 'approval' && activeView !== 'policies' && activeView !== 'audit'"
:compact="activeView === 'overview'"
:filters="filters"
:ranges="ranges"
@@ -57,7 +58,8 @@
'chat-workarea': activeView === 'chat',
'requests-workarea': activeView === 'requests',
'approval-workarea': activeView === 'approval',
'policies-workarea': activeView === 'policies'
'policies-workarea': activeView === 'policies',
'audit-workarea': activeView === 'audit'
}"
>
<OverviewView
@@ -96,15 +98,16 @@
@reject-case="toast(`${activeCase?.id} 已转人工复核`)"
/>
<TravelReimbursementCreateView
<TravelRequestDetailView
v-else-if="activeView === 'requests' && detailMode"
@back-to-requests="detailMode = false"
:request="selectedTravelRequest"
@back-to-requests="closeRequestDetail"
/>
<RequestsView
v-else-if="activeView === 'requests'"
:filtered-requests="filteredRequests"
@ask="detailMode = true"
@ask="openRequestDetail"
@approve="handleApprove"
@reject="handleReject"
@create-request="openTravelCreate"
@@ -135,6 +138,7 @@ import OverviewView from './views/OverviewView.vue'
import PersonalWorkbenchView from './views/PersonalWorkbenchView.vue'
import ChatView from './views/ChatView.vue'
import TravelReimbursementCreateView from './views/TravelReimbursementCreateView.vue'
import TravelRequestDetailView from './views/TravelRequestDetailView.vue'
import RequestsView from './views/RequestsView.vue'
import ApprovalCenterView from './views/ApprovalCenterView.vue'
import PoliciesView from './views/PoliciesView.vue'
@@ -150,6 +154,7 @@ import { documents } from './data/requests.js'
const loggedIn = ref(false)
const travelCreateMode = ref(false)
const detailMode = ref(false)
const selectedTravelRequest = ref(null)
function handleLogin(credentials) {
if (credentials.username && credentials.password) {
@@ -205,6 +210,7 @@ function handleReject(request) {
function handleNavigate(view) {
travelCreateMode.value = false
detailMode.value = false
selectedTravelRequest.value = null
setView(view)
}
@@ -215,6 +221,8 @@ function handleOpenChat(request) {
function openTravelCreate() {
travelCreateMode.value = true
detailMode.value = false
selectedTravelRequest.value = null
activeView.value = 'chat'
}
@@ -222,6 +230,17 @@ function backToRequests() {
travelCreateMode.value = false
activeView.value = 'requests'
}
function openRequestDetail(request) {
selectedTravelRequest.value = request
detailMode.value = true
activeView.value = 'requests'
}
function closeRequestDetail() {
detailMode.value = false
selectedTravelRequest.value = null
}
</script>
<style scoped>
@@ -245,7 +264,8 @@ function backToRequests() {
}
.main.requests-main,
.main.approval-main,
.main.policies-main {
.main.policies-main,
.main.audit-main {
height: 100dvh;
grid-template-rows: auto minmax(0, 1fr);
overflow: hidden;
@@ -257,7 +277,8 @@ function backToRequests() {
}
.workarea.requests-workarea,
.workarea.approval-workarea,
.workarea.policies-workarea {
.workarea.policies-workarea,
.workarea.audit-workarea {
min-height: 0;
overflow: hidden;
padding: 20px 24px;