diff --git a/CLAUDE.md b/CLAUDE.md index 1a9b81482..63b00785d 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -4,7 +4,7 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co ## Project Overview -PlaceOS Backoffice is an Angular 20 admin UI for managing PlaceOS building automation systems. It uses standalone components (no NgModules), zoneless change detection with signals, and integrates with PlaceOS backend APIs. +PlaceOS Backoffice is an Angular 22 admin UI for managing PlaceOS building automation systems. It uses standalone components (no NgModules), zoneless change detection with signals, and integrates with PlaceOS backend APIs. ## Commands @@ -25,10 +25,10 @@ bun run lint # ESLint ## Tech Stack -- **Framework**: Angular 20 with standalone components and signals +- **Framework**: Angular 22 with standalone components and signals - **Build**: Nx 23 + Vite 8 + @analogjs/vite-plugin-angular - **Testing**: Vitest + Playwright -- **Styling**: Tailwind CSS 3.4 with custom CSS variables +- **Styling**: Tailwind CSS 4 (legacy `tailwind.config.js` loaded via `@config`) with custom CSS variables - **Backend**: @placeos/ts-client for PlaceOS REST API integration - **Real-time**: MQTT for dashboard updates @@ -54,7 +54,7 @@ src/app/ Each feature follows this structure: - `*.routes.ts` - Lazy-loaded feature routing - `*-state.service.ts` - Feature state management with signals/observables -- Component files with `standalone: true` +- Standalone components (the default since Angular 19, so `standalone: true` is not needed) ### Key Patterns @@ -90,11 +90,11 @@ export class MyComponent extends AsyncHandler { ## Notes -- Angular 20 with standalone components and signals -- TypeScript 5.8.3 +- Angular 22 with standalone components and signals +- TypeScript ~6.0 - Supports multiple locales (see `app.locales` in settings) - Service worker support for PWA functionality (production builds) -- Custom localization support via `public/assets/locales`, **TranslationPipe** and **LocalesService** +- Custom localization support via `public/assets/locale`, **TranslatePipe** and **LocaleService**. `en-AU.json` is the fallback locale - Use **IconComponent** for icons ## Code styles diff --git a/e2e/src/admin.spec.ts b/e2e/src/admin.spec.ts index 41ab5cb6b..b4f0e671b 100644 --- a/e2e/src/admin.spec.ts +++ b/e2e/src/admin.spec.ts @@ -286,24 +286,6 @@ test.describe('Admin', () => { }); }); - /** - * US-ADM-014: Manage Email Templates - * NOTE: This test is skipped because the mailing-list tab is disabled in the application - */ - test.describe('US-ADM-014: Manage Email Templates', () => { - test.skip('AC-ADM-014-1: View Templates - should show email templates section', async ({ - page, - }) => { - await adminPage.goto(); - - // Navigate to email templates section - await adminPage.viewEmailTemplates(); - - // Verify content is displayed - await expect(adminPage.mainContent).toBeVisible(); - }); - }); - /** * US-ADM-015: Monitor Build Jobs */ diff --git a/e2e/src/pages/admin.page.ts b/e2e/src/pages/admin.page.ts index efa74fd6c..a16421d9e 100644 --- a/e2e/src/pages/admin.page.ts +++ b/e2e/src/pages/admin.page.ts @@ -101,14 +101,6 @@ export class AdminPage extends BasePage { return this.page.locator('a[href*="/admin/upload-library"]').first(); } - /** - * Get the mailing list section link (route: /admin/mailing-list) - * NOTE: This tab is currently disabled in the application - */ - get mailingListLink(): Locator { - return this.page.locator('a[href*="/admin/mailing-list"]').first(); - } - /** * Get the build jobs section link (route: /admin/build-jobs) */ @@ -448,35 +440,6 @@ export class AdminPage extends BasePage { await this.save(); } - // Email Templates - - /** - * View email templates - */ - async viewEmailTemplates(): Promise { - await this.mailingListLink.click(); - await this.page.waitForTimeout(500); - } - - /** - * Create email template - */ - async createEmailTemplate(data: { - name: string; - subject: string; - body: string; - }): Promise { - await this.viewEmailTemplates(); - await this.addButton.click(); - await this.dialog.waitFor({ timeout: 5000 }); - - await this.fillField('Name', data.name); - await this.fillField('Subject', data.subject); - await this.fillField('Body', data.body); - - await this.save(); - } - // Build Jobs /** diff --git a/public/assets/locale/ar.json b/public/assets/locale/ar.json index 76712cc89..f313afe4f 100644 --- a/public/assets/locale/ar.json +++ b/public/assets/locale/ar.json @@ -119,7 +119,7 @@ "SETTINGS_MASKED_ERROR": "استبدل جميع القيم المخفية قبل حفظ الإعدادات المشفرة", "SETTINGS_INHERITED": "إعداد موروث من [{{ parent }}]({{ path }})({{ type }})", "SETTINGS_LOCAL": "إعداد محلي من {{ type }}", - "SETTINGS_SAVE_ERROR": "فشل حفظ الإعدادات. الخطأ {{ error }}", + "SETTINGS_SAVE_ERROR": "فشل حفظ الإعدادات. الخطأ: {{ error }}", "SETTINGS_SAVE_SUCCESS": "تم حفظ تغييرات إعدادات {{ type }} بنجاح", "SETTINGS_SAVE_SUCCESS_ALL": "تم حفظ جميع تغييرات الإعدادات بنجاح", "ADD_EXISTING": "إضافة موجود", @@ -532,7 +532,7 @@ "FIELD_ACTION_FN_CALL": "إجراء استدعاء وظيفة", "FIELD_ACTION_EMAIL": "إجراء بريد إلكتروني", "REORDER_CONFIRM_TITLE": "إعادة ترتيب إجراء {{ type }} للمحفز", - "REORDER_CONFIRM_MSG": "هل أنت متأكد أنك تريد إزالة شرط المحفز هذا؟
سيتم تحديث جميع الأنظمة التي تستخدم هذا المحفز فوراً.", + "REORDER_CONFIRM_MSG": "هل أنت متأكد أنك تريد إعادة ترتيب إجراءات المحفز؟
سيتم تحديث جميع الأنظمة التي تستخدم هذا المحفز فوراً.", "REORDER_CONFIRM_LOADING": "جاري إعادة ترتيب إجراءات المحفز...", "REORDER_CONFIRM_ERROR": "فشل في إعادة ترتيب إجراء المحفز. الخطأ: {{ error }}", "REORDER_CONFIRM_SUCCESS": "تم إعادة ترتيب إجراء المحفز بنجاح", @@ -626,7 +626,7 @@ "STAFF_CARD": "رقم البطاقة", "PASSWORD_REQUIRED": "مطلوب كلمة مرور صالحة", "PASSWORD_CONFIRM": "تأكيد كلمة المرور", - "PASSOWRD_MATCH": "كلمات المرور غير متطابقة" + "PASSWORDS_MATCH": "كلمات المرور غير متطابقة" }, "DOMAINS": { "SINGULAR": "مجال", @@ -686,8 +686,8 @@ "AUTHENTICATION_EMPTY": "لا توجد طرق مصادقة لهذا المجال", "AUTHENTICATION_SOURCE_TYPE": "نوع مصدر المصادقة", "AUTHENTICATION_SOURCE_SELECT": "اختر مصدر المصادقة...", - "AUTHENTICATION_SAVE_ERROR": "تم تحديث مصدر المصادقة بنجاح", - "AUTHENTICATION_SAVE_SUCCESS": "فشل تحديث مصدر المصادقة. الخطأ: {{ error }}", + "AUTHENTICATION_SAVE_SUCCESS": "تم تحديث مصدر المصادقة بنجاح", + "AUTHENTICATION_SAVE_ERROR": "فشل تحديث مصدر المصادقة. الخطأ: {{ error }}", "AUTHENTICATION_NAME_REQUIRED": "مطلوب اسم لمصدر المصادقة", "OAUTH_SITE": "الموقع", "OAUTH_SITE_PLACEHOLDER": "عنوان URL لموفر SSO", @@ -896,7 +896,7 @@ "APP_KEYS_LAST_DETAILS": "آخر تفاصيل مفتاح تطبيق", "APP_KEYS_FIELD_SCOPES": "نطاقات", "APP_KEYS_FIELD_PERMISSIONS": "الوصول", - "APP_KEYS_SCOPES_REQUIRE": "مطلوب نطاق واحد على الأقل", + "APP_KEYS_SCOPES_REQUIRED": "مطلوب نطاق واحد على الأقل", "APP_KEYS_NAME_REQUIRED": "مطلوب اسم", "APP_KEYS_PERMISSIONS_EMPTY": "لا توجد أذونات", "APP_KEYS_COPIED": "تم نسخ مفتاح التطبيق إلى الحافظة", diff --git a/public/assets/locale/en-AU.json b/public/assets/locale/en-AU.json index 602f9c5a0..531cf1b6a 100644 --- a/public/assets/locale/en-AU.json +++ b/public/assets/locale/en-AU.json @@ -49,6 +49,9 @@ "CANCEL": "Cancel", "CLOSE": "Close", "CONFIRM": "Confirm", + "ITEM_REMOVE": "Remove {{ item }}", + "FIELD_REQUIRED": "This field is required", + "DATE_EMPTY": "No date selected", "SAVE": "Save", "SAVE_ALL": "Save All", "CLEAR": "Clear Changes", @@ -70,6 +73,7 @@ "ITEM_ADD_SELECTED": "Add selected", "PROCESSING_REQUEST": "Processing request...", "PASSWORD": "Password", + "PASSWORD_TOGGLE": "Show password", "IMAGE_ADD_URL": "Add image via URL", "IMAGE_UPLOADS": "Upload Image(s)", "DROP_UPLOAD_MSG": "Drop files to upload them to the cloud", @@ -139,7 +143,7 @@ "SETTINGS_MASKED_ERROR": "Replace all masked values before you save encrypted settings", "SETTINGS_INHERITED": "Setting inherited from [{{ parent }}]({{ path }})({{ type }})", "SETTINGS_LOCAL": "Local setting from {{ type }}", - "SETTINGS_SAVE_ERROR": "Failed to save settings. Error {{ error }}", + "SETTINGS_SAVE_ERROR": "Failed to save settings. Error: {{ error }}", "SETTINGS_SAVE_SUCCESS": "Successfully saved {{ type }} settings changes", "SETTINGS_SAVE_SUCCESS_ALL": "Successfully saved all settings changes", "ADD_EXISTING": "Add existing", @@ -607,8 +611,8 @@ "ACTION_FN_EMPTY": "No function call actions for this trigger", "FIELD_ACTION_FN_CALL": "Function call Action", "FIELD_ACTION_EMAIL": "Email Action", - "REORDER_CONFIRM_TITLE": "Reoreder trigger {{ type }} action", - "REORDER_CONFIRM_MSG": "Are you sure you want remove this trigger condition?
All systems using this trigger will be updated immediately.", + "REORDER_CONFIRM_TITLE": "Reorder trigger {{ type }} action", + "REORDER_CONFIRM_MSG": "Are you sure you want to reorder the trigger actions?
All systems using this trigger will be updated immediately.", "REORDER_CONFIRM_LOADING": "Re-ordering trigger actions...", "REORDER_CONFIRM_ERROR": "Failed to re-ordered trigger action. Error: {{ error }}", "REORDER_CONFIRM_SUCCESS": "Successfully re-ordered trigger action", @@ -679,6 +683,7 @@ "NEW": "New user", "BULK": "Bulk add users", "REMOVE": "Remove user", + "DELETE": "Delete user", "DELETE_MSG": "

Are you sure you want delete this user?

The user will be removed from the system within 24 hours

", "DELETE_LOADING": "Deleting user...", "DELETE_SUCCESS": "Successfully deleted user.", @@ -729,7 +734,7 @@ "STAFF_CARD": "Card Number", "PASSWORD_REQUIRED": "A valid password is required", "PASSWORD_CONFIRM": "Confirm Password", - "PASSOWRD_MATCH": "Passwords do not match", + "PASSWORDS_MATCH": "Passwords do not match", "IMAGE": "Profile Image", "IMAGE_INVALID": "A valid URL is required for profile image", "LOCATABLE": "Enable Location Tracking" @@ -867,9 +872,9 @@ "FIELD_USER": "User", "FIELD_ROLE": "Role", "APPLICATIONS_EMPTY": "No applications for this domain", - "APPLICATIONS_SAVING": "Saving domain application...", - "APPLICATIONS_SAVE_ERROR": "Failed to save domain application", - "APPLICATIONS_SAVE_SUCCESS": "Successfully saved domain application", + "APPLICATION_SAVING": "Saving domain application...", + "APPLICATION_SAVE_ERROR": "Failed to save domain application. Error: {{ error }}", + "APPLICATION_SAVE_SUCCESS": "Successfully saved domain application", "COPY_SECRET": "Copy secret to Clipboard", "COPIED_SECRET": "Copied client secret to Clipboard", "VIEW_SECRET": "View Secret", @@ -891,8 +896,8 @@ "AUTHENTICATION_EMPTY": "No authentication methods for this domain", "AUTHENTICATION_SOURCE_TYPE": "Authentication Source Type", "AUTHENTICATION_SOURCE_SELECT": "Select authentication source...", - "AUTHENTICATION_SAVE_ERROR": "Successfully updated authentication source", - "AUTHENTICATION_SAVE_SUCCESS": "Failed to update authentication source. Error: {{ error }}", + "AUTHENTICATION_SAVE_SUCCESS": "Successfully updated authentication source", + "AUTHENTICATION_SAVE_ERROR": "Failed to update authentication source. Error: {{ error }}", "AUTHENTICATION_NAME_REQUIRED": "An auth source name is required", "OAUTH_SITE": "Site", "OAUTH_SITE_PLACEHOLDER": "URL of the SSO provider", @@ -1020,7 +1025,7 @@ "BROKERS_AUTH_TYPE_NONE": "No Auth", "BROKERS_FILTERS_EMPTY": "No filters", "BROKERS_NAME_REQUIRED": "A broker name is required", - "BROKERS_HOST_REQUIRED": "A broker name is required", + "BROKERS_HOST_REQUIRED": "A broker host is required", "BROKERS_PORT_REQUIRED": "A valid port number between 1 - 65535 is required", "BROKERS_USERNAME": "Username", "BROKERS_USERNAME_REQUIRED": "A valid username is required", @@ -1028,6 +1033,9 @@ "BROKERS_PASSWORD_REQUIRED": "A valid password is required ", "BROKERS_CERT": "Certificate", "BROKERS_CERT_REQUIRED": "A valid certificate is required ", + "BROKERS_SAVING": "Saving MQTT broker...", + "BROKERS_SAVE_ERROR": "Failed to save MQTT broker. Error: {{ error }}", + "BROKERS_SAVE_SUCCESS": "Successfully saved MQTT broker.", "TENANTS_HEADER": "Staff API Tenants", "TENANTS_ADD": "Add Tenant", "TENANTS_NEW": "New Tenant", @@ -1122,7 +1130,7 @@ "APP_KEYS_TTL_MONTH": "30 Days", "APP_KEYS_TTL_90_DAYS": "90 Days", "APP_KEYS_TTL_YEAR": "1 Year", - "APP_KEYS_SCOPES_REQUIRE": "At least one scope is required", + "APP_KEYS_SCOPES_REQUIRED": "At least one scope is required", "APP_KEYS_NAME_REQUIRED": "A name is required", "APP_KEYS_PERMISSIONS_EMPTY": "No permissions", "APP_KEYS_COPIED": "Copied Application Key to clipboard", diff --git a/public/assets/locale/en-GB.json b/public/assets/locale/en-GB.json index 7d4b66638..0d0cca2ad 100644 --- a/public/assets/locale/en-GB.json +++ b/public/assets/locale/en-GB.json @@ -124,7 +124,7 @@ "SETTINGS_MASKED_ERROR": "Replace all masked values before you save encrypted settings", "SETTINGS_INHERITED": "Setting inherited from [{{ parent }}]({{ path }})({{ type }})", "SETTINGS_LOCAL": "Local setting from {{ type }}", - "SETTINGS_SAVE_ERROR": "Failed to save settings. Error {{ error }}", + "SETTINGS_SAVE_ERROR": "Failed to save settings. Error: {{ error }}", "SETTINGS_SAVE_SUCCESS": "Successfully saved {{ type }} settings changes", "SETTINGS_SAVE_SUCCESS_ALL": "Successfully saved all settings changes", "ADD_EXISTING": "Add existing", @@ -531,7 +531,7 @@ "ACTIONS": "Actions", "ACTION_ADD": "Add Action", "ACTION_NEW": "New Action", - "ACTION_FIELD_TYPE": "ACtion Type", + "ACTION_FIELD_TYPE": "Action Type", "ACTION_EXECUTE": "Execute Method", "ACTION_EXECUTE_SELECT": "Select method to execute", "ACTION_EMAIL": "Send Email", @@ -542,8 +542,8 @@ "ACTION_FN_EMPTY": "No function call actions for this trigger", "FIELD_ACTION_FN_CALL": "Function call Action", "FIELD_ACTION_EMAIL": "Email Action", - "REORDER_CONFIRM_TITLE": "Reoreder trigger {{ type }} action", - "REORDER_CONFIRM_MSG": "Are you sure you want remove this trigger condition?
All systems using this trigger will be updated immediately.", + "REORDER_CONFIRM_TITLE": "Reorder trigger {{ type }} action", + "REORDER_CONFIRM_MSG": "Are you sure you want to reorder the trigger actions?
All systems using this trigger will be updated immediately.", "REORDER_CONFIRM_LOADING": "Re-ordering trigger actions...", "REORDER_CONFIRM_ERROR": "Failed to re-ordered trigger action. Error: {{ error }}", "REORDER_CONFIRM_SUCCESS": "Successfully re-ordered trigger action", @@ -639,7 +639,7 @@ "STAFF_CARD": "Card Number", "PASSWORD_REQUIRED": "A valid password is required", "PASSWORD_CONFIRM": "Confirm Password", - "PASSOWRD_MATCH": "Passwords do not match" + "PASSWORDS_MATCH": "Passwords do not match" }, "DOMAINS": { "SINGULAR": "Domain", @@ -699,8 +699,8 @@ "AUTHENTICATION_EMPTY": "No authentication methods for this domain", "AUTHENTICATION_SOURCE_TYPE": "Authentication Source Type", "AUTHENTICATION_SOURCE_SELECT": "Select authentication source...", - "AUTHENTICATION_SAVE_ERROR": "Successfully updated authentication source", - "AUTHENTICATION_SAVE_SUCCESS": "Failed to update authentication source. Error: {{ error }}", + "AUTHENTICATION_SAVE_SUCCESS": "Successfully updated authentication source", + "AUTHENTICATION_SAVE_ERROR": "Failed to update authentication source. Error: {{ error }}", "AUTHENTICATION_NAME_REQUIRED": "An auth source name is required", "OAUTH_SITE": "Site", "OAUTH_SITE_PLACEHOLDER": "URL of the SSO provider", @@ -827,7 +827,7 @@ "BROKERS_AUTH_TYPE_NONE": "No Auth", "BROKERS_FILTERS_EMPTY": "No filters", "BROKERS_NAME_REQUIRED": "A broker name is required", - "BROKERS_HOST_REQUIRED": "A broker name is required", + "BROKERS_HOST_REQUIRED": "A broker host is required", "BROKERS_PORT_REQUIRED": "A valid port number between 1 - 65535 is required", "BROKERS_USERNAME": "Username", "BROKERS_USERNAME_REQUIRED": "A valid username is required", @@ -927,7 +927,7 @@ "APP_KEYS_TTL_MONTH": "30 Days", "APP_KEYS_TTL_90_DAYS": "90 Days", "APP_KEYS_TTL_YEAR": "1 Year", - "APP_KEYS_SCOPES_REQUIRE": "At least one scope is required", + "APP_KEYS_SCOPES_REQUIRED": "At least one scope is required", "APP_KEYS_NAME_REQUIRED": "A name is required", "APP_KEYS_PERMISSIONS_EMPTY": "No permissions", "APP_KEYS_COPIED": "Copied Application Key to clipboard", diff --git a/public/assets/locale/en-US.json b/public/assets/locale/en-US.json index 838c470e1..74f37f815 100644 --- a/public/assets/locale/en-US.json +++ b/public/assets/locale/en-US.json @@ -121,7 +121,7 @@ "SETTINGS_MASKED_ERROR": "Replace all masked values before you save encrypted settings", "SETTINGS_INHERITED": "Setting inherited from [{{ parent }}]({{ path }})({{ type }})", "SETTINGS_LOCAL": "Local setting from {{ type }}", - "SETTINGS_SAVE_ERROR": "Failed to save settings. Error {{ error }}", + "SETTINGS_SAVE_ERROR": "Failed to save settings. Error: {{ error }}", "SETTINGS_SAVE_SUCCESS": "Successfully saved {{ type }} settings changes", "SETTINGS_SAVE_SUCCESS_ALL": "Successfully saved all settings changes", "ADD_EXISTING": "Add existing", @@ -528,7 +528,7 @@ "ACTIONS": "Actions", "ACTION_ADD": "Add Action", "ACTION_NEW": "New Action", - "ACTION_FIELD_TYPE": "ACtion Type", + "ACTION_FIELD_TYPE": "Action Type", "ACTION_EXECUTE": "Execute Method", "ACTION_EXECUTE_SELECT": "Select method to execute", "ACTION_EMAIL": "Send Email", @@ -539,8 +539,8 @@ "ACTION_FN_EMPTY": "No function call actions for this trigger", "FIELD_ACTION_FN_CALL": "Function call Action", "FIELD_ACTION_EMAIL": "Email Action", - "REORDER_CONFIRM_TITLE": "Reoreder trigger {{ type }} action", - "REORDER_CONFIRM_MSG": "Are you sure you want remove this trigger condition?
All systems using this trigger will be updated immediately.", + "REORDER_CONFIRM_TITLE": "Reorder trigger {{ type }} action", + "REORDER_CONFIRM_MSG": "Are you sure you want to reorder the trigger actions?
All systems using this trigger will be updated immediately.", "REORDER_CONFIRM_LOADING": "Re-ordering trigger actions...", "REORDER_CONFIRM_ERROR": "Failed to re-ordered trigger action. Error: {{ error }}", "REORDER_CONFIRM_SUCCESS": "Successfully re-ordered trigger action", @@ -636,7 +636,7 @@ "STAFF_CARD": "Card Number", "PASSWORD_REQUIRED": "A valid password is required", "PASSWORD_CONFIRM": "Confirm Password", - "PASSOWRD_MATCH": "Passwords do not match" + "PASSWORDS_MATCH": "Passwords do not match" }, "DOMAINS": { "SINGULAR": "Domain", @@ -696,8 +696,8 @@ "AUTHENTICATION_EMPTY": "No authentication methods for this domain", "AUTHENTICATION_SOURCE_TYPE": "Authentication Source Type", "AUTHENTICATION_SOURCE_SELECT": "Select authentication source...", - "AUTHENTICATION_SAVE_ERROR": "Successfully updated authentication source", - "AUTHENTICATION_SAVE_SUCCESS": "Failed to update authentication source. Error: {{ error }}", + "AUTHENTICATION_SAVE_SUCCESS": "Successfully updated authentication source", + "AUTHENTICATION_SAVE_ERROR": "Failed to update authentication source. Error: {{ error }}", "AUTHENTICATION_NAME_REQUIRED": "An auth source name is required", "OAUTH_SITE": "Site", "OAUTH_SITE_PLACEHOLDER": "URL of the SSO provider", @@ -824,7 +824,7 @@ "BROKERS_AUTH_TYPE_NONE": "No Auth", "BROKERS_FILTERS_EMPTY": "No filters", "BROKERS_NAME_REQUIRED": "A broker name is required", - "BROKERS_HOST_REQUIRED": "A broker name is required", + "BROKERS_HOST_REQUIRED": "A broker host is required", "BROKERS_PORT_REQUIRED": "A valid port number between 1 - 65535 is required", "BROKERS_USERNAME": "Username", "BROKERS_USERNAME_REQUIRED": "A valid username is required", @@ -924,7 +924,7 @@ "APP_KEYS_TTL_MONTH": "30 Days", "APP_KEYS_TTL_90_DAYS": "90 Days", "APP_KEYS_TTL_YEAR": "1 Year", - "APP_KEYS_SCOPES_REQUIRE": "At least one scope is required", + "APP_KEYS_SCOPES_REQUIRED": "At least one scope is required", "APP_KEYS_NAME_REQUIRED": "A name is required", "APP_KEYS_PERMISSIONS_EMPTY": "No permissions", "APP_KEYS_COPIED": "Copied Application Key to clipboard", diff --git a/public/assets/locale/es.json b/public/assets/locale/es.json index 58d2cfbd6..467571618 100644 --- a/public/assets/locale/es.json +++ b/public/assets/locale/es.json @@ -119,7 +119,7 @@ "SETTINGS_MASKED_ERROR": "Reemplace todos los valores ocultos antes de guardar la configuración cifrada", "SETTINGS_INHERITED": "Configuración heredada de [{{ parent }}]({{ path }})({{ type }})", "SETTINGS_LOCAL": "Configuración local de {{ type }}", - "SETTINGS_SAVE_ERROR": "No se pudo guardar las configuraciones. Error {{ error }}", + "SETTINGS_SAVE_ERROR": "No se pudo guardar las configuraciones. Error: {{ error }}", "SETTINGS_SAVE_SUCCESS": "Cambios en configuraciones de {{ type }} guardados correctamente", "SETTINGS_SAVE_SUCCESS_ALL": "Todos los cambios de configuraciones guardados correctamente", "ADD_EXISTING": "Agregar existente", @@ -532,7 +532,7 @@ "FIELD_ACTION_FN_CALL": "Acción de llamada a función", "FIELD_ACTION_EMAIL": "Acción de correo electrónico", "REORDER_CONFIRM_TITLE": "Reordenar acción {{ type }} del disparador", - "REORDER_CONFIRM_MSG": "¿Estás seguro de que deseas eliminar esta condición del disparador?
Todos los sistemas que utilizan este disparador se actualizarán inmediatamente.", + "REORDER_CONFIRM_MSG": "¿Estás seguro de que deseas reordenar las acciones del disparador?
Todos los sistemas que utilizan este disparador se actualizarán inmediatamente.", "REORDER_CONFIRM_LOADING": "Reordenando acciones del disparador...", "REORDER_CONFIRM_ERROR": "No se pudo reordenar la acción del disparador. Error: {{ error }}", "REORDER_CONFIRM_SUCCESS": "Acción del disparador reordenada correctamente", @@ -626,7 +626,7 @@ "STAFF_CARD": "Número de tarjeta", "PASSWORD_REQUIRED": "Se requiere una contraseña válida", "PASSWORD_CONFIRM": "Confirmar contraseña", - "PASSOWRD_MATCH": "Las contraseñas no coinciden" + "PASSWORDS_MATCH": "Las contraseñas no coinciden" }, "DOMAINS": { "SINGULAR": "Dominio", @@ -686,8 +686,8 @@ "AUTHENTICATION_EMPTY": "No hay métodos de autenticación para este dominio", "AUTHENTICATION_SOURCE_TYPE": "Tipo de fuente de autenticación", "AUTHENTICATION_SOURCE_SELECT": "Seleccionar fuente de autenticación...", - "AUTHENTICATION_SAVE_ERROR": "Fuente de autenticación actualizada correctamente", - "AUTHENTICATION_SAVE_SUCCESS": "Error al actualizar la fuente de autenticación. Error: {{ error }}", + "AUTHENTICATION_SAVE_SUCCESS": "Fuente de autenticación actualizada correctamente", + "AUTHENTICATION_SAVE_ERROR": "Error al actualizar la fuente de autenticación. Error: {{ error }}", "AUTHENTICATION_NAME_REQUIRED": "Se requiere un nombre de fuente de autenticación", "OAUTH_SITE": "Sitio", "OAUTH_SITE_PLACEHOLDER": "URL del proveedor SSO", @@ -909,7 +909,7 @@ "APP_KEYS_TTL_MONTH": "30 Días", "APP_KEYS_TTL_90_DAYS": "90 Días", "APP_KEYS_TTL_YEAR": "1 Año", - "APP_KEYS_SCOPES_REQUIRE": "Se requiere al menos un alcance", + "APP_KEYS_SCOPES_REQUIRED": "Se requiere al menos un alcance", "APP_KEYS_NAME_REQUIRED": "Se requiere un nombre", "APP_KEYS_PERMISSIONS_EMPTY": "Sin permisos", "APP_KEYS_COPIED": "Clave de aplicación copiada al portapapeles", diff --git a/public/assets/locale/fr.json b/public/assets/locale/fr.json index 70884d172..8157c46c2 100644 --- a/public/assets/locale/fr.json +++ b/public/assets/locale/fr.json @@ -119,7 +119,7 @@ "SETTINGS_MASKED_ERROR": "Remplacez toutes les valeurs masquées avant d'enregistrer les paramètres chiffrés", "SETTINGS_INHERITED": "Paramètre hérité de [{{ parent }}]({{ path }})({{ type }})", "SETTINGS_LOCAL": "Paramètre local depuis {{ type }}", - "SETTINGS_SAVE_ERROR": "Échec de l'enregistrement des paramètres. Erreur {{ error }}", + "SETTINGS_SAVE_ERROR": "Échec de l'enregistrement des paramètres. Erreur : {{ error }}", "SETTINGS_SAVE_SUCCESS": "Modifications des paramètres de {{ type }} enregistrées avec succès", "SETTINGS_SAVE_SUCCESS_ALL": "Toutes les modifications des paramètres ont été enregistrées avec succès", "ADD_EXISTING": "Ajouter existant", @@ -532,7 +532,7 @@ "FIELD_ACTION_FN_CALL": "Action d'appel de fonction", "FIELD_ACTION_EMAIL": "Action d'e-mail", "REORDER_CONFIRM_TITLE": "Réorganiser l'action du déclencheur {{ type }}", - "REORDER_CONFIRM_MSG": "Êtes-vous sûr de vouloir supprimer cette condition du déclencheur ?
Tous les systèmes utilisant ce déclencheur seront mis à jour immédiatement.", + "REORDER_CONFIRM_MSG": "Êtes-vous sûr de vouloir réorganiser les actions du déclencheur ?
Tous les systèmes utilisant ce déclencheur seront mis à jour immédiatement.", "REORDER_CONFIRM_LOADING": "Réorganisation des actions du déclencheur...", "REORDER_CONFIRM_ERROR": "Échec de la réorganisation de l'action du déclencheur. Erreur : {{ error }}", "REORDER_CONFIRM_SUCCESS": "Action du déclencheur réorganisée avec succès", @@ -626,7 +626,7 @@ "STAFF_CARD": "Numéro de carte", "PASSWORD_REQUIRED": "Un mot de passe valide est requis", "PASSWORD_CONFIRM": "Confirmer le mot de passe", - "PASSOWRD_MATCH": "Les mots de passe ne correspondent pas" + "PASSWORDS_MATCH": "Les mots de passe ne correspondent pas" }, "DOMAINS": { "SINGULAR": "Domaine", @@ -686,8 +686,8 @@ "AUTHENTICATION_EMPTY": "Aucune méthode d'authentification pour ce domaine", "AUTHENTICATION_SOURCE_TYPE": "Type de source d'authentification", "AUTHENTICATION_SOURCE_SELECT": "Sélectionner la source d'authentification...", - "AUTHENTICATION_SAVE_ERROR": "Mise à jour de la source d'authentification réussie", - "AUTHENTICATION_SAVE_SUCCESS": "Échec de la mise à jour de la source d'authentification. Erreur : {{ error }}", + "AUTHENTICATION_SAVE_SUCCESS": "Mise à jour de la source d'authentification réussie", + "AUTHENTICATION_SAVE_ERROR": "Échec de la mise à jour de la source d'authentification. Erreur : {{ error }}", "AUTHENTICATION_NAME_REQUIRED": "Un nom de source d'authentification est requis", "OAUTH_SITE": "Site", "OAUTH_SITE_PLACEHOLDER": "URL du fournisseur SSO", @@ -812,7 +812,7 @@ "BROKERS_AUTH_TYPE_NONE": "Aucune authentification", "BROKERS_FILTERS_EMPTY": "Aucun filtre", "BROKERS_NAME_REQUIRED": "Un nom de courtier est requis", - "BROKERS_HOST_REQUIRED": "Un nom de courtier est requis", + "BROKERS_HOST_REQUIRED": "Un hôte de courtier est requis", "BROKERS_PORT_REQUIRED": "Un numéro de port valide entre 1 - 65535 est requis", "BROKERS_USERNAME": "Nom d'utilisateur", "BROKERS_USERNAME_REQUIRED": "Un nom d'utilisateur valide est requis", @@ -896,7 +896,7 @@ "APP_KEYS_LAST_DETAILS": "Détails de la dernière clé d'application", "APP_KEYS_FIELD_SCOPES": "Périmètres", "APP_KEYS_FIELD_PERMISSIONS": "Accès", - "APP_KEYS_SCOPES_REQUIRE": "Au moins un périmètre est requis", + "APP_KEYS_SCOPES_REQUIRED": "Au moins un périmètre est requis", "APP_KEYS_NAME_REQUIRED": "Un nom est requis", "APP_KEYS_PERMISSIONS_EMPTY": "Aucune permission", "APP_KEYS_COPIED": "Clé d'application copiée dans le presse-papiers", diff --git a/public/assets/locale/jp.json b/public/assets/locale/jp.json index b700ba625..8ea77b78b 100644 --- a/public/assets/locale/jp.json +++ b/public/assets/locale/jp.json @@ -535,7 +535,7 @@ "FIELD_ACTION_FN_CALL": "関数呼び出しアクション", "FIELD_ACTION_EMAIL": "メールアクション", "REORDER_CONFIRM_TITLE": "トリガー{{ type }}アクションの再注文", - "REORDER_CONFIRM_MSG": "このトリガー条件を削除してよろしいですか?
この変更は即時にすべての関連システムに反映されます。", + "REORDER_CONFIRM_MSG": "トリガーアクションを並べ替えてよろしいですか?
この変更は即時にすべての関連システムに反映されます。", "REORDER_CONFIRM_LOADING": "トリガーアクションを再注文中...", "REORDER_CONFIRM_ERROR": "トリガーアクションの再注文に失敗しました。エラー:{{ error }}", "REORDER_CONFIRM_SUCCESS": "トリガーアクションを正常に再注文しました", @@ -629,7 +629,7 @@ "STAFF_CARD": "カード番号", "PASSWORD_REQUIRED": "有効なパスワードが必要です", "PASSWORD_CONFIRM": "パスワード(確認)", - "PASSOWRD_MATCH": "パスワードが一致しません" + "PASSWORDS_MATCH": "パスワードが一致しません" }, "DOMAINS": { "SINGULAR": "ドメイン", @@ -689,8 +689,8 @@ "AUTHENTICATION_EMPTY": "このドメインには認証方法がありません", "AUTHENTICATION_SOURCE_TYPE": "認証ソースタイプ", "AUTHENTICATION_SOURCE_SELECT": "認証ソースを選択...", - "AUTHENTICATION_SAVE_ERROR": "認証ソースの更新に成功しました", - "AUTHENTICATION_SAVE_SUCCESS": "認証ソースの更新に失敗しました。エラー:{{ error }}", + "AUTHENTICATION_SAVE_SUCCESS": "認証ソースの更新に成功しました", + "AUTHENTICATION_SAVE_ERROR": "認証ソースの更新に失敗しました。エラー:{{ error }}", "AUTHENTICATION_NAME_REQUIRED": "認証ソース名が必要です", "OAUTH_SITE": "サイト", "OAUTH_SITE_PLACEHOLDER": "SSOプロバイダのURL", @@ -899,7 +899,7 @@ "APP_KEYS_LAST_DETAILS": "最後のアプリケーションキー詳細", "APP_KEYS_FIELD_SCOPES": "スコープ", "APP_KEYS_FIELD_PERMISSIONS": "アクセス権", - "APP_KEYS_SCOPES_REQUIRE": "少なくとも1つのスコープが必要です", + "APP_KEYS_SCOPES_REQUIRED": "少なくとも1つのスコープが必要です", "APP_KEYS_NAME_REQUIRED": "名前が必要です", "APP_KEYS_PERMISSIONS_EMPTY": "権限なし", "APP_KEYS_COPIED": "アプリケーションキーをクリップボードにコピーしました", diff --git a/src/app/admin/admin.component.ts b/src/app/admin/admin.component.ts index 2e36b3847..5dd076d86 100644 --- a/src/app/admin/admin.component.ts +++ b/src/app/admin/admin.component.ts @@ -11,7 +11,6 @@ import { SettingsService } from '../common/settings.service'; import { DebugOutputComponent } from '../ui/debug-output.component'; import { IconComponent } from '../ui/icon.component'; import { SidebarMenuComponent } from '../ui/sidebar-menu.component'; -import { BackofficeUsersService } from '../users/users.service'; @Component({ selector: 'app-engine', @@ -92,7 +91,6 @@ import { BackofficeUsersService } from '../users/users.service'; export class PlaceComponent extends AsyncHandler implements OnInit { private _settings = inject(SettingsService); private _service = inject(ActiveItemService); - private _users = inject(BackofficeUsersService); private _debug = inject(PlaceDebugService); public readonly tab_list = signal([]); @@ -103,10 +101,6 @@ export class PlaceComponent extends AsyncHandler implements OnInit { return extensionsForItem(this._service.active_item, 'admin'); } - public get dark_mode() { - return this._users.dark_mode; - } - public updateTabList() { this.tab_list.set( [ @@ -190,11 +184,6 @@ export class PlaceComponent extends AsyncHandler implements OnInit { name: i18n('ADMIN.TAB_BUILD_JOBS'), icon: { value: 'laps' }, }, - // { - // id: 'mailing-list', - // name: 'Email Templates', - // icon: { value: 'email' }, - // }, ].concat(this.extensions), ); } diff --git a/src/app/admin/admin.routes.ts b/src/app/admin/admin.routes.ts index b2f8ab05b..a551839da 100644 --- a/src/app/admin/admin.routes.ts +++ b/src/app/admin/admin.routes.ts @@ -121,33 +121,6 @@ export const ROUTES: Routes = [ (m) => m.UploadLibraryComponent, ), }, - { - path: 'mailing-list', - children: [ - { - path: '', - loadComponent: () => - import( - './mailing-lists/email-templates.component' - ).then((m) => m.EmailTemplatesComponent), - }, - { - path: 'edit', - loadComponent: () => - import( - './mailing-lists/email-template-form.component' - ).then((m) => m.EmailTemplateFormComponent), - }, - { - path: 'edit/:id', - loadComponent: () => - import( - './mailing-lists/email-template-form.component' - ).then((m) => m.EmailTemplateFormComponent), - }, - { path: '**', redirectTo: '' }, - ], - }, { path: 'signage-plugins', loadComponent: () => diff --git a/src/app/admin/broker-form.component.ts b/src/app/admin/broker-form.component.ts index f439be5cc..f386c64fe 100644 --- a/src/app/admin/broker-form.component.ts +++ b/src/app/admin/broker-form.component.ts @@ -62,6 +62,7 @@ import { @@ -188,6 +211,7 @@ import { @@ -209,6 +233,7 @@ import { [placeholder]=" 'DRIVERS.DEFAULT_PORT' | translate " + id="default-port" [formField]="form.default_port" /> @@ -225,11 +250,15 @@ import { /> -