From 16e7431d835c8bcde5c58f3b899e433e71ad5232 Mon Sep 17 00:00:00 2001 From: Mohamed Marrouchi Date: Tue, 24 Sep 2024 07:59:59 +0100 Subject: [PATCH] feat: add RTL attr --- .../default/__test__/__mock__/base.mock.ts | 2 +- .../controllers/language.controller.spec.ts | 6 ++--- .../i18n/controllers/language.controller.ts | 8 +++--- api/src/i18n/dto/language.dto.ts | 7 +++++- api/src/i18n/schemas/language.schema.ts | 8 +++++- api/src/i18n/seeds/language.seed-model.ts | 4 +-- api/src/i18n/services/language.service.ts | 2 +- api/src/utils/test/fixtures/language.ts | 6 +++-- .../components/languages/LanguageDialog.tsx | 25 +++++++++++++++++-- frontend/src/components/languages/index.tsx | 21 +++++++++++----- frontend/src/i18n/en/translation.json | 3 ++- frontend/src/i18n/fr/translation.json | 3 ++- frontend/src/types/language.types.ts | 3 ++- 13 files changed, 72 insertions(+), 26 deletions(-) diff --git a/api/src/extensions/helpers/nlp/default/__test__/__mock__/base.mock.ts b/api/src/extensions/helpers/nlp/default/__test__/__mock__/base.mock.ts index 531b4fc5..bd85b61a 100644 --- a/api/src/extensions/helpers/nlp/default/__test__/__mock__/base.mock.ts +++ b/api/src/extensions/helpers/nlp/default/__test__/__mock__/base.mock.ts @@ -33,7 +33,7 @@ export const baseLanguage = { ...modelInstance, title: 'English', code: 'en', - default: true, + isDefault: true, }; export const entitiesMock: NlpEntityFull[] = [ diff --git a/api/src/i18n/controllers/language.controller.spec.ts b/api/src/i18n/controllers/language.controller.spec.ts index f4d66b21..a4147151 100644 --- a/api/src/i18n/controllers/language.controller.spec.ts +++ b/api/src/i18n/controllers/language.controller.spec.ts @@ -139,7 +139,7 @@ describe('LanguageController', () => { it('should mark a language as default', async () => { jest.spyOn(languageService, 'updateOne'); - const translationUpdateDto = { default: true }; + const translationUpdateDto = { isDefault: true }; const frLang = await languageService.findOne({ code: 'fr' }); const result = await languageController.updateOne( frLang.id, @@ -156,7 +156,7 @@ describe('LanguageController', () => { }); const enLang = await languageService.findOne({ code: 'en' }); - expect(enLang.default).toBe(false); + expect(enLang.isDefault).toBe(false); }); it('should throw a NotFoundException when attempting to update a translation by id', async () => { @@ -169,7 +169,7 @@ describe('LanguageController', () => { describe('deleteOne', () => { it('should throw when attempting to delete the default language', async () => { - const defaultLang = await languageService.findOne({ default: true }); + const defaultLang = await languageService.findOne({ isDefault: true }); await expect( languageController.deleteOne(defaultLang.id), diff --git a/api/src/i18n/controllers/language.controller.ts b/api/src/i18n/controllers/language.controller.ts index 4be3093c..12619fbb 100644 --- a/api/src/i18n/controllers/language.controller.ts +++ b/api/src/i18n/controllers/language.controller.ts @@ -115,10 +115,10 @@ export class LanguageController extends BaseController { @Param('id') id: string, @Body() languageUpdate: LanguageUpdateDto, ): Promise { - if ('default' in languageUpdate) { - if (languageUpdate.default) { + if ('isDefault' in languageUpdate) { + if (languageUpdate.isDefault) { // A new default language is define, make sure that only one is marked as default - await this.languageService.updateMany({}, { default: false }); + await this.languageService.updateMany({}, { isDefault: false }); } else { throw new BadRequestException('Should not be able to disable default'); } @@ -142,7 +142,7 @@ export class LanguageController extends BaseController { @HttpCode(204) async deleteOne(@Param('id') id: string): Promise { const result = await this.languageService.deleteOne({ - default: false, // Prevent deleting the default language + isDefault: false, // Prevent deleting the default language _id: id, }); if (result.deletedCount === 0) { diff --git a/api/src/i18n/dto/language.dto.ts b/api/src/i18n/dto/language.dto.ts index 6aede8f1..d9deb5d7 100644 --- a/api/src/i18n/dto/language.dto.ts +++ b/api/src/i18n/dto/language.dto.ts @@ -25,7 +25,12 @@ export class LanguageCreateDto { @ApiProperty({ description: 'Is Default Language ?', type: Boolean }) @IsNotEmpty() @IsBoolean() - default: boolean; + isDefault: boolean; + + @ApiProperty({ description: 'Whether Language is RTL', type: Boolean }) + @IsNotEmpty() + @IsBoolean() + isRTL?: boolean; } export class LanguageUpdateDto extends PartialType(LanguageCreateDto) {} diff --git a/api/src/i18n/schemas/language.schema.ts b/api/src/i18n/schemas/language.schema.ts index 5ebdd614..ea829a6e 100644 --- a/api/src/i18n/schemas/language.schema.ts +++ b/api/src/i18n/schemas/language.schema.ts @@ -31,7 +31,13 @@ export class Language extends BaseSchema { @Prop({ type: Boolean, }) - default: boolean; + isDefault: boolean; + + @Prop({ + type: Boolean, + default: false, + }) + isRTL?: boolean; } export const LanguageModel: ModelDefinition = { diff --git a/api/src/i18n/seeds/language.seed-model.ts b/api/src/i18n/seeds/language.seed-model.ts index 602e9b26..30d72c84 100644 --- a/api/src/i18n/seeds/language.seed-model.ts +++ b/api/src/i18n/seeds/language.seed-model.ts @@ -13,11 +13,11 @@ export const languageModels: LanguageCreateDto[] = [ { title: 'English', code: 'en', - default: true, + isDefault: true, }, { title: 'Français', code: 'fr', - default: false, + isDefault: false, }, ]; diff --git a/api/src/i18n/services/language.service.ts b/api/src/i18n/services/language.service.ts index 26f09c63..163efd14 100644 --- a/api/src/i18n/services/language.service.ts +++ b/api/src/i18n/services/language.service.ts @@ -54,7 +54,7 @@ export class LanguageService extends BaseService { */ @Cacheable(DEFAULT_LANGUAGE_CACHE_KEY) async getDefaultLanguage() { - return await this.findOne({ default: true }); + return await this.findOne({ isDefault: true }); } /** diff --git a/api/src/utils/test/fixtures/language.ts b/api/src/utils/test/fixtures/language.ts index 38bfbb56..18dbc107 100644 --- a/api/src/utils/test/fixtures/language.ts +++ b/api/src/utils/test/fixtures/language.ts @@ -16,12 +16,14 @@ export const languageFixtures: LanguageUpdateDto[] = [ { title: 'English', code: 'en', - default: true, + isDefault: true, + isRTL: false, }, { title: 'Français', code: 'fr', - default: false, + isDefault: false, + isRTL: false, }, ]; diff --git a/frontend/src/components/languages/LanguageDialog.tsx b/frontend/src/components/languages/LanguageDialog.tsx index b2607147..73e77d74 100644 --- a/frontend/src/components/languages/LanguageDialog.tsx +++ b/frontend/src/components/languages/LanguageDialog.tsx @@ -7,9 +7,15 @@ * 3. SaaS Restriction: This software, or any derivative of it, may not be used to offer a competing product or service (SaaS) without prior written consent from Hexastack. Offering the software as a service or using it in a commercial cloud environment without express permission is strictly prohibited. */ -import { Dialog, DialogActions, DialogContent } from "@mui/material"; +import { + Dialog, + DialogActions, + DialogContent, + FormControlLabel, + Switch, +} from "@mui/material"; import { FC, useEffect } from "react"; -import { useForm } from "react-hook-form"; +import { Controller, useForm } from "react-hook-form"; import { useTranslation } from "react-i18next"; import DialogButtons from "@/app-components/buttons/DialogButtons"; @@ -56,10 +62,12 @@ export const LanguageDialog: FC = ({ register, formState: { errors }, handleSubmit, + control, } = useForm({ defaultValues: { title: data?.title || "", code: data?.code || "", + isRTL: data?.isRTL || false, }, }); const validationRules = { @@ -87,6 +95,7 @@ export const LanguageDialog: FC = ({ reset({ title: data.title, code: data.code, + isRTL: data.isRTL, }); } else { reset(); @@ -119,6 +128,18 @@ export const LanguageDialog: FC = ({ multiline={true} /> + + ( + } + label={t("label.is_rtl")} + /> + )} + /> + diff --git a/frontend/src/components/languages/index.tsx b/frontend/src/components/languages/index.tsx index e8ddcf0d..9a11c484 100644 --- a/frontend/src/components/languages/index.tsx +++ b/frontend/src/components/languages/index.tsx @@ -71,11 +71,11 @@ export const Languages = () => { }, }); const toggleDefault = (row: ILanguage) => { - if (!row.default) { + if (!row.isDefault) { updateLanguage({ id: row.id, params: { - default: true, + isDefault: true, }, }); } @@ -87,7 +87,7 @@ export const Languages = () => { label: ActionColumnLabel.Toggle, action: (row) => toggleDefault(row), requires: [PermissionAction.UPDATE], - getState: (row) => row.default, + getState: (row) => row.isDefault, helperText: t("button.mark_as_default"), }, { @@ -99,7 +99,7 @@ export const Languages = () => { label: ActionColumnLabel.Delete, action: (row) => deleteDialogCtl.openDialog(row.id), requires: [PermissionAction.DELETE], - isDisabled: (row) => row.default, + isDisabled: (row) => row.isDefault, }, ], t("label.operations"), @@ -124,8 +124,17 @@ export const Languages = () => { }, { flex: 1, - field: "default", - headerName: t("label.default"), + field: "isDefault", + headerName: t("label.is_default"), + disableColumnMenu: true, + renderHeader, + headerAlign: "left", + valueGetter: (value) => (value ? t("label.yes") : t("label.no")), + }, + { + flex: 1, + field: "isRTL", + headerName: t("label.is_rtl"), disableColumnMenu: true, renderHeader, headerAlign: "left", diff --git a/frontend/src/i18n/en/translation.json b/frontend/src/i18n/en/translation.json index f61ff193..02d62750 100644 --- a/frontend/src/i18n/en/translation.json +++ b/frontend/src/i18n/en/translation.json @@ -549,7 +549,8 @@ "other": "Other", "no_data": "No data", "code": "Code", - "default": "Default" + "is_default": "Default", + "is_rtl": "RTL" }, "placeholder": { "your_username": "Your username", diff --git a/frontend/src/i18n/fr/translation.json b/frontend/src/i18n/fr/translation.json index 1734cb1c..f9591047 100644 --- a/frontend/src/i18n/fr/translation.json +++ b/frontend/src/i18n/fr/translation.json @@ -549,7 +549,8 @@ "other": "Autre", "no_data": "Pas de données", "code": "Code", - "default": "Par Défaut" + "is_default": "Par Défaut", + "is_rtl": "RTL" }, "placeholder": { "your_username": "Votre nom d'utilisateur", diff --git a/frontend/src/types/language.types.ts b/frontend/src/types/language.types.ts index 8d873e62..4621bfb3 100644 --- a/frontend/src/types/language.types.ts +++ b/frontend/src/types/language.types.ts @@ -16,7 +16,8 @@ export type ILanguages = Record; export interface ILanguageAttributes { title: string; code: string; - default: boolean; + isDefault: boolean; + isRTL: boolean; } export interface ILanguageStub