86 lines
3.4 KiB
JavaScript
86 lines
3.4 KiB
JavaScript
/**
|
|
* 字段处理工具函数模块
|
|
* 提供字段类型判断、选项排序、系统字段处理等工具函数
|
|
*/
|
|
|
|
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,
|
|
};
|