@sumaris-net/ngx-components 1.20.1 → 1.20.4
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/bundles/sumaris-net.ngx-components.umd.js +209 -26
- package/bundles/sumaris-net.ngx-components.umd.js.map +1 -1
- package/bundles/sumaris-net.ngx-components.umd.min.js +2 -2
- package/bundles/sumaris-net.ngx-components.umd.min.js.map +1 -1
- package/doc/changelog.md +12 -0
- package/esm2015/public_api.js +7 -3
- package/esm2015/src/app/core/install/install-upgrade-card.component.js +3 -2
- package/esm2015/src/app/core/services/platform.service.js +3 -2
- package/esm2015/src/app/shared/directives/autotitle.directive.js +27 -0
- package/esm2015/src/app/shared/directives/directives.module.js +6 -3
- package/esm2015/src/app/shared/file/csv.utils.js +90 -0
- package/esm2015/src/app/shared/file/file.utils.js +63 -0
- package/esm2015/src/app/shared/file/uri.utils.js +23 -0
- package/esm2015/src/app/shared/functions.js +3 -1
- package/esm2015/src/app/shared/material/autocomplete/material.autocomplete.js +3 -2
- package/esm2015/src/app/shared/material/chips/material.chips.js +3 -2
- package/esm2015/src/app/shared/material/swipe/material.swipe.js +3 -2
- package/esm2015/src/app/shared/pipes/pipes.module.js +7 -4
- package/esm2015/src/app/shared/pipes/property.pipes.js +74 -0
- package/esm2015/src/app/shared/upload-file/testing/upload-file.testing.js +2 -2
- package/fesm2015/sumaris-net.ngx-components.js +199 -24
- package/fesm2015/sumaris-net.ngx-components.js.map +1 -1
- package/package.json +1 -1
- package/public_api.d.ts +6 -2
- package/src/app/shared/directives/autotitle.directive.d.ts +7 -0
- package/src/app/shared/file/csv.utils.d.ts +18 -0
- package/src/app/shared/{files.d.ts → file/file.utils.d.ts} +3 -9
- package/src/app/shared/file/uri.utils.d.ts +7 -0
- package/src/app/shared/material/autocomplete/material.autocomplete.d.ts +2 -1
- package/src/app/shared/material/chips/material.chips.d.ts +2 -1
- package/src/app/shared/material/swipe/material.swipe.d.ts +2 -1
- package/src/app/shared/pipes/property.pipes.d.ts +14 -0
- package/src/theme/_mixins.scss +2 -0
- package/sumaris-net.ngx-components.metadata.json +1 -1
- package/esm2015/src/app/shared/files.js +0 -84
- package/esm2015/src/app/shared/pipes/properties.pipe.js +0 -20
- package/src/app/shared/pipes/properties.pipe.d.ts +0 -7
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { Injectable, Pipe } from '@angular/core';
|
|
2
|
+
import { getPropertyByPath, isNil, isNotNil, joinPropertiesPath } from '../functions';
|
|
3
|
+
import { DateFormatPipe } from './date-format.pipe';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "./date-format.pipe";
|
|
6
|
+
export class PropertyGetPipe {
|
|
7
|
+
transform(obj, args) {
|
|
8
|
+
return getPropertyByPath(obj,
|
|
9
|
+
// Path
|
|
10
|
+
args && (typeof args === 'string' ? args : args.key),
|
|
11
|
+
// Default value
|
|
12
|
+
args && args.defaultValue);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
PropertyGetPipe.decorators = [
|
|
16
|
+
{ type: Pipe, args: [{
|
|
17
|
+
name: 'propertyGet'
|
|
18
|
+
},] }
|
|
19
|
+
];
|
|
20
|
+
export class PropertyFormatPipe {
|
|
21
|
+
constructor(dateFormat) {
|
|
22
|
+
this.dateFormat = dateFormat;
|
|
23
|
+
}
|
|
24
|
+
transform(obj, keyOrDefinition) {
|
|
25
|
+
var _a, _b;
|
|
26
|
+
if (!obj)
|
|
27
|
+
return '';
|
|
28
|
+
const definition = keyOrDefinition && (typeof keyOrDefinition === 'object') && keyOrDefinition;
|
|
29
|
+
const key = (definition === null || definition === void 0 ? void 0 : definition.key) || keyOrDefinition;
|
|
30
|
+
if (!key) {
|
|
31
|
+
// Should never occur
|
|
32
|
+
console.warn('Invalid use of pipe \'formatProperty\': missing key or definition');
|
|
33
|
+
return '';
|
|
34
|
+
}
|
|
35
|
+
const value = obj[key];
|
|
36
|
+
if (isNil(value))
|
|
37
|
+
return value;
|
|
38
|
+
const type = (definition === null || definition === void 0 ? void 0 : definition.type) || typeof value;
|
|
39
|
+
switch (type) {
|
|
40
|
+
case 'date':
|
|
41
|
+
return this.dateFormat.transform(value);
|
|
42
|
+
case 'dateTime':
|
|
43
|
+
return this.dateFormat.transform(value, { time: true });
|
|
44
|
+
case 'enum':
|
|
45
|
+
{
|
|
46
|
+
// DEBUG
|
|
47
|
+
// console.debug('formatProperty by definition (type='enum', key=' +definition.key+ '):', value );
|
|
48
|
+
const item = (definition.values || [value]).find(item => (isNotNil(item.key) ? item.key : item) === value);
|
|
49
|
+
return item.value || item;
|
|
50
|
+
}
|
|
51
|
+
case 'entity':
|
|
52
|
+
{
|
|
53
|
+
if ((_a = definition.autocomplete) === null || _a === void 0 ? void 0 : _a.displayWith) {
|
|
54
|
+
return definition.autocomplete.displayWith(value);
|
|
55
|
+
}
|
|
56
|
+
return joinPropertiesPath(obj, ((_b = definition.autocomplete) === null || _b === void 0 ? void 0 : _b.attributes) || ['label', 'name']) || undefined;
|
|
57
|
+
}
|
|
58
|
+
case 'string':
|
|
59
|
+
default:
|
|
60
|
+
return value;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
PropertyFormatPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function PropertyFormatPipe_Factory() { return new PropertyFormatPipe(i0.ɵɵinject(i1.DateFormatPipe)); }, token: PropertyFormatPipe, providedIn: "root" });
|
|
65
|
+
PropertyFormatPipe.decorators = [
|
|
66
|
+
{ type: Pipe, args: [{
|
|
67
|
+
name: 'propertyFormat'
|
|
68
|
+
},] },
|
|
69
|
+
{ type: Injectable, args: [{ providedIn: 'root' },] }
|
|
70
|
+
];
|
|
71
|
+
PropertyFormatPipe.ctorParameters = () => [
|
|
72
|
+
{ type: DateFormatPipe }
|
|
73
|
+
];
|
|
74
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcGVydHkucGlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3NoYXJlZC9waXBlcy9wcm9wZXJ0eS5waXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsVUFBVSxFQUFFLElBQUksRUFBZ0IsTUFBTSxlQUFlLENBQUM7QUFDOUQsT0FBTyxFQUFDLGlCQUFpQixFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsa0JBQWtCLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDcEYsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLG9CQUFvQixDQUFDOzs7QUFNbEQsTUFBTSxPQUFPLGVBQWU7SUFFeEIsU0FBUyxDQUFDLEdBQVEsRUFBRSxJQUFpRDtRQUNuRSxPQUFPLGlCQUFpQixDQUFDLEdBQUc7UUFDMUIsT0FBTztRQUNQLElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQ3BELGdCQUFnQjtRQUNoQixJQUFJLElBQUssSUFBWSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ3hDLENBQUM7OztZQVhKLElBQUksU0FBQztnQkFDRixJQUFJLEVBQUUsYUFBYTthQUN0Qjs7QUFpQkQsTUFBTSxPQUFPLGtCQUFrQjtJQUU3QixZQUFvQixVQUEwQjtRQUExQixlQUFVLEdBQVYsVUFBVSxDQUFnQjtJQUM5QyxDQUFDO0lBRUQsU0FBUyxDQUFDLEdBQVEsRUFBRSxlQUEyQzs7UUFDN0QsSUFBSSxDQUFDLEdBQUc7WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUNwQixNQUFNLFVBQVUsR0FBRyxlQUFlLElBQUksQ0FBQyxPQUFPLGVBQWUsS0FBSyxRQUFRLENBQUMsSUFBSSxlQUFlLENBQUM7UUFDL0YsTUFBTSxHQUFHLEdBQUcsQ0FBQSxVQUFVLGFBQVYsVUFBVSx1QkFBVixVQUFVLENBQUUsR0FBRyxLQUFJLGVBQXlCLENBQUM7UUFDekQsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUNSLHFCQUFxQjtZQUNyQixPQUFPLENBQUMsSUFBSSxDQUFDLG1FQUFtRSxDQUFDLENBQUM7WUFDbEYsT0FBTyxFQUFFLENBQUM7U0FDWDtRQUNELE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN2QixJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUM7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUMvQixNQUFNLElBQUksR0FBRyxDQUFBLFVBQVUsYUFBVixVQUFVLHVCQUFWLFVBQVUsQ0FBRSxJQUFJLEtBQUksT0FBTyxLQUFLLENBQUM7UUFDOUMsUUFBUSxJQUFJLEVBQUU7WUFDWixLQUFLLE1BQU07Z0JBQ1QsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQVcsQ0FBQztZQUNwRCxLQUFLLFVBQVU7Z0JBQ2IsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsRUFBQyxJQUFJLEVBQUUsSUFBSSxFQUFDLENBQVcsQ0FBQztZQUNsRSxLQUFLLE1BQU07Z0JBQ1g7b0JBQ0UsUUFBUTtvQkFDUixrR0FBa0c7b0JBQ2xHLE1BQU0sSUFBSSxHQUFHLENBQUMsVUFBVSxDQUFDLE1BQWUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxLQUFLLENBQUMsQ0FBQztvQkFDcEgsT0FBTyxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQztpQkFDM0I7WUFDRCxLQUFLLFFBQVE7Z0JBQ2I7b0JBQ0UsVUFBSSxVQUFVLENBQUMsWUFBWSwwQ0FBRSxXQUFXLEVBQUU7d0JBQ3hDLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUE7cUJBQ2xEO29CQUNELE9BQU8sa0JBQWtCLENBQUMsR0FBRyxFQUFFLE9BQUEsVUFBVSxDQUFDLFlBQVksMENBQUUsVUFBVSxLQUFJLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDLElBQUksU0FBUyxDQUFDO2lCQUN2RztZQUNELEtBQUssUUFBUSxDQUFDO1lBQ2Q7Z0JBQ0UsT0FBTyxLQUFLLENBQUM7U0FDaEI7SUFDSCxDQUFDOzs7O1lBNUNGLElBQUksU0FBQztnQkFDSixJQUFJLEVBQUUsZ0JBQWdCO2FBQ3ZCO1lBQ0EsVUFBVSxTQUFDLEVBQUMsVUFBVSxFQUFFLE1BQU0sRUFBQzs7O1lBckJ4QixjQUFjIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtJbmplY3RhYmxlLCBQaXBlLCBQaXBlVHJhbnNmb3JtfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7Z2V0UHJvcGVydHlCeVBhdGgsIGlzTmlsLCBpc05vdE5pbCwgam9pblByb3BlcnRpZXNQYXRofSBmcm9tICcuLi9mdW5jdGlvbnMnO1xuaW1wb3J0IHtEYXRlRm9ybWF0UGlwZX0gZnJvbSAnLi9kYXRlLWZvcm1hdC5waXBlJztcbmltcG9ydCB7Rm9ybUZpZWxkRGVmaW5pdGlvbn0gZnJvbSAnLi4vZm9ybS9maWVsZC5tb2RlbCc7XG5cbkBQaXBlKHtcbiAgICBuYW1lOiAncHJvcGVydHlHZXQnXG59KVxuZXhwb3J0IGNsYXNzIFByb3BlcnR5R2V0UGlwZSBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm0ge1xuXG4gICAgdHJhbnNmb3JtKG9iajogYW55LCBhcmdzOiBzdHJpbmcgfCB7a2V5OiBzdHJpbmc7IGRlZmF1bHRWYWx1ZT86IGFueSB9ICk6IGFueSB7XG4gICAgICByZXR1cm4gZ2V0UHJvcGVydHlCeVBhdGgob2JqLFxuICAgICAgICAvLyBQYXRoXG4gICAgICAgIGFyZ3MgJiYgKHR5cGVvZiBhcmdzID09PSAnc3RyaW5nJyA/IGFyZ3MgOiBhcmdzLmtleSksXG4gICAgICAgIC8vIERlZmF1bHQgdmFsdWVcbiAgICAgICAgYXJncyAmJiAoYXJncyBhcyBhbnkpLmRlZmF1bHRWYWx1ZSk7XG4gICAgfVxufVxuXG5cbkBQaXBlKHtcbiAgbmFtZTogJ3Byb3BlcnR5Rm9ybWF0J1xufSlcbkBJbmplY3RhYmxlKHtwcm92aWRlZEluOiAncm9vdCd9KVxuZXhwb3J0IGNsYXNzIFByb3BlcnR5Rm9ybWF0UGlwZSBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm0ge1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZGF0ZUZvcm1hdDogRGF0ZUZvcm1hdFBpcGUpIHtcbiAgfVxuXG4gIHRyYW5zZm9ybShvYmo6IGFueSwga2V5T3JEZWZpbml0aW9uOiBzdHJpbmd8Rm9ybUZpZWxkRGVmaW5pdGlvbik6IHN0cmluZyB8IFByb21pc2U8c3RyaW5nPiB7XG4gICAgaWYgKCFvYmopIHJldHVybiAnJztcbiAgICBjb25zdCBkZWZpbml0aW9uID0ga2V5T3JEZWZpbml0aW9uICYmICh0eXBlb2Yga2V5T3JEZWZpbml0aW9uID09PSAnb2JqZWN0JykgJiYga2V5T3JEZWZpbml0aW9uO1xuICAgIGNvbnN0IGtleSA9IGRlZmluaXRpb24/LmtleSB8fCBrZXlPckRlZmluaXRpb24gYXMgc3RyaW5nO1xuICAgIGlmICgha2V5KSB7XG4gICAgICAvLyBTaG91bGQgbmV2ZXIgb2NjdXJcbiAgICAgIGNvbnNvbGUud2FybignSW52YWxpZCB1c2Ugb2YgcGlwZSBcXCdmb3JtYXRQcm9wZXJ0eVxcJzogbWlzc2luZyBrZXkgb3IgZGVmaW5pdGlvbicpO1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZSA9IG9ialtrZXldO1xuICAgIGlmIChpc05pbCh2YWx1ZSkpIHJldHVybiB2YWx1ZTtcbiAgICBjb25zdCB0eXBlID0gZGVmaW5pdGlvbj8udHlwZSB8fCB0eXBlb2YgdmFsdWU7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlICdkYXRlJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0ZUZvcm1hdC50cmFuc2Zvcm0odmFsdWUpIGFzIHN0cmluZztcbiAgICAgIGNhc2UgJ2RhdGVUaW1lJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0ZUZvcm1hdC50cmFuc2Zvcm0odmFsdWUsIHt0aW1lOiB0cnVlfSkgYXMgc3RyaW5nO1xuICAgICAgY2FzZSAnZW51bSc6XG4gICAgICB7XG4gICAgICAgIC8vIERFQlVHXG4gICAgICAgIC8vIGNvbnNvbGUuZGVidWcoJ2Zvcm1hdFByb3BlcnR5IGJ5IGRlZmluaXRpb24gKHR5cGU9J2VudW0nLCBrZXk9JyArZGVmaW5pdGlvbi5rZXkrICcpOicsIHZhbHVlICk7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSAoZGVmaW5pdGlvbi52YWx1ZXMgYXMgYW55W10gfHwgW3ZhbHVlXSkuZmluZChpdGVtID0+IChpc05vdE5pbChpdGVtLmtleSkgPyBpdGVtLmtleSA6IGl0ZW0pID09PSB2YWx1ZSk7XG4gICAgICAgIHJldHVybiBpdGVtLnZhbHVlIHx8IGl0ZW07XG4gICAgICB9XG4gICAgICBjYXNlICdlbnRpdHknOlxuICAgICAge1xuICAgICAgICBpZiAoZGVmaW5pdGlvbi5hdXRvY29tcGxldGU/LmRpc3BsYXlXaXRoKSB7XG4gICAgICAgICAgcmV0dXJuIGRlZmluaXRpb24uYXV0b2NvbXBsZXRlLmRpc3BsYXlXaXRoKHZhbHVlKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBqb2luUHJvcGVydGllc1BhdGgob2JqLCBkZWZpbml0aW9uLmF1dG9jb21wbGV0ZT8uYXR0cmlidXRlcyB8fCBbJ2xhYmVsJywgJ25hbWUnXSkgfHwgdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
@@ -5,7 +5,7 @@ import { Subject, timer } from 'rxjs';
|
|
|
5
5
|
import { HttpEventType, HttpResponse } from '@angular/common/http';
|
|
6
6
|
import { map, takeUntil } from 'rxjs/operators';
|
|
7
7
|
import { sleep } from '../../functions';
|
|
8
|
-
import { FilesUtils } from '../../
|
|
8
|
+
import { FilesUtils } from '../../file/file.utils';
|
|
9
9
|
export class UploadFileTestingPage {
|
|
10
10
|
constructor(popoverController) {
|
|
11
11
|
this.popoverController = popoverController;
|
|
@@ -56,4 +56,4 @@ UploadFileTestingPage.decorators = [
|
|
|
56
56
|
UploadFileTestingPage.ctorParameters = () => [
|
|
57
57
|
{ type: PopoverController }
|
|
58
58
|
];
|
|
59
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
59
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBsb2FkLWZpbGUudGVzdGluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvc2hhcmVkL3VwbG9hZC1maWxlL3Rlc3RpbmcvdXBsb2FkLWZpbGUudGVzdGluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN4QyxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUVqRCxPQUFPLEVBQWEsT0FBTyxFQUFFLEtBQUssRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUNoRCxPQUFPLEVBQUMsYUFBYSxFQUFFLFlBQVksRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ2pFLE9BQU8sRUFBQyxHQUFHLEVBQUUsU0FBUyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRXRDLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQU1qRCxNQUFNLE9BQU8scUJBQXFCO0lBRWhDLFlBQ1UsaUJBQW9DO1FBQXBDLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7SUFFOUMsQ0FBQztJQUVLLFdBQVcsQ0FBQyxLQUFjLEVBQUUsSUFBNkM7O1lBQzdFLE1BQU0sRUFBQyxJQUFJLEVBQUMsR0FBRyxNQUFNLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsS0FBSyxrQkFDM0UsUUFBUSxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUN6QyxRQUFRLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQ3RDLElBQUksRUFDUCxDQUFDO1lBRUwsTUFBTSxTQUFTLEdBQUcsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLGtDQUFDLElBQUksQ0FBQyxRQUFRLDBDQUFFLElBQUksMENBQUUsU0FBUyxHQUFBLENBQUMsQ0FBQztZQUMzRSxPQUFPLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQzlDLENBQUM7S0FBQTtJQUVEOzs7T0FHRztJQUNILFVBQVUsQ0FBQyxJQUFVO1FBQ25CLE1BQU0sS0FBSyxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7UUFDNUIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUM7UUFDaEMsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ2YsT0FBTyxLQUFLLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQzthQUNqQixJQUFJLENBQ0gsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUNoQixHQUFHLENBQUMsR0FBRyxFQUFFO1lBQ1AsTUFBTSxJQUFJLFFBQVEsQ0FBQztZQUVuQixxQkFBcUI7WUFDckIsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRTtnQkFDdEIseUVBQXlFO2dCQUN6RSxPQUFPLEVBQUMsSUFBSSxFQUFFLGFBQWEsQ0FBQyxjQUFjLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7YUFDMUQ7WUFFRCxpQkFBaUI7WUFDakIsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUVwQyx3QkFBd0I7WUFDeEIsT0FBTyxJQUFJLFlBQVksQ0FBQyxFQUFDLElBQUksRUFBRSxFQUFDLFNBQVMsRUFBRyxJQUFJLENBQUMsSUFBSSxFQUFDLEVBQUMsQ0FBQyxDQUFDO1FBQzNELENBQUMsQ0FBQyxDQUNILENBQUE7SUFFTCxDQUFDO0lBRUssVUFBVSxDQUFDLElBQVU7O1lBQ3pCLE9BQU8sQ0FBQyxJQUFJLENBQUMsb0RBQW9ELENBQUMsQ0FBQztZQUNuRSxNQUFNLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNsQixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7S0FBQTs7O1lBeERGLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUscUJBQXFCO2dCQUMvQixtN0JBQXVDO2FBQ3hDOzs7WUFaTyxpQkFBaUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbXBvbmVudH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1BvcG92ZXJDb250cm9sbGVyfSBmcm9tICdAaW9uaWMvYW5ndWxhcic7XG5pbXBvcnQge1VwbG9hZEZpbGVQb3BvdmVyT3B0aW9uc30gZnJvbSAnLi4vdXBsb2FkLWZpbGUtcG9wb3Zlci5jb21wb25lbnQnO1xuaW1wb3J0IHtPYnNlcnZhYmxlLCBTdWJqZWN0LCB0aW1lcn0gZnJvbSAncnhqcyc7XG5pbXBvcnQge0h0dHBFdmVudFR5cGUsIEh0dHBSZXNwb25zZX0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHttYXAsIHRha2VVbnRpbH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtzbGVlcH0gZnJvbSAnLi4vLi4vZnVuY3Rpb25zJztcbmltcG9ydCB7RmlsZUV2ZW50fSBmcm9tICcuLi91cGxvYWQtZmlsZS5tb2RlbCc7XG5pbXBvcnQge0ZpbGVzVXRpbHN9IGZyb20gJy4uLy4uL2ZpbGUvZmlsZS51dGlscyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3VwbG9hZC1maWxlLXRlc3RpbmcnLFxuICB0ZW1wbGF0ZVVybDogJ3VwbG9hZC1maWxlLnRlc3RpbmcuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgVXBsb2FkRmlsZVRlc3RpbmdQYWdlICB7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBwb3BvdmVyQ29udHJvbGxlcjogUG9wb3ZlckNvbnRyb2xsZXJcbiAgKSB7XG4gIH1cblxuICBhc3luYyBzaG93UG9wb3ZlcihldmVudDogVUlFdmVudCwgb3B0cz86IFBhcnRpYWw8VXBsb2FkRmlsZVBvcG92ZXJPcHRpb25zPGFueT4+KSB7XG4gICAgY29uc3Qge2RhdGF9ID0gYXdhaXQgRmlsZXNVdGlscy5zaG93VXBsb2FkUG9wb3Zlcih0aGlzLnBvcG92ZXJDb250cm9sbGVyLCBldmVudCwge1xuICAgICAgICB1cGxvYWRGbjogKGZpbGUpID0+IHRoaXMudXBsb2FkRmlsZShmaWxlKSxcbiAgICAgICAgZGVsZXRlRm46IChmaWxlKSA9PiB0aGlzLmRlbGV0ZUZpbGUoZmlsZSksXG4gICAgICAgIC4uLm9wdHNcbiAgICAgIH0pO1xuXG4gICAgY29uc3QgZmlsZW5hbWVzID0gKGRhdGEgfHwgW10pLm1hcChmaWxlID0+IGZpbGUucmVzcG9uc2U/LmJvZHk/LmZpbmFsTmFtZSk7XG4gICAgY29uc29sZS5pbmZvKCdQb3BvdmVyIHJlc3VsdDogJywgZmlsZW5hbWVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaW11bGF0ZSBhIHVwbG9hZCBmdW5jdGlvbiwgd2l0aCBwcm9ncmVzc2lvblxuICAgKiBAcGFyYW0gZmlsZVxuICAgKi9cbiAgdXBsb2FkRmlsZShmaWxlOiBGaWxlKTogT2JzZXJ2YWJsZTxGaWxlRXZlbnQ8eyBmaW5hbE5hbWU6IHN0cmluZzsgfT4+IHtcbiAgICBjb25zdCAkc3RvcCA9IG5ldyBTdWJqZWN0KCk7XG4gICAgY29uc3QgbG9hZFN0ZXAgPSBmaWxlLnNpemUgLyAxMDtcbiAgICBsZXQgbG9hZGVkID0gMDtcbiAgICByZXR1cm4gdGltZXIoMCwgMjUwKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbCgkc3RvcCksXG4gICAgICAgIG1hcCgoKSA9PiB7XG4gICAgICAgICAgbG9hZGVkICs9IGxvYWRTdGVwO1xuXG4gICAgICAgICAgLy8gUmV0dXJuIHByb2dyZXNzaW9uXG4gICAgICAgICAgaWYgKGxvYWRlZCA8IGZpbGUuc2l6ZSkge1xuICAgICAgICAgICAgLy9yZXR1cm4ge3R5cGU6IEh0dHBFdmVudFR5cGUuVXBsb2FkUHJvZ3Jlc3MsIHRvdGFsOiBmaWxlLnNpemUsIGxvYWRlZCB9O1xuICAgICAgICAgICAgcmV0dXJuIHt0eXBlOiBIdHRwRXZlbnRUeXBlLlVwbG9hZFByb2dyZXNzLCBsb2FkZWQ6IC0xIH07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gU3RvcCB0aGUgdGltZXJcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+ICRzdG9wLm5leHQoKSwgMTAwKTtcblxuICAgICAgICAgIC8vIFJldHVybiBmaW5hbCByZXNwb25zZVxuICAgICAgICAgIHJldHVybiBuZXcgSHR0cFJlc3BvbnNlKHtib2R5OiB7ZmluYWxOYW1lIDogZmlsZS5uYW1lfX0pO1xuICAgICAgICB9KVxuICAgICAgKVxuXG4gIH1cblxuICBhc3luYyBkZWxldGVGaWxlKGZpbGU6IEZpbGUpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zb2xlLmluZm8oJ1t0ZXN0aW5nXSBTaW11bGF0ZSByZW1vdGUgZGVsZXRpb24uLi4gKHdhaXRpbmcgMnMpJyk7XG4gICAgYXdhaXQgc2xlZXAoMjAwMCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -314,6 +314,8 @@ function suggestFromStringArray(values, value, options) {
|
|
|
314
314
|
function joinPropertiesPath(obj, properties, separator) {
|
|
315
315
|
if (!obj)
|
|
316
316
|
throw new Error('Could not display an undefined entity.');
|
|
317
|
+
if (!properties)
|
|
318
|
+
throw new Error('Missing \'properties\' argument');
|
|
317
319
|
return properties
|
|
318
320
|
.map(path => getPropertyByPath(obj, path))
|
|
319
321
|
.filter(isNotNilOrBlank)
|
|
@@ -1842,7 +1844,7 @@ MatAutocompleteField.decorators = [
|
|
|
1842
1844
|
{ type: Component, args: [{
|
|
1843
1845
|
// eslint-disable-next-line @angular-eslint/component-selector
|
|
1844
1846
|
selector: 'mat-autocomplete-field',
|
|
1845
|
-
template: "<ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col class=\"ion-no-padding\">\n <!-- readonly -->\n <mat-form-field *ngIf=\"_readonly; else writable\"\n [floatLabel]=\"floatLabel\"\n [title]=\"displayValue\"\n class=\"mat-form-field-disabled\">\n\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n <input matInput hidden type=\"text\"\n [placeholder]=\"placeholder\"\n [formControl]=\"formControl\" readonly>\n <ion-text>{{displayWith(value)}}</ion-text>\n\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n\n </mat-form-field>\n\n <ng-template #writable>\n <mat-form-field [floatLabel]=\"floatLabel\"\n [class.mat-form-field-disabled]=\"disabled\"\n [title]=\"displayValue\">\n\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n <!-- Mobile or Multiple (use <mat-select>) -->\n <mat-select #matSelect\n *ngIf=\"mobile || multiple; else desktopTemplate\"\n [disableRipple]=\"true\"\n [placeholder]=\"placeholder\"\n [formControl]=\"formControl\"\n [tabindex]=\"_tabindex\"\n [panelClass]=\"classList\"\n [style.width]=\"panelWidth\"\n (focus)=\"filterMatSelectFocusEvent($event)\"\n (blur)=\"filterMatSelectBlurEvent($event)\"\n (keydown.escape)=\"keydownEscape.emit($event)\"\n (keyup.enter)=\"keyupEnter.emit($event)\"\n [compareWith]=\"equals\"\n [multiple]=\"multiple\"\n [typeaheadDebounceInterval]=\"debounceTime * 10\"\n [required]=\"required\">\n <mat-select-trigger>{{ displayWith(value) }}</mat-select-trigger>\n\n <!-- Search bar -->\n <mat-option class=\"mat-select-searchbar\" *ngIf=\"showSearchBar\"\n [class.mat-select-searchbar-sticky]=\"stickySearchBar\"\n disabled>\n <ion-searchbar #ionSearchbar\n inputmode=\"search\"\n autocomplete=\"off\"\n animated=\"true\"\n showClearButton=\"true\"\n [debounce]=\"debounceTime\"\n (ionClear)=\"markAsLoading()\"\n (ionInput)=\"markAsLoading()\"\n (ionChange)=\"ionSearchBarChanged($event, $event.detail.value)\"\n [placeholder]=\"'COMMON.BTN_SEARCH'|translate\"\n ></ion-searchbar>\n </mat-option>\n\n <!-- Headers -->\n <ion-row class=\"mat-select-header column ion-no-padding\"\n [class.multiple]=\"multiple\"\n [class.mat-select-searchbar-sticky]=\"showSearchBar && stickySearchBar\">\n <ion-col *ngFor=\"let attr of displayAttributes; index as i\" [size]=\"displayColumnSizes[i]\">\n <ion-label [innerHTML]=\"displayColumnNames[i] | translate\"></ion-label>\n </ion-col>\n </ion-row>\n\n <!-- None option -->\n <mat-option *ngIf=\"!required && !multiple && !clearable\" class=\"ion-no-padding\">\n <ion-row class=\"ion-no-padding\">\n <ion-col class=\"ion-no-padding\">\n <ion-label><i translate>COMMON.EMPTY_OPTION</i></ion-label>\n </ion-col>\n </ion-row>\n </mat-option>\n\n <ng-container *ngIf=\"$filteredItems | async as items; else loadingTemplate\">\n <!-- No item option -->\n <mat-option *ngIf=\"items | isEmptyArray\" class=\"ion-padding text-italic\" disabled>\n <ion-label><i>{{noResultMessage | translate}}</i></ion-label>\n </mat-option>\n\n <!-- Options -->\n <mat-option *ngFor=\"let item of items\" [value]=\"item\" class=\"ion-no-padding\">\n <ion-row [classList]=\"item.classList\">\n <ion-col *ngFor=\"let path of displayAttributes; index as i;\"\n [size]=\"displayColumnSizes[i]\">\n <ion-text [innerHTML]=\"item | propertyGet: path\"></ion-text>\n </ion-col>\n </ion-row>\n </mat-option>\n\n <!-- More item -->\n <mat-option *ngIf=\"_moreItemsCount\" (ngInit)=\"_initMatSelectInfiniteScroll()\"\n class=\"ion-padding\" disabled>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </mat-option>\n </ng-container>\n\n <!-- footer -->\n <mat-option *ngIf=\"itemCount as count\" class=\"mat-option-footer mat-autocomplete-footer ion-no-padding\" disabled>\n <ion-text class=\"ion-float-end ion-padding-end\"><i>{{'COMMON.RESULT_COUNT'|translate: {count: count} }}</i></ion-text>\n </mat-option>\n\n <!-- Loading spinner -->\n <ng-template #loadingTemplate>\n <mat-option *ngIf=\"(displayValue | strLength) >= suggestLengthThreshold; else waitMoreCharacterTemplate\"\n class=\"ion-padding\" disabled>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </mat-option>\n </ng-template>\n\n <!-- Need more characters -->\n <ng-template #waitMoreCharacterTemplate>\n <mat-option class=\"ion-padding text-italic\" disabled>\n <ion-label>\n {{'INFO.PLEASE_TYPE_MORE_CHARACTERS'|translate:{minLength: suggestLengthThreshold} }}\n </ion-label>\n </mat-option>\n </ng-template>\n </mat-select>\n\n\n <!--\n NOTE :\n - \"selectInputContent($event) || onFocus.emit($event)\" : call onFocus only when to the input is empty (nothing to select)\n -->\n <ng-template #desktopTemplate>\n <input matInput #matInputText type=\"text\"\n [matAutocomplete]=\"autocomplete\"\n [matAutocompletePosition]=\"matAutocompletePosition\"\n [formControl]=\"formControl\"\n [placeholder]=\"placeholder\"\n [appAutofocus]=\"autofocus\"\n [tabindex]=\"_tabindex\"\n [required]=\"required\"\n (click)=\"clicked.emit($event)\"\n (focus)=\"filterInputTextFocusEvent($event)\"\n (blur)=\"filterInputTextBlurEvent($event)\"\n (keydown.escape)=\"keydownEscape.emit($event)\"\n (keyup.enter)=\"keyupEnter.emit($event)\"\n (keyup.arrowdown)=\"!autocomplete.showPanel && dropButtonClick.emit($event)\">\n\n <!-- autocomplete -->\n <mat-autocomplete #autocomplete=\"matAutocomplete\"\n autoActiveFirstOption\n [displayWith]=\"displayWith\"\n [class]=\"classList\"\n [panelWidth]=\"panelWidth\">\n <!-- Headers -->\n <ion-row class=\"mat-autocomplete-header column ion-no-padding\">\n <ion-col *ngFor=\"let attr of displayAttributes; index as i\" [size]=\"displayColumnSizes[i]\">\n <ion-label [innerHTML]=\"displayColumnNames[i] | translate\"></ion-label>\n </ion-col>\n </ion-row>\n\n <!-- Options -->\n <ng-container *ngIf=\"$filteredItems | async as items; else loadingTemplate\">\n <!-- No item option -->\n <mat-option *ngIf=\"items | isEmptyArray\" class=\"ion-padding text-italic\" disabled>\n <ion-label><i>{{noResultMessage | translate}}</i></ion-label>\n </mat-option>\n\n <mat-option *ngFor=\"let item of items\" [value]=\"item\" class=\"ion-no-padding\">\n <ion-row [classList]=\"item.classList\">\n <ion-col *ngFor=\"let path of displayAttributes; index as i;\"\n [size]=\"displayColumnSizes[i]\">\n <ion-text [innerHTML]=\"item | propertyGet: path | highlight: { search: formControl.value, withAccent: highlightAccent }\"></ion-text>\n </ion-col>\n </ion-row>\n </mat-option>\n\n <!-- More item -->\n <mat-option *ngIf=\"_moreItemsCount\" (ngInit)=\"_initAutocompleteInfiniteScroll()\"\n class=\"ion-padding\" disabled>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </mat-option>\n </ng-container>\n\n <!-- Loading spinner -->\n <ng-template #loadingTemplate>\n <mat-option *ngIf=\"(displayValue | strLength) >= suggestLengthThreshold; else waitMoreCharacterTemplate\"\n class=\"ion-padding\" disabled>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </mat-option>\n </ng-template>\n\n <!-- Need more characters -->\n <ng-template #waitMoreCharacterTemplate>\n <mat-option class=\"ion-padding text-italic\" disabled>\n <ion-label>\n {{'INFO.PLEASE_TYPE_MORE_CHARACTERS'|translate:{minLength: suggestLengthThreshold} }}\n </ion-label>\n </mat-option>\n </ng-template>\n\n <!-- footer -->\n <ion-row *ngIf=\"itemCount; let count\" class=\"mat-autocomplete-footer ion-no-padding\">\n <ion-col>\n <ion-text class=\"ion-float-end ion-padding-end\"><i>{{'COMMON.RESULT_COUNT'|translate: {count: count} }}</i></ion-text>\n </ion-col>\n </ion-row>\n\n </mat-autocomplete>\n\n </ng-template>\n\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n\n <mat-error *ngIf=\"formControl.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <mat-error *ngIf=\"formControl.hasError('entity')\" translate>ERROR.FIELD_INVALID</mat-error>\n <ng-content select=\"[matError]\"></ng-content>\n\n </mat-form-field>\n </ng-template>\n </ion-col>\n <ion-col size=\"auto\" class=\"ion-align-self-center\">\n <ng-content select=\"[matAfter]\"></ng-content>\n </ion-col>\n </ion-row>\n</ion-grid>\n\n<ng-template #matPrefixTemplate>\n <ng-content select=\"[matPrefix]\"></ng-content>\n</ng-template>\n\n\n<ng-template #matSuffixTemplate>\n <button matSuffix mat-icon-button tabindex=\"-1\"\n type=\"button\"\n *ngIf=\"!mobile && !multiple\"\n (click)=\"dropButtonClick.emit($event)\"\n [hidden]=\"disabled\">\n <mat-icon class=\"large select-arrow\">arrow_drop_down</mat-icon>\n </button>\n <button matSuffix mat-icon-button tabindex=\"-1\"\n type=\"button\"\n *ngIf=\"clearable\"\n (click)=\"clearValue($event)\"\n [hidden]=\"disabled || !formControl.value\">\n <mat-icon>close</mat-icon>\n </button>\n\n <ng-content select=\"[matSuffix]\"></ng-content>\n</ng-template>\n\n<ng-template #headers>\n <ion-row class=\"mat-autocomplete-header ion-no-padding\">\n <ion-col *ngFor=\"let attr of displayAttributes; index as i\" [size]=\"displayColumnSizes[i]\">\n <ion-label [innerHTML]=\"displayColumnNames[i] | translate\"></ion-label>\n </ion-col>\n </ion-row>\n</ng-template>\n\n<ng-template #options>\n\n\n</ng-template>\n\n",
|
|
1847
|
+
template: "<ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col class=\"ion-no-padding\">\n <!-- readonly -->\n <mat-form-field *ngIf=\"_readonly; else writable\"\n [floatLabel]=\"floatLabel\"\n [appearance]=\"appearance\"\n [title]=\"displayValue\"\n class=\"mat-form-field-disabled\">\n\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n <input matInput hidden type=\"text\"\n [placeholder]=\"placeholder\"\n [formControl]=\"formControl\" readonly>\n <ion-text>{{displayWith(value)}}</ion-text>\n\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n\n </mat-form-field>\n\n <ng-template #writable>\n <mat-form-field [floatLabel]=\"floatLabel\"\n [class.mat-form-field-disabled]=\"disabled\"\n [title]=\"displayValue\">\n\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n <!-- Mobile or Multiple (use <mat-select>) -->\n <mat-select #matSelect\n *ngIf=\"mobile || multiple; else desktopTemplate\"\n [disableRipple]=\"true\"\n [placeholder]=\"placeholder\"\n [formControl]=\"formControl\"\n [tabindex]=\"_tabindex\"\n [panelClass]=\"classList\"\n [style.width]=\"panelWidth\"\n (focus)=\"filterMatSelectFocusEvent($event)\"\n (blur)=\"filterMatSelectBlurEvent($event)\"\n (keydown.escape)=\"keydownEscape.emit($event)\"\n (keyup.enter)=\"keyupEnter.emit($event)\"\n [compareWith]=\"equals\"\n [multiple]=\"multiple\"\n [typeaheadDebounceInterval]=\"debounceTime * 10\"\n [required]=\"required\">\n <mat-select-trigger>{{ displayWith(value) }}</mat-select-trigger>\n\n <!-- Search bar -->\n <mat-option class=\"mat-select-searchbar\" *ngIf=\"showSearchBar\"\n [class.mat-select-searchbar-sticky]=\"stickySearchBar\"\n disabled>\n <ion-searchbar #ionSearchbar\n inputmode=\"search\"\n autocomplete=\"off\"\n animated=\"true\"\n showClearButton=\"true\"\n [debounce]=\"debounceTime\"\n (ionClear)=\"markAsLoading()\"\n (ionInput)=\"markAsLoading()\"\n (ionChange)=\"ionSearchBarChanged($event, $event.detail.value)\"\n [placeholder]=\"'COMMON.BTN_SEARCH'|translate\"\n ></ion-searchbar>\n </mat-option>\n\n <!-- Headers -->\n <ion-row class=\"mat-select-header column ion-no-padding\"\n [class.multiple]=\"multiple\"\n [class.mat-select-searchbar-sticky]=\"showSearchBar && stickySearchBar\">\n <ion-col *ngFor=\"let attr of displayAttributes; index as i\" [size]=\"displayColumnSizes[i]\">\n <ion-label [innerHTML]=\"displayColumnNames[i] | translate\"></ion-label>\n </ion-col>\n </ion-row>\n\n <!-- None option -->\n <mat-option *ngIf=\"!required && !multiple && !clearable\" class=\"ion-no-padding\">\n <ion-row class=\"ion-no-padding\">\n <ion-col class=\"ion-no-padding\">\n <ion-label><i translate>COMMON.EMPTY_OPTION</i></ion-label>\n </ion-col>\n </ion-row>\n </mat-option>\n\n <ng-container *ngIf=\"$filteredItems | async as items; else loadingTemplate\">\n <!-- No item option -->\n <mat-option *ngIf=\"items | isEmptyArray\" class=\"ion-padding text-italic\" disabled>\n <ion-label><i>{{noResultMessage | translate}}</i></ion-label>\n </mat-option>\n\n <!-- Options -->\n <mat-option *ngFor=\"let item of items\" [value]=\"item\" class=\"ion-no-padding\">\n <ion-row [classList]=\"item.classList\">\n <ion-col *ngFor=\"let path of displayAttributes; index as i;\"\n [size]=\"displayColumnSizes[i]\">\n <ion-text [innerHTML]=\"item | propertyGet: path\"></ion-text>\n </ion-col>\n </ion-row>\n </mat-option>\n\n <!-- More item -->\n <mat-option *ngIf=\"_moreItemsCount\" (ngInit)=\"_initMatSelectInfiniteScroll()\"\n class=\"ion-padding\" disabled>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </mat-option>\n </ng-container>\n\n <!-- footer -->\n <mat-option *ngIf=\"itemCount as count\" class=\"mat-option-footer mat-autocomplete-footer ion-no-padding\" disabled>\n <ion-text class=\"ion-float-end ion-padding-end\"><i>{{'COMMON.RESULT_COUNT'|translate: {count: count} }}</i></ion-text>\n </mat-option>\n\n <!-- Loading spinner -->\n <ng-template #loadingTemplate>\n <mat-option *ngIf=\"(displayValue | strLength) >= suggestLengthThreshold; else waitMoreCharacterTemplate\"\n class=\"ion-padding\" disabled>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </mat-option>\n </ng-template>\n\n <!-- Need more characters -->\n <ng-template #waitMoreCharacterTemplate>\n <mat-option class=\"ion-padding text-italic\" disabled>\n <ion-label>\n {{'INFO.PLEASE_TYPE_MORE_CHARACTERS'|translate:{minLength: suggestLengthThreshold} }}\n </ion-label>\n </mat-option>\n </ng-template>\n </mat-select>\n\n\n <!--\n NOTE :\n - \"selectInputContent($event) || onFocus.emit($event)\" : call onFocus only when to the input is empty (nothing to select)\n -->\n <ng-template #desktopTemplate>\n <input matInput #matInputText type=\"text\"\n [matAutocomplete]=\"autocomplete\"\n [matAutocompletePosition]=\"matAutocompletePosition\"\n [formControl]=\"formControl\"\n [placeholder]=\"placeholder\"\n [appAutofocus]=\"autofocus\"\n [tabindex]=\"_tabindex\"\n [required]=\"required\"\n (click)=\"clicked.emit($event)\"\n (focus)=\"filterInputTextFocusEvent($event)\"\n (blur)=\"filterInputTextBlurEvent($event)\"\n (keydown.escape)=\"keydownEscape.emit($event)\"\n (keyup.enter)=\"keyupEnter.emit($event)\"\n (keyup.arrowdown)=\"!autocomplete.showPanel && dropButtonClick.emit($event)\">\n\n <!-- autocomplete -->\n <mat-autocomplete #autocomplete=\"matAutocomplete\"\n autoActiveFirstOption\n [displayWith]=\"displayWith\"\n [class]=\"classList\"\n [panelWidth]=\"panelWidth\">\n <!-- Headers -->\n <ion-row class=\"mat-autocomplete-header column ion-no-padding\">\n <ion-col *ngFor=\"let attr of displayAttributes; index as i\" [size]=\"displayColumnSizes[i]\">\n <ion-label [innerHTML]=\"displayColumnNames[i] | translate\"></ion-label>\n </ion-col>\n </ion-row>\n\n <!-- Options -->\n <ng-container *ngIf=\"$filteredItems | async as items; else loadingTemplate\">\n <!-- No item option -->\n <mat-option *ngIf=\"items | isEmptyArray\" class=\"ion-padding text-italic\" disabled>\n <ion-label><i>{{noResultMessage | translate}}</i></ion-label>\n </mat-option>\n\n <mat-option *ngFor=\"let item of items\" [value]=\"item\" class=\"ion-no-padding\">\n <ion-row [classList]=\"item.classList\">\n <ion-col *ngFor=\"let path of displayAttributes; index as i;\"\n [size]=\"displayColumnSizes[i]\">\n <ion-text [innerHTML]=\"item | propertyGet: path | highlight: { search: formControl.value, withAccent: highlightAccent }\"></ion-text>\n </ion-col>\n </ion-row>\n </mat-option>\n\n <!-- More item -->\n <mat-option *ngIf=\"_moreItemsCount\" (ngInit)=\"_initAutocompleteInfiniteScroll()\"\n class=\"ion-padding\" disabled>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </mat-option>\n </ng-container>\n\n <!-- Loading spinner -->\n <ng-template #loadingTemplate>\n <mat-option *ngIf=\"(displayValue | strLength) >= suggestLengthThreshold; else waitMoreCharacterTemplate\"\n class=\"ion-padding\" disabled>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </mat-option>\n </ng-template>\n\n <!-- Need more characters -->\n <ng-template #waitMoreCharacterTemplate>\n <mat-option class=\"ion-padding text-italic\" disabled>\n <ion-label>\n {{'INFO.PLEASE_TYPE_MORE_CHARACTERS'|translate:{minLength: suggestLengthThreshold} }}\n </ion-label>\n </mat-option>\n </ng-template>\n\n <!-- footer -->\n <ion-row *ngIf=\"itemCount; let count\" class=\"mat-autocomplete-footer ion-no-padding\">\n <ion-col>\n <ion-text class=\"ion-float-end ion-padding-end\"><i>{{'COMMON.RESULT_COUNT'|translate: {count: count} }}</i></ion-text>\n </ion-col>\n </ion-row>\n\n </mat-autocomplete>\n\n </ng-template>\n\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n\n <mat-error *ngIf=\"formControl.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <mat-error *ngIf=\"formControl.hasError('entity')\" translate>ERROR.FIELD_INVALID</mat-error>\n <ng-content select=\"[matError]\"></ng-content>\n\n </mat-form-field>\n </ng-template>\n </ion-col>\n <ion-col size=\"auto\" class=\"ion-align-self-center\">\n <ng-content select=\"[matAfter]\"></ng-content>\n </ion-col>\n </ion-row>\n</ion-grid>\n\n<ng-template #matPrefixTemplate>\n <ng-content select=\"[matPrefix]\"></ng-content>\n</ng-template>\n\n\n<ng-template #matSuffixTemplate>\n <button matSuffix mat-icon-button tabindex=\"-1\"\n type=\"button\"\n *ngIf=\"!mobile && !multiple\"\n (click)=\"dropButtonClick.emit($event)\"\n [hidden]=\"disabled\">\n <mat-icon class=\"large select-arrow\">arrow_drop_down</mat-icon>\n </button>\n <button matSuffix mat-icon-button tabindex=\"-1\"\n type=\"button\"\n *ngIf=\"clearable\"\n (click)=\"clearValue($event)\"\n [hidden]=\"disabled || !formControl.value\">\n <mat-icon>close</mat-icon>\n </button>\n\n <ng-content select=\"[matSuffix]\"></ng-content>\n</ng-template>\n\n<ng-template #headers>\n <ion-row class=\"mat-autocomplete-header ion-no-padding\">\n <ion-col *ngFor=\"let attr of displayAttributes; index as i\" [size]=\"displayColumnSizes[i]\">\n <ion-label [innerHTML]=\"displayColumnNames[i] | translate\"></ion-label>\n </ion-col>\n </ion-row>\n</ng-template>\n\n<ng-template #options>\n\n\n</ng-template>\n\n",
|
|
1846
1848
|
providers: [{
|
|
1847
1849
|
provide: NG_VALUE_ACCESSOR,
|
|
1848
1850
|
multi: true,
|
|
@@ -1863,6 +1865,7 @@ MatAutocompleteField.propDecorators = {
|
|
|
1863
1865
|
formControl: [{ type: Input }],
|
|
1864
1866
|
formControlName: [{ type: Input }],
|
|
1865
1867
|
floatLabel: [{ type: Input }],
|
|
1868
|
+
appearance: [{ type: Input }],
|
|
1866
1869
|
placeholder: [{ type: Input }],
|
|
1867
1870
|
suggestFn: [{ type: Input }],
|
|
1868
1871
|
required: [{ type: Input }],
|
|
@@ -2891,23 +2894,6 @@ TranslatablePipe.decorators = [
|
|
|
2891
2894
|
{ type: Injectable }
|
|
2892
2895
|
];
|
|
2893
2896
|
|
|
2894
|
-
class PropertyGetPipe {
|
|
2895
|
-
transform(obj, args) {
|
|
2896
|
-
return getPropertyByPath(obj,
|
|
2897
|
-
// Path
|
|
2898
|
-
args && (typeof args === 'string' ? args : args.key),
|
|
2899
|
-
// Default value
|
|
2900
|
-
args && args.defaultValue);
|
|
2901
|
-
}
|
|
2902
|
-
}
|
|
2903
|
-
PropertyGetPipe.ɵprov = ɵɵdefineInjectable({ factory: function PropertyGetPipe_Factory() { return new PropertyGetPipe(); }, token: PropertyGetPipe, providedIn: "root" });
|
|
2904
|
-
PropertyGetPipe.decorators = [
|
|
2905
|
-
{ type: Pipe, args: [{
|
|
2906
|
-
name: 'propertyGet'
|
|
2907
|
-
},] },
|
|
2908
|
-
{ type: Injectable, args: [{ providedIn: 'root' },] }
|
|
2909
|
-
];
|
|
2910
|
-
|
|
2911
2897
|
class NgInitDirective {
|
|
2912
2898
|
constructor() {
|
|
2913
2899
|
this.ngInit = new EventEmitter();
|
|
@@ -4311,6 +4297,75 @@ FormGetValuePipe.ctorParameters = () => [
|
|
|
4311
4297
|
{ type: ChangeDetectorRef }
|
|
4312
4298
|
];
|
|
4313
4299
|
|
|
4300
|
+
class PropertyGetPipe {
|
|
4301
|
+
transform(obj, args) {
|
|
4302
|
+
return getPropertyByPath(obj,
|
|
4303
|
+
// Path
|
|
4304
|
+
args && (typeof args === 'string' ? args : args.key),
|
|
4305
|
+
// Default value
|
|
4306
|
+
args && args.defaultValue);
|
|
4307
|
+
}
|
|
4308
|
+
}
|
|
4309
|
+
PropertyGetPipe.decorators = [
|
|
4310
|
+
{ type: Pipe, args: [{
|
|
4311
|
+
name: 'propertyGet'
|
|
4312
|
+
},] }
|
|
4313
|
+
];
|
|
4314
|
+
class PropertyFormatPipe {
|
|
4315
|
+
constructor(dateFormat) {
|
|
4316
|
+
this.dateFormat = dateFormat;
|
|
4317
|
+
}
|
|
4318
|
+
transform(obj, keyOrDefinition) {
|
|
4319
|
+
var _a, _b;
|
|
4320
|
+
if (!obj)
|
|
4321
|
+
return '';
|
|
4322
|
+
const definition = keyOrDefinition && (typeof keyOrDefinition === 'object') && keyOrDefinition;
|
|
4323
|
+
const key = (definition === null || definition === void 0 ? void 0 : definition.key) || keyOrDefinition;
|
|
4324
|
+
if (!key) {
|
|
4325
|
+
// Should never occur
|
|
4326
|
+
console.warn('Invalid use of pipe \'formatProperty\': missing key or definition');
|
|
4327
|
+
return '';
|
|
4328
|
+
}
|
|
4329
|
+
const value = obj[key];
|
|
4330
|
+
if (isNil(value))
|
|
4331
|
+
return value;
|
|
4332
|
+
const type = (definition === null || definition === void 0 ? void 0 : definition.type) || typeof value;
|
|
4333
|
+
switch (type) {
|
|
4334
|
+
case 'date':
|
|
4335
|
+
return this.dateFormat.transform(value);
|
|
4336
|
+
case 'dateTime':
|
|
4337
|
+
return this.dateFormat.transform(value, { time: true });
|
|
4338
|
+
case 'enum':
|
|
4339
|
+
{
|
|
4340
|
+
// DEBUG
|
|
4341
|
+
// console.debug('formatProperty by definition (type='enum', key=' +definition.key+ '):', value );
|
|
4342
|
+
const item = (definition.values || [value]).find(item => (isNotNil(item.key) ? item.key : item) === value);
|
|
4343
|
+
return item.value || item;
|
|
4344
|
+
}
|
|
4345
|
+
case 'entity':
|
|
4346
|
+
{
|
|
4347
|
+
if ((_a = definition.autocomplete) === null || _a === void 0 ? void 0 : _a.displayWith) {
|
|
4348
|
+
return definition.autocomplete.displayWith(value);
|
|
4349
|
+
}
|
|
4350
|
+
return joinPropertiesPath(obj, ((_b = definition.autocomplete) === null || _b === void 0 ? void 0 : _b.attributes) || ['label', 'name']) || undefined;
|
|
4351
|
+
}
|
|
4352
|
+
case 'string':
|
|
4353
|
+
default:
|
|
4354
|
+
return value;
|
|
4355
|
+
}
|
|
4356
|
+
}
|
|
4357
|
+
}
|
|
4358
|
+
PropertyFormatPipe.ɵprov = ɵɵdefineInjectable({ factory: function PropertyFormatPipe_Factory() { return new PropertyFormatPipe(ɵɵinject(DateFormatPipe)); }, token: PropertyFormatPipe, providedIn: "root" });
|
|
4359
|
+
PropertyFormatPipe.decorators = [
|
|
4360
|
+
{ type: Pipe, args: [{
|
|
4361
|
+
name: 'propertyFormat'
|
|
4362
|
+
},] },
|
|
4363
|
+
{ type: Injectable, args: [{ providedIn: 'root' },] }
|
|
4364
|
+
];
|
|
4365
|
+
PropertyFormatPipe.ctorParameters = () => [
|
|
4366
|
+
{ type: DateFormatPipe }
|
|
4367
|
+
];
|
|
4368
|
+
|
|
4314
4369
|
class SharedPipesModule {
|
|
4315
4370
|
}
|
|
4316
4371
|
SharedPipesModule.decorators = [
|
|
@@ -4322,6 +4377,7 @@ SharedPipesModule.decorators = [
|
|
|
4322
4377
|
],
|
|
4323
4378
|
declarations: [
|
|
4324
4379
|
PropertyGetPipe,
|
|
4380
|
+
PropertyFormatPipe,
|
|
4325
4381
|
DateFormatPipe,
|
|
4326
4382
|
DateDiffDurationPipe,
|
|
4327
4383
|
DurationPipe,
|
|
@@ -4358,10 +4414,12 @@ SharedPipesModule.decorators = [
|
|
|
4358
4414
|
FormGetControlPipe,
|
|
4359
4415
|
FormGetArrayPipe,
|
|
4360
4416
|
FormGetGroupPipe,
|
|
4361
|
-
FormGetValuePipe
|
|
4417
|
+
FormGetValuePipe,
|
|
4418
|
+
PropertyFormatPipe
|
|
4362
4419
|
],
|
|
4363
4420
|
exports: [
|
|
4364
4421
|
PropertyGetPipe,
|
|
4422
|
+
PropertyFormatPipe,
|
|
4365
4423
|
DateFormatPipe,
|
|
4366
4424
|
DateFromNowPipe,
|
|
4367
4425
|
DateDiffDurationPipe,
|
|
@@ -4561,6 +4619,32 @@ DragAndDropDirective.propDecorators = {
|
|
|
4561
4619
|
ondrop: [{ type: HostListener, args: ['drop', ['$event'],] }]
|
|
4562
4620
|
};
|
|
4563
4621
|
|
|
4622
|
+
const compatibleTagNames = ['ion-label', 'mat-label'];
|
|
4623
|
+
class AutoTitleDirective {
|
|
4624
|
+
constructor(elementRef) {
|
|
4625
|
+
var _a;
|
|
4626
|
+
this.elementRef = elementRef;
|
|
4627
|
+
// Check compatible tag
|
|
4628
|
+
if (compatibleTagNames.includes((_a = elementRef.nativeElement.tagName) === null || _a === void 0 ? void 0 : _a.toLowerCase())) {
|
|
4629
|
+
this.element = elementRef.nativeElement;
|
|
4630
|
+
}
|
|
4631
|
+
}
|
|
4632
|
+
ngAfterContentChecked() {
|
|
4633
|
+
// Update title if different
|
|
4634
|
+
if (this.element && this.element.title !== this.element.textContent) {
|
|
4635
|
+
this.element.title = this.element.textContent;
|
|
4636
|
+
}
|
|
4637
|
+
}
|
|
4638
|
+
}
|
|
4639
|
+
AutoTitleDirective.decorators = [
|
|
4640
|
+
{ type: Directive, args: [{
|
|
4641
|
+
selector: '[appAutoTitle]',
|
|
4642
|
+
},] }
|
|
4643
|
+
];
|
|
4644
|
+
AutoTitleDirective.ctorParameters = () => [
|
|
4645
|
+
{ type: ElementRef, decorators: [{ type: Inject, args: [ElementRef,] }] }
|
|
4646
|
+
];
|
|
4647
|
+
|
|
4564
4648
|
class SharedDirectivesModule {
|
|
4565
4649
|
}
|
|
4566
4650
|
SharedDirectivesModule.decorators = [
|
|
@@ -4572,12 +4656,14 @@ SharedDirectivesModule.decorators = [
|
|
|
4572
4656
|
declarations: [
|
|
4573
4657
|
AutofocusDirective,
|
|
4574
4658
|
NgVarDirective,
|
|
4575
|
-
DragAndDropDirective
|
|
4659
|
+
DragAndDropDirective,
|
|
4660
|
+
AutoTitleDirective
|
|
4576
4661
|
],
|
|
4577
4662
|
exports: [
|
|
4578
4663
|
AutofocusDirective,
|
|
4579
4664
|
NgVarDirective,
|
|
4580
|
-
DragAndDropDirective
|
|
4665
|
+
DragAndDropDirective,
|
|
4666
|
+
AutoTitleDirective
|
|
4581
4667
|
]
|
|
4582
4668
|
},] }
|
|
4583
4669
|
];
|
|
@@ -7384,7 +7470,7 @@ class MatSwipeField {
|
|
|
7384
7470
|
MatSwipeField.decorators = [
|
|
7385
7471
|
{ type: Component, args: [{
|
|
7386
7472
|
selector: 'mat-swipe-field',
|
|
7387
|
-
template: "<mat-form-field [floatLabel]=\"showSlides && (!floatLabel || floatLabel === 'auto') ? 'always': floatLabel\"\n [class]=\"classList\"\n [class.mat-form-field-disabled]=\"disabled\">\n <mat-label *ngIf=\"placeholder && floatLabel!=='never'\">\n {{placeholder}}\n </mat-label>\n <input matInput #fakeInput type=\"text\"\n [formControl]=\"formControl\"\n [readonly]=\"true\"\n (focus)=\"_onFocusFakeInput($event)\"\n [required]=\"required\"\n [class.cdk-visually-hidden]=\"showSlides\"\n [tabindex]=\"tabindex\">\n\n <div class=\"slides-container\" [class.hidden]=\"!showSlides\">\n <ion-slides #slides\n [options]=\"slidesOptions\"\n (ionSlidesDidLoad)=\"slidesLoaded()\"\n (ionSlideReachStart)=\"reachStart(true)\"\n (ionSlideReachEnd)=\"reachEnd(true)\"\n (ionSlideNextEnd)=\"reachStart(false)\"\n (ionSlidePrevEnd)=\"reachEnd(false)\"\n (ionSlideDidChange)=\"slideChanged()\"\n >\n <ion-slide *ngFor=\"let item of $items | async\">\n <ion-label>{{ displayWith(item) }}</ion-label>\n </ion-slide>\n\n </ion-slides>\n </div>\n\n <button #prevButton\n mat-icon-button\n type=\"button\"\n class=\"button-prev\"\n [hidden]=\"!showSlides\"\n [disabled]=\"previousDisabled\"\n (click)=\"previous()\">\n <mat-icon>chevron_left</mat-icon>\n </button>\n <button #nextButton\n mat-icon-button\n type=\"button\"\n class=\"button-next\"\n [hidden]=\"!showSlides\"\n [disabled]=\"nextDisabled\"\n (click)=\"next()\">\n <mat-icon>chevron_right</mat-icon>\n </button>\n\n <button matSuffix mat-icon-button tabindex=\"-1\"\n type=\"button\"\n *ngIf=\"clearable\"\n (click)=\"clearValue($event)\"\n [hidden]=\"disabled || !formControl.value\">\n <mat-icon>close</mat-icon>\n </button>\n\n <mat-error *ngIf=\"formControl.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <mat-error *ngIf=\"formControl.hasError('entity')\" translate>ERROR.FIELD_INVALID</mat-error>\n\n</mat-form-field>\n",
|
|
7473
|
+
template: "<mat-form-field [floatLabel]=\"showSlides && (!floatLabel || floatLabel === 'auto') ? 'always': floatLabel\"\n [appearance]=\"appearance\"\n [class]=\"classList\"\n [class.mat-form-field-disabled]=\"disabled\">\n <mat-label *ngIf=\"placeholder && floatLabel!=='never'\">\n {{placeholder}}\n </mat-label>\n <input matInput #fakeInput type=\"text\"\n [formControl]=\"formControl\"\n [readonly]=\"true\"\n (focus)=\"_onFocusFakeInput($event)\"\n [required]=\"required\"\n [class.cdk-visually-hidden]=\"showSlides\"\n [tabindex]=\"tabindex\">\n\n <div class=\"slides-container\" [class.hidden]=\"!showSlides\">\n <ion-slides #slides\n [options]=\"slidesOptions\"\n (ionSlidesDidLoad)=\"slidesLoaded()\"\n (ionSlideReachStart)=\"reachStart(true)\"\n (ionSlideReachEnd)=\"reachEnd(true)\"\n (ionSlideNextEnd)=\"reachStart(false)\"\n (ionSlidePrevEnd)=\"reachEnd(false)\"\n (ionSlideDidChange)=\"slideChanged()\"\n >\n <ion-slide *ngFor=\"let item of $items | async\">\n <ion-label>{{ displayWith(item) }}</ion-label>\n </ion-slide>\n\n </ion-slides>\n </div>\n\n <button #prevButton\n mat-icon-button\n type=\"button\"\n class=\"button-prev\"\n [hidden]=\"!showSlides\"\n [disabled]=\"previousDisabled\"\n (click)=\"previous()\">\n <mat-icon>chevron_left</mat-icon>\n </button>\n <button #nextButton\n mat-icon-button\n type=\"button\"\n class=\"button-next\"\n [hidden]=\"!showSlides\"\n [disabled]=\"nextDisabled\"\n (click)=\"next()\">\n <mat-icon>chevron_right</mat-icon>\n </button>\n\n <button matSuffix mat-icon-button tabindex=\"-1\"\n type=\"button\"\n *ngIf=\"clearable\"\n (click)=\"clearValue($event)\"\n [hidden]=\"disabled || !formControl.value\">\n <mat-icon>close</mat-icon>\n </button>\n\n <mat-error *ngIf=\"formControl.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <mat-error *ngIf=\"formControl.hasError('entity')\" translate>ERROR.FIELD_INVALID</mat-error>\n\n</mat-form-field>\n",
|
|
7388
7474
|
providers: [DEFAULT_VALUE_ACCESSOR$5],
|
|
7389
7475
|
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
7390
7476
|
styles: [":host{display:inline-block;width:100%;position:relative}input.hidden{display:none}.slides-container .swiper-slide{font-size:16px!important}.slides-container.hidden{visibility:hidden;height:0!important}.button-next,.button-prev{position:absolute;top:calc(50% - 20px);z-index:10}.button-prev{left:0;right:auto}.button-next{left:auto;right:0}"]
|
|
@@ -7399,6 +7485,7 @@ MatSwipeField.propDecorators = {
|
|
|
7399
7485
|
formControl: [{ type: Input }],
|
|
7400
7486
|
formControlName: [{ type: Input }],
|
|
7401
7487
|
floatLabel: [{ type: Input }],
|
|
7488
|
+
appearance: [{ type: Input }],
|
|
7402
7489
|
placeholder: [{ type: Input }],
|
|
7403
7490
|
debug: [{ type: Input }],
|
|
7404
7491
|
required: [{ type: Input }],
|
|
@@ -8005,7 +8092,7 @@ MatChipsField.decorators = [
|
|
|
8005
8092
|
{ type: Component, args: [{
|
|
8006
8093
|
// eslint-disable-next-line @angular-eslint/component-selector
|
|
8007
8094
|
selector: 'mat-chips-field',
|
|
8008
|
-
template: "<ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col class=\"ion-no-padding\">\n <mat-form-field [floatLabel]=\"floatLabel\"
|
|
8095
|
+
template: "<ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col class=\"ion-no-padding\">\n <mat-form-field [floatLabel]=\"floatLabel\"\n [appearance]=\"appearance\"\n class=\"material-chips\" [class.mat-form-field-disabled]=\"disabled\">\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n <mat-label>{{placeholder}}</mat-label>\n <mat-chip-list #chipList\n (focus)=\"filterChipsFocusEvent($event)\" >\n <mat-chip\n *ngFor=\"let item of value\"\n [selectable]=\"false\"\n [removable]=\"!disabled\"\n (removed)=\"remove(item)\"\n [color]=\"chipColor\"\n >\n {{displayWith(item)}}\n <mat-icon matChipRemove *ngIf=\"!disabled\">cancel</mat-icon>\n </mat-chip>\n\n <input #matInputText type=\"text\"\n [matAutocomplete]=\"autocomplete\"\n [matAutocompletePosition]=\"matAutocompletePosition\"\n [formControl]=\"inputControl\"\n [appAutofocus]=\"autofocus\"\n [tabindex]=\"_tabindex\"\n [readonly]=\"disabled\"\n [hidden]=\"disabled\"\n [required]=\"required\"\n (click)=\"clicked.emit($event)\"\n (focus)=\"filterInputTextFocusEvent($event)\"\n (blur)=\"filterInputTextBlurEvent($event)\"\n (keydown.escape)=\"keydownEscape.emit($event)\"\n (keyup.enter)=\"keyupEnter.emit($event)\"\n (keyup.arrowdown)=\"!autocomplete.showPanel && dropButtonClick.emit($event)\"\n [matChipInputFor]=\"chipList\"\n >\n </mat-chip-list>\n\n <!-- autocomplete -->\n <mat-autocomplete #autocomplete=\"matAutocomplete\"\n (optionSelected)=\"add($event)\"\n autoActiveFirstOption\n [displayWith]=\"displayWith\"\n [class]=\"classList\"\n [panelWidth]=\"panelWidth\">\n <ion-row class=\"mat-autocomplete-header ion-no-padding column\">\n <ion-col *ngFor=\"let attr of displayAttributes; index as i\" [size]=\"displayColumnSizes[i]\">\n <ion-label [innerHTML]=\"displayColumnNames[i] | translate\"></ion-label>\n </ion-col>\n </ion-row>\n\n <ng-container *ngIf=\"$filteredItems | async as items; else loadingTemplate\">\n <!-- No item option -->\n <mat-option *ngIf=\"items | isEmptyArray\" class=\"ion-padding text-italic\" disabled>\n <ion-label>{{noResultMessage | translate}}</ion-label>\n </mat-option>\n\n <mat-option *ngFor=\"let item of items\" [value]=\"item\" class=\"ion-no-padding\">\n <ion-row [classList]=\"item.classList\">\n <ion-col *ngFor=\"let path of displayAttributes; index as i;\"\n [size]=\"displayColumnSizes[i]\">\n <ion-text [innerHTML]=\"item | propertyGet: path | highlight: { search: inputControl.value, withAccent: highlightAccent } \"></ion-text>\n </ion-col>\n </ion-row>\n </mat-option>\n\n <!-- More item -->\n <mat-option *ngIf=\"_moreItemsCount\" (ngInit)=\"_initAutocompleteInfiniteScroll()\"\n class=\"ion-padding\" disabled>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </mat-option>\n </ng-container>\n\n <!-- footer -->\n <ion-row *ngIf=\"itemCount as count\"\n class=\"mat-autocomplete-footer ion-no-padding\">\n <ion-col>\n <ion-text class=\"ion-float-end ion-padding-end\"><i>{{'COMMON.RESULT_COUNT'|translate: {count: count} }}</i></ion-text>\n </ion-col>\n </ion-row>\n\n <!-- Loading spinner -->\n <ng-template #loadingTemplate>\n <mat-option *ngIf=\"(matInputText.value | strLength) >= suggestLengthThreshold; else waitMoreCharacterTemplate\"\n class=\"ion-padding\" disabled>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </mat-option>\n </ng-template>\n\n <!-- Need more characters -->\n <ng-template #waitMoreCharacterTemplate>\n <mat-option class=\"ion-padding text-italic\" disabled>\n <ion-label>\n {{'INFO.PLEASE_TYPE_MORE_CHARACTERS'|translate:{minLength: suggestLengthThreshold} }}\n </ion-label>\n </mat-option>\n </ng-template>\n </mat-autocomplete>\n\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n\n <mat-error *ngIf=\"formControl.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <ng-content select=\"[matError]\"></ng-content>\n\n </mat-form-field>\n\n </ion-col>\n <ion-col size=\"auto\" class=\"ion-align-self-center\">\n <ng-content select=\"[matAfter]\"></ng-content>\n </ion-col>\n </ion-row>\n</ion-grid>\n\n<ng-template #matPrefixTemplate>\n <ng-content select=\"[matPrefix]\"></ng-content>\n</ng-template>\n\n\n<ng-template #matSuffixTemplate>\n <button mat-icon-button tabindex=\"-1\"\n type=\"button\"\n (click)=\"dropButtonClick.emit($event)\"\n [hidden]=\"disabled\">\n <mat-icon class=\"large select-arrow\">arrow_drop_down</mat-icon>\n </button>\n <button mat-icon-button tabindex=\"-1\"\n type=\"button\"\n *ngIf=\"clearable\"\n (click)=\"clearValue($event)\"\n [hidden]=\"disabled || !formControl.value\">\n <mat-icon>close</mat-icon>\n </button>\n\n <ng-content select=\"[matSuffix]\"></ng-content>\n</ng-template>\n",
|
|
8009
8096
|
providers: [{
|
|
8010
8097
|
provide: NG_VALUE_ACCESSOR,
|
|
8011
8098
|
multi: true,
|
|
@@ -8026,6 +8113,7 @@ MatChipsField.propDecorators = {
|
|
|
8026
8113
|
formControl: [{ type: Input }],
|
|
8027
8114
|
formControlName: [{ type: Input }],
|
|
8028
8115
|
floatLabel: [{ type: Input }],
|
|
8116
|
+
appearance: [{ type: Input }],
|
|
8029
8117
|
placeholder: [{ type: Input }],
|
|
8030
8118
|
suggestFn: [{ type: Input }],
|
|
8031
8119
|
required: [{ type: Input }],
|
|
@@ -15960,6 +16048,8 @@ class FilesUtils {
|
|
|
15960
16048
|
return $progress.asObservable();
|
|
15961
16049
|
}
|
|
15962
16050
|
}
|
|
16051
|
+
FilesUtils.UTF8_BOM_CHAR = new Uint8Array([0xEF, 0xBB, 0xBF]); // UTF-8 BOM
|
|
16052
|
+
|
|
15963
16053
|
class UriUtils {
|
|
15964
16054
|
/**
|
|
15965
16055
|
* Extract the filename, from an uri (using the last slash)
|
|
@@ -18078,6 +18168,91 @@ class JobUtils {
|
|
|
18078
18168
|
}
|
|
18079
18169
|
}
|
|
18080
18170
|
|
|
18171
|
+
//@dynamic
|
|
18172
|
+
class CsvUtils {
|
|
18173
|
+
static exportToFile(rows, opts) {
|
|
18174
|
+
if (!rows || !rows.length)
|
|
18175
|
+
return; // Skip if empty
|
|
18176
|
+
const filename = (opts === null || opts === void 0 ? void 0 : opts.filename) || 'export.csv';
|
|
18177
|
+
const charset = ((opts === null || opts === void 0 ? void 0 : opts.encoding) || 'utf-8').toLowerCase();
|
|
18178
|
+
const separator = (opts === null || opts === void 0 ? void 0 : opts.separator) || ',';
|
|
18179
|
+
const protectCellRegexp = new RegExp("/(\"|" + separator + "|\n)/g");
|
|
18180
|
+
const keys = Object.keys(rows[0]);
|
|
18181
|
+
const headers = (opts === null || opts === void 0 ? void 0 : opts.headers) || keys;
|
|
18182
|
+
const csvContent =
|
|
18183
|
+
// Header row
|
|
18184
|
+
headers.join(separator) + '\n' +
|
|
18185
|
+
// Data rows
|
|
18186
|
+
rows.map(row => {
|
|
18187
|
+
return keys.map(k => {
|
|
18188
|
+
const cell = row[k] === null || row[k] === undefined ? '' : row[k];
|
|
18189
|
+
let cellStr = cell instanceof Date
|
|
18190
|
+
? cell.toLocaleString()
|
|
18191
|
+
: cell.toString().replace(/"/g, '""');
|
|
18192
|
+
if (protectCellRegexp.test(cellStr)) {
|
|
18193
|
+
cellStr = `"${cellStr}"`;
|
|
18194
|
+
}
|
|
18195
|
+
return cellStr;
|
|
18196
|
+
}).join(separator);
|
|
18197
|
+
}).join('\n');
|
|
18198
|
+
const blob = new Blob((charset === 'utf-8')
|
|
18199
|
+
// Add UTF-8 BOM character
|
|
18200
|
+
? [FilesUtils.UTF8_BOM_CHAR, csvContent]
|
|
18201
|
+
// Non UTF-8 charset
|
|
18202
|
+
: [csvContent], { type: `text/csv;charset=${charset};` });
|
|
18203
|
+
if (navigator.msSaveBlob) { // IE 10+
|
|
18204
|
+
navigator.msSaveBlob(blob, filename);
|
|
18205
|
+
}
|
|
18206
|
+
else {
|
|
18207
|
+
const link = document.createElement('a');
|
|
18208
|
+
if (link.download !== undefined) {
|
|
18209
|
+
// Browsers that support HTML5 download attribute
|
|
18210
|
+
const url = URL.createObjectURL(blob);
|
|
18211
|
+
link.setAttribute('href', url);
|
|
18212
|
+
link.setAttribute('download', filename);
|
|
18213
|
+
link.style.visibility = 'hidden';
|
|
18214
|
+
document.body.appendChild(link);
|
|
18215
|
+
link.click();
|
|
18216
|
+
document.body.removeChild(link);
|
|
18217
|
+
}
|
|
18218
|
+
}
|
|
18219
|
+
}
|
|
18220
|
+
static parseFile(file, opts) {
|
|
18221
|
+
return FilesUtils.readAsText(file, opts === null || opts === void 0 ? void 0 : opts.encoding)
|
|
18222
|
+
.pipe(map(e => {
|
|
18223
|
+
if (e.type === HttpEventType.UploadProgress) {
|
|
18224
|
+
const loaded = Math.round(e.loaded * 0.8);
|
|
18225
|
+
return Object.assign(Object.assign({}, e), { loaded });
|
|
18226
|
+
}
|
|
18227
|
+
else if (e instanceof FileResponse) {
|
|
18228
|
+
const body = e.body;
|
|
18229
|
+
const data = CsvUtils.parseCSV(body, opts);
|
|
18230
|
+
return new FileResponse({ body: data });
|
|
18231
|
+
}
|
|
18232
|
+
}), filter(isNotNil));
|
|
18233
|
+
}
|
|
18234
|
+
static parseCSV(body, opts) {
|
|
18235
|
+
const separator = (opts === null || opts === void 0 ? void 0 : opts.separator) || ',';
|
|
18236
|
+
const skipEmptyLine = !opts || opts.skipEmptyLine !== false;
|
|
18237
|
+
// Protect special characters (quote and /n)
|
|
18238
|
+
body = body.replace('""', '<quote>') // Protect double quote
|
|
18239
|
+
.replace(/("[^\n"]+)\n\r?/gm, '"$1<br>') // Protect \n inside a quoted expression
|
|
18240
|
+
.replace(/\n\r/gm, '\n'); // Windows CR
|
|
18241
|
+
const headerAndRows = body.split('\n', 2);
|
|
18242
|
+
const headers = headerAndRows[0].split(separator);
|
|
18243
|
+
return body.split('\n') // split into rows
|
|
18244
|
+
.filter(line => !skipEmptyLine || line.trim().length > 0) // Skip empty line
|
|
18245
|
+
.map(line => {
|
|
18246
|
+
const cells = line.split(separator, headers.length) // split into cells
|
|
18247
|
+
.map(cell => cell.replace(/^"([^"]*)"$/, '$1')) // Clean trailing quotes
|
|
18248
|
+
.map(cell => cell.replace('<quote>', '"')) // restore protected quote
|
|
18249
|
+
.map(cell => cell.replace('<br>', '\n')) // restore protected br
|
|
18250
|
+
;
|
|
18251
|
+
return cells;
|
|
18252
|
+
});
|
|
18253
|
+
}
|
|
18254
|
+
}
|
|
18255
|
+
|
|
18081
18256
|
/**
|
|
18082
18257
|
* Define here theme colors
|
|
18083
18258
|
*/
|
|
@@ -27789,5 +27964,5 @@ CoreTestingModule.decorators = [
|
|
|
27789
27964
|
* Generated bundle index. Do not edit.
|
|
27790
27965
|
*/
|
|
27791
27966
|
|
|
27792
|
-
export { APP_ABOUT_DEVELOPERS, APP_ABOUT_PARTNERS, APP_CONFIG_OPTIONS, APP_FORM_ERROR_I18N_KEYS, APP_GRAPHQL_TYPE_POLICIES, APP_HOME_BUTTONS, APP_LOCALES, APP_LOCAL_SETTINGS, APP_LOCAL_SETTINGS_OPTIONS, APP_LOCAL_STORAGE_TYPE_POLICIES, APP_MENU_ITEMS, APP_TESTING_PAGES, AboutModal, Account, AccountPage, AccountService, AccountToStringPipe, ActionsColumnComponent, AdminModule, AdminRoutingModule, Alerts, AndroidOsEnvironment, AnimationState, AppEditor, AppEditorOptions, AppEntityEditor, AppForm, AppFormField, AppFormProvider, AppFormUtils, AppGestureConfig, AppGraphQLModule, AppHelpModal, AppInMemoryTable, AppInstallUpgradeCard, AppListForm, AppLoadingSpinner, AppMenuModule, AppNullForm, AppPropertiesForm, AppTabEditor, AppTabEditorOptions, AppTable, AppTableDataSourceOptions, AppTableUtils, AppValidatorService, AppendToInputDirective, ArrayFilterPipe, ArrayFirstPipe, ArrayIncludesPipe, ArrayLengthPipe, ArrayPluckPipe, AudioProvider, AuthForm, AuthGuardService, AuthModal, AutocompleteTestPage, AutofocusDirective, Base58, BaseEntityService, BaseGraphqlService, BaseGraphqlServiceOptions, BaseReferential, Beans, CORE_CONFIG_OPTIONS, CORE_TESTING_PAGES, CellValueChangeListener, ChipsTestPage, Color, ColorScale, ComponentDirtyGuard, ConfigService, Configuration, CoreModule, CoreTestingModule, CryptoService, DATE_ISO_PATTERN, DATE_UNIX_MS_TIMESTAMP, DATE_UNIX_TIMESTAMP, DEFAULT_MENU_SHOW_WHEN, DEFAULT_PAGE_SIZE, DEFAULT_PAGE_SIZE_OPTIONS, DEFAULT_PLACEHOLDER_CHAR, DEFAULT_REQUIRED_COLUMNS, DateDiffDurationPipe, DateFormatPipe, DateFromNowPipe, DateTimeTestPage, DateUtils, Department, DepartmentToStringPipe, DragAndDropDirective, DurationPipe, ENTITIES_STORAGE_KEY_PREFIX, ENVIRONMENT, EmptyArrayPipe, EntitiesService, EntitiesStorage, EntitiesTableDataSource, Entity, EntityClass, EntityClasses, EntityFilter, EntityFilterUtils, EntityMetadataComponent, EntityStore, EntityUtils, Environment, EvenPipe, FileResponse, FileService, FileSizePipe, FilesUtils, FormArrayHelper, FormButtonsBarComponent, FormButtonsBarToken, FormErrorTranslatePipe, FormErrorTranslator, FormFieldValuesHolder, FormGetArrayPipe, FormGetControlPipe, FormGetGroupPipe, FormGetPipe, FormGetValuePipe, Fragments$1 as Fragments, GraphqlService, HAMMER_PRESS_TIME, HAMMER_TAP_TIME, HighlightPipe, HomePage, Hotkeys, HotkeysDialogComponent, InMemoryEntitiesService, IsLoginAccountPipe, IsNilOrBlankPipe, IsNotNilOrBlankPipe, IsNotOnFieldModePipe, IsOnFieldModePipe, JobUtils, KEYBOARD_HIDE_DELAY_MS, LAT_LONG_DEFAULT_MAX_DECIMALS, LAT_LONG_PATTERNS, LatLongFormatPipe, LatLongTestPage, LatitudeFormatPipe, LocalSettingsService, LongitudeFormatPipe, MINIFY_ENTITY_FOR_LOCAL_STORAGE, MINIFY_ENTITY_FOR_POD, MapGetPipe, MapKeysPipe, MapValuesPipe, MatAutocompleteConfigHolder, MatAutocompleteField, MatBadgeIconDirective, MatBooleanField, MatChipsField, MatDate, MatDateShort, MatDateTime, MatDuration, MatLatLongField, MatNumpadComponent, MatNumpadContainerComponent, MatNumpadContent, MatPaginatorI18n, MatStepperI18n, MatSwipeField, MaterialTestingModule, MathAbsPipe, MenuComponent, MenuItems, MenuService, Message, MessageFilter, MessageForm, MessageModal, MessageService, MessageTypeList, MessageTypes, MimeTypes, ModalToolbarComponent, NetworkService, NgInitDirective, NgVarDirective, NotEmptyArrayPipe, NumberFormatPipe, NumpadDirective, OddPipe, PRIORITIZED_AUTHORITIES, PUBKEY_REGEXP, Peer, Person, PersonFilter, PersonFragments, PersonService, PersonToStringPipe, PersonUtils, PersonValidatorService, PlatformService, ProgressBarService, ProgressInterceptor, PropertyGetPipe, RESERVED_END_COLUMNS, RESERVED_START_COLUMNS, Referential, ReferentialFilter, ReferentialRef, ReferentialUtils, ReferentialValidatorService, RegisterConfirmPage, SETTINGS_DISPLAY_COLUMNS, SETTINGS_FILTER, SETTINGS_PAGE_SIZE, SETTINGS_SORTED_COLUMN, SETTINGS_STORAGE_KEY, SETTINGS_TRANSIENT_PROPERTIES, SHARED_MATERIAL_TESTING_PAGES, SHARED_TESTING_PAGES, SPACE_PLACEHOLDER_CHAR, SelectPeerModal, SettingsPage, SharedAsyncValidators, SharedDirectivesModule, SharedFormArrayValidators, SharedFormGroupValidators, SharedHotkeysModule, SharedMatAutocompleteModule, SharedMatBadgeIconModule, SharedMatBooleanModule, SharedMatChipsModule, SharedMatDateTimeModule, SharedMatDurationModule, SharedMatLatLongModule, SharedMatNumpadModule, SharedMatSwipeModule, SharedMaterialModule, SharedModule, SharedPipesModule, SharedRoutingModule, SharedTestingModule, SharedTestsPage, SharedValidators, SocialErrorCodes, SocialModule, Software, StartableService, StatusById, StatusIds, StatusList, StrIncludesPipe, StrLengthPipe, SwipeTestPage, TableSelectColumnsComponent, TableTestPage, TableTestingModule, TextForm, TextPopover, TextPopoverTestingModule, TextPopoverTestingPage, ToStringPipe, Toasts, ToolbarComponent, ToolbarToken, TranslatablePipe, TranslateContextPipe, TranslateContextService, UploadFile, UploadFileComponent, UploadFilePopover, UploadFileTestingModule, UploadFileTestingPage, UriUtils, UserEvent, UserEventFilter, UserEventFragments, UserEventService, UserEventTypes, UserEventsTable, UserSettings, UsersPage, accountToString, adaptValueToControl, addValueInArray, arrayDistinct, arrayGroupBy, arraySize, asInputElement, canHaveFocus, capitalizeFirstLetter, chainPromises, changeCaseToUnderscore, clearValueInArray, copyEntity2Form, createPromiseEvent, createPromiseEventEmitter, departmentToString, departmentsToString, disableControls, emitPromiseEvent, entityToString, equals, equalsOrNil, escapeRegExp, fadeInAnimation, fadeInOutAnimation, filterFalse, filterNotNil, filterNumberInput, filterTrue, firstArrayValue, firstFalse, firstFalsePromise, firstNotNil, firstNotNilPromise, firstTrue, firstTruePromise, focusInput, focusNextInput, focusPreviousInput, formatLatitude, formatLongitude, fromDateISOString, fromScrollEndEvent, fromUnixMsTimestamp, fromUnixTimestamp, getCaretPosition, getColorContrast, getColorShade, getColorTint, getConnectionType, getControlFromPath, getFocusableInputElements, getFormErrors, getFormValueFromEntity, getProperty, getPropertyByPath, getPropertyByPathAsString, getRandomImage, hexToRgb, hexToRgbArray, isAndroid, isBlankString, isControlHasInput, isCordova, isEmptyArray, isIOS, isInputElement, isInstanceOf, isInt, isMobile, isNil, isNilOrBlank, isNilOrNaN, isNotEmptyArray, isNotNil, isNotNilBoolean, isNotNilOrBlank, isNotNilOrNaN, isNotNilString, isNumber, isNumberRange, isProgressEvent, isResponseEvent, isTouchUi, isWindows, joinProperties, joinPropertiesPath, logFormErrors, markAllAsTouched, markAsUntouched, markControlAsTouched, markFormGroupAsTouched, matchMedia, matchUpperCase, mergeLoadResult, mixHex, moment$5 as moment, moveInputCaretToSeparator, noTrailingSlash, notNilOrDefault, nullIfUndefined, parseLatitudeOrLongitude, propertiesPathComparator, propertyComparator, propertyPathComparator, referentialToString, referentialsToString, remove, removeAll, removeDiacritics, removeDuplicatesFromArray, removeEnd, removeValueInArray, replaceAll, resetCalculatedValue, resizeArray, rgbArrayToHex, rgbToHex, round, scrollFactory, selectInputContent, selectInputRange, setCalculatedValue, setTabIndex, sleep, slideInOutAnimation, slideUpDownAnimation, sort, splitById, splitByProperty, startsWithUpperCase, suggestFromArray, suggestFromStringArray, tabindexComparator, testUserAgent, toBoolean, toDateISOString, toDuration, toFloat, toInt, toNotNil, toNumber, trimEmptyToNull, tz, uncapitalizeFirstLetter, updateValueAndValidity, waitFor, waitForTrue, waitIdle, waitWhilePending, ɵ0, CustomReuseStrategy as ɵa, MatNumpadDomService as ɵb, isFocusableElement as ɵc, RegisterForm as ɵd, AccountValidatorService as ɵe, RegisterModal as ɵf, UserSettingsValidatorService as ɵg, LocalSettingsValidatorService as ɵh, AppUpdateOfflineModeCard as ɵi, AppIconComponent as ɵj, DateTestPage as ɵk, NumpadTestPage as ɵl, MatBadgeIconTestPage as ɵm, ToastTestingModule as ɵn, ToastTestingPage as ɵo };
|
|
27967
|
+
export { APP_ABOUT_DEVELOPERS, APP_ABOUT_PARTNERS, APP_CONFIG_OPTIONS, APP_FORM_ERROR_I18N_KEYS, APP_GRAPHQL_TYPE_POLICIES, APP_HOME_BUTTONS, APP_LOCALES, APP_LOCAL_SETTINGS, APP_LOCAL_SETTINGS_OPTIONS, APP_LOCAL_STORAGE_TYPE_POLICIES, APP_MENU_ITEMS, APP_TESTING_PAGES, AboutModal, Account, AccountPage, AccountService, AccountToStringPipe, ActionsColumnComponent, AdminModule, AdminRoutingModule, Alerts, AndroidOsEnvironment, AnimationState, AppEditor, AppEditorOptions, AppEntityEditor, AppForm, AppFormField, AppFormProvider, AppFormUtils, AppGestureConfig, AppGraphQLModule, AppHelpModal, AppInMemoryTable, AppInstallUpgradeCard, AppListForm, AppLoadingSpinner, AppMenuModule, AppNullForm, AppPropertiesForm, AppTabEditor, AppTabEditorOptions, AppTable, AppTableDataSourceOptions, AppTableUtils, AppValidatorService, AppendToInputDirective, ArrayFilterPipe, ArrayFirstPipe, ArrayIncludesPipe, ArrayLengthPipe, ArrayPluckPipe, AudioProvider, AuthForm, AuthGuardService, AuthModal, AutoTitleDirective, AutocompleteTestPage, AutofocusDirective, Base58, BaseEntityService, BaseGraphqlService, BaseGraphqlServiceOptions, BaseReferential, Beans, CORE_CONFIG_OPTIONS, CORE_TESTING_PAGES, CellValueChangeListener, ChipsTestPage, Color, ColorScale, ComponentDirtyGuard, ConfigService, Configuration, CoreModule, CoreTestingModule, CryptoService, CsvUtils, DATE_ISO_PATTERN, DATE_UNIX_MS_TIMESTAMP, DATE_UNIX_TIMESTAMP, DEFAULT_MENU_SHOW_WHEN, DEFAULT_PAGE_SIZE, DEFAULT_PAGE_SIZE_OPTIONS, DEFAULT_PLACEHOLDER_CHAR, DEFAULT_REQUIRED_COLUMNS, DateDiffDurationPipe, DateFormatPipe, DateFromNowPipe, DateTimeTestPage, DateUtils, Department, DepartmentToStringPipe, DragAndDropDirective, DurationPipe, ENTITIES_STORAGE_KEY_PREFIX, ENVIRONMENT, EmptyArrayPipe, EntitiesService, EntitiesStorage, EntitiesTableDataSource, Entity, EntityClass, EntityClasses, EntityFilter, EntityFilterUtils, EntityMetadataComponent, EntityStore, EntityUtils, Environment, EvenPipe, FileResponse, FileService, FileSizePipe, FilesUtils, FormArrayHelper, FormButtonsBarComponent, FormButtonsBarToken, FormErrorTranslatePipe, FormErrorTranslator, FormFieldValuesHolder, FormGetArrayPipe, FormGetControlPipe, FormGetGroupPipe, FormGetPipe, FormGetValuePipe, Fragments$1 as Fragments, GraphqlService, HAMMER_PRESS_TIME, HAMMER_TAP_TIME, HighlightPipe, HomePage, Hotkeys, HotkeysDialogComponent, InMemoryEntitiesService, IsLoginAccountPipe, IsNilOrBlankPipe, IsNotNilOrBlankPipe, IsNotOnFieldModePipe, IsOnFieldModePipe, JobUtils, KEYBOARD_HIDE_DELAY_MS, LAT_LONG_DEFAULT_MAX_DECIMALS, LAT_LONG_PATTERNS, LatLongFormatPipe, LatLongTestPage, LatitudeFormatPipe, LocalSettingsService, LongitudeFormatPipe, MINIFY_ENTITY_FOR_LOCAL_STORAGE, MINIFY_ENTITY_FOR_POD, MapGetPipe, MapKeysPipe, MapValuesPipe, MatAutocompleteConfigHolder, MatAutocompleteField, MatBadgeIconDirective, MatBooleanField, MatChipsField, MatDate, MatDateShort, MatDateTime, MatDuration, MatLatLongField, MatNumpadComponent, MatNumpadContainerComponent, MatNumpadContent, MatPaginatorI18n, MatStepperI18n, MatSwipeField, MaterialTestingModule, MathAbsPipe, MenuComponent, MenuItems, MenuService, Message, MessageFilter, MessageForm, MessageModal, MessageService, MessageTypeList, MessageTypes, MimeTypes, ModalToolbarComponent, NetworkService, NgInitDirective, NgVarDirective, NotEmptyArrayPipe, NumberFormatPipe, NumpadDirective, OddPipe, PRIORITIZED_AUTHORITIES, PUBKEY_REGEXP, Peer, Person, PersonFilter, PersonFragments, PersonService, PersonToStringPipe, PersonUtils, PersonValidatorService, PlatformService, ProgressBarService, ProgressInterceptor, PropertyFormatPipe, PropertyGetPipe, RESERVED_END_COLUMNS, RESERVED_START_COLUMNS, Referential, ReferentialFilter, ReferentialRef, ReferentialUtils, ReferentialValidatorService, RegisterConfirmPage, SETTINGS_DISPLAY_COLUMNS, SETTINGS_FILTER, SETTINGS_PAGE_SIZE, SETTINGS_SORTED_COLUMN, SETTINGS_STORAGE_KEY, SETTINGS_TRANSIENT_PROPERTIES, SHARED_MATERIAL_TESTING_PAGES, SHARED_TESTING_PAGES, SPACE_PLACEHOLDER_CHAR, SelectPeerModal, SettingsPage, SharedAsyncValidators, SharedDirectivesModule, SharedFormArrayValidators, SharedFormGroupValidators, SharedHotkeysModule, SharedMatAutocompleteModule, SharedMatBadgeIconModule, SharedMatBooleanModule, SharedMatChipsModule, SharedMatDateTimeModule, SharedMatDurationModule, SharedMatLatLongModule, SharedMatNumpadModule, SharedMatSwipeModule, SharedMaterialModule, SharedModule, SharedPipesModule, SharedRoutingModule, SharedTestingModule, SharedTestsPage, SharedValidators, SocialErrorCodes, SocialModule, Software, StartableService, StatusById, StatusIds, StatusList, StrIncludesPipe, StrLengthPipe, SwipeTestPage, TableSelectColumnsComponent, TableTestPage, TableTestingModule, TextForm, TextPopover, TextPopoverTestingModule, TextPopoverTestingPage, ToStringPipe, Toasts, ToolbarComponent, ToolbarToken, TranslatablePipe, TranslateContextPipe, TranslateContextService, UploadFile, UploadFileComponent, UploadFilePopover, UploadFileTestingModule, UploadFileTestingPage, UriUtils, UserEvent, UserEventFilter, UserEventFragments, UserEventService, UserEventTypes, UserEventsTable, UserSettings, UsersPage, accountToString, adaptValueToControl, addValueInArray, arrayDistinct, arrayGroupBy, arraySize, asInputElement, canHaveFocus, capitalizeFirstLetter, chainPromises, changeCaseToUnderscore, clearValueInArray, copyEntity2Form, createPromiseEvent, createPromiseEventEmitter, departmentToString, departmentsToString, disableControls, emitPromiseEvent, entityToString, equals, equalsOrNil, escapeRegExp, fadeInAnimation, fadeInOutAnimation, filterFalse, filterNotNil, filterNumberInput, filterTrue, firstArrayValue, firstFalse, firstFalsePromise, firstNotNil, firstNotNilPromise, firstTrue, firstTruePromise, focusInput, focusNextInput, focusPreviousInput, formatLatitude, formatLongitude, fromDateISOString, fromScrollEndEvent, fromUnixMsTimestamp, fromUnixTimestamp, getCaretPosition, getColorContrast, getColorShade, getColorTint, getConnectionType, getControlFromPath, getFocusableInputElements, getFormErrors, getFormValueFromEntity, getProperty, getPropertyByPath, getPropertyByPathAsString, getRandomImage, hexToRgb, hexToRgbArray, isAndroid, isBlankString, isControlHasInput, isCordova, isEmptyArray, isIOS, isInputElement, isInstanceOf, isInt, isMobile, isNil, isNilOrBlank, isNilOrNaN, isNotEmptyArray, isNotNil, isNotNilBoolean, isNotNilOrBlank, isNotNilOrNaN, isNotNilString, isNumber, isNumberRange, isProgressEvent, isResponseEvent, isTouchUi, isWindows, joinProperties, joinPropertiesPath, logFormErrors, markAllAsTouched, markAsUntouched, markControlAsTouched, markFormGroupAsTouched, matchMedia, matchUpperCase, mergeLoadResult, mixHex, moment$5 as moment, moveInputCaretToSeparator, noTrailingSlash, notNilOrDefault, nullIfUndefined, parseLatitudeOrLongitude, propertiesPathComparator, propertyComparator, propertyPathComparator, referentialToString, referentialsToString, remove, removeAll, removeDiacritics, removeDuplicatesFromArray, removeEnd, removeValueInArray, replaceAll, resetCalculatedValue, resizeArray, rgbArrayToHex, rgbToHex, round, scrollFactory, selectInputContent, selectInputRange, setCalculatedValue, setTabIndex, sleep, slideInOutAnimation, slideUpDownAnimation, sort, splitById, splitByProperty, startsWithUpperCase, suggestFromArray, suggestFromStringArray, tabindexComparator, testUserAgent, toBoolean, toDateISOString, toDuration, toFloat, toInt, toNotNil, toNumber, trimEmptyToNull, tz, uncapitalizeFirstLetter, updateValueAndValidity, waitFor, waitForTrue, waitIdle, waitWhilePending, ɵ0, CustomReuseStrategy as ɵa, MatNumpadDomService as ɵb, isFocusableElement as ɵc, RegisterForm as ɵd, AccountValidatorService as ɵe, RegisterModal as ɵf, UserSettingsValidatorService as ɵg, LocalSettingsValidatorService as ɵh, AppUpdateOfflineModeCard as ɵi, AppIconComponent as ɵj, DateTestPage as ɵk, NumpadTestPage as ɵl, MatBadgeIconTestPage as ɵm, ToastTestingModule as ɵn, ToastTestingPage as ɵo };
|
|
27793
27968
|
//# sourceMappingURL=sumaris-net.ngx-components.js.map
|