panelCatalog.js 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. /**
  2. * 驾驶舱一级模式与二级面板目录。
  3. *
  4. * 稳定英文键是唯一状态标识;中文只用于展示(见 ADR 0003 与 CONTEXT.md)。
  5. * 本文件是纯逻辑,不引用 Vue、DOM 或任何接口字段,便于直接单测。
  6. */
  7. /** 一级模式英文键。 */
  8. export const MODES = ['overview', 'infrastructure', 'monitoring', 'warningResponse']
  9. /** 一级模式展示名。 */
  10. export const MODE_LABELS = {
  11. overview: '总体概览',
  12. infrastructure: '基础设施',
  13. monitoring: '运行监测',
  14. warningResponse: '预警处置',
  15. }
  16. /** 二级面板展示名,按 panelId 解析;业务逻辑不读中文。 */
  17. export const PANEL_LABELS = {
  18. situationSummary: '态势总览',
  19. infrastructureSummary: '基础设施',
  20. monitoringSummary: '运行监测',
  21. alertSettings: '预警设置',
  22. archive: '基础档案',
  23. operation: '运行信息',
  24. management: '管理信息',
  25. emergency: '应急保障',
  26. monitoringOverview: '监测概览',
  27. monitoringDistribution: '监测分布',
  28. operationOverview: '运行概况',
  29. monitoringPointLedger: '监测点台账',
  30. currentEvents: '当前预警',
  31. historyAnalysis: '历史分析',
  32. responseEfficiency: '预警效率',
  33. eventAnalysis: '预警分析',
  34. }
  35. /**
  36. * 模式 → 左右两栏面板,顺序固定(ADR 0003)。
  37. * panelId 扁平且全局唯一,不带模式前缀。
  38. */
  39. const COLUMNS = {
  40. overview: {
  41. left: ['situationSummary', 'infrastructureSummary'],
  42. right: ['monitoringSummary', 'alertSettings'],
  43. },
  44. infrastructure: {
  45. left: ['archive', 'operation'],
  46. right: ['management', 'emergency'],
  47. },
  48. monitoring: {
  49. left: ['monitoringOverview', 'monitoringDistribution'],
  50. right: ['operationOverview', 'monitoringPointLedger'],
  51. },
  52. warningResponse: {
  53. left: ['currentEvents', 'historyAnalysis'],
  54. right: ['responseEfficiency', 'eventAnalysis'],
  55. },
  56. }
  57. /**
  58. * 二级面板图标(`CockpitIcon` 的语义名,按 panelId 映射)。
  59. *
  60. * 批次 1 第三轮:图标全部换为维护者指定的 Texture/Icon 目录 I/Pipe/Q 系列切图
  61. * (I=次要、Pipe=主要、Q=补充),经**去色 + 项目主蓝 #01abea(--cyan)染色**统一风格,
  62. * 生成件在 `public/cockpit/assets/icons/panel/`(manifest key `icon.panel.*`)。
  63. * **纯视觉**:不参与面板标识、排序与断言,走查认面板仍只认 `data-panel-id`。
  64. *
  65. * 未列出的 panelId 返回空串 → 渲染层不画图标,不抛错(与 `iconFor` 的未知名行为一致)。
  66. */
  67. export const PANEL_ICONS = {
  68. situationSummary: 'panelSituation',
  69. infrastructureSummary: 'panelSituation',
  70. monitoringSummary: 'panelMonitoring',
  71. alertSettings: 'panelAlert',
  72. archive: 'panelArchive',
  73. operation: 'panelMonitoring',
  74. management: 'panelArchive',
  75. emergency: 'panelEmergency',
  76. monitoringOverview: 'panelMonitoring',
  77. monitoringDistribution: 'panelDistribution',
  78. operationOverview: 'panelMonitoring',
  79. monitoringPointLedger: 'panelLedger',
  80. currentEvents: 'panelCurrent',
  81. historyAnalysis: 'panelHistory',
  82. responseEfficiency: 'panelEfficiency',
  83. eventAnalysis: 'panelAnalysis',
  84. }
  85. export function isKnownMode(mode) {
  86. return MODES.includes(mode)
  87. }
  88. export function isKnownPanel(panelId) {
  89. return Object.prototype.hasOwnProperty.call(PANEL_LABELS, panelId)
  90. }
  91. export function modeLabel(mode) {
  92. return MODE_LABELS[mode] || mode
  93. }
  94. export function labelForPanel(panelId) {
  95. return PANEL_LABELS[panelId] || panelId
  96. }
  97. /** 面板图标语义名;无对应图标时返回空串(渲染层据此不画图标)。 */
  98. export function panelIcon(panelId) {
  99. return PANEL_ICONS[panelId] || ''
  100. }
  101. /** 返回模式的左右两栏面板;未知模式直接报错,避免静默渲染空壳。 */
  102. export function columnsForMode(mode) {
  103. const columns = COLUMNS[mode]
  104. if (!columns) {
  105. throw new Error(`未知一级模式: ${mode}`)
  106. }
  107. return { left: [...columns.left], right: [...columns.right] }
  108. }
  109. /** 返回模式的全部面板,左栏在前。 */
  110. export function panelsForMode(mode) {
  111. const { left, right } = columnsForMode(mode)
  112. return [...left, ...right]
  113. }
  114. /** 进入模式时的默认展开集合:全部面板展开。 */
  115. export function defaultExpandedPanelIds(mode) {
  116. return panelsForMode(mode)
  117. }
  118. /**
  119. * 收起或展开单个面板,返回新集合(不改原数组)。
  120. * 纯函数,store 只做薄封装,便于脱离 Vue 单测。
  121. */
  122. export function toggleExpanded(expandedPanelIds, panelId) {
  123. return expandedPanelIds.includes(panelId)
  124. ? expandedPanelIds.filter((id) => id !== panelId)
  125. : [...expandedPanelIds, panelId]
  126. }