@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.
Files changed (158) hide show
  1. package/esm2022/lib/auth/auth-interceptor.service.mjs +92 -0
  2. package/{esm2020 → esm2022}/lib/auth/auth.service.mjs +1 -1
  3. package/esm2022/lib/data/data-backend.mjs +135 -0
  4. package/esm2022/lib/data/data-model.mjs +292 -0
  5. package/esm2022/lib/dispedit/choice.pipe.mjs +81 -0
  6. package/{esm2020 → esm2022}/lib/dispedit/dispedit/dispedit.component.mjs +10 -5
  7. package/esm2022/lib/dispedit/factor.pipe.mjs +83 -0
  8. package/esm2022/lib/dispedit/factorc.pipe.mjs +101 -0
  9. package/esm2022/lib/dispedit/fkselect/fkselect.component.mjs +143 -0
  10. package/esm2022/lib/dispedit/flags/flags.component.mjs +141 -0
  11. package/esm2022/lib/dispedit/m2mselect/m2mselect.component.mjs +319 -0
  12. package/esm2022/lib/dispedit/richedit/richedit.component.mjs +127 -0
  13. package/esm2022/lib/dispedit/sdelete/sdelete.component.mjs +94 -0
  14. package/esm2022/lib/messages/message-zone/message-zone.component.mjs +58 -0
  15. package/esm2022/lib/messages/message.service.mjs +152 -0
  16. package/esm2022/lib/modellist/model-list-fields/model-list-field-header/model-list-field-header.component.mjs +66 -0
  17. package/esm2022/lib/modellist/model-list-fields/model-list-fields-selector/model-list-fields-selector.component.mjs +65 -0
  18. package/esm2022/lib/modellist/model-list-filters/filters/model-list-autocomplete-filter/model-list-autocomplete-filter.component.mjs +113 -0
  19. package/esm2022/lib/modellist/model-list-filters/filters/model-list-autocomplete-multi-filter/model-list-autocomplete-multi-filter.component.mjs +30 -0
  20. package/esm2022/lib/modellist/model-list-filters/filters/model-list-date-filter/model-list-date-filter.component.mjs +41 -0
  21. package/esm2022/lib/modellist/model-list-filters/filters/model-list-datetime-filter/model-list-datetime-filter.component.mjs +41 -0
  22. package/esm2022/lib/modellist/model-list-filters/filters/model-list-datetimerange-filter/model-list-datetime-range-filter.component.mjs +22 -0
  23. package/esm2022/lib/modellist/model-list-filters/filters/model-list-flags-filter/model-list-flags-filter.component.mjs +50 -0
  24. package/esm2022/lib/modellist/model-list-filters/filters/model-list-geodistance-filter/model-list-geodistance-filter.component.mjs +64 -0
  25. package/esm2022/lib/modellist/model-list-filters/filters/model-list-number-filter/model-list-number-filter.component.mjs +47 -0
  26. package/esm2022/lib/modellist/model-list-filters/filters/model-list-select-filter/model-list-select-filter.component.mjs +57 -0
  27. package/esm2022/lib/modellist/model-list-filters/filters/model-list-select-multi-filter/model-list-select-multi-filter.component.mjs +52 -0
  28. package/esm2022/lib/modellist/model-list-filters/filters/model-list-text-filter/model-list-text-filter.component.mjs +41 -0
  29. package/esm2022/lib/modellist/model-list-filters/filters/model-list-tree-filter/model-list-tree-filter.component.mjs +175 -0
  30. package/esm2022/lib/modellist/model-list-filters/model-list-filters/model-list-filters.component.mjs +51 -0
  31. package/esm2022/lib/modellist/model-list-filters/model-list-filters-select/model-list-filters-select.component.mjs +31 -0
  32. package/esm2022/lib/modellist/model-list-paginator/model-list-paginator/model-list-paginator.component.mjs +71 -0
  33. package/esm2022/lib/modellist/model-list-sorter/model-list-sorter/model-list-sorter.component.mjs +50 -0
  34. package/esm2022/lib/modellist/model-list.service.mjs +158 -0
  35. package/esm2022/lib/routing/breadcrumb/breadcrumb.component.mjs +143 -0
  36. package/esm2022/lib/updates/update/update.component.mjs +18 -0
  37. package/esm2022/lib/updates/update.service.mjs +59 -0
  38. package/esm2022/lib/uploader/ng-file-drop.directive.mjs +82 -0
  39. package/esm2022/lib/uploader/ng-file-select.directive.mjs +52 -0
  40. package/esm2022/lib/uploader/ngx-uploader.module.mjs +18 -0
  41. package/esm2022/lib/utils/tab-memory.service.mjs +81 -0
  42. package/{fesm2020 → fesm2022}/solidev-data.mjs +153 -149
  43. package/fesm2022/solidev-data.mjs.map +1 -0
  44. package/lib/dispedit/dispedit/dispedit.component.d.ts +1 -1
  45. package/lib/dispedit/fkselect/fkselect.component.d.ts +1 -1
  46. package/lib/dispedit/flags/flags.component.d.ts +1 -1
  47. package/lib/dispedit/m2mselect/m2mselect.component.d.ts +1 -1
  48. package/lib/dispedit/richedit/richedit.component.d.ts +1 -1
  49. package/lib/dispedit/sdelete/sdelete.component.d.ts +1 -1
  50. package/lib/messages/message-zone/message-zone.component.d.ts +1 -1
  51. package/lib/modellist/model-list-fields/model-list-field-header/model-list-field-header.component.d.ts +1 -1
  52. package/lib/modellist/model-list-fields/model-list-fields-selector/model-list-fields-selector.component.d.ts +1 -1
  53. package/lib/modellist/model-list-filters/filters/model-list-autocomplete-filter/model-list-autocomplete-filter.component.d.ts +1 -1
  54. package/lib/modellist/model-list-filters/filters/model-list-autocomplete-multi-filter/model-list-autocomplete-multi-filter.component.d.ts +1 -1
  55. package/lib/modellist/model-list-filters/filters/model-list-date-filter/model-list-date-filter.component.d.ts +1 -1
  56. package/lib/modellist/model-list-filters/filters/model-list-datetime-filter/model-list-datetime-filter.component.d.ts +1 -1
  57. package/lib/modellist/model-list-filters/filters/model-list-datetimerange-filter/model-list-datetime-range-filter.component.d.ts +1 -1
  58. package/lib/modellist/model-list-filters/filters/model-list-flags-filter/model-list-flags-filter.component.d.ts +1 -1
  59. package/lib/modellist/model-list-filters/filters/model-list-geodistance-filter/model-list-geodistance-filter.component.d.ts +1 -1
  60. package/lib/modellist/model-list-filters/filters/model-list-number-filter/model-list-number-filter.component.d.ts +1 -1
  61. package/lib/modellist/model-list-filters/filters/model-list-select-filter/model-list-select-filter.component.d.ts +1 -1
  62. package/lib/modellist/model-list-filters/filters/model-list-select-multi-filter/model-list-select-multi-filter.component.d.ts +1 -1
  63. package/lib/modellist/model-list-filters/filters/model-list-text-filter/model-list-text-filter.component.d.ts +1 -1
  64. package/lib/modellist/model-list-filters/filters/model-list-tree-filter/model-list-tree-filter.component.d.ts +1 -1
  65. package/lib/modellist/model-list-filters/model-list-filters/model-list-filters.component.d.ts +1 -1
  66. package/lib/modellist/model-list-filters/model-list-filters-select/model-list-filters-select.component.d.ts +1 -1
  67. package/lib/modellist/model-list-paginator/model-list-paginator/model-list-paginator.component.d.ts +1 -1
  68. package/lib/modellist/model-list-sorter/model-list-sorter/model-list-sorter.component.d.ts +1 -1
  69. package/lib/routing/breadcrumb/breadcrumb.component.d.ts +1 -1
  70. package/lib/uploader/ng-file-drop.directive.d.ts +1 -1
  71. package/lib/uploader/ng-file-select.directive.d.ts +1 -1
  72. package/package.json +7 -13
  73. package/esm2020/lib/auth/auth-interceptor.service.mjs +0 -91
  74. package/esm2020/lib/data/data-backend.mjs +0 -134
  75. package/esm2020/lib/data/data-model.mjs +0 -291
  76. package/esm2020/lib/dispedit/choice.pipe.mjs +0 -79
  77. package/esm2020/lib/dispedit/factor.pipe.mjs +0 -81
  78. package/esm2020/lib/dispedit/factorc.pipe.mjs +0 -99
  79. package/esm2020/lib/dispedit/fkselect/fkselect.component.mjs +0 -142
  80. package/esm2020/lib/dispedit/flags/flags.component.mjs +0 -140
  81. package/esm2020/lib/dispedit/m2mselect/m2mselect.component.mjs +0 -318
  82. package/esm2020/lib/dispedit/richedit/richedit.component.mjs +0 -126
  83. package/esm2020/lib/dispedit/sdelete/sdelete.component.mjs +0 -93
  84. package/esm2020/lib/messages/message-zone/message-zone.component.mjs +0 -57
  85. package/esm2020/lib/messages/message.service.mjs +0 -151
  86. package/esm2020/lib/modellist/model-list-fields/model-list-field-header/model-list-field-header.component.mjs +0 -65
  87. package/esm2020/lib/modellist/model-list-fields/model-list-fields-selector/model-list-fields-selector.component.mjs +0 -64
  88. package/esm2020/lib/modellist/model-list-filters/filters/model-list-autocomplete-filter/model-list-autocomplete-filter.component.mjs +0 -112
  89. package/esm2020/lib/modellist/model-list-filters/filters/model-list-autocomplete-multi-filter/model-list-autocomplete-multi-filter.component.mjs +0 -29
  90. package/esm2020/lib/modellist/model-list-filters/filters/model-list-date-filter/model-list-date-filter.component.mjs +0 -40
  91. package/esm2020/lib/modellist/model-list-filters/filters/model-list-datetime-filter/model-list-datetime-filter.component.mjs +0 -40
  92. package/esm2020/lib/modellist/model-list-filters/filters/model-list-datetimerange-filter/model-list-datetime-range-filter.component.mjs +0 -21
  93. package/esm2020/lib/modellist/model-list-filters/filters/model-list-flags-filter/model-list-flags-filter.component.mjs +0 -49
  94. package/esm2020/lib/modellist/model-list-filters/filters/model-list-geodistance-filter/model-list-geodistance-filter.component.mjs +0 -63
  95. package/esm2020/lib/modellist/model-list-filters/filters/model-list-number-filter/model-list-number-filter.component.mjs +0 -46
  96. package/esm2020/lib/modellist/model-list-filters/filters/model-list-select-filter/model-list-select-filter.component.mjs +0 -56
  97. package/esm2020/lib/modellist/model-list-filters/filters/model-list-select-multi-filter/model-list-select-multi-filter.component.mjs +0 -51
  98. package/esm2020/lib/modellist/model-list-filters/filters/model-list-text-filter/model-list-text-filter.component.mjs +0 -40
  99. package/esm2020/lib/modellist/model-list-filters/filters/model-list-tree-filter/model-list-tree-filter.component.mjs +0 -174
  100. package/esm2020/lib/modellist/model-list-filters/model-list-filters/model-list-filters.component.mjs +0 -50
  101. package/esm2020/lib/modellist/model-list-filters/model-list-filters-select/model-list-filters-select.component.mjs +0 -30
  102. package/esm2020/lib/modellist/model-list-paginator/model-list-paginator/model-list-paginator.component.mjs +0 -70
  103. package/esm2020/lib/modellist/model-list-sorter/model-list-sorter/model-list-sorter.component.mjs +0 -49
  104. package/esm2020/lib/modellist/model-list.service.mjs +0 -157
  105. package/esm2020/lib/routing/breadcrumb/breadcrumb.component.mjs +0 -142
  106. package/esm2020/lib/updates/update/update.component.mjs +0 -17
  107. package/esm2020/lib/updates/update.service.mjs +0 -58
  108. package/esm2020/lib/uploader/ng-file-drop.directive.mjs +0 -81
  109. package/esm2020/lib/uploader/ng-file-select.directive.mjs +0 -51
  110. package/esm2020/lib/uploader/ngx-uploader.module.mjs +0 -17
  111. package/esm2020/lib/utils/tab-memory.service.mjs +0 -80
  112. package/fesm2015/solidev-data.mjs +0 -6224
  113. package/fesm2015/solidev-data.mjs.map +0 -1
  114. package/fesm2020/solidev-data.mjs.map +0 -1
  115. /package/{esm2020 → esm2022}/lib/auth/jwt.mjs +0 -0
  116. /package/{esm2020 → esm2022}/lib/data/data-collection.mjs +0 -0
  117. /package/{esm2020 → esm2022}/lib/data/data-collection.mock.mjs +0 -0
  118. /package/{esm2020 → esm2022}/lib/data/data-parameters.mjs +0 -0
  119. /package/{esm2020 → esm2022}/lib/data/data-query.mjs +0 -0
  120. /package/{esm2020 → esm2022}/lib/data/data-query.mock.mjs +0 -0
  121. /package/{esm2020 → esm2022}/lib/data/fields/base.mjs +0 -0
  122. /package/{esm2020 → esm2022}/lib/data/fields/boolean.mjs +0 -0
  123. /package/{esm2020 → esm2022}/lib/data/fields/computed.mjs +0 -0
  124. /package/{esm2020 → esm2022}/lib/data/fields/datetime.mjs +0 -0
  125. /package/{esm2020 → esm2022}/lib/data/fields/index.mjs +0 -0
  126. /package/{esm2020 → esm2022}/lib/data/fields/numbers.mjs +0 -0
  127. /package/{esm2020 → esm2022}/lib/data/fields/primaryfield.mjs +0 -0
  128. /package/{esm2020 → esm2022}/lib/data/fields/relations.mjs +0 -0
  129. /package/{esm2020 → esm2022}/lib/data/fields/stringfields.mjs +0 -0
  130. /package/{esm2020 → esm2022}/lib/dispedit/dispedit/dispedit.constants.mjs +0 -0
  131. /package/{esm2020 → esm2022}/lib/modellist/model-list-fields/model-list-field-header/messages.mjs +0 -0
  132. /package/{esm2020 → esm2022}/lib/modellist/model-list-fields/model-list-fields.mjs +0 -0
  133. /package/{esm2020 → esm2022}/lib/modellist/model-list-filters/filters/filtertypes.mjs +0 -0
  134. /package/{esm2020 → esm2022}/lib/modellist/model-list-filters/filters/model-list-autocomplete-filter/model-list-autocomplete-filter.mjs +0 -0
  135. /package/{esm2020 → esm2022}/lib/modellist/model-list-filters/filters/model-list-autocomplete-multi-filter/model-list-autocomplete-multi-filter.mjs +0 -0
  136. /package/{esm2020 → esm2022}/lib/modellist/model-list-filters/filters/model-list-date-filter/model-list-date-filter.mjs +0 -0
  137. /package/{esm2020 → esm2022}/lib/modellist/model-list-filters/filters/model-list-datetime-filter/model-list-datetime-filter.mjs +0 -0
  138. /package/{esm2020 → esm2022}/lib/modellist/model-list-filters/filters/model-list-datetimerange-filter/model-list-datetimerange-filter.mjs +0 -0
  139. /package/{esm2020 → esm2022}/lib/modellist/model-list-filters/filters/model-list-flags-filter/model-list-flags-filter.mjs +0 -0
  140. /package/{esm2020 → esm2022}/lib/modellist/model-list-filters/filters/model-list-geodistance-filter/adapters/ban.mjs +0 -0
  141. /package/{esm2020 → esm2022}/lib/modellist/model-list-filters/filters/model-list-geodistance-filter/model-list-geodistance-filter.mjs +0 -0
  142. /package/{esm2020 → esm2022}/lib/modellist/model-list-filters/filters/model-list-number-filter/model-list-number-filter.mjs +0 -0
  143. /package/{esm2020 → esm2022}/lib/modellist/model-list-filters/filters/model-list-select-filter/model-list-select-filter.mjs +0 -0
  144. /package/{esm2020 → esm2022}/lib/modellist/model-list-filters/filters/model-list-select-multi-filter/model-list-select-multi-filter.mjs +0 -0
  145. /package/{esm2020 → esm2022}/lib/modellist/model-list-filters/filters/model-list-text-filter/model-list-text-filter.mjs +0 -0
  146. /package/{esm2020 → esm2022}/lib/modellist/model-list-filters/filters/model-list-tree-filter/model-list-tree-filter.mjs +0 -0
  147. /package/{esm2020 → esm2022}/lib/modellist/model-list-filters/model-list-filter.mjs +0 -0
  148. /package/{esm2020 → esm2022}/lib/modellist/model-list-filters/model-list-filters.mjs +0 -0
  149. /package/{esm2020 → esm2022}/lib/modellist/model-list-paginator/model-list-paginator.mjs +0 -0
  150. /package/{esm2020 → esm2022}/lib/modellist/model-list-sorter/model-list-sorter.mjs +0 -0
  151. /package/{esm2020 → esm2022}/lib/routing/routing.mjs +0 -0
  152. /package/{esm2020 → esm2022}/lib/uploader/index.mjs +0 -0
  153. /package/{esm2020 → esm2022}/lib/uploader/interfaces.mjs +0 -0
  154. /package/{esm2020 → esm2022}/lib/uploader/ngx-uploader.class.mjs +0 -0
  155. /package/{esm2020 → esm2022}/lib/utils/slugify.mjs +0 -0
  156. /package/{esm2020 → esm2022}/lib/utils/template.mjs +0 -0
  157. /package/{esm2020 → esm2022}/public-api.mjs +0 -0
  158. /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 &amp;&amp; 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 &amp;&amp; !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 &amp;&amp; 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 &amp;&amp; !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==