/* eslint-disable @typescript-eslint/naming-convention */ /* * Tencent is pleased to support the open source community by making TMagicEditor available. * * Copyright (C) 2025 Tencent. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import { NODE_CONDS_KEY, NODE_CONDS_RESULT_KEY, NODE_DISABLE_CODE_BLOCK_KEY, NODE_DISABLE_DATA_SOURCE_KEY, } from '@tmagic/core'; import { tMagicMessage } from '@tmagic/design'; import type { ChildConfig, DisplayCondsConfig, FormConfig, TabConfig, TabPaneConfig } from '@tmagic/form'; export const arrayOptions = [ { text: '包含', value: 'include' }, { text: '不包含', value: 'not_include' }, ]; export const eqOptions = [ { text: '等于', value: '=' }, { text: '不等于', value: '!=' }, ]; export const numberOptions = [ { text: '大于', value: '>' }, { text: '大于等于', value: '>=' }, { text: '小于', value: '<' }, { text: '小于等于', value: '<=' }, { text: '在范围内', value: 'between' }, { text: '不在范围内', value: 'not_between' }, ]; export const styleTabConfig: TabPaneConfig = { title: '样式', lazy: true, display: ({ services }: any) => !(services.uiService.get('showStylePanel') ?? true), items: [ { name: 'style', labelWidth: '100px', type: 'style-setter', items: [ { names: [ 'display', 'flexDirection', 'justifyContent', 'alignItems', 'flexWrap', 'marginTop', 'marginRight', 'marginBottom', 'marginLeft', 'paddingTop', 'paddingRight', 'paddingBottom', 'paddingLeft', 'width', 'height', 'overflow', 'fontSize', 'lineHeight', 'fontWeight', 'color', 'textAlign', 'backgroundColor', 'backgroundImage', 'backgroundSize', 'backgroundPosition', 'backgroundRepeat', 'position', 'zIndex', 'top', 'right', 'bottom', 'left', 'borderRadius', 'borderTopWidth', 'borderTopStyle', 'borderTopColor', 'borderRightColor', 'borderRightWidth', 'borderRightStyle', 'borderRightColor', 'borderBottomWidth', 'borderBottomStyle', 'borderBottomColor', 'borderLeftStyle', 'borderLeftWidth', 'borderLeftColor', 'borderWidth', 'borderStyle', 'borderColor', 'opacity', ], } as unknown as ChildConfig, { name: 'transform', defaultValue: () => ({}), }, ], }, ], }; export const eventTabConfig: TabPaneConfig = { title: '事件', lazy: true, items: [ { name: 'events', src: 'component', labelWidth: '100px', type: 'event-select', }, ], }; export const advancedTabConfig: TabPaneConfig = { title: '高级', lazy: true, items: [ { name: NODE_DISABLE_CODE_BLOCK_KEY, text: '禁用代码块', type: 'switch', defaultValue: false, extra: '开启后,配置的代码块将不会被执行', }, { name: NODE_DISABLE_DATA_SOURCE_KEY, text: '禁用数据源', type: 'switch', defaultValue: false, extra: '开启后,组件内配置的数据源相关配置将不会被编译,显隐条件将失效', }, { name: 'created', text: 'created', labelPosition: 'top', type: 'code-select', extra: '组件初始化时执行', }, { name: 'mounted', text: 'mounted', labelPosition: 'top', type: 'code-select', extra: '组件挂载到dom时执行', }, { name: 'display', text: 'display', extra: '控制组件是否渲染,关系的代码块返回值为false时不渲染', labelPosition: 'top', type: 'code-select', }, ], }; export const displayTabConfig: TabPaneConfig = { title: '显示条件', display: (_state, { model }) => model.type !== 'page', items: [ { name: NODE_CONDS_RESULT_KEY, type: 'select', text: '条件成立时', defaultValue: false, options: [ { text: '显示', value: false }, { text: '隐藏', value: true }, ], extra: (_state, { model }) => `条件成立时${model[NODE_CONDS_RESULT_KEY] ? '隐藏' : '显示'},不成立时${model[NODE_CONDS_RESULT_KEY] ? '显示' : '隐藏'};
同一条件组内的所有条件配置同时成立时表示该条件组成立,任意一个条件组成立时表示条件成立(条件组内为且的关系,条件组间为或的关系);
条件为空时表示成立;`, }, { type: 'display-conds', name: NODE_CONDS_KEY, titlePrefix: '条件组', defaultValue: [], }, ], }; /** * 统一为组件属性表单加上事件、高级、样式配置 * @param config 组件属性配置 * @returns Object */ export const fillConfig = ( config: FormConfig = [], { labelWidth = '80px', disabledDataSource = false, disabledCodeBlock = false, }: { labelWidth?: string; disabledDataSource?: boolean; disabledCodeBlock?: boolean } = {}, ): FormConfig => { const propsConfig: FormConfig = []; // 组件类型,必须要有 if (!config.find((item) => 'name' in item && item.name === 'type')) { propsConfig.push({ text: 'type', name: 'type', type: 'hidden', }); } if (!config.find((item) => 'name' in item && item.name === 'id')) { // 组件id,必须要有 propsConfig.push({ name: 'id', text: 'ID', type: 'text', disabled: true, append: { type: 'button', text: '复制', handler: (vm, { model }) => { navigator.clipboard .writeText(`${model.id}`) .then(() => { tMagicMessage.success('已复制'); }) .catch(() => { tMagicMessage.error('复制失败'); }); }, }, }); } if (!config.find((item) => 'name' in item && item.name === 'name')) { propsConfig.push({ name: 'name', text: '组件名称', }); } const noCodeAdvancedTabItems = advancedTabConfig.items.filter( (item) => 'type' in item && item.type !== 'code-select', ); if (noCodeAdvancedTabItems.length > 0 && disabledCodeBlock) { advancedTabConfig.items = noCodeAdvancedTabItems; } const tabConfig: TabConfig = { type: 'tab', labelWidth, items: [ { title: '属性', items: [...propsConfig, ...config], }, { ...styleTabConfig }, { ...eventTabConfig }, ], }; if (!disabledCodeBlock) { tabConfig.items.push({ ...advancedTabConfig }); } else if (noCodeAdvancedTabItems.length > 0) { tabConfig.items.push({ ...advancedTabConfig }); } if (!disabledDataSource) { tabConfig.items.push({ ...displayTabConfig }); } return [tabConfig]; };