diff --git a/packages/core/client/src/collection-manager/CollectionField.tsx b/packages/core/client/src/collection-manager/CollectionField.tsx index aa68cd873..8b226b9f6 100644 --- a/packages/core/client/src/collection-manager/CollectionField.tsx +++ b/packages/core/client/src/collection-manager/CollectionField.tsx @@ -11,7 +11,9 @@ import { useCollectionField } from './hooks'; const InternalField: React.FC = (props) => { const field = useField(); const fieldSchema = useFieldSchema(); - const { name, interface: interfaceType, uiSchema } = useCollectionField(); + const { name, interface: interfaceType, uiSchema, defaultValue } = useCollectionField(); + const collectionField = useCollectionField(); + const component = useComponent(uiSchema?.['x-component']); const compile = useCompile(); const setFieldProps = (key, value) => { @@ -38,7 +40,10 @@ const InternalField: React.FC = (props) => { setFieldProps('content', uiSchema['x-content']); setFieldProps('title', uiSchema.title); setFieldProps('description', uiSchema.description); - setFieldProps('initialValue', uiSchema.default); + if (ctx?.form) { + setFieldProps('initialValue', fieldSchema.default || defaultValue); + } + if (!field.validator && (uiSchema['x-validator'] || fieldSchema['x-validator'])) { const concatSchema = concat([], uiSchema['x-validator'] || [], fieldSchema['x-validator'] || []); field.validator = concatSchema; diff --git a/packages/core/client/src/collection-manager/Configuration/AddFieldAction.tsx b/packages/core/client/src/collection-manager/Configuration/AddFieldAction.tsx index 10ddbb300..f6bd28e6c 100644 --- a/packages/core/client/src/collection-manager/Configuration/AddFieldAction.tsx +++ b/packages/core/client/src/collection-manager/Configuration/AddFieldAction.tsx @@ -19,7 +19,15 @@ const getSchema = (schema: IField, record: any, compile): ISchema => { if (!schema) { return; } + const properties = cloneDeep(schema.properties) as any; + + if (schema.hasDefaultValue === true) { + properties['defaultValue'] = cloneDeep(schema.default.uiSchema); + properties['defaultValue']['title'] = compile('{{ t("Default value") }}'); + properties['defaultValue']['x-decorator'] = 'FormItem'; + } + const initialValue = { name: `f_${uid()}`, ...cloneDeep(schema.default), diff --git a/packages/core/client/src/collection-manager/Configuration/EditFieldAction.tsx b/packages/core/client/src/collection-manager/Configuration/EditFieldAction.tsx index 7410e54e1..227b5a4da 100644 --- a/packages/core/client/src/collection-manager/Configuration/EditFieldAction.tsx +++ b/packages/core/client/src/collection-manager/Configuration/EditFieldAction.tsx @@ -19,6 +19,13 @@ const getSchema = (schema: IField, record: any, compile): ISchema => { } const properties = cloneDeep(schema.properties) as any; properties.name['x-disabled'] = true; + + if (schema.hasDefaultValue === true) { + properties['defaultValue'] = cloneDeep(schema.default.uiSchema); + properties['defaultValue']['title'] = compile('{{ t("Default value") }}'); + properties['defaultValue']['x-decorator'] = 'FormItem'; + } + return { type: 'object', properties: { diff --git a/packages/core/client/src/collection-manager/interfaces/checkbox.ts b/packages/core/client/src/collection-manager/interfaces/checkbox.ts index bc5480148..3792a1794 100644 --- a/packages/core/client/src/collection-manager/interfaces/checkbox.ts +++ b/packages/core/client/src/collection-manager/interfaces/checkbox.ts @@ -15,6 +15,7 @@ export const checkbox: IField = { 'x-component': 'Checkbox', }, }, + hasDefaultValue: true, properties: { ...defaultProps, }, diff --git a/packages/core/client/src/collection-manager/interfaces/checkboxGroup.ts b/packages/core/client/src/collection-manager/interfaces/checkboxGroup.ts index 2df5602f8..a59e33ac1 100644 --- a/packages/core/client/src/collection-manager/interfaces/checkboxGroup.ts +++ b/packages/core/client/src/collection-manager/interfaces/checkboxGroup.ts @@ -17,6 +17,7 @@ export const checkboxGroup: IField = { 'x-component': 'Checkbox.Group', }, }, + hasDefaultValue: true, properties: { ...defaultProps, 'uiSchema.enum': dataSource, diff --git a/packages/core/client/src/collection-manager/interfaces/datetime.ts b/packages/core/client/src/collection-manager/interfaces/datetime.ts index ddf582b61..c21b630b5 100644 --- a/packages/core/client/src/collection-manager/interfaces/datetime.ts +++ b/packages/core/client/src/collection-manager/interfaces/datetime.ts @@ -20,6 +20,7 @@ export const datetime: IField = { }, }, }, + hasDefaultValue: true, properties: { ...defaultProps, ...dateTimeProps, diff --git a/packages/core/client/src/collection-manager/interfaces/email.ts b/packages/core/client/src/collection-manager/interfaces/email.ts index 25c4ef687..4ae298ab4 100644 --- a/packages/core/client/src/collection-manager/interfaces/email.ts +++ b/packages/core/client/src/collection-manager/interfaces/email.ts @@ -18,6 +18,7 @@ export const email: IField = { 'x-validator': 'email', }, }, + hasDefaultValue: true, properties: { ...defaultProps, }, diff --git a/packages/core/client/src/collection-manager/interfaces/icon.ts b/packages/core/client/src/collection-manager/interfaces/icon.ts index 89bb0b5f8..3056375b4 100644 --- a/packages/core/client/src/collection-manager/interfaces/icon.ts +++ b/packages/core/client/src/collection-manager/interfaces/icon.ts @@ -16,6 +16,7 @@ export const icon: IField = { 'x-component': 'IconPicker', }, }, + hasDefaultValue: true, properties: { ...defaultProps, }, diff --git a/packages/core/client/src/collection-manager/interfaces/input.ts b/packages/core/client/src/collection-manager/interfaces/input.ts index 23aa2ffe9..42f80008b 100644 --- a/packages/core/client/src/collection-manager/interfaces/input.ts +++ b/packages/core/client/src/collection-manager/interfaces/input.ts @@ -18,6 +18,7 @@ export const input: IField = { 'x-component': 'Input', }, }, + hasDefaultValue: true, properties: { ...defaultProps, }, diff --git a/packages/core/client/src/collection-manager/interfaces/integer.ts b/packages/core/client/src/collection-manager/interfaces/integer.ts index 074df86a7..98c12beeb 100644 --- a/packages/core/client/src/collection-manager/interfaces/integer.ts +++ b/packages/core/client/src/collection-manager/interfaces/integer.ts @@ -30,6 +30,7 @@ export const integer: IField = { 'x-validator': 'integer', }, }, + hasDefaultValue: true, properties: { ...defaultProps, }, diff --git a/packages/core/client/src/collection-manager/interfaces/markdown.ts b/packages/core/client/src/collection-manager/interfaces/markdown.ts index 0495c76b4..5788ce698 100644 --- a/packages/core/client/src/collection-manager/interfaces/markdown.ts +++ b/packages/core/client/src/collection-manager/interfaces/markdown.ts @@ -17,6 +17,7 @@ export const markdown: IField = { 'x-component': 'Markdown', }, }, + hasDefaultValue: true, properties: { ...defaultProps, }, diff --git a/packages/core/client/src/collection-manager/interfaces/multipleSelect.ts b/packages/core/client/src/collection-manager/interfaces/multipleSelect.ts index c3c940852..00c8b733e 100644 --- a/packages/core/client/src/collection-manager/interfaces/multipleSelect.ts +++ b/packages/core/client/src/collection-manager/interfaces/multipleSelect.ts @@ -21,6 +21,7 @@ export const multipleSelect: IField = { enum: [], }, }, + hasDefaultValue: true, properties: { ...defaultProps, 'uiSchema.enum': dataSource, diff --git a/packages/core/client/src/collection-manager/interfaces/number.ts b/packages/core/client/src/collection-manager/interfaces/number.ts index 3f441511e..99ea17623 100644 --- a/packages/core/client/src/collection-manager/interfaces/number.ts +++ b/packages/core/client/src/collection-manager/interfaces/number.ts @@ -24,6 +24,7 @@ export const number: IField = { }, }, }, + hasDefaultValue: true, properties: { ...defaultProps, 'uiSchema.x-component-props.step': { diff --git a/packages/core/client/src/collection-manager/interfaces/password.ts b/packages/core/client/src/collection-manager/interfaces/password.ts index 3eceb0800..d4b4a13fb 100644 --- a/packages/core/client/src/collection-manager/interfaces/password.ts +++ b/packages/core/client/src/collection-manager/interfaces/password.ts @@ -18,6 +18,7 @@ export const password: IField = { 'x-component': 'Password', }, }, + hasDefaultValue: true, properties: { ...defaultProps, }, diff --git a/packages/core/client/src/collection-manager/interfaces/percent.ts b/packages/core/client/src/collection-manager/interfaces/percent.ts index d7c3c27ee..4d483d691 100644 --- a/packages/core/client/src/collection-manager/interfaces/percent.ts +++ b/packages/core/client/src/collection-manager/interfaces/percent.ts @@ -68,6 +68,7 @@ export const percent: IField = { }, }, }, + hasDefaultValue: true, properties: { ...defaultProps, 'uiSchema.x-component-props.step': { diff --git a/packages/core/client/src/collection-manager/interfaces/phone.ts b/packages/core/client/src/collection-manager/interfaces/phone.ts index 54955a4f5..6de65d589 100644 --- a/packages/core/client/src/collection-manager/interfaces/phone.ts +++ b/packages/core/client/src/collection-manager/interfaces/phone.ts @@ -21,6 +21,7 @@ export const phone: IField = { // 'x-validator': 'phone', }, }, + hasDefaultValue: true, properties: { ...defaultProps, }, diff --git a/packages/core/client/src/collection-manager/interfaces/radioGroup.ts b/packages/core/client/src/collection-manager/interfaces/radioGroup.ts index 49e529290..a7205e3b3 100644 --- a/packages/core/client/src/collection-manager/interfaces/radioGroup.ts +++ b/packages/core/client/src/collection-manager/interfaces/radioGroup.ts @@ -17,6 +17,7 @@ export const radioGroup: IField = { 'x-component': 'Radio.Group', }, }, + hasDefaultValue: true, properties: { ...defaultProps, 'uiSchema.enum': dataSource, diff --git a/packages/core/client/src/collection-manager/interfaces/richText.ts b/packages/core/client/src/collection-manager/interfaces/richText.ts index 49903cd61..c10ba28a4 100644 --- a/packages/core/client/src/collection-manager/interfaces/richText.ts +++ b/packages/core/client/src/collection-manager/interfaces/richText.ts @@ -18,6 +18,7 @@ export const richText: IField = { 'x-component': 'RichText', }, }, + hasDefaultValue: true, properties: { ...defaultProps, }, diff --git a/packages/core/client/src/collection-manager/interfaces/select.ts b/packages/core/client/src/collection-manager/interfaces/select.ts index 7a59ed425..26031e80e 100644 --- a/packages/core/client/src/collection-manager/interfaces/select.ts +++ b/packages/core/client/src/collection-manager/interfaces/select.ts @@ -18,6 +18,7 @@ export const select: IField = { enum: [], }, }, + hasDefaultValue: true, properties: { ...defaultProps, 'uiSchema.enum': dataSource, diff --git a/packages/core/client/src/collection-manager/interfaces/textarea.ts b/packages/core/client/src/collection-manager/interfaces/textarea.ts index e8bc46451..3abf3888b 100644 --- a/packages/core/client/src/collection-manager/interfaces/textarea.ts +++ b/packages/core/client/src/collection-manager/interfaces/textarea.ts @@ -18,6 +18,7 @@ export const textarea: IField = { 'x-component': 'Input.TextArea', }, }, + hasDefaultValue: true, properties: { ...defaultProps, }, diff --git a/packages/core/client/src/collection-manager/interfaces/time.ts b/packages/core/client/src/collection-manager/interfaces/time.ts index dfb91af5c..78a1f2bed 100644 --- a/packages/core/client/src/collection-manager/interfaces/time.ts +++ b/packages/core/client/src/collection-manager/interfaces/time.ts @@ -16,6 +16,7 @@ export const time: IField = { 'x-component': 'TimePicker', }, }, + hasDefaultValue: true, properties: { ...defaultProps, 'uiSchema.x-component-props.format': { diff --git a/packages/core/client/src/locale/zh_CN.ts b/packages/core/client/src/locale/zh_CN.ts index 8a8aff421..f8e8eacf0 100644 --- a/packages/core/client/src/locale/zh_CN.ts +++ b/packages/core/client/src/locale/zh_CN.ts @@ -255,6 +255,8 @@ export default { "The field value cannot be greater than ": "数值不能大于", "The field value cannot be less than ": "数值不能小于", "The field value is not an integer number": "数字不是整数", + "Set default value": "设置默认值", + "Default value": "默认值", "is before": "早于", "is after": "晚于", diff --git a/packages/core/client/src/schema-component/antd/form-item/FormItem.tsx b/packages/core/client/src/schema-component/antd/form-item/FormItem.tsx index 56db52a9a..3f0d1a4a1 100644 --- a/packages/core/client/src/schema-component/antd/form-item/FormItem.tsx +++ b/packages/core/client/src/schema-component/antd/form-item/FormItem.tsx @@ -326,6 +326,39 @@ FormItem.Designer = (props) => { }} /> )} + {form && !form?.readPretty && collectionField?.uiSchema?.type && ( + { + const schema: ISchema = { + ['x-uid']: fieldSchema['x-uid'], + }; + if (field.value !== v.default) { + field.value = v.default; + } + fieldSchema.default = v.default; + schema.default = v.default; + dn.emit('patch', { + schema, + }); + refresh(); + }} + /> + )} {form && !isSubFormAssocitionField && ['o2o', 'oho', 'obo', 'o2m'].includes(collectionField?.interface) && ( { + let app: MockServer; + + beforeEach(async () => { + app = await createApp(); + await app.install({ clean: true }); + await app.start(); + await app + .agent() + .resource('collections') + .create({ + values: { + name: 'test1', + }, + }); + }); + + afterEach(async () => { + await app.destroy(); + }); + + it('should be updated', async () => { + await app + .agent() + .resource('collections.fields', 'test1') + .create({ + values: { + name: 'field1', + type: 'string', + defaultValue: 'abc', + }, + }); + const response1 = await app.agent().resource('test1').create(); + expect(response1.body.data.field1).toBe('abc'); + await app + .agent() + .resource('collections.fields', 'test1') + .update({ + filterByTk: 'field1', + values: { + type: 'string', + defaultValue: 'cba', + }, + }); + const response2 = await app.agent().resource('test1').create(); + expect(response2.body.data.field1).toBe('cba'); + }); +}); diff --git a/packages/plugins/collection-manager/src/server.ts b/packages/plugins/collection-manager/src/server.ts index 954eec689..7f88019ed 100644 --- a/packages/plugins/collection-manager/src/server.ts +++ b/packages/plugins/collection-manager/src/server.ts @@ -70,6 +70,12 @@ export class CollectionManagerPlugin extends Plugin { } }); + this.app.db.on('fields.afterUpdateWithAssociations', async (model, { context, transaction }) => { + if (context) { + await model.load({ transaction }); + } + }); + this.app.db.on('fields.afterCreateWithAssociations', async (model, { context, transaction }) => { if (context) { await model.load({ transaction });