@cauca-911/management 22.0.8 → 22.0.9

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.
@@ -165,7 +165,7 @@ class GroupListGridComponent {
165
165
  }
166
166
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(GroupListGridComponent, [{
167
167
  type: Component,
168
- args: [{ selector: 'cauca-group-list-grid', changeDetection: ChangeDetectionStrategy.OnPush, imports: [MatSort, OdataGridComponent, SortableDataGridColumnComponent, SortableDataGridCheckColumnComponent, DataGridCommandsColumnComponent, TranslatePipe], template: "<cauca-odata-grid matSort\n [showTableOptions]=\"true\"\n class=\"groups-datagrid\"\n aria-describedby=\"Groups table\"\n resourceName=\"GroupList\"\n [showAddButton]=\"true\"\n (addButtonClick)=\"createGroup()\"\n [addButtonLabel]=\"'groups.addButtonLabel'| translate\"\n [baseSort]=\"['name']\"\n [filterPredicate]=\"filterPredicate\"\n [displayedColumns]=\"columns()\">\n\n <cauca-sortable-data-grid-column id=\"name\" prop=\"name\" [label]=\"'groups.groupNameColumnLabel'|translate\"/>\n <cauca-sortable-data-grid-check-column id=\"is-assignable-all-users\" prop=\"assignableByAllUsers\" [label]=\"'groups.assignableByAllUsersColumnLabel'|translate\" width=\"200px\" />\n <cauca-data-grid-commands-column id=\"buttons\" prop=\"buttons\" [canDelete]=\"true\" [canEdit]=\"true\" editLinkField=\"id\" (deleteClick)=\"deleteGroup($event)\" />\n\n</cauca-odata-grid>\n" }]
168
+ args: [{ selector: 'cauca-group-list-grid', changeDetection: ChangeDetectionStrategy.OnPush, imports: [MatSort, OdataGridComponent, SortableDataGridColumnComponent, SortableDataGridCheckColumnComponent, DataGridCommandsColumnComponent, TranslatePipe], template: "<cauca-odata-grid matSort\r\n [showTableOptions]=\"true\"\r\n class=\"groups-datagrid\"\r\n aria-describedby=\"Groups table\"\r\n resourceName=\"GroupList\"\r\n [showAddButton]=\"true\"\r\n (addButtonClick)=\"createGroup()\"\r\n [addButtonLabel]=\"'groups.addButtonLabel'| translate\"\r\n [baseSort]=\"['name']\"\r\n [filterPredicate]=\"filterPredicate\"\r\n [displayedColumns]=\"columns()\">\r\n\r\n <cauca-sortable-data-grid-column id=\"name\" prop=\"name\" [label]=\"'groups.groupNameColumnLabel'|translate\"/>\r\n <cauca-sortable-data-grid-check-column id=\"is-assignable-all-users\" prop=\"assignableByAllUsers\" [label]=\"'groups.assignableByAllUsersColumnLabel'|translate\" width=\"200px\" />\r\n <cauca-data-grid-commands-column id=\"buttons\" prop=\"buttons\" [canDelete]=\"true\" [canEdit]=\"true\" editLinkField=\"id\" (deleteClick)=\"deleteGroup($event)\" />\r\n\r\n</cauca-odata-grid>\r\n" }]
169
169
  }], null, { table: [{
170
170
  type: ViewChild,
171
171
  args: [OdataGridComponent, { static: true }]
@@ -188,7 +188,7 @@ class GroupsPageComponent {
188
188
  }
189
189
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(GroupsPageComponent, [{
190
190
  type: Component,
191
- args: [{ selector: 'cauca-groups-page', changeDetection: ChangeDetectionStrategy.OnPush, imports: [MatCardModule, PageTitleComponent, GroupListGridComponent], template: "<cauca-page-title\n [showBreadcrumb]=\"true\"\n caption=\"menu.groups\"\n baseCrumb=\"menu.management\"\n breadcrumb=\"menu.groups\" />\n\n<mat-card class=\"page-content\">\n\n <mat-card-content class=\"page-content-grid\">\n <cauca-group-list-grid />\n </mat-card-content>\n\n</mat-card>\n" }]
191
+ args: [{ selector: 'cauca-groups-page', changeDetection: ChangeDetectionStrategy.OnPush, imports: [MatCardModule, PageTitleComponent, GroupListGridComponent], template: "<cauca-page-title\r\n [showBreadcrumb]=\"true\"\r\n caption=\"menu.groups\"\r\n baseCrumb=\"menu.management\"\r\n breadcrumb=\"menu.groups\" />\r\n\r\n<mat-card class=\"page-content\">\r\n\r\n <mat-card-content class=\"page-content-grid\">\r\n <cauca-group-list-grid />\r\n </mat-card-content>\r\n\r\n</mat-card>\r\n" }]
192
192
  }], null, null); })();
193
193
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(GroupsPageComponent, { className: "GroupsPageComponent", filePath: "lib/pages/groups-page/groups-page.component.ts", lineNumber: 13 }); })();
194
194
 
@@ -597,7 +597,7 @@ class GroupUserSelectionDialogComponent {
597
597
  ListPaginatorComponent,
598
598
  MatTooltipModule,
599
599
  IconButtonComponent,
600
- ], changeDetection: ChangeDetectionStrategy.OnPush, providers: [UserSearchService, LoadingStateService], template: "<div mat-dialog-title>\n <div class=\"h6\">{{ 'groupEdition.userSelectionTitle' | translate }}</div>\n <cauca-icon-button id=\"closeButton\" (buttonClick)=\"closeClick()\" icon=\"close\" />\n</div>\n\n<mat-dialog-content class=\"dialog-content\">\n <mat-form-field subscriptSizing=\"dynamic\" class=\"search-field\">\n <mat-label>{{ 'groupEdition.searchUserPlaceholder' | translate }}</mat-label>\n <input matInput type=\"text\" [value]=\"searchTerm()\" (input)=\"searchTerm.set($any($event.target).value)\" />\n <mat-icon matSuffix>search</mat-icon>\n </mat-form-field>\n\n @if (searchTerm().length >= 0 && searchTerm().length < MIN_SEARCH_LENGTH) {\n <div class=\"search-hint body2\">{{ 'groupEdition.searchMinChars' | translate }}</div>\n }\n\n <div class=\"results-region\">\n <cauca-loading-error (retryRequest)=\"searchResource.reload()\" />\n\n @if (searchResource.isLoading() && !results().length) {\n <cauca-loading-spinner-indicator />\n } @else if (results().length) {\n <mat-selection-list class=\"results-list\" [compareWith]=\"compareUserById\" (selectionChange)=\"onSelectionChange($event)\">\n @for (user of results(); track user.id; let i = $index) {\n <mat-list-option\n [value]=\"user\"\n [selected]=\"selectedUserIds().has(user.id)\"\n color=\"primary\"\n class=\"result-item\"\n [class.result-item--even]=\"i % 2 === 1\">\n <span matListItemTitle>{{ user.fullName }}</span>\n @if (user.additionalInformation) {\n <span matListItemSubtitle>{{ user.additionalInformation }}</span>\n }\n </mat-list-option>\n }\n </mat-selection-list>\n\n @if (totalCount() > PAGE_SIZE) {\n <cauca-list-paginator\n #resultPaginator\n [itemsCount]=\"totalCount()\"\n [pageSize]=\"PAGE_SIZE\"\n (pageChange)=\"onPageChange($event)\" />\n }\n } @else if (!searchResource.isLoading() && totalCount() === 0 && debouncedSearch().length >= MIN_SEARCH_LENGTH) {\n <div class=\"no-results body2\">{{ 'noResult' | translate }}</div>\n }\n </div>\n</mat-dialog-content>\n\n<mat-dialog-actions class=\"dialog-actions\">\n <div class=\"selected-users-panel\">\n <span class=\"selected-users-label caption\">{{ 'groupEdition.selectedUsersLabel' | translate }}</span>\n <div class=\"selected-users-names body2\" [matTooltip]=\"selectedUsersLabel()\">{{ selectedUsersLabel() }}</div>\n </div>\n <cauca-stroked-button color=\"primary\" label=\"cancel\" (buttonClick)=\"cancel()\" />\n <cauca-raised-button\n color=\"primary\"\n label=\"ok\"\n [isDisabled]=\"selectedUsers().length === 0\"\n (buttonClick)=\"confirm()\" />\n</mat-dialog-actions>\n", styles: [".dialog-content{display:flex;flex-direction:column;gap:16px}[mat-dialog-title]{display:flex;align-items:center}[mat-dialog-title] div:first-child{flex:1}.search-field{margin-top:16px;width:100%;margin-bottom:8px}.search-hint,.no-results{padding:8px 0;color:#0000008a}.results-region{height:360px;overflow:hidden;display:flex;flex-direction:column}.results-list{flex:1 1 auto;min-height:0;overflow-y:auto;padding:0;max-height:400px;border:1px solid rgba(0,0,0,.23);border-radius:4px}.result-item{cursor:pointer}mat-list-option{margin-bottom:0}mat-list-option:nth-child(odd){background-color:#0000000d}mat-list-option:hover{transition:all ease-in-out .1s;background-color:#00000012}.dialog-actions{display:flex;align-items:flex-start;gap:8px;flex-wrap:wrap}.selected-users-panel{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.selected-users-label{color:#0000008a;font-weight:500}.selected-users-names{color:#000000de;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n"] }]
600
+ ], changeDetection: ChangeDetectionStrategy.OnPush, providers: [UserSearchService, LoadingStateService], template: "<div mat-dialog-title>\r\n <div class=\"h6\">{{ 'groupEdition.userSelectionTitle' | translate }}</div>\r\n <cauca-icon-button id=\"closeButton\" (buttonClick)=\"closeClick()\" icon=\"close\" />\r\n</div>\r\n\r\n<mat-dialog-content class=\"dialog-content\">\r\n <mat-form-field subscriptSizing=\"dynamic\" class=\"search-field\">\r\n <mat-label>{{ 'groupEdition.searchUserPlaceholder' | translate }}</mat-label>\r\n <input matInput type=\"text\" [value]=\"searchTerm()\" (input)=\"searchTerm.set($any($event.target).value)\" />\r\n <mat-icon matSuffix>search</mat-icon>\r\n </mat-form-field>\r\n\r\n @if (searchTerm().length >= 0 && searchTerm().length < MIN_SEARCH_LENGTH) {\r\n <div class=\"search-hint body2\">{{ 'groupEdition.searchMinChars' | translate }}</div>\r\n }\r\n\r\n <div class=\"results-region\">\r\n <cauca-loading-error (retryRequest)=\"searchResource.reload()\" />\r\n\r\n @if (searchResource.isLoading() && !results().length) {\r\n <cauca-loading-spinner-indicator />\r\n } @else if (results().length) {\r\n <mat-selection-list class=\"results-list\" [compareWith]=\"compareUserById\" (selectionChange)=\"onSelectionChange($event)\">\r\n @for (user of results(); track user.id; let i = $index) {\r\n <mat-list-option\r\n [value]=\"user\"\r\n [selected]=\"selectedUserIds().has(user.id)\"\r\n color=\"primary\"\r\n class=\"result-item\"\r\n [class.result-item--even]=\"i % 2 === 1\">\r\n <span matListItemTitle>{{ user.fullName }}</span>\r\n @if (user.additionalInformation) {\r\n <span matListItemSubtitle>{{ user.additionalInformation }}</span>\r\n }\r\n </mat-list-option>\r\n }\r\n </mat-selection-list>\r\n\r\n @if (totalCount() > PAGE_SIZE) {\r\n <cauca-list-paginator\r\n #resultPaginator\r\n [itemsCount]=\"totalCount()\"\r\n [pageSize]=\"PAGE_SIZE\"\r\n (pageChange)=\"onPageChange($event)\" />\r\n }\r\n } @else if (!searchResource.isLoading() && totalCount() === 0 && debouncedSearch().length >= MIN_SEARCH_LENGTH) {\r\n <div class=\"no-results body2\">{{ 'noResult' | translate }}</div>\r\n }\r\n </div>\r\n</mat-dialog-content>\r\n\r\n<mat-dialog-actions class=\"dialog-actions\">\r\n <div class=\"selected-users-panel\">\r\n <span class=\"selected-users-label caption\">{{ 'groupEdition.selectedUsersLabel' | translate }}</span>\r\n <div class=\"selected-users-names body2\" [matTooltip]=\"selectedUsersLabel()\">{{ selectedUsersLabel() }}</div>\r\n </div>\r\n <cauca-stroked-button color=\"primary\" label=\"cancel\" (buttonClick)=\"cancel()\" />\r\n <cauca-raised-button\r\n color=\"primary\"\r\n label=\"ok\"\r\n [isDisabled]=\"selectedUsers().length === 0\"\r\n (buttonClick)=\"confirm()\" />\r\n</mat-dialog-actions>\r\n", styles: [".dialog-content{display:flex;flex-direction:column;gap:16px}[mat-dialog-title]{display:flex;align-items:center}[mat-dialog-title] div:first-child{flex:1}.search-field{margin-top:16px;width:100%;margin-bottom:8px}.search-hint,.no-results{padding:8px 0;color:#0000008a}.results-region{height:360px;overflow:hidden;display:flex;flex-direction:column}.results-list{flex:1 1 auto;min-height:0;overflow-y:auto;padding:0;max-height:400px;border:1px solid rgba(0,0,0,.23);border-radius:4px}.result-item{cursor:pointer}mat-list-option{margin-bottom:0}mat-list-option:nth-child(odd){background-color:#0000000d}mat-list-option:hover{transition:all ease-in-out .1s;background-color:#00000012}.dialog-actions{display:flex;align-items:flex-start;gap:8px;flex-wrap:wrap}.selected-users-panel{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.selected-users-label{color:#0000008a;font-weight:500}.selected-users-names{color:#000000de;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n"] }]
601
601
  }], () => [], { paginator: [{ type: i0.ViewChild, args: ['resultPaginator', { isSignal: true }] }] }); })();
602
602
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(GroupUserSelectionDialogComponent, { className: "GroupUserSelectionDialogComponent", filePath: "lib/components/group-user-selection-dialog/group-user-selection-dialog.component.ts", lineNumber: 46 }); })();
603
603
 
@@ -771,7 +771,7 @@ class GroupUserEditionListComponent {
771
771
  }
772
772
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(GroupUserEditionListComponent, [{
773
773
  type: Component,
774
- args: [{ selector: 'cauca-group-user-edition-list', standalone: true, imports: [TranslatePipe, IconButtonComponent, RaisedButtonComponent, ListPaginatorComponent, MatFormFieldModule, MatInputModule, MatIconModule, FormsModule, MatListModule], changeDetection: ChangeDetectionStrategy.OnPush, providers: [DialogService], template: "<div class=\"user-edition-list\">\n\n <mat-form-field subscriptSizing=\"dynamic\" class=\"filter-field\">\n <mat-label>{{ 'groupEdition.filterUsersPlaceholder' | translate }}</mat-label>\n <input matInput type=\"text\" [value]=\"filterTerm()\" (input)=\"filterTerm.set($any($event.target).value)\" />\n <mat-icon matSuffix>search</mat-icon>\n </mat-form-field>\n\n <mat-list class=\"users-list\">\n @for (user of pagedUsers(); track user.id) {\n <mat-list-item class=\"user-item\">\n <mat-icon matListItemIcon>person</mat-icon>\n <div matListItemTitle class=\"user-name\">{{ user.fullName }}</div>\n @if (user.additionalInformation) {\n <div matListItemLine class=\"user-additional-information\">{{ user.additionalInformation }}</div>\n }\n <cauca-icon-button\n matListItemMeta\n class=\"delete-button\"\n icon=\"delete\"\n color=\"error\"\n (buttonClick)=\"removeUser(user)\"\n [attr.aria-label]=\"'groupEdition.removeUserLabel' | translate\" />\n </mat-list-item>\n } @empty {\n @if (filterTerm()) {\n <div class=\"no-users body2\">{{ 'groupEdition.noFilteredUsers' | translate }}</div>\n } @else {\n <div class=\"no-users body2\">{{ 'groupEdition.noUsers' | translate }}</div>\n }\n }\n </mat-list>\n\n @if (filteredUsers().length > PAGE_SIZE) {\n <cauca-list-paginator\n #paginator\n [itemsCount]=\"filteredUsers().length\"\n [pageSize]=\"PAGE_SIZE\"\n (pageChange)=\"onPageChange($event)\" />\n }\n\n <cauca-raised-button\n class=\"add-users-button\"\n color=\"primary\"\n label=\"groupEdition.addUsersButton\"\n (buttonClick)=\"openAddUsersDialog()\" />\n</div>\n", styles: [".user-edition-list{display:flex;flex-direction:column;gap:16px}.add-users-button{align-self:flex-end}.users-list{border:1px solid rgba(0,0,0,.23);border-radius:4px;padding:0;max-height:400px;overflow-y:auto}mat-list-item{margin-bottom:0}.filter-field{width:100%}.user-item{border-bottom:1px solid rgba(0,0,0,.12)}.user-item:last-child{border-bottom:none}.empty-state{display:flex;flex-direction:column;align-items:center;padding:32px 16px;text-align:center;color:#0009}.empty-state .empty-icon{font-size:48px;width:48px;height:48px;margin-bottom:16px;opacity:.6}.empty-state .empty-message{margin:0;font-size:14px}.add-button-container{display:flex;justify-content:flex-end;margin-top:16px}.no-users{padding:16px 0;color:#00000061;text-align:center}mat-list-item:nth-child(odd){background-color:#0000000d}mat-list-item:hover{transition:all ease-in-out .1s;background-color:#00000012}\n"] }]
774
+ args: [{ selector: 'cauca-group-user-edition-list', standalone: true, imports: [TranslatePipe, IconButtonComponent, RaisedButtonComponent, ListPaginatorComponent, MatFormFieldModule, MatInputModule, MatIconModule, FormsModule, MatListModule], changeDetection: ChangeDetectionStrategy.OnPush, providers: [DialogService], template: "<div class=\"user-edition-list\">\r\n\r\n <mat-form-field subscriptSizing=\"dynamic\" class=\"filter-field\">\r\n <mat-label>{{ 'groupEdition.filterUsersPlaceholder' | translate }}</mat-label>\r\n <input matInput type=\"text\" [value]=\"filterTerm()\" (input)=\"filterTerm.set($any($event.target).value)\" />\r\n <mat-icon matSuffix>search</mat-icon>\r\n </mat-form-field>\r\n\r\n <mat-list class=\"users-list\">\r\n @for (user of pagedUsers(); track user.id) {\r\n <mat-list-item class=\"user-item\">\r\n <mat-icon matListItemIcon>person</mat-icon>\r\n <div matListItemTitle class=\"user-name\">{{ user.fullName }}</div>\r\n @if (user.additionalInformation) {\r\n <div matListItemLine class=\"user-additional-information\">{{ user.additionalInformation }}</div>\r\n }\r\n <cauca-icon-button\r\n matListItemMeta\r\n class=\"delete-button\"\r\n icon=\"delete\"\r\n color=\"error\"\r\n (buttonClick)=\"removeUser(user)\"\r\n [attr.aria-label]=\"'groupEdition.removeUserLabel' | translate\" />\r\n </mat-list-item>\r\n } @empty {\r\n @if (filterTerm()) {\r\n <div class=\"no-users body2\">{{ 'groupEdition.noFilteredUsers' | translate }}</div>\r\n } @else {\r\n <div class=\"no-users body2\">{{ 'groupEdition.noUsers' | translate }}</div>\r\n }\r\n }\r\n </mat-list>\r\n\r\n @if (filteredUsers().length > PAGE_SIZE) {\r\n <cauca-list-paginator\r\n #paginator\r\n [itemsCount]=\"filteredUsers().length\"\r\n [pageSize]=\"PAGE_SIZE\"\r\n (pageChange)=\"onPageChange($event)\" />\r\n }\r\n\r\n <cauca-raised-button\r\n class=\"add-users-button\"\r\n color=\"primary\"\r\n label=\"groupEdition.addUsersButton\"\r\n (buttonClick)=\"openAddUsersDialog()\" />\r\n</div>\r\n", styles: [".user-edition-list{display:flex;flex-direction:column;gap:16px}.add-users-button{align-self:flex-end}.users-list{border:1px solid rgba(0,0,0,.23);border-radius:4px;padding:0;max-height:400px;overflow-y:auto}mat-list-item{margin-bottom:0}.filter-field{width:100%}.user-item{border-bottom:1px solid rgba(0,0,0,.12)}.user-item:last-child{border-bottom:none}.empty-state{display:flex;flex-direction:column;align-items:center;padding:32px 16px;text-align:center;color:#0009}.empty-state .empty-icon{font-size:48px;width:48px;height:48px;margin-bottom:16px;opacity:.6}.empty-state .empty-message{margin:0;font-size:14px}.add-button-container{display:flex;justify-content:flex-end;margin-top:16px}.no-users{padding:16px 0;color:#00000061;text-align:center}mat-list-item:nth-child(odd){background-color:#0000000d}mat-list-item:hover{transition:all ease-in-out .1s;background-color:#00000012}\n"] }]
775
775
  }], () => [], { paginator: [{ type: i0.ViewChild, args: ['paginator', { isSignal: true }] }] }); })();
776
776
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(GroupUserEditionListComponent, { className: "GroupUserEditionListComponent", filePath: "lib/components/group-user-edition-list/group-user-edition-list.component.ts", lineNumber: 24 }); })();
777
777
 
@@ -924,7 +924,7 @@ class GroupPermissionListComponent {
924
924
  }
925
925
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(GroupPermissionListComponent, [{
926
926
  type: Component,
927
- args: [{ selector: 'cauca-group-permission-list', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [MatListModule, MatFormField, MatLabel, MatInput, MatSuffix, TranslatePipe, FormsModule, MatIcon, MatCheckboxModule], template: "<mat-form-field subscriptSizing=\"dynamic\" appearance=\"outline\" class=\"full-width-field grid-search-box\">\n <mat-label>{{ 'dataGrid.keywordsLabel' | translate }}</mat-label>\n <input matInput [(ngModel)]=\"searchText\">\n <mat-icon matSuffix>search</mat-icon>\n</mat-form-field>\n\n<mat-selection-list id=\"permission-list\">\n @for (permission of filteredPermissionsValues(); track permission.id) {\n <mat-list-item class=\"permission-item\">\n <mat-checkbox\n [color]=\"permission.allowed === null ? undefined : 'primary'\"\n [indeterminate]=\"permission.allowed === null\"\n [checked]=\"permission.allowed\"\n (click)=\"onValueChange(permission)\" >\n {{permission.name}}\n </mat-checkbox>\n </mat-list-item>\n } @empty {\n <div class=\"no-result\">\n <mat-icon class=\"no-result-icon\">grid_off</mat-icon>\n <div class=\"no-result-text body2\">{{ 'noResult' | translate }}</div>\n </div>\n }\n\n</mat-selection-list>\n", styles: [":host{display:flex;flex-direction:column;gap:16px}#permission-list{max-height:400px;overflow-y:auto;border:1px solid rgba(0,0,0,.23);border-radius:4px;padding:0}.permission-item{border-bottom:1px solid rgba(0,0,0,.12)}.permission-item:last-child{border-bottom:none}mat-list-item{margin-bottom:0}.permission-checkbox,.filter-field{width:100%}.no-result{display:flex;flex-direction:column;align-items:center;padding:24px 0;color:#00000061}.no-result-icon{font-size:48px;width:48px;height:48px;margin-bottom:8px}.no-result-text{text-align:center}mat-list-item:nth-child(odd){background-color:#0000000d}mat-list-item:hover{transition:all ease-in-out .1s;background-color:#00000012}\n"] }]
927
+ args: [{ selector: 'cauca-group-permission-list', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [MatListModule, MatFormField, MatLabel, MatInput, MatSuffix, TranslatePipe, FormsModule, MatIcon, MatCheckboxModule], template: "<mat-form-field subscriptSizing=\"dynamic\" appearance=\"outline\" class=\"full-width-field grid-search-box\">\r\n <mat-label>{{ 'dataGrid.keywordsLabel' | translate }}</mat-label>\r\n <input matInput [(ngModel)]=\"searchText\">\r\n <mat-icon matSuffix>search</mat-icon>\r\n</mat-form-field>\r\n\r\n<mat-selection-list id=\"permission-list\">\r\n @for (permission of filteredPermissionsValues(); track permission.id) {\r\n <mat-list-item class=\"permission-item\">\r\n <mat-checkbox\r\n [color]=\"permission.allowed === null ? undefined : 'primary'\"\r\n [indeterminate]=\"permission.allowed === null\"\r\n [checked]=\"permission.allowed\"\r\n (click)=\"onValueChange(permission)\" >\r\n {{permission.name}}\r\n </mat-checkbox>\r\n </mat-list-item>\r\n } @empty {\r\n <div class=\"no-result\">\r\n <mat-icon class=\"no-result-icon\">grid_off</mat-icon>\r\n <div class=\"no-result-text body2\">{{ 'noResult' | translate }}</div>\r\n </div>\r\n }\r\n\r\n</mat-selection-list>\r\n", styles: [":host{display:flex;flex-direction:column;gap:16px}#permission-list{max-height:400px;overflow-y:auto;border:1px solid rgba(0,0,0,.23);border-radius:4px;padding:0}.permission-item{border-bottom:1px solid rgba(0,0,0,.12)}.permission-item:last-child{border-bottom:none}mat-list-item{margin-bottom:0}.permission-checkbox,.filter-field{width:100%}.no-result{display:flex;flex-direction:column;align-items:center;padding:24px 0;color:#00000061}.no-result-icon{font-size:48px;width:48px;height:48px;margin-bottom:8px}.no-result-text{text-align:center}mat-list-item:nth-child(odd){background-color:#0000000d}mat-list-item:hover{transition:all ease-in-out .1s;background-color:#00000012}\n"] }]
928
928
  }], null, { searchText: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchText", required: false }] }, { type: i0.Output, args: ["searchTextChange"] }] }); })();
929
929
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(GroupPermissionListComponent, { className: "GroupPermissionListComponent", filePath: "lib/components/group-permission-list/group-permission-list.component.ts", lineNumber: 23 }); })();
930
930
 
@@ -981,7 +981,7 @@ class GroupEditionFormComponent {
981
981
  }
982
982
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(GroupEditionFormComponent, [{
983
983
  type: Component,
984
- args: [{ selector: 'cauca-group-edition-form', changeDetection: ChangeDetectionStrategy.OnPush, imports: [TranslatePipe, MatFormFieldModule, MatInputModule, MatSlideToggleModule, MatDividerModule, ReactiveFormsModule, GroupContainerComponent, GroupUserEditionListComponent, GroupPermissionListComponent], template: "<div [formGroup]=\"state.form\">\n\n <cauca-group-container id=\"group-options\" caption=\"groupEdition.groupNameFieldLabel\">\n <mat-form-field id=\"group-name\">\n <mat-label>{{ 'groupEdition.nameFieldLabel' | translate }}</mat-label>\n <input matInput type=\"text\" formControlName=\"name\" required>\n @if (state.form.get(\"name\").hasError('required')) {<mat-error>{{'error.requiredField' | translate}}</mat-error>}\n </mat-form-field>\n <mat-slide-toggle id=\"assignable-by-all-users\" formControlName=\"assignableByAllUsers\" color=\"primary\">{{'groupEdition.assignableByAllUsersLabel' | translate}}</mat-slide-toggle>\n </cauca-group-container>\n\n <mat-divider />\n\n <cauca-group-container id=\"group-users\" caption=\"groupEdition.groupUsersFieldLabel\">\n <cauca-group-user-edition-list />\n </cauca-group-container>\n\n <mat-divider />\n\n <cauca-group-container id=\"group-permissions\" caption=\"groupEdition.groupPermissionsFieldLabel\">\n <cauca-group-permission-list />\n </cauca-group-container>\n\n</div>\n", styles: [".form{display:flex;flex-direction:column;gap:16px}.row{display:flex;align-items:stretch;gap:16px}.row>*{flex:1}\n"] }]
984
+ args: [{ selector: 'cauca-group-edition-form', changeDetection: ChangeDetectionStrategy.OnPush, imports: [TranslatePipe, MatFormFieldModule, MatInputModule, MatSlideToggleModule, MatDividerModule, ReactiveFormsModule, GroupContainerComponent, GroupUserEditionListComponent, GroupPermissionListComponent], template: "<div [formGroup]=\"state.form\">\r\n\r\n <cauca-group-container id=\"group-options\" caption=\"groupEdition.groupNameFieldLabel\">\r\n <mat-form-field id=\"group-name\">\r\n <mat-label>{{ 'groupEdition.nameFieldLabel' | translate }}</mat-label>\r\n <input matInput type=\"text\" formControlName=\"name\" required>\r\n @if (state.form.get(\"name\").hasError('required')) {<mat-error>{{'error.requiredField' | translate}}</mat-error>}\r\n </mat-form-field>\r\n <mat-slide-toggle id=\"assignable-by-all-users\" formControlName=\"assignableByAllUsers\" color=\"primary\">{{'groupEdition.assignableByAllUsersLabel' | translate}}</mat-slide-toggle>\r\n </cauca-group-container>\r\n\r\n <mat-divider />\r\n\r\n <cauca-group-container id=\"group-users\" caption=\"groupEdition.groupUsersFieldLabel\">\r\n <cauca-group-user-edition-list />\r\n </cauca-group-container>\r\n\r\n <mat-divider />\r\n\r\n <cauca-group-container id=\"group-permissions\" caption=\"groupEdition.groupPermissionsFieldLabel\">\r\n <cauca-group-permission-list />\r\n </cauca-group-container>\r\n\r\n</div>\r\n", styles: [".form{display:flex;flex-direction:column;gap:16px}.row{display:flex;align-items:stretch;gap:16px}.row>*{flex:1}\n"] }]
985
985
  }], null, null); })();
986
986
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(GroupEditionFormComponent, { className: "GroupEditionFormComponent", filePath: "lib/components/group-edition-form/group-edition-form.component.ts", lineNumber: 20 }); })();
987
987
 
@@ -1137,7 +1137,7 @@ class GroupEditionPageComponent {
1137
1137
  GroupEditionStateService,
1138
1138
  LoadingStateService,
1139
1139
  GroupManagementService,
1140
- ], template: "<cauca-page-title\n [caption]=\"title()\"\n baseCrumb=\"menu.management\"\n [breadcrumb]=\"title()\"\n [location]=\"currentLocation()\"\n [showBreadcrumb]=\"true\" />\n\n<mat-card>\n\n <mat-card-content>\n\n <cauca-loading-spinner-indicator />\n <cauca-loading-error (retryRequest)=\"loadData()\" />\n\n @if (isLoaded()) {\n <cauca-group-edition-form />\n }\n\n @if (showSavingError()) {\n <div class=\"spacer\"></div>\n <cauca-saving-error-box [show]=\"showSavingError()\" />\n }\n\n </mat-card-content>\n\n <mat-card-actions>\n <div class=\"spacer\"></div>\n <cauca-stroked-button class=\"cancel-button\" color=\"primary\" label=\"cancel\" [isDisabled]=\"isSaving()\" (buttonClick)=\"cancel()\" />\n <cauca-raised-button class=\"save-button\" color=\"primary\" label=\"save\" [isInProgress]=\"isSaving()\" (buttonClick)=\"save()\" />\n </mat-card-actions>\n\n</mat-card>\n", styles: [":host{width:100%}.spacer{flex:1 1 auto}mat-card-actions{gap:8px}\n"] }]
1140
+ ], template: "<cauca-page-title\r\n [caption]=\"title()\"\r\n baseCrumb=\"menu.management\"\r\n [breadcrumb]=\"title()\"\r\n [location]=\"currentLocation()\"\r\n [showBreadcrumb]=\"true\" />\r\n\r\n<mat-card>\r\n\r\n <mat-card-content>\r\n\r\n <cauca-loading-spinner-indicator />\r\n <cauca-loading-error (retryRequest)=\"loadData()\" />\r\n\r\n @if (isLoaded()) {\r\n <cauca-group-edition-form />\r\n }\r\n\r\n @if (showSavingError()) {\r\n <div class=\"spacer\"></div>\r\n <cauca-saving-error-box [show]=\"showSavingError()\" />\r\n }\r\n\r\n </mat-card-content>\r\n\r\n <mat-card-actions>\r\n <div class=\"spacer\"></div>\r\n <cauca-stroked-button class=\"cancel-button\" color=\"primary\" label=\"cancel\" [isDisabled]=\"isSaving()\" (buttonClick)=\"cancel()\" />\r\n <cauca-raised-button class=\"save-button\" color=\"primary\" label=\"save\" [isInProgress]=\"isSaving()\" (buttonClick)=\"save()\" />\r\n </mat-card-actions>\r\n\r\n</mat-card>\r\n", styles: [":host{width:100%}.spacer{flex:1 1 auto}mat-card-actions{gap:8px}\n"] }]
1141
1141
  }], null, { id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: true }] }], onBeforeUnload: [{
1142
1142
  type: HostListener,
1143
1143
  args: ['window:beforeunload', ['$event']]
@@ -1315,7 +1315,7 @@ class UserPermissionListComponent {
1315
1315
  }
1316
1316
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(UserPermissionListComponent, [{
1317
1317
  type: Component,
1318
- args: [{ selector: 'cauca-user-permission-list', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [MatListModule, MatFormField, MatLabel, MatInput, MatSuffix, MatIcon, MatMenuModule, TranslatePipe, IconButtonComponent], template: "<mat-form-field subscriptSizing=\"dynamic\" appearance=\"outline\" class=\"search-field\">\n <mat-label>{{ 'dataGrid.keywordsLabel' | translate }}</mat-label>\n <input matInput type=\"text\" [value]=\"searchText()\" (input)=\"searchText.set($any($event.target).value)\">\n <mat-icon matSuffix>search</mat-icon>\n</mat-form-field>\n\n<mat-list id=\"permission-list\">\n @for (permission of filteredPermissions(); track permission.idModulePermission) {\n <mat-list-item class=\"permission-item\">\n\n <mat-icon matListItemIcon\n [class.allowed]=\"permission.status === PermissionStatus.Allowed\"\n [class.denied]=\"permission.status !== PermissionStatus.Allowed\">\n @if (permission.status === PermissionStatus.Allowed) {\n check\n } @else {\n block\n }\n </mat-icon>\n\n <div matListItemTitle>{{ permission.name }}</div>\n\n <cauca-icon-button\n matListItemMeta\n icon=\"info\"\n [matMenuTriggerFor]=\"originsMenu\" />\n\n <mat-menu #originsMenu=\"matMenu\">\n <div class=\"origins-menu-content\" (click)=\"$event.stopPropagation()\">\n <div class=\"origin-item body2\">{{ 'userPermissionDetails.originsLabel' | translate }}</div>\n @for (origin of permission.origins; track $index) {\n <div class=\"origin-item\">\n <mat-icon [class.allowed]=\"origin.isAllowed\" [class.denied]=\"!origin.isAllowed\">\n @if (origin.isAllowed) {\n check\n } @else {\n block\n }\n </mat-icon>\n <span class=\"origin-name body1\">\n {{ origin.kind === UserPermissionOriginKind.UserOverride\n ? ('userPermissionDetails.userOverrideOrigin' | translate)\n : origin.groupName }}\n </span>\n </div>\n } @empty {\n <div class=\"origin-item\">\n <span class=\"no-origins\">{{ 'userPermissionDetails.noOrigins' | translate }}</span>\n </div>\n }\n </div>\n </mat-menu>\n\n </mat-list-item>\n } @empty {\n <div class=\"no-result\">\n <mat-icon class=\"no-result-icon\">grid_off</mat-icon>\n <div class=\"no-result-text body2\">{{ 'noResult' | translate }}</div>\n </div>\n }\n</mat-list>\n", styles: [":host{display:flex;flex-direction:column;gap:16px}.search-field{width:100%}#permission-list{max-height:400px;overflow-y:auto;border:1px solid rgba(0,0,0,.23);border-radius:4px;padding:0}.permission-item{border-bottom:1px solid rgba(0,0,0,.12)}.permission-item:last-child{border-bottom:none}mat-list-item{margin-bottom:0}mat-list-item:nth-child(odd){background-color:#0000000d}mat-list-item:hover{transition:all ease-in-out .1s;background-color:#00000012}.mat-icon.allowed{color:var(--color-success, green)}.mat-icon.denied{color:var(--color-error, red)}.origins-menu-content{padding:8px;max-width:320px}.origin-item{display:flex;align-items:flex-start;gap:8px;padding:8px}.origin-item .mat-icon{flex-shrink:0}.origin-name{min-width:0;overflow-wrap:anywhere}.no-result{display:flex;flex-direction:column;align-items:center;padding:24px 0;color:#00000061}.no-result-icon{font-size:48px;width:48px;height:48px;margin-bottom:8px}.no-result-text{text-align:center}\n"] }]
1318
+ args: [{ selector: 'cauca-user-permission-list', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [MatListModule, MatFormField, MatLabel, MatInput, MatSuffix, MatIcon, MatMenuModule, TranslatePipe, IconButtonComponent], template: "<mat-form-field subscriptSizing=\"dynamic\" appearance=\"outline\" class=\"search-field\">\r\n <mat-label>{{ 'dataGrid.keywordsLabel' | translate }}</mat-label>\r\n <input matInput type=\"text\" [value]=\"searchText()\" (input)=\"searchText.set($any($event.target).value)\">\r\n <mat-icon matSuffix>search</mat-icon>\r\n</mat-form-field>\r\n\r\n<mat-list id=\"permission-list\">\r\n @for (permission of filteredPermissions(); track permission.idModulePermission) {\r\n <mat-list-item class=\"permission-item\">\r\n\r\n <mat-icon matListItemIcon\r\n [class.allowed]=\"permission.status === PermissionStatus.Allowed\"\r\n [class.denied]=\"permission.status !== PermissionStatus.Allowed\">\r\n @if (permission.status === PermissionStatus.Allowed) {\r\n check\r\n } @else {\r\n block\r\n }\r\n </mat-icon>\r\n\r\n <div matListItemTitle>{{ permission.name }}</div>\r\n\r\n <cauca-icon-button\r\n matListItemMeta\r\n icon=\"info\"\r\n [matMenuTriggerFor]=\"originsMenu\" />\r\n\r\n <mat-menu #originsMenu=\"matMenu\">\r\n <div class=\"origins-menu-content\" (click)=\"$event.stopPropagation()\">\r\n <div class=\"origin-item body2\">{{ 'userPermissionDetails.originsLabel' | translate }}</div>\r\n @for (origin of permission.origins; track $index) {\r\n <div class=\"origin-item\">\r\n <mat-icon [class.allowed]=\"origin.isAllowed\" [class.denied]=\"!origin.isAllowed\">\r\n @if (origin.isAllowed) {\r\n check\r\n } @else {\r\n block\r\n }\r\n </mat-icon>\r\n <span class=\"origin-name body1\">\r\n {{ origin.kind === UserPermissionOriginKind.UserOverride\r\n ? ('userPermissionDetails.userOverrideOrigin' | translate)\r\n : origin.groupName }}\r\n </span>\r\n </div>\r\n } @empty {\r\n <div class=\"origin-item\">\r\n <span class=\"no-origins\">{{ 'userPermissionDetails.noOrigins' | translate }}</span>\r\n </div>\r\n }\r\n </div>\r\n </mat-menu>\r\n\r\n </mat-list-item>\r\n } @empty {\r\n <div class=\"no-result\">\r\n <mat-icon class=\"no-result-icon\">grid_off</mat-icon>\r\n <div class=\"no-result-text body2\">{{ 'noResult' | translate }}</div>\r\n </div>\r\n }\r\n</mat-list>\r\n", styles: [":host{display:flex;flex-direction:column;gap:16px}.search-field{width:100%}#permission-list{max-height:400px;overflow-y:auto;border:1px solid rgba(0,0,0,.23);border-radius:4px;padding:0}.permission-item{border-bottom:1px solid rgba(0,0,0,.12)}.permission-item:last-child{border-bottom:none}mat-list-item{margin-bottom:0}mat-list-item:nth-child(odd){background-color:#0000000d}mat-list-item:hover{transition:all ease-in-out .1s;background-color:#00000012}.mat-icon.allowed{color:var(--color-success, green)}.mat-icon.denied{color:var(--color-error, red)}.origins-menu-content{padding:8px;max-width:320px}.origin-item{display:flex;align-items:flex-start;gap:8px;padding:8px}.origin-item .mat-icon{flex-shrink:0}.origin-name{min-width:0;overflow-wrap:anywhere}.no-result{display:flex;flex-direction:column;align-items:center;padding:24px 0;color:#00000061}.no-result-icon{font-size:48px;width:48px;height:48px;margin-bottom:8px}.no-result-text{text-align:center}\n"] }]
1319
1319
  }], null, { permissions: [{ type: i0.Input, args: [{ isSignal: true, alias: "permissions", required: true }] }] }); })();
1320
1320
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(UserPermissionListComponent, { className: "UserPermissionListComponent", filePath: "lib/components/user-permission-list/user-permission-list.component.ts", lineNumber: 20 }); })();
1321
1321
 
@@ -1383,7 +1383,7 @@ class UserPermissionsDialogComponent {
1383
1383
  LoadingErrorComponent,
1384
1384
  RaisedButtonComponent,
1385
1385
  UserPermissionListComponent,
1386
- ], providers: [LoadingStateService], template: "<div mat-dialog-title>\n <div class=\"title-block\">\n <div class=\"h6\">{{ 'userPermissionDetails.title' | translate }}</div>\n @if (data.userDisplayName) {\n <div class=\"subtitle body2\">{{ data.userDisplayName }}</div>\n }\n </div>\n</div>\n\n<mat-dialog-content class=\"dialog-content\">\n <cauca-loading-spinner-indicator />\n <cauca-loading-error (retryRequest)=\"permissionsResource.reload()\" />\n\n <cauca-user-permission-list [permissions]=\"permissions()\" />\n</mat-dialog-content>\n\n<mat-dialog-actions align=\"end\">\n <cauca-raised-button color=\"primary\" label=\"close\" (buttonClick)=\"closeDialog()\" />\n</mat-dialog-actions>\n", styles: [".title-block{display:flex;flex-direction:column}.subtitle{color:#0000008a}.dialog-content{display:flex;flex-direction:column;gap:16px;min-width:480px}\n"] }]
1386
+ ], providers: [LoadingStateService], template: "<div mat-dialog-title>\r\n <div class=\"title-block\">\r\n <div class=\"h6\">{{ 'userPermissionDetails.title' | translate }}</div>\r\n @if (data.userDisplayName) {\r\n <div class=\"subtitle body2\">{{ data.userDisplayName }}</div>\r\n }\r\n </div>\r\n</div>\r\n\r\n<mat-dialog-content class=\"dialog-content\">\r\n <cauca-loading-spinner-indicator />\r\n <cauca-loading-error (retryRequest)=\"permissionsResource.reload()\" />\r\n\r\n <cauca-user-permission-list [permissions]=\"permissions()\" />\r\n</mat-dialog-content>\r\n\r\n<mat-dialog-actions align=\"end\">\r\n <cauca-raised-button color=\"primary\" label=\"close\" (buttonClick)=\"closeDialog()\" />\r\n</mat-dialog-actions>\r\n", styles: [".title-block{display:flex;flex-direction:column}.subtitle{color:#0000008a}.dialog-content{display:flex;flex-direction:column;gap:16px;min-width:480px}\n"] }]
1387
1387
  }], null, null); })();
1388
1388
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(UserPermissionsDialogComponent, { className: "UserPermissionsDialogComponent", filePath: "lib/components/user-permissions-dialog/user-permissions-dialog.component.ts", lineNumber: 31 }); })();
1389
1389
 
@@ -1476,7 +1476,7 @@ class ScopeListGridColumnComponent extends BaseGridColumnComponent {
1476
1476
  args: [{ selector: 'cauca-scope-list-grid-column', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, providers: [{ provide: BaseGridColumnComponent, useExisting: forwardRef(() => ScopeListGridColumnComponent) }], imports: [
1477
1477
  MatColumnDef, MatHeaderCell, MatHeaderCellDef, MatCell, MatCellDef, MatFooterCell, MatFooterCellDef,
1478
1478
  NgStyle, MatTooltip, TranslatePipe,
1479
- ], template: "<ng-container matColumnDef=\"{{ prop() }}\">\n\n <th mat-header-cell *matHeaderCellDef [ngStyle]=\"{'width': width()}\">\n {{ label() ?? capitalize(prop()) }}\n </th>\n\n <td mat-cell *matCellDef=\"let row\">\n @if (row[prop()] === allToken) {\n <span>{{ allLabel() | translate }}</span>\n } @else if (showToolTip()) {\n <span [matTooltip]=\"row[prop()]\">{{ row[prop()] }}</span>\n } @else {\n <span>{{ row[prop()] }}</span>\n }\n </td>\n\n <td mat-footer-cell *matFooterCellDef></td>\n\n</ng-container>\n" }]
1479
+ ], template: "<ng-container matColumnDef=\"{{ prop() }}\">\r\n\r\n <th mat-header-cell *matHeaderCellDef [ngStyle]=\"{'width': width()}\">\r\n {{ label() ?? capitalize(prop()) }}\r\n </th>\r\n\r\n <td mat-cell *matCellDef=\"let row\">\r\n @if (row[prop()] === allToken) {\r\n <span>{{ allLabel() | translate }}</span>\r\n } @else if (showToolTip()) {\r\n <span [matTooltip]=\"row[prop()]\">{{ row[prop()] }}</span>\r\n } @else {\r\n <span>{{ row[prop()] }}</span>\r\n }\r\n </td>\r\n\r\n <td mat-footer-cell *matFooterCellDef></td>\r\n\r\n</ng-container>\r\n" }]
1480
1480
  }], () => [], { allLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "allLabel", required: true }] }] }); })();
1481
1481
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ScopeListGridColumnComponent, { className: "ScopeListGridColumnComponent", filePath: "lib/components/scope-list-grid-column/scope-list-grid-column.component.ts", lineNumber: 28 }); })();
1482
1482
 
@@ -1642,7 +1642,7 @@ class UserListGridComponent {
1642
1642
  args: [{ selector: 'cauca-user-list-grid', changeDetection: ChangeDetectionStrategy.OnPush, imports: [
1643
1643
  MatSort, OdataGridComponent, SortableDataGridColumnComponent, SortableDataGridCheckColumnComponent,
1644
1644
  ScopeListGridColumnComponent, DataGridMenuColumnComponent, MenuItemComponent, TranslatePipe,
1645
- ], template: "<cauca-odata-grid\n matSort\n matSortActive=\"userName\"\n matSortDirection=\"asc\"\n aria-label=\"Users table\"\n resourceName=\"UserList\"\n [persistState]=\"persistState()\"\n [showTableOptions]=\"true\"\n [showRefreshButton]=\"true\"\n [showAddButton]=\"showAddButton()\"\n [addButtonLabel]=\"addButtonLabel() | translate\"\n (addButtonClick)=\"addClick.emit()\"\n [baseSort]=\"['userName']\"\n [filterPredicate]=\"filterPredicate\"\n [displayedColumns]=\"columns()\">\n\n <cauca-sortable-data-grid-column id=\"userName\" prop=\"userName\" [showToolTip]=\"true\"\n [label]=\"'userList.column.userName' | translate\"/>\n <cauca-sortable-data-grid-column id=\"firstName\" prop=\"firstName\" [showToolTip]=\"true\"\n [label]=\"'userList.column.firstName' | translate\"/>\n <cauca-sortable-data-grid-column id=\"lastName\" prop=\"lastName\" [showToolTip]=\"true\"\n [label]=\"'userList.column.lastName' | translate\"/>\n\n @for (column of extraColumns(); track column.prop) {\n @switch (column.kind) {\n @case ('scope') {\n <cauca-scope-list-grid-column [id]=\"column.prop\" [prop]=\"column.prop\"\n [width]=\"column.width ?? ''\"\n [showToolTip]=\"column.showToolTip ?? true\"\n [allLabel]=\"column.allLabel ?? ''\"\n [visibleByDefault]=\"column.visibleByDefault ?? true\"\n [label]=\"column.label | translate\"/>\n }\n @case ('check') {\n <cauca-sortable-data-grid-check-column [id]=\"column.prop\" [prop]=\"column.prop\"\n [width]=\"column.width ?? ''\"\n [visibleByDefault]=\"column.visibleByDefault ?? true\"\n [label]=\"column.label | translate\"/>\n }\n @default {\n <cauca-sortable-data-grid-column [id]=\"column.prop\" [prop]=\"column.prop\"\n [width]=\"column.width ?? ''\"\n [showToolTip]=\"column.showToolTip ?? true\"\n [visibleByDefault]=\"column.visibleByDefault ?? true\"\n [label]=\"column.label | translate\"/>\n }\n }\n }\n\n @if (hasRowActions()) {\n <cauca-data-grid-menu-column id=\"buttons\" prop=\"menu\"\n [canEdit]=\"canEdit()\"\n [canDelete]=\"canDelete()\"\n [editLinkField]=\"editLinkField()\"\n (deleteClick)=\"onDelete($event)\">\n <ng-template #menuTemplate let-row=\"row\">\n @if (showPermissions()) {\n <cauca-menu-item icon=\"list\" label=\"userList.viewPermissions\" [translateLabel]=\"true\"\n (buttonClick)=\"openPermissions(row)\"/>\n }\n </ng-template>\n </cauca-data-grid-menu-column>\n }\n\n</cauca-odata-grid>\n" }]
1645
+ ], template: "<cauca-odata-grid\r\n matSort\r\n matSortActive=\"userName\"\r\n matSortDirection=\"asc\"\r\n aria-label=\"Users table\"\r\n resourceName=\"UserList\"\r\n [persistState]=\"persistState()\"\r\n [showTableOptions]=\"true\"\r\n [showRefreshButton]=\"true\"\r\n [showAddButton]=\"showAddButton()\"\r\n [addButtonLabel]=\"addButtonLabel() | translate\"\r\n (addButtonClick)=\"addClick.emit()\"\r\n [baseSort]=\"['userName']\"\r\n [filterPredicate]=\"filterPredicate\"\r\n [displayedColumns]=\"columns()\">\r\n\r\n <cauca-sortable-data-grid-column id=\"userName\" prop=\"userName\" [showToolTip]=\"true\"\r\n [label]=\"'userList.column.userName' | translate\"/>\r\n <cauca-sortable-data-grid-column id=\"firstName\" prop=\"firstName\" [showToolTip]=\"true\"\r\n [label]=\"'userList.column.firstName' | translate\"/>\r\n <cauca-sortable-data-grid-column id=\"lastName\" prop=\"lastName\" [showToolTip]=\"true\"\r\n [label]=\"'userList.column.lastName' | translate\"/>\r\n\r\n @for (column of extraColumns(); track column.prop) {\r\n @switch (column.kind) {\r\n @case ('scope') {\r\n <cauca-scope-list-grid-column [id]=\"column.prop\" [prop]=\"column.prop\"\r\n [width]=\"column.width ?? ''\"\r\n [showToolTip]=\"column.showToolTip ?? true\"\r\n [allLabel]=\"column.allLabel ?? ''\"\r\n [visibleByDefault]=\"column.visibleByDefault ?? true\"\r\n [label]=\"column.label | translate\"/>\r\n }\r\n @case ('check') {\r\n <cauca-sortable-data-grid-check-column [id]=\"column.prop\" [prop]=\"column.prop\"\r\n [width]=\"column.width ?? ''\"\r\n [visibleByDefault]=\"column.visibleByDefault ?? true\"\r\n [label]=\"column.label | translate\"/>\r\n }\r\n @default {\r\n <cauca-sortable-data-grid-column [id]=\"column.prop\" [prop]=\"column.prop\"\r\n [width]=\"column.width ?? ''\"\r\n [showToolTip]=\"column.showToolTip ?? true\"\r\n [visibleByDefault]=\"column.visibleByDefault ?? true\"\r\n [label]=\"column.label | translate\"/>\r\n }\r\n }\r\n }\r\n\r\n @if (hasRowActions()) {\r\n <cauca-data-grid-menu-column id=\"buttons\" prop=\"menu\"\r\n [canEdit]=\"canEdit()\"\r\n [canDelete]=\"canDelete()\"\r\n [editLinkField]=\"editLinkField()\"\r\n (deleteClick)=\"onDelete($event)\">\r\n <ng-template #menuTemplate let-row=\"row\">\r\n @if (showPermissions()) {\r\n <cauca-menu-item icon=\"list\" label=\"userList.viewPermissions\" [translateLabel]=\"true\"\r\n (buttonClick)=\"openPermissions(row)\"/>\r\n }\r\n </ng-template>\r\n </cauca-data-grid-menu-column>\r\n }\r\n\r\n</cauca-odata-grid>\r\n" }]
1646
1646
  }], null, { extraColumns: [{ type: i0.Input, args: [{ isSignal: true, alias: "extraColumns", required: false }] }], showAddButton: [{ type: i0.Input, args: [{ isSignal: true, alias: "showAddButton", required: false }] }], addButtonLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "addButtonLabel", required: false }] }], canEdit: [{ type: i0.Input, args: [{ isSignal: true, alias: "canEdit", required: false }] }], canDelete: [{ type: i0.Input, args: [{ isSignal: true, alias: "canDelete", required: false }] }], editLinkField: [{ type: i0.Input, args: [{ isSignal: true, alias: "editLinkField", required: false }] }], showPermissions: [{ type: i0.Input, args: [{ isSignal: true, alias: "showPermissions", required: false }] }], persistState: [{ type: i0.Input, args: [{ isSignal: true, alias: "persistState", required: false }] }], addClick: [{ type: i0.Output, args: ["addClick"] }], deleteClick: [{ type: i0.Output, args: ["deleteClick"] }], grid: [{ type: i0.ViewChild, args: [i0.forwardRef(() => OdataGridComponent), { isSignal: true }] }], sort: [{ type: i0.ViewChild, args: [i0.forwardRef(() => MatSort), { isSignal: true }] }] }); })();
1647
1647
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(UserListGridComponent, { className: "UserListGridComponent", filePath: "lib/components/user-list-grid/user-list-grid.component.ts", lineNumber: 27 }); })();
1648
1648
 
@@ -1697,7 +1697,7 @@ class UsersPageComponent {
1697
1697
  }
1698
1698
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(UsersPageComponent, [{
1699
1699
  type: Component,
1700
- args: [{ selector: 'cauca-users-page', changeDetection: ChangeDetectionStrategy.OnPush, imports: [MatCardModule, PageTitleComponent, UserListGridComponent], template: "<cauca-page-title\n [showBreadcrumb]=\"true\"\n [caption]=\"caption()\"\n [baseCrumb]=\"baseCrumb()\"\n [breadcrumb]=\"breadcrumb()\"/>\n\n<mat-card class=\"page-content\">\n\n <mat-card-content class=\"page-content-grid\">\n <cauca-user-list-grid\n [extraColumns]=\"extraColumns()\"\n [showAddButton]=\"showAddButton()\"\n [addButtonLabel]=\"addButtonLabel()\"\n [canEdit]=\"canEdit()\"\n [canDelete]=\"canDelete()\"\n [editLinkField]=\"editLinkField()\"\n [showPermissions]=\"showPermissions()\"\n [persistState]=\"persistState()\"\n (addClick)=\"addClick.emit()\"\n (deleteClick)=\"deleteClick.emit($event)\"/>\n </mat-card-content>\n\n</mat-card>\n" }]
1700
+ args: [{ selector: 'cauca-users-page', changeDetection: ChangeDetectionStrategy.OnPush, imports: [MatCardModule, PageTitleComponent, UserListGridComponent], template: "<cauca-page-title\r\n [showBreadcrumb]=\"true\"\r\n [caption]=\"caption()\"\r\n [baseCrumb]=\"baseCrumb()\"\r\n [breadcrumb]=\"breadcrumb()\"/>\r\n\r\n<mat-card class=\"page-content\">\r\n\r\n <mat-card-content class=\"page-content-grid\">\r\n <cauca-user-list-grid\r\n [extraColumns]=\"extraColumns()\"\r\n [showAddButton]=\"showAddButton()\"\r\n [addButtonLabel]=\"addButtonLabel()\"\r\n [canEdit]=\"canEdit()\"\r\n [canDelete]=\"canDelete()\"\r\n [editLinkField]=\"editLinkField()\"\r\n [showPermissions]=\"showPermissions()\"\r\n [persistState]=\"persistState()\"\r\n (addClick)=\"addClick.emit()\"\r\n (deleteClick)=\"deleteClick.emit($event)\"/>\r\n </mat-card-content>\r\n\r\n</mat-card>\r\n" }]
1701
1701
  }], null, { caption: [{ type: i0.Input, args: [{ isSignal: true, alias: "caption", required: false }] }], baseCrumb: [{ type: i0.Input, args: [{ isSignal: true, alias: "baseCrumb", required: false }] }], breadcrumb: [{ type: i0.Input, args: [{ isSignal: true, alias: "breadcrumb", required: false }] }], extraColumns: [{ type: i0.Input, args: [{ isSignal: true, alias: "extraColumns", required: false }] }], showAddButton: [{ type: i0.Input, args: [{ isSignal: true, alias: "showAddButton", required: false }] }], addButtonLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "addButtonLabel", required: false }] }], canEdit: [{ type: i0.Input, args: [{ isSignal: true, alias: "canEdit", required: false }] }], canDelete: [{ type: i0.Input, args: [{ isSignal: true, alias: "canDelete", required: false }] }], editLinkField: [{ type: i0.Input, args: [{ isSignal: true, alias: "editLinkField", required: false }] }], showPermissions: [{ type: i0.Input, args: [{ isSignal: true, alias: "showPermissions", required: false }] }], persistState: [{ type: i0.Input, args: [{ isSignal: true, alias: "persistState", required: false }] }], addClick: [{ type: i0.Output, args: ["addClick"] }], deleteClick: [{ type: i0.Output, args: ["deleteClick"] }], grid: [{ type: i0.ViewChild, args: [i0.forwardRef(() => UserListGridComponent), { isSignal: true }] }] }); })();
1702
1702
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(UsersPageComponent, { className: "UsersPageComponent", filePath: "lib/pages/users-page/users-page.component.ts", lineNumber: 14 }); })();
1703
1703
 
@@ -1885,7 +1885,7 @@ class UserLoginFieldsComponent {
1885
1885
  MatSlideToggleModule,
1886
1886
  PasswordSelectionComponent,
1887
1887
  TranslatePipe,
1888
- ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<cauca-expandable-panel [caption]=\"'userEdition.loginSectionCaption' | translate\">\n <div class=\"user-login-fields\">\n <mat-form-field id=\"user-name-field\" subscriptSizing=\"dynamic\">\n <mat-label>{{ 'management.userName' | translate }}</mat-label>\n <input matInput [attr.aria-label]=\"'management.userName' | translate\" [formField]=\"field().userName\">\n @if (isValidatingUserName()) {\n <mat-progress-spinner matSuffix diameter=\"16\" mode=\"indeterminate\"/>\n }\n </mat-form-field>\n <cauca-field-errors [field]=\"field().userName\"/>\n\n <div class=\"password-fields\">\n <cauca-password-selection [required]=\"isNew()\" [formField]=\"field().password\"/>\n </div>\n\n <mat-slide-toggle color=\"primary\" [formField]=\"field().twoFactorAuthenticatorEnabled\">\n {{ 'userEdition.twoFactorAuthenticatorEnabled' | translate }}\n </mat-slide-toggle>\n\n <ng-content/>\n </div>\n</cauca-expandable-panel>\n", styles: [":host{display:block}.user-login-fields{display:flex;flex-direction:column}.user-login-fields mat-form-field:not(:first-child),.user-login-fields .password-fields,.user-login-fields mat-slide-toggle{margin-top:1.25rem}\n"] }]
1888
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<cauca-expandable-panel [caption]=\"'userEdition.loginSectionCaption' | translate\">\r\n <div class=\"user-login-fields\">\r\n <mat-form-field id=\"user-name-field\" subscriptSizing=\"dynamic\">\r\n <mat-label>{{ 'management.userName' | translate }}</mat-label>\r\n <input matInput [attr.aria-label]=\"'management.userName' | translate\" [formField]=\"field().userName\">\r\n @if (isValidatingUserName()) {\r\n <mat-progress-spinner matSuffix diameter=\"16\" mode=\"indeterminate\"/>\r\n }\r\n </mat-form-field>\r\n <cauca-field-errors [field]=\"field().userName\"/>\r\n\r\n <div class=\"password-fields\">\r\n <cauca-password-selection [required]=\"isNew()\" [formField]=\"field().password\"/>\r\n </div>\r\n\r\n <mat-slide-toggle color=\"primary\" [formField]=\"field().twoFactorAuthenticatorEnabled\">\r\n {{ 'userEdition.twoFactorAuthenticatorEnabled' | translate }}\r\n </mat-slide-toggle>\r\n\r\n <ng-content/>\r\n </div>\r\n</cauca-expandable-panel>\r\n", styles: [":host{display:block}.user-login-fields{display:flex;flex-direction:column}.user-login-fields mat-form-field:not(:first-child),.user-login-fields .password-fields,.user-login-fields mat-slide-toggle{margin-top:1.25rem}\n"] }]
1889
1889
  }], null, { field: [{ type: i0.Input, args: [{ isSignal: true, alias: "field", required: true }] }], isNew: [{ type: i0.Input, args: [{ isSignal: true, alias: "isNew", required: false }] }], isValidatingUserName: [{ type: i0.Input, args: [{ isSignal: true, alias: "isValidatingUserName", required: false }] }] }); })();
1890
1890
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(UserLoginFieldsComponent, { className: "UserLoginFieldsComponent", filePath: "lib/components/user-login-fields/user-login-fields.component.ts", lineNumber: 28 }); })();
1891
1891
 
@@ -1992,7 +1992,7 @@ class UserPersonalInformationFieldsComponent {
1992
1992
  MatInputModule,
1993
1993
  PhoneNumberInputComponent,
1994
1994
  TranslatePipe,
1995
- ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<cauca-expandable-panel [caption]=\"'userEdition.personalInformationSectionCaption' | translate\">\n <div class=\"user-personal-information-fields\">\n <mat-form-field id=\"first-name-field\" subscriptSizing=\"dynamic\">\n <mat-label>{{ 'management.firstName' | translate }}</mat-label>\n <input matInput [attr.aria-label]=\"'management.firstName' | translate\" [formField]=\"field().firstName\">\n </mat-form-field>\n <cauca-field-errors [field]=\"field().firstName\"/>\n\n <mat-form-field id=\"last-name-field\" subscriptSizing=\"dynamic\">\n <mat-label>{{ 'management.lastName' | translate }}</mat-label>\n <input matInput [attr.aria-label]=\"'management.lastName' | translate\" [formField]=\"field().lastName\">\n </mat-form-field>\n <cauca-field-errors [field]=\"field().lastName\"/>\n\n <mat-form-field id=\"email-field\" subscriptSizing=\"dynamic\">\n <mat-label>{{ 'management.email' | translate }}</mat-label>\n <input matInput [attr.aria-label]=\"'management.email' | translate\" [formField]=\"field().email\">\n @if (isEmailReadOnly() && emailHint()) {\n <mat-hint>{{ emailHint() | translate }}</mat-hint>\n }\n </mat-form-field>\n <cauca-field-errors [field]=\"field().email\"/>\n\n <cauca-phone-number-input [formField]=\"field().phoneNumber\" [label]=\"'management.phoneNumber'\"/>\n\n <ng-content/>\n </div>\n</cauca-expandable-panel>\n", styles: [":host{display:block}.user-personal-information-fields{display:flex;flex-direction:column}.user-personal-information-fields mat-form-field:not(:first-child),.user-personal-information-fields cauca-phone-number-input{margin-top:1.25rem}\n"] }]
1995
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<cauca-expandable-panel [caption]=\"'userEdition.personalInformationSectionCaption' | translate\">\r\n <div class=\"user-personal-information-fields\">\r\n <mat-form-field id=\"first-name-field\" subscriptSizing=\"dynamic\">\r\n <mat-label>{{ 'management.firstName' | translate }}</mat-label>\r\n <input matInput [attr.aria-label]=\"'management.firstName' | translate\" [formField]=\"field().firstName\">\r\n </mat-form-field>\r\n <cauca-field-errors [field]=\"field().firstName\"/>\r\n\r\n <mat-form-field id=\"last-name-field\" subscriptSizing=\"dynamic\">\r\n <mat-label>{{ 'management.lastName' | translate }}</mat-label>\r\n <input matInput [attr.aria-label]=\"'management.lastName' | translate\" [formField]=\"field().lastName\">\r\n </mat-form-field>\r\n <cauca-field-errors [field]=\"field().lastName\"/>\r\n\r\n <mat-form-field id=\"email-field\" subscriptSizing=\"dynamic\">\r\n <mat-label>{{ 'management.email' | translate }}</mat-label>\r\n <input matInput [attr.aria-label]=\"'management.email' | translate\" [formField]=\"field().email\">\r\n @if (isEmailReadOnly() && emailHint()) {\r\n <mat-hint>{{ emailHint() | translate }}</mat-hint>\r\n }\r\n </mat-form-field>\r\n <cauca-field-errors [field]=\"field().email\"/>\r\n\r\n <cauca-phone-number-input [formField]=\"field().phoneNumber\" [label]=\"'management.phoneNumber'\"/>\r\n\r\n <ng-content/>\r\n </div>\r\n</cauca-expandable-panel>\r\n", styles: [":host{display:block}.user-personal-information-fields{display:flex;flex-direction:column}.user-personal-information-fields mat-form-field:not(:first-child),.user-personal-information-fields cauca-phone-number-input{margin-top:1.25rem}\n"] }]
1996
1996
  }], null, { field: [{ type: i0.Input, args: [{ isSignal: true, alias: "field", required: true }] }], isEmailReadOnly: [{ type: i0.Input, args: [{ isSignal: true, alias: "isEmailReadOnly", required: false }] }], emailHint: [{ type: i0.Input, args: [{ isSignal: true, alias: "emailHint", required: false }] }] }); })();
1997
1997
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(UserPersonalInformationFieldsComponent, { className: "UserPersonalInformationFieldsComponent", filePath: "lib/components/user-personal-information-fields/user-personal-information-fields.component.ts", lineNumber: 24 }); })();
1998
1998
 
@@ -2018,13 +2018,19 @@ class UserGroupsSelectorComponent {
2018
2018
  ...(ngDevMode ? [{ debugName: "name" }] : /* istanbul ignore next */ []));
2019
2019
  this.errors = input([], /* @ts-ignore */
2020
2020
  ...(ngDevMode ? [{ debugName: "errors" }] : /* istanbul ignore next */ []));
2021
+ this.assignedGroups = input([], /* @ts-ignore */
2022
+ ...(ngDevMode ? [{ debugName: "assignedGroups" }] : /* istanbul ignore next */ []));
2021
2023
  this.touch = output();
2022
2024
  // `DropdownChipAutocompleteComponent` is a `ControlValueAccessor` and stays one per ADR-0005,
2023
2025
  // so a reactive control is the only channel through which its selection can be read back.
2024
2026
  this.selectedGroupIds = new FormControl([], { nonNullable: true });
2025
- this.options = computed(() => this.groups.value(), /* @ts-ignore */
2027
+ this.lockedGroups = computed(() => this.assignedGroups().filter((assigned) => !this.groups.value().some((group) => group.id === assigned.id)), /* @ts-ignore */
2028
+ ...(ngDevMode ? [{ debugName: "lockedGroups" }] : /* istanbul ignore next */ []));
2029
+ this.lockedGroupIds = computed(() => this.lockedGroups().map((group) => group.id), /* @ts-ignore */
2030
+ ...(ngDevMode ? [{ debugName: "lockedGroupIds" }] : /* istanbul ignore next */ []));
2031
+ this.options = computed(() => [...this.groups.value(), ...this.lockedGroups()], /* @ts-ignore */
2026
2032
  ...(ngDevMode ? [{ debugName: "options" }] : /* istanbul ignore next */ []));
2027
- this.isControlDisabled = computed(() => this.disabled() || this.readonly() || this.options().length === 0, /* @ts-ignore */
2033
+ this.isControlDisabled = computed(() => this.disabled() || this.readonly() || this.groups.value().length === 0, /* @ts-ignore */
2028
2034
  ...(ngDevMode ? [{ debugName: "isControlDisabled" }] : /* istanbul ignore next */ []));
2029
2035
  this.assignableGroupsService = inject(AssignableGroupsService);
2030
2036
  this.groups = rxResource({
@@ -2062,7 +2068,7 @@ class UserGroupsSelectorComponent {
2062
2068
  this.touch.emit();
2063
2069
  }
2064
2070
  static { this.ɵfac = function UserGroupsSelectorComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || UserGroupsSelectorComponent)(); }; }
2065
- static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: UserGroupsSelectorComponent, selectors: [["cauca-user-groups-selector"]], inputs: { value: [1, "value"], label: [1, "label"], disabled: [1, "disabled"], readonly: [1, "readonly"], required: [1, "required"], invalid: [1, "invalid"], touched: [1, "touched"], name: [1, "name"], errors: [1, "errors"] }, outputs: { value: "valueChange", touch: "touch" }, decls: 6, vars: 14, consts: [["subscriptSizing", "dynamic", 1, "user-groups-selector-field"], ["caucaControlErrorState", "", "keyValue", "id", "displayValue", "name", 3, "touched", "errors", "formControl", "listAutoComplete", "allowRemove", "canRemoveAll", "required"], [3, "touched", "errors"]], template: function UserGroupsSelectorComponent_Template(rf, ctx) { if (rf & 1) {
2071
+ static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: UserGroupsSelectorComponent, selectors: [["cauca-user-groups-selector"]], inputs: { value: [1, "value"], label: [1, "label"], disabled: [1, "disabled"], readonly: [1, "readonly"], required: [1, "required"], invalid: [1, "invalid"], touched: [1, "touched"], name: [1, "name"], errors: [1, "errors"], assignedGroups: [1, "assignedGroups"] }, outputs: { value: "valueChange", touch: "touch" }, decls: 6, vars: 15, consts: [["subscriptSizing", "dynamic", 1, "user-groups-selector-field"], ["caucaControlErrorState", "", "keyValue", "id", "displayValue", "name", 3, "touched", "errors", "formControl", "listAutoComplete", "lockedValues", "allowRemove", "canRemoveAll", "required"], [3, "touched", "errors"]], template: function UserGroupsSelectorComponent_Template(rf, ctx) { if (rf & 1) {
2066
2072
  i0.ɵɵelementStart(0, "mat-form-field", 0)(1, "mat-label");
2067
2073
  i0.ɵɵtext(2);
2068
2074
  i0.ɵɵpipe(3, "translate");
@@ -2073,9 +2079,9 @@ class UserGroupsSelectorComponent {
2073
2079
  i0.ɵɵelement(5, "cauca-control-field-errors", 2);
2074
2080
  } if (rf & 2) {
2075
2081
  i0.ɵɵadvance(2);
2076
- i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(3, 12, ctx.label()));
2082
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(3, 13, ctx.label()));
2077
2083
  i0.ɵɵadvance(2);
2078
- i0.ɵɵproperty("touched", ctx.touched())("errors", ctx.errors())("formControl", ctx.selectedGroupIds)("listAutoComplete", ctx.options())("allowRemove", !ctx.isControlDisabled())("canRemoveAll", !ctx.isControlDisabled())("required", ctx.required());
2084
+ i0.ɵɵproperty("touched", ctx.touched())("errors", ctx.errors())("formControl", ctx.selectedGroupIds)("listAutoComplete", ctx.options())("lockedValues", ctx.lockedGroupIds())("allowRemove", !ctx.isControlDisabled())("canRemoveAll", !ctx.isControlDisabled())("required", ctx.required());
2079
2085
  i0.ɵɵattribute("aria-invalid", ctx.invalid())("name", ctx.name() || null);
2080
2086
  i0.ɵɵcontrol();
2081
2087
  i0.ɵɵadvance();
@@ -2094,8 +2100,8 @@ class UserGroupsSelectorComponent {
2094
2100
  MatFormFieldModule,
2095
2101
  ReactiveFormsModule,
2096
2102
  TranslatePipe,
2097
- ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<mat-form-field class=\"user-groups-selector-field\" subscriptSizing=\"dynamic\">\n <mat-label>{{ label() | translate }}</mat-label>\n\n <cauca-dropdown-chip-autocomplete\n caucaControlErrorState [touched]=\"touched()\" [errors]=\"errors()\"\n [formControl]=\"selectedGroupIds\"\n [listAutoComplete]=\"options()\"\n keyValue=\"id\"\n displayValue=\"name\"\n [allowRemove]=\"!isControlDisabled()\"\n [canRemoveAll]=\"!isControlDisabled()\"\n [required]=\"required()\"\n [attr.aria-invalid]=\"invalid()\"\n [attr.name]=\"name() || null\"/>\n</mat-form-field>\n\n<cauca-control-field-errors [touched]=\"touched()\" [errors]=\"errors()\"/>\n", styles: [":host{display:block}.user-groups-selector-field{width:100%}\n"] }]
2098
- }], () => [], { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], readonly: [{ type: i0.Input, args: [{ isSignal: true, alias: "readonly", required: false }] }], required: [{ type: i0.Input, args: [{ isSignal: true, alias: "required", required: false }] }], invalid: [{ type: i0.Input, args: [{ isSignal: true, alias: "invalid", required: false }] }], touched: [{ type: i0.Input, args: [{ isSignal: true, alias: "touched", required: false }] }], name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: false }] }], errors: [{ type: i0.Input, args: [{ isSignal: true, alias: "errors", required: false }] }], touch: [{ type: i0.Output, args: ["touch"] }] }); })();
2103
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<mat-form-field class=\"user-groups-selector-field\" subscriptSizing=\"dynamic\">\r\n <mat-label>{{ label() | translate }}</mat-label>\r\n\r\n <cauca-dropdown-chip-autocomplete\r\n caucaControlErrorState [touched]=\"touched()\" [errors]=\"errors()\"\r\n [formControl]=\"selectedGroupIds\"\r\n [listAutoComplete]=\"options()\"\r\n [lockedValues]=\"lockedGroupIds()\"\r\n keyValue=\"id\"\r\n displayValue=\"name\"\r\n [allowRemove]=\"!isControlDisabled()\"\r\n [canRemoveAll]=\"!isControlDisabled()\"\r\n [required]=\"required()\"\r\n [attr.aria-invalid]=\"invalid()\"\r\n [attr.name]=\"name() || null\"/>\r\n</mat-form-field>\r\n\r\n<cauca-control-field-errors [touched]=\"touched()\" [errors]=\"errors()\"/>\r\n", styles: [":host{display:block}.user-groups-selector-field{width:100%}\n"] }]
2104
+ }], () => [], { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], readonly: [{ type: i0.Input, args: [{ isSignal: true, alias: "readonly", required: false }] }], required: [{ type: i0.Input, args: [{ isSignal: true, alias: "required", required: false }] }], invalid: [{ type: i0.Input, args: [{ isSignal: true, alias: "invalid", required: false }] }], touched: [{ type: i0.Input, args: [{ isSignal: true, alias: "touched", required: false }] }], name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: false }] }], errors: [{ type: i0.Input, args: [{ isSignal: true, alias: "errors", required: false }] }], assignedGroups: [{ type: i0.Input, args: [{ isSignal: true, alias: "assignedGroups", required: false }] }], touch: [{ type: i0.Output, args: ["touch"] }] }); })();
2099
2105
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(UserGroupsSelectorComponent, { className: "UserGroupsSelectorComponent", filePath: "lib/components/user-groups-selector/user-groups-selector.component.ts", lineNumber: 29 }); })();
2100
2106
  function haveSameIds(left, right) {
2101
2107
  return left.length === right.length && left.every((id, index) => id === right[index]);