feat(projects): 工作台小组件设计
This commit is contained in:
@@ -1,10 +1,8 @@
|
||||
<script setup lang="ts">
|
||||
import { computed, onBeforeUnmount, onMounted, ref, watch } from 'vue';
|
||||
import { onBeforeUnmount, onMounted, provide, ref, watch } from 'vue';
|
||||
import { onBeforeRouteLeave } from 'vue-router';
|
||||
import { ElMessageBox } from 'element-plus';
|
||||
import { useWorkbenchStore } from '@/store/modules/workbench';
|
||||
import { buildWorkbenchBannerSummary } from './homepage';
|
||||
import { workbenchBannerSummaryMock } from './mock';
|
||||
import {
|
||||
type WorkbenchColumnId,
|
||||
type WorkbenchModuleKey,
|
||||
@@ -16,28 +14,14 @@ import WorkbenchEditOverlay from './modules/workbench-edit-overlay.vue';
|
||||
import WorkbenchModuleLibrary from './modules/workbench-module-library.vue';
|
||||
// 保留 6 个 + 重构 2 个(key 沿用)
|
||||
import WorkbenchTodoPanel from './modules/workbench-todo-panel.vue';
|
||||
import WorkbenchMyTask from './modules/workbench-my-task.vue';
|
||||
import WorkbenchMyRequirement from './modules/workbench-my-requirement.vue';
|
||||
import WorkbenchProjectGrid from './modules/workbench-project-grid.vue';
|
||||
import WorkbenchShortcut from './modules/workbench-shortcut.vue';
|
||||
import WorkbenchProjectHealth from './modules/workbench-project-health.vue';
|
||||
import WorkbenchTeamTodo from './modules/workbench-team-todo.vue';
|
||||
import WorkbenchFavorite from './modules/workbench-favorite.vue';
|
||||
// 新增 15 个(蓝图 2026-05-22,原 A3 myTicket 已废弃)
|
||||
import WorkbenchMentions from './modules/workbench-mentions.vue';
|
||||
import WorkbenchApproval from './modules/workbench-approval.vue';
|
||||
import WorkbenchWorklogReminder from './modules/workbench-worklog-reminder.vue';
|
||||
// 新增 10 个(蓝图 2026-05-22,原 A3 myTicket、A4 mentions、A5 approval、A6 worklogReminder、B10 personalItem、F23 projectSnapshot 已废弃)
|
||||
import WorkbenchMyExecution from './modules/workbench-my-execution.vue';
|
||||
import WorkbenchPersonalItem from './modules/workbench-personal-item.vue';
|
||||
import WorkbenchProjectSnapshot from './modules/workbench-project-snapshot.vue';
|
||||
import WorkbenchProductSnapshot from './modules/workbench-product-snapshot.vue';
|
||||
import WorkbenchTeamWorklog from './modules/workbench-team-worklog.vue';
|
||||
import WorkbenchTeamLoad from './modules/workbench-team-load.vue';
|
||||
import WorkbenchRiskAlert from './modules/workbench-risk-alert.vue';
|
||||
import WorkbenchMyWeekWorklog from './modules/workbench-my-week-worklog.vue';
|
||||
import WorkbenchMyCompletionRate from './modules/workbench-my-completion-rate.vue';
|
||||
import WorkbenchTicketSla from './modules/workbench-ticket-sla.vue';
|
||||
import WorkbenchRecentVisit from './modules/workbench-recent-visit.vue';
|
||||
import WorkbenchNoticeNotification from './modules/workbench-notice-notification.vue';
|
||||
|
||||
defineOptions({ name: 'Workbench' });
|
||||
@@ -45,33 +29,22 @@ defineOptions({ name: 'Workbench' });
|
||||
const { registerModuleComponent } = useWorkbenchModules();
|
||||
// 保留 6 个 + 重构 2 个
|
||||
registerModuleComponent('myTodo', WorkbenchTodoPanel);
|
||||
registerModuleComponent('myTask', WorkbenchMyTask);
|
||||
registerModuleComponent('myRequirement', WorkbenchMyRequirement);
|
||||
registerModuleComponent('myProject', WorkbenchProjectGrid);
|
||||
registerModuleComponent('shortcut', WorkbenchShortcut);
|
||||
registerModuleComponent('projectHealth', WorkbenchProjectHealth);
|
||||
registerModuleComponent('teamTodo', WorkbenchTeamTodo);
|
||||
registerModuleComponent('favorite', WorkbenchFavorite);
|
||||
// 新增 15 个
|
||||
registerModuleComponent('mentions', WorkbenchMentions);
|
||||
registerModuleComponent('approval', WorkbenchApproval);
|
||||
registerModuleComponent('worklogReminder', WorkbenchWorklogReminder);
|
||||
// 新增 10 个
|
||||
registerModuleComponent('myExecution', WorkbenchMyExecution);
|
||||
registerModuleComponent('personalItem', WorkbenchPersonalItem);
|
||||
registerModuleComponent('projectSnapshot', WorkbenchProjectSnapshot);
|
||||
registerModuleComponent('productSnapshot', WorkbenchProductSnapshot);
|
||||
registerModuleComponent('teamWorklog', WorkbenchTeamWorklog);
|
||||
registerModuleComponent('teamLoad', WorkbenchTeamLoad);
|
||||
registerModuleComponent('riskAlert', WorkbenchRiskAlert);
|
||||
registerModuleComponent('myWeekWorklog', WorkbenchMyWeekWorklog);
|
||||
registerModuleComponent('myCompletionRate', WorkbenchMyCompletionRate);
|
||||
registerModuleComponent('ticketSla', WorkbenchTicketSla);
|
||||
registerModuleComponent('recentVisit', WorkbenchRecentVisit);
|
||||
registerModuleComponent('noticeNotification', WorkbenchNoticeNotification);
|
||||
|
||||
const workbench = useWorkbenchStore();
|
||||
const libraryOpen = ref(false);
|
||||
|
||||
// 暴露给 workbench-module-card 内的"编辑布局"按钮,避免每个 widget 都透传 emit
|
||||
provide('workbenchEnterEditing', () => workbench.enterEditing());
|
||||
|
||||
onMounted(() => {
|
||||
workbench.load();
|
||||
});
|
||||
@@ -92,8 +65,6 @@ watch(
|
||||
}
|
||||
);
|
||||
|
||||
const bannerSummary = computed(() => buildWorkbenchBannerSummary(workbenchBannerSummaryMock));
|
||||
|
||||
function onColumnUpdate(columnId: WorkbenchColumnId, modules: WorkbenchModuleKey[]) {
|
||||
workbench.setColumnModules(columnId, modules);
|
||||
}
|
||||
@@ -124,18 +95,7 @@ onBeforeRouteLeave(async (_to, _from, next) => {
|
||||
|
||||
<template>
|
||||
<div class="workbench">
|
||||
<WorkbenchBanner :summary="bannerSummary" />
|
||||
|
||||
<div class="workbench__toolbar">
|
||||
<ElButton v-if="workbench.mode === 'normal'" type="primary" link @click="workbench.enterEditing">
|
||||
<SvgIcon icon="mdi:pencil-outline" />
|
||||
自定义布局
|
||||
</ElButton>
|
||||
<ElButton v-else type="primary" link @click="libraryOpen = true">
|
||||
<SvgIcon icon="mdi:view-grid-plus-outline" />
|
||||
模块库
|
||||
</ElButton>
|
||||
</div>
|
||||
<WorkbenchBanner />
|
||||
|
||||
<WorkbenchEditOverlay
|
||||
v-if="workbench.mode === 'editing'"
|
||||
@@ -144,6 +104,7 @@ onBeforeRouteLeave(async (_to, _from, next) => {
|
||||
@save="workbench.saveEditing"
|
||||
@cancel="workbench.cancelEditing"
|
||||
@reset="handleReset"
|
||||
@open-library="libraryOpen = true"
|
||||
/>
|
||||
|
||||
<ElEmpty v-if="workbench.layout.columns.every(c => c.modules.length === 0)" description="还没有可见模块">
|
||||
@@ -183,10 +144,6 @@ onBeforeRouteLeave(async (_to, _from, next) => {
|
||||
flex-direction: column;
|
||||
gap: 16px;
|
||||
}
|
||||
.workbench__toolbar {
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
}
|
||||
.workbench__main {
|
||||
display: grid;
|
||||
grid-template-columns: minmax(0, 1.35fr) minmax(0, 1fr);
|
||||
|
||||
Reference in New Issue
Block a user