Workbench.vue 3.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. <script setup lang="ts">
  2. /**
  3. * 工作台(P11):页签容器。页签清单与重构前 `app.js` 的 `TABS` **完全一致**(9 个)。
  4. *
  5. * 已迁移:overview(总览)。其余页签先如实标"迁移中",不做假界面 ——
  6. * 用户令要求"逐页签迁移、对拍通过再删 Python 源码",所以未迁移的页签必须一眼可见。
  7. */
  8. import { computed } from 'vue'
  9. import { t } from '../i18n/zh'
  10. import { DONE, TABS } from '../lib/tabs'
  11. import { winName } from '../lib/render'
  12. import Component from './Component.vue'
  13. import Energy from './Energy.vue'
  14. import Fault from './Fault.vue'
  15. import Vibration from './Vibration.vue'
  16. import Generation from './Generation.vue'
  17. import Decision from './Decision.vue'
  18. import Assistant from './Assistant.vue'
  19. import System from './System.vue'
  20. import Overview from './Overview.vue'
  21. const props = defineProps<{ d: any; tab: string; sys?: string | null; sub?: string | null; cms?: any; curves?: any; apis?: any }>()
  22. const emit = defineEmits<{ (e: 'tab', id: string): void; (e: 'sub', id: string): void }>()
  23. const pending = computed(() => !DONE.includes(props.tab))
  24. </script>
  25. <template>
  26. <nav class="wb-tabs">
  27. <button v-for="id in TABS" :key="id" :class="{ on: id === tab }" @click="emit('tab', id)">
  28. {{ t('tab.' + id) }}<sup v-if="!DONE.includes(id)" class="todo">迁移中</sup>
  29. </button>
  30. </nav>
  31. <div class="page-head">
  32. <h1>{{ t('tab.' + tab) }}</h1>
  33. <!-- 与旧 app.js:1066 逐字一致:`${t('win.label')} · ${winName(WIN)}`(对拍实逮:写成 win.l 第 1 项就错位) -->
  34. <span class="window-badge">{{ t('win.label') }} · {{ winName(d?.win) }}</span>
  35. </div>
  36. <Overview v-if="tab === 'overview'" :d="d" />
  37. <Energy v-else-if="tab === 'energy'" :d="d" />
  38. <Component v-else-if="tab === 'component'" :d="d" :sys="sys" />
  39. <Fault v-else-if="tab === 'fault'" :d="d" />
  40. <Vibration v-else-if="tab === 'vibration'" :d="d" :sub="sub" :cms="cms" @sub="emit('sub', $event)" />
  41. <Generation v-else-if="tab === 'generation'" :d="d" :curves="curves" :pending="!!d.m9_pending" />
  42. <Decision v-else-if="tab === 'decision'" :d="d" :apis="apis" />
  43. <Assistant v-else-if="tab === 'assistant'" :d="d" />
  44. <System v-else-if="tab === 'system'" :apis="apis" />
  45. <section v-else-if="pending" class="card">
  46. <h2>{{ t('tab.' + tab) }} <small>(本页签尚未迁移到 Vue)</small></h2>
  47. <p class="hint">
  48. 迁移纪律:页签逐个搬,每搬一个就用 <code>tools/render_parity.mjs</code> 与重构前页面
  49. (现网 <code>/detail/v2</code>)对拍文案/数值/类名序列,**通过后**才删对应的 Python 前端源码。
  50. 当前已迁移:{{ DONE.join('、') }}。
  51. </p>
  52. </section>
  53. </template>
  54. <style scoped>
  55. .wb-tabs { display: flex; flex-wrap: wrap; gap: 6px; padding: 10px 18px 0; }
  56. .wb-tabs button {
  57. padding: 6px 12px; border: 1px solid var(--line); background: #fff; border-radius: 4px 4px 0 0;
  58. cursor: pointer; color: var(--ink);
  59. }
  60. .wb-tabs button.on { background: var(--brand); border-color: var(--brand); color: #fff; }
  61. .todo { font-size: 10px; color: var(--muted); margin-left: 2px; }
  62. .wb-tabs button.on .todo { color: #ffe9a8; }
  63. .page-head { display: flex; align-items: baseline; gap: 12px; padding: 10px 18px 0; }
  64. .page-head h1 { font-size: 18px; margin: 0; }
  65. .window-badge { color: var(--muted); font-size: 12.5px; }
  66. </style>