@seniorsistemas/angular-components 19.3.4 → 19.4.1

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.
@@ -1,18 +1,19 @@
1
+ import * as i0 from '@angular/core';
2
+ import { inject, ChangeDetectorRef, input, signal, output, EventEmitter, DestroyRef, Component, Input, Output, ContentChildren, NgModule } from '@angular/core';
1
3
  import * as i2 from '@angular/cdk/drag-drop';
2
4
  import { DragDropModule } from '@angular/cdk/drag-drop';
3
- import * as i1 from '@angular/common';
4
- import { CommonModule } from '@angular/common';
5
- import * as i0 from '@angular/core';
6
- import { inject, ChangeDetectorRef, EventEmitter, Component, Input, Output, ContentChildren, NgModule } from '@angular/core';
5
+ import { NgTemplateOutlet } from '@angular/common';
6
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
7
7
  import * as i3 from '@angular/forms';
8
8
  import { FormsModule } from '@angular/forms';
9
- import * as i5 from '@ngx-translate/core';
9
+ import * as i1 from '@ngx-translate/core';
10
10
  import { TranslateModule } from '@ngx-translate/core';
11
- import { pipe } from 'rxjs';
12
- import { randomHash } from '@seniorsistemas/angular-components/utils';
11
+ import { ButtonComponent } from '@seniorsistemas/angular-components/button';
12
+ import * as i4 from '@seniorsistemas/angular-components/loading-state';
13
+ import { LoadingStateIndicators, LoadingStateModule } from '@seniorsistemas/angular-components/loading-state';
13
14
  import { TemplateDirective } from '@seniorsistemas/angular-components/template';
14
- import * as i4 from '@seniorsistemas/angular-components/button';
15
- import { ButtonModule } from '@seniorsistemas/angular-components/button';
15
+ import { randomHash } from '@seniorsistemas/angular-components/utils';
16
+ import { Subject, switchMap, distinctUntilChanged, debounceTime, tap, pipe } from 'rxjs';
16
17
 
17
18
  /**
18
19
  * @description Componente de lista de dupla seleção (picklist) com suporte a
@@ -55,6 +56,18 @@ class PicklistComponent {
55
56
  showCheckbox = false;
56
57
  /** @description Propriedade usada para filtrar os itens das listas. @default '' */
57
58
  filterBy = '';
59
+ /** @description Habilita o carregamento preguiçoso (lazy load) para as listas. @default false */
60
+ lazyLoad = input(false);
61
+ /** @description Número de linhas a serem exibidas por página caso o lazyLoad esteja habilitado. @default 10 */
62
+ rows = input(10);
63
+ /** @description Função loader para a lista de disponíveis (to-select). Quando fornecida, o componente gerencia internamente paginação, loading e race conditions. */
64
+ sourceLoader = input();
65
+ /** @description Função loader para a lista de selecionados (selected). Quando fornecida, o componente gerencia internamente paginação, loading e race conditions. */
66
+ targetLoader = input();
67
+ _loadingTarget = signal(false);
68
+ _loadingSource = signal(false);
69
+ /** @description Emitido quando um item é movido entre as listas e o lazy load está habilitado. */
70
+ nodeMoved = output();
58
71
  /** @description Emitido quando a lista de selecionados muda. */
59
72
  selectedItensChange = new EventEmitter();
60
73
  /** @description Emitido quando a lista de disponíveis muda. */
@@ -63,17 +76,29 @@ class PicklistComponent {
63
76
  selectedItensFilter = '';
64
77
  itemToSelectTemplate = null;
65
78
  itemSelectedTemplate = null;
79
+ logoIndicator = LoadingStateIndicators.Logo;
66
80
  itensToSelectFilterUtil = {
81
+ allItensSelected: false,
67
82
  rawItensToSelect: [],
68
83
  filteredItensToSelect: [],
69
84
  };
70
85
  selectedItensFilterUtil = {
86
+ allItensSelected: false,
71
87
  rawSelectedItens: [],
72
88
  filteredSelectedItens: [],
73
89
  };
74
90
  selectedItensMap = new Set();
75
91
  itensToSelectId = randomHash('itensToSelect');
76
92
  selectedItensId = randomHash('selectedItens');
93
+ destroyRef = inject(DestroyRef);
94
+ sourceFilterSubject = new Subject();
95
+ targetFilterSubject = new Subject();
96
+ sourceLoadSubject = new Subject();
97
+ targetLoadSubject = new Subject();
98
+ _internalTotalSource = 0;
99
+ _internalTotalTarget = 0;
100
+ sourceCurrentPage = 0;
101
+ targetCurrentPage = 0;
77
102
  _logErrorTemplate = true;
78
103
  templates = null;
79
104
  ngAfterViewInit() {
@@ -89,19 +114,48 @@ class PicklistComponent {
89
114
  }
90
115
  this.cdr.detectChanges();
91
116
  }
117
+ ngOnInit() {
118
+ this.setupLoaderPipelines();
119
+ this.setupLazyLoadEvents();
120
+ this.setupFilterDebounce();
121
+ }
92
122
  ngOnChanges(changes) {
93
- if (changes['itensToSelect']?.firstChange) {
123
+ const changedItensToSelect = changes['itensToSelect'];
124
+ const changedSelectedItens = changes['selectedItens'];
125
+ if (changedItensToSelect && !this.lazyLoad()) {
94
126
  this.itensToSelectFilterUtil = {
127
+ allItensSelected: this.itensToSelectFilterUtil.allItensSelected || false,
95
128
  rawItensToSelect: this.itensToSelect,
96
129
  filteredItensToSelect: this.itensToSelect,
97
130
  };
98
131
  }
99
- if (changes['selectedItens']?.firstChange) {
132
+ else if (changedItensToSelect && this.lazyLoad()) {
133
+ this.itensToSelectFilterUtil.rawItensToSelect = [
134
+ ...this.itensToSelectFilterUtil.rawItensToSelect,
135
+ ...this.itensToSelect,
136
+ ];
137
+ if (this.itensToSelectFilterUtil.allItensSelected) {
138
+ this._checkAllSelectedItensChange(this.itensToSelectFilterUtil.allItensSelected, this.itensToSelectFilterUtil.rawItensToSelect, this.itensToSelectId);
139
+ }
140
+ this.itensToSelectFilterUtil.filteredItensToSelect = [...this.itensToSelectFilterUtil.rawItensToSelect];
141
+ }
142
+ if (changedSelectedItens && !this.lazyLoad()) {
100
143
  this.selectedItensFilterUtil = {
144
+ allItensSelected: this.selectedItensFilterUtil.allItensSelected || false,
101
145
  filteredSelectedItens: this.selectedItens,
102
146
  rawSelectedItens: this.selectedItens,
103
147
  };
104
148
  }
149
+ else if (changedSelectedItens && this.lazyLoad()) {
150
+ this.selectedItensFilterUtil.rawSelectedItens = [
151
+ ...this.selectedItensFilterUtil.rawSelectedItens,
152
+ ...this.selectedItens,
153
+ ];
154
+ if (this.selectedItensFilterUtil.allItensSelected) {
155
+ this._checkAllSelectedItensChange(this.selectedItensFilterUtil.allItensSelected, this.selectedItensFilterUtil.rawSelectedItens, this.selectedItensId);
156
+ }
157
+ this.selectedItensFilterUtil.filteredSelectedItens = [...this.selectedItensFilterUtil.rawSelectedItens];
158
+ }
105
159
  }
106
160
  toggleSelected(internalPicklistItem, containerListId) {
107
161
  if (internalPicklistItem.disabled) {
@@ -115,6 +169,16 @@ class PicklistComponent {
115
169
  else {
116
170
  this.selectedItensMap.delete(internalPicklistItem);
117
171
  }
172
+ const containerFilterUtil = containerListId === this.selectedItensId ? this.selectedItensFilterUtil : this.itensToSelectFilterUtil;
173
+ const isAllSelected = this._checkAllSelectedByList(containerListId === this.selectedItensId
174
+ ? this.selectedItensFilterUtil.filteredSelectedItens
175
+ : this.itensToSelectFilterUtil.filteredItensToSelect);
176
+ if (this.lazyLoad() && !internalPicklistItem.selected && containerFilterUtil.allItensSelected) {
177
+ containerFilterUtil.allItensSelected = false;
178
+ }
179
+ else if (this.lazyLoad() && isAllSelected && containerFilterUtil.allItensSelected !== isAllSelected) {
180
+ containerFilterUtil.allItensSelected = isAllSelected;
181
+ }
118
182
  this.cdr.detectChanges();
119
183
  }
120
184
  remove(all = false) {
@@ -122,16 +186,57 @@ class PicklistComponent {
122
186
  if (!itens.length) {
123
187
  return;
124
188
  }
125
- itens.forEach((itemRemove) => {
126
- this.itensToSelect.push(itemRemove);
127
- itemRemove.selected = false;
128
- this.selectedItensMap.delete(itemRemove);
189
+ const allElements = this.lazyLoad() ? [] : this.selectedItensFilterUtil.rawSelectedItens;
190
+ const revertAction = () => {
191
+ this.selectedItensFilterUtil.rawSelectedItens = [
192
+ ...this.selectedItensFilterUtil.rawSelectedItens,
193
+ ...itens.map((i) => {
194
+ i.selected = false;
195
+ return i;
196
+ }),
197
+ ];
198
+ this.itensToSelectFilterUtil.rawItensToSelect = this.itensToSelectFilterUtil.rawItensToSelect.filter((x) => !itens.includes(x));
199
+ this.selectedItensFilterUtil.allItensSelected = false;
200
+ if (this.lazyLoad()) {
201
+ this.selectedItensFilterUtil.filteredSelectedItens = this.selectedItensFilterUtil.rawSelectedItens;
202
+ this.itensToSelectFilterUtil.filteredItensToSelect = this.itensToSelectFilterUtil.rawItensToSelect;
203
+ }
204
+ else {
205
+ this.selectedItens = this.selectedItensFilterUtil.rawSelectedItens;
206
+ this.itensToSelect = this.itensToSelectFilterUtil.rawItensToSelect;
207
+ this.filterSelectedItens();
208
+ this.filterItensToSelect();
209
+ this.emitData();
210
+ }
211
+ this.cdr.detectChanges();
212
+ };
213
+ this.nodeMoved.emit({
214
+ direction: 'to-select',
215
+ items: all ? allElements : parseValueEmit(Array.from(this.selectedItensMap)),
216
+ moveAll: all,
217
+ revertAction,
129
218
  });
130
- this.selectedItens = this.selectedItens.filter((x) => !itens.includes(x));
131
- this.selectedItensFilterUtil.rawSelectedItens = this.selectedItens;
132
- this.filterSelectedItens();
133
- this.filterItensToSelect();
134
- this.emitData();
219
+ this.itensToSelectFilterUtil.rawItensToSelect = [
220
+ ...this.itensToSelectFilterUtil.rawItensToSelect,
221
+ ...itens.map((itemRemove) => {
222
+ itemRemove.selected = false;
223
+ this.selectedItensMap.delete(itemRemove);
224
+ return itemRemove;
225
+ }),
226
+ ];
227
+ this.selectedItensFilterUtil.rawSelectedItens = this.selectedItensFilterUtil.rawSelectedItens.filter((x) => !itens.includes(x));
228
+ this.selectedItensFilterUtil.allItensSelected = false;
229
+ if (this.lazyLoad()) {
230
+ this.itensToSelectFilterUtil.filteredItensToSelect = this.itensToSelectFilterUtil.rawItensToSelect;
231
+ this.selectedItensFilterUtil.filteredSelectedItens = this.selectedItensFilterUtil.rawSelectedItens;
232
+ }
233
+ else {
234
+ this.itensToSelect = this.itensToSelectFilterUtil.rawItensToSelect;
235
+ this.selectedItens = this.selectedItensFilterUtil.rawSelectedItens;
236
+ this.filterSelectedItens();
237
+ this.filterItensToSelect();
238
+ this.emitData();
239
+ }
135
240
  this.cdr.detectChanges();
136
241
  }
137
242
  add(all = false) {
@@ -139,21 +244,67 @@ class PicklistComponent {
139
244
  if (!itens.length) {
140
245
  return;
141
246
  }
142
- itens.forEach((itemRemove) => {
143
- this.selectedItens.push(itemRemove);
144
- itemRemove.selected = false;
145
- this.selectedItensMap.delete(itemRemove);
247
+ const allElements = this.lazyLoad() ? [] : this.itensToSelectFilterUtil.rawItensToSelect;
248
+ const revertAction = () => {
249
+ this.itensToSelectFilterUtil.rawItensToSelect = [
250
+ ...this.itensToSelectFilterUtil.rawItensToSelect,
251
+ ...itens.map((i) => {
252
+ i.selected = false;
253
+ this.selectedItensMap.delete(i);
254
+ return i;
255
+ }),
256
+ ];
257
+ this.selectedItensFilterUtil.rawSelectedItens = this.selectedItensFilterUtil.rawSelectedItens.filter((x) => !itens.includes(x));
258
+ this.itensToSelectFilterUtil.allItensSelected = false;
259
+ if (this.lazyLoad()) {
260
+ this.itensToSelectFilterUtil.filteredItensToSelect = this.itensToSelectFilterUtil.rawItensToSelect;
261
+ this.selectedItensFilterUtil.filteredSelectedItens = this.selectedItensFilterUtil.rawSelectedItens;
262
+ }
263
+ else {
264
+ this.itensToSelect = this.itensToSelectFilterUtil.rawItensToSelect;
265
+ this.selectedItens = this.selectedItensFilterUtil.rawSelectedItens;
266
+ this.filterSelectedItens();
267
+ this.filterItensToSelect();
268
+ this.emitData();
269
+ }
270
+ this.cdr.detectChanges();
271
+ };
272
+ this.nodeMoved.emit({
273
+ direction: 'selected',
274
+ items: all ? allElements : parseValueEmit(Array.from(this.selectedItensMap)),
275
+ moveAll: all,
276
+ revertAction,
146
277
  });
147
- this.itensToSelect = this.itensToSelect.filter((x) => !itens.includes(x));
148
- this.itensToSelectFilterUtil.rawItensToSelect = this.itensToSelect;
149
- this.filterSelectedItens();
150
- this.filterItensToSelect();
151
- this.emitData();
278
+ this.selectedItensFilterUtil.rawSelectedItens = [
279
+ ...this.selectedItensFilterUtil.rawSelectedItens,
280
+ ...itens.map((itemRemove) => {
281
+ itemRemove.selected = false;
282
+ this.selectedItensMap.delete(itemRemove);
283
+ return itemRemove;
284
+ }),
285
+ ];
286
+ this.itensToSelectFilterUtil.rawItensToSelect = this.itensToSelectFilterUtil.rawItensToSelect.filter((x) => !itens.includes(x));
287
+ this.itensToSelectFilterUtil.allItensSelected = false;
288
+ if (this.lazyLoad()) {
289
+ this.selectedItensFilterUtil.filteredSelectedItens = this.selectedItensFilterUtil.rawSelectedItens;
290
+ this.itensToSelectFilterUtil.filteredItensToSelect = this.itensToSelectFilterUtil.rawItensToSelect;
291
+ }
292
+ else {
293
+ this.selectedItens = this.selectedItensFilterUtil.rawSelectedItens;
294
+ this.itensToSelect = this.itensToSelectFilterUtil.rawItensToSelect;
295
+ this.filterSelectedItens();
296
+ this.filterItensToSelect();
297
+ this.emitData();
298
+ }
152
299
  this.cdr.detectChanges();
153
300
  }
154
301
  filterItensToSelect() {
155
- let searchTerm = this.availableItensFilter;
156
- searchTerm = searchTerm.trim();
302
+ if (this.lazyLoad()) {
303
+ this._loadingSource.set(true);
304
+ this.sourceFilterSubject.next(this.availableItensFilter);
305
+ return;
306
+ }
307
+ let searchTerm = this.availableItensFilter.trim();
157
308
  if (searchTerm) {
158
309
  this.itensToSelectFilterUtil.filteredItensToSelect = this.itensToSelectFilterUtil.rawItensToSelect.filter((item) => compareStrings(item.data[this.filterBy], searchTerm));
159
310
  }
@@ -163,8 +314,12 @@ class PicklistComponent {
163
314
  this.cdr.detectChanges();
164
315
  }
165
316
  filterSelectedItens() {
166
- let searchTerm = this.selectedItensFilter;
167
- searchTerm = searchTerm.trim();
317
+ if (this.lazyLoad()) {
318
+ this._loadingTarget.set(true);
319
+ this.targetFilterSubject.next(this.selectedItensFilter);
320
+ return;
321
+ }
322
+ let searchTerm = this.selectedItensFilter.trim();
168
323
  if (searchTerm) {
169
324
  this.selectedItensFilterUtil.filteredSelectedItens = this.selectedItensFilterUtil.rawSelectedItens.filter((item) => compareStrings(item.data[this.filterBy], searchTerm));
170
325
  }
@@ -196,14 +351,30 @@ class PicklistComponent {
196
351
  onDragRelease() {
197
352
  this.selectedItensMap.forEach((item) => (item.invisible = false));
198
353
  }
199
- checkAllAvailableItensChange(target) {
200
- const checked = target.checked;
354
+ checkAllAvailableItensChange(checked) {
201
355
  this._checkAllSelectedItensChange(checked, this.itensToSelectFilterUtil.filteredItensToSelect, this.itensToSelectId);
202
356
  }
203
- checkAllSelectedItensChange(target) {
204
- const checked = target.checked;
357
+ checkAllSelectedItensChange(checked) {
205
358
  this._checkAllSelectedItensChange(checked, this.selectedItensFilterUtil.filteredSelectedItens, this.selectedItensId);
206
359
  }
360
+ onScroll(event, listId) {
361
+ if (!this.lazyLoad()) {
362
+ return;
363
+ }
364
+ const element = event.target;
365
+ const reachLimit = element.offsetHeight + element.scrollTop >= element.scrollHeight;
366
+ if (!reachLimit) {
367
+ return;
368
+ }
369
+ const target = listId === this.selectedItensId ? 'selected' : 'to-select';
370
+ const targetReachLimit = target === 'selected'
371
+ ? this.selectedItensFilterUtil.filteredSelectedItens.length >= this._internalTotalTarget
372
+ : this.itensToSelectFilterUtil.filteredItensToSelect.length >= this._internalTotalSource;
373
+ if (targetReachLimit) {
374
+ return;
375
+ }
376
+ this.loadNextPage(target);
377
+ }
207
378
  get disableSelectedItensCheckbox() {
208
379
  return filterEnabled(this.selectedItensFilterUtil.filteredSelectedItens).length === 0;
209
380
  }
@@ -216,11 +387,69 @@ class PicklistComponent {
216
387
  get selectedItensAllSelected() {
217
388
  return this._checkAllSelectedByList(this.selectedItensFilterUtil.filteredSelectedItens);
218
389
  }
219
- get canAddItens() {
220
- return this.itensToSelect.filter((x) => x?.selected).length > 0;
390
+ get hasSelectedItens() {
391
+ return this.selectedItensMap.size > 0;
221
392
  }
222
- get canRemoveItens() {
223
- return this.selectedItens.filter((x) => x?.selected).length > 0;
393
+ /**
394
+ * @description Recarrega as listas após a confirmação de uma movimentação pelo backend.
395
+ *
396
+ * **Por que usar?**
397
+ * Ao mover itens, o componente atualiza a UI de forma otimista — os itens são movidos
398
+ * imediatamente antes da confirmação do servidor. Após o backend confirmar a operação,
399
+ * chame `resetList` para limpar e recarregar as listas afetadas do zero, garantindo que
400
+ * o estado da UI reflita os dados reais persistidos.
401
+ *
402
+ * **O que espera?**
403
+ * Recebe o objeto `PicklistItemMove<T>` emitido pelo output `(nodeMoved)`. O componente
404
+ * utiliza `node.direction` para determinar qual lista recarregar (a lista de destino da
405
+ * movimentação) e `node.moveAll` para verificar se a origem também deve ser recarregada
406
+ * (por exemplo, ao mover todos os itens de uma lista para outra, ambas ficam com estado
407
+ * alterado no backend).
408
+ *
409
+ * **O que faz?**
410
+ * - Reseta o contador de página da lista de destino para `0` (primeira página).
411
+ * - Limpa todos os itens carregados na lista de destino.
412
+ * - Dispara imediatamente o carregamento da primeira página via `sourceLoader`/`targetLoader`.
413
+ * - Se `node.moveAll === true`, repete o processo para a lista de origem.
414
+ *
415
+ * **Exemplo de uso:**
416
+ * ```typescript
417
+ * nodeMoved(node: PicklistItemMove<MyItem>): void {
418
+ * this.service.moveItems(node).subscribe({
419
+ * next: () => this.myPicklist().resetList(node),
420
+ * error: () => node.revertAction(),
421
+ * });
422
+ * }
423
+ * ```
424
+ *
425
+ * @param node - O objeto de movimentação emitido pelo output `(nodeMoved)`.
426
+ */
427
+ resetList(node) {
428
+ if (!this.lazyLoad()) {
429
+ return;
430
+ }
431
+ this._resetListByTarget(node.direction);
432
+ if (node.moveAll) {
433
+ this._resetListByTarget(node.direction === 'selected' ? 'to-select' : 'selected');
434
+ }
435
+ }
436
+ _resetListByTarget(target) {
437
+ if (target === 'selected') {
438
+ this.targetCurrentPage = -1;
439
+ this._internalTotalTarget = 0;
440
+ this.selectedItens = [];
441
+ this.selectedItensFilterUtil.rawSelectedItens = [];
442
+ this.selectedItensFilterUtil.filteredSelectedItens = [];
443
+ }
444
+ else {
445
+ this.sourceCurrentPage = -1;
446
+ this._internalTotalSource = 0;
447
+ this.itensToSelect = [];
448
+ this.itensToSelectFilterUtil.rawItensToSelect = [];
449
+ this.itensToSelectFilterUtil.filteredItensToSelect = [];
450
+ }
451
+ this.cdr.detectChanges();
452
+ Promise.resolve().then(() => this.loadNextPage(target));
224
453
  }
225
454
  _checkAllSelectedByList(list) {
226
455
  const _listItens = filterEnabled(list);
@@ -231,12 +460,135 @@ class PicklistComponent {
231
460
  return _listItens.every((x) => x.selected);
232
461
  }
233
462
  }
463
+ setupLoaderPipelines() {
464
+ if (!this.lazyLoad()) {
465
+ return;
466
+ }
467
+ if (!this.sourceLoader && !this.targetLoader && this._logErrorTemplate) {
468
+ console.error(`Lazy load is enabled but no loader function was provided. Please provide at least one loader function using 'sourceLoader' or 'targetLoader' input.`);
469
+ }
470
+ if (this.sourceLoader()) {
471
+ this.sourceLoadSubject
472
+ .pipe(switchMap((event) => {
473
+ this._loadingSource.set(true);
474
+ return this.sourceLoader()(event);
475
+ }), takeUntilDestroyed(this.destroyRef))
476
+ .subscribe(({ items, totalRecords }) => {
477
+ this._internalTotalSource = totalRecords;
478
+ this.itensToSelectFilterUtil.rawItensToSelect = [
479
+ ...this.itensToSelectFilterUtil.rawItensToSelect,
480
+ ...items,
481
+ ];
482
+ if (this.itensToSelectFilterUtil.allItensSelected) {
483
+ this._checkAllSelectedItensChange(true, this.itensToSelectFilterUtil.rawItensToSelect, this.itensToSelectId);
484
+ }
485
+ this.itensToSelectFilterUtil.filteredItensToSelect = [
486
+ ...this.itensToSelectFilterUtil.rawItensToSelect,
487
+ ];
488
+ this._loadingSource.set(false);
489
+ this.cdr.detectChanges();
490
+ });
491
+ }
492
+ if (this.targetLoader()) {
493
+ this.targetLoadSubject
494
+ .pipe(switchMap((event) => {
495
+ this._loadingTarget.set(true);
496
+ return this.targetLoader()(event);
497
+ }), takeUntilDestroyed(this.destroyRef))
498
+ .subscribe(({ items, totalRecords }) => {
499
+ this._internalTotalTarget = totalRecords;
500
+ this.selectedItensFilterUtil.rawSelectedItens = [
501
+ ...this.selectedItensFilterUtil.rawSelectedItens,
502
+ ...items,
503
+ ];
504
+ if (this.selectedItensFilterUtil.allItensSelected) {
505
+ this._checkAllSelectedItensChange(true, this.selectedItensFilterUtil.rawSelectedItens, this.selectedItensId);
506
+ }
507
+ this.selectedItensFilterUtil.filteredSelectedItens = [
508
+ ...this.selectedItensFilterUtil.rawSelectedItens,
509
+ ];
510
+ this._loadingTarget.set(false);
511
+ this.cdr.detectChanges();
512
+ });
513
+ }
514
+ }
515
+ setupFilterDebounce() {
516
+ if (!this.lazyLoad()) {
517
+ return;
518
+ }
519
+ this.sourceFilterSubject
520
+ .pipe(distinctUntilChanged(), debounceTime(300), tap(() => {
521
+ this.sourceCurrentPage = -1;
522
+ this.itensToSelect = [];
523
+ this.itensToSelectFilterUtil.rawItensToSelect = [];
524
+ this.itensToSelectFilterUtil.filteredItensToSelect = [];
525
+ this.cdr.detectChanges();
526
+ }), switchMap(() => {
527
+ this.loadNextPage('to-select');
528
+ return [];
529
+ }), takeUntilDestroyed(this.destroyRef))
530
+ .subscribe();
531
+ this.targetFilterSubject
532
+ .pipe(distinctUntilChanged(), debounceTime(300), tap(() => {
533
+ this.targetCurrentPage = -1;
534
+ this.selectedItens = [];
535
+ this.selectedItensFilterUtil.rawSelectedItens = [];
536
+ this.selectedItensFilterUtil.filteredSelectedItens = [];
537
+ this.cdr.detectChanges();
538
+ }), switchMap(() => {
539
+ this.loadNextPage('selected');
540
+ return [];
541
+ }), takeUntilDestroyed(this.destroyRef))
542
+ .subscribe();
543
+ }
544
+ setupLazyLoadEvents() {
545
+ if (!this.lazyLoad()) {
546
+ return;
547
+ }
548
+ Promise.resolve().then(() => {
549
+ this.loadNextPage('to-select');
550
+ this.loadNextPage('selected');
551
+ });
552
+ }
553
+ loadNextPage(target) {
554
+ const totalRegisters = target === 'selected' ? this._internalTotalTarget : this._internalTotalSource;
555
+ const lastPage = Math.ceil(totalRegisters / this.rows());
556
+ if (target === 'selected' && this.targetCurrentPage < lastPage) {
557
+ this.targetCurrentPage++;
558
+ }
559
+ else if (target === 'to-select' && this.sourceCurrentPage < lastPage) {
560
+ this.sourceCurrentPage++;
561
+ }
562
+ this.emitCurrentPage(target);
563
+ }
564
+ emitCurrentPage(target) {
565
+ const filter = target === 'selected' ? this.selectedItensFilter : this.availableItensFilter;
566
+ const page = target === 'selected' ? this.targetCurrentPage : this.sourceCurrentPage;
567
+ const event = { target, page, filter, pageSize: this.rows() };
568
+ if (target === 'selected') {
569
+ this.targetLoadSubject.next(event);
570
+ }
571
+ else {
572
+ this.sourceLoadSubject.next(event);
573
+ }
574
+ }
234
575
  _checkAllSelectedItensChange(checked, list, listId) {
235
576
  this.unselectedItensByListId(listId === this.selectedItensId ? this.itensToSelectId : this.selectedItensId);
236
577
  filterEnabled(list).forEach((item) => {
237
578
  item.selected = checked;
238
- this.selectedItensMap.add(item);
579
+ if (checked) {
580
+ this.selectedItensMap.add(item);
581
+ }
582
+ else {
583
+ this.selectedItensMap.delete(item);
584
+ }
239
585
  });
586
+ if (listId === this.selectedItensId) {
587
+ this.selectedItensFilterUtil.allItensSelected = checked;
588
+ }
589
+ else {
590
+ this.itensToSelectFilterUtil.allItensSelected = checked;
591
+ }
240
592
  this.cdr.detectChanges();
241
593
  }
242
594
  unselectedItensByListId(listId) {
@@ -260,11 +612,11 @@ class PicklistComponent {
260
612
  this.selectedItensChange.emit(parseValueEmit(this.selectedItens));
261
613
  }
262
614
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PicklistComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
263
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: PicklistComponent, selector: "s-picklist", inputs: { itensToSelect: "itensToSelect", selectedItens: "selectedItens", availableItensLabel: "availableItensLabel", availableItensPlaceholder: "availableItensPlaceholder", addSelectedItensLabel: "addSelectedItensLabel", addAllItensLabel: "addAllItensLabel", selectedItensLabel: "selectedItensLabel", selectedItensPlaceholder: "selectedItensPlaceholder", removeSelectedItemsLabel: "removeSelectedItemsLabel", removeAllItemsLabel: "removeAllItemsLabel", showCheckbox: "showCheckbox", filterBy: "filterBy" }, outputs: { selectedItensChange: "selectedItensChange", itensToSelectChange: "itensToSelectChange" }, queries: [{ propertyName: "templates", predicate: TemplateDirective }], usesOnChanges: true, ngImport: i0, template: "<ng-template\n #previewRender\n let-itens=\"itens\"\n let-template=\"template\"\n>\n <section class=\"picklist-items\">\n @for (item of itens; track $index) {\n <ng-container *ngTemplateOutlet=\"template; context: { item: item.data }\"></ng-container>\n }\n </section>\n</ng-template>\n\n<ng-template\n #picklistItensRender\n let-id=\"id\"\n let-itens=\"itens\"\n let-template=\"template\"\n let-listConnectedTo=\"listConnectedTo\"\n>\n <div\n class=\"picklist-items\"\n cdkDropList\n [id]=\"id\"\n [cdkDropListSortingDisabled]=\"true\"\n [cdkDropListData]=\"itens\"\n [cdkDropListConnectedTo]=\"listConnectedTo\"\n (cdkDropListDropped)=\"drop($event)\"\n >\n @for (item of itens; track $index) {\n <div\n cdkDrag\n [cdkDragDisabled]=\"item.disabled\"\n [cdkDragData]=\"item\"\n (click)=\"toggleSelected(item, id)\"\n (cdkDragStarted)=\"onDragStart($event, id)\"\n (cdkDragReleased)=\"onDragRelease()\"\n class=\"picklist-item\"\n [class.picklist-disabled]=\"item.disabled\"\n [class.picklist-item-invisible]=\"item.invisible\"\n [class.picklist-item-active]=\"item.selected\"\n >\n @if (showCheckbox) {\n <input\n type=\"checkbox\"\n class=\"input-checkbox\"\n [(ngModel)]=\"item.selected\"\n [disabled]=\"item.disabled\"\n />\n }\n <div class=\"picklist-content\">\n <ng-container *ngTemplateOutlet=\"template; context: { item: item.data, selected: item.selected, disabled: item.disabled }\"></ng-container>\n </div>\n <ng-container *cdkDragPreview>\n <ng-container *ngTemplateOutlet=\"previewRender; context: { itens: selectedItensMap, template: template }\"></ng-container>\n </ng-container>\n </div>\n }\n </div>\n</ng-template>\n\n<ng-template\n #checkboxTitleRender\n let-disabled=\"disabled\"\n let-checked=\"checked\"\n let-changeFn=\"changeFn\"\n>\n @if (showCheckbox) {\n <input\n class=\"input-checkbox\"\n type=\"checkbox\"\n [disabled]=\"disabled\"\n [checked]=\"checked\"\n (change)=\"changeFn($event.target)\"\n />\n }\n</ng-template>\n\n<div class=\"picklist-container\">\n <div class=\"picklist-item-container\">\n <div class=\"picklist-box\">\n <div class=\"picklist-title-container\">\n @if (!filterBy) {\n <ng-container\n *ngTemplateOutlet=\"\n checkboxTitleRender;\n context: {\n disabled: disableItensToSelectCheckbox,\n checked: itensToSelectAllSelected,\n changeFn: checkAllAvailableItensChange.bind(this),\n }\n \"\n ></ng-container>\n }\n <span class=\"picklist-title\">\n {{ availableItensLabel || 'platform.angular_components.available-items' | translate }}\n </span>\n </div>\n @if (filterBy && showCheckbox) {\n <div class=\"picklist-filter\">\n <ng-container\n *ngTemplateOutlet=\"\n checkboxTitleRender;\n context: {\n disabled: disableItensToSelectCheckbox,\n checked: itensToSelectAllSelected,\n changeFn: checkAllAvailableItensChange.bind(this),\n }\n \"\n ></ng-container>\n @if (filterBy) {\n <input\n type=\"text\"\n class=\"input-search\"\n [(ngModel)]=\"availableItensFilter\"\n (ngModelChange)=\"filterItensToSelect()\"\n [placeholder]=\"availableItensPlaceholder || 'platform.angular_components.picklist-placeholder' | translate\"\n />\n }\n </div>\n }\n\n <ng-container\n *ngTemplateOutlet=\"\n picklistItensRender;\n context: {\n id: itensToSelectId,\n itens: itensToSelectFilterUtil.filteredItensToSelect,\n template: itemToSelectTemplate,\n listConnectedTo: selectedItensId,\n }\n \"\n >\n </ng-container>\n </div>\n <div class=\"buttons-container\">\n <s-button\n [label]=\"addSelectedItensLabel || 'platform.angular_components.add' | translate\"\n priority=\"primary\"\n rightIconClass=\"fa fa-fw fa-arrow-right\"\n [disabled]=\"!canAddItens\"\n (clicked)=\"add()\"\n [auxiliary]=\"false\"\n [caret]=\"false\"\n >\n </s-button>\n <s-button\n [label]=\"addAllItensLabel || 'platform.angular_components.add_all' | translate\"\n priority=\"link\"\n (clicked)=\"add(true)\"\n [auxiliary]=\"false\"\n >\n </s-button>\n </div>\n </div>\n <div class=\"picklist-item-container\">\n <div class=\"picklist-box\">\n <div class=\"picklist-title-container\">\n @if (!filterBy) {\n <ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n checkboxTitleRender;\n context: {\n disabled: disableSelectedItensCheckbox,\n checked: selectedItensAllSelected,\n changeFn: checkAllSelectedItensChange.bind(this),\n }\n \"\n ></ng-container>\n </ng-container>\n }\n <span class=\"picklist-title\">\n {{ selectedItensLabel || 'platform.angular_components.selected-items' | translate }}\n </span>\n </div>\n <div\n class=\"picklist-filter\"\n *ngIf=\"filterBy && showCheckbox\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n checkboxTitleRender;\n context: { disabled: disableSelectedItensCheckbox, checked: selectedItensAllSelected, changeFn: checkAllSelectedItensChange.bind(this) }\n \"\n ></ng-container>\n @if (filterBy) {\n <input\n type=\"text\"\n class=\"input-search\"\n [(ngModel)]=\"selectedItensFilter\"\n (ngModelChange)=\"filterSelectedItens()\"\n [placeholder]=\"selectedItensPlaceholder || 'platform.angular_components.picklist-placeholder' | translate\"\n />\n }\n </div>\n <ng-container\n *ngTemplateOutlet=\"\n picklistItensRender;\n context: {\n id: selectedItensId,\n itens: selectedItensFilterUtil.filteredSelectedItens,\n template: itemSelectedTemplate,\n listConnectedTo: itensToSelectId,\n }\n \"\n >\n </ng-container>\n </div>\n <div class=\"buttons-container\">\n <s-button\n [label]=\"removeSelectedItemsLabel || 'platform.angular_components.remove' | translate\"\n priority=\"primary\"\n iconClass=\"fa fa-fw fa-arrow-left\"\n [disabled]=\"!canRemoveItens\"\n [auxiliary]=\"false\"\n (clicked)=\"remove()\"\n [caret]=\"false\"\n >\n </s-button>\n <s-button\n [label]=\"removeAllItemsLabel || 'platform.angular_components.remove_all' | translate\"\n priority=\"link\"\n (clicked)=\"remove(true)\"\n [auxiliary]=\"false\"\n >\n </s-button>\n </div>\n </div>\n</div>\n", styles: [".picklist-container{display:flex;flex-wrap:wrap;border-radius:4px solid #dedce5;width:100%;background-color:#fff;gap:20px;padding:8px}.picklist-container .picklist-item-container{display:flex;flex-direction:column;flex:1}.picklist-container .picklist-item-container .picklist-box{border:1px solid #dedce5;padding:8px;height:100%;min-width:200px}.picklist-container .picklist-item-container .picklist-box .picklist-filter{display:flex;width:100%}.picklist-container .picklist-item-container .picklist-box .picklist-filter .input-search{border:1px solid #dedce5;min-height:35px;width:100%;border-radius:3px;margin-bottom:10px;margin-top:10px;padding:0 8px;flex:1}.picklist-container .picklist-item-container .picklist-box .picklist-title-container{width:100%;display:flex;align-items:center}.picklist-container .picklist-item-container .picklist-box .picklist-title-container .picklist-title{font-family:Open Sans;font-size:14px;font-weight:700;line-height:21px;text-underline-position:from-font;text-decoration-skip-ink:none}.picklist-container .picklist-item-container .picklist-box .picklist-items{max-height:23em;overflow:auto;height:100%;min-height:55px}.picklist-container .picklist-item-container .picklist-box .picklist-items .picklist-content{width:100%;height:100%;padding-right:8px;border-radius:3px;margin-bottom:8px}.picklist-container .picklist-item-container .picklist-box .picklist-items .picklist-item{height:55px;border:3px;display:flex}.picklist-container .picklist-item-container .picklist-box .picklist-items .picklist-item:not(.picklist-disabled){cursor:pointer}.picklist-container .picklist-item-container .picklist-box .picklist-items .picklist-item:hover:not(.picklist-disabled,.picklist-item-active,.picklist-item-invisible){background-color:#f1f7f8}.picklist-container .picklist-item-container .picklist-box .picklist-items .picklist-item-active:not(.picklist-item-invisible){background-color:#d5e8ec}.picklist-container .picklist-item-container .picklist-box .picklist-items .picklist-disabled{opacity:.5;background-color:#fbfafc}.picklist-container .picklist-item-container .picklist-box .picklist-items .picklist-item-invisible{display:none!important}.picklist-container .picklist-item-container .buttons-container{padding-top:10px;display:flex}.picklist-container .picklist-item-container .input-checkbox{margin:12px}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i2.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i2.CdkDragPreview, selector: "ng-template[cdkDragPreview]", inputs: ["data", "matchSize"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i4.ButtonComponent, selector: "s-button", inputs: ["id", "label", "tooltip", "tooltipPosition", "iconClass", "rightIconClass", "caret", "styleClass", "baseZIndex", "disabled", "auxiliary", "type", "priority", "menuOptions", "size", "slide", "animation", "badge", "iconColor", "menuAriaLabel"], outputs: ["clicked"] }, { kind: "pipe", type: i5.TranslatePipe, name: "translate" }] });
615
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: PicklistComponent, isStandalone: true, selector: "s-picklist", inputs: { itensToSelect: { classPropertyName: "itensToSelect", publicName: "itensToSelect", isSignal: false, isRequired: false, transformFunction: null }, selectedItens: { classPropertyName: "selectedItens", publicName: "selectedItens", isSignal: false, isRequired: false, transformFunction: null }, availableItensLabel: { classPropertyName: "availableItensLabel", publicName: "availableItensLabel", isSignal: false, isRequired: false, transformFunction: null }, availableItensPlaceholder: { classPropertyName: "availableItensPlaceholder", publicName: "availableItensPlaceholder", isSignal: false, isRequired: false, transformFunction: null }, addSelectedItensLabel: { classPropertyName: "addSelectedItensLabel", publicName: "addSelectedItensLabel", isSignal: false, isRequired: false, transformFunction: null }, addAllItensLabel: { classPropertyName: "addAllItensLabel", publicName: "addAllItensLabel", isSignal: false, isRequired: false, transformFunction: null }, selectedItensLabel: { classPropertyName: "selectedItensLabel", publicName: "selectedItensLabel", isSignal: false, isRequired: false, transformFunction: null }, selectedItensPlaceholder: { classPropertyName: "selectedItensPlaceholder", publicName: "selectedItensPlaceholder", isSignal: false, isRequired: false, transformFunction: null }, removeSelectedItemsLabel: { classPropertyName: "removeSelectedItemsLabel", publicName: "removeSelectedItemsLabel", isSignal: false, isRequired: false, transformFunction: null }, removeAllItemsLabel: { classPropertyName: "removeAllItemsLabel", publicName: "removeAllItemsLabel", isSignal: false, isRequired: false, transformFunction: null }, showCheckbox: { classPropertyName: "showCheckbox", publicName: "showCheckbox", isSignal: false, isRequired: false, transformFunction: null }, filterBy: { classPropertyName: "filterBy", publicName: "filterBy", isSignal: false, isRequired: false, transformFunction: null }, lazyLoad: { classPropertyName: "lazyLoad", publicName: "lazyLoad", isSignal: true, isRequired: false, transformFunction: null }, rows: { classPropertyName: "rows", publicName: "rows", isSignal: true, isRequired: false, transformFunction: null }, sourceLoader: { classPropertyName: "sourceLoader", publicName: "sourceLoader", isSignal: true, isRequired: false, transformFunction: null }, targetLoader: { classPropertyName: "targetLoader", publicName: "targetLoader", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { nodeMoved: "nodeMoved", selectedItensChange: "selectedItensChange", itensToSelectChange: "itensToSelectChange" }, queries: [{ propertyName: "templates", predicate: TemplateDirective }], usesOnChanges: true, ngImport: i0, template: "<ng-template\n #previewRender\n let-itens=\"itens\"\n let-template=\"template\"\n>\n <section class=\"picklist-items\">\n @for (item of itens; track $index) {\n <ng-container *ngTemplateOutlet=\"template; context: { item: item.data }\"></ng-container>\n }\n </section>\n</ng-template>\n\n<ng-template\n #picklistItensRender\n let-id=\"id\"\n let-itens=\"itens\"\n let-template=\"template\"\n let-listConnectedTo=\"listConnectedTo\"\n let-isLoading=\"isLoading\"\n>\n <div\n class=\"picklist-items\"\n cdkDropList\n [id]=\"id\"\n [cdkDropListSortingDisabled]=\"true\"\n [cdkDropListData]=\"itens\"\n [cdkDropListConnectedTo]=\"listConnectedTo\"\n (cdkDropListDropped)=\"drop($event)\"\n *sLoadingState=\"{ loading: isLoading, indicator: logoIndicator }\"\n (scroll)=\"onScroll($event, id)\"\n >\n @for (item of itens; track $index) {\n <div\n cdkDrag\n [cdkDragDisabled]=\"item.disabled\"\n [cdkDragData]=\"item\"\n (click)=\"toggleSelected(item, id)\"\n (cdkDragStarted)=\"onDragStart($event, id)\"\n (cdkDragReleased)=\"onDragRelease()\"\n class=\"picklist-item\"\n [class.picklist-disabled]=\"item.disabled\"\n [class.picklist-item-invisible]=\"item.invisible\"\n [class.picklist-item-active]=\"item.selected\"\n >\n @if (showCheckbox) {\n <input\n type=\"checkbox\"\n class=\"input-checkbox\"\n [(ngModel)]=\"item.selected\"\n [disabled]=\"item.disabled\"\n />\n }\n <div class=\"picklist-content\">\n <ng-container\n *ngTemplateOutlet=\"\n template;\n context: { item: item.data, selected: item.selected, disabled: item.disabled }\n \"\n ></ng-container>\n </div>\n <ng-container *cdkDragPreview>\n <ng-container\n *ngTemplateOutlet=\"previewRender; context: { itens: selectedItensMap, template: template }\"\n ></ng-container>\n </ng-container>\n </div>\n }\n </div>\n</ng-template>\n\n<ng-template\n #checkboxTitleRender\n let-disabled=\"disabled\"\n let-checked=\"checked\"\n let-changeFn=\"changeFn\"\n let-id=\"id\"\n>\n @if (showCheckbox && !lazyLoad()) {\n <input\n class=\"input-checkbox\"\n type=\"checkbox\"\n [disabled]=\"disabled\"\n [checked]=\"checked\"\n (change)=\"changeFn($any($event.target).checked)\"\n />\n } @else if (showCheckbox && lazyLoad() && id === itensToSelectId) {\n <input\n class=\"input-checkbox\"\n type=\"checkbox\"\n [disabled]=\"disabled\"\n [checked]=\"itensToSelectFilterUtil.allItensSelected\"\n (change)=\"checkAllAvailableItensChange($any($event.target).checked)\"\n />\n } @else if (showCheckbox && lazyLoad() && id === selectedItensId) {\n <input\n class=\"input-checkbox\"\n type=\"checkbox\"\n [disabled]=\"disabled\"\n [checked]=\"selectedItensFilterUtil.allItensSelected\"\n (change)=\"checkAllSelectedItensChange($any($event.target).checked)\"\n />\n }\n</ng-template>\n\n<div class=\"picklist-container\">\n <div class=\"picklist-item-container\">\n <div class=\"picklist-box\">\n <div class=\"picklist-title-container\">\n @if (!filterBy && !lazyLoad()) {\n <ng-container\n *ngTemplateOutlet=\"\n checkboxTitleRender;\n context: {\n disabled: disableItensToSelectCheckbox,\n checked: itensToSelectAllSelected,\n changeFn: checkAllAvailableItensChange.bind(this),\n id: itensToSelectId,\n }\n \"\n ></ng-container>\n }\n <span class=\"picklist-title\">\n {{ availableItensLabel || 'platform.angular_components.available-items' | translate }}\n </span>\n </div>\n @if (filterBy || lazyLoad()) {\n <div class=\"picklist-filter\">\n @if (showCheckbox) {\n <ng-container\n *ngTemplateOutlet=\"\n checkboxTitleRender;\n context: {\n disabled: disableItensToSelectCheckbox,\n checked: itensToSelectAllSelected,\n changeFn: checkAllAvailableItensChange.bind(this),\n id: itensToSelectId,\n }\n \"\n ></ng-container>\n }\n <input\n type=\"text\"\n class=\"input-search\"\n [(ngModel)]=\"availableItensFilter\"\n (ngModelChange)=\"filterItensToSelect()\"\n [placeholder]=\"\n availableItensPlaceholder || 'platform.angular_components.picklist-placeholder' | translate\n \"\n />\n </div>\n }\n\n <ng-container\n *ngTemplateOutlet=\"\n picklistItensRender;\n context: {\n id: itensToSelectId,\n itens: itensToSelectFilterUtil.filteredItensToSelect,\n template: itemToSelectTemplate,\n listConnectedTo: selectedItensId,\n isLoading: _loadingSource(),\n }\n \"\n >\n </ng-container>\n </div>\n <div class=\"buttons-container\">\n <s-button\n [label]=\"addSelectedItensLabel || 'platform.angular_components.add' | translate\"\n priority=\"primary\"\n rightIconClass=\"fa fa-fw fa-arrow-right\"\n [disabled]=\"!hasSelectedItens\"\n (clicked)=\"add()\"\n [auxiliary]=\"false\"\n [caret]=\"false\"\n >\n </s-button>\n <s-button\n [label]=\"addAllItensLabel || 'platform.angular_components.add_all' | translate\"\n priority=\"link\"\n (clicked)=\"add(true)\"\n [auxiliary]=\"false\"\n >\n </s-button>\n </div>\n </div>\n <div class=\"picklist-item-container\">\n <div class=\"picklist-box\">\n <div class=\"picklist-title-container\">\n @if (!filterBy && !lazyLoad()) {\n <ng-container\n *ngTemplateOutlet=\"\n checkboxTitleRender;\n context: {\n disabled: disableSelectedItensCheckbox,\n checked: selectedItensAllSelected,\n changeFn: checkAllSelectedItensChange.bind(this),\n id: selectedItensId,\n }\n \"\n ></ng-container>\n }\n <span class=\"picklist-title\">\n {{ selectedItensLabel || 'platform.angular_components.selected-items' | translate }}\n </span>\n </div>\n @if (filterBy || lazyLoad()) {\n <div class=\"picklist-filter\">\n @if (showCheckbox) {\n <ng-container\n *ngTemplateOutlet=\"\n checkboxTitleRender;\n context: {\n disabled: disableSelectedItensCheckbox,\n checked: selectedItensAllSelected,\n changeFn: checkAllSelectedItensChange.bind(this),\n id: selectedItensId,\n }\n \"\n ></ng-container>\n }\n <input\n type=\"text\"\n class=\"input-search\"\n [(ngModel)]=\"selectedItensFilter\"\n (ngModelChange)=\"filterSelectedItens()\"\n [placeholder]=\"\n selectedItensPlaceholder || 'platform.angular_components.picklist-placeholder' | translate\n \"\n />\n </div>\n }\n <ng-container\n *ngTemplateOutlet=\"\n picklistItensRender;\n context: {\n id: selectedItensId,\n itens: selectedItensFilterUtil.filteredSelectedItens,\n template: itemSelectedTemplate,\n listConnectedTo: itensToSelectId,\n isLoading: _loadingTarget(),\n }\n \"\n >\n </ng-container>\n </div>\n <div class=\"buttons-container\">\n <s-button\n [label]=\"removeSelectedItemsLabel || 'platform.angular_components.remove' | translate\"\n priority=\"primary\"\n iconClass=\"fa fa-fw fa-arrow-left\"\n [disabled]=\"!hasSelectedItens\"\n [auxiliary]=\"false\"\n (clicked)=\"remove()\"\n [caret]=\"false\"\n >\n </s-button>\n <s-button\n [label]=\"removeAllItemsLabel || 'platform.angular_components.remove_all' | translate\"\n priority=\"link\"\n (clicked)=\"remove(true)\"\n [auxiliary]=\"false\"\n >\n </s-button>\n </div>\n </div>\n</div>\n\n", styles: [".picklist-container{display:flex;flex-wrap:wrap;border-radius:4px solid #dedce5;width:100%;background-color:#fff;gap:20px;padding:8px}.picklist-container .picklist-item-container{display:flex;flex-direction:column;flex:1}.picklist-container .picklist-item-container .picklist-box{border:1px solid #dedce5;padding:8px;height:100%;min-width:200px}.picklist-container .picklist-item-container .picklist-box .picklist-filter{display:flex;width:100%}.picklist-container .picklist-item-container .picklist-box .picklist-filter .input-search{border:1px solid #dedce5;min-height:35px;width:100%;border-radius:3px;margin-bottom:10px;margin-top:10px;padding:0 8px;flex:1}.picklist-container .picklist-item-container .picklist-box .picklist-title-container{width:100%;display:flex;align-items:center}.picklist-container .picklist-item-container .picklist-box .picklist-title-container .picklist-title{font-family:Open Sans;font-size:14px;font-weight:700;line-height:21px;text-underline-position:from-font;text-decoration-skip-ink:none}.picklist-container .picklist-item-container .picklist-box .picklist-items{max-height:23em;overflow:auto;height:100%;min-height:100px}.picklist-container .picklist-item-container .picklist-box .picklist-items .picklist-content{width:100%;height:100%;padding-right:8px;border-radius:3px;margin-bottom:8px}.picklist-container .picklist-item-container .picklist-box .picklist-items .picklist-item{height:55px;border:3px;display:flex}.picklist-container .picklist-item-container .picklist-box .picklist-items .picklist-item:not(.picklist-disabled){cursor:pointer}.picklist-container .picklist-item-container .picklist-box .picklist-items .picklist-item:hover:not(.picklist-disabled,.picklist-item-active,.picklist-item-invisible){background-color:#f1f7f8}.picklist-container .picklist-item-container .picklist-box .picklist-items .picklist-item-active:not(.picklist-item-invisible){background-color:#d5e8ec}.picklist-container .picklist-item-container .picklist-box .picklist-items .picklist-disabled{opacity:.5;background-color:#fbfafc}.picklist-container .picklist-item-container .picklist-box .picklist-items .picklist-item-invisible{display:none!important}.picklist-container .picklist-item-container .buttons-container{padding-top:10px;display:flex}.picklist-container .picklist-item-container .input-checkbox{margin:12px}\n"], dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i2.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i2.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i2.CdkDragPreview, selector: "ng-template[cdkDragPreview]", inputs: ["data", "matchSize"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: ButtonComponent, selector: "s-button", inputs: ["id", "label", "tooltip", "tooltipPosition", "iconClass", "rightIconClass", "caret", "styleClass", "baseZIndex", "disabled", "auxiliary", "type", "priority", "menuOptions", "size", "slide", "animation", "badge", "iconColor", "menuAriaLabel"], outputs: ["clicked"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: LoadingStateModule }, { kind: "directive", type: i4.LoadingStateDirective, selector: "[sLoadingState]", inputs: ["sLoadingState"] }] });
264
616
  }
265
617
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PicklistComponent, decorators: [{
266
618
  type: Component,
267
- args: [{ selector: 's-picklist', template: "<ng-template\n #previewRender\n let-itens=\"itens\"\n let-template=\"template\"\n>\n <section class=\"picklist-items\">\n @for (item of itens; track $index) {\n <ng-container *ngTemplateOutlet=\"template; context: { item: item.data }\"></ng-container>\n }\n </section>\n</ng-template>\n\n<ng-template\n #picklistItensRender\n let-id=\"id\"\n let-itens=\"itens\"\n let-template=\"template\"\n let-listConnectedTo=\"listConnectedTo\"\n>\n <div\n class=\"picklist-items\"\n cdkDropList\n [id]=\"id\"\n [cdkDropListSortingDisabled]=\"true\"\n [cdkDropListData]=\"itens\"\n [cdkDropListConnectedTo]=\"listConnectedTo\"\n (cdkDropListDropped)=\"drop($event)\"\n >\n @for (item of itens; track $index) {\n <div\n cdkDrag\n [cdkDragDisabled]=\"item.disabled\"\n [cdkDragData]=\"item\"\n (click)=\"toggleSelected(item, id)\"\n (cdkDragStarted)=\"onDragStart($event, id)\"\n (cdkDragReleased)=\"onDragRelease()\"\n class=\"picklist-item\"\n [class.picklist-disabled]=\"item.disabled\"\n [class.picklist-item-invisible]=\"item.invisible\"\n [class.picklist-item-active]=\"item.selected\"\n >\n @if (showCheckbox) {\n <input\n type=\"checkbox\"\n class=\"input-checkbox\"\n [(ngModel)]=\"item.selected\"\n [disabled]=\"item.disabled\"\n />\n }\n <div class=\"picklist-content\">\n <ng-container *ngTemplateOutlet=\"template; context: { item: item.data, selected: item.selected, disabled: item.disabled }\"></ng-container>\n </div>\n <ng-container *cdkDragPreview>\n <ng-container *ngTemplateOutlet=\"previewRender; context: { itens: selectedItensMap, template: template }\"></ng-container>\n </ng-container>\n </div>\n }\n </div>\n</ng-template>\n\n<ng-template\n #checkboxTitleRender\n let-disabled=\"disabled\"\n let-checked=\"checked\"\n let-changeFn=\"changeFn\"\n>\n @if (showCheckbox) {\n <input\n class=\"input-checkbox\"\n type=\"checkbox\"\n [disabled]=\"disabled\"\n [checked]=\"checked\"\n (change)=\"changeFn($event.target)\"\n />\n }\n</ng-template>\n\n<div class=\"picklist-container\">\n <div class=\"picklist-item-container\">\n <div class=\"picklist-box\">\n <div class=\"picklist-title-container\">\n @if (!filterBy) {\n <ng-container\n *ngTemplateOutlet=\"\n checkboxTitleRender;\n context: {\n disabled: disableItensToSelectCheckbox,\n checked: itensToSelectAllSelected,\n changeFn: checkAllAvailableItensChange.bind(this),\n }\n \"\n ></ng-container>\n }\n <span class=\"picklist-title\">\n {{ availableItensLabel || 'platform.angular_components.available-items' | translate }}\n </span>\n </div>\n @if (filterBy && showCheckbox) {\n <div class=\"picklist-filter\">\n <ng-container\n *ngTemplateOutlet=\"\n checkboxTitleRender;\n context: {\n disabled: disableItensToSelectCheckbox,\n checked: itensToSelectAllSelected,\n changeFn: checkAllAvailableItensChange.bind(this),\n }\n \"\n ></ng-container>\n @if (filterBy) {\n <input\n type=\"text\"\n class=\"input-search\"\n [(ngModel)]=\"availableItensFilter\"\n (ngModelChange)=\"filterItensToSelect()\"\n [placeholder]=\"availableItensPlaceholder || 'platform.angular_components.picklist-placeholder' | translate\"\n />\n }\n </div>\n }\n\n <ng-container\n *ngTemplateOutlet=\"\n picklistItensRender;\n context: {\n id: itensToSelectId,\n itens: itensToSelectFilterUtil.filteredItensToSelect,\n template: itemToSelectTemplate,\n listConnectedTo: selectedItensId,\n }\n \"\n >\n </ng-container>\n </div>\n <div class=\"buttons-container\">\n <s-button\n [label]=\"addSelectedItensLabel || 'platform.angular_components.add' | translate\"\n priority=\"primary\"\n rightIconClass=\"fa fa-fw fa-arrow-right\"\n [disabled]=\"!canAddItens\"\n (clicked)=\"add()\"\n [auxiliary]=\"false\"\n [caret]=\"false\"\n >\n </s-button>\n <s-button\n [label]=\"addAllItensLabel || 'platform.angular_components.add_all' | translate\"\n priority=\"link\"\n (clicked)=\"add(true)\"\n [auxiliary]=\"false\"\n >\n </s-button>\n </div>\n </div>\n <div class=\"picklist-item-container\">\n <div class=\"picklist-box\">\n <div class=\"picklist-title-container\">\n @if (!filterBy) {\n <ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n checkboxTitleRender;\n context: {\n disabled: disableSelectedItensCheckbox,\n checked: selectedItensAllSelected,\n changeFn: checkAllSelectedItensChange.bind(this),\n }\n \"\n ></ng-container>\n </ng-container>\n }\n <span class=\"picklist-title\">\n {{ selectedItensLabel || 'platform.angular_components.selected-items' | translate }}\n </span>\n </div>\n <div\n class=\"picklist-filter\"\n *ngIf=\"filterBy && showCheckbox\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n checkboxTitleRender;\n context: { disabled: disableSelectedItensCheckbox, checked: selectedItensAllSelected, changeFn: checkAllSelectedItensChange.bind(this) }\n \"\n ></ng-container>\n @if (filterBy) {\n <input\n type=\"text\"\n class=\"input-search\"\n [(ngModel)]=\"selectedItensFilter\"\n (ngModelChange)=\"filterSelectedItens()\"\n [placeholder]=\"selectedItensPlaceholder || 'platform.angular_components.picklist-placeholder' | translate\"\n />\n }\n </div>\n <ng-container\n *ngTemplateOutlet=\"\n picklistItensRender;\n context: {\n id: selectedItensId,\n itens: selectedItensFilterUtil.filteredSelectedItens,\n template: itemSelectedTemplate,\n listConnectedTo: itensToSelectId,\n }\n \"\n >\n </ng-container>\n </div>\n <div class=\"buttons-container\">\n <s-button\n [label]=\"removeSelectedItemsLabel || 'platform.angular_components.remove' | translate\"\n priority=\"primary\"\n iconClass=\"fa fa-fw fa-arrow-left\"\n [disabled]=\"!canRemoveItens\"\n [auxiliary]=\"false\"\n (clicked)=\"remove()\"\n [caret]=\"false\"\n >\n </s-button>\n <s-button\n [label]=\"removeAllItemsLabel || 'platform.angular_components.remove_all' | translate\"\n priority=\"link\"\n (clicked)=\"remove(true)\"\n [auxiliary]=\"false\"\n >\n </s-button>\n </div>\n </div>\n</div>\n", styles: [".picklist-container{display:flex;flex-wrap:wrap;border-radius:4px solid #dedce5;width:100%;background-color:#fff;gap:20px;padding:8px}.picklist-container .picklist-item-container{display:flex;flex-direction:column;flex:1}.picklist-container .picklist-item-container .picklist-box{border:1px solid #dedce5;padding:8px;height:100%;min-width:200px}.picklist-container .picklist-item-container .picklist-box .picklist-filter{display:flex;width:100%}.picklist-container .picklist-item-container .picklist-box .picklist-filter .input-search{border:1px solid #dedce5;min-height:35px;width:100%;border-radius:3px;margin-bottom:10px;margin-top:10px;padding:0 8px;flex:1}.picklist-container .picklist-item-container .picklist-box .picklist-title-container{width:100%;display:flex;align-items:center}.picklist-container .picklist-item-container .picklist-box .picklist-title-container .picklist-title{font-family:Open Sans;font-size:14px;font-weight:700;line-height:21px;text-underline-position:from-font;text-decoration-skip-ink:none}.picklist-container .picklist-item-container .picklist-box .picklist-items{max-height:23em;overflow:auto;height:100%;min-height:55px}.picklist-container .picklist-item-container .picklist-box .picklist-items .picklist-content{width:100%;height:100%;padding-right:8px;border-radius:3px;margin-bottom:8px}.picklist-container .picklist-item-container .picklist-box .picklist-items .picklist-item{height:55px;border:3px;display:flex}.picklist-container .picklist-item-container .picklist-box .picklist-items .picklist-item:not(.picklist-disabled){cursor:pointer}.picklist-container .picklist-item-container .picklist-box .picklist-items .picklist-item:hover:not(.picklist-disabled,.picklist-item-active,.picklist-item-invisible){background-color:#f1f7f8}.picklist-container .picklist-item-container .picklist-box .picklist-items .picklist-item-active:not(.picklist-item-invisible){background-color:#d5e8ec}.picklist-container .picklist-item-container .picklist-box .picklist-items .picklist-disabled{opacity:.5;background-color:#fbfafc}.picklist-container .picklist-item-container .picklist-box .picklist-items .picklist-item-invisible{display:none!important}.picklist-container .picklist-item-container .buttons-container{padding-top:10px;display:flex}.picklist-container .picklist-item-container .input-checkbox{margin:12px}\n"] }]
619
+ args: [{ standalone: true, imports: [TranslateModule, DragDropModule, FormsModule, ButtonComponent, NgTemplateOutlet, LoadingStateModule], selector: 's-picklist', template: "<ng-template\n #previewRender\n let-itens=\"itens\"\n let-template=\"template\"\n>\n <section class=\"picklist-items\">\n @for (item of itens; track $index) {\n <ng-container *ngTemplateOutlet=\"template; context: { item: item.data }\"></ng-container>\n }\n </section>\n</ng-template>\n\n<ng-template\n #picklistItensRender\n let-id=\"id\"\n let-itens=\"itens\"\n let-template=\"template\"\n let-listConnectedTo=\"listConnectedTo\"\n let-isLoading=\"isLoading\"\n>\n <div\n class=\"picklist-items\"\n cdkDropList\n [id]=\"id\"\n [cdkDropListSortingDisabled]=\"true\"\n [cdkDropListData]=\"itens\"\n [cdkDropListConnectedTo]=\"listConnectedTo\"\n (cdkDropListDropped)=\"drop($event)\"\n *sLoadingState=\"{ loading: isLoading, indicator: logoIndicator }\"\n (scroll)=\"onScroll($event, id)\"\n >\n @for (item of itens; track $index) {\n <div\n cdkDrag\n [cdkDragDisabled]=\"item.disabled\"\n [cdkDragData]=\"item\"\n (click)=\"toggleSelected(item, id)\"\n (cdkDragStarted)=\"onDragStart($event, id)\"\n (cdkDragReleased)=\"onDragRelease()\"\n class=\"picklist-item\"\n [class.picklist-disabled]=\"item.disabled\"\n [class.picklist-item-invisible]=\"item.invisible\"\n [class.picklist-item-active]=\"item.selected\"\n >\n @if (showCheckbox) {\n <input\n type=\"checkbox\"\n class=\"input-checkbox\"\n [(ngModel)]=\"item.selected\"\n [disabled]=\"item.disabled\"\n />\n }\n <div class=\"picklist-content\">\n <ng-container\n *ngTemplateOutlet=\"\n template;\n context: { item: item.data, selected: item.selected, disabled: item.disabled }\n \"\n ></ng-container>\n </div>\n <ng-container *cdkDragPreview>\n <ng-container\n *ngTemplateOutlet=\"previewRender; context: { itens: selectedItensMap, template: template }\"\n ></ng-container>\n </ng-container>\n </div>\n }\n </div>\n</ng-template>\n\n<ng-template\n #checkboxTitleRender\n let-disabled=\"disabled\"\n let-checked=\"checked\"\n let-changeFn=\"changeFn\"\n let-id=\"id\"\n>\n @if (showCheckbox && !lazyLoad()) {\n <input\n class=\"input-checkbox\"\n type=\"checkbox\"\n [disabled]=\"disabled\"\n [checked]=\"checked\"\n (change)=\"changeFn($any($event.target).checked)\"\n />\n } @else if (showCheckbox && lazyLoad() && id === itensToSelectId) {\n <input\n class=\"input-checkbox\"\n type=\"checkbox\"\n [disabled]=\"disabled\"\n [checked]=\"itensToSelectFilterUtil.allItensSelected\"\n (change)=\"checkAllAvailableItensChange($any($event.target).checked)\"\n />\n } @else if (showCheckbox && lazyLoad() && id === selectedItensId) {\n <input\n class=\"input-checkbox\"\n type=\"checkbox\"\n [disabled]=\"disabled\"\n [checked]=\"selectedItensFilterUtil.allItensSelected\"\n (change)=\"checkAllSelectedItensChange($any($event.target).checked)\"\n />\n }\n</ng-template>\n\n<div class=\"picklist-container\">\n <div class=\"picklist-item-container\">\n <div class=\"picklist-box\">\n <div class=\"picklist-title-container\">\n @if (!filterBy && !lazyLoad()) {\n <ng-container\n *ngTemplateOutlet=\"\n checkboxTitleRender;\n context: {\n disabled: disableItensToSelectCheckbox,\n checked: itensToSelectAllSelected,\n changeFn: checkAllAvailableItensChange.bind(this),\n id: itensToSelectId,\n }\n \"\n ></ng-container>\n }\n <span class=\"picklist-title\">\n {{ availableItensLabel || 'platform.angular_components.available-items' | translate }}\n </span>\n </div>\n @if (filterBy || lazyLoad()) {\n <div class=\"picklist-filter\">\n @if (showCheckbox) {\n <ng-container\n *ngTemplateOutlet=\"\n checkboxTitleRender;\n context: {\n disabled: disableItensToSelectCheckbox,\n checked: itensToSelectAllSelected,\n changeFn: checkAllAvailableItensChange.bind(this),\n id: itensToSelectId,\n }\n \"\n ></ng-container>\n }\n <input\n type=\"text\"\n class=\"input-search\"\n [(ngModel)]=\"availableItensFilter\"\n (ngModelChange)=\"filterItensToSelect()\"\n [placeholder]=\"\n availableItensPlaceholder || 'platform.angular_components.picklist-placeholder' | translate\n \"\n />\n </div>\n }\n\n <ng-container\n *ngTemplateOutlet=\"\n picklistItensRender;\n context: {\n id: itensToSelectId,\n itens: itensToSelectFilterUtil.filteredItensToSelect,\n template: itemToSelectTemplate,\n listConnectedTo: selectedItensId,\n isLoading: _loadingSource(),\n }\n \"\n >\n </ng-container>\n </div>\n <div class=\"buttons-container\">\n <s-button\n [label]=\"addSelectedItensLabel || 'platform.angular_components.add' | translate\"\n priority=\"primary\"\n rightIconClass=\"fa fa-fw fa-arrow-right\"\n [disabled]=\"!hasSelectedItens\"\n (clicked)=\"add()\"\n [auxiliary]=\"false\"\n [caret]=\"false\"\n >\n </s-button>\n <s-button\n [label]=\"addAllItensLabel || 'platform.angular_components.add_all' | translate\"\n priority=\"link\"\n (clicked)=\"add(true)\"\n [auxiliary]=\"false\"\n >\n </s-button>\n </div>\n </div>\n <div class=\"picklist-item-container\">\n <div class=\"picklist-box\">\n <div class=\"picklist-title-container\">\n @if (!filterBy && !lazyLoad()) {\n <ng-container\n *ngTemplateOutlet=\"\n checkboxTitleRender;\n context: {\n disabled: disableSelectedItensCheckbox,\n checked: selectedItensAllSelected,\n changeFn: checkAllSelectedItensChange.bind(this),\n id: selectedItensId,\n }\n \"\n ></ng-container>\n }\n <span class=\"picklist-title\">\n {{ selectedItensLabel || 'platform.angular_components.selected-items' | translate }}\n </span>\n </div>\n @if (filterBy || lazyLoad()) {\n <div class=\"picklist-filter\">\n @if (showCheckbox) {\n <ng-container\n *ngTemplateOutlet=\"\n checkboxTitleRender;\n context: {\n disabled: disableSelectedItensCheckbox,\n checked: selectedItensAllSelected,\n changeFn: checkAllSelectedItensChange.bind(this),\n id: selectedItensId,\n }\n \"\n ></ng-container>\n }\n <input\n type=\"text\"\n class=\"input-search\"\n [(ngModel)]=\"selectedItensFilter\"\n (ngModelChange)=\"filterSelectedItens()\"\n [placeholder]=\"\n selectedItensPlaceholder || 'platform.angular_components.picklist-placeholder' | translate\n \"\n />\n </div>\n }\n <ng-container\n *ngTemplateOutlet=\"\n picklistItensRender;\n context: {\n id: selectedItensId,\n itens: selectedItensFilterUtil.filteredSelectedItens,\n template: itemSelectedTemplate,\n listConnectedTo: itensToSelectId,\n isLoading: _loadingTarget(),\n }\n \"\n >\n </ng-container>\n </div>\n <div class=\"buttons-container\">\n <s-button\n [label]=\"removeSelectedItemsLabel || 'platform.angular_components.remove' | translate\"\n priority=\"primary\"\n iconClass=\"fa fa-fw fa-arrow-left\"\n [disabled]=\"!hasSelectedItens\"\n [auxiliary]=\"false\"\n (clicked)=\"remove()\"\n [caret]=\"false\"\n >\n </s-button>\n <s-button\n [label]=\"removeAllItemsLabel || 'platform.angular_components.remove_all' | translate\"\n priority=\"link\"\n (clicked)=\"remove(true)\"\n [auxiliary]=\"false\"\n >\n </s-button>\n </div>\n </div>\n</div>\n\n", styles: [".picklist-container{display:flex;flex-wrap:wrap;border-radius:4px solid #dedce5;width:100%;background-color:#fff;gap:20px;padding:8px}.picklist-container .picklist-item-container{display:flex;flex-direction:column;flex:1}.picklist-container .picklist-item-container .picklist-box{border:1px solid #dedce5;padding:8px;height:100%;min-width:200px}.picklist-container .picklist-item-container .picklist-box .picklist-filter{display:flex;width:100%}.picklist-container .picklist-item-container .picklist-box .picklist-filter .input-search{border:1px solid #dedce5;min-height:35px;width:100%;border-radius:3px;margin-bottom:10px;margin-top:10px;padding:0 8px;flex:1}.picklist-container .picklist-item-container .picklist-box .picklist-title-container{width:100%;display:flex;align-items:center}.picklist-container .picklist-item-container .picklist-box .picklist-title-container .picklist-title{font-family:Open Sans;font-size:14px;font-weight:700;line-height:21px;text-underline-position:from-font;text-decoration-skip-ink:none}.picklist-container .picklist-item-container .picklist-box .picklist-items{max-height:23em;overflow:auto;height:100%;min-height:100px}.picklist-container .picklist-item-container .picklist-box .picklist-items .picklist-content{width:100%;height:100%;padding-right:8px;border-radius:3px;margin-bottom:8px}.picklist-container .picklist-item-container .picklist-box .picklist-items .picklist-item{height:55px;border:3px;display:flex}.picklist-container .picklist-item-container .picklist-box .picklist-items .picklist-item:not(.picklist-disabled){cursor:pointer}.picklist-container .picklist-item-container .picklist-box .picklist-items .picklist-item:hover:not(.picklist-disabled,.picklist-item-active,.picklist-item-invisible){background-color:#f1f7f8}.picklist-container .picklist-item-container .picklist-box .picklist-items .picklist-item-active:not(.picklist-item-invisible){background-color:#d5e8ec}.picklist-container .picklist-item-container .picklist-box .picklist-items .picklist-disabled{opacity:.5;background-color:#fbfafc}.picklist-container .picklist-item-container .picklist-box .picklist-items .picklist-item-invisible{display:none!important}.picklist-container .picklist-item-container .buttons-container{padding-top:10px;display:flex}.picklist-container .picklist-item-container .input-checkbox{margin:12px}\n"] }]
268
620
  }], propDecorators: { itensToSelect: [{
269
621
  type: Input
270
622
  }], selectedItens: [{
@@ -322,40 +674,26 @@ const mapData = (list) => {
322
674
  return list.map((x) => x.data);
323
675
  };
324
676
  const parseValueEmit = pipe(filterEnabled, mapData);
325
- const parseItensPickList = (array, disabledFn) => {
677
+ const parseItensPickList = (array, disabledFn, idKey) => {
326
678
  return array.map((x) => {
327
679
  return {
328
680
  data: x,
329
681
  disabled: disabledFn ? disabledFn(x) : false,
682
+ id: idKey ? String(x[idKey]) : crypto.randomUUID(),
330
683
  };
331
684
  });
332
685
  };
333
686
 
334
687
  class PicklistModule {
335
688
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PicklistModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
336
- static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.14", ngImport: i0, type: PicklistModule, declarations: [PicklistComponent], imports: [CommonModule,
337
- TranslateModule,
338
- DragDropModule,
339
- FormsModule,
340
- ButtonModule], exports: [PicklistComponent] });
341
- static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PicklistModule, imports: [CommonModule,
342
- TranslateModule,
343
- DragDropModule,
344
- FormsModule,
345
- ButtonModule] });
689
+ static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.14", ngImport: i0, type: PicklistModule, imports: [PicklistComponent], exports: [PicklistComponent] });
690
+ static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PicklistModule, imports: [PicklistComponent] });
346
691
  }
347
692
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PicklistModule, decorators: [{
348
693
  type: NgModule,
349
694
  args: [{
350
- declarations: [PicklistComponent],
351
- imports: [
352
- CommonModule,
353
- TranslateModule,
354
- DragDropModule,
355
- FormsModule,
356
- ButtonModule,
357
- ],
358
- exports: [PicklistComponent]
695
+ imports: [PicklistComponent],
696
+ exports: [PicklistComponent],
359
697
  }]
360
698
  }] });
361
699