CaseFlowTopBar.vue 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. <template>
  2. <AppTopBar class="case-flow-topbar" :case-name="caseName">
  3. <template #actions>
  4. <!-- 模板库:与主界面顶栏一致,点开就地弹出,不打断当前上传 / 清洗流程 -->
  5. <Tooltip title="模板库" placement="bottom" :mouseEnterDelay="0.5">
  6. <Button type="text" class="case-flow-topbar-action" aria-label="模板库" @click="templateLibraryVisible = true">
  7. <Icon icon="i-ant-design:book-outlined" />
  8. </Button>
  9. </Tooltip>
  10. <!-- 下载管理:下载记录、保存位置与清空 / 刷新等操作,按主界面顶栏同款入口提供 -->
  11. <AppDownloadManager />
  12. </template>
  13. </AppTopBar>
  14. <CaseTemplateLibraryModal v-model:open="templateLibraryVisible" />
  15. </template>
  16. <script lang="ts" setup name="CaseFlowTopBar">
  17. /**
  18. * 清洗流程三段(文件上传 / 案件数据清洗 / 清洗导入进度)共用的顶栏。
  19. *
  20. * 这三页是不套 LAYOUT 的全屏路由,公共顶栏只能由页面自己渲染;
  21. * 除品牌、案件、模式切换、账号与窗口控制外,这里补齐主界面顶栏的
  22. * 「模板库」和「下载管理」两个入口,避免进入清洗流程后功能断档。
  23. */
  24. import { computed, ref } from 'vue';
  25. import { Button, Tooltip } from 'ant-design-vue';
  26. import { AppDownloadManager, AppTopBar } from '@/core/components/Application';
  27. import { Icon } from '@/core/components/Icon';
  28. import { useUserStore } from '@/core/store/modules/case';
  29. import CaseTemplateLibraryModal from './CaseTemplateLibraryModal.vue';
  30. const userStore = useUserStore();
  31. const templateLibraryVisible = ref(false);
  32. /** 顶栏案件胶囊:全屏流程里也保留当前案件上下文 */
  33. const caseName = computed(() => String(userStore.getCaseInfo?.name || '').trim());
  34. </script>
  35. <style lang="less">
  36. .case-flow-topbar {
  37. /*
  38. * 顶栏图标按钮:与主壳顶栏同规格(30×28,圆角 8)。
  39. * 主壳那份规则在 layouts/default/header/index.less,独立全屏路由下不会加载,
  40. * 这里自带一份,只作用于本组件,不影响传统壳原有外观。
  41. */
  42. .case-flow-topbar-action.ant-btn,
  43. .jeesite-app-download-manager-trigger {
  44. display: inline-flex;
  45. align-items: center;
  46. justify-content: center;
  47. width: 30px;
  48. min-width: 30px;
  49. height: 28px;
  50. padding: 0;
  51. color: inherit;
  52. background: transparent;
  53. border: 1px solid transparent;
  54. border-radius: 8px;
  55. box-shadow: none;
  56. cursor: pointer;
  57. transition:
  58. background-color 0.2s ease,
  59. color 0.2s ease;
  60. .jeesite-icon,
  61. .anticon {
  62. font-size: 18px;
  63. }
  64. &:hover,
  65. &:focus,
  66. &:focus-visible {
  67. color: inherit;
  68. background-color: @header-light-bg-hover-color;
  69. border-color: transparent;
  70. outline: none;
  71. box-shadow: none;
  72. }
  73. }
  74. }
  75. html[data-theme='dark'] {
  76. .case-flow-topbar {
  77. .case-flow-topbar-action.ant-btn,
  78. .jeesite-app-download-manager-trigger {
  79. &:hover,
  80. &:focus,
  81. &:focus-visible {
  82. background-color: @header-dark-bg-hover-color;
  83. }
  84. }
  85. }
  86. }
  87. </style>