@decaf-ts/for-angular 0.0.16 → 0.0.18

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.
Files changed (65) hide show
  1. package/assets/i18n/en.json +9 -69
  2. package/assets/i18n/pt.json +80 -0
  3. package/assets/icons/icon-128.webp +0 -0
  4. package/assets/icons/icon-192.webp +0 -0
  5. package/assets/icons/icon-256.webp +0 -0
  6. package/assets/icons/icon-48.webp +0 -0
  7. package/assets/icons/icon-512.webp +0 -0
  8. package/assets/icons/icon-72.webp +0 -0
  9. package/assets/icons/icon-96.webp +0 -0
  10. package/assets/images/apple-touch-icon.png +0 -0
  11. package/assets/images/favicon.png +0 -0
  12. package/assets/images/favicon.svg +29 -0
  13. package/components/component-renderer/component-renderer.component.d.ts +5 -4
  14. package/components/crud-field/crud-field.component.d.ts +186 -22
  15. package/components/crud-form/crud-form.component.d.ts +194 -8
  16. package/components/empty-state/empty-state.component.d.ts +9 -10
  17. package/components/fieldset/fieldset.component.d.ts +383 -36
  18. package/components/filter/filter.component.d.ts +11 -2
  19. package/components/list/list.component.d.ts +1 -1
  20. package/components/list-item/list-item.component.d.ts +2 -2
  21. package/components/model-renderer/model-renderer.component.d.ts +1 -5
  22. package/directives/collapsable.directive.d.ts +1 -0
  23. package/engine/NgxBaseComponent.d.ts +43 -43
  24. package/engine/NgxCrudFormField.d.ts +7 -3
  25. package/engine/NgxFormService.d.ts +113 -12
  26. package/engine/NgxRenderingEngine.d.ts +178 -25
  27. package/engine/constants.d.ts +11 -6
  28. package/engine/decorators.d.ts +2 -2
  29. package/engine/index.d.ts +4 -2
  30. package/engine/interfaces.d.ts +271 -0
  31. package/engine/types.d.ts +11 -206
  32. package/esm2022/components/component-renderer/component-renderer.component.mjs +13 -11
  33. package/esm2022/components/crud-field/crud-field.component.mjs +213 -8
  34. package/esm2022/components/crud-form/crud-form.component.mjs +133 -13
  35. package/esm2022/components/empty-state/empty-state.component.mjs +13 -12
  36. package/esm2022/components/fieldset/fieldset.component.mjs +485 -43
  37. package/esm2022/components/filter/filter.component.mjs +16 -6
  38. package/esm2022/components/layout/layout.component.mjs +3 -3
  39. package/esm2022/components/list/list.component.mjs +4 -5
  40. package/esm2022/components/list-item/list-item.component.mjs +10 -10
  41. package/esm2022/components/model-renderer/model-renderer.component.mjs +9 -8
  42. package/esm2022/components/pagination/pagination.component.mjs +7 -7
  43. package/esm2022/components/searchbar/searchbar.component.mjs +3 -3
  44. package/esm2022/directives/collapsable.directive.mjs +3 -2
  45. package/esm2022/engine/NgxBaseComponent.mjs +64 -63
  46. package/esm2022/engine/NgxCrudFormField.mjs +14 -4
  47. package/esm2022/engine/NgxFormService.mjs +239 -27
  48. package/esm2022/engine/NgxRenderingEngine.mjs +218 -46
  49. package/esm2022/engine/ValidatorFactory.mjs +6 -4
  50. package/esm2022/engine/constants.mjs +14 -9
  51. package/esm2022/engine/decorators.mjs +6 -6
  52. package/esm2022/engine/index.mjs +5 -3
  53. package/esm2022/engine/interfaces.mjs +4 -0
  54. package/esm2022/engine/types.mjs +1 -3
  55. package/esm2022/helpers/utils.mjs +53 -32
  56. package/esm2022/i18n/Loader.mjs +82 -0
  57. package/fesm2022/decaf-ts-for-angular.mjs +3030 -2097
  58. package/fesm2022/decaf-ts-for-angular.mjs.map +1 -1
  59. package/helpers/utils.d.ts +42 -16
  60. package/i18n/Loader.d.ts +48 -0
  61. package/package.json +11 -1
  62. package/engine/NgxRenderingEngine2.d.ts +0 -250
  63. package/esm2022/engine/NgxRenderingEngine2.mjs +0 -332
  64. package/esm2022/interfaces.mjs +0 -2
  65. package/interfaces.d.ts +0 -28
@@ -0,0 +1,82 @@
1
+ import { TranslateHttpLoader } from '@ngx-translate/http-loader';
2
+ import { forkJoin } from 'rxjs';
3
+ import { map } from 'rxjs/operators';
4
+ import { inject, InjectionToken } from '@angular/core';
5
+ import { cleanSpaces, getLocaleFromClassName } from '../helpers';
6
+ export class I18nLoader {
7
+ static loadFromHttp(http) {
8
+ function getSuffix() {
9
+ const today = new Date();
10
+ return `.json?version=${today.getFullYear()}${today.getMonth()}${today.getDay()}`;
11
+ }
12
+ return new (class extends TranslateHttpLoader {
13
+ getTranslation(lang) {
14
+ const res = super.getTranslation(lang);
15
+ return res;
16
+ }
17
+ })(http, './assets/i18n/', getSuffix());
18
+ }
19
+ }
20
+ export function getLocaleContext(clazz, suffix) {
21
+ return getLocaleFromClassName(clazz, suffix);
22
+ }
23
+ /**
24
+ * @description Generates a localized string by combining locale and phrase
25
+ * @summary This utility function creates a properly formatted locale string by combining
26
+ * a locale identifier with a phrase. It handles edge cases such as empty phrases,
27
+ * missing locales, and phrases that already include the locale prefix. This function
28
+ * is useful for ensuring consistent formatting of localized strings throughout the application.
29
+ *
30
+ * @param {string} locale - The locale identifier (e.g., 'en', 'fr')
31
+ * @param {string | undefined} phrase - The phrase to localize
32
+ * @return {string} The formatted locale string, or empty string if phrase is undefined
33
+ *
34
+ * @function generateLocaleFromString
35
+ * @memberOf module:for-angular
36
+ */
37
+ export function getLocaleContextByKey(locale, phrase) {
38
+ if (!phrase)
39
+ return locale;
40
+ if (!locale || phrase.includes(`${locale}.`))
41
+ return phrase;
42
+ const parts = phrase.split(' ');
43
+ return `${locale}.${cleanSpaces(parts.join('.'), true)}`;
44
+ }
45
+ export const I18N_CONFIG_TOKEN = new InjectionToken('I18N_CONFIG_TOKEN');
46
+ export function I18nLoaderFactory(http) {
47
+ const { resources, versionedSuffix } = inject(I18N_CONFIG_TOKEN, { optional: true }) ?? getI18nLoaderFactoryProviderConfig().useValue;
48
+ return new MultiI18nLoader(http, resources, versionedSuffix);
49
+ }
50
+ export function getI18nLoaderFactoryProviderConfig(resources = [], versionedSuffix = false) {
51
+ if (!Array.isArray(resources))
52
+ resources = [resources];
53
+ return {
54
+ provide: I18N_CONFIG_TOKEN,
55
+ useValue: { resources: [
56
+ { prefix: './assets/i18n/', suffix: '.json' },
57
+ ...resources
58
+ ], versionedSuffix }
59
+ };
60
+ }
61
+ export class MultiI18nLoader {
62
+ constructor(http, resources = [], versionedSuffix = false) {
63
+ this.http = http;
64
+ this.resources = resources;
65
+ this.versionedSuffix = versionedSuffix;
66
+ }
67
+ getSuffix(suffix) {
68
+ if (!this.versionedSuffix)
69
+ return suffix;
70
+ const today = new Date();
71
+ return `${suffix}?version=${today.getFullYear()}${today.getMonth()}${today.getDay()}`;
72
+ }
73
+ getTranslation(lang) {
74
+ const requests = this.resources.map(config => this.http.get(`${config.prefix}${lang}${this.getSuffix(config.suffix)}`));
75
+ return forkJoin(requests).pipe(map(responseArray => {
76
+ return responseArray.reduce((acc, current) => {
77
+ return { ...acc, ...current };
78
+ }, {});
79
+ }));
80
+ }
81
+ }
82
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTG9hZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9pMThuL0xvYWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsUUFBUSxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVyQyxPQUFPLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV2RCxPQUFPLEVBQUUsV0FBVyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ2pFLE1BQU0sT0FBTyxVQUFVO0lBQ3JCLE1BQU0sQ0FBQyxZQUFZLENBQUMsSUFBZ0I7UUFDbEMsU0FBUyxTQUFTO1lBQ2hCLE1BQU0sS0FBSyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7WUFDekIsT0FBTyxpQkFBaUIsS0FBSyxDQUFDLFdBQVcsRUFBRSxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQUUsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLEVBQVksQ0FBQztRQUM5RixDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUMsS0FBTSxTQUFRLG1CQUFtQjtZQUNsQyxjQUFjLENBQUMsSUFBWTtnQkFDbEMsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDdkMsT0FBTyxHQUFHLENBQUM7WUFDYixDQUFDO1NBQ0YsQ0FBQyxDQUFDLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO0lBQzFDLENBQUM7Q0FDRjtBQUdELE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxLQUFxQyxFQUFFLE1BQWU7SUFDckYsT0FBTyxzQkFBc0IsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDL0MsQ0FBQztBQUVEOzs7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QUM7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgVHJhbnNsYXRlTG9hZGVyLCBUcmFuc2xhdGlvbk9iamVjdCB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgVHJhbnNsYXRlSHR0cExvYWRlciB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2h0dHAtbG9hZGVyJztcbmltcG9ydCB7IGZvcmtKb2luLCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge0kxOG5SZXNvdXJjZUNvbmZpZ30gZnJvbSAnLi4vZW5naW5lL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgaW5qZWN0LCBJbmplY3Rpb25Ub2tlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRnVuY3Rpb25MaWtlIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IGNsZWFuU3BhY2VzLCBnZXRMb2NhbGVGcm9tQ2xhc3NOYW1lIH0gZnJvbSAnLi4vaGVscGVycyc7XG5leHBvcnQgY2xhc3MgSTE4bkxvYWRlciB7XG4gIHN0YXRpYyBsb2FkRnJvbUh0dHAoaHR0cDogSHR0cENsaWVudCk6IFRyYW5zbGF0ZUxvYWRlciB7XG4gICAgZnVuY3Rpb24gZ2V0U3VmZml4KCkge1xuICAgICAgY29uc3QgdG9kYXkgPSBuZXcgRGF0ZSgpO1xuICAgICAgcmV0dXJuIGAuanNvbj92ZXJzaW9uPSR7dG9kYXkuZ2V0RnVsbFllYXIoKX0ke3RvZGF5LmdldE1vbnRoKCl9JHt0b2RheS5nZXREYXkoKX1gIGFzIHN0cmluZztcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IChjbGFzcyBleHRlbmRzIFRyYW5zbGF0ZUh0dHBMb2FkZXIge1xuICAgICAgb3ZlcnJpZGUgZ2V0VHJhbnNsYXRpb24obGFuZzogc3RyaW5nKTogT2JzZXJ2YWJsZTxUcmFuc2xhdGlvbk9iamVjdD4ge1xuICAgICAgICBjb25zdCByZXMgPSBzdXBlci5nZXRUcmFuc2xhdGlvbihsYW5nKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH1cbiAgICB9KShodHRwLCAnLi9hc3NldHMvaTE4bi8nLCBnZXRTdWZmaXgoKSk7XG4gIH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TG9jYWxlQ29udGV4dChjbGF6ejogRnVuY3Rpb25MaWtlIHwgb2JqZWN0IHwgc3RyaW5nLCBzdWZmaXg/OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gZ2V0TG9jYWxlRnJvbUNsYXNzTmFtZShjbGF6eiwgc3VmZml4KTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gR2VuZXJhdGVzIGEgbG9jYWxpemVkIHN0cmluZyBieSBjb21iaW5pbmcgbG9jYWxlIGFuZCBwaHJhc2VcbiAqIEBzdW1tYXJ5IFRoaXMgdXRpbGl0eSBmdW5jdGlvbiBjcmVhdGVzIGEgcHJvcGVybHkgZm9ybWF0dGVkIGxvY2FsZSBzdHJpbmcgYnkgY29tYmluaW5nXG4gKiBhIGxvY2FsZSBpZGVudGlmaWVyIHdpdGggYSBwaHJhc2UuIEl0IGhhbmRsZXMgZWRnZSBjYXNlcyBzdWNoIGFzIGVtcHR5IHBocmFzZXMsXG4gKiBtaXNzaW5nIGxvY2FsZXMsIGFuZCBwaHJhc2VzIHRoYXQgYWxyZWFkeSBpbmNsdWRlIHRoZSBsb2NhbGUgcHJlZml4LiBUaGlzIGZ1bmN0aW9uXG4gKiBpcyB1c2VmdWwgZm9yIGVuc3VyaW5nIGNvbnNpc3RlbnQgZm9ybWF0dGluZyBvZiBsb2NhbGl6ZWQgc3RyaW5ncyB0aHJvdWdob3V0IHRoZSBhcHBsaWNhdGlvbi5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbG9jYWxlIC0gVGhlIGxvY2FsZSBpZGVudGlmaWVyIChlLmcuLCAnZW4nLCAnZnInKVxuICogQHBhcmFtIHtzdHJpbmcgfCB1bmRlZmluZWR9IHBocmFzZSAtIFRoZSBwaHJhc2UgdG8gbG9jYWxpemVcbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGZvcm1hdHRlZCBsb2NhbGUgc3RyaW5nLCBvciBlbXB0eSBzdHJpbmcgaWYgcGhyYXNlIGlzIHVuZGVmaW5lZFxuICpcbiAqIEBmdW5jdGlvbiBnZW5lcmF0ZUxvY2FsZUZyb21TdHJpbmdcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWFuZ3VsYXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldExvY2FsZUNvbnRleHRCeUtleShcbiAgbG9jYWxlOiBzdHJpbmcsXG4gIHBocmFzZTogc3RyaW5nIHwgdW5kZWZpbmVkXG4pOiBzdHJpbmcge1xuICBpZiAoIXBocmFzZSlcbiAgICByZXR1cm4gbG9jYWxlO1xuICBpZiAoIWxvY2FsZSB8fCBwaHJhc2UuaW5jbHVkZXMoYCR7bG9jYWxlfS5gKSlcbiAgICByZXR1cm4gcGhyYXNlO1xuICBjb25zdCBwYXJ0cyA9IHBocmFzZS5zcGxpdCgnICcpO1xuICByZXR1cm4gYCR7bG9jYWxlfS4ke2NsZWFuU3BhY2VzKHBhcnRzLmpvaW4oJy4nKSwgdHJ1ZSl9YDtcbn1cblxuZXhwb3J0IGNvbnN0IEkxOE5fQ09ORklHX1RPS0VOID0gbmV3IEluamVjdGlvblRva2VuPHtyZXNvdXJjZXM6IEkxOG5SZXNvdXJjZUNvbmZpZ1tdOyB2ZXJzaW9uZWRTdWZmaXg6IGZhbHNlfT4oJ0kxOE5fQ09ORklHX1RPS0VOJyk7XG5cbmV4cG9ydCBmdW5jdGlvbiBJMThuTG9hZGVyRmFjdG9yeShodHRwOiBIdHRwQ2xpZW50KTogVHJhbnNsYXRlTG9hZGVyIHtcbiAgY29uc3Qge3Jlc291cmNlcywgdmVyc2lvbmVkU3VmZml4fSA9IGluamVjdChJMThOX0NPTkZJR19UT0tFTiwgeyBvcHRpb25hbDogdHJ1ZSB9KSA/PyBnZXRJMThuTG9hZGVyRmFjdG9yeVByb3ZpZGVyQ29uZmlnKCkudXNlVmFsdWU7XG4gIHJldHVybiBuZXcgTXVsdGlJMThuTG9hZGVyKGh0dHAsIHJlc291cmNlcywgdmVyc2lvbmVkU3VmZml4KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEkxOG5Mb2FkZXJGYWN0b3J5UHJvdmlkZXJDb25maWcocmVzb3VyY2VzOiBJMThuUmVzb3VyY2VDb25maWcgfCBJMThuUmVzb3VyY2VDb25maWdbXSA9IFtdLCB2ZXJzaW9uZWRTdWZmaXg6IGJvb2xlYW4gPSBmYWxzZSkge1xuICBpZighQXJyYXkuaXNBcnJheShyZXNvdXJjZXMpKVxuICAgIHJlc291cmNlcyA9IFtyZXNvdXJjZXNdO1xuICByZXR1cm4ge1xuICAgIHByb3ZpZGU6IEkxOE5fQ09ORklHX1RPS0VOLFxuICAgIHVzZVZhbHVlOiB7IHJlc291cmNlczogW1xuICAgICAgeyBwcmVmaXg6ICcuL2Fzc2V0cy9pMThuLycsIHN1ZmZpeDogJy5qc29uJyB9LFxuICAgICAgLi4ucmVzb3VyY2VzXG4gICAgXSwgdmVyc2lvbmVkU3VmZml4fVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBNdWx0aUkxOG5Mb2FkZXIgaW1wbGVtZW50cyBJMThuTG9hZGVyIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LCBwcml2YXRlIHJlc291cmNlczogSTE4blJlc291cmNlQ29uZmlnW10gPSBbXSwgcHJpdmF0ZSB2ZXJzaW9uZWRTdWZmaXg6IGJvb2xlYW4gPSBmYWxzZSkge31cblxuICBwcml2YXRlIGdldFN1ZmZpeChzdWZmaXg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYoIXRoaXMudmVyc2lvbmVkU3VmZml4KVxuICAgICAgcmV0dXJuIHN1ZmZpeDtcbiAgICBjb25zdCB0b2RheSA9IG5ldyBEYXRlKCk7XG4gICAgcmV0dXJuIGAke3N1ZmZpeH0/dmVyc2lvbj0ke3RvZGF5LmdldEZ1bGxZZWFyKCl9JHt0b2RheS5nZXRNb250aCgpfSR7dG9kYXkuZ2V0RGF5KCl9YCBhcyBzdHJpbmc7XG4gIH1cblxuICBnZXRUcmFuc2xhdGlvbihsYW5nOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFRyYW5zbGF0aW9uT2JqZWN0PiB7XG4gICAgY29uc3QgcmVxdWVzdHMgPSB0aGlzLnJlc291cmNlcy5tYXAoY29uZmlnID0+XG4gICAgICB0aGlzLmh0dHAuZ2V0KGAke2NvbmZpZy5wcmVmaXh9JHtsYW5nfSR7dGhpcy5nZXRTdWZmaXgoY29uZmlnLnN1ZmZpeCl9YClcbiAgICApO1xuXG4gICAgcmV0dXJuIGZvcmtKb2luKHJlcXVlc3RzKS5waXBlKFxuICAgICAgbWFwKHJlc3BvbnNlQXJyYXkgPT4ge1xuICAgICAgICByZXR1cm4gcmVzcG9uc2VBcnJheS5yZWR1Y2UoKGFjYywgY3VycmVudCkgPT4ge1xuICAgICAgICAgIHJldHVybiB7IC4uLmFjYywgLi4uY3VycmVudCB9O1xuICAgICAgICB9LCB7fSk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cbn1cbiJdfQ==