@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,319 @@
|
|
|
1
|
+
import { Component, EventEmitter, Input, Output, } from '@angular/core';
|
|
2
|
+
import { NG_VALUE_ACCESSOR, ReactiveFormsModule, UntypedFormControl, } from '@angular/forms';
|
|
3
|
+
import { debounceTime, distinctUntilChanged, firstValueFrom, Subject, takeUntil, } from 'rxjs';
|
|
4
|
+
import { switchMap } from 'rxjs/operators';
|
|
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 M2mselectComponent {
|
|
12
|
+
constructor() {
|
|
13
|
+
this.edit = false;
|
|
14
|
+
this.pks = [];
|
|
15
|
+
this.disabled = false;
|
|
16
|
+
this.filter = {};
|
|
17
|
+
this.mode = 'auto';
|
|
18
|
+
this.search = 'search';
|
|
19
|
+
// Display
|
|
20
|
+
this.label = '';
|
|
21
|
+
this.placeholder = '';
|
|
22
|
+
this.emptyLabel = '';
|
|
23
|
+
this.inputClasses = [];
|
|
24
|
+
// Outputs
|
|
25
|
+
this.added = new EventEmitter();
|
|
26
|
+
this.removed = new EventEmitter();
|
|
27
|
+
this.cancelled = new EventEmitter();
|
|
28
|
+
this.cleared = new EventEmitter();
|
|
29
|
+
this.detailsChanged = new EventEmitter();
|
|
30
|
+
this.changed = new EventEmitter();
|
|
31
|
+
this.searchFn = this._search.bind(this);
|
|
32
|
+
this.displayFn = this._display.bind(this);
|
|
33
|
+
this.touched = false;
|
|
34
|
+
this._subscription = new Subject();
|
|
35
|
+
/**
|
|
36
|
+
* Control value accessor onChange dummy callback;
|
|
37
|
+
* @param fks
|
|
38
|
+
*/
|
|
39
|
+
this.onChange = (fks) => { };
|
|
40
|
+
/**
|
|
41
|
+
* Control value accessor onTouched dummy callback;
|
|
42
|
+
*/
|
|
43
|
+
this.onTouched = () => { };
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* On Destroy clears subscriptions.
|
|
47
|
+
*/
|
|
48
|
+
ngOnDestroy() {
|
|
49
|
+
this._subscription.next();
|
|
50
|
+
this._subscription.complete();
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* OnChange register from controlValueAccessor
|
|
54
|
+
* @param onChange callback
|
|
55
|
+
*/
|
|
56
|
+
registerOnChange(onChange) {
|
|
57
|
+
this.onChange = onChange;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* OnTouched register from controlValueAccessor
|
|
61
|
+
* @param onTouched callback
|
|
62
|
+
*/
|
|
63
|
+
registerOnTouched(onTouched) {
|
|
64
|
+
this.onTouched = onTouched;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* OnInit :
|
|
68
|
+
* - ensures queryset is available
|
|
69
|
+
* - creates form control for input
|
|
70
|
+
* - creates display function
|
|
71
|
+
* - ensure values are set from any source
|
|
72
|
+
*/
|
|
73
|
+
ngOnInit() {
|
|
74
|
+
// Create queryset if not given
|
|
75
|
+
// queryset is create through model
|
|
76
|
+
if (!this.queryset && this.collection) {
|
|
77
|
+
this.queryset = this.collection.queryset();
|
|
78
|
+
}
|
|
79
|
+
else if (!this.queryset && this.model && this.model._collection) {
|
|
80
|
+
this.collection = this.model._collection;
|
|
81
|
+
this.queryset = this.collection.queryset();
|
|
82
|
+
}
|
|
83
|
+
if (!this.queryset) {
|
|
84
|
+
throw Error('queryset is mandatory for m2m select');
|
|
85
|
+
}
|
|
86
|
+
// Create form control for typeahead and subscribe for changes
|
|
87
|
+
this.fc = new UntypedFormControl('');
|
|
88
|
+
this.fc.valueChanges
|
|
89
|
+
.pipe(takeUntil(this._subscription), distinctUntilChanged())
|
|
90
|
+
.subscribe((value) => {
|
|
91
|
+
if (value) {
|
|
92
|
+
this.onAdd(value);
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
// Set display function
|
|
96
|
+
if (this.display) {
|
|
97
|
+
if (this.display && typeof this.display === 'string') {
|
|
98
|
+
this._tpl = (model) => `${model[this.display]}`;
|
|
99
|
+
}
|
|
100
|
+
else if (this.display && typeof this.display === 'function') {
|
|
101
|
+
this._tpl = this.display.bind(this);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
this._tpl = (model) => `${model['name'] ||
|
|
106
|
+
model['title'] ||
|
|
107
|
+
model['id']}`;
|
|
108
|
+
}
|
|
109
|
+
// Get values from model if not already given
|
|
110
|
+
// TODO: check if this is necessary
|
|
111
|
+
if (!this.values && this.model && this.field) {
|
|
112
|
+
this.values = this.model[this.field + '_details'];
|
|
113
|
+
}
|
|
114
|
+
if (this.values === undefined) {
|
|
115
|
+
console.error('no values available for ', this.model, this.field);
|
|
116
|
+
throw Error('no values available');
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Remove a value.
|
|
121
|
+
* Emits detailsChanged, changed and removed signals.
|
|
122
|
+
* @param i instance to be removed
|
|
123
|
+
*/
|
|
124
|
+
onRemove(i) {
|
|
125
|
+
if (!this.disabled) {
|
|
126
|
+
this.markAsTouched();
|
|
127
|
+
const ps = this.pks.indexOf(i.id);
|
|
128
|
+
this.pks.splice(ps, 1);
|
|
129
|
+
this.values.splice(ps, 1);
|
|
130
|
+
this.detailsChanged.emit(this.values);
|
|
131
|
+
this.changed.emit(this.pks);
|
|
132
|
+
this.removed.emit(i);
|
|
133
|
+
this.onChange(this.pks);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Add a value.
|
|
138
|
+
* Emits detailsChanged, changed and added signals.
|
|
139
|
+
* @param i instance to be added.
|
|
140
|
+
*/
|
|
141
|
+
onAdd(i) {
|
|
142
|
+
if (!this.disabled) {
|
|
143
|
+
this.markAsTouched();
|
|
144
|
+
this.pks.push(i.id);
|
|
145
|
+
this.values.push(i);
|
|
146
|
+
this.detailsChanged.emit(this.values);
|
|
147
|
+
this.changed.emit(this.pks);
|
|
148
|
+
this.added.emit(i);
|
|
149
|
+
this.onChange(this.pks);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Clear all values.
|
|
154
|
+
* Emits detailsChanged, changed and cleared signals.
|
|
155
|
+
*/
|
|
156
|
+
onClear() {
|
|
157
|
+
if (!this.disabled) {
|
|
158
|
+
this.markAsTouched();
|
|
159
|
+
this.pks = [];
|
|
160
|
+
this.values = [];
|
|
161
|
+
this.detailsChanged.emit(this.values);
|
|
162
|
+
this.changed.emit(this.pks);
|
|
163
|
+
this.cleared.emit();
|
|
164
|
+
this.onChange(this.pks);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Write value from controlValueAccessor.
|
|
169
|
+
* @param pks
|
|
170
|
+
*/
|
|
171
|
+
async writeValue(pks) {
|
|
172
|
+
this.pks = pks;
|
|
173
|
+
await this._getDisplayValues(pks);
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Mark as touched.
|
|
177
|
+
*/
|
|
178
|
+
markAsTouched() {
|
|
179
|
+
if (!this.touched) {
|
|
180
|
+
this.onTouched();
|
|
181
|
+
this.touched = true;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Mark as disabled.
|
|
186
|
+
* @param disabled
|
|
187
|
+
*/
|
|
188
|
+
setDisabledState(disabled) {
|
|
189
|
+
this.disabled = disabled;
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Retrieve display values for current set of pks.
|
|
193
|
+
* Eventually fetches items from collection.
|
|
194
|
+
* Emits detailsChanged signal.
|
|
195
|
+
* @param pks list of current pks.
|
|
196
|
+
* @private
|
|
197
|
+
*/
|
|
198
|
+
async _getDisplayValues(pks = []) {
|
|
199
|
+
const values = [];
|
|
200
|
+
for (const k of pks) {
|
|
201
|
+
let found = false;
|
|
202
|
+
for (let v of this.values) {
|
|
203
|
+
if (v.id == k) {
|
|
204
|
+
values.push(v);
|
|
205
|
+
found = true;
|
|
206
|
+
break;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
if (!found) {
|
|
210
|
+
if (this.collection) {
|
|
211
|
+
values.push(await firstValueFrom(this.collection.fetch(k)));
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
values.push({ id: k, _display: 'Unknown' });
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
this.values = values;
|
|
219
|
+
this.detailsChanged.next(this.values);
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Display function. Uses descfield or desc tpl (lodash template using model fields).
|
|
223
|
+
*/
|
|
224
|
+
_display(x) {
|
|
225
|
+
if (x) {
|
|
226
|
+
if (x._display) {
|
|
227
|
+
if (x._display instanceof Function) {
|
|
228
|
+
return x._display();
|
|
229
|
+
}
|
|
230
|
+
else {
|
|
231
|
+
return x._display;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
if (this._tpl) {
|
|
235
|
+
return this._tpl(x);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
return '';
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Search function.
|
|
242
|
+
* @param text$
|
|
243
|
+
* @private
|
|
244
|
+
*/
|
|
245
|
+
_search(text$) {
|
|
246
|
+
return text$.pipe(takeUntil(this._subscription), debounceTime(750), distinctUntilChanged(), switchMap((term) => {
|
|
247
|
+
const f = {};
|
|
248
|
+
for (const k of Object.keys(this.filter)) {
|
|
249
|
+
if (this.filter[k] !== null || this.filter[k] !== undefined) {
|
|
250
|
+
f[k] = this.filter[k];
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
f[this.search] = term;
|
|
254
|
+
const qs = this.queryset;
|
|
255
|
+
qs.filter(f, true);
|
|
256
|
+
return qs.get();
|
|
257
|
+
}));
|
|
258
|
+
}
|
|
259
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: M2mselectComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
260
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.0", 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: [
|
|
261
|
+
{
|
|
262
|
+
provide: NG_VALUE_ACCESSOR,
|
|
263
|
+
multi: true,
|
|
264
|
+
useExisting: M2mselectComponent,
|
|
265
|
+
},
|
|
266
|
+
], 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"] }] }); }
|
|
267
|
+
}
|
|
268
|
+
export { M2mselectComponent };
|
|
269
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: M2mselectComponent, decorators: [{
|
|
270
|
+
type: Component,
|
|
271
|
+
args: [{ selector: 'data-m2mselect', providers: [
|
|
272
|
+
{
|
|
273
|
+
provide: NG_VALUE_ACCESSOR,
|
|
274
|
+
multi: true,
|
|
275
|
+
useExisting: M2mselectComponent,
|
|
276
|
+
},
|
|
277
|
+
], 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)=\"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>" }]
|
|
278
|
+
}], propDecorators: { model: [{
|
|
279
|
+
type: Input
|
|
280
|
+
}], field: [{
|
|
281
|
+
type: Input
|
|
282
|
+
}], edit: [{
|
|
283
|
+
type: Input
|
|
284
|
+
}], values: [{
|
|
285
|
+
type: Input
|
|
286
|
+
}], queryset: [{
|
|
287
|
+
type: Input
|
|
288
|
+
}], collection: [{
|
|
289
|
+
type: Input
|
|
290
|
+
}], filter: [{
|
|
291
|
+
type: Input
|
|
292
|
+
}], mode: [{
|
|
293
|
+
type: Input
|
|
294
|
+
}], display: [{
|
|
295
|
+
type: Input
|
|
296
|
+
}], search: [{
|
|
297
|
+
type: Input
|
|
298
|
+
}], label: [{
|
|
299
|
+
type: Input
|
|
300
|
+
}], placeholder: [{
|
|
301
|
+
type: Input
|
|
302
|
+
}], emptyLabel: [{
|
|
303
|
+
type: Input
|
|
304
|
+
}], inputClasses: [{
|
|
305
|
+
type: Input
|
|
306
|
+
}], added: [{
|
|
307
|
+
type: Output
|
|
308
|
+
}], removed: [{
|
|
309
|
+
type: Output
|
|
310
|
+
}], cancelled: [{
|
|
311
|
+
type: Output
|
|
312
|
+
}], cleared: [{
|
|
313
|
+
type: Output
|
|
314
|
+
}], detailsChanged: [{
|
|
315
|
+
type: Output
|
|
316
|
+
}], changed: [{
|
|
317
|
+
type: Output
|
|
318
|
+
}] } });
|
|
319
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibTJtc2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2RhdGEvc3JjL2xpYi9kaXNwZWRpdC9tMm1zZWxlY3QvbTJtc2VsZWN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2RhdGEvc3JjL2xpYi9kaXNwZWRpdC9tMm1zZWxlY3QvbTJtc2VsZWN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFHdkIsT0FBTyxFQUVMLGlCQUFpQixFQUNqQixtQkFBbUIsRUFDbkIsa0JBQWtCLEdBQ25CLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUNMLFlBQVksRUFDWixvQkFBb0IsRUFDcEIsY0FBYyxFQUVkLE9BQU8sRUFDUCxTQUFTLEdBQ1YsTUFBTSxNQUFNLENBQUM7QUFHZCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDOzs7OztBQUVoRSxNQWNhLGtCQUFrQjtJQWQvQjtRQW9Ca0IsU0FBSSxHQUFHLEtBQUssQ0FBQztRQUd0QixRQUFHLEdBQWEsRUFBRSxDQUFDO1FBQ25CLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFJUixXQUFNLEdBQWUsRUFBRSxDQUFDO1FBQ3hCLFNBQUksR0FBdUMsTUFBTSxDQUFDO1FBRWxELFdBQU0sR0FBRyxRQUFRLENBQUM7UUFDbEMsVUFBVTtRQUNNLFVBQUssR0FBRyxFQUFFLENBQUM7UUFDWCxnQkFBVyxHQUFHLEVBQUUsQ0FBQztRQUNqQixlQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ2hC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VSxLQUFLO3NCQUFwQixLQUFLO2dCQUNVLElBQUk7c0JBQW5CLEtBQUs7Z0JBRVUsTUFBTTtzQkFBckIsS0FBSztnQkFJVSxRQUFRO3NCQUF2QixLQUFLO2dCQUNVLFVBQVU7c0JBQXpCLEtBQUs7Z0JBQ1UsTUFBTTtzQkFBckIsS0FBSztnQkFDVSxJQUFJO3NCQUFuQixLQUFLO2dCQUNVLE9BQU87c0JBQXRCLEtBQUs7Z0JBQ1UsTUFBTTtzQkFBckIsS0FBSztnQkFFVSxLQUFLO3NCQUFwQixLQUFLO2dCQUNVLFdBQVc7c0JBQTFCLEtBQUs7Z0JBQ1UsVUFBVTtzQkFBekIsS0FBSztnQkFDVSxZQUFZO3NCQUEzQixLQUFLO2dCQUVXLEtBQUs7c0JBQXJCLE1BQU07Z0JBQ1UsT0FBTztzQkFBdkIsTUFBTTtnQkFDVSxTQUFTO3NCQUF6QixNQUFNO2dCQUNVLE9BQU87c0JBQXZCLE1BQU07Z0JBQ1UsY0FBYztzQkFBOUIsTUFBTTtnQkFDVSxPQUFPO3NCQUF2QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZpbHRlckRhdGEsIFF1ZXJ5c2V0IH0gZnJvbSAnLi4vLi4vZGF0YS9kYXRhLXF1ZXJ5JztcbmltcG9ydCB7IENvbGxlY3Rpb24gfSBmcm9tICcuLi8uLi9kYXRhL2RhdGEtY29sbGVjdGlvbic7XG5pbXBvcnQge1xuICBDb250cm9sVmFsdWVBY2Nlc3NvcixcbiAgTkdfVkFMVUVfQUNDRVNTT1IsXG4gIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gIFVudHlwZWRGb3JtQ29udHJvbCxcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtcbiAgZGVib3VuY2VUaW1lLFxuICBkaXN0aW5jdFVudGlsQ2hhbmdlZCxcbiAgZmlyc3RWYWx1ZUZyb20sXG4gIE9ic2VydmFibGUsXG4gIFN1YmplY3QsXG4gIHRha2VVbnRpbCxcbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBUcGxGdW4gfSBmcm9tICcuLi9ma3NlbGVjdC9ma3NlbGVjdC5jb21wb25lbnQnO1xuaW1wb3J0IHsgRGF0YU1vZGVsIH0gZnJvbSAnLi4vLi4vZGF0YS9kYXRhLW1vZGVsJztcbmltcG9ydCB7IHN3aXRjaE1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBOZ2JUeXBlYWhlYWRNb2R1bGUgfSBmcm9tICdAbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2RhdGEtbTJtc2VsZWN0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL20ybXNlbGVjdC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL20ybXNlbGVjdC5jb21wb25lbnQuc2FzcyddLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgICAgdXNlRXhpc3Rpbmc6IE0ybXNlbGVjdENvbXBvbmVudCxcbiAgICB9LFxuICBdLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBOZ2JUeXBlYWhlYWRNb2R1bGVdLFxufSlcbmV4cG9ydCBjbGFzcyBNMm1zZWxlY3RDb21wb25lbnQ8VCBleHRlbmRzIERhdGFNb2RlbCwgUiBleHRlbmRzIERhdGFNb2RlbD5cbiAgaW1wbGVtZW50cyBPbkRlc3Ryb3ksIE9uSW5pdCwgQ29udHJvbFZhbHVlQWNjZXNzb3JcbntcbiAgLy8gTW9kZWwgZmllbGQgdmFsdWUgJiB1cGRhdGUgZGF0YVxuICBASW5wdXQoKSBwdWJsaWMgbW9kZWw/OiBUO1xuICBASW5wdXQoKSBwdWJsaWMgZmllbGQ/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIHB1YmxpYyBlZGl0ID0gZmFsc2U7XG4gIC8vIFJhdyB2YWx1ZVxuICBASW5wdXQoKSBwdWJsaWMgdmFsdWVzITogUltdO1xuICBwdWJsaWMgcGtzOiBudW1iZXJbXSA9IFtdO1xuICBwdWJsaWMgZGlzYWJsZWQgPSBmYWxzZTtcbiAgLy8gRmsgZmllbGRzLCBlaXRoZXIgbW9kZWwgLyBxdWVyeXNldCAvIGNvbGxlY3Rpb24gbXVzdCBiZSBnaXZlblxuICBASW5wdXQoKSBwdWJsaWMgcXVlcnlzZXQ/OiBRdWVyeXNldDxSPjtcbiAgQElucHV0KCkgcHVibGljIGNvbGxlY3Rpb24/OiBDb2xsZWN0aW9uPFI+O1xuICBASW5wdXQoKSBwdWJsaWMgZmlsdGVyOiBGaWx0ZXJEYXRhID0ge307XG4gIEBJbnB1dCgpIHB1YmxpYyBtb2RlOiAnYXV0b2NvbXBsZXRlJyB8ICdzZWxlY3QnIHwgJ2F1dG8nID0gJ2F1dG8nO1xuICBASW5wdXQoKSBwdWJsaWMgZGlzcGxheT86IHN0cmluZyB8IFRwbEZ1bjxSPjtcbiAgQElucHV0KCkgcHVibGljIHNlYXJjaCA9ICdzZWFyY2gnO1xuICAvLyBEaXNwbGF5XG4gIEBJbnB1dCgpIHB1YmxpYyBsYWJlbCA9ICcnO1xuICBASW5wdXQoKSBwdWJsaWMgcGxhY2Vob2xkZXIgPSAnJztcbiAgQElucHV0KCkgcHVibGljIGVtcHR5TGFiZWwgPSAnJztcbiAgQElucHV0KCkgcHVibGljIGlucHV0Q2xhc3Nlczogc3RyaW5nW10gfCBzdHJpbmcgPSBbXTtcbiAgLy8gT3V0cHV0c1xuICBAT3V0cHV0KCkgcHVibGljIGFkZGVkID0gbmV3IEV2ZW50RW1pdHRlcjxSPigpO1xuICBAT3V0cHV0KCkgcHVibGljIHJlbW92ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFI+KCk7XG4gIEBPdXRwdXQoKSBwdWJsaWMgY2FuY2VsbGVkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgcHVibGljIGNsZWFyZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBwdWJsaWMgZGV0YWlsc0NoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFJbXT4oKTtcbiAgQE91dHB1dCgpIHB1YmxpYyBjaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXJbXT4oKTtcblxuICBwdWJsaWMgZmMhOiBVbnR5cGVkRm9ybUNvbnRyb2w7XG4gIHB1YmxpYyBzZWFyY2hGbiA9IHRoaXMuX3NlYXJjaC5iaW5kKHRoaXMpO1xuICBwdWJsaWMgZGlzcGxheUZuID0gdGhpcy5fZGlzcGxheS5iaW5kKHRoaXMpO1xuICBwcml2YXRlIHRvdWNoZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfc3Vic2NyaXB0aW9uID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgcHJpdmF0ZSBfdHBsITogVHBsRnVuPFI+O1xuXG4gIC8qKlxuICAgKiBDb250cm9sIHZhbHVlIGFjY2Vzc29yIG9uQ2hhbmdlIGR1bW15IGNhbGxiYWNrO1xuICAgKiBAcGFyYW0gZmtzXG4gICAqL1xuICBwdWJsaWMgb25DaGFuZ2UgPSAoZmtzOiBudW1iZXJbXSkgPT4ge307XG5cbiAgLyoqXG4gICAqIENvbnRyb2wgdmFsdWUgYWNjZXNzb3Igb25Ub3VjaGVkIGR1bW15IGNhbGxiYWNrO1xuICAgKi9cbiAgcHVibGljIG9uVG91Y2hlZCA9ICgpID0+IHt9O1xuXG4gIC8qKlxuICAgKiBPbiBEZXN0cm95IGNsZWFycyBzdWJzY3JpcHRpb25zLlxuICAgKi9cbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuX3N1YnNjcmlwdGlvbi5uZXh0KCk7XG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uLmNvbXBsZXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogT25DaGFuZ2UgcmVnaXN0ZXIgZnJvbSBjb250cm9sVmFsdWVBY2Nlc3NvclxuICAgKiBAcGFyYW0gb25DaGFuZ2UgY2FsbGJhY2tcbiAgICovXG4gIHJlZ2lzdGVyT25DaGFuZ2Uob25DaGFuZ2U6IGFueSkge1xuICAgIHRoaXMub25DaGFuZ2UgPSBvbkNoYW5nZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPblRvdWNoZWQgcmVnaXN0ZXIgZnJvbSBjb250cm9sVmFsdWVBY2Nlc3NvclxuICAgKiBAcGFyYW0gb25Ub3VjaGVkIGNhbGxiYWNrXG4gICAqL1xuICByZWdpc3Rlck9uVG91Y2hlZChvblRvdWNoZWQ6IGFueSkge1xuICAgIHRoaXMub25Ub3VjaGVkID0gb25Ub3VjaGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIE9uSW5pdCA6XG4gICAqIC0gZW5zdXJlcyBxdWVyeXNldCBpcyBhdmFpbGFibGVcbiAgICogLSBjcmVhdGVzIGZvcm0gY29udHJvbCBmb3IgaW5wdXRcbiAgICogLSBjcmVhdGVzIGRpc3BsYXkgZnVuY3Rpb25cbiAgICogLSBlbnN1cmUgdmFsdWVzIGFyZSBzZXQgZnJvbSBhbnkgc291cmNlXG4gICAqL1xuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgLy8gQ3JlYXRlIHF1ZXJ5c2V0IGlmIG5vdCBnaXZlblxuICAgIC8vIHF1ZXJ5c2V0IGlzIGNyZWF0ZSB0aHJvdWdoIG1vZGVsXG4gICAgaWYgKCF0aGlzLnF1ZXJ5c2V0ICYmIHRoaXMuY29sbGVjdGlvbikge1xuICAgICAgdGhpcy5xdWVyeXNldCA9IHRoaXMuY29sbGVjdGlvbi5xdWVyeXNldCgpO1xuICAgIH0gZWxzZSBpZiAoIXRoaXMucXVlcnlzZXQgJiYgdGhpcy5tb2RlbCAmJiB0aGlzLm1vZGVsLl9jb2xsZWN0aW9uKSB7XG4gICAgICB0aGlzLmNvbGxlY3Rpb24gPSB0aGlzLm1vZGVsLl9jb2xsZWN0aW9uO1xuICAgICAgdGhpcy5xdWVyeXNldCA9IHRoaXMuY29sbGVjdGlvbi5xdWVyeXNldCgpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMucXVlcnlzZXQpIHtcbiAgICAgIHRocm93IEVycm9yKCdxdWVyeXNldCBpcyBtYW5kYXRvcnkgZm9yIG0ybSBzZWxlY3QnKTtcbiAgICB9XG4gICAgLy8gQ3JlYXRlIGZvcm0gY29udHJvbCBmb3IgdHlwZWFoZWFkIGFuZCBzdWJzY3JpYmUgZm9yIGNoYW5nZXNcbiAgICB0aGlzLmZjID0gbmV3IFVudHlwZWRGb3JtQ29udHJvbCgnJyk7XG4gICAgdGhpcy5mYy52YWx1ZUNoYW5nZXNcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLl9zdWJzY3JpcHRpb24pLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKVxuICAgICAgLnN1YnNjcmliZSgodmFsdWUpID0+IHtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgdGhpcy5vbkFkZCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIC8vIFNldCBkaXNwbGF5IGZ1bmN0aW9uXG4gICAgaWYgKHRoaXMuZGlzcGxheSkge1xuICAgICAgaWYgKHRoaXMuZGlzcGxheSAmJiB0eXBlb2YgdGhpcy5kaXNwbGF5ID09PSAnc3RyaW5nJykge1xuICAgICAgICB0aGlzLl90cGwgPSAobW9kZWw6IFIpID0+IGAkeyhtb2RlbCBhcyBhbnkpW3RoaXMuZGlzcGxheSBhcyBzdHJpbmddfWA7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuZGlzcGxheSAmJiB0eXBlb2YgdGhpcy5kaXNwbGF5ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRoaXMuX3RwbCA9IHRoaXMuZGlzcGxheS5iaW5kKHRoaXMpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl90cGwgPSAobW9kZWw6IFIpID0+XG4gICAgICAgIGAke1xuICAgICAgICAgIChtb2RlbCBhcyBhbnkpWyduYW1lJ10gfHxcbiAgICAgICAgICAobW9kZWwgYXMgYW55KVsndGl0bGUnXSB8fFxuICAgICAgICAgIChtb2RlbCBhcyBhbnkpWydpZCddXG4gICAgICAgIH1gO1xuICAgIH1cbiAgICAvLyBHZXQgdmFsdWVzIGZyb20gbW9kZWwgaWYgbm90IGFscmVhZHkgZ2l2ZW5cbiAgICAvLyBUT0RPOiBjaGVjayBpZiB0aGlzIGlzIG5lY2Vzc2FyeVxuICAgIGlmICghdGhpcy52YWx1ZXMgJiYgdGhpcy5tb2RlbCAmJiB0aGlzLmZpZWxkKSB7XG4gICAgICB0aGlzLnZhbHVlcyA9ICh0aGlzLm1vZGVsIGFzIGFueSlbdGhpcy5maWVsZCArICdfZGV0YWlscyddO1xuICAgIH1cbiAgICBpZiAodGhpcy52YWx1ZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc29sZS5lcnJvcignbm8gdmFsdWVzIGF2YWlsYWJsZSBmb3IgJywgdGhpcy5tb2RlbCwgdGhpcy5maWVsZCk7XG4gICAgICB0aHJvdyBFcnJvcignbm8gdmFsdWVzIGF2YWlsYWJsZScpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSB2YWx1ZS5cbiAgICogRW1pdHMgZGV0YWlsc0NoYW5nZWQsIGNoYW5nZWQgYW5kIHJlbW92ZWQgc2lnbmFscy5cbiAgICogQHBhcmFtIGkgaW5zdGFuY2UgdG8gYmUgcmVtb3ZlZFxuICAgKi9cbiAgcHVibGljIG9uUmVtb3ZlKGk6IFIpIHtcbiAgICBpZiAoIXRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHRoaXMubWFya0FzVG91Y2hlZCgpO1xuICAgICAgY29uc3QgcHMgPSB0aGlzLnBrcy5pbmRleE9mKGkuaWQpO1xuICAgICAgdGhpcy5wa3Muc3BsaWNlKHBzLCAxKTtcbiAgICAgIHRoaXMudmFsdWVzLnNwbGljZShwcywgMSk7XG4gICAgICB0aGlzLmRldGFpbHNDaGFuZ2VkLmVtaXQodGhpcy52YWx1ZXMpO1xuICAgICAgdGhpcy5jaGFuZ2VkLmVtaXQodGhpcy5wa3MpO1xuICAgICAgdGhpcy5yZW1vdmVkLmVtaXQoaSk7XG4gICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMucGtzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgdmFsdWUuXG4gICAqIEVtaXRzIGRldGFpbHNDaGFuZ2VkLCBjaGFuZ2VkIGFuZCBhZGRlZCBzaWduYWxzLlxuICAgKiBAcGFyYW0gaSBpbnN0YW5jZSB0byBiZSBhZGRlZC5cbiAgICovXG4gIHB1YmxpYyBvbkFkZChpOiBSKSB7XG4gICAgaWYgKCF0aGlzLmRpc2FibGVkKSB7XG4gICAgICB0aGlzLm1hcmtBc1RvdWNoZWQoKTtcbiAgICAgIHRoaXMucGtzLnB1c2goaS5pZCk7XG4gICAgICB0aGlzLnZhbHVlcy5wdXNoKGkpO1xuICAgICAgdGhpcy5kZXRhaWxzQ2hhbmdlZC5lbWl0KHRoaXMudmFsdWVzKTtcbiAgICAgIHRoaXMuY2hhbmdlZC5lbWl0KHRoaXMucGtzKTtcbiAgICAgIHRoaXMuYWRkZWQuZW1pdChpKTtcbiAgICAgIHRoaXMub25DaGFuZ2UodGhpcy5wa3MpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciBhbGwgdmFsdWVzLlxuICAgKiBFbWl0cyBkZXRhaWxzQ2hhbmdlZCwgY2hhbmdlZCBhbmQgY2xlYXJlZCBzaWduYWxzLlxuICAgKi9cbiAgcHVibGljIG9uQ2xlYXIoKSB7XG4gICAgaWYgKCF0aGlzLmRpc2FibGVkKSB7XG4gICAgICB0aGlzLm1hcmtBc1RvdWNoZWQoKTtcbiAgICAgIHRoaXMucGtzID0gW107XG4gICAgICB0aGlzLnZhbHVlcyA9IFtdO1xuICAgICAgdGhpcy5kZXRhaWxzQ2hhbmdlZC5lbWl0KHRoaXMudmFsdWVzKTtcbiAgICAgIHRoaXMuY2hhbmdlZC5lbWl0KHRoaXMucGtzKTtcbiAgICAgIHRoaXMuY2xlYXJlZC5lbWl0KCk7XG4gICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMucGtzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogV3JpdGUgdmFsdWUgZnJvbSBjb250cm9sVmFsdWVBY2Nlc3Nvci5cbiAgICogQHBhcmFtIHBrc1xuICAgKi9cbiAgYXN5bmMgd3JpdGVWYWx1ZShwa3M6IG51bWJlcltdKSB7XG4gICAgdGhpcy5wa3MgPSBwa3M7XG4gICAgYXdhaXQgdGhpcy5fZ2V0RGlzcGxheVZhbHVlcyhwa3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hcmsgYXMgdG91Y2hlZC5cbiAgICovXG4gIHB1YmxpYyBtYXJrQXNUb3VjaGVkKCkge1xuICAgIGlmICghdGhpcy50b3VjaGVkKSB7XG4gICAgICB0aGlzLm9uVG91Y2hlZCgpO1xuICAgICAgdGhpcy50b3VjaGVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTWFyayBhcyBkaXNhYmxlZC5cbiAgICogQHBhcmFtIGRpc2FibGVkXG4gICAqL1xuICBzZXREaXNhYmxlZFN0YXRlKGRpc2FibGVkOiBib29sZWFuKSB7XG4gICAgdGhpcy5kaXNhYmxlZCA9IGRpc2FibGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIGRpc3BsYXkgdmFsdWVzIGZvciBjdXJyZW50IHNldCBvZiBwa3MuXG4gICAqIEV2ZW50dWFsbHkgZmV0Y2hlcyBpdGVtcyBmcm9tIGNvbGxlY3Rpb24uXG4gICAqIEVtaXRzIGRldGFpbHNDaGFuZ2VkIHNpZ25hbC5cbiAgICogQHBhcmFtIHBrcyBsaXN0IG9mIGN1cnJlbnQgcGtzLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfZ2V0RGlzcGxheVZhbHVlcyhwa3M6IG51bWJlcltdID0gW10pIHtcbiAgICBjb25zdCB2YWx1ZXM6IFJbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgayBvZiBwa3MpIHtcbiAgICAgIGxldCBmb3VuZCA9IGZhbHNlO1xuICAgICAgZm9yIChsZXQgdiBvZiB0aGlzLnZhbHVlcykge1xuICAgICAgICBpZiAodi5pZCA9PSBrKSB7XG4gICAgICAgICAgdmFsdWVzLnB1c2godik7XG4gICAgICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIWZvdW5kKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbGxlY3Rpb24pIHtcbiAgICAgICAgICB2YWx1ZXMucHVzaChhd2FpdCBmaXJzdFZhbHVlRnJvbSh0aGlzLmNvbGxlY3Rpb24uZmV0Y2goaykpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWx1ZXMucHVzaCh7IGlkOiBrLCBfZGlzcGxheTogJ1Vua25vd24nIH0gYXMgYW55KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnZhbHVlcyA9IHZhbHVlcztcbiAgICB0aGlzLmRldGFpbHNDaGFuZ2VkLm5leHQodGhpcy52YWx1ZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3BsYXkgZnVuY3Rpb24uIFVzZXMgZGVzY2ZpZWxkIG9yIGRlc2MgdHBsIChsb2Rhc2ggdGVtcGxhdGUgdXNpbmcgbW9kZWwgZmllbGRzKS5cbiAgICovXG4gIHByaXZhdGUgX2Rpc3BsYXkoeDogYW55KTogYW55IHtcbiAgICBpZiAoeCkge1xuICAgICAgaWYgKHguX2Rpc3BsYXkpIHtcbiAgICAgICAgaWYgKHguX2Rpc3BsYXkgaW5zdGFuY2VvZiBGdW5jdGlvbikge1xuICAgICAgICAgIHJldHVybiB4Ll9kaXNwbGF5KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHguX2Rpc3BsYXk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLl90cGwpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RwbCh4KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlYXJjaCBmdW5jdGlvbi5cbiAgICogQHBhcmFtIHRleHQkXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIF9zZWFyY2godGV4dCQ6IE9ic2VydmFibGU8c3RyaW5nPik6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRleHQkLnBpcGUoXG4gICAgICB0YWtlVW50aWwodGhpcy5fc3Vic2NyaXB0aW9uKSxcbiAgICAgIGRlYm91bmNlVGltZSg3NTApLFxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgIHN3aXRjaE1hcCgodGVybSkgPT4ge1xuICAgICAgICBjb25zdCBmOiBhbnkgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBrIG9mIE9iamVjdC5rZXlzKHRoaXMuZmlsdGVyKSkge1xuICAgICAgICAgIGlmICh0aGlzLmZpbHRlcltrXSAhPT0gbnVsbCB8fCB0aGlzLmZpbHRlcltrXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBmW2tdID0gdGhpcy5maWx0ZXJba107XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZbdGhpcy5zZWFyY2hdID0gdGVybTtcbiAgICAgICAgY29uc3QgcXMgPSB0aGlzLnF1ZXJ5c2V0IGFzIFF1ZXJ5c2V0PGFueT47XG4gICAgICAgIHFzLmZpbHRlcihmLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIHFzLmdldCgpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG59XG4iLCJcbjxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gIDxsYWJlbCAqbmdJZj1cImxhYmVsXCI+e3tsYWJlbH19PC9sYWJlbD5cbiAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwXCI+XG4gICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgW2Zvcm1Db250cm9sXT1cImZjXCIgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCIgW25nYlR5cGVhaGVhZF09XCJzZWFyY2hGblwiIFtlZGl0YWJsZV09XCJmYWxzZVwiIFtmb2N1c0ZpcnN0XT1cInRydWVcIiBbaW5wdXRGb3JtYXR0ZXJdPVwiZGlzcGxheUZuXCIgW3Jlc3VsdEZvcm1hdHRlcl09XCJkaXNwbGF5Rm5cIiAoa2V5dXAuZXNjYXBlKT1cImNhbmNlbGxlZC5lbWl0KClcIj5cbiAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAtdGV4dFwiPjxpIGNsYXNzPVwiYmkgYmktdHJhc2ggZmxvYXQtZW5kIHBvaW50ZXJcIiAoY2xpY2spPVwiY2xlYXJlZC5lbWl0KClcIj48L2k+PC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2ICpuZ0Zvcj1cImxldCBpIG9mIHZhbHVlc1wiPjxpIGNsYXNzPVwiYmkgYmktdHJhc2ggbXMtMiBmbG9hdC1lbmRcIiAoY2xpY2spPVwib25SZW1vdmUoaSlcIj48L2k+e3tkaXNwbGF5Rm4oaSl9fTwvZGl2PlxuPC9kaXY+Il19
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { Component, EventEmitter, Input, Output, } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { Editor, NgxEditorModule } from 'ngx-editor';
|
|
4
|
+
import { FormControl, ReactiveFormsModule } from '@angular/forms';
|
|
5
|
+
import { firstValueFrom } from 'rxjs';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
import * as i1 from "@angular/common";
|
|
8
|
+
import * as i2 from "ngx-editor";
|
|
9
|
+
import * as i3 from "@angular/forms";
|
|
10
|
+
export const RichEditToolbars = {
|
|
11
|
+
default: [
|
|
12
|
+
['bold', 'italic'],
|
|
13
|
+
['underline', 'strike'],
|
|
14
|
+
['code', 'blockquote'],
|
|
15
|
+
['ordered_list', 'bullet_list'],
|
|
16
|
+
[{ heading: ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'] }],
|
|
17
|
+
['link'],
|
|
18
|
+
['text_color', 'background_color'],
|
|
19
|
+
['align_left', 'align_center', 'align_right', 'align_justify'],
|
|
20
|
+
],
|
|
21
|
+
light: [
|
|
22
|
+
['bold', 'italic', 'underline'],
|
|
23
|
+
['ordered_list', 'bullet_list'],
|
|
24
|
+
['text_color'],
|
|
25
|
+
['align_left', 'align_center', 'align_right', 'align_justify'],
|
|
26
|
+
],
|
|
27
|
+
none: [],
|
|
28
|
+
};
|
|
29
|
+
class RicheditComponent {
|
|
30
|
+
constructor() {
|
|
31
|
+
this.editable = true;
|
|
32
|
+
this.edit = true;
|
|
33
|
+
this.mode = 'dd';
|
|
34
|
+
/** Hide label (for inline forms) */
|
|
35
|
+
this.hideLabel = false;
|
|
36
|
+
/** Hide button (for changed usage) */
|
|
37
|
+
this.hideButton = false;
|
|
38
|
+
/** Toolbar mode */
|
|
39
|
+
this.toolbar = 'default';
|
|
40
|
+
this.changed = new EventEmitter();
|
|
41
|
+
this.html = '';
|
|
42
|
+
}
|
|
43
|
+
ngOnInit() {
|
|
44
|
+
this.editor = new Editor();
|
|
45
|
+
if (this.toolbar === 'light' || this.toolbar === 'default') {
|
|
46
|
+
this.realToolbar = RichEditToolbars[this.toolbar];
|
|
47
|
+
}
|
|
48
|
+
else if (this.toolbar === 'none') {
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
this.realToolbar = this.toolbar;
|
|
52
|
+
}
|
|
53
|
+
if (!this.fc) {
|
|
54
|
+
this.fc = new FormControl('');
|
|
55
|
+
if (this.model && this.field) {
|
|
56
|
+
this.manager = this.model.FM(this.field);
|
|
57
|
+
this.required = this.manager?.required || false;
|
|
58
|
+
this.fc.setValue(this.model[this.field] || '', {
|
|
59
|
+
emitEvent: false,
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
if (this.edit) {
|
|
63
|
+
this.fc.enable();
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
this.fc.disable();
|
|
67
|
+
}
|
|
68
|
+
this.fc.valueChanges.subscribe((v) => this.changed.emit(v));
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
// make sure to destory the editor
|
|
72
|
+
ngOnDestroy() {
|
|
73
|
+
this.editor.destroy();
|
|
74
|
+
}
|
|
75
|
+
toggleEdit() {
|
|
76
|
+
if (this.editable) {
|
|
77
|
+
if (this.edit) {
|
|
78
|
+
this.fc.disable();
|
|
79
|
+
this.edit = false;
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
this.fc.enable();
|
|
83
|
+
this.edit = true;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
this.fc.disable();
|
|
88
|
+
this.edit = false;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
async save() {
|
|
92
|
+
if (this.model && this.field) {
|
|
93
|
+
this.model.setFV(this.field, this.fc.value);
|
|
94
|
+
if (this.mode === 'dd') {
|
|
95
|
+
await firstValueFrom(this.model.update([this.field], { updateModel: true }));
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: RicheditComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
100
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.0", type: RicheditComponent, isStandalone: true, selector: "data-richedit", inputs: { model: "model", field: "field", editable: "editable", edit: "edit", mode: "mode", hideLabel: "hideLabel", hideButton: "hideButton", fc: "fc", toolbar: "toolbar" }, outputs: { changed: "changed" }, ngImport: i0, template: "\n<ng-template #editorTemplate>\n <div class=\"NgxEditor__Wrapper\">\n <ngx-editor-menu [editor]=\"editor\" [toolbar]=\"realToolbar\" *ngIf=\"edit && toolbar!=='none'\"></ngx-editor-menu>\n <ngx-editor [editor]=\"editor\" [formControl]=\"fc\" [placeholder]=\"''\"></ngx-editor>\n </div>\n <button class=\"btn btn-primary btn-sm w-100 mt-1\" *ngIf=\"edit && !hideButton\" (click)=\"save()\"><i class=\"bi bi-save me-2\"></i>Enregistrer</button>\n</ng-template>\n<ng-template #titleTpl>\n <ng-content></ng-content>\n</ng-template>\n<!-- Dd display-->\n<ng-container *ngIf=\"mode==='dd'\">\n <dt [class.required]=\"required\" *ngIf=\"!hideLabel\"><span class=\"editable\" (click)=\"toggleEdit()\" role=\"button\">\n <ng-container *ngTemplateOutlet=\"titleTpl\"></ng-container></span></dt>\n <dd [class.mb-0]=\"hideLabel\">\n <ng-container *ngTemplateOutlet=\"editorTemplate\"></ng-container>\n </dd>\n</ng-container>\n<!-- Inline display-->\n<ng-container *ngIf=\"mode==='inline'\">\n <ng-container *ngIf=\"!hideLabel\">\n <label [class.required]=\"required\">\n <ng-container *ngTemplateOutlet=\"titleTpl\"></ng-container>\n </label>\n </ng-container>\n <ng-container *ngTemplateOutlet=\"editorTemplate\"></ng-container>\n</ng-container>\n<!-- Form display-->\n<ng-container *ngIf=\"mode==='form'\">\n <ng-container *ngIf=\"!hideLabel\">\n <label [class.required]=\"required\">\n <ng-container *ngTemplateOutlet=\"titleTpl\"></ng-container>\n </label>\n </ng-container>\n <ng-container *ngTemplateOutlet=\"editorTemplate\"></ng-container>\n</ng-container>", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: NgxEditorModule }, { kind: "component", type: i2.NgxEditorComponent, selector: "ngx-editor", inputs: ["editor", "outputFormat", "placeholder"], outputs: ["focusOut", "focusIn"] }, { kind: "component", type: i2.MenuComponent, selector: "ngx-editor-menu", inputs: ["toolbar", "colorPresets", "disabled", "editor", "customMenuRef", "dropdownPlacement"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }] }); }
|
|
101
|
+
}
|
|
102
|
+
export { RicheditComponent };
|
|
103
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: RicheditComponent, decorators: [{
|
|
104
|
+
type: Component,
|
|
105
|
+
args: [{ selector: 'data-richedit', standalone: true, imports: [CommonModule, NgxEditorModule, ReactiveFormsModule], template: "\n<ng-template #editorTemplate>\n <div class=\"NgxEditor__Wrapper\">\n <ngx-editor-menu [editor]=\"editor\" [toolbar]=\"realToolbar\" *ngIf=\"edit && toolbar!=='none'\"></ngx-editor-menu>\n <ngx-editor [editor]=\"editor\" [formControl]=\"fc\" [placeholder]=\"''\"></ngx-editor>\n </div>\n <button class=\"btn btn-primary btn-sm w-100 mt-1\" *ngIf=\"edit && !hideButton\" (click)=\"save()\"><i class=\"bi bi-save me-2\"></i>Enregistrer</button>\n</ng-template>\n<ng-template #titleTpl>\n <ng-content></ng-content>\n</ng-template>\n<!-- Dd display-->\n<ng-container *ngIf=\"mode==='dd'\">\n <dt [class.required]=\"required\" *ngIf=\"!hideLabel\"><span class=\"editable\" (click)=\"toggleEdit()\" role=\"button\">\n <ng-container *ngTemplateOutlet=\"titleTpl\"></ng-container></span></dt>\n <dd [class.mb-0]=\"hideLabel\">\n <ng-container *ngTemplateOutlet=\"editorTemplate\"></ng-container>\n </dd>\n</ng-container>\n<!-- Inline display-->\n<ng-container *ngIf=\"mode==='inline'\">\n <ng-container *ngIf=\"!hideLabel\">\n <label [class.required]=\"required\">\n <ng-container *ngTemplateOutlet=\"titleTpl\"></ng-container>\n </label>\n </ng-container>\n <ng-container *ngTemplateOutlet=\"editorTemplate\"></ng-container>\n</ng-container>\n<!-- Form display-->\n<ng-container *ngIf=\"mode==='form'\">\n <ng-container *ngIf=\"!hideLabel\">\n <label [class.required]=\"required\">\n <ng-container *ngTemplateOutlet=\"titleTpl\"></ng-container>\n </label>\n </ng-container>\n <ng-container *ngTemplateOutlet=\"editorTemplate\"></ng-container>\n</ng-container>" }]
|
|
106
|
+
}], propDecorators: { model: [{
|
|
107
|
+
type: Input
|
|
108
|
+
}], field: [{
|
|
109
|
+
type: Input
|
|
110
|
+
}], editable: [{
|
|
111
|
+
type: Input
|
|
112
|
+
}], edit: [{
|
|
113
|
+
type: Input
|
|
114
|
+
}], mode: [{
|
|
115
|
+
type: Input
|
|
116
|
+
}], hideLabel: [{
|
|
117
|
+
type: Input
|
|
118
|
+
}], hideButton: [{
|
|
119
|
+
type: Input
|
|
120
|
+
}], fc: [{
|
|
121
|
+
type: Input
|
|
122
|
+
}], toolbar: [{
|
|
123
|
+
type: Input
|
|
124
|
+
}], changed: [{
|
|
125
|
+
type: Output
|
|
126
|
+
}] } });
|
|
127
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmljaGVkaXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGF0YS9zcmMvbGliL2Rpc3BlZGl0L3JpY2hlZGl0L3JpY2hlZGl0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2RhdGEvc3JjL2xpYi9kaXNwZWRpdC9yaWNoZWRpdC9yaWNoZWRpdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsTUFBTSxFQUFFLGVBQWUsRUFBVyxNQUFNLFlBQVksQ0FBQztBQUM5RCxPQUFPLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHbEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLE1BQU0sQ0FBQzs7Ozs7QUFFdEMsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQWlDO0lBQzVELE9BQU8sRUFBRTtRQUNQLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQztRQUNsQixDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUM7UUFDdkIsQ0FBQyxNQUFNLEVBQUUsWUFBWSxDQUFDO1FBQ3RCLENBQUMsY0FBYyxFQUFFLGFBQWEsQ0FBQztRQUMvQixDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ25ELENBQUMsTUFBTSxDQUFDO1FBQ1IsQ0FBQyxZQUFZLEVBQUUsa0JBQWtCLENBQUM7UUFDbEMsQ0FBQyxZQUFZLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxlQUFlLENB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ZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBFZGl0b3IsIE5neEVkaXRvck1vZHVsZSwgVG9vbGJhciB9IGZyb20gJ25neC1lZGl0b3InO1xuaW1wb3J0IHsgRm9ybUNvbnRyb2wsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBEYXRhTW9kZWwgfSBmcm9tICcuLi8uLi9kYXRhL2RhdGEtbW9kZWwnO1xuaW1wb3J0IHsgQmFzZUZpZWxkTWFuYWdlciB9IGZyb20gJy4uLy4uL2RhdGEvZmllbGRzL2Jhc2UnO1xuaW1wb3J0IHsgZmlyc3RWYWx1ZUZyb20gfSBmcm9tICdyeGpzJztcblxuZXhwb3J0IGNvbnN0IFJpY2hFZGl0VG9vbGJhcnM6IHsgW2luZGV4OiBzdHJpbmddOiBUb29sYmFyIH0gPSB7XG4gIGRlZmF1bHQ6IFtcbiAgICBbJ2JvbGQnLCAnaXRhbGljJ10sXG4gICAgWyd1bmRlcmxpbmUnLCAnc3RyaWtlJ10sXG4gICAgWydjb2RlJywgJ2Jsb2NrcXVvdGUnXSxcbiAgICBbJ29yZGVyZWRfbGlzdCcsICdidWxsZXRfbGlzdCddLFxuICAgIFt7IGhlYWRpbmc6IFsnaDEnLCAnaDInLCAnaDMnLCAnaDQnLCAnaDUnLCAnaDYnXSB9XSxcbiAgICBbJ2xpbmsnXSxcbiAgICBbJ3RleHRfY29sb3InLCAnYmFja2dyb3VuZF9jb2xvciddLFxuICAgIFsnYWxpZ25fbGVmdCcsICdhbGlnbl9jZW50ZXInLCAnYWxpZ25fcmlnaHQnLCAnYWxpZ25fanVzdGlmeSddLFxuICBdLFxuICBsaWdodDogW1xuICAgIFsnYm9sZCcsICdpdGFsaWMnLCAndW5kZXJsaW5lJ10sXG4gICAgWydvcmRlcmVkX2xpc3QnLCAnYnVsbGV0X2xpc3QnXSxcbiAgICBbJ3RleHRfY29sb3InXSxcbiAgICBbJ2FsaWduX2xlZnQnLCAnYWxpZ25fY2VudGVyJywgJ2FsaWduX3JpZ2h0JywgJ2FsaWduX2p1c3RpZnknXSxcbiAgXSxcbiAgbm9uZTogW10sXG59O1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdkYXRhLXJpY2hlZGl0JyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgTmd4RWRpdG9yTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlXSxcbiAgdGVtcGxhdGVVcmw6ICcuL3JpY2hlZGl0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcmljaGVkaXQuY29tcG9uZW50LnNhc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgUmljaGVkaXRDb21wb25lbnQ8RlQsIFQgZXh0ZW5kcyBEYXRhTW9kZWw+XG4gIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3lcbntcbiAgQElucHV0KCkgcHVibGljIG1vZGVsPzogVDtcbiAgQElucHV0KCkgcHVibGljIGZpZWxkPzogc3RyaW5nO1xuICBASW5wdXQoKSBwdWJsaWMgZWRpdGFibGU6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBwdWJsaWMgZWRpdDogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpIHB1YmxpYyBtb2RlOiAnZGQnIHwgJ2lubGluZScgfCAnZm9ybScgPSAnZGQnO1xuICAvKiogSGlkZSBsYWJlbCAoZm9yIGlubGluZSBmb3JtcykgKi9cbiAgQElucHV0KCkgcHVibGljIGhpZGVMYWJlbDogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogSGlkZSBidXR0b24gKGZvciBjaGFuZ2VkIHVzYWdlKSAqL1xuICBASW5wdXQoKSBwdWJsaWMgaGlkZUJ1dHRvbjogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogRm9ybSBjb250cm9sLCBmcm9tIG91dHNpZGUgb3IgY3JlYXRlZCAqL1xuICBASW5wdXQoKSBwdWJsaWMgZmMhOiBGb3JtQ29udHJvbDxzdHJpbmcgfCBudWxsPjtcbiAgLyoqIFRvb2xiYXIgbW9kZSAqL1xuICBASW5wdXQoKSBwdWJsaWMgdG9vbGJhcjogJ25vbmUnIHwgJ2RlZmF1bHQnIHwgJ2xpZ2h0JyB8IFRvb2xiYXIgPSAnZGVmYXVsdCc7XG4gIEBPdXRwdXQoKSBwdWJsaWMgY2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nIHwgbnVsbD4oKTtcbiAgLyoqIEZpZWxkIG1hbmFnZXIgKi9cbiAgcHVibGljIG1hbmFnZXI/OiBCYXNlRmllbGRNYW5hZ2VyPEZUPjtcbiAgLyoqIENvbXB1dGVkIHJlcXVpcmVkICovXG4gIHB1YmxpYyByZXF1aXJlZCE6IGJvb2xlYW47XG4gIHB1YmxpYyBlZGl0b3IhOiBFZGl0b3I7XG4gIHB1YmxpYyBodG1sID0gJyc7XG4gIHB1YmxpYyByZWFsVG9vbGJhciE6IFRvb2xiYXI7XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5lZGl0b3IgPSBuZXcgRWRpdG9yKCk7XG4gICAgaWYgKHRoaXMudG9vbGJhciA9PT0gJ2xpZ2h0JyB8fCB0aGlzLnRvb2xiYXIgPT09ICdkZWZhdWx0Jykge1xuICAgICAgdGhpcy5yZWFsVG9vbGJhciA9IFJpY2hFZGl0VG9vbGJhcnNbdGhpcy50b29sYmFyXTtcbiAgICB9IGVsc2UgaWYgKHRoaXMudG9vbGJhciA9PT0gJ25vbmUnKSB7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVhbFRvb2xiYXIgPSB0aGlzLnRvb2xiYXIgYXMgVG9vbGJhcjtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmZjKSB7XG4gICAgICB0aGlzLmZjID0gbmV3IEZvcm1Db250cm9sPHN0cmluZz4oJycpO1xuICAgICAgaWYgKHRoaXMubW9kZWwgJiYgdGhpcy5maWVsZCkge1xuICAgICAgICB0aGlzLm1hbmFnZXIgPSB0aGlzLm1vZGVsLkZNKHRoaXMuZmllbGQpO1xuICAgICAgICB0aGlzLnJlcXVpcmVkID0gdGhpcy5tYW5hZ2VyPy5yZXF1aXJlZCB8fCBmYWxzZTtcbiAgICAgICAgdGhpcy5mYy5zZXRWYWx1ZSgodGhpcy5tb2RlbCBhcyBhbnkpW3RoaXMuZmllbGRdIHx8ICcnLCB7XG4gICAgICAgICAgZW1pdEV2ZW50OiBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5lZGl0KSB7XG4gICAgICAgIHRoaXMuZmMuZW5hYmxlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmZjLmRpc2FibGUoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZmMudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgodikgPT4gdGhpcy5jaGFuZ2VkLmVtaXQodikpO1xuICAgIH1cbiAgfVxuXG4gIC8vIG1ha2Ugc3VyZSB0byBkZXN0b3J5IHRoZSBlZGl0b3JcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5lZGl0b3IuZGVzdHJveSgpO1xuICB9XG5cbiAgdG9nZ2xlRWRpdCgpIHtcbiAgICBpZiAodGhpcy5lZGl0YWJsZSkge1xuICAgICAgaWYgKHRoaXMuZWRpdCkge1xuICAgICAgICB0aGlzLmZjLmRpc2FibGUoKTtcbiAgICAgICAgdGhpcy5lZGl0ID0gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmZjLmVuYWJsZSgpO1xuICAgICAgICB0aGlzLmVkaXQgPSB0cnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZjLmRpc2FibGUoKTtcbiAgICAgIHRoaXMuZWRpdCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBzYXZlKCkge1xuICAgIGlmICh0aGlzLm1vZGVsICYmIHRoaXMuZmllbGQpIHtcbiAgICAgIHRoaXMubW9kZWwuc2V0RlYodGhpcy5maWVsZCwgdGhpcy5mYy52YWx1ZSk7XG4gICAgICBpZiAodGhpcy5tb2RlID09PSAnZGQnKSB7XG4gICAgICAgIGF3YWl0IGZpcnN0VmFsdWVGcm9tKFxuICAgICAgICAgIHRoaXMubW9kZWwudXBkYXRlKFt0aGlzLmZpZWxkXSwgeyB1cGRhdGVNb2RlbDogdHJ1ZSB9KVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiXG48bmctdGVtcGxhdGUgI2VkaXRvclRlbXBsYXRlPlxuICA8ZGl2IGNsYXNzPVwiTmd4RWRpdG9yX19XcmFwcGVyXCI+XG4gICAgPG5neC1lZGl0b3ItbWVudSBbZWRpdG9yXT1cImVkaXRvclwiIFt0b29sYmFyXT1cInJlYWxUb29sYmFyXCIgKm5nSWY9XCJlZGl0ICZhbXA7JmFtcDsgdG9vbGJhciE9PSdub25lJ1wiPjwvbmd4LWVkaXRvci1tZW51PlxuICAgIDxuZ3gtZWRpdG9yIFtlZGl0b3JdPVwiZWRpdG9yXCIgW2Zvcm1Db250cm9sXT1cImZjXCIgW3BsYWNlaG9sZGVyXT1cIicnXCI+PC9uZ3gtZWRpdG9yPlxuICA8L2Rpdj5cbiAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBidG4tc20gdy0xMDAgbXQtMVwiICpuZ0lmPVwiZWRpdCAmYW1wOyZhbXA7ICFoaWRlQnV0dG9uXCIgKGNsaWNrKT1cInNhdmUoKVwiPjxpIGNsYXNzPVwiYmkgYmktc2F2ZSBtZS0yXCI+PC9pPkVucmVnaXN0cmVyPC9idXR0b24+XG48L25nLXRlbXBsYXRlPlxuPG5nLXRlbXBsYXRlICN0aXRsZVRwbD5cbiAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuPC9uZy10ZW1wbGF0ZT5cbjwhLS0gRGQgZGlzcGxheS0tPlxuPG5nLWNvbnRhaW5lciAqbmdJZj1cIm1vZGU9PT0nZGQnXCI+XG4gIDxkdCBbY2xhc3MucmVxdWlyZWRdPVwicmVxdWlyZWRcIiAqbmdJZj1cIiFoaWRlTGFiZWxcIj48c3BhbiBjbGFzcz1cImVkaXRhYmxlXCIgKGNsaWNrKT1cInRvZ2dsZUVkaXQoKVwiIHJvbGU9XCJidXR0b25cIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0aXRsZVRwbFwiPjwvbmctY29udGFpbmVyPjwvc3Bhbj48L2R0PlxuICA8ZGQgW2NsYXNzLm1iLTBdPVwiaGlkZUxhYmVsXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImVkaXRvclRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gIDwvZGQ+XG48L25nLWNvbnRhaW5lcj5cbjwhLS0gSW5saW5lIGRpc3BsYXktLT5cbjxuZy1jb250YWluZXIgKm5nSWY9XCJtb2RlPT09J2lubGluZSdcIj5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFoaWRlTGFiZWxcIj5cbiAgICA8bGFiZWwgW2NsYXNzLnJlcXVpcmVkXT1cInJlcXVpcmVkXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGl0bGVUcGxcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L2xhYmVsPlxuICA8L25nLWNvbnRhaW5lcj5cbiAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImVkaXRvclRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG48L25nLWNvbnRhaW5lcj5cbjwhLS0gRm9ybSBkaXNwbGF5LS0+XG48bmctY29udGFpbmVyICpuZ0lmPVwibW9kZT09PSdmb3JtJ1wiPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWhpZGVMYWJlbFwiPlxuICAgIDxsYWJlbCBbY2xhc3MucmVxdWlyZWRdPVwicmVxdWlyZWRcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0aXRsZVRwbFwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvbGFiZWw+XG4gIDwvbmctY29udGFpbmVyPlxuICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZWRpdG9yVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbjwvbmctY29udGFpbmVyPiJdfQ==
|