云
4 天以前 a241b66efcc41e973290a6722fb7a4d79b833ea1
src/adapter/vxe-table.ts
@@ -3,7 +3,7 @@
import type { ComponentPropsMap, ComponentType } from './component';
import { h } from 'vue';
import { h, watch } from 'vue';
import { IconifyIcon } from '@vben/icons';
import { $te } from '@vben/locales';
@@ -35,6 +35,8 @@
import { DictTag } from '#/components/dict-tag';
import { $t } from '#/locales';
import { automaticApproval } from '#/store/audit-policy';
import { isAuditField } from '#/utils/audit-ui-policy';
import { useVbenForm } from './form';
@@ -120,11 +122,42 @@
    });
    // 表格配置项可以用 cellRender: { name: 'CellTag' },
    // props: { data: [{value, color}], labels?: {[value]: label} }
    // 支持两种匹配模式:
    //   1. 精确匹配: data 和 labels 中都是精确值 (状态/类型枚举)
    //   2. 阈值匹配: data 为降序阈值, label 显示原始数值 (评分)
    vxeUI.renderer.add('CellTag', {
      renderTableDefault(renderOpts, params) {
        const { props } = renderOpts;
        const { column, row } = params;
        return h(Tag, { color: props?.color }, () => row[column.field]);
        const rawValue = row[column.field];
        // 查找显示文本
        let label = rawValue;
        if (props?.labels && rawValue !== undefined && rawValue !== null) {
          label = props.labels[rawValue] ?? rawValue;
        }
        // 查找颜色: 优先精确匹配,否则阈值匹配
        let color: string | undefined;
        if (props?.data) {
          const exact = props.data.find(
            (item: any) => item.value === rawValue,
          );
          if (exact) {
            color = exact.color;
          } else {
            const sorted = [...props.data]
              .filter((item: any) => typeof item.value === 'number')
              .sort((a: any, b: any) => b.value - a.value);
            const threshold = sorted.find(
              (item: any) => Number(rawValue) >= item.value,
            );
            if (threshold) color = threshold.color;
          }
        }
        return h(Tag, { color }, () => label);
      },
    });
@@ -372,6 +405,17 @@
export * from '#/components/table-action';
export const useVbenVxeGrid = <T extends Record<string, any>>(
  ...rest: Parameters<typeof useGrid<T, ComponentType, ComponentPropsMap>>
) => useGrid<T, ComponentType, ComponentPropsMap>(...rest);
) => {
  const options = rest[0];
  const columns = options.gridOptions?.columns;
  const schema = options.formOptions?.schema;
  const applyPolicy = () => ({
    ...(columns ? { gridOptions: { columns: columns.filter((item) => !automaticApproval.value || !isAuditField(item)) } } : {}),
    ...(schema ? { formOptions: { schema: schema.filter((item) => !automaticApproval.value || !isAuditField(item)) } } : {}),
  });
  const result = useGrid<T, ComponentType, ComponentPropsMap>(options);
  watch(automaticApproval, () => result[1].setState(applyPolicy()), { immediate: true });
  return result;
};
export type * from '@vben/plugins/vxe-table';