@unipin/angular-applet 18.0.4 → 18.1.5

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 (23) hide show
  1. package/esm2022/lib/components/containers/applet-container/applet-container.component.mjs +3 -3
  2. package/esm2022/lib/components/forms/country-input/form-country-input.component.mjs +118 -0
  3. package/esm2022/lib/components/forms/currency-input/form-currency-input.component.mjs +33 -41
  4. package/esm2022/lib/components/forms/index.mjs +2 -1
  5. package/esm2022/lib/components/index.mjs +2 -2
  6. package/esm2022/lib/utils/contrast-color-generator/contrast-color-generator.util.mjs +16 -0
  7. package/esm2022/lib/utils/form-error-message/form-error-message.util.mjs +21 -0
  8. package/esm2022/lib/utils/format-capitalize/format-capitalize.util.mjs +18 -0
  9. package/esm2022/lib/utils/index.mjs +4 -2
  10. package/esm2022/public-api.mjs +3 -3
  11. package/fesm2022/unipin-angular-applet.mjs +178 -43
  12. package/fesm2022/unipin-angular-applet.mjs.map +1 -1
  13. package/lib/components/forms/country-input/form-country-input.component.d.ts +40 -0
  14. package/lib/components/forms/currency-input/form-currency-input.component.d.ts +19 -24
  15. package/lib/components/forms/index.d.ts +1 -0
  16. package/lib/components/index.d.ts +1 -1
  17. package/lib/utils/contrast-color-generator/contrast-color-generator.util.d.ts +4 -0
  18. package/lib/utils/format-capitalize/format-capitalize.util.d.ts +1 -0
  19. package/lib/utils/index.d.ts +3 -1
  20. package/package.json +1 -1
  21. package/public-api.d.ts +2 -2
  22. package/esm2022/lib/utils/form-error-message.util.mjs +0 -21
  23. /package/lib/utils/{form-error-message.util.d.ts → form-error-message/form-error-message.util.d.ts} +0 -0
@@ -0,0 +1,21 @@
1
+ const errMessage = {
2
+ email: (label) => `${label} is not a valid email`,
3
+ required: (label) => `${label} is required`,
4
+ minlength: (label, length) => `${label} must be at least ${length} characters`,
5
+ maxlength: (label, length) => `${label} must not exceed ${length} characters`,
6
+ max: (label, max) => `${label} value must be lower than ${max}`,
7
+ min: (label, min) => `${label} value must be larger than ${min}`,
8
+ };
9
+ const extraParamKey = {
10
+ minlength: 'requiredLength',
11
+ maxlength: 'requiredLength',
12
+ max: 'max',
13
+ min: 'min'
14
+ };
15
+ export function getFormErrorMessage(err, label) {
16
+ if (!err)
17
+ return '';
18
+ const key = Object.keys(err)[0];
19
+ return errMessage[key](label ?? 'Column', err[key][extraParamKey[key]]);
20
+ }
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1lcnJvci1tZXNzYWdlLnV0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91bmlwaW4tYW5ndWxhci9zcmMvbGliL3V0aWxzL2Zvcm0tZXJyb3ItbWVzc2FnZS9mb3JtLWVycm9yLW1lc3NhZ2UudXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxNQUFNLFVBQVUsR0FBeUQ7SUFDdkUsS0FBSyxFQUFFLENBQUMsS0FBYSxFQUFFLEVBQUUsQ0FBQyxHQUFJLEtBQU0sdUJBQXVCO0lBQzNELFFBQVEsRUFBRSxDQUFDLEtBQWEsRUFBRSxFQUFFLENBQUMsR0FBSSxLQUFNLGNBQWM7SUFDckQsU0FBUyxFQUFFLENBQUMsS0FBYSxFQUFFLE1BQWUsRUFBRSxFQUFFLENBQUMsR0FBSSxLQUFNLHFCQUFzQixNQUFPLGFBQWE7SUFDbkcsU0FBUyxFQUFFLENBQUMsS0FBYSxFQUFFLE1BQWUsRUFBRSxFQUFFLENBQUMsR0FBSSxLQUFNLG9CQUFxQixNQUFPLGFBQWE7SUFDbEcsR0FBRyxFQUFFLENBQUMsS0FBYSxFQUFFLEdBQVksRUFBRSxFQUFFLENBQUMsR0FBSSxLQUFNLDZCQUE4QixHQUFJLEVBQUU7SUFDcEYsR0FBRyxFQUFFLENBQUMsS0FBYSxFQUFFLEdBQVksRUFBRSxFQUFFLENBQUMsR0FBSSxLQUFNLDhCQUErQixHQUFJLEVBQUU7Q0FDdEYsQ0FBQztBQUVGLE1BQU0sYUFBYSxHQUE0QjtJQUM3QyxTQUFTLEVBQUUsZ0JBQWdCO0lBQzNCLFNBQVMsRUFBRSxnQkFBZ0I7SUFDM0IsR0FBRyxFQUFFLEtBQUs7SUFDVixHQUFHLEVBQUUsS0FBSztDQUNYLENBQUM7QUFRRixNQUFNLFVBQVUsbUJBQW1CLENBQUMsR0FBNEIsRUFBRSxLQUFjO0lBQzlFLElBQUksQ0FBQyxHQUFHO1FBQUUsT0FBTyxFQUFFLENBQUM7SUFFcEIsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNoQyxPQUFPLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLElBQUcsUUFBUSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3pFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBWYWxpZGF0aW9uRXJyb3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5jb25zdCBlcnJNZXNzYWdlOiB7IFtrOiBzdHJpbmddOiAobDogc3RyaW5nLCBhcmc/OiBudW1iZXIpID0+IHN0cmluZyB9ID0ge1xuICBlbWFpbDogKGxhYmVsOiBzdHJpbmcpID0+IGAkeyBsYWJlbCB9IGlzIG5vdCBhIHZhbGlkIGVtYWlsYCxcbiAgcmVxdWlyZWQ6IChsYWJlbDogc3RyaW5nKSA9PiBgJHsgbGFiZWwgfSBpcyByZXF1aXJlZGAsXG4gIG1pbmxlbmd0aDogKGxhYmVsOiBzdHJpbmcsIGxlbmd0aD86IG51bWJlcikgPT4gYCR7IGxhYmVsIH0gbXVzdCBiZSBhdCBsZWFzdCAkeyBsZW5ndGggfSBjaGFyYWN0ZXJzYCxcbiAgbWF4bGVuZ3RoOiAobGFiZWw6IHN0cmluZywgbGVuZ3RoPzogbnVtYmVyKSA9PiBgJHsgbGFiZWwgfSBtdXN0IG5vdCBleGNlZWQgJHsgbGVuZ3RoIH0gY2hhcmFjdGVyc2AsXG4gIG1heDogKGxhYmVsOiBzdHJpbmcsIG1heD86IG51bWJlcikgPT4gYCR7IGxhYmVsIH0gdmFsdWUgbXVzdCBiZSBsb3dlciB0aGFuICR7IG1heCB9YCxcbiAgbWluOiAobGFiZWw6IHN0cmluZywgbWluPzogbnVtYmVyKSA9PiBgJHsgbGFiZWwgfSB2YWx1ZSBtdXN0IGJlIGxhcmdlciB0aGFuICR7IG1pbiB9YCxcbn07XG5cbmNvbnN0IGV4dHJhUGFyYW1LZXk6IHsgW2s6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICBtaW5sZW5ndGg6ICdyZXF1aXJlZExlbmd0aCcsXG4gIG1heGxlbmd0aDogJ3JlcXVpcmVkTGVuZ3RoJyxcbiAgbWF4OiAnbWF4JyxcbiAgbWluOiAnbWluJ1xufTtcblxuLyoqXG4gKiBBIGZ1bmN0aW9uIHRoYXQgZ2V0IGRldGFpbCBlcnJvciBkZXNjcmlwdGlvbiBiYXNlZCBvbiBwYXJhbSBlcnIuXG4gKiBAcGFyYW0ge1ZhbGlkYXRpb25FcnJvcnMgfCBudWxsfSBlcnIgLSBDb250YWluIGVycm9yIGZyb20gdGhlIGZvcm0gaW5wdXQuXG4gKiBAcGFyYW0ge3N0cmluZ30gbGFiZWwgLSBDb250YWluIGxhYmVsIG5hbWUgb2YgdGhlIGZvcm0gaW5wdXQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBDb250YWluIGVpdGhlciBkZXRhaWwgZXJyb3IgZGVzY3JpcHRpb24gb3IgZW1wdHkgc3RyaW5nICgnJylcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEZvcm1FcnJvck1lc3NhZ2UoZXJyOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCwgbGFiZWw/OiBzdHJpbmcpOiBzdHJpbmd7XG4gIGlmICghZXJyKSByZXR1cm4gJyc7XG5cbiAgY29uc3Qga2V5ID0gT2JqZWN0LmtleXMoZXJyKVswXTtcbiAgcmV0dXJuIGVyck1lc3NhZ2Vba2V5XShsYWJlbD8/ICdDb2x1bW4nLCBlcnJba2V5XVtleHRyYVBhcmFtS2V5W2tleV1dKTtcbn1cbiJdfQ==
@@ -0,0 +1,18 @@
1
+ export function formatCapitalize(str, eachWord = false, separator = ' ') {
2
+ if (!str)
3
+ return str;
4
+ if (typeof str === 'string')
5
+ return `${str.at(0).toUpperCase()}${str.substring(1).toLowerCase()}`;
6
+ str[0] = `${str[0].at(0).toUpperCase()}${str[0].substring(1).toLowerCase()}`;
7
+ for (let i = 1; i < str.length; i++) {
8
+ if (!str[i])
9
+ continue;
10
+ if (!eachWord)
11
+ str[i] = str[i].toLowerCase();
12
+ else {
13
+ str[i] = `${str[i].at(0).toUpperCase()}${str[i].substring(1).toLowerCase()}`;
14
+ }
15
+ }
16
+ return str.join(separator);
17
+ }
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWF0LWNhcGl0YWxpemUudXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3VuaXBpbi1hbmd1bGFyL3NyYy9saWIvdXRpbHMvZm9ybWF0LWNhcGl0YWxpemUvZm9ybWF0LWNhcGl0YWxpemUudXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFPQSxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsR0FBc0IsRUFBRSxXQUFvQixLQUFLLEVBQUUsWUFBb0IsR0FBRztJQUN6RyxJQUFJLENBQUMsR0FBRztRQUFFLE9BQU8sR0FBRyxDQUFDO0lBQ3JCLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUTtRQUFFLE9BQU8sR0FBSSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBRSxDQUFDLFdBQVcsRUFBRyxHQUFJLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFHLEVBQUUsQ0FBQztJQUV2RyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBRSxDQUFDLFdBQVcsRUFBRyxHQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFHLEVBQUUsQ0FBQztJQUNsRixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQUUsU0FBUztRQUV0QixJQUFJLENBQUMsUUFBUTtZQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7YUFDeEMsQ0FBQztZQUNKLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFFLENBQUMsV0FBVyxFQUFHLEdBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUcsRUFBRSxDQUFDO1FBQ3BGLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQzdCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEEgZnVuY3Rpb24gdGhhdCBjcmVhdGUgYSBjYXBpdGFsaXplIHdvcmQuXG4gKiBAcGFyYW0ge3N0cmluZyB8IHN0cmluZ1tdfSBzdHIgLSBXb3JkIHRoYXQgd2FudCB0byBiZSBjYXBpdGFsaXplZC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2VhY2hXb3JkPWZhbHNlXSAtIERldGVybWluZSB3aGV0aGVyIGVhY2ggd29yZCB3aWxsIGJlIGNhcGl0YWxpemUgb3Igbm90IGJ5IGEgY2VydGFpbiBzZXBhcmF0b3IuIElmIHRoZSBmaXJzdCBwYXJhbSBpcyBub3QgYXJyYXksIHRoaXMgcGFyYW1ldGVyIHdpbGwgYmUgaWdub3JlZC4gRGVmYXVsdCB0byBgZmFsc2VgLlxuICogQHBhcmFtIHtzdHJpbmd9IFtzZXBhcmF0b3I9XCIgXCJdIC0gQSBzdHJpbmcgdXNlZCB0byBzZXBhcmF0ZSBvbmUgZWxlbWVudCBvZiB0aGUgd29yZHMgZnJvbSB0aGUgbmV4dCBpbiB0aGUgcmVzdWx0aW5nIHN0cmluZy4gSWYgdGhlIGZpcnN0IHBhcmFtIGlzIG5vdCBhcnJheSwgdGhpcyBwYXJhbWV0ZXIgd2lsbCBiZSBpZ25vcmVkLiBJZiBvbWl0dGVkLCB3b3JkcyBhcmUgc2VwYXJhdGVkIHdpdGggYSBzcGFjZS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IENhcGl0YWxpemVkIHdvcmQgc3RyaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRDYXBpdGFsaXplKHN0cjogc3RyaW5nIHwgc3RyaW5nW10sIGVhY2hXb3JkOiBib29sZWFuID0gZmFsc2UsIHNlcGFyYXRvcjogc3RyaW5nID0gJyAnKTogc3RyaW5ne1xuICBpZiAoIXN0cikgcmV0dXJuIHN0cjtcbiAgaWYgKHR5cGVvZiBzdHIgPT09ICdzdHJpbmcnKSByZXR1cm4gYCR7IHN0ci5hdCgwKSEudG9VcHBlckNhc2UoKSB9JHsgc3RyLnN1YnN0cmluZygxKS50b0xvd2VyQ2FzZSgpIH1gO1xuXG4gIHN0clswXSA9IGAkeyBzdHJbMF0uYXQoMCkhLnRvVXBwZXJDYXNlKCkgfSR7IHN0clswXS5zdWJzdHJpbmcoMSkudG9Mb3dlckNhc2UoKSB9YDtcbiAgZm9yIChsZXQgaSA9IDE7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoIXN0cltpXSkgY29udGludWU7XG5cbiAgICBpZiAoIWVhY2hXb3JkKSBzdHJbaV0gPSBzdHJbaV0udG9Mb3dlckNhc2UoKTtcbiAgICBlbHNlIHtcbiAgICAgIHN0cltpXSA9IGAkeyBzdHJbaV0uYXQoMCkhLnRvVXBwZXJDYXNlKCkgfSR7IHN0cltpXS5zdWJzdHJpbmcoMSkudG9Mb3dlckNhc2UoKSB9YDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHN0ci5qb2luKHNlcGFyYXRvcik7XG59XG4iXX0=
@@ -1,2 +1,4 @@
1
- export { getFormErrorMessage } from './form-error-message.util';
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91bmlwaW4tYW5ndWxhci9zcmMvbGliL3V0aWxzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgZ2V0Rm9ybUVycm9yTWVzc2FnZSB9IGZyb20gJy4vZm9ybS1lcnJvci1tZXNzYWdlLnV0aWwnO1xuIl19
1
+ export { formatCapitalize } from './format-capitalize/format-capitalize.util';
2
+ export { getFormErrorMessage } from './form-error-message/form-error-message.util';
3
+ export { generateContrastColor } from './contrast-color-generator/contrast-color-generator.util';
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91bmlwaW4tYW5ndWxhci9zcmMvbGliL3V0aWxzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQzlFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDhDQUE4QyxDQUFDO0FBQ25GLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDBEQUEwRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgZm9ybWF0Q2FwaXRhbGl6ZSB9IGZyb20gJy4vZm9ybWF0LWNhcGl0YWxpemUvZm9ybWF0LWNhcGl0YWxpemUudXRpbCc7XG5leHBvcnQgeyBnZXRGb3JtRXJyb3JNZXNzYWdlIH0gZnJvbSAnLi9mb3JtLWVycm9yLW1lc3NhZ2UvZm9ybS1lcnJvci1tZXNzYWdlLnV0aWwnO1xuZXhwb3J0IHsgZ2VuZXJhdGVDb250cmFzdENvbG9yIH0gZnJvbSAnLi9jb250cmFzdC1jb2xvci1nZW5lcmF0b3IvY29udHJhc3QtY29sb3ItZ2VuZXJhdG9yLnV0aWwnO1xuIl19
@@ -1,9 +1,9 @@
1
- export { ButtonGroupComponent, ButtonLoadingComponent, FormDateComponent, FormInputComponent, FormNumberComponent, FormPasswordComponent, FormSearchableSelectComponent, FormSelectComponent, FormTextareaComponent, FormImagePickerComponent, FormCurrencyInputComponent, FilterComponent, GridService, GridPaginationComponent, GridSnapshotComponent, AppletContainerComponent, ColumnContainerComponent, ColumnHeaderContainerComponent, ListPaginationContainerComponent, ListSnapshotContainerComponent, ModalContainerComponent, TabGroupComponent, TabContentComponent, TabsComponentModule, AuditListComponent, AuditDetailComponent, ApprovalListComponent, ApprovalDetailComponent } from './lib/components';
1
+ export { ButtonGroupComponent, ButtonLoadingComponent, FormDateComponent, FormInputComponent, FormNumberComponent, FormPasswordComponent, FormSearchableSelectComponent, FormSelectComponent, FormTextareaComponent, FormImagePickerComponent, FormCurrencyInputComponent, FormCountryInputComponent, FilterComponent, GridService, GridPaginationComponent, GridSnapshotComponent, AppletContainerComponent, ColumnContainerComponent, ColumnHeaderContainerComponent, ListPaginationContainerComponent, ListSnapshotContainerComponent, ModalContainerComponent, TabGroupComponent, TabContentComponent, TabsComponentModule, AuditListComponent, AuditDetailComponent, ApprovalListComponent, ApprovalDetailComponent } from './lib/components';
2
2
  export { AuthGuard } from './lib/guards';
3
3
  export { HeaderInterceptor, RefreshTokenInterceptor } from './lib/interceptors';
4
4
  export { bootstrap, LoadingPage, UnauthorizedPage, PermissionDirective, PermissionGuard, PermissionService, PermissionModule } from './lib/modules';
5
5
  export { AuthResolver } from './lib/resolvers';
6
6
  export { AuthService, CurrencyService, CountryService, ProfileService } from './lib/services';
7
- export { getFormErrorMessage } from './lib/utils';
7
+ export { formatCapitalize, generateContrastColor, getFormErrorMessage, } from './lib/utils';
8
8
  export { GridApi } from '@ag-grid-community/core';
9
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL3VuaXBpbi1hbmd1bGFyL3NyYy9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE9BQU8sRUFFTCxvQkFBb0IsRUFDcEIsc0JBQXNCLEVBRXRCLGlCQUFpQixFQUNqQixrQkFBa0IsRUFDbEIsbUJBQW1CLEVBQ25CLHFCQUFxQixFQUNyQiw2QkFBNkIsRUFDN0IsbUJBQW1CLEVBQ25CLHFCQUFxQixFQUNyQix3QkFBd0IsRUFDeEIsMEJBQTBCLEVBSzFCLGVBQWUsRUFHZixXQUFXLEVBQ1gsdUJBQXVCLEVBQ3ZCLHFCQUFxQixFQUVyQix3QkFBd0IsRUFDeEIsd0JBQXdCLEVBQ3hCLDhCQUE4QixFQUU5QixnQ0FBZ0MsRUFDaEMsOEJBQThCLEVBQzlCLHVCQUF1QixFQUV2QixpQkFBaUIsRUFDakIsbUJBQW1CLEVBQ25CLG1CQUFtQixFQUVuQixrQkFBa0IsRUFDbEIsb0JBQW9CLEVBRXBCLHFCQUFxQixFQUNyQix1QkFBdUIsRUFDeEIsTUFBTSxrQkFBa0IsQ0FBQztBQUUxQixPQUFPLEVBQ0wsU0FBUyxFQUNWLE1BQU0sY0FBYyxDQUFDO0FBRXRCLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsdUJBQXVCLEVBQ3hCLE1BQU0sb0JBQW9CLENBQUM7QUFNNUIsT0FBTyxFQUNMLFNBQVMsRUFFVCxXQUFXLEVBQ1gsZ0JBQWdCLEVBRWhCLG1CQUFtQixFQUNuQixlQUFlLEVBQ2YsaUJBQWlCLEVBQ2pCLGdCQUFnQixFQUNqQixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQ0wsWUFBWSxFQUNiLE1BQU0saUJBQWlCLENBQUM7QUFFekIsT0FBTyxFQUNMLFdBQVcsRUFDWCxlQUFlLEVBQ2YsY0FBYyxFQUNkLGNBQWMsRUFDZixNQUFNLGdCQUFnQixDQUFDO0FBRXhCLE9BQU8sRUFDTCxtQkFBbUIsRUFDcEIsTUFBTSxhQUFhLENBQUM7QUFFckIsT0FBTyxFQUNMLE9BQU8sRUFLUixNQUFNLHlCQUF5QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIFB1YmxpYyBBUEkgU3VyZmFjZSBvZiB1bmlwaW4tYW5ndWxhclxuICovXG5leHBvcnQge1xuICBCdXR0b25Hcm91cENvbmZpZyxcbiAgQnV0dG9uR3JvdXBDb21wb25lbnQsXG4gIEJ1dHRvbkxvYWRpbmdDb21wb25lbnQsXG5cbiAgRm9ybURhdGVDb21wb25lbnQsXG4gIEZvcm1JbnB1dENvbXBvbmVudCxcbiAgRm9ybU51bWJlckNvbXBvbmVudCxcbiAgRm9ybVBhc3N3b3JkQ29tcG9uZW50LFxuICBGb3JtU2VhcmNoYWJsZVNlbGVjdENvbXBvbmVudCxcbiAgRm9ybVNlbGVjdENvbXBvbmVudCxcbiAgRm9ybVRleHRhcmVhQ29tcG9uZW50LFxuICBGb3JtSW1hZ2VQaWNrZXJDb21wb25lbnQsXG4gIEZvcm1DdXJyZW5jeUlucHV0Q29tcG9uZW50LFxuICBcbiAgRmlsdGVyQ29uZmlnLFxuICBGaWx0ZXJGaWVsZCxcbiAgRmlsdGVyU2VhcmNoRXZlbnQsXG4gIEZpbHRlckNvbXBvbmVudCxcblxuICBHcmlkQ29uZmlnLFxuICBHcmlkU2VydmljZSxcbiAgR3JpZFBhZ2luYXRpb25Db21wb25lbnQsXG4gIEdyaWRTbmFwc2hvdENvbXBvbmVudCxcblxuICBBcHBsZXRDb250YWluZXJDb21wb25lbnQsXG4gIENvbHVtbkNvbnRhaW5lckNvbXBvbmVudCxcbiAgQ29sdW1uSGVhZGVyQ29udGFpbmVyQ29tcG9uZW50LFxuICBMaXN0Q29udGFpbmVyQ29uZmlnLCBcbiAgTGlzdFBhZ2luYXRpb25Db250YWluZXJDb21wb25lbnQsIFxuICBMaXN0U25hcHNob3RDb250YWluZXJDb21wb25lbnQsXG4gIE1vZGFsQ29udGFpbmVyQ29tcG9uZW50LFxuXG4gIFRhYkdyb3VwQ29tcG9uZW50LFxuICBUYWJDb250ZW50Q29tcG9uZW50LFxuICBUYWJzQ29tcG9uZW50TW9kdWxlLFxuXG4gIEF1ZGl0TGlzdENvbXBvbmVudCxcbiAgQXVkaXREZXRhaWxDb21wb25lbnQsXG5cbiAgQXBwcm92YWxMaXN0Q29tcG9uZW50LFxuICBBcHByb3ZhbERldGFpbENvbXBvbmVudFxufSBmcm9tICcuL2xpYi9jb21wb25lbnRzJztcblxuZXhwb3J0IHtcbiAgQXV0aEd1YXJkXG59IGZyb20gJy4vbGliL2d1YXJkcyc7XG5cbmV4cG9ydCB7XG4gIEhlYWRlckludGVyY2VwdG9yLFxuICBSZWZyZXNoVG9rZW5JbnRlcmNlcHRvclxufSBmcm9tICcuL2xpYi9pbnRlcmNlcHRvcnMnO1xuXG5leHBvcnQge1xuICBVc2VyXG59IGZyb20gJy4vbGliL2ludGVyZmFjZXMnO1xuXG5leHBvcnQgeyBcbiAgYm9vdHN0cmFwLFxuXG4gIExvYWRpbmdQYWdlLFxuICBVbmF1dGhvcml6ZWRQYWdlLFxuXG4gIFBlcm1pc3Npb25EaXJlY3RpdmUsXG4gIFBlcm1pc3Npb25HdWFyZCxcbiAgUGVybWlzc2lvblNlcnZpY2UsXG4gIFBlcm1pc3Npb25Nb2R1bGVcbn0gZnJvbSAnLi9saWIvbW9kdWxlcyc7XG5cbmV4cG9ydCB7XG4gIEF1dGhSZXNvbHZlclxufSBmcm9tICcuL2xpYi9yZXNvbHZlcnMnO1xuXG5leHBvcnQge1xuICBBdXRoU2VydmljZSxcbiAgQ3VycmVuY3lTZXJ2aWNlLFxuICBDb3VudHJ5U2VydmljZSxcbiAgUHJvZmlsZVNlcnZpY2Vcbn0gZnJvbSAnLi9saWIvc2VydmljZXMnO1xuXG5leHBvcnQge1xuICBnZXRGb3JtRXJyb3JNZXNzYWdlXG59IGZyb20gJy4vbGliL3V0aWxzJztcblxuZXhwb3J0IHtcbiAgR3JpZEFwaSxcbiAgR3JpZFJlYWR5RXZlbnQsXG4gIElDZWxsUmVuZGVyZXJQYXJhbXMsXG4gIFZhbHVlRm9ybWF0dGVyUGFyYW1zLFxuICBTZWxlY3Rpb25DaGFuZ2VkRXZlbnRcbn0gZnJvbSAnQGFnLWdyaWQtY29tbXVuaXR5L2NvcmUnO1xuXG5leHBvcnQge1xuICBJQ2VsbFJlbmRlcmVyQW5ndWxhckNvbXBcbn0gZnJvbSAnQGFnLWdyaWQtY29tbXVuaXR5L2FuZ3VsYXInO1xuIl19
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL3VuaXBpbi1hbmd1bGFyL3NyYy9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE9BQU8sRUFFTCxvQkFBb0IsRUFDcEIsc0JBQXNCLEVBRXRCLGlCQUFpQixFQUNqQixrQkFBa0IsRUFDbEIsbUJBQW1CLEVBQ25CLHFCQUFxQixFQUNyQiw2QkFBNkIsRUFDN0IsbUJBQW1CLEVBQ25CLHFCQUFxQixFQUNyQix3QkFBd0IsRUFDeEIsMEJBQTBCLEVBQzFCLHlCQUF5QixFQUt6QixlQUFlLEVBR2YsV0FBVyxFQUNYLHVCQUF1QixFQUN2QixxQkFBcUIsRUFFckIsd0JBQXdCLEVBQ3hCLHdCQUF3QixFQUN4Qiw4QkFBOEIsRUFFOUIsZ0NBQWdDLEVBQ2hDLDhCQUE4QixFQUM5Qix1QkFBdUIsRUFFdkIsaUJBQWlCLEVBQ2pCLG1CQUFtQixFQUNuQixtQkFBbUIsRUFFbkIsa0JBQWtCLEVBQ2xCLG9CQUFvQixFQUVwQixxQkFBcUIsRUFDckIsdUJBQXVCLEVBQ3hCLE1BQU0sa0JBQWtCLENBQUM7QUFFMUIsT0FBTyxFQUNMLFNBQVMsRUFDVixNQUFNLGNBQWMsQ0FBQztBQUV0QixPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLHVCQUF1QixFQUN4QixNQUFNLG9CQUFvQixDQUFDO0FBTTVCLE9BQU8sRUFDTCxTQUFTLEVBRVQsV0FBVyxFQUNYLGdCQUFnQixFQUVoQixtQkFBbUIsRUFDbkIsZUFBZSxFQUNmLGlCQUFpQixFQUNqQixnQkFBZ0IsRUFDakIsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUNMLFlBQVksRUFDYixNQUFNLGlCQUFpQixDQUFDO0FBRXpCLE9BQU8sRUFDTCxXQUFXLEVBQ1gsZUFBZSxFQUNmLGNBQWMsRUFDZCxjQUFjLEVBQ2YsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLHFCQUFxQixFQUNyQixtQkFBbUIsR0FDcEIsTUFBTSxhQUFhLENBQUM7QUFFckIsT0FBTyxFQUNMLE9BQU8sRUFLUixNQUFNLHlCQUF5QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIFB1YmxpYyBBUEkgU3VyZmFjZSBvZiB1bmlwaW4tYW5ndWxhclxuICovXG5leHBvcnQge1xuICBCdXR0b25Hcm91cENvbmZpZyxcbiAgQnV0dG9uR3JvdXBDb21wb25lbnQsXG4gIEJ1dHRvbkxvYWRpbmdDb21wb25lbnQsXG5cbiAgRm9ybURhdGVDb21wb25lbnQsXG4gIEZvcm1JbnB1dENvbXBvbmVudCxcbiAgRm9ybU51bWJlckNvbXBvbmVudCxcbiAgRm9ybVBhc3N3b3JkQ29tcG9uZW50LFxuICBGb3JtU2VhcmNoYWJsZVNlbGVjdENvbXBvbmVudCxcbiAgRm9ybVNlbGVjdENvbXBvbmVudCxcbiAgRm9ybVRleHRhcmVhQ29tcG9uZW50LFxuICBGb3JtSW1hZ2VQaWNrZXJDb21wb25lbnQsXG4gIEZvcm1DdXJyZW5jeUlucHV0Q29tcG9uZW50LFxuICBGb3JtQ291bnRyeUlucHV0Q29tcG9uZW50LFxuICBcbiAgRmlsdGVyQ29uZmlnLFxuICBGaWx0ZXJGaWVsZCxcbiAgRmlsdGVyU2VhcmNoRXZlbnQsXG4gIEZpbHRlckNvbXBvbmVudCxcblxuICBHcmlkQ29uZmlnLFxuICBHcmlkU2VydmljZSxcbiAgR3JpZFBhZ2luYXRpb25Db21wb25lbnQsXG4gIEdyaWRTbmFwc2hvdENvbXBvbmVudCxcblxuICBBcHBsZXRDb250YWluZXJDb21wb25lbnQsXG4gIENvbHVtbkNvbnRhaW5lckNvbXBvbmVudCxcbiAgQ29sdW1uSGVhZGVyQ29udGFpbmVyQ29tcG9uZW50LFxuICBMaXN0Q29udGFpbmVyQ29uZmlnLCBcbiAgTGlzdFBhZ2luYXRpb25Db250YWluZXJDb21wb25lbnQsIFxuICBMaXN0U25hcHNob3RDb250YWluZXJDb21wb25lbnQsXG4gIE1vZGFsQ29udGFpbmVyQ29tcG9uZW50LFxuXG4gIFRhYkdyb3VwQ29tcG9uZW50LFxuICBUYWJDb250ZW50Q29tcG9uZW50LFxuICBUYWJzQ29tcG9uZW50TW9kdWxlLFxuXG4gIEF1ZGl0TGlzdENvbXBvbmVudCxcbiAgQXVkaXREZXRhaWxDb21wb25lbnQsXG5cbiAgQXBwcm92YWxMaXN0Q29tcG9uZW50LFxuICBBcHByb3ZhbERldGFpbENvbXBvbmVudFxufSBmcm9tICcuL2xpYi9jb21wb25lbnRzJztcblxuZXhwb3J0IHtcbiAgQXV0aEd1YXJkXG59IGZyb20gJy4vbGliL2d1YXJkcyc7XG5cbmV4cG9ydCB7XG4gIEhlYWRlckludGVyY2VwdG9yLFxuICBSZWZyZXNoVG9rZW5JbnRlcmNlcHRvclxufSBmcm9tICcuL2xpYi9pbnRlcmNlcHRvcnMnO1xuXG5leHBvcnQge1xuICBVc2VyXG59IGZyb20gJy4vbGliL2ludGVyZmFjZXMnO1xuXG5leHBvcnQgeyBcbiAgYm9vdHN0cmFwLFxuXG4gIExvYWRpbmdQYWdlLFxuICBVbmF1dGhvcml6ZWRQYWdlLFxuXG4gIFBlcm1pc3Npb25EaXJlY3RpdmUsXG4gIFBlcm1pc3Npb25HdWFyZCxcbiAgUGVybWlzc2lvblNlcnZpY2UsXG4gIFBlcm1pc3Npb25Nb2R1bGVcbn0gZnJvbSAnLi9saWIvbW9kdWxlcyc7XG5cbmV4cG9ydCB7XG4gIEF1dGhSZXNvbHZlclxufSBmcm9tICcuL2xpYi9yZXNvbHZlcnMnO1xuXG5leHBvcnQge1xuICBBdXRoU2VydmljZSxcbiAgQ3VycmVuY3lTZXJ2aWNlLFxuICBDb3VudHJ5U2VydmljZSxcbiAgUHJvZmlsZVNlcnZpY2Vcbn0gZnJvbSAnLi9saWIvc2VydmljZXMnO1xuXG5leHBvcnQge1xuICBmb3JtYXRDYXBpdGFsaXplLFxuICBnZW5lcmF0ZUNvbnRyYXN0Q29sb3IsXG4gIGdldEZvcm1FcnJvck1lc3NhZ2UsXG59IGZyb20gJy4vbGliL3V0aWxzJztcblxuZXhwb3J0IHtcbiAgR3JpZEFwaSxcbiAgR3JpZFJlYWR5RXZlbnQsXG4gIElDZWxsUmVuZGVyZXJQYXJhbXMsXG4gIFZhbHVlRm9ybWF0dGVyUGFyYW1zLFxuICBTZWxlY3Rpb25DaGFuZ2VkRXZlbnRcbn0gZnJvbSAnQGFnLWdyaWQtY29tbXVuaXR5L2NvcmUnO1xuXG5leHBvcnQge1xuICBJQ2VsbFJlbmRlcmVyQW5ndWxhckNvbXBcbn0gZnJvbSAnQGFnLWdyaWQtY29tbXVuaXR5L2FuZ3VsYXInO1xuIl19
@@ -14,7 +14,7 @@ import * as i3 from 'angular-split';
14
14
  import { AngularSplitModule } from 'angular-split';
15
15
  import * as i3$1 from '@angular/forms';
16
16
  import { NG_VALUE_ACCESSOR, NG_VALIDATORS, FormsModule, FormGroup, FormControl, ReactiveFormsModule } from '@angular/forms';
17
- import * as i3$2 from '@ng-select/ng-select';
17
+ import * as i4 from '@ng-select/ng-select';
18
18
  import { NgSelectModule } from '@ng-select/ng-select';
19
19
  import { ModuleRegistry } from '@ag-grid-community/core';
20
20
  export { GridApi } from '@ag-grid-community/core';
@@ -417,7 +417,7 @@ class AppletContainerComponent {
417
417
  dispatchEvent(new CustomEvent('menuEvent', { detail: { isActive: false } }));
418
418
  }
419
419
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: AppletContainerComponent, deps: [{ token: 'APPLET_CONFIG' }, { token: i0.ChangeDetectorRef }, { token: PermissionService }], target: i0.ɵɵFactoryTarget.Component }); }
420
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.0.4", type: AppletContainerComponent, isStandalone: true, selector: "up-applet-container", host: { classAttribute: "d-flex h-100 w-100" }, ngImport: i0, template: "<div class=\"sidenav flex-shrink-0 h-100 py-4 d-flex flex-column\" [class.collapsed]=\"isCollapsed\" [class.show]=\"isMenuActive\">\n <div class=\"logo-container px-3 pb-3 border-bottom flex-shrink-0 position-relative d-flex align-items-center gap-3 d-none d-md-flex\">\n <img alt=\"Applet Icon\" width=\"44px\" height=\"44px\" class=\"rounded\" [src]=\"config.icon\" />\n\n <div class=\"info w-75 pe-2\">\n <div class=\"name fw-medium text-truncate\">{{ config.name }}</div>\n <div class=\"tenant pt-1 fw-medium\">v{{ config.version }}</div>\n </div>\n\n <button class=\"btn-close cursor-pointer position-absolute border-0 rounded-circle d-none d-md-block\" (click)=\"toggleSidenav()\">\n <ion-icon name=\"chevron-forward\" class=\"mt-1\" />\n </button>\n </div>\n\n <div class=\"flex-grow-1 px-3 pt-3 overflow-y-auto d-none d-md-block\" (click)=\"selectMenu()\">\n <a class=\"nav align-items-center text-decoration-none gap-2 rounded mb-1 {{ isHidden[i]? 'd-none' : 'd-flex' }}\" title=\"{{ c.label }}\" [routerLink]=\"c.path\" routerLinkActive=\"fw-medium\" *ngFor=\"let c of config.containers; let i = index\">\n <ion-icon name=\"{{ c.icon }}\" />\n <div class=\"text-truncate\">{{ c.label }}</div>\n </a>\n </div>\n\n <div class=\"flex-shrink-0 px-3 pt-3 border-top d-none d-md-block\" *ngIf=\"config.enabledSetting\" (click)=\"selectMenu()\">\n <a class=\"nav d-flex align-items-center text-decoration-none gap-2 rounded\" title=\"Setting\" routerLink=\"setting\" routerLinkActive=\"fw-medium\">\n <ion-icon name=\"settings\" />\n <div class=\"text-truncate\">Setting</div>\n </a>\n </div>\n</div>\n\n<div class=\"flex-grow-1 overflow-y-auto\">\n <ng-content />\n</div>\n", styles: [".info{display:none}.name{font-size:16px}.tenant{color:#757575}.sidenav{width:73px;background:#f8f9fb;transition:all .2s ease;border-right:1px solid #D1D1D1}.sidenav.collapsed{width:250px}.sidenav.collapsed .btn-close{transform:rotate(180deg)}.sidenav.collapsed .nav div,.sidenav.collapsed .info{display:block}.sidenav.show{width:250px}.sidenav.show .logo-container{display:flex!important}.sidenav.show div:not(.logo-container),.sidenav.show img,.sidenav.show .info{display:block!important}.btn-close{width:35px;height:35px;bottom:23px;right:-17px;z-index:999;transition:all .3s ease;background-color:#f8f9fb;box-shadow:0 0 .15rem #616161}.btn-close ion-icon{color:#616161;font-size:16px}@media (max-width: 768px){.btn-close{right:-18px}.btn-close ion-icon{position:absolute;right:9px;bottom:10px}}.nav{padding:12px;color:#616161;transition:all .3s ease}.nav.fw-medium,.nav:hover{background-color:#fef3ee;color:#ed6b26!important}.nav ion-icon{font-size:20px}.nav div{display:none;font-size:16px}@media (max-width: 767px){.sidenav{width:0;z-index:2;position:absolute!important}}\n"], dependencies: [{ kind: "ngmodule", type: IonicModule }, { kind: "component", type: i1.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "directive", type: i1.RouterLinkWithHrefDelegate, selector: "a[routerLink],area[routerLink]" }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i1$2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i1$2.RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
420
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.0.4", type: AppletContainerComponent, isStandalone: true, selector: "up-applet-container", host: { classAttribute: "d-flex h-100 w-100" }, ngImport: i0, template: "<div class=\"sidenav flex-shrink-0 h-100 py-4 d-flex flex-column\" [class.collapsed]=\"isCollapsed\" [class.show]=\"isMenuActive\">\n <div class=\"logo-container px-3 pb-3 border-bottom flex-shrink-0 position-relative d-flex align-items-center gap-3 d-none d-md-flex\">\n <img alt=\"Applet Icon\" width=\"44px\" height=\"44px\" class=\"rounded\" [src]=\"config.icon\" />\n\n <div class=\"info w-75 pe-2\">\n <div class=\"name fw-medium text-truncate\">{{ config.name }}</div>\n <div class=\"tenant pt-1 fw-medium\">v{{ config.version }}</div>\n </div>\n\n <button class=\"btn-close cursor-pointer position-absolute border-0 rounded-circle d-none d-md-block\" (click)=\"toggleSidenav()\">\n <ion-icon name=\"chevron-forward\" class=\"mt-1\" />\n </button>\n </div>\n\n <div class=\"flex-grow-1 px-3 pt-3 overflow-y-auto d-none d-md-block\" (click)=\"selectMenu()\">\n <a class=\"nav align-items-center text-decoration-none gap-2 rounded mb-1 {{ isHidden[i]? 'd-none' : 'd-flex' }}\" title=\"{{ c.label }}\" [routerLink]=\"c.path\" routerLinkActive=\"fw-medium\" *ngFor=\"let c of config.containers; let i = index\">\n <ion-icon name=\"{{ c.icon }}\" />\n <div class=\"text-truncate\">{{ c.label }}</div>\n </a>\n </div>\n\n <div class=\"flex-shrink-0 px-3 pt-3 border-top d-none d-md-block\" *ngIf=\"config.enabledSetting\" (click)=\"selectMenu()\">\n <a class=\"nav d-flex align-items-center text-decoration-none gap-2 rounded\" title=\"Setting\" routerLink=\"setting\" routerLinkActive=\"fw-medium\">\n <ion-icon name=\"settings\" />\n <div class=\"text-truncate\">Setting</div>\n </a>\n </div>\n</div>\n\n<div class=\"flex-grow-1 w-100 overflow-y-auto\">\n <ng-content />\n</div>\n", styles: [".info{display:none}.name{font-size:16px}.tenant{color:#757575}.sidenav{width:73px;background:#f8f9fb;transition:all .2s ease;border-right:1px solid #D1D1D1}.sidenav.collapsed{width:250px}.sidenav.collapsed .btn-close{transform:rotate(180deg)}.sidenav.collapsed .nav div,.sidenav.collapsed .info{display:block}.sidenav.show{width:250px}.sidenav.show .logo-container{display:flex!important}.sidenav.show div:not(.logo-container),.sidenav.show img,.sidenav.show .info{display:block!important}.btn-close{width:35px;height:35px;bottom:23px;right:-17px;z-index:999;transition:all .3s ease;background-color:#f8f9fb;box-shadow:0 0 .15rem #616161}.btn-close ion-icon{color:#616161;font-size:16px}@media (max-width: 768px){.btn-close{right:-18px}.btn-close ion-icon{position:absolute;right:9px;bottom:10px}}.nav{padding:12px;color:#616161;transition:all .3s ease}.nav.fw-medium,.nav:hover{background-color:#fef3ee;color:#ed6b26!important}.nav ion-icon{font-size:20px}.nav div{display:none;font-size:16px}@media (max-width: 767px){.sidenav{width:0;z-index:2;position:absolute!important}}\n"], dependencies: [{ kind: "ngmodule", type: IonicModule }, { kind: "component", type: i1.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "directive", type: i1.RouterLinkWithHrefDelegate, selector: "a[routerLink],area[routerLink]" }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i1$2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i1$2.RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
421
421
  }
422
422
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: AppletContainerComponent, decorators: [{
423
423
  type: Component,
@@ -427,7 +427,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.4", ngImpor
427
427
  IonicModule,
428
428
  RouterModule,
429
429
  CommonModule
430
- ], template: "<div class=\"sidenav flex-shrink-0 h-100 py-4 d-flex flex-column\" [class.collapsed]=\"isCollapsed\" [class.show]=\"isMenuActive\">\n <div class=\"logo-container px-3 pb-3 border-bottom flex-shrink-0 position-relative d-flex align-items-center gap-3 d-none d-md-flex\">\n <img alt=\"Applet Icon\" width=\"44px\" height=\"44px\" class=\"rounded\" [src]=\"config.icon\" />\n\n <div class=\"info w-75 pe-2\">\n <div class=\"name fw-medium text-truncate\">{{ config.name }}</div>\n <div class=\"tenant pt-1 fw-medium\">v{{ config.version }}</div>\n </div>\n\n <button class=\"btn-close cursor-pointer position-absolute border-0 rounded-circle d-none d-md-block\" (click)=\"toggleSidenav()\">\n <ion-icon name=\"chevron-forward\" class=\"mt-1\" />\n </button>\n </div>\n\n <div class=\"flex-grow-1 px-3 pt-3 overflow-y-auto d-none d-md-block\" (click)=\"selectMenu()\">\n <a class=\"nav align-items-center text-decoration-none gap-2 rounded mb-1 {{ isHidden[i]? 'd-none' : 'd-flex' }}\" title=\"{{ c.label }}\" [routerLink]=\"c.path\" routerLinkActive=\"fw-medium\" *ngFor=\"let c of config.containers; let i = index\">\n <ion-icon name=\"{{ c.icon }}\" />\n <div class=\"text-truncate\">{{ c.label }}</div>\n </a>\n </div>\n\n <div class=\"flex-shrink-0 px-3 pt-3 border-top d-none d-md-block\" *ngIf=\"config.enabledSetting\" (click)=\"selectMenu()\">\n <a class=\"nav d-flex align-items-center text-decoration-none gap-2 rounded\" title=\"Setting\" routerLink=\"setting\" routerLinkActive=\"fw-medium\">\n <ion-icon name=\"settings\" />\n <div class=\"text-truncate\">Setting</div>\n </a>\n </div>\n</div>\n\n<div class=\"flex-grow-1 overflow-y-auto\">\n <ng-content />\n</div>\n", styles: [".info{display:none}.name{font-size:16px}.tenant{color:#757575}.sidenav{width:73px;background:#f8f9fb;transition:all .2s ease;border-right:1px solid #D1D1D1}.sidenav.collapsed{width:250px}.sidenav.collapsed .btn-close{transform:rotate(180deg)}.sidenav.collapsed .nav div,.sidenav.collapsed .info{display:block}.sidenav.show{width:250px}.sidenav.show .logo-container{display:flex!important}.sidenav.show div:not(.logo-container),.sidenav.show img,.sidenav.show .info{display:block!important}.btn-close{width:35px;height:35px;bottom:23px;right:-17px;z-index:999;transition:all .3s ease;background-color:#f8f9fb;box-shadow:0 0 .15rem #616161}.btn-close ion-icon{color:#616161;font-size:16px}@media (max-width: 768px){.btn-close{right:-18px}.btn-close ion-icon{position:absolute;right:9px;bottom:10px}}.nav{padding:12px;color:#616161;transition:all .3s ease}.nav.fw-medium,.nav:hover{background-color:#fef3ee;color:#ed6b26!important}.nav ion-icon{font-size:20px}.nav div{display:none;font-size:16px}@media (max-width: 767px){.sidenav{width:0;z-index:2;position:absolute!important}}\n"] }]
430
+ ], template: "<div class=\"sidenav flex-shrink-0 h-100 py-4 d-flex flex-column\" [class.collapsed]=\"isCollapsed\" [class.show]=\"isMenuActive\">\n <div class=\"logo-container px-3 pb-3 border-bottom flex-shrink-0 position-relative d-flex align-items-center gap-3 d-none d-md-flex\">\n <img alt=\"Applet Icon\" width=\"44px\" height=\"44px\" class=\"rounded\" [src]=\"config.icon\" />\n\n <div class=\"info w-75 pe-2\">\n <div class=\"name fw-medium text-truncate\">{{ config.name }}</div>\n <div class=\"tenant pt-1 fw-medium\">v{{ config.version }}</div>\n </div>\n\n <button class=\"btn-close cursor-pointer position-absolute border-0 rounded-circle d-none d-md-block\" (click)=\"toggleSidenav()\">\n <ion-icon name=\"chevron-forward\" class=\"mt-1\" />\n </button>\n </div>\n\n <div class=\"flex-grow-1 px-3 pt-3 overflow-y-auto d-none d-md-block\" (click)=\"selectMenu()\">\n <a class=\"nav align-items-center text-decoration-none gap-2 rounded mb-1 {{ isHidden[i]? 'd-none' : 'd-flex' }}\" title=\"{{ c.label }}\" [routerLink]=\"c.path\" routerLinkActive=\"fw-medium\" *ngFor=\"let c of config.containers; let i = index\">\n <ion-icon name=\"{{ c.icon }}\" />\n <div class=\"text-truncate\">{{ c.label }}</div>\n </a>\n </div>\n\n <div class=\"flex-shrink-0 px-3 pt-3 border-top d-none d-md-block\" *ngIf=\"config.enabledSetting\" (click)=\"selectMenu()\">\n <a class=\"nav d-flex align-items-center text-decoration-none gap-2 rounded\" title=\"Setting\" routerLink=\"setting\" routerLinkActive=\"fw-medium\">\n <ion-icon name=\"settings\" />\n <div class=\"text-truncate\">Setting</div>\n </a>\n </div>\n</div>\n\n<div class=\"flex-grow-1 w-100 overflow-y-auto\">\n <ng-content />\n</div>\n", styles: [".info{display:none}.name{font-size:16px}.tenant{color:#757575}.sidenav{width:73px;background:#f8f9fb;transition:all .2s ease;border-right:1px solid #D1D1D1}.sidenav.collapsed{width:250px}.sidenav.collapsed .btn-close{transform:rotate(180deg)}.sidenav.collapsed .nav div,.sidenav.collapsed .info{display:block}.sidenav.show{width:250px}.sidenav.show .logo-container{display:flex!important}.sidenav.show div:not(.logo-container),.sidenav.show img,.sidenav.show .info{display:block!important}.btn-close{width:35px;height:35px;bottom:23px;right:-17px;z-index:999;transition:all .3s ease;background-color:#f8f9fb;box-shadow:0 0 .15rem #616161}.btn-close ion-icon{color:#616161;font-size:16px}@media (max-width: 768px){.btn-close{right:-18px}.btn-close ion-icon{position:absolute;right:9px;bottom:10px}}.nav{padding:12px;color:#616161;transition:all .3s ease}.nav.fw-medium,.nav:hover{background-color:#fef3ee;color:#ed6b26!important}.nav ion-icon{font-size:20px}.nav div{display:none;font-size:16px}@media (max-width: 767px){.sidenav{width:0;z-index:2;position:absolute!important}}\n"] }]
431
431
  }], ctorParameters: () => [{ type: undefined, decorators: [{
432
432
  type: Inject,
433
433
  args: ['APPLET_CONFIG']
@@ -582,6 +582,24 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.4", ngImpor
582
582
  args: ['window:popstate', ['$event']]
583
583
  }] } });
584
584
 
585
+ function formatCapitalize(str, eachWord = false, separator = ' ') {
586
+ if (!str)
587
+ return str;
588
+ if (typeof str === 'string')
589
+ return `${str.at(0).toUpperCase()}${str.substring(1).toLowerCase()}`;
590
+ str[0] = `${str[0].at(0).toUpperCase()}${str[0].substring(1).toLowerCase()}`;
591
+ for (let i = 1; i < str.length; i++) {
592
+ if (!str[i])
593
+ continue;
594
+ if (!eachWord)
595
+ str[i] = str[i].toLowerCase();
596
+ else {
597
+ str[i] = `${str[i].at(0).toUpperCase()}${str[i].substring(1).toLowerCase()}`;
598
+ }
599
+ }
600
+ return str.join(separator);
601
+ }
602
+
585
603
  const errMessage = {
586
604
  email: (label) => `${label} is not a valid email`,
587
605
  required: (label) => `${label} is required`,
@@ -603,6 +621,22 @@ function getFormErrorMessage(err, label) {
603
621
  return errMessage[key](label ?? 'Column', err[key][extraParamKey[key]]);
604
622
  }
605
623
 
624
+ function generateContrastColor(str) {
625
+ if (str.length > 8)
626
+ str = str.substring(0, 8);
627
+ let res = '';
628
+ let total = 0;
629
+ for (let i = 0; i < str.length; i++) {
630
+ const c = str.charCodeAt(i).toString(16);
631
+ res += c;
632
+ total += +c;
633
+ }
634
+ return {
635
+ background: `#${res}`,
636
+ color: total > 187 ? '#000' : '#fff'
637
+ };
638
+ }
639
+
606
640
  class FormDateComponent {
607
641
  constructor(name, placeholder, ch) {
608
642
  this.name = name;
@@ -1080,7 +1114,7 @@ class FormSearchableSelectComponent {
1080
1114
  provide: NG_VALIDATORS,
1081
1115
  useExisting: FormSearchableSelectComponent
1082
1116
  }
1083
- ], usesOnChanges: true, ngImport: i0, template: "<label class=\"form-label d-flex align-items-center\" [class.required]=\"required\">\n <ng-content select=\"[icon]\" />\n <span>{{ label }}</span>\n</label>\n\n<ng-select \n appendTo=\"body\"\n typeToSearchText=\"Please enter 3 or more characters\"\n bindLabel=\"{{ bindLabel }}\"\n bindValue=\"{{ bindValue }}\"\n placeholder=\"{{ placeholder }}\" \n [minTermLength]=\"3\"\n [virtualScroll]=\"true\"\n [editableSearchTerm]=\"true\"\n [ngModel]=\"value\" \n [addTag]=\"addTag\"\n [multiple]=\"multiple\"\n [readonly]=\"disabled\" \n [loading]=\"isLoading\"\n [clearable]=\"clearable\"\n [typeahead]=\"typeahead\"\n [items]=\"items$ | async\"\n (change)=\"change($event);\"\n/>\n<label *ngIf=\"errorMsg\" class=\"is-invalid\">{{ errorMsg }}</label>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: NgSelectModule }, { kind: "component", type: i3$2.NgSelectComponent, selector: "ng-select", inputs: ["bindLabel", "bindValue", "markFirst", "placeholder", "notFoundText", "typeToSearchText", "addTagText", "loadingText", "clearAllText", "appearance", "dropdownPosition", "appendTo", "loading", "closeOnSelect", "hideSelected", "selectOnTab", "openOnEnter", "maxSelectedItems", "groupBy", "groupValue", "bufferAmount", "virtualScroll", "selectableGroup", "selectableGroupAsModel", "searchFn", "trackByFn", "clearOnBackspace", "labelForId", "inputAttrs", "tabIndex", "readonly", "searchWhileComposing", "minTermLength", "editableSearchTerm", "keyDownFn", "typeahead", "multiple", "addTag", "searchable", "clearable", "isOpen", "items", "compareWith", "clearSearchOnAdd", "deselectOnClick"], outputs: ["blur", "focus", "change", "open", "close", "search", "clear", "add", "remove", "scroll", "scrollToEnd"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1117
+ ], usesOnChanges: true, ngImport: i0, template: "<label class=\"form-label d-flex align-items-center\" [class.required]=\"required\">\n <ng-content select=\"[icon]\" />\n <span>{{ label }}</span>\n</label>\n\n<ng-select \n appendTo=\"body\"\n typeToSearchText=\"Please enter 3 or more characters\"\n bindLabel=\"{{ bindLabel }}\"\n bindValue=\"{{ bindValue }}\"\n placeholder=\"{{ placeholder }}\" \n [minTermLength]=\"3\"\n [virtualScroll]=\"true\"\n [editableSearchTerm]=\"true\"\n [ngModel]=\"value\" \n [addTag]=\"addTag\"\n [multiple]=\"multiple\"\n [readonly]=\"disabled\" \n [loading]=\"isLoading\"\n [clearable]=\"clearable\"\n [typeahead]=\"typeahead\"\n [items]=\"items$ | async\"\n (change)=\"change($event);\"\n/>\n<label *ngIf=\"errorMsg\" class=\"is-invalid\">{{ errorMsg }}</label>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: NgSelectModule }, { kind: "component", type: i4.NgSelectComponent, selector: "ng-select", inputs: ["bindLabel", "bindValue", "markFirst", "placeholder", "notFoundText", "typeToSearchText", "addTagText", "loadingText", "clearAllText", "appearance", "dropdownPosition", "appendTo", "loading", "closeOnSelect", "hideSelected", "selectOnTab", "openOnEnter", "maxSelectedItems", "groupBy", "groupValue", "bufferAmount", "virtualScroll", "selectableGroup", "selectableGroupAsModel", "searchFn", "trackByFn", "clearOnBackspace", "labelForId", "inputAttrs", "tabIndex", "readonly", "searchWhileComposing", "minTermLength", "editableSearchTerm", "keyDownFn", "typeahead", "multiple", "addTag", "searchable", "clearable", "isOpen", "items", "compareWith", "clearSearchOnAdd", "deselectOnClick"], outputs: ["blur", "focus", "change", "open", "close", "search", "clear", "add", "remove", "scroll", "scrollToEnd"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1084
1118
  }
1085
1119
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: FormSearchableSelectComponent, decorators: [{
1086
1120
  type: Component,
@@ -1189,7 +1223,7 @@ class FormSelectComponent {
1189
1223
  provide: NG_VALIDATORS,
1190
1224
  useExisting: FormSelectComponent
1191
1225
  }
1192
- ], ngImport: i0, template: "<label class=\"form-label d-flex align-items-center\" [class.required]=\"required\">\n <ng-content select=\"[icon]\"/>\n <span>{{ label }}</span>\n</label>\n\n<ng-select\n appendTo=\"body\"\n bindLabel=\"{{ bindLabel }}\"\n bindValue=\"{{ bindValue }}\"\n placeholder=\"{{ placeholder }}\"\n [virtualScroll]=\"true\"\n [items]=\"items\"\n [ngModel]=\"value\"\n [addTag]=\"addTag\"\n [multiple]=\"multiple\"\n [readonly]=\"disabled\"\n [clearable]=\"clearable\"\n [searchable]=\"searchable\"\n (change)=\"change($event);\"\n/>\n<label *ngIf=\"errorMsg\" class=\"is-invalid\">{{ errorMsg }}</label>\n", styles: [".ng-select.ng-select-opened>.ng-select-container{background:#fff}.ng-select.ng-select-opened>.ng-select-container:hover{box-shadow:none}.ng-select.ng-select-opened>.ng-select-container .ng-arrow{top:-2px;border-color:transparent transparent #616161;border-width:0 5px 5px}.ng-select.ng-select-disabled>.ng-select-container{background-color:#e9ecef}.ng-select .ng-has-value .ng-placeholder{display:none}.ng-select .ng-select-container{color:#424242;background-color:#fff;border-radius:4px;border:2px solid #e0e0e0;min-height:36px;align-items:center}.ng-select .ng-select-container:hover{box-shadow:0 1px #0000000f}.ng-select .ng-select-container .ng-value-container{align-items:center;padding-left:10px}.ng-select .ng-select-container .ng-value-container .ng-placeholder{color:#a8a8a8}.ng-select.ng-select-single .ng-select-container{height:36px}.ng-select.ng-select-single .ng-select-container .ng-value-container .ng-input{left:0;padding-left:10px;padding-right:50px}.ng-select.ng-select-single .ng-select-container .ng-value-container .ng-input input{color:#424242}.ng-select.ng-select-multiple.ng-select-disabled>.ng-select-container .ng-value-container .ng-value{background-color:#e9ecef;border:1px solid #fafafa}.ng-select.ng-select-multiple.ng-select-disabled>.ng-select-container .ng-value-container .ng-value .ng-value-label{padding:0 5px}.ng-select.ng-select-multiple .ng-select-container .ng-value-container{padding-top:5px;padding-left:7px}.ng-select.ng-select-multiple .ng-select-container .ng-value-container .ng-value{font-size:.9em;margin-bottom:5px;color:#ed6b26;background-color:#fef3ee;border-radius:2px;margin-right:5px}.ng-select.ng-select-multiple .ng-select-container .ng-value-container .ng-value.ng-value-disabled{background-color:#e9ecef}.ng-select.ng-select-multiple .ng-select-container .ng-value-container .ng-value.ng-value-disabled .ng-value-label{padding-left:5px}.ng-select.ng-select-multiple .ng-select-container .ng-value-container .ng-value .ng-value-label,.ng-select.ng-select-multiple .ng-select-container .ng-value-container .ng-value .ng-value-icon{display:inline-block;padding:1px 5px}.ng-select.ng-select-multiple .ng-select-container .ng-value-container .ng-value .ng-value-icon:hover{background-color:#fde2d6}.ng-select.ng-select-multiple .ng-select-container .ng-value-container .ng-value .ng-value-icon.left{border-right:1px solid #fbd1be}.ng-select.ng-select-multiple .ng-select-container .ng-value-container .ng-value .ng-value-icon.right{border-left:1px solid #fbd1be}.ng-select.ng-select-multiple .ng-select-container .ng-value-container .ng-input{padding:0 0 3px 3px}.ng-select.ng-select-multiple .ng-select-container .ng-value-container .ng-input>input{color:#424242}.ng-select.ng-select-multiple .ng-select-container .ng-value-container .ng-placeholder{padding-bottom:5px;padding-left:3px}.ng-select .ng-clear-wrapper{color:#adadad}.ng-select .ng-clear-wrapper:hover .ng-clear{color:#ff3b30}.ng-select .ng-spinner-zone{padding:5px 5px 0 0}.ng-select .ng-arrow-wrapper{width:25px;padding-right:5px}.ng-select .ng-arrow-wrapper .ng-arrow{border-color:#616161 transparent transparent;border-style:solid;border-width:5px 5px 2.5px}.ng-dropdown-panel{background-color:#fff;border:2px solid #e0e0e0;box-shadow:0 1px #0000000f;left:0;z-index:20100!important;border-radius:4px}.ng-dropdown-panel.ng-select-top{bottom:100%;margin-bottom:2px}.ng-dropdown-panel.ng-select-bottom{top:100%;margin-top:2px}.ng-dropdown-panel .ng-dropdown-header{border-bottom:1px solid #e0e0e0;padding:5px 7px}.ng-dropdown-panel .ng-dropdown-footer{border-top:1px solid #e0e0e0;padding:5px 7px}.ng-dropdown-panel .ng-dropdown-panel-items .ng-optgroup{-webkit-user-select:none;user-select:none;padding:8px 10px;font-weight:500;color:#0000008a;cursor:pointer}.ng-dropdown-panel .ng-dropdown-panel-items .ng-optgroup.ng-option-disabled{cursor:default}.ng-dropdown-panel .ng-dropdown-panel-items .ng-optgroup.ng-option-marked{background-color:#fef3ee}.ng-dropdown-panel .ng-dropdown-panel-items .ng-optgroup.ng-option-selected,.ng-dropdown-panel .ng-dropdown-panel-items .ng-optgroup.ng-option-selected.ng-option-marked{color:#0000008a;background-color:#fef3ee;font-weight:600}.ng-dropdown-panel .ng-dropdown-panel-items .ng-option{background-color:#fff;color:#000000de;padding:8px 10px}.ng-dropdown-panel .ng-dropdown-panel-items .ng-option.ng-option-selected,.ng-dropdown-panel .ng-dropdown-panel-items .ng-option.ng-option-selected.ng-option-marked{color:#ed6b26;background-color:#fef3ee}.ng-dropdown-panel .ng-dropdown-panel-items .ng-option.ng-option-selected .ng-option-label,.ng-dropdown-panel .ng-dropdown-panel-items .ng-option.ng-option-selected.ng-option-marked .ng-option-label{font-weight:600}.ng-dropdown-panel .ng-dropdown-panel-items .ng-option.ng-option-marked{background-color:#fef3ee;color:#424242}.ng-dropdown-panel .ng-dropdown-panel-items .ng-option.ng-option-disabled{color:#888}.ng-dropdown-panel .ng-dropdown-panel-items .ng-option.ng-option-child{padding-left:22px}.ng-dropdown-panel .ng-dropdown-panel-items .ng-option .ng-tag-label{font-size:80%;font-weight:400;padding-right:5px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: NgSelectModule }, { kind: "component", type: i3$2.NgSelectComponent, selector: "ng-select", inputs: ["bindLabel", "bindValue", "markFirst", "placeholder", "notFoundText", "typeToSearchText", "addTagText", "loadingText", "clearAllText", "appearance", "dropdownPosition", "appendTo", "loading", "closeOnSelect", "hideSelected", "selectOnTab", "openOnEnter", "maxSelectedItems", "groupBy", "groupValue", "bufferAmount", "virtualScroll", "selectableGroup", "selectableGroupAsModel", "searchFn", "trackByFn", "clearOnBackspace", "labelForId", "inputAttrs", "tabIndex", "readonly", "searchWhileComposing", "minTermLength", "editableSearchTerm", "keyDownFn", "typeahead", "multiple", "addTag", "searchable", "clearable", "isOpen", "items", "compareWith", "clearSearchOnAdd", "deselectOnClick"], outputs: ["blur", "focus", "change", "open", "close", "search", "clear", "add", "remove", "scroll", "scrollToEnd"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1226
+ ], ngImport: i0, template: "<label class=\"form-label d-flex align-items-center\" [class.required]=\"required\">\n <ng-content select=\"[icon]\"/>\n <span>{{ label }}</span>\n</label>\n\n<ng-select\n appendTo=\"body\"\n bindLabel=\"{{ bindLabel }}\"\n bindValue=\"{{ bindValue }}\"\n placeholder=\"{{ placeholder }}\"\n [virtualScroll]=\"true\"\n [items]=\"items\"\n [ngModel]=\"value\"\n [addTag]=\"addTag\"\n [multiple]=\"multiple\"\n [readonly]=\"disabled\"\n [clearable]=\"clearable\"\n [searchable]=\"searchable\"\n (change)=\"change($event);\"\n/>\n<label *ngIf=\"errorMsg\" class=\"is-invalid\">{{ errorMsg }}</label>\n", styles: [".ng-select.ng-select-opened>.ng-select-container{background:#fff}.ng-select.ng-select-opened>.ng-select-container:hover{box-shadow:none}.ng-select.ng-select-opened>.ng-select-container .ng-arrow{top:-2px;border-color:transparent transparent #616161;border-width:0 5px 5px}.ng-select.ng-select-disabled>.ng-select-container{background-color:#e9ecef}.ng-select .ng-has-value .ng-placeholder{display:none}.ng-select .ng-select-container{color:#424242;background-color:#fff;border-radius:4px;border:2px solid #e0e0e0;min-height:36px;align-items:center}.ng-select .ng-select-container:hover{box-shadow:0 1px #0000000f}.ng-select .ng-select-container .ng-value-container{align-items:center;padding-left:10px}.ng-select .ng-select-container .ng-value-container .ng-placeholder{color:#a8a8a8}.ng-select.ng-select-single .ng-select-container{height:36px}.ng-select.ng-select-single .ng-select-container .ng-value-container .ng-input{left:0;padding-left:10px;padding-right:50px}.ng-select.ng-select-single .ng-select-container .ng-value-container .ng-input input{color:#424242}.ng-select.ng-select-multiple.ng-select-disabled>.ng-select-container .ng-value-container .ng-value{background-color:#e9ecef;border:1px solid #fafafa}.ng-select.ng-select-multiple.ng-select-disabled>.ng-select-container .ng-value-container .ng-value .ng-value-label{padding:0 5px}.ng-select.ng-select-multiple .ng-select-container .ng-value-container{padding-top:5px;padding-left:7px}.ng-select.ng-select-multiple .ng-select-container .ng-value-container .ng-value{font-size:.9em;margin-bottom:5px;color:#ed6b26;background-color:#fef3ee;border-radius:2px;margin-right:5px}.ng-select.ng-select-multiple .ng-select-container .ng-value-container .ng-value.ng-value-disabled{background-color:#e9ecef}.ng-select.ng-select-multiple .ng-select-container .ng-value-container .ng-value.ng-value-disabled .ng-value-label{padding-left:5px}.ng-select.ng-select-multiple .ng-select-container .ng-value-container .ng-value .ng-value-label,.ng-select.ng-select-multiple .ng-select-container .ng-value-container .ng-value .ng-value-icon{display:inline-block;padding:1px 5px}.ng-select.ng-select-multiple .ng-select-container .ng-value-container .ng-value .ng-value-icon:hover{background-color:#fde2d6}.ng-select.ng-select-multiple .ng-select-container .ng-value-container .ng-value .ng-value-icon.left{border-right:1px solid #fbd1be}.ng-select.ng-select-multiple .ng-select-container .ng-value-container .ng-value .ng-value-icon.right{border-left:1px solid #fbd1be}.ng-select.ng-select-multiple .ng-select-container .ng-value-container .ng-input{padding:0 0 3px 3px}.ng-select.ng-select-multiple .ng-select-container .ng-value-container .ng-input>input{color:#424242}.ng-select.ng-select-multiple .ng-select-container .ng-value-container .ng-placeholder{padding-bottom:5px;padding-left:3px}.ng-select .ng-clear-wrapper{color:#adadad}.ng-select .ng-clear-wrapper:hover .ng-clear{color:#ff3b30}.ng-select .ng-spinner-zone{padding:5px 5px 0 0}.ng-select .ng-arrow-wrapper{width:25px;padding-right:5px}.ng-select .ng-arrow-wrapper .ng-arrow{border-color:#616161 transparent transparent;border-style:solid;border-width:5px 5px 2.5px}.ng-dropdown-panel{background-color:#fff;border:2px solid #e0e0e0;box-shadow:0 1px #0000000f;left:0;z-index:20100!important;border-radius:4px}.ng-dropdown-panel.ng-select-top{bottom:100%;margin-bottom:2px}.ng-dropdown-panel.ng-select-bottom{top:100%;margin-top:2px}.ng-dropdown-panel .ng-dropdown-header{border-bottom:1px solid #e0e0e0;padding:5px 7px}.ng-dropdown-panel .ng-dropdown-footer{border-top:1px solid #e0e0e0;padding:5px 7px}.ng-dropdown-panel .ng-dropdown-panel-items .ng-optgroup{-webkit-user-select:none;user-select:none;padding:8px 10px;font-weight:500;color:#0000008a;cursor:pointer}.ng-dropdown-panel .ng-dropdown-panel-items .ng-optgroup.ng-option-disabled{cursor:default}.ng-dropdown-panel .ng-dropdown-panel-items .ng-optgroup.ng-option-marked{background-color:#fef3ee}.ng-dropdown-panel .ng-dropdown-panel-items .ng-optgroup.ng-option-selected,.ng-dropdown-panel .ng-dropdown-panel-items .ng-optgroup.ng-option-selected.ng-option-marked{color:#0000008a;background-color:#fef3ee;font-weight:600}.ng-dropdown-panel .ng-dropdown-panel-items .ng-option{background-color:#fff;color:#000000de;padding:8px 10px}.ng-dropdown-panel .ng-dropdown-panel-items .ng-option.ng-option-selected,.ng-dropdown-panel .ng-dropdown-panel-items .ng-option.ng-option-selected.ng-option-marked{color:#ed6b26;background-color:#fef3ee}.ng-dropdown-panel .ng-dropdown-panel-items .ng-option.ng-option-selected .ng-option-label,.ng-dropdown-panel .ng-dropdown-panel-items .ng-option.ng-option-selected.ng-option-marked .ng-option-label{font-weight:600}.ng-dropdown-panel .ng-dropdown-panel-items .ng-option.ng-option-marked{background-color:#fef3ee;color:#424242}.ng-dropdown-panel .ng-dropdown-panel-items .ng-option.ng-option-disabled{color:#888}.ng-dropdown-panel .ng-dropdown-panel-items .ng-option.ng-option-child{padding-left:22px}.ng-dropdown-panel .ng-dropdown-panel-items .ng-option .ng-tag-label{font-size:80%;font-weight:400;padding-right:5px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: NgSelectModule }, { kind: "component", type: i4.NgSelectComponent, selector: "ng-select", inputs: ["bindLabel", "bindValue", "markFirst", "placeholder", "notFoundText", "typeToSearchText", "addTagText", "loadingText", "clearAllText", "appearance", "dropdownPosition", "appendTo", "loading", "closeOnSelect", "hideSelected", "selectOnTab", "openOnEnter", "maxSelectedItems", "groupBy", "groupValue", "bufferAmount", "virtualScroll", "selectableGroup", "selectableGroupAsModel", "searchFn", "trackByFn", "clearOnBackspace", "labelForId", "inputAttrs", "tabIndex", "readonly", "searchWhileComposing", "minTermLength", "editableSearchTerm", "keyDownFn", "typeahead", "multiple", "addTag", "searchable", "clearable", "isOpen", "items", "compareWith", "clearSearchOnAdd", "deselectOnClick"], outputs: ["blur", "focus", "change", "open", "close", "search", "clear", "add", "remove", "scroll", "scrollToEnd"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1193
1227
  }
1194
1228
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: FormSelectComponent, decorators: [{
1195
1229
  type: Component,
@@ -2207,39 +2241,40 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.4", ngImpor
2207
2241
  }], ctorParameters: () => [{ type: i1$1.Apollo }] });
2208
2242
 
2209
2243
  class FormCurrencyInputComponent {
2210
- constructor(numberPlaceholder, ch, currencyService) {
2244
+ constructor(placeholder, numberPlaceholder, ch, currencyService) {
2245
+ this.placeholder = placeholder;
2211
2246
  this.numberPlaceholder = numberPlaceholder;
2212
2247
  this.ch = ch;
2213
2248
  this.currencyService = currencyService;
2214
2249
  this.clearable = true;
2215
2250
  this.isInputNumber = false;
2216
- this.label = 'Currency';
2217
- this.initialItems = [];
2218
2251
  this.numberValue = null;
2219
2252
  this.isNumberDisabled = false;
2220
2253
  this.required = false;
2221
2254
  this.disabled = false;
2222
- this.bindLabel = 'label';
2223
- this.bindValue = 'value';
2224
2255
  this.onChange = new EventEmitter();
2225
- this.typeahead = new Subject();
2226
- this.query$ = this.typeahead.pipe(distinctUntilChanged(), debounceTime(300), tap(() => this.isLoading = true), switchMap((k) => this.queryFunc(k).pipe(map((result) => result.length === 0 ? this.initialItems : result), catchError(() => of(this.initialItems)))), tap(() => this.isLoading = false));
2227
- this.items$ = this.query$;
2228
- this.isLoading = false;
2256
+ this.items = [];
2257
+ this.isLoading = true;
2229
2258
  this.isTouched = false;
2230
2259
  this.value = null;
2231
2260
  this.decimalLimiter = 0;
2232
2261
  this.changed = (_val) => { };
2233
2262
  this.onTouched = () => { };
2234
2263
  }
2235
- ngOnChanges(changes) {
2236
- if (changes['initialItems']) {
2237
- this.items$ = concat(of(this.initialItems), this.query$);
2238
- this.decimalLimiter = this.initialItems[0]?.magnifyValue === 1 ? 0 : Math.floor(Math.log10(this.initialItems[0]?.magnifyValue ?? 1));
2239
- this.numberValue = this.numberValue / this.initialItems[0]?.magnifyValue;
2240
- }
2241
- if (this.isInputNumber)
2242
- this.bindLabel = 'value';
2264
+ ngOnInit() {
2265
+ this.sub = this.currencyService.query().subscribe({
2266
+ error: () => {
2267
+ this.items = [];
2268
+ this.setIsLoading(false);
2269
+ },
2270
+ next: ({ data: { webConfigMsCurrency: { data } } }) => {
2271
+ this.items = data.map((d) => ({ label: `[${d.code}] ${d.name}`, value: d.code, data: d }));
2272
+ this.setIsLoading(false);
2273
+ }
2274
+ });
2275
+ }
2276
+ ngOnDestroy() {
2277
+ this.sub?.unsubscribe();
2243
2278
  }
2244
2279
  registerOnChange(fn) { this.changed = fn; }
2245
2280
  registerOnTouched(fn) { this.onTouched = fn; }
@@ -2258,18 +2293,15 @@ class FormCurrencyInputComponent {
2258
2293
  change(e) {
2259
2294
  if (this.isInputNumber)
2260
2295
  this.numberValue = null;
2261
- this.onChange.emit({ ccy: e, number: this.numberValue });
2262
- this.initialItems = e;
2263
2296
  if (!this.isTouched) {
2264
2297
  this.onTouched();
2265
2298
  this.isTouched = true;
2266
2299
  }
2267
2300
  if (!this.disabled) {
2268
- if (!e)
2269
- this.value = null;
2270
- else
2271
- this.value = e[this.bindValue];
2301
+ this.value = e?.value;
2302
+ this.selectedItem = e?.data;
2272
2303
  this.changed(this.value);
2304
+ this.onChange.emit({ selectedItem: e, number: this.numberValue });
2273
2305
  this.errorMsg = getFormErrorMessage(this.formControl.errors, 'Currency');
2274
2306
  }
2275
2307
  if (e?.magnifyValue === 1)
@@ -2279,19 +2311,19 @@ class FormCurrencyInputComponent {
2279
2311
  }
2280
2312
  numberInput({ value }) {
2281
2313
  this.numberValue = value;
2282
- this.onChange.emit({ ccy: this.initialItems, number: value });
2314
+ this.onChange.emit({ selectedItem: this.selectedItem, number: value });
2283
2315
  }
2284
2316
  limitDecimal({ charCode, preventDefault, target: { value } }) {
2285
2317
  const reg = this.decimalLimiter > 0 ? new RegExp(`^\\d*(\\.\\d{0,${this.decimalLimiter}})?$`) : /^\d+$/;
2286
2318
  if (!reg.test(value + String.fromCharCode(charCode)))
2287
2319
  preventDefault();
2288
2320
  }
2289
- queryFunc(keyword) {
2290
- return this.currencyService.query(keyword).pipe(map(({ data: { webConfigMsCurrency: { data } } }) => data.map(({ code, name, magnifyValue }) => ({ label: `[${code}] ${name}`, value: code, magnifyValue }))));
2321
+ setIsLoading(b) {
2322
+ this.isLoading = b;
2323
+ this.ch.markForCheck();
2291
2324
  }
2292
- ;
2293
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: FormCurrencyInputComponent, deps: [{ token: 'numberPlaceholder', attribute: true }, { token: i0.ChangeDetectorRef }, { token: CurrencyService }], target: i0.ɵɵFactoryTarget.Component }); }
2294
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.0.4", type: FormCurrencyInputComponent, isStandalone: true, selector: "up-currency-input", inputs: { clearable: "clearable", isInputNumber: "isInputNumber", label: "label", initialItems: "initialItems", numberValue: "numberValue", isNumberDisabled: "isNumberDisabled", required: "required", disabled: "disabled", bindLabel: "bindLabel", bindValue: "bindValue" }, outputs: { onChange: "onChange" }, host: { classAttribute: "d-block" }, providers: [
2325
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: FormCurrencyInputComponent, deps: [{ token: 'placeholder', attribute: true }, { token: 'numberPlaceholder', attribute: true }, { token: i0.ChangeDetectorRef }, { token: CurrencyService }], target: i0.ɵɵFactoryTarget.Component }); }
2326
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.0.4", type: FormCurrencyInputComponent, isStandalone: true, selector: "up-currency-input", inputs: { clearable: "clearable", isInputNumber: "isInputNumber", numberValue: "numberValue", isNumberDisabled: "isNumberDisabled", required: "required", disabled: "disabled" }, outputs: { onChange: "onChange" }, host: { classAttribute: "d-block" }, providers: [
2295
2327
  {
2296
2328
  multi: true,
2297
2329
  provide: NG_VALUE_ACCESSOR,
@@ -2302,7 +2334,7 @@ class FormCurrencyInputComponent {
2302
2334
  provide: NG_VALIDATORS,
2303
2335
  useExisting: FormCurrencyInputComponent
2304
2336
  }
2305
- ], usesOnChanges: true, ngImport: i0, template: "<label class=\"form-label\" [class.required]=\"required\">{{ label }}</label>\n\n<ng-template #selectForm>\n <ng-select \n class=\"flex-shrink-0\"\n [class.number]=\"isInputNumber\"\n appendTo=\"body\"\n typeToSearchText=\"Please enter 3 or more characters\"\n placeholder=\"{{ label }}\"\n [bindLabel]=\"bindLabel\"\n [bindValue]=\"bindValue\"\n [minTermLength]=\"3\"\n [virtualScroll]=\"true\"\n [editableSearchTerm]=\"true\"\n [ngModel]=\"value\"\n [readonly]=\"disabled\" \n [loading]=\"isLoading\"\n [clearable]=\"clearable\"\n [typeahead]=\"typeahead\"\n [items]=\"items$ | async\"\n (change)=\"change($event);\"\n >\n <ng-template ng-option-tmp let-i=\"item\">\n <span>{{ isInputNumber? i.value : i.label }}</span>\n </ng-template>\n </ng-select>\n</ng-template>\n\n<ng-template #inputNumber>\n <div class=\"d-flex justify-content-between gap-1 align-items-center\">\n <ng-container *ngTemplateOutlet=\"selectForm\" />\n\n <input type=\"number\" [placeholder]=\"numberPlaceholder\" class=\"form-control flex-grow-1\" [disabled]=\"isNumberDisabled\" [value]=\"numberValue\" (keypress)=\"limitDecimal($event)\" (input)=\"numberInput($event.target)\">\n </div>\n</ng-template>\n\n<ng-container *ngIf=\"!isInputNumber else inputNumber\">\n <ng-container *ngTemplateOutlet=\"selectForm\" />\n</ng-container>\n\n<label *ngIf=\"errorMsg\" class=\"is-invalid\">{{ errorMsg }}</label>\n", styles: ["ng-select.number{min-width:105px;max-width:105px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: NgSelectModule }, { kind: "component", type: i3$2.NgSelectComponent, selector: "ng-select", inputs: ["bindLabel", "bindValue", "markFirst", "placeholder", "notFoundText", "typeToSearchText", "addTagText", "loadingText", "clearAllText", "appearance", "dropdownPosition", "appendTo", "loading", "closeOnSelect", "hideSelected", "selectOnTab", "openOnEnter", "maxSelectedItems", "groupBy", "groupValue", "bufferAmount", "virtualScroll", "selectableGroup", "selectableGroupAsModel", "searchFn", "trackByFn", "clearOnBackspace", "labelForId", "inputAttrs", "tabIndex", "readonly", "searchWhileComposing", "minTermLength", "editableSearchTerm", "keyDownFn", "typeahead", "multiple", "addTag", "searchable", "clearable", "isOpen", "items", "compareWith", "clearSearchOnAdd", "deselectOnClick"], outputs: ["blur", "focus", "change", "open", "close", "search", "clear", "add", "remove", "scroll", "scrollToEnd"] }, { kind: "directive", type: i3$2.NgOptionTemplateDirective, selector: "[ng-option-tmp]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
2337
+ ], ngImport: i0, template: "<label class=\"form-label\" [class.required]=\"required\">Currency</label>\n\n<ng-template #selectForm>\n <ng-select \n class=\"flex-shrink-0\"\n [class.number]=\"isInputNumber\"\n appendTo=\"body\"\n bindValue=\"value\"\n placeholder=\"{{ placeholder }}\"\n [virtualScroll]=\"true\"\n [items]=\"items\"\n [ngModel]=\"value\"\n [readonly]=\"disabled\" \n [loading]=\"isLoading\"\n [clearable]=\"clearable\"\n (change)=\"change($event);\"\n >\n <ng-template ng-option-tmp let-i=\"item\">\n <span>{{ isInputNumber? i.value : i.label }}</span>\n </ng-template>\n\n <ng-template ng-label-tmp let-i=\"item\">\n <span>{{ isInputNumber? i.value : i.label }}</span>\n </ng-template>\n </ng-select>\n</ng-template>\n\n<ng-template #inputNumber>\n <div class=\"d-flex justify-content-between gap-1 align-items-center\">\n <ng-container *ngTemplateOutlet=\"selectForm\" />\n\n <input type=\"number\" [placeholder]=\"numberPlaceholder\" class=\"form-control flex-grow-1\" [disabled]=\"isNumberDisabled\" [value]=\"numberValue\" (keypress)=\"limitDecimal($event)\" (input)=\"numberInput($event.target)\">\n </div>\n</ng-template>\n\n<ng-container *ngIf=\"!isInputNumber else inputNumber\">\n <ng-container *ngTemplateOutlet=\"selectForm\" />\n</ng-container>\n\n<label *ngIf=\"errorMsg\" class=\"is-invalid\">{{ errorMsg }}</label>\n", styles: ["ng-select.number{min-width:105px;max-width:105px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: NgSelectModule }, { kind: "component", type: i4.NgSelectComponent, selector: "ng-select", inputs: ["bindLabel", "bindValue", "markFirst", "placeholder", "notFoundText", "typeToSearchText", "addTagText", "loadingText", "clearAllText", "appearance", "dropdownPosition", "appendTo", "loading", "closeOnSelect", "hideSelected", "selectOnTab", "openOnEnter", "maxSelectedItems", "groupBy", "groupValue", "bufferAmount", "virtualScroll", "selectableGroup", "selectableGroupAsModel", "searchFn", "trackByFn", "clearOnBackspace", "labelForId", "inputAttrs", "tabIndex", "readonly", "searchWhileComposing", "minTermLength", "editableSearchTerm", "keyDownFn", "typeahead", "multiple", "addTag", "searchable", "clearable", "isOpen", "items", "compareWith", "clearSearchOnAdd", "deselectOnClick"], outputs: ["blur", "focus", "change", "open", "close", "search", "clear", "add", "remove", "scroll", "scrollToEnd"] }, { kind: "directive", type: i4.NgOptionTemplateDirective, selector: "[ng-option-tmp]" }, { kind: "directive", type: i4.NgLabelTemplateDirective, selector: "[ng-label-tmp]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
2306
2338
  }
2307
2339
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: FormCurrencyInputComponent, decorators: [{
2308
2340
  type: Component,
@@ -2323,18 +2355,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.4", ngImpor
2323
2355
  provide: NG_VALIDATORS,
2324
2356
  useExisting: FormCurrencyInputComponent
2325
2357
  }
2326
- ], template: "<label class=\"form-label\" [class.required]=\"required\">{{ label }}</label>\n\n<ng-template #selectForm>\n <ng-select \n class=\"flex-shrink-0\"\n [class.number]=\"isInputNumber\"\n appendTo=\"body\"\n typeToSearchText=\"Please enter 3 or more characters\"\n placeholder=\"{{ label }}\"\n [bindLabel]=\"bindLabel\"\n [bindValue]=\"bindValue\"\n [minTermLength]=\"3\"\n [virtualScroll]=\"true\"\n [editableSearchTerm]=\"true\"\n [ngModel]=\"value\"\n [readonly]=\"disabled\" \n [loading]=\"isLoading\"\n [clearable]=\"clearable\"\n [typeahead]=\"typeahead\"\n [items]=\"items$ | async\"\n (change)=\"change($event);\"\n >\n <ng-template ng-option-tmp let-i=\"item\">\n <span>{{ isInputNumber? i.value : i.label }}</span>\n </ng-template>\n </ng-select>\n</ng-template>\n\n<ng-template #inputNumber>\n <div class=\"d-flex justify-content-between gap-1 align-items-center\">\n <ng-container *ngTemplateOutlet=\"selectForm\" />\n\n <input type=\"number\" [placeholder]=\"numberPlaceholder\" class=\"form-control flex-grow-1\" [disabled]=\"isNumberDisabled\" [value]=\"numberValue\" (keypress)=\"limitDecimal($event)\" (input)=\"numberInput($event.target)\">\n </div>\n</ng-template>\n\n<ng-container *ngIf=\"!isInputNumber else inputNumber\">\n <ng-container *ngTemplateOutlet=\"selectForm\" />\n</ng-container>\n\n<label *ngIf=\"errorMsg\" class=\"is-invalid\">{{ errorMsg }}</label>\n", styles: ["ng-select.number{min-width:105px;max-width:105px}\n"] }]
2358
+ ], template: "<label class=\"form-label\" [class.required]=\"required\">Currency</label>\n\n<ng-template #selectForm>\n <ng-select \n class=\"flex-shrink-0\"\n [class.number]=\"isInputNumber\"\n appendTo=\"body\"\n bindValue=\"value\"\n placeholder=\"{{ placeholder }}\"\n [virtualScroll]=\"true\"\n [items]=\"items\"\n [ngModel]=\"value\"\n [readonly]=\"disabled\" \n [loading]=\"isLoading\"\n [clearable]=\"clearable\"\n (change)=\"change($event);\"\n >\n <ng-template ng-option-tmp let-i=\"item\">\n <span>{{ isInputNumber? i.value : i.label }}</span>\n </ng-template>\n\n <ng-template ng-label-tmp let-i=\"item\">\n <span>{{ isInputNumber? i.value : i.label }}</span>\n </ng-template>\n </ng-select>\n</ng-template>\n\n<ng-template #inputNumber>\n <div class=\"d-flex justify-content-between gap-1 align-items-center\">\n <ng-container *ngTemplateOutlet=\"selectForm\" />\n\n <input type=\"number\" [placeholder]=\"numberPlaceholder\" class=\"form-control flex-grow-1\" [disabled]=\"isNumberDisabled\" [value]=\"numberValue\" (keypress)=\"limitDecimal($event)\" (input)=\"numberInput($event.target)\">\n </div>\n</ng-template>\n\n<ng-container *ngIf=\"!isInputNumber else inputNumber\">\n <ng-container *ngTemplateOutlet=\"selectForm\" />\n</ng-container>\n\n<label *ngIf=\"errorMsg\" class=\"is-invalid\">{{ errorMsg }}</label>\n", styles: ["ng-select.number{min-width:105px;max-width:105px}\n"] }]
2327
2359
  }], ctorParameters: () => [{ type: undefined, decorators: [{
2360
+ type: Attribute,
2361
+ args: ['placeholder']
2362
+ }] }, { type: undefined, decorators: [{
2328
2363
  type: Attribute,
2329
2364
  args: ['numberPlaceholder']
2330
2365
  }] }, { type: i0.ChangeDetectorRef }, { type: CurrencyService }], propDecorators: { clearable: [{
2331
2366
  type: Input
2332
2367
  }], isInputNumber: [{
2333
2368
  type: Input
2334
- }], label: [{
2335
- type: Input
2336
- }], initialItems: [{
2337
- type: Input
2338
2369
  }], numberValue: [{
2339
2370
  type: Input
2340
2371
  }], isNumberDisabled: [{
@@ -2343,9 +2374,113 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.4", ngImpor
2343
2374
  type: Input
2344
2375
  }], disabled: [{
2345
2376
  type: Input
2346
- }], bindLabel: [{
2377
+ }], onChange: [{
2378
+ type: Output
2379
+ }] } });
2380
+
2381
+ class FormCountryInputComponent {
2382
+ constructor(placeholder, ch, countryService) {
2383
+ this.placeholder = placeholder;
2384
+ this.ch = ch;
2385
+ this.countryService = countryService;
2386
+ this.clearable = true;
2387
+ this.required = false;
2388
+ this.disabled = false;
2389
+ this.onChange = new EventEmitter();
2390
+ this.items = [];
2391
+ this.isLoading = true;
2392
+ this.isTouched = false;
2393
+ this.value = null;
2394
+ this.changed = (_val) => { };
2395
+ this.onTouched = () => { };
2396
+ }
2397
+ ngOnInit() {
2398
+ this.sub = this.countryService.query().subscribe({
2399
+ error: () => {
2400
+ this.items = [];
2401
+ this.setIsLoading(false);
2402
+ },
2403
+ next: ({ data: { webConfigMsCountry: { data } } }) => {
2404
+ this.items = data.map((d) => ({ label: d.name, value: d.code, data: d }));
2405
+ this.setIsLoading(false);
2406
+ }
2407
+ });
2408
+ }
2409
+ ngOnDestroy() {
2410
+ this.sub?.unsubscribe();
2411
+ }
2412
+ registerOnChange(fn) { this.changed = fn; }
2413
+ registerOnTouched(fn) { this.onTouched = fn; }
2414
+ writeValue(val) {
2415
+ this.value = val;
2416
+ this.ch.markForCheck();
2417
+ }
2418
+ setDisabledState(d) {
2419
+ this.disabled = d;
2420
+ this.ch.markForCheck();
2421
+ }
2422
+ validate(control) {
2423
+ this.formControl = control;
2424
+ return null;
2425
+ }
2426
+ change(e) {
2427
+ if (!this.isTouched) {
2428
+ this.onTouched();
2429
+ this.isTouched = true;
2430
+ }
2431
+ if (!this.disabled) {
2432
+ this.value = e?.value;
2433
+ this.changed(this.value);
2434
+ this.onChange.emit(e.data);
2435
+ this.errorMsg = getFormErrorMessage(this.formControl.errors, 'Country');
2436
+ }
2437
+ }
2438
+ setIsLoading(b) {
2439
+ this.isLoading = b;
2440
+ this.ch.markForCheck();
2441
+ }
2442
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: FormCountryInputComponent, deps: [{ token: 'placeholder', attribute: true }, { token: i0.ChangeDetectorRef }, { token: CountryService }], target: i0.ɵɵFactoryTarget.Component }); }
2443
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.0.4", type: FormCountryInputComponent, isStandalone: true, selector: "up-country-input", inputs: { clearable: "clearable", required: "required", disabled: "disabled" }, outputs: { onChange: "onChange" }, host: { classAttribute: "d-block" }, providers: [
2444
+ {
2445
+ multi: true,
2446
+ provide: NG_VALUE_ACCESSOR,
2447
+ useExisting: FormCountryInputComponent
2448
+ },
2449
+ {
2450
+ multi: true,
2451
+ provide: NG_VALIDATORS,
2452
+ useExisting: FormCountryInputComponent
2453
+ }
2454
+ ], ngImport: i0, template: "<label class=\"form-label\" [class.required]=\"required\">Country</label>\n<ng-select \n class=\"flex-shrink-0\"\n appendTo=\"body\"\n bindValue=\"value\"\n placeholder=\"{{ placeholder }}\"\n [virtualScroll]=\"true\"\n [items]=\"items\"\n [ngModel]=\"value\"\n [readonly]=\"disabled\" \n [loading]=\"isLoading\"\n [clearable]=\"clearable\"\n (change)=\"change($event);\"\n/>\n<label *ngIf=\"errorMsg\" class=\"is-invalid\">{{ errorMsg }}</label>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: NgSelectModule }, { kind: "component", type: i4.NgSelectComponent, selector: "ng-select", inputs: ["bindLabel", "bindValue", "markFirst", "placeholder", "notFoundText", "typeToSearchText", "addTagText", "loadingText", "clearAllText", "appearance", "dropdownPosition", "appendTo", "loading", "closeOnSelect", "hideSelected", "selectOnTab", "openOnEnter", "maxSelectedItems", "groupBy", "groupValue", "bufferAmount", "virtualScroll", "selectableGroup", "selectableGroupAsModel", "searchFn", "trackByFn", "clearOnBackspace", "labelForId", "inputAttrs", "tabIndex", "readonly", "searchWhileComposing", "minTermLength", "editableSearchTerm", "keyDownFn", "typeahead", "multiple", "addTag", "searchable", "clearable", "isOpen", "items", "compareWith", "clearSearchOnAdd", "deselectOnClick"], outputs: ["blur", "focus", "change", "open", "close", "search", "clear", "add", "remove", "scroll", "scrollToEnd"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
2455
+ }
2456
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: FormCountryInputComponent, decorators: [{
2457
+ type: Component,
2458
+ args: [{ standalone: true, selector: 'up-country-input', changeDetection: ChangeDetectionStrategy.OnPush, host: {
2459
+ class: 'd-block'
2460
+ }, imports: [
2461
+ CommonModule,
2462
+ FormsModule,
2463
+ NgSelectModule
2464
+ ], providers: [
2465
+ {
2466
+ multi: true,
2467
+ provide: NG_VALUE_ACCESSOR,
2468
+ useExisting: FormCountryInputComponent
2469
+ },
2470
+ {
2471
+ multi: true,
2472
+ provide: NG_VALIDATORS,
2473
+ useExisting: FormCountryInputComponent
2474
+ }
2475
+ ], template: "<label class=\"form-label\" [class.required]=\"required\">Country</label>\n<ng-select \n class=\"flex-shrink-0\"\n appendTo=\"body\"\n bindValue=\"value\"\n placeholder=\"{{ placeholder }}\"\n [virtualScroll]=\"true\"\n [items]=\"items\"\n [ngModel]=\"value\"\n [readonly]=\"disabled\" \n [loading]=\"isLoading\"\n [clearable]=\"clearable\"\n (change)=\"change($event);\"\n/>\n<label *ngIf=\"errorMsg\" class=\"is-invalid\">{{ errorMsg }}</label>\n" }]
2476
+ }], ctorParameters: () => [{ type: undefined, decorators: [{
2477
+ type: Attribute,
2478
+ args: ['placeholder']
2479
+ }] }, { type: i0.ChangeDetectorRef }, { type: CountryService }], propDecorators: { clearable: [{
2347
2480
  type: Input
2348
- }], bindValue: [{
2481
+ }], required: [{
2482
+ type: Input
2483
+ }], disabled: [{
2349
2484
  type: Input
2350
2485
  }], onChange: [{
2351
2486
  type: Output
@@ -3566,5 +3701,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.4", ngImpor
3566
3701
  type: Injectable
3567
3702
  }], ctorParameters: () => [{ type: i1$2.Router }, { type: AuthService }] });
3568
3703
 
3569
- export { AppletContainerComponent, ApprovalDetailComponent, ApprovalListComponent, AuditDetailComponent, AuditListComponent, AuthGuard, AuthResolver, AuthService, ButtonGroupComponent, ButtonLoadingComponent, ColumnContainerComponent, ColumnHeaderContainerComponent, CountryService, CurrencyService, FilterComponent, FormCurrencyInputComponent, FormDateComponent, FormImagePickerComponent, FormInputComponent, FormNumberComponent, FormPasswordComponent, FormSearchableSelectComponent, FormSelectComponent, FormTextareaComponent, GridPaginationComponent, GridService, GridSnapshotComponent, HeaderInterceptor, ListPaginationContainerComponent, ListSnapshotContainerComponent, LoadingPage, ModalContainerComponent, PermissionDirective, PermissionGuard, PermissionModule, PermissionService, ProfileService, RefreshTokenInterceptor, TabContentComponent, TabGroupComponent, TabsComponentModule, UnauthorizedPage, bootstrap, getFormErrorMessage };
3704
+ export { AppletContainerComponent, ApprovalDetailComponent, ApprovalListComponent, AuditDetailComponent, AuditListComponent, AuthGuard, AuthResolver, AuthService, ButtonGroupComponent, ButtonLoadingComponent, ColumnContainerComponent, ColumnHeaderContainerComponent, CountryService, CurrencyService, FilterComponent, FormCountryInputComponent, FormCurrencyInputComponent, FormDateComponent, FormImagePickerComponent, FormInputComponent, FormNumberComponent, FormPasswordComponent, FormSearchableSelectComponent, FormSelectComponent, FormTextareaComponent, GridPaginationComponent, GridService, GridSnapshotComponent, HeaderInterceptor, ListPaginationContainerComponent, ListSnapshotContainerComponent, LoadingPage, ModalContainerComponent, PermissionDirective, PermissionGuard, PermissionModule, PermissionService, ProfileService, RefreshTokenInterceptor, TabContentComponent, TabGroupComponent, TabsComponentModule, UnauthorizedPage, bootstrap, formatCapitalize, generateContrastColor, getFormErrorMessage };
3570
3705
  //# sourceMappingURL=unipin-angular-applet.mjs.map