import { uid } from '@formily/shared';
import {
ArrayTable,
Input,
SchemaComponent,
SchemaComponentProvider,
SchemaInitializerItemOptions,
SchemaInitializerProvider
} from '@nocobase/client';
import React from 'react';
const removeColumn = (schema, cb) => {
cb(schema, {
removeParentsIfNoChildren: true,
breakRemoveOn: {
'x-component': 'ArrayTable',
},
});
};
const useTableColumnInitializerFields = () => {
const fields: SchemaInitializerItemOptions[] = [
{
type: 'item',
title: 'Name',
remove: removeColumn,
schema: {
name: 'name',
type: 'string',
title: 'Name',
'x-collection-field': 'posts.name',
'x-component': 'Input',
'x-read-pretty': true,
},
component: 'CollectionFieldInitializer',
},
{
type: 'item',
title: 'Title',
remove: removeColumn,
schema: {
name: 'title',
type: 'string',
title: 'Title',
'x-collection-field': 'posts.title',
'x-component': 'Input',
'x-read-pretty': true,
},
component: 'CollectionFieldInitializer',
},
];
return fields;
};
const columnWrap = (s) => {
return {
name: [uid()],
type: 'void',
title: s.title,
'x-component': 'ArrayTable.Column',
properties: {
[s.name]: {
...s,
},
},
};
};
// 因为有个动态获取字段的 hook,所以这里将 SchemaInitializerProvider 自定义的处理了一下
const CustomSchemaInitializerProvider: React.FC = (props) => {
const initializers = {
AddColumn: {
insertPosition: 'beforeEnd',
title: 'Configure columns',
wrap: columnWrap,
items: [
{
type: 'itemGroup',
title: 'Display fields',
children: useTableColumnInitializerFields(),
},
],
},
};
return {props.children};
};
const schema = {
type: 'object',
properties: {
input: {
type: 'array',
default: [
{ id: 1, name: 'Name1' },
{ id: 2, name: 'Name2' },
{ id: 3, name: 'Name3' },
],
'x-component': 'ArrayTable',
'x-initializer': 'AddColumn',
'x-component-props': {
rowKey: 'id',
},
properties: {
column1: {
type: 'void',
title: 'Name',
'x-component': 'ArrayTable.Column',
properties: {
name: {
type: 'string',
'x-component': 'Input',
'x-collection-field': 'posts.name',
'x-read-pretty': true,
},
},
},
},
},
},
};
export default function App() {
return (
);
}