@solidev/data 0.0.1-rc.2 → 0.0.1-rc.3

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 (46) hide show
  1. package/esm2020/lib/auth/auth-interceptor.service.mjs +3 -3
  2. package/esm2020/lib/auth/auth.service.mjs +100 -14
  3. package/esm2020/lib/data/data-backend.mjs +3 -3
  4. package/esm2020/lib/dispedit/choice.pipe.mjs +6 -6
  5. package/esm2020/lib/dispedit/dispedit/dispedit.component.mjs +3 -3
  6. package/esm2020/lib/dispedit/factor.pipe.mjs +6 -6
  7. package/esm2020/lib/dispedit/factorc.pipe.mjs +6 -6
  8. package/esm2020/lib/dispedit/fkselect/fkselect.component.mjs +3 -3
  9. package/esm2020/lib/dispedit/flags/flags.component.mjs +3 -3
  10. package/esm2020/lib/dispedit/m2mselect/m2mselect.component.mjs +3 -3
  11. package/esm2020/lib/dispedit/richedit/richedit.component.mjs +3 -3
  12. package/esm2020/lib/dispedit/sdelete/sdelete.component.mjs +3 -3
  13. package/esm2020/lib/messages/message-zone/message-zone.component.mjs +3 -3
  14. package/esm2020/lib/messages/message.service.mjs +3 -3
  15. package/esm2020/lib/modellist/model-list-fields/model-list-field-header/model-list-field-header.component.mjs +3 -3
  16. package/esm2020/lib/modellist/model-list-fields/model-list-fields-selector/model-list-fields-selector.component.mjs +3 -3
  17. package/esm2020/lib/modellist/model-list-filters/filters/model-list-autocomplete-filter/model-list-autocomplete-filter.component.mjs +3 -3
  18. package/esm2020/lib/modellist/model-list-filters/filters/model-list-autocomplete-multi-filter/model-list-autocomplete-multi-filter.component.mjs +3 -3
  19. package/esm2020/lib/modellist/model-list-filters/filters/model-list-date-filter/model-list-date-filter.component.mjs +3 -3
  20. package/esm2020/lib/modellist/model-list-filters/filters/model-list-datetime-filter/model-list-datetime-filter.component.mjs +3 -3
  21. package/esm2020/lib/modellist/model-list-filters/filters/model-list-datetimerange-filter/model-list-datetime-range-filter.component.mjs +3 -3
  22. package/esm2020/lib/modellist/model-list-filters/filters/model-list-flags-filter/model-list-flags-filter.component.mjs +3 -3
  23. package/esm2020/lib/modellist/model-list-filters/filters/model-list-geodistance-filter/model-list-geodistance-filter.component.mjs +3 -3
  24. package/esm2020/lib/modellist/model-list-filters/filters/model-list-number-filter/model-list-number-filter.component.mjs +3 -3
  25. package/esm2020/lib/modellist/model-list-filters/filters/model-list-select-filter/model-list-select-filter.component.mjs +3 -3
  26. package/esm2020/lib/modellist/model-list-filters/filters/model-list-select-multi-filter/model-list-select-multi-filter.component.mjs +3 -3
  27. package/esm2020/lib/modellist/model-list-filters/filters/model-list-text-filter/model-list-text-filter.component.mjs +3 -3
  28. package/esm2020/lib/modellist/model-list-filters/filters/model-list-tree-filter/model-list-tree-filter.component.mjs +3 -3
  29. package/esm2020/lib/modellist/model-list-filters/model-list-filters/model-list-filters.component.mjs +3 -3
  30. package/esm2020/lib/modellist/model-list-filters/model-list-filters-select/model-list-filters-select.component.mjs +3 -3
  31. package/esm2020/lib/modellist/model-list-paginator/model-list-paginator/model-list-paginator.component.mjs +3 -3
  32. package/esm2020/lib/modellist/model-list-sorter/model-list-sorter/model-list-sorter.component.mjs +3 -3
  33. package/esm2020/lib/modellist/model-list.service.mjs +3 -3
  34. package/esm2020/lib/routing/breadcrumb/breadcrumb.component.mjs +3 -3
  35. package/esm2020/lib/updates/update/update.component.mjs +3 -3
  36. package/esm2020/lib/updates/update.service.mjs +3 -3
  37. package/esm2020/lib/uploader/ng-file-drop.directive.mjs +3 -3
  38. package/esm2020/lib/uploader/ng-file-select.directive.mjs +3 -3
  39. package/esm2020/lib/uploader/ngx-uploader.module.mjs +4 -4
  40. package/esm2020/lib/utils/tab-memory.service.mjs +3 -3
  41. package/fesm2015/solidev-data.mjs +227 -141
  42. package/fesm2015/solidev-data.mjs.map +1 -1
  43. package/fesm2020/solidev-data.mjs +226 -141
  44. package/fesm2020/solidev-data.mjs.map +1 -1
  45. package/lib/auth/auth.service.d.ts +21 -1
  46. package/package.json +1 -1
@@ -73,9 +73,9 @@ export class AuthInterceptor {
73
73
  });
74
74
  }
75
75
  }
76
- AuthInterceptor.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.3", ngImport: i0, type: AuthInterceptor, deps: [{ token: DATA_AUTH_SERVICE }, { token: DATA_API_URL }], target: i0.ɵɵFactoryTarget.Injectable });
77
- AuthInterceptor.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.0.3", ngImport: i0, type: AuthInterceptor, providedIn: 'root' });
78
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.3", ngImport: i0, type: AuthInterceptor, decorators: [{
76
+ AuthInterceptor.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: AuthInterceptor, deps: [{ token: DATA_AUTH_SERVICE }, { token: DATA_API_URL }], target: i0.ɵɵFactoryTarget.Injectable });
77
+ AuthInterceptor.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: AuthInterceptor, providedIn: 'root' });
78
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: AuthInterceptor, decorators: [{
79
79
  type: Injectable,
80
80
  args: [{
81
81
  providedIn: 'root',
@@ -31,6 +31,15 @@ let AuthServiceBase = class AuthServiceBase {
31
31
  return this._user && this._user.id ? this._user : null;
32
32
  }
33
33
  get currentUser$() {
34
+ // Needs refresh ?
35
+ if (!this._fetched ||
36
+ Date.now() - this._fetched >
37
+ (this._params.userFetchValiditySeconds || 3600) * 1000) {
38
+ this._fetched = Date.now();
39
+ return this._fetchUser().pipe(switchMap(() => {
40
+ return this._user$.asObservable();
41
+ }));
42
+ }
34
43
  return this._user$.asObservable();
35
44
  }
36
45
  get refreshUrl() {
@@ -39,6 +48,18 @@ let AuthServiceBase = class AuthServiceBase {
39
48
  get loginUrl() {
40
49
  return `${this._params.tokenUrl}`;
41
50
  }
51
+ get loginRoute() {
52
+ return this._params.loginRoute;
53
+ }
54
+ get logoutRoute() {
55
+ return this._params.logoutRoute;
56
+ }
57
+ get pwresetRoute() {
58
+ return this._params.pwresetRoute;
59
+ }
60
+ get reactivateRoute() {
61
+ return this._params.reactivateRoute;
62
+ }
42
63
  logout() {
43
64
  localStorage.removeItem('auth');
44
65
  this._token = new Jwt();
@@ -50,9 +71,10 @@ let AuthServiceBase = class AuthServiceBase {
50
71
  if (!localAuth) {
51
72
  return this.logout();
52
73
  }
53
- const { user, token } = JSON.parse(localAuth);
74
+ const { user, fetched, token } = JSON.parse(localAuth);
54
75
  this._token = new Jwt(token);
55
76
  this._user = this.userService.create(user);
77
+ this._fetched = fetched;
56
78
  this._user$.next(this._user);
57
79
  }
58
80
  login(username, password) {
@@ -63,20 +85,53 @@ let AuthServiceBase = class AuthServiceBase {
63
85
  this._token = new Jwt(tok);
64
86
  this.saveAuth();
65
87
  }), switchMap(() => {
66
- if (this._token.data && this._token.data.user_id) {
67
- return this.userService.fetch(this._token.data.user_id);
68
- }
69
- else {
70
- return throwError(() => 'Invalid token');
71
- }
72
- }), tap((user) => {
73
- this._user = user;
74
- this.saveAuth();
75
- }), map(() => true), catchError((error) => {
88
+ return this._fetchUser();
89
+ }), map(() => 'success'), catchError((error) => {
76
90
  this.logout();
77
- return of(false);
91
+ const code = error.error?.code || error?.code || 'error';
92
+ console.error(code, error);
93
+ return of(code);
78
94
  }));
79
95
  }
96
+ requestReactivate(username) {
97
+ if (this._params.requestReactivateUrl) {
98
+ const payload = {};
99
+ payload[this._params.loginField] = username;
100
+ return this._http
101
+ .post(this._params.requestReactivateUrl, payload)
102
+ .pipe(map(() => true), catchError(() => of(false)));
103
+ }
104
+ return of(false);
105
+ }
106
+ requestPwReset(username) {
107
+ if (this._params.requestPwResetUrl) {
108
+ const payload = {};
109
+ payload[this._params.loginField] = username;
110
+ return this._http.post(this._params.requestPwResetUrl, payload).pipe(map(() => true), catchError(() => of(false)));
111
+ }
112
+ return of(false);
113
+ }
114
+ processReactivate(username, token) {
115
+ if (this._params.processReactivateUrl) {
116
+ const payload = {};
117
+ payload[this._params.loginField] = username;
118
+ payload[this._params.tokenField] = token;
119
+ return this._http
120
+ .post(this._params.processReactivateUrl, payload)
121
+ .pipe(map(() => true), catchError(() => of(false)));
122
+ }
123
+ return of(false);
124
+ }
125
+ processPwReset(username, password, token) {
126
+ if (this._params.processPwResetUrl) {
127
+ const payload = {};
128
+ payload[this._params.loginField] = username;
129
+ payload[this._params.passwordField] = password;
130
+ payload[this._params.tokenField] = token;
131
+ return this._http.post(this._params.processPwResetUrl, payload).pipe(map(() => true), catchError(() => of(false)));
132
+ }
133
+ return of(false);
134
+ }
80
135
  saveAuth() {
81
136
  if (this.isAnonymous) {
82
137
  localStorage.removeItem('auth');
@@ -85,13 +140,13 @@ let AuthServiceBase = class AuthServiceBase {
85
140
  else {
86
141
  localStorage.setItem('auth', JSON.stringify({
87
142
  user: this._user.toJson(),
143
+ fetched: Date.now(),
88
144
  token: this._token.toJson(),
89
145
  }));
90
146
  this._user$.next(this._user);
91
147
  }
92
148
  }
93
149
  refresh() {
94
- console.log('service token refresh');
95
150
  if (!this._token.refresh) {
96
151
  this.logout();
97
152
  return of(null);
@@ -116,10 +171,41 @@ let AuthServiceBase = class AuthServiceBase {
116
171
  }
117
172
  }));
118
173
  }
174
+ _fetchUser() {
175
+ if (this._token.data && this._token.data.user_id) {
176
+ // Fetch user data using token
177
+ return this.userService
178
+ .fetch(this._token.data.user_id, {
179
+ params: {
180
+ fields: (this._params.userFetchFields || [
181
+ 'id',
182
+ 'username',
183
+ 'email',
184
+ 'last_name',
185
+ 'first_name',
186
+ 'is_superuser',
187
+ 'is_active',
188
+ 'is_staff',
189
+ 'last_login',
190
+ 'current_groups_slugs',
191
+ ]).join(','),
192
+ },
193
+ })
194
+ .pipe(tap((u) => {
195
+ this._user = u;
196
+ this.saveAuth();
197
+ }));
198
+ }
199
+ else {
200
+ return throwError(() => {
201
+ return { code: 'invalid_token' };
202
+ });
203
+ }
204
+ }
119
205
  };
120
206
  AuthServiceBase = __decorate([
121
207
  __param(0, Inject(DATA_AUTH_USER_SERVICE)),
122
208
  __param(1, Inject(DATA_AUTH_PARAMS))
123
209
  ], AuthServiceBase);
124
210
  export { AuthServiceBase };
125
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGF0YS9zcmMvbGliL2F1dGgvYXV0aC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2RCxPQUFPLEVBSUwsR0FBRyxHQUNKLE1BQU0sT0FBTyxDQUFDO0FBRWYsT0FBTyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2pFLE9BQU8sRUFBYyxFQUFFLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQWNqRTs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLElBQUksY0FBYyxDQUNoRCxrQkFBa0IsQ0FDbkIsQ0FBQztBQUNGLE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLElBQUksY0FBYyxDQUN0RCx3QkFBd0IsQ0FDekIsQ0FBQztBQUVLLElBQU0sZUFBZSxHQUFyQixNQUFNLGVBQWU7SUFTMUIsWUFDeUMsV0FBd0IsRUFDN0IsT0FBbUIsRUFDN0MsT0FBZSxFQUNmLEtBQWlCLEVBQ2pCLEtBQXlCO1FBSk0sZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDN0IsWUFBTyxHQUFQLE9BQU8sQ0FBWTtRQUM3QyxZQUFPLEdBQVAsT0FBTyxDQUFRO1FBQ2YsVUFBSyxHQUFMLEtBQUssQ0FBWTtRQUNqQixVQUFLLEdBQUwsS0FBSyxDQUFvQjtRQVIzQixXQUFNLEdBQUcsSUFBSSxhQUFhLENBQWMsQ0FBQyxDQUFDLENBQUM7UUFVakQsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ25CLENBQUM7SUFFRCxJQUFXLFdBQVc7UUFDcEIsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQzdCLENB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QUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3Rpb25Ub2tlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgSUp3dEJhc2VEYXRhLFxuICBJSnd0UmVmcmVzaFJlc3BvbnNlSnNvbixcbiAgSUp3dFJlc3BvbnNlSnNvbixcbiAgSnd0LFxufSBmcm9tICcuL2p3dCc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgbWFwLCBzd2l0Y2hNYXAsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IE9ic2VydmFibGUsIG9mLCBSZXBsYXlTdWJqZWN0LCB0aHJvd0Vycm9yIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBEYXRhTW9kZWwgfSBmcm9tICcuLi9kYXRhL2RhdGEtbW9kZWwnO1xuaW1wb3J0IHsgQ29sbGVjdGlvbiB9IGZyb20gJy4uL2RhdGEvZGF0YS1jb2xsZWN0aW9uJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBEYXRhTWVzc2FnZVNlcnZpY2UgfSBmcm9tICcuLi9tZXNzYWdlcy9tZXNzYWdlLnNlcnZpY2UnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEF1dGhQYXJhbXMge1xuICB0b2tlblVybDogc3RyaW5nO1xuICB0b2tlblJlZnJlc2hVcmw6IHN0cmluZztcbiAgbG9naW5GaWVsZDogc3RyaW5nO1xuICBwYXNzd29yZEZpZWxkOiBzdHJpbmc7XG4gIGxvZ2luUm91dGU6IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIERBVEFfQVBJX1VSTDogc3RvcmVzIGRhdGEgYXBpIGJhc2UgdXJsXG4gKi9cbmV4cG9ydCBjb25zdCBEQVRBX0FVVEhfUEFSQU1TID0gbmV3IEluamVjdGlvblRva2VuPEF1dGhQYXJhbXM+KFxuICAnZGF0YS5hdXRoLnBhcmFtcydcbik7XG5leHBvcnQgY29uc3QgREFUQV9BVVRIX1VTRVJfU0VSVklDRSA9IG5ldyBJbmplY3Rpb25Ub2tlbjxDb2xsZWN0aW9uPGFueT4+KFxuICAnZGF0YS5hdXRoLnVzZXIuc2VydmljZSdcbik7XG5cbmV4cG9ydCBjbGFzcyBBdXRoU2VydmljZUJhc2U8XG4gIFVzZXIgZXh0ZW5kcyBEYXRhTW9kZWwsXG4gIFVzZXJTZXJ2aWNlIGV4dGVuZHMgQ29sbGVjdGlvbjxVc2VyPixcbiAgVXNlckRhdGEgZXh0ZW5kcyBJSnd0QmFzZURhdGFcbj4ge1xuICBwcml2YXRlIF91c2VyITogVXNlcjtcbiAgcHJpdmF0ZSBfdXNlciQgPSBuZXcgUmVwbGF5U3ViamVjdDxVc2VyIHwgbnVsbD4oMSk7XG4gIHByaXZhdGUgX3Rva2VuITogSnd0PFVzZXJEYXRhPjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KERBVEFfQVVUSF9VU0VSX1NFUlZJQ0UpIHB1YmxpYyB1c2VyU2VydmljZTogVXNlclNlcnZpY2UsXG4gICAgQEluamVjdChEQVRBX0FVVEhfUEFSQU1TKSBwcml2YXRlIF9wYXJhbXM6IEF1dGhQYXJhbXMsXG4gICAgcHJpdmF0ZSBfcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJpdmF0ZSBfaHR0cDogSHR0cENsaWVudCxcbiAgICBwcml2YXRlIF9tc2dzOiBEYXRhTWVzc2FnZVNlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy5hdXRvTG9naW4oKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNBbm9ueW1vdXMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLl90b2tlbi5hY2Nlc3M7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFjY2Vzc1Rva2VuKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl90b2tlbi5hY2Nlc3MgPyB0aGlzLl90b2tlbi5hY2Nlc3MgOiBudWxsO1xuICB9XG5cbiAgcHVibGljIGdldCByZWZyZXNoVG9rZW4oKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX3Rva2VuLnJlZnJlc2ggPyB0aGlzLl90b2tlbi5yZWZyZXNoIDogbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY3VycmVudFVzZXIoKTogVXNlciB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl91c2VyICYmIHRoaXMuX3VzZXIuaWQgPyB0aGlzLl91c2VyIDogbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY3VycmVudFVzZXIkKCk6IE9ic2VydmFibGU8VXNlciB8IG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy5fdXNlciQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHJlZnJlc2hVcmwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5fcGFyYW1zLnRva2VuUmVmcmVzaFVybH1gO1xuICB9XG5cbiAgcHVibGljIGdldCBsb2dpblVybCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLl9wYXJhbXMudG9rZW5Vcmx9YDtcbiAgfVxuXG4gIHB1YmxpYyBsb2dvdXQoKTogdm9pZCB7XG4gICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ2F1dGgnKTtcbiAgICB0aGlzLl90b2tlbiA9IG5ldyBKd3QoKTtcbiAgICB0aGlzLl91c2VyID0gdGhpcy51c2VyU2VydmljZS5jcmVhdGUoKTtcbiAgICB0aGlzLl91c2VyJC5uZXh0KG51bGwpO1xuICB9XG5cbiAgcHVibGljIGF1dG9Mb2dpbigpOiB2b2lkIHtcbiAgICBjb25zdCBsb2NhbEF1dGggPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnYXV0aCcpO1xuICAgIGlmICghbG9jYWxBdXRoKSB7XG4gICAgICByZXR1cm4gdGhpcy5sb2dvdXQoKTtcbiAgICB9XG4gICAgY29uc3QgeyB1c2VyLCB0b2tlbiB9ID0gSlNPTi5wYXJzZShsb2NhbEF1dGgpO1xuICAgIHRoaXMuX3Rva2VuID0gbmV3IEp3dCh0b2tlbik7XG4gICAgdGhpcy5fdXNlciA9IHRoaXMudXNlclNlcnZpY2UuY3JlYXRlKHVzZXIpO1xuICAgIHRoaXMuX3VzZXIkLm5leHQodGhpcy5fdXNlcik7XG4gIH1cblxuICBwdWJsaWMgbG9naW4odXNlcm5hbWU6IHN0cmluZywgcGFzc3dvcmQ6IHN0cmluZyk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHBheWxvYWQ6IHsgW19pbmRleDogc3RyaW5nXTogc3RyaW5nIH0gPSB7fTtcbiAgICBwYXlsb2FkW3RoaXMuX3BhcmFtcy5sb2dpbkZpZWxkXSA9IHVzZXJuYW1lO1xuICAgIHBheWxvYWRbdGhpcy5fcGFyYW1zLnBhc3N3b3JkRmllbGRdID0gcGFzc3dvcmQ7XG4gICAgcmV0dXJuIHRoaXMuX2h0dHAucG9zdDxJSnd0UmVzcG9uc2VKc29uPih0aGlzLmxvZ2luVXJsLCBwYXlsb2FkKS5waXBlKFxuICAgICAgdGFwKCh0b2spID0+IHtcbiAgICAgICAgdGhpcy5fdG9rZW4gPSBuZXcgSnd0KHRvayk7XG4gICAgICAgIHRoaXMuc2F2ZUF1dGgoKTtcbiAgICAgIH0pLFxuICAgICAgc3dpdGNoTWFwKCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuX3Rva2VuLmRhdGEgJiYgdGhpcy5fdG9rZW4uZGF0YS51c2VyX2lkKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMudXNlclNlcnZpY2UuZmV0Y2godGhpcy5fdG9rZW4uZGF0YSEudXNlcl9pZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gJ0ludmFsaWQgdG9rZW4nKTtcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgICB0YXAoKHVzZXI6IFVzZXIpID0+IHtcbiAgICAgICAgdGhpcy5fdXNlciA9IHVzZXI7XG4gICAgICAgIHRoaXMuc2F2ZUF1dGgoKTtcbiAgICAgIH0pLFxuICAgICAgbWFwKCgpID0+IHRydWUpLFxuICAgICAgY2F0Y2hFcnJvcigoZXJyb3I6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmxvZ291dCgpO1xuICAgICAgICByZXR1cm4gb2YoZmFsc2UpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHVibGljIHNhdmVBdXRoKCkge1xuICAgIGlmICh0aGlzLmlzQW5vbnltb3VzKSB7XG4gICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgnYXV0aCcpO1xuICAgICAgdGhpcy5fdXNlciQubmV4dChudWxsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXG4gICAgICAgICdhdXRoJyxcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgIHVzZXI6IHRoaXMuX3VzZXIudG9Kc29uKCksXG4gICAgICAgICAgdG9rZW46IHRoaXMuX3Rva2VuLnRvSnNvbigpLFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICAgIHRoaXMuX3VzZXIkLm5leHQodGhpcy5fdXNlcik7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlZnJlc2goKTogT2JzZXJ2YWJsZTxJSnd0UmVmcmVzaFJlc3BvbnNlSnNvbiB8IG51bGw+IHtcbiAgICBjb25zb2xlLmxvZygnc2VydmljZSB0b2tlbiByZWZyZXNoJyk7XG4gICAgaWYgKCF0aGlzLl90b2tlbi5yZWZyZXNoKSB7XG4gICAgICB0aGlzLmxvZ291dCgpO1xuICAgICAgcmV0dXJuIG9mKG51bGwpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5faHR0cFxuICAgICAgLnBvc3Q8SUp3dFJlZnJlc2hSZXNwb25zZUpzb24+KHRoaXMucmVmcmVzaFVybCwge1xuICAgICAgICByZWZyZXNoOiB0aGlzLl90b2tlbi5yZWZyZXNoIGFzIHN0cmluZyxcbiAgICAgIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyLCBjYXVnaHQpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdUb2tlbiByZWZyZXNoIGVycm9yJywgZXJyLCBjYXVnaHQpO1xuICAgICAgICAgIHRoaXMubG9nb3V0KCk7XG4gICAgICAgICAgdGhpcy5fbXNncy53YXJuaW5nKCdWb3VzIGRldmV6IHZvdXMgcmVjb25uZWN0ZXInKTtcbiAgICAgICAgICB0aGlzLl9yb3V0ZXIubmF2aWdhdGUodGhpcy5fcGFyYW1zLmxvZ2luUm91dGUpO1xuICAgICAgICAgIHJldHVybiBvZihudWxsKTtcbiAgICAgICAgfSksXG4gICAgICAgIHRhcCgodG9rKSA9PiB7XG4gICAgICAgICAgaWYgKHRvaykge1xuICAgICAgICAgICAgdGhpcy5fdG9rZW4gPSBuZXcgSnd0KHtcbiAgICAgICAgICAgICAgYWNjZXNzOiB0b2suYWNjZXNzLFxuICAgICAgICAgICAgICByZWZyZXNoOiB0aGlzLl90b2tlbi5yZWZyZXNoISxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5zYXZlQXV0aCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICk7XG4gIH1cbn1cbiJdfQ==
211
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGF0YS9zcmMvbGliL2F1dGgvYXV0aC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2RCxPQUFPLEVBSUwsR0FBRyxHQUNKLE1BQU0sT0FBTyxDQUFDO0FBRWYsT0FBTyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2pFLE9BQU8sRUFBYyxFQUFFLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQXdCakU7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLGNBQWMsQ0FDaEQsa0JBQWtCLENBQ25CLENBQUM7QUFDRixNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyxJQUFJLGNBQWMsQ0FDdEQsd0JBQXdCLENBQ3pCLENBQUM7QUFFSyxJQUFNLGVBQWUsR0FBckIsTUFBTSxlQUFlO0lBVTFCLFlBQ3lDLFdBQXdCLEVBQzdCLE9BQW1CLEVBQzdDLE9BQWUsRUFDZixLQUFpQixFQUNqQixLQUF5QjtRQUpNLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQzdCLFlBQU8sR0FBUCxPQUFPLENBQVk7UUFDN0MsWUFBTyxHQUFQLE9BQU8sQ0FBUTtRQUNmLFVBQUssR0FBTCxLQUFLLENBQVk7UUFDakIsVUFBSyxHQUFMLEtBQUssQ0FBb0I7UUFUM0IsV0FBTSxHQUFHLElBQUksYUFBYSxDQUFjLENBQUMsQ0FBQyxDQUFDO1FBV2pELElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUNuQixDQUFDO0lBRUQsSUFBVyxXQUFXO1FBQ3BCLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUM3QixD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R0FBRyxDQUFDLENBQUM7Z0JBQ2YsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xCLENBQUMsQ0FBQyxDQUNILENBQUM7U0FDTDthQUFNO1lBQ0wsT0FBTyxVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNyQixPQUFPLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBRSxDQUFDO1lBQ25DLENBQUMsQ0FBQyxDQUFDO1NBQ0o7SUFDSCxDQUFDO0NBQ0YsQ0FBQTtBQXZRWSxlQUFlO0lBV3ZCLFdBQUEsTUFBTSxDQUFDLHNCQUFzQixDQUFDLENBQUE7SUFDOUIsV0FBQSxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtHQVpoQixlQUFlLENBdVEzQjtTQXZRWSxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3Rpb25Ub2tlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgSUp3dEJhc2VEYXRhLFxuICBJSnd0UmVmcmVzaFJlc3BvbnNlSnNvbixcbiAgSUp3dFJlc3BvbnNlSnNvbixcbiAgSnd0LFxufSBmcm9tICcuL2p3dCc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgbWFwLCBzd2l0Y2hNYXAsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IE9ic2VydmFibGUsIG9mLCBSZXBsYXlTdWJqZWN0LCB0aHJvd0Vycm9yIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBEYXRhTW9kZWwgfSBmcm9tICcuLi9kYXRhL2RhdGEtbW9kZWwnO1xuaW1wb3J0IHsgQ29sbGVjdGlvbiB9IGZyb20gJy4uL2RhdGEvZGF0YS1jb2xsZWN0aW9uJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBEYXRhTWVzc2FnZVNlcnZpY2UgfSBmcm9tICcuLi9tZXNzYWdlcy9tZXNzYWdlLnNlcnZpY2UnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEF1dGhQYXJhbXMge1xuICB0b2tlblVybDogc3RyaW5nO1xuICB0b2tlblJlZnJlc2hVcmw6IHN0cmluZztcbiAgcmVxdWVzdFJlYWN0aXZhdGVVcmw/OiBzdHJpbmc7XG4gIHByb2Nlc3NSZWFjdGl2YXRlVXJsPzogc3RyaW5nO1xuICByZXF1ZXN0UHdSZXNldFVybD86IHN0cmluZztcbiAgcHJvY2Vzc1B3UmVzZXRVcmw/OiBzdHJpbmc7XG4gIGxvZ2luRmllbGQ6IHN0cmluZztcbiAgcGFzc3dvcmRGaWVsZDogc3RyaW5nO1xuICB0b2tlbkZpZWxkOiBzdHJpbmc7XG4gIGxvZ2luUm91dGU6IHN0cmluZ1tdO1xuICBsb2dvdXRSb3V0ZTogc3RyaW5nW107XG4gIHB3cmVzZXRSb3V0ZT86IHN0cmluZ1tdO1xuICByZWFjdGl2YXRlUm91dGU/OiBzdHJpbmdbXTtcbiAgdXNlckZldGNoRmllbGRzPzogc3RyaW5nW107XG4gIHVzZXJGZXRjaFZhbGlkaXR5U2Vjb25kcz86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBEQVRBX0FQSV9VUkw6IHN0b3JlcyBkYXRhIGFwaSBiYXNlIHVybFxuICovXG5leHBvcnQgY29uc3QgREFUQV9BVVRIX1BBUkFNUyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxBdXRoUGFyYW1zPihcbiAgJ2RhdGEuYXV0aC5wYXJhbXMnXG4pO1xuZXhwb3J0IGNvbnN0IERBVEFfQVVUSF9VU0VSX1NFUlZJQ0UgPSBuZXcgSW5qZWN0aW9uVG9rZW48Q29sbGVjdGlvbjxhbnk+PihcbiAgJ2RhdGEuYXV0aC51c2VyLnNlcnZpY2UnXG4pO1xuXG5leHBvcnQgY2xhc3MgQXV0aFNlcnZpY2VCYXNlPFxuICBVc2VyIGV4dGVuZHMgRGF0YU1vZGVsLFxuICBVc2VyU2VydmljZSBleHRlbmRzIENvbGxlY3Rpb248VXNlcj4sXG4gIFVzZXJEYXRhIGV4dGVuZHMgSUp3dEJhc2VEYXRhXG4+IHtcbiAgcHJpdmF0ZSBfdXNlciE6IFVzZXI7XG4gIHByaXZhdGUgX3VzZXIkID0gbmV3IFJlcGxheVN1YmplY3Q8VXNlciB8IG51bGw+KDEpO1xuICBwcml2YXRlIF90b2tlbiE6IEp3dDxVc2VyRGF0YT47XG4gIHByaXZhdGUgX2ZldGNoZWQ/OiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChEQVRBX0FVVEhfVVNFUl9TRVJWSUNFKSBwdWJsaWMgdXNlclNlcnZpY2U6IFVzZXJTZXJ2aWNlLFxuICAgIEBJbmplY3QoREFUQV9BVVRIX1BBUkFNUykgcHJpdmF0ZSBfcGFyYW1zOiBBdXRoUGFyYW1zLFxuICAgIHByaXZhdGUgX3JvdXRlcjogUm91dGVyLFxuICAgIHByaXZhdGUgX2h0dHA6IEh0dHBDbGllbnQsXG4gICAgcHJpdmF0ZSBfbXNnczogRGF0YU1lc3NhZ2VTZXJ2aWNlXG4gICkge1xuICAgIHRoaXMuYXV0b0xvZ2luKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzQW5vbnltb3VzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5fdG9rZW4uYWNjZXNzO1xuICB9XG5cbiAgcHVibGljIGdldCBhY2Nlc3NUb2tlbigpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fdG9rZW4uYWNjZXNzID8gdGhpcy5fdG9rZW4uYWNjZXNzIDogbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcmVmcmVzaFRva2VuKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl90b2tlbi5yZWZyZXNoID8gdGhpcy5fdG9rZW4ucmVmcmVzaCA6IG51bGw7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGN1cnJlbnRVc2VyKCk6IFVzZXIgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fdXNlciAmJiB0aGlzLl91c2VyLmlkID8gdGhpcy5fdXNlciA6IG51bGw7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGN1cnJlbnRVc2VyJCgpOiBPYnNlcnZhYmxlPFVzZXIgfCBudWxsPiB7XG4gICAgLy8gTmVlZHMgcmVmcmVzaCA/XG4gICAgaWYgKFxuICAgICAgIXRoaXMuX2ZldGNoZWQgfHxcbiAgICAgIERhdGUubm93KCkgLSB0aGlzLl9mZXRjaGVkID5cbiAgICAgICAgKHRoaXMuX3BhcmFtcy51c2VyRmV0Y2hWYWxpZGl0eVNlY29uZHMgfHwgMzYwMCkgKiAxMDAwXG4gICAgKSB7XG4gICAgICB0aGlzLl9mZXRjaGVkID0gRGF0ZS5ub3coKTtcbiAgICAgIHJldHVybiB0aGlzLl9mZXRjaFVzZXIoKS5waXBlKFxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT4ge1xuICAgICAgICAgIHJldHVybiB0aGlzLl91c2VyJC5hc09ic2VydmFibGUoKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl91c2VyJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcmVmcmVzaFVybCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLl9wYXJhbXMudG9rZW5SZWZyZXNoVXJsfWA7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGxvZ2luVXJsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuX3BhcmFtcy50b2tlblVybH1gO1xuICB9XG5cbiAgcHVibGljIGdldCBsb2dpblJvdXRlKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fcGFyYW1zLmxvZ2luUm91dGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGxvZ291dFJvdXRlKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fcGFyYW1zLmxvZ291dFJvdXRlO1xuICB9XG5cbiAgcHVibGljIGdldCBwd3Jlc2V0Um91dGUoKTogc3RyaW5nW10gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9wYXJhbXMucHdyZXNldFJvdXRlO1xuICB9XG5cbiAgcHVibGljIGdldCByZWFjdGl2YXRlUm91dGUoKTogc3RyaW5nW10gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9wYXJhbXMucmVhY3RpdmF0ZVJvdXRlO1xuICB9XG5cbiAgcHVibGljIGxvZ291dCgpOiB2b2lkIHtcbiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgnYXV0aCcpO1xuICAgIHRoaXMuX3Rva2VuID0gbmV3IEp3dCgpO1xuICAgIHRoaXMuX3VzZXIgPSB0aGlzLnVzZXJTZXJ2aWNlLmNyZWF0ZSgpO1xuICAgIHRoaXMuX3VzZXIkLm5leHQobnVsbCk7XG4gIH1cblxuICBwdWJsaWMgYXV0b0xvZ2luKCk6IHZvaWQge1xuICAgIGNvbnN0IGxvY2FsQXV0aCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdhdXRoJyk7XG4gICAgaWYgKCFsb2NhbEF1dGgpIHtcbiAgICAgIHJldHVybiB0aGlzLmxvZ291dCgpO1xuICAgIH1cbiAgICBjb25zdCB7IHVzZXIsIGZldGNoZWQsIHRva2VuIH0gPSBKU09OLnBhcnNlKGxvY2FsQXV0aCk7XG4gICAgdGhpcy5fdG9rZW4gPSBuZXcgSnd0KHRva2VuKTtcbiAgICB0aGlzLl91c2VyID0gdGhpcy51c2VyU2VydmljZS5jcmVhdGUodXNlcik7XG4gICAgdGhpcy5fZmV0Y2hlZCA9IGZldGNoZWQ7XG4gICAgdGhpcy5fdXNlciQubmV4dCh0aGlzLl91c2VyKTtcbiAgfVxuXG4gIHB1YmxpYyBsb2dpbihcbiAgICB1c2VybmFtZTogc3RyaW5nLFxuICAgIHBhc3N3b3JkOiBzdHJpbmdcbiAgKTogT2JzZXJ2YWJsZTwnc3VjY2VzcycgfCAnZXJyb3InIHwgJ2ludmFsaWRfdG9rZW4nIHwgc3RyaW5nPiB7XG4gICAgY29uc3QgcGF5bG9hZDogeyBbX2luZGV4OiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9O1xuICAgIHBheWxvYWRbdGhpcy5fcGFyYW1zLmxvZ2luRmllbGRdID0gdXNlcm5hbWU7XG4gICAgcGF5bG9hZFt0aGlzLl9wYXJhbXMucGFzc3dvcmRGaWVsZF0gPSBwYXNzd29yZDtcbiAgICByZXR1cm4gdGhpcy5faHR0cC5wb3N0PElKd3RSZXNwb25zZUpzb24+KHRoaXMubG9naW5VcmwsIHBheWxvYWQpLnBpcGUoXG4gICAgICB0YXAoKHRvaykgPT4ge1xuICAgICAgICB0aGlzLl90b2tlbiA9IG5ldyBKd3QodG9rKTtcbiAgICAgICAgdGhpcy5zYXZlQXV0aCgpO1xuICAgICAgfSksXG4gICAgICBzd2l0Y2hNYXAoKCkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmV0Y2hVc2VyKCk7XG4gICAgICB9KSxcbiAgICAgIG1hcCgoKSA9PiAnc3VjY2VzcycpLFxuICAgICAgY2F0Y2hFcnJvcigoZXJyb3I6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmxvZ291dCgpO1xuICAgICAgICBjb25zdCBjb2RlID0gZXJyb3IuZXJyb3I/LmNvZGUgfHwgZXJyb3I/LmNvZGUgfHwgJ2Vycm9yJztcbiAgICAgICAgY29uc29sZS5lcnJvcihjb2RlLCBlcnJvcik7XG4gICAgICAgIHJldHVybiBvZihjb2RlKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyByZXF1ZXN0UmVhY3RpdmF0ZSh1c2VybmFtZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgaWYgKHRoaXMuX3BhcmFtcy5yZXF1ZXN0UmVhY3RpdmF0ZVVybCkge1xuICAgICAgY29uc3QgcGF5bG9hZDogeyBbX2luZGV4OiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9O1xuICAgICAgcGF5bG9hZFt0aGlzLl9wYXJhbXMubG9naW5GaWVsZF0gPSB1c2VybmFtZTtcbiAgICAgIHJldHVybiB0aGlzLl9odHRwXG4gICAgICAgIC5wb3N0PGFueT4odGhpcy5fcGFyYW1zLnJlcXVlc3RSZWFjdGl2YXRlVXJsLCBwYXlsb2FkKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICBtYXAoKCkgPT4gdHJ1ZSksXG4gICAgICAgICAgY2F0Y2hFcnJvcigoKSA9PiBvZihmYWxzZSkpXG4gICAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBvZihmYWxzZSk7XG4gIH1cblxuICBwdWJsaWMgcmVxdWVzdFB3UmVzZXQodXNlcm5hbWU6IHN0cmluZyk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIGlmICh0aGlzLl9wYXJhbXMucmVxdWVzdFB3UmVzZXRVcmwpIHtcbiAgICAgIGNvbnN0IHBheWxvYWQ6IHsgW19pbmRleDogc3RyaW5nXTogc3RyaW5nIH0gPSB7fTtcbiAgICAgIHBheWxvYWRbdGhpcy5fcGFyYW1zLmxvZ2luRmllbGRdID0gdXNlcm5hbWU7XG4gICAgICByZXR1cm4gdGhpcy5faHR0cC5wb3N0PGFueT4odGhpcy5fcGFyYW1zLnJlcXVlc3RQd1Jlc2V0VXJsLCBwYXlsb2FkKS5waXBlKFxuICAgICAgICBtYXAoKCkgPT4gdHJ1ZSksXG4gICAgICAgIGNhdGNoRXJyb3IoKCkgPT4gb2YoZmFsc2UpKVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIG9mKGZhbHNlKTtcbiAgfVxuXG4gIHB1YmxpYyBwcm9jZXNzUmVhY3RpdmF0ZShcbiAgICB1c2VybmFtZTogc3RyaW5nLFxuICAgIHRva2VuOiBzdHJpbmdcbiAgKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgaWYgKHRoaXMuX3BhcmFtcy5wcm9jZXNzUmVhY3RpdmF0ZVVybCkge1xuICAgICAgY29uc3QgcGF5bG9hZDogeyBbX2luZGV4OiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9O1xuICAgICAgcGF5bG9hZFt0aGlzLl9wYXJhbXMubG9naW5GaWVsZF0gPSB1c2VybmFtZTtcbiAgICAgIHBheWxvYWRbdGhpcy5fcGFyYW1zLnRva2VuRmllbGRdID0gdG9rZW47XG4gICAgICByZXR1cm4gdGhpcy5faHR0cFxuICAgICAgICAucG9zdDxhbnk+KHRoaXMuX3BhcmFtcy5wcm9jZXNzUmVhY3RpdmF0ZVVybCwgcGF5bG9hZClcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgbWFwKCgpID0+IHRydWUpLFxuICAgICAgICAgIGNhdGNoRXJyb3IoKCkgPT4gb2YoZmFsc2UpKVxuICAgICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gb2YoZmFsc2UpO1xuICB9XG5cbiAgcHVibGljIHByb2Nlc3NQd1Jlc2V0KFxuICAgIHVzZXJuYW1lOiBzdHJpbmcsXG4gICAgcGFzc3dvcmQ6IHN0cmluZyxcbiAgICB0b2tlbjogc3RyaW5nXG4gICk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIGlmICh0aGlzLl9wYXJhbXMucHJvY2Vzc1B3UmVzZXRVcmwpIHtcbiAgICAgIGNvbnN0IHBheWxvYWQ6IHsgW19pbmRleDogc3RyaW5nXTogc3RyaW5nIH0gPSB7fTtcbiAgICAgIHBheWxvYWRbdGhpcy5fcGFyYW1zLmxvZ2luRmllbGRdID0gdXNlcm5hbWU7XG4gICAgICBwYXlsb2FkW3RoaXMuX3BhcmFtcy5wYXNzd29yZEZpZWxkXSA9IHBhc3N3b3JkO1xuICAgICAgcGF5bG9hZFt0aGlzLl9wYXJhbXMudG9rZW5GaWVsZF0gPSB0b2tlbjtcbiAgICAgIHJldHVybiB0aGlzLl9odHRwLnBvc3Q8YW55Pih0aGlzLl9wYXJhbXMucHJvY2Vzc1B3UmVzZXRVcmwsIHBheWxvYWQpLnBpcGUoXG4gICAgICAgIG1hcCgoKSA9PiB0cnVlKSxcbiAgICAgICAgY2F0Y2hFcnJvcigoKSA9PiBvZihmYWxzZSkpXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gb2YoZmFsc2UpO1xuICB9XG5cbiAgcHVibGljIHNhdmVBdXRoKCkge1xuICAgIGlmICh0aGlzLmlzQW5vbnltb3VzKSB7XG4gICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgnYXV0aCcpO1xuICAgICAgdGhpcy5fdXNlciQubmV4dChudWxsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXG4gICAgICAgICdhdXRoJyxcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgIHVzZXI6IHRoaXMuX3VzZXIudG9Kc29uKCksXG4gICAgICAgICAgZmV0Y2hlZDogRGF0ZS5ub3coKSxcbiAgICAgICAgICB0b2tlbjogdGhpcy5fdG9rZW4udG9Kc29uKCksXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgICAgdGhpcy5fdXNlciQubmV4dCh0aGlzLl91c2VyKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVmcmVzaCgpOiBPYnNlcnZhYmxlPElKd3RSZWZyZXNoUmVzcG9uc2VKc29uIHwgbnVsbD4ge1xuICAgIGlmICghdGhpcy5fdG9rZW4ucmVmcmVzaCkge1xuICAgICAgdGhpcy5sb2dvdXQoKTtcbiAgICAgIHJldHVybiBvZihudWxsKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2h0dHBcbiAgICAgIC5wb3N0PElKd3RSZWZyZXNoUmVzcG9uc2VKc29uPih0aGlzLnJlZnJlc2hVcmwsIHtcbiAgICAgICAgcmVmcmVzaDogdGhpcy5fdG9rZW4ucmVmcmVzaCBhcyBzdHJpbmcsXG4gICAgICB9KVxuICAgICAgLnBpcGUoXG4gICAgICAgIGNhdGNoRXJyb3IoKGVyciwgY2F1Z2h0KSA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignVG9rZW4gcmVmcmVzaCBlcnJvcicsIGVyciwgY2F1Z2h0KTtcbiAgICAgICAgICB0aGlzLmxvZ291dCgpO1xuICAgICAgICAgIHRoaXMuX21zZ3Mud2FybmluZygnVm91cyBkZXZleiB2b3VzIHJlY29ubmVjdGVyJyk7XG4gICAgICAgICAgdGhpcy5fcm91dGVyLm5hdmlnYXRlKHRoaXMuX3BhcmFtcy5sb2dpblJvdXRlKTtcbiAgICAgICAgICByZXR1cm4gb2YobnVsbCk7XG4gICAgICAgIH0pLFxuICAgICAgICB0YXAoKHRvaykgPT4ge1xuICAgICAgICAgIGlmICh0b2spIHtcbiAgICAgICAgICAgIHRoaXMuX3Rva2VuID0gbmV3IEp3dCh7XG4gICAgICAgICAgICAgIGFjY2VzczogdG9rLmFjY2VzcyxcbiAgICAgICAgICAgICAgcmVmcmVzaDogdGhpcy5fdG9rZW4ucmVmcmVzaCEsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuc2F2ZUF1dGgoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBfZmV0Y2hVc2VyKCk6IE9ic2VydmFibGU8VXNlcj4ge1xuICAgIGlmICh0aGlzLl90b2tlbi5kYXRhICYmIHRoaXMuX3Rva2VuLmRhdGEudXNlcl9pZCkge1xuICAgICAgLy8gRmV0Y2ggdXNlciBkYXRhIHVzaW5nIHRva2VuXG4gICAgICByZXR1cm4gdGhpcy51c2VyU2VydmljZVxuICAgICAgICAuZmV0Y2godGhpcy5fdG9rZW4uZGF0YSEudXNlcl9pZCwge1xuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgZmllbGRzOiAoXG4gICAgICAgICAgICAgIHRoaXMuX3BhcmFtcy51c2VyRmV0Y2hGaWVsZHMgfHwgW1xuICAgICAgICAgICAgICAgICdpZCcsXG4gICAgICAgICAgICAgICAgJ3VzZXJuYW1lJyxcbiAgICAgICAgICAgICAgICAnZW1haWwnLFxuICAgICAgICAgICAgICAgICdsYXN0X25hbWUnLFxuICAgICAgICAgICAgICAgICdmaXJzdF9uYW1lJyxcbiAgICAgICAgICAgICAgICAnaXNfc3VwZXJ1c2VyJyxcbiAgICAgICAgICAgICAgICAnaXNfYWN0aXZlJyxcbiAgICAgICAgICAgICAgICAnaXNfc3RhZmYnLFxuICAgICAgICAgICAgICAgICdsYXN0X2xvZ2luJyxcbiAgICAgICAgICAgICAgICAnY3VycmVudF9ncm91cHNfc2x1Z3MnLFxuICAgICAgICAgICAgICBdXG4gICAgICAgICAgICApLmpvaW4oJywnKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KVxuICAgICAgICAucGlwZShcbiAgICAgICAgICB0YXAoKHUpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3VzZXIgPSB1O1xuICAgICAgICAgICAgdGhpcy5zYXZlQXV0aCgpO1xuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IHtcbiAgICAgICAgcmV0dXJuIHsgY29kZTogJ2ludmFsaWRfdG9rZW4nIH07XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -112,9 +112,9 @@ export class DataBackend {
112
112
  return this._cachedGet(collection, url, { headers, params });
113
113
  }
114
114
  }
115
- DataBackend.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.3", ngImport: i0, type: DataBackend, deps: [{ token: i1.HttpClient }, { token: i2.TransferState }, { token: PLATFORM_ID }, { token: DATA_API_URL }, { token: DATA_MAX_TRANSFERSTATE_TIME, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
116
- DataBackend.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.0.3", ngImport: i0, type: DataBackend, providedIn: 'root' });
117
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.3", ngImport: i0, type: DataBackend, decorators: [{
115
+ DataBackend.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: DataBackend, deps: [{ token: i1.HttpClient }, { token: i2.TransferState }, { token: PLATFORM_ID }, { token: DATA_API_URL }, { token: DATA_MAX_TRANSFERSTATE_TIME, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
116
+ DataBackend.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: DataBackend, providedIn: 'root' });
117
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: DataBackend, decorators: [{
118
118
  type: Injectable,
119
119
  args: [{
120
120
  providedIn: 'root',
@@ -27,9 +27,9 @@ export class ChoicePipe {
27
27
  return `[${fvalue}] ??`;
28
28
  }
29
29
  }
30
- ChoicePipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.3", ngImport: i0, type: ChoicePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
31
- ChoicePipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "15.0.3", ngImport: i0, type: ChoicePipe, isStandalone: true, name: "choice" });
32
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.3", ngImport: i0, type: ChoicePipe, decorators: [{
30
+ ChoicePipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: ChoicePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
31
+ ChoicePipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "15.0.4", ngImport: i0, type: ChoicePipe, isStandalone: true, name: "choice" });
32
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: ChoicePipe, decorators: [{
33
33
  type: Pipe,
34
34
  args: [{
35
35
  name: 'choice',
@@ -67,9 +67,9 @@ export class PChoicePipe {
67
67
  return `[${fvalue}] ??`;
68
68
  }
69
69
  }
70
- PChoicePipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.3", ngImport: i0, type: PChoicePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
71
- PChoicePipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "15.0.3", ngImport: i0, type: PChoicePipe, isStandalone: true, name: "pchoice" });
72
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.3", ngImport: i0, type: PChoicePipe, decorators: [{
70
+ PChoicePipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: PChoicePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
71
+ PChoicePipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "15.0.4", ngImport: i0, type: PChoicePipe, isStandalone: true, name: "pchoice" });
72
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: PChoicePipe, decorators: [{
73
73
  type: Pipe,
74
74
  args: [{
75
75
  name: 'pchoice',
@@ -418,9 +418,9 @@ export class DispeditComponent {
418
418
  }
419
419
  _setDisplayClasses() { }
420
420
  }
421
- DispeditComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.3", ngImport: i0, type: DispeditComponent, deps: [{ token: DATA_DISPLAY_CONFIG, optional: true }, { token: i1.DataMessageService }], target: i0.ɵɵFactoryTarget.Component });
422
- DispeditComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.3", type: DispeditComponent, isStandalone: true, selector: "data-dispedit", inputs: { model: "model", field: "field", form: "form", edit: "edit", editable: "editable", mode: "mode", choices: "choices", inputClasses: "inputClasses", editor: "editor", viewer: "viewer", default: "default", placeholder: "placeholder", help: "help", hideLabel: "hideLabel", queryset: "queryset", collection: "collection", display: "display", filter: "filter" }, outputs: { changed: "changed" }, usesOnChanges: true, ngImport: i0, template: "\n<ng-template #titleTpl>\n <ng-content></ng-content>\n</ng-template>\n<ng-template #dispTpl>\n <ng-container [ngSwitch]=\"realDisplay\"><span class=\"editable disp-text\" *ngSwitchCase=\"'text'\" (click)=\"enableEditMode()\">{{txtValue}}</span><span class=\"editable disp-choice\" *ngSwitchCase=\"'choice'\" (click)=\"enableEditMode()\">{{txtValue}}</span><span class=\"editable disp-decimal\" *ngSwitchCase=\"'decimal'\" (click)=\"enableEditMode()\">{{txtValue}}</span><span class=\"editable disp-boolean\" *ngSwitchCase=\"'boolean'\" (click)=\"enableEditMode()\">{{txtValue}}</span><span class=\"editable disp-fkdetails\" *ngSwitchCase=\"'fkdetails'\" (click)=\"enableEditMode()\">\n <div class=\"fkitem\">{{txtValue}}</div></span><span class=\"editable disp-m2mdetails\" *ngSwitchCase=\"'m2mdetails'\" (click)=\"enableEditMode()\">\n <div class=\"m2mitem\" *ngFor=\"let v of txtValues\">{{v}}</div></span><span class=\"editable disp-datetime\" *ngSwitchCase=\"'datetime'\" (click)=\"enableEditMode()\">\n <ng-container *ngIf=\"dispValue\">{{txtValue|date:'short'}}</ng-container>\n <ng-container *ngIf=\"!dispValue\">{{txtValue}}</ng-container></span><span class=\"editable disp-datetime\" *ngSwitchCase=\"'date'\" (click)=\"enableEditMode()\">\n <ng-container *ngIf=\"dispValue\">{{txtValue|date:'shortDate'}}</ng-container>\n <ng-container *ngIf=\"!dispValue\">{{txtValue}}</ng-container></span></ng-container>\n</ng-template>\n<ng-template #editTpl let-form=\"form\">\n <ng-container [ngSwitch]=\"realEditor\">\n <ng-container *ngSwitchCase=\"'input.text'\">\n <input type=\"text\" [formControl]=\"form.get(field)\" [ngClass]=\"inputClasses\" (keyup.escape)=\"unsetEdit()\" [placeholder]=\"realPlaceholder\">\n <div class=\"form-text\" *ngIf=\"realHelp\">{{realHelp}}<span class=\"ms-1\" *ngIf=\"required\">(requis)</span></div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['minlength']\">Trop court : {{$any(manager).minLength}} caract\u00E8res minimum...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['maxlength']\">Trop long : {{$any(manager).maxLength}} caract\u00E8res maximum...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['pattern']\">Format invalide...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['required']\">Ce champ est requis...</div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'input.email'\">\n <input type=\"email\" [formControl]=\"form.get(field)\" [ngClass]=\"inputClasses\" (keyup.escape)=\"unsetEdit()\" [placeholder]=\"realPlaceholder\">\n <div class=\"form-text\" *ngIf=\"realHelp\">{{realHelp}}<span class=\"ms-1\" *ngIf=\"required\">(requis)</span></div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['minlength']\">Trop court : {{$any(manager).minLength}} caract\u00E8res minimum...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['maxlength']\">Trop long : {{$any(manager).maxLength}} caract\u00E8res maximum...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['pattern']\">Format invalide...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['email']\">Format d'email invalide...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['required']\">Ce champ est requis...</div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'input.password'\">\n <input type=\"password\" [formControl]=\"form.get(field)\" [ngClass]=\"inputClasses\" (keyup.escape)=\"unsetEdit()\" [placeholder]=\"realPlaceholder\">\n <div class=\"form-text\" *ngIf=\"realHelp\">{{realHelp}}<span class=\"ms-1\" *ngIf=\"required\">(requis)</span></div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['minlength']\">Trop court : {{$any(manager).minLength}} caract\u00E8res minimum...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['maxlength']\">Trop long : {{$any(manager).maxLength}} caract\u00E8res maximum...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['pattern']\">Format invalide...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['required']\">Ce champ est requis...</div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'input.datetime'\">\n <input type=\"datetime-local\" [formControl]=\"form.get(field)\" [ngClass]=\"inputClasses\" (keyup.escape)=\"unsetEdit()\" (keyup.enter)=\"update()\">\n <div class=\"form-text\">{{realHelp}}</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['required']\">Ce champ est requis...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['minDate']\">Doit \u00EAtre post\u00E9rieur \u00E0 {{$any(manager).min|date:'short'}}...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['maxDate']\">Doit \u00EAtre ant\u00E9rieur \u00E0 {{$any(manager).max|date:'short'}}...</div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'input.date'\">\n <input type=\"date\" [formControl]=\"form.get(field)\" [ngClass]=\"inputClasses\" (keyup.escape)=\"unsetEdit()\" (keyup.enter)=\"update()\">\n <div class=\"form-text\">{{realHelp}}</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['required']\">Ce champ est requis...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['minDate']\">Doit \u00EAtre post\u00E9rieur \u00E0 {{$any(manager).min|date:'short'}}...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['maxDate']\">Doit \u00EAtre ant\u00E9rieur \u00E0 {{$any(manager).max|date:'short'}}...</div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'input.number'\">\n <input type=\"number\" [formControl]=\"form.get(field)\" [ngClass]=\"inputClasses\" (keyup.escape)=\"unsetEdit()\" [placeholder]=\"realPlaceholder\">\n <div class=\"form-text\" *ngIf=\"realHelp\">{{realHelp}}<span class=\"ms-1\" *ngIf=\"required\">(requis)</span></div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['min']\">Trop petit : minimum {{$any(manager).min}}...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['max']\">Trop grand : maximum {{$any(manager).max}}...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['required']\">Ce champ est requis...</div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'input.decimal'\">\n <input type=\"number\" [formControl]=\"form.get(field)\" [ngClass]=\"inputClasses\" (keyup.escape)=\"unsetEdit()\" [placeholder]=\"realPlaceholder\">\n <div class=\"form-text\" *ngIf=\"realHelp\">{{realHelp}}<span class=\"ms-1\" *ngIf=\"required\">(requis)</span></div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['min']\">Trop petit : minimum {{$any(manager).min}}...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['max']\">Trop grand : maximum {{$any(manager).max}}...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['required']\">Ce champ est requis...</div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'input.checkbox'\">\n <input class=\"form-check-input\" type=\"checkbox\" [formControl]=\"form.get(field)\" (keyup.escape)=\"unsetEdit()\" (change)=\"update()\">\n <div class=\"form-text\">{{realHelp}}</div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'textarea'\">\n <textarea [formControl]=\"form.get(field)\" (keyup.escape)=\"unsetEdit()\" [ngClass]=\"inputClasses\" (keyup.control.enter)=\"update()\" [placeholder]=\"realPlaceholder\"></textarea>\n <div class=\"form-text\" *ngIf=\"realHelp\">{{realHelp}}<span class=\"ms-1\" *ngIf=\"required\">(requis)</span></div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['minlength']\">Trop court : {{$any(manager).minLength}} caract\u00E8res minimum...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['maxlength']\">Trop long : {{$any(manager).maxLength}} caract\u00E8res maximum...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['pattern']\">Format invalide...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['required']\">Ce champ est requis...</div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'fkselect'\">\n <data-fkselect [collection]=\"collection\" [filter]=\"filter\" (selected)=\"selectedRefItem($event)\" [placeholder]=\"placeholder\" (cancelled)=\"unsetEdit()\" (cleared)=\"selectedRefItem(null)\"></data-fkselect>\n </ng-container>\n <ng-container *ngSwitchCase=\"'m2mselect'\">\n <data-m2mselect [collection]=\"collection\" [filter]=\"filter\" (changed)=\"update()\" [formControl]=\"form.get(field)\" (detailsChanged)=\"onM2MValuesChanges($event)\" [model]=\"model\" [field]=\"field\" [placeholder]=\"placeholder\"></data-m2mselect>\n </ng-container>\n <ng-container *ngSwitchCase=\"'select'\">\n <select [formControl]=\"form.get(field)\" (keyup.escape)=\"unsetEdit()\" (change)=\"update()\" [ngClass]=\"inputClasses\">\n <option *ngFor=\"let c of realChoices\" [ngValue]=\"c.value ? c.value : c\">{{c.desc ? c.desc : c}}</option>\n </select>\n <div class=\"form-text\">{{realHelp}}</div>\n </ng-container>\n </ng-container>\n</ng-template>\n<!-- Disp/edit toggler-->\n<ng-template #dispeditTpl>\n <ng-container *ngIf=\"!edit\">\n <ng-container *ngTemplateOutlet=\"dispTpl\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"edit\">\n <ng-container *ngIf=\"fg\">\n <form [formGroup]=\"fg\" (submit)=\"update()\">\n <ng-container *ngTemplateOutlet=\"editTpl; context: {form: fg}\"></ng-container>\n </form>\n </ng-container>\n </ng-container>\n</ng-template>\n<!-- DispEdit noform-->\n<ng-template #dispeditFormTpl>\n <ng-container *ngIf=\"!edit\">\n <ng-container *ngTemplateOutlet=\"dispTpl\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"edit\">\n <ng-container *ngIf=\"form\">\n <ng-container *ngTemplateOutlet=\"editTpl; context: {form: form}\"></ng-container>\n </ng-container>\n </ng-container>\n</ng-template>\n<!-- Dd display-->\n<ng-container *ngIf=\"mode==='dd'\">\n <dt [class.required]=\"required\" *ngIf=\"!hideLabel\"><span class=\"editable\" (click)=\"toggleEdit()\">\n <ng-container *ngTemplateOutlet=\"titleTpl\"></ng-container></span><span class=\"pointer float-end\" (click)=\"setDefault()\" *ngIf=\"realDefault!== undefined &amp;&amp; edit\"><i class=\"bi bi-trash ms-2\"></i></span></dt>\n <dd [class.mb-0]=\"hideLabel\">\n <ng-container *ngTemplateOutlet=\"dispeditTpl\"></ng-container>\n </dd>\n</ng-container>\n<!-- Inline display-->\n<ng-container *ngIf=\"mode==='inline'\">\n <ng-container *ngIf=\"!hideLabel\"><span class=\"pointer float-end\" (click)=\"setDefault()\" *ngIf=\"realDefault!== undefined &amp;&amp; edit\"><i class=\"bi bi-trash ms-2\"></i></span>\n <label [class.required]=\"required\">\n <ng-container *ngTemplateOutlet=\"titleTpl\"></ng-container>\n </label>\n </ng-container>\n <ng-container *ngTemplateOutlet=\"dispeditTpl\"></ng-container>\n</ng-container>\n<!-- Form display-->\n<ng-container *ngIf=\"mode==='form'\">\n <ng-container *ngIf=\"!hideLabel\"><span class=\"pointer float-end\" (click)=\"setDefault()\" *ngIf=\"realDefault!== undefined &amp;&amp; edit\"><i class=\"bi bi-trash ms-2\"></i></span>\n <label [class.required]=\"required\">\n <ng-container *ngTemplateOutlet=\"titleTpl\"></ng-container>\n </label>\n </ng-container>\n <ng-container *ngTemplateOutlet=\"dispeditFormTpl\"></ng-container>\n</ng-container>", styles: [".editable{cursor:pointer}form.inline{display:inline-block}.required{font-weight:700}.required:after{content:\" (*)\"}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i2.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "pipe", type: i2.DatePipe, name: "date" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i3.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i3.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: FkselectComponent, selector: "data-fkselect", inputs: ["model", "field", "edit", "value", "queryset", "collection", "update", "filter", "mode", "display", "search", "label", "placeholder", "inputClasses"], outputs: ["selected", "cancelled", "cleared"] }, { kind: "component", type: M2mselectComponent, selector: "data-m2mselect", inputs: ["model", "field", "edit", "values", "queryset", "collection", "filter", "mode", "display", "search", "label", "placeholder", "emptyLabel", "inputClasses"], outputs: ["added", "removed", "cancelled", "cleared", "detailsChanged", "changed"] }] });
423
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.3", ngImport: i0, type: DispeditComponent, decorators: [{
421
+ DispeditComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: DispeditComponent, deps: [{ token: DATA_DISPLAY_CONFIG, optional: true }, { token: i1.DataMessageService }], target: i0.ɵɵFactoryTarget.Component });
422
+ DispeditComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.4", type: DispeditComponent, isStandalone: true, selector: "data-dispedit", inputs: { model: "model", field: "field", form: "form", edit: "edit", editable: "editable", mode: "mode", choices: "choices", inputClasses: "inputClasses", editor: "editor", viewer: "viewer", default: "default", placeholder: "placeholder", help: "help", hideLabel: "hideLabel", queryset: "queryset", collection: "collection", display: "display", filter: "filter" }, outputs: { changed: "changed" }, usesOnChanges: true, ngImport: i0, template: "\n<ng-template #titleTpl>\n <ng-content></ng-content>\n</ng-template>\n<ng-template #dispTpl>\n <ng-container [ngSwitch]=\"realDisplay\"><span class=\"editable disp-text\" *ngSwitchCase=\"'text'\" (click)=\"enableEditMode()\">{{txtValue}}</span><span class=\"editable disp-choice\" *ngSwitchCase=\"'choice'\" (click)=\"enableEditMode()\">{{txtValue}}</span><span class=\"editable disp-decimal\" *ngSwitchCase=\"'decimal'\" (click)=\"enableEditMode()\">{{txtValue}}</span><span class=\"editable disp-boolean\" *ngSwitchCase=\"'boolean'\" (click)=\"enableEditMode()\">{{txtValue}}</span><span class=\"editable disp-fkdetails\" *ngSwitchCase=\"'fkdetails'\" (click)=\"enableEditMode()\">\n <div class=\"fkitem\">{{txtValue}}</div></span><span class=\"editable disp-m2mdetails\" *ngSwitchCase=\"'m2mdetails'\" (click)=\"enableEditMode()\">\n <div class=\"m2mitem\" *ngFor=\"let v of txtValues\">{{v}}</div></span><span class=\"editable disp-datetime\" *ngSwitchCase=\"'datetime'\" (click)=\"enableEditMode()\">\n <ng-container *ngIf=\"dispValue\">{{txtValue|date:'short'}}</ng-container>\n <ng-container *ngIf=\"!dispValue\">{{txtValue}}</ng-container></span><span class=\"editable disp-datetime\" *ngSwitchCase=\"'date'\" (click)=\"enableEditMode()\">\n <ng-container *ngIf=\"dispValue\">{{txtValue|date:'shortDate'}}</ng-container>\n <ng-container *ngIf=\"!dispValue\">{{txtValue}}</ng-container></span></ng-container>\n</ng-template>\n<ng-template #editTpl let-form=\"form\">\n <ng-container [ngSwitch]=\"realEditor\">\n <ng-container *ngSwitchCase=\"'input.text'\">\n <input type=\"text\" [formControl]=\"form.get(field)\" [ngClass]=\"inputClasses\" (keyup.escape)=\"unsetEdit()\" [placeholder]=\"realPlaceholder\">\n <div class=\"form-text\" *ngIf=\"realHelp\">{{realHelp}}<span class=\"ms-1\" *ngIf=\"required\">(requis)</span></div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['minlength']\">Trop court : {{$any(manager).minLength}} caract\u00E8res minimum...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['maxlength']\">Trop long : {{$any(manager).maxLength}} caract\u00E8res maximum...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['pattern']\">Format invalide...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['required']\">Ce champ est requis...</div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'input.email'\">\n <input type=\"email\" [formControl]=\"form.get(field)\" [ngClass]=\"inputClasses\" (keyup.escape)=\"unsetEdit()\" [placeholder]=\"realPlaceholder\">\n <div class=\"form-text\" *ngIf=\"realHelp\">{{realHelp}}<span class=\"ms-1\" *ngIf=\"required\">(requis)</span></div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['minlength']\">Trop court : {{$any(manager).minLength}} caract\u00E8res minimum...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['maxlength']\">Trop long : {{$any(manager).maxLength}} caract\u00E8res maximum...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['pattern']\">Format invalide...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['email']\">Format d'email invalide...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['required']\">Ce champ est requis...</div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'input.password'\">\n <input type=\"password\" [formControl]=\"form.get(field)\" [ngClass]=\"inputClasses\" (keyup.escape)=\"unsetEdit()\" [placeholder]=\"realPlaceholder\">\n <div class=\"form-text\" *ngIf=\"realHelp\">{{realHelp}}<span class=\"ms-1\" *ngIf=\"required\">(requis)</span></div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['minlength']\">Trop court : {{$any(manager).minLength}} caract\u00E8res minimum...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['maxlength']\">Trop long : {{$any(manager).maxLength}} caract\u00E8res maximum...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['pattern']\">Format invalide...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['required']\">Ce champ est requis...</div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'input.datetime'\">\n <input type=\"datetime-local\" [formControl]=\"form.get(field)\" [ngClass]=\"inputClasses\" (keyup.escape)=\"unsetEdit()\" (keyup.enter)=\"update()\">\n <div class=\"form-text\">{{realHelp}}</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['required']\">Ce champ est requis...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['minDate']\">Doit \u00EAtre post\u00E9rieur \u00E0 {{$any(manager).min|date:'short'}}...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['maxDate']\">Doit \u00EAtre ant\u00E9rieur \u00E0 {{$any(manager).max|date:'short'}}...</div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'input.date'\">\n <input type=\"date\" [formControl]=\"form.get(field)\" [ngClass]=\"inputClasses\" (keyup.escape)=\"unsetEdit()\" (keyup.enter)=\"update()\">\n <div class=\"form-text\">{{realHelp}}</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['required']\">Ce champ est requis...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['minDate']\">Doit \u00EAtre post\u00E9rieur \u00E0 {{$any(manager).min|date:'short'}}...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['maxDate']\">Doit \u00EAtre ant\u00E9rieur \u00E0 {{$any(manager).max|date:'short'}}...</div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'input.number'\">\n <input type=\"number\" [formControl]=\"form.get(field)\" [ngClass]=\"inputClasses\" (keyup.escape)=\"unsetEdit()\" [placeholder]=\"realPlaceholder\">\n <div class=\"form-text\" *ngIf=\"realHelp\">{{realHelp}}<span class=\"ms-1\" *ngIf=\"required\">(requis)</span></div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['min']\">Trop petit : minimum {{$any(manager).min}}...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['max']\">Trop grand : maximum {{$any(manager).max}}...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['required']\">Ce champ est requis...</div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'input.decimal'\">\n <input type=\"number\" [formControl]=\"form.get(field)\" [ngClass]=\"inputClasses\" (keyup.escape)=\"unsetEdit()\" [placeholder]=\"realPlaceholder\">\n <div class=\"form-text\" *ngIf=\"realHelp\">{{realHelp}}<span class=\"ms-1\" *ngIf=\"required\">(requis)</span></div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['min']\">Trop petit : minimum {{$any(manager).min}}...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['max']\">Trop grand : maximum {{$any(manager).max}}...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['required']\">Ce champ est requis...</div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'input.checkbox'\">\n <input class=\"form-check-input\" type=\"checkbox\" [formControl]=\"form.get(field)\" (keyup.escape)=\"unsetEdit()\" (change)=\"update()\">\n <div class=\"form-text\">{{realHelp}}</div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'textarea'\">\n <textarea [formControl]=\"form.get(field)\" (keyup.escape)=\"unsetEdit()\" [ngClass]=\"inputClasses\" (keyup.control.enter)=\"update()\" [placeholder]=\"realPlaceholder\"></textarea>\n <div class=\"form-text\" *ngIf=\"realHelp\">{{realHelp}}<span class=\"ms-1\" *ngIf=\"required\">(requis)</span></div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['minlength']\">Trop court : {{$any(manager).minLength}} caract\u00E8res minimum...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['maxlength']\">Trop long : {{$any(manager).maxLength}} caract\u00E8res maximum...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['pattern']\">Format invalide...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['required']\">Ce champ est requis...</div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'fkselect'\">\n <data-fkselect [collection]=\"collection\" [filter]=\"filter\" (selected)=\"selectedRefItem($event)\" [placeholder]=\"placeholder\" (cancelled)=\"unsetEdit()\" (cleared)=\"selectedRefItem(null)\"></data-fkselect>\n </ng-container>\n <ng-container *ngSwitchCase=\"'m2mselect'\">\n <data-m2mselect [collection]=\"collection\" [filter]=\"filter\" (changed)=\"update()\" [formControl]=\"form.get(field)\" (detailsChanged)=\"onM2MValuesChanges($event)\" [model]=\"model\" [field]=\"field\" [placeholder]=\"placeholder\"></data-m2mselect>\n </ng-container>\n <ng-container *ngSwitchCase=\"'select'\">\n <select [formControl]=\"form.get(field)\" (keyup.escape)=\"unsetEdit()\" (change)=\"update()\" [ngClass]=\"inputClasses\">\n <option *ngFor=\"let c of realChoices\" [ngValue]=\"c.value ? c.value : c\">{{c.desc ? c.desc : c}}</option>\n </select>\n <div class=\"form-text\">{{realHelp}}</div>\n </ng-container>\n </ng-container>\n</ng-template>\n<!-- Disp/edit toggler-->\n<ng-template #dispeditTpl>\n <ng-container *ngIf=\"!edit\">\n <ng-container *ngTemplateOutlet=\"dispTpl\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"edit\">\n <ng-container *ngIf=\"fg\">\n <form [formGroup]=\"fg\" (submit)=\"update()\">\n <ng-container *ngTemplateOutlet=\"editTpl; context: {form: fg}\"></ng-container>\n </form>\n </ng-container>\n </ng-container>\n</ng-template>\n<!-- DispEdit noform-->\n<ng-template #dispeditFormTpl>\n <ng-container *ngIf=\"!edit\">\n <ng-container *ngTemplateOutlet=\"dispTpl\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"edit\">\n <ng-container *ngIf=\"form\">\n <ng-container *ngTemplateOutlet=\"editTpl; context: {form: form}\"></ng-container>\n </ng-container>\n </ng-container>\n</ng-template>\n<!-- Dd display-->\n<ng-container *ngIf=\"mode==='dd'\">\n <dt [class.required]=\"required\" *ngIf=\"!hideLabel\"><span class=\"editable\" (click)=\"toggleEdit()\">\n <ng-container *ngTemplateOutlet=\"titleTpl\"></ng-container></span><span class=\"pointer float-end\" (click)=\"setDefault()\" *ngIf=\"realDefault!== undefined &amp;&amp; edit\"><i class=\"bi bi-trash ms-2\"></i></span></dt>\n <dd [class.mb-0]=\"hideLabel\">\n <ng-container *ngTemplateOutlet=\"dispeditTpl\"></ng-container>\n </dd>\n</ng-container>\n<!-- Inline display-->\n<ng-container *ngIf=\"mode==='inline'\">\n <ng-container *ngIf=\"!hideLabel\"><span class=\"pointer float-end\" (click)=\"setDefault()\" *ngIf=\"realDefault!== undefined &amp;&amp; edit\"><i class=\"bi bi-trash ms-2\"></i></span>\n <label [class.required]=\"required\">\n <ng-container *ngTemplateOutlet=\"titleTpl\"></ng-container>\n </label>\n </ng-container>\n <ng-container *ngTemplateOutlet=\"dispeditTpl\"></ng-container>\n</ng-container>\n<!-- Form display-->\n<ng-container *ngIf=\"mode==='form'\">\n <ng-container *ngIf=\"!hideLabel\"><span class=\"pointer float-end\" (click)=\"setDefault()\" *ngIf=\"realDefault!== undefined &amp;&amp; edit\"><i class=\"bi bi-trash ms-2\"></i></span>\n <label [class.required]=\"required\">\n <ng-container *ngTemplateOutlet=\"titleTpl\"></ng-container>\n </label>\n </ng-container>\n <ng-container *ngTemplateOutlet=\"dispeditFormTpl\"></ng-container>\n</ng-container>", styles: [".editable{cursor:pointer}form.inline{display:inline-block}.required{font-weight:700}.required:after{content:\" (*)\"}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i2.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "pipe", type: i2.DatePipe, name: "date" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i3.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i3.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: FkselectComponent, selector: "data-fkselect", inputs: ["model", "field", "edit", "value", "queryset", "collection", "update", "filter", "mode", "display", "search", "label", "placeholder", "inputClasses"], outputs: ["selected", "cancelled", "cleared"] }, { kind: "component", type: M2mselectComponent, selector: "data-m2mselect", inputs: ["model", "field", "edit", "values", "queryset", "collection", "filter", "mode", "display", "search", "label", "placeholder", "emptyLabel", "inputClasses"], outputs: ["added", "removed", "cancelled", "cleared", "detailsChanged", "changed"] }] });
423
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: DispeditComponent, decorators: [{
424
424
  type: Component,
425
425
  args: [{ selector: 'data-dispedit', standalone: true, imports: [
426
426
  CommonModule,
@@ -33,9 +33,9 @@ export class FactorPipe {
33
33
  return formatNumber(num / factor, locale, digitsInfo);
34
34
  }
35
35
  }
36
- FactorPipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.3", ngImport: i0, type: FactorPipe, deps: [{ token: LOCALE_ID }], target: i0.ɵɵFactoryTarget.Pipe });
37
- FactorPipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "15.0.3", ngImport: i0, type: FactorPipe, isStandalone: true, name: "factor" });
38
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.3", ngImport: i0, type: FactorPipe, decorators: [{
36
+ FactorPipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: FactorPipe, deps: [{ token: LOCALE_ID }], target: i0.ɵɵFactoryTarget.Pipe });
37
+ FactorPipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "15.0.4", ngImport: i0, type: FactorPipe, isStandalone: true, name: "factor" });
38
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: FactorPipe, decorators: [{
39
39
  type: Pipe,
40
40
  args: [{
41
41
  name: 'factor',
@@ -66,9 +66,9 @@ export class PFactorPipe {
66
66
  return formatNumber(num / factor, locale, digitsInfo);
67
67
  }
68
68
  }
69
- PFactorPipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.3", ngImport: i0, type: PFactorPipe, deps: [{ token: LOCALE_ID }], target: i0.ɵɵFactoryTarget.Pipe });
70
- PFactorPipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "15.0.3", ngImport: i0, type: PFactorPipe, isStandalone: true, name: "pfactor" });
71
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.3", ngImport: i0, type: PFactorPipe, decorators: [{
69
+ PFactorPipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: PFactorPipe, deps: [{ token: LOCALE_ID }], target: i0.ɵɵFactoryTarget.Pipe });
70
+ PFactorPipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "15.0.4", ngImport: i0, type: PFactorPipe, isStandalone: true, name: "pfactor" });
71
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: PFactorPipe, decorators: [{
72
72
  type: Pipe,
73
73
  args: [{
74
74
  name: 'pfactor',
@@ -32,9 +32,9 @@ export class FactorcPipe {
32
32
  return formatCurrency(num / factor, locale, currency, currencyCode, digitsInfo);
33
33
  }
34
34
  }
35
- FactorcPipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.3", ngImport: i0, type: FactorcPipe, deps: [{ token: LOCALE_ID }, { token: DEFAULT_CURRENCY_CODE }], target: i0.ɵɵFactoryTarget.Pipe });
36
- FactorcPipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "15.0.3", ngImport: i0, type: FactorcPipe, isStandalone: true, name: "factorc" });
37
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.3", ngImport: i0, type: FactorcPipe, decorators: [{
35
+ FactorcPipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: FactorcPipe, deps: [{ token: LOCALE_ID }, { token: DEFAULT_CURRENCY_CODE }], target: i0.ɵɵFactoryTarget.Pipe });
36
+ FactorcPipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "15.0.4", ngImport: i0, type: FactorcPipe, isStandalone: true, name: "factorc" });
37
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: FactorcPipe, decorators: [{
38
38
  type: Pipe,
39
39
  args: [{
40
40
  name: 'factorc',
@@ -81,9 +81,9 @@ export class PFactorcPipe {
81
81
  return formatCurrency(num / factor, locale, currency, currencyCode, digitsInfo);
82
82
  }
83
83
  }
84
- PFactorcPipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.3", ngImport: i0, type: PFactorcPipe, deps: [{ token: LOCALE_ID }, { token: DEFAULT_CURRENCY_CODE }], target: i0.ɵɵFactoryTarget.Pipe });
85
- PFactorcPipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "15.0.3", ngImport: i0, type: PFactorcPipe, isStandalone: true, name: "pfactorc" });
86
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.3", ngImport: i0, type: PFactorcPipe, decorators: [{
84
+ PFactorcPipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: PFactorcPipe, deps: [{ token: LOCALE_ID }, { token: DEFAULT_CURRENCY_CODE }], target: i0.ɵɵFactoryTarget.Pipe });
85
+ PFactorcPipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "15.0.4", ngImport: i0, type: PFactorcPipe, isStandalone: true, name: "pfactorc" });
86
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: PFactorcPipe, decorators: [{
87
87
  type: Pipe,
88
88
  args: [{
89
89
  name: 'pfactorc',
@@ -99,9 +99,9 @@ export class FkselectComponent {
99
99
  }));
100
100
  }
101
101
  }
102
- FkselectComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.3", ngImport: i0, type: FkselectComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
103
- FkselectComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.3", type: FkselectComponent, isStandalone: true, selector: "data-fkselect", inputs: { model: "model", field: "field", edit: "edit", value: "value", queryset: "queryset", collection: "collection", update: "update", filter: "filter", mode: "mode", display: "display", search: "search", label: "label", placeholder: "placeholder", inputClasses: "inputClasses" }, outputs: { selected: "selected", cancelled: "cancelled", cleared: "cleared" }, ngImport: i0, template: "\n<div class=\"form-group\">\n <label *ngIf=\"label\">{{label}}</label>\n <div class=\"input-group\">\n <input class=\"form-control\" [formControl]=\"fc\" [placeholder]=\"placeholder\" [ngbTypeahead]=\"searchFn\" [editable]=\"false\" [focusFirst]=\"true\" [inputFormatter]=\"displayFn\" [resultFormatter]=\"displayFn\" (keyup.escape)=\"cancelled.emit()\">\n <div class=\"input-group-text\"><i class=\"bi bi-trash float-end pointer\" (click)=\"clearAction()\"></i></div>\n </div>\n</div>", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: NgbTypeaheadModule }, { kind: "directive", type: i3.NgbTypeahead, selector: "input[ngbTypeahead]", inputs: ["autocomplete", "container", "editable", "focusFirst", "inputFormatter", "ngbTypeahead", "resultFormatter", "resultTemplate", "showHint", "placement", "popperOptions", "popupClass"], outputs: ["selectItem"], exportAs: ["ngbTypeahead"] }] });
104
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.3", ngImport: i0, type: FkselectComponent, decorators: [{
102
+ FkselectComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: FkselectComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
103
+ FkselectComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.4", type: FkselectComponent, isStandalone: true, selector: "data-fkselect", inputs: { model: "model", field: "field", edit: "edit", value: "value", queryset: "queryset", collection: "collection", update: "update", filter: "filter", mode: "mode", display: "display", search: "search", label: "label", placeholder: "placeholder", inputClasses: "inputClasses" }, outputs: { selected: "selected", cancelled: "cancelled", cleared: "cleared" }, ngImport: i0, template: "\n<div class=\"form-group\">\n <label *ngIf=\"label\">{{label}}</label>\n <div class=\"input-group\">\n <input class=\"form-control\" [formControl]=\"fc\" [placeholder]=\"placeholder\" [ngbTypeahead]=\"searchFn\" [editable]=\"false\" [focusFirst]=\"true\" [inputFormatter]=\"displayFn\" [resultFormatter]=\"displayFn\" (keyup.escape)=\"cancelled.emit()\">\n <div class=\"input-group-text\"><i class=\"bi bi-trash float-end pointer\" (click)=\"clearAction()\"></i></div>\n </div>\n</div>", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: NgbTypeaheadModule }, { kind: "directive", type: i3.NgbTypeahead, selector: "input[ngbTypeahead]", inputs: ["autocomplete", "container", "editable", "focusFirst", "inputFormatter", "ngbTypeahead", "resultFormatter", "resultTemplate", "showHint", "placement", "popperOptions", "popupClass"], outputs: ["selectItem"], exportAs: ["ngbTypeahead"] }] });
104
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: FkselectComponent, decorators: [{
105
105
  type: Component,
106
106
  args: [{ selector: 'data-fkselect', standalone: true, imports: [CommonModule, ReactiveFormsModule, NgbTypeaheadModule], template: "\n<div class=\"form-group\">\n <label *ngIf=\"label\">{{label}}</label>\n <div class=\"input-group\">\n <input class=\"form-control\" [formControl]=\"fc\" [placeholder]=\"placeholder\" [ngbTypeahead]=\"searchFn\" [editable]=\"false\" [focusFirst]=\"true\" [inputFormatter]=\"displayFn\" [resultFormatter]=\"displayFn\" (keyup.escape)=\"cancelled.emit()\">\n <div class=\"input-group-text\"><i class=\"bi bi-trash float-end pointer\" (click)=\"clearAction()\"></i></div>\n </div>\n</div>" }]
107
107
  }], ctorParameters: function () { return []; }, propDecorators: { model: [{
@@ -113,9 +113,9 @@ export class FlagsComponent {
113
113
  }
114
114
  }
115
115
  }
116
- FlagsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.3", ngImport: i0, type: FlagsComponent, deps: [{ token: i1.DataMessageService }], target: i0.ɵɵFactoryTarget.Component });
117
- FlagsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.3", type: FlagsComponent, isStandalone: true, selector: "data-flags", inputs: { model: "model", field: "field", get_flags_endpoint: "get_flags_endpoint", edit: "edit", editable: "editable", flags: "flags", free: "free", create: "create", action: "action" }, ngImport: i0, template: "\n<dt (click)=\"toggleEdit()\" role=\"button\">\n <ng-content></ng-content>\n</dt>\n<dd *ngIf=\"!edit\" (click)=\"toggleEdit()\" role=\"button\"><span class=\"badge bg-info me-1\" *ngFor=\"let flag of curflags\">{{flag}}</span></dd>\n<dd *ngIf=\"edit\">\n <div class=\"row\">\n <ng-container *ngIf=\"!free\">\n <div class=\"col\">\n <select class=\"form-select form-select-sm\" [formControl]=\"fs\">\n <option *ngFor=\"let flag of flaglist\" [value]=\"flag.flag\">{{flag.flag}}<span class=\"ms-1\" *ngIf=\"flag.count\">({{flag.count}})</span></option>\n </select>\n </div>\n <div class=\"col\" *ngIf=\"create\">\n <input class=\"form-control form-control-sm\" placeholder=\"Nouveau flag\" [formControl]=\"ft\" (keyup.enter)=\"addFreeFlag()\">\n </div>\n </ng-container>\n <ng-container *ngIf=\"free\">\n <div class=\"col-12\">\n <input class=\"form-control form-select-sm\" placeholder=\"Nouveau flag\" [formControl]=\"ft\" (keyup.enter)=\"addFreeFlag()\" (keyup.escape)=\"toggleEdit()\">\n </div>\n </ng-container>\n </div>\n <div class=\"row\">\n <div class=\"col-sm-12\"><span class=\"badge bg-info me-1\" *ngFor=\"let flag of curflags\" (click)=\"removeFlag(flag)\" role=\"button\"><i class=\"bi bi-trash me-1\"></i>{{flag}}</span><i class=\"bi bi-x-lg text-muted ms-2\" role=\"button\" (click)=\"toggleEdit()\"></i></div>\n </div>\n</dd>", styles: [""], dependencies: [{ 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"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i3.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }] });
118
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.3", ngImport: i0, type: FlagsComponent, decorators: [{
116
+ FlagsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: FlagsComponent, deps: [{ token: i1.DataMessageService }], target: i0.ɵɵFactoryTarget.Component });
117
+ FlagsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.4", type: FlagsComponent, isStandalone: true, selector: "data-flags", inputs: { model: "model", field: "field", get_flags_endpoint: "get_flags_endpoint", edit: "edit", editable: "editable", flags: "flags", free: "free", create: "create", action: "action" }, ngImport: i0, template: "\n<dt (click)=\"toggleEdit()\" role=\"button\">\n <ng-content></ng-content>\n</dt>\n<dd *ngIf=\"!edit\" (click)=\"toggleEdit()\" role=\"button\"><span class=\"badge bg-info me-1\" *ngFor=\"let flag of curflags\">{{flag}}</span></dd>\n<dd *ngIf=\"edit\">\n <div class=\"row\">\n <ng-container *ngIf=\"!free\">\n <div class=\"col\">\n <select class=\"form-select form-select-sm\" [formControl]=\"fs\">\n <option *ngFor=\"let flag of flaglist\" [value]=\"flag.flag\">{{flag.flag}}<span class=\"ms-1\" *ngIf=\"flag.count\">({{flag.count}})</span></option>\n </select>\n </div>\n <div class=\"col\" *ngIf=\"create\">\n <input class=\"form-control form-control-sm\" placeholder=\"Nouveau flag\" [formControl]=\"ft\" (keyup.enter)=\"addFreeFlag()\">\n </div>\n </ng-container>\n <ng-container *ngIf=\"free\">\n <div class=\"col-12\">\n <input class=\"form-control form-select-sm\" placeholder=\"Nouveau flag\" [formControl]=\"ft\" (keyup.enter)=\"addFreeFlag()\" (keyup.escape)=\"toggleEdit()\">\n </div>\n </ng-container>\n </div>\n <div class=\"row\">\n <div class=\"col-sm-12\"><span class=\"badge bg-info me-1\" *ngFor=\"let flag of curflags\" (click)=\"removeFlag(flag)\" role=\"button\"><i class=\"bi bi-trash me-1\"></i>{{flag}}</span><i class=\"bi bi-x-lg text-muted ms-2\" role=\"button\" (click)=\"toggleEdit()\"></i></div>\n </div>\n</dd>", styles: [""], dependencies: [{ 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"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i3.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }] });
118
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: FlagsComponent, decorators: [{
119
119
  type: Component,
120
120
  args: [{ selector: 'data-flags', standalone: true, imports: [CommonModule, ReactiveFormsModule], template: "\n<dt (click)=\"toggleEdit()\" role=\"button\">\n <ng-content></ng-content>\n</dt>\n<dd *ngIf=\"!edit\" (click)=\"toggleEdit()\" role=\"button\"><span class=\"badge bg-info me-1\" *ngFor=\"let flag of curflags\">{{flag}}</span></dd>\n<dd *ngIf=\"edit\">\n <div class=\"row\">\n <ng-container *ngIf=\"!free\">\n <div class=\"col\">\n <select class=\"form-select form-select-sm\" [formControl]=\"fs\">\n <option *ngFor=\"let flag of flaglist\" [value]=\"flag.flag\">{{flag.flag}}<span class=\"ms-1\" *ngIf=\"flag.count\">({{flag.count}})</span></option>\n </select>\n </div>\n <div class=\"col\" *ngIf=\"create\">\n <input class=\"form-control form-control-sm\" placeholder=\"Nouveau flag\" [formControl]=\"ft\" (keyup.enter)=\"addFreeFlag()\">\n </div>\n </ng-container>\n <ng-container *ngIf=\"free\">\n <div class=\"col-12\">\n <input class=\"form-control form-select-sm\" placeholder=\"Nouveau flag\" [formControl]=\"ft\" (keyup.enter)=\"addFreeFlag()\" (keyup.escape)=\"toggleEdit()\">\n </div>\n </ng-container>\n </div>\n <div class=\"row\">\n <div class=\"col-sm-12\"><span class=\"badge bg-info me-1\" *ngFor=\"let flag of curflags\" (click)=\"removeFlag(flag)\" role=\"button\"><i class=\"bi bi-trash me-1\"></i>{{flag}}</span><i class=\"bi bi-x-lg text-muted ms-2\" role=\"button\" (click)=\"toggleEdit()\"></i></div>\n </div>\n</dd>" }]
121
121
  }], ctorParameters: function () { return [{ type: i1.DataMessageService }]; }, propDecorators: { model: [{
@@ -257,15 +257,15 @@ export class M2mselectComponent {
257
257
  }));
258
258
  }
259
259
  }
260
- M2mselectComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.3", ngImport: i0, type: M2mselectComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
261
- M2mselectComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.3", type: M2mselectComponent, isStandalone: true, selector: "data-m2mselect", inputs: { model: "model", field: "field", edit: "edit", values: "values", queryset: "queryset", collection: "collection", filter: "filter", mode: "mode", display: "display", search: "search", label: "label", placeholder: "placeholder", emptyLabel: "emptyLabel", inputClasses: "inputClasses" }, outputs: { added: "added", removed: "removed", cancelled: "cancelled", cleared: "cleared", detailsChanged: "detailsChanged", changed: "changed" }, providers: [
260
+ M2mselectComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: M2mselectComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
261
+ M2mselectComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.4", type: M2mselectComponent, isStandalone: true, selector: "data-m2mselect", inputs: { model: "model", field: "field", edit: "edit", values: "values", queryset: "queryset", collection: "collection", filter: "filter", mode: "mode", display: "display", search: "search", label: "label", placeholder: "placeholder", emptyLabel: "emptyLabel", inputClasses: "inputClasses" }, outputs: { added: "added", removed: "removed", cancelled: "cancelled", cleared: "cleared", detailsChanged: "detailsChanged", changed: "changed" }, providers: [
262
262
  {
263
263
  provide: NG_VALUE_ACCESSOR,
264
264
  multi: true,
265
265
  useExisting: M2mselectComponent,
266
266
  },
267
267
  ], ngImport: i0, template: "\n<div class=\"form-group\">\n <label *ngIf=\"label\">{{label}}</label>\n <div class=\"input-group\">\n <input class=\"form-control\" [formControl]=\"fc\" [placeholder]=\"placeholder\" [ngbTypeahead]=\"searchFn\" [editable]=\"false\" [focusFirst]=\"true\" [inputFormatter]=\"displayFn\" [resultFormatter]=\"displayFn\" (keyup.escape)=\"cancelled.emit()\">\n <div class=\"input-group-text\"><i class=\"bi bi-trash float-end pointer\" (click)=\"cleared.emit()\"></i></div>\n </div>\n <div *ngFor=\"let i of values\"><i class=\"bi bi-trash ms-2 float-end\" (click)=\"onRemove(i)\"></i>{{displayFn(i)}}</div>\n</div>", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: NgbTypeaheadModule }, { kind: "directive", type: i3.NgbTypeahead, selector: "input[ngbTypeahead]", inputs: ["autocomplete", "container", "editable", "focusFirst", "inputFormatter", "ngbTypeahead", "resultFormatter", "resultTemplate", "showHint", "placement", "popperOptions", "popupClass"], outputs: ["selectItem"], exportAs: ["ngbTypeahead"] }] });
268
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.3", ngImport: i0, type: M2mselectComponent, decorators: [{
268
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: M2mselectComponent, decorators: [{
269
269
  type: Component,
270
270
  args: [{ selector: 'data-m2mselect', providers: [
271
271
  {