Files
kintone-helper-extenstion/utils/field-utils.js
2025-10-17 14:39:35 +08:00

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,
};