import { ArrayTable, FormButtonGroup, FormDrawer, FormLayout, Submit } from '@formily/antd-v5'; import { onFieldValueChange } from '@formily/core'; import { ISchema, SchemaOptionsContext, useForm, useFormEffects } from '@formily/react'; import { Cron, IField, SchemaComponent, SchemaComponentOptions, css, interfacesProperties, useCompile, } from '@nocobase/client'; import { error } from '@nocobase/utils/client'; import { Button, Select } from 'antd'; import React, { useContext } from 'react'; import { useTranslation } from 'react-i18next'; import { NAMESPACE, lang } from './locale'; function RuleTypeSelect(props) { const compile = useCompile(); const { setValuesIn } = useForm(); const index = ArrayTable.useIndex(); useFormEffects(() => { onFieldValueChange(`patterns.${index}.type`, (field) => { setValuesIn(`patterns.${index}.options`, {}); }); }); return ( ); } function RuleOptions() { const { type, options } = ArrayTable.useRecord(); const ruleType = RuleTypes[type]; const compile = useCompile(); return (
{options.value}
;
},
},
fieldset: {
value: {
type: 'string',
title: `{{t("Text content", { ns: "${NAMESPACE}" })}}`,
'x-decorator': 'FormItem',
'x-component': 'Input',
},
},
},
integer: {
title: `{{t("Autoincrement", { ns: "${NAMESPACE}" })}}`,
optionRenders: {
digits: function Digits({ value }) {
const { t } = useTranslation();
return {t('{{value}} Digits', { ns: NAMESPACE, value })};
},
start: function Start({ value }) {
const { t } = useTranslation();
return {t('Starts from {{value}}', { ns: NAMESPACE, value })};
},
cycle: function Cycle({ value }) {
return (
{options.value}
;
},
},
},
};
export function RuleConfigForm() {
const { t } = useTranslation();
const compile = useCompile();
const schemaOptions = useContext(SchemaOptionsContext);
const form = useForm();
const { type, options } = ArrayTable.useRecord();
const index = ArrayTable.useIndex();
const ruleType = RuleTypes[type];
return ruleType?.fieldset ? (
) : null;
}
export const sequence: IField = {
name: 'sequence',
type: 'object',
group: 'advanced',
order: 3,
title: `{{t("Sequence", { ns: "${NAMESPACE}" })}}`,
sortable: true,
default: {
type: 'sequence',
uiSchema: {
type: 'string',
'x-component': 'Input',
'x-component-props': {},
},
},
hasDefaultValue: false,
filterable: {
operators: interfacesProperties.operators.string,
},
titleUsable: true,
schemaInitialize(schema: ISchema, { block, field }) {
if (block === 'Form') {
Object.assign(schema['x-component-props'], {
disabled: !field.inputable,
});
}
return schema;
},
properties: {
...interfacesProperties.defaultProps,
unique: interfacesProperties.unique,
patterns: {
type: 'array',
title: `{{t("Sequence rules", { ns: "${NAMESPACE}" })}}`,
required: true,
'x-decorator': 'FormItem',
'x-component': 'ArrayTable',
items: {
type: 'object',
properties: {
sort: {
type: 'void',
'x-component': 'ArrayTable.Column',
'x-component-props': { width: 50, title: '', align: 'center' },
properties: {
sort: {
type: 'void',
'x-component': 'ArrayTable.SortHandle',
},
},
},
type: {
type: 'void',
'x-component': 'ArrayTable.Column',
'x-component-props': { title: `{{t("Type", { ns: "${NAMESPACE}" })}}` },
// 'x-hidden': true,
properties: {
type: {
type: 'string',
name: 'type',
required: true,
'x-decorator': 'FormItem',
'x-component': RuleTypeSelect,
},
},
},
options: {
type: 'void',
'x-component': 'ArrayTable.Column',
'x-component-props': { title: `{{t("Rule content", { ns: "${NAMESPACE}" })}}` },
properties: {
options: {
type: 'object',
name: 'options',
'x-component': RuleOptions,
},
},
},
operations: {
type: 'void',
'x-component': 'ArrayTable.Column',
'x-component-props': {
title: `{{t("Operations", { ns: "${NAMESPACE}" })}}`,
dataIndex: 'operations',
fixed: 'right',
className: css`
> *:not(:last-child) {
margin-right: 0.5em;
}
button {
padding: 0;
}
`,
},
properties: {
config: {
type: 'void',
properties: {
options: {
type: 'object',
'x-component': RuleConfigForm,
},
},
},
remove: {
type: 'void',
'x-component': 'ArrayTable.Remove',
},
},
},
},
},
properties: {
add: {
type: 'void',
'x-component': 'ArrayTable.Addition',
'x-component-props': {
defaultValue: { type: 'integer', options: { digits: 1, start: 0 } },
},
title: `{{t("Add rule", { ns: "${NAMESPACE}" })}}`,
},
},
},
inputable: {
type: 'boolean',
title: `{{t("Inputable", { ns: "${NAMESPACE}" })}}`,
'x-decorator': 'FormItem',
'x-component': 'Checkbox',
},
match: {
type: 'boolean',
title: `{{t("Match rules", { ns: "${NAMESPACE}" })}}`,
'x-decorator': 'FormItem',
'x-component': 'Checkbox',
'x-reactions': {
dependencies: ['inputable'],
fulfill: {
state: {
value: '{{$deps[0] && $self.value}}',
visible: '{{$deps[0] === true}}',
},
},
},
},
},
};