@solidev/data 0.0.8 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/auth/auth-interceptor.service.mjs +92 -0
- package/{esm2020 → esm2022}/lib/auth/auth.service.mjs +1 -1
- package/esm2022/lib/data/data-backend.mjs +135 -0
- package/esm2022/lib/data/data-model.mjs +292 -0
- package/esm2022/lib/dispedit/choice.pipe.mjs +81 -0
- package/{esm2020 → esm2022}/lib/dispedit/dispedit/dispedit.component.mjs +10 -5
- package/esm2022/lib/dispedit/factor.pipe.mjs +83 -0
- package/esm2022/lib/dispedit/factorc.pipe.mjs +101 -0
- package/esm2022/lib/dispedit/fkselect/fkselect.component.mjs +143 -0
- package/esm2022/lib/dispedit/flags/flags.component.mjs +141 -0
- package/esm2022/lib/dispedit/m2mselect/m2mselect.component.mjs +319 -0
- package/esm2022/lib/dispedit/richedit/richedit.component.mjs +127 -0
- package/esm2022/lib/dispedit/sdelete/sdelete.component.mjs +94 -0
- package/esm2022/lib/messages/message-zone/message-zone.component.mjs +58 -0
- package/esm2022/lib/messages/message.service.mjs +152 -0
- package/esm2022/lib/modellist/model-list-fields/model-list-field-header/model-list-field-header.component.mjs +66 -0
- package/esm2022/lib/modellist/model-list-fields/model-list-fields-selector/model-list-fields-selector.component.mjs +65 -0
- package/esm2022/lib/modellist/model-list-filters/filters/model-list-autocomplete-filter/model-list-autocomplete-filter.component.mjs +113 -0
- package/esm2022/lib/modellist/model-list-filters/filters/model-list-autocomplete-multi-filter/model-list-autocomplete-multi-filter.component.mjs +30 -0
- package/esm2022/lib/modellist/model-list-filters/filters/model-list-date-filter/model-list-date-filter.component.mjs +41 -0
- package/esm2022/lib/modellist/model-list-filters/filters/model-list-datetime-filter/model-list-datetime-filter.component.mjs +41 -0
- package/esm2022/lib/modellist/model-list-filters/filters/model-list-datetimerange-filter/model-list-datetime-range-filter.component.mjs +22 -0
- package/esm2022/lib/modellist/model-list-filters/filters/model-list-flags-filter/model-list-flags-filter.component.mjs +50 -0
- package/esm2022/lib/modellist/model-list-filters/filters/model-list-geodistance-filter/model-list-geodistance-filter.component.mjs +64 -0
- package/esm2022/lib/modellist/model-list-filters/filters/model-list-number-filter/model-list-number-filter.component.mjs +47 -0
- package/esm2022/lib/modellist/model-list-filters/filters/model-list-select-filter/model-list-select-filter.component.mjs +57 -0
- package/esm2022/lib/modellist/model-list-filters/filters/model-list-select-multi-filter/model-list-select-multi-filter.component.mjs +52 -0
- package/esm2022/lib/modellist/model-list-filters/filters/model-list-text-filter/model-list-text-filter.component.mjs +41 -0
- package/esm2022/lib/modellist/model-list-filters/filters/model-list-tree-filter/model-list-tree-filter.component.mjs +175 -0
- package/esm2022/lib/modellist/model-list-filters/model-list-filters/model-list-filters.component.mjs +51 -0
- package/esm2022/lib/modellist/model-list-filters/model-list-filters-select/model-list-filters-select.component.mjs +31 -0
- package/esm2022/lib/modellist/model-list-paginator/model-list-paginator/model-list-paginator.component.mjs +71 -0
- package/esm2022/lib/modellist/model-list-sorter/model-list-sorter/model-list-sorter.component.mjs +50 -0
- package/esm2022/lib/modellist/model-list.service.mjs +158 -0
- package/esm2022/lib/routing/breadcrumb/breadcrumb.component.mjs +143 -0
- package/esm2022/lib/updates/update/update.component.mjs +18 -0
- package/esm2022/lib/updates/update.service.mjs +59 -0
- package/esm2022/lib/uploader/ng-file-drop.directive.mjs +82 -0
- package/esm2022/lib/uploader/ng-file-select.directive.mjs +52 -0
- package/esm2022/lib/uploader/ngx-uploader.module.mjs +18 -0
- package/esm2022/lib/utils/tab-memory.service.mjs +81 -0
- package/{fesm2020 → fesm2022}/solidev-data.mjs +153 -149
- package/fesm2022/solidev-data.mjs.map +1 -0
- package/lib/dispedit/dispedit/dispedit.component.d.ts +1 -1
- package/lib/dispedit/fkselect/fkselect.component.d.ts +1 -1
- package/lib/dispedit/flags/flags.component.d.ts +1 -1
- package/lib/dispedit/m2mselect/m2mselect.component.d.ts +1 -1
- package/lib/dispedit/richedit/richedit.component.d.ts +1 -1
- package/lib/dispedit/sdelete/sdelete.component.d.ts +1 -1
- package/lib/messages/message-zone/message-zone.component.d.ts +1 -1
- package/lib/modellist/model-list-fields/model-list-field-header/model-list-field-header.component.d.ts +1 -1
- package/lib/modellist/model-list-fields/model-list-fields-selector/model-list-fields-selector.component.d.ts +1 -1
- package/lib/modellist/model-list-filters/filters/model-list-autocomplete-filter/model-list-autocomplete-filter.component.d.ts +1 -1
- package/lib/modellist/model-list-filters/filters/model-list-autocomplete-multi-filter/model-list-autocomplete-multi-filter.component.d.ts +1 -1
- package/lib/modellist/model-list-filters/filters/model-list-date-filter/model-list-date-filter.component.d.ts +1 -1
- package/lib/modellist/model-list-filters/filters/model-list-datetime-filter/model-list-datetime-filter.component.d.ts +1 -1
- package/lib/modellist/model-list-filters/filters/model-list-datetimerange-filter/model-list-datetime-range-filter.component.d.ts +1 -1
- package/lib/modellist/model-list-filters/filters/model-list-flags-filter/model-list-flags-filter.component.d.ts +1 -1
- package/lib/modellist/model-list-filters/filters/model-list-geodistance-filter/model-list-geodistance-filter.component.d.ts +1 -1
- package/lib/modellist/model-list-filters/filters/model-list-number-filter/model-list-number-filter.component.d.ts +1 -1
- package/lib/modellist/model-list-filters/filters/model-list-select-filter/model-list-select-filter.component.d.ts +1 -1
- package/lib/modellist/model-list-filters/filters/model-list-select-multi-filter/model-list-select-multi-filter.component.d.ts +1 -1
- package/lib/modellist/model-list-filters/filters/model-list-text-filter/model-list-text-filter.component.d.ts +1 -1
- package/lib/modellist/model-list-filters/filters/model-list-tree-filter/model-list-tree-filter.component.d.ts +1 -1
- package/lib/modellist/model-list-filters/model-list-filters/model-list-filters.component.d.ts +1 -1
- package/lib/modellist/model-list-filters/model-list-filters-select/model-list-filters-select.component.d.ts +1 -1
- package/lib/modellist/model-list-paginator/model-list-paginator/model-list-paginator.component.d.ts +1 -1
- package/lib/modellist/model-list-sorter/model-list-sorter/model-list-sorter.component.d.ts +1 -1
- package/lib/routing/breadcrumb/breadcrumb.component.d.ts +1 -1
- package/lib/uploader/ng-file-drop.directive.d.ts +1 -1
- package/lib/uploader/ng-file-select.directive.d.ts +1 -1
- package/package.json +7 -13
- package/esm2020/lib/auth/auth-interceptor.service.mjs +0 -91
- package/esm2020/lib/data/data-backend.mjs +0 -134
- package/esm2020/lib/data/data-model.mjs +0 -291
- package/esm2020/lib/dispedit/choice.pipe.mjs +0 -79
- package/esm2020/lib/dispedit/factor.pipe.mjs +0 -81
- package/esm2020/lib/dispedit/factorc.pipe.mjs +0 -99
- package/esm2020/lib/dispedit/fkselect/fkselect.component.mjs +0 -142
- package/esm2020/lib/dispedit/flags/flags.component.mjs +0 -140
- package/esm2020/lib/dispedit/m2mselect/m2mselect.component.mjs +0 -318
- package/esm2020/lib/dispedit/richedit/richedit.component.mjs +0 -126
- package/esm2020/lib/dispedit/sdelete/sdelete.component.mjs +0 -93
- package/esm2020/lib/messages/message-zone/message-zone.component.mjs +0 -57
- package/esm2020/lib/messages/message.service.mjs +0 -151
- package/esm2020/lib/modellist/model-list-fields/model-list-field-header/model-list-field-header.component.mjs +0 -65
- package/esm2020/lib/modellist/model-list-fields/model-list-fields-selector/model-list-fields-selector.component.mjs +0 -64
- package/esm2020/lib/modellist/model-list-filters/filters/model-list-autocomplete-filter/model-list-autocomplete-filter.component.mjs +0 -112
- package/esm2020/lib/modellist/model-list-filters/filters/model-list-autocomplete-multi-filter/model-list-autocomplete-multi-filter.component.mjs +0 -29
- package/esm2020/lib/modellist/model-list-filters/filters/model-list-date-filter/model-list-date-filter.component.mjs +0 -40
- package/esm2020/lib/modellist/model-list-filters/filters/model-list-datetime-filter/model-list-datetime-filter.component.mjs +0 -40
- package/esm2020/lib/modellist/model-list-filters/filters/model-list-datetimerange-filter/model-list-datetime-range-filter.component.mjs +0 -21
- package/esm2020/lib/modellist/model-list-filters/filters/model-list-flags-filter/model-list-flags-filter.component.mjs +0 -49
- package/esm2020/lib/modellist/model-list-filters/filters/model-list-geodistance-filter/model-list-geodistance-filter.component.mjs +0 -63
- package/esm2020/lib/modellist/model-list-filters/filters/model-list-number-filter/model-list-number-filter.component.mjs +0 -46
- package/esm2020/lib/modellist/model-list-filters/filters/model-list-select-filter/model-list-select-filter.component.mjs +0 -56
- package/esm2020/lib/modellist/model-list-filters/filters/model-list-select-multi-filter/model-list-select-multi-filter.component.mjs +0 -51
- package/esm2020/lib/modellist/model-list-filters/filters/model-list-text-filter/model-list-text-filter.component.mjs +0 -40
- package/esm2020/lib/modellist/model-list-filters/filters/model-list-tree-filter/model-list-tree-filter.component.mjs +0 -174
- package/esm2020/lib/modellist/model-list-filters/model-list-filters/model-list-filters.component.mjs +0 -50
- package/esm2020/lib/modellist/model-list-filters/model-list-filters-select/model-list-filters-select.component.mjs +0 -30
- package/esm2020/lib/modellist/model-list-paginator/model-list-paginator/model-list-paginator.component.mjs +0 -70
- package/esm2020/lib/modellist/model-list-sorter/model-list-sorter/model-list-sorter.component.mjs +0 -49
- package/esm2020/lib/modellist/model-list.service.mjs +0 -157
- package/esm2020/lib/routing/breadcrumb/breadcrumb.component.mjs +0 -142
- package/esm2020/lib/updates/update/update.component.mjs +0 -17
- package/esm2020/lib/updates/update.service.mjs +0 -58
- package/esm2020/lib/uploader/ng-file-drop.directive.mjs +0 -81
- package/esm2020/lib/uploader/ng-file-select.directive.mjs +0 -51
- package/esm2020/lib/uploader/ngx-uploader.module.mjs +0 -17
- package/esm2020/lib/utils/tab-memory.service.mjs +0 -80
- package/fesm2015/solidev-data.mjs +0 -6224
- package/fesm2015/solidev-data.mjs.map +0 -1
- package/fesm2020/solidev-data.mjs.map +0 -1
- /package/{esm2020 → esm2022}/lib/auth/jwt.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/data/data-collection.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/data/data-collection.mock.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/data/data-parameters.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/data/data-query.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/data/data-query.mock.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/data/fields/base.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/data/fields/boolean.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/data/fields/computed.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/data/fields/datetime.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/data/fields/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/data/fields/numbers.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/data/fields/primaryfield.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/data/fields/relations.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/data/fields/stringfields.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/dispedit/dispedit/dispedit.constants.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modellist/model-list-fields/model-list-field-header/messages.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modellist/model-list-fields/model-list-fields.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modellist/model-list-filters/filters/filtertypes.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modellist/model-list-filters/filters/model-list-autocomplete-filter/model-list-autocomplete-filter.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modellist/model-list-filters/filters/model-list-autocomplete-multi-filter/model-list-autocomplete-multi-filter.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modellist/model-list-filters/filters/model-list-date-filter/model-list-date-filter.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modellist/model-list-filters/filters/model-list-datetime-filter/model-list-datetime-filter.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modellist/model-list-filters/filters/model-list-datetimerange-filter/model-list-datetimerange-filter.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modellist/model-list-filters/filters/model-list-flags-filter/model-list-flags-filter.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modellist/model-list-filters/filters/model-list-geodistance-filter/adapters/ban.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modellist/model-list-filters/filters/model-list-geodistance-filter/model-list-geodistance-filter.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modellist/model-list-filters/filters/model-list-number-filter/model-list-number-filter.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modellist/model-list-filters/filters/model-list-select-filter/model-list-select-filter.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modellist/model-list-filters/filters/model-list-select-multi-filter/model-list-select-multi-filter.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modellist/model-list-filters/filters/model-list-text-filter/model-list-text-filter.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modellist/model-list-filters/filters/model-list-tree-filter/model-list-tree-filter.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modellist/model-list-filters/model-list-filter.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modellist/model-list-filters/model-list-filters.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modellist/model-list-paginator/model-list-paginator.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modellist/model-list-sorter/model-list-sorter.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/routing/routing.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/uploader/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/uploader/interfaces.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/uploader/ngx-uploader.class.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/utils/slugify.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/utils/template.mjs +0 -0
- /package/{esm2020 → esm2022}/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/solidev-data.mjs +0 -0
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { DEFAULT_CURRENCY_CODE, Inject, LOCALE_ID, Pipe, } from '@angular/core';
|
|
2
|
+
import { isValue, strToNumber } from './factor.pipe';
|
|
3
|
+
import { formatCurrency, getCurrencySymbol } from '@angular/common';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
class FactorcPipe {
|
|
6
|
+
constructor(_locale, _defaultCurrencyCode = 'EUR') {
|
|
7
|
+
this._locale = _locale;
|
|
8
|
+
this._defaultCurrencyCode = _defaultCurrencyCode;
|
|
9
|
+
}
|
|
10
|
+
transform(value, field, currencyCode, display, digitsInfo, locale) {
|
|
11
|
+
if (!value)
|
|
12
|
+
return null;
|
|
13
|
+
const fvalue = value[field];
|
|
14
|
+
if (!isValue(fvalue))
|
|
15
|
+
return null;
|
|
16
|
+
locale = locale || this._locale;
|
|
17
|
+
let currency = currencyCode || this._defaultCurrencyCode;
|
|
18
|
+
if (!display) {
|
|
19
|
+
display = 'symbol';
|
|
20
|
+
}
|
|
21
|
+
if (display !== 'code') {
|
|
22
|
+
if (display === 'symbol' || display === 'symbol-narrow') {
|
|
23
|
+
currency = getCurrencySymbol(currency, display === 'symbol' ? 'wide' : 'narrow', locale);
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
currency = display;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
const manager = value.FM(field);
|
|
30
|
+
const factor = manager.factor || 1;
|
|
31
|
+
const num = strToNumber(fvalue);
|
|
32
|
+
return formatCurrency(num / factor, locale, currency, currencyCode, digitsInfo);
|
|
33
|
+
}
|
|
34
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: FactorcPipe, deps: [{ token: LOCALE_ID }, { token: DEFAULT_CURRENCY_CODE }], target: i0.ɵɵFactoryTarget.Pipe }); }
|
|
35
|
+
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "16.0.0", ngImport: i0, type: FactorcPipe, isStandalone: true, name: "factorc" }); }
|
|
36
|
+
}
|
|
37
|
+
export { FactorcPipe };
|
|
38
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: FactorcPipe, decorators: [{
|
|
39
|
+
type: Pipe,
|
|
40
|
+
args: [{
|
|
41
|
+
name: 'factorc',
|
|
42
|
+
standalone: true,
|
|
43
|
+
}]
|
|
44
|
+
}], ctorParameters: function () { return [{ type: undefined, decorators: [{
|
|
45
|
+
type: Inject,
|
|
46
|
+
args: [LOCALE_ID]
|
|
47
|
+
}] }, { type: undefined, decorators: [{
|
|
48
|
+
type: Inject,
|
|
49
|
+
args: [DEFAULT_CURRENCY_CODE]
|
|
50
|
+
}] }]; } });
|
|
51
|
+
class PFactorcPipe {
|
|
52
|
+
constructor(_locale, _defaultCurrencyCode = 'EUR') {
|
|
53
|
+
this._locale = _locale;
|
|
54
|
+
this._defaultCurrencyCode = _defaultCurrencyCode;
|
|
55
|
+
}
|
|
56
|
+
transform(value, model, field, currencyCode, display, digitsInfo, locale) {
|
|
57
|
+
if (!model)
|
|
58
|
+
return null;
|
|
59
|
+
if (!value)
|
|
60
|
+
return null;
|
|
61
|
+
// Use value from input, not from model
|
|
62
|
+
const fvalue = value; // (model as any)[field];
|
|
63
|
+
if (!isValue(fvalue)) {
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
locale = locale || this._locale;
|
|
67
|
+
let currency = currencyCode || this._defaultCurrencyCode;
|
|
68
|
+
if (!display) {
|
|
69
|
+
display = 'symbol';
|
|
70
|
+
}
|
|
71
|
+
if (display !== 'code') {
|
|
72
|
+
if (display === 'symbol' || display === 'symbol-narrow') {
|
|
73
|
+
currency = getCurrencySymbol(currency, display === 'symbol' ? 'wide' : 'narrow', locale);
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
currency = display;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
const manager = model.FM(field);
|
|
80
|
+
const factor = manager.factor || 1;
|
|
81
|
+
const num = strToNumber(fvalue);
|
|
82
|
+
return formatCurrency(num / factor, locale, currency, currencyCode, digitsInfo);
|
|
83
|
+
}
|
|
84
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: PFactorcPipe, deps: [{ token: LOCALE_ID }, { token: DEFAULT_CURRENCY_CODE }], target: i0.ɵɵFactoryTarget.Pipe }); }
|
|
85
|
+
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "16.0.0", ngImport: i0, type: PFactorcPipe, isStandalone: true, name: "pfactorc" }); }
|
|
86
|
+
}
|
|
87
|
+
export { PFactorcPipe };
|
|
88
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: PFactorcPipe, decorators: [{
|
|
89
|
+
type: Pipe,
|
|
90
|
+
args: [{
|
|
91
|
+
name: 'pfactorc',
|
|
92
|
+
standalone: true,
|
|
93
|
+
}]
|
|
94
|
+
}], ctorParameters: function () { return [{ type: undefined, decorators: [{
|
|
95
|
+
type: Inject,
|
|
96
|
+
args: [LOCALE_ID]
|
|
97
|
+
}] }, { type: undefined, decorators: [{
|
|
98
|
+
type: Inject,
|
|
99
|
+
args: [DEFAULT_CURRENCY_CODE]
|
|
100
|
+
}] }]; } });
|
|
101
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFjdG9yYy5waXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGF0YS9zcmMvbGliL2Rpc3BlZGl0L2ZhY3RvcmMucGlwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wscUJBQXFCLEVBQ3JCLE1BQU0sRUFDTixTQUFTLEVBQ1QsSUFBSSxHQUVMLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JELE9BQU8sRUFBRSxjQUFjLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7QUFFcEUsTUFJYSxXQUFXO0lBQ3RCLFlBQzZCLE9BQWUsRUFDSCx1QkFBK0IsS0FBSztRQURoRCxZQUFPLEdBQVAsT0FBTyxDQUFRO1FBQ0gseUJBQW9CLEdBQXBCLG9CQUFvQixDQUFnQjtJQUMxRSxDQUFDO0lBRUosU0FBUyxDQUNQLEtBQWUsRUFDZixLQUFhLEVBQ2IsWUFBcUIsRUFDckIsT0FBc0QsRUFDdEQsVUFBbUIsRUFDbkIsTUFBZTtRQUVmLElBQUksQ0FBQyxLQUFLO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDeEIsTUFBTSxNQUFNLEdBQUksS0FBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDbEMsTUFBTSxHQUFHLE1BQU0sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQ2hDLElBQUksUUFBUSxHQUFXLFlBQVksSUFBSSxJQUFJLENBQUMsb0JBQW9CLENBQUM7UUFDakUsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNaLE9BQU8sR0FBRyxRQUFRLENBQUM7U0FDcEI7UUFDRCxJQUFJLE9BQU8sS0FBSyxNQUFNLEVBQUU7WUFDdEIsSUFBSSxPQUFPLEtBQUssUUFBUSxJQUFJLE9BQU8sS0FBSyxlQUFl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Qjs7MEJBR0ksTUFBTTsyQkFBQyxTQUFTOzswQkFDaEIsTUFBTTsyQkFBQyxxQkFBcUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBERUZBVUxUX0NVUlJFTkNZX0NPREUsXG4gIEluamVjdCxcbiAgTE9DQUxFX0lELFxuICBQaXBlLFxuICBQaXBlVHJhbnNmb3JtLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERhdGFNb2RlbCB9IGZyb20gJy4uL2RhdGEvZGF0YS1tb2RlbCc7XG5pbXBvcnQgeyBpc1ZhbHVlLCBzdHJUb051bWJlciB9IGZyb20gJy4vZmFjdG9yLnBpcGUnO1xuaW1wb3J0IHsgZm9ybWF0Q3VycmVuY3ksIGdldEN1cnJlbmN5U3ltYm9sIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcblxuQFBpcGUoe1xuICBuYW1lOiAnZmFjdG9yYycsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG59KVxuZXhwb3J0IGNsYXNzIEZhY3RvcmNQaXBlPFQgZXh0ZW5kcyBEYXRhTW9kZWw+IGltcGxlbWVudHMgUGlwZVRyYW5zZm9ybSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoTE9DQUxFX0lEKSBwcml2YXRlIF9sb2NhbGU6IHN0cmluZyxcbiAgICBASW5qZWN0KERFRkFVTFRfQ1VSUkVOQ1lfQ09ERSkgcHJpdmF0ZSBfZGVmYXVsdEN1cnJlbmN5Q29kZTogc3RyaW5nID0gJ0VVUidcbiAgKSB7fVxuXG4gIHRyYW5zZm9ybShcbiAgICB2YWx1ZTogVCB8IG51bGwsXG4gICAgZmllbGQ6IHN0cmluZyxcbiAgICBjdXJyZW5jeUNvZGU/OiBzdHJpbmcsXG4gICAgZGlzcGxheT86ICdjb2RlJyB8ICdzeW1ib2wnIHwgJ3N5bWJvbC1uYXJyb3cnIHwgc3RyaW5nLFxuICAgIGRpZ2l0c0luZm8/OiBzdHJpbmcsXG4gICAgbG9jYWxlPzogc3RyaW5nXG4gICk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICghdmFsdWUpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGZ2YWx1ZSA9ICh2YWx1ZSBhcyBhbnkpW2ZpZWxkXTtcbiAgICBpZiAoIWlzVmFsdWUoZnZhbHVlKSkgcmV0dXJuIG51bGw7XG4gICAgbG9jYWxlID0gbG9jYWxlIHx8IHRoaXMuX2xvY2FsZTtcbiAgICBsZXQgY3VycmVuY3k6IHN0cmluZyA9IGN1cnJlbmN5Q29kZSB8fCB0aGlzLl9kZWZhdWx0Q3VycmVuY3lDb2RlO1xuICAgIGlmICghZGlzcGxheSkge1xuICAgICAgZGlzcGxheSA9ICdzeW1ib2wnO1xuICAgIH1cbiAgICBpZiAoZGlzcGxheSAhPT0gJ2NvZGUnKSB7XG4gICAgICBpZiAoZGlzcGxheSA9PT0gJ3N5bWJvbCcgfHwgZGlzcGxheSA9PT0gJ3N5bWJvbC1uYXJyb3cnKSB7XG4gICAgICAgIGN1cnJlbmN5ID0gZ2V0Q3VycmVuY3lTeW1ib2woXG4gICAgICAgICAgY3VycmVuY3ksXG4gICAgICAgICAgZGlzcGxheSA9PT0gJ3N5bWJvbCcgPyAnd2lkZScgOiAnbmFycm93JyxcbiAgICAgICAgICBsb2NhbGVcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGN1cnJlbmN5ID0gZGlzcGxheSE7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbWFuYWdlciA9IHZhbHVlLkZNKGZpZWxkKTtcbiAgICBjb25zdCBmYWN0b3IgPSAobWFuYWdlciBhcyBhbnkpLmZhY3RvciB8fCAxO1xuICAgIGNvbnN0IG51bSA9IHN0clRvTnVtYmVyKGZ2YWx1ZSk7XG4gICAgcmV0dXJuIGZvcm1hdEN1cnJlbmN5KFxuICAgICAgbnVtIC8gZmFjdG9yLFxuICAgICAgbG9jYWxlLFxuICAgICAgY3VycmVuY3ksXG4gICAgICBjdXJyZW5jeUNvZGUsXG4gICAgICBkaWdpdHNJbmZvXG4gICAgKTtcbiAgfVxufVxuXG5AUGlwZSh7XG4gIG5hbWU6ICdwZmFjdG9yYycsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG59KVxuZXhwb3J0IGNsYXNzIFBGYWN0b3JjUGlwZTxUIGV4dGVuZHMgRGF0YU1vZGVsPiBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm0ge1xuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KExPQ0FMRV9JRCkgcHJpdmF0ZSBfbG9jYWxlOiBzdHJpbmcsXG4gICAgQEluamVjdChERUZBVUxUX0NVUlJFTkNZX0NPREUpIHByaXZhdGUgX2RlZmF1bHRDdXJyZW5jeUNvZGU6IHN0cmluZyA9ICdFVVInXG4gICkge31cblxuICB0cmFuc2Zvcm0oXG4gICAgdmFsdWU6IG51bWJlciB8IHN0cmluZyB8IHVuZGVmaW5lZCB8IG51bGwsXG4gICAgbW9kZWw6IFQgfCBudWxsLFxuICAgIGZpZWxkOiBzdHJpbmcsXG4gICAgY3VycmVuY3lDb2RlPzogc3RyaW5nLFxuICAgIGRpc3BsYXk/OiAnY29kZScgfCAnc3ltYm9sJyB8ICdzeW1ib2wtbmFycm93JyB8IHN0cmluZyxcbiAgICBkaWdpdHNJbmZvPzogc3RyaW5nLFxuICAgIGxvY2FsZT86IHN0cmluZ1xuICApOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAoIW1vZGVsKSByZXR1cm4gbnVsbDtcbiAgICBpZiAoIXZhbHVlKSByZXR1cm4gbnVsbDtcbiAgICAvLyBVc2UgdmFsdWUgZnJvbSBpbnB1dCwgbm90IGZyb20gbW9kZWxcbiAgICBjb25zdCBmdmFsdWUgPSB2YWx1ZTsgLy8gKG1vZGVsIGFzIGFueSlbZmllbGRdO1xuICAgIGlmICghaXNWYWx1ZShmdmFsdWUpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgbG9jYWxlID0gbG9jYWxlIHx8IHRoaXMuX2xvY2FsZTtcbiAgICBsZXQgY3VycmVuY3k6IHN0cmluZyA9IGN1cnJlbmN5Q29kZSB8fCB0aGlzLl9kZWZhdWx0Q3VycmVuY3lDb2RlO1xuICAgIGlmICghZGlzcGxheSkge1xuICAgICAgZGlzcGxheSA9ICdzeW1ib2wnO1xuICAgIH1cbiAgICBpZiAoZGlzcGxheSAhPT0gJ2NvZGUnKSB7XG4gICAgICBpZiAoZGlzcGxheSA9PT0gJ3N5bWJvbCcgfHwgZGlzcGxheSA9PT0gJ3N5bWJvbC1uYXJyb3cnKSB7XG4gICAgICAgIGN1cnJlbmN5ID0gZ2V0Q3VycmVuY3lTeW1ib2woXG4gICAgICAgICAgY3VycmVuY3ksXG4gICAgICAgICAgZGlzcGxheSA9PT0gJ3N5bWJvbCcgPyAnd2lkZScgOiAnbmFycm93JyxcbiAgICAgICAgICBsb2NhbGVcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGN1cnJlbmN5ID0gZGlzcGxheSE7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbWFuYWdlciA9IG1vZGVsLkZNKGZpZWxkKTtcbiAgICBjb25zdCBmYWN0b3IgPSAobWFuYWdlciBhcyBhbnkpLmZhY3RvciB8fCAxO1xuICAgIGNvbnN0IG51bSA9IHN0clRvTnVtYmVyKGZ2YWx1ZSk7XG4gICAgcmV0dXJuIGZvcm1hdEN1cnJlbmN5KFxuICAgICAgbnVtIC8gZmFjdG9yLFxuICAgICAgbG9jYWxlLFxuICAgICAgY3VycmVuY3ksXG4gICAgICBjdXJyZW5jeUNvZGUsXG4gICAgICBkaWdpdHNJbmZvXG4gICAgKTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { Component, EventEmitter, Input, Output, } from '@angular/core';
|
|
2
|
+
import { debounceTime, distinctUntilChanged, Subject, takeUntil, } from 'rxjs';
|
|
3
|
+
import { switchMap } from 'rxjs/operators';
|
|
4
|
+
import { ReactiveFormsModule, UntypedFormControl } from '@angular/forms';
|
|
5
|
+
import { CommonModule } from '@angular/common';
|
|
6
|
+
import { NgbTypeaheadModule } from '@ng-bootstrap/ng-bootstrap';
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
import * as i1 from "@angular/common";
|
|
9
|
+
import * as i2 from "@angular/forms";
|
|
10
|
+
import * as i3 from "@ng-bootstrap/ng-bootstrap";
|
|
11
|
+
class FkselectComponent {
|
|
12
|
+
constructor() {
|
|
13
|
+
this.edit = false;
|
|
14
|
+
this.update = false;
|
|
15
|
+
this.filter = {};
|
|
16
|
+
this.mode = 'auto';
|
|
17
|
+
this.search = 'search';
|
|
18
|
+
// Display
|
|
19
|
+
this.label = '';
|
|
20
|
+
this.placeholder = '';
|
|
21
|
+
this.inputClasses = [];
|
|
22
|
+
this.selected = new EventEmitter();
|
|
23
|
+
this.cancelled = new EventEmitter();
|
|
24
|
+
this.cleared = new EventEmitter();
|
|
25
|
+
this.searchFn = this._search.bind(this);
|
|
26
|
+
this.displayFn = this._display.bind(this);
|
|
27
|
+
this._subscription = new Subject();
|
|
28
|
+
}
|
|
29
|
+
ngOnDestroy() {
|
|
30
|
+
this._subscription.next();
|
|
31
|
+
this._subscription.complete();
|
|
32
|
+
}
|
|
33
|
+
ngOnInit() {
|
|
34
|
+
// Create queryset if not given
|
|
35
|
+
// queryset is create through model
|
|
36
|
+
if (!this.queryset && this.collection) {
|
|
37
|
+
this.queryset = this.collection.queryset();
|
|
38
|
+
}
|
|
39
|
+
else if (!this.queryset && this.model && this.model._collection) {
|
|
40
|
+
this.collection = this.model._collection;
|
|
41
|
+
this.queryset = this.collection.queryset();
|
|
42
|
+
}
|
|
43
|
+
this.fc = new UntypedFormControl('');
|
|
44
|
+
this.fc.valueChanges
|
|
45
|
+
.pipe(takeUntil(this._subscription), distinctUntilChanged())
|
|
46
|
+
.subscribe((value) => {
|
|
47
|
+
if (value) {
|
|
48
|
+
this.selected.emit(value);
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
if (this.display) {
|
|
52
|
+
if (this.display && typeof this.display === 'string') {
|
|
53
|
+
this._tpl = (model) => `${model[this.display]}`;
|
|
54
|
+
}
|
|
55
|
+
else if (this.display && typeof this.display === 'function') {
|
|
56
|
+
this._tpl = this.display.bind(this);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
this._tpl = (model) => `${model['name'] ||
|
|
61
|
+
model['title'] ||
|
|
62
|
+
model['id']}`;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
clearAction() {
|
|
66
|
+
this.cleared.emit();
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Display function. Uses descfield or desc tpl (lodash template using model fields).
|
|
70
|
+
*/
|
|
71
|
+
_display(x) {
|
|
72
|
+
if (x) {
|
|
73
|
+
if (x._display) {
|
|
74
|
+
if (x._display instanceof Function) {
|
|
75
|
+
return x._display();
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
return x._display;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
if (this._tpl) {
|
|
82
|
+
return this._tpl(x);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return '';
|
|
86
|
+
}
|
|
87
|
+
_search(text$) {
|
|
88
|
+
return text$.pipe(takeUntil(this._subscription), debounceTime(750), distinctUntilChanged(), switchMap((term) => {
|
|
89
|
+
const f = {};
|
|
90
|
+
for (const k of Object.keys(this.filter)) {
|
|
91
|
+
if (this.filter[k] !== null || this.filter[k] !== undefined) {
|
|
92
|
+
f[k] = this.filter[k];
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
f[this.search] = term;
|
|
96
|
+
const qs = this.queryset;
|
|
97
|
+
qs.filter(f, true);
|
|
98
|
+
return qs.get();
|
|
99
|
+
}));
|
|
100
|
+
}
|
|
101
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: FkselectComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
102
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.0", 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"] }] }); }
|
|
103
|
+
}
|
|
104
|
+
export { FkselectComponent };
|
|
105
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: FkselectComponent, decorators: [{
|
|
106
|
+
type: Component,
|
|
107
|
+
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>" }]
|
|
108
|
+
}], ctorParameters: function () { return []; }, propDecorators: { model: [{
|
|
109
|
+
type: Input
|
|
110
|
+
}], field: [{
|
|
111
|
+
type: Input
|
|
112
|
+
}], edit: [{
|
|
113
|
+
type: Input
|
|
114
|
+
}], value: [{
|
|
115
|
+
type: Input
|
|
116
|
+
}], queryset: [{
|
|
117
|
+
type: Input
|
|
118
|
+
}], collection: [{
|
|
119
|
+
type: Input
|
|
120
|
+
}], update: [{
|
|
121
|
+
type: Input
|
|
122
|
+
}], filter: [{
|
|
123
|
+
type: Input
|
|
124
|
+
}], mode: [{
|
|
125
|
+
type: Input
|
|
126
|
+
}], display: [{
|
|
127
|
+
type: Input
|
|
128
|
+
}], search: [{
|
|
129
|
+
type: Input
|
|
130
|
+
}], label: [{
|
|
131
|
+
type: Input
|
|
132
|
+
}], placeholder: [{
|
|
133
|
+
type: Input
|
|
134
|
+
}], inputClasses: [{
|
|
135
|
+
type: Input
|
|
136
|
+
}], selected: [{
|
|
137
|
+
type: Output
|
|
138
|
+
}], cancelled: [{
|
|
139
|
+
type: Output
|
|
140
|
+
}], cleared: [{
|
|
141
|
+
type: Output
|
|
142
|
+
}] } });
|
|
143
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmtzZWxlY3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGF0YS9zcmMvbGliL2Rpc3BlZGl0L2Zrc2VsZWN0L2Zrc2VsZWN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2RhdGEvc3JjL2xpYi9kaXNwZWRpdC9ma3NlbGVjdC9ma3NlbGVjdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBSXZCLE9BQU8sRUFDTCxZQUFZLEVBQ1osb0JBQW9CLEVBRXBCLE9BQU8sRUFDUCxTQUFTLEdBQ1YsTUFBTSxNQUFNLENBQUM7QUFDZCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFFLG1CQUFtQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDOzs7OztBQUloRSxNQU9hLGlCQUFpQjtJQWdDNUI7UUExQmdCLFNBQUksR0FBRyxLQUFLLENBQUM7UUFNYixXQUFNLEdBQVksS0FBSyxDQUFDO1FBQ3hCLFdBQU0sR0FBZSxFQUFFLENBQUM7UUFDeEIsU0FBSSxHQUF1QyxNQUFNLENBQUM7UUFFbEQsV0FBTSxHQUFHLFFBQVEsQ0FBQztRQUVsQyxVQUFVO1FBQ00sVUFBSyxHQUFHLEVBQUUsQ0FBQztRQUNYLGdCQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ2pCLGlCQUFZLEdBQXNCLEVBQUUsQ0FBQztRQUVwQyxhQUFRLEdBQUcsSUFBSSxZQUFZLEVBQUssQ0FBQztRQUNqQyxjQUFTLEdBQUcsSUFBSSxZ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LEVBQUUsbUJBQW1CLEVBQUUsa0JBQWtCLENBQUM7MEVBTWhELEtBQUs7c0JBQXBCLEtBQUs7Z0JBQ1UsS0FBSztzQkFBcEIsS0FBSztnQkFDVSxJQUFJO3NCQUFuQixLQUFLO2dCQUVVLEtBQUs7c0JBQXBCLEtBQUs7Z0JBRVUsUUFBUTtzQkFBdkIsS0FBSztnQkFDVSxVQUFVO3NCQUF6QixLQUFLO2dCQUNVLE1BQU07c0JBQXJCLEtBQUs7Z0JBQ1UsTUFBTTtzQkFBckIsS0FBSztnQkFDVSxJQUFJO3NCQUFuQixLQUFLO2dCQUNVLE9BQU87c0JBQXRCLEtBQUs7Z0JBQ1UsTUFBTTtzQkFBckIsS0FBSztnQkFHVSxLQUFLO3NCQUFwQixLQUFLO2dCQUNVLFdBQVc7c0JBQTFCLEtBQUs7Z0JBQ1UsWUFBWTtzQkFBM0IsS0FBSztnQkFFVyxRQUFRO3NCQUF4QixNQUFNO2dCQUNVLFNBQVM7c0JBQXpCLE1BQU07Z0JBQ1UsT0FBTztzQkFBdkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEYXRhTW9kZWwgfSBmcm9tICcuLi8uLi9kYXRhL2RhdGEtbW9kZWwnO1xuaW1wb3J0IHsgRmlsdGVyRGF0YSwgUXVlcnlzZXQgfSBmcm9tICcuLi8uLi9kYXRhL2RhdGEtcXVlcnknO1xuaW1wb3J0IHsgQ29sbGVjdGlvbiB9IGZyb20gJy4uLy4uL2RhdGEvZGF0YS1jb2xsZWN0aW9uJztcbmltcG9ydCB7XG4gIGRlYm91bmNlVGltZSxcbiAgZGlzdGluY3RVbnRpbENoYW5nZWQsXG4gIE9ic2VydmFibGUsXG4gIFN1YmplY3QsXG4gIHRha2VVbnRpbCxcbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBzd2l0Y2hNYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBVbnR5cGVkRm9ybUNvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgTmdiVHlwZWFoZWFkTW9kdWxlIH0gZnJvbSAnQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXAnO1xuXG5leHBvcnQgdHlwZSBUcGxGdW48VCBleHRlbmRzIERhdGFNb2RlbD4gPSAoZGF0YTogVCkgPT4gc3RyaW5nO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdkYXRhLWZrc2VsZWN0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2Zrc2VsZWN0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZmtzZWxlY3QuY29tcG9uZW50LnNhc3MnXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZSwgTmdiVHlwZWFoZWFkTW9kdWxlXSxcbn0pXG5leHBvcnQgY2xhc3MgRmtzZWxlY3RDb21wb25lbnQ8VCBleHRlbmRzIERhdGFNb2RlbCwgUiBleHRlbmRzIERhdGFNb2RlbD5cbiAgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveVxue1xuICAvLyBNb2RlbCBmaWVsZCB2YWx1ZSAmIHVwZGF0ZSBkYXRhXG4gIEBJbnB1dCgpIHB1YmxpYyBtb2RlbD86IFQ7XG4gIEBJbnB1dCgpIHB1YmxpYyBmaWVsZD86IHN0cmluZztcbiAgQElucHV0KCkgcHVibGljIGVkaXQgPSBmYWxzZTtcbiAgLy8gUmF3IHZhbHVlXG4gIEBJbnB1dCgpIHB1YmxpYyB2YWx1ZT86IFI7XG5cbiAgQElucHV0KCkgcHVibGljIHF1ZXJ5c2V0PzogUXVlcnlzZXQ8Uj47XG4gIEBJbnB1dCgpIHB1YmxpYyBjb2xsZWN0aW9uPzogQ29sbGVjdGlvbjxSPjtcbiAgQElucHV0KCkgcHVibGljIHVwZGF0ZTogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBwdWJsaWMgZmlsdGVyOiBGaWx0ZXJEYXRhID0ge307XG4gIEBJbnB1dCgpIHB1YmxpYyBtb2RlOiAnYXV0b2NvbXBsZXRlJyB8ICdzZWxlY3QnIHwgJ2F1dG8nID0gJ2F1dG8nO1xuICBASW5wdXQoKSBwdWJsaWMgZGlzcGxheT86IHN0cmluZyB8IFRwbEZ1bjxSPjtcbiAgQElucHV0KCkgcHVibGljIHNlYXJjaCA9ICdzZWFyY2gnO1xuXG4gIC8vIERpc3BsYXlcbiAgQElucHV0KCkgcHVibGljIGxhYmVsID0gJyc7XG4gIEBJbnB1dCgpIHB1YmxpYyBwbGFjZWhvbGRlciA9ICcnO1xuICBASW5wdXQoKSBwdWJsaWMgaW5wdXRDbGFzc2VzOiBzdHJpbmdbXSB8IHN0cmluZyA9IFtdO1xuXG4gIEBPdXRwdXQoKSBwdWJsaWMgc2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFQ+KCk7XG4gIEBPdXRwdXQoKSBwdWJsaWMgY2FuY2VsbGVkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgcHVibGljIGNsZWFyZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIHB1YmxpYyBmYyE6IFVudHlwZWRGb3JtQ29udHJvbDtcbiAgcHVibGljIHNlYXJjaEZuID0gdGhpcy5fc2VhcmNoLmJpbmQodGhpcyk7XG4gIHB1YmxpYyBkaXNwbGF5Rm4gPSB0aGlzLl9kaXNwbGF5LmJpbmQodGhpcyk7XG4gIHByaXZhdGUgX3N1YnNjcmlwdGlvbiA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByaXZhdGUgX3RwbCE6IFRwbEZ1bjxSPjtcblxuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuX3N1YnNjcmlwdGlvbi5uZXh0KCk7XG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uLmNvbXBsZXRlKCk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgLy8gQ3JlYXRlIHF1ZXJ5c2V0IGlmIG5vdCBnaXZlblxuICAgIC8vIHF1ZXJ5c2V0IGlzIGNyZWF0ZSB0aHJvdWdoIG1vZGVsXG4gICAgaWYgKCF0aGlzLnF1ZXJ5c2V0ICYmIHRoaXMuY29sbGVjdGlvbikge1xuICAgICAgdGhpcy5xdWVyeXNldCA9IHRoaXMuY29sbGVjdGlvbi5xdWVyeXNldCgpO1xuICAgIH0gZWxzZSBpZiAoIXRoaXMucXVlcnlzZXQgJiYgdGhpcy5tb2RlbCAmJiB0aGlzLm1vZGVsLl9jb2xsZWN0aW9uKSB7XG4gICAgICB0aGlzLmNvbGxlY3Rpb24gPSB0aGlzLm1vZGVsLl9jb2xsZWN0aW9uO1xuICAgICAgdGhpcy5xdWVyeXNldCA9IHRoaXMuY29sbGVjdGlvbi5xdWVyeXNldCgpO1xuICAgIH1cbiAgICB0aGlzLmZjID0gbmV3IFVudHlwZWRGb3JtQ29udHJvbCgnJyk7XG4gICAgdGhpcy5mYy52YWx1ZUNoYW5nZXNcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLl9zdWJzY3JpcHRpb24pLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKVxuICAgICAgLnN1YnNjcmliZSgodmFsdWUpID0+IHtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3RlZC5lbWl0KHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgaWYgKHRoaXMuZGlzcGxheSkge1xuICAgICAgaWYgKHRoaXMuZGlzcGxheSAmJiB0eXBlb2YgdGhpcy5kaXNwbGF5ID09PSAnc3RyaW5nJykge1xuICAgICAgICB0aGlzLl90cGwgPSAobW9kZWw6IFIpID0+IGAkeyhtb2RlbCBhcyBhbnkpW3RoaXMuZGlzcGxheSBhcyBzdHJpbmddfWA7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuZGlzcGxheSAmJiB0eXBlb2YgdGhpcy5kaXNwbGF5ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRoaXMuX3RwbCA9IHRoaXMuZGlzcGxheS5iaW5kKHRoaXMpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl90cGwgPSAobW9kZWw6IFIpID0+XG4gICAgICAgIGAke1xuICAgICAgICAgIChtb2RlbCBhcyBhbnkpWyduYW1lJ10gfHxcbiAgICAgICAgICAobW9kZWwgYXMgYW55KVsndGl0bGUnXSB8fFxuICAgICAgICAgIChtb2RlbCBhcyBhbnkpWydpZCddXG4gICAgICAgIH1gO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBjbGVhckFjdGlvbigpOiB2b2lkIHtcbiAgICB0aGlzLmNsZWFyZWQuZW1pdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3BsYXkgZnVuY3Rpb24uIFVzZXMgZGVzY2ZpZWxkIG9yIGRlc2MgdHBsIChsb2Rhc2ggdGVtcGxhdGUgdXNpbmcgbW9kZWwgZmllbGRzKS5cbiAgICovXG4gIHByaXZhdGUgX2Rpc3BsYXkoeDogYW55KTogYW55IHtcbiAgICBpZiAoeCkge1xuICAgICAgaWYgKHguX2Rpc3BsYXkpIHtcbiAgICAgICAgaWYgKHguX2Rpc3BsYXkgaW5zdGFuY2VvZiBGdW5jdGlvbikge1xuICAgICAgICAgIHJldHVybiB4Ll9kaXNwbGF5KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHguX2Rpc3BsYXk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLl90cGwpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RwbCh4KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2VhcmNoKHRleHQkOiBPYnNlcnZhYmxlPHN0cmluZz4pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybiB0ZXh0JC5waXBlKFxuICAgICAgdGFrZVVudGlsKHRoaXMuX3N1YnNjcmlwdGlvbiksXG4gICAgICBkZWJvdW5jZVRpbWUoNzUwKSxcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICBzd2l0Y2hNYXAoKHRlcm0pID0+IHtcbiAgICAgICAgY29uc3QgZjogYW55ID0ge307XG4gICAgICAgIGZvciAoY29uc3QgayBvZiBPYmplY3Qua2V5cyh0aGlzLmZpbHRlcikpIHtcbiAgICAgICAgICBpZiAodGhpcy5maWx0ZXJba10gIT09IG51bGwgfHwgdGhpcy5maWx0ZXJba10gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZltrXSA9IHRoaXMuZmlsdGVyW2tdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmW3RoaXMuc2VhcmNoXSA9IHRlcm07XG4gICAgICAgIGNvbnN0IHFzID0gdGhpcy5xdWVyeXNldCBhcyBRdWVyeXNldDxhbnk+O1xuICAgICAgICBxcy5maWx0ZXIoZiwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiBxcy5nZXQoKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuIiwiXG48ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuICA8bGFiZWwgKm5nSWY9XCJsYWJlbFwiPnt7bGFiZWx9fTwvbGFiZWw+XG4gIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cFwiPlxuICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY29udHJvbFwiIFtmb3JtQ29udHJvbF09XCJmY1wiIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclwiIFtuZ2JUeXBlYWhlYWRdPVwic2VhcmNoRm5cIiBbZWRpdGFibGVdPVwiZmFsc2VcIiBbZm9jdXNGaXJzdF09XCJ0cnVlXCIgW2lucHV0Rm9ybWF0dGVyXT1cImRpc3BsYXlGblwiIFtyZXN1bHRGb3JtYXR0ZXJdPVwiZGlzcGxheUZuXCIgKGtleXVwLmVzY2FwZSk9XCJjYW5jZWxsZWQuZW1pdCgpXCI+XG4gICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwLXRleHRcIj48aSBjbGFzcz1cImJpIGJpLXRyYXNoIGZsb2F0LWVuZCBwb2ludGVyXCIgKGNsaWNrKT1cImNsZWFyQWN0aW9uKClcIj48L2k+PC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+Il19
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { Component, Input } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { debounceTime, firstValueFrom, Subject, takeUntil, } from 'rxjs';
|
|
4
|
+
import { FormControl, ReactiveFormsModule } from '@angular/forms';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "../../messages/message.service";
|
|
7
|
+
import * as i2 from "@angular/common";
|
|
8
|
+
import * as i3 from "@angular/forms";
|
|
9
|
+
class FlagsComponent {
|
|
10
|
+
constructor(_msg) {
|
|
11
|
+
this._msg = _msg;
|
|
12
|
+
this.field = 'flags';
|
|
13
|
+
// FIXME: make all flags endpoint as optional parameters
|
|
14
|
+
this.get_flags_endpoint = 'get_flags';
|
|
15
|
+
this.edit = false;
|
|
16
|
+
this.editable = true;
|
|
17
|
+
this.free = false;
|
|
18
|
+
this.create = true;
|
|
19
|
+
this.action = false; // if set to true, use add_flag and remove_flag model actions
|
|
20
|
+
this.curflags = [];
|
|
21
|
+
this.txtflag = '';
|
|
22
|
+
this.selflag = '';
|
|
23
|
+
this.flaglist = [];
|
|
24
|
+
this._subscriptions$ = new Subject();
|
|
25
|
+
}
|
|
26
|
+
ngOnDestroy() {
|
|
27
|
+
this._subscriptions$.next();
|
|
28
|
+
this._subscriptions$.complete();
|
|
29
|
+
}
|
|
30
|
+
async ngOnInit() {
|
|
31
|
+
if (!this.flags && this.model._collection) {
|
|
32
|
+
this.flags = this.model._collection.action(null, 'GET', this.get_flags_endpoint);
|
|
33
|
+
}
|
|
34
|
+
if (this.model && this.field && this.model[this.field]) {
|
|
35
|
+
this.curflags = this.model[this.field];
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
console.warn('Model or field problem in flagsfield component');
|
|
39
|
+
this.curflags = [];
|
|
40
|
+
}
|
|
41
|
+
this.ft = new FormControl('');
|
|
42
|
+
this.fs = new FormControl('');
|
|
43
|
+
this.fs.valueChanges
|
|
44
|
+
.pipe(takeUntil(this._subscriptions$), debounceTime(250))
|
|
45
|
+
.subscribe((value) => {
|
|
46
|
+
if (value) {
|
|
47
|
+
this.addFlag(value);
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
async addFreeFlag() {
|
|
52
|
+
await this.addFlag(this.ft.value);
|
|
53
|
+
}
|
|
54
|
+
async addFlag(flag) {
|
|
55
|
+
if (!this.flagPresent(flag)) {
|
|
56
|
+
this.curflags.push(flag);
|
|
57
|
+
if (this.action) {
|
|
58
|
+
try {
|
|
59
|
+
await firstValueFrom(this.model.action('POST', 'add_flag', { body: { flag } }));
|
|
60
|
+
this._msg.success('Flag enregistré avec succès');
|
|
61
|
+
}
|
|
62
|
+
catch (e) {
|
|
63
|
+
this._msg.error('Erreur lors de la sauvegarde', e);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
await this.update();
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
async update() {
|
|
72
|
+
this.model[this.field] = this.curflags;
|
|
73
|
+
try {
|
|
74
|
+
await firstValueFrom(this.model.update([this.field]));
|
|
75
|
+
this.fs.setValue('', { emitEvent: false });
|
|
76
|
+
this.ft.setValue('', { emitEvent: false });
|
|
77
|
+
this._msg.success('Flag enregistré avec succès');
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
this._msg.error('Erreur lors de la sauvegarde', `API Return : ${error}`, error._body);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
flagPresent(flag) {
|
|
84
|
+
return this.curflags.findIndex((f) => flag === f) !== -1;
|
|
85
|
+
}
|
|
86
|
+
async removeFlag(flag) {
|
|
87
|
+
this.curflags.splice(this.curflags.findIndex((f) => flag === f), 1);
|
|
88
|
+
if (this.action) {
|
|
89
|
+
try {
|
|
90
|
+
await firstValueFrom(this.model.action('POST', 'remove_flag', { body: { flag } }));
|
|
91
|
+
this._msg.success('Removed');
|
|
92
|
+
}
|
|
93
|
+
catch (e) {
|
|
94
|
+
this._msg.error('Removing flag failed', e);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
await this.update();
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
async toggleEdit() {
|
|
102
|
+
if (this.editable) {
|
|
103
|
+
if (!this.edit) {
|
|
104
|
+
this.flaglist = await firstValueFrom(this.flags);
|
|
105
|
+
this.edit = true;
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
this.edit = false;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
this.edit = false;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: FlagsComponent, deps: [{ token: i1.DataMessageService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
116
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.0", 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"] }] }); }
|
|
117
|
+
}
|
|
118
|
+
export { FlagsComponent };
|
|
119
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: FlagsComponent, decorators: [{
|
|
120
|
+
type: Component,
|
|
121
|
+
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>" }]
|
|
122
|
+
}], ctorParameters: function () { return [{ type: i1.DataMessageService }]; }, propDecorators: { model: [{
|
|
123
|
+
type: Input
|
|
124
|
+
}], field: [{
|
|
125
|
+
type: Input
|
|
126
|
+
}], get_flags_endpoint: [{
|
|
127
|
+
type: Input
|
|
128
|
+
}], edit: [{
|
|
129
|
+
type: Input
|
|
130
|
+
}], editable: [{
|
|
131
|
+
type: Input
|
|
132
|
+
}], flags: [{
|
|
133
|
+
type: Input
|
|
134
|
+
}], free: [{
|
|
135
|
+
type: Input
|
|
136
|
+
}], create: [{
|
|
137
|
+
type: Input
|
|
138
|
+
}], action: [{
|
|
139
|
+
type: Input
|
|
140
|
+
}] } });
|
|
141
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxhZ3MuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGF0YS9zcmMvbGliL2Rpc3BlZGl0L2ZsYWdzL2ZsYWdzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2RhdGEvc3JjL2xpYi9kaXNwZWRpdC9mbGFncy9mbGFncy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFDcEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRS9DLE9BQU8sRUFDTCxZQUFZLEVBQ1osY0FBYyxFQUVkLE9BQU8sRUFDUCxTQUFTLEdBQ1YsTUFBTSxNQUFNLENBQUM7QUFDZCxPQUFPLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7O0FBUWxFLE1BT2EsY0FBYztJQW1CekIsWUFBb0IsSUFBd0I7UUFBeEIsU0FBSSxHQUFKLElBQUksQ0FBb0I7UUFqQjVCLFVBQUssR0FBRyxPQUFPLENBQUM7UUFDaEMsd0RBQXdEO1FBQ3hDLHVCQUFrQixHQUFHLFdBQVcsQ0FBQztRQUNqQyxTQUFJLEdBQVksS0FBSyxDQUFDO1FBQ3RCLGFBQVEsR0FBWSxJQUFJLENBQUM7UUFFekIsU0FBSSxHQUFHLEtBQUssQ0FBQztRQUNiLFdBQU0sR0FBRyxJQUFJLENBQUM7UUFDZCxXQUFNLEdBQUcsS0FBSyxDQUFDLENBQUMsNkRBQTZEO1FBR3RGLGFBQVEsR0FBYSxFQUFFLENBQUM7UUFDeEIsWUFBTyxHQUFHLEVBQUUsQ0FBQztRQUNiLFlBQU8sR0FBRyxFQUFFLENBQUM7UUFDYixhQUFRLEdBQWdCLEVBQUUsQ0FBQztRQUMxQixvQkFBZSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7SUFFQyxDQUFDO0lBRXpDLFdBQVc7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QUFJLENBQUMsTUFBTSxFQUFFLENBQUM7U0FDckI7SUFDSCxDQUFDO0lBRU0sS0FBSyxDQUFDLFVBQVU7UUFDckIsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2pCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFO2dCQUNkLElBQUksQ0FBQyxRQUFRLEdBQUcsTUFBTSxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNqRCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQzthQUNsQjtpQkFBTTtnQkFDTCxJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQzthQUNuQjtTQUNGO2FBQU07WUFDTCxJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQztTQUNuQjtJQUNILENBQUM7OEdBM0hVLGNBQWM7a0dBQWQsY0FBYyxrUUN6QjNCLHU1Q0EwQksseURETE8sWUFBWSwrUEFBRSxtQkFBbUI7O1NBSWhDLGNBQWM7MkZBQWQsY0FBYztrQkFQMUIsU0FBUzsrQkFDRSxZQUFZLGNBQ1YsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLG1CQUFtQixDQUFDO3lHQUs1QixLQUFLO3NCQUFwQixLQUFLO2dCQUNVLEtBQUs7c0JBQXBCLEtBQUs7Z0JBRVUsa0JBQWtCO3NCQUFqQyxLQUFLO2dCQUNVLElBQUk7c0JBQW5CLEtBQUs7Z0JBQ1UsUUFBUTtzQkFBdkIsS0FBSztnQkFDVSxLQUFLO3NCQUFwQixLQUFLO2dCQUNVLElBQUk7c0JBQW5CLEtBQUs7Z0JBQ1UsTUFBTTtzQkFBckIsS0FBSztnQkFDVSxNQUFNO3NCQUFyQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBEYXRhTW9kZWwgfSBmcm9tICcuLi8uLi9kYXRhL2RhdGEtbW9kZWwnO1xuaW1wb3J0IHtcbiAgZGVib3VuY2VUaW1lLFxuICBmaXJzdFZhbHVlRnJvbSxcbiAgT2JzZXJ2YWJsZSxcbiAgU3ViamVjdCxcbiAgdGFrZVVudGlsLFxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEZvcm1Db250cm9sLCBSZWFjdGl2ZUZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRGF0YU1lc3NhZ2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vbWVzc2FnZXMvbWVzc2FnZS5zZXJ2aWNlJztcblxuZXhwb3J0IGludGVyZmFjZSBJRmxhZ0l0ZW0ge1xuICBmbGFnOiBzdHJpbmc7XG4gIGNvdW50OiBudW1iZXI7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2RhdGEtZmxhZ3MnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlXSxcbiAgdGVtcGxhdGVVcmw6ICcuL2ZsYWdzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZmxhZ3MuY29tcG9uZW50LnNhc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgRmxhZ3NDb21wb25lbnQ8VCBleHRlbmRzIERhdGFNb2RlbD4gaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgpIHB1YmxpYyBtb2RlbCE6IFQ7XG4gIEBJbnB1dCgpIHB1YmxpYyBmaWVsZCA9ICdmbGFncyc7XG4gIC8vIEZJWE1FOiBtYWtlIGFsbCBmbGFncyBlbmRwb2ludCBhcyBvcHRpb25hbCBwYXJhbWV0ZXJzXG4gIEBJbnB1dCgpIHB1YmxpYyBnZXRfZmxhZ3NfZW5kcG9pbnQgPSAnZ2V0X2ZsYWdzJztcbiAgQElucHV0KCkgcHVibGljIGVkaXQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgcHVibGljIGVkaXRhYmxlOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgcHVibGljIGZsYWdzITogT2JzZXJ2YWJsZTxJRmxhZ0l0ZW1bXT47XG4gIEBJbnB1dCgpIHB1YmxpYyBmcmVlID0gZmFsc2U7XG4gIEBJbnB1dCgpIHB1YmxpYyBjcmVhdGUgPSB0cnVlO1xuICBASW5wdXQoKSBwdWJsaWMgYWN0aW9uID0gZmFsc2U7IC8vIGlmIHNldCB0byB0cnVlLCB1c2UgYWRkX2ZsYWcgYW5kIHJlbW92ZV9mbGFnIG1vZGVsIGFjdGlvbnNcbiAgcHVibGljIGZ0ITogRm9ybUNvbnRyb2w7XG4gIHB1YmxpYyBmcyE6IEZvcm1Db250cm9sO1xuICBwdWJsaWMgY3VyZmxhZ3M6IHN0cmluZ1tdID0gW107XG4gIHB1YmxpYyB0eHRmbGFnID0gJyc7XG4gIHB1YmxpYyBzZWxmbGFnID0gJyc7XG4gIHB1YmxpYyBmbGFnbGlzdDogSUZsYWdJdGVtW10gPSBbXTtcbiAgcHJpdmF0ZSBfc3Vic2NyaXB0aW9ucyQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX21zZzogRGF0YU1lc3NhZ2VTZXJ2aWNlKSB7fVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLl9zdWJzY3JpcHRpb25zJC5uZXh0KCk7XG4gICAgdGhpcy5fc3Vic2NyaXB0aW9ucyQuY29tcGxldGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBuZ09uSW5pdCgpOiBQcm9taXNlPGFueT4ge1xuICAgIGlmICghdGhpcy5mbGFncyAmJiB0aGlzLm1vZGVsLl9jb2xsZWN0aW9uKSB7XG4gICAgICB0aGlzLmZsYWdzID0gdGhpcy5tb2RlbC5fY29sbGVjdGlvbi5hY3Rpb24oXG4gICAgICAgIG51bGwsXG4gICAgICAgICdHRVQnLFxuICAgICAgICB0aGlzLmdldF9mbGFnc19lbmRwb2ludFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHRoaXMubW9kZWwgJiYgdGhpcy5maWVsZCAmJiAodGhpcy5tb2RlbCBhcyBhbnkpW3RoaXMuZmllbGRdKSB7XG4gICAgICB0aGlzLmN1cmZsYWdzID0gKHRoaXMubW9kZWwgYXMgYW55KVt0aGlzLmZpZWxkXTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS53YXJuKCdNb2RlbCBvciBmaWVsZCBwcm9ibGVtIGluIGZsYWdzZmllbGQgY29tcG9uZW50Jyk7XG4gICAgICB0aGlzLmN1cmZsYWdzID0gW107XG4gICAgfVxuICAgIHRoaXMuZnQgPSBuZXcgRm9ybUNvbnRyb2woJycpO1xuICAgIHRoaXMuZnMgPSBuZXcgRm9ybUNvbnRyb2woJycpO1xuICAgIHRoaXMuZnMudmFsdWVDaGFuZ2VzXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5fc3Vic2NyaXB0aW9ucyQpLCBkZWJvdW5jZVRpbWUoMjUwKSlcbiAgICAgIC5zdWJzY3JpYmUoKHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgdGhpcy5hZGRGbGFnKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgYWRkRnJlZUZsYWcoKTogUHJvbWlzZTxhbnk+IHtcbiAgICBhd2FpdCB0aGlzLmFkZEZsYWcodGhpcy5mdC52YWx1ZSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgYWRkRmxhZyhmbGFnOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgIGlmICghdGhpcy5mbGFnUHJlc2VudChmbGFnKSkge1xuICAgICAgdGhpcy5jdXJmbGFncy5wdXNoKGZsYWcpO1xuICAgICAgaWYgKHRoaXMuYWN0aW9uKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgZmlyc3RWYWx1ZUZyb20oXG4gICAgICAgICAgICB0aGlzLm1vZGVsLmFjdGlvbignUE9TVCcsICdhZGRfZmxhZycsIHsgYm9keTogeyBmbGFnIH0gfSlcbiAgICAgICAgICApO1xuICAgICAgICAgIHRoaXMuX21zZy5zdWNjZXNzKCdGbGFnIGVucmVnaXN0csOpIGF2ZWMgc3VjY8OocycpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgdGhpcy5fbXNnLmVycm9yKCdFcnJldXIgbG9ycyBkZSBsYSBzYXV2ZWdhcmRlJywgZSBhcyBhbnkpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBhc3luYyB1cGRhdGUoKTogUHJvbWlzZTxhbnk+IHtcbiAgICAodGhpcy5tb2RlbCBhcyBhbnkpW3RoaXMuZmllbGRdID0gdGhpcy5jdXJmbGFncztcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZmlyc3RWYWx1ZUZyb20odGhpcy5tb2RlbC51cGRhdGUoW3RoaXMuZmllbGRdKSk7XG4gICAgICB0aGlzLmZzLnNldFZhbHVlKCcnLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICB0aGlzLmZ0LnNldFZhbHVlKCcnLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICB0aGlzLl9tc2cuc3VjY2VzcygnRmxhZyBlbnJlZ2lzdHLDqSBhdmVjIHN1Y2PDqHMnKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5fbXNnLmVycm9yKFxuICAgICAgICAnRXJyZXVyIGxvcnMgZGUgbGEgc2F1dmVnYXJkZScsXG4gICAgICAgIGBBUEkgUmV0dXJuIDogJHtlcnJvcn1gLFxuICAgICAgICAoZXJyb3IgYXMgYW55KS5fYm9keVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZmxhZ1ByZXNlbnQoZmxhZzogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY3VyZmxhZ3MuZmluZEluZGV4KChmKSA9PiBmbGFnID09PSBmKSAhPT0gLTE7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgcmVtb3ZlRmxhZyhmbGFnOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgIHRoaXMuY3VyZmxhZ3Muc3BsaWNlKFxuICAgICAgdGhpcy5jdXJmbGFncy5maW5kSW5kZXgoKGYpID0+IGZsYWcgPT09IGYpLFxuICAgICAgMVxuICAgICk7XG4gICAgaWYgKHRoaXMuYWN0aW9uKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBmaXJzdFZhbHVlRnJvbShcbiAgICAgICAgICB0aGlzLm1vZGVsLmFjdGlvbignUE9TVCcsICdyZW1vdmVfZmxhZycsIHsgYm9keTogeyBmbGFnIH0gfSlcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5fbXNnLnN1Y2Nlc3MoJ1JlbW92ZWQnKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhpcy5fbXNnLmVycm9yKCdSZW1vdmluZyBmbGFnIGZhaWxlZCcsIGUgYXMgYW55KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgdGhpcy51cGRhdGUoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgdG9nZ2xlRWRpdCgpIHtcbiAgICBpZiAodGhpcy5lZGl0YWJsZSkge1xuICAgICAgaWYgKCF0aGlzLmVkaXQpIHtcbiAgICAgICAgdGhpcy5mbGFnbGlzdCA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKHRoaXMuZmxhZ3MpO1xuICAgICAgICB0aGlzLmVkaXQgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5lZGl0ID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZWRpdCA9IGZhbHNlO1xuICAgIH1cbiAgfVxufVxuIiwiXG48ZHQgKGNsaWNrKT1cInRvZ2dsZUVkaXQoKVwiIHJvbGU9XCJidXR0b25cIj5cbiAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuPC9kdD5cbjxkZCAqbmdJZj1cIiFlZGl0XCIgKGNsaWNrKT1cInRvZ2dsZUVkaXQoKVwiIHJvbGU9XCJidXR0b25cIj48c3BhbiBjbGFzcz1cImJhZGdlIGJnLWluZm8gbWUtMVwiICpuZ0Zvcj1cImxldCBmbGFnIG9mIGN1cmZsYWdzXCI+e3tmbGFnfX08L3NwYW4+PC9kZD5cbjxkZCAqbmdJZj1cImVkaXRcIj5cbiAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZnJlZVwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbFwiPlxuICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3QgZm9ybS1zZWxlY3Qtc21cIiBbZm9ybUNvbnRyb2xdPVwiZnNcIj5cbiAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBmbGFnIG9mIGZsYWdsaXN0XCIgW3ZhbHVlXT1cImZsYWcuZmxhZ1wiPnt7ZmxhZy5mbGFnfX08c3BhbiBjbGFzcz1cIm1zLTFcIiAqbmdJZj1cImZsYWcuY291bnRcIj4oe3tmbGFnLmNvdW50fX0pPC9zcGFuPjwvb3B0aW9uPlxuICAgICAgICA8L3NlbGVjdD5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNvbFwiICpuZ0lmPVwiY3JlYXRlXCI+XG4gICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY29udHJvbCBmb3JtLWNvbnRyb2wtc21cIiBwbGFjZWhvbGRlcj1cIk5vdXZlYXUgZmxhZ1wiIFtmb3JtQ29udHJvbF09XCJmdFwiIChrZXl1cC5lbnRlcik9XCJhZGRGcmVlRmxhZygpXCI+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZnJlZVwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMlwiPlxuICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZm9ybS1zZWxlY3Qtc21cIiBwbGFjZWhvbGRlcj1cIk5vdXZlYXUgZmxhZ1wiIFtmb3JtQ29udHJvbF09XCJmdFwiIChrZXl1cC5lbnRlcik9XCJhZGRGcmVlRmxhZygpXCIgKGtleXVwLmVzY2FwZSk9XCJ0b2dnbGVFZGl0KClcIj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tMTJcIj48c3BhbiBjbGFzcz1cImJhZGdlIGJnLWluZm8gbWUtMVwiICpuZ0Zvcj1cImxldCBmbGFnIG9mIGN1cmZsYWdzXCIgKGNsaWNrKT1cInJlbW92ZUZsYWcoZmxhZylcIiByb2xlPVwiYnV0dG9uXCI+PGkgY2xhc3M9XCJiaSBiaS10cmFzaCBtZS0xXCI+PC9pPnt7ZmxhZ319PC9zcGFuPjxpIGNsYXNzPVwiYmkgYmkteC1sZyB0ZXh0LW11dGVkIG1zLTJcIiByb2xlPVwiYnV0dG9uXCIgKGNsaWNrKT1cInRvZ2dsZUVkaXQoKVwiPjwvaT48L2Rpdj5cbiAgPC9kaXY+XG48L2RkPiJdfQ==
|