UNPKG

@cainiaofe/cn-ui-lowcode

Version:
1,113 lines (1,108 loc) 38.3 kB
import React from 'react'; import { Bundle } from '@ali/visualengine'; import columnsPrototype from './prototype/columns'; import operatePrototype from './prototype/operate'; import pagePrototype from './prototype/page'; import rowSelectionPrototype from './prototype/rowSelection'; import toolbarPrototype from './prototype/toolbar'; import Icon from './logo.tsx'; import { CnTooltip } from '@cainiaofe/cn-ui'; import { getJSExpressionPrototype, getParamSetterPrototype, } from '@/common/manager/common-style'; import IdSetter from '@/common/setter/id-setter'; import { initialContentJSX } from '@/common/manager/filter-item/message'; import { generateDataSource, getItemListByPosition, getItemPrototypeListByPosition, } from '@/common/util/util'; import { DisplayPosition } from '@/common/manager/position/display-position'; import { createDataSourceSetters, createFormStyleSetters, } from '@/lowcode/cn-form-alc/prototype/form-item'; import { __extraParam__, __dataSource__, currentPageLabel, pageSizeLabel, tableCurrentRowLabel, } from '@/common/util/expr-const'; import { ParamSelectSetter } from '@/common/setter/param-select-setter'; import { getJSXTemplate, getObjectSetterSnippet, getTableRemoteSnippet, } from '@/common/manager/setter-snippet'; import { getItemListByPosition as getFilterItemListByPosition } from '@/common/manager/filter-item'; import DocLinkSetter from '@/common/setter/doc-link-setter'; import isPlainObject from 'lodash/isPlainObject'; import { createEventSetters } from '@/common/manager/event'; import { ButtonPosition } from '@/common/manager/position/button-position'; import { getBizExtendPrototype } from '@/common/manager/plugin'; const { ActionSetter } = window.VisualEngineUtils || {}; // 原型配置请参考:https://lark.alipay.com/vision/docs/prototype export default [ Bundle.createPrototype({ componentName: 'CnTable', title: '表格(CnTable)', category: 'FTP场景(列表页)', icon: Icon, cover: 'https://img.alicdn.com/tfs/TB1ZU1HuVT7gK0jSZFpXXaTkpXa-112-64.png', docUrl: 'https://go.alibaba-inc.com/help3/vc-button', isContainer: false, canHovering: true, canSelecting: true, canDragging: true, enableCopy: true, snippets: [ { screenshot: 'https://img.alicdn.com/tfs/TB1ZU1HuVT7gK0jSZFpXXaTkpXa-112-64.png', label: '菜鸟表格', schema: { componentName: 'CnTable', props: {}, }, }, ], configure: [ { name: 'tableName', title: '表格名称', display: 'inline', initialValue: '表格1', tip: '当前表格的名称,方便检索使用', setter: 'StringSetter', // supportVariable: true, }, { name: 'doc', title: '使用文档', display: 'inline', setter: ( <DocLinkSetter link={ 'https://alidocs.dingtalk.com/i/nodes/NkPaj7GAXdpWOkPeZ6p0Wqwgylnomz9B?iframeQuery=anchorId%3Dlc5v06n927eji44ij81i' } content={'点击查看表格的正确使用姿势'} /> ), }, // { // name: 'showToolbar1', // title: 'func', // display:'inline', // supportVariable: true, // setter: "TextSetter", // }, // { // name: 'showToolbar1', // title: 'func', // display:'inline', // setter: "FunctionSetter", // }, // { // name: 'showToolbar2', // title: 'func', // display:'inline', // setter: "ExpressionSetter", // }, { name: '_context', title: '上下文', initialValue: { type: 'JSExpression', value: 'this', }, display: 'none', }, { name: 'isCnTable', title: 'cntable', initialValue: true, display: 'none', }, { name: '_bindFilterDataSourceName', title: '绑定的Filter的数据源名称', display: 'none', }, { name: 'remote', title: '表格查询服务', display: 'block', initialValue: {}, setter: getTableRemoteSnippet(), // supportVariable: true, }, { name: 'manual', title: '表格初始时不请求', display: 'inline', defaultValue: false, setter: { componentName: 'MixedSetter', props: { setters: [ { title: '是 / 否', componentName: 'RadioGroupSetter', props: { options: [ { title: '是', value: true }, { title: '否', value: false }, ], }, }, getJSExpressionPrototype({ type: 'base' }), ], }, }, }, columnsPrototype(), operatePrototype(), { name: 'operateColumn', display: 'plain', title: '操作列', setter: { componentName: 'ObjectSetter', props: { config: { items: [ { name: 'width', title: '操作列宽度', display: 'inline', setter: 'NumberSetter', className: 'cn-inline-setter-reduce', }, ], }, }, }, }, toolbarPrototype(), rowSelectionPrototype(), pagePrototype(), { name: 'tableStyle', display: 'accordion', title: '表格样式', collapsed: true, extraProps: { defaultCollapsed: true, }, setter: { componentName: 'ObjectSetter', props: { config: { items: [ { title: '数据为空时的展示文案', name: 'emptyContent', setter: { componentName: 'MixedSetter', props: { setters: [ { componentName: 'CnI18nSetter', title: '纯文本', }, { // componentName: <JSXSetter // // mode={'javascript'} // usePopup={true} // // wordWrap={'off'} // enableFullscreen={true} // theme='vs' // />, componentName: 'CnJSXSetter', props: { usePopup: true, enableFullscreen: true, theme: 'vs', }, title: 'React JSX代码', initialValue: initialContentJSX, }, ], }, }, }, { name: 'showIndex', title: '展示序号', setter: 'BoolSetter', }, { name: 'isZebra', title: '开启斑马线', setter: 'BoolSetter', }, { name: 'hasBorder', title: '开启表格边框', defaultValue: true, setter: 'BoolSetter', }, { name: 'defaultSize', title: '默认尺寸', display: 'inline', defaultValue: 'medium', setter: { componentName: 'RadioGroupSetter', props: { options: [ { title: '紧凑', value: 'small' }, { title: '正常', value: 'medium' }, { title: '宽松', value: 'large' }, ], }, }, }, { name: 'columnResize', title: '允许列拖拽', setter: 'BoolSetter', }, ], }, }, }, }, { name: 'slot', display: 'accordion', title: '数据汇总统计', collapsed: true, extraProps: { defaultCollapsed: true, }, setter: { componentName: 'ObjectSetter', props: { config: { items: [ { name: 'statisticsInfo', title: '顶部数据汇总', display: 'inline', setter: { componentName: 'MixedSetter', props: { setters: [ getJSXTemplate({ position: DisplayPosition.tableTopSlot, }), { componentName: 'SelectSetter', props: () => { return { showSearch: true, options: getFilterItemListByPosition({ position: DisplayPosition.tableTopSlot, }), }; }, title: '选择业务组件', }, ], }, }, }, { name: 'statisticsInfoOptions', // display: 'accordion', display: 'block', title: '顶部数据汇总业务组件额外配置项', extraProps: { defaultCollapsed: false, }, setter: { componentName: 'ObjectSetter', props: () => { return { config: { items: [ ...getItemPrototypeListByPosition({ position: DisplayPosition.tableTopSlot, primaryKey: 'statisticsInfo', componentMap: {}, }), ], }, }; }, }, }, // { // name:'centerInPageAndTable', // title:'底部数据汇总', // display:'inline', // setter:getJSXTemplate({ // position: DisplayPosition.tableTopSlot, // }), // } ], }, }, }, }, { name: 'treeTableAsyncRequestConfig', display: 'accordion', title: '树表格异步加载配置', collapsed: true, extraProps: { defaultCollapsed: true, }, setter: { componentName: 'ObjectSetter', props: { config: { items: [ { title: '请求树表格的子级数据', name: 'requestConfig', setter: { componentName: 'ServiceChoiceSetter', props: { paramTitleDom: ( <div> 请求参数配置{' '} <span style={{ fontWeight: 'bold', color: 'red', marginLeft: '30px', }} > 提示:表格请求时会默认带上筛选栏的数据作为参数,无需手动配置! </span> </div> ), responseDom: ( <div style={{ paddingTop: '10px' }}> 请求返回结果的数据结构: <a target={'_blank'} href='https://yuque.antfin.com/cn-framework-committee/cn-ui-data-structure/cn-table#YHipc' rel='noreferrer' > 接口文档 </a>{' '} <CnTooltip v2 align={'t'} trigger={<a>接口预览</a>}> <div style={{ width: '200px', height: '260px' }}> <img style={{ width: '100%' }} src='https://img.alicdn.com/imgextra/i3/O1CN0126a4Lt1R3h4yUUvdW_!!6000000002056-0-tps-708-900.jpg' /> </div> </CnTooltip> </div> ), mockDataTemplate: { success: true, data: { tableData: [ { name: 'aa', age: 18, }, ], paging: { currentPage: 1, pageSize: 10, totalCount: 1, }, }, }, buttonText: '选择请求API', params: { env: 'pre', pageSize: 999, // serviceType: 'HSF', }, resultProcessFuncTemplate: `function(res) { // 需要返回的如下的数据结构 // return { // success: true, // data: { // tableColumns: [{title:"xx",dataIndex:"xx"}], // tableData: [], // paging: { // currentPage: 1, // pageSize: 20, // totalCount: 99, // } // } // } return res; }`, paramSetter: [ { componentName: 'ParamSelectSetter', props: { ParamSelectSetterComponent: ParamSelectSetter, configList: [ { dataKey: 'config', labelKey: 'label', valueKey: 'name', groupName: '筛选栏', relativeDataSourceName: '_bindFilterDataSourceName', relativeDataSourceNameKey: '_dataSourceName', }, { groupName: '当前表格的信息', groupExprName: __extraParam__, handleCustomGroup: (extra) => { if (Array.isArray(extra?.children)) { extra.children.push({ label: tableCurrentRowLabel, value: `${__extraParam__}.record`, handleExprConfig: (value, newV) => { if (isPlainObject(newV)) { newV.config = { showSecondParam: true, }; } }, }); } }, }, { groupName: '其他数据', groupExprName: __dataSource__, needSecondParam: true, }, ], }, title: '选择参数', }, { componentName: 'StringSetter', title: '字符串', }, getJSExpressionPrototype({ type: 'formRequestForTreeTableAsyncRequestConfig', }), ], }, }, }, ], }, }, }, }, { name: 'childTable', display: 'accordion', title: '配置子母表的子表格', collapsed: true, extraProps: { defaultCollapsed: true, }, setter: { componentName: 'ObjectSetter', props: { config: { items: [ { name: 'tableName', title: '子表格名称', display: 'inline', defaultValue: '表格1', setter: 'StringSetter', // supportVariable: true, }, { name: 'remote', title: '子表格查询服务', display: 'inline', initialValue: {}, setter: getTableRemoteSnippet({ needMockRequestInTable: false, paramSelectSetter: [ { componentName: 'ParamSelectSetter', props: { ParamSelectSetterComponent: ParamSelectSetter, configList: [ { groupName: '当前表格的信息', groupExprName: __extraParam__, handleCustomGroup: (extra) => { if (Array.isArray(extra?.children)) { extra.children.push({ label: tableCurrentRowLabel, value: `${__extraParam__}.record`, handleExprConfig: (value, newV) => { if (isPlainObject(newV)) { newV.config = { showSecondParam: true, }; } }, }); extra.children.push({ label: currentPageLabel, value: `${__extraParam__}.currentPage`, }); extra.children.push({ label: pageSizeLabel, value: `${__extraParam__}.pageSize`, }); } }, }, { groupName: '其他数据', groupExprName: __dataSource__, needSecondParam: true, }, ], }, title: '选择参数', }, { componentName: 'StringSetter', title: '字符串', }, getJSExpressionPrototype({ type: 'childTableInitRequest', }), ], }), // supportVariable: true, }, columnsPrototype(), operatePrototype({ isInChildTable: true }), { title: '分页设置', type: 'group', display: 'accordion', extraProps: { defaultCollapsed: true, }, items: [ { name: 'paging', title: '是否开启', display: 'inline', initialValue: true, defaultValue: true, setter: 'BoolSetter', }, { name: 'pageSizeList', title: '每页显示选择器可选值', display: 'inline', initialValue: [10, 20, 50], defaultValue: [10, 20, 50], condition(prop) { return ( prop?.parent?.parent?.getPropValue?.('paging') === true ); }, setter: 'JsonSetter', }, { name: 'defaultPageSize', title: '默认的每页条数', tip: '优先展示接口配置的数据', display: 'inline', condition(prop) { return ( prop?.parent?.parent?.getPropValue?.('paging') === true ); }, setter: 'NumberSetter', }, ], }, { title: '高级配置', type: 'group', collapsed: true, extraProps: { defaultCollapsed: true, }, display: 'accordion', items: [ { name: 'primaryKey', title: '数据主键', display: 'inline', defaultValue: 'id', setter: 'StringSetter', }, { name: 'tree', title: '开启树表格', display: 'inline', defaultValue: false, initialValue: false, setter: 'BoolSetter', }, { name: 'dataSource', title: '静态数据', display: 'inline', tip: '编辑静态展示数据', // initialValue: [], setter: { componentName: 'MixedSetter', props: { setters: [ { componentName: 'JsonSetter', props: { label: '编辑静态展示数据', }, }, getJSExpressionPrototype({ type: 'table' }), ], }, }, }, { name: 'openKeysConfig', title: '展开配置', display: 'inline', tip: '编辑母子表展开受控', // initialValue: [], setter: { componentName: 'MixedSetter', props: { setters: [ { componentName: 'JsonSetter', props: { label: '编辑静态展示数据', }, }, getJSExpressionPrototype({ type: 'base' }), ], }, }, }, { name: 'operateColumn', display: 'plain', title: '操作列', setter: { componentName: 'ObjectSetter', props: { config: { items: [ { name: 'width', title: '操作列宽度', display: 'inline', setter: 'NumberSetter', }, ], }, }, }, }, { name: 'rowProps', title: '自定义行属性 rowProps', display: 'inline', setter: { componentName: 'CnJSXSetter', props: { label: '编写rowProps回调', usePopup: true, enableFullscreen: true, theme: 'vs', }, initialValue: { type: 'js', source: 'function rowProps(record, index, state) { \n return {}; \n}', compiled: 'function main(){\n \n "use strict";\n\nvar __compiledFunc__ = function rowProps(record, index, state) {\n return {}; \n};\n return __compiledFunc__.apply(this, arguments);\n }', error: {}, }, }, }, { name: 'cellProps', title: '自定义单元格 cellProps', display: 'inline', setter: { componentName: 'CnJSXSetter', props: { label: '编写cellProps回调', usePopup: true, enableFullscreen: true, theme: 'vs', }, initialValue: { type: 'js', source: 'function cellProps(rowIndex, colIndex, key, rowData) { \n return {}; \n}', compiled: 'function main(){\n \n "use strict";\n\nvar __compiledFunc__ = function content() {\n return {}; \n};\n return __compiledFunc__.apply(this, arguments);\n }', error: {}, }, }, }, { name: 'handleProps', title: '手动设置组件props', display: 'inline', setter: getJSExpressionPrototype({ type: 'props', }), }, ], }, ], }, }, }, }, ...createEventSetters({ position: ButtonPosition.tableEvent, initialValue: {}, title: '配置表格的回调', }), { title: '一码多端配置项', name: 'mobileProps', display: 'accordion', setter: getObjectSetterSnippet({ items: [ { name: 'type', title: '辅端展示效果', display: 'inline', setter: { componentName: 'RadioGroupSetter', props: { options: [ { title: '卡片列表', value: 'CnCardItems' }, { title: '表格', value: 'CnTable' }, ], }, }, }, { name: 'entryTitle', title: '辅端表格标题', display: 'inline', setter: 'CnI18nSetter', }, ], }), }, ...getBizExtendPrototype({ componentName: 'CnTable', }), { title: '高级配置', type: 'group', collapsed: true, display: 'accordion', items: [ { name: '_nodeId', title: '节点 ID', display: 'inline', initialValue() { return this.getNode().id; }, setter: <IdSetter />, }, ...createDataSourceSetters(), { name: 'cellCopyEnable', title: '双击复制', display: 'inline', setter: 'BoolSetter', // supportVariable: true, }, { name: 'columnCopyEnable', title: '开启整列复制', display: 'inline', setter: 'BoolSetter', }, { name: 'primaryKey', title: '数据主键', display: 'inline', initialValue: 'id', tip: '', setter: 'StringSetter', // supportVariable: true, }, { name: 'dataSource', title: '静态数据', display: 'inline', tip: '编辑静态展示数据', // initialValue: [], setter: { componentName: 'MixedSetter', props: { setters: [ { componentName: 'JsonSetter', title: 'JSON编辑', props: { label: '编辑静态展示数据', }, }, { componentName: 'VariableSetter', }, getJSExpressionPrototype({ type: 'base', offlineTip: '动态控制数据推荐使用「变量绑定」设置该属性', }), ], }, }, }, { name: 'tree', title: '开启树表格', display: 'inline', defaultValue: false, initialValue: false, setter: 'BoolSetter', // supportVariable: true, }, { name: 'openKeys', title: '配置树表格的展开项', display: 'inline', setter: 'JsonSetter', defaultValue: [], // supportVariable: true, }, { name: 'asciiSort', title: '排序方式', display: 'inline', setter: { componentName: 'RadioGroupSetter', props: { options: [ { title: '前端排序', value: true }, { title: '后端排序', value: false }, ], }, }, }, { name: 'rowDetail', title: '行详情(自定义行展示内容)', display: 'plain', setter: { componentName: 'ObjectSetter', props: { config: { items: [ { title: '行详情组件', name: 'renderDetail', setter: { componentName: 'CnSelectSetter', props: () => { return { options: getItemListByPosition({ position: DisplayPosition.tableRowDetail, componentMap: {}, }), selectProps: { hasClear: true, }, }; }, }, }, ], }, }, }, }, { name: 'rowProps', title: '自定义行属性 rowProps', display: 'inline', setter: { componentName: 'CnJSXSetter', props: { label: '编写rowProps回调', usePopup: true, enableFullscreen: true, theme: 'vs', }, initialValue: { type: 'js', source: 'function rowProps(record, index, state) { \n return {}; \n}', compiled: 'function main(){\n \n "use strict";\n\nvar __compiledFunc__ = function rowProps(record, index, state) {\n return {}; \n};\n return __compiledFunc__.apply(this, arguments);\n }', error: {}, }, }, }, { name: 'cellProps', title: '自定义单元格 cellProps', display: 'inline', setter: { componentName: 'CnJSXSetter', props: { label: '编写cellProps回调', usePopup: true, enableFullscreen: true, theme: 'vs', }, initialValue: { type: 'js', source: 'function cellProps(rowIndex, colIndex, key, rowData) { \n return {}; \n}', compiled: 'function main(){\n \n "use strict";\n\nvar __compiledFunc__ = function content() {\n return {}; \n};\n return __compiledFunc__.apply(this, arguments);\n }', error: {}, }, }, }, { name: 'onGetStorage', title: '获取习惯(onGetStorage)', display: 'inline', setter: ( <ActionSetter supportTypes={['page']} defaultCode={`/** * onGetStorage * */ function onGetStorage() { }`} defaultActionName='onGetStorage' /> ), }, { name: 'onSetStorage', title: '设置习惯(onSetStorage)', display: 'inline', setter: ( <ActionSetter supportTypes={['page']} defaultCode={`/** * onSetStorage * * @param tableConfig */ function onSetStorage(tableConfig) { }`} defaultActionName='onSetStorage' /> ), }, { name: 'handleProps', title: '手动设置组件props', display: 'inline', setter: getJSExpressionPrototype({ type: 'props', }), }, ], }, { name: '_fixDataSource', display: 'plain', defaultValue(field) { if (field) { const node = field.getNode(); const _dataSource = node?.getPropValue('_dataSource'); const _dataSourceName = node?.getPropValue('_dataSourceName'); if (!_dataSource && !_dataSourceName) { const ds = generateDataSource({ componentName: 'CnTable' }); if (ds?.name) { node?.setPropValue?.('_dataSourceName', ds.name); node?.setPropValue?.('_dataSource', { type: 'variable', variable: `state.${ds.name}`, }); } } } }, initialValue() {}, setter() { return <div className='' />; }, }, // { // type: 'group', // title: '高级', // display: 'accordion', // collapsed: true, // items: [ // uuid('CnTable'), // ...events([ // { // name: 'onSort', // title: '排序时触发', // initialValue: `/** // * cn-table onSort // * @param dataIndex 触发排序的列 // * @param type 排序方式(desc,asc) // */ // function onSort(dataIndex, type) { // // 前端排序 // return true; // // 自定义排序 do sth // // return false; // }`, // }, // { // name: 'onPageChange', // title: '翻页时触发', // initialValue: `/** // * cn-table onPageChange // * @param pageInfo Object 分页信息 // */ // function onPageChange(pageInfo) { // console.log(pageInfo); // }`, // }, // { // name: 'loadingChange', // title: '加载状态变化时触发', // initialValue: `/** // * cn-table loadingChange // */ // function loadingChange() { // console.log('loading'); // }`, // }, // ]), // ], // }, ], }), ];