@masterteam/system-settings 0.0.11 → 0.0.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -3,6 +3,62 @@
3
3
  `mt-system-settings` loads and updates the host's system settings through the
4
4
  configured `apiBasePath` (default: `settings`).
5
5
 
6
+ The retired generic `SMTP` setting is intentionally not rendered or updated.
7
+ Outgoing notification email is managed through the Email Delivery routes below.
8
+
9
+ ## Email Delivery Control Panel
10
+
11
+ `EMAIL_DELIVERY_ROUTES` provides the descriptor-driven Email Delivery page. It
12
+ uses the backend HTTP contract directly; the production feature has no mock
13
+ adapter or fixture fallback:
14
+
15
+ ```typescript
16
+ {
17
+ path: 'email-delivery',
18
+ loadChildren: () =>
19
+ import('@masterteam/system-settings').then(
20
+ (module) => module.EMAIL_DELIVERY_ROUTES,
21
+ ),
22
+ }
23
+ ```
24
+
25
+ The default paths are relative to the host application's API base so the host
26
+ authentication interceptor can attach the correct application origin:
27
+
28
+ ```typescript
29
+ import { provideEmailDelivery } from "@masterteam/system-settings";
30
+
31
+ provideEmailDelivery({
32
+ apiBasePath: "control-panel/email-delivery",
33
+ notificationApiBasePath: "Notifications",
34
+ permissionKeys: ["CONTROL_PANEL"],
35
+ });
36
+ ```
37
+
38
+ Those are the defaults, so `provideEmailDelivery` is only needed when a host
39
+ must override a base path or its permission assertion. In Pplus they resolve to
40
+ `/api/control-panel/email-delivery` and `/api/Notifications` after the Admin
41
+ application API base is prepended.
42
+
43
+ The page uses one `CONTROL_PANEL` access rule, one route with `Connections` and
44
+ `Activity` tabs, and a collapsed Advanced Support section. Provider fields and
45
+ actions come from `GET /api/control-panel/email-delivery/providers`; the error
46
+ presentation uses `GET /api/control-panel/email-delivery/error-catalog`; secret
47
+ values, external secret values, authorization URLs, and evidence exports are
48
+ never retained in browser storage.
49
+
50
+ Implementation and source-contract paths are indexed in
51
+ [`../../../.github/instructions/email-delivery/Email-Delivery-Frontend-Implementation-Guide.md`](../../../.github/instructions/email-delivery/Email-Delivery-Frontend-Implementation-Guide.md).
52
+
53
+ ## General Settings Layout
54
+
55
+ The responsive general-settings grid contains three cards:
56
+
57
+ - **Date, Time & Weekend** for date/time formats and weekend days. The stored
58
+ timezone region is preserved but is not editable from this card.
59
+ - **Currency** for the default currency and display format.
60
+ - **Explore Experience** for the default Explore view.
61
+
6
62
  ## Host Cache Contract
7
63
 
8
64
  After a successful `getsystemsettings` response, and again after a successful
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "system-settings": {
3
- "general-configuration-title": "الإعدادات العامة",
4
- "general-configuration-description": "سلوك عام للتطبيق يطبق على جميع المستخدمين.",
3
+ "general-configuration-title": "تجربة الاستكشاف",
4
+ "general-configuration-description": "اختر طريقة العرض التي يراها المستخدمون أولاً عند فتح صفحة الاستكشاف.",
5
5
  "explore-default-view": "طريقة العرض الافتراضية للاستكشاف",
6
6
  "explore-default-view-hint": "طريقة العرض التي تفتح بها صفحة الاستكشاف. يمكن للمستخدمين التبديل بينها في أي وقت.",
7
7
  "explore-default-view-cards": "البطاقات",
8
8
  "explore-default-view-timeline": "الخط الزمني",
9
9
  "page-title": "إعدادات النظام",
10
- "page-subtitle": "إدارة العطلات, عطلات نهاية الأسبوع, المنطقة الزمنية, العملة, وSMTP من شاشة واحدة.",
10
+ "page-subtitle": "إدارة العطلات وعطلات نهاية الأسبوع والمنطقة الزمنية والعملة وسياسة الجدول الزمني من شاشة واحدة.",
11
11
  "save": "حفظ",
12
12
  "save-tooltip": "حفظ التغييرات ",
13
13
  "cancel": "إلغاء",
@@ -25,10 +25,8 @@
25
25
  "holiday-range-error": "يجب أن يكون تاريخ الانتهاء في أو بعد تاريخ تاريخ البدء.",
26
26
  "no-holidays-title": "لم تتم إضافة أي عطلات بعد.",
27
27
  "no-holidays-description": "أضف صفًا للعطلات لتحديد فترات العطلات على مستوى المنتج.",
28
- "timezone-title": "المنطقة الزمنية.",
29
- "timezone-description": "اضبط المنطقة الزمنية وتنسيقات التاريخ والوقت الافتراضية.",
30
- "timezone": "المنطقة الزمنية.",
31
- "timezone-placeholder": "حدد المنطقة الزمنية.",
28
+ "date-time-weekend-title": "التاريخ والوقت وعطلة نهاية الأسبوع",
29
+ "date-time-weekend-description": "اضبط تنسيقات التاريخ والوقت الافتراضية واختر الأيام التي تُعامل كعطلة نهاية الأسبوع.",
32
30
  "date-format": "تنسيق التاريخ.",
33
31
  "date-format-placeholder": "حدد تنسيق التاريخ.",
34
32
  "time-format": "تنسيق الوقت.",
@@ -46,8 +44,6 @@
46
44
  "currency-placeholder": "حدد العملة.",
47
45
  "currency-format": "تنسيق العملة.",
48
46
  "currency-format-placeholder": "حدد تنسيق العملة",
49
- "weekend-title": "عطلة نهاية الأسبوع",
50
- "weekend-description": "اختر أيام الأسبوع التي تُعامل كأيام عطلة نهاية الأسبوع.",
51
47
  "weekend-days": "أيام عطلة نهاية الأسبوع",
52
48
  "weekend-placeholder": "حدد أيام عطلة نهاية الأسبوع",
53
49
  "monday": "الاثنين",
@@ -57,18 +53,6 @@
57
53
  "friday": "الجمعة",
58
54
  "saturday": "السبت",
59
55
  "sunday": "الأحد",
60
- "smtp-title": "SMTP",
61
- "smtp-description": "قم بتهيئة خادم SMTP المستخدم للبريد الإلكتروني الصادر.",
62
- "smtp-mail": "البريد",
63
- "smtp-mail-placeholder": "أدخل بريد المرسل الإلكتروني",
64
- "smtp-name": "اسم العرض",
65
- "smtp-name-placeholder": "أدخل اسم العرض",
66
- "smtp-host": "المضيف",
67
- "smtp-host-placeholder": "أدخل مضيف SMTP",
68
- "smtp-port": "المنفذ",
69
- "smtp-port-placeholder": "أدخل منفذ SMTP",
70
- "smtp-password": "كلمة المرور",
71
- "smtp-password-placeholder": "أدخل كلمة مرور SMTP",
72
56
  "saved-successfully": "تم حفظ الإعدادات بنجاح.",
73
57
  "no-changes-message": "لا توجد تغييرات لحفظها.",
74
58
  "timesheet-policy-title": "سياسة الجداول الزمنية",
@@ -130,5 +114,255 @@
130
114
  "working-days-placeholder": "حدد أيام العمل",
131
115
  "global-holidays": "تواريخ العطلات",
132
116
  "global-holidays-placeholder": "تواريخ بصيغة YYYY-MM-DD مفصولة بفواصل"
117
+ },
118
+ "email-delivery": {
119
+ "title": "تسليم البريد الإلكتروني",
120
+ "description": "قم بإعداد الاتصال المستخدم لإرسال بريد الإشعارات وراجع نشاط التسليم الأخير.",
121
+ "tabs": { "connections": "الاتصالات", "activity": "النشاط" },
122
+ "ready": "جاهز",
123
+ "needs-setup": "يحتاج إلى إعداد",
124
+ "unavailable": "غير متاح",
125
+ "loading": "جارٍ التحميل...",
126
+ "access-denied-title": "غير مصرح",
127
+ "access-denied-description": "يلزم إذن لوحة التحكم لإدارة تسليم البريد.",
128
+ "connections-title": "الاتصالات",
129
+ "connections-description": "إعداد اتصال مزود البريد المستخدم لإشعارات النظام والتحقق منه.",
130
+ "create-connection": "إضافة اتصال",
131
+ "connection-details": "تفاصيل الاتصال",
132
+ "connection-not-found": "الاتصال غير موجود",
133
+ "no-providers-title": "لا توجد مزودات متاحة",
134
+ "no-providers-description": "اطلب من المسؤول تفعيل مزود بريد معتمد.",
135
+ "no-connections-title": "لا توجد اتصالات بريد",
136
+ "no-connections-description": "أضف اتصال مزود معتمد لبدء الإعداد.",
137
+ "details": "التفاصيل",
138
+ "view-details": "عرض التفاصيل",
139
+ "edit": "تعديل",
140
+ "validate": "تحقق",
141
+ "authorize": "تفويض",
142
+ "test-send": "إرسال اختبار",
143
+ "bind": "استخدام للإشعارات",
144
+ "unbind": "إيقاف الاستخدام",
145
+ "use-for-notifications": "استخدام للإشعارات",
146
+ "stop-using": "إيقاف الاستخدام",
147
+ "delete": "حذف",
148
+ "revoke": "إلغاء التفويض",
149
+ "save": "حفظ",
150
+ "cancel": "إلغاء",
151
+ "close": "إغلاق",
152
+ "configured": "مُعدّ",
153
+ "not-configured": "غير مُعدّ",
154
+ "safe-settings": "الإعدادات الآمنة",
155
+ "connection-overview": "نظرة عامة على الاتصال",
156
+ "provider-settings": "إعدادات المزود",
157
+ "credential-status": "حالة بيانات الاعتماد",
158
+ "last-rotated": "آخر تدوير",
159
+ "no-credentials": "لا يحتوي هذا الاتصال على بيانات اعتماد محفوظة.",
160
+ "used-for-notifications": "مستخدم للإشعارات",
161
+ "yes": "نعم",
162
+ "no": "لا",
163
+ "authorization-state": "حالة التفويض",
164
+ "provider-warnings": "إرشادات المزود",
165
+ "connection": {
166
+ "name": "الاسم",
167
+ "provider": "المزود",
168
+ "authentication-mode": "طريقة تسجيل الدخول",
169
+ "sender": "المرسل",
170
+ "sender-address": "بريد المرسل",
171
+ "sender-display-name": "اسم المرسل",
172
+ "state": "الحالة",
173
+ "bindings": "يُستخدم لـ",
174
+ "last-validation": "آخر تحقق"
175
+ },
176
+ "editor": {
177
+ "create-title": "إضافة اتصال بريد",
178
+ "edit-title": "تعديل اتصال البريد",
179
+ "description": "اختر مزوداً متاحاً وأكمل الإعدادات التي يعلنها فقط.",
180
+ "basics": "الاتصال",
181
+ "configuration": "إعدادات المزود",
182
+ "credentials": "بيانات الاعتماد",
183
+ "select-provider-mode": "اختر المزود وطريقة الدخول لعرض الإعدادات.",
184
+ "update-invalidates-proof": "حفظ التغييرات يلغي إثبات التحقق والاختبار السابق. أعد التحقق والاختبار."
185
+ },
186
+ "credential": {
187
+ "operation": "إجراء التحديث",
188
+ "keep": "الاحتفاظ بالقيمة الحالية",
189
+ "replace": "استبدال القيمة",
190
+ "clear": "مسح القيمة",
191
+ "storage-choice": "تخزين بيانات الاعتماد",
192
+ "protected-value": "قيمة محمية",
193
+ "protected-value-hint": "تُرسل مرة واحدة وتُحمى قبل التخزين ولا يمكن عرضها لاحقاً.",
194
+ "external-reference": "مرجع سر خارجي",
195
+ "external-reference-hint": "يحفظ DevOps القيمة، بينما يحفظ Pplus اسم مرجع EmailSecrets فقط."
196
+ },
197
+ "validation": {
198
+ "host": "أدخل اسم مضيف DNS معتمداً، وليس localhost أو عنوان IP.",
199
+ "https-url": "أدخل رابط HTTPS معتمداً دون بيانات دخول أو أجزاء إضافية."
200
+ },
201
+ "test": {
202
+ "title": "إرسال اختبار مضبوط",
203
+ "real-email-warning-title": "سيؤدي هذا إلى إرسال بريد فعلي.",
204
+ "real-email-warning": "تحقق من المستلمين والمحتوى قبل الإرسال.",
205
+ "recipients": "المستلمون",
206
+ "recipients-placeholder": "name@example.com",
207
+ "recipients-hint": "أدخل من 1 إلى 100 عنوان مختلف.",
208
+ "recipients-invalid": "أدخل من 1 إلى 100 عنوان بريد صحيح ومختلف.",
209
+ "subject": "الموضوع",
210
+ "body": "المحتوى",
211
+ "html": "إرسال بصيغة HTML",
212
+ "send": "إرسال الاختبار",
213
+ "retrieve": "استرجاع النتيجة",
214
+ "timeout-title": "لم تصل نتيجة الإرسال.",
215
+ "timeout-description": "استرجع النتيجة المحفوظة بنفس معرف الطلب. لن يتم إرسال بريد آخر."
216
+ },
217
+ "accepted-unconfirmed": "قبله المزود — لم يتم تأكيد التسليم النهائي لصندوق البريد.",
218
+ "accepted-copy": "قبله المزود — لم يتم تأكيد التسليم النهائي لصندوق البريد.",
219
+ "outcome-unknown-warning": "نتيجة المزود غير معروفة. لا تعد الإرسال حتى يحقق المشغل.",
220
+ "outcome-unknown-copy": "نتيجة المزود غير معروفة. لا تعد الإرسال حتى يحقق المشغل.",
221
+ "activity-title": "محاولات التسليم الأخيرة",
222
+ "activity-description": "يظهر قبول المزود منفصلاً عن التسليم النهائي لصندوق البريد.",
223
+ "all-statuses": "كل الحالات",
224
+ "apply-filter": "تطبيق المرشح",
225
+ "attempt-details": "تفاصيل المحاولة",
226
+ "delivery-summary": "ملخص التسليم",
227
+ "technical-identifiers": "المعرّفات التقنية",
228
+ "no-attempts-title": "لا توجد محاولات تسليم",
229
+ "no-attempts-description": "ستظهر هنا محاولات الإشعارات والاختبارات الحديثة.",
230
+ "load-more": "تحميل المزيد",
231
+ "recipient-fingerprint": "بصمة المستلم",
232
+ "provider-request-id": "معرف طلب المزود",
233
+ "correlation-id": "معرف الارتباط",
234
+ "attempt": {
235
+ "id": "معرف المحاولة",
236
+ "status": "الحالة",
237
+ "status-filter": "تصفية حسب الحالة",
238
+ "provider": "المزود",
239
+ "created": "الوقت",
240
+ "count": "المحاولات",
241
+ "outcome": "نتيجة المزود"
242
+ },
243
+ "replay-attempt": "إعادة تشغيل المحاولة",
244
+ "replay-warning": "تُجدول الإعادة عملية مزود جديدة. تأكد من أن الإعادة آمنة.",
245
+ "replay-exceptional-warning": "قد يكون البريد الأصلي قد قُبل بالفعل. قد تؤدي الإعادة إلى تكراره وتتطلب موافقة استثنائية صريحة.",
246
+ "operator-reason": "سبب المشغل",
247
+ "operator-reason-hint": "مطلوب لسجل التدقيق؛ بحد أقصى 500 حرف.",
248
+ "exceptional-override": "أوافق على إعادة استثنائية",
249
+ "exceptional-override-hint": "استخدمه فقط بعد التحقيق في احتمال قبول الرسالة الأصلية.",
250
+ "confirm-action": "تأكيد",
251
+ "advanced-support": "الدعم المتقدم",
252
+ "advanced-support-description": "أدوات الاسترداد والأدلة للمشغلين المدربين.",
253
+ "quarantine-title": "عزل الإنهاء",
254
+ "quarantine-description": "نتائج تحتاج إلى استرداد أو إقرار من المشغل.",
255
+ "no-quarantine-title": "لا توجد نتائج معزولة",
256
+ "no-quarantine-description": "لا توجد عناصر للمراجعة.",
257
+ "recovery-classification": "تصنيف الاسترداد",
258
+ "code": "الرمز",
259
+ "issue": "المشكلة",
260
+ "detected": "وقت الاكتشاف",
261
+ "actions": "الإجراءات",
262
+ "retry": "إعادة المحاولة",
263
+ "acknowledge": "إقرار",
264
+ "retry-quarantine": "إعادة محاولة النتيجة المعزولة",
265
+ "acknowledge-quarantine": "الإقرار بالنتيجة المعزولة",
266
+ "quarantine-retry-warning": "أعد الإنهاء باستخدام نتيجة المزود المحفوظة.",
267
+ "quarantine-acknowledge-warning": "يُنهي الإقرار النتيجة المجهولة المرتبطة.",
268
+ "host-evidence-title": "أدلة المضيف",
269
+ "host-evidence-description": "أدلة يتيمة أو متعارضة أو غير محلولة. لا تتم معاينة ملفات التصدير أو حفظها.",
270
+ "no-evidence-title": "لا توجد أدلة مضيف",
271
+ "no-evidence-description": "لا توجد حالات أدلة غير محلولة.",
272
+ "evidence-kind": "نوع الدليل",
273
+ "evidence-occurrence-id": "معرف حالة الدليل",
274
+ "resolution-state": "حالة الحل",
275
+ "ownership-state": "حالة الملكية",
276
+ "export": "تصدير",
277
+ "repair": "إصلاح",
278
+ "repair-evidence": "إصلاح الدليل",
279
+ "acknowledge-evidence": "الإقرار بالدليل",
280
+ "evidence-repair-warning": "يستخدم الإصلاح أحدث رمز قرار وقد يحدث المحاولة المرتبطة.",
281
+ "evidence-acknowledge-warning": "يسجل الإقرار مراجعة الحالة دون إصلاح.",
282
+ "rebuild-evidence-index": "إعادة بناء فهرس الأدلة",
283
+ "rebuild-evidence-warning": "إعادة بناء فهرس الأدلة بميزانية فحص 200؟",
284
+ "scan-budget-exhausted": "اكتملت ميزانية الفحص. أعد البناء أو حمّل النتائج.",
285
+ "confirm": {
286
+ "unbind": "سيوقف هذا بريد الإشعارات لهذا الغرض.",
287
+ "delete": "حذف الاتصال غير المرتبط وبيانات اعتماده وتفويضه؟",
288
+ "revoke": "إلغاء التفويض المحفوظ؟ سيلزم تفويض واختبار جديدان."
289
+ },
290
+ "unknown-code": "حدث خطأ في تسليم البريد.",
291
+ "connection-created": "تم إنشاء الاتصال.",
292
+ "connection-updated": "تم تحديث الاتصال.",
293
+ "connection-deleted": "تم حذف الاتصال.",
294
+ "connection-bound": "يُستخدم هذا الاتصال الآن للإشعارات.",
295
+ "connection-unbound": "تم إيقاف بريد الإشعارات.",
296
+ "authorization-revoked": "تم إلغاء التفويض.",
297
+ "attempt-replay-scheduled": "تمت جدولة الإعادة.",
298
+ "quarantine-retry-submitted": "تم إرسال إعادة محاولة العزل.",
299
+ "quarantine-acknowledged": "تم الإقرار بعنصر العزل.",
300
+ "evidence-repaired": "تم إصلاح الدليل.",
301
+ "evidence-acknowledged": "تم الإقرار بالدليل.",
302
+ "evidence-index-rebuilt": "تمت إعادة بناء فهرس الأدلة.",
303
+ "status": {
304
+ "connection": {
305
+ "draft": "مسودة",
306
+ "pending-authorization": "في انتظار التفويض",
307
+ "pending-validation": "في انتظار التحقق",
308
+ "ready": "جاهز",
309
+ "reauthorization-required": "يلزم إعادة التفويض",
310
+ "conditional-access-required": "يلزم الوصول المشروط",
311
+ "disabled": "معطل",
312
+ "invalid": "غير صالح"
313
+ },
314
+ "attempt": {
315
+ "reserved": "محجوز",
316
+ "provider-invocation-started": "جارٍ الإرسال",
317
+ "provider-not-accepted": "لم يقبل المزود",
318
+ "reconciling": "جارٍ المطابقة",
319
+ "pending": "قيد الانتظار",
320
+ "blocked": "محظور",
321
+ "retry-scheduled": "تمت جدولة إعادة المحاولة",
322
+ "accepted": "قبله المزود",
323
+ "outcome-unknown": "النتيجة غير معروفة",
324
+ "failed-permanent": "فشل نهائي",
325
+ "dead-lettered": "يحتاج مراجعة المشغل"
326
+ },
327
+ "support": {
328
+ "active": "نشط",
329
+ "repair-pending": "الإصلاح قيد الانتظار",
330
+ "repaired": "تم الإصلاح",
331
+ "acknowledgement-pending": "الإقرار قيد الانتظار",
332
+ "conflict": "تعارض",
333
+ "owned": "مملوك",
334
+ "missing": "مفقود",
335
+ "identity-incomplete": "الهوية غير مكتملة",
336
+ "retryable-after-upgrade": "إعادة المحاولة بعد الترقية",
337
+ "repair-required": "يلزم الإصلاح",
338
+ "acknowledge-only": "إقرار فقط",
339
+ "configured": "مُعدّ",
340
+ "not-configured": "غير مُعدّ",
341
+ "acknowledged": "تم الإقرار"
342
+ }
343
+ },
344
+ "error-actions": {
345
+ "refresh": "حدّث أحدث حالة",
346
+ "request_permission": "اطلب الصلاحية المطلوبة",
347
+ "authorize": "فوّض الاتصال",
348
+ "retry_later": "حاول مرة أخرى لاحقاً",
349
+ "poll_status": "تحقق من الحالة المحفوظة",
350
+ "review_evidence": "راجع أدلة الاسترداد",
351
+ "inspect_notification": "راجع إعدادات الإشعارات",
352
+ "contact_administrator": "تواصل مع مسؤول النظام",
353
+ "correct_input": "صحح المعلومات المدخلة",
354
+ "correct_configuration": "صحح إعداد الاتصال",
355
+ "contact_support": "تواصل مع الدعم"
356
+ },
357
+ "codes": {
358
+ "email.ready": "تسليم البريد جاهز.",
359
+ "email.not_ready": "أكمل إعداد الاتصال والتحقق والاختبار.",
360
+ "email.management_disabled": "إدارة تسليم البريد غير متاحة.",
361
+ "email.validation_succeeded": "نجح التحقق من الاتصال.",
362
+ "email.authorization_completed": "اكتمل تفويض صندوق البريد.",
363
+ "email.delivery_result_quarantined": "تحتاج نتيجة التسليم إلى مراجعة.",
364
+ "email.secret_unavailable": "بيانات الاعتماد غير متاحة.",
365
+ "email.concurrency_conflict": "تم تغيير العنصر. حدّث وحاول مرة أخرى."
366
+ }
133
367
  }
134
368
  }