/** * 字段处理工具函数模块 * 提供字段类型判断、选项排序、系统字段处理等工具函数 */ import { FIELD_TYPES, OPTION_SORTABLE_TYPES, LOOKUP_COPY_SUPPORTED_TYPES } from './constants.js'; /** * 排序字段选项,根据索引值进行升序排序 * @param {Object} field - 字段对象 * @returns {Array} 按索引排序后的选项标签数组 */ export const sortFieldOptions = (field) => { if (!field.options) return []; return Object.values(field.options) .sort((a, b) => Number(a.index) - Number(b.index)) .map(option => option.label); }; /** * 检查字段类型是否支持选项排序 * @param {string} fieldType - 字段类型 * @returns {boolean} 是否支持选项排序 */ export const shouldSortOptions = (fieldType) => OPTION_SORTABLE_TYPES.includes(fieldType); /** * 标记查找复制字段 * @param {Array} fields - 要处理的字段数组 */ export const markLookupCopies = (fields) => { fields.forEach(field => { // 检查字段是否有查找设置 if (field.lookup?.fieldMappings) { field.lookup.fieldMappings.forEach(mapping => { // 在字段数组中找到对应的目标字段并标记为查找复制 const targetField = fields.find(f => LOOKUP_COPY_SUPPORTED_TYPES.includes(f.type) && f.code === mapping.field ); if (targetField) { targetField.isLookupCopy = true; } }); } }); }; export const FieldTypeChecker = { isCategory: field => field.type === FIELD_TYPES.CATEGORY, isCheckBox: field => field.type === FIELD_TYPES.CHECK_BOX, isCreatedTime: field => field.type === FIELD_TYPES.CREATED_TIME, isCreator: field => field.type === FIELD_TYPES.CREATOR, isDate: field => field.type === FIELD_TYPES.DATE, isDatetime: field => field.type === FIELD_TYPES.DATETIME, isDropDown: field => field.type === FIELD_TYPES.DROP_DOWN, isFile: field => field.type === FIELD_TYPES.FILE, isGroup: field => field.type === FIELD_TYPES.GROUP, isGroupSelect: field => field.type === FIELD_TYPES.GROUP_SELECT, isInGroup: field => 'group' in field, isInSubtable: field => 'table' in field, isLink: field => field.type === FIELD_TYPES.LINK, isLookup: field => 'lookup' in field, isLookupCopy: field => field.isLookupCopy === true, isModifier: field => field.type === FIELD_TYPES.MODIFIER, isMultiLineText: field => field.type === FIELD_TYPES.MULTI_LINE_TEXT, isMultiSelect: field => field.type === FIELD_TYPES.MULTI_SELECT, isNotInSubtable: field => !('table' in field), isNumber: field => field.type === FIELD_TYPES.NUMBER, isOrganizationSelect: field => field.type === FIELD_TYPES.ORGANIZATION_SELECT, isRadioButton: field => field.type === FIELD_TYPES.RADIO_BUTTON, isRecordNumber: field => field.type === FIELD_TYPES.RECORD_NUMBER, isReferenceTable: field => field.type === FIELD_TYPES.REFERENCE_TABLE, isRichText: field => field.type === FIELD_TYPES.RICH_TEXT, isSingleLineText: field => field.type === FIELD_TYPES.SINGLE_LINE_TEXT, isStatus: field => field.type === FIELD_TYPES.STATUS, isStatusAssignee: field => field.type === FIELD_TYPES.STATUS_ASSIGNEE, isSubtable: field => field.type === FIELD_TYPES.SUBTABLE, isTime: field => field.type === FIELD_TYPES.TIME, isUpdatedTime: field => field.type === FIELD_TYPES.UPDATED_TIME, isUserSelect: field => field.type === FIELD_TYPES.USER_SELECT, };