@lucca-front/ng 22.0.3 → 22.1.0-rc.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.
Files changed (70) hide show
  1. package/README.md +0 -1
  2. package/fesm2022/lucca-front-ng-activity-feed.mjs +2 -2
  3. package/fesm2022/lucca-front-ng-activity-feed.mjs.map +1 -1
  4. package/fesm2022/lucca-front-ng-approbation-inbox.mjs +1 -1
  5. package/fesm2022/lucca-front-ng-approbation-inbox.mjs.map +1 -1
  6. package/fesm2022/lucca-front-ng-bubble-icon.mjs +2 -2
  7. package/fesm2022/lucca-front-ng-bubble-icon.mjs.map +1 -1
  8. package/fesm2022/lucca-front-ng-callout.mjs +2 -2
  9. package/fesm2022/lucca-front-ng-callout.mjs.map +1 -1
  10. package/fesm2022/lucca-front-ng-core-select-api.mjs +0 -9
  11. package/fesm2022/lucca-front-ng-core-select-api.mjs.map +1 -1
  12. package/fesm2022/lucca-front-ng-core-select-establishment.mjs +9 -32
  13. package/fesm2022/lucca-front-ng-core-select-establishment.mjs.map +1 -1
  14. package/fesm2022/lucca-front-ng-core-select-job-qualification.mjs +0 -11
  15. package/fesm2022/lucca-front-ng-core-select-job-qualification.mjs.map +1 -1
  16. package/fesm2022/lucca-front-ng-core-select-user.mjs +5 -10
  17. package/fesm2022/lucca-front-ng-core-select-user.mjs.map +1 -1
  18. package/fesm2022/lucca-front-ng-core-select.mjs +29 -65
  19. package/fesm2022/lucca-front-ng-core-select.mjs.map +1 -1
  20. package/fesm2022/lucca-front-ng-core.mjs +5 -1
  21. package/fesm2022/lucca-front-ng-core.mjs.map +1 -1
  22. package/fesm2022/lucca-front-ng-data-table.mjs +5 -8
  23. package/fesm2022/lucca-front-ng-data-table.mjs.map +1 -1
  24. package/fesm2022/lucca-front-ng-date2.mjs +41 -9
  25. package/fesm2022/lucca-front-ng-date2.mjs.map +1 -1
  26. package/fesm2022/lucca-front-ng-dialog.mjs +4 -9
  27. package/fesm2022/lucca-front-ng-dialog.mjs.map +1 -1
  28. package/fesm2022/lucca-front-ng-dropdown.mjs +0 -3
  29. package/fesm2022/lucca-front-ng-dropdown.mjs.map +1 -1
  30. package/fesm2022/lucca-front-ng-filter-pills.mjs +0 -27
  31. package/fesm2022/lucca-front-ng-filter-pills.mjs.map +1 -1
  32. package/fesm2022/lucca-front-ng-form-label.mjs +1 -1
  33. package/fesm2022/lucca-front-ng-form-label.mjs.map +1 -1
  34. package/fesm2022/lucca-front-ng-forms-rich-text-input-formatters-plain-text.mjs +2 -5
  35. package/fesm2022/lucca-front-ng-forms-rich-text-input-formatters-plain-text.mjs.map +1 -1
  36. package/fesm2022/lucca-front-ng-forms-rich-text-input.mjs +24 -56
  37. package/fesm2022/lucca-front-ng-forms-rich-text-input.mjs.map +1 -1
  38. package/fesm2022/lucca-front-ng-index-table.mjs +2 -2
  39. package/fesm2022/lucca-front-ng-index-table.mjs.map +1 -1
  40. package/fesm2022/lucca-front-ng-modal.mjs +2 -7
  41. package/fesm2022/lucca-front-ng-modal.mjs.map +1 -1
  42. package/fesm2022/lucca-front-ng-multi-select.mjs +3 -3
  43. package/fesm2022/lucca-front-ng-multi-select.mjs.map +1 -1
  44. package/fesm2022/lucca-front-ng-popover2.mjs +2 -2
  45. package/fesm2022/lucca-front-ng-popover2.mjs.map +1 -1
  46. package/fesm2022/lucca-front-ng-resource-card.mjs +2 -2
  47. package/fesm2022/lucca-front-ng-resource-card.mjs.map +1 -1
  48. package/fesm2022/lucca-front-ng-safe-content.mjs +3 -40
  49. package/fesm2022/lucca-front-ng-safe-content.mjs.map +1 -1
  50. package/package.json +4 -4
  51. package/schematics/collection.json +0 -5
  52. package/schematics/deprecated-resolver/index.js +4 -1
  53. package/schematics/lib/angular-component-ast.js +1 -3
  54. package/schematics/lib/deprecated-mapper.js +10 -2
  55. package/schematics/lib/html-ast.js +0 -26
  56. package/src/components/_listbox.scss +6 -12
  57. package/types/lucca-front-ng-core-select-api.d.ts +0 -11
  58. package/types/lucca-front-ng-core-select-establishment.d.ts +0 -7
  59. package/types/lucca-front-ng-core-select-job-qualification.d.ts +0 -8
  60. package/types/lucca-front-ng-core-select-user.d.ts +0 -6
  61. package/types/lucca-front-ng-core-select.d.ts +0 -13
  62. package/types/lucca-front-ng-core.d.ts +3 -1
  63. package/types/lucca-front-ng-data-table.d.ts +1 -3
  64. package/types/lucca-front-ng-date2.d.ts +6 -2
  65. package/types/lucca-front-ng-forms-rich-text-input.d.ts +2 -3
  66. package/types/lucca-front-ng-safe-content.d.ts +2 -8
  67. package/schematics/file-upload/index.js +0 -22
  68. package/schematics/file-upload/migration.js +0 -230
  69. package/schematics/file-upload/migration.spec.js +0 -56
  70. package/schematics/file-upload/schema.json +0 -23
@@ -59,39 +59,22 @@ class LuCoreSelectEstablishmentsDirective extends ALuCoreSelectApiDirective {
59
59
  this.searchDelimiter = input(' ', /* @ts-ignore */
60
60
  ...(ngDevMode ? [{ debugName: "searchDelimiter" }] : /* istanbul ignore next */ []));
61
61
  this.clue = toSignal(this.clue$);
62
- /**
63
- * Params shared by every call: the restrictions that define which establishments are selectable,
64
- * without the clue-dependent search and sort.
65
- */
66
- this.#restrictionParams = computed(() => {
62
+ this.paramsSignal = computed(() => {
67
63
  const operationIds = this.operationIds();
68
64
  const uniqueOperationIds = this.uniqueOperationIds();
69
65
  const appInstanceId = this.appInstanceId();
70
- return {
71
- ...this.filters(),
72
- ...(operationIds ? { operations: operationIds.join(',') } : {}),
73
- ...(uniqueOperationIds ? { uniqueOperations: uniqueOperationIds.join(',') } : {}),
74
- ...(appInstanceId ? { appInstanceId } : {}),
75
- };
76
- }, /* @ts-ignore */
77
- ...(ngDevMode ? [{ debugName: "#restrictionParams" }] : /* istanbul ignore next */ []));
78
- /**
79
- * Establishments are grouped by legal unit, but the panel only knows the options of the pages it
80
- * already loaded: a legal unit spanning several pages would be partially selected. Fetch the whole
81
- * legal unit instead, page by page, so "select all" covers the options that are not rendered yet.
82
- * Groups are only displayed when the clue is empty, hence the clue-less params.
83
- */
84
- this.getGroupOptions = (legalUnitId) => this.#getLegalUnitOptions(legalUnitId, 0);
85
- this.paramsSignal = computed(() => {
86
66
  const clue = this.clue();
87
67
  const searchDelimiter = this.searchDelimiter();
88
68
  return {
89
- ...this.#restrictionParams(),
69
+ ...this.filters(),
90
70
  ...(clue
91
71
  ? // When the clue is not empty, sort establishments by name
92
72
  { search: applySearchDelimiter(clue, searchDelimiter), sort: 'name' }
93
73
  : // When the clue is empty, establishments are grouped by legal unit, so sort them by legal unit name and then by name
94
74
  { sort: 'legalunit.name,name' }),
75
+ ...(operationIds ? { operations: operationIds.join(',') } : {}),
76
+ ...(uniqueOperationIds ? { uniqueOperations: uniqueOperationIds.join(',') } : {}),
77
+ ...(appInstanceId ? { appInstanceId } : {}),
95
78
  };
96
79
  }, /* @ts-ignore */
97
80
  ...(ngDevMode ? [{ debugName: "paramsSignal" }] : /* istanbul ignore next */ []));
@@ -118,23 +101,17 @@ class LuCoreSelectEstablishmentsDirective extends ALuCoreSelectApiDirective {
118
101
  });
119
102
  });
120
103
  }
121
- /**
122
- * Params shared by every call: the restrictions that define which establishments are selectable,
123
- * without the clue-dependent search and sort.
124
- */
125
- #restrictionParams;
126
104
  buildParamsFromClue(clue) {
127
105
  // Use the clue parameter directly instead of reading from the async signal
128
106
  // to avoid stale params when selection triggers an immediate clue reset
129
107
  return of({
130
- ...this.#restrictionParams(),
108
+ ...this.filters(),
131
109
  ...(clue ? { search: applySearchDelimiter(clue, this.searchDelimiter()), sort: 'name' } : { sort: 'legalunit.name,name' }),
110
+ ...(this.operationIds() ? { operations: this.operationIds().join(',') } : {}),
111
+ ...(this.uniqueOperationIds() ? { uniqueOperations: this.uniqueOperationIds().join(',') } : {}),
112
+ ...(this.appInstanceId() ? { appInstanceId: this.appInstanceId() } : {}),
132
113
  });
133
114
  }
134
- #getLegalUnitOptions(legalUnitId, page) {
135
- const params = { ...this.#restrictionParams(), legalUnitId, sort: 'name' };
136
- return this.getOptions(params, page).pipe(switchMap((options) => (options.length < this.pageSize ? of(options) : this.#getLegalUnitOptions(legalUnitId, page + 1).pipe(map((nextOptions) => [...options, ...nextOptions])))));
137
- }
138
115
  getOptions(params, page) {
139
116
  const options$ = this.httpClient
140
117
  .get(this.url(), {
@@ -1 +1 @@
1
- {"version":3,"file":"lucca-front-ng-core-select-establishment.mjs","sources":["../../../packages/ng/core-select/establishment/establishment-grouping.service.ts","../../../packages/ng/core-select/establishment/establishment-grouping.component.ts","../../../packages/ng/core-select/establishment/establishments.directive.ts","../../../packages/ng/core-select/establishment/lucca-front-ng-core-select-establishment.ts"],"sourcesContent":["import { HttpClient, HttpParams } from '@angular/common/http';\nimport { Injectable, inject } from '@angular/core';\nimport { combineLatest, map, shareReplay } from 'rxjs';\n\n@Injectable({ providedIn: 'root' })\nexport class EstablishmentGroupingService {\n\tprotected http = inject(HttpClient);\n\tprotected establishmentsUrl = '/organization/structure/api/establishments';\n\tprotected legalUnitsUrl = '/organization/structure/api/legal-units';\n\n\tprotected countParams: HttpParams = new HttpParams().set('fields.root', 'count').set('limit', 0);\n\tprotected readonly establishmentsCount$ = this.http.get<{ count: number }>(this.establishmentsUrl, { params: this.countParams }).pipe(map((res) => res.count));\n\tprotected readonly legalUnitsCount$ = this.http.get<{ count: number }>(this.legalUnitsUrl, { params: this.countParams }).pipe(map((res) => res.count));\n\n\tpublic readonly useGrouping$ = combineLatest([this.legalUnitsCount$, this.establishmentsCount$]).pipe(\n\t\tmap(([luCount, establishmentCount]) => luCount > 1 && establishmentCount > 1),\n\t\tshareReplay(),\n\t);\n}\n","import { ChangeDetectionStrategy, Component, inject } from '@angular/core';\nimport { PORTAL_CONTEXT } from '@lucca-front/ng/core';\nimport { LuOptionGroupByContext } from '@lucca-front/ng/core-select';\nimport { LuCoreSelectEstablishment } from './models';\n\n@Component({\n\tselector: 'lu-establishment-grouping',\n\ttemplate: `{{ group.options[0].legalUnit.name }}`,\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class LuEstablishmentGroupingComponent {\n\tgroup = inject<LuOptionGroupByContext<LuCoreSelectEstablishment, number>>(PORTAL_CONTEXT).$implicit;\n}\n","import { HttpClient } from '@angular/common/http';\nimport { DestroyRef, Directive, OnInit, computed, forwardRef, inject, input } from '@angular/core';\nimport { takeUntilDestroyed, toObservable, toSignal } from '@angular/core/rxjs-interop';\nimport { luNullableNumberAttribute } from '@lucca-front/ng/core';\nimport { CORE_SELECT_API_TOTAL_COUNT_PROVIDER, CoreSelectApiTotalCountProvider, applySearchDelimiter } from '@lucca-front/ng/core-select';\nimport { ALuCoreSelectApiDirective } from '@lucca-front/ng/core-select/api';\nimport { Observable, debounceTime, filter, map, of, switchMap } from 'rxjs';\nimport { LuEstablishmentGroupingComponent } from './establishment-grouping.component';\nimport { EstablishmentGroupingService } from './establishment-grouping.service';\nimport { LuCoreSelectEstablishment } from './models';\n\n@Directive({\n\t// The attribute is already prefixed with \"lu-simple-select\" / \"lu-multi-select\"\n\t// eslint-disable-next-line @angular-eslint/directive-selector\n\tselector: 'lu-simple-select[establishments],lu-multi-select[establishments]',\n\texportAs: 'luEstablishments',\n\tproviders: [\n\t\t{\n\t\t\tprovide: CORE_SELECT_API_TOTAL_COUNT_PROVIDER,\n\t\t\tuseExisting: forwardRef(() => LuCoreSelectEstablishmentsDirective),\n\t\t},\n\t],\n})\nexport class LuCoreSelectEstablishmentsDirective<T extends LuCoreSelectEstablishment = LuCoreSelectEstablishment>\n\textends ALuCoreSelectApiDirective<T>\n\timplements OnInit, CoreSelectApiTotalCountProvider\n{\n\t#groupingService = inject(EstablishmentGroupingService);\n\t#destroyRef = inject(DestroyRef);\n\n\tprotected httpClient = inject(HttpClient);\n\n\treadonly url = input<string>('/organization/structure/api/establishments');\n\treadonly filters = input<Record<string, string | number | boolean> | null>(null);\n\treadonly operationIds = input<readonly number[] | null>(null);\n\treadonly uniqueOperationIds = input<readonly number[] | null>(null);\n\treadonly appInstanceId = input(null, { transform: luNullableNumberAttribute });\n\treadonly searchDelimiter = input<string>(' ');\n\n\tprotected readonly clue = toSignal(this.clue$);\n\n\tpublic override ngOnInit(): void {\n\t\tsuper.ngOnInit();\n\t\tthis.initGrouping();\n\t}\n\n\tprotected initGrouping() {\n\t\tthis.#groupingService.useGrouping$.pipe(filter(Boolean), takeUntilDestroyed(this.#destroyRef)).subscribe(() => {\n\t\t\tthis.select.groupingSignal.set({\n\t\t\t\tselector: (option) => option.legalUnitId,\n\t\t\t\tcontent: LuEstablishmentGroupingComponent,\n\t\t\t});\n\t\t});\n\t}\n\n\t/**\n\t * Params shared by every call: the restrictions that define which establishments are selectable,\n\t * without the clue-dependent search and sort.\n\t */\n\treadonly #restrictionParams = computed<Record<string, string | number | boolean>>(() => {\n\t\tconst operationIds = this.operationIds();\n\t\tconst uniqueOperationIds = this.uniqueOperationIds();\n\t\tconst appInstanceId = this.appInstanceId();\n\t\treturn {\n\t\t\t...this.filters(),\n\t\t\t...(operationIds ? { operations: operationIds.join(',') } : {}),\n\t\t\t...(uniqueOperationIds ? { uniqueOperations: uniqueOperationIds.join(',') } : {}),\n\t\t\t...(appInstanceId ? { appInstanceId } : {}),\n\t\t};\n\t});\n\n\tprotected override buildParamsFromClue(clue: string): Observable<Record<string, string | number | boolean>> {\n\t\t// Use the clue parameter directly instead of reading from the async signal\n\t\t// to avoid stale params when selection triggers an immediate clue reset\n\t\treturn of({\n\t\t\t...this.#restrictionParams(),\n\t\t\t...(clue ? { search: applySearchDelimiter(clue, this.searchDelimiter()), sort: 'name' } : { sort: 'legalunit.name,name' }),\n\t\t});\n\t}\n\n\t/**\n\t * Establishments are grouped by legal unit, but the panel only knows the options of the pages it\n\t * already loaded: a legal unit spanning several pages would be partially selected. Fetch the whole\n\t * legal unit instead, page by page, so \"select all\" covers the options that are not rendered yet.\n\t * Groups are only displayed when the clue is empty, hence the clue-less params.\n\t */\n\tprotected override getGroupOptions = (legalUnitId: unknown): Observable<T[]> => this.#getLegalUnitOptions(legalUnitId as number, 0);\n\n\t#getLegalUnitOptions(legalUnitId: number, page: number): Observable<T[]> {\n\t\tconst params = { ...this.#restrictionParams(), legalUnitId, sort: 'name' };\n\t\treturn this.getOptions(params, page).pipe(\n\t\t\tswitchMap((options) => (options.length < this.pageSize ? of(options) : this.#getLegalUnitOptions(legalUnitId, page + 1).pipe(map((nextOptions) => [...options, ...nextOptions])))),\n\t\t);\n\t}\n\n\tprotected override getOptions(params: Record<string, string | number | boolean> | null, page: number): Observable<T[]> {\n\t\tconst options$ = this.httpClient\n\t\t\t.get<T[] | { items: T[] }>(this.url(), {\n\t\t\t\tparams: {\n\t\t\t\t\t...params,\n\t\t\t\t\tpage: page + 1,\n\t\t\t\t\tlimit: this.pageSize,\n\t\t\t\t},\n\t\t\t})\n\t\t\t.pipe(map((res) => (Array.isArray(res) ? res : res?.items) ?? []));\n\n\t\treturn this.#groupingService.useGrouping$.pipe(switchMap(() => options$));\n\t}\n\n\tprotected override readonly paramsSignal = computed<Record<string, string | number | boolean>>(() => {\n\t\tconst clue = this.clue();\n\t\tconst searchDelimiter = this.searchDelimiter();\n\t\treturn {\n\t\t\t...this.#restrictionParams(),\n\t\t\t...(clue\n\t\t\t\t? // When the clue is not empty, sort establishments by name\n\t\t\t\t\t{ search: applySearchDelimiter(clue, searchDelimiter), sort: 'name' }\n\t\t\t\t: // When the clue is empty, establishments are grouped by legal unit, so sort them by legal unit name and then by name\n\t\t\t\t\t{ sort: 'legalunit.name,name' }),\n\t\t};\n\t});\n\tprotected override readonly params$: Observable<Record<string, string | number | boolean>> = toObservable(this.paramsSignal);\n\n\tpublic readonly totalCount$ = toObservable(computed(() => ({ url: this.url(), filters: this.filters() }))).pipe(\n\t\tdebounceTime(250),\n\t\tswitchMap(({ url, filters }) =>\n\t\t\tthis.httpClient.get<{ count: number }>(url, {\n\t\t\t\tparams: {\n\t\t\t\t\t...filters,\n\t\t\t\t\t['fields.root']: 'count',\n\t\t\t\t},\n\t\t\t}),\n\t\t),\n\t\tmap((res) => res?.count ?? 0),\n\t);\n\n\tprotected override optionKey = (option: T) => option.id;\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"lucca-front-ng-core-select-establishment.mjs","sources":["../../../packages/ng/core-select/establishment/establishment-grouping.service.ts","../../../packages/ng/core-select/establishment/establishment-grouping.component.ts","../../../packages/ng/core-select/establishment/establishments.directive.ts","../../../packages/ng/core-select/establishment/lucca-front-ng-core-select-establishment.ts"],"sourcesContent":["import { HttpClient, HttpParams } from '@angular/common/http';\nimport { Injectable, inject } from '@angular/core';\nimport { combineLatest, map, shareReplay } from 'rxjs';\n\n@Injectable({ providedIn: 'root' })\nexport class EstablishmentGroupingService {\n\tprotected http = inject(HttpClient);\n\tprotected establishmentsUrl = '/organization/structure/api/establishments';\n\tprotected legalUnitsUrl = '/organization/structure/api/legal-units';\n\n\tprotected countParams: HttpParams = new HttpParams().set('fields.root', 'count').set('limit', 0);\n\tprotected readonly establishmentsCount$ = this.http.get<{ count: number }>(this.establishmentsUrl, { params: this.countParams }).pipe(map((res) => res.count));\n\tprotected readonly legalUnitsCount$ = this.http.get<{ count: number }>(this.legalUnitsUrl, { params: this.countParams }).pipe(map((res) => res.count));\n\n\tpublic readonly useGrouping$ = combineLatest([this.legalUnitsCount$, this.establishmentsCount$]).pipe(\n\t\tmap(([luCount, establishmentCount]) => luCount > 1 && establishmentCount > 1),\n\t\tshareReplay(),\n\t);\n}\n","import { ChangeDetectionStrategy, Component, inject } from '@angular/core';\nimport { PORTAL_CONTEXT } from '@lucca-front/ng/core';\nimport { LuOptionGroupByContext } from '@lucca-front/ng/core-select';\nimport { LuCoreSelectEstablishment } from './models';\n\n@Component({\n\tselector: 'lu-establishment-grouping',\n\ttemplate: `{{ group.options[0].legalUnit.name }}`,\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class LuEstablishmentGroupingComponent {\n\tgroup = inject<LuOptionGroupByContext<LuCoreSelectEstablishment, number>>(PORTAL_CONTEXT).$implicit;\n}\n","import { HttpClient } from '@angular/common/http';\nimport { DestroyRef, Directive, OnInit, computed, forwardRef, inject, input } from '@angular/core';\nimport { takeUntilDestroyed, toObservable, toSignal } from '@angular/core/rxjs-interop';\nimport { luNullableNumberAttribute } from '@lucca-front/ng/core';\nimport { CORE_SELECT_API_TOTAL_COUNT_PROVIDER, CoreSelectApiTotalCountProvider, applySearchDelimiter } from '@lucca-front/ng/core-select';\nimport { ALuCoreSelectApiDirective } from '@lucca-front/ng/core-select/api';\nimport { Observable, debounceTime, filter, map, of, switchMap } from 'rxjs';\nimport { LuEstablishmentGroupingComponent } from './establishment-grouping.component';\nimport { EstablishmentGroupingService } from './establishment-grouping.service';\nimport { LuCoreSelectEstablishment } from './models';\n\n@Directive({\n\t// The attribute is already prefixed with \"lu-simple-select\" / \"lu-multi-select\"\n\t// eslint-disable-next-line @angular-eslint/directive-selector\n\tselector: 'lu-simple-select[establishments],lu-multi-select[establishments]',\n\texportAs: 'luEstablishments',\n\tproviders: [\n\t\t{\n\t\t\tprovide: CORE_SELECT_API_TOTAL_COUNT_PROVIDER,\n\t\t\tuseExisting: forwardRef(() => LuCoreSelectEstablishmentsDirective),\n\t\t},\n\t],\n})\nexport class LuCoreSelectEstablishmentsDirective<T extends LuCoreSelectEstablishment = LuCoreSelectEstablishment>\n\textends ALuCoreSelectApiDirective<T>\n\timplements OnInit, CoreSelectApiTotalCountProvider\n{\n\t#groupingService = inject(EstablishmentGroupingService);\n\t#destroyRef = inject(DestroyRef);\n\n\tprotected httpClient = inject(HttpClient);\n\n\treadonly url = input<string>('/organization/structure/api/establishments');\n\treadonly filters = input<Record<string, string | number | boolean> | null>(null);\n\treadonly operationIds = input<readonly number[] | null>(null);\n\treadonly uniqueOperationIds = input<readonly number[] | null>(null);\n\treadonly appInstanceId = input(null, { transform: luNullableNumberAttribute });\n\treadonly searchDelimiter = input<string>(' ');\n\n\tprotected readonly clue = toSignal(this.clue$);\n\n\tpublic override ngOnInit(): void {\n\t\tsuper.ngOnInit();\n\t\tthis.initGrouping();\n\t}\n\n\tprotected initGrouping() {\n\t\tthis.#groupingService.useGrouping$.pipe(filter(Boolean), takeUntilDestroyed(this.#destroyRef)).subscribe(() => {\n\t\t\tthis.select.groupingSignal.set({\n\t\t\t\tselector: (option) => option.legalUnitId,\n\t\t\t\tcontent: LuEstablishmentGroupingComponent,\n\t\t\t});\n\t\t});\n\t}\n\n\tprotected override buildParamsFromClue(clue: string): Observable<Record<string, string | number | boolean>> {\n\t\t// Use the clue parameter directly instead of reading from the async signal\n\t\t// to avoid stale params when selection triggers an immediate clue reset\n\t\treturn of({\n\t\t\t...this.filters(),\n\t\t\t...(clue ? { search: applySearchDelimiter(clue, this.searchDelimiter()), sort: 'name' } : { sort: 'legalunit.name,name' }),\n\t\t\t...(this.operationIds() ? { operations: this.operationIds()!.join(',') } : {}),\n\t\t\t...(this.uniqueOperationIds() ? { uniqueOperations: this.uniqueOperationIds()!.join(',') } : {}),\n\t\t\t...(this.appInstanceId() ? { appInstanceId: this.appInstanceId() } : {}),\n\t\t});\n\t}\n\n\tprotected override getOptions(params: Record<string, string | number | boolean> | null, page: number): Observable<T[]> {\n\t\tconst options$ = this.httpClient\n\t\t\t.get<T[] | { items: T[] }>(this.url(), {\n\t\t\t\tparams: {\n\t\t\t\t\t...params,\n\t\t\t\t\tpage: page + 1,\n\t\t\t\t\tlimit: this.pageSize,\n\t\t\t\t},\n\t\t\t})\n\t\t\t.pipe(map((res) => (Array.isArray(res) ? res : res?.items) ?? []));\n\n\t\treturn this.#groupingService.useGrouping$.pipe(switchMap(() => options$));\n\t}\n\n\tprotected override readonly paramsSignal = computed<Record<string, string | number | boolean>>(() => {\n\t\tconst operationIds = this.operationIds();\n\t\tconst uniqueOperationIds = this.uniqueOperationIds();\n\t\tconst appInstanceId = this.appInstanceId();\n\t\tconst clue = this.clue();\n\t\tconst searchDelimiter = this.searchDelimiter();\n\t\treturn {\n\t\t\t...this.filters(),\n\t\t\t...(clue\n\t\t\t\t? // When the clue is not empty, sort establishments by name\n\t\t\t\t\t{ search: applySearchDelimiter(clue, searchDelimiter), sort: 'name' }\n\t\t\t\t: // When the clue is empty, establishments are grouped by legal unit, so sort them by legal unit name and then by name\n\t\t\t\t\t{ sort: 'legalunit.name,name' }),\n\t\t\t...(operationIds ? { operations: operationIds.join(',') } : {}),\n\t\t\t...(uniqueOperationIds ? { uniqueOperations: uniqueOperationIds.join(',') } : {}),\n\t\t\t...(appInstanceId ? { appInstanceId } : {}),\n\t\t};\n\t});\n\tprotected override readonly params$: Observable<Record<string, string | number | boolean>> = toObservable(this.paramsSignal);\n\n\tpublic readonly totalCount$ = toObservable(computed(() => ({ url: this.url(), filters: this.filters() }))).pipe(\n\t\tdebounceTime(250),\n\t\tswitchMap(({ url, filters }) =>\n\t\t\tthis.httpClient.get<{ count: number }>(url, {\n\t\t\t\tparams: {\n\t\t\t\t\t...filters,\n\t\t\t\t\t['fields.root']: 'count',\n\t\t\t\t},\n\t\t\t}),\n\t\t),\n\t\tmap((res) => res?.count ?? 0),\n\t);\n\n\tprotected override optionKey = (option: T) => option.id;\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;;;MAKa,4BAA4B,CAAA;AADzC,IAAA,WAAA,GAAA;AAEW,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC;QACzB,IAAA,CAAA,iBAAiB,GAAG,4CAA4C;QAChE,IAAA,CAAA,aAAa,GAAG,yCAAyC;AAEzD,QAAA,IAAA,CAAA,WAAW,GAAe,IAAI,UAAU,EAAE,CAAC,GAAG,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;AAC7E,QAAA,IAAA,CAAA,oBAAoB,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAoB,IAAI,CAAC,iBAAiB,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,KAAK,CAAC,CAAC;AAC3I,QAAA,IAAA,CAAA,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAoB,IAAI,CAAC,aAAa,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,KAAK,CAAC,CAAC;AAEtI,QAAA,IAAA,CAAA,YAAY,GAAG,aAAa,CAAC,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,IAAI,CACpG,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,kBAAkB,CAAC,KAAK,OAAO,GAAG,CAAC,IAAI,kBAAkB,GAAG,CAAC,CAAC,EAC7E,WAAW,EAAE,CACb;AACD,IAAA;8GAbY,4BAA4B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAA5B,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,4BAA4B,cADf,MAAM,EAAA,CAAA,CAAA;;2FACnB,4BAA4B,EAAA,UAAA,EAAA,CAAA;kBADxC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;MCMrB,gCAAgC,CAAA;AAL7C,IAAA,WAAA,GAAA;AAMC,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAA4D,cAAc,CAAC,CAAC,SAAS;AACnG,IAAA;8GAFY,gCAAgC,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAhC,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,gCAAgC,qFAHlC,CAAA,qCAAA,CAAuC,EAAA,QAAA,EAAA,IAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;2FAGrC,gCAAgC,EAAA,UAAA,EAAA,CAAA;kBAL5C,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,QAAQ,EAAE,2BAA2B;AACrC,oBAAA,QAAQ,EAAE,CAAA,qCAAA,CAAuC;oBACjD,eAAe,EAAE,uBAAuB,CAAC,MAAM;AAC/C,iBAAA;;;ACcK,MAAO,mCACZ,SAAQ,yBAA4B,CAAA;AAbrC,IAAA,WAAA,GAAA;;AAgBC,QAAA,IAAA,CAAA,gBAAgB,GAAG,MAAM,CAAC,4BAA4B,CAAC;AACvD,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC;AAEtB,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;QAEhC,IAAA,CAAA,GAAG,GAAG,KAAK,CAAS,4CAA4C;gFAAC;QACjE,IAAA,CAAA,OAAO,GAAG,KAAK,CAAmD,IAAI;oFAAC;QACvE,IAAA,CAAA,YAAY,GAAG,KAAK,CAA2B,IAAI;yFAAC;QACpD,IAAA,CAAA,kBAAkB,GAAG,KAAK,CAA2B,IAAI;+FAAC;QAC1D,IAAA,CAAA,aAAa,GAAG,KAAK,CAAC,IAAI,qFAAI,SAAS,EAAE,yBAAyB,EAAA,CAAG;QACrE,IAAA,CAAA,eAAe,GAAG,KAAK,CAAS,GAAG;4FAAC;AAE1B,QAAA,IAAA,CAAA,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;AA0ClB,QAAA,IAAA,CAAA,YAAY,GAAG,QAAQ,CAA4C,MAAK;AACnG,YAAA,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,EAAE;AACxC,YAAA,MAAM,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,EAAE;AACpD,YAAA,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,EAAE;AAC1C,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE;AACxB,YAAA,MAAM,eAAe,GAAG,IAAI,CAAC,eAAe,EAAE;YAC9C,OAAO;gBACN,GAAG,IAAI,CAAC,OAAO,EAAE;AACjB,gBAAA,IAAI;AACH;AACC,wBAAA,EAAE,MAAM,EAAE,oBAAoB,CAAC,IAAI,EAAE,eAAe,CAAC,EAAE,IAAI,EAAE,MAAM;AACpE;AACC,wBAAA,EAAE,IAAI,EAAE,qBAAqB,EAAE,CAAC;AAClC,gBAAA,IAAI,YAAY,GAAG,EAAE,UAAU,EAAE,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC;AAC/D,gBAAA,IAAI,kBAAkB,GAAG,EAAE,gBAAgB,EAAE,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC;AACjF,gBAAA,IAAI,aAAa,GAAG,EAAE,aAAa,EAAE,GAAG,EAAE,CAAC;aAC3C;QACF,CAAC;yFAAC;AAC0B,QAAA,IAAA,CAAA,OAAO,GAA0D,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC;QAE5G,IAAA,CAAA,WAAW,GAAG,YAAY,CAAC,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAC9G,YAAY,CAAC,GAAG,CAAC,EACjB,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,KAC1B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAoB,GAAG,EAAE;AAC3C,YAAA,MAAM,EAAE;AACP,gBAAA,GAAG,OAAO;gBACV,CAAC,aAAa,GAAG,OAAO;AACxB,aAAA;AACD,SAAA,CAAC,CACF,EACD,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,EAAE,KAAK,IAAI,CAAC,CAAC,CAC7B;QAEkB,IAAA,CAAA,SAAS,GAAG,CAAC,MAAS,KAAK,MAAM,CAAC,EAAE;AACvD,IAAA;AAxFA,IAAA,gBAAgB;AAChB,IAAA,WAAW;IAaK,QAAQ,GAAA;QACvB,KAAK,CAAC,QAAQ,EAAE;QAChB,IAAI,CAAC,YAAY,EAAE;IACpB;IAEU,YAAY,GAAA;QACrB,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,MAAK;AAC7G,YAAA,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC;gBAC9B,QAAQ,EAAE,CAAC,MAAM,KAAK,MAAM,CAAC,WAAW;AACxC,gBAAA,OAAO,EAAE,gCAAgC;AACzC,aAAA,CAAC;AACH,QAAA,CAAC,CAAC;IACH;AAEmB,IAAA,mBAAmB,CAAC,IAAY,EAAA;;;AAGlD,QAAA,OAAO,EAAE,CAAC;YACT,GAAG,IAAI,CAAC,OAAO,EAAE;AACjB,YAAA,IAAI,IAAI,GAAG,EAAE,MAAM,EAAE,oBAAoB,CAAC,IAAI,EAAE,IAAI,CAAC,eAAe,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,qBAAqB,EAAE,CAAC;YAC1H,IAAI,IAAI,CAAC,YAAY,EAAE,GAAG,EAAE,UAAU,EAAE,IAAI,CAAC,YAAY,EAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC;YAC9E,IAAI,IAAI,CAAC,kBAAkB,EAAE,GAAG,EAAE,gBAAgB,EAAE,IAAI,CAAC,kBAAkB,EAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC;YAChG,IAAI,IAAI,CAAC,aAAa,EAAE,GAAG,EAAE,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,GAAG,EAAE,CAAC;AACxE,SAAA,CAAC;IACH;IAEmB,UAAU,CAAC,MAAwD,EAAE,IAAY,EAAA;AACnG,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC;AACpB,aAAA,GAAG,CAAuB,IAAI,CAAC,GAAG,EAAE,EAAE;AACtC,YAAA,MAAM,EAAE;AACP,gBAAA,GAAG,MAAM;gBACT,IAAI,EAAE,IAAI,GAAG,CAAC;gBACd,KAAK,EAAE,IAAI,CAAC,QAAQ;AACpB,aAAA;SACD;AACA,aAAA,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,GAAG,EAAE,KAAK,KAAK,EAAE,CAAC,CAAC;AAEnE,QAAA,OAAO,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,QAAQ,CAAC,CAAC;IAC1E;8GAxDY,mCAAmC,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAnC,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,mCAAmC,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kEAAA,EAAA,MAAA,EAAA,EAAA,GAAA,EAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,kBAAA,EAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,SAAA,EAPpC;AACV,YAAA;AACC,gBAAA,OAAO,EAAE,oCAAoC;AAC7C,gBAAA,WAAW,EAAE,UAAU,CAAC,MAAM,mCAAmC,CAAC;AAClE,aAAA;AACD,SAAA,EAAA,QAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;2FAEW,mCAAmC,EAAA,UAAA,EAAA,CAAA;kBAZ/C,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;;;AAGV,oBAAA,QAAQ,EAAE,kEAAkE;AAC5E,oBAAA,QAAQ,EAAE,kBAAkB;AAC5B,oBAAA,SAAS,EAAE;AACV,wBAAA;AACC,4BAAA,OAAO,EAAE,oCAAoC;AAC7C,4BAAA,WAAW,EAAE,UAAU,CAAC,yCAAyC,CAAC;AAClE,yBAAA;AACD,qBAAA;AACD,iBAAA;;;ACtBD;;AAEG;;"}
@@ -34,13 +34,6 @@ class LuCoreSelectJobQualificationsDirective extends ALuCoreSelectApiDirective {
34
34
  this.searchDelimiter = input(' ', /* @ts-ignore */
35
35
  ...(ngDevMode ? [{ debugName: "searchDelimiter" }] : /* istanbul ignore next */ []));
36
36
  this.clue = toSignal(this.clue$);
37
- /**
38
- * Job qualifications are grouped by job, but the panel only knows the options of the pages it
39
- * already loaded: a job spanning several pages would be partially selected. Fetch the whole job
40
- * instead, page by page, so "select all" covers the options that are not rendered yet. Groups are
41
- * only displayed when the clue is empty, hence the clue-less params.
42
- */
43
- this.getGroupOptions = (jobId) => this.#getJobOptions(jobId, 0);
44
37
  this.paramsSignal = computed(() => {
45
38
  const filters = this.filters();
46
39
  const clue = this.clue();
@@ -76,10 +69,6 @@ class LuCoreSelectJobQualificationsDirective extends ALuCoreSelectApiDirective {
76
69
  ...(clue ? { search: applySearchDelimiter(clue, this.searchDelimiter()), sort: 'name' } : { sort: 'job.name,level.position' }),
77
70
  });
78
71
  }
79
- #getJobOptions(jobId, page) {
80
- const params = { ...this.filters(), 'job.id': jobId, sort: 'level.position' };
81
- return this.getOptions(params, page).pipe(switchMap((options) => (options.length < this.pageSize ? of(options) : this.#getJobOptions(jobId, page + 1).pipe(map((nextOptions) => [...options, ...nextOptions])))));
82
- }
83
72
  getOptions(params, page) {
84
73
  return this.httpClient
85
74
  .get(this.url(), {
@@ -1 +1 @@
1
- {"version":3,"file":"lucca-front-ng-core-select-job-qualification.mjs","sources":["../../../packages/ng/core-select/job-qualification/job-qualification-grouping.component.ts","../../../packages/ng/core-select/job-qualification/job-qualifications.directive.ts","../../../packages/ng/core-select/job-qualification/lucca-front-ng-core-select-job-qualification.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, inject } from '@angular/core';\nimport { PORTAL_CONTEXT } from '@lucca-front/ng/core';\nimport { LuOptionGroupByContext } from '@lucca-front/ng/core-select';\nimport { LuCoreSelectJobQualification } from './models';\n\n@Component({\n\tselector: 'lu-job-qualification-grouping',\n\ttemplate: `{{ group.options[0].job.name }}`,\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class LuJobQualificationGroupingComponent {\n\tgroup = inject<LuOptionGroupByContext<LuCoreSelectJobQualification, number>>(PORTAL_CONTEXT).$implicit;\n}\n","import { HttpClient } from '@angular/common/http';\nimport { Directive, OnInit, computed, forwardRef, inject, input } from '@angular/core';\nimport { toObservable, toSignal } from '@angular/core/rxjs-interop';\nimport { CORE_SELECT_API_TOTAL_COUNT_PROVIDER, CoreSelectApiTotalCountProvider, applySearchDelimiter } from '@lucca-front/ng/core-select';\nimport { ALuCoreSelectApiDirective } from '@lucca-front/ng/core-select/api';\nimport { Observable, debounceTime, map, of, switchMap } from 'rxjs';\nimport { LuJobQualificationGroupingComponent } from './job-qualification-grouping.component';\nimport { LuCoreSelectJobQualification } from './models';\n\n@Directive({\n\t// The attribute is already prefixed with \"lu-simple-select\" / \"lu-multi-select\"\n\t// eslint-disable-next-line @angular-eslint/directive-selector\n\tselector: 'lu-simple-select[jobQualifications],lu-multi-select[jobQualifications]',\n\texportAs: 'jobQualifications',\n\tproviders: [\n\t\t{\n\t\t\tprovide: CORE_SELECT_API_TOTAL_COUNT_PROVIDER,\n\t\t\tuseExisting: forwardRef(() => LuCoreSelectJobQualificationsDirective),\n\t\t},\n\t],\n})\nexport class LuCoreSelectJobQualificationsDirective<T extends LuCoreSelectJobQualification = LuCoreSelectJobQualification>\n\textends ALuCoreSelectApiDirective<T>\n\timplements OnInit, CoreSelectApiTotalCountProvider\n{\n\tprotected httpClient = inject(HttpClient);\n\n\treadonly url = input<string>('/organization/structure/api/job-qualifications');\n\treadonly filters = input<Record<string, string | number | boolean> | null>(null);\n\treadonly searchDelimiter = input<string>(' ');\n\n\tprotected readonly clue = toSignal(this.clue$);\n\n\tpublic constructor() {\n\t\tsuper();\n\n\t\tthis.select.groupingSignal.set({\n\t\t\tselector: (option) => option.job.id,\n\t\t\tcontent: LuJobQualificationGroupingComponent,\n\t\t});\n\t}\n\n\tprotected override buildParamsFromClue(clue: string): Observable<Record<string, string | number | boolean>> {\n\t\t// Use the clue parameter directly instead of reading from the async signal\n\t\t// to avoid stale params when selection triggers an immediate clue reset\n\t\treturn of({\n\t\t\t...this.filters(),\n\t\t\t...(clue ? { search: applySearchDelimiter(clue, this.searchDelimiter()), sort: 'name' } : { sort: 'job.name,level.position' }),\n\t\t});\n\t}\n\n\t/**\n\t * Job qualifications are grouped by job, but the panel only knows the options of the pages it\n\t * already loaded: a job spanning several pages would be partially selected. Fetch the whole job\n\t * instead, page by page, so \"select all\" covers the options that are not rendered yet. Groups are\n\t * only displayed when the clue is empty, hence the clue-less params.\n\t */\n\tprotected override getGroupOptions = (jobId: unknown): Observable<T[]> => this.#getJobOptions(jobId as number, 0);\n\n\t#getJobOptions(jobId: number, page: number): Observable<T[]> {\n\t\tconst params = { ...this.filters(), 'job.id': jobId, sort: 'level.position' };\n\t\treturn this.getOptions(params, page).pipe(\n\t\t\tswitchMap((options) => (options.length < this.pageSize ? of(options) : this.#getJobOptions(jobId, page + 1).pipe(map((nextOptions) => [...options, ...nextOptions])))),\n\t\t);\n\t}\n\n\tprotected override getOptions(params: Record<string, string | number | boolean> | null, page: number): Observable<T[]> {\n\t\treturn this.httpClient\n\t\t\t.get<T[] | { items: T[] }>(this.url(), {\n\t\t\t\tparams: {\n\t\t\t\t\t...params,\n\t\t\t\t\tpage: page + 1,\n\t\t\t\t\tlimit: this.pageSize,\n\t\t\t\t},\n\t\t\t})\n\t\t\t.pipe(map((res) => (Array.isArray(res) ? res : res?.items) ?? []));\n\t}\n\n\tprotected override readonly paramsSignal = computed<Record<string, string | number | boolean>>(() => {\n\t\tconst filters = this.filters();\n\t\tconst clue = this.clue();\n\t\treturn {\n\t\t\t...filters,\n\t\t\t...(clue\n\t\t\t\t? {\n\t\t\t\t\t\tsearch: applySearchDelimiter(clue, this.searchDelimiter()),\n\t\t\t\t\t\tsort: 'name',\n\t\t\t\t\t}\n\t\t\t\t: { sort: 'job.name,level.position' }),\n\t\t};\n\t});\n\tprotected override readonly params$: Observable<Record<string, string | number | boolean>> = toObservable(this.paramsSignal);\n\n\tpublic readonly totalCount$ = toObservable(computed(() => ({ url: this.url(), filters: this.filters() }))).pipe(\n\t\tdebounceTime(250),\n\t\tswitchMap(({ url, filters }) =>\n\t\t\tthis.httpClient.get<{ count: number }>(url, {\n\t\t\t\tparams: {\n\t\t\t\t\t...filters,\n\t\t\t\t\t['fields.root']: 'count',\n\t\t\t\t},\n\t\t\t}),\n\t\t),\n\t\tmap((res) => res?.count ?? 0),\n\t);\n\n\tprotected override optionKey = (option: T) => option.id;\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"lucca-front-ng-core-select-job-qualification.mjs","sources":["../../../packages/ng/core-select/job-qualification/job-qualification-grouping.component.ts","../../../packages/ng/core-select/job-qualification/job-qualifications.directive.ts","../../../packages/ng/core-select/job-qualification/lucca-front-ng-core-select-job-qualification.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, inject } from '@angular/core';\nimport { PORTAL_CONTEXT } from '@lucca-front/ng/core';\nimport { LuOptionGroupByContext } from '@lucca-front/ng/core-select';\nimport { LuCoreSelectJobQualification } from './models';\n\n@Component({\n\tselector: 'lu-job-qualification-grouping',\n\ttemplate: `{{ group.options[0].job.name }}`,\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class LuJobQualificationGroupingComponent {\n\tgroup = inject<LuOptionGroupByContext<LuCoreSelectJobQualification, number>>(PORTAL_CONTEXT).$implicit;\n}\n","import { HttpClient } from '@angular/common/http';\nimport { Directive, OnInit, computed, forwardRef, inject, input } from '@angular/core';\nimport { toObservable, toSignal } from '@angular/core/rxjs-interop';\nimport { CORE_SELECT_API_TOTAL_COUNT_PROVIDER, CoreSelectApiTotalCountProvider, applySearchDelimiter } from '@lucca-front/ng/core-select';\nimport { ALuCoreSelectApiDirective } from '@lucca-front/ng/core-select/api';\nimport { Observable, debounceTime, map, of, switchMap } from 'rxjs';\nimport { LuJobQualificationGroupingComponent } from './job-qualification-grouping.component';\nimport { LuCoreSelectJobQualification } from './models';\n\n@Directive({\n\t// The attribute is already prefixed with \"lu-simple-select\" / \"lu-multi-select\"\n\t// eslint-disable-next-line @angular-eslint/directive-selector\n\tselector: 'lu-simple-select[jobQualifications],lu-multi-select[jobQualifications]',\n\texportAs: 'jobQualifications',\n\tproviders: [\n\t\t{\n\t\t\tprovide: CORE_SELECT_API_TOTAL_COUNT_PROVIDER,\n\t\t\tuseExisting: forwardRef(() => LuCoreSelectJobQualificationsDirective),\n\t\t},\n\t],\n})\nexport class LuCoreSelectJobQualificationsDirective<T extends LuCoreSelectJobQualification = LuCoreSelectJobQualification>\n\textends ALuCoreSelectApiDirective<T>\n\timplements OnInit, CoreSelectApiTotalCountProvider\n{\n\tprotected httpClient = inject(HttpClient);\n\n\treadonly url = input<string>('/organization/structure/api/job-qualifications');\n\treadonly filters = input<Record<string, string | number | boolean> | null>(null);\n\treadonly searchDelimiter = input<string>(' ');\n\n\tprotected readonly clue = toSignal(this.clue$);\n\n\tpublic constructor() {\n\t\tsuper();\n\n\t\tthis.select.groupingSignal.set({\n\t\t\tselector: (option) => option.job.id,\n\t\t\tcontent: LuJobQualificationGroupingComponent,\n\t\t});\n\t}\n\n\tprotected override buildParamsFromClue(clue: string): Observable<Record<string, string | number | boolean>> {\n\t\t// Use the clue parameter directly instead of reading from the async signal\n\t\t// to avoid stale params when selection triggers an immediate clue reset\n\t\treturn of({\n\t\t\t...this.filters(),\n\t\t\t...(clue ? { search: applySearchDelimiter(clue, this.searchDelimiter()), sort: 'name' } : { sort: 'job.name,level.position' }),\n\t\t});\n\t}\n\n\tprotected override getOptions(params: Record<string, string | number | boolean> | null, page: number): Observable<T[]> {\n\t\treturn this.httpClient\n\t\t\t.get<T[] | { items: T[] }>(this.url(), {\n\t\t\t\tparams: {\n\t\t\t\t\t...params,\n\t\t\t\t\tpage: page + 1,\n\t\t\t\t\tlimit: this.pageSize,\n\t\t\t\t},\n\t\t\t})\n\t\t\t.pipe(map((res) => (Array.isArray(res) ? res : res?.items) ?? []));\n\t}\n\n\tprotected override readonly paramsSignal = computed<Record<string, string | number | boolean>>(() => {\n\t\tconst filters = this.filters();\n\t\tconst clue = this.clue();\n\t\treturn {\n\t\t\t...filters,\n\t\t\t...(clue\n\t\t\t\t? {\n\t\t\t\t\t\tsearch: applySearchDelimiter(clue, this.searchDelimiter()),\n\t\t\t\t\t\tsort: 'name',\n\t\t\t\t\t}\n\t\t\t\t: { sort: 'job.name,level.position' }),\n\t\t};\n\t});\n\tprotected override readonly params$: Observable<Record<string, string | number | boolean>> = toObservable(this.paramsSignal);\n\n\tpublic readonly totalCount$ = toObservable(computed(() => ({ url: this.url(), filters: this.filters() }))).pipe(\n\t\tdebounceTime(250),\n\t\tswitchMap(({ url, filters }) =>\n\t\t\tthis.httpClient.get<{ count: number }>(url, {\n\t\t\t\tparams: {\n\t\t\t\t\t...filters,\n\t\t\t\t\t['fields.root']: 'count',\n\t\t\t\t},\n\t\t\t}),\n\t\t),\n\t\tmap((res) => res?.count ?? 0),\n\t);\n\n\tprotected override optionKey = (option: T) => option.id;\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -193,7 +193,7 @@ class LuUserOptionComponent {
193
193
  this.userDirective = inject(LuCoreSelectUsersDirective);
194
194
  this.intl = input(...intlInputOptions(LU_CORE_SELECT_USER_TRANSLATIONS), /* @ts-ignore */
195
195
  ...(ngDevMode ? [{ debugName: "intl" }] : /* istanbul ignore next */ []));
196
- this.hasEmptyClue$ = this.userDirective.select.clue$.pipe(map((clue) => !clue));
196
+ this.hasEmptyClue$ = this.userDirective.select.clueChange$.pipe(startWith(this.userDirective.select.clue), map((clue) => !clue));
197
197
  this.customUserOptionTpl = this.userDirective.customUserOptionTpl;
198
198
  }
199
199
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.4", ngImport: i0, type: LuUserOptionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
@@ -395,15 +395,10 @@ class LuCoreSelectUsersDirective extends ALuCoreSelectApiDirective {
395
395
  const filteredItems = displayMe ? items.filter((u) => u.id !== this.currentUserId) : items;
396
396
  return { items: me && prependMe ? [me, ...filteredItems] : filteredItems, isLastPage };
397
397
  }));
398
- return page$.pipe(tap(() => this.select.loading.set(false)));
399
- }
400
- /**
401
- * Homonyms can only be detected by looking at every loaded option at once: two homonyms may
402
- * land on different pages (last option of a page, first of the next one), in which case a
403
- * page by page detection would find none. So we run it on the accumulated list instead.
404
- */
405
- transformOptions(options) {
406
- return this.#userHomonymsService.handleHomonyms([...options], this.displayFormat());
398
+ return page$.pipe(switchMap((page) => this.#userHomonymsService.handleHomonyms(page.items, this.displayFormat()).pipe(map((items) => ({
399
+ items,
400
+ isLastPage: page.isLastPage,
401
+ })))), tap(() => this.select.loading.set(false)));
407
402
  }
408
403
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.4", ngImport: i0, type: LuCoreSelectUsersDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
409
404
  static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.4", type: LuCoreSelectUsersDirective, isStandalone: true, selector: "lu-simple-select[users],lu-multi-select[users]", inputs: { displayFormat: { classPropertyName: "displayFormat", publicName: "displayFormat", isSignal: true, isRequired: false, transformFunction: null }, filters: { classPropertyName: "filters", publicName: "filters", isSignal: true, isRequired: false, transformFunction: null }, url: { classPropertyName: "url", publicName: "url", isSignal: true, isRequired: false, transformFunction: null }, orderBy: { classPropertyName: "orderBy", publicName: "orderBy", isSignal: true, isRequired: false, transformFunction: null }, operationIds: { classPropertyName: "operationIds", publicName: "operationIds", isSignal: true, isRequired: false, transformFunction: null }, uniqueOperationIds: { classPropertyName: "uniqueOperationIds", publicName: "uniqueOperationIds", isSignal: true, isRequired: false, transformFunction: null }, appInstanceId: { classPropertyName: "appInstanceId", publicName: "appInstanceId", isSignal: true, isRequired: false, transformFunction: null }, enableFormerEmployees: { classPropertyName: "enableFormerEmployees", publicName: "enableFormerEmployees", isSignal: true, isRequired: false, transformFunction: null }, displayMeOption: { classPropertyName: "displayMeOption", publicName: "displayMeOption", isSignal: true, isRequired: false, transformFunction: null }, customUserOptionTpl: { classPropertyName: "customUserOptionTpl", publicName: "customUserOptionTpl", isSignal: true, isRequired: false, transformFunction: null }, searchDelimiter: { classPropertyName: "searchDelimiter", publicName: "searchDelimiter", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { customUserOptionTpl: "customUserOptionTplChange" }, providers: [provideBaseCoreSelectUsersContext(() => LuCoreSelectUsersDirective)], exportAs: ["luUsers"], usesInheritance: true, ngImport: i0 }); }
@@ -1 +1 @@
1
- {"version":3,"file":"lucca-front-ng-core-select-user.mjs","sources":["../../../packages/ng/core-select/user/me.provider.ts","../../../packages/ng/core-select/user/translations.ts","../../../packages/ng/core-select/user/user.translate.ts","../../../packages/ng/core-select/user/former-employees.component.ts","../../../packages/ng/core-select/user/user-displayer.component.ts","../../../packages/ng/core-select/user/user-homonym.service.ts","../../../packages/ng/core-select/user/user-option.component.ts","../../../packages/ng/core-select/user/users.directive.ts","../../../packages/ng/core-select/user/lucca-front-ng-core-select-user.ts"],"sourcesContent":["import { InjectionToken, Provider } from '@angular/core';\n\nexport const LU_CORE_SELECT_CURRENT_USER_ID = new InjectionToken<number>('LuCoreSelectCurrentUserId');\n\nexport function provideCoreSelectCurrentUserId(factory: () => number): Provider {\n\treturn {\n\t\tprovide: LU_CORE_SELECT_CURRENT_USER_ID,\n\t\tuseFactory: factory,\n\t};\n}\n","export const Translations = {\n\t'nl-BE': {\n\t\tme: 'Ik:',\n\t\tincludeFormerEmployees: 'Inclusief medewerkers die zijn vertrokken',\n\t},\n\tnl: {\n\t\tme: 'Ik:',\n\t\tincludeFormerEmployees: 'Inclusief medewerkers die zijn vertrokken',\n\t},\n\tit: {\n\t\tme: 'Io:',\n\t\tincludeFormerEmployees: 'Includere gli ex collaboratori',\n\t},\n\tfr: {\n\t\tme: 'Moi :',\n\t\tincludeFormerEmployees: 'Inclure les collaborateurs partis',\n\t},\n\tpt: {\n\t\tme: 'Eu:',\n\t\tincludeFormerEmployees: 'Incluir os trabalhadores que saíram',\n\t},\n\tes: {\n\t\tme: 'Yo:',\n\t\tincludeFormerEmployees: 'Incluir a los empleados inactivos',\n\t},\n\tde: {\n\t\tme: 'Ich:',\n\t\tincludeFormerEmployees: 'Ausgeschiedene Mitarbeitende einbeziehen',\n\t},\n\ten: {\n\t\tme: 'Me:',\n\t\tincludeFormerEmployees: 'Include former employees',\n\t},\n\tpl: {\n\t\tme: 'Ja:',\n\t\tincludeFormerEmployees: 'Uwzględnij byłych pracowników',\n\t},\n};\n","import { InjectionToken } from '@angular/core';\nimport { LuTranslation } from '@lucca-front/ng/core';\nimport { Translations } from './translations';\n\nexport const LU_CORE_SELECT_USER_TRANSLATIONS = new InjectionToken('LuCoreSelectUserTranslations', {\n\tfactory: () => luCoreSelectUserTranslations,\n});\n\nexport interface LuCoreSelectUserTranslations {\n\tme: string;\n\tincludeFormerEmployees: string;\n}\n\nexport const luCoreSelectUserTranslations: LuTranslation<LuCoreSelectUserTranslations> = Translations;\n","import { ChangeDetectionStrategy, Component, inject, InjectionToken, input, WritableSignal } from '@angular/core';\nimport { outputToObservable, takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormsModule } from '@angular/forms';\nimport { intlInputOptions } from '@lucca-front/ng/core';\nimport { ɵCoreSelectPanelElement } from '@lucca-front/ng/core-select';\nimport { LU_CORE_SELECT_USER_TRANSLATIONS } from './user.translate';\n\nexport interface FormerEmployeesContext {\n\tincludeFormerEmployees: WritableSignal<boolean>;\n}\n\nexport const FORMER_EMPLOYEES_CONTEXT = new InjectionToken<FormerEmployeesContext>('FormerEmployeesContext');\n\n@Component({\n\tselector: 'lu-core-select-former-employees',\n\tstyleUrl: './former-employees.component.scss',\n\timports: [FormsModule],\n\thostDirectives: [ɵCoreSelectPanelElement],\n\ttemplate: `\n\t\t<div class=\"formerEmployeeDisplayer optionItem\">\n\t\t\t<div class=\"optionItem-value\" [class.is-selected]=\"context.includeFormerEmployees()\" (mousedown)=\"onMouseDown($event)\">\n\t\t\t\t{{ intl().includeFormerEmployees }}\n\t\t\t</div>\n\t\t</div>\n\t`,\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class LuCoreSelectFormerEmployeesComponent {\n\treadonly intl = input(...intlInputOptions(LU_CORE_SELECT_USER_TRANSLATIONS));\n\treadonly context = inject(FORMER_EMPLOYEES_CONTEXT);\n\treadonly #selectableItem = inject(ɵCoreSelectPanelElement);\n\n\tconstructor() {\n\t\tthis.#selectableItem.id.set('select-former-employees');\n\t\toutputToObservable(this.#selectableItem.selected)\n\t\t\t.pipe(takeUntilDestroyed())\n\t\t\t.subscribe(() => {\n\t\t\t\tthis.context.includeFormerEmployees.set(!this.context.includeFormerEmployees());\n\t\t\t});\n\t}\n\n\tonMouseDown($event: MouseEvent): void {\n\t\tthis.context.includeFormerEmployees.set(!this.context.includeFormerEmployees());\n\t\t$event.preventDefault();\n\t\t$event.stopPropagation();\n\t}\n}\n","import { AsyncPipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, inject } from '@angular/core';\nimport { ILuOptionContext, LU_OPTION_CONTEXT } from '@lucca-front/ng/core-select';\nimport { LuUserDisplayPipe } from '@lucca-front/ng/user';\nimport { LuCoreSelectUser } from './user-option.model';\nimport { LuCoreSelectUsersDirective } from './users.directive';\n\n@Component({\n\tselector: 'lu-user-displayer',\n\timports: [AsyncPipe, LuUserDisplayPipe],\n\ttemplate: `\n\t\t@if (context.option$ | async; as user) {\n\t\t\t<span translate=\"no\">{{ user | luUserDisplay: userDirective.displayFormat() }}</span>\n\t\t}\n\t`,\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class LuUserDisplayerComponent {\n\tprotected context = inject<ILuOptionContext<LuCoreSelectUser>>(LU_OPTION_CONTEXT);\n\tprotected userDirective = inject(LuCoreSelectUsersDirective);\n}\n","import { HttpClient } from '@angular/common/http';\nimport { Injectable, inject } from '@angular/core';\nimport { ILuApiCollectionResponse } from '@lucca-front/ng/api';\nimport { LuDisplayFormat, luUserDisplay } from '@lucca-front/ng/user';\nimport { Observable, map, of, startWith, tap } from 'rxjs';\nimport { LuCoreSelectUser } from './user-option.model';\n\n@Injectable({ providedIn: 'root' })\nexport class LuCoreSelectUserHomonymsService {\n\tprotected http = inject(HttpClient);\n\tprotected cache: Record<number, string> = {};\n\n\tprotected extractHomonyms<T extends LuCoreSelectUser>(users: T[], format: LuDisplayFormat): Set<T['id']> {\n\t\tconst usersByFullName: Record<string, T[]> = {};\n\n\t\tfor (const user of users) {\n\t\t\tconst name = luUserDisplay(user, format);\n\t\t\tusersByFullName[name] ||= [];\n\t\t\tusersByFullName[name].push(user);\n\t\t}\n\n\t\treturn new Set(\n\t\t\tObject.values(usersByFullName)\n\t\t\t\t.filter((users) => users.length > 1)\n\t\t\t\t.flatMap((users) => users.map((user) => user.id)),\n\t\t);\n\t}\n\n\tpublic handleHomonyms<T extends LuCoreSelectUser>(users: T[], format: LuDisplayFormat): Observable<T[]> {\n\t\tconst homonyms = this.extractHomonyms(users, format);\n\n\t\tif (homonyms.size === 0) {\n\t\t\treturn of(users);\n\t\t}\n\n\t\treturn this.getAdditionalInformationByUserId(Array.from(homonyms)).pipe(\n\t\t\tmap((additionalInformation) =>\n\t\t\t\tusers.map((user) =>\n\t\t\t\t\thomonyms.has(user.id)\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t...user,\n\t\t\t\t\t\t\t\tadditionalInformation: this.cache[user.id] || additionalInformation[user.id],\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: user,\n\t\t\t\t),\n\t\t\t),\n\t\t\tstartWith(users),\n\t\t);\n\t}\n\n\tprotected getAdditionalInformationByUserId<T extends LuCoreSelectUser>(homonyms: T['id'][]): Observable<Record<number, string>> {\n\t\tconst userIds = homonyms.filter((userId) => !this.cache[userId]);\n\n\t\tif (userIds.length === 0) {\n\t\t\treturn of({});\n\t\t}\n\n\t\treturn this.http\n\t\t\t.get<ILuApiCollectionResponse<{ id: number; department?: { name: string } }>>(`/api/v3/users`, {\n\t\t\t\tparams: {\n\t\t\t\t\tid: userIds.join(','),\n\t\t\t\t\tfields: 'id,department.name',\n\t\t\t\t},\n\t\t\t})\n\t\t\t.pipe(\n\t\t\t\tmap((res) => res.data.items),\n\t\t\t\tmap((infos) =>\n\t\t\t\t\tinfos.reduce<Record<number, string>>(\n\t\t\t\t\t\t(acc, info) => ({\n\t\t\t\t\t\t\t...acc,\n\t\t\t\t\t\t\t[info.id]: info.department?.name || '',\n\t\t\t\t\t\t}),\n\t\t\t\t\t\t{},\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t\ttap((infos) => {\n\t\t\t\t\tthis.cache = {\n\t\t\t\t\t\t...this.cache,\n\t\t\t\t\t\t...infos,\n\t\t\t\t\t};\n\t\t\t\t}),\n\t\t\t);\n\t}\n}\n","import { AsyncPipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, inject, input } from '@angular/core';\nimport { intlInputOptions } from '@lucca-front/ng/core';\nimport { ILuOptionContext, LU_OPTION_CONTEXT, ɵLuOptionOutletDirective } from '@lucca-front/ng/core-select';\nimport { LuUserDisplayPipe } from '@lucca-front/ng/user';\nimport { map } from 'rxjs';\nimport { LuCoreSelectUser, LuCoreSelectWithAdditionnalInformation } from './user-option.model';\nimport { LU_CORE_SELECT_USER_TRANSLATIONS } from './user.translate';\nimport { LuCoreSelectUsersDirective } from './users.directive';\n\n@Component({\n\tselector: 'lu-user-option',\n\timports: [AsyncPipe, LuUserDisplayPipe, ɵLuOptionOutletDirective],\n\ttemplate: `\n\t\t@if (context.option$ | async; as user) {\n\t\t\t@if (userDirective.displayMeOption() && user.id === userDirective.currentUserId && (hasEmptyClue$ | async)) {\n\t\t\t\t<div>\n\t\t\t\t\t<strong>{{ intl().me }}</strong\n\t\t\t\t\t>&ngsp;\n\t\t\t\t\t<strong translate=\"no\"><ng-container *luOptionOutlet=\"customUserOptionTpl() || defaultUserTpl; value: user\" /></strong>\n\t\t\t\t</div>\n\t\t\t} @else {\n\t\t\t\t<div *luOptionOutlet=\"customUserOptionTpl() || defaultUserTpl; value: user\"></div>\n\t\t\t}\n\t\t\t@if (user.additionalInformation) {\n\t\t\t\t<div class=\"option-additional\">{{ user.additionalInformation }}</div>\n\t\t\t}\n\t\t}\n\n\t\t<ng-template #defaultUserTpl let-user>\n\t\t\t<span translate=\"no\">{{ user | luUserDisplay: userDirective.displayFormat() }}</span>\n\t\t</ng-template>\n\t`,\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class LuUserOptionComponent {\n\tprotected context = inject<ILuOptionContext<LuCoreSelectWithAdditionnalInformation<LuCoreSelectUser>>>(LU_OPTION_CONTEXT);\n\tprotected userDirective = inject(LuCoreSelectUsersDirective);\n\treadonly intl = input(...intlInputOptions(LU_CORE_SELECT_USER_TRANSLATIONS));\n\tprotected readonly hasEmptyClue$ = this.userDirective.select.clue$.pipe(map((clue) => !clue));\n\tprotected readonly customUserOptionTpl = this.userDirective.customUserOptionTpl;\n}\n","import { HttpClient } from '@angular/common/http';\nimport { Directive, Provider, TemplateRef, Type, computed, effect, forwardRef, inject, input, model, signal, untracked } from '@angular/core';\nimport { takeUntilDestroyed, toObservable, toSignal } from '@angular/core/rxjs-interop';\nimport { ILuApiCollectionResponse } from '@lucca-front/ng/api';\nimport { luBooleanAttribute, luNullableNumberAttribute, ɵeffectWithDeps } from '@lucca-front/ng/core';\nimport { CORE_SELECT_API_TOTAL_COUNT_PROVIDER, CoreSelectApiTotalCountProvider, LuOptionContext, applySearchDelimiter } from '@lucca-front/ng/core-select';\nimport { ALuCoreSelectApiDirective } from '@lucca-front/ng/core-select/api';\nimport { LuDisplayFormat, LuDisplayFullname } from '@lucca-front/ng/user';\nimport { Observable, catchError, combineLatest, debounceTime, map, of, shareReplay, switchMap, take, tap } from 'rxjs';\nimport { FORMER_EMPLOYEES_CONTEXT, LuCoreSelectFormerEmployeesComponent } from './former-employees.component';\nimport { LU_CORE_SELECT_CURRENT_USER_ID } from './me.provider';\nimport { LuUserDisplayerComponent } from './user-displayer.component';\nimport { LuCoreSelectUserHomonymsService } from './user-homonym.service';\nimport { LuUserOptionComponent } from './user-option.component';\nimport { LuCoreSelectUser, LuCoreSelectWithAdditionnalInformation } from './user-option.model';\n\nexport function provideCoreSelectUsersContext<T extends LuCoreSelectUser = LuCoreSelectUser>(directiveFn: () => Type<LuCoreSelectUsersDirective<T>>): Provider[] {\n\treturn [\n\t\t...provideBaseCoreSelectUsersContext(directiveFn),\n\t\t{\n\t\t\tprovide: LuCoreSelectUsersDirective,\n\t\t\tuseExisting: forwardRef(directiveFn),\n\t\t},\n\t];\n}\n\nfunction provideBaseCoreSelectUsersContext<T extends LuCoreSelectUser = LuCoreSelectUser>(directiveFn: () => Type<LuCoreSelectUsersDirective<T>>): Provider[] {\n\treturn [\n\t\t{\n\t\t\tprovide: CORE_SELECT_API_TOTAL_COUNT_PROVIDER,\n\t\t\tuseExisting: forwardRef(directiveFn),\n\t\t},\n\t\t{\n\t\t\tprovide: FORMER_EMPLOYEES_CONTEXT,\n\t\t\tuseExisting: forwardRef(directiveFn),\n\t\t},\n\t];\n}\n\n@Directive({\n\t// The attribute is already prefixed with \"lu-simple-select\"\n\t// eslint-disable-next-line @angular-eslint/directive-selector\n\tselector: 'lu-simple-select[users],lu-multi-select[users]',\n\texportAs: 'luUsers',\n\tproviders: [provideBaseCoreSelectUsersContext(() => LuCoreSelectUsersDirective)],\n})\nexport class LuCoreSelectUsersDirective<T extends LuCoreSelectUser = LuCoreSelectUser>\n\textends ALuCoreSelectApiDirective<LuCoreSelectWithAdditionnalInformation<T>>\n\timplements CoreSelectApiTotalCountProvider\n{\n\t#defaultSearchUrl = '/api/v3/users/search';\n\t#defaultScopedSearchUrl = '/api/v3/users/scopedsearch';\n\t#userHomonymsService = inject(LuCoreSelectUserHomonymsService);\n\n\t// Not overridable so it will ease employee API migration\n\t#userFields = 'id,firstName,lastName,picture.href';\n\n\tprotected httpClient = inject(HttpClient);\n\tpublic currentUserId = inject(LU_CORE_SELECT_CURRENT_USER_ID);\n\n\treadonly displayFormat = input<LuDisplayFormat>(LuDisplayFullname.lastfirst);\n\n\treadonly filters = input<Record<string, string | number | boolean>>({});\n\treadonly url = input<string | null>(null);\n\treadonly orderBy = input<string | null>(null);\n\treadonly operationIds = input<readonly number[] | null>(null);\n\treadonly uniqueOperationIds = input<readonly number[] | null>(null);\n\treadonly appInstanceId = input(null, { transform: luNullableNumberAttribute });\n\treadonly enableFormerEmployees = input(false, { transform: luBooleanAttribute });\n\treadonly displayMeOption = input(true, { transform: luBooleanAttribute });\n\treadonly customUserOptionTpl = model<TemplateRef<LuOptionContext<T>> | Type<unknown> | undefined>();\n\n\treadonly includeFormerEmployees = signal(false);\n\treadonly searchDelimiter = input<string>(' ');\n\n\tconstructor() {\n\t\tsuper();\n\t\tthis.select.optionTpl.set(LuUserOptionComponent);\n\t\tthis.select.valueTpl.set(LuUserDisplayerComponent);\n\n\t\teffect(() => {\n\t\t\tconst enableFormerEmployees = this.enableFormerEmployees();\n\t\t\tif (!enableFormerEmployees) {\n\t\t\t\tuntracked(() => this.select.panelHeaderTpl.set(undefined));\n\t\t\t} else {\n\t\t\t\tuntracked(() => this.select.panelHeaderTpl.set(LuCoreSelectFormerEmployeesComponent));\n\t\t\t}\n\t\t});\n\t}\n\n\tprotected readonly defaultUrl = computed(() => (this.uniqueOperationIds()?.length || (this.appInstanceId() && this.operationIds()?.length) ? this.#defaultScopedSearchUrl : this.#defaultSearchUrl));\n\tprotected readonly urlOrDefault = computed(() => this.url() ?? this.defaultUrl());\n\n\tprotected readonly clue = toSignal(this.clue$);\n\n\tprotected override readonly paramsSignal = computed<Record<string, string | number | boolean>>(() => {\n\t\tconst orderBy = this.orderBy();\n\t\tconst clue = this.clue();\n\t\tconst operationIds = this.operationIds();\n\t\tconst uniqueOperationIds = this.uniqueOperationIds();\n\t\tconst appInstanceId = this.appInstanceId();\n\t\tconst searchDelimiter = this.searchDelimiter();\n\t\tconst formerEmployees = this.includeFormerEmployees();\n\n\t\treturn {\n\t\t\tfields: this.#userFields,\n\t\t\t...this.filters(),\n\t\t\t...(orderBy ? { orderBy } : {}),\n\t\t\t...(clue ? { clue: applySearchDelimiter(clue, searchDelimiter) } : {}),\n\t\t\t...(operationIds ? { operations: operationIds.join(',') } : {}),\n\t\t\t...(uniqueOperationIds ? { uniqueOperations: uniqueOperationIds.join(',') } : {}),\n\t\t\t...(appInstanceId ? { appInstanceId } : {}),\n\t\t\t...(formerEmployees ? { formerEmployees } : {}),\n\t\t};\n\t});\n\tprotected override readonly params$: Observable<Record<string, string | number | boolean>> = toObservable(this.paramsSignal);\n\n\tprotected readonly meParams$ = toObservable(\n\t\tcomputed(() => {\n\t\t\tconst uniqueOperationIds = this.uniqueOperationIds();\n\t\t\tconst operationIds = this.operationIds();\n\t\t\tconst appInstanceId = this.appInstanceId();\n\n\t\t\treturn {\n\t\t\t\tfields: this.#userFields,\n\t\t\t\t// The \"me\" request is a lookup by id and must not carry the search `filters`:\n\t\t\t\t// they target the search API and aren't necessarily supported by the endpoint\n\t\t\t\t// resolving the current user (e.g. API v3), which would fail the request.\n\t\t\t\t...(uniqueOperationIds ? { uniqueOperations: uniqueOperationIds.join(',') } : {}),\n\t\t\t\t...(operationIds ? { operations: operationIds.join(',') } : {}),\n\t\t\t\t...(appInstanceId ? { appInstanceId } : {}),\n\t\t\t\tid: this.currentUserId,\n\t\t\t};\n\t\t}),\n\t);\n\n\tprotected readonly me$ = this.meParams$.pipe(\n\t\tswitchMap((params) =>\n\t\t\tthis.httpClient\n\t\t\t\t.get<\n\t\t\t\t\tILuApiCollectionResponse<{\n\t\t\t\t\t\titem: T;\n\t\t\t\t\t}>\n\t\t\t\t>(this.urlOrDefault(), { params })\n\t\t\t\t.pipe(\n\t\t\t\t\tmap((res) => res.data.items.map(({ item }) => item)[0] ?? null),\n\t\t\t\t\t// A failed \"me\" lookup must not block the options: getOptionsPage combines this\n\t\t\t\t\t// stream with the users search, an EMPTY here would leave the select loading forever\n\t\t\t\t\tcatchError(() => of(null)),\n\t\t\t\t),\n\t\t),\n\t\ttakeUntilDestroyed(),\n\t\tshareReplay(1),\n\t);\n\n\tpublic readonly totalCount$ = toObservable(computed(() => ({ url: this.urlOrDefault(), filters: this.filters() }))).pipe(\n\t\tdebounceTime(250),\n\t\tswitchMap(({ url, filters }) =>\n\t\t\tthis.httpClient.get<{ data: { count: number } } | { count: number }>(url, {\n\t\t\t\tparams: {\n\t\t\t\t\t...filters,\n\t\t\t\t\tfields: 'collection.count',\n\t\t\t\t},\n\t\t\t}),\n\t\t),\n\t\tmap((res) => ('data' in res ? (res?.data.count ?? 0) : (res?.count ?? 0))),\n\t);\n\n\tprotected getMe(): Observable<T | null> {\n\t\treturn this.me$.pipe(take(1));\n\t}\n\n\tprotected getOptions(params: Record<string, string | number | boolean>, page: number): Observable<T[]> {\n\t\treturn this.httpClient\n\t\t\t.get<ILuApiCollectionResponse<{ item: T }>>(this.urlOrDefault(), {\n\t\t\t\tparams: {\n\t\t\t\t\t...params,\n\t\t\t\t\tpaging: `${page * this.pageSize},${this.pageSize}`,\n\t\t\t\t},\n\t\t\t})\n\t\t\t.pipe(map((res) => res.data.items.map(({ item }) => item)));\n\t}\n\n\tprotected override getOptionsPage(\n\t\tparams: Record<string, string | number | boolean>,\n\t\tpage: number,\n\t): Observable<{\n\t\titems: LuCoreSelectWithAdditionnalInformation<T>[];\n\t\tisLastPage: boolean;\n\t}> {\n\t\tconst hasClue = !!params['clue'];\n\t\tconst displayMe = this.displayMeOption() && !hasClue;\n\t\tconst prependMe = displayMe && page === 0;\n\n\t\tthis.select.loading.set(true);\n\n\t\tconst me$ = prependMe ? this.getMe() : of(null);\n\n\t\tconst users$ = this.getOptions(params, page).pipe(map((users) => ({ items: users, isLastPage: users.length < this.pageSize })));\n\n\t\tconst page$ = combineLatest([me$, users$]).pipe(\n\t\t\tmap(([me, { items, isLastPage }]) => {\n\t\t\t\t// If \"me\" is displayed as first option, we remove it from the list of users\n\t\t\t\tconst filteredItems = displayMe ? items.filter((u) => u.id !== this.currentUserId) : items;\n\t\t\t\treturn { items: me && prependMe ? [me, ...filteredItems] : filteredItems, isLastPage };\n\t\t\t}),\n\t\t);\n\n\t\treturn page$.pipe(tap(() => this.select.loading.set(false)));\n\t}\n\n\t/**\n\t * Homonyms can only be detected by looking at every loaded option at once: two homonyms may\n\t * land on different pages (last option of a page, first of the next one), in which case a\n\t * page by page detection would find none. So we run it on the accumulated list instead.\n\t */\n\tprotected override transformOptions(options: readonly LuCoreSelectWithAdditionnalInformation<T>[]): Observable<readonly LuCoreSelectWithAdditionnalInformation<T>[]> {\n\t\treturn this.#userHomonymsService.handleHomonyms([...options], this.displayFormat());\n\t}\n\n\tprotected override optionKey = (option: T) => option.id;\n}\n\n@Directive({\n\tselector: '[luUserOption]',\n})\nexport class LuCoreSelectUserOptionDirective<T extends LuCoreSelectUser = LuCoreSelectUser> {\n\t#templateRef = inject(TemplateRef<LuOptionContext<T>>);\n\n\treadonly usersDirective = input<LuCoreSelectUsersDirective<T> | null>(null, { alias: 'luUserOptionUsersRef' });\n\n\tconstructor() {\n\t\tɵeffectWithDeps([this.usersDirective], (usersDirective) => {\n\t\t\tif (usersDirective) {\n\t\t\t\tusersDirective.customUserOptionTpl.set(this.#templateRef);\n\t\t\t}\n\t\t});\n\t}\n\tpublic static ngTemplateContextGuard<T extends LuCoreSelectUser>(_dir: LuCoreSelectUserOptionDirective<T>, _ctx: unknown): _ctx is { $implicit: T } {\n\t\treturn true;\n\t}\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["ɵCoreSelectPanelElement","ɵLuOptionOutletDirective","ɵeffectWithDeps"],"mappings":"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"}
1
+ {"version":3,"file":"lucca-front-ng-core-select-user.mjs","sources":["../../../packages/ng/core-select/user/me.provider.ts","../../../packages/ng/core-select/user/translations.ts","../../../packages/ng/core-select/user/user.translate.ts","../../../packages/ng/core-select/user/former-employees.component.ts","../../../packages/ng/core-select/user/user-displayer.component.ts","../../../packages/ng/core-select/user/user-homonym.service.ts","../../../packages/ng/core-select/user/user-option.component.ts","../../../packages/ng/core-select/user/users.directive.ts","../../../packages/ng/core-select/user/lucca-front-ng-core-select-user.ts"],"sourcesContent":["import { InjectionToken, Provider } from '@angular/core';\n\nexport const LU_CORE_SELECT_CURRENT_USER_ID = new InjectionToken<number>('LuCoreSelectCurrentUserId');\n\nexport function provideCoreSelectCurrentUserId(factory: () => number): Provider {\n\treturn {\n\t\tprovide: LU_CORE_SELECT_CURRENT_USER_ID,\n\t\tuseFactory: factory,\n\t};\n}\n","export const Translations = {\n\t'nl-BE': {\n\t\tme: 'Ik:',\n\t\tincludeFormerEmployees: 'Inclusief medewerkers die zijn vertrokken',\n\t},\n\tnl: {\n\t\tme: 'Ik:',\n\t\tincludeFormerEmployees: 'Inclusief medewerkers die zijn vertrokken',\n\t},\n\tit: {\n\t\tme: 'Io:',\n\t\tincludeFormerEmployees: 'Includere gli ex collaboratori',\n\t},\n\tfr: {\n\t\tme: 'Moi :',\n\t\tincludeFormerEmployees: 'Inclure les collaborateurs partis',\n\t},\n\tpt: {\n\t\tme: 'Eu:',\n\t\tincludeFormerEmployees: 'Incluir os trabalhadores que saíram',\n\t},\n\tes: {\n\t\tme: 'Yo:',\n\t\tincludeFormerEmployees: 'Incluir a los empleados inactivos',\n\t},\n\tde: {\n\t\tme: 'Ich:',\n\t\tincludeFormerEmployees: 'Ausgeschiedene Mitarbeitende einbeziehen',\n\t},\n\ten: {\n\t\tme: 'Me:',\n\t\tincludeFormerEmployees: 'Include former employees',\n\t},\n\tpl: {\n\t\tme: 'Ja:',\n\t\tincludeFormerEmployees: 'Uwzględnij byłych pracowników',\n\t},\n};\n","import { InjectionToken } from '@angular/core';\nimport { LuTranslation } from '@lucca-front/ng/core';\nimport { Translations } from './translations';\n\nexport const LU_CORE_SELECT_USER_TRANSLATIONS = new InjectionToken('LuCoreSelectUserTranslations', {\n\tfactory: () => luCoreSelectUserTranslations,\n});\n\nexport interface LuCoreSelectUserTranslations {\n\tme: string;\n\tincludeFormerEmployees: string;\n}\n\nexport const luCoreSelectUserTranslations: LuTranslation<LuCoreSelectUserTranslations> = Translations;\n","import { ChangeDetectionStrategy, Component, inject, InjectionToken, input, WritableSignal } from '@angular/core';\nimport { outputToObservable, takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormsModule } from '@angular/forms';\nimport { intlInputOptions } from '@lucca-front/ng/core';\nimport { ɵCoreSelectPanelElement } from '@lucca-front/ng/core-select';\nimport { LU_CORE_SELECT_USER_TRANSLATIONS } from './user.translate';\n\nexport interface FormerEmployeesContext {\n\tincludeFormerEmployees: WritableSignal<boolean>;\n}\n\nexport const FORMER_EMPLOYEES_CONTEXT = new InjectionToken<FormerEmployeesContext>('FormerEmployeesContext');\n\n@Component({\n\tselector: 'lu-core-select-former-employees',\n\tstyleUrl: './former-employees.component.scss',\n\timports: [FormsModule],\n\thostDirectives: [ɵCoreSelectPanelElement],\n\ttemplate: `\n\t\t<div class=\"formerEmployeeDisplayer optionItem\">\n\t\t\t<div class=\"optionItem-value\" [class.is-selected]=\"context.includeFormerEmployees()\" (mousedown)=\"onMouseDown($event)\">\n\t\t\t\t{{ intl().includeFormerEmployees }}\n\t\t\t</div>\n\t\t</div>\n\t`,\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class LuCoreSelectFormerEmployeesComponent {\n\treadonly intl = input(...intlInputOptions(LU_CORE_SELECT_USER_TRANSLATIONS));\n\treadonly context = inject(FORMER_EMPLOYEES_CONTEXT);\n\treadonly #selectableItem = inject(ɵCoreSelectPanelElement);\n\n\tconstructor() {\n\t\tthis.#selectableItem.id.set('select-former-employees');\n\t\toutputToObservable(this.#selectableItem.selected)\n\t\t\t.pipe(takeUntilDestroyed())\n\t\t\t.subscribe(() => {\n\t\t\t\tthis.context.includeFormerEmployees.set(!this.context.includeFormerEmployees());\n\t\t\t});\n\t}\n\n\tonMouseDown($event: MouseEvent): void {\n\t\tthis.context.includeFormerEmployees.set(!this.context.includeFormerEmployees());\n\t\t$event.preventDefault();\n\t\t$event.stopPropagation();\n\t}\n}\n","import { AsyncPipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, inject } from '@angular/core';\nimport { ILuOptionContext, LU_OPTION_CONTEXT } from '@lucca-front/ng/core-select';\nimport { LuUserDisplayPipe } from '@lucca-front/ng/user';\nimport { LuCoreSelectUser } from './user-option.model';\nimport { LuCoreSelectUsersDirective } from './users.directive';\n\n@Component({\n\tselector: 'lu-user-displayer',\n\timports: [AsyncPipe, LuUserDisplayPipe],\n\ttemplate: `\n\t\t@if (context.option$ | async; as user) {\n\t\t\t<span translate=\"no\">{{ user | luUserDisplay: userDirective.displayFormat() }}</span>\n\t\t}\n\t`,\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class LuUserDisplayerComponent {\n\tprotected context = inject<ILuOptionContext<LuCoreSelectUser>>(LU_OPTION_CONTEXT);\n\tprotected userDirective = inject(LuCoreSelectUsersDirective);\n}\n","import { HttpClient } from '@angular/common/http';\nimport { Injectable, inject } from '@angular/core';\nimport { ILuApiCollectionResponse } from '@lucca-front/ng/api';\nimport { LuDisplayFormat, luUserDisplay } from '@lucca-front/ng/user';\nimport { Observable, map, of, startWith, tap } from 'rxjs';\nimport { LuCoreSelectUser } from './user-option.model';\n\n@Injectable({ providedIn: 'root' })\nexport class LuCoreSelectUserHomonymsService {\n\tprotected http = inject(HttpClient);\n\tprotected cache: Record<number, string> = {};\n\n\tprotected extractHomonyms<T extends LuCoreSelectUser>(users: T[], format: LuDisplayFormat): Set<T['id']> {\n\t\tconst usersByFullName: Record<string, T[]> = {};\n\n\t\tfor (const user of users) {\n\t\t\tconst name = luUserDisplay(user, format);\n\t\t\tusersByFullName[name] ||= [];\n\t\t\tusersByFullName[name].push(user);\n\t\t}\n\n\t\treturn new Set(\n\t\t\tObject.values(usersByFullName)\n\t\t\t\t.filter((users) => users.length > 1)\n\t\t\t\t.flatMap((users) => users.map((user) => user.id)),\n\t\t);\n\t}\n\n\tpublic handleHomonyms<T extends LuCoreSelectUser>(users: T[], format: LuDisplayFormat): Observable<T[]> {\n\t\tconst homonyms = this.extractHomonyms(users, format);\n\n\t\tif (homonyms.size === 0) {\n\t\t\treturn of(users);\n\t\t}\n\n\t\treturn this.getAdditionalInformationByUserId(Array.from(homonyms)).pipe(\n\t\t\tmap((additionalInformation) =>\n\t\t\t\tusers.map((user) =>\n\t\t\t\t\thomonyms.has(user.id)\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t...user,\n\t\t\t\t\t\t\t\tadditionalInformation: this.cache[user.id] || additionalInformation[user.id],\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: user,\n\t\t\t\t),\n\t\t\t),\n\t\t\tstartWith(users),\n\t\t);\n\t}\n\n\tprotected getAdditionalInformationByUserId<T extends LuCoreSelectUser>(homonyms: T['id'][]): Observable<Record<number, string>> {\n\t\tconst userIds = homonyms.filter((userId) => !this.cache[userId]);\n\n\t\tif (userIds.length === 0) {\n\t\t\treturn of({});\n\t\t}\n\n\t\treturn this.http\n\t\t\t.get<ILuApiCollectionResponse<{ id: number; department?: { name: string } }>>(`/api/v3/users`, {\n\t\t\t\tparams: {\n\t\t\t\t\tid: userIds.join(','),\n\t\t\t\t\tfields: 'id,department.name',\n\t\t\t\t},\n\t\t\t})\n\t\t\t.pipe(\n\t\t\t\tmap((res) => res.data.items),\n\t\t\t\tmap((infos) =>\n\t\t\t\t\tinfos.reduce<Record<number, string>>(\n\t\t\t\t\t\t(acc, info) => ({\n\t\t\t\t\t\t\t...acc,\n\t\t\t\t\t\t\t[info.id]: info.department?.name || '',\n\t\t\t\t\t\t}),\n\t\t\t\t\t\t{},\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t\ttap((infos) => {\n\t\t\t\t\tthis.cache = {\n\t\t\t\t\t\t...this.cache,\n\t\t\t\t\t\t...infos,\n\t\t\t\t\t};\n\t\t\t\t}),\n\t\t\t);\n\t}\n}\n","import { AsyncPipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, inject, input } from '@angular/core';\nimport { intlInputOptions } from '@lucca-front/ng/core';\nimport { ILuOptionContext, LU_OPTION_CONTEXT, ɵLuOptionOutletDirective } from '@lucca-front/ng/core-select';\nimport { LuUserDisplayPipe } from '@lucca-front/ng/user';\nimport { map, startWith } from 'rxjs';\nimport { LuCoreSelectUser, LuCoreSelectWithAdditionnalInformation } from './user-option.model';\nimport { LU_CORE_SELECT_USER_TRANSLATIONS } from './user.translate';\nimport { LuCoreSelectUsersDirective } from './users.directive';\n\n@Component({\n\tselector: 'lu-user-option',\n\timports: [AsyncPipe, LuUserDisplayPipe, ɵLuOptionOutletDirective],\n\ttemplate: `\n\t\t@if (context.option$ | async; as user) {\n\t\t\t@if (userDirective.displayMeOption() && user.id === userDirective.currentUserId && (hasEmptyClue$ | async)) {\n\t\t\t\t<div>\n\t\t\t\t\t<strong>{{ intl().me }}</strong\n\t\t\t\t\t>&ngsp;\n\t\t\t\t\t<strong translate=\"no\"><ng-container *luOptionOutlet=\"customUserOptionTpl() || defaultUserTpl; value: user\" /></strong>\n\t\t\t\t</div>\n\t\t\t} @else {\n\t\t\t\t<div *luOptionOutlet=\"customUserOptionTpl() || defaultUserTpl; value: user\"></div>\n\t\t\t}\n\t\t\t@if (user.additionalInformation) {\n\t\t\t\t<div class=\"option-additional\">{{ user.additionalInformation }}</div>\n\t\t\t}\n\t\t}\n\n\t\t<ng-template #defaultUserTpl let-user>\n\t\t\t<span translate=\"no\">{{ user | luUserDisplay: userDirective.displayFormat() }}</span>\n\t\t</ng-template>\n\t`,\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class LuUserOptionComponent {\n\tprotected context = inject<ILuOptionContext<LuCoreSelectWithAdditionnalInformation<LuCoreSelectUser>>>(LU_OPTION_CONTEXT);\n\tprotected userDirective = inject(LuCoreSelectUsersDirective);\n\treadonly intl = input(...intlInputOptions(LU_CORE_SELECT_USER_TRANSLATIONS));\n\tprotected readonly hasEmptyClue$ = this.userDirective.select.clueChange$.pipe(\n\t\tstartWith(this.userDirective.select.clue),\n\t\tmap((clue) => !clue),\n\t);\n\tprotected readonly customUserOptionTpl = this.userDirective.customUserOptionTpl;\n}\n","import { HttpClient } from '@angular/common/http';\nimport { Directive, Provider, TemplateRef, Type, computed, effect, forwardRef, inject, input, model, signal, untracked } from '@angular/core';\nimport { takeUntilDestroyed, toObservable, toSignal } from '@angular/core/rxjs-interop';\nimport { ILuApiCollectionResponse } from '@lucca-front/ng/api';\nimport { luBooleanAttribute, luNullableNumberAttribute, ɵeffectWithDeps } from '@lucca-front/ng/core';\nimport { CORE_SELECT_API_TOTAL_COUNT_PROVIDER, CoreSelectApiTotalCountProvider, LuOptionContext, applySearchDelimiter } from '@lucca-front/ng/core-select';\nimport { ALuCoreSelectApiDirective } from '@lucca-front/ng/core-select/api';\nimport { LuDisplayFormat, LuDisplayFullname } from '@lucca-front/ng/user';\nimport { Observable, catchError, combineLatest, debounceTime, map, of, shareReplay, switchMap, take, tap } from 'rxjs';\nimport { FORMER_EMPLOYEES_CONTEXT, LuCoreSelectFormerEmployeesComponent } from './former-employees.component';\nimport { LU_CORE_SELECT_CURRENT_USER_ID } from './me.provider';\nimport { LuUserDisplayerComponent } from './user-displayer.component';\nimport { LuCoreSelectUserHomonymsService } from './user-homonym.service';\nimport { LuUserOptionComponent } from './user-option.component';\nimport { LuCoreSelectUser, LuCoreSelectWithAdditionnalInformation } from './user-option.model';\n\nexport function provideCoreSelectUsersContext<T extends LuCoreSelectUser = LuCoreSelectUser>(directiveFn: () => Type<LuCoreSelectUsersDirective<T>>): Provider[] {\n\treturn [\n\t\t...provideBaseCoreSelectUsersContext(directiveFn),\n\t\t{\n\t\t\tprovide: LuCoreSelectUsersDirective,\n\t\t\tuseExisting: forwardRef(directiveFn),\n\t\t},\n\t];\n}\n\nfunction provideBaseCoreSelectUsersContext<T extends LuCoreSelectUser = LuCoreSelectUser>(directiveFn: () => Type<LuCoreSelectUsersDirective<T>>): Provider[] {\n\treturn [\n\t\t{\n\t\t\tprovide: CORE_SELECT_API_TOTAL_COUNT_PROVIDER,\n\t\t\tuseExisting: forwardRef(directiveFn),\n\t\t},\n\t\t{\n\t\t\tprovide: FORMER_EMPLOYEES_CONTEXT,\n\t\t\tuseExisting: forwardRef(directiveFn),\n\t\t},\n\t];\n}\n\n@Directive({\n\t// The attribute is already prefixed with \"lu-simple-select\"\n\t// eslint-disable-next-line @angular-eslint/directive-selector\n\tselector: 'lu-simple-select[users],lu-multi-select[users]',\n\texportAs: 'luUsers',\n\tproviders: [provideBaseCoreSelectUsersContext(() => LuCoreSelectUsersDirective)],\n})\nexport class LuCoreSelectUsersDirective<T extends LuCoreSelectUser = LuCoreSelectUser>\n\textends ALuCoreSelectApiDirective<LuCoreSelectWithAdditionnalInformation<T>>\n\timplements CoreSelectApiTotalCountProvider\n{\n\t#defaultSearchUrl = '/api/v3/users/search';\n\t#defaultScopedSearchUrl = '/api/v3/users/scopedsearch';\n\t#userHomonymsService = inject(LuCoreSelectUserHomonymsService);\n\n\t// Not overridable so it will ease employee API migration\n\t#userFields = 'id,firstName,lastName,picture.href';\n\n\tprotected httpClient = inject(HttpClient);\n\tpublic currentUserId = inject(LU_CORE_SELECT_CURRENT_USER_ID);\n\n\treadonly displayFormat = input<LuDisplayFormat>(LuDisplayFullname.lastfirst);\n\n\treadonly filters = input<Record<string, string | number | boolean>>({});\n\treadonly url = input<string | null>(null);\n\treadonly orderBy = input<string | null>(null);\n\treadonly operationIds = input<readonly number[] | null>(null);\n\treadonly uniqueOperationIds = input<readonly number[] | null>(null);\n\treadonly appInstanceId = input(null, { transform: luNullableNumberAttribute });\n\treadonly enableFormerEmployees = input(false, { transform: luBooleanAttribute });\n\treadonly displayMeOption = input(true, { transform: luBooleanAttribute });\n\treadonly customUserOptionTpl = model<TemplateRef<LuOptionContext<T>> | Type<unknown> | undefined>();\n\n\treadonly includeFormerEmployees = signal(false);\n\treadonly searchDelimiter = input<string>(' ');\n\n\tconstructor() {\n\t\tsuper();\n\t\tthis.select.optionTpl.set(LuUserOptionComponent);\n\t\tthis.select.valueTpl.set(LuUserDisplayerComponent);\n\n\t\teffect(() => {\n\t\t\tconst enableFormerEmployees = this.enableFormerEmployees();\n\t\t\tif (!enableFormerEmployees) {\n\t\t\t\tuntracked(() => this.select.panelHeaderTpl.set(undefined));\n\t\t\t} else {\n\t\t\t\tuntracked(() => this.select.panelHeaderTpl.set(LuCoreSelectFormerEmployeesComponent));\n\t\t\t}\n\t\t});\n\t}\n\n\tprotected readonly defaultUrl = computed(() => (this.uniqueOperationIds()?.length || (this.appInstanceId() && this.operationIds()?.length) ? this.#defaultScopedSearchUrl : this.#defaultSearchUrl));\n\tprotected readonly urlOrDefault = computed(() => this.url() ?? this.defaultUrl());\n\n\tprotected readonly clue = toSignal(this.clue$);\n\n\tprotected override readonly paramsSignal = computed<Record<string, string | number | boolean>>(() => {\n\t\tconst orderBy = this.orderBy();\n\t\tconst clue = this.clue();\n\t\tconst operationIds = this.operationIds();\n\t\tconst uniqueOperationIds = this.uniqueOperationIds();\n\t\tconst appInstanceId = this.appInstanceId();\n\t\tconst searchDelimiter = this.searchDelimiter();\n\t\tconst formerEmployees = this.includeFormerEmployees();\n\n\t\treturn {\n\t\t\tfields: this.#userFields,\n\t\t\t...this.filters(),\n\t\t\t...(orderBy ? { orderBy } : {}),\n\t\t\t...(clue ? { clue: applySearchDelimiter(clue, searchDelimiter) } : {}),\n\t\t\t...(operationIds ? { operations: operationIds.join(',') } : {}),\n\t\t\t...(uniqueOperationIds ? { uniqueOperations: uniqueOperationIds.join(',') } : {}),\n\t\t\t...(appInstanceId ? { appInstanceId } : {}),\n\t\t\t...(formerEmployees ? { formerEmployees } : {}),\n\t\t};\n\t});\n\tprotected override readonly params$: Observable<Record<string, string | number | boolean>> = toObservable(this.paramsSignal);\n\n\tprotected readonly meParams$ = toObservable(\n\t\tcomputed(() => {\n\t\t\tconst uniqueOperationIds = this.uniqueOperationIds();\n\t\t\tconst operationIds = this.operationIds();\n\t\t\tconst appInstanceId = this.appInstanceId();\n\n\t\t\treturn {\n\t\t\t\tfields: this.#userFields,\n\t\t\t\t// The \"me\" request is a lookup by id and must not carry the search `filters`:\n\t\t\t\t// they target the search API and aren't necessarily supported by the endpoint\n\t\t\t\t// resolving the current user (e.g. API v3), which would fail the request.\n\t\t\t\t...(uniqueOperationIds ? { uniqueOperations: uniqueOperationIds.join(',') } : {}),\n\t\t\t\t...(operationIds ? { operations: operationIds.join(',') } : {}),\n\t\t\t\t...(appInstanceId ? { appInstanceId } : {}),\n\t\t\t\tid: this.currentUserId,\n\t\t\t};\n\t\t}),\n\t);\n\n\tprotected readonly me$ = this.meParams$.pipe(\n\t\tswitchMap((params) =>\n\t\t\tthis.httpClient\n\t\t\t\t.get<\n\t\t\t\t\tILuApiCollectionResponse<{\n\t\t\t\t\t\titem: T;\n\t\t\t\t\t}>\n\t\t\t\t>(this.urlOrDefault(), { params })\n\t\t\t\t.pipe(\n\t\t\t\t\tmap((res) => res.data.items.map(({ item }) => item)[0] ?? null),\n\t\t\t\t\t// A failed \"me\" lookup must not block the options: getOptionsPage combines this\n\t\t\t\t\t// stream with the users search, an EMPTY here would leave the select loading forever\n\t\t\t\t\tcatchError(() => of(null)),\n\t\t\t\t),\n\t\t),\n\t\ttakeUntilDestroyed(),\n\t\tshareReplay(1),\n\t);\n\n\tpublic readonly totalCount$ = toObservable(computed(() => ({ url: this.urlOrDefault(), filters: this.filters() }))).pipe(\n\t\tdebounceTime(250),\n\t\tswitchMap(({ url, filters }) =>\n\t\t\tthis.httpClient.get<{ data: { count: number } } | { count: number }>(url, {\n\t\t\t\tparams: {\n\t\t\t\t\t...filters,\n\t\t\t\t\tfields: 'collection.count',\n\t\t\t\t},\n\t\t\t}),\n\t\t),\n\t\tmap((res) => ('data' in res ? (res?.data.count ?? 0) : (res?.count ?? 0))),\n\t);\n\n\tprotected getMe(): Observable<T | null> {\n\t\treturn this.me$.pipe(take(1));\n\t}\n\n\tprotected getOptions(params: Record<string, string | number | boolean>, page: number): Observable<T[]> {\n\t\treturn this.httpClient\n\t\t\t.get<ILuApiCollectionResponse<{ item: T }>>(this.urlOrDefault(), {\n\t\t\t\tparams: {\n\t\t\t\t\t...params,\n\t\t\t\t\tpaging: `${page * this.pageSize},${this.pageSize}`,\n\t\t\t\t},\n\t\t\t})\n\t\t\t.pipe(map((res) => res.data.items.map(({ item }) => item)));\n\t}\n\n\tprotected override getOptionsPage(\n\t\tparams: Record<string, string | number | boolean>,\n\t\tpage: number,\n\t): Observable<{\n\t\titems: LuCoreSelectWithAdditionnalInformation<T>[];\n\t\tisLastPage: boolean;\n\t}> {\n\t\tconst hasClue = !!params['clue'];\n\t\tconst displayMe = this.displayMeOption() && !hasClue;\n\t\tconst prependMe = displayMe && page === 0;\n\n\t\tthis.select.loading.set(true);\n\n\t\tconst me$ = prependMe ? this.getMe() : of(null);\n\n\t\tconst users$ = this.getOptions(params, page).pipe(map((users) => ({ items: users, isLastPage: users.length < this.pageSize })));\n\n\t\tconst page$ = combineLatest([me$, users$]).pipe(\n\t\t\tmap(([me, { items, isLastPage }]) => {\n\t\t\t\t// If \"me\" is displayed as first option, we remove it from the list of users\n\t\t\t\tconst filteredItems = displayMe ? items.filter((u) => u.id !== this.currentUserId) : items;\n\t\t\t\treturn { items: me && prependMe ? [me, ...filteredItems] : filteredItems, isLastPage };\n\t\t\t}),\n\t\t);\n\n\t\treturn page$.pipe(\n\t\t\tswitchMap((page) =>\n\t\t\t\tthis.#userHomonymsService.handleHomonyms(page.items, this.displayFormat()).pipe(\n\t\t\t\t\tmap((items) => ({\n\t\t\t\t\t\titems,\n\t\t\t\t\t\tisLastPage: page.isLastPage,\n\t\t\t\t\t})),\n\t\t\t\t),\n\t\t\t),\n\t\t\ttap(() => this.select.loading.set(false)),\n\t\t);\n\t}\n\n\tprotected override optionKey = (option: T) => option.id;\n}\n\n@Directive({\n\tselector: '[luUserOption]',\n})\nexport class LuCoreSelectUserOptionDirective<T extends LuCoreSelectUser = LuCoreSelectUser> {\n\t#templateRef = inject(TemplateRef<LuOptionContext<T>>);\n\n\treadonly usersDirective = input<LuCoreSelectUsersDirective<T> | null>(null, { alias: 'luUserOptionUsersRef' });\n\n\tconstructor() {\n\t\tɵeffectWithDeps([this.usersDirective], (usersDirective) => {\n\t\t\tif (usersDirective) {\n\t\t\t\tusersDirective.customUserOptionTpl.set(this.#templateRef);\n\t\t\t}\n\t\t});\n\t}\n\tpublic static ngTemplateContextGuard<T extends LuCoreSelectUser>(_dir: LuCoreSelectUserOptionDirective<T>, _ctx: unknown): _ctx is { $implicit: T } {\n\t\treturn true;\n\t}\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["ɵCoreSelectPanelElement","ɵLuOptionOutletDirective","ɵeffectWithDeps"],"mappings":"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"}