/**
|
* 质量组件注册表
|
* <p>
|
* 全平台唯一的组件来源:设计器左侧面板、属性面板、渲染引擎、校验都从这里取定义。
|
* 新增组件只需要在 index.ts 里多注册一个 definition,不改动 GrapesJS 集成代码。
|
*/
|
import type {
|
QualityCategory,
|
QualityComponentDefinition,
|
} from './types';
|
|
import { QUALITY_CATEGORY_ORDER } from './types';
|
|
const definitions = new Map<string, QualityComponentDefinition>();
|
|
/** 注册单个组件;同 type 重复注册按覆盖处理,便于开发期热更新 */
|
export function registerQualityComponent(definition: QualityComponentDefinition): void {
|
if (!definition.type) {
|
throw new Error('质量组件定义缺少 type');
|
}
|
definitions.set(definition.type, definition);
|
}
|
|
/** 批量注册 */
|
export function registerQualityComponents(list: QualityComponentDefinition[]): void {
|
list.forEach(registerQualityComponent);
|
}
|
|
/** 按类型取定义,未注册返回 undefined */
|
export function getQualityComponent(type?: string): QualityComponentDefinition | undefined {
|
return type ? definitions.get(type) : undefined;
|
}
|
|
/** 全部组件,按分类顺序排列(同分类内按注册顺序) */
|
export function listQualityComponents(): QualityComponentDefinition[] {
|
return [...definitions.values()].sort(
|
(a, b) => categoryIndex(a.category) - categoryIndex(b.category),
|
);
|
}
|
|
/** 按分类分组,空分类不返回 */
|
export function listQualityComponentsByCategory(): {
|
category: QualityCategory;
|
components: QualityComponentDefinition[];
|
}[] {
|
const grouped = new Map<QualityCategory, QualityComponentDefinition[]>();
|
listQualityComponents().forEach((definition) => {
|
const list = grouped.get(definition.category) ?? [];
|
list.push(definition);
|
grouped.set(definition.category, list);
|
});
|
return QUALITY_CATEGORY_ORDER.filter((category) => grouped.has(category)).map(
|
(category) => ({ category, components: grouped.get(category)! }),
|
);
|
}
|
|
function categoryIndex(category: QualityCategory): number {
|
const index = QUALITY_CATEGORY_ORDER.indexOf(category);
|
return index === -1 ? QUALITY_CATEGORY_ORDER.length : index;
|
}
|