All files / src/kernel DisplayComponentsMapping.tsx

88.88% Statements 32/36
93.75% Branches 15/16
81.81% Functions 9/11
90.62% Lines 29/32

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126                                                        66x           66x         60x 60x 60x 60x 676x 60x                                                 4x 4x 31x   28x 28x 532x                 28x   4x                 1x 1x 17x 17x 17x 17x 17x 16x 209x 16x 3x       1x                           446x    
import {
  CellComponentDisplayPage,
  EnumMetaProps,
  ObjectValues,
  RecordProps,
  TableMetaProps,
  TableMode
} from "@props/RecordProps";
import { ActionColumnKey } from '@config/base';
import {
  DisplayComponentRenderFunction, FieldConfigures, getDestTypeForComponentLookup
} from "./ComponentsConfig";
import { FormInstance } from "antd";
import { textCellComponentRender } from "./DisplayComponents";
 
export interface GetDisplayRenderProps {
  column: TableMetaProps;
  enumValues: { [id: string]: EnumMetaProps[] };
  objectValues: ObjectValues;
  domainName: string;
  page: CellComponentDisplayPage;
  zIndex: number;
  form: FormInstance;
  switchTabCallback?: (key: string) => void;
  isHighlightField?: boolean;
  tableMode?: TableMode;
}
 
export const hasDisplayRenderFunction = (column: TableMetaProps): boolean => {
  const { type } = column;
  const destType = getDestTypeForComponentLookup(type);
  return !!FieldConfigures.find(f => f.type === destType)?.displayComponent;
};
 
export const getDisplayRenderFunction = (props: GetDisplayRenderProps): DisplayComponentRenderFunction => {
  const {
    column, enumValues, objectValues, domainName, page,
    zIndex, form, switchTabCallback, isHighlightField,
    tableMode
  } = props;
  const { type, multiple } = column;
  const destType = getDestTypeForComponentLookup(type);
  const displayComponent = (
    FieldConfigures.find(f => f.type === destType)?.displayComponent) ?? textCellComponentRender;
  return displayComponent({
    column, enumValues, objectValues, domainName,
    page, zIndex, switchTabCallback, isHighlightField,
    tableMode, multiple: multiple ?? false, form,
  });
};
 
/**
 * 根据表格的元数据、表格中用到的枚举的值和标签的映射表,将从后台拿到的数据结构转化成显示的格式,
 * 动态生成各列的 render 函数
 * @param tableMetaProps 表格的元数据
 * @param enumValues 枚举的值和标签的映射表
 * @param objectValues 对象的值和标签的映射表
 * @param domainName pe name of the domain object
 * @param tableMode Mode of the table, can be "table-list" | "detail" | "finder" | "detail-drawer" | "card-list"
 * @param zIndex zIndex of the component
 */
export function transferColumnMeta(
  tableMetaProps: Array<TableMetaProps>,
  enumValues: { [id: string]: EnumMetaProps[] },
  objectValues: ObjectValues,
  domainName: string,
  tableMode: TableMode,
  zIndex: number,
): Array<TableMetaProps> {
  const result: Array<TableMetaProps> = Object.assign([], tableMetaProps);
  result
    .filter(c => c != null && c.key !== ActionColumnKey)
    .map(column => {
      const { type, multiple } = column;
      const destType = getDestTypeForComponentLookup(type);
      column.render = FieldConfigures.find(f => f.type === destType)?.displayComponent({
        column, enumValues, objectValues, domainName,
        page: "LIST",
        zIndex,
        switchTabCallback: undefined,
        isHighlightField: undefined,
        multiple: multiple ?? false,
        tableMode
      });
      return column;
    });
  return result;
}
 
/**
 * 使用配置中配置的转换函数,对后台返回的数据中,字段的值进行转换
 */
export function transformRecord(
  domainMeta: Array<TableMetaProps>, record: RecordProps
): RecordProps {
  const convertedRecord = { ...record };
  for (let i = 0; i < domainMeta.length; ++i) {
    const columnMeta = domainMeta[i];
    const columnKey = columnMeta.key;
    const columnValue = record[columnKey];
    const columnType = columnMeta.type;
    if (columnType != null) {
      const destType = getDestTypeForComponentLookup(columnType);
      const transferFunction = FieldConfigures.find(fc => fc.type === destType)?.backendValueConverter;
      if (transferFunction) {
        convertedRecord[columnKey] = transferFunction(record, columnValue);
      }
    }
  }
  return convertedRecord;
}
 
/**
 * 判断某个列定义是不是某个从属对象所属的主对象列
 * 如对于合同行,判断其某一列是不是到合同的应用
 * @param ownerClass 主对象的类型
 * @param ownerId 主对象的 id
 * @param ownerField 主对象的字段
 * @param column column 的定义
 */
export function isOwnerColumn(
  ownerClass: string | undefined, ownerField: string | undefined, ownerId: number | undefined, column: TableMetaProps
): boolean {
  return !!ownerClass && !!ownerId && !!ownerField && column.backReferenceField === ownerField;
}