from cli.tui.copy.fragments import ( ACTION_HINT_COPY, BROWSER_ACTION_PANEL_COPY, BROWSER_EMPTY_RECORD_COPY, BROWSER_LOADING_COPY, DASHBOARD_HERO_COPY, DETAIL_EMPTY_SECTION_COPY, GENERAL_COPY, METRIC_COPY, SIGNAL_RAIL_COPY, STATE_SECTION_TITLES, STATE_SUGGESTIONS, STATUS_PANEL_COPY, WORKSPACE_EMPTY_TEXTS, WORKSPACE_LABELS, WORKSPACE_TITLES, ) class TuiWorkspaceCopyMixin: """ TUI 工作区与状态文案混入。 """ @staticmethod def build_workspace_label(label_key: str) -> str: """ 根据工作台标签标识构建文案。 :param label_key: 标签标识 :return: 标签文案 """ normalized_key = str(label_key).strip().lower() return WORKSPACE_LABELS.get(normalized_key, normalized_key) @staticmethod def build_workspace_title(title_key: str) -> str: """ 根据工作台标题标识构建文案。 :param title_key: 标题标识 :return: 标题文案 """ normalized_key = str(title_key).strip().lower() return WORKSPACE_TITLES.get(normalized_key, normalized_key) @staticmethod def build_workspace_empty_text(text_key: str) -> str: """ 根据工作台空态标识构建文案。 :param text_key: 空态标识 :return: 空态文案 """ normalized_key = str(text_key).strip().lower() return WORKSPACE_EMPTY_TEXTS.get(normalized_key, normalized_key) @staticmethod def build_status_panel_empty_text() -> str: """ 构建状态面板空态提示文案。 :return: 空态提示文案 """ return STATUS_PANEL_COPY['empty'] @staticmethod def build_signal_rail_empty_text() -> str: """ 构建信号带空态提示文案。 :return: 空态提示文案 """ return SIGNAL_RAIL_COPY['empty'] @staticmethod def build_more_detail_hint() -> str: """ 构建查看更多提示文案。 :return: 提示文案 """ return GENERAL_COPY['more_detail_hint'] @staticmethod def build_empty_state_suggestion() -> str: """ 构建通用空态建议文案。 :return: 建议文案 """ return STATE_SUGGESTIONS['empty'] @staticmethod def build_loading_state_suggestion() -> str: """ 构建通用加载态建议文案。 :return: 建议文案 """ return STATE_SUGGESTIONS['loading'] @staticmethod def build_failure_state_suggestion() -> str: """ 构建通用失败态建议文案。 :return: 建议文案 """ return STATE_SUGGESTIONS['failure'] @staticmethod def build_dashboard_failure_suggestion() -> str: """ 构建首页失败态建议文案。 :return: 建议文案 """ return STATE_SUGGESTIONS['dashboard_failure'] @staticmethod def build_dashboard_empty_suggestion() -> str: """ 构建首页空态建议文案。 :return: 建议文案 """ return STATE_SUGGESTIONS['dashboard_empty'] @staticmethod def build_state_section_title(title_key: str) -> str: """ 根据状态区块标识构建标题文案。 :param title_key: 区块标识 :return: 标题文案 """ normalized_key = str(title_key).strip().lower() return STATE_SECTION_TITLES.get(normalized_key, normalized_key) @staticmethod def build_dashboard_hero_title() -> str: """ 构建首页 Hero 标题文案。 :return: 标题文案 """ return DASHBOARD_HERO_COPY['title'] @staticmethod def build_dashboard_hero_subtitle() -> str: """ 构建首页 Hero 副标题文案。 :return: 副标题文案 """ return DASHBOARD_HERO_COPY['subtitle'] @staticmethod def build_browser_empty_record_copy(field_key: str) -> str: """ 根据字段标识构建浏览页空记录文案。 :param field_key: 字段标识 :return: 文案 """ normalized_key = str(field_key).strip().lower() return BROWSER_EMPTY_RECORD_COPY.get(normalized_key, normalized_key) @staticmethod def build_browser_loading_copy(field_key: str) -> str: """ 根据字段标识构建浏览页加载占位文案。 :param field_key: 字段标识 :return: 文案 """ normalized_key = str(field_key).strip().lower() return BROWSER_LOADING_COPY.get(normalized_key, normalized_key) @staticmethod def build_detail_empty_section_copy(field_key: str) -> str: """ 根据字段标识构建详情页空态文案。 :param field_key: 字段标识 :return: 文案 """ normalized_key = str(field_key).strip().lower() return DETAIL_EMPTY_SECTION_COPY.get(normalized_key, normalized_key) @staticmethod def build_refresh_page_suggestion(page_name: str, detail: str) -> str: """ 构建详情页场景下的统一建议操作文案。 :param page_name: 页面名称 :param detail: 后续动作描述 :return: 建议文案 """ return f'可按 [R] 刷新,或进入{page_name}页面{detail}' @staticmethod def build_dashboard_page_suggestion(page_name: str, detail: str) -> str: """ 构建首页总览面板场景下的统一建议操作文案。 :param page_name: 页面名称 :param detail: 后续动作描述 :return: 建议文案 """ return f'按 [R] 刷新,或进入{page_name}页面{detail}' @staticmethod def build_unavailable_record_title(resource_name: str) -> str: """ 构建浏览页失败兜底记录标题。 :param resource_name: 资源名称 :return: 标题文本 """ return f'{resource_name}数据暂不可用' @staticmethod def build_load_failure_section_title(resource_name: str) -> str: """ 构建浏览页失败兜底分区标题。 :param resource_name: 资源名称 :return: 分区标题 """ return f'{resource_name}加载失败' @staticmethod def build_empty_record_title(resource_name: str) -> str: """ 构建浏览页空记录标题。 :param resource_name: 资源名称 :return: 标题文本 """ return f'暂无{resource_name}' @staticmethod def build_unavailable_subtitle(resource_name: str, message: str) -> str: """ 构建浏览页数据不可用副标题。 :param resource_name: 资源名称 :param message: 错误摘要 :return: 副标题文本 """ return f'{resource_name}数据不可用:{message}' @staticmethod def build_empty_record_summary(detail: str) -> str: """ 构建浏览页空记录摘要。 :param detail: 摘要说明 :return: 摘要文本 """ return detail @staticmethod def build_loaded_collection_subtitle(count: int, unit: str, detail: str) -> str: """ 构建浏览页“已加载”副标题。 :param count: 数量 :param unit: 单位 :param detail: 补充说明 :return: 副标题文本 """ return f'已加载 {count} {unit},{detail}' @staticmethod def build_summary_with_message(summary: str, message: str) -> str: """ 构建带结果摘要补充的副标题。 :param summary: 主摘要 :param message: 结果消息 :return: 副标题文本 """ return f'{summary} | {message}' @staticmethod def build_count_detail_subtitle(prefix: str, count: int, unit: str, suffix: str) -> str: """ 构建带数量的详情页副标题。 :param prefix: 前缀文本 :param count: 数量 :param unit: 数量单位 :param suffix: 后缀文本 :return: 副标题文本 """ return f'{prefix} {count} {unit}{suffix}' @staticmethod def build_value_detail_subtitle(prefix: str, value: str, suffix: str) -> str: """ 构建带单值信息的详情页副标题。 :param prefix: 前缀文本 :param value: 值文本 :param suffix: 后缀文本 :return: 副标题文本 """ return f'{prefix} {value}{suffix}' @staticmethod def build_workspace_hero_lines( *, view_label: str, title: str, subtitle: str, env: str, summary: str, refreshed_at: str, shortcut_hint: str, ) -> list[str]: """ 构建工作区顶部摘要文本行。 :param view_label: 当前页面显示名称 :param title: 页面标题 :param subtitle: 页面副标题 :param env: 当前环境 :param summary: 页面摘要 :param refreshed_at: 刷新时间 :param shortcut_hint: 快捷键提示 :return: 文本行列表 """ return [ f'[{view_label} 控制台]', title, subtitle, '', f'运行环境 · {env}', f'当前页面 · {view_label}', f'运行摘要 · {summary}', f'操作提示 · {shortcut_hint}', f'最近刷新 · {refreshed_at}', ] @staticmethod def build_navigation_item_lines(index: int, label: str, shortcut: str, description: str) -> list[str]: """ 构建左侧导航项文案。 :param index: 导航索引 :param label: 导航标题 :param shortcut: 快捷键 :param description: 导航说明 :return: 文本行列表 """ return [ f'▌ {WORKSPACE_LABELS["menu"]} {index + 1:02d} · {label}', f'│ {WORKSPACE_LABELS["shortcut"]} [{shortcut.upper()}] · {description}', ] @staticmethod def build_section_item_lines(index: int, title: str, status_badge: str, preview: str) -> list[str]: """ 构建详情页分区导航项文案。 :param index: 分区索引 :param title: 分区标题 :param status_badge: 状态徽标 :param preview: 预览文本 :return: 文本行列表 """ return [ f'▌ {WORKSPACE_LABELS["section"]} {index + 1:02d} · {title}', f'│ {status_badge} {preview}', ] @staticmethod def build_record_item_lines(index: int, title: str, status_badge: str, summary: str) -> list[str]: """ 构建浏览页记录导航项文案。 :param index: 记录索引 :param title: 记录标题 :param status_badge: 状态徽标 :param summary: 记录摘要 :return: 文本行列表 """ return [ f'▌ {WORKSPACE_LABELS["record"]} {index + 1:02d} · {title}', f'│ {status_badge} {summary}', ] @staticmethod def build_section_detail_lines(title: str, status_label: str, status_badge: str, body: str) -> list[str]: """ 构建详情页右侧分区内容文案。 :param title: 分区标题 :param status_label: 分区状态 :param status_badge: 状态徽标 :param body: 主体文本 :return: 文本行列表 """ return [ f'{status_badge} {title}', f'{WORKSPACE_LABELS["status"]} · {status_label}', '', body, ] @staticmethod def build_browser_action_panel_lines(action_lines: list[str], feedback_lines: list[str]) -> list[str]: """ 构建浏览页动作面板文案。 :param action_lines: 可执行动作文本 :param feedback_lines: 最近动作反馈文本 :return: 文本行列表 """ lines = [ BROWSER_ACTION_PANEL_COPY['action_section_title'], *[f'> {line}' for line in action_lines], '', BROWSER_ACTION_PANEL_COPY['operation_section_title'], ] lines.extend(ACTION_HINT_COPY['operation_hint_lines']) if feedback_lines: lines.extend( [ '', BROWSER_ACTION_PANEL_COPY['recent_action_section_title'], *[f'> {line}' for line in feedback_lines], ] ) return lines @staticmethod def build_status_panel_text(title: str, status_code: str, status_label: str, body: str) -> str: """ 构建状态面板渲染文本。 :param title: 面板标题 :param status_code: 状态码 :param status_label: 状态标签 :param body: 面板正文 :return: 渲染文本 """ return f'{status_code} {title}\n{WORKSPACE_LABELS["status"]} · {status_label}\n\n{body}' @staticmethod def build_metric_panel_text(title: str, value: str, status_code: str, status_label: str, hint: str) -> str: """ 构建指标卡渲染文本。 :param title: 指标标题 :param value: 指标值 :param status_code: 状态码 :param status_label: 状态标签 :param hint: 提示文本 :return: 渲染文本 """ return ( f'{METRIC_COPY["label"]} · {title}\n' f'────────────────────────\n' f'{METRIC_COPY["value_label"]} · {value}\n' f'{WORKSPACE_LABELS["status"]} · {status_code} / {status_label}\n' f'{METRIC_COPY["hint_label"]} · {hint}' ) @staticmethod def build_signal_rail_text(pulse: str, body: str) -> str: """ 构建首页信号带渲染文本。 :param pulse: 当前脉冲字符 :param body: 主体文本 :return: 渲染文本 """ return '\n'.join( [ f'{SIGNAL_RAIL_COPY["title"]} {pulse}', '────────────────────────', body or SIGNAL_RAIL_COPY['empty'], ] ) @staticmethod def build_workspace_header_lines( *, env: str, view_label: str, timestamp: str, shortcut_hint: str, ) -> list[str]: """ 构建工作区顶部状态栏文本行。 :param env: 当前环境 :param view_label: 当前页面显示名称 :param timestamp: 当前时间 :param shortcut_hint: 快捷键提示 :return: 文本行列表 """ return [ f'ShiErFeng 控制台 · 环境 {env.upper()} · 页面 {view_label}', f'快捷键 · {shortcut_hint} 时间 {timestamp}', ] @staticmethod def build_dashboard_signal_lines( *, status_track: str, fail_count: int, warn_count: int, ok_count: int, total_count: int, navigation_shortcut_hint: str, ) -> list[str]: """ 构建首页信号带文案。 :param status_track: 面板状态轨迹 :param fail_count: 失败数量 :param warn_count: 警告数量 :param ok_count: 正常数量 :param total_count: 总数量 :param navigation_shortcut_hint: 页面快捷键提示 :return: 文本行列表 """ return [ f'面板轨迹 · {status_track or "-"}', f'风险分布 · 失败 {fail_count:02d} 警告 {warn_count:02d} 正常 {ok_count:02d} 合计 {total_count:02d}', f'快捷入口 · 页面 {navigation_shortcut_hint}', ] @staticmethod def build_dashboard_summary_text(total_count: int, ok_count: int, warn_count: int, fail_count: int) -> str: """ 构建首页摘要文本。 :param total_count: 面板总数 :param ok_count: 正常数量 :param warn_count: 警告数量 :param fail_count: 失败数量 :return: 摘要文本 """ posture = '存在风险' if fail_count else '需要关注' if warn_count else '运行稳定' return ( f'当前态势:{posture}。共 {total_count} 个面板,正常 {ok_count} 个,' f'警告 {warn_count} 个,失败 {fail_count} 个。' ) @staticmethod def build_detail_summary_text(total_count: int, ok_count: int, warn_count: int, fail_count: int) -> str: """ 构建详情页摘要文本。 :param total_count: 分区总数 :param ok_count: 正常数量 :param warn_count: 警告数量 :param fail_count: 失败数量 :return: 摘要文本 """ return ( f'当前页共 {total_count} 个分区,正常 {ok_count} 个,警告 {warn_count} 个,失败 {fail_count} 个。' '左侧上下切页,左右切换当前焦点区域。' ) @staticmethod def build_browser_summary_text( total_count: int, ok_count: int, warn_count: int, fail_count: int, action_hint: str, ) -> str: """ 构建浏览页摘要文本。 :param total_count: 记录总数 :param ok_count: 正常数量 :param warn_count: 警告数量 :param fail_count: 失败数量 :param action_hint: 动作提示文案 :return: 摘要文本 """ return ( f'当前页共 {total_count} 条记录,正常 {ok_count} 条,警告 {warn_count} 条,失败 {fail_count} 条。' f'切换记录后,右侧会联动展示概览与分区详情。{action_hint}' )