@recursyve/nice-selectable-list 20.0.0-beta.3 → 21.0.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.
@@ -1,30 +1,73 @@
1
1
  import * as i0 from '@angular/core';
2
- import { signal, computed, InjectionToken, inject, input, contentChildren, Injector, effect, untracked, forwardRef, Directive, DestroyRef, afterRenderEffect } from '@angular/core';
3
- import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
2
+ import { signal, computed, InjectionToken, Injector, DestroyRef, inject, input, contentChildren, effect, untracked, forwardRef, Directive, afterRenderEffect } from '@angular/core';
3
+ import { rxResource, takeUntilDestroyed } from '@angular/core/rxjs-interop';
4
4
  import { MatCheckbox } from '@angular/material/checkbox';
5
- import { ActivatedRoute, Router, NavigationEnd } from '@angular/router';
6
- import { filter, take } from 'rxjs';
5
+ import { map, of, Subject, from } from 'rxjs';
6
+ import { Router, ActivatedRoute, NavigationStart, NavigationEnd } from '@angular/router';
7
+ import { filter, map as map$1, startWith, take, combineLatestWith, switchMap } from 'rxjs/operators';
7
8
 
8
9
  class NiceSelectableListStore {
10
+ _injector;
9
11
  _config;
10
- _entities = signal([], ...(ngDevMode ? [{ debugName: "_entities" }] : []));
12
+ _plugins = [];
13
+ _entityLoader = null;
14
+ _uiEntityLoader = null;
15
+ _cache = signal({}, ...(ngDevMode ? [{ debugName: "_cache" }] : []));
16
+ _entitiesMap = signal({}, ...(ngDevMode ? [{ debugName: "_entitiesMap" }] : []));
11
17
  _activeEntity = signal(null, ...(ngDevMode ? [{ debugName: "_activeEntity" }] : []));
12
18
  _checkboxes = signal([], ...(ngDevMode ? [{ debugName: "_checkboxes" }] : []));
13
- entities = this._entities.asReadonly();
19
+ _selectAllState = signal({
20
+ active: false,
21
+ total: null,
22
+ parameters: null
23
+ }, ...(ngDevMode ? [{ debugName: "_selectAllState" }] : []));
24
+ // Track window loading state
25
+ _lastWindowIds = [];
26
+ _currentWindowIds = [];
27
+ entities = computed(() => Object.values(this._entitiesMap()), ...(ngDevMode ? [{ debugName: "entities" }] : []));
14
28
  activeEntity = this._activeEntity.asReadonly();
15
- total = computed(() => this._entities().length, ...(ngDevMode ? [{ debugName: "total" }] : []));
16
- entitiesIds = computed(() => this._entities().map((entity) => entity.id), ...(ngDevMode ? [{ debugName: "entitiesIds" }] : []));
29
+ total = computed(() => this.entities().length, ...(ngDevMode ? [{ debugName: "total" }] : []));
30
+ entitiesIds = computed(() => {
31
+ const ids = Object.keys(this._entitiesMap());
32
+ return this._config.idType === "string" ? ids : ids.map((id) => +id);
33
+ }, ...(ngDevMode ? [{ debugName: "entitiesIds" }] : []));
17
34
  activeEntityId = computed(() => this._activeEntity()?.id ?? null, ...(ngDevMode ? [{ debugName: "activeEntityId" }] : []));
18
- constructor(_config) {
35
+ selectAllState = this._selectAllState.asReadonly();
36
+ constructor(_injector, _config) {
37
+ this._injector = _injector;
19
38
  this._config = _config;
20
39
  }
40
+ init() {
41
+ if (!this._entityLoader && this._config.entityLoaderToken) {
42
+ this._entityLoader = this._injector.get(this._config.entityLoaderToken);
43
+ }
44
+ if (!this._uiEntityLoader && this._config.uiEntityLoaderToken) {
45
+ this._uiEntityLoader = this._injector.get(this._config.uiEntityLoaderToken);
46
+ }
47
+ for (const plugin of this._plugins) {
48
+ plugin.init();
49
+ }
50
+ }
51
+ registerPlugin(plugin) {
52
+ this._plugins.push(plugin);
53
+ }
21
54
  registerCheckbox(checkbox) {
22
55
  this._checkboxes.update((checkboxes) => [...checkboxes, checkbox]);
23
56
  const id = this._resolveEntityId(checkbox.selectableEntity());
24
- const entity = this._entities().find((_entity) => _entity.id === id);
25
- if (entity && entity.entity === null) {
26
- this._entities.update((_entities) => _entities.map((_entity) => _entity.id === id ? { id, entity: checkbox.selectableEntity() } : _entity));
27
- entity.entity = checkbox.selectableEntity();
57
+ const existing = this._entitiesMap()[id];
58
+ const selectAllState = this._selectAllState();
59
+ if ((existing && existing.entity === null) || selectAllState.active) {
60
+ const initial = checkbox.selectableEntity();
61
+ const entityResource = this._createEntityResource(id, initial);
62
+ this._entitiesMap.update((_entitiesMap) => ({
63
+ ..._entitiesMap,
64
+ [id]: {
65
+ id,
66
+ entity: entityResource,
67
+ ui: null
68
+ }
69
+ }));
70
+ return;
28
71
  }
29
72
  }
30
73
  unregisterCheckbox(checkbox) {
@@ -35,14 +78,30 @@ class NiceSelectableListStore {
35
78
  }
36
79
  setEntitiesFromSelections(selections) {
37
80
  const ids = this._config.idType === "string" ? selections : selections.map((id) => +id);
38
- const registeredEntities = this._checkboxes().map((checkbox) => ({
39
- id: this._resolveEntityId(checkbox.selectableEntity()), entity: checkbox.selectableEntity()
81
+ const registered = this._checkboxes().map((checkbox) => ({
82
+ id: this._resolveEntityId(checkbox.selectableEntity()), value: checkbox.selectableEntity()
40
83
  }));
41
- const entities = ids.map((id) => ({
42
- id,
43
- entity: registeredEntities.find(_entity => _entity.id === id)?.entity ?? null
44
- }));
45
- this._entities.set(entities);
84
+ const cache = this._cache();
85
+ const entities = ids.map((id) => {
86
+ const known = registered.find(_e => _e.id === id)?.value;
87
+ const cached = cache[id]?.entity;
88
+ const entityResource = known ? this._createEntityResource(id, known) : (cached ?? null);
89
+ return {
90
+ id,
91
+ entity: entityResource
92
+ };
93
+ });
94
+ const mapOut = entities.reduce((map, entity) => ({
95
+ ...map,
96
+ [entity.id]: {
97
+ id: entity.id,
98
+ entity: entity.entity,
99
+ ui: null
100
+ }
101
+ }), {});
102
+ this._entitiesMap.set(mapOut);
103
+ this._processCacheFromEntities();
104
+ this._updateWindowForActive();
46
105
  }
47
106
  selectEntity(entity) {
48
107
  const isSelected = this._isEntitySelected(entity);
@@ -50,7 +109,40 @@ class NiceSelectableListStore {
50
109
  return;
51
110
  }
52
111
  const id = this._resolveEntityId(entity);
53
- this._entities.update((entities) => [...entities, { id, entity }]);
112
+ const cached = this._cache()[id];
113
+ const newEntity = {
114
+ id,
115
+ entity: cached?.entity ?? this._createEntityResource(id, entity),
116
+ ui: cached?.ui ?? this._createUIResource(id)
117
+ };
118
+ this._entitiesMap.update((entitiesMap) => ({
119
+ ...entitiesMap,
120
+ [id]: newEntity
121
+ }));
122
+ this._cache.update((cache) => ({
123
+ ...cache,
124
+ [id]: newEntity
125
+ }));
126
+ // Window might change if this selection impacts first/last buckets
127
+ this._updateWindowForActive();
128
+ }
129
+ selectEntities(entities) {
130
+ this._entitiesMap.update((entitiesMap) => {
131
+ const newEntitiesMap = { ...entitiesMap };
132
+ const cache = this._cache();
133
+ for (const entity of entities) {
134
+ const id = this._resolveEntityId(entity);
135
+ const cached = cache[id];
136
+ newEntitiesMap[id] = cached ?? {
137
+ id,
138
+ entity: this._createEntityResource(id, entity),
139
+ ui: null
140
+ };
141
+ }
142
+ return newEntitiesMap;
143
+ });
144
+ this._processCacheFromEntities();
145
+ this._updateWindowForActive();
54
146
  }
55
147
  deselectEntity(entity) {
56
148
  const isSelected = this._isEntitySelected(entity);
@@ -58,19 +150,54 @@ class NiceSelectableListStore {
58
150
  return;
59
151
  }
60
152
  const id = this._resolveEntityId(entity);
61
- this._entities.update((entities) => entities.filter((_entity) => _entity.id !== id));
153
+ this._entitiesMap.update((entitiesMap) => {
154
+ const newEntitiesMap = { ...entitiesMap };
155
+ delete newEntitiesMap[id];
156
+ return newEntitiesMap;
157
+ });
158
+ }
159
+ deselectEntities(entities) {
160
+ const toRemove = entities.filter((entity) => this._isEntitySelected(entity));
161
+ this._entitiesMap.update((entitiesMap) => {
162
+ const newEntitiesMap = { ...entitiesMap };
163
+ for (const entity of toRemove) {
164
+ const id = this._resolveEntityId(entity);
165
+ delete newEntitiesMap[id];
166
+ }
167
+ return newEntitiesMap;
168
+ });
62
169
  }
63
170
  clear() {
64
- this._entities.set([]);
171
+ this._entitiesMap.set({});
65
172
  this._activeEntity.set(null);
66
173
  }
174
+ setSelectAllState(state) {
175
+ this._selectAllState.set(state);
176
+ if (!state.active) {
177
+ this.clear();
178
+ return;
179
+ }
180
+ const entities = this._checkboxes().map((checkbox) => checkbox.selectableEntity());
181
+ this._entitiesMap.set(entities.reduce((map, entity) => {
182
+ const id = this._resolveEntityId(entity);
183
+ return {
184
+ ...map,
185
+ [id]: {
186
+ id,
187
+ entity: null,
188
+ ui: null
189
+ }
190
+ };
191
+ }, {}));
192
+ this._preloadSelectAllValues();
193
+ }
67
194
  setActiveFromSelected(selected) {
68
195
  const id = this._config.idType === "string" ? selected : +selected;
69
- const entity = this._entities().find((_entity) => _entity.id === id);
196
+ const entity = this._entitiesMap()[id];
70
197
  if (!entity) {
71
198
  return;
72
199
  }
73
- this._activeEntity.set(entity);
200
+ this._setActiveEntity(id);
74
201
  }
75
202
  setActiveEntity(entity) {
76
203
  if (!entity) {
@@ -78,60 +205,60 @@ class NiceSelectableListStore {
78
205
  return;
79
206
  }
80
207
  const id = this._resolveEntityId(entity);
81
- this._activeEntity.set({ id, entity });
208
+ this._setActiveEntity(id);
82
209
  }
83
210
  selectFirstEntity() {
84
- const entity = this._entities()[0];
85
- if (!entity) {
211
+ const id = this.entitiesIds()[0];
212
+ if (!id) {
86
213
  return;
87
214
  }
88
- this._activeEntity.set(entity);
215
+ this._setActiveEntity(id);
89
216
  }
90
217
  selectNextEntity() {
91
- const entities = this._entities();
92
218
  const activeEntity = this._activeEntity();
93
219
  if (!activeEntity) {
94
220
  this.selectFirstEntity();
95
221
  return;
96
222
  }
97
- const index = entities.findIndex((_entity) => activeEntity.id === _entity.id);
98
- const nextEntity = entities[index + 1];
99
- if (!nextEntity) {
223
+ const entitiesIds = this.entitiesIds();
224
+ const index = entitiesIds.findIndex((id) => activeEntity.id === id);
225
+ const nextEntityId = entitiesIds[index + 1];
226
+ if (!nextEntityId) {
100
227
  return;
101
228
  }
102
- this._activeEntity.set(nextEntity);
229
+ this._setActiveEntity(nextEntityId);
103
230
  }
104
231
  selectPreviousEntity() {
105
- const entities = this._entities();
106
232
  const activeEntity = this._activeEntity();
107
233
  if (!activeEntity) {
108
234
  this.selectFirstEntity();
109
235
  return;
110
236
  }
111
- const index = entities.findIndex((_entity) => activeEntity.id === _entity.id);
237
+ const entitiesIds = this.entitiesIds();
238
+ const index = entitiesIds.findIndex((id) => activeEntity.id === id);
112
239
  if (index === 0) {
113
240
  return;
114
241
  }
115
- const previousEntity = entities[index - 1];
116
- if (!previousEntity) {
242
+ const previousEntityId = entitiesIds[index - 1];
243
+ if (!previousEntityId) {
117
244
  return;
118
245
  }
119
- this._activeEntity.set(previousEntity);
246
+ this._setActiveEntity(previousEntityId);
120
247
  }
121
248
  selectLastEntity() {
122
- const entities = this._entities();
123
- if (entities.length === 0) {
249
+ const entitiesIds = this.entitiesIds();
250
+ if (entitiesIds.length === 0) {
124
251
  return;
125
252
  }
126
- const lastEntity = entities[entities.length - 1];
127
- if (!lastEntity) {
253
+ const lastEntityId = entitiesIds[entitiesIds.length - 1];
254
+ if (!lastEntityId) {
128
255
  return;
129
256
  }
130
- this._activeEntity.set(lastEntity);
257
+ this._setActiveEntity(lastEntityId);
131
258
  }
132
259
  _isEntitySelected(entity) {
133
260
  const id = this._resolveEntityId(entity);
134
- return this._entities().findIndex((_entity) => _entity.id === id) >= 0;
261
+ return this._entitiesMap()[id]?.entity !== undefined;
135
262
  }
136
263
  _resolveEntityId(entity) {
137
264
  const idProperty = this._config.idProperty;
@@ -141,33 +268,199 @@ class NiceSelectableListStore {
141
268
  }
142
269
  return id;
143
270
  }
271
+ _processCacheFromEntities() {
272
+ const entities = this._entitiesMap();
273
+ this._cache.update((cache) => ({ ...cache, ...entities }));
274
+ }
275
+ _createEntityResource(id, initial) {
276
+ const resource = rxResource({
277
+ params: () => ({ id }),
278
+ stream: ({ params }) => {
279
+ if (this._entityLoader) {
280
+ return this._entityLoader.loadEntitiesByIds([params.id]).pipe(map((arr) => arr?.[0]));
281
+ }
282
+ return of(initial ?? undefined);
283
+ },
284
+ defaultValue: initial ?? undefined,
285
+ injector: this._injector
286
+ });
287
+ if (initial) {
288
+ resource.set(initial);
289
+ }
290
+ return resource;
291
+ }
292
+ _createUIResource(id) {
293
+ if (!this._uiEntityLoader) {
294
+ return null;
295
+ }
296
+ return rxResource({
297
+ params: () => ({ id }),
298
+ stream: ({ params }) => this._uiEntityLoader.loadById(params.id),
299
+ injector: this._injector
300
+ });
301
+ }
302
+ _computeWindowIds() {
303
+ const ids = this.entitiesIds();
304
+ const n = ids.length;
305
+ if (n === 0) {
306
+ return [];
307
+ }
308
+ const set = new Set();
309
+ // first 3
310
+ for (let i = 0; i < Math.min(3, n); i++) {
311
+ set.add(ids[i]);
312
+ }
313
+ // last 3
314
+ for (let i = Math.max(0, n - 3); i < n; i++) {
315
+ set.add(ids[i]);
316
+ }
317
+ // active and +/- 3
318
+ const activeId = this.activeEntityId();
319
+ const activeIndex = activeId !== null ? ids.findIndex((i) => i === activeId) : -1;
320
+ if (activeIndex >= 0) {
321
+ for (let i = Math.max(0, activeIndex - 3); i <= Math.min(n - 1, activeIndex + 3); i++) {
322
+ set.add(ids[i]);
323
+ }
324
+ }
325
+ return Array.from(set.values());
326
+ }
327
+ _ensureResourcesForIds(ids) {
328
+ const mapCopy = { ...this._entitiesMap() };
329
+ const cache = this._cache();
330
+ for (const id of ids) {
331
+ const entry = mapCopy[id] ?? cache[id];
332
+ if (!entry) {
333
+ mapCopy[id] = {
334
+ id,
335
+ entity: this._createEntityResource(id),
336
+ ui: this._uiEntityLoader ? this._createUIResource(id) : null
337
+ };
338
+ continue;
339
+ }
340
+ if (!entry.entity) {
341
+ entry.entity = this._createEntityResource(id);
342
+ }
343
+ if (!entry.ui && this._uiEntityLoader) {
344
+ entry.ui = this._createUIResource(id);
345
+ }
346
+ }
347
+ this._entitiesMap.set(mapCopy);
348
+ this._processCacheFromEntities();
349
+ }
350
+ _updateWindowForActive() {
351
+ this._lastWindowIds = this._currentWindowIds;
352
+ this._currentWindowIds = this._computeWindowIds();
353
+ if (this._currentWindowIds.length) {
354
+ this._ensureResourcesForIds(this._currentWindowIds);
355
+ }
356
+ }
357
+ _setActiveEntity(id) {
358
+ const entity = this._entitiesMap()[id];
359
+ if (!entity) {
360
+ return;
361
+ }
362
+ if (!entity.entity) {
363
+ entity.entity = this._createEntityResource(id);
364
+ }
365
+ if (!entity.ui) {
366
+ entity.ui = this._createUIResource(id);
367
+ }
368
+ this._activeEntity.set(entity);
369
+ this._updateWindowForActive();
370
+ }
371
+ _preloadSelectAllValues() {
372
+ if (!this._config.preload || !this._entityLoader) {
373
+ return;
374
+ }
375
+ this._entityLoader
376
+ .loadIdsFromParameters(this._selectAllState().parameters ?? {})
377
+ .pipe(map((ids) => {
378
+ const cache = this._cache();
379
+ this._entitiesMap.set(ids.reduce((map, id) => {
380
+ const cached = cache[id];
381
+ return {
382
+ ...map,
383
+ [id]: cached ?? {
384
+ id,
385
+ entity: null,
386
+ ui: null
387
+ }
388
+ };
389
+ }, {}));
390
+ this._processCacheFromEntities();
391
+ this._updateWindowForActive();
392
+ }))
393
+ .subscribe();
394
+ }
144
395
  }
145
396
 
146
397
  const NICE_SELECTABLE_LISTS = new InjectionToken("_selectable_list_providers");
147
398
  const NICE_SELECTABLE_LIST = new InjectionToken("_selectable_list_provider");
148
399
  function provideNiceSelectableList(...args) {
149
400
  const name = typeof args[0] === "string" ? args[0] : null;
150
- const config = (typeof args[0] === "string" ? args[1] : args[0]);
401
+ const options = (typeof args[0] === "string" ? args[1] : args[0]);
402
+ const providers = [];
403
+ const entityLoaderToken = options?.entityLoader
404
+ ? new InjectionToken(options.entityLoader.name)
405
+ : null;
406
+ if (entityLoaderToken && options?.entityLoader) {
407
+ providers.push({
408
+ provide: entityLoaderToken,
409
+ useClass: options.entityLoader
410
+ });
411
+ }
412
+ const uiEntityLoaderToken = options?.uiEntityLoader
413
+ ? new InjectionToken(options.uiEntityLoader.name)
414
+ : null;
415
+ if (uiEntityLoaderToken && options?.uiEntityLoader) {
416
+ providers.push({
417
+ provide: uiEntityLoaderToken,
418
+ useClass: options.uiEntityLoader
419
+ });
420
+ }
151
421
  if (!name) {
152
- return {
422
+ providers.push({
153
423
  provide: NICE_SELECTABLE_LIST,
154
- useFactory: () => new NiceSelectableListStore({
155
- idProperty: config?.idProperty ?? "id",
156
- idType: config?.idType ?? "number"
157
- })
158
- };
424
+ useFactory: (injector, destroyRef) => {
425
+ const store = new NiceSelectableListStore(injector, {
426
+ idProperty: options?.idProperty ?? "id",
427
+ idType: options?.idType ?? "number",
428
+ entityLoaderToken,
429
+ uiEntityLoaderToken,
430
+ preload: options?.preload ?? entityLoaderToken !== null
431
+ });
432
+ for (const plugin of options?.plugins ?? []) {
433
+ new plugin(injector, destroyRef, store);
434
+ }
435
+ return store;
436
+ },
437
+ deps: [Injector, DestroyRef]
438
+ });
159
439
  }
160
- return {
161
- provide: NICE_SELECTABLE_LISTS,
162
- useFactory: () => ({
163
- name,
164
- store: new NiceSelectableListStore({
165
- idProperty: config?.idProperty ?? "id",
166
- idType: config?.idType ?? "number"
167
- })
168
- }),
169
- multi: true
170
- };
440
+ else {
441
+ providers.push({
442
+ provide: NICE_SELECTABLE_LISTS,
443
+ useFactory: (injector, destroyRef) => {
444
+ const store = new NiceSelectableListStore(injector, {
445
+ idProperty: options?.idProperty ?? "id",
446
+ idType: options?.idType ?? "number",
447
+ entityLoaderToken,
448
+ uiEntityLoaderToken,
449
+ preload: options?.preload ?? entityLoaderToken !== null
450
+ });
451
+ for (const plugin of options?.plugins ?? []) {
452
+ new plugin(injector, destroyRef, store);
453
+ }
454
+ return {
455
+ name,
456
+ store
457
+ };
458
+ },
459
+ deps: [Injector, DestroyRef],
460
+ multi: true
461
+ });
462
+ }
463
+ return providers;
171
464
  }
172
465
  function resolveNiceSelectableList(...args) {
173
466
  const name = typeof args[0] === "string" ? args[0] : null;
@@ -189,13 +482,11 @@ function resolveNiceSelectableList(...args) {
189
482
 
190
483
  const NICE_SELECTABLE_LIST_DIRECTIVE = new InjectionToken("_selectable_list_directive");
191
484
  class SelectableListDirective {
192
- name = input(null, ...(ngDevMode ? [{ debugName: "name", alias: "niceSelectableList" }] : [{ alias: "niceSelectableList" }]));
193
- enableQueryParams = input(false, ...(ngDevMode ? [{ debugName: "enableQueryParams" }] : []));
194
- checkboxes = contentChildren(NiceSelectableListEntityCheckboxDirective, ...(ngDevMode ? [{ debugName: "checkboxes", descendants: true }] : [{ descendants: true }]));
485
+ name = input(null, { ...(ngDevMode ? { debugName: "name" } : {}), alias: "niceSelectableList" });
486
+ checkboxes = contentChildren(NiceSelectableListEntityCheckboxDirective, { ...(ngDevMode ? { debugName: "checkboxes" } : {}), descendants: true });
195
487
  _initialized = signal(false, ...(ngDevMode ? [{ debugName: "_initialized" }] : []));
196
488
  initialized = this._initialized.asReadonly();
197
- route = inject(ActivatedRoute);
198
- router = inject(Router);
489
+ allSelected = computed(() => this.selectableLists.selectAllState().active, ...(ngDevMode ? [{ debugName: "allSelected" }] : []));
199
490
  injector = inject(Injector);
200
491
  selectableLists;
201
492
  constructor() {
@@ -204,74 +495,15 @@ class SelectableListDirective {
204
495
  this.selectableLists = name
205
496
  ? resolveNiceSelectableList(name, { injector: this.injector })
206
497
  : resolveNiceSelectableList({ injector: this.injector });
207
- });
208
- effect(() => {
209
- if (!this._initialized() || !this.name()) {
210
- return;
211
- }
212
- if (!this.enableQueryParams()) {
213
- this.router.navigate([], {
214
- relativeTo: this.route,
215
- queryParams: {
216
- selections: null,
217
- selected: null
218
- }
219
- });
220
- return;
221
- }
222
- });
223
- effect(() => {
224
- if (!this._initialized()) {
225
- return;
226
- }
227
- const shouldWrite = untracked(() => this.enableQueryParams() && this.name());
228
- if (!shouldWrite) {
229
- return;
230
- }
231
- const entities = this.selectableLists.entitiesIds();
232
- const activeEntity = this.selectableLists.activeEntityId();
233
- this.router.navigate([], {
234
- relativeTo: this.route,
235
- queryParams: {
236
- selections: entities,
237
- selected: activeEntity
238
- }
239
- });
498
+ untracked(() => this.selectableLists.init());
240
499
  });
241
500
  }
242
- ngOnInit() {
243
- this.loadQueryParams();
244
- }
245
- loadQueryParams() {
246
- if (this.router.navigated) {
247
- this.parseQueryParams(this.route.snapshot.queryParams);
248
- this._initialized.set(true);
249
- return;
250
- }
251
- this.router.events
252
- .pipe(filter((event) => event instanceof NavigationEnd), take(1))
253
- .subscribe(() => {
254
- this.parseQueryParams(this.route.snapshot.queryParams);
255
- this._initialized.set(true);
256
- });
257
- }
258
- parseQueryParams(params) {
259
- if (params.selections) {
260
- const selections = Array.isArray(params.selections)
261
- ? params.selections
262
- : [params.selections];
263
- this.selectableLists.setEntitiesFromSelections(selections);
264
- }
265
- if (params.selected) {
266
- this.selectableLists.setActiveFromSelected(params.selected);
267
- }
268
- }
269
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.1", ngImport: i0, type: SelectableListDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
270
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.2.0", version: "20.2.1", type: SelectableListDirective, isStandalone: true, selector: "[niceSelectableList]", inputs: { name: { classPropertyName: "name", publicName: "niceSelectableList", isSignal: true, isRequired: false, transformFunction: null }, enableQueryParams: { classPropertyName: "enableQueryParams", publicName: "enableQueryParams", isSignal: true, isRequired: false, transformFunction: null } }, providers: [
501
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.5", ngImport: i0, type: SelectableListDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
502
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.2.0", version: "21.0.5", type: SelectableListDirective, isStandalone: true, selector: "[niceSelectableList]", inputs: { name: { classPropertyName: "name", publicName: "niceSelectableList", isSignal: true, isRequired: false, transformFunction: null } }, providers: [
271
503
  { provide: NICE_SELECTABLE_LIST_DIRECTIVE, useExisting: forwardRef(() => SelectableListDirective) }
272
504
  ], queries: [{ propertyName: "checkboxes", predicate: NiceSelectableListEntityCheckboxDirective, descendants: true, isSignal: true }], ngImport: i0 });
273
505
  }
274
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.1", ngImport: i0, type: SelectableListDirective, decorators: [{
506
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.5", ngImport: i0, type: SelectableListDirective, decorators: [{
275
507
  type: Directive,
276
508
  args: [{
277
509
  selector: "[niceSelectableList]",
@@ -279,7 +511,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.1", ngImpor
279
511
  { provide: NICE_SELECTABLE_LIST_DIRECTIVE, useExisting: forwardRef(() => SelectableListDirective) }
280
512
  ]
281
513
  }]
282
- }], ctorParameters: () => [] });
514
+ }], ctorParameters: () => [], propDecorators: { name: [{ type: i0.Input, args: [{ isSignal: true, alias: "niceSelectableList", required: false }] }], checkboxes: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => NiceSelectableListEntityCheckboxDirective), { ...{ descendants: true }, isSignal: true }] }] } });
283
515
 
284
516
  function injectNiceSelectableListDirective() {
285
517
  return inject(NICE_SELECTABLE_LIST_DIRECTIVE, { optional: true });
@@ -304,6 +536,9 @@ class NiceSelectableListEntityCheckboxDirective {
304
536
  selectableEntity = input.required(...(ngDevMode ? [{ debugName: "selectableEntity" }] : []));
305
537
  isSelected = computed(() => this.niceSelectableList.isEntitySelected(this.selectableEntity())(), ...(ngDevMode ? [{ debugName: "isSelected" }] : []));
306
538
  constructor() {
539
+ effect(() => {
540
+ this.matCheckbox.disabled = this.niceSelectableList.selectAllState().active;
541
+ });
307
542
  effect(() => {
308
543
  this.matCheckbox.checked = this.niceSelectableList.isEntitySelected(this.selectableEntity())();
309
544
  });
@@ -330,23 +565,32 @@ class NiceSelectableListEntityCheckboxDirective {
330
565
  this.matCheckbox.checked = false;
331
566
  this.matCheckbox.change.emit({ checked: false, source: this.matCheckbox });
332
567
  }
333
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.1", ngImport: i0, type: NiceSelectableListEntityCheckboxDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
334
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.2.1", type: NiceSelectableListEntityCheckboxDirective, isStandalone: true, selector: "mat-checkbox[niceSelectableListEntityCheckbox]", inputs: { selectableEntity: { classPropertyName: "selectableEntity", publicName: "selectableEntity", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0 });
568
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.5", ngImport: i0, type: NiceSelectableListEntityCheckboxDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
569
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.0.5", type: NiceSelectableListEntityCheckboxDirective, isStandalone: true, selector: "mat-checkbox[niceSelectableListEntityCheckbox]", inputs: { selectableEntity: { classPropertyName: "selectableEntity", publicName: "selectableEntity", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0 });
335
570
  }
336
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.1", ngImport: i0, type: NiceSelectableListEntityCheckboxDirective, decorators: [{
571
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.5", ngImport: i0, type: NiceSelectableListEntityCheckboxDirective, decorators: [{
337
572
  type: Directive,
338
573
  args: [{
339
574
  selector: "mat-checkbox[niceSelectableListEntityCheckbox]"
340
575
  }]
341
- }], ctorParameters: () => [] });
576
+ }], ctorParameters: () => [], propDecorators: { selectableEntity: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectableEntity", required: true }] }] } });
342
577
 
343
578
  class NiceSelectableListHeaderCheckboxDirective {
344
579
  niceSelectableListDirective = injectNiceSelectableListDirective();
580
+ niceSelectableList = injectNiceSelectableList();
345
581
  matCheckbox = inject(MatCheckbox);
346
582
  destroyRef = inject(DestroyRef);
347
583
  constructor() {
584
+ effect(() => {
585
+ this.matCheckbox.disabled = this.niceSelectableListDirective.allSelected();
586
+ });
348
587
  afterRenderEffect({
349
588
  read: () => {
589
+ const allSelected = this.niceSelectableListDirective.allSelected();
590
+ if (allSelected) {
591
+ this.matCheckbox.checked = true;
592
+ return;
593
+ }
350
594
  const checkboxes = this.niceSelectableListDirective.checkboxes();
351
595
  const empty = checkboxes.length === 0;
352
596
  this.matCheckbox.checked = !empty && checkboxes.every((checkbox) => checkbox.isSelected());
@@ -357,27 +601,128 @@ class NiceSelectableListHeaderCheckboxDirective {
357
601
  }
358
602
  ngOnInit() {
359
603
  this.matCheckbox.change.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(({ checked }) => {
604
+ const entities = this.niceSelectableListDirective
605
+ .checkboxes()
606
+ .map((checkbox) => checkbox.selectableEntity());
360
607
  if (checked) {
361
- this.niceSelectableListDirective.checkboxes().forEach((checkbox) => checkbox.selectEntity());
608
+ this.niceSelectableList.selectEntities(entities);
362
609
  }
363
610
  else {
364
- this.niceSelectableListDirective.checkboxes().forEach((checkbox) => checkbox.deselectEntity());
611
+ this.niceSelectableList.deselectEntities(entities);
365
612
  }
366
613
  });
367
614
  }
368
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.1", ngImport: i0, type: NiceSelectableListHeaderCheckboxDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
369
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.2.1", type: NiceSelectableListHeaderCheckboxDirective, isStandalone: true, selector: "mat-checkbox[niceSelectableListHeaderCheckbox]", ngImport: i0 });
615
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.5", ngImport: i0, type: NiceSelectableListHeaderCheckboxDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
616
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.0.5", type: NiceSelectableListHeaderCheckboxDirective, isStandalone: true, selector: "mat-checkbox[niceSelectableListHeaderCheckbox]", ngImport: i0 });
370
617
  }
371
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.1", ngImport: i0, type: NiceSelectableListHeaderCheckboxDirective, decorators: [{
618
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.5", ngImport: i0, type: NiceSelectableListHeaderCheckboxDirective, decorators: [{
372
619
  type: Directive,
373
620
  args: [{
374
621
  selector: "mat-checkbox[niceSelectableListHeaderCheckbox]"
375
622
  }]
376
623
  }], ctorParameters: () => [] });
377
624
 
625
+ class NiceSelectableListPluginDefinition {
626
+ _injector;
627
+ _destroyRef;
628
+ _store;
629
+ constructor(_injector, _destroyRef, _store) {
630
+ this._injector = _injector;
631
+ this._destroyRef = _destroyRef;
632
+ this._store = _store;
633
+ this._store.registerPlugin(this);
634
+ _destroyRef.onDestroy(() => this.cleanup());
635
+ }
636
+ }
637
+
638
+ class NiceSelectableQueryParamsPlugin extends NiceSelectableListPluginDefinition {
639
+ router;
640
+ route;
641
+ _storeChangesEffectRef;
642
+ _writeQueryParamsSub;
643
+ _isNavigating$;
644
+ _initialized = signal(false, ...(ngDevMode ? [{ debugName: "_initialized" }] : []));
645
+ _nextQueryParams = new Subject();
646
+ init() {
647
+ this.router = this._injector.get(Router);
648
+ this.route = this._injector.get(ActivatedRoute);
649
+ this._isNavigating$ = this.router.events.pipe(filter((event) => event instanceof NavigationStart || event instanceof NavigationEnd), map$1((event) => event instanceof NavigationStart), startWith(!this.router.navigated));
650
+ this.listenOnQueryParams();
651
+ this.listenOnStoreChanges();
652
+ this.writeQueryParams();
653
+ }
654
+ cleanup() {
655
+ this._storeChangesEffectRef.destroy();
656
+ this._writeQueryParamsSub.unsubscribe();
657
+ }
658
+ listenOnQueryParams() {
659
+ if (this.router.navigated) {
660
+ this.parseQueryParams(this.route.snapshot.queryParams);
661
+ this._initialized.set(true);
662
+ return;
663
+ }
664
+ this.router.events
665
+ .pipe(filter((event) => event instanceof NavigationEnd), take(1))
666
+ .subscribe(() => {
667
+ this.parseQueryParams(this.route.snapshot.queryParams);
668
+ this._initialized.set(true);
669
+ });
670
+ }
671
+ listenOnStoreChanges() {
672
+ this._storeChangesEffectRef = effect(() => {
673
+ if (!this._initialized()) {
674
+ return;
675
+ }
676
+ const entities = this._store.entitiesIds();
677
+ const activeEntity = this._store.activeEntityId();
678
+ const selectAllState = this._store.selectAllState();
679
+ const params = {
680
+ ...(selectAllState.active && {
681
+ allSelected: true,
682
+ ...(selectAllState.parameters && ({
683
+ allSelectedParameters: JSON.stringify(selectAllState.parameters)
684
+ }))
685
+ }),
686
+ selection: entities,
687
+ selected: activeEntity
688
+ };
689
+ this._nextQueryParams.next(params);
690
+ }, { ...(ngDevMode ? { debugName: "_storeChangesEffectRef" } : {}), injector: this._injector,
691
+ manualCleanup: true });
692
+ }
693
+ parseQueryParams(params) {
694
+ if (params.selection) {
695
+ const selection = Array.isArray(params.selection)
696
+ ? params.selection
697
+ : [params.selection];
698
+ this._store.setEntitiesFromSelections(selection);
699
+ }
700
+ if (params.selected) {
701
+ this._store.setActiveFromSelected(params.selected);
702
+ }
703
+ if (params.allSelected) {
704
+ this._store.setSelectAllState({
705
+ active: true,
706
+ total: this._store.total(),
707
+ parameters: params.allSelectedParameters
708
+ ? JSON.parse(params.allSelectedParameters)
709
+ : null
710
+ });
711
+ }
712
+ }
713
+ writeQueryParams() {
714
+ this._writeQueryParamsSub = this._nextQueryParams.pipe(combineLatestWith(this._isNavigating$), switchMap(([params, isNavigating]) => {
715
+ if (isNavigating) {
716
+ return of(false);
717
+ }
718
+ return from(this.router.navigate([], { queryParams: params, onSameUrlNavigation: "ignore" }));
719
+ })).subscribe();
720
+ }
721
+ }
722
+
378
723
  /**
379
724
  * Generated bundle index. Do not edit.
380
725
  */
381
726
 
382
- export { NICE_SELECTABLE_LIST, NICE_SELECTABLE_LISTS, NICE_SELECTABLE_LIST_DIRECTIVE, NiceSelectableListEntityCheckboxDirective, NiceSelectableListHeaderCheckboxDirective, NiceSelectableListStore, SelectableListDirective, injectNiceSelectableList, injectNiceSelectableListDirective, provideNiceSelectableList, resolveNiceSelectableList };
727
+ export { NICE_SELECTABLE_LIST, NICE_SELECTABLE_LISTS, NICE_SELECTABLE_LIST_DIRECTIVE, NiceSelectableListEntityCheckboxDirective, NiceSelectableListHeaderCheckboxDirective, NiceSelectableListPluginDefinition, NiceSelectableListStore, NiceSelectableQueryParamsPlugin, SelectableListDirective, injectNiceSelectableList, injectNiceSelectableListDirective, provideNiceSelectableList, resolveNiceSelectableList };
383
728
  //# sourceMappingURL=recursyve-nice-selectable-list.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"recursyve-nice-selectable-list.mjs","sources":["../../../src/nice-selectable-list/selectable-list/store.ts","../../../src/nice-selectable-list/selectable-list/provider.ts","../../../src/nice-selectable-list/selectable-list/selectable-list.ts","../../../src/nice-selectable-list/selectable-list/injector.ts","../../../src/nice-selectable-list/selectable-list/entity-checkbox.directive.ts","../../../src/nice-selectable-list/selectable-list/header-checkbox.directive.ts","../../../src/nice-selectable-list/recursyve-nice-selectable-list.ts"],"sourcesContent":["import { computed, Signal, signal } from \"@angular/core\";\nimport { NiceSelectableListEntityCheckboxDirective } from \"./entity-checkbox.directive\";\n\nexport type NiceSelectableListConfig<T> = {\n idProperty: keyof T;\n idType?: \"string\" | \"number\";\n}\n\nexport type NiceSelectableListEntity<T> = {\n id: string | number;\n entity: T | null;\n};\n\nexport class NiceSelectableListStore<T> {\n private readonly _entities = signal<NiceSelectableListEntity<T>[]>([]);\n private readonly _activeEntity = signal<NiceSelectableListEntity<T> | null>(null);\n private readonly _checkboxes = signal<NiceSelectableListEntityCheckboxDirective<T>[]>([]);\n\n public readonly entities = this._entities.asReadonly();\n public readonly activeEntity = this._activeEntity.asReadonly();\n\n public readonly total = computed(() => this._entities().length);\n public readonly entitiesIds = computed(() => this._entities().map((entity) => entity.id));\n public readonly activeEntityId = computed(() => this._activeEntity()?.id ?? null);\n\n constructor(private readonly _config: NiceSelectableListConfig<T>) {}\n\n public registerCheckbox(checkbox: NiceSelectableListEntityCheckboxDirective<T>): void {\n this._checkboxes.update((checkboxes) => [...checkboxes, checkbox]);\n\n const id = this._resolveEntityId(checkbox.selectableEntity());\n const entity = this._entities().find((_entity) => _entity.id === id);\n if (entity && entity.entity === null) {\n this._entities.update(\n (_entities) => _entities.map((_entity) =>\n _entity.id === id ? { id, entity: checkbox.selectableEntity() } : _entity\n )\n );\n entity.entity = checkbox.selectableEntity();\n }\n }\n\n public unregisterCheckbox(checkbox: NiceSelectableListEntityCheckboxDirective<T>): void {\n this._checkboxes.update((checkboxes) => checkboxes.filter((_checkbox) => _checkbox !== checkbox));\n }\n\n public isEntitySelected(entity: T): Signal<boolean> {\n return computed(() => this._isEntitySelected(entity));\n }\n\n public setEntitiesFromSelections(selections: string[]): void {\n const ids: (string | number)[] = this._config.idType === \"string\" ? selections : selections.map((id) => +id);\n\n const registeredEntities = this._checkboxes().map((checkbox) => ({\n id: this._resolveEntityId(checkbox.selectableEntity()), entity: checkbox.selectableEntity()\n }));\n const entities = ids.map((id) => ({\n id,\n entity: registeredEntities.find(_entity => _entity.id === id)?.entity ?? null\n }));\n this._entities.set(entities);\n }\n\n public selectEntity(entity: T): void {\n const isSelected = this._isEntitySelected(entity);\n if (isSelected) {\n return;\n }\n\n const id = this._resolveEntityId(entity);\n this._entities.update((entities) => [...entities, { id, entity }]);\n }\n\n public deselectEntity(entity: T): void {\n const isSelected = this._isEntitySelected(entity);\n if (!isSelected) {\n return;\n }\n\n const id = this._resolveEntityId(entity);\n this._entities.update((entities) => entities.filter((_entity) => _entity.id !== id));\n }\n\n public clear(): void {\n this._entities.set([]);\n this._activeEntity.set(null);\n }\n\n public setActiveFromSelected(selected: string): void {\n const id = this._config.idType === \"string\" ? selected : +selected;\n const entity = this._entities().find((_entity) => _entity.id === id);\n if (!entity) {\n return;\n }\n\n this._activeEntity.set(entity);\n }\n\n public setActiveEntity(entity: T | null): void {\n if (!entity) {\n this._activeEntity.set(null);\n return;\n }\n\n const id = this._resolveEntityId(entity);\n this._activeEntity.set({ id, entity });\n }\n\n public selectFirstEntity(): void {\n const entity = this._entities()[0];\n if (!entity) {\n return;\n }\n\n this._activeEntity.set(entity);\n }\n\n public selectNextEntity(): void {\n const entities = this._entities();\n const activeEntity = this._activeEntity();\n if (!activeEntity) {\n this.selectFirstEntity();\n return;\n }\n\n const index = entities.findIndex((_entity) => activeEntity.id === _entity.id);\n const nextEntity = entities[index + 1];\n if (!nextEntity) {\n return;\n }\n\n this._activeEntity.set(nextEntity);\n }\n\n public selectPreviousEntity(): void {\n const entities = this._entities();\n const activeEntity = this._activeEntity();\n if (!activeEntity) {\n this.selectFirstEntity();\n return;\n }\n\n const index = entities.findIndex((_entity) => activeEntity.id === _entity.id);\n if (index === 0) {\n return;\n }\n\n const previousEntity = entities[index - 1];\n if (!previousEntity) {\n return;\n }\n\n this._activeEntity.set(previousEntity);\n }\n\n public selectLastEntity(): void {\n const entities = this._entities();\n if (entities.length === 0) {\n return;\n }\n\n const lastEntity = entities[entities.length - 1];\n if (!lastEntity) {\n return;\n }\n\n this._activeEntity.set(lastEntity);\n }\n\n private _isEntitySelected(entity: T): boolean {\n const id = this._resolveEntityId(entity);\n return this._entities().findIndex((_entity) => _entity.id === id) >= 0;\n }\n\n private _resolveEntityId(entity: T): string | number {\n const idProperty = this._config.idProperty;\n const id = entity[idProperty];\n if (typeof id !== \"string\" && typeof id !== \"number\") {\n throw new Error(`The id property must be a string or a number, but got ${typeof id}`);\n }\n\n return id;\n }\n}\n","import { FactoryProvider, inject, InjectionToken, Injector } from \"@angular/core\";\nimport { NiceSelectableListConfig, NiceSelectableListStore } from \"./store\";\n\nexport const NICE_SELECTABLE_LISTS\n = new InjectionToken<NiceSelectableListProvider<unknown>[]>(\"_selectable_list_providers\");\n\nexport const NICE_SELECTABLE_LIST\n = new InjectionToken<NiceSelectableListStore<unknown>>(\"_selectable_list_provider\");\n\nexport type NiceSelectableListProvider<T> = {\n name: string;\n store: NiceSelectableListStore<T>;\n};\n\nexport function provideNiceSelectableList<T>(config?: NiceSelectableListConfig<T>): FactoryProvider;\nexport function provideNiceSelectableList<T>(name: string, config?: NiceSelectableListConfig<T>): FactoryProvider;\nexport function provideNiceSelectableList<T>(...args: unknown[]): FactoryProvider {\n const name: string | null = typeof args[0] === \"string\" ? args[0] : null;\n const config = (typeof args[0] === \"string\" ? args[1] : args[0]) as NiceSelectableListConfig<T> | undefined;\n\n if (!name) {\n return {\n provide: NICE_SELECTABLE_LIST,\n useFactory: () => new NiceSelectableListStore({\n idProperty: config?.idProperty ?? \"id\" as keyof T,\n idType: config?.idType ?? \"number\" as \"string\" | \"number\"\n })\n };\n }\n\n return {\n provide: NICE_SELECTABLE_LISTS,\n useFactory: () => ({\n name,\n store: new NiceSelectableListStore({\n idProperty: config?.idProperty ?? \"id\" as keyof T,\n idType: config?.idType ?? \"number\" as \"string\" | \"number\"\n })\n }),\n multi: true\n };\n}\n\nexport type ResolveNiceSelectableListOptions = { injector: Injector };\n\nexport function resolveNiceSelectableList<T>(\n name: string,\n options?: ResolveNiceSelectableListOptions\n): NiceSelectableListStore<T>;\nexport function resolveNiceSelectableList<T>(options?: ResolveNiceSelectableListOptions): NiceSelectableListStore<T>;\nexport function resolveNiceSelectableList<T>(...args: unknown[]): NiceSelectableListStore<T> {\n const name: string | null = typeof args[0] === \"string\" ? args[0] : null;\n const options = (typeof args[0] === \"string\" ? args[1] : args[0]) as ResolveNiceSelectableListOptions | undefined;\n\n if (!name) {\n return (options?.injector\n ? options.injector.get(NICE_SELECTABLE_LIST)\n : inject(NICE_SELECTABLE_LIST)) as NiceSelectableListStore<T>;\n }\n\n const selectableLists = options?.injector\n ? options.injector.get(NICE_SELECTABLE_LISTS)\n : inject(NICE_SELECTABLE_LISTS);\n\n const provider = selectableLists.find((_provider) => _provider.name === name);\n if (!provider) {\n throw new Error(`No selectable list provider found for name: ${name}`);\n }\n\n return provider.store as NiceSelectableListStore<T>;\n}\n","import {\n contentChildren,\n Directive,\n effect,\n forwardRef,\n inject,\n InjectionToken,\n Injector,\n input,\n OnInit,\n signal,\n Signal,\n untracked\n} from \"@angular/core\";\nimport { ActivatedRoute, NavigationEnd, Router } from \"@angular/router\";\nimport { filter, take } from \"rxjs\";\nimport { NiceSelectableListEntityCheckboxDirective } from \"./entity-checkbox.directive\";\nimport { resolveNiceSelectableList } from \"./provider\";\nimport { NiceSelectableListStore } from \"./store\";\n\nexport const NICE_SELECTABLE_LIST_DIRECTIVE\n = new InjectionToken<NiceSelectableList<unknown>>(\"_selectable_list_directive\");\n\nexport type NiceSelectableList<T> = {\n name: Signal<string | null>;\n checkboxes: Signal<readonly NiceSelectableListEntityCheckboxDirective<T>[]>;\n};\n\n@Directive({\n selector: \"[niceSelectableList]\",\n providers: [\n { provide: NICE_SELECTABLE_LIST_DIRECTIVE, useExisting: forwardRef(() => SelectableListDirective) }\n ]\n})\nexport class SelectableListDirective<T> implements NiceSelectableList<T>, OnInit {\n public readonly name = input<string | null>(null, { alias: \"niceSelectableList\" });\n public readonly enableQueryParams = input<boolean>(false);\n\n public readonly checkboxes = contentChildren<NiceSelectableListEntityCheckboxDirective<T>>(\n NiceSelectableListEntityCheckboxDirective,\n { descendants: true }\n );\n\n private readonly _initialized = signal(false);\n public readonly initialized = this._initialized.asReadonly();\n\n protected readonly route = inject(ActivatedRoute);\n protected readonly router = inject(Router);\n protected readonly injector = inject(Injector);\n\n protected selectableLists!: NiceSelectableListStore<T>;\n\n constructor() {\n effect(() => {\n const name = this.name();\n this.selectableLists = name\n ? resolveNiceSelectableList(name, { injector: this.injector })\n : resolveNiceSelectableList({ injector: this.injector });\n });\n\n effect(() => {\n if (!this._initialized() || !this.name()) {\n return;\n }\n\n if (!this.enableQueryParams()) {\n this.router.navigate([], {\n relativeTo: this.route,\n queryParams: {\n selections: null,\n selected: null\n }\n });\n return;\n }\n });\n\n effect(() => {\n if (!this._initialized()) {\n return;\n }\n\n const shouldWrite = untracked(() => this.enableQueryParams() && this.name());\n if (!shouldWrite) {\n return;\n }\n\n const entities = this.selectableLists.entitiesIds();\n const activeEntity = this.selectableLists.activeEntityId();\n this.router.navigate([], {\n relativeTo: this.route,\n queryParams: {\n selections: entities,\n selected: activeEntity\n }\n });\n });\n }\n\n public ngOnInit(): void {\n this.loadQueryParams();\n }\n\n private loadQueryParams(): void {\n if (this.router.navigated) {\n this.parseQueryParams(this.route.snapshot.queryParams);\n this._initialized.set(true);\n return;\n }\n\n this.router.events\n .pipe(\n filter((event) => event instanceof NavigationEnd),\n take(1)\n )\n .subscribe(() => {\n this.parseQueryParams(this.route.snapshot.queryParams);\n this._initialized.set(true);\n });\n }\n\n private parseQueryParams(params: {\n selections?: string | string[];\n selected?: string;\n }): void {\n if (params.selections) {\n const selections = Array.isArray(params.selections)\n ? params.selections\n : [params.selections]\n this.selectableLists.setEntitiesFromSelections(selections);\n }\n\n if (params.selected) {\n this.selectableLists.setActiveFromSelected(params.selected);\n }\n }\n}\n","import { inject } from \"@angular/core\";\nimport { NICE_SELECTABLE_LIST, NICE_SELECTABLE_LISTS } from \"./provider\";\nimport { NICE_SELECTABLE_LIST_DIRECTIVE, NiceSelectableList } from \"./selectable-list\";\nimport { NiceSelectableListStore } from \"./store\";\n\nexport function injectNiceSelectableListDirective<T>(): NiceSelectableList<T> {\n return inject(NICE_SELECTABLE_LIST_DIRECTIVE, { optional: true }) as NiceSelectableList<T>;\n}\n\nexport function injectNiceSelectableList<T>(name?: string): NiceSelectableListStore<T> {\n const storeName = name ?? injectNiceSelectableListDirective()?.name();\n if (!storeName) {\n return inject(NICE_SELECTABLE_LIST) as NiceSelectableListStore<T>;\n }\n\n const selectableLists = inject(NICE_SELECTABLE_LISTS);\n const provider = selectableLists.find((_provider) => _provider.name === storeName);\n if (!provider) {\n throw new Error(`No selectable list provider found for name: ${storeName}`);\n }\n\n return provider.store as NiceSelectableListStore<T>;\n}\n","import { computed, DestroyRef, Directive, effect, inject, input, OnDestroy, OnInit } from \"@angular/core\";\nimport { takeUntilDestroyed } from \"@angular/core/rxjs-interop\";\nimport { MatCheckbox } from \"@angular/material/checkbox\";\nimport { injectNiceSelectableList } from \"./injector\";\n\n@Directive({\n selector: \"mat-checkbox[niceSelectableListEntityCheckbox]\"\n})\nexport class NiceSelectableListEntityCheckboxDirective<T> implements OnInit, OnDestroy {\n protected readonly matCheckbox = inject(MatCheckbox);\n protected readonly destroyRef = inject(DestroyRef);\n protected readonly niceSelectableList = injectNiceSelectableList<T>();\n\n public readonly selectableEntity = input.required<T>();\n public readonly isSelected = computed(() => this.niceSelectableList.isEntitySelected(this.selectableEntity())());\n\n constructor() {\n effect(() => {\n this.matCheckbox.checked = this.niceSelectableList.isEntitySelected(this.selectableEntity())();\n });\n }\n\n public ngOnInit(): void {\n this.niceSelectableList.registerCheckbox(this);\n\n this.matCheckbox.change.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(({ checked }) => {\n if (checked) {\n this.niceSelectableList.selectEntity(this.selectableEntity());\n } else {\n this.niceSelectableList.deselectEntity(this.selectableEntity());\n }\n });\n }\n\n public ngOnDestroy(): void {\n this.niceSelectableList.unregisterCheckbox(this);\n }\n\n public selectEntity(): void {\n this.matCheckbox.checked = true;\n this.matCheckbox.change.emit({ checked: true, source: this.matCheckbox });\n }\n\n public deselectEntity(): void {\n this.matCheckbox.checked = false;\n this.matCheckbox.change.emit({ checked: false, source: this.matCheckbox });\n }\n}\n","import { afterRenderEffect, DestroyRef, Directive, inject, OnInit } from \"@angular/core\";\nimport { takeUntilDestroyed } from \"@angular/core/rxjs-interop\";\nimport { MatCheckbox } from \"@angular/material/checkbox\";\nimport { injectNiceSelectableListDirective } from \"./injector\";\n\n@Directive({\n selector: \"mat-checkbox[niceSelectableListHeaderCheckbox]\"\n})\nexport class NiceSelectableListHeaderCheckboxDirective<T> implements OnInit {\n private readonly niceSelectableListDirective = injectNiceSelectableListDirective<T>();\n private readonly matCheckbox = inject(MatCheckbox);\n private readonly destroyRef = inject(DestroyRef);\n\n constructor() {\n afterRenderEffect({\n read: () => {\n const checkboxes = this.niceSelectableListDirective.checkboxes();\n const empty = checkboxes.length === 0;\n\n this.matCheckbox.checked = !empty && checkboxes.every((checkbox) => checkbox.isSelected());\n this.matCheckbox.indeterminate = !this.matCheckbox.checked\n && checkboxes.some((checkbox) => checkbox.isSelected());\n }\n });\n }\n\n public ngOnInit(): void {\n this.matCheckbox.change.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(({ checked }) => {\n if (checked) {\n this.niceSelectableListDirective.checkboxes().forEach((checkbox) => checkbox.selectEntity());\n } else {\n this.niceSelectableListDirective.checkboxes().forEach((checkbox) => checkbox.deselectEntity());\n }\n });\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"recursyve-nice-selectable-list.mjs","sources":["../../../src/nice-selectable-list/selectable-list/store.ts","../../../src/nice-selectable-list/selectable-list/provider.ts","../../../src/nice-selectable-list/selectable-list/selectable-list.ts","../../../src/nice-selectable-list/selectable-list/injector.ts","../../../src/nice-selectable-list/selectable-list/entity-checkbox.directive.ts","../../../src/nice-selectable-list/selectable-list/header-checkbox.directive.ts","../../../src/nice-selectable-list/selectable-list/pluggins/plugin-definition.ts","../../../src/nice-selectable-list/selectable-list/pluggins/query-params/plugin.ts","../../../src/nice-selectable-list/recursyve-nice-selectable-list.ts"],"sourcesContent":["import { computed, InjectionToken, Injector, ResourceRef, Signal, signal } from \"@angular/core\";\nimport { rxResource } from \"@angular/core/rxjs-interop\";\nimport { NiceSelectableListPluginDefinition } from \"./pluggins/plugin-definition\";\nimport { map, of } from \"rxjs\";\nimport { NiceSelectableListEntityCheckboxDirective } from \"./entity-checkbox.directive\";\nimport { NiceSelectableListEntityLoader, NiceSelectableListUIEntityLoader } from \"./loader\";\n\nexport type NiceSelectableListConfig<T> = {\n idProperty: keyof T;\n idType?: \"string\" | \"number\";\n\n entityLoaderToken: InjectionToken<NiceSelectableListEntityLoader<T>> | null;\n uiEntityLoaderToken: InjectionToken<NiceSelectableListUIEntityLoader<T>> | null;\n preload?: boolean;\n}\n\nexport type NiceSelectableListEntity<T> = {\n id: string | number;\n entity: ResourceRef<T | undefined> | null;\n ui: ResourceRef<T | undefined> | null;\n};\n\nexport type NiceSelectableListSelectAllState = {\n active: boolean;\n total: number | null;\n parameters: object | null;\n};\n\nexport class NiceSelectableListStore<T> {\n private readonly _plugins: NiceSelectableListPluginDefinition[] = [];\n private _entityLoader: NiceSelectableListEntityLoader<T, object, number | string> | null = null;\n private _uiEntityLoader: NiceSelectableListUIEntityLoader<T, number | string> | null = null;\n\n private readonly _cache = signal<Record<string | number, NiceSelectableListEntity<T>>>({});\n\n private readonly _entitiesMap = signal<Record<string | number, NiceSelectableListEntity<T>>>({});\n private readonly _activeEntity = signal<NiceSelectableListEntity<T> | null>(null);\n private readonly _checkboxes = signal<NiceSelectableListEntityCheckboxDirective<T>[]>([]);\n private readonly _selectAllState = signal<NiceSelectableListSelectAllState>({\n active: false,\n total: null,\n parameters: null\n });\n\n // Track window loading state\n private _lastWindowIds: (string | number)[] = [];\n private _currentWindowIds: (string | number)[] = [];\n\n public readonly entities = computed(() => Object.values(this._entitiesMap()));\n public readonly activeEntity = this._activeEntity.asReadonly();\n\n public readonly total: Signal<number> = computed(() => this.entities().length);\n public readonly entitiesIds: Signal<(string | number)[]> = computed(() => {\n const ids = Object.keys(this._entitiesMap());\n return this._config.idType === \"string\" ? ids : ids.map((id) => +id);\n });\n public readonly activeEntityId: Signal<string | number | null> = computed(() => this._activeEntity()?.id ?? null);\n\n public readonly selectAllState = this._selectAllState.asReadonly();\n\n constructor(private readonly _injector: Injector, private readonly _config: NiceSelectableListConfig<T>) {}\n\n public init(): void {\n if (!this._entityLoader && this._config.entityLoaderToken) {\n this._entityLoader = this._injector.get(this._config.entityLoaderToken) as\n NiceSelectableListEntityLoader<T, object, number | string>;\n }\n\n if (!this._uiEntityLoader && this._config.uiEntityLoaderToken) {\n this._uiEntityLoader = this._injector.get(this._config.uiEntityLoaderToken) as\n NiceSelectableListUIEntityLoader<T, number | string>;\n }\n\n for (const plugin of this._plugins) {\n plugin.init();\n }\n }\n\n public registerPlugin(plugin: NiceSelectableListPluginDefinition): void {\n this._plugins.push(plugin);\n }\n\n public registerCheckbox(checkbox: NiceSelectableListEntityCheckboxDirective<T>): void {\n this._checkboxes.update((checkboxes) => [...checkboxes, checkbox]);\n\n const id = this._resolveEntityId(checkbox.selectableEntity());\n const existing = this._entitiesMap()[id];\n\n const selectAllState = this._selectAllState();\n if ((existing && existing.entity === null) || selectAllState.active) {\n const initial = checkbox.selectableEntity();\n const entityResource = this._createEntityResource(id, initial);\n this._entitiesMap.update(\n (_entitiesMap) => ({\n ..._entitiesMap,\n [id]: {\n id,\n entity: entityResource,\n ui: null\n }\n })\n );\n return;\n }\n }\n\n public unregisterCheckbox(checkbox: NiceSelectableListEntityCheckboxDirective<T>): void {\n this._checkboxes.update((checkboxes) => checkboxes.filter((_checkbox) => _checkbox !== checkbox));\n }\n\n public isEntitySelected(entity: T): Signal<boolean> {\n return computed(() => this._isEntitySelected(entity));\n }\n\n public setEntitiesFromSelections(selections: string[]): void {\n const ids: (string | number)[] = this._config.idType === \"string\" ? selections : selections.map((id) => +id);\n\n const registered = this._checkboxes().map((checkbox) => ({\n id: this._resolveEntityId(checkbox.selectableEntity()), value: checkbox.selectableEntity()\n }));\n const cache = this._cache();\n const entities = ids.map((id) => {\n const known = registered.find(_e => _e.id === id)?.value;\n const cached = cache[id]?.entity;\n const entityResource = known ? this._createEntityResource(id, known) : (cached ?? null);\n return {\n id,\n entity: entityResource\n } as { id: string | number; entity: ResourceRef<T | undefined> | null };\n });\n const mapOut = entities.reduce((map, entity) => ({\n ...map,\n [entity.id]: {\n id: entity.id,\n entity: entity.entity,\n ui: null\n }\n }), {} as Record<string | number, NiceSelectableListEntity<T>>);\n\n this._entitiesMap.set(mapOut);\n this._processCacheFromEntities();\n this._updateWindowForActive();\n }\n\n public selectEntity(entity: T): void {\n const isSelected = this._isEntitySelected(entity);\n if (isSelected) {\n return;\n }\n\n const id = this._resolveEntityId(entity);\n const cached = this._cache()[id];\n const newEntity = {\n id,\n entity: cached?.entity ?? this._createEntityResource(id, entity),\n ui: cached?.ui ?? this._createUIResource(id)\n };\n\n this._entitiesMap.update((entitiesMap) => ({\n ...entitiesMap,\n [id]: newEntity\n }));\n\n this._cache.update((cache) => ({\n ...cache,\n [id]: newEntity\n }));\n\n // Window might change if this selection impacts first/last buckets\n this._updateWindowForActive();\n }\n\n public selectEntities(entities: T[]): void {\n this._entitiesMap.update((entitiesMap) => {\n const newEntitiesMap = { ...entitiesMap };\n const cache = this._cache();\n for (const entity of entities) {\n const id = this._resolveEntityId(entity);\n const cached = cache[id];\n newEntitiesMap[id] = cached ?? {\n id,\n entity: this._createEntityResource(id, entity),\n ui: null\n };\n }\n\n return newEntitiesMap;\n });\n\n this._processCacheFromEntities();\n this._updateWindowForActive();\n }\n\n public deselectEntity(entity: T): void {\n const isSelected = this._isEntitySelected(entity);\n if (!isSelected) {\n return;\n }\n\n const id = this._resolveEntityId(entity);\n this._entitiesMap.update((entitiesMap) => {\n const newEntitiesMap = { ...entitiesMap };\n delete newEntitiesMap[id];\n return newEntitiesMap;\n });\n }\n\n public deselectEntities(entities: T[]): void {\n const toRemove = entities.filter((entity) => this._isEntitySelected(entity));\n\n this._entitiesMap.update((entitiesMap) => {\n const newEntitiesMap = { ...entitiesMap };\n for (const entity of toRemove) {\n const id = this._resolveEntityId(entity);\n delete newEntitiesMap[id];\n }\n\n return newEntitiesMap;\n });\n }\n\n public clear(): void {\n this._entitiesMap.set({});\n this._activeEntity.set(null);\n }\n\n public setSelectAllState(state: NiceSelectableListSelectAllState): void {\n this._selectAllState.set(state);\n\n if (!state.active) {\n this.clear();\n return;\n }\n\n const entities = this._checkboxes().map((checkbox) => checkbox.selectableEntity());\n this._entitiesMap.set(entities.reduce((map, entity) => {\n const id = this._resolveEntityId(entity);\n return {\n ...map,\n [id]: {\n id,\n entity: null,\n ui: null\n }\n };\n }, {} as Record<string | number, NiceSelectableListEntity<T>>));\n\n this._preloadSelectAllValues()\n }\n\n public setActiveFromSelected(selected: string): void {\n const id = this._config.idType === \"string\" ? selected : +selected;\n const entity = this._entitiesMap()[id];\n if (!entity) {\n return;\n }\n\n this._setActiveEntity(id);\n }\n\n public setActiveEntity(entity: T | null): void {\n if (!entity) {\n this._activeEntity.set(null);\n return;\n }\n\n const id = this._resolveEntityId(entity);\n this._setActiveEntity(id);\n }\n\n public selectFirstEntity(): void {\n const id = this.entitiesIds()[0];\n if (!id) {\n return;\n }\n\n this._setActiveEntity(id);\n }\n\n public selectNextEntity(): void {\n const activeEntity = this._activeEntity();\n if (!activeEntity) {\n this.selectFirstEntity();\n return;\n }\n\n const entitiesIds = this.entitiesIds();\n const index = entitiesIds.findIndex((id) => activeEntity.id === id);\n const nextEntityId = entitiesIds[index + 1];\n if (!nextEntityId) {\n return;\n }\n\n this._setActiveEntity(nextEntityId);\n }\n\n public selectPreviousEntity(): void {\n const activeEntity = this._activeEntity();\n if (!activeEntity) {\n this.selectFirstEntity();\n return;\n }\n\n const entitiesIds = this.entitiesIds();\n const index = entitiesIds.findIndex((id) => activeEntity.id === id);\n if (index === 0) {\n return;\n }\n\n const previousEntityId = entitiesIds[index - 1];\n if (!previousEntityId) {\n return;\n }\n\n this._setActiveEntity(previousEntityId);\n }\n\n public selectLastEntity(): void {\n const entitiesIds = this.entitiesIds();\n if (entitiesIds.length === 0) {\n return;\n }\n\n const lastEntityId = entitiesIds[entitiesIds.length - 1];\n if (!lastEntityId) {\n return;\n }\n\n this._setActiveEntity(lastEntityId);\n }\n\n private _isEntitySelected(entity: T): boolean {\n const id = this._resolveEntityId(entity);\n return this._entitiesMap()[id]?.entity !== undefined;\n }\n\n private _resolveEntityId(entity: T): string | number {\n const idProperty = this._config.idProperty;\n const id = entity[idProperty];\n if (typeof id !== \"string\" && typeof id !== \"number\") {\n throw new Error(`The id property must be a string or a number, but got ${typeof id}`);\n }\n\n return id;\n }\n\n private _processCacheFromEntities(): void {\n const entities = this._entitiesMap();\n this._cache.update((cache) => ({ ...cache, ...entities }));\n }\n\n private _createEntityResource(id: string | number, initial?: T | null): ResourceRef<T | undefined> {\n const resource = rxResource<T | undefined, { id: string | number}>({\n params: () => ({ id }),\n stream: ({ params }) => {\n if (this._entityLoader) {\n return this._entityLoader.loadEntitiesByIds([params.id]).pipe(map((arr) => arr?.[0]));\n }\n return of(initial ?? undefined);\n },\n defaultValue: initial ?? undefined,\n injector: this._injector\n });\n\n if (initial) {\n resource.set(initial);\n }\n\n return resource;\n }\n\n private _createUIResource(id: string | number): ResourceRef<T | undefined> | null {\n if (!this._uiEntityLoader) {\n return null;\n }\n\n return rxResource({\n params: () => ({ id }),\n stream: ({ params }) => this._uiEntityLoader!.loadById(params.id),\n injector: this._injector\n });\n }\n\n private _computeWindowIds(): (string | number)[] {\n const ids = this.entitiesIds();\n const n = ids.length;\n if (n === 0) {\n return [];\n }\n\n const set = new Set<string | number>();\n\n // first 3\n for (let i = 0; i < Math.min(3, n); i++) {\n set.add(ids[i]);\n }\n\n // last 3\n for (let i = Math.max(0, n - 3); i < n; i++) {\n set.add(ids[i]);\n }\n\n // active and +/- 3\n const activeId = this.activeEntityId();\n const activeIndex = activeId !== null ? ids.findIndex((i) => i === activeId) : -1;\n if (activeIndex >= 0) {\n for (let i = Math.max(0, activeIndex - 3); i <= Math.min(n - 1, activeIndex + 3); i++) {\n set.add(ids[i]);\n }\n }\n return Array.from(set.values());\n }\n\n private _ensureResourcesForIds(ids: (string | number)[]): void {\n const mapCopy = { ...this._entitiesMap() } as Record<string | number, NiceSelectableListEntity<T>>;\n const cache = this._cache();\n for (const id of ids) {\n const entry = mapCopy[id] ?? cache[id];\n if (!entry) {\n mapCopy[id] = {\n id,\n entity: this._createEntityResource(id),\n ui: this._uiEntityLoader ? this._createUIResource(id) : null\n };\n continue;\n }\n\n if (!entry.entity) {\n entry.entity = this._createEntityResource(id);\n }\n\n if (!entry.ui && this._uiEntityLoader) {\n entry.ui = this._createUIResource(id);\n }\n }\n\n this._entitiesMap.set(mapCopy);\n this._processCacheFromEntities();\n }\n\n private _updateWindowForActive(): void {\n this._lastWindowIds = this._currentWindowIds;\n\n this._currentWindowIds = this._computeWindowIds();\n if (this._currentWindowIds.length) {\n this._ensureResourcesForIds(this._currentWindowIds);\n }\n }\n\n private _setActiveEntity(id: string | number): void {\n const entity = this._entitiesMap()[id];\n if (!entity) {\n return;\n }\n\n if (!entity.entity) {\n entity.entity = this._createEntityResource(id);\n }\n\n if (!entity.ui) {\n entity.ui = this._createUIResource(id);\n }\n\n this._activeEntity.set(entity);\n this._updateWindowForActive();\n }\n\n public _preloadSelectAllValues(): void {\n if (!this._config.preload || !this._entityLoader) {\n return;\n }\n\n this._entityLoader\n .loadIdsFromParameters(this._selectAllState().parameters ?? {})\n .pipe(\n map((ids) => {\n const cache = this._cache();\n this._entitiesMap.set(ids.reduce((map, id) => {\n const cached = cache[id];\n return {\n ...map,\n [id]: cached ?? {\n id,\n entity: null,\n ui: null\n }\n };\n }, {} as Record<string | number, NiceSelectableListEntity<T>>));\n\n this._processCacheFromEntities();\n this._updateWindowForActive();\n })\n )\n .subscribe();\n }\n}\n","import { DestroyRef, inject, InjectionToken, Injector, Provider, Type } from \"@angular/core\";\nimport { NiceSelectableListEntityLoader, NiceSelectableListUIEntityLoader } from \"./loader\";\nimport { NiceSelectableListPluginDefinition } from \"./pluggins/plugin-definition\";\nimport { NiceSelectableListConfig, NiceSelectableListStore } from \"./store\";\n\nexport const NICE_SELECTABLE_LISTS\n = new InjectionToken<NiceSelectableListProvider<unknown>[]>(\"_selectable_list_providers\");\n\nexport const NICE_SELECTABLE_LIST\n = new InjectionToken<NiceSelectableListStore<unknown>>(\"_selectable_list_provider\");\n\nexport type NiceSelectableListProvider<T> = {\n name: string;\n store: NiceSelectableListStore<T>;\n};\n\nexport type NiceSelectableListOptions<T> =\n & { entityLoader?: Type<NiceSelectableListEntityLoader<T>> }\n & { uiEntityLoader?: Type<NiceSelectableListUIEntityLoader<T>> }\n & { plugins?: Type<NiceSelectableListPluginDefinition>[] }\n & Omit<NiceSelectableListConfig<T>, \"entityLoaderToken\" | \"uiEntityLoaderToken\">;\n\nexport function provideNiceSelectableList<T>(options?: NiceSelectableListOptions<T>): Provider[];\nexport function provideNiceSelectableList<T>(name: string, options?: NiceSelectableListOptions<T>): Provider[];\nexport function provideNiceSelectableList<T>(...args: unknown[]): Provider[] {\n const name: string | null = typeof args[0] === \"string\" ? args[0] : null;\n const options = (typeof args[0] === \"string\" ? args[1] : args[0]) as NiceSelectableListOptions<T> | undefined;\n\n const providers: Provider[] = [];\n\n const entityLoaderToken = options?.entityLoader\n ? new InjectionToken<unknown>(options.entityLoader.name)\n : null;\n if (entityLoaderToken && options?.entityLoader) {\n providers.push({\n provide: entityLoaderToken,\n useClass: options.entityLoader\n });\n }\n\n const uiEntityLoaderToken = options?.uiEntityLoader\n ? new InjectionToken<unknown>(options.uiEntityLoader.name)\n : null;\n if (uiEntityLoaderToken && options?.uiEntityLoader) {\n providers.push({\n provide: uiEntityLoaderToken,\n useClass: options.uiEntityLoader\n });\n }\n\n if (!name) {\n providers.push({\n provide: NICE_SELECTABLE_LIST,\n useFactory: (injector: Injector, destroyRef: DestroyRef) => {\n const store = new NiceSelectableListStore(injector, {\n idProperty: options?.idProperty ?? \"id\" as keyof T,\n idType: options?.idType ?? \"number\" as \"string\" | \"number\",\n entityLoaderToken,\n uiEntityLoaderToken,\n preload: options?.preload ?? entityLoaderToken !== null\n });\n\n for (const plugin of options?.plugins ?? []) {\n new plugin(injector, destroyRef, store);\n }\n\n return store;\n },\n deps: [Injector, DestroyRef]\n });\n } else {\n providers.push({\n provide: NICE_SELECTABLE_LISTS,\n useFactory: (injector: Injector, destroyRef: DestroyRef) => {\n const store = new NiceSelectableListStore(injector, {\n idProperty: options?.idProperty ?? \"id\" as keyof T,\n idType: options?.idType ?? \"number\" as \"string\" | \"number\",\n entityLoaderToken,\n uiEntityLoaderToken,\n preload: options?.preload ?? entityLoaderToken !== null\n });\n\n for (const plugin of options?.plugins ?? []) {\n new plugin(injector, destroyRef, store);\n }\n\n return {\n name,\n store\n };\n },\n deps: [Injector, DestroyRef],\n multi: true\n });\n }\n\n return providers;\n}\n\nexport type ResolveNiceSelectableListOptions = { injector: Injector };\n\nexport function resolveNiceSelectableList<T>(\n name: string,\n options?: ResolveNiceSelectableListOptions\n): NiceSelectableListStore<T>;\nexport function resolveNiceSelectableList<T>(options?: ResolveNiceSelectableListOptions): NiceSelectableListStore<T>;\nexport function resolveNiceSelectableList<T>(...args: unknown[]): NiceSelectableListStore<T> {\n const name: string | null = typeof args[0] === \"string\" ? args[0] : null;\n const options = (typeof args[0] === \"string\" ? args[1] : args[0]) as ResolveNiceSelectableListOptions | undefined;\n\n if (!name) {\n return (options?.injector\n ? options.injector.get(NICE_SELECTABLE_LIST)\n : inject(NICE_SELECTABLE_LIST)) as NiceSelectableListStore<T>;\n }\n\n const selectableLists = options?.injector\n ? options.injector.get(NICE_SELECTABLE_LISTS)\n : inject(NICE_SELECTABLE_LISTS);\n\n const provider = selectableLists.find((_provider) => _provider.name === name);\n if (!provider) {\n throw new Error(`No selectable list provider found for name: ${name}`);\n }\n\n return provider.store as NiceSelectableListStore<T>;\n}\n","import {\n computed,\n contentChildren,\n Directive,\n effect,\n forwardRef,\n inject,\n InjectionToken,\n Injector,\n input,\n signal,\n Signal, untracked\n} from \"@angular/core\";\nimport { NiceSelectableListEntityCheckboxDirective } from \"./entity-checkbox.directive\";\nimport { resolveNiceSelectableList } from \"./provider\";\nimport { NiceSelectableListStore } from \"./store\";\n\nexport const NICE_SELECTABLE_LIST_DIRECTIVE\n = new InjectionToken<NiceSelectableList<unknown>>(\"_selectable_list_directive\");\n\nexport type NiceSelectableList<T> = {\n name: Signal<string | null>;\n initialized: Signal<boolean>;\n allSelected: Signal<boolean>;\n checkboxes: Signal<readonly NiceSelectableListEntityCheckboxDirective<T>[]>;\n};\n\n@Directive({\n selector: \"[niceSelectableList]\",\n providers: [\n { provide: NICE_SELECTABLE_LIST_DIRECTIVE, useExisting: forwardRef(() => SelectableListDirective) }\n ]\n})\nexport class SelectableListDirective<T> implements NiceSelectableList<T> {\n public readonly name = input<string | null>(null, { alias: \"niceSelectableList\" });\n\n public readonly checkboxes = contentChildren<NiceSelectableListEntityCheckboxDirective<T>>(\n NiceSelectableListEntityCheckboxDirective,\n { descendants: true }\n );\n\n private readonly _initialized = signal(false);\n public readonly initialized = this._initialized.asReadonly();\n\n public readonly allSelected = computed(() => this.selectableLists.selectAllState().active);\n\n protected readonly injector = inject(Injector);\n\n protected selectableLists!: NiceSelectableListStore<T>;\n\n constructor() {\n effect(() => {\n const name = this.name();\n this.selectableLists = name\n ? resolveNiceSelectableList(name, { injector: this.injector })\n : resolveNiceSelectableList({ injector: this.injector });\n\n untracked(() => this.selectableLists.init());\n });\n }\n}\n","import { inject } from \"@angular/core\";\nimport { NICE_SELECTABLE_LIST, NICE_SELECTABLE_LISTS } from \"./provider\";\nimport { NICE_SELECTABLE_LIST_DIRECTIVE, NiceSelectableList } from \"./selectable-list\";\nimport { NiceSelectableListStore } from \"./store\";\n\nexport function injectNiceSelectableListDirective<T>(): NiceSelectableList<T> {\n return inject(NICE_SELECTABLE_LIST_DIRECTIVE, { optional: true }) as NiceSelectableList<T>;\n}\n\nexport function injectNiceSelectableList<T>(name?: string): NiceSelectableListStore<T> {\n const storeName = name ?? injectNiceSelectableListDirective()?.name();\n if (!storeName) {\n return inject(NICE_SELECTABLE_LIST) as NiceSelectableListStore<T>;\n }\n\n const selectableLists = inject(NICE_SELECTABLE_LISTS);\n const provider = selectableLists.find((_provider) => _provider.name === storeName);\n if (!provider) {\n throw new Error(`No selectable list provider found for name: ${storeName}`);\n }\n\n return provider.store as NiceSelectableListStore<T>;\n}\n","import {\n computed,\n DestroyRef,\n Directive,\n effect,\n inject,\n input,\n OnDestroy,\n OnInit\n} from \"@angular/core\";\nimport { takeUntilDestroyed } from \"@angular/core/rxjs-interop\";\nimport { MatCheckbox } from \"@angular/material/checkbox\";\nimport { injectNiceSelectableList } from \"./injector\";\n\n@Directive({\n selector: \"mat-checkbox[niceSelectableListEntityCheckbox]\"\n})\nexport class NiceSelectableListEntityCheckboxDirective<T> implements OnInit, OnDestroy {\n protected readonly matCheckbox = inject(MatCheckbox);\n protected readonly destroyRef = inject(DestroyRef);\n protected readonly niceSelectableList = injectNiceSelectableList<T>();\n\n public readonly selectableEntity = input.required<T>();\n public readonly isSelected = computed(() => this.niceSelectableList.isEntitySelected(this.selectableEntity())());\n\n constructor() {\n effect(() => {\n this.matCheckbox.disabled = this.niceSelectableList.selectAllState().active;\n });\n\n effect(() => {\n this.matCheckbox.checked = this.niceSelectableList.isEntitySelected(this.selectableEntity())();\n });\n }\n\n public ngOnInit(): void {\n this.niceSelectableList.registerCheckbox(this);\n\n this.matCheckbox.change.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(({ checked }) => {\n if (checked) {\n this.niceSelectableList.selectEntity(this.selectableEntity());\n } else {\n this.niceSelectableList.deselectEntity(this.selectableEntity());\n }\n });\n }\n\n public ngOnDestroy(): void {\n this.niceSelectableList.unregisterCheckbox(this);\n }\n\n public selectEntity(): void {\n this.matCheckbox.checked = true;\n this.matCheckbox.change.emit({ checked: true, source: this.matCheckbox });\n }\n\n public deselectEntity(): void {\n this.matCheckbox.checked = false;\n this.matCheckbox.change.emit({ checked: false, source: this.matCheckbox });\n }\n}\n","import { afterRenderEffect, DestroyRef, Directive, effect, inject, OnInit } from \"@angular/core\";\nimport { takeUntilDestroyed } from \"@angular/core/rxjs-interop\";\nimport { MatCheckbox } from \"@angular/material/checkbox\";\nimport { injectNiceSelectableList, injectNiceSelectableListDirective } from \"./injector\";\n\n@Directive({\n selector: \"mat-checkbox[niceSelectableListHeaderCheckbox]\"\n})\nexport class NiceSelectableListHeaderCheckboxDirective<T> implements OnInit {\n private readonly niceSelectableListDirective = injectNiceSelectableListDirective<T>();\n private readonly niceSelectableList = injectNiceSelectableList<T>();\n private readonly matCheckbox = inject(MatCheckbox);\n private readonly destroyRef = inject(DestroyRef);\n\n constructor() {\n effect(() => {\n this.matCheckbox.disabled = this.niceSelectableListDirective.allSelected();\n });\n\n afterRenderEffect({\n read: () => {\n const allSelected = this.niceSelectableListDirective.allSelected();\n if (allSelected) {\n this.matCheckbox.checked = true;\n return;\n }\n\n const checkboxes = this.niceSelectableListDirective.checkboxes();\n const empty = checkboxes.length === 0;\n\n this.matCheckbox.checked = !empty && checkboxes.every((checkbox) => checkbox.isSelected());\n this.matCheckbox.indeterminate = !this.matCheckbox.checked\n && checkboxes.some((checkbox) => checkbox.isSelected());\n }\n });\n }\n\n public ngOnInit(): void {\n this.matCheckbox.change.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(({ checked }) => {\n const entities = this.niceSelectableListDirective\n .checkboxes()\n .map((checkbox) => checkbox.selectableEntity());\n\n if (checked) {\n this.niceSelectableList.selectEntities(entities);\n } else {\n this.niceSelectableList.deselectEntities(entities);\n }\n });\n }\n}\n","import { DestroyRef, Injector } from \"@angular/core\";\nimport { NiceSelectableListStore } from \"../store\";\n\nexport abstract class NiceSelectableListPluginDefinition {\n constructor(\n protected readonly _injector: Injector,\n protected readonly _destroyRef: DestroyRef,\n protected readonly _store: NiceSelectableListStore<unknown>\n ) {\n this._store.registerPlugin(this);\n _destroyRef.onDestroy(() => this.cleanup());\n }\n\n public abstract init(): void;\n public abstract cleanup(): void;\n}\n","import { effect, EffectRef, signal } from \"@angular/core\";\nimport { ActivatedRoute, NavigationEnd, NavigationStart, Router } from \"@angular/router\";\nimport { from, Observable, of, Subject, Subscription } from \"rxjs\";\nimport { combineLatestWith, filter, map, startWith, switchMap, take } from \"rxjs/operators\";\nimport { NiceSelectableListPluginDefinition } from \"../plugin-definition\";\nimport { NiceSelectableListQueryParams } from \"./types/query-params.type\";\n\nexport class NiceSelectableQueryParamsPlugin extends NiceSelectableListPluginDefinition {\n private router!: Router;\n private route!: ActivatedRoute;\n\n private _storeChangesEffectRef!: EffectRef;\n private _writeQueryParamsSub!: Subscription;\n\n private _isNavigating$!: Observable<boolean>;\n\n private readonly _initialized = signal(false);\n private readonly _nextQueryParams = new Subject<NiceSelectableListQueryParams>();\n\n public override init(): void {\n this.router = this._injector.get(Router);\n this.route = this._injector.get(ActivatedRoute);\n\n this._isNavigating$ = this.router.events.pipe(\n filter((event) => event instanceof NavigationStart || event instanceof NavigationEnd),\n map((event) => event instanceof NavigationStart),\n startWith(!this.router.navigated)\n );\n\n this.listenOnQueryParams();\n this.listenOnStoreChanges();\n this.writeQueryParams();\n }\n\n public override cleanup(): void {\n this._storeChangesEffectRef.destroy();\n this._writeQueryParamsSub.unsubscribe();\n }\n\n private listenOnQueryParams(): void {\n if (this.router.navigated) {\n this.parseQueryParams(this.route.snapshot.queryParams);\n this._initialized.set(true);\n return;\n }\n\n this.router.events\n .pipe(\n filter((event) => event instanceof NavigationEnd),\n take(1)\n )\n .subscribe(() => {\n this.parseQueryParams(this.route.snapshot.queryParams);\n this._initialized.set(true);\n });\n }\n\n private listenOnStoreChanges(): void {\n this._storeChangesEffectRef = effect(() => {\n if (!this._initialized()) {\n return;\n }\n\n const entities = this._store.entitiesIds();\n const activeEntity = this._store.activeEntityId();\n const selectAllState = this._store.selectAllState();\n\n const params: NiceSelectableListQueryParams = {\n ...(selectAllState.active && {\n allSelected: true,\n ...(selectAllState.parameters && ({\n allSelectedParameters: JSON.stringify(selectAllState.parameters)\n }))\n }),\n selection: entities,\n selected: activeEntity\n };\n this._nextQueryParams.next(params);\n }, {\n injector: this._injector,\n manualCleanup: true\n });\n }\n\n private parseQueryParams(params: {\n allSelected?: boolean;\n allSelectedParameters?: string;\n selection?: string | string[];\n selected?: string;\n }): void {\n if (params.selection) {\n const selection = Array.isArray(params.selection)\n ? params.selection\n : [params.selection];\n\n this._store.setEntitiesFromSelections(selection);\n }\n\n if (params.selected) {\n this._store.setActiveFromSelected(params.selected);\n }\n\n if (params.allSelected) {\n this._store.setSelectAllState({\n active: true,\n total: this._store.total(),\n parameters: params.allSelectedParameters\n ? JSON.parse(params.allSelectedParameters)\n : null\n });\n }\n }\n\n private writeQueryParams(): void {\n this._writeQueryParamsSub = this._nextQueryParams.pipe(\n combineLatestWith(this._isNavigating$),\n switchMap(([params, isNavigating]) => {\n if (isNavigating) {\n return of(false);\n }\n\n return from(this.router.navigate([], { queryParams: params, onSameUrlNavigation: \"ignore\" }));\n })\n ).subscribe();\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["map"],"mappings":"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"}
package/package.json CHANGED
@@ -1,24 +1,24 @@
1
1
  {
2
2
  "name": "@recursyve/nice-selectable-list",
3
- "version": "20.0.0-beta.3",
3
+ "version": "21.0.0",
4
4
  "peerDependencies": {
5
- "@angular/common": "^20.2.0",
6
- "@angular/cdk": "^20.2.0",
7
- "@angular/core": "^20.2.0",
8
- "@angular/material": "^20.2.0"
5
+ "@angular/common": "^21.0.0",
6
+ "@angular/cdk": "^21.0.0",
7
+ "@angular/core": "^21.0.0",
8
+ "@angular/material": "^21.0.0"
9
9
  },
10
10
  "dependencies": {
11
11
  "tslib": "^2.3.0"
12
12
  },
13
13
  "sideEffects": false,
14
14
  "module": "fesm2022/recursyve-nice-selectable-list.mjs",
15
- "typings": "index.d.ts",
15
+ "typings": "types/recursyve-nice-selectable-list.d.ts",
16
16
  "exports": {
17
17
  "./package.json": {
18
18
  "default": "./package.json"
19
19
  },
20
20
  ".": {
21
- "types": "./index.d.ts",
21
+ "types": "./types/recursyve-nice-selectable-list.d.ts",
22
22
  "default": "./fesm2022/recursyve-nice-selectable-list.mjs"
23
23
  }
24
24
  }
@@ -1,8 +1,8 @@
1
1
  import * as i0 from '@angular/core';
2
- import { OnInit, OnDestroy, DestroyRef, Signal, InjectionToken, Injector, FactoryProvider } from '@angular/core';
2
+ import { OnInit, OnDestroy, DestroyRef, Injector, Signal, ResourceRef, InjectionToken, Type, Provider } from '@angular/core';
3
3
  import * as _recursyve_nice_selectable_list from '@recursyve/nice-selectable-list';
4
4
  import { MatCheckbox } from '@angular/material/checkbox';
5
- import { ActivatedRoute, Router } from '@angular/router';
5
+ import { Observable } from 'rxjs';
6
6
 
7
7
  declare class NiceSelectableListEntityCheckboxDirective<T> implements OnInit, OnDestroy {
8
8
  protected readonly matCheckbox: MatCheckbox;
@@ -21,6 +21,7 @@ declare class NiceSelectableListEntityCheckboxDirective<T> implements OnInit, On
21
21
 
22
22
  declare class NiceSelectableListHeaderCheckboxDirective<T> implements OnInit {
23
23
  private readonly niceSelectableListDirective;
24
+ private readonly niceSelectableList;
24
25
  private readonly matCheckbox;
25
26
  private readonly destroyRef;
26
27
  constructor();
@@ -29,32 +30,73 @@ declare class NiceSelectableListHeaderCheckboxDirective<T> implements OnInit {
29
30
  static ɵdir: i0.ɵɵDirectiveDeclaration<NiceSelectableListHeaderCheckboxDirective<any>, "mat-checkbox[niceSelectableListHeaderCheckbox]", never, {}, {}, never, never, true, never>;
30
31
  }
31
32
 
33
+ declare abstract class NiceSelectableListPluginDefinition {
34
+ protected readonly _injector: Injector;
35
+ protected readonly _destroyRef: DestroyRef;
36
+ protected readonly _store: NiceSelectableListStore<unknown>;
37
+ constructor(_injector: Injector, _destroyRef: DestroyRef, _store: NiceSelectableListStore<unknown>);
38
+ abstract init(): void;
39
+ abstract cleanup(): void;
40
+ }
41
+
42
+ type NiceSelectableListEntityLoader<T, TParameters = object, TID = number> = {
43
+ loadEntitiesByIds: (ids: TID[]) => Observable<T[]>;
44
+ loadIdsFromParameters: (parameters: TParameters) => Observable<TID[]>;
45
+ };
46
+
47
+ type NiceSelectableListUIEntityLoader<T, TID = number> = {
48
+ loadById: (ids: TID) => Observable<T>;
49
+ };
50
+
32
51
  type NiceSelectableListConfig<T> = {
33
52
  idProperty: keyof T;
34
53
  idType?: "string" | "number";
54
+ entityLoaderToken: InjectionToken<NiceSelectableListEntityLoader<T>> | null;
55
+ uiEntityLoaderToken: InjectionToken<NiceSelectableListUIEntityLoader<T>> | null;
56
+ preload?: boolean;
35
57
  };
36
58
  type NiceSelectableListEntity<T> = {
37
59
  id: string | number;
38
- entity: T | null;
60
+ entity: ResourceRef<T | undefined> | null;
61
+ ui: ResourceRef<T | undefined> | null;
62
+ };
63
+ type NiceSelectableListSelectAllState = {
64
+ active: boolean;
65
+ total: number | null;
66
+ parameters: object | null;
39
67
  };
40
68
  declare class NiceSelectableListStore<T> {
69
+ private readonly _injector;
41
70
  private readonly _config;
42
- private readonly _entities;
71
+ private readonly _plugins;
72
+ private _entityLoader;
73
+ private _uiEntityLoader;
74
+ private readonly _cache;
75
+ private readonly _entitiesMap;
43
76
  private readonly _activeEntity;
44
77
  private readonly _checkboxes;
78
+ private readonly _selectAllState;
79
+ private _lastWindowIds;
80
+ private _currentWindowIds;
45
81
  readonly entities: Signal<NiceSelectableListEntity<T>[]>;
46
82
  readonly activeEntity: Signal<NiceSelectableListEntity<T> | null>;
47
83
  readonly total: Signal<number>;
48
84
  readonly entitiesIds: Signal<(string | number)[]>;
49
85
  readonly activeEntityId: Signal<string | number | null>;
50
- constructor(_config: NiceSelectableListConfig<T>);
86
+ readonly selectAllState: Signal<NiceSelectableListSelectAllState>;
87
+ constructor(_injector: Injector, _config: NiceSelectableListConfig<T>);
88
+ init(): void;
89
+ registerPlugin(plugin: NiceSelectableListPluginDefinition): void;
51
90
  registerCheckbox(checkbox: NiceSelectableListEntityCheckboxDirective<T>): void;
52
91
  unregisterCheckbox(checkbox: NiceSelectableListEntityCheckboxDirective<T>): void;
53
92
  isEntitySelected(entity: T): Signal<boolean>;
54
93
  setEntitiesFromSelections(selections: string[]): void;
55
94
  selectEntity(entity: T): void;
95
+ selectEntities(entities: T[]): void;
56
96
  deselectEntity(entity: T): void;
97
+ deselectEntities(entities: T[]): void;
57
98
  clear(): void;
99
+ setSelectAllState(state: NiceSelectableListSelectAllState): void;
58
100
  setActiveFromSelected(selected: string): void;
59
101
  setActiveEntity(entity: T | null): void;
60
102
  selectFirstEntity(): void;
@@ -63,29 +105,50 @@ declare class NiceSelectableListStore<T> {
63
105
  selectLastEntity(): void;
64
106
  private _isEntitySelected;
65
107
  private _resolveEntityId;
108
+ private _processCacheFromEntities;
109
+ private _createEntityResource;
110
+ private _createUIResource;
111
+ private _computeWindowIds;
112
+ private _ensureResourcesForIds;
113
+ private _updateWindowForActive;
114
+ private _setActiveEntity;
115
+ _preloadSelectAllValues(): void;
66
116
  }
67
117
 
68
118
  declare const NICE_SELECTABLE_LIST_DIRECTIVE: InjectionToken<NiceSelectableList<unknown>>;
69
119
  type NiceSelectableList<T> = {
70
120
  name: Signal<string | null>;
121
+ initialized: Signal<boolean>;
122
+ allSelected: Signal<boolean>;
71
123
  checkboxes: Signal<readonly NiceSelectableListEntityCheckboxDirective<T>[]>;
72
124
  };
73
- declare class SelectableListDirective<T> implements NiceSelectableList<T>, OnInit {
125
+ declare class SelectableListDirective<T> implements NiceSelectableList<T> {
74
126
  readonly name: i0.InputSignal<string | null>;
75
- readonly enableQueryParams: i0.InputSignal<boolean>;
76
127
  readonly checkboxes: Signal<readonly NiceSelectableListEntityCheckboxDirective<T>[]>;
77
128
  private readonly _initialized;
78
129
  readonly initialized: Signal<boolean>;
79
- protected readonly route: ActivatedRoute;
80
- protected readonly router: Router;
130
+ readonly allSelected: Signal<boolean>;
81
131
  protected readonly injector: Injector;
82
132
  protected selectableLists: NiceSelectableListStore<T>;
83
133
  constructor();
84
- ngOnInit(): void;
85
- private loadQueryParams;
86
- private parseQueryParams;
87
134
  static ɵfac: i0.ɵɵFactoryDeclaration<SelectableListDirective<any>, never>;
88
- static ɵdir: i0.ɵɵDirectiveDeclaration<SelectableListDirective<any>, "[niceSelectableList]", never, { "name": { "alias": "niceSelectableList"; "required": false; "isSignal": true; }; "enableQueryParams": { "alias": "enableQueryParams"; "required": false; "isSignal": true; }; }, {}, ["checkboxes"], never, true, never>;
135
+ static ɵdir: i0.ɵɵDirectiveDeclaration<SelectableListDirective<any>, "[niceSelectableList]", never, { "name": { "alias": "niceSelectableList"; "required": false; "isSignal": true; }; }, {}, ["checkboxes"], never, true, never>;
136
+ }
137
+
138
+ declare class NiceSelectableQueryParamsPlugin extends NiceSelectableListPluginDefinition {
139
+ private router;
140
+ private route;
141
+ private _storeChangesEffectRef;
142
+ private _writeQueryParamsSub;
143
+ private _isNavigating$;
144
+ private readonly _initialized;
145
+ private readonly _nextQueryParams;
146
+ init(): void;
147
+ cleanup(): void;
148
+ private listenOnQueryParams;
149
+ private listenOnStoreChanges;
150
+ private parseQueryParams;
151
+ private writeQueryParams;
89
152
  }
90
153
 
91
154
  declare function injectNiceSelectableListDirective<T>(): NiceSelectableList<T>;
@@ -97,13 +160,20 @@ type NiceSelectableListProvider<T> = {
97
160
  name: string;
98
161
  store: NiceSelectableListStore<T>;
99
162
  };
100
- declare function provideNiceSelectableList<T>(config?: NiceSelectableListConfig<T>): FactoryProvider;
101
- declare function provideNiceSelectableList<T>(name: string, config?: NiceSelectableListConfig<T>): FactoryProvider;
163
+ type NiceSelectableListOptions<T> = {
164
+ entityLoader?: Type<NiceSelectableListEntityLoader<T>>;
165
+ } & {
166
+ uiEntityLoader?: Type<NiceSelectableListUIEntityLoader<T>>;
167
+ } & {
168
+ plugins?: Type<NiceSelectableListPluginDefinition>[];
169
+ } & Omit<NiceSelectableListConfig<T>, "entityLoaderToken" | "uiEntityLoaderToken">;
170
+ declare function provideNiceSelectableList<T>(options?: NiceSelectableListOptions<T>): Provider[];
171
+ declare function provideNiceSelectableList<T>(name: string, options?: NiceSelectableListOptions<T>): Provider[];
102
172
  type ResolveNiceSelectableListOptions = {
103
173
  injector: Injector;
104
174
  };
105
175
  declare function resolveNiceSelectableList<T>(name: string, options?: ResolveNiceSelectableListOptions): NiceSelectableListStore<T>;
106
176
  declare function resolveNiceSelectableList<T>(options?: ResolveNiceSelectableListOptions): NiceSelectableListStore<T>;
107
177
 
108
- export { NICE_SELECTABLE_LIST, NICE_SELECTABLE_LISTS, NICE_SELECTABLE_LIST_DIRECTIVE, NiceSelectableListEntityCheckboxDirective, NiceSelectableListHeaderCheckboxDirective, NiceSelectableListStore, SelectableListDirective, injectNiceSelectableList, injectNiceSelectableListDirective, provideNiceSelectableList, resolveNiceSelectableList };
109
- export type { NiceSelectableList, NiceSelectableListConfig, NiceSelectableListEntity, NiceSelectableListProvider, ResolveNiceSelectableListOptions };
178
+ export { NICE_SELECTABLE_LIST, NICE_SELECTABLE_LISTS, NICE_SELECTABLE_LIST_DIRECTIVE, NiceSelectableListEntityCheckboxDirective, NiceSelectableListHeaderCheckboxDirective, NiceSelectableListPluginDefinition, NiceSelectableListStore, NiceSelectableQueryParamsPlugin, SelectableListDirective, injectNiceSelectableList, injectNiceSelectableListDirective, provideNiceSelectableList, resolveNiceSelectableList };
179
+ export type { NiceSelectableList, NiceSelectableListConfig, NiceSelectableListEntity, NiceSelectableListEntityLoader, NiceSelectableListOptions, NiceSelectableListProvider, NiceSelectableListSelectAllState, NiceSelectableListUIEntityLoader, ResolveNiceSelectableListOptions };