-
+
+
+
+
{isEditDataModelFieldAvailable ? (
-
-
-
-
-
+
) : null}
);
@@ -354,9 +360,10 @@ function FormatDescription({ description }: { description: string }) {
return (
{description || t('data:empty_description')}
diff --git a/packages/app-builder/src/locales/ar/data.json b/packages/app-builder/src/locales/ar/data.json
index 5dc6e382f1..d67ab9cead 100644
--- a/packages/app-builder/src/locales/ar/data.json
+++ b/packages/app-builder/src/locales/ar/data.json
@@ -11,7 +11,7 @@
"create_field.name_reserved_error": "الاسم \"id\" محجوز",
"create_field.option_optional": "اختياري",
"create_field.option_required": "متطلب",
- "create_field.required": "المتطلب",
+ "create_field.option_required_warning": "يرجى الحذر عند إضافة حقل مطلوب على جدول فعال. إذا كنت تقوم بالفعل بإدخال البيانات أو إنشاء قرارات عبر الواجهة، سيفشل ذلك عند إضافة حقل مطلوب. نوصي بإنشاء الحقل أولاً كاختياري، إضافته إلى المصدر، ثم تحديده كمطلوب.",
"create_field.title": "انشاء حقل جديد",
"create_field.type": "النوع",
"create_field.type_bool": "منطقي",
@@ -74,10 +74,8 @@
"link_name": "الاسم",
"links_from_table": "روابط من إلى عناصر أخرى من
{{tableName}}",
"menu.create_pivot.label": "تجميع القرارات حسب...",
- "nullable": "يمكن أن يكون الحقل فارغ",
"parent_field_name": "اسم الحقل للجدول الرئيسي",
"parent_table": "جدول ذو صله",
- "required": "متطلب",
"table_relationship": "العلاقة",
"unique.col_header": "فريد",
"upload_data": "رفع البيانات",
diff --git a/packages/app-builder/src/locales/en/data.json b/packages/app-builder/src/locales/en/data.json
index 5f855799ac..a28c648dcc 100644
--- a/packages/app-builder/src/locales/en/data.json
+++ b/packages/app-builder/src/locales/en/data.json
@@ -11,7 +11,7 @@
"create_field.name_reserved_error": "The name \"id\" is reserved",
"create_field.option_optional": "Optional",
"create_field.option_required": "Required",
- "create_field.required": "Required",
+ "create_field.option_required_warning": "Be careful when adding a required field on an active table. If you are already ingesting data or creating decisions via API, they will fail when you add a required field. We recommend you first create the field as optional, add it to your ingestion pipeline, and then mark it as required.",
"create_field.title": "Create a new field",
"create_field.type": "Type",
"create_field.type_bool": "Boolean",
@@ -74,10 +74,8 @@
"link_name": "Name",
"links_from_table": "Links from to other entities from
{{tableName}}",
"menu.create_pivot.label": "Group decisions by...",
- "nullable": "Nullable",
"parent_field_name": "Parent table field name",
"parent_table": "Related table",
- "required": "Required",
"table_relationship": "Relationship",
"unique.col_header": "Unique",
"upload_data": "Upload data",
diff --git a/packages/app-builder/src/locales/fr/data.json b/packages/app-builder/src/locales/fr/data.json
index 4ef9ba91f4..558fc284e0 100644
--- a/packages/app-builder/src/locales/fr/data.json
+++ b/packages/app-builder/src/locales/fr/data.json
@@ -11,7 +11,7 @@
"create_field.name_reserved_error": "Le nom \"id\" est réservé",
"create_field.option_optional": "Facultatif",
"create_field.option_required": "Requis",
- "create_field.required": "Requis",
+ "create_field.option_required_warning": "Faites attention lors de l'ajout d'un champ requis sur une table déjà utilisée. Si vous ingérez déjà des données ou créez des décisions par API, celles-ci échoueront si vous ajoutez un champ requis. Nous vous recommandons de créer d'abord le champ comme facultatif, de l'ajouter à votre pipeline d'ingestion, puise de le marquer comme requis.",
"create_field.title": "Créer un nouveau champ",
"create_field.type": "Type",
"create_field.type_bool": "Booléen",
@@ -74,10 +74,8 @@
"link_name": "Nom",
"links_from_table": "Liens vers d'autres entités de
{{tableName}}",
"menu.create_pivot.label": "Regrouper les décisions par...",
- "nullable": "Nullable",
"parent_field_name": "Nom du champ de la table parent",
"parent_table": "Table associée",
- "required": "Requis",
"table_relationship": "Relation",
"unique.col_header": "Unique",
"upload_data": "Téléverser des données",
diff --git a/packages/app-builder/src/models/data-model.ts b/packages/app-builder/src/models/data-model.ts
index 047f70f078..f2c221066d 100644
--- a/packages/app-builder/src/models/data-model.ts
+++ b/packages/app-builder/src/models/data-model.ts
@@ -247,6 +247,7 @@ export interface UpdateFieldInput {
description?: string;
isEnum?: boolean;
isUnique?: boolean;
+ isNullable?: boolean;
}
export function adaptUpdateFieldDto(updateFieldInput: UpdateFieldInput): UpdateTableFieldDto {
@@ -254,6 +255,7 @@ export function adaptUpdateFieldDto(updateFieldInput: UpdateFieldInput): UpdateT
description: updateFieldInput.description,
is_enum: updateFieldInput.isEnum,
is_unique: updateFieldInput.isUnique,
+ is_nullable: updateFieldInput.isNullable,
};
}
diff --git a/packages/app-builder/src/queries/data/edit-field.ts b/packages/app-builder/src/queries/data/edit-field.ts
index 31625a0a69..f48154da84 100644
--- a/packages/app-builder/src/queries/data/edit-field.ts
+++ b/packages/app-builder/src/queries/data/edit-field.ts
@@ -7,6 +7,7 @@ export const editFieldPayloadSchema = z.object({
fieldId: z.uuid(),
isEnum: z.boolean(),
isUnique: z.boolean(),
+ required: z.enum(['optional', 'required']),
});
export type EditFieldPayload = z.infer
;
diff --git a/packages/app-builder/src/routes/ressources+/data+/editField.tsx b/packages/app-builder/src/routes/ressources+/data+/editField.tsx
index 0137a72640..92df29470a 100644
--- a/packages/app-builder/src/routes/ressources+/data+/editField.tsx
+++ b/packages/app-builder/src/routes/ressources+/data+/editField.tsx
@@ -23,13 +23,14 @@ export async function action({ request }: ActionFunctionArgs) {
const { success, error, data } = editFieldPayloadSchema.safeParse(raw);
if (!success) return json({ success: 'false', errors: z.treeifyError(error) });
- const { description, fieldId, isEnum, isUnique } = data;
+ const { description, fieldId, isEnum, isUnique, required } = data;
try {
await dataModelRepository.patchDataModelField(fieldId, {
description,
isEnum,
isUnique,
+ isNullable: required === 'optional',
});
return json({ success: 'true', errors: [] });
diff --git a/packages/marble-api/openapis/marblecore-api/data-model.yml b/packages/marble-api/openapis/marblecore-api/data-model.yml
index 90a56f2e5e..7dbb7ca3f0 100644
--- a/packages/marble-api/openapis/marblecore-api/data-model.yml
+++ b/packages/marble-api/openapis/marblecore-api/data-model.yml
@@ -575,6 +575,8 @@ components:
type: boolean
is_unique:
type: boolean
+ is_nullable:
+ type: boolean
CreateTableLinkBody:
type: object
required:
diff --git a/packages/marble-api/src/generated/marblecore-api.ts b/packages/marble-api/src/generated/marblecore-api.ts
index 0b136b995f..c1cd1fd067 100644
--- a/packages/marble-api/src/generated/marblecore-api.ts
+++ b/packages/marble-api/src/generated/marblecore-api.ts
@@ -1020,6 +1020,7 @@ export type UpdateTableFieldDto = {
description?: string;
is_enum?: boolean;
is_unique?: boolean;
+ is_nullable?: boolean;
};
export type CreateTableLinkBody = {
name: string;