import React from 'react'; import type { AgGridColumnPropsClone, GridRef } from '../ag-grid-plus/interface'; import { type EnumFallbackRenderer } from './enumColumns'; import './groupedHeaders.less'; import { type ListSortPolicy } from './listDefaultSort'; /** * 标准列表的宿主口径。 * - `enumFallbackRenderer`:枚举列未命中时的显示(如「未知(原码)」);不传则显示原码。 * - `sortPolicy`:默认排序识别的状态字段与记录时间字段。 */ export interface StandardListPolicy { enumFallbackRenderer?: EnumFallbackRenderer; sortPolicy?: ListSortPolicy; } /** * 标准列表列定义:在表格列定义上补 businessKey。 * businessKey 为 true 表示该列是业务单号(如 mrpID、mpsID),不按「ID 结尾」当内部键隐藏。 * @author nokecy */ export type AppGridColumn = AgGridColumnPropsClone & { businessKey?: boolean; }; /** * 标准列表基座:在 AgGridPlus 外面包一层公司列表规范(序号、内部字段隐藏、日期显示、分组表头、空态四分支、 * 默认排序、枚举回退等)。宿主的页面一律经宿主自己的薄封装导入它,这里加一次,等于所有列表页都有了。 * 与路由相关的刷新令牌和宿主口径(未知值文案、排序字段)由宿主通过属性传入。 * * 这层目前做三件事: * * 1. **从表单页保存返回时,把列表刷新一遍**。 * 起因是 `pubGoBack()` 只 push 回父路径再关掉表单页标签,而列表页在 KeepAlive 缓存里, * push 回去是直接复原缓存的那棵树,不会重新请求——用户刚保存的记录不在列表里, * 于是以为没存上,再存一遍。全仓 196 处返回都是这个行为。 * 为什么不直接 `dropByCacheKey(列表路径)` 把缓存丢掉:那样确实会重新加载, * 但连筛选条件、滚动位置、分页和列宽一起丢了。用户进表单前设的筛选,回来就没了。 * 走 URL 上的 refresh 标记只重新取数,页面状态原样保留。 * * 2. **空态四分支(U2)**:无数据 / 筛选无结果 / 无权限(403) / 加载失败。 * qc-ui 只支持一句空数据文字(overlayNoRowsTemplateText),分不出四种情况。 * 这里用 AG-Grid 原生的 `noRowsOverlayComponent`(优先级高于 overlayNoRowsTemplate) * 挂 `GridEmptyState`,请求成败与是否带筛选经 context 传给 overlay 组件。 * 业务页可通过 `emptyActions` 注入「无数据」分支的操作(通常是 Access 包裹的新建按钮), * 或用自己的 `noRowsOverlayComponent` 整体覆盖。 * * 3. **valueEnum 文字对比度**:qc-ui 把 `valueEnum.color` 当 CSS 文字色,缺 color 时写成 * `#ffffff`(销售跟踪「类型」列「普通订单」白底白字就是这条)。封装层给 columnDefs * 和 AgGridColumn 统一套 `gridValueEnum()`:缺色用 inherit,浅色 / 预设名收成白底 ≥4.5:1。 * * 4. **列定义上的 live `sort`**:AG Grid 把 `ColDef.sort` 当受控属性,每次 columnDefs 引用变化 * 都会强制写回。送货单点「送货日期」降序后再点单元格,选中态 setState 重建列定义, * 默认「单号升序」被重新套上,排序就自己变了。封装层把 `sort` 收成只用于建列的 `initialSort`。 * * @author nokecy */ declare const StandardAgGridColumn: React.FC; declare const StandardAgGridPlus: React.FC; export { StandardAgGridColumn, StandardAgGridPlus }; export type { GridRef };