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

108 lines
3.6 KiB
JavaScript

/**
* DOM 操作工具模块
* 提供用于创建和管理 DOM 元素的辅助函数
*/
import { FIELD_TYPES, DOM_CLASSES } from './constants.js';
/**
* 从表元素中提取列宽度信息
* @param {HTMLElement} tableElement - 要分析的表元素
* @param {string} fieldType - 字段类型(影响返回的宽度数组)
* @returns {Array<number>} 表列宽度的数组
*/
export const getColumnWidths = (tableElement, fieldType) => {
// 获取所有标题元素并提取它们的客户端宽度
const headerElements = Array.from(tableElement.querySelectorAll('th'));
const columnWidths = headerElements.map(header => header.clientWidth);
// 对于子表返回所有宽度,其他表跳过第一列(通常是操作列)
return fieldType === FIELD_TYPES.SUBTABLE
? columnWidths // 子表保留所有列
: columnWidths.slice(1); // 其他表跳过第一列
};
/**
* 安全地将标签元素插入到指定目标元素之前
* @param {HTMLElement} targetElement - 要插入之前的目标元素
* @param {HTMLElement} labelElement - 要插入的标签元素
* @returns {boolean} 插入是否成功
*/
export const safelyInsertLabel = (targetElement, labelElement) => {
try {
if (!targetElement || !labelElement) {
console.warn('Failed to insert label: target element or label element does not exist');
return false;
}
if (!targetElement.before) {
console.warn('Failed to insert label: target element does not support before method');
return false;
}
targetElement.before(labelElement);
return true;
} catch (error) {
console.error('Error inserting label: ', error);
return false;
}
};
/**
* 安全地将标签元素追加到指定目标元素
* @param {HTMLElement} targetElement - 要追加到的目标元素
* @param {HTMLElement} labelElement - 要追加的标签元素
* @returns {boolean} 追加是否成功
*/
export const safelyAppendLabel = (targetElement, labelElement) => {
try {
if (!targetElement || !labelElement) {
console.warn('Failed to append label: target element or label element does not exist');
return false;
}
targetElement.appendChild(labelElement);
return true;
} catch (error) {
console.error('Error appending label: ', error);
return false;
}
};
const isRowElement = (element) => element?.classList?.contains(DOM_CLASSES.ROW_ELEMENT);
const isFieldElement = (element) => element?.classList?.contains(DOM_CLASSES.FIELD_ELEMENT);
/**
* 基于 DOM 类名判断字段类型的工具对象
* 用于 admin 表单页面通过 DOM 元素判断字段类型
*/
export const FieldTypeCheckerForAdminDom = {
isRowElement,
isFieldElement,
isSubtable: (element) => {
return !isRowElement(element) && !isFieldElement(element) &&
element?.classList?.contains(DOM_CLASSES.SUBTABLE);
},
isGroup: (element) => {
return isRowElement(element) &&
!!element?.querySelector(`.${DOM_CLASSES.GROUP}`);
},
isReferenceTable: (element) => {
return isRowElement(element) &&
!!element?.querySelector(`.${DOM_CLASSES.REFERENCE_TABLE}`);
},
isSpacer: (element) => {
return isFieldElement(element) &&
element?.classList?.contains(DOM_CLASSES.SPACER);
},
isLabel: (element) => {
return isFieldElement(element) &&
element?.classList?.contains(DOM_CLASSES.LABEL);
},
isHr: (element) => {
return isFieldElement(element) &&
element?.classList?.contains(DOM_CLASSES.HR);
},
};