@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.
- package/assets/i18n/en.json +9 -69
- package/assets/i18n/pt.json +80 -0
- package/assets/icons/icon-128.webp +0 -0
- package/assets/icons/icon-192.webp +0 -0
- package/assets/icons/icon-256.webp +0 -0
- package/assets/icons/icon-48.webp +0 -0
- package/assets/icons/icon-512.webp +0 -0
- package/assets/icons/icon-72.webp +0 -0
- package/assets/icons/icon-96.webp +0 -0
- package/assets/images/apple-touch-icon.png +0 -0
- package/assets/images/favicon.png +0 -0
- package/assets/images/favicon.svg +29 -0
- package/components/component-renderer/component-renderer.component.d.ts +5 -4
- package/components/crud-field/crud-field.component.d.ts +186 -22
- package/components/crud-form/crud-form.component.d.ts +194 -8
- package/components/empty-state/empty-state.component.d.ts +9 -10
- package/components/fieldset/fieldset.component.d.ts +383 -36
- package/components/filter/filter.component.d.ts +11 -2
- package/components/list/list.component.d.ts +1 -1
- package/components/list-item/list-item.component.d.ts +2 -2
- package/components/model-renderer/model-renderer.component.d.ts +1 -5
- package/directives/collapsable.directive.d.ts +1 -0
- package/engine/NgxBaseComponent.d.ts +43 -43
- package/engine/NgxCrudFormField.d.ts +7 -3
- package/engine/NgxFormService.d.ts +113 -12
- package/engine/NgxRenderingEngine.d.ts +178 -25
- package/engine/constants.d.ts +11 -6
- package/engine/decorators.d.ts +2 -2
- package/engine/index.d.ts +4 -2
- package/engine/interfaces.d.ts +271 -0
- package/engine/types.d.ts +11 -206
- package/esm2022/components/component-renderer/component-renderer.component.mjs +13 -11
- package/esm2022/components/crud-field/crud-field.component.mjs +213 -8
- package/esm2022/components/crud-form/crud-form.component.mjs +133 -13
- package/esm2022/components/empty-state/empty-state.component.mjs +13 -12
- package/esm2022/components/fieldset/fieldset.component.mjs +485 -43
- package/esm2022/components/filter/filter.component.mjs +16 -6
- package/esm2022/components/layout/layout.component.mjs +3 -3
- package/esm2022/components/list/list.component.mjs +4 -5
- package/esm2022/components/list-item/list-item.component.mjs +10 -10
- package/esm2022/components/model-renderer/model-renderer.component.mjs +9 -8
- package/esm2022/components/pagination/pagination.component.mjs +7 -7
- package/esm2022/components/searchbar/searchbar.component.mjs +3 -3
- package/esm2022/directives/collapsable.directive.mjs +3 -2
- package/esm2022/engine/NgxBaseComponent.mjs +64 -63
- package/esm2022/engine/NgxCrudFormField.mjs +14 -4
- package/esm2022/engine/NgxFormService.mjs +239 -27
- package/esm2022/engine/NgxRenderingEngine.mjs +218 -46
- package/esm2022/engine/ValidatorFactory.mjs +6 -4
- package/esm2022/engine/constants.mjs +14 -9
- package/esm2022/engine/decorators.mjs +6 -6
- package/esm2022/engine/index.mjs +5 -3
- package/esm2022/engine/interfaces.mjs +4 -0
- package/esm2022/engine/types.mjs +1 -3
- package/esm2022/helpers/utils.mjs +53 -32
- package/esm2022/i18n/Loader.mjs +82 -0
- package/fesm2022/decaf-ts-for-angular.mjs +3030 -2097
- package/fesm2022/decaf-ts-for-angular.mjs.map +1 -1
- package/helpers/utils.d.ts +42 -16
- package/i18n/Loader.d.ts +48 -0
- package/package.json +11 -1
- package/engine/NgxRenderingEngine2.d.ts +0 -250
- package/esm2022/engine/NgxRenderingEngine2.mjs +0 -332
- package/esm2022/interfaces.mjs +0 -2
- 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==
|