UNPKG

@cainiaofe/cn-ui-m-lowcode

Version:
457 lines (453 loc) 13.9 kB
import { Bundle } from '@ali/visualengine'; import React from 'react'; import { handleI18nLabel, uuid } from '@/common/util/util'; import Icon from './logo.jsx'; import { getJSExpressionPrototype } from '@/common/manager/common-style'; import { createEventSetters } from '@/common/manager/event'; import { createDataSourceSetters, getDataOriginSetterSnippet, getJSXTemplate, } from '@/common/manager/setter-snippet'; import { __dataSource__ } from '@/common/util/expr-const'; import { ButtonPosition } from '@/type/button-position'; import { DisplayPosition } from '@/type/display-position'; const _unsafe_MixedSetter_hidden_select = '_unsafe_MixedSetter_hidden_select'; export default [ Bundle.createPrototype({ componentName: 'CnTab', title: '选项卡(CnTab)', icon: Icon, disableBehaviors: ['copy'], docUrl: 'https://cone.cainiao-inc.com/market/awesome?business=internationality&id=3313', category: '布局', isInline: false, isContainer: true, canHovering: true, canSelecting: true, canDragging: true, canDropIn: 'CnTabItem', canDropTo: true, initialChildren: [ { componentName: 'CnTabItem', props: { primaryKey: `tab_${uuid(8)}` }, }, { componentName: 'CnTabItem', props: { primaryKey: `tab_${uuid(8)}` }, }, ], snippets: [ { screenshot: 'https://img.alicdn.com/tfs/TB1gaZrr.T1gK0jSZFhXXaAtVXa-1048-366.png', label: '普通型', schema: { componentName: 'CnTab', props: {}, }, }, ], configure: [ { name: 'isCnTab', title: 'isCnTab', initialValue: true, display: 'none', }, { name: '_context', title: '上下文', initialValue: { type: 'JSExpression', value: 'this', }, display: 'none', }, { name: 'title', title: 'Tab名称', display: 'inline', initialValue: 'Tab1', tip: '当前Tab的名称,方便检索使用', setter: 'StringSetter', }, // { // name:'doc', // title:'使用文档', // display:'inline', // setter:<DocLinkSetter // link={'https://alidocs.dingtalk.com/i/nodes/NkPaj7GAXdpWOkPeZ6p0Wqwgylnomz9B?iframeQuery=anchorId%3Dlc5v1btrovbue3v9ev9'} // content={'点击查看Tab的正确使用姿势'} // /> // }, getDataOriginSetterSnippet({ title: '标签项', }), { name: 'items', title: '标签项', display: 'plain', setter: { componentName: 'ArraySetter', props: { itemSetter: { componentName: 'ObjectSetter', props: { config: { items: [ { name: 'title', title: '名称', setter: 'CnI18nSetter', important: true, }, { name: 'hidden', title: '是否隐藏', important: true, setter: { componentName: 'MixedSetter', props: { setters: [ { componentName: 'BoolSetter', title: '布尔(true/false)', }, getJSExpressionPrototype({ type: 'base' }), ], }, }, }, { name: 'primaryKey', title: '标签项编码', // condition: () => false, setter: 'StringSetter', }, // { // name: 'closeable', // title: '可关闭', // important: true, // setter: 'BoolSetter', // condition: () => false, // }, ], }, }, initialValue: () => { return { primaryKey: `tab_${uuid(8)}`, title: '标签项', // closeable: false, }; }, }, }, }, accessor(value) { // const node = target.node; // const children = node.children; const node = this.getNode(); const map = node?.children.map((child, index) => { const primaryKey = child.getPropValue('primaryKey') ? String(child.getPropValue('primaryKey')) : child.id; const cacheSetter = value?.[index]?.[_unsafe_MixedSetter_hidden_select]; const temp = { primaryKey, title: child.getPropValue('title'), closeable: child.getPropValue('closeable'), hidden: child.getPropValue('hidden'), }; if (cacheSetter) { temp[_unsafe_MixedSetter_hidden_select] = cacheSetter; } return temp; }); return map; }, mutator(value) { const node = this.getNode(); const map = {}; if (!Array.isArray(value)) { value = []; } value.forEach((item) => { const tabitem = Object.assign({}, item); map[item.primaryKey] = tabitem; }); node.children.mergeChildren( (child) => { const primaryKey = String(child.getPropValue('primaryKey')); if (Object.hasOwnProperty.call(map, primaryKey)) { child.setPropValue('title', map[primaryKey].title); child.setPropValue('closeable', map[primaryKey].closeable); child.setPropValue('hidden', map[primaryKey].hidden); delete map[primaryKey]; return false; } return true; }, () => { const items = []; for (const primaryKey in map) { if (Object.hasOwnProperty.call(map, primaryKey)) { items.push({ componentName: 'CnTabItem', props: map[primaryKey], }); } } return items; }, (child1, child2) => { const a = value.findIndex( (item) => String(item.primaryKey) === String(child1.getPropValue('primaryKey')), ); const b = value.findIndex( (item) => String(item.primaryKey) === String(child2.getPropValue('primaryKey')), ); return a - b; }, ); }, hidden(value) { return ( this?.parent?.parent?.getPropValue?.('dataOrigin') === 'request' ); }, }, { name: 'requestConfig', title: '查询服务', display: 'inline', // className:'cn-inline-setter-reduce', setter: { componentName: 'ServiceChoiceSetter', props: { buttonText: '选择请求API', params: { env: 'pre', pageSize: 999, // serviceType: 'HSF', }, paramSetter: { componentName: 'MixedSetter', props: { setters: [ { componentName: 'ParamSelectSetter', props: { dataKey: 'aa', labelKey: 'aa', valueKey: 'aa', groupName: '参数列表', }, title: '选择参数', }, { componentName: 'StringSetter', title: '字符串', }, getJSExpressionPrototype({ type: 'base', }), ], }, }, }, }, hidden(value) { return ( this?.parent?.parent?.getPropValue?.('dataOrigin') !== 'request' ); }, }, { name: 'activeKey', title: '默认激活的tab项', display: 'inline', setter: { componentName: 'MixedSetter', props: { setters: [ { componentName: 'CnSelectSetter', title: '选择tab项', props(prop) { const list = []; const temp = prop?.getNode?.()?.getPropValue('items'); if (Array.isArray(temp) && temp.length > 0) { temp.forEach((item) => { const { primaryKey, title } = item || {}; if (primaryKey) { const realTitle = handleI18nLabel(title); list.push({ label: `${realTitle}(${primaryKey})`, value: primaryKey, }); } }); } return { options: list, }; }, }, { componentName: 'ParamSelectSetter', props: { configList: [ { groupName: '其他数据', groupExprName: __dataSource__, needSecondParam: true, }, ], }, title: '从数据源选择', }, getJSExpressionPrototype({ type: 'base' }), ], }, }, hidden(value) { return ( this?.parent?.parent?.getPropValue?.('dataOrigin') === 'request' ); }, }, { title: '样式', type: 'group', display: 'accordion', // collapsed: true, items: [ // { // name: 'shape', // title: '形态', // display: 'inline', // initialValue: 'pure', // setter: { // componentName: 'RadioGroupSetter', // props: { // options: [ // { title: '普通', value: 'pure' }, // { title: '包裹', value: 'wrapped' }, // { title: '文本', value: 'text' }, // { title: '胶囊', value: 'capsule' }, // ], // }, // }, // }, // { // name: 'size', // title: '大小', // display: 'inline', // initialValue: 'medium', // setter: { // componentName: 'RadioGroupSetter', // props: { // options: [ // { title: '小', value: 'small', tip: '小号尺寸' }, // { title: '中', value: 'medium', tip: '正常尺寸' }, // ], // }, // }, // }, { name: 'tabAlign', title: 'tab 项对齐方向', display: 'inline', initialValue: 'center', setter: { componentName: 'RadioGroupSetter', props: { options: [ { title: '左对齐', value: 'left' }, { title: '居中对齐', value: 'center' }, ], }, }, }, { name: 'type', title: '滚动时标签项是否吸顶', display: 'inline', initialValue: 'primary', setter: { componentName: 'RadioGroupSetter', props: { options: [ { title: '滚动时吸顶', value: 'primary' }, { title: '滚动时不吸顶', value: 'secondary' }, ], }, }, }, ], }, ...createEventSetters({ position: ButtonPosition.tabEvent, initialValue: { optType: 'flowAction', }, title: '配置tab的回调', }), { title: '高级配置', type: 'group', collapsed: true, display: 'accordion', items: [ ...createDataSourceSetters(), { name: '_customRenderTabItem', title: '自定义渲染Tab标签', display: 'inline', // className:'cn-inline-setter-reduce', setter: getJSXTemplate({ position: DisplayPosition.tabItem, }), }, ], }, ], }), Bundle.createPrototype({ componentName: 'CnTabItem', title: '选项', category: null, isInline: false, isContainer: true, canHovering: false, canSelecting: false, canDropIn: true, canDragging: false, canDropTo: 'Tabs', configure: [ { name: 'primaryKey', title: '键值', display: 'none', }, { name: 'title', title: '名称', display: 'none', initialValue: '标签项', // initial(val) { // return val; // }, }, ], }), ];