From 4c3255d455bfce66b398da4b413f17a13b2cae89 Mon Sep 17 00:00:00 2001 From: Junyi Date: Tue, 1 Apr 2025 13:25:08 +0800 Subject: [PATCH] feat(database): add trim option for string field (#6565) * feat(database): add trim option for string field * refactor(database): change to setDataValue instead of hooks * fix(database): fix test case of view collection --- .../src/collection-manager/interfaces/input.ts | 6 ++++++ packages/core/client/src/locale/zh-CN.json | 1 + .../src/__tests__/fields/string-field.test.ts | 14 ++++++++++++++ packages/core/database/src/fields/string-field.ts | 13 ++++++++++++- 4 files changed, 33 insertions(+), 1 deletion(-) diff --git a/packages/core/client/src/collection-manager/interfaces/input.ts b/packages/core/client/src/collection-manager/interfaces/input.ts index ac5897adb7..40d131e5be 100644 --- a/packages/core/client/src/collection-manager/interfaces/input.ts +++ b/packages/core/client/src/collection-manager/interfaces/input.ts @@ -62,6 +62,12 @@ export class InputFieldInterface extends CollectionFieldInterface { hasDefaultValue = true; properties = { ...defaultProps, + trim: { + type: 'boolean', + 'x-content': '{{t("Automatically remove heading and tailing spaces")}}', + 'x-decorator': 'FormItem', + 'x-component': 'Checkbox', + }, layout: { type: 'void', title: '{{t("Index")}}', diff --git a/packages/core/client/src/locale/zh-CN.json b/packages/core/client/src/locale/zh-CN.json index ee7937d066..6c245aecf1 100644 --- a/packages/core/client/src/locale/zh-CN.json +++ b/packages/core/client/src/locale/zh-CN.json @@ -258,6 +258,7 @@ "Parent collection fields": "父表字段", "Basic": "基本类型", "Single line text": "单行文本", + "Automatically remove heading and tailing spaces": "自动去除首尾空白字符", "Long text": "多行文本", "Phone": "手机号码", "Email": "电子邮箱", diff --git a/packages/core/database/src/__tests__/fields/string-field.test.ts b/packages/core/database/src/__tests__/fields/string-field.test.ts index ee4f3e631d..ff095bc862 100644 --- a/packages/core/database/src/__tests__/fields/string-field.test.ts +++ b/packages/core/database/src/__tests__/fields/string-field.test.ts @@ -105,4 +105,18 @@ describe('string field', () => { name2: 'n2111', }); }); + + it('trim', async () => { + const collection = db.collection({ + name: 'tests', + fields: [{ type: 'string', name: 'name', trim: true }], + }); + await db.sync(); + const model = await collection.model.create({ + name: ' n1\n ', + }); + expect(model.toJSON()).toMatchObject({ + name: 'n1', + }); + }); }); diff --git a/packages/core/database/src/fields/string-field.ts b/packages/core/database/src/fields/string-field.ts index 50431f0565..627768beeb 100644 --- a/packages/core/database/src/fields/string-field.ts +++ b/packages/core/database/src/fields/string-field.ts @@ -8,7 +8,7 @@ */ import { DataTypes } from 'sequelize'; -import { BaseColumnFieldOptions, Field } from './field'; +import { BaseColumnFieldOptions, Field, FieldContext } from './field'; export class StringField extends Field { get dataType() { @@ -18,9 +18,20 @@ export class StringField extends Field { return DataTypes.STRING; } + + additionalSequelizeOptions() { + const { name, trim } = this.options; + + return { + set(value) { + this.setDataValue(name, trim ? value?.trim() : value); + }, + }; + } } export interface StringFieldOptions extends BaseColumnFieldOptions { type: 'string'; length?: number; + trim?: boolean; }