@ieeesa-npm/groups 0.15.9 → 0.15.10
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.
- package/esm2022/lib/assets/constants.json +75 -4
- package/esm2022/lib/components/interest-form/interest-form.component.mjs +104 -0
- package/esm2022/lib/components/interest-form-management/interest-form-management.component.mjs +63 -0
- package/esm2022/lib/components/interested-rosters/interested-rosters.component.mjs +28 -0
- package/esm2022/lib/components/roster-import/roster-import.component.mjs +149 -82
- package/esm2022/lib/components/roster-import-history/roster-import-history.component.mjs +232 -0
- package/esm2022/lib/components/tree-view/tree-view.component.mjs +26 -5
- package/esm2022/lib/components/view-roster/view-roster.component.mjs +10 -3
- package/esm2022/lib/groups.component.mjs +60 -6
- package/esm2022/lib/models/group-action.model.mjs +2 -1
- package/esm2022/lib/models/group-function-type.model.mjs +2 -1
- package/esm2022/lib/models/permission-type.model.mjs +2 -1
- package/esm2022/lib/models/roster-import.model.mjs +34 -17
- package/esm2022/lib/services/roster-import-api.service.mjs +174 -0
- package/esm2022/public-api.mjs +6 -1
- package/fesm2022/ieeesa-npm-groups.mjs +930 -211
- package/fesm2022/ieeesa-npm-groups.mjs.map +1 -1
- package/lib/components/interest-form/interest-form.component.d.ts +75 -0
- package/lib/components/interest-form-management/interest-form-management.component.d.ts +31 -0
- package/lib/components/interested-rosters/interested-rosters.component.d.ts +17 -0
- package/lib/components/roster-import/roster-import.component.d.ts +77 -38
- package/lib/components/roster-import-history/roster-import-history.component.d.ts +102 -0
- package/lib/components/tree-view/tree-view.component.d.ts +6 -3
- package/lib/components/view-roster/view-roster.component.d.ts +5 -0
- package/lib/groups.component.d.ts +17 -0
- package/lib/models/group-action.model.d.ts +2 -1
- package/lib/models/group-function-type.model.d.ts +2 -1
- package/lib/models/permission-type.model.d.ts +2 -1
- package/lib/models/roster-import.model.d.ts +104 -21
- package/lib/services/groups.service.d.ts +4 -0
- package/lib/services/roster-import-api.service.d.ts +108 -0
- package/package.json +1 -1
- package/public-api.d.ts +5 -0
- package/esm2022/lib/assets/roster-import-mocks.mjs +0 -98
- package/lib/assets/roster-import-mocks.d.ts +0 -27
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ieeesa-npm-groups.mjs","sources":["../../../projects/groups/src/lib/assets/form-validations.ts","../../../projects/groups/src/lib/models/group-function-type.model.ts","../../../projects/groups/src/lib/components/add-working-groups/add-working-groups.component.ts","../../../projects/groups/src/lib/components/add-working-groups/add-working-groups.component.html","../../../projects/groups/src/lib/models/roster-type.model.ts","../../../projects/groups/src/lib/models/permission-type.model.ts","../../../projects/groups/src/lib/models/role-type.model.ts","../../../projects/groups/src/lib/services/group-permissions-map-service.ts","../../../projects/groups/src/lib/services/user-permissions.service.ts","../../../projects/groups/src/lib/services/groups.service.ts","../../../projects/groups/src/lib/components/reciprocal-credit-section/reciprocal-credit-section.component.ts","../../../projects/groups/src/lib/components/reciprocal-credit-section/reciprocal-credit-section.component.html","../../../projects/groups/src/lib/components/create-group/create-group.component.ts","../../../projects/groups/src/lib/components/create-group/create-group.component.html","../../../projects/groups/src/lib/models/group-action.model.ts","../../../projects/groups/src/lib/components/tree-view/tree-view.component.ts","../../../projects/groups/src/lib/components/tree-view/tree-view.component.html","../../../projects/groups/src/lib/components/org-multi-select/org-multi-select.component.ts","../../../projects/groups/src/lib/components/org-multi-select/org-multi-select.component.html","../../../projects/groups/src/lib/components/edit-user-roles/edit-user-roles.component.ts","../../../projects/groups/src/lib/components/edit-user-roles/edit-user-roles.component.html","../../../projects/groups/src/lib/models/roster-import.model.ts","../../../projects/groups/src/lib/assets/roster-import-mocks.ts","../../../projects/groups/src/lib/components/roster-import/roster-import.component.ts","../../../projects/groups/src/lib/components/roster-import/roster-import.component.html","../../../projects/groups/src/lib/models/roster-function-type.model.ts","../../../projects/groups/src/lib/components/add-user-roster/add-user-roster.component.ts","../../../projects/groups/src/lib/components/add-user-roster/add-user-roster.component.html","../../../projects/groups/src/lib/models/filter-type.model.ts","../../../projects/groups/src/lib/models/table-column-schema-user-group.model.ts","../../../projects/groups/src/lib/services/roster-export.service.ts","../../../projects/groups/src/lib/components/view-roster/view-roster.component.ts","../../../projects/groups/src/lib/components/view-roster/view-roster.component.html","../../../projects/groups/src/lib/groups.component.ts","../../../projects/groups/src/lib/groups.component.html","../../../projects/groups/src/lib/groups.module.ts","../../../projects/groups/src/public-api.ts","../../../projects/groups/src/ieeesa-npm-groups.ts"],"sourcesContent":["/* eslint-disable no-useless-escape */\r\nimport { AbstractControl, ValidationErrors, ValidatorFn } from '@angular/forms';\r\n\r\n/**\r\n * Required validator for the multi-select-autocomplete \"Representing Organization\"\r\n * control. The control's value is the array of selected chips (set by the\r\n * component), so this treats a non-empty array — or a non-empty string — as\r\n * valid. Keying off the selection (rather than the raw input text) prevents the\r\n * required error from flashing when Material momentarily writes a transient\r\n * empty value during option selection.\r\n * @return {ValidatorFn}\r\n */\r\nexport function representingOrgRequiredValidator(): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n const value = control?.value;\r\n const hasSelection = Array.isArray(value)\r\n ? value.length > 0\r\n : !!(typeof value === 'string' ? value.trim() : value);\r\n return hasSelection ? null : { required: true };\r\n };\r\n}\r\n\r\n/**\r\n * Wraps a string-oriented validator (minLength/maxLength/pattern) so it is\r\n * skipped when the control value is the selection array. Those built-in\r\n * validators evaluate `.length` / string shape and would incorrectly fail\r\n * against the chips array; they should only constrain free-text input.\r\n * @param {ValidatorFn} validator the underlying string validator\r\n * @return {ValidatorFn}\r\n */\r\nexport function skipWhenArray(validator: ValidatorFn): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n if (Array.isArray(control?.value)) {\r\n return null;\r\n }\r\n return validator(control);\r\n };\r\n}\r\n\r\nexport const GroupsValidationPatterns = {\r\n // Group Name field regular expression, which accept Alpha Numeric, Special Characters (ASCII) and whitespace.\r\n groupName: /^(?=.*[a-zA-Z])[\\w\\s!\"#$%&'()*+,-.\\/\\:;<=>?@[\\]^_`{|}~\\\\]+$/i,\r\n // Group Short Name field regular expression which accept letters, numbers and \".\",\",\" , \"/\", \"-\" , \"_\" characters.\r\n shortName: /^(?=[a-zA-Z0-9])[a-zA-Z0-9.,\\/\\-_]+$/,\r\n // Group Scope field regular expression which accept Alpha Numeric, Special Characters and whitespace.\r\n groupScope: /^(?=.*[a-zA-Z])[\\w\\s!\"#$%&'()*+,-.\\/\\:;<=>?@[\\]^_`{|}~\\\\]+$/i,\r\n email: /^[\\w-\\.]+@([\\w-]+\\.)+[\\w-]{2,4}$/,\r\n representingOrgNameMaxLength: 250,\r\n representingOrgNameMinLength: 3,\r\n // Representing Organization field regular expression which accept Alpha Numeric, Special Characters and whitespace.\r\n representingOrganization:\r\n /^(?=.*[a-zA-Z])[\\w\\s!\"#$%&'()*+,-.\\/\\:;<=>?@[\\]^_`{|}~\\\\]+$/i,\r\n // First or Last Name field regular expression which does not allow only whitespace or empty string.\r\n firstOrLastName: /^(?!\\s*$).+/\r\n};\r\n","/* eslint-disable no-unused-vars */\r\nexport enum GroupFunctionType {\r\n CREATE = 'CREATE',\r\n EDIT = 'EDIT',\r\n VIEW_ROSTER = 'VIEW_ROSTER',\r\n FILTER = 'FILTER',\r\n TOGGLE = 'TOGGLE',\r\n SEARCH = 'SEARCH',\r\n REASSIGN_PARENT_GROUP = 'REASSIGN_PARENT_GROUP',\r\n EDIT_ROSTER_USER_ROLE = 'EDIT_ROSTER_USER_ROLE',\r\n ADD_USER_TO_ROSTER = 'ADD_USER_TO_ROSTER',\r\n IMPORT_ROSTER = 'IMPORT_ROSTER',\r\n}","import { Component, Inject, ViewEncapsulation } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport {\r\n MAT_DIALOG_DATA,\r\n MatDialogModule,\r\n MatDialogRef,\r\n} from '@angular/material/dialog';\r\nimport { AvailableForeignGroup } from '../../models/reciprocal-credit.model';\r\n\r\n/** Data passed into the Add Working Groups modal. */\r\nexport interface AddWorkingGroupsDialogData {\r\n availableGroups: AvailableForeignGroup[];\r\n selectedGroupIds: string[];\r\n}\r\n\r\n/** Row model with a local selection flag. */\r\ninterface WorkingGroupRow extends AvailableForeignGroup {\r\n selected: boolean;\r\n}\r\n\r\n/**\r\n * Modal to select one or more foreign working groups (under the same committee)\r\n * for reciprocal credit. Provides search and a checkbox table. Returns the\r\n * selected AvailableForeignGroup[] on Add.\r\n * @export\r\n * @class AddWorkingGroupsComponent\r\n */\r\n@Component({\r\n // eslint-disable-next-line @angular-eslint/component-selector\r\n selector: 'ieeesa-add-working-groups',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule, MatButtonModule, MatDialogModule],\r\n templateUrl: './add-working-groups.component.html',\r\n styleUrls: ['./add-working-groups.component.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class AddWorkingGroupsComponent {\r\n rows: WorkingGroupRow[] = [];\r\n searchTerm = '';\r\n\r\n // eslint-disable-next-line no-unused-vars\r\n constructor(\r\n // eslint-disable-next-line no-unused-vars\r\n private dialogRef: MatDialogRef<AddWorkingGroupsComponent>,\r\n // eslint-disable-next-line no-unused-vars\r\n @Inject(MAT_DIALOG_DATA) private data: AddWorkingGroupsDialogData\r\n ) {\r\n const selectedIds = new Set(this.data?.selectedGroupIds ?? []);\r\n this.rows = (this.data?.availableGroups ?? []).map((group) => ({\r\n ...group,\r\n selected: selectedIds.has(group.groupId),\r\n }));\r\n }\r\n\r\n /** Rows filtered by the search term (group name). */\r\n get filteredRows(): WorkingGroupRow[] {\r\n const term = this.searchTerm.trim().toLowerCase();\r\n if (!term) return this.rows;\r\n return this.rows.filter((row) =>\r\n row.groupName.toLowerCase().includes(term)\r\n );\r\n }\r\n\r\n /** Count of currently selected rows (for the title). */\r\n get selectedCount(): number {\r\n return this.rows.filter((row) => row.selected).length;\r\n }\r\n\r\n /** Toggle a row's selection. */\r\n toggleRow(row: WorkingGroupRow): void {\r\n row.selected = !row.selected;\r\n }\r\n\r\n onCancel(): void {\r\n this.dialogRef.close();\r\n }\r\n\r\n onAdd(): void {\r\n const selected: AvailableForeignGroup[] = this.rows\r\n .filter((row) => row.selected)\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars, no-unused-vars\r\n .map(({ selected, ...group }) => group);\r\n this.dialogRef.close(selected);\r\n }\r\n}\r\n","<div class=\"ieeesa-add-working-groups\">\r\n <div class=\"ieeesa-add-working-groups__header\">\r\n <h2 class=\"ieeesa-add-working-groups__title\">\r\n Add Working Groups ({{ selectedCount }})\r\n </h2>\r\n <button\r\n type=\"button\"\r\n class=\"ieeesa-add-working-groups__close\"\r\n (click)=\"onCancel()\"\r\n aria-label=\"Close\"\r\n >\r\n ×\r\n </button>\r\n </div>\r\n\r\n <p class=\"ieeesa-add-working-groups__subtitle\">Choose working groups under the same committee</p>\r\n\r\n <!-- Search -->\r\n <div class=\"ieeesa-add-working-groups__search\">\r\n <input\r\n type=\"text\"\r\n [(ngModel)]=\"searchTerm\"\r\n placeholder=\"Search by name...\"\r\n aria-label=\"Search working groups\"\r\n />\r\n </div>\r\n\r\n <!-- Table -->\r\n <div class=\"ieeesa-add-working-groups__table\">\r\n <div class=\"ieeesa-add-working-groups__table-head\">\r\n <span class=\"ieeesa-add-working-groups__col-name\">Working Group</span>\r\n </div>\r\n\r\n <div\r\n *ngFor=\"let row of filteredRows\"\r\n class=\"ieeesa-add-working-groups__row\"\r\n >\r\n <label class=\"ieeesa-add-working-groups__col-name\">\r\n <input\r\n type=\"checkbox\"\r\n [checked]=\"row.selected\"\r\n (change)=\"toggleRow(row)\"\r\n />\r\n <span>{{ row.groupName }}</span>\r\n </label>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"filteredRows.length === 0\"\r\n class=\"ieeesa-add-working-groups__empty\"\r\n >\r\n No working groups found.\r\n </div>\r\n </div>\r\n\r\n <!-- Actions -->\r\n <div class=\"ieeesa-add-working-groups__actions\">\r\n <button\r\n mat-button\r\n type=\"button\"\r\n class=\"mat-tertiary-button\"\r\n (click)=\"onCancel()\"\r\n >\r\n Cancel\r\n </button>\r\n <button\r\n mat-button\r\n type=\"button\"\r\n class=\"mat-primary-button\"\r\n [disabled]=\"selectedCount === 0\"\r\n (click)=\"onAdd()\"\r\n >\r\n Add\r\n </button>\r\n </div>\r\n</div>\r\n","/* eslint-disable no-unused-vars */\r\nexport enum GroupRosterType {\r\n INDIVIDUAL = 'Individual',\r\n SYSTEM_USER = 'User',\r\n ENTITY = 'Entity',\r\n}\r\n","/* eslint-disable no-unused-vars */\r\nexport enum PermissionType {\r\n VIEW_GROUPS = 'VIEW_GROUPS',\r\n CREATE_ROOT_GROUP = 'CREATE_ROOT_GROUP',\r\n CREATE_SUBGROUP = 'CREATE_SUBGROUP',\r\n EDIT_GROUP = 'EDIT_GROUP',\r\n DELETE_GROUP = 'DELETE_GROUP',\r\n VIEW_GROUP_OFFICERS = 'VIEW_GROUP_OFFICERS',\r\n MANAGE_GROUP_OFFICERS = 'MANAGE_GROUP_OFFICERS',\r\n VIEW_GROUP_MEMBERS = 'VIEW_GROUP_MEMBERS',\r\n MANAGE_GROUP_MEMBERS = 'MANAGE_GROUP_MEMBERS',\r\n MANAGE_SYSTEM_USERS = 'MANAGE_SYSTEM_USERS',\r\n VIEW_ALL_GROUPS = 'VIEW_ALL_GROUPS',\r\n MANAGE_ALL_GROUPS = 'MANAGE_ALL_GROUPS',\r\n VIEW_ALL_ROSTERS = 'VIEW_ALL_ROSTERS',\r\n MANAGE_ALL_ROSTERS = 'MANAGE_ALL_ROSTERS',\r\n}\r\n","/* eslint-disable no-unused-vars */\r\nexport enum RoleType {\r\n OFFICER = 'Officer',\r\n SYSTEM = 'System',\r\n MEMBER_LEVEL = 'Member Level',\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { GroupPermission } from '../models/group-permissions.model';\r\nimport { PermissionType } from '../models/permission-type.model';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class GroupPermissionsMapService {\r\n groupPermissions: GroupPermission[] = [\r\n {\r\n permissionType: PermissionType.VIEW_GROUPS,\r\n permissionName: 'View Groups',\r\n permissionId: 'PERM_c05ff592-7178-4614-b730-7a7a8828824e',\r\n },\r\n {\r\n permissionType: PermissionType.CREATE_ROOT_GROUP,\r\n permissionName: 'Create Parent Group',\r\n permissionId: 'PERM_fc522748-e2d4-440c-b6c6-41aaca75a80f',\r\n },\r\n {\r\n permissionType: PermissionType.CREATE_SUBGROUP,\r\n permissionName: 'Create Subgroup',\r\n permissionId: 'PERM_8f8a203e-d992-4555-9c42-ac6970f2d376',\r\n },\r\n {\r\n permissionType: PermissionType.DELETE_GROUP,\r\n permissionName: 'Delete Group',\r\n permissionId: 'PERM_008229bf-6a12-4281-88d8-4a2bc9597573',\r\n },\r\n {\r\n permissionType: PermissionType.EDIT_GROUP,\r\n permissionName: 'Edit Group Details',\r\n permissionId: 'PERM_d64e1f09-d3f7-4f86-a94c-4782a2f60571',\r\n },\r\n {\r\n permissionType: PermissionType.VIEW_GROUP_OFFICERS,\r\n permissionName: 'View Group Officers',\r\n permissionId: 'PERM_f80ac8a3-60b8-4ae4-bedf-ce1d89c54354',\r\n },\r\n {\r\n permissionType: PermissionType.MANAGE_GROUP_OFFICERS,\r\n permissionName: 'Manage Group Officers',\r\n permissionId: 'PERM_9ddd51db-f481-47ea-946b-e88815973cfb',\r\n },\r\n {\r\n permissionType: PermissionType.VIEW_GROUP_MEMBERS,\r\n permissionName: 'View Group Members',\r\n permissionId: 'PERM_5a8edb91-a132-4670-90a3-25fb6982307a',\r\n },\r\n {\r\n permissionType: PermissionType.MANAGE_GROUP_MEMBERS,\r\n permissionName: 'Manage Group Member',\r\n permissionId: 'PERM_1969fecb-6383-446e-9276-b6a7b7265cb4',\r\n },\r\n ];\r\n globalGroupPermissions: GroupPermission[] = [\r\n {\r\n permissionType: PermissionType.MANAGE_SYSTEM_USERS,\r\n permissionName: 'Manage System Users',\r\n permissionId: 'PERM_d2c103e9-20c6-4dd5-b320-f7d4d017c574',\r\n },\r\n {\r\n permissionType: PermissionType.VIEW_ALL_GROUPS,\r\n permissionName: 'View All Group Details',\r\n permissionId: 'PERM_741d7504-7595-4bec-811f-8d601333e7c4',\r\n },\r\n {\r\n permissionType: PermissionType.MANAGE_ALL_GROUPS,\r\n permissionName: 'Manage All Group Details',\r\n permissionId: 'PERM_eebde105-0b53-44c8-babc-066be903229f',\r\n },\r\n {\r\n permissionType: PermissionType.VIEW_ALL_ROSTERS,\r\n permissionName: 'View All Rosters',\r\n permissionId: 'PERM_0109d7c7-6d64-4673-b63b-3a23f3323530',\r\n },\r\n {\r\n permissionType: PermissionType.MANAGE_ALL_ROSTERS,\r\n permissionName: 'Manage All Rosters',\r\n permissionId: 'PERM_6fec2e8c-1b48-46a9-b394-34d3648d6fe8',\r\n },\r\n ];\r\n /**\r\n * Returns group-wise permission mappings.\r\n * @return {GroupPermission[]}\r\n * @memberof GroupPermissionsMapService\r\n */\r\n getGroupPermissions(): GroupPermission[] {\r\n return this.groupPermissions;\r\n }\r\n /**\r\n * Returns global permissions mapping for groups.\r\n * Global permissions are maintained separately as global permissions also include role based group wise permissions irrespective of the attached group.\r\n * @return {GroupPermission[]}\r\n * @memberof GroupPermissionsMapService\r\n */\r\n getGlobalGroupPermissions(): GroupPermission[] {\r\n return this.globalGroupPermissions;\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { PermissionType } from '../models/permission-type.model';\r\nimport { GroupPermissionsMapService } from './group-permissions-map-service';\r\nimport {\r\n GroupPermission,\r\n UserPermission,\r\n} from '../models/group-permissions.model';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class UserPermissionsService {\r\n // eslint-disable-next-line no-unused-vars, no-empty-function\r\n constructor(private groupPermissionsService: GroupPermissionsMapService) {}\r\n\r\n /**\r\n * Returns access provision for the passed action/feature based on whether the signed in user has appropriate permission.\r\n * @param {PermissionType} permission\r\n * @param {GroupPermission[]} userGroupPermissions\r\n * @return {boolean}\r\n * @memberof UserPermissionsService\r\n */\r\n validateAccessPermission(\r\n permission: PermissionType,\r\n userGroupPermissions: GroupPermission[]\r\n ): boolean {\r\n const isPermitted = userGroupPermissions\r\n ? userGroupPermissions?.some(\r\n ({ permissionType }) => permissionType === permission\r\n )\r\n : false;\r\n return isPermitted;\r\n }\r\n\r\n /**\r\n * Filters signed in user group permissions from entire group permissions.\r\n * @param {UserPermissions[]} userPermissions\r\n * @return {GroupPermissions[]}\r\n * @memberof UserPermissionsService\r\n */\r\n filterUserGroupPermissions(\r\n userPermissions: UserPermission[],\r\n groupPermissions: GroupPermission[]\r\n ): GroupPermission[] {\r\n const userGroupPermissions = groupPermissions?.filter(\r\n (permission: GroupPermission) =>\r\n userPermissions?.find(\r\n ({ permissionId }) => permission?.permissionId === permissionId\r\n )\r\n );\r\n return userGroupPermissions;\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Observable, map, catchError, BehaviorSubject } from 'rxjs';\r\nimport {\r\n CreateGroupPayload,\r\n CreateGroupResponse,\r\n} from '../models/create-group.model';\r\nimport {\r\n BusinessRule,\r\n GroupTypeConfiguration,\r\n GroupTypeConfigValue,\r\n GroupTypeResponse,\r\n} from '../models/group-types.model';\r\nimport { AlertsService, HttpService } from '@ieeesa-npm/utility';\r\nimport { GetGroupResponse, GetGroupsPayload } from '../models/view-group.model';\r\nimport * as screenTexts from '../assets/constants.json';\r\nimport { DeleteGroupPayload } from '../models/delete-group.model';\r\nimport { GroupInfo } from '../models/group-info.model';\r\nimport {\r\n SearchUsersPayload,\r\n FilterUsersPayload,\r\n GetGroupUsersResponse,\r\n User,\r\n LoggedInUserInfo,\r\n} from '../models/user.model';\r\nimport { Role } from '../models/role.model';\r\nimport { EditGroupPayload } from '../models/edit-group.model';\r\nimport {\r\n AvailableForeignGroup,\r\n ReciprocalCreditConfigRow,\r\n ReciprocalCreditResponse,\r\n SaveReciprocalCreditPayload,\r\n} from '../models/reciprocal-credit.model';\r\nimport { GroupFunctionType } from '../models/group-function-type.model';\r\nimport { RosterFunctionType } from '../models/roster-function-type.model';\r\nimport { GroupUserInfo } from '../models/group-user-info.model';\r\nimport {\r\n AddOrEditUserPayload,\r\n AddOrEditGroupUserDetailsResponse,\r\n AddOrEditUserIndividualRosterPayload,\r\n RepresentingOrganization,\r\n} from '../models/add-or-edit-user-group.model';\r\nimport { DeleteUserGroupPayload } from '../models/delete-user-group.model';\r\nimport {\r\n GetUserDetailsPayload,\r\n SearchUserByEmailResponse,\r\n} from '../models/add-new-user.model';\r\nimport {\r\n OrganizationRequestPayload,\r\n OrganizationResponse,\r\n} from '../models/organization.model';\r\nimport { ClassificationResponse } from '../models/classification.model';\r\nimport { GroupRosterType } from '../models/roster-type.model';\r\nimport { FormStatus, CheckboxOption, AlertType } from '@ieeesa-npm/models';\r\nimport { FormControlStatus } from '@angular/forms';\r\nimport {\r\n GroupPermission,\r\n UserPermission,\r\n} from '../models/group-permissions.model';\r\nimport { PermissionType } from '../models/permission-type.model';\r\nimport { UserPermissionsService } from './user-permissions.service';\r\nimport { GroupPermissionsMapService } from './group-permissions-map-service';\r\nimport { ParentGroupsInfo } from '../models/parent-groups-info.model';\r\nimport { RoleType } from '../models/role-type.model';\r\n\r\n/**\r\n * Groups service is an abstract layer and responsible for managing groups REST API calls.\r\n * @class GroupsService\r\n */\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class GroupsService {\r\n groupsText = screenTexts?.errors;\r\n apiBaseUrl!: string;\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n userPermission: any;\r\n selectedGroupInfo!: GroupInfo | undefined;\r\n groupFunctionType!: GroupFunctionType;\r\n selectedGroupParentInfo!: GroupInfo | undefined;\r\n openModalNotifier = new BehaviorSubject<GroupFunctionType>(\r\n GroupFunctionType.VIEW_ROSTER\r\n );\r\n groupTypeRoles!: CheckboxOption[];\r\n selectedUserInfo!: GroupUserInfo;\r\n canShowMessage = false;\r\n rosterFunctionType!: RosterFunctionType;\r\n userGroupPermissions!: GroupPermission[];\r\n groupTypes!: GroupTypeConfiguration[];\r\n isParentGroupChanged = false;\r\n userInfo!: LoggedInUserInfo;\r\n memberTypes!: Role[];\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n representingOrganizations: RepresentingOrganization[] = [];\r\n // eslint-disable-next-line no-empty-function, no-unused-vars\r\n constructor(\r\n // eslint-disable-next-line no-unused-vars\r\n private httpService: HttpService,\r\n // eslint-disable-next-line no-unused-vars\r\n private userPermissionsService: UserPermissionsService,\r\n // eslint-disable-next-line no-unused-vars\r\n private groupPermissionsService: GroupPermissionsMapService,\r\n // eslint-disable-next-line no-unused-vars\r\n public alertService: AlertsService // eslint-disable-next-line no-empty-function\r\n ) {}\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n setAppConfig(apiBaseUrl: string, userPermission: any) {\r\n this.apiBaseUrl = apiBaseUrl;\r\n this.userPermission = userPermission;\r\n }\r\n /**\r\n * Gets application group types from API and returns it as an observable.\r\n * @return {Observable<GroupTypeResponse>} -It returns group types if success else error.\r\n * @memberof GroupsService\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n getGroupTypes(): Observable<GroupTypeResponse> {\r\n return this.httpService\r\n .getData(`${this.apiBaseUrl}/groups/config/groupTypeConfigInfo`)\r\n .pipe(\r\n map((response) => {\r\n this.setLoadedGroupTypes(response?.body);\r\n return response;\r\n }),\r\n catchError((error) => {\r\n throw error;\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Get allowed parent groups from API and returns it as an observable.\r\n * @param {string} groupId\r\n * @return {Observable<GroupTypeResponse>}\r\n * @memberof GroupsService\r\n */\r\n getAllowedParentGroups(groupId: string): Observable<ParentGroupsInfo[]> {\r\n return this.httpService\r\n .getData(`${this.apiBaseUrl}/groups/allowedParentGroups/${groupId}`)\r\n .pipe(\r\n map((response) => {\r\n return response?.body;\r\n }),\r\n catchError((error) => {\r\n throw error;\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Returns all the groups based on passed group Id and group type.\r\n * @param {GetGroupsPayload} getGroupsPayload\r\n * @return {Observable<GetGroupResponse>}\r\n * @memberof GroupsService\r\n */\r\n getGroups(getGroupsPayload: GetGroupsPayload): Observable<GetGroupResponse> {\r\n let url = 'rootGroups';\r\n if (getGroupsPayload.groupId)\r\n url = 'immChildGroupsByGroupId/' + getGroupsPayload.groupId;\r\n else if (getGroupsPayload.groupTypeId)\r\n url = 'groupsByGroupType/' + getGroupsPayload.groupTypeId;\r\n\r\n return this.httpService.getData(`${this.apiBaseUrl}/groups/${url}`).pipe(\r\n map((response) => {\r\n return response;\r\n }),\r\n catchError((errorRes) => {\r\n throw errorRes;\r\n })\r\n );\r\n }\r\n /**\r\n * Deletes a group based on the provided information\r\n * @param {groupId} string -groupId of the group which is to be deleted\r\n * @return {*} {Observable<any>} -Observable representing the group deletion response\r\n * @memberof GroupsService\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n deleteGroup(deleteGroupPayload: DeleteGroupPayload): Observable<any> {\r\n return this.httpService\r\n .putData(`${this.apiBaseUrl}/groups/delete`, deleteGroupPayload)\r\n .pipe(\r\n map((response) => {\r\n return response;\r\n }),\r\n catchError((error) => {\r\n throw error;\r\n })\r\n );\r\n }\r\n /**\r\n * Deletes a user from group based on the provided information\r\n * @param {groupId} string -groupId of the selected group from where selected user to be deleted.\r\n * @param {userId} Array -user ids of selected users who are deleted from the selected group\r\n * @return {*} {Observable<any>} -Observable representing the group deletion response\r\n * @memberof GroupsService\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n deleteUsersGroup(\r\n deleteUserGroupPayload: DeleteUserGroupPayload\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n ): Observable<any> {\r\n return this.httpService\r\n .putData(\r\n `${this.apiBaseUrl}/groups/roster/deleteGroupUsers`,\r\n deleteUserGroupPayload\r\n )\r\n .pipe(\r\n map((response) => {\r\n return response;\r\n }),\r\n catchError((error) => {\r\n throw error;\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Posts create group form data to server using HttpService for creating new group.\r\n * @param {CreateGroupPayload} createGroupPayload -create group form data which includes group name, type, short name, scope.\r\n * @return {Observable<CreateGroupResponse>} -returns create group API response (success or error) as an observable.\r\n * @memberof GroupsService\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n createGroup(\r\n createGroupPayload: CreateGroupPayload\r\n ): Observable<CreateGroupResponse> {\r\n return this.httpService\r\n .postData(`${this.apiBaseUrl}/groups/create`, createGroupPayload)\r\n .pipe(\r\n map((response) => {\r\n return response;\r\n }),\r\n catchError((error) => {\r\n throw error;\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Updates group form data to server using HttpService.\r\n * @param {EditGroupPayload} editGroupPayload -edit group form data which includes group name, short name, scope.\r\n * @return {Observable<EditGroupPayload>} -returns edit group API response (success or error) as an observable.\r\n * @memberof GroupsService\r\n */\r\n editGroup(\r\n editGroupPayload: EditGroupPayload\r\n ): Observable<CreateGroupResponse> {\r\n return this.httpService\r\n .putData(`${this.apiBaseUrl}/groups/edit`, editGroupPayload)\r\n .pipe(\r\n map((response) => {\r\n return response;\r\n }),\r\n catchError((error) => {\r\n throw error;\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * This method will parse the error codes and return the respective error message for each code.\r\n * @param {string[]} errorCodes\r\n * @return {string[]} errorMessage\r\n * @memberof GroupsService\r\n */\r\n parseErrorMessage(errorCodes: string[]) {\r\n const errorMessage: string[] = [];\r\n errorCodes?.forEach((item: string, index: number) => {\r\n const errorMessageKey = errorCodes[index] as keyof typeof this.groupsText;\r\n errorMessage.push(\r\n this.groupsText[errorMessageKey] ?? this.groupsText?.default\r\n );\r\n });\r\n return errorMessage;\r\n }\r\n\r\n /**\r\n * Handles custom API errors: maps BE error codes to messages and shows an\r\n * alert. Mirrors the events-and-meetings error handling so reciprocal-credit\r\n * failures (e.g. MTG-011 duplicate, MTG-012 permission) surface consistently.\r\n * @param {*} error the HttpErrorResponse from a failed call\r\n * @param {boolean} [showAlert=true] whether to display the alert\r\n * @memberof GroupsService\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n handleErrors(error: any, showAlert = true): void {\r\n const errorCodes = error?.error?.body?.errorCodes;\r\n if (Array.isArray(errorCodes) && !error?.error?.status) {\r\n const errorMessage = this.parseErrorMessage(errorCodes);\r\n if (showAlert) {\r\n this.alertService?.showMessage({\r\n status: 'custom',\r\n message: errorMessage,\r\n alertType: AlertType.ERROR,\r\n isCloseNeeded: true,\r\n });\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Sets selected group info.\r\n * @param {(GroupInfo | undefined)} selectedGroupInfo -selected group info.\r\n * @param {(GroupInfo | undefined)} [selectedGroupParentInfo] -selected parent group info.\r\n * @memberof GroupsService\r\n */\r\n setSelectedGroupInfo(\r\n selectedGroupInfo: GroupInfo | undefined,\r\n selectedGroupParentInfo?: GroupInfo | undefined\r\n ) {\r\n this.selectedGroupInfo = selectedGroupInfo;\r\n this.selectedGroupParentInfo = selectedGroupParentInfo;\r\n }\r\n\r\n /**\r\n * Returns the selected group info.\r\n * @return {(GroupInfo | undefined)} -group info.\r\n * @memberof GroupsService\r\n */\r\n getSelectedGroupInfo(): GroupInfo | undefined {\r\n return this.selectedGroupInfo;\r\n }\r\n\r\n /**\r\n * Returns the selected group parent group info.\r\n * @return {(GroupInfo | undefined)} -group info.\r\n * @memberof GroupsService\r\n */\r\n getSelectedGroupParentInfo(): GroupInfo | undefined {\r\n return this.selectedGroupParentInfo;\r\n }\r\n\r\n /**\r\n * Sets group function type.\r\n * @param {GroupFunctionType} groupFunctionType -group function type.\r\n * @memberof GroupsService\r\n */\r\n setGroupFunctionType(groupFunctionType: GroupFunctionType): void {\r\n this.groupFunctionType = groupFunctionType;\r\n }\r\n\r\n /**\r\n * Returns group function type.\r\n * @return {GroupFunctionType} -group function type.\r\n * @memberof GroupsService\r\n */\r\n getGroupFunctionType(): GroupFunctionType {\r\n return this.groupFunctionType;\r\n }\r\n\r\n /**\r\n * Gets the group users for the given group id.\r\n * @param {string} groupId\r\n * @return {Observable<GetGroupUsersResponse>}\r\n * @memberof GroupsService\r\n */\r\n // eslint-disable-next-line no-unused-vars\r\n getGroupUsers(\r\n groupId: string,\r\n sortColumn: string,\r\n sortDirection: boolean\r\n ): Observable<GetGroupUsersResponse> {\r\n return this.httpService\r\n .getData(\r\n `${this.apiBaseUrl}/groups/roster/${groupId}?sortColumn=${sortColumn}&ascendingOrder=${sortDirection}`\r\n )\r\n .pipe(\r\n map((response) => {\r\n return response;\r\n }),\r\n catchError((errorRes) => {\r\n throw errorRes;\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Gets the group users based on the filtered roles.\r\n * @param {FilterUsersPayload} payload\r\n * @return {Observable<GetGroupUsersResponse>}\r\n * @memberof GroupsService\r\n */\r\n getGroupUsersByRoles(\r\n payload: FilterUsersPayload\r\n ): Observable<GetGroupUsersResponse> {\r\n return this.httpService\r\n .postData(`${this.apiBaseUrl}/groups/roster/groupUsersFilter`, payload)\r\n .pipe(\r\n map((response) => {\r\n return response;\r\n }),\r\n catchError((errorRes) => {\r\n throw errorRes;\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Gets the group users based on searched name or email\r\n * @param {SearchUsersPayload} payload\r\n * @return {Observable<GetGroupUsersResponse>}\r\n * @memberof GroupsService\r\n */\r\n searchGroupUsers(\r\n payload: SearchUsersPayload\r\n ): Observable<GetGroupUsersResponse> {\r\n return this.httpService\r\n .postData(`${this.apiBaseUrl}/groups/roster/groupUsersSearch`, payload)\r\n .pipe(\r\n map((response) => {\r\n return response;\r\n }),\r\n catchError((errorRes) => {\r\n throw errorRes;\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Gets the group roles based on the group type.\r\n * @param {string} groupTypeId\r\n * @return {Observable<CheckboxOption[]>}\r\n * @memberof GroupsService\r\n */\r\n // eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars\r\n getGroupTypeRoles(groupTypeId: string): Observable<CheckboxOption[]> {\r\n return this.httpService\r\n .getData(\r\n `${this.apiBaseUrl}/groups/config/rolesByGroupType/${groupTypeId}`\r\n )\r\n .pipe(\r\n map((response) => {\r\n const rolesOption: CheckboxOption[] = [];\r\n const memberTypes: Role[] = [];\r\n response?.body?.forEach((role: Role) => {\r\n if (role?.roleTypeName === RoleType.MEMBER_LEVEL) {\r\n memberTypes.push(role);\r\n } else {\r\n rolesOption.push({\r\n id: role.roleId,\r\n name: role.roleName,\r\n disabled: false,\r\n checked: false,\r\n });\r\n }\r\n });\r\n this.setGroupTypeUserRoles(rolesOption);\r\n this.setMemberTypes(memberTypes);\r\n return rolesOption;\r\n }),\r\n catchError((errorRes) => {\r\n throw errorRes;\r\n })\r\n );\r\n }\r\n /**\r\n * Fetches the classifications master data from configuration and returns.\r\n * @return {Observable<ClassificationResponse>}\r\n * @memberof GroupsService\r\n */\r\n getClassifications(): Observable<ClassificationResponse> {\r\n return this.httpService\r\n .getData(`${this.apiBaseUrl}/groups/roster/classification`)\r\n .pipe(\r\n map((response) => {\r\n return response;\r\n }),\r\n catchError((errorRes) => {\r\n throw errorRes;\r\n })\r\n );\r\n }\r\n /**\r\n * Returns the true if logged in user is admin.\r\n * @return {boolean}\r\n * @memberof GroupsService\r\n */\r\n isAdminUser(): boolean {\r\n return this.validateAccess(PermissionType.MANAGE_SYSTEM_USERS);\r\n }\r\n /**\r\n * Concatenates the group users assigned roles name separated by comma as string and returns the group users in an array.\r\n * @param {GetGroupUsersResponse} response\r\n * @return {User[]}\r\n * @memberof GroupsService\r\n */\r\n transformUserRolesNameAsString(response: GetGroupUsersResponse): User[] {\r\n const users: User[] = [];\r\n this.representingOrganizations = [];\r\n response?.body?.forEach((item) => {\r\n const classificationDesc =\r\n item.classification?.classificationName +\r\n ' (' +\r\n item.classification?.classificationDesc +\r\n ')';\r\n const rolesList = item?.rolesList?.reduce(\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n (roleList: any, role: Role) => {\r\n roleList[\r\n role.roleTypeName === RoleType.MEMBER_LEVEL ? 'memberType' : 'roles'\r\n ].push(role?.roleName);\r\n return roleList;\r\n },\r\n { memberType: [], roles: [] }\r\n );\r\n this.representingOrganizations?.push({\r\n userId: item?.userId,\r\n organizations: item?.organizations,\r\n });\r\n const organizations = item?.organizations\r\n ? item?.organizations?.map((org) => org?.orgName).join('; ')\r\n : null;\r\n users.push({\r\n userId: item.userId,\r\n name: item.name,\r\n email: item.email,\r\n role: rolesList?.roles?.length ? rolesList?.roles?.join(', ') : null,\r\n classification: item.classification?.classificationId\r\n ? classificationDesc\r\n : null,\r\n memberStatus: rolesList?.memberType?.length\r\n ? rolesList?.memberType[0]\r\n : null,\r\n organization: organizations,\r\n employer: item.employer?.orgName ?? null,\r\n canDelete: !(\r\n item?.userId === this.userInfo?.userId &&\r\n this.isAdminUser() &&\r\n this.getBusinessRuleOfSelectedGroup()?.isAdmin\r\n ),\r\n });\r\n });\r\n return users;\r\n }\r\n /**\r\n * Returns formatted group types.\r\n * @param {GroupTypeConfiguration[]} groupTypeResponse\r\n * @return {GroupTypeConfigValue}\r\n * @memberof GroupsService\r\n */\r\n getFormattedGroupTypes(\r\n groupTypeResponse: GroupTypeConfiguration[]\r\n ): GroupTypeConfigValue {\r\n const groupTypes: GroupTypeConfigValue = {};\r\n groupTypeResponse.forEach((item) => {\r\n groupTypes[item.configFieldId] = item.configFieldValue;\r\n });\r\n return groupTypes;\r\n }\r\n\r\n /**\r\n * Returns group user details if email is found, else throws error.\r\n * @param {string} email\r\n * @return {Observable<SearchUserByEmailResponse>}\r\n * @memberof GroupsService\r\n */\r\n getUserByEmail(email: string): Observable<SearchUserByEmailResponse> {\r\n return this.httpService\r\n .getData(`${this.apiBaseUrl}/groups/users/userByEmail/${email}`)\r\n .pipe(\r\n map((response) => {\r\n return response;\r\n }),\r\n catchError((errorRes) => {\r\n throw errorRes;\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Gets the user details for the selected group\r\n * @param {GetUserDetailsPayload} payload\r\n * @return {Observable<AddOrEditGroupUserDetailsResponse>}\r\n * @memberof GroupsService\r\n */\r\n getGroupUserDetails(\r\n payload: GetUserDetailsPayload\r\n ): Observable<AddOrEditGroupUserDetailsResponse> {\r\n return this.httpService\r\n .postData(`${this.apiBaseUrl}/groups/roster/userDetails`, payload)\r\n .pipe(\r\n map((response) => {\r\n return response;\r\n }),\r\n catchError((error) => {\r\n throw error;\r\n })\r\n );\r\n }\r\n /**\r\n * Posts add new user form data to the API for the selected group and returns the success or failure response.\r\n * @param {(AddOrEditUserPayload\r\n * | AddOrEditUserIndividualRosterPayload)} AddOrEditUserPayload\r\n * @param {GroupRosterType} groupRosterType\r\n * @return {Observable<AddOrEditGroupUserDetailsResponse>}\r\n * @memberof GroupsService\r\n */\r\n addNewGroupUser(\r\n AddOrEditUserPayload:\r\n | AddOrEditUserPayload\r\n | AddOrEditUserIndividualRosterPayload\r\n ): Observable<AddOrEditGroupUserDetailsResponse> {\r\n return this.httpService\r\n .postData(\r\n `${this.apiBaseUrl}/groups/roster/createGroupUserRole`,\r\n AddOrEditUserPayload\r\n )\r\n .pipe(\r\n map((response) => {\r\n return response;\r\n }),\r\n catchError((error) => {\r\n throw error;\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Sets the loaded group type user roles\r\n * @param {CheckboxOption[]} userRoles\r\n * @memberof GroupsService\r\n */\r\n setGroupTypeUserRoles(userRoles: CheckboxOption[]): void {\r\n this.groupTypeRoles = userRoles;\r\n }\r\n\r\n /**\r\n * Returns the group type user roles.\r\n * @return {CheckboxOption[]}\r\n * @memberof GroupsService\r\n */\r\n getGroupTypeUserRoles(): CheckboxOption[] {\r\n this.groupTypeRoles?.map((option) => (option.checked = false));\r\n return this.groupTypeRoles;\r\n }\r\n\r\n /**\r\n * Sets the selected user info.\r\n * @param {GroupUserInfo} userInfo\r\n * @memberof GroupsService\r\n */\r\n setSelectedUserInfo(userInfo: GroupUserInfo): void {\r\n this.selectedUserInfo = userInfo;\r\n }\r\n\r\n /**\r\n * Returns selected user info.\r\n * @return {GroupUserInfo}\r\n * @memberof GroupsService\r\n */\r\n getSelectedUserInfo(): GroupUserInfo {\r\n return this.selectedUserInfo;\r\n }\r\n\r\n /**\r\n * Updates group user roles and other details to server using HttpService.\r\n * @param {(AddOrEditUserPayload | AddOrEditUserIndividualRosterPayload)} payload\r\n * @return {Observable<AddOrEditGroupUserDetailsResponse>}\r\n * @memberof GroupsService\r\n */\r\n editGroupsUserRole(\r\n payload: AddOrEditUserPayload | AddOrEditUserIndividualRosterPayload\r\n ): Observable<AddOrEditGroupUserDetailsResponse> {\r\n return this.httpService\r\n .putData(`${this.apiBaseUrl}/groups/roster/editGroupUserRole`, payload)\r\n .pipe(\r\n map((response) => {\r\n return response;\r\n }),\r\n catchError((error) => {\r\n throw error;\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Sets roster function type.\r\n * @param {RosterFunctionType} rosterFunctionType\r\n * @memberof GroupsService\r\n */\r\n setRosterFunctionType(rosterFunctionType: RosterFunctionType): void {\r\n this.rosterFunctionType = rosterFunctionType;\r\n }\r\n\r\n /**\r\n * Returns roster function type.\r\n * @return {RosterFunctionType}\r\n * @memberof GroupsService\r\n */\r\n getRosterFunctionType(): RosterFunctionType {\r\n return this.rosterFunctionType;\r\n }\r\n /**\r\n * Gets the groups based on the search by group name or acronym.\r\n * @param {string} searchTerm\r\n * @return {Observable<GetGroupUsersResponse>}\r\n * @memberof GroupsService\r\n */\r\n groupsByNameAcronym(\r\n searchTerm: string,\r\n filteredGroupType?: number\r\n ): Observable<GetGroupResponse> {\r\n const searchGroupsUrl = `${this.apiBaseUrl}/groups/groupsByNameAcronym?name=${searchTerm}`;\r\n return this.httpService\r\n .getData(\r\n filteredGroupType\r\n ? searchGroupsUrl + `&groupType=${filteredGroupType}`\r\n : searchGroupsUrl\r\n )\r\n .pipe(\r\n map((response) => {\r\n return response;\r\n }),\r\n catchError((errorRes) => {\r\n throw errorRes;\r\n })\r\n );\r\n }\r\n /**\r\n * Sets the user group permissions\r\n * @param {GroupPermission[]} userGroupPermissions\r\n * @memberof GroupsService\r\n */\r\n setUserGroupPermissions(userGroupPermissions: GroupPermission[]) {\r\n this.userGroupPermissions = userGroupPermissions;\r\n }\r\n /**\r\n * Returns the user group permissions\r\n * @return {GroupPermission[]}\r\n * @memberof GroupsService\r\n */\r\n getUserGroupPermissions(): GroupPermission[] {\r\n return this.userGroupPermissions;\r\n }\r\n /**\r\n * Sets the logged In user information.\r\n * @param {LoggedInUserInfo} userInfo\r\n * @memberof GroupsService\r\n */\r\n setUserInfo(userInfo: LoggedInUserInfo): void {\r\n this.userInfo = userInfo;\r\n }\r\n /**\r\n * Returns the logged in user information.\r\n * @return {LoggedInUserInfo}\r\n * @memberof GroupsService\r\n */\r\n getUserInfo(): LoggedInUserInfo {\r\n return this.userInfo;\r\n }\r\n /**\r\n * Validates permission based access for provided feature.\r\n * Checks for group level permissions, and provides access based on individual group permissions.\r\n * For global permissions provides access across the individual groups or System groups.\r\n * @param {PermissionType} permissionType\r\n * @return {boolean}\r\n * @memberof GroupsService\r\n */\r\n validateAccess(\r\n permissionType: PermissionType,\r\n permissions?: UserPermission[] | null\r\n ): boolean {\r\n if (permissions) {\r\n const userPermissionsToGroup =\r\n this.userPermissionsService.filterUserGroupPermissions(\r\n permissions,\r\n this.groupPermissionsService.getGroupPermissions()\r\n );\r\n return this.userPermissionsService.validateAccessPermission(\r\n permissionType,\r\n userPermissionsToGroup\r\n );\r\n }\r\n return this.userPermissionsService.validateAccessPermission(\r\n permissionType,\r\n this.getUserGroupPermissions()\r\n );\r\n }\r\n /**\r\n * Store the loaded group types.\r\n * @param {GroupTypeConfiguration[]} groupTypes\r\n * @memberof GroupsService\r\n */\r\n setLoadedGroupTypes(groupTypes: GroupTypeConfiguration[]) {\r\n this.groupTypes = groupTypes;\r\n }\r\n /**\r\n * Return the loaded group types.\r\n * @return {GroupTypeConfiguration[]}\r\n * @memberof GroupsService\r\n */\r\n getLoadedGroupTypes(): GroupTypeConfiguration[] {\r\n return this.groupTypes;\r\n }\r\n\r\n /**\r\n *\r\n * @param {OrganizationRequestPayload} orgRequestPayload\r\n * @return {Observable<OrganizationResponse>}\r\n * @memberof GroupsService\r\n */\r\n getOrganizations(\r\n orgRequestPayload: OrganizationRequestPayload\r\n ): Observable<OrganizationResponse> {\r\n return this.httpService\r\n .postData(\r\n `${this.apiBaseUrl}/groups/roster/organizations`,\r\n orgRequestPayload\r\n )\r\n .pipe(\r\n map((response) => {\r\n return response;\r\n }),\r\n catchError((errorRes) => {\r\n throw errorRes;\r\n })\r\n );\r\n }\r\n /**\r\n * Returns the group type configuration Business rule for the selected group.\r\n * @return {(BusinessRule | undefined)}\r\n * @memberof GroupsService\r\n */\r\n getBusinessRuleOfSelectedGroup(): BusinessRule | undefined {\r\n const businessRule = this.getLoadedGroupTypes()?.find(\r\n (group) => group?.configFieldId === this.getSelectedGroupInfo()?.groupType\r\n )?.configFieldValue?.businessRule;\r\n if(businessRule?.rosterType === GroupRosterType.ENTITY)\r\n businessRule.rosterType = GroupRosterType.INDIVIDUAL;\r\n return businessRule;\r\n }\r\n /**\r\n * Enables or disables the form submit button based on passed parameters.\r\n * @param {GroupRosterType} groupRosterType\r\n * @param {FormControlStatus} formStatus\r\n * @param {string[]} selectedUserRoles\r\n * @return {boolean}\r\n * @memberof GroupsService\r\n */\r\n isSubmitButtonDisabled(\r\n groupRosterType: GroupRosterType,\r\n formStatus: FormControlStatus,\r\n selectedUserRoles: string[]\r\n ): boolean {\r\n if (groupRosterType === GroupRosterType.INDIVIDUAL)\r\n return formStatus === FormStatus.INVALID;\r\n return selectedUserRoles?.length === 0 || formStatus === FormStatus.INVALID;\r\n }\r\n\r\n /**\r\n * Sets isParentGroupChanged true or false.\r\n * @param {boolean} isParentGroupChanged\r\n * @memberof GroupsService\r\n */\r\n setParentGroupChangeStatus(isParentGroupChanged: boolean): void {\r\n this.isParentGroupChanged = isParentGroupChanged;\r\n }\r\n\r\n /**\r\n * Returns isParentGroupChanged value.\r\n * @return {boolean}\r\n * @memberof GroupsService\r\n */\r\n getParentGroupChangeStatus(): boolean {\r\n return this.isParentGroupChanged;\r\n }\r\n\r\n /**\r\n * Sets the member types.\r\n * @param {Role[]} memberTypes\r\n * @memberof GroupsService\r\n */\r\n setMemberTypes(memberTypes: Role[]): void {\r\n this.memberTypes = memberTypes;\r\n }\r\n /**\r\n * Returns the member types.\r\n * @return {Role[]}\r\n * @memberof GroupsService\r\n */\r\n getMemberTypes(): Role[] {\r\n return this.memberTypes;\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // Reciprocal Credit (SP3M-22)\r\n // The reciprocal controller lives on the MEETINGS service, reached through the\r\n // gateway. apiBaseUrl = appConfig.baseApiUrl (ends in `/v1`), and the gateway\r\n // routes the meetings service under `${apiBaseUrl}/meetings` (same as every other\r\n // meetings/events call, e.g. `${apiBaseUrl}/meetings/event/...`).\r\n //\r\n // The reciprocal controller sits on the meetings service under `admin/reciprocal-credit`.\r\n // apiBaseUrl already carries the version segment (`.../v1`), and the gateway routes\r\n // the meetings service under `${apiBaseUrl}/meetings`, so the version is NOT repeated\r\n // (no second `/v1` or `/api/v1`). The full path is:\r\n // `${apiBaseUrl}/meetings/admin/reciprocal-credit/...`\r\n // = https://saappsapidev.ieee.org/v1/meetings/admin/reciprocal-credit/...\r\n // Every method builds URLs from RECIPROCAL_BASE_PATH below.\r\n // ---------------------------------------------------------------------------\r\n\r\n /** Path prefix (relative to apiBaseUrl) for the reciprocal-credit endpoints. */\r\n private readonly RECIPROCAL_BASE_PATH = 'meetings/admin/reciprocal-credit';\r\n\r\n /**\r\n * Build a reciprocal-credit endpoint URL from apiBaseUrl + the base path,\r\n * guarding against accidental double slashes if apiBaseUrl has a trailing slash.\r\n * @param {string} [suffix] extra path/query appended after the base path.\r\n * @return {string}\r\n */\r\n private buildReciprocalUrl(suffix = ''): string {\r\n const base = this.apiBaseUrl?.replace(/\\/+$/, '') ?? '';\r\n return `${base}/${this.RECIPROCAL_BASE_PATH}${suffix}`;\r\n }\r\n\r\n /**\r\n * Fetch the foreign groups available for reciprocal credit for a home group.\r\n * GET {apiBaseUrl}/meetings/admin/reciprocal-credit/{homeGroupId}/available-groups\r\n * @param {string} homeGroupId\r\n * @return {Observable<ReciprocalCreditResponse<AvailableForeignGroup[]>>}\r\n * @memberof GroupsService\r\n */\r\n getAvailableReciprocalGroups(\r\n homeGroupId: string\r\n ): Observable<ReciprocalCreditResponse<AvailableForeignGroup[]>> {\r\n return this.httpService\r\n .getData(this.buildReciprocalUrl(`/${homeGroupId}/available-groups`))\r\n .pipe(\r\n map((response) => response),\r\n catchError((error) => {\r\n throw error;\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Load existing reciprocal-credit config rows for a home group (edit prefill).\r\n * GET {apiBaseUrl}/meetings/admin/reciprocal-credit/{homeGroupId}[?eventId=...]\r\n * Returns one row per foreign group; an empty array means reciprocal credit is off.\r\n * @param {string} homeGroupId\r\n * @param {string} [eventId] optional — filters to an event-scoped config.\r\n * @return {Observable<ReciprocalCreditResponse<ReciprocalCreditConfigRow[]>>}\r\n * @memberof GroupsService\r\n */\r\n getReciprocalConfig(\r\n homeGroupId: string,\r\n eventId?: string\r\n ): Observable<ReciprocalCreditResponse<ReciprocalCreditConfigRow[]>> {\r\n const query = eventId ? `?eventId=${encodeURIComponent(eventId)}` : '';\r\n return this.httpService\r\n .getData(this.buildReciprocalUrl(`/${homeGroupId}${query}`))\r\n .pipe(\r\n map((response) => response),\r\n catchError((error) => {\r\n throw error;\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Save a reciprocal-credit config (creates/reactivates one row per foreign group).\r\n * POST {apiBaseUrl}/meetings/admin/reciprocal-credit\r\n * @param {SaveReciprocalCreditPayload} payload\r\n * @return {Observable<ReciprocalCreditResponse<ReciprocalCreditConfigRow[]>>}\r\n * @memberof GroupsService\r\n */\r\n saveReciprocalCredit(\r\n payload: SaveReciprocalCreditPayload\r\n ): Observable<ReciprocalCreditResponse<ReciprocalCreditConfigRow[]>> {\r\n return this.httpService\r\n .postData(this.buildReciprocalUrl(), payload)\r\n .pipe(\r\n map((response) => response),\r\n catchError((error) => {\r\n throw error;\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Remove (soft delete) a single reciprocal-credit config row by its configId.\r\n * POST {apiBaseUrl}/meetings/admin/reciprocal-credit/{configId}/remove\r\n * @param {string} configId\r\n * @return {Observable<ReciprocalCreditResponse<null>>}\r\n * @memberof GroupsService\r\n */\r\n removeReciprocalConfig(\r\n configId: string\r\n ): Observable<ReciprocalCreditResponse<null>> {\r\n return this.httpService\r\n .postData(this.buildReciprocalUrl(`/${configId}/remove`), {})\r\n .pipe(\r\n map((response) => response),\r\n catchError((error) => {\r\n throw error;\r\n })\r\n );\r\n }\r\n}\r\n","import {\r\n Component,\r\n EventEmitter,\r\n Input,\r\n OnDestroy,\r\n OnInit,\r\n Output,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatDialog, MatDialogModule } from '@angular/material/dialog';\r\nimport {\r\n SlideToggleComponent,\r\n SlideToggleOption,\r\n} from '@ieeesa-npm/presentation';\r\nimport { Subject, takeUntil } from 'rxjs';\r\nimport { GroupsService } from '../../services/groups.service';\r\nimport {\r\n AvailableForeignGroup,\r\n ReciprocalCreditConfigRow,\r\n} from '../../models/reciprocal-credit.model';\r\nimport { AddWorkingGroupsComponent } from '../add-working-groups/add-working-groups.component';\r\n\r\n/**\r\n * A selected foreign group shown as a chip. `configId` is present only for groups\r\n * that were loaded from an existing (saved) config — it is needed to remove that\r\n * specific row on the BE when the group is de-selected or the toggle is turned off.\r\n */\r\nexport interface SelectedForeignGroup {\r\n groupId: string;\r\n groupName: string;\r\n configId?: string;\r\n}\r\n\r\n/**\r\n * Reciprocal Credit configuration section shown inside the group create/edit\r\n * form — ONLY when the group is a Working Group. Provides the enable toggle,\r\n * selected foreign-group chips, and the \"+ Add Working Groups\" launcher.\r\n *\r\n * The toggle has no backend flag: it is derived from whether any config rows\r\n * exist for the home group. Enabling persists nothing until at least one foreign\r\n * group is added (POST); disabling soft-deletes every existing config row\r\n * (one POST /{configId}/remove per row).\r\n *\r\n * The parent form reads `enabled` and `selectedForeignGroups` to build the save\r\n * request, and `removedConfigIds` to know which existing rows to remove.\r\n * @export\r\n * @class ReciprocalCreditSectionComponent\r\n */\r\n@Component({\r\n // eslint-disable-next-line @angular-eslint/component-selector\r\n selector: 'ieeesa-reciprocal-credit-section',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n MatButtonModule,\r\n MatDialogModule,\r\n SlideToggleComponent,\r\n ],\r\n templateUrl: './reciprocal-credit-section.component.html',\r\n styleUrls: ['./reciprocal-credit-section.component.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class ReciprocalCreditSectionComponent implements OnInit, OnDestroy {\r\n destroy$ = new Subject<boolean>();\r\n\r\n /** Home group id (present in edit; absent in create until the group is saved). */\r\n @Input() homeGroupId?: string;\r\n /** Optional event id for event-scoped configs (omit for global/Groups screen). */\r\n @Input() eventId?: string;\r\n /** Parent committee name for the helper text (\"Only groups under ...\"). */\r\n @Input() parentCommitteeName?: string;\r\n\r\n /** Emits the current enabled state whenever it changes. */\r\n @Output() enabledChange = new EventEmitter<boolean>();\r\n /** Emits the current selected foreign groups whenever they change. */\r\n @Output() selectionChange = new EventEmitter<SelectedForeignGroup[]>();\r\n /**\r\n * Emits the config ids of previously-saved rows that have been removed locally\r\n * (chip de-selected or toggle turned off), so the parent can soft-delete each\r\n * on save.\r\n */\r\n @Output() removedConfigIdsChange = new EventEmitter<string[]>();\r\n\r\n /** Toggle state. */\r\n enabled = false;\r\n /** Option config for the shared ieeesa-slide-toggle. */\r\n toggleOption: SlideToggleOption = {\r\n id: 1,\r\n label: '',\r\n checked: false,\r\n ariaLabel: 'Enable Reciprocal Credit',\r\n };\r\n /** Selected foreign working groups (chips). */\r\n selectedForeignGroups: SelectedForeignGroup[] = [];\r\n /**\r\n * Persistent map of foreignGroupId → configId for the rows that existed on the\r\n * initial load. Kept for the whole edit session so a saved group re-selected\r\n * after being de-selected recovers its configId (and its queued removal is undone).\r\n */\r\n private savedConfigIdByGroupId = new Map<string, string>();\r\n /**\r\n * Config ids that existed on load but have since been removed locally (either by\r\n * de-selecting a chip or turning the toggle off). The parent removes each on save.\r\n */\r\n removedConfigIds: string[] = [];\r\n /** All foreign working groups available under the same committee. */\r\n availableGroups: AvailableForeignGroup[] = [];\r\n isLoading = false;\r\n\r\n // eslint-disable-next-line no-unused-vars\r\n constructor(\r\n // eslint-disable-next-line no-unused-vars\r\n private groupsService: GroupsService,\r\n // eslint-disable-next-line no-unused-vars\r\n private dialog: MatDialog\r\n ) {}\r\n\r\n ngOnInit(): void {\r\n if (this.homeGroupId) {\r\n this.loadAvailableGroups(this.homeGroupId);\r\n this.loadExistingConfig(this.homeGroupId);\r\n }\r\n }\r\n\r\n /** Fetch the foreign working groups available for selection. */\r\n private loadAvailableGroups(homeGroupId: string): void {\r\n this.groupsService\r\n .getAvailableReciprocalGroups(homeGroupId)\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (res) => {\r\n this.availableGroups = res?.body ?? [];\r\n },\r\n error: (error) => {\r\n this.groupsService.handleErrors(error);\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Load existing reciprocal config rows for the edit-prefill path. The toggle is\r\n * ON when one or more rows exist; each chip keeps its own configId for removal.\r\n */\r\n private loadExistingConfig(homeGroupId: string): void {\r\n this.isLoading = true;\r\n this.groupsService\r\n .getReciprocalConfig(homeGroupId, this.eventId)\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (res) => {\r\n const rows: ReciprocalCreditConfigRow[] = res?.body ?? [];\r\n this.selectedForeignGroups = rows.map((row) => ({\r\n groupId: row.foreignGroupId,\r\n groupName: row.foreignGroupName,\r\n configId: row.configId,\r\n }));\r\n // Remember each saved row's configId so it can be recovered if the\r\n // group is de-selected and then re-selected before saving.\r\n this.savedConfigIdByGroupId = new Map(\r\n rows.map((row) => [row.foreignGroupId, row.configId])\r\n );\r\n this.enabled = this.selectedForeignGroups.length > 0;\r\n this.toggleOption = { ...this.toggleOption, checked: this.enabled };\r\n this.removedConfigIds = [];\r\n this.emitState();\r\n this.isLoading = false;\r\n },\r\n error: (error) => {\r\n this.isLoading = false;\r\n this.groupsService.handleErrors(error);\r\n },\r\n });\r\n }\r\n\r\n /** Handle the enable/disable toggle (shared ieeesa-slide-toggle emits SlideToggleOption). */\r\n onToggleChange(option: SlideToggleOption): void {\r\n this.enabled = !!option?.checked;\r\n this.toggleOption = { ...this.toggleOption, checked: this.enabled };\r\n if (!this.enabled) {\r\n // Turning off queues every existing (saved) row for removal and clears chips.\r\n this.queueRemovalOf(this.selectedForeignGroups);\r\n this.selectedForeignGroups = [];\r\n }\r\n this.emitState();\r\n }\r\n\r\n /** Open the Add Working Groups modal. */\r\n onAddWorkingGroups(): void {\r\n const dialogRef = this.dialog.open(AddWorkingGroupsComponent, {\r\n panelClass: 'ieeesa-modal-dialog',\r\n data: {\r\n availableGroups: this.availableGroups,\r\n selectedGroupIds: this.selectedForeignGroups.map((g) => g.groupId),\r\n },\r\n });\r\n dialogRef\r\n .afterClosed()\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe((result: AvailableForeignGroup[] | undefined) => {\r\n if (result) {\r\n this.mergeSelection(result);\r\n this.emitState();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Merge the modal's returned selection into the current chips. Groups that are\r\n * no longer selected but were saved get queued for removal; already-selected\r\n * groups keep their existing configId.\r\n */\r\n private mergeSelection(selected: AvailableForeignGroup[]): void {\r\n const selectedIds = new Set(selected.map((g) => g.groupId));\r\n\r\n // Queue removal for previously-saved chips that are no longer selected.\r\n const dropped = this.selectedForeignGroups.filter(\r\n (g) => !selectedIds.has(g.groupId)\r\n );\r\n this.queueRemovalOf(dropped);\r\n\r\n // Rebuild the selection, recovering each saved group's original configId\r\n // from the persistent load-time map (not just the currently-selected list),\r\n // so a de-selected-then-re-selected saved group keeps its configId.\r\n this.selectedForeignGroups = selected.map((g) => ({\r\n groupId: g.groupId,\r\n groupName: g.groupName,\r\n configId: this.savedConfigIdByGroupId.get(g.groupId),\r\n }));\r\n\r\n // Un-queue removal for any saved group that is (re)selected — it should be\r\n // kept, not removed, on save.\r\n this.removedConfigIds = this.removedConfigIds.filter((configId) => {\r\n const stillSelected = this.selectedForeignGroups.some(\r\n (g) => g.configId === configId\r\n );\r\n return !stillSelected;\r\n });\r\n }\r\n\r\n /** Remove a selected foreign group chip. */\r\n removeGroup(groupId: string): void {\r\n const removed = this.selectedForeignGroups.filter(\r\n (g) => g.groupId === groupId\r\n );\r\n this.queueRemovalOf(removed);\r\n this.selectedForeignGroups = this.selectedForeignGroups.filter(\r\n (g) => g.groupId !== groupId\r\n );\r\n this.emitState();\r\n }\r\n\r\n /** Track saved rows (those with a configId) that must be removed on the BE. */\r\n private queueRemovalOf(groups: SelectedForeignGroup[]): void {\r\n groups.forEach((g) => {\r\n if (g.configId && !this.removedConfigIds.includes(g.configId)) {\r\n this.removedConfigIds.push(g.configId);\r\n }\r\n });\r\n }\r\n\r\n /** True when the section is valid (toggle off, OR toggle on with ≥1 group). */\r\n get isValid(): boolean {\r\n return !this.enabled || this.selectedForeignGroups.length > 0;\r\n }\r\n\r\n private emitState(): void {\r\n this.enabledChange.emit(this.enabled);\r\n this.selectionChange.emit(this.selectedForeignGroups);\r\n this.removedConfigIdsChange.emit([...this.removedConfigIds]);\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroy$.next(true);\r\n this.destroy$.complete();\r\n }\r\n}\r\n","<div class=\"ieeesa-reciprocal-credit\">\r\n <p class=\"ieeesa-reciprocal-credit__title\">Reciprocal Credit</p>\r\n\r\n <!-- Enable toggle -->\r\n <div class=\"ieeesa-reciprocal-credit__toggle-row\">\r\n <ieeesa-slide-toggle\r\n [slideToggle]=\"toggleOption\"\r\n (slideToggleChange)=\"onToggleChange($event)\"\r\n ></ieeesa-slide-toggle>\r\n <div class=\"ieeesa-reciprocal-credit__toggle-text\">\r\n <span class=\"ieeesa-reciprocal-credit__toggle-label\">Enable Reciprocal Credit</span>\r\n <span class=\"ieeesa-reciprocal-credit__toggle-subtext\">\r\n Use this configuration in eligible event attendance calculations.\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <!-- Info banner (always shown in the section) -->\r\n <div class=\"ieeesa-reciprocal-credit__info-banner\">\r\n <strong>Available only for Working Groups.</strong>\r\n Voting members of this Home Working Group can receive attendance credit when they\r\n attend meetings hosted by selected Foreign Working Groups under the same Standards Committee.\r\n </div>\r\n\r\n <!-- Selection UI (only when enabled) -->\r\n <ng-container *ngIf=\"enabled\">\r\n <label class=\"ieeesa-reciprocal-credit__field-label\">\r\n Eligible Foreign Working Groups*\r\n </label>\r\n\r\n <div class=\"ieeesa-reciprocal-credit__chips-box\">\r\n <span\r\n *ngFor=\"let group of selectedForeignGroups\"\r\n class=\"ieeesa-reciprocal-credit__chip\"\r\n >\r\n {{ group.groupName }}\r\n <button\r\n type=\"button\"\r\n class=\"ieeesa-reciprocal-credit__chip-remove\"\r\n (click)=\"removeGroup(group.groupId)\"\r\n [attr.aria-label]=\"'Remove ' + group.groupName\"\r\n >\r\n ×\r\n </button>\r\n </span>\r\n <span\r\n *ngIf=\"selectedForeignGroups.length === 0\"\r\n class=\"ieeesa-reciprocal-credit__chips-placeholder\"\r\n >\r\n No working groups selected\r\n </span>\r\n </div>\r\n\r\n <p class=\"ieeesa-reciprocal-credit__helper\" *ngIf=\"parentCommitteeName\">\r\n Only groups under {{ parentCommitteeName }} are available.\r\n </p>\r\n\r\n <div class=\"ieeesa-reciprocal-credit__add-row\">\r\n <button\r\n mat-button\r\n type=\"button\"\r\n class=\"mat-tertiary-button ieeesa-reciprocal-credit__add-btn\"\r\n (click)=\"onAddWorkingGroups()\"\r\n >\r\n + Add Working Groups\r\n </button>\r\n </div>\r\n\r\n <!-- One-way relationship warning -->\r\n <div class=\"ieeesa-reciprocal-credit__warning-banner\">\r\n <strong>One-way relationship:</strong> Adding a Foreign Working Group here does not\r\n automatically enable reciprocal credit in the opposite direction.\r\n </div>\r\n </ng-container>\r\n</div>\r\n","import {\r\n Component,\r\n EventEmitter,\r\n OnDestroy,\r\n OnInit,\r\n Output,\r\n ViewChild,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormGroup, Validators } from '@angular/forms';\r\nimport {\r\n FormGrid,\r\n FormModel,\r\n SelectOption,\r\n AlignType,\r\n SlideToggleOption,\r\n FieldConfig,\r\n FormControlType,\r\n DynamicFormComponent,\r\n} from '@ieeesa-npm/presentation';\r\nimport {\r\n AlertsService,\r\n GlobalErrorHandlerService,\r\n} from '@ieeesa-npm/utility';\r\nimport * as screenTexts from '../../assets/constants.json';\r\nimport { GroupsValidationPatterns } from '../../assets/form-validations';\r\nimport { CreateGroupPayload } from '../../models/create-group.model';\r\nimport { GroupsService } from '../../services/groups.service';\r\nimport { HttpErrorResponse } from '@angular/common/http';\r\nimport { MatDialogModule } from '@angular/material/dialog';\r\nimport { Subject, forkJoin, takeUntil } from 'rxjs';\r\nimport { GroupType } from '../../models/group-types.model';\r\nimport { GroupInfo } from '../../models/group-info.model';\r\nimport { EditGroupPayload } from '../../models/edit-group.model';\r\nimport { FormStatus, AlertType } from '@ieeesa-npm/models';\r\nimport { GroupFunctionType } from '../../models/group-function-type.model';\r\nimport { ParentGroupsInfo } from '../../models/parent-groups-info.model';\r\nimport {\r\n ReciprocalCreditSectionComponent,\r\n SelectedForeignGroup,\r\n} from '../reciprocal-credit-section/reciprocal-credit-section.component';\r\nconst INDEX_VALUE = 4;\r\n/** Group type name that enables the Reciprocal Credit section. */\r\nconst WORKING_GROUP_TYPE_NAME = 'Working Group';\r\n\r\n/**\r\n * CreateGroupComponent uses DynamicFormComponent to build create new group form or edit group and implement the functionalities of submission of form and handling success and error scenarios.\r\n * @class CreateGroupComponent\r\n * @implements {OnInit}\r\n * @implements {OnDestroy}\r\n */\r\n@Component({\r\n // eslint-disable-next-line @angular-eslint/component-selector\r\n selector: 'ieeesa-create-group',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n DynamicFormComponent,\r\n MatDialogModule,\r\n ReciprocalCreditSectionComponent,\r\n ],\r\n templateUrl: './create-group.component.html',\r\n styleUrls: ['./create-group.component.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n providers: [AlertsService],\r\n})\r\nexport class CreateGroupComponent implements OnInit, OnDestroy {\r\n destroy$: Subject<boolean> = new Subject<boolean>();\r\n /**\r\n * Event emitted when the form is successfully submitted.\r\n * @memberof CreateGroupComponent\r\n */\r\n @Output() submitFormResponse = new EventEmitter();\r\n /**\r\n * Event emitted when the form is cancelled.\r\n * @memberof CreateGroupComponent\r\n */\r\n @Output() formCancel = new EventEmitter();\r\n createGroupText = screenTexts?.createGroup;\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n constants: any = screenTexts;\r\n leftButtonLabel = this.createGroupText?.label?.leftButtonLabel;\r\n rightButtonLabel = this.createGroupText?.label?.rightButtonLabel;\r\n isLegendVisible = false;\r\n isLeftButtonNeeded = true;\r\n colWidth: FormGrid = { xs: 12, xl: 12, sm: 12, md: 12, lg: 12 };\r\n formGroup!: FormModel;\r\n groupTypes!: SelectOption[];\r\n actionButtonAlign = AlignType.LEFT;\r\n form!: FormGroup;\r\n selectedGroupInfo!: GroupInfo | undefined;\r\n groupFunctionType!: GroupFunctionType;\r\n selectedGroupParentInfo!: GroupInfo | undefined;\r\n allowedParentGroups: ParentGroupsInfo[] = [];\r\n allowedParentGroupsOptions: SelectOption[] = [];\r\n isParentGroupChanged = false;\r\n slideToggleOption: SlideToggleOption = {\r\n id: 1,\r\n label: this.createGroupText?.label?.changeParentGroup,\r\n checked: false,\r\n };\r\n /** Reciprocal credit state (Working Group only) — captured for Save. */\r\n reciprocalEnabled = false;\r\n reciprocalSelectedGroups: SelectedForeignGroup[] = [];\r\n /** Config ids of previously-saved reciprocal rows removed locally — for soft-delete on Save. */\r\n reciprocalRemovedConfigIds: string[] = [];\r\n /** Group type currently selected in the create form (for gating the section). */\r\n selectedCreateGroupTypeId?: string;\r\n @ViewChild(DynamicFormComponent) dynamicFormComponent!: DynamicFormComponent;\r\n // eslint-disable-next-line no-unused-vars, no-empty-function\r\n constructor(\r\n // eslint-disable-next-line no-unused-vars\r\n private groupsService: GroupsService,\r\n // eslint-disable-next-line no-unused-vars\r\n private globalErrorHandlerService: GlobalErrorHandlerService,\r\n // eslint-disable-next-line no-unused-vars\r\n public alertService: AlertsService // eslint-disable-next-line no-empty-function,\r\n ) {}\r\n\r\n /**\r\n * Initialize the create group form group array and component.\r\n * @return -returns nothing\r\n * @memberof CreateGroupComponent\r\n */\r\n ngOnInit(): void {\r\n this.groupFunctionType = this.groupsService?.getGroupFunctionType();\r\n this.selectedGroupInfo = this.groupsService?.getSelectedGroupInfo();\r\n if (this.groupFunctionType === GroupFunctionType.EDIT) {\r\n this.selectedGroupParentInfo =\r\n this.groupsService?.getSelectedGroupParentInfo();\r\n if (this.selectedGroupInfo?.groupParentId)\r\n this.getParentGroups(this.selectedGroupInfo?.groupId);\r\n this.createFormGroup();\r\n } else {\r\n const groupTypes = this.groupsService?.getFormattedGroupTypes(\r\n this.groupsService?.getLoadedGroupTypes()\r\n );\r\n if (this.selectedGroupInfo?.groupType) {\r\n const allowedGroupType =\r\n groupTypes[this.selectedGroupInfo?.groupType]?.businessRule\r\n ?.allowedGroupType;\r\n if (allowedGroupType?.length) {\r\n this.groupTypes = allowedGroupType.map((groupTypeId: string) => ({\r\n id: groupTypeId,\r\n name: groupTypes[groupTypeId]?.name,\r\n }));\r\n this.groupTypes = this.groupTypes.filter(\r\n (groupType) => !groupTypes[groupType.id]?.businessRule?.isAdmin\r\n );\r\n } else {\r\n this.showAlertMessage(screenTexts?.errors?.ER1000, AlertType.ERROR);\r\n }\r\n } else {\r\n this.groupTypes = Object.entries(groupTypes).map(\r\n ([id, item]: [string, GroupType]) => ({\r\n id,\r\n name: item?.name,\r\n })\r\n );\r\n this.groupTypes = this.groupTypes.filter(\r\n (groupType) =>\r\n groupTypes[groupType.id]?.hierarchy === 0 &&\r\n !groupTypes[groupType.id]?.businessRule?.isAdmin\r\n );\r\n }\r\n if (this.groupTypes?.length) {\r\n this.createFormGroup();\r\n } else {\r\n this.showAlertMessage(screenTexts?.errors?.['1010'], AlertType.ERROR);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Constructs and returns the group type form field based on edit group or not.\r\n * @return {FieldConfig} -group type form field.\r\n * @memberof CreateGroupComponent\r\n */\r\n getGroupTypeField(): FieldConfig {\r\n let groupTypeField: FieldConfig;\r\n if (this.groupFunctionType === GroupFunctionType.EDIT) {\r\n groupTypeField = {\r\n type: FormControlType?.TEXT_AREA,\r\n label: this.createGroupText?.label?.groupType,\r\n controlName: 'groupType',\r\n isReadonly: true,\r\n ariaMultiline: false,\r\n value: this.selectedGroupInfo?.groupTypeInfo?.name,\r\n ariaLabel: this.constants?.editGroup?.ariaLabel?.groupType,\r\n ariaDescribedById:\r\n this.createGroupText?.label?.ariaDescribedById?.groupType,\r\n isResize: true,\r\n };\r\n } else {\r\n groupTypeField = {\r\n type: FormControlType?.SELECT,\r\n label: this.createGroupText?.label?.groupType + '*',\r\n controlName: 'groupType',\r\n requiredErrorMessage: this.createGroupText?.message?.error?.required,\r\n value: '',\r\n validation: [Validators.required],\r\n dropdownOptions: this.groupTypes,\r\n supportMessage: this.createGroupText?.supportText?.groupType,\r\n ariaLabel: this.createGroupText?.label?.ariaLabel?.groupType,\r\n ariaDescribedById:\r\n this.createGroupText?.label?.ariaDescribedById?.groupType,\r\n placeholder: '',\r\n };\r\n }\r\n return groupTypeField;\r\n }\r\n\r\n /**\r\n * Initialize the create group form group array.\r\n * @memberof CreateGroupComponent\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n createFormGroup(formValue?: any): void {\r\n this.formGroup = {\r\n formGroup: [\r\n {\r\n legend: '',\r\n controls: [\r\n this.getGroupTypeField(),\r\n {\r\n type: FormControlType?.INPUT,\r\n label: this.createGroupText?.label?.groupName + '*',\r\n controlName: 'groupName',\r\n requiredErrorMessage:\r\n this.createGroupText?.message?.error?.required,\r\n value:\r\n this.groupFunctionType === GroupFunctionType.EDIT\r\n ? formValue\r\n ? formValue?.groupName\r\n : this.selectedGroupInfo?.groupName\r\n : '',\r\n placeholder: '',\r\n supportMessage: this.createGroupText?.supportText?.groupName,\r\n patternErrorMessage:\r\n this.createGroupText?.message?.error?.pattern?.groupName,\r\n validation: [\r\n Validators.required,\r\n Validators.maxLength(\r\n screenTexts?.createGroup?.characterLimit?.character500\r\n ),\r\n Validators.pattern(GroupsValidationPatterns?.groupName),\r\n ],\r\n maxErrorMessage:\r\n this.createGroupText?.message?.error?.limit?.groupName,\r\n ariaLabel: this.createGroupText?.label?.ariaLabel?.groupName,\r\n ariaDescribedById:\r\n this.createGroupText?.label?.ariaDescribedById?.groupName,\r\n },\r\n {\r\n type: FormControlType?.INPUT,\r\n label: this.createGroupText?.label?.shortName + '*',\r\n controlName: 'shortName',\r\n requiredErrorMessage:\r\n this.createGroupText?.message?.error?.required,\r\n value:\r\n this.groupFunctionType === GroupFunctionType.EDIT\r\n ? formValue\r\n ? formValue?.shortName\r\n : this.selectedGroupInfo?.groupShortName\r\n : '',\r\n patternErrorMessage:\r\n this.createGroupText?.message?.error?.pattern?.shortName,\r\n placeholder: '',\r\n supportMessage: this.createGroupText?.supportText?.shortName,\r\n validation: [\r\n Validators.required,\r\n Validators.maxLength(\r\n screenTexts?.createGroup?.characterLimit?.character15\r\n ),\r\n Validators.pattern(GroupsValidationPatterns?.shortName),\r\n ],\r\n maxErrorMessage:\r\n this.createGroupText?.message?.error?.limit?.shortName,\r\n ariaLabel: this.createGroupText?.label?.ariaLabel?.shortName,\r\n ariaDescribedById:\r\n this.createGroupText?.label?.ariaDescribedById?.shortName,\r\n },\r\n {\r\n type: FormControlType.TEXT_AREA,\r\n label: this.createGroupText?.label?.groupScope,\r\n controlName: 'groupScope',\r\n patternErrorMessage:\r\n this.createGroupText?.message?.error?.pattern?.groupScope,\r\n value:\r\n this.groupFunctionType === GroupFunctionType.EDIT\r\n ? formValue\r\n ? formValue?.groupScope\r\n : this.selectedGroupInfo?.groupDesc\r\n : '',\r\n placeholder: '',\r\n supportMessage: this.createGroupText?.supportText?.groupScope,\r\n isResize: true,\r\n maxLength:\r\n screenTexts?.createGroup?.characterLimit?.character2000,\r\n validation: [\r\n Validators.maxLength(\r\n screenTexts?.createGroup?.characterLimit?.character1500\r\n ),\r\n Validators.pattern(GroupsValidationPatterns?.groupScope),\r\n ],\r\n maxErrorMessage:\r\n this.createGroupText?.message?.error?.limit?.groupScope,\r\n ariaLabel: this.createGroupText?.label?.ariaLabel?.groupScope,\r\n ariaDescribedById:\r\n this.createGroupText?.label?.ariaDescribedById?.groupScope,\r\n },\r\n ],\r\n },\r\n ],\r\n };\r\n if (this.selectedGroupInfo?.groupId) {\r\n this.updateCreateFormGroup(this.selectedGroupInfo);\r\n }\r\n }\r\n\r\n /**\r\n * Update the create sub group form group array.\r\n * @param {GroupInfo} parentGroupInfo -Parent group info.\r\n * @return -returns nothing\r\n * @memberof CreateGroupComponent\r\n */\r\n updateCreateFormGroup(parentGroupInfo: GroupInfo): void {\r\n if (\r\n (this.groupFunctionType === GroupFunctionType.EDIT &&\r\n parentGroupInfo?.groupParentId) ||\r\n this.groupFunctionType === GroupFunctionType.CREATE\r\n ) {\r\n this.updateAddUserFormControls(\r\n this.formGroup?.formGroup[0]?.controls?.length - INDEX_VALUE,\r\n {\r\n type: FormControlType?.TEXT_AREA,\r\n label: this.createGroupText?.label?.parentGroup,\r\n controlName: 'parentGroup',\r\n value:\r\n this.selectedGroupParentInfo?.groupName ??\r\n parentGroupInfo?.groupName,\r\n ariaLabel: this.createGroupText?.label?.ariaLabel?.parentGroup,\r\n ariaDescribedById:\r\n this.createGroupText?.label?.ariaDescribedById?.parentGroup,\r\n isReadonly: true,\r\n ariaMultiline: false,\r\n isResize: true,\r\n }\r\n );\r\n\r\n if (this.groupFunctionType === GroupFunctionType.EDIT) {\r\n this.updateAddUserFormControls(\r\n this.formGroup?.formGroup[0]?.controls?.length - INDEX_VALUE,\r\n {\r\n type: FormControlType?.SLIDE_TOGGLE,\r\n controlName: 'changeParentGroup',\r\n ariaLabel:\r\n this.createGroupText?.label?.ariaLabel?.changeParentGroup,\r\n ariaDescribedById:\r\n this.createGroupText?.label?.ariaDescribedById?.changeParentGroup,\r\n slideToggleOption: this.slideToggleOption,\r\n disabled: this.allowedParentGroupsOptions.length === 0,\r\n }\r\n );\r\n if (this.isParentGroupChanged) {\r\n this.updateAddUserFormControls(\r\n this.formGroup?.formGroup[0]?.controls?.length - INDEX_VALUE,\r\n {\r\n type: FormControlType?.SELECT,\r\n label: this.createGroupText?.label?.newParentGroup + '*',\r\n controlName: 'newParentGroup',\r\n value: this.allowedParentGroupsOptions?.filter(\r\n (option) => option?.id === this.selectedGroupInfo?.groupId\r\n )[0],\r\n requiredErrorMessage:\r\n this.createGroupText?.message?.error?.required,\r\n validation: [Validators.required],\r\n dropdownOptions: this.allowedParentGroupsOptions,\r\n placeholder: '',\r\n supportMessage: this.createGroupText?.supportText?.newParentGroup,\r\n ariaLabel: this.createGroupText?.label?.ariaLabel?.newParentGroup,\r\n ariaDescribedById:\r\n this.createGroupText?.label?.ariaDescribedById?.newParentGroup,\r\n }\r\n );\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Updates the create or edit user form group controls by adding fieldConfig at required index.\r\n * @param {number} indexPosition\r\n * @param {FieldConfig} fieldConfig\r\n * @return -returns nothing\r\n * @memberof CreateGroupComponent\r\n */\r\n updateAddUserFormControls(\r\n indexPosition: number,\r\n fieldConfig: FieldConfig\r\n ): void {\r\n this.formGroup?.formGroup[0]?.controls?.splice(\r\n indexPosition,\r\n 0,\r\n fieldConfig\r\n );\r\n }\r\n\r\n /**\r\n * Handles client side validation and calls create group or edit group methods.\r\n * @param {FormGroup[]} form -Array of formGroup\r\n * @return -returns nothing\r\n * @memberof CreateGroupComponent\r\n */\r\n onFormSubmit(form: FormGroup[]): void {\r\n form[0]?.markAllAsTouched();\r\n // Reciprocal Credit: if the toggle is ON, at least one foreign group is\r\n // required (BE rejects an empty foreign-group list). Block Save otherwise.\r\n if (this.isReciprocalInvalid) {\r\n this.showAlertMessage(\r\n this.createGroupText?.reciprocalCredit?.selectAtLeastOneGroup ??\r\n 'Please add at least one Working Group to enable Reciprocal Credit, or turn off the toggle.',\r\n AlertType.ERROR\r\n );\r\n return;\r\n }\r\n if (form[0].status === FormStatus.VALID) {\r\n const formData = form[0]?.getRawValue();\r\n // eslint-disable-next-line no-unused-expressions\r\n this.groupFunctionType === GroupFunctionType.EDIT\r\n ? this.editGroup(formData)\r\n : this.createGroup(formData);\r\n }\r\n }\r\n /**\r\n * Constructs create group payload and calls create group API and emits create group API response.\r\n * @param formData\r\n * @return -returns nothing\r\n * @memberof CreateGroupComponent\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n createGroup(formData: any): void {\r\n const createGroupPayload: CreateGroupPayload = {\r\n payload: {\r\n groupName: formData?.groupName,\r\n groupShortName: formData?.shortName,\r\n groupType: formData?.groupType?.id,\r\n groupDesc: formData?.groupScope,\r\n groupParentId: this.selectedGroupInfo?.groupId ?? null,\r\n },\r\n };\r\n this.groupsService\r\n .createGroup(createGroupPayload)\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (res) => {\r\n if (res?.status) {\r\n this.submitFormResponse?.emit(res);\r\n }\r\n },\r\n error: (error) => {\r\n this.handleErrors(error);\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Constructs edit group payload and calls edit group API and emits create group API response.\r\n * @param formData\r\n * @return -returns nothing\r\n * @memberof CreateGroupComponent\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n editGroup(formData: any): void {\r\n this.groupsService?.setParentGroupChangeStatus(this.isParentGroupChanged);\r\n const editGroupPayload: EditGroupPayload = {\r\n payload: {\r\n groupName: formData?.groupName,\r\n groupShortName: formData?.shortName,\r\n groupDesc: formData?.groupScope,\r\n groupParentId: this.isParentGroupChanged\r\n ? formData?.newParentGroup?.id\r\n : this.selectedGroupInfo?.groupParentId ?? null,\r\n groupId: this.selectedGroupInfo?.groupId as string,\r\n },\r\n };\r\n this.groupsService\r\n .editGroup(editGroupPayload)\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (res) => {\r\n if (res?.status) {\r\n // Persist reciprocal-credit changes (Working Group edit only), then emit.\r\n this.persistReciprocalCredit(res);\r\n }\r\n },\r\n error: (error) => {\r\n this.handleErrors(error);\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Persists reciprocal-credit changes captured from the section after a\r\n * successful group edit: POSTs newly-added foreign groups (those without a\r\n * configId) and soft-deletes each removed config id. Emits the group-edit\r\n * response once persistence completes (or immediately if there's nothing to do).\r\n * @param {*} editResponse the successful edit-group response\r\n * @memberof CreateGroupComponent\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private persistReciprocalCredit(editResponse: any): void {\r\n const homeGroupId = this.selectedGroupInfo?.groupId;\r\n // Nothing to persist when the section isn't shown or there's no home group.\r\n if (!this.isReciprocalSectionVisible || !homeGroupId) {\r\n this.submitFormResponse?.emit(editResponse);\r\n return;\r\n }\r\n\r\n // Add: selected groups that were not already saved (no configId yet).\r\n const foreignGroupIdsToAdd = this.reciprocalSelectedGroups\r\n .filter((group) => !group.configId)\r\n .map((group) => group.groupId);\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n const calls: any[] = [];\r\n if (this.reciprocalEnabled && foreignGroupIdsToAdd.length > 0) {\r\n calls.push(\r\n this.groupsService.saveReciprocalCredit({\r\n homeGroupId,\r\n foreignGroupIds: foreignGroupIdsToAdd,\r\n })\r\n );\r\n }\r\n // Remove: each previously-saved config id removed locally.\r\n this.reciprocalRemovedConfigIds.forEach((configId) => {\r\n calls.push(this.groupsService.removeReciprocalConfig(configId));\r\n });\r\n\r\n // Nothing to persist — emit the edit response as-is.\r\n if (calls.length === 0) {\r\n this.submitFormResponse?.emit(editResponse);\r\n return;\r\n }\r\n\r\n forkJoin(calls)\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: () => {\r\n this.submitFormResponse?.emit(editResponse);\r\n },\r\n error: (error) => {\r\n // Group edit already succeeded; surface the reciprocal error but still\r\n // emit so the parent completes the edit flow.\r\n this.groupsService.handleErrors(error);\r\n this.submitFormResponse?.emit(editResponse);\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Captures the server side errors and handles the errors based on the custom or Http errors.\r\n * @param {HttpErrorResponse} error\r\n * @return -returns nothing\r\n * @memberof CreateGroupComponent\r\n */\r\n handleErrors(error: HttpErrorResponse): void {\r\n const errorCodes: string[] = error?.error?.body?.errorCodes;\r\n if (Array.isArray(errorCodes)) {\r\n const errorMessage: string[] =\r\n this.groupsService?.parseErrorMessage(errorCodes);\r\n this.showAlertMessage(errorMessage, AlertType.ERROR);\r\n } else if (error && error instanceof HttpErrorResponse) {\r\n this.globalErrorHandlerService?.handleError(error);\r\n }\r\n }\r\n\r\n /**\r\n * Get form reference.\r\n * @param {FormGroup[]} form\r\n * @memberof CreateGroupComponent\r\n */\r\n getFormGroupReference(form: FormGroup[]) {\r\n this.form = form[0];\r\n }\r\n\r\n /**\r\n * Handles alerts for error, warning.\r\n * @param {(string | string[])} message -error or warning message\r\n * @param {AlertType} alertType\r\n * @return -returns nothing\r\n * @memberof CreateGroupComponent\r\n */\r\n showAlertMessage(message: string | string[], alertType: AlertType): void {\r\n this.alertService?.showMessage({\r\n status: 'custom',\r\n message: message,\r\n alertType: alertType,\r\n isCloseNeeded: true,\r\n });\r\n }\r\n\r\n /**\r\n * Emits form cancel event.\r\n * @return -returns nothing\r\n * @memberof CreateGroupComponent\r\n */\r\n createGroupCancelled(): void {\r\n this.formCancel?.emit();\r\n }\r\n\r\n /**\r\n * True when the group being created/edited is a Working Group — gates the\r\n * Reciprocal Credit section.\r\n * @return {boolean}\r\n * @memberof CreateGroupComponent\r\n */\r\n get isWorkingGroup(): boolean {\r\n const groupTypeId =\r\n this.groupFunctionType === GroupFunctionType.EDIT\r\n ? this.selectedGroupInfo?.groupType\r\n : this.selectedCreateGroupTypeId;\r\n if (!groupTypeId) return false;\r\n const groupTypes = this.groupsService?.getFormattedGroupTypes(\r\n this.groupsService?.getLoadedGroupTypes()\r\n );\r\n return groupTypes?.[groupTypeId]?.name === WORKING_GROUP_TYPE_NAME;\r\n }\r\n\r\n /**\r\n * True when the Reciprocal Credit section should be shown: only for a Working\r\n * Group in EDIT mode. Hidden during create because the home group has no id\r\n * yet and the create flow is still being finalized with the client team.\r\n * @return {boolean}\r\n * @memberof CreateGroupComponent\r\n */\r\n get isReciprocalSectionVisible(): boolean {\r\n return (\r\n this.groupFunctionType === GroupFunctionType.EDIT && this.isWorkingGroup\r\n );\r\n }\r\n\r\n /**\r\n * True when the reciprocal section is shown, the toggle is ON, but no foreign\r\n * group has been added — an invalid state (BE rejects an empty foreign-group\r\n * list). Used to block the edit Save.\r\n * @return {boolean}\r\n * @memberof CreateGroupComponent\r\n */\r\n get isReciprocalInvalid(): boolean {\r\n return (\r\n this.isReciprocalSectionVisible &&\r\n this.reciprocalEnabled &&\r\n this.reciprocalSelectedGroups.length === 0\r\n );\r\n }\r\n\r\n /** Home group id for the reciprocal section (present in edit). */\r\n get reciprocalHomeGroupId(): string | undefined {\r\n return this.groupFunctionType === GroupFunctionType.EDIT\r\n ? this.selectedGroupInfo?.groupId\r\n : undefined;\r\n }\r\n\r\n /** Parent committee name shown in the reciprocal helper text. */\r\n get reciprocalParentCommitteeName(): string | undefined {\r\n return this.selectedGroupParentInfo?.groupName;\r\n }\r\n\r\n /** Capture reciprocal toggle state from the section. */\r\n onReciprocalEnabledChange(enabled: boolean): void {\r\n this.reciprocalEnabled = enabled;\r\n }\r\n\r\n /** Capture reciprocal foreign-group selection from the section. */\r\n onReciprocalSelectionChange(groups: SelectedForeignGroup[]): void {\r\n this.reciprocalSelectedGroups = groups;\r\n }\r\n\r\n /** Capture the config ids to soft-delete on Save from the section. */\r\n onReciprocalRemovedConfigIdsChange(configIds: string[]): void {\r\n this.reciprocalRemovedConfigIds = configIds;\r\n }\r\n\r\n /**\r\n * Gets allowed parent groups for reassigning the parent.\r\n * @param {string} groupId\r\n * @return -returns nothing\r\n * @memberof CreateGroupComponent\r\n */\r\n getParentGroups(groupId: string): void {\r\n this.allowedParentGroups = [];\r\n this.groupsService\r\n .getAllowedParentGroups(groupId)\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (response) => {\r\n response?.forEach((option) => {\r\n this.allowedParentGroupsOptions?.push({\r\n id: option?.groupId,\r\n name: option?.groupName + ' (' + option?.groupAcronym + ')',\r\n });\r\n });\r\n this.allowedParentGroups = response;\r\n if (this.allowedParentGroupsOptions.length > 0) {\r\n this.updateFormControlOptions(\r\n 'changeParentGroup',\r\n 'isDisabled',\r\n false\r\n );\r\n this.updateFormControlOptions(\r\n 'newParentGroup',\r\n 'dropdownOptions',\r\n this.allowedParentGroupsOptions\r\n );\r\n }\r\n },\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n error: (error: any) => {\r\n this.handleErrors(error);\r\n this.updateFormControlOptions(\r\n 'changeParentGroup',\r\n 'isDisabled',\r\n this.allowedParentGroupsOptions.length === 0\r\n );\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Update passed form field values.\r\n * @param {string} formControlName\r\n * @param {string} formControlInputProperty\r\n * @param {*} value\r\n * @memberof CreateGroupComponent\r\n */\r\n updateFormControlOptions(\r\n formControlName: string,\r\n formControlInputProperty: string,\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n value: any\r\n ): void {\r\n const formFields = this.dynamicFormComponent?.formFields?.toArray();\r\n formFields?.forEach((formField) => {\r\n if (\r\n formField?.component?.instance?.config?.controlName ===\r\n formControlName &&\r\n formField?.component?.instance?.[formControlInputProperty]\r\n )\r\n formField.component.instance[formControlInputProperty] = value;\r\n });\r\n }\r\n\r\n /**\r\n * Adds/removes new parent group selection options whenever Change Parent Group slider is toggled.\r\n * @param {SlideToggleOption} toggle\r\n * @return -returns nothing\r\n * @memberof CreateGroupComponent\r\n */\r\n onFormSlideToggleChange(toggle: SlideToggleOption): void {\r\n this.slideToggleOption.checked = toggle?.checked;\r\n this.isParentGroupChanged = toggle?.checked;\r\n this.createFormGroup(this.form?.value);\r\n }\r\n\r\n /**\r\n * Handles create group form change event.\r\n * @param {FormGroup[]} form\r\n * @return -returns nothing\r\n * @memberof CreateGroupComponent\r\n */\r\n onCreateGroupFormChange(form: FormGroup[]): void {\r\n if (this.isParentGroupChanged) {\r\n const selectedParentGroup = this.allowedParentGroups?.filter(\r\n (option: ParentGroupsInfo) =>\r\n option?.groupId ===\r\n form[0]?.controls['newParentGroup']?.value?.id?.toString()\r\n )[0];\r\n this.form?.get('parentGroup')?.setValue(selectedParentGroup?.groupName);\r\n }\r\n // Track the selected group type in create mode so the Reciprocal Credit\r\n // section can render only for Working Groups.\r\n if (this.groupFunctionType !== GroupFunctionType.EDIT) {\r\n this.selectedCreateGroupTypeId =\r\n form[0]?.controls['groupType']?.value?.id ??\r\n form[0]?.controls['groupType']?.value;\r\n }\r\n }\r\n\r\n /**\r\n * NgOnDestroy performs necessary cleanup tasks, such as unsubscribing from subscription when the component is being destroyed.\r\n * @memberof CreateGroupComponent\r\n */\r\n ngOnDestroy(): void {\r\n this.destroy$.next(true);\r\n this.destroy$.unsubscribe();\r\n }\r\n}\r\n","<ieeesa-dynamic-form\r\n *ngIf=\"formGroup\"\r\n [leftButtonLabel]=\"leftButtonLabel\"\r\n [rightButtonLabel]=\"rightButtonLabel\"\r\n [isLegendVisible]=\"isLegendVisible\"\r\n [colWidth]=\"colWidth\"\r\n [actionButtonAlign]=\"actionButtonAlign\"\r\n [formGroups]=\"formGroup\"\r\n [isLeftButtonNeeded]=\"isLeftButtonNeeded\"\r\n (formSubmit)=\"onFormSubmit($event)\"\r\n (formLeftButtonClicked)=\"createGroupCancelled()\"\r\n (formGroupsReference)=\"getFormGroupReference($event)\"\r\n (formSlideToggleChange)=\"onFormSlideToggleChange($event)\"\r\n (formChange)=\"onCreateGroupFormChange($event)\"\r\n>\r\n <!-- Reciprocal Credit section — Working Groups in EDIT mode only.\r\n Hidden during create (no home group id yet; create flow pending client team).\r\n Projected via [component] so it renders ABOVE the form's Save/Cancel buttons. -->\r\n <ieeesa-reciprocal-credit-section\r\n component\r\n *ngIf=\"isReciprocalSectionVisible\"\r\n [homeGroupId]=\"reciprocalHomeGroupId\"\r\n [parentCommitteeName]=\"reciprocalParentCommitteeName\"\r\n (enabledChange)=\"onReciprocalEnabledChange($event)\"\r\n (selectionChange)=\"onReciprocalSelectionChange($event)\"\r\n (removedConfigIdsChange)=\"onReciprocalRemovedConfigIdsChange($event)\"\r\n ></ieeesa-reciprocal-credit-section>\r\n</ieeesa-dynamic-form>","/* eslint-disable no-unused-vars */\r\nexport enum GroupAction {\r\n VIEW_ROSTER = 1,\r\n CREATE_SUB_GROUP = 2,\r\n EDIT_GROUP = 3,\r\n DELETE_GROUP = 4,\r\n EXPAND_GROUP_VIEW = 5,\r\n COLLAPSE_GROUP_VIEW = 6,\r\n}\r\n","import {\r\n Component,\r\n ElementRef,\r\n EventEmitter,\r\n Injectable,\r\n Input,\r\n OnInit,\r\n Output,\r\n AfterViewInit,\r\n OnDestroy,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport {\r\n MenuComponent,\r\n Menu,\r\n IconButtonComponent,\r\n IconButton,\r\n TextTruncatedDirective,\r\n BreakpointObserverService\r\n} from '@ieeesa-npm/presentation';\r\nimport * as constants from '../../assets/constants.json';\r\nimport { GroupAction } from '../../models/group-action.model';\r\nimport { CommonModule } from '@angular/common';\r\nimport {\r\n CollectionViewer,\r\n SelectionChange,\r\n DataSource,\r\n} from '@angular/cdk/collections';\r\nimport { FlatTreeControl } from '@angular/cdk/tree';\r\nimport { BehaviorSubject, merge, Observable, Subject } from 'rxjs';\r\nimport { map, takeUntil } from 'rxjs/operators';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatTreeModule, MatTreeNodePadding } from '@angular/material/tree';\r\nimport { GroupInfo } from '../../models/group-info.model';\r\nimport { EditGroupAndParentInfo } from '../../models/edit-group.model';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { GroupsService } from '../../services/groups.service';\r\nimport { GroupFunctionType } from '../../models/group-function-type.model';\r\nimport { PermissionType } from '../../models/permission-type.model';\r\nimport { GroupPermission } from '../../models/group-permissions.model';\r\n/**\r\n * Dynamic Flat node creates a node structure\r\n * @export\r\n * @class GroupNode\r\n */\r\nexport class GroupNode {\r\n constructor(\r\n // eslint-disable-next-line no-unused-vars\r\n public item: GroupInfo,\r\n // eslint-disable-next-line no-unused-vars\r\n public level = 1,\r\n // eslint-disable-next-line no-unused-vars\r\n public expandable = false,\r\n // eslint-disable-next-line no-unused-vars\r\n public isLoading = false // eslint-disable-next-line no-empty-function\r\n ) {}\r\n}\r\n\r\n/**\r\n * Groups stores the parent nodes and child nodes\r\n * @export\r\n * @class Groups\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class Groups {\r\n rootLevelNodes!: GroupInfo[];\r\n /** Initial data from database */\r\n private childGroups!: GroupInfo[];\r\n /**\r\n * Get the Child groups info\r\n * @return {*} {GroupInfo[]}\r\n * @memberof Groups\r\n */\r\n getChildGroupsInfo(): GroupInfo[] {\r\n return this.childGroups;\r\n }\r\n /**\r\n * Sets the Child groups info\r\n * @param {GroupInfo[]} value\r\n * @memberof Groups\r\n */\r\n setChildGroupsInfo(value: GroupInfo[]): void {\r\n this.childGroups = value;\r\n }\r\n /**\r\n * Initialize the groups data and creates the node structure for mat tree\r\n * @param {GroupInfo[]} data\r\n * @return {*} {GroupNode[]}\r\n * @memberof Groups\r\n */\r\n initialData(data: GroupInfo[]): GroupNode[] {\r\n this.rootLevelNodes = data;\r\n return this.rootLevelNodes?.map(\r\n (node) => new GroupNode(node, 0, this.isExpandable(node))\r\n );\r\n }\r\n /**\r\n * Checks the node is expandable or not\r\n * @param {GroupInfo} node\r\n * @return {*} {boolean}\r\n * @memberof Groups\r\n */\r\n isExpandable(node: GroupInfo): boolean {\r\n return (\r\n (!!node?.children && node?.children?.length > 0) || node?.hasChildren\r\n );\r\n }\r\n}\r\n/**\r\n * Dynamic Data Source handles the connection with dynamic data base\r\n * @export\r\n * @class GroupsDataSource\r\n * @implements {DataSource<GroupNode>}\r\n */\r\nexport class GroupsDataSource implements DataSource<GroupNode> {\r\n destroy$: Subject<boolean> = new Subject<boolean>();\r\n dataChange = new BehaviorSubject<GroupNode[]>([]);\r\n /**\r\n * Gets the updated tree control data\r\n * @type {GroupNode[]}\r\n * @memberof GroupsDataSource\r\n */\r\n get data(): GroupNode[] {\r\n return this.dataChange?.value;\r\n }\r\n /**\r\n * Sets the data to tree control and emit the value to intimate the data change\r\n * @memberof GroupsDataSource\r\n */\r\n set data(value: GroupNode[]) {\r\n this.treeControl.dataNodes = value;\r\n this.dataChange.next(value);\r\n }\r\n\r\n constructor(\r\n // eslint-disable-next-line no-unused-vars\r\n private treeControl: FlatTreeControl<GroupNode>,\r\n // eslint-disable-next-line no-unused-vars\r\n private database: Groups // eslint-disable-next-line no-empty-function\r\n ) {}\r\n\r\n /**\r\n * Handles the connection between the data base and mat tree\r\n * @param {CollectionViewer} collectionViewer\r\n * @return {*} {Observable<GroupNode[]>}\r\n * @memberof GroupsDataSource\r\n */\r\n connect(collectionViewer: CollectionViewer): Observable<GroupNode[]> {\r\n this.treeControl?.expansionModel?.changed\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe((change) => {\r\n if (\r\n (change as SelectionChange<GroupNode>).added ||\r\n (change as SelectionChange<GroupNode>).removed\r\n ) {\r\n this.handleTreeControl(change as SelectionChange<GroupNode>);\r\n }\r\n });\r\n return merge(collectionViewer?.viewChange, this.dataChange).pipe(\r\n map(() => this.data)\r\n );\r\n }\r\n /**\r\n * Disconnect the connection with mat tree\r\n * @param {CollectionViewer} collectionViewer\r\n * @memberof GroupsDataSource\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-empty-function, no-empty-function, no-unused-vars, @typescript-eslint/no-unused-vars\r\n disconnect(collectionViewer: CollectionViewer): void {\r\n this.destroy$.next(true);\r\n this.destroy$.unsubscribe();\r\n }\r\n\r\n /**\r\n * Adds/removes the child nodes while expands/collapses the parent node\r\n * @param {SelectionChange<GroupNode>} change\r\n * @memberof GroupsDataSource\r\n */\r\n handleTreeControl(change: SelectionChange<GroupNode>) {\r\n if (change?.added) {\r\n change.added?.forEach((node) => this.toggleNode(node, true));\r\n }\r\n if (change?.removed) {\r\n change.removed\r\n .slice()\r\n .reverse()\r\n .forEach((node) => this.toggleNode(node, false));\r\n }\r\n }\r\n\r\n /**\r\n * Toggle the node, add/removes the node from display\r\n * @param {GroupNode} clickedNode\r\n * @param {boolean} expand\r\n * @return {*}\r\n * @memberof GroupsDataSource\r\n */\r\n toggleNode(clickedNode: GroupNode, expand: boolean) {\r\n const children = this.database?.getChildGroupsInfo();\r\n const index = this.data?.indexOf(clickedNode);\r\n if (!children || index < 0) {\r\n // If no children, or cannot find the node, no op\r\n return;\r\n }\r\n\r\n if (expand) {\r\n clickedNode.item.noOfChildren = children.length;\r\n const nodes = children?.map(\r\n (node) =>\r\n new GroupNode(\r\n node,\r\n clickedNode?.level + 1,\r\n this.database?.isExpandable(node)\r\n )\r\n );\r\n this.data?.splice(index + 1, 0, ...nodes);\r\n } else {\r\n let count = 0;\r\n for (\r\n let i = index + 1;\r\n i < this.data?.length && this.data[i]?.level > clickedNode?.level;\r\n i++, count++ // eslint-disable-next-line no-empty\r\n ) {}\r\n this.data?.splice(index + 1, count);\r\n }\r\n\r\n // Notify the change\r\n this.dataChange?.next(this.data);\r\n }\r\n}\r\n/**\r\n * Displays the groups where parent/child relationships are represented in a tree view/hierarchy.\r\n * @export\r\n * @class TreeViewComponent\r\n * @implements {OnInit}\r\n */\r\n@Component({\r\n selector: 'ieeesa-tree',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n MatTreeModule,\r\n MatIconModule,\r\n MatButtonModule,\r\n MenuComponent,\r\n IconButtonComponent,\r\n MatTooltipModule,\r\n TextTruncatedDirective,\r\n ],\r\n templateUrl: './tree-view.component.html',\r\n styleUrls: ['./tree-view.component.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class TreeViewComponent implements OnInit, AfterViewInit, OnDestroy {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n constants: any = constants;\r\n buttons: Menu[] = this.constants?.viewGroups?.buttons;\r\n treePaddingIndent: number = this.constants?.viewGroups?.treePaddingIndent;\r\n selectedGroup!: GroupNode;\r\n selectedGroupAction!: Menu | IconButton;\r\n treeControl!: FlatTreeControl<GroupNode>;\r\n dataSource!: GroupsDataSource;\r\n destroy$: Subject<boolean> = new Subject<boolean>();\r\n matTreeNodePadding!: MatTreeNodePadding<GroupNode>;\r\n plusCircleIconButton: IconButton = this.buttons[4];\r\n minusCircleIconButton: IconButton = this.buttons[5];\r\n editGroupAndParentGroupInfo!: EditGroupAndParentInfo;\r\n permissionType = PermissionType;\r\n\r\n menuItems: Menu[] = this.buttons?.filter(\r\n (e) =>\r\n e.id !== GroupAction?.EXPAND_GROUP_VIEW &&\r\n e.id !== GroupAction?.COLLAPSE_GROUP_VIEW\r\n );\r\n private parentGroups!: GroupInfo[];\r\n @Input()\r\n set parentGroupsInfo(value: GroupInfo[]) {\r\n this.parentGroups = value;\r\n if (value) this.setGroupDataSource();\r\n }\r\n get parentGroupsInfo(): GroupInfo[] {\r\n return this.parentGroups;\r\n }\r\n private childGroups!: GroupInfo[];\r\n @Input()\r\n set childGroupsInfo(value: GroupInfo[]) {\r\n this.childGroups = value;\r\n this.loadChildGroups();\r\n }\r\n get childGroupsInfo(): GroupInfo[] {\r\n return this.childGroups;\r\n }\r\n private isGroupSearchOrFilter = false;\r\n @Input()\r\n set isGroupSearchOrFilterActive(value: boolean) {\r\n this.isGroupSearchOrFilter = value;\r\n }\r\n get isGroupSearchOrFilterActive(): boolean {\r\n return this.isGroupSearchOrFilter;\r\n }\r\n private deletedGroupId!: string | undefined;\r\n @Input()\r\n set deletedGroupIdInfo(id: string | undefined) {\r\n this.deletedGroupId = id;\r\n this.deleteGroupNode(this.deletedGroupId);\r\n }\r\n get deletedGroupIdInfo(): string | undefined {\r\n return this.deletedGroupId;\r\n }\r\n @Input()\r\n userGroupPermissions!: GroupPermission[];\r\n\r\n @Output() toggleGroupClick = new EventEmitter<GroupInfo>();\r\n @Output() createGroupClick = new EventEmitter<GroupInfo>();\r\n @Output() editGroupClick = new EventEmitter<EditGroupAndParentInfo>();\r\n @Output() deleteGroupClick = new EventEmitter<GroupInfo>();\r\n @Output() viewRosterClick = new EventEmitter<GroupInfo>();\r\n isMobileView = false;\r\n groupFunctionType = GroupFunctionType;\r\n // eslint-disable-next-line no-unused-vars\r\n constructor(\r\n // eslint-disable-next-line no-unused-vars\r\n public database: Groups,\r\n // eslint-disable-next-line no-unused-vars\r\n public elementRef: ElementRef,\r\n // eslint-disable-next-line no-unused-vars\r\n public groupsService: GroupsService,\r\n // eslint-disable-next-line no-unused-vars\r\n private breakpointObserverService: BreakpointObserverService\r\n ) {\r\n this.breakpointObserverService\r\n .getBreakpoint()\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe((result: { matches: boolean }) => {\r\n this.isMobileView = result?.matches;\r\n });\r\n }\r\n /**\r\n * Initializes the tree view component\r\n * @memberof TreeViewComponent\r\n */\r\n ngOnInit(): void {\r\n this.setGroupDataSource();\r\n }\r\n /**\r\n * Assign ARIA role for all mat tree nodes as \"row\"\r\n * @memberof TreeViewComponent\r\n */\r\n ngAfterViewInit(): void {\r\n this.dataSource?.dataChange\r\n ?.pipe(takeUntil(this.destroy$))\r\n .subscribe(() => {\r\n const treeItemNodes =\r\n this.elementRef?.nativeElement?.querySelectorAll('[role=treeitem]');\r\n treeItemNodes?.forEach((node: HTMLElement) => (node.role = 'row'));\r\n });\r\n }\r\n /**\r\n * Gets the level of the node\r\n * @param {GroupNode} node\r\n * @memberof TreeViewComponent\r\n */\r\n getLevel = (node: GroupNode) => node?.level;\r\n\r\n /**\r\n * Checks the node is expandable or not\r\n * @param {GroupNode} node\r\n * @memberof TreeViewComponent\r\n */\r\n isExpandable = (node: GroupNode) => node?.expandable;\r\n\r\n /**\r\n * Returns true if passed node has children otherwise false\r\n * @param {number} index\r\n * @param {GroupNode} node\r\n * @return {boolean}\r\n * @memberof TreeViewComponent\r\n */\r\n hasChildGroups = (index: number, _nodeData: GroupNode) =>\r\n _nodeData.expandable;\r\n /**\r\n * Emits the group info when the toggle group is clicked or toggles the group view\r\n * @param {GroupNode} group\r\n * @memberof TreeViewComponent\r\n */\r\n viewChildGroups(node: GroupNode) {\r\n if (!node?.item?.hasChildren) {\r\n return;\r\n }\r\n if (this.treeControl?.isExpanded(node)) {\r\n this.treeControl?.toggle(node);\r\n } else {\r\n this.groupsService.setGroupFunctionType(GroupFunctionType.TOGGLE);\r\n this.toggleGroupClick.emit(node?.item);\r\n this.selectedGroup = node;\r\n }\r\n }\r\n /**\r\n * Sets the box shadow based on the group type legend color\r\n * @return {*}\r\n * @memberof TreeViewComponent\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n getBoxShadow(): any {\r\n return {\r\n boxShadow: '0px 1px 0px 0px #c9cbd0 inset',\r\n };\r\n }\r\n /**\r\n * Sets the dataSource with parent groups data\r\n * @memberof TreeViewComponent\r\n */\r\n setGroupDataSource(): void {\r\n if (\r\n this.dataSource &&\r\n this.groupsService.getGroupFunctionType() === GroupFunctionType.CREATE\r\n ) {\r\n this.parentGroupsInfo?.forEach((parentGroupNode) => {\r\n if (\r\n this.dataSource?.data?.findIndex(\r\n (node) => node?.item?.groupId === parentGroupNode?.groupId\r\n ) === -1\r\n ) {\r\n const newGroupNode = new GroupNode(\r\n parentGroupNode,\r\n 0,\r\n this.database.isExpandable(parentGroupNode)\r\n );\r\n const groupNodesReference = this.dataSource?.data;\r\n groupNodesReference?.push(newGroupNode);\r\n this.dataSource.data = groupNodesReference;\r\n this.sortParentGroupsAlphabetically();\r\n }\r\n });\r\n } else if (\r\n this.groupsService.getGroupFunctionType() === GroupFunctionType.EDIT\r\n ) {\r\n this.editGroup(this.parentGroupsInfo);\r\n this.sortParentGroupsAlphabetically();\r\n } else {\r\n this.treeControl = new FlatTreeControl<GroupNode>(\r\n this.getLevel,\r\n this.isExpandable\r\n );\r\n this.dataSource = new GroupsDataSource(this.treeControl, this.database);\r\n this.dataSource.data = this.database?.initialData(this.parentGroupsInfo);\r\n }\r\n }\r\n /**\r\n * Sets the updated node information\r\n * @param {GroupInfo[]} groupsInfo\r\n * @memberof TreeViewComponent\r\n */\r\n editGroup(groupsInfo: GroupInfo[]) {\r\n const groupNodeReference = this.dataSource?.data;\r\n const editedNode = groupsInfo?.find(\r\n (node) =>\r\n node?.groupId === this.editGroupAndParentGroupInfo?.groupInfo?.groupId\r\n );\r\n groupNodeReference?.forEach((node) => {\r\n if (\r\n node?.item?.groupId ===\r\n this.editGroupAndParentGroupInfo?.groupInfo?.groupId\r\n ) {\r\n const noOfChildrenReference = node.item.noOfChildren;\r\n node.item = editedNode as GroupInfo;\r\n node.item.noOfChildren = noOfChildrenReference;\r\n node.expandable = this.database.isExpandable(node?.item);\r\n if (node.item.hasChildren && this.treeControl.isExpanded(node)) {\r\n this.treeControl.toggle(node);\r\n }\r\n }\r\n });\r\n this.dataSource.data = groupNodeReference;\r\n }\r\n /**\r\n * Loads the child groups and updates the tree view.\r\n * @memberof TreeViewComponent\r\n */\r\n loadChildGroups() {\r\n this.database?.setChildGroupsInfo(this.childGroupsInfo);\r\n const groupNodesReference = this.dataSource?.data;\r\n if (\r\n this.groupsService.getGroupFunctionType() === GroupFunctionType.CREATE\r\n ) {\r\n if (!this.selectedGroup?.item?.hasChildren) {\r\n this.selectedGroup.item.hasChildren = true;\r\n const groupParentNode = new GroupNode(\r\n this.selectedGroup.item,\r\n this.selectedGroup.level,\r\n true\r\n );\r\n groupNodesReference.splice(\r\n groupNodesReference.indexOf(this.selectedGroup),\r\n 1,\r\n groupParentNode\r\n );\r\n this.treeControl.expand(groupParentNode);\r\n }\r\n if (this.treeControl.isExpanded(this.selectedGroup)) {\r\n const children = this.database.getChildGroupsInfo();\r\n children?.forEach((groupNode) => {\r\n if (\r\n this.dataSource?.data?.findIndex(\r\n (node) => node?.item?.groupId === groupNode?.groupId\r\n ) === -1\r\n ) {\r\n const newGroupNode = new GroupNode(\r\n groupNode,\r\n this.selectedGroup?.level + 1,\r\n this.database?.isExpandable(groupNode)\r\n );\r\n const groupNodesReference = this.dataSource?.data;\r\n groupNodesReference.forEach((node) => {\r\n if (node.item.groupId === this.selectedGroup.item.groupId) {\r\n node.item.noOfChildren = children.length;\r\n }\r\n });\r\n groupNodesReference.splice(\r\n groupNodesReference.indexOf(this.selectedGroup) + 1,\r\n 0,\r\n newGroupNode\r\n );\r\n this.dataSource.data = groupNodesReference;\r\n }\r\n });\r\n }\r\n const selectedGroupIndex = this.dataSource.data.findIndex(\r\n (node) => node.item.groupId === this.selectedGroup?.item.groupId\r\n );\r\n this.sortChildGroupsAlphabetically(\r\n selectedGroupIndex + 1,\r\n this.getNextGroup(selectedGroupIndex, this.dataSource.data)\r\n );\r\n } else if (\r\n this.groupsService.getGroupFunctionType() === GroupFunctionType.EDIT\r\n ) {\r\n this.editGroup(this.childGroupsInfo);\r\n const selectedParentGroupIndex = this.dataSource.data.findIndex(\r\n (node) => node.item.groupId === this.selectedGroup?.item.groupParentId\r\n );\r\n this.sortChildGroupsAlphabetically(\r\n selectedParentGroupIndex + 1,\r\n this.getNextGroup(selectedParentGroupIndex, this.dataSource.data)\r\n );\r\n } else if (\r\n this.groupsService.getGroupFunctionType() === GroupFunctionType.TOGGLE\r\n ) {\r\n this.treeControl?.toggle(this.selectedGroup);\r\n }\r\n }\r\n /**\r\n * Deletes the selected group and updates the tree view.\r\n * @param {string} deletedGroupId\r\n * @memberof TreeViewComponent\r\n */\r\n deleteGroupNode(deletedGroupId: string | undefined): void {\r\n if (this.treeControl && deletedGroupId) {\r\n const deletedGroupIndex = this.dataSource.data.findIndex(\r\n (node) => node.item.groupId === deletedGroupId\r\n );\r\n const deletedGroup = this.dataSource.data.at(deletedGroupIndex);\r\n const dataSourceReference = this.dataSource.data;\r\n if (deletedGroupIndex !== -1) {\r\n if (deletedGroup?.item.groupParentId !== null) {\r\n const deletedParentGroupIndex = this.dataSource.data.findIndex(\r\n (node) => node.item.groupId === deletedGroup?.item.groupParentId\r\n );\r\n if (deletedParentGroupIndex !== -1) {\r\n const deletedParentGroup = this.dataSource.data.at(\r\n deletedParentGroupIndex\r\n );\r\n if (deletedParentGroup && deletedParentGroup.item.noOfChildren) {\r\n deletedParentGroup.item.noOfChildren =\r\n deletedParentGroup.item.noOfChildren - 1;\r\n if (deletedParentGroup.item.noOfChildren === 0) {\r\n deletedParentGroup.item.hasChildren = false;\r\n const newNode = new GroupNode(\r\n deletedParentGroup.item,\r\n deletedParentGroup.level,\r\n false\r\n );\r\n dataSourceReference.splice(deletedGroupIndex - 1, 2, newNode);\r\n } else {\r\n dataSourceReference.splice(deletedGroupIndex, 1);\r\n }\r\n }\r\n } else {\r\n dataSourceReference.splice(deletedGroupIndex, 1);\r\n }\r\n } else {\r\n dataSourceReference.splice(deletedGroupIndex, 1);\r\n }\r\n }\r\n this.dataSource.data = dataSourceReference;\r\n this.deletedGroupId = undefined;\r\n }\r\n }\r\n /**\r\n * Returns the index of next group at the same level.\r\n * @param {number} selectedGroupIndex\r\n * @param {GroupNode[]} dataSource\r\n * @return {*} {number}\r\n * @memberof TreeViewComponent\r\n */\r\n getNextGroup(selectedGroupIndex: number, dataSource: GroupNode[]): number {\r\n const selectedGroupAcronym =\r\n dataSource[selectedGroupIndex].item.groupAcronym;\r\n let index = 0;\r\n for (index = selectedGroupIndex + 1; index < dataSource.length; index++) {\r\n if (dataSource[index].item.groupAcronym?.includes(selectedGroupAcronym)) {\r\n if (dataSource[selectedGroupIndex].level === 0) {\r\n if (\r\n dataSource[selectedGroupIndex].level === dataSource[index].level\r\n ) {\r\n break;\r\n }\r\n }\r\n } else break;\r\n }\r\n return index;\r\n }\r\n /**\r\n * Sort the groups alphabetically from given start index to end index.\r\n * @param {number} startIndex\r\n * @param {number} endIndex\r\n * @memberof TreeViewComponent\r\n */\r\n sortChildGroupsAlphabetically(startIndex: number, endIndex: number): void {\r\n const dataSource = this.dataSource.data;\r\n dataSource.splice(\r\n startIndex,\r\n endIndex - startIndex,\r\n ...this.groupsSorting(this.dataSource.data.slice(startIndex, endIndex))\r\n );\r\n this.dataSource.data = dataSource;\r\n }\r\n /**\r\n * Sort the root level parent groups alphabetically.\r\n * @memberof TreeViewComponent\r\n */\r\n sortParentGroupsAlphabetically(): void {\r\n let dataSource = this.dataSource.data;\r\n for (\r\n let groupA = 0;\r\n groupA < dataSource.length;\r\n groupA = this.getNextGroup(groupA, dataSource)\r\n ) {\r\n let lowestGroup = groupA;\r\n for (\r\n let groupB = this.getNextGroup(groupA, dataSource);\r\n groupB < dataSource.length;\r\n groupB = this.getNextGroup(groupB, dataSource)\r\n ) {\r\n lowestGroup =\r\n this.groupsSorting([\r\n dataSource[groupB],\r\n dataSource[lowestGroup],\r\n ])[0] === dataSource[groupB]\r\n ? groupB\r\n : lowestGroup;\r\n }\r\n if (lowestGroup !== groupA) {\r\n const leftGroup = dataSource.slice(\r\n groupA,\r\n this.getNextGroup(groupA, dataSource)\r\n );\r\n const rightGroup = dataSource.slice(\r\n lowestGroup,\r\n this.getNextGroup(lowestGroup, dataSource)\r\n );\r\n const dataSourceReference = dataSource.slice(0, groupA);\r\n dataSourceReference.push(...rightGroup);\r\n dataSourceReference.push(\r\n ...dataSource.slice(\r\n this.getNextGroup(groupA, dataSource),\r\n lowestGroup\r\n )\r\n );\r\n dataSourceReference.push(...leftGroup);\r\n dataSourceReference.push(\r\n ...dataSource.slice(\r\n this.getNextGroup(lowestGroup, dataSource),\r\n dataSource.length\r\n )\r\n );\r\n dataSource = dataSourceReference;\r\n }\r\n }\r\n this.dataSource.data = dataSource;\r\n }\r\n /**\r\n * Utility method to sort groups by group acronym in ascending order.\r\n * @param {GroupNode[]} groups\r\n * @return {*} {GroupNode[]}\r\n * @memberof TreeViewComponent\r\n */\r\n groupsSorting(groups: GroupNode[]): GroupNode[] {\r\n return groups.sort((groupA: GroupNode, groupB: GroupNode) => {\r\n const lowerGroupA = groupA.item.groupAcronym.toLowerCase();\r\n const lowerGroupB = groupB.item.groupAcronym.toLowerCase();\r\n if (lowerGroupA < lowerGroupB) return -1;\r\n else if (lowerGroupA > lowerGroupB) return 1;\r\n else if (lowerGroupA === lowerGroupB) {\r\n let index = 0;\r\n while (index < groupA?.item?.groupAcronym?.length) {\r\n if (groupA.item.groupAcronym[index] < groupB.item.groupAcronym[index])\r\n return 1;\r\n else if (\r\n groupA.item.groupAcronym[index] > groupB.item.groupAcronym[index]\r\n )\r\n return -1;\r\n index++;\r\n }\r\n }\r\n return 0;\r\n });\r\n }\r\n /**\r\n * Sets the selected menu group action\r\n * @param {Menu} menu\r\n * @memberof TreeViewComponent\r\n */\r\n onGroupActionsClick(menu: Menu | IconButton): void {\r\n this.selectedGroupAction = menu;\r\n }\r\n /**\r\n * Changes the expand/collapse icon based on the toggle\r\n * @param {GroupNode} group\r\n * @return {*} {*}\r\n * @memberof TreeViewComponent\r\n */\r\n getToggleButtonInfo(group: GroupNode): IconButton {\r\n if (this.treeControl?.isExpanded(group)) return this.minusCircleIconButton;\r\n return this.plusCircleIconButton;\r\n }\r\n /**\r\n * Handles the emitted group actions event\r\n * @param {GroupInfo} group\r\n * @memberof TreeViewComponent\r\n */\r\n handleGroupActions(group: GroupNode): void {\r\n if (this.selectedGroupAction?.id === GroupAction.VIEW_ROSTER) {\r\n this.viewRosterClick.emit(group?.item);\r\n } else if (this.selectedGroupAction?.id === GroupAction.CREATE_SUB_GROUP) {\r\n this.selectedGroup = group;\r\n this.createGroupClick.emit(group?.item);\r\n } else if (this.selectedGroupAction?.id === GroupAction.EDIT_GROUP) {\r\n this.selectedGroup = group;\r\n const editGroupParentInfo = this.dataSource?.data?.filter(\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n (item: any) => item?.item?.groupId === group?.item?.groupParentId\r\n )[0]?.item;\r\n this.editGroupAndParentGroupInfo = {\r\n groupInfo: group?.item,\r\n parentGroupInfo: editGroupParentInfo,\r\n };\r\n this.editGroupClick.emit(this.editGroupAndParentGroupInfo);\r\n } else if (this.selectedGroupAction?.id === GroupAction.DELETE_GROUP) {\r\n this.deleteGroupClick.emit(group?.item);\r\n }\r\n }\r\n /**\r\n * Returns the filtered menu items based on groups hasChildren.\r\n * @param {GroupNode} group\r\n * @return {Menu[]}\r\n * @memberof TreeViewComponent\r\n */\r\n getFilteredGroupActions(group: GroupNode): Menu[] {\r\n const filteredMenu: Menu[] = [];\r\n const isAdminGroupType = group?.item?.groupTypeInfo?.businessRule?.isAdmin;\r\n const groupPermissions = group?.item?.permissions;\r\n this.menuItems?.forEach((e) => {\r\n e.isToolTipNeeded = false;\r\n if (\r\n (e?.id === GroupAction.VIEW_ROSTER &&\r\n ((isAdminGroupType &&\r\n this.groupsService.validateAccess(\r\n this.permissionType.MANAGE_SYSTEM_USERS,\r\n groupPermissions\r\n )) ||\r\n (!isAdminGroupType &&\r\n (this.groupsService.validateAccess(\r\n this.permissionType.VIEW_GROUP_OFFICERS,\r\n groupPermissions\r\n ) ||\r\n this.groupsService.validateAccess(\r\n this.permissionType.MANAGE_GROUP_OFFICERS,\r\n groupPermissions\r\n ) ||\r\n this.groupsService.validateAccess(\r\n this.permissionType.VIEW_GROUP_MEMBERS,\r\n groupPermissions\r\n ) ||\r\n this.groupsService.validateAccess(\r\n this.permissionType.VIEW_ALL_ROSTERS\r\n ) ||\r\n this.groupsService.validateAccess(\r\n this.permissionType.MANAGE_GROUP_MEMBERS,\r\n groupPermissions\r\n ))))) ||\r\n (e?.id === GroupAction.EDIT_GROUP &&\r\n !isAdminGroupType &&\r\n (this.groupsService.validateAccess(\r\n this.permissionType.EDIT_GROUP,\r\n groupPermissions\r\n ) ||\r\n this.groupsService.validateAccess(\r\n this.permissionType.MANAGE_ALL_GROUPS\r\n ))) ||\r\n (e?.id === GroupAction.DELETE_GROUP &&\r\n !isAdminGroupType &&\r\n (this.groupsService.validateAccess(\r\n this.permissionType.DELETE_GROUP,\r\n groupPermissions\r\n ) ||\r\n this.groupsService.validateAccess(\r\n this.permissionType.MANAGE_ALL_GROUPS\r\n )) &&\r\n !group?.item?.hasChildren) ||\r\n (e?.id === GroupAction.CREATE_SUB_GROUP &&\r\n group?.item?.groupTypeInfo?.businessRule?.allowSubGroup &&\r\n (this.groupsService.validateAccess(\r\n this.permissionType.CREATE_SUBGROUP,\r\n groupPermissions\r\n ) ||\r\n this.groupsService.validateAccess(\r\n this.permissionType.MANAGE_ALL_GROUPS\r\n )) &&\r\n !isAdminGroupType)\r\n ) {\r\n filteredMenu.push(e);\r\n }\r\n });\r\n return filteredMenu;\r\n }\r\n /**\r\n * Takes the index and the icon button as arguments and needs to return the unique identifier for this icon button.\r\n * @param {number} index\r\n * @param {IconButton} iconButton\r\n * @return {number}\r\n * @memberof TreeViewComponent\r\n */\r\n trackByFn(index: number, iconButton: IconButton): number {\r\n return iconButton.id;\r\n }\r\n /**\r\n * NgOnDestroy performs necessary cleanup tasks, such as unsubscribing from subscription when the component is being destroyed.\r\n * @memberof GroupsComponent\r\n */\r\n ngOnDestroy(): void {\r\n this.destroy$.next(true);\r\n this.destroy$.unsubscribe();\r\n }\r\n}\r\n","<div class=\"ieeesa-tree\">\r\n <mat-tree\r\n [dataSource]=\"dataSource\"\r\n [treeControl]=\"treeControl\"\r\n class=\"ieeesa-tree__root\"\r\n #rootSelector\r\n role=\"treegrid\"\r\n >\r\n <mat-tree-node\r\n *matTreeNodeDef=\"let node\"\r\n matTreeNodePadding\r\n [matTreeNodePaddingIndent]=\"treePaddingIndent\"\r\n class=\"ieeesa-body-md-16\"\r\n >\r\n <div\r\n class=\"ieeesa-tree__node w-100 d-flex\"\r\n [ngStyle]=\"getBoxShadow()\"\r\n [ngClass]=\"\r\n node?.item?.groupParentId &&\r\n groupsService.getGroupFunctionType() !== groupFunctionType.FILTER &&\r\n groupsService.getGroupFunctionType() !== groupFunctionType.SEARCH\r\n ? 'ieeesa-tree__root-node-white-bg'\r\n : 'ieeesa-tree__root-node'\r\n \"\r\n >\r\n <div\r\n [ngClass]=\"\r\n !isGroupSearchOrFilterActive ? 'ieeesa-tree__collapse-icon' : ''\r\n \"\r\n role=\"gridcell\"\r\n ></div>\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n ieeesaGroupNodeOutlet;\r\n context: { $implicit: node }\r\n \"\r\n ></ng-container>\r\n </div>\r\n </mat-tree-node>\r\n <mat-tree-node\r\n *matTreeNodeDef=\"let node; when: hasChildGroups\"\r\n matTreeNodePadding\r\n [matTreeNodePaddingIndent]=\"treePaddingIndent\"\r\n class=\"ieeesa-body-md-16 ieeesa-tree__parent-node-wrapper\"\r\n >\r\n <div\r\n [ngClass]=\"[\r\n treeControl.isExpanded(node) ? 'ieeesa-tree__expanded' : '',\r\n node?.item?.groupParentId &&\r\n groupsService.getGroupFunctionType() !== groupFunctionType.FILTER &&\r\n groupsService.getGroupFunctionType() !== groupFunctionType.SEARCH\r\n ? 'ieeesa-tree__root-node-white-bg'\r\n : 'ieeesa-tree__root-node'\r\n ]\"\r\n class=\"ieeesa-tree__node w-100 d-flex\"\r\n [ngStyle]=\"getBoxShadow()\"\r\n >\r\n <div role=\"gridcell\">\r\n <ieeesa-icon-button\r\n *ngIf=\"!isGroupSearchOrFilterActive\"\r\n (iconButtonClick)=\"viewChildGroups(node)\"\r\n [iconButton]=\"getToggleButtonInfo(node)\"\r\n ></ieeesa-icon-button>\r\n </div>\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n ieeesaGroupNodeOutlet;\r\n context: { $implicit: node }\r\n \"\r\n ></ng-container>\r\n </div>\r\n </mat-tree-node>\r\n <ng-template #ieeesaGroupNodeOutlet let-node>\r\n <ng-container\r\n *ngTemplateOutlet=\"ieeesaGroupInfoOutlet; context: { $implicit: node }\"\r\n ></ng-container>\r\n <div\r\n class=\"d-flex d-none gap-3 d-sm-flex d-md-flex d-lg-flex ieeesa-tree__group-actions\"\r\n role=\"gridcell\"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n ieeesaGroupActionsOutlet;\r\n context: { $implicit: node }\r\n \"\r\n >\r\n </ng-container>\r\n </div>\r\n <ieeesa-menu\r\n [button]=\"constants?.viewGroups?.groupActionsMenu\"\r\n [menuItems]=\"getFilteredGroupActions(node)\"\r\n (menuItemClick)=\"onGroupActionsClick($event); handleGroupActions(node)\"\r\n class=\"d-lg-none d-md-none d-sm-none\"\r\n role=\"gridcell\"\r\n ></ieeesa-menu>\r\n </ng-template>\r\n <ng-template #ieeesaGroupInfoOutlet let-node>\r\n <div class=\"ieeesa-tree__group-info-wrapper\">\r\n <div class=\"ieeesa-tree__group-info d-flex align-items-baseline\">\r\n <p\r\n class=\"ieeesa-tree__node-group-name ieeesa-title-md-18\"\r\n [matTooltip]=\"node?.item?.groupName\"\r\n ieeesaTextTruncated\r\n role=\"gridcell\"\r\n >{{ node?.item?.groupName }}</p>\r\n <p\r\n class=\"ieeesa-tree__node-group-acronym ieeesa-title-sm-16\"\r\n [matTooltip]=\"node?.item?.groupAcronym\"\r\n ieeesaTextTruncated\r\n role=\"gridcell\"\r\n >{{ node?.item?.groupAcronym }}</p>\r\n </div>\r\n <div class=\"ieeesa-tree__node-group-desc\">\r\n {{ node?.item?.groupTypeInfo?.name }}\r\n </div>\r\n </div>\r\n </ng-template>\r\n <ng-template #ieeesaGroupActionsOutlet let-node>\r\n <ieeesa-icon-button\r\n *ngFor=\"let item of getFilteredGroupActions(node); trackBy: trackByFn\"\r\n [iconButton]=\"item\"\r\n (iconButtonClick)=\"\r\n onGroupActionsClick($event); handleGroupActions(node)\r\n \"\r\n >\r\n </ieeesa-icon-button>\r\n </ng-template>\r\n </mat-tree>\r\n</div>\r\n","import {\r\n COMMA,\r\n DOWN_ARROW,\r\n ENTER,\r\n ESCAPE,\r\n UP_ARROW,\r\n} from '@angular/cdk/keycodes';\r\nimport { CommonModule } from '@angular/common';\r\nimport {\r\n Component,\r\n ElementRef,\r\n EventEmitter,\r\n Input,\r\n OnDestroy,\r\n OnInit,\r\n Output,\r\n ViewChild,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { Subject, Subscription, timer } from 'rxjs';\r\nimport { SelectOption } from '@ieeesa-npm/presentation';\r\nimport * as screenTexts from '../../assets/constants.json';\r\nimport { GroupsValidationPatterns } from '../../assets/form-validations';\r\n\r\n/**\r\n * A self-contained multi-select organization field used inside the Add/Edit\r\n * roster popups.\r\n *\r\n * It intentionally does NOT reuse the shared MultiSelectAutocompleteComponent\r\n * (which is built on mat-autocomplete). Material's autocomplete closes its panel\r\n * and overwrites the input on every option pick, which made multi-selection\r\n * feel single-select and cleared the user's typed text. This component uses a\r\n * fully-owned custom dropdown (<div> + checkboxes) so:\r\n * - the panel stays open while the user ticks several results,\r\n * - the typed search text is never overwritten by a pick,\r\n * - pressing Enter adds the typed value as a free-text chip,\r\n * - clicking outside clears any leftover typed text (old behavior),\r\n * - selected values render as removable chips (old behavior).\r\n *\r\n * The parent supplies search results via {@link options} and reacts to\r\n * {@link search} (debounced typed term) and {@link selectionChange}.\r\n * @export\r\n * @class OrgMultiSelectComponent\r\n */\r\n@Component({\r\n selector: 'ieeesa-org-multi-select',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n MatButtonModule,\r\n MatCheckboxModule,\r\n MatIconModule,\r\n MatTooltipModule,\r\n ],\r\n templateUrl: './org-multi-select.component.html',\r\n styleUrls: ['./org-multi-select.component.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class OrgMultiSelectComponent implements OnInit, OnDestroy {\r\n /** Field label (e.g. \"Representing Organization *\"). */\r\n @Input() label = '';\r\n\r\n /** Placeholder for the input. */\r\n @Input() placeholder = '';\r\n\r\n /** Support/help text shown below the field. */\r\n @Input() supportMessage = '';\r\n\r\n /** aria-label for the input. */\r\n @Input() ariaLabel = '';\r\n\r\n /** Search results supplied by the parent (repopulated on each search). */\r\n @Input() set options(value: SelectOption[]) {\r\n this._options = value ?? [];\r\n // Reset keyboard highlight whenever the result set changes.\r\n this.activeOptionIndex = -1;\r\n // Open the dropdown as soon as fresh results arrive while the user is still\r\n // typing/searching (has non-empty text). Closes when results are emptied.\r\n this.isDropdownOpen =\r\n this._options.length > 0 && this.searchText.trim().length > 0;\r\n }\r\n get options(): SelectOption[] {\r\n return this._options;\r\n }\r\n private _options: SelectOption[] = [];\r\n\r\n /** Pre-selected options (edit prefill). Rendered as chips. */\r\n @Input() set selectedOptions(value: SelectOption[]) {\r\n this._selectedOptions = value ?? [];\r\n }\r\n get selectedOptions(): SelectOption[] {\r\n return this._selectedOptions;\r\n }\r\n private _selectedOptions: SelectOption[] = [];\r\n\r\n /** Marks the field required (drives the required message + error border). */\r\n @Input() required = true;\r\n\r\n /**\r\n * Icon URLs (same sprite refs the shared multi-select field used). Defaulted\r\n * so the popups don't need to pass them; overridable via input if needed.\r\n */\r\n @Input() removeIconURL = 'assets/images/sprites/sprites.svg#icon-trailing';\r\n @Input() clearAllIconURL =\r\n 'assets/images/sprites/sprites.svg#icon-clear-all';\r\n\r\n /** Emits the trimmed typed term (debounced) so the parent can call the API. */\r\n @Output() search = new EventEmitter<string>();\r\n\r\n /** Emits the current selection array whenever it changes. */\r\n @Output() selectionChange = new EventEmitter<SelectOption[]>();\r\n\r\n /** Emitted when the field is blurred (parent can re-evaluate validation). */\r\n @Output() fieldBlur = new EventEmitter<void>();\r\n\r\n /**\r\n * Emits true when the input holds an uncommitted free-text token that fails\r\n * validation (too short / too long / invalid pattern), and false when the\r\n * input is empty or the token is valid. The parent uses this to keep the Save\r\n * button disabled while an invalid token remains — otherwise a previously\r\n * added valid chip would keep the parent control valid and let the form submit\r\n * with an invalid token still in the input.\r\n */\r\n @Output() invalidFreeText = new EventEmitter<boolean>();\r\n\r\n /** Tracks the last emitted invalid-token state to avoid duplicate emits. */\r\n private hasInvalidFreeText = false;\r\n\r\n @ViewChild('searchInput') searchInput!: ElementRef<HTMLInputElement>;\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n constants: any = screenTexts;\r\n addUserRosterTexts = this.constants?.addUserRoster;\r\n\r\n /** Whether the results dropdown is open. */\r\n isDropdownOpen = false;\r\n\r\n /** The current typed search text. */\r\n searchText = '';\r\n\r\n /** Inline validation message for the free-text (Enter) path. */\r\n errorMessage = '';\r\n\r\n /** Whether the field has been touched (to show required error after blur). */\r\n isTouched = false;\r\n\r\n /**\r\n * Index of the keyboard-highlighted result row (-1 = none). Enables arrow-key\r\n * navigation and Enter-to-toggle for keyboard users, mirroring the mat-option\r\n * behavior this custom dropdown replaces.\r\n */\r\n activeOptionIndex = -1;\r\n\r\n /** Stable id prefix for option rows (used for aria-activedescendant). */\r\n readonly optionIdPrefix = 'ieeesa-org-option-';\r\n\r\n private destroy$ = new Subject<boolean>();\r\n private searchDebounce?: Subscription;\r\n private blurTimer?: Subscription;\r\n private readonly debounceMs = 300;\r\n private readonly minCharToSearch = 3;\r\n\r\n private separatorKeys = [ENTER, COMMA];\r\n\r\n ngOnInit(): void {\r\n // Fallback labels from the shared constants if inputs are not provided.\r\n this.placeholder = this.placeholder ?? '';\r\n }\r\n\r\n /**\r\n * Handles typing in the search input: tracks the text, opens/closes the\r\n * dropdown and debounces the search emit to the parent.\r\n * @param {Event} event -input event.\r\n * @memberof OrgMultiSelectComponent\r\n */\r\n onInput(event: Event): void {\r\n const value = (event.target as HTMLInputElement).value;\r\n this.searchText = value;\r\n this.errorMessage = '';\r\n // Any non-empty, uncommitted text is a pending token — flag the field\r\n // invalid so the parent disables Save until it is committed (Enter) or\r\n // cleared. Cleared text resets the flag.\r\n this.emitInvalidState(!!value.trim());\r\n const trimmed = value.trim();\r\n this.searchDebounce?.unsubscribe();\r\n if (trimmed.length < this.minCharToSearch) {\r\n this.options = [];\r\n this.isDropdownOpen = false;\r\n return;\r\n }\r\n this.searchDebounce = timer(this.debounceMs).subscribe(() => {\r\n this.search.emit(trimmed);\r\n });\r\n }\r\n\r\n /**\r\n * Emits the invalid-free-text state to the parent (deduped). True means an\r\n * uncommitted token is present and Save should stay disabled.\r\n * @param {boolean} isInvalid -whether an uncommitted token is present.\r\n * @memberof OrgMultiSelectComponent\r\n */\r\n private emitInvalidState(isInvalid: boolean): void {\r\n if (this.hasInvalidFreeText !== isInvalid) {\r\n this.hasInvalidFreeText = isInvalid;\r\n this.invalidFreeText.emit(isInvalid);\r\n }\r\n }\r\n\r\n /**\r\n * Opens the dropdown on focus only when there are results AND the input still\r\n * holds a valid search term (at or above minCharToSearch). This prevents\r\n * re-opening stale results — e.g. a late API response that populated options\r\n * after the input was cleared — when the user simply refocuses the field.\r\n * @memberof OrgMultiSelectComponent\r\n */\r\n onFocus(): void {\r\n if (\r\n this.options?.length &&\r\n this.searchText.trim().length >= this.minCharToSearch\r\n ) {\r\n this.isDropdownOpen = true;\r\n }\r\n }\r\n\r\n /**\r\n * Called by the parent (via a setter re-assign) or internally after new\r\n * options arrive so the dropdown opens to show them.\r\n * @memberof OrgMultiSelectComponent\r\n */\r\n showResults(): void {\r\n this.isDropdownOpen = !!this.options?.length;\r\n }\r\n\r\n /**\r\n * Handles keydown for the Enter/comma \"add typed value\" path.\r\n * @param {KeyboardEvent} event -keyboard event.\r\n * @memberof OrgMultiSelectComponent\r\n */\r\n onKeydown(event: KeyboardEvent): void {\r\n // Arrow keys move the highlight through the open results list (opening it\r\n // first if there are results). This makes the custom dropdown operable by\r\n // keyboard, matching the mat-option list it replaces.\r\n if (event.keyCode === DOWN_ARROW || event.keyCode === UP_ARROW) {\r\n if (!this.options?.length) {\r\n return;\r\n }\r\n event.preventDefault();\r\n this.isDropdownOpen = true;\r\n this.moveActiveOption(event.keyCode === DOWN_ARROW ? 1 : -1);\r\n return;\r\n }\r\n\r\n // Escape closes the results without committing anything.\r\n if (event.keyCode === ESCAPE) {\r\n if (this.isDropdownOpen) {\r\n event.preventDefault();\r\n this.isDropdownOpen = false;\r\n this.activeOptionIndex = -1;\r\n }\r\n return;\r\n }\r\n\r\n if (!this.separatorKeys.includes(event.keyCode)) {\r\n return;\r\n }\r\n event.preventDefault();\r\n // Enter/comma: if a result row is highlighted, toggle that option (keyboard\r\n // parity with clicking it). Otherwise fall back to adding the typed text as\r\n // a free-text chip.\r\n if (\r\n this.isDropdownOpen &&\r\n this.activeOptionIndex >= 0 &&\r\n this.activeOptionIndex < this.options.length\r\n ) {\r\n this.toggleOption(this.options[this.activeOptionIndex]);\r\n return;\r\n }\r\n this.addTypedValue();\r\n }\r\n\r\n /**\r\n * Moves the keyboard highlight up/down the results list, wrapping at the ends.\r\n * @param {number} delta -+1 to move down, -1 to move up.\r\n * @memberof OrgMultiSelectComponent\r\n */\r\n private moveActiveOption(delta: number): void {\r\n const count = this.options.length;\r\n if (!count) {\r\n return;\r\n }\r\n const next = this.activeOptionIndex + delta;\r\n // Wrap around so the highlight cycles through the list.\r\n this.activeOptionIndex = (next + count) % count;\r\n }\r\n\r\n /**\r\n * Whether the given result index is the keyboard-highlighted row.\r\n * @param {number} index -the option's index.\r\n * @return {boolean}\r\n * @memberof OrgMultiSelectComponent\r\n */\r\n isActiveOption(index: number): boolean {\r\n return index === this.activeOptionIndex;\r\n }\r\n\r\n /**\r\n * Adds the typed free-text value as a selection (chip) after validating its\r\n * length and pattern (parity with the previous chip-input behavior).\r\n * @memberof OrgMultiSelectComponent\r\n */\r\n addTypedValue(): void {\r\n const value = this.searchText.trim();\r\n if (!value) {\r\n return;\r\n }\r\n const validationError = this.validateFreeText(value);\r\n if (validationError) {\r\n this.errorMessage = validationError;\r\n // Keep the field flagged invalid so the parent's Save button stays\r\n // disabled even when a valid chip already exists — the uncommitted token\r\n // is invalid and must be corrected or cleared before submitting.\r\n this.emitInvalidState(true);\r\n return;\r\n }\r\n // Avoid duplicates (case-insensitive by name).\r\n const exists = this._selectedOptions.some(\r\n (option) => option.name?.toLowerCase() === value.toLowerCase()\r\n );\r\n if (!exists) {\r\n this._selectedOptions = [\r\n ...this._selectedOptions,\r\n { id: '', name: value },\r\n ];\r\n this.emitSelection();\r\n }\r\n // Token committed successfully — input is cleared, so the field is valid.\r\n this.clearSearchText();\r\n }\r\n\r\n /**\r\n * Validates a free-text organization value against the shared min/max/pattern\r\n * rules. Returns an error message when invalid, otherwise an empty string.\r\n * @param {string} value -the typed value.\r\n * @return {string}\r\n * @memberof OrgMultiSelectComponent\r\n */\r\n validateFreeText(value: string): string {\r\n const messages = this.addUserRosterTexts?.message?.error;\r\n if (value.length < GroupsValidationPatterns.representingOrgNameMinLength) {\r\n return messages?.limit?.representingOrganizationMinChars ?? '';\r\n }\r\n if (value.length > GroupsValidationPatterns.representingOrgNameMaxLength) {\r\n return messages?.limit?.representingOrganizationMaxChars ?? '';\r\n }\r\n if (!GroupsValidationPatterns.representingOrganization.test(value)) {\r\n return messages?.pattern?.representingOrganization ?? '';\r\n }\r\n return '';\r\n }\r\n\r\n /**\r\n * Toggles selection of a result option. Keeps the dropdown open and the typed\r\n * text intact so the user can keep selecting.\r\n * @param {SelectOption} option -the clicked result option.\r\n * @memberof OrgMultiSelectComponent\r\n */\r\n toggleOption(option: SelectOption): void {\r\n const index = this._selectedOptions.findIndex(\r\n (item) => item.id === option.id && item.name === option.name\r\n );\r\n if (index >= 0) {\r\n this._selectedOptions = this._selectedOptions.filter(\r\n (_, i) => i !== index\r\n );\r\n } else {\r\n this._selectedOptions = [...this._selectedOptions, option];\r\n }\r\n this.emitSelection();\r\n // Keep focus in the input so the user can continue typing/selecting.\r\n this.searchInput?.nativeElement?.focus();\r\n }\r\n\r\n /**\r\n * Whether an option is currently selected (drives the checkbox checked state).\r\n * @param {SelectOption} option -option to test.\r\n * @return {boolean}\r\n * @memberof OrgMultiSelectComponent\r\n */\r\n isSelected(option: SelectOption): boolean {\r\n return this._selectedOptions.some(\r\n (item) => item.id === option.id && item.name === option.name\r\n );\r\n }\r\n\r\n /**\r\n * Removes a selected chip.\r\n * @param {SelectOption} option -the option to remove.\r\n * @memberof OrgMultiSelectComponent\r\n */\r\n removeOption(option: SelectOption): void {\r\n this._selectedOptions = this._selectedOptions.filter(\r\n (item) => !(item.id === option.id && item.name === option.name)\r\n );\r\n this.emitSelection();\r\n }\r\n\r\n /**\r\n * Clears all selected chips.\r\n * @memberof OrgMultiSelectComponent\r\n */\r\n clearAll(): void {\r\n this._selectedOptions = [];\r\n this.options = [];\r\n this.isDropdownOpen = false;\r\n this.emitSelection();\r\n }\r\n\r\n /**\r\n * Clears the leftover typed text on blur (old behavior) and closes the\r\n * dropdown. Deferred so a click on a dropdown option (which also blurs the\r\n * input) is handled first.\r\n * @memberof OrgMultiSelectComponent\r\n */\r\n onBlur(): void {\r\n this.isTouched = true;\r\n this.blurTimer?.unsubscribe();\r\n this.blurTimer = timer(150).subscribe(() => {\r\n // If focus moved into the dropdown (option click), the click handler\r\n // re-focuses the input, so document.activeElement is the input again.\r\n const active = document.activeElement;\r\n if (active === this.searchInput?.nativeElement) {\r\n return;\r\n }\r\n this.clearSearchText();\r\n this.isDropdownOpen = false;\r\n this.fieldBlur.emit();\r\n });\r\n }\r\n\r\n /**\r\n * Whether the required error should show (touched, no selection).\r\n * @return {boolean}\r\n * @memberof OrgMultiSelectComponent\r\n */\r\n get showRequiredError(): boolean {\r\n return (\r\n this.required && this.isTouched && this._selectedOptions.length === 0\r\n );\r\n }\r\n\r\n /**\r\n * Clears the typed search text and hides the results.\r\n * @memberof OrgMultiSelectComponent\r\n */\r\n private clearSearchText(): void {\r\n // Cancel any pending debounced search so a blur/clear before the timer\r\n // expires does not emit the now-cleared query to the parent.\r\n this.searchDebounce?.unsubscribe();\r\n this.searchDebounce = undefined;\r\n this.searchText = '';\r\n if (this.searchInput?.nativeElement) {\r\n this.searchInput.nativeElement.value = '';\r\n }\r\n this.options = [];\r\n this.errorMessage = '';\r\n // No leftover text — the field is no longer holding an invalid token.\r\n this.emitInvalidState(false);\r\n }\r\n\r\n /**\r\n * Emits the current selection to the parent.\r\n * @memberof OrgMultiSelectComponent\r\n */\r\n private emitSelection(): void {\r\n this.selectionChange.emit(\r\n this._selectedOptions.map((option) => ({\r\n id: option.id,\r\n name: option.name,\r\n }))\r\n );\r\n }\r\n\r\n /**\r\n * TrackBy for both result and chip lists.\r\n * @param {number} index -list index.\r\n * @param {SelectOption} option -the option.\r\n * @return {(string | number)}\r\n * @memberof OrgMultiSelectComponent\r\n */\r\n trackByFn(index: number, option: SelectOption): string | number {\r\n return `${option.id}-${option.name}`;\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.searchDebounce?.unsubscribe();\r\n this.blurTimer?.unsubscribe();\r\n this.destroy$.next(true);\r\n this.destroy$.complete();\r\n }\r\n}\r\n","<div\r\n class=\"ieeesa-org-multi-select\"\r\n [class.ieeesa-org-multi-select--invalid]=\"showRequiredError || errorMessage\"\r\n>\r\n <label class=\"ieeesa-org-multi-select__label ieeesa-body-sm-14\">\r\n {{ label }}\r\n </label>\r\n\r\n <div class=\"ieeesa-org-multi-select__field\">\r\n <!--\r\n Chips and the search input flow together inline (like the Material\r\n chip-grid). This keeps a single-row field appearance that grows as chips\r\n wrap, with the clear-all button pinned to the right as a suffix.\r\n -->\r\n <div class=\"ieeesa-org-multi-select__control\">\r\n <span\r\n class=\"ieeesa-org-multi-select__chip\"\r\n *ngFor=\"let option of selectedOptions; trackBy: trackByFn\"\r\n [attr.aria-label]=\"option.name\"\r\n >\r\n <span class=\"ieeesa-org-multi-select__chip-label\">\r\n {{ option.name }}\r\n </span>\r\n <button\r\n type=\"button\"\r\n class=\"ieeesa-org-multi-select__chip-remove\"\r\n [attr.aria-label]=\"'Remove ' + option.name\"\r\n (click)=\"removeOption(option)\"\r\n >\r\n <svg\r\n class=\"ieeesa-org-multi-select__chip-remove-icon\"\r\n *ngIf=\"removeIconURL\"\r\n >\r\n <use [attr.xlink:href]=\"removeIconURL\"></use>\r\n </svg>\r\n <span *ngIf=\"!removeIconURL\" aria-hidden=\"true\">×</span>\r\n </button>\r\n </span>\r\n\r\n <input\r\n #searchInput\r\n type=\"text\"\r\n class=\"ieeesa-org-multi-select__input ieeesa-title-sm-16\"\r\n role=\"combobox\"\r\n aria-haspopup=\"listbox\"\r\n [attr.aria-expanded]=\"isDropdownOpen\"\r\n [attr.aria-controls]=\"optionIdPrefix + 'listbox'\"\r\n [attr.aria-activedescendant]=\"\r\n isDropdownOpen && activeOptionIndex >= 0\r\n ? optionIdPrefix + activeOptionIndex\r\n : null\r\n \"\r\n [attr.aria-label]=\"ariaLabel\"\r\n [placeholder]=\"placeholder\"\r\n [value]=\"searchText\"\r\n (input)=\"onInput($event)\"\r\n (focus)=\"onFocus()\"\r\n (keydown)=\"onKeydown($event)\"\r\n (blur)=\"onBlur()\"\r\n />\r\n </div>\r\n\r\n <button\r\n type=\"button\"\r\n class=\"ieeesa-org-multi-select__clear-all\"\r\n [matTooltip]=\"'Clear all'\"\r\n aria-label=\"Clear all\"\r\n *ngIf=\"selectedOptions.length\"\r\n (click)=\"clearAll()\"\r\n >\r\n <svg\r\n class=\"ieeesa-org-multi-select__clear-all-icon\"\r\n *ngIf=\"clearAllIconURL\"\r\n >\r\n <use [attr.xlink:href]=\"clearAllIconURL\"></use>\r\n </svg>\r\n <span *ngIf=\"!clearAllIconURL\" aria-hidden=\"true\">×</span>\r\n </button>\r\n\r\n <!--\r\n Custom results dropdown. Fully owned (not mat-autocomplete) so a pick never\r\n closes the panel or overwrites the typed text. mousedown is prevented so\r\n clicking a row does not blur the input before the click registers.\r\n -->\r\n <div\r\n class=\"ieeesa-org-multi-select__dropdown\"\r\n role=\"listbox\"\r\n [id]=\"optionIdPrefix + 'listbox'\"\r\n aria-multiselectable=\"true\"\r\n *ngIf=\"isDropdownOpen && options.length\"\r\n (mousedown)=\"$event.preventDefault()\"\r\n >\r\n <div\r\n class=\"ieeesa-org-multi-select__option\"\r\n role=\"option\"\r\n *ngFor=\"let option of options; let i = index; trackBy: trackByFn\"\r\n [id]=\"optionIdPrefix + i\"\r\n [attr.aria-selected]=\"isSelected(option)\"\r\n [class.ieeesa-org-multi-select__option--selected]=\"isSelected(option)\"\r\n [class.ieeesa-org-multi-select__option--active]=\"isActiveOption(i)\"\r\n (click)=\"toggleOption(option)\"\r\n (mouseenter)=\"activeOptionIndex = i\"\r\n >\r\n <mat-checkbox\r\n color=\"primary\"\r\n [checked]=\"isSelected(option)\"\r\n (click)=\"$event.preventDefault()\"\r\n ></mat-checkbox>\r\n <span\r\n class=\"ieeesa-org-multi-select__option-label ieeesa-title-sm-16\"\r\n >\r\n {{ option.name }}\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Inline free-text validation error (Enter path) -->\r\n <p\r\n class=\"ieeesa-org-multi-select__error ieeesa-body-sm-14\"\r\n *ngIf=\"errorMessage\"\r\n >\r\n {{ errorMessage }}\r\n </p>\r\n\r\n <!-- Required error (touched, nothing selected) -->\r\n <p\r\n class=\"ieeesa-org-multi-select__error ieeesa-body-sm-14\"\r\n *ngIf=\"showRequiredError && !errorMessage\"\r\n >\r\n {{ addUserRosterTexts?.message?.error?.required }}\r\n </p>\r\n\r\n <!-- Support/help text -->\r\n <p\r\n class=\"ieeesa-org-multi-select__support ieeesa-body-sm-14\"\r\n *ngIf=\"supportMessage && !errorMessage && !showRequiredError\"\r\n >\r\n {{ supportMessage }}\r\n </p>\r\n</div>\r\n","import {\r\n Component,\r\n EventEmitter,\r\n OnDestroy,\r\n OnInit,\r\n Output,\r\n ViewChild,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { GroupsService } from '../../services/groups.service';\r\nimport {\r\n AlignType,\r\n AutoCompleteOption,\r\n CheckboxOption,\r\n FieldConfig,\r\n FormControlType,\r\n FormGrid,\r\n FormModel,\r\n SelectOption,\r\n DynamicFormComponent,\r\n} from '@ieeesa-npm/presentation';\r\nimport * as screenTexts from '../../assets/constants.json';\r\nimport { FormArray, FormControl, FormGroup, Validators } from '@angular/forms';\r\nimport { GroupUserInfo } from '../../models/group-user-info.model';\r\nimport { Subject, takeUntil } from 'rxjs';\r\nimport { FormStatus, AlertType } from '@ieeesa-npm/models';\r\nimport { HttpErrorResponse } from '@angular/common/http';\r\nimport {\r\n AlertsService,\r\n GlobalErrorHandlerService,\r\n} from '@ieeesa-npm/utility';\r\nimport {\r\n AddOrEditUserIndividualRosterPayload,\r\n AddOrEditUserPayload,\r\n RepresentingOrganization,\r\n} from '../../models/add-or-edit-user-group.model';\r\nimport { GroupTypeConfiguration } from '../../models/group-types.model';\r\nimport { GroupRosterType } from '../../models/roster-type.model';\r\nimport {\r\n GroupsValidationPatterns,\r\n representingOrgRequiredValidator,\r\n skipWhenArray,\r\n} from '../../assets/form-validations';\r\nimport {\r\n Organization,\r\n OrganizationRequestPayload,\r\n} from '../../models/organization.model';\r\nimport { OrgMultiSelectComponent } from '../org-multi-select/org-multi-select.component';\r\n\r\n/**\r\n * Component implements the view and functionalities to edit group users to roster.\r\n * @class EditUserRolesComponent\r\n * @implements {OnInit}\r\n * @implements {OnDestroy}\r\n */\r\n@Component({\r\n selector: 'ieeesa-edit-user-roles',\r\n standalone: true,\r\n imports: [CommonModule, DynamicFormComponent, OrgMultiSelectComponent],\r\n templateUrl: './edit-user-roles.component.html',\r\n styleUrls: ['./edit-user-roles.component.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class EditUserRolesComponent implements OnInit, OnDestroy {\r\n destroy$ = new Subject<boolean>();\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n constants: any = screenTexts;\r\n addUserRosterTexts = this.constants?.addUserRoster;\r\n leftButtonLabel = this.addUserRosterTexts?.label?.leftButtonLabel;\r\n rightButtonLabel = this.addUserRosterTexts?.label?.saveButtonLabel;\r\n isSubmitButtonDisabled = false;\r\n colWidth: FormGrid = { xs: 12, xl: 12, sm: 12, md: 12, lg: 12 };\r\n editUserRoleFormGroup!: FormModel;\r\n editUserRoleFormGroupRef!: FormGroup;\r\n userRoles!: CheckboxOption[];\r\n selectedUserRoleIds: string[] = [];\r\n selectedUserInfo!: GroupUserInfo;\r\n actionButtonAlign = AlignType.LEFT;\r\n classifications: SelectOption[] = [];\r\n memberTypes: SelectOption[] = [];\r\n organizations: SelectOption[] = [];\r\n groupTypes!: GroupTypeConfiguration[];\r\n hasClassification = false;\r\n groupRosterType!: GroupRosterType;\r\n representingOrganizations: SelectOption[] = [];\r\n orgSearchValue = '';\r\n\r\n /**\r\n * True when the selected group's roster type is INDIVIDUAL (the only roster\r\n * type that shows the Representing Organization field).\r\n * @readonly\r\n * @memberof EditUserRolesComponent\r\n */\r\n get isIndividualRoster(): boolean {\r\n return this.groupRosterType === GroupRosterType.INDIVIDUAL;\r\n }\r\n\r\n /**\r\n * True when the org field holds an uncommitted, invalid free-text token. Used\r\n * to keep Save disabled even when a valid chip already exists.\r\n */\r\n hasInvalidOrgFreeText = false;\r\n @ViewChild(DynamicFormComponent) dynamicFormComponent!: DynamicFormComponent;\r\n @Output() submitFormResponse = new EventEmitter();\r\n @Output() formCancel = new EventEmitter();\r\n constructor(\r\n // eslint-disable-next-line no-unused-vars\r\n private groupsService: GroupsService,\r\n // eslint-disable-next-line no-unused-vars\r\n public globalErrorHandlerService: GlobalErrorHandlerService,\r\n // eslint-disable-next-line no-unused-vars\r\n public alertService: AlertsService // eslint-disable-next-line no-empty-function\r\n ) {}\r\n\r\n /**\r\n * Initialize the edit user role required information and form group array.\r\n * @return -returns nothing\r\n * @memberof EditUserRolesComponent\r\n */\r\n ngOnInit(): void {\r\n this.selectedUserInfo = this.groupsService?.getSelectedUserInfo();\r\n this.groupsService.representingOrganizations.forEach(\r\n (user: RepresentingOrganization) => {\r\n if (\r\n this.selectedUserInfo.userId === user.userId &&\r\n user.organizations?.length\r\n ) {\r\n user.organizations.forEach((option: Organization) => {\r\n this.representingOrganizations?.push({\r\n id: option.orgId,\r\n name: option.orgName,\r\n });\r\n });\r\n }\r\n }\r\n );\r\n // eslint-disable-next-line no-unused-expressions\r\n this.representingOrganizations?.length\r\n ? (this.isSubmitButtonDisabled = false)\r\n : (this.isSubmitButtonDisabled = true);\r\n const selectedUserRoleNames = this.selectedUserInfo?.role\r\n ?.split(',')\r\n .map((role) => role?.trim());\r\n this.userRoles = this.groupsService?.getGroupTypeUserRoles();\r\n this.userRoles?.forEach((role) => {\r\n if (selectedUserRoleNames?.includes(role?.name as string)) {\r\n role.checked = true;\r\n this.selectedUserRoleIds?.push(role?.id as string);\r\n }\r\n });\r\n const groupType = this.groupsService.getBusinessRuleOfSelectedGroup();\r\n this.hasClassification = groupType?.hasClassification ?? false;\r\n this.groupRosterType = groupType?.rosterType as GroupRosterType;\r\n if (!this.groupRosterType)\r\n this.alertService.showMessage({\r\n status: 'custom',\r\n message: this.constants?.errors?.ER1001,\r\n alertType: AlertType.ERROR,\r\n isCloseNeeded: true,\r\n });\r\n else {\r\n if (this.groupRosterType === GroupRosterType?.INDIVIDUAL) {\r\n if (this.hasClassification) this.getClassifications();\r\n this.getMemberTypes();\r\n }\r\n this.editUserRolesFormGroup();\r\n }\r\n }\r\n\r\n /**\r\n * Initialize the edit user role form group array.\r\n * @memberof EditUserRolesComponent\r\n */\r\n editUserRolesFormGroup() {\r\n this.editUserRoleFormGroup = {\r\n formGroup: [\r\n {\r\n legend: '',\r\n controls: [\r\n {\r\n type: FormControlType?.TEXT_AREA,\r\n label: this.addUserRosterTexts?.label?.email + '*',\r\n controlName: 'email',\r\n value: this.selectedUserInfo?.email,\r\n ariaLabel: this.addUserRosterTexts?.label?.ariaLabel?.email,\r\n ariaDescribedById:\r\n this.addUserRosterTexts?.label?.ariaDescribedById?.email,\r\n isReadonly: true,\r\n ariaMultiline: false,\r\n isResize: true,\r\n },\r\n {\r\n type: FormControlType.TEXT_AREA,\r\n label: this.addUserRosterTexts?.label?.fullName + '*',\r\n controlName: 'fullName',\r\n value: this.selectedUserInfo?.name,\r\n ariaLabel: this.addUserRosterTexts?.label?.ariaLabel?.fullName,\r\n ariaDescribedById:\r\n this.addUserRosterTexts?.label?.ariaDescribedById?.fullName,\r\n isReadonly: true,\r\n ariaMultiline: false,\r\n isResize: true,\r\n },\r\n {\r\n type: FormControlType.CHECKBOX,\r\n label:\r\n this.groupRosterType === GroupRosterType.INDIVIDUAL\r\n ? this.addUserRosterTexts?.label?.role\r\n : this.addUserRosterTexts?.label?.role + '*',\r\n controlName: 'roles',\r\n checkboxOptions: this.userRoles,\r\n minSelectionRequired: 1,\r\n ariaLabel: this.addUserRosterTexts?.label?.ariaLabel?.role,\r\n ariaDescribedById:\r\n this.addUserRosterTexts?.label?.ariaDescribedById?.role,\r\n supportMessage:\r\n this.groupRosterType === GroupRosterType.INDIVIDUAL\r\n ? this.addUserRosterTexts?.supportText\r\n ?.roleForIndividualRoster\r\n : this.addUserRosterTexts?.supportText?.role,\r\n requiredErrorMessage:\r\n this.addUserRosterTexts?.message?.error?.required,\r\n validation:\r\n this.groupRosterType === GroupRosterType.INDIVIDUAL\r\n ? []\r\n : [Validators.required],\r\n },\r\n ],\r\n },\r\n ],\r\n };\r\n if (this.groupRosterType === GroupRosterType?.INDIVIDUAL) {\r\n this.updateEditUserRoleFormGroup();\r\n }\r\n }\r\n\r\n /**\r\n * Adds classification, Member Type and Representing Organization form controls while editing new user to an individual group roster.\r\n * @memberof AddUserRosterComponent\r\n */\r\n updateEditUserRoleFormGroup(): void {\r\n if (this.hasClassification)\r\n this.updateEditUserRoleFormControls(\r\n this.editUserRoleFormGroup?.formGroup[0]?.controls?.length - 1,\r\n {\r\n type: FormControlType.SELECT,\r\n label: this.addUserRosterTexts?.label?.classification + '*',\r\n controlName: 'classification',\r\n dropdownOptions: this.classifications,\r\n value: this.classifications?.filter(\r\n (option) => option?.name === this.selectedUserInfo?.classification\r\n )[0],\r\n validation: [Validators.required],\r\n placeholder: '',\r\n supportMessage: this.addUserRosterTexts?.supportText?.classification,\r\n requiredErrorMessage:\r\n this.addUserRosterTexts?.message?.error?.required,\r\n ariaLabel: this.addUserRosterTexts?.label?.ariaLabel?.classification,\r\n ariaDescribedById:\r\n this.addUserRosterTexts?.label?.ariaDescribedById?.classification,\r\n }\r\n );\r\n this.updateEditUserRoleFormControls(\r\n this.editUserRoleFormGroup?.formGroup[0]?.controls?.length - 1,\r\n {\r\n type: FormControlType.SELECT,\r\n label: this.addUserRosterTexts?.label?.memberType + '*',\r\n controlName: 'memberType',\r\n dropdownOptions: this.memberTypes,\r\n value: this.memberTypes?.filter(\r\n (option) => option?.name === this.selectedUserInfo?.memberStatus\r\n )[0],\r\n validation: [Validators.required],\r\n placeholder: '',\r\n supportMessage: this.addUserRosterTexts?.supportText?.memberType,\r\n requiredErrorMessage: this.addUserRosterTexts?.message?.error?.required,\r\n ariaLabel: this.addUserRosterTexts?.label?.ariaLabel?.memberType,\r\n ariaDescribedById:\r\n this.addUserRosterTexts?.label?.ariaDescribedById?.memberType,\r\n }\r\n );\r\n // The \"Representing Organization\" field is rendered by the custom\r\n // OrgMultiSelectComponent in the template (not by the dynamic form). The\r\n // reactive `representingOrg` control is registered on the captured form\r\n // group ref in registerRepresentingOrgControl() so all existing submit/\r\n // Save-button logic (which reads form.get('representingOrg')) keeps working.\r\n // Its value stays in sync via getSelectedOrganizations().\r\n }\r\n\r\n /**\r\n * Gets selected organizations.\r\n * @param {AutoCompleteOption[]} selectedOrg\r\n * @memberof EditUserRolesComponent\r\n */\r\n getSelectedOrganizations(selectedOrg: AutoCompleteOption[]): void {\r\n this.representingOrganizations = selectedOrg;\r\n // Keep the reactive control's value in sync with the selection so the\r\n // required validator and submit/Save-button logic stay accurate.\r\n this.editUserRoleFormGroupRef\r\n ?.get('representingOrg')\r\n ?.setValue(selectedOrg?.length ? selectedOrg : '');\r\n // eslint-disable-next-line no-unused-expressions\r\n this.representingOrganizations.length && !this.hasInvalidOrgFreeText\r\n ? (this.isSubmitButtonDisabled = false)\r\n : (this.isSubmitButtonDisabled = true);\r\n }\r\n\r\n /**\r\n * Handles the org field's invalid-free-text state. Disables Save while an\r\n * uncommitted invalid token remains; re-evaluates when it clears.\r\n * @param {boolean} isInvalid -whether an uncommitted invalid token is present.\r\n * @memberof EditUserRolesComponent\r\n */\r\n onOrgInvalidFreeText(isInvalid: boolean): void {\r\n this.hasInvalidOrgFreeText = isInvalid;\r\n if (isInvalid) {\r\n this.isSubmitButtonDisabled = true;\r\n } else {\r\n // Recompute from the selection when the invalid token clears.\r\n this.isSubmitButtonDisabled = !this.representingOrganizations.length;\r\n }\r\n }\r\n /**\r\n * Updates the edit user form group controls by adding fieldConfig at required index.\r\n * @param {number} indexPosition\r\n * @param {FieldConfig} fieldConfig\r\n * @memberof EditUserRolesComponent\r\n */\r\n updateEditUserRoleFormControls(\r\n indexPosition: number,\r\n fieldConfig: FieldConfig\r\n ): void {\r\n this.editUserRoleFormGroup.formGroup[0].controls.splice(\r\n indexPosition,\r\n 0,\r\n fieldConfig\r\n );\r\n }\r\n\r\n /**\r\n * Handles user role selection and save button enable disable in edit user roles form.\r\n * @param {CheckboxOption} event\r\n * @memberof EditUserRolesComponent\r\n */\r\n onUserRoleSelection(event: CheckboxOption): void {\r\n if (event?.checked) {\r\n this.selectedUserRoleIds?.push(event?.id as string);\r\n } else {\r\n this.selectedUserRoleIds = this.selectedUserRoleIds?.filter(\r\n (id) => id !== event?.id\r\n );\r\n }\r\n if (this.groupRosterType === GroupRosterType.SYSTEM_USER) {\r\n this.isSubmitButtonDisabled = this.groupsService.isSubmitButtonDisabled(\r\n this.groupRosterType,\r\n this.editUserRoleFormGroupRef?.status,\r\n this.selectedUserRoleIds\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Update roles and details of user on form submission.\r\n * @param {FormGroup[]} form\r\n * @memberof EditUserRolesComponent\r\n */\r\n onEditUserRoleFormSubmit(form: FormGroup[]): void {\r\n form[0]?.markAllAsTouched();\r\n // Block submit if an uncommitted, invalid free-text token remains in the\r\n // org field even when other controls / selected chips are valid.\r\n if (this.hasInvalidOrgFreeText) {\r\n return;\r\n }\r\n const isAllOtherControlsValid = Object.keys(form[0].controls)\r\n .filter((controlName) => controlName !== 'representingOrg')\r\n .every(\r\n (controlName) => form[0].get(controlName)?.status === FormStatus?.VALID\r\n );\r\n if (\r\n (form[0].get('representingOrg')?.status === FormStatus?.INVALID &&\r\n isAllOtherControlsValid &&\r\n this.representingOrganizations.length > 0) ||\r\n form[0].status === FormStatus?.VALID\r\n ) {\r\n this.groupsService\r\n .editGroupsUserRole(this.getEditUserRolePayload(form[0]?.getRawValue()))\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (res) => {\r\n if (res?.status) {\r\n this.submitFormResponse?.emit(res);\r\n }\r\n },\r\n error: (error) => {\r\n this.handleErrors(error);\r\n },\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Constructs edit user payload from the form data depends on the GroupRosterType and returns.\r\n * @param {*} formData\r\n * @return {(AddOrEditUserPayload | AddOrEditUserIndividualRosterPayload)}\r\n * @memberof EditUserRolesComponent\r\n */\r\n getEditUserRolePayload(\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n formData: any\r\n ): AddOrEditUserPayload | AddOrEditUserIndividualRosterPayload {\r\n let payload: AddOrEditUserPayload | AddOrEditUserIndividualRosterPayload;\r\n if (this.groupRosterType === GroupRosterType?.INDIVIDUAL) {\r\n const formattedOptions = this.representingOrganizations.map((option) => {\r\n return {\r\n orgId: option.id as string,\r\n orgName: option.name,\r\n };\r\n });\r\n payload = {\r\n payload: {\r\n userId: this.selectedUserInfo?.userId,\r\n email: this.selectedUserInfo?.email,\r\n roles: this.selectedUserRoleIds,\r\n groupId: this.groupsService.selectedGroupInfo?.groupId as string,\r\n organizations: formattedOptions,\r\n },\r\n };\r\n if (this.hasClassification)\r\n payload.payload.classification = {\r\n classificationId: formData?.classification\r\n ? formData?.classification?.id\r\n : '',\r\n };\r\n\r\n if (\r\n formData?.memberType &&\r\n !payload.payload.roles?.includes(formData?.memberType?.id)\r\n )\r\n payload.payload.roles?.push(formData?.memberType?.id);\r\n } else\r\n payload = {\r\n payload: {\r\n email: this.selectedUserInfo?.email,\r\n userId: this.selectedUserInfo?.userId,\r\n roles: this.selectedUserRoleIds,\r\n groupId: this.groupsService?.selectedGroupInfo?.groupId as string,\r\n },\r\n };\r\n return payload;\r\n }\r\n\r\n /**\r\n * Emits form cancel event.\r\n * @memberof EditUserRolesComponent\r\n */\r\n onEditUserRoleCancelled(): void {\r\n this.formCancel?.emit();\r\n }\r\n\r\n /**\r\n * Get form reference.\r\n * @param {FormGroup[]} form\r\n * @memberof EditUserRolesComponent\r\n */\r\n getFormGroupReference(form: FormGroup[]) {\r\n this.editUserRoleFormGroupRef = form[0];\r\n if (!this.selectedUserInfo?.canDelete) {\r\n (this.editUserRoleFormGroupRef?.controls['roles'] as FormArray)\r\n ?.at(0)\r\n ?.disable();\r\n }\r\n this.registerRepresentingOrgControl();\r\n }\r\n\r\n /**\r\n * Registers the `representingOrg` reactive control on the dynamic form's\r\n * FormGroup for INDIVIDUAL rosters. The field itself is rendered by the custom\r\n * OrgMultiSelectComponent (not the dynamic form), but keeping this control on\r\n * the same FormGroup — with the original validators — means all existing\r\n * submit/Save-button logic that reads `form.get('representingOrg')` keeps\r\n * working unchanged. Its value is the selected-organizations array, kept in\r\n * sync by getSelectedOrganizations(). Prefilled with the user's existing\r\n * organizations on edit.\r\n * @memberof EditUserRolesComponent\r\n */\r\n registerRepresentingOrgControl(): void {\r\n if (\r\n this.groupRosterType !== GroupRosterType.INDIVIDUAL ||\r\n !this.editUserRoleFormGroupRef ||\r\n this.editUserRoleFormGroupRef.contains('representingOrg')\r\n ) {\r\n return;\r\n }\r\n this.editUserRoleFormGroupRef.addControl(\r\n 'representingOrg',\r\n new FormControl(\r\n this.representingOrganizations?.length\r\n ? this.representingOrganizations\r\n : '',\r\n {\r\n updateOn: 'blur',\r\n validators: [\r\n representingOrgRequiredValidator(),\r\n skipWhenArray(\r\n Validators.maxLength(\r\n GroupsValidationPatterns.representingOrgNameMaxLength\r\n )\r\n ),\r\n skipWhenArray(\r\n Validators.minLength(\r\n GroupsValidationPatterns.representingOrgNameMinLength\r\n )\r\n ),\r\n skipWhenArray(\r\n Validators.pattern(\r\n GroupsValidationPatterns.representingOrganization\r\n )\r\n ),\r\n ],\r\n }\r\n )\r\n );\r\n }\r\n\r\n /**\r\n * Handles edit user role form change event.\r\n * @param {FormGroup[]} form\r\n * @memberof editUserRoleFormGroupRef\r\n */\r\n onEditUserRoleFormChange(form: FormGroup[]): void {\r\n this.editUserRoleFormGroupRef = form[0];\r\n this.isSubmitButtonDisabled = this.groupsService.isSubmitButtonDisabled(\r\n this.groupRosterType,\r\n this.editUserRoleFormGroupRef?.status,\r\n this.selectedUserRoleIds\r\n );\r\n if (\r\n this.representingOrganizations.length &&\r\n this.editUserRoleFormGroupRef.controls['representingOrg'].status ===\r\n FormStatus.INVALID\r\n ) {\r\n this.isSubmitButtonDisabled = false;\r\n } else if (this.representingOrganizations.length === 0) {\r\n this.isSubmitButtonDisabled = true;\r\n }\r\n // An uncommitted, invalid free-text token in the org field must block submit\r\n // regardless of any valid chips already selected.\r\n if (this.hasInvalidOrgFreeText) {\r\n this.isSubmitButtonDisabled = true;\r\n }\r\n }\r\n\r\n /**\r\n * Gets the classifications from master data.\r\n * @memberof EditUserRolesComponent\r\n */\r\n getClassifications(): void {\r\n this.groupsService\r\n .getClassifications()\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (response) => {\r\n response?.body?.forEach((option) => {\r\n this.classifications?.push({\r\n id: option.classificationId,\r\n name: option.classificationDesc,\r\n });\r\n });\r\n this.updateFormControlOptions(\r\n 'classification',\r\n 'dropdownOptions',\r\n this.classifications,\r\n this.selectedUserInfo?.classification\r\n );\r\n },\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n error: (error: any) => {\r\n this.handleErrors(error);\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Gets the member types from master data.\r\n * @memberof EditUserRolesComponent\r\n */\r\n getMemberTypes(): void {\r\n const memberTypes = this.groupsService.getMemberTypes();\r\n memberTypes?.forEach((option) => {\r\n this.memberTypes?.push({\r\n id: option.roleId,\r\n name: option.roleName,\r\n });\r\n });\r\n this.updateFormControlOptions(\r\n 'memberType',\r\n 'dropdownOptions',\r\n this.memberTypes,\r\n this.selectedUserInfo?.memberStatus\r\n );\r\n }\r\n\r\n /**\r\n * Gets the representing Organizations.\r\n * @param {string} orgName\r\n * @memberof AddUserRosterComponent\r\n */\r\n getOrganizations(orgName: string): void {\r\n this.orgSearchValue = orgName;\r\n this.organizations = [];\r\n orgName = orgName?.trimStart();\r\n this.updateFormControlOptions(\r\n 'representingOrg',\r\n 'multiSelectAutoCompleteOptions',\r\n [],\r\n ''\r\n );\r\n if (!orgName) return;\r\n const orgRequestPayload: OrganizationRequestPayload = {\r\n payload: { orgName: orgName },\r\n };\r\n this.groupsService\r\n .getOrganizations(orgRequestPayload)\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (response) => {\r\n const orgs: SelectOption[] = [];\r\n response?.body?.forEach((option) => {\r\n orgs.push({\r\n id: option.orgId,\r\n name: option.orgName,\r\n });\r\n });\r\n // Assign a new array reference so the custom OrgMultiSelectComponent's\r\n // [options] setter runs and opens the results dropdown. Free-text\r\n // min/max/pattern validation is handled inside that component.\r\n this.organizations = orgs;\r\n },\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n error: (error: any) => {\r\n this.handleErrors(error);\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Update the dropdown options of Classification, Member Type and Representing Organization form fields.\r\n * @param {string} formControlName\r\n * @param {string} formControlInputProperty\r\n * @param {SelectOption[]} options\r\n * @memberof EditUserRolesComponent\r\n */\r\n updateFormControlOptions(\r\n formControlName: string,\r\n formControlInputProperty: string,\r\n options: SelectOption[],\r\n selectedOption?: string\r\n ): void {\r\n const formFields = this.dynamicFormComponent?.formFields?.toArray();\r\n formFields?.forEach((formField) => {\r\n const searchedOrgName = options?.filter((option) =>\r\n selectedOption?.includes(option?.name)\r\n )[0];\r\n if (\r\n formField?.component?.instance?.config?.controlName ===\r\n formControlName &&\r\n formField?.component?.instance?.[formControlInputProperty]\r\n )\r\n formField.component.instance[formControlInputProperty] = options;\r\n if (selectedOption && searchedOrgName) {\r\n this.editUserRoleFormGroupRef\r\n .get(formControlName)\r\n ?.setValue(searchedOrgName);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Captures the server side errors and handles it based on the custom or Http errors.\r\n * @param {HttpErrorResponse} error\r\n * @return -returns nothing\r\n * @memberof EditUserRolesComponent\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n handleErrors(error: any): void {\r\n const errorCodes = error?.error?.body?.errorCodes;\r\n if (Array.isArray(errorCodes) && !error?.error?.status) {\r\n if (errorCodes[0] !== '3004') {\r\n const errorMessage = this.groupsService?.parseErrorMessage(errorCodes);\r\n this.alertService.showMessage({\r\n status: 'custom',\r\n message: errorMessage,\r\n alertType: AlertType.ERROR,\r\n isCloseNeeded: true,\r\n });\r\n }\r\n } else if (error && error instanceof HttpErrorResponse) {\r\n this.globalErrorHandlerService?.handleError(error);\r\n }\r\n }\r\n /**\r\n * Disables form submit button when org name length is less than minCharToSearch and greater than zero.\r\n * @memberof EditUserRolesComponent\r\n */\r\n disableSubmitButton(): void {\r\n if (this.representingOrganizations.length === 0) {\r\n this.updateFormControlOptions(\r\n 'representingOrg',\r\n 'multiSelectAutoCompleteOptions',\r\n []\r\n );\r\n this.isSubmitButtonDisabled = true;\r\n }\r\n }\r\n\r\n /**\r\n * NgOnDestroy performs necessary cleanup tasks, such as unsubscribing from subscription when the component is being destroyed.\r\n * @memberof EditUserRolesComponent\r\n */\r\n ngOnDestroy(): void {\r\n this.destroy$.next(true);\r\n this.destroy$.unsubscribe();\r\n }\r\n}\r\n","<ieeesa-dynamic-form\r\n [leftButtonLabel]=\"leftButtonLabel\"\r\n [rightButtonLabel]=\"rightButtonLabel\"\r\n [isLegendVisible]=\"false\"\r\n [isSubmitButtonDisabled]=\"isSubmitButtonDisabled\"\r\n [colWidth]=\"colWidth\"\r\n [actionButtonAlign]=\"actionButtonAlign\"\r\n [formGroups]=\"editUserRoleFormGroup\"\r\n [isLeftButtonNeeded]=\"true\"\r\n (formSubmit)=\"onEditUserRoleFormSubmit($event)\"\r\n (formLeftButtonClicked)=\"onEditUserRoleCancelled()\"\r\n (formCheckboxSelection)=\"onUserRoleSelection($event)\"\r\n (formGroupsReference)=\"getFormGroupReference($event)\"\r\n (formChange)=\"onEditUserRoleFormChange($event)\"\r\n>\r\n <!--\r\n Representing Organization (INDIVIDUAL rosters only). Projected into the\r\n dynamic form's [component] slot so it renders after the other fields but\r\n BEFORE the Save/Cancel action buttons. Uses the custom multi-select field so\r\n multiple orgs can be picked from an open dropdown without the Material\r\n autocomplete closing or clearing the typed text. Prefilled with the user's\r\n existing organizations and synced to the reactive `representingOrg` control\r\n via getSelectedOrganizations().\r\n -->\r\n <ieeesa-org-multi-select\r\n component\r\n *ngIf=\"isIndividualRoster\"\r\n class=\"ieeesa-edit-user-roles__org\"\r\n [label]=\"addUserRosterTexts?.label?.representingOrganization + '*'\"\r\n [ariaLabel]=\"addUserRosterTexts?.label?.ariaLabel?.representingOrganization\"\r\n [supportMessage]=\"addUserRosterTexts?.supportText?.representingOrganization\"\r\n [options]=\"organizations\"\r\n [selectedOptions]=\"representingOrganizations\"\r\n (search)=\"getOrganizations($event)\"\r\n (selectionChange)=\"getSelectedOrganizations($event)\"\r\n (invalidFreeText)=\"onOrgInvalidFreeText($event)\"\r\n ></ieeesa-org-multi-select>\r\n</ieeesa-dynamic-form>\r\n","/* eslint-disable no-unused-vars */\r\n\r\n/**\r\n * Terminal status of a roster bulk-upload job.\r\n */\r\nexport enum RosterUploadStatus {\r\n PROCESSING = 'PROCESSING',\r\n COMPLETED = 'COMPLETED',\r\n FAILED = 'FAILED',\r\n}\r\n\r\n/**\r\n * A single row-level error from the roster import validation.\r\n */\r\nexport interface RosterUploadError {\r\n /** 1-based row number in the uploaded file. */\r\n rowNumber: number;\r\n /** The field/column the error relates to (e.g. \"Name\", \"Email\"). */\r\n field?: string;\r\n /** The offending value, when relevant (e.g. an unrecognized role). */\r\n value?: string;\r\n /** Human-readable error message shown in the row-errors list. */\r\n errorMessage: string;\r\n}\r\n\r\n/**\r\n * Terminal result of a roster bulk-upload job.\r\n *\r\n * NOTE: This is a MOCK-friendly shape used to build the UI before the real API\r\n * is available. It will be reconciled with the backend contract once shared.\r\n */\r\nexport interface RosterUploadResponse {\r\n /** Job identifier (unused by the mock flow, kept for parity with the API). */\r\n uploadJobId?: string;\r\n /** Terminal job status. */\r\n status: RosterUploadStatus;\r\n /** Total data rows detected in the file (excludes the header row). */\r\n totalRecords: number;\r\n /** Rows successfully added/updated. */\r\n successCount: number;\r\n /** Rows skipped due to validation errors. */\r\n failureCount: number;\r\n /** Row-level errors (present when failureCount > 0). */\r\n rowErrors: RosterUploadError[];\r\n}\r\n\r\n/**\r\n * The kind of mock scenario to simulate, so the UI can be exercised against\r\n * each Figma state without a backend.\r\n */\r\nexport enum RosterImportMockScenario {\r\n /** All rows imported successfully (Figma: 30 added / 0 skipped). */\r\n ALL_SUCCESS = 'ALL_SUCCESS',\r\n /** Some rows imported, some skipped with errors (partial). */\r\n PARTIAL = 'PARTIAL',\r\n /** Every row skipped with errors (Figma: 0 added / 30 skipped). */\r\n ALL_SKIPPED = 'ALL_SKIPPED',\r\n /** File contained headers but zero data rows (Figma: \"No roster data found\"). */\r\n EMPTY = 'EMPTY',\r\n}\r\n","import {\r\n RosterImportMockScenario,\r\n RosterUploadError,\r\n RosterUploadResponse,\r\n RosterUploadStatus,\r\n} from '../models/roster-import.model';\r\n\r\n/**\r\n * Mock responses for the roster import flow, used to build and exercise the UI\r\n * before the real backend API is available. Each scenario maps to one of the\r\n * Figma result screens.\r\n *\r\n * Once the API is wired up, `RosterImportComponent` will call the real service\r\n * method instead of `RosterImportMocks.getMockResponse(...)`.\r\n */\r\nexport class RosterImportMocks {\r\n /** Row errors mirroring the Figma \"All Rows are skipped\" screen. */\r\n static readonly mockRowErrors: RosterUploadError[] = [\r\n {\r\n rowNumber: 2,\r\n field: 'Name',\r\n errorMessage: '\"Name\" record is missing values',\r\n },\r\n {\r\n rowNumber: 3,\r\n field: 'Email',\r\n errorMessage: '\"Email\" is not a valid email address',\r\n },\r\n {\r\n rowNumber: 4,\r\n field: 'Role',\r\n value: 'Supervisor',\r\n errorMessage: 'Role \"Supervisor\" is not an allowed role',\r\n },\r\n {\r\n rowNumber: 5,\r\n field: 'Member Type',\r\n value: 'Gold Member',\r\n errorMessage: 'Member Type \"Gold Member\" is not an allowed value',\r\n },\r\n {\r\n rowNumber: 6,\r\n field: 'Member Type',\r\n value: 'Gold Member',\r\n errorMessage: 'Member Type \"Gold Member\" is not an allowed value',\r\n },\r\n ];\r\n\r\n /** All 30 rows added successfully (Figma: 30 / 0). */\r\n static readonly allSuccess: RosterUploadResponse = {\r\n uploadJobId: 'MOCK_JOB_SUCCESS',\r\n status: RosterUploadStatus.COMPLETED,\r\n totalRecords: 30,\r\n successCount: 30,\r\n failureCount: 0,\r\n rowErrors: [],\r\n };\r\n\r\n /** Partial import: some added, some skipped. */\r\n static readonly partial: RosterUploadResponse = {\r\n uploadJobId: 'MOCK_JOB_PARTIAL',\r\n status: RosterUploadStatus.COMPLETED,\r\n totalRecords: 30,\r\n successCount: 25,\r\n failureCount: 5,\r\n rowErrors: RosterImportMocks.mockRowErrors,\r\n };\r\n\r\n /** Every row skipped (Figma: 0 / 30, \"All Rows are skipped\"). */\r\n static readonly allSkipped: RosterUploadResponse = {\r\n uploadJobId: 'MOCK_JOB_SKIPPED',\r\n status: RosterUploadStatus.COMPLETED,\r\n totalRecords: 30,\r\n successCount: 0,\r\n failureCount: 30,\r\n rowErrors: RosterImportMocks.mockRowErrors,\r\n };\r\n\r\n /** Headers only, zero data rows (Figma: \"No roster data found\"). */\r\n static readonly empty: RosterUploadResponse = {\r\n uploadJobId: 'MOCK_JOB_EMPTY',\r\n status: RosterUploadStatus.COMPLETED,\r\n totalRecords: 0,\r\n successCount: 0,\r\n failureCount: 0,\r\n rowErrors: [],\r\n };\r\n\r\n /**\r\n * Returns the mock upload response for a given scenario.\r\n * @param {RosterImportMockScenario} scenario - The scenario to simulate.\r\n * @return {RosterUploadResponse}\r\n */\r\n static getMockResponse(\r\n scenario: RosterImportMockScenario\r\n ): RosterUploadResponse {\r\n switch (scenario) {\r\n case RosterImportMockScenario.ALL_SUCCESS:\r\n return RosterImportMocks.allSuccess;\r\n case RosterImportMockScenario.PARTIAL:\r\n return RosterImportMocks.partial;\r\n case RosterImportMockScenario.ALL_SKIPPED:\r\n return RosterImportMocks.allSkipped;\r\n case RosterImportMockScenario.EMPTY:\r\n return RosterImportMocks.empty;\r\n default:\r\n return RosterImportMocks.allSuccess;\r\n }\r\n }\r\n}\r\n","import {\r\n Component,\r\n EventEmitter,\r\n Input,\r\n OnDestroy,\r\n Output,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\r\nimport { interval, Subject, timer, takeUntil, takeWhile } from 'rxjs';\r\nimport {\r\n RosterImportMockScenario,\r\n RosterUploadError,\r\n RosterUploadResponse,\r\n} from '../../models/roster-import.model';\r\nimport { RosterImportMocks } from '../../assets/roster-import-mocks';\r\nimport * as constants from '../../assets/constants.json';\r\n\r\n/** States of the roster import flow. */\r\ntype RosterImportState = 'upload' | 'processing' | 'result';\r\n\r\n/** Simulated processing duration (ms) for the mock flow. */\r\nconst MOCK_PROCESSING_MS = 1800;\r\n\r\n/**\r\n * Roster Import dialog (MOCK data phase).\r\n *\r\n * Lets an admin upload a CSV/XLS/XLSX roster file, shows a processing progress\r\n * bar, then a result summary (added / skipped) with per-row errors and an\r\n * error-log download. Mirrors the events-and-meetings bulk-import-participants\r\n * flow. The real backend is not wired yet — {@link onImport} resolves a mock\r\n * response after a short delay so every Figma state can be exercised.\r\n *\r\n * @export\r\n * @class RosterImportComponent\r\n */\r\n@Component({\r\n selector: 'ieeesa-roster-import',\r\n standalone: true,\r\n imports: [CommonModule, MatButtonModule, MatProgressBarModule],\r\n templateUrl: './roster-import.component.html',\r\n styleUrls: ['./roster-import.component.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class RosterImportComponent implements OnDestroy {\r\n /** Carries the { groupId, groupName } payload from the opening dialog. */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n @Input() componentData: any;\r\n\r\n /** Emitted after an import that added at least one row (parent refreshes). */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n @Output() submitFormResponse = new EventEmitter<any>();\r\n\r\n /** Emitted when the user cancels/closes without a successful add. */\r\n @Output() formCancel = new EventEmitter<void>();\r\n\r\n destroy$ = new Subject<boolean>();\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n constants: any = constants;\r\n screenTexts = this.constants?.rosterImport;\r\n\r\n /** Current state of the import flow. */\r\n importState: RosterImportState = 'upload';\r\n\r\n /** The selected file. */\r\n selectedFile: File | null = null;\r\n\r\n /** File drag-over state. */\r\n isDragOver = false;\r\n\r\n /** Processing progress percentage (0–100) shown next to the progress bar. */\r\n progressValue = 0;\r\n\r\n /** Terminal upload result (mock). */\r\n uploadResult: RosterUploadResponse | null = null;\r\n\r\n /** Row-level errors for the completed job. */\r\n jobErrors: RosterUploadError[] = [];\r\n\r\n /** Inline validation / API error message. */\r\n errorMessage: string | null = null;\r\n\r\n /**\r\n * Info banner shown when the file has headers but no data rows\r\n * (Figma: \"No roster data found...\").\r\n */\r\n noDataMessage: string | null = null;\r\n\r\n /** Maximum file size in bytes (5 MB). */\r\n readonly MAX_FILE_SIZE = 5_242_880;\r\n\r\n /** Accepted file extensions. */\r\n readonly ACCEPTED_EXTENSIONS = ['.csv', '.xls', '.xlsx'];\r\n\r\n /**\r\n * MOCK ONLY: which scenario the next import simulates. Cycles through the\r\n * scenarios so QA can see every result state by importing repeatedly. Remove\r\n * when the real API is wired in.\r\n */\r\n private mockScenarios: RosterImportMockScenario[] = [\r\n RosterImportMockScenario.ALL_SUCCESS,\r\n RosterImportMockScenario.PARTIAL,\r\n RosterImportMockScenario.ALL_SKIPPED,\r\n RosterImportMockScenario.EMPTY,\r\n ];\r\n private mockScenarioIndex = 0;\r\n\r\n /** Required column headers for display. */\r\n get requiredColumns(): string[] {\r\n return this.screenTexts?.requiredColumns ?? [];\r\n }\r\n\r\n /** Comma-separated accepted file types for the input element. */\r\n get acceptedFileTypes(): string {\r\n return this.ACCEPTED_EXTENSIONS.join(',');\r\n }\r\n\r\n /**\r\n * Cleans up subscriptions when the component is destroyed.\r\n * @memberof RosterImportComponent\r\n */\r\n ngOnDestroy(): void {\r\n this.destroy$.next(true);\r\n this.destroy$.complete();\r\n }\r\n\r\n /**\r\n * Handles a file selected via the browse dialog.\r\n * @param {Event} event - The change event from the hidden file input.\r\n * @memberof RosterImportComponent\r\n */\r\n onFileSelected(event: Event): void {\r\n const input = event.target as HTMLInputElement;\r\n if (!input.files || input.files.length === 0) {\r\n return;\r\n }\r\n if (input.files.length > 1) {\r\n this.showSingleFileOnlyError();\r\n return;\r\n }\r\n this.processFile(input.files[0]);\r\n }\r\n\r\n /**\r\n * Handles a file dropped onto the dropzone.\r\n * @param {DragEvent} event - The drop event.\r\n * @memberof RosterImportComponent\r\n */\r\n onFileDrop(event: DragEvent): void {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.isDragOver = false;\r\n const files = event.dataTransfer?.files;\r\n if (!files || files.length === 0) {\r\n return;\r\n }\r\n if (files.length > 1) {\r\n this.showSingleFileOnlyError();\r\n return;\r\n }\r\n this.processFile(files[0]);\r\n }\r\n\r\n /**\r\n * Handles drag-over on the dropzone.\r\n * @param {DragEvent} event - The dragover event.\r\n * @memberof RosterImportComponent\r\n */\r\n onDragOver(event: DragEvent): void {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.isDragOver = true;\r\n }\r\n\r\n /**\r\n * Handles drag-leave on the dropzone.\r\n * @param {DragEvent} event - The dragleave event.\r\n * @memberof RosterImportComponent\r\n */\r\n onDragLeave(event: DragEvent): void {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.isDragOver = false;\r\n }\r\n\r\n /**\r\n * Validates the file type and size, then either sets it or shows an error.\r\n * @param {File} file - The candidate file.\r\n * @memberof RosterImportComponent\r\n */\r\n processFile(file: File): void {\r\n this.errorMessage = null;\r\n this.noDataMessage = null;\r\n this.uploadResult = null;\r\n // Clear any previously selected (valid) file so an invalid new selection\r\n // can't leave the Import button enabled for a stale file.\r\n this.selectedFile = null;\r\n\r\n const fileName = file.name.toLowerCase();\r\n const isValidExtension = this.ACCEPTED_EXTENSIONS.some((ext) =>\r\n fileName.endsWith(ext)\r\n );\r\n if (!isValidExtension) {\r\n this.errorMessage =\r\n this.screenTexts?.validation?.unsupportedType ??\r\n 'Incorrect file type. Please upload a valid .csv or .xlsx file.';\r\n return;\r\n }\r\n\r\n if (file.size === 0) {\r\n this.errorMessage =\r\n this.screenTexts?.validation?.emptyFile ??\r\n 'The selected file is empty. Please upload a file with roster records.';\r\n return;\r\n }\r\n\r\n if (file.size > this.MAX_FILE_SIZE) {\r\n this.errorMessage =\r\n this.screenTexts?.validation?.fileTooLarge ??\r\n 'File size exceeds the maximum allowed size of 5 MB.';\r\n return;\r\n }\r\n\r\n this.selectedFile = file;\r\n }\r\n\r\n /**\r\n * Shows the single-file-only validation message.\r\n * @memberof RosterImportComponent\r\n */\r\n showSingleFileOnlyError(): void {\r\n this.errorMessage =\r\n this.screenTexts?.validation?.singleFileOnly ??\r\n 'Please upload a single file at a time.';\r\n }\r\n\r\n /**\r\n * Removes the currently selected file and resets to the upload state.\r\n * @memberof RosterImportComponent\r\n */\r\n onRemoveFile(): void {\r\n this.selectedFile = null;\r\n this.errorMessage = null;\r\n this.noDataMessage = null;\r\n this.uploadResult = null;\r\n this.importState = 'upload';\r\n }\r\n\r\n /**\r\n * MOCK: \"uploads\" the file by simulating a short processing delay, then\r\n * resolves the next mock scenario. Replace the timer + mock lookup with the\r\n * real service call once the API is available.\r\n * @memberof RosterImportComponent\r\n */\r\n onImport(): void {\r\n if (!this.selectedFile) {\r\n return;\r\n }\r\n this.errorMessage = null;\r\n this.noDataMessage = null;\r\n this.uploadResult = null;\r\n this.jobErrors = [];\r\n this.progressValue = 0;\r\n this.importState = 'processing';\r\n\r\n const scenario = this.nextMockScenario();\r\n\r\n // MOCK: animate the progress bar from 0 → 100 over the processing window,\r\n // then finalize with the mock result. Replace with real upload progress /\r\n // job-status polling once the API is available.\r\n const steps = 20;\r\n const stepMs = MOCK_PROCESSING_MS / steps;\r\n interval(stepMs)\r\n .pipe(\r\n takeWhile(() => this.progressValue < 100),\r\n takeUntil(this.destroy$)\r\n )\r\n .subscribe(() => {\r\n this.progressValue = Math.min(100, this.progressValue + 100 / steps);\r\n });\r\n\r\n timer(MOCK_PROCESSING_MS)\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe(() => {\r\n this.progressValue = 100;\r\n const response = RosterImportMocks.getMockResponse(scenario);\r\n this.finalizeResult(response);\r\n });\r\n }\r\n\r\n /**\r\n * Stores the terminal result and moves to the result state. When the file\r\n * had no data rows, shows the \"no roster data\" info banner instead of the\r\n * summary cards.\r\n * @param {RosterUploadResponse} body - The terminal (mock) result.\r\n * @memberof RosterImportComponent\r\n */\r\n finalizeResult(body: RosterUploadResponse): void {\r\n this.uploadResult = body;\r\n this.jobErrors = body.rowErrors ?? [];\r\n this.importState = 'result';\r\n\r\n if (body.totalRecords === 0) {\r\n this.noDataMessage =\r\n this.screenTexts?.validation?.noDataRecords ??\r\n 'No roster data found. The selected file contains headers but no roster records.';\r\n }\r\n }\r\n\r\n /**\r\n * Whether the result state should show the summary cards (added / skipped).\r\n * Hidden for the \"no data records\" case.\r\n * @return {boolean}\r\n * @memberof RosterImportComponent\r\n */\r\n get showSummaryCards(): boolean {\r\n return !!this.uploadResult && this.uploadResult.totalRecords > 0;\r\n }\r\n\r\n /**\r\n * Whether every processed row was skipped (drives the \"All Rows are skipped\"\r\n * header on the errors card).\r\n * @return {boolean}\r\n * @memberof RosterImportComponent\r\n */\r\n get allRowsSkipped(): boolean {\r\n return (\r\n !!this.uploadResult &&\r\n this.uploadResult.totalRecords > 0 &&\r\n this.uploadResult.successCount === 0\r\n );\r\n }\r\n\r\n /**\r\n * Builds a client-side CSV sample file from the required columns and triggers\r\n * a browser download. (Client-side generation until the template API exists.)\r\n * @memberof RosterImportComponent\r\n */\r\n downloadSampleFile(): void {\r\n const headers = this.requiredColumns\r\n .map((col) => this.toCsvCell(col))\r\n .join(',');\r\n const blob = new Blob([headers + '\\r\\n'], {\r\n type: 'text/csv;charset=utf-8;',\r\n });\r\n const fileName = this.screenTexts?.sampleFileName ?? 'Roster_Sample.csv';\r\n this.triggerDownload(blob, fileName);\r\n }\r\n\r\n /**\r\n * Builds a CSV from the row-level errors and triggers a browser download so\r\n * the user can correct and re-upload.\r\n * @memberof RosterImportComponent\r\n */\r\n downloadErrorLog(): void {\r\n if (!this.jobErrors.length) {\r\n return;\r\n }\r\n const headers: string[] = this.screenTexts?.errorLog?.headers ?? [\r\n 'Row',\r\n 'Field',\r\n 'Error',\r\n ];\r\n const rows = this.jobErrors.map((rowErr) =>\r\n [rowErr.rowNumber, rowErr.field, rowErr.errorMessage]\r\n .map((value) => this.toCsvCell(value))\r\n .join(',')\r\n );\r\n const csvContent = [\r\n headers.map((header) => this.toCsvCell(header)).join(','),\r\n ...rows,\r\n ].join('\\r\\n');\r\n const fileName =\r\n this.screenTexts?.errorLog?.fileName ?? 'Roster_Import_Error_Log.csv';\r\n const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' });\r\n this.triggerDownload(blob, fileName);\r\n }\r\n\r\n /**\r\n * Escapes a value for safe inclusion in a CSV cell.\r\n * @param {(string | number | undefined | null)} value - The raw cell value.\r\n * @return {string} - the CSV-safe cell string.\r\n * @memberof RosterImportComponent\r\n */\r\n toCsvCell(value: string | number | undefined | null): string {\r\n const raw = value === undefined || value === null ? '' : String(value);\r\n if (/[\",\\r\\n]/.test(raw)) {\r\n return `\"${raw.replace(/\"/g, '\"\"')}\"`;\r\n }\r\n return raw;\r\n }\r\n\r\n /**\r\n * Closes the dialog. Emits submitFormResponse when at least one row was added\r\n * so the parent refreshes; otherwise emits formCancel.\r\n * @memberof RosterImportComponent\r\n */\r\n onCancel(): void {\r\n if (this.uploadResult && this.uploadResult.successCount > 0) {\r\n this.submitFormResponse.emit(this.uploadResult);\r\n } else {\r\n this.formCancel.emit();\r\n }\r\n }\r\n\r\n /**\r\n * Triggers a browser download for a generated blob.\r\n * @param {Blob} blob - The file content.\r\n * @param {string} fileName - The suggested filename.\r\n * @memberof RosterImportComponent\r\n */\r\n private triggerDownload(blob: Blob, fileName: string): void {\r\n const url = URL.createObjectURL(blob);\r\n const link = document.createElement('a');\r\n link.href = url;\r\n link.download = fileName;\r\n link.click();\r\n URL.revokeObjectURL(url);\r\n }\r\n\r\n /**\r\n * MOCK ONLY: returns the next scenario in the cycle so repeated imports show\r\n * every result state.\r\n * @return {RosterImportMockScenario}\r\n * @memberof RosterImportComponent\r\n */\r\n private nextMockScenario(): RosterImportMockScenario {\r\n const scenario = this.mockScenarios[this.mockScenarioIndex];\r\n this.mockScenarioIndex =\r\n (this.mockScenarioIndex + 1) % this.mockScenarios.length;\r\n return scenario;\r\n }\r\n}\r\n","<div class=\"ieeesa-roster-import\">\r\n <!-- Sub-heading band: \"Bulk Import Participants\" on the left, Import Roster\r\n action on the right (appears once a file is selected) — matches the Figma.\r\n The \"← Back to Rosters / Import Roster\" title row + X are rendered by the\r\n shared ModalComponent above this. -->\r\n <div class=\"ieeesa-roster-import__subheader\">\r\n <span class=\"ieeesa-roster-import__subheader-title\">\r\n {{ screenTexts?.subHeading ?? 'Bulk Import Participants' }}\r\n </span>\r\n <button\r\n *ngIf=\"selectedFile\"\r\n mat-button\r\n type=\"button\"\r\n class=\"mat-tertiary-button ieeesa-roster-import__import-btn\"\r\n [disabled]=\"importState === 'processing'\"\r\n (click)=\"onImport()\"\r\n [attr.aria-label]=\"screenTexts?.buttons?.import ?? 'Import Roster'\"\r\n >\r\n <svg class=\"ieeesa-roster-import__import-btn-icon\" width=\"14\" height=\"14\" aria-hidden=\"true\">\r\n <use xlink:href=\"assets/images/sprites/sprites.svg#icon-import\"></use>\r\n </svg>\r\n {{ screenTexts?.buttons?.import ?? 'Import Roster' }}\r\n </button>\r\n </div>\r\n\r\n <!-- Required Columns Info -->\r\n <div class=\"ieeesa-roster-import__columns-card\">\r\n <div class=\"ieeesa-roster-import__columns-content\">\r\n <p class=\"ieeesa-roster-import__columns-title\">\r\n {{ screenTexts?.requiredColumnsTitle ?? 'Required columns' }}\r\n </p>\r\n <div class=\"ieeesa-roster-import__columns-chips\">\r\n <span\r\n *ngFor=\"let col of requiredColumns\"\r\n class=\"ieeesa-roster-import__chip\"\r\n >\r\n {{ col }}\r\n </span>\r\n </div>\r\n </div>\r\n <div class=\"ieeesa-roster-import__sample-wrapper\">\r\n <button\r\n mat-button\r\n class=\"mat-tertiary-button ieeesa-roster-import__download-btn\"\r\n (click)=\"downloadSampleFile()\"\r\n type=\"button\"\r\n [attr.aria-label]=\"screenTexts?.ariaLabel?.downloadSample ?? 'Download Sample File'\"\r\n >\r\n <svg\r\n class=\"ieeesa-roster-import__download-btn-icon\"\r\n aria-hidden=\"true\"\r\n >\r\n <use xlink:href=\"assets/images/sprites/sprites.svg#icon-file-doc\"></use>\r\n </svg>\r\n {{ screenTexts?.downloadSampleLabel ?? 'Download Sample File' }}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <p class=\"ieeesa-roster-import__upload-label\">\r\n {{ screenTexts?.uploadLabel ?? 'Upload your file' }}\r\n </p>\r\n\r\n <!-- Upload State -->\r\n <ng-container *ngIf=\"importState === 'upload'\">\r\n <!-- Hidden file input -->\r\n <input\r\n #fileInput\r\n type=\"file\"\r\n [accept]=\"acceptedFileTypes\"\r\n (change)=\"onFileSelected($event)\"\r\n hidden\r\n [attr.aria-label]=\"screenTexts?.uploadLabel ?? 'Upload your file'\"\r\n />\r\n\r\n <!-- Drag & Drop Zone -->\r\n <div\r\n class=\"ieeesa-roster-import__dropzone\"\r\n [class.ieeesa-roster-import__dropzone--active]=\"isDragOver\"\r\n (dragover)=\"onDragOver($event)\"\r\n (dragleave)=\"onDragLeave($event)\"\r\n (drop)=\"onFileDrop($event)\"\r\n (click)=\"fileInput.click()\"\r\n role=\"button\"\r\n tabindex=\"0\"\r\n (keydown.enter)=\"fileInput.click()\"\r\n (keydown.space)=\"fileInput.click()\"\r\n [attr.aria-label]=\"screenTexts?.ariaLabel?.dropzone ?? 'Drag and drop file upload area'\"\r\n >\r\n <ng-container *ngIf=\"!selectedFile\">\r\n <svg class=\"ieeesa-roster-import__upload-icon\" width=\"22\" height=\"22\">\r\n <use xlink:href=\"assets/images/sprites/sprites.svg#icon-upload-gray\"></use>\r\n </svg>\r\n <p class=\"ieeesa-roster-import__dropzone-text\">\r\n {{ screenTexts?.dropzoneText ?? 'Drag & drop a file here, or click to browse' }}\r\n </p>\r\n <p class=\"ieeesa-roster-import__dropzone-hint\">\r\n {{ screenTexts?.dropzoneHint ?? 'Accepted formats: .csv, .xls, .xlsx' }}\r\n </p>\r\n </ng-container>\r\n <ng-container *ngIf=\"selectedFile\">\r\n <svg class=\"ieeesa-roster-import__upload-icon\" width=\"22\" height=\"22\">\r\n <use xlink:href=\"assets/images/sprites/sprites.svg#icon-upload-gray\"></use>\r\n </svg>\r\n <div class=\"ieeesa-roster-import__file-row\">\r\n <p class=\"ieeesa-roster-import__file-name\">\r\n <svg width=\"14\" height=\"14\">\r\n <use xlink:href=\"assets/images/sprites/sprites.svg#icon-file-doc\"></use>\r\n </svg>\r\n {{ selectedFile.name }}\r\n </p>\r\n <button\r\n mat-button\r\n class=\"ieeesa-roster-import__remove-file-btn\"\r\n (click)=\"onRemoveFile(); $event.stopPropagation()\"\r\n type=\"button\"\r\n [attr.aria-label]=\"screenTexts?.ariaLabel?.remove ?? 'Remove selected file'\"\r\n >\r\n ×\r\n </button>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- Inline Error Message -->\r\n <div\r\n *ngIf=\"errorMessage\"\r\n class=\"ieeesa-roster-import__error-banner\"\r\n role=\"alert\"\r\n >\r\n {{ errorMessage }}\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Processing / Result share the file display + progress bar -->\r\n <ng-container *ngIf=\"importState === 'processing' || importState === 'result'\">\r\n <div\r\n class=\"ieeesa-roster-import__dropzone ieeesa-roster-import__dropzone--result\"\r\n >\r\n <svg class=\"ieeesa-roster-import__upload-icon\" width=\"22\" height=\"22\">\r\n <use xlink:href=\"assets/images/sprites/sprites.svg#icon-upload-gray\"></use>\r\n </svg>\r\n <p class=\"ieeesa-roster-import__file-name\">\r\n <svg width=\"14\" height=\"14\">\r\n <use xlink:href=\"assets/images/sprites/sprites.svg#icon-file-doc\"></use>\r\n </svg>\r\n {{ selectedFile?.name }}\r\n </p>\r\n </div>\r\n\r\n <!-- Progress label + percentage -->\r\n <div class=\"ieeesa-roster-import__progress-head\">\r\n <span class=\"ieeesa-roster-import__progress-label\">\r\n {{ screenTexts?.processingLabel ?? 'Processing file records....' }}\r\n </span>\r\n <span class=\"ieeesa-roster-import__progress-percent\">\r\n {{ progressValue | number: '1.0-0' }}%\r\n </span>\r\n </div>\r\n <mat-progress-bar\r\n class=\"ieeesa-roster-import__progress-bar\"\r\n mode=\"determinate\"\r\n [value]=\"progressValue\"\r\n [attr.aria-label]=\"screenTexts?.processingLabel ?? 'Processing file records....'\"\r\n ></mat-progress-bar>\r\n </ng-container>\r\n\r\n <!-- Result State (summary + errors) -->\r\n <ng-container *ngIf=\"importState === 'result' && uploadResult\">\r\n <!-- No data records banner (headers only, zero rows) -->\r\n <div\r\n *ngIf=\"noDataMessage\"\r\n class=\"ieeesa-roster-import__no-data-banner\"\r\n role=\"status\"\r\n >\r\n {{ noDataMessage }}\r\n </div>\r\n\r\n <!-- Summary cards -->\r\n <div *ngIf=\"showSummaryCards\" class=\"ieeesa-roster-import__summary-cards\">\r\n <div\r\n class=\"ieeesa-roster-import__summary-card ieeesa-roster-import__summary-card--success\"\r\n >\r\n <p class=\"ieeesa-roster-import__summary-card-count\">\r\n {{ uploadResult.successCount }}\r\n </p>\r\n <p class=\"ieeesa-roster-import__summary-card-label\">\r\n {{ screenTexts?.result?.successCardLabel ?? 'Rosters added successfully' }}\r\n </p>\r\n </div>\r\n <div\r\n class=\"ieeesa-roster-import__summary-card ieeesa-roster-import__summary-card--skipped\"\r\n >\r\n <p class=\"ieeesa-roster-import__summary-card-count\">\r\n {{ uploadResult.failureCount }}\r\n </p>\r\n <p class=\"ieeesa-roster-import__summary-card-label\">\r\n {{ screenTexts?.result?.skippedCardLabel ?? 'Skipped Rows' }}\r\n </p>\r\n </div>\r\n </div>\r\n\r\n <!-- Row Errors Card -->\r\n <div *ngIf=\"jobErrors.length\" class=\"ieeesa-roster-import__errors-card\">\r\n <p class=\"ieeesa-roster-import__errors-header\">\r\n <ng-container *ngIf=\"allRowsSkipped; else someErrors\">\r\n {{ screenTexts?.result?.allRowsSkippedHeader ?? 'All Rows are skipped' }}\r\n </ng-container>\r\n <ng-template #someErrors>\r\n {{ screenTexts?.result?.errorsHeader ?? 'Row errors — these rows will be skipped' }}\r\n </ng-template>\r\n </p>\r\n <div class=\"ieeesa-roster-import__errors-body\">\r\n <div\r\n *ngFor=\"let rowErr of jobErrors\"\r\n class=\"ieeesa-roster-import__error-row\"\r\n >\r\n <p class=\"ieeesa-roster-import__error-row-title\">\r\n Row {{ rowErr.rowNumber }} — {{ rowErr.errorMessage }}\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Footer actions -->\r\n <div class=\"ieeesa-roster-import__actions\">\r\n <button\r\n mat-button\r\n class=\"mat-tertiary-button ieeesa-roster-import__cancel-btn\"\r\n (click)=\"onCancel()\"\r\n type=\"button\"\r\n >\r\n {{ screenTexts?.buttons?.cancel ?? 'Cancel' }}\r\n </button>\r\n <button\r\n *ngIf=\"importState === 'result' && jobErrors.length\"\r\n mat-button\r\n type=\"button\"\r\n class=\"mat-primary-button ieeesa-roster-import__error-log-btn\"\r\n (click)=\"downloadErrorLog()\"\r\n [attr.aria-label]=\"screenTexts?.ariaLabel?.downloadErrorLog ?? 'Download Error log'\"\r\n >\r\n {{ screenTexts?.buttons?.downloadErrorLog ?? 'Download Error log' }}\r\n </button>\r\n </div>\r\n</div>\r\n","/* eslint-disable no-unused-vars */\r\nexport enum RosterFunctionType {\r\n EDIT_ROSTER_USER_ROLE = 'EDIT_ROSTER_USER_ROLE',\r\n ADD_USER_TO_ROSTER = 'ADD_USER_TO_ROSTER',\r\n}","import {\r\n Component,\r\n ElementRef,\r\n EventEmitter,\r\n OnDestroy,\r\n OnInit,\r\n Output,\r\n ViewChild,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { FormControl, FormGroup, Validators } from '@angular/forms';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatDialogModule } from '@angular/material/dialog';\r\nimport { Subject } from 'rxjs';\r\nimport { takeUntil } from 'rxjs/operators';\r\nimport { HttpErrorResponse } from '@angular/common/http';\r\nimport {\r\n AlertsService,\r\n GlobalErrorHandlerService,\r\n} from '@ieeesa-npm/utility';\r\nimport {\r\n FormGrid,\r\n FormControlType,\r\n AlignType,\r\n SearchType,\r\n CheckboxOption,\r\n SelectOption,\r\n FormModel,\r\n FieldConfig,\r\n AutoCompleteOption,\r\n DynamicFormComponent,\r\n} from '@ieeesa-npm/presentation';\r\nimport * as screenTexts from '../../assets/constants.json';\r\nimport {\r\n GroupsValidationPatterns,\r\n representingOrgRequiredValidator,\r\n skipWhenArray,\r\n} from '../../assets/form-validations';\r\nimport { FormStatus, AlertType } from '@ieeesa-npm/models';\r\nimport { GroupsService } from '../../services/groups.service';\r\nimport {\r\n AddOrEditUserIndividualRosterPayload,\r\n AddOrEditUserPayload,\r\n} from '../../models/add-or-edit-user-group.model';\r\nimport { UserInfo } from '../../models/user-info.model';\r\nimport { GroupRosterType } from '../../models/roster-type.model';\r\nimport { OrganizationRequestPayload } from '../../models/organization.model';\r\nimport { OrgMultiSelectComponent } from '../org-multi-select/org-multi-select.component';\r\n\r\n/**\r\n * Component implements the view and functionalities to add group users to roster.\r\n * @export\r\n * @class AddUserRosterComponent\r\n * @implements {OnInit}\r\n * @implements {OnDestroy}\r\n */\r\n@Component({\r\n selector: 'ieeesa-add-user-roster',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n DynamicFormComponent,\r\n MatDialogModule,\r\n OrgMultiSelectComponent,\r\n ],\r\n templateUrl: './add-user-roster.component.html',\r\n styleUrls: ['./add-user-roster.component.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n providers: [AlertsService],\r\n})\r\nexport class AddUserRosterComponent implements OnInit, OnDestroy {\r\n destroy$ = new Subject<boolean>();\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n constants: any = screenTexts;\r\n addUserRosterTexts = this.constants?.addUserRoster;\r\n leftButtonLabel = this.addUserRosterTexts?.label?.leftButtonLabel;\r\n rightButtonLabel = this.addUserRosterTexts?.label?.rightButtonLabel;\r\n isSubmitButtonDisabled = false;\r\n colWidth: FormGrid = { xs: 12, xl: 12, sm: 12, md: 12, lg: 12 };\r\n searchUserFormGroup!: FormModel;\r\n addUserFormGroup!: FormModel;\r\n actionButtonAlign = AlignType.LEFT;\r\n addUserFormGroupRef!: FormGroup;\r\n isSearchUserForm = true;\r\n userRoles: CheckboxOption[] = [];\r\n selectedUserRoles: string[] = [];\r\n userInfo: UserInfo = {\r\n email: '',\r\n name: '',\r\n userId: '',\r\n };\r\n isAddUserFormEmailSearch = false;\r\n classifications: SelectOption[] = [];\r\n memberTypes: SelectOption[] = [];\r\n organizations: SelectOption[] = [];\r\n hasClassification = false;\r\n groupRosterType!: GroupRosterType;\r\n isUserExist = false;\r\n selectedOrganizations: AutoCompleteOption[] = [];\r\n timeOutId!: ReturnType<typeof setTimeout>;\r\n\r\n /**\r\n * True when the selected group's roster type is INDIVIDUAL (the only roster\r\n * type that shows the Representing Organization field).\r\n * @readonly\r\n * @memberof AddUserRosterComponent\r\n */\r\n get isIndividualRoster(): boolean {\r\n return this.groupRosterType === GroupRosterType.INDIVIDUAL;\r\n }\r\n\r\n /**\r\n * True when the org field holds an uncommitted, invalid free-text token. Used\r\n * to keep Save disabled even when a valid chip already exists.\r\n */\r\n hasInvalidOrgFreeText = false;\r\n\r\n /**\r\n * Handles the org field's invalid-free-text state and recomputes Save-button\r\n * state so the form cannot be submitted while an invalid token remains.\r\n * @param {boolean} isInvalid -whether an uncommitted invalid token is present.\r\n * @memberof AddUserRosterComponent\r\n */\r\n onOrgInvalidFreeText(isInvalid: boolean): void {\r\n this.hasInvalidOrgFreeText = isInvalid;\r\n this.updateSubmitButtonStatus();\r\n }\r\n @ViewChild(DynamicFormComponent) dynamicFormComponent!: DynamicFormComponent;\r\n @Output() submitFormResponse = new EventEmitter();\r\n @Output() formCancel = new EventEmitter();\r\n\r\n constructor(\r\n // eslint-disable-next-line no-unused-vars\r\n private groupService: GroupsService,\r\n // eslint-disable-next-line no-unused-vars\r\n private globalErrorHandlerService: GlobalErrorHandlerService,\r\n // eslint-disable-next-line no-unused-vars\r\n public alertService: AlertsService,\r\n // eslint-disable-next-line no-unused-vars\r\n public elementRef: ElementRef // eslint-disable-next-line no-empty-function, no-unused-vars\r\n ) {}\r\n\r\n /**\r\n * Initializes user roles and searchUserFormGroup.\r\n * @memberof AddUserRosterComponent\r\n */\r\n ngOnInit(): void {\r\n this.userRoles = this.groupService.getGroupTypeUserRoles();\r\n const groupType = this.groupService.getBusinessRuleOfSelectedGroup();\r\n this.hasClassification = groupType?.hasClassification ?? false;\r\n this.groupRosterType = groupType?.rosterType as GroupRosterType;\r\n if (!this.groupRosterType)\r\n this.showAlertMessage(this.constants?.errors?.ER1001, AlertType.ERROR);\r\n else {\r\n if (this.groupRosterType === GroupRosterType.INDIVIDUAL) {\r\n if (this.hasClassification) this.getClassifications();\r\n this.getMemberTypes();\r\n }\r\n this.createSearchUserFormGroup();\r\n }\r\n this.alertService.isAlertClosed\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe((isClosed: boolean) => {\r\n if (isClosed && !this.isSearchUserForm) {\r\n this.elementRef?.nativeElement?.querySelector('input')?.focus();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Creates search user form group\r\n * @memberof AddUserRosterComponent\r\n */\r\n createSearchUserFormGroup(): void {\r\n this.searchUserFormGroup = {\r\n formGroup: [\r\n {\r\n legend: '',\r\n controls: [\r\n {\r\n type: FormControlType.INPUT,\r\n label: this.addUserRosterTexts?.label?.email + '*',\r\n controlName: 'emailAddress',\r\n requiredErrorMessage:\r\n this.addUserRosterTexts?.message?.error?.required,\r\n isEmail: true,\r\n supportMessage:\r\n this.addUserRosterTexts?.supportText?.emailAddress,\r\n patternErrorMessage:\r\n this.addUserRosterTexts?.message?.error?.pattern?.email,\r\n validation: [\r\n Validators.required,\r\n Validators.pattern(GroupsValidationPatterns.email),\r\n ],\r\n ariaLabel: this.addUserRosterTexts?.label?.ariaLabel?.email,\r\n ariaDescribedById:\r\n this.addUserRosterTexts?.label?.ariaDescribedById?.email,\r\n },\r\n ],\r\n },\r\n ],\r\n };\r\n }\r\n\r\n /**\r\n * Checks form validity and searches the user by entered email.\r\n * @param {FormGroup[]} form\r\n * @memberof AddUserRosterComponent\r\n */\r\n onSearchUserFormSubmit(form: FormGroup[]): void {\r\n this.isAddUserFormEmailSearch = false;\r\n if (form[0]?.status === FormStatus.VALID) {\r\n this.searchUserByEmail(form[0].getRawValue()?.emailAddress);\r\n }\r\n }\r\n\r\n /**\r\n * Searches the user by entered email and gets the user details when the email id is found.\r\n * @param {string} email\r\n * @memberof AddUserRosterComponent\r\n */\r\n searchUserByEmail(email: string): void {\r\n this.groupService\r\n .getUserByEmail(email)\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (res) => {\r\n if (res?.status) {\r\n this.userInfo = res?.body;\r\n this.isUserExist = true;\r\n if (this.userInfo?.userId) this.validateUserExistence();\r\n else this.initializeAddUserFormGroup();\r\n }\r\n },\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n error: (error: any) => {\r\n this.isUserExist = false;\r\n const errorCodes = error?.error?.body?.errorCodes;\r\n if (errorCodes?.includes('2001')) {\r\n this.isSearchUserForm = false;\r\n this.rightButtonLabel =\r\n this.addUserRosterTexts?.label?.saveButtonLabel;\r\n this.isSubmitButtonDisabled = true;\r\n if (\r\n !this.isAddUserFormEmailSearch ||\r\n !(\r\n this.addUserFormGroupRef.contains('firstName') &&\r\n this.addUserFormGroupRef.contains('lastName')\r\n )\r\n ) {\r\n this.userInfo.email = email;\r\n this.updateAddUserFormGroupValues(\r\n JSON.stringify(this.addUserFormGroupRef?.value)\r\n );\r\n } else {\r\n this.addUserFormGroupRef?.get('firstName')?.setValue('');\r\n this.addUserFormGroupRef?.get('lastName')?.setValue('');\r\n }\r\n this.showAlertMessage(\r\n this.constants?.errors?.['2001'],\r\n AlertType.ERROR\r\n );\r\n } else {\r\n this.handleErrors(error);\r\n }\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Validates whether the user is exists in the selected group and then creates add user form when the user does not exist in the selected group.\r\n * @memberof AddUserRosterComponent\r\n */\r\n validateUserExistence(): void {\r\n const payload = {\r\n payload: {\r\n groupId: this.groupService.getSelectedGroupInfo()?.groupId as string,\r\n userId: this.userInfo?.userId as string,\r\n },\r\n };\r\n this.groupService\r\n .getGroupUserDetails(payload)\r\n .pipe(takeUntil(this.destroy$))\r\n ?.subscribe({\r\n next: () => {\r\n this.showAlertMessage(\r\n this.constants?.errors?.['1022'],\r\n AlertType.ERROR\r\n );\r\n this.isSubmitButtonDisabled = true;\r\n },\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n error: (error: any) => {\r\n const errorCodes = error?.error?.body?.errorCodes;\r\n if (errorCodes?.includes('1026')) {\r\n this.initializeAddUserFormGroup();\r\n } else this.handleErrors(error);\r\n },\r\n });\r\n }\r\n /**\r\n * Initialize the form fields required for add new user to the roster based on the searched email.\r\n * @memberof AddUserRosterComponent\r\n */\r\n initializeAddUserFormGroup() {\r\n this.isSearchUserForm = false;\r\n this.rightButtonLabel = this.addUserRosterTexts?.label?.saveButtonLabel;\r\n const addUserFormGroupPrevValues = JSON.stringify(\r\n this.addUserFormGroupRef?.value\r\n );\r\n if (!this.isAddUserFormEmailSearch) {\r\n this.selectedUserRoles = [];\r\n this.isSubmitButtonDisabled = true;\r\n this.createAddUserFormGroup();\r\n if (this.groupRosterType === GroupRosterType.INDIVIDUAL) {\r\n this.updateAddUserFormGroup();\r\n }\r\n } else {\r\n this.updateAddUserFormGroupValues(addUserFormGroupPrevValues);\r\n this.addUserFormGroupRef\r\n ?.get('emailSearch')\r\n ?.setValue(this.userInfo?.email);\r\n this.addUserFormGroupRef?.get('fullName')?.setValue(this.userInfo?.name);\r\n if (this.timeOutId) clearTimeout(this.timeOutId);\r\n this.timeOutId = setTimeout(() => {\r\n this.updateSubmitButtonStatus();\r\n }, 0);\r\n }\r\n }\r\n\r\n /**\r\n * Creates add user form group and updates it with prev form values.\r\n * @param {string} stringifiedAddUserFormPrevValues\r\n * @memberof AddUserRosterComponent\r\n */\r\n updateAddUserFormGroupValues(addUserFormValues: string): void {\r\n this.createAddUserFormGroup(this.userInfo?.email);\r\n if (this.groupRosterType === GroupRosterType.INDIVIDUAL) {\r\n const formValues = addUserFormValues ? JSON.parse(addUserFormValues) : '';\r\n this.updateAddUserFormGroup({\r\n classification: formValues?.classification,\r\n memberType: formValues?.memberType,\r\n representingOrg: formValues?.representingOrg,\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Initialize the add user form group array.\r\n * @param {string} [email]\r\n * @memberof AddUserRosterComponent\r\n */\r\n createAddUserFormGroup(email?: string): void {\r\n this.addUserFormGroup = {\r\n formGroup: [\r\n {\r\n legend: '',\r\n controls: [\r\n {\r\n type: FormControlType.SEARCH,\r\n label: this.addUserRosterTexts?.label?.email + '*',\r\n controlName: 'emailSearch',\r\n value: this.isUserExist ? this.userInfo?.email : email,\r\n searchType: SearchType.ON_CLICK,\r\n validation: [\r\n Validators.required,\r\n Validators.pattern(GroupsValidationPatterns.email),\r\n ],\r\n supportMessage:\r\n this.addUserRosterTexts?.supportText?.emailAddress,\r\n requiredErrorMessage:\r\n this.addUserRosterTexts?.message?.error?.required,\r\n patternErrorMessage:\r\n this.addUserRosterTexts?.message?.error?.pattern?.email,\r\n ariaLabel: this.addUserRosterTexts?.label?.ariaLabel?.email,\r\n ariaDescribedById:\r\n this.addUserRosterTexts?.label?.ariaDescribedById?.email,\r\n },\r\n ...(this.isUserExist\r\n ? [\r\n {\r\n type: FormControlType.TEXT_AREA,\r\n label: this.addUserRosterTexts?.label?.fullName + '*',\r\n controlName: 'fullName',\r\n value: this.userInfo?.name,\r\n validation: [Validators.required],\r\n requiredErrorMessage:\r\n this.addUserRosterTexts?.message?.error?.required,\r\n isReadonly: true,\r\n ariaMultiline: false,\r\n ariaLabel:\r\n this.addUserRosterTexts?.label?.ariaLabel?.fullName,\r\n ariaDescribedById:\r\n this.addUserRosterTexts?.label?.ariaDescribedById\r\n ?.fullName,\r\n },\r\n ]\r\n : [\r\n {\r\n type: FormControlType.INPUT,\r\n label: this.addUserRosterTexts?.label?.firstName + '*',\r\n controlName: 'firstName',\r\n validation: [\r\n Validators.required,\r\n Validators.pattern(\r\n GroupsValidationPatterns.firstOrLastName\r\n ),\r\n ],\r\n requiredErrorMessage:\r\n this.addUserRosterTexts?.message?.error?.required,\r\n patternErrorMessage:\r\n this.addUserRosterTexts?.message?.error?.pattern\r\n ?.firstOrLastName,\r\n ariaLabel:\r\n this.addUserRosterTexts?.label?.ariaLabel?.firstName,\r\n ariaDescribedById:\r\n this.addUserRosterTexts?.label?.ariaDescribedById\r\n ?.firstName,\r\n supportMessage:\r\n this.addUserRosterTexts?.supportText?.firstName,\r\n },\r\n {\r\n type: FormControlType.INPUT,\r\n label: this.addUserRosterTexts?.label?.lastName + '*',\r\n controlName: 'lastName',\r\n validation: [\r\n Validators.required,\r\n Validators.pattern(\r\n GroupsValidationPatterns.firstOrLastName\r\n ),\r\n ],\r\n requiredErrorMessage:\r\n this.addUserRosterTexts?.message?.error?.required,\r\n patternErrorMessage:\r\n this.addUserRosterTexts?.message?.error?.pattern\r\n ?.firstOrLastName,\r\n ariaLabel:\r\n this.addUserRosterTexts?.label?.ariaLabel?.lastName,\r\n ariaDescribedById:\r\n this.addUserRosterTexts?.label?.ariaDescribedById\r\n ?.lastName,\r\n supportMessage:\r\n this.addUserRosterTexts?.supportText?.lastName,\r\n },\r\n ]),\r\n {\r\n type: FormControlType.CHECKBOX,\r\n label:\r\n this.groupRosterType === GroupRosterType.INDIVIDUAL\r\n ? this.addUserRosterTexts?.label?.role\r\n : this.addUserRosterTexts?.label?.role + '*',\r\n controlName: 'roles',\r\n checkboxOptions: this.userRoles,\r\n minSelectionRequired: 1,\r\n ariaLabel: this.addUserRosterTexts?.label?.ariaLabel?.role,\r\n ariaDescribedById:\r\n this.addUserRosterTexts?.label?.ariaDescribedById?.role,\r\n supportMessage:\r\n this.groupRosterType === GroupRosterType.INDIVIDUAL\r\n ? this.addUserRosterTexts?.supportText\r\n ?.roleForIndividualRoster\r\n : this.addUserRosterTexts?.supportText?.role,\r\n requiredErrorMessage:\r\n this.addUserRosterTexts?.message?.error?.required,\r\n validation:\r\n this.groupRosterType === GroupRosterType.INDIVIDUAL\r\n ? []\r\n : [Validators.required],\r\n },\r\n ],\r\n },\r\n ],\r\n };\r\n }\r\n\r\n /**\r\n * Adds classification, Member Type and Representing Organization form controls while adding new user to an individual group roster.\r\n * @param {{\r\n * classification: SelectOption;\r\n * memberType: SelectOption;\r\n * representingOrg: SelectOption;\r\n * }} [addUserFormGroupPrevValues]\r\n * @memberof AddUserRosterComponent\r\n */\r\n updateAddUserFormGroup(addUserFormGroupPrevValues?: {\r\n classification: SelectOption;\r\n memberType: SelectOption;\r\n representingOrg: SelectOption;\r\n }): void {\r\n if (this.hasClassification)\r\n this.updateAddUserFormControls(\r\n this.addUserFormGroup.formGroup[0].controls.length - 1,\r\n {\r\n type: FormControlType.SELECT,\r\n label: this.addUserRosterTexts?.label?.classification + '*',\r\n controlName: 'classification',\r\n dropdownOptions: this.classifications,\r\n value: this.classifications?.find(\r\n (classification) =>\r\n classification.id ===\r\n addUserFormGroupPrevValues?.classification?.id\r\n ),\r\n validation: [Validators.required],\r\n placeholder: '',\r\n supportMessage: this.addUserRosterTexts?.supportText?.classification,\r\n requiredErrorMessage:\r\n this.addUserRosterTexts?.message?.error?.required,\r\n ariaLabel: this.addUserRosterTexts?.label?.ariaLabel?.classification,\r\n ariaDescribedById:\r\n this.addUserRosterTexts?.label?.ariaDescribedById?.classification,\r\n }\r\n );\r\n this.updateAddUserFormControls(\r\n this.addUserFormGroup.formGroup[0].controls.length - 1,\r\n {\r\n type: FormControlType.SELECT,\r\n label: this.addUserRosterTexts?.label?.memberType + '*',\r\n controlName: 'memberType',\r\n dropdownOptions: this.memberTypes,\r\n value: this.memberTypes?.find(\r\n (memberType) =>\r\n memberType.id === addUserFormGroupPrevValues?.memberType?.id\r\n ),\r\n validation: [Validators.required],\r\n placeholder: '',\r\n supportMessage: this.addUserRosterTexts?.supportText?.memberType,\r\n requiredErrorMessage: this.addUserRosterTexts?.message?.error?.required,\r\n ariaLabel: this.addUserRosterTexts?.label?.ariaLabel?.memberType,\r\n ariaDescribedById:\r\n this.addUserRosterTexts?.label?.ariaDescribedById?.memberType,\r\n }\r\n );\r\n // The \"Representing Organization\" field is rendered by the custom\r\n // OrgMultiSelectComponent in the template (not by the dynamic form), so we\r\n // no longer add a MULTI_SELECT_AUTO_COMPLETE control to the dynamic-form\r\n // config here. The reactive `representingOrg` control is registered on the\r\n // captured form group ref in registerRepresentingOrgControl() so all\r\n // existing submit/Save-button logic (which reads form.get('representingOrg'))\r\n // keeps working unchanged. Its value stays in sync via selectedOrganizations.\r\n }\r\n /**\r\n * Updates the add user form group controls by adding fieldConfig at required index.\r\n * @param {number} indexPosition\r\n * @param {FieldConfig} fieldConfig\r\n * @memberof AddUserRosterComponent\r\n */\r\n updateAddUserFormControls(\r\n indexPosition: number,\r\n fieldConfig: FieldConfig\r\n ): void {\r\n this.addUserFormGroup.formGroup[0].controls.splice(\r\n indexPosition,\r\n 0,\r\n fieldConfig\r\n );\r\n }\r\n\r\n /**\r\n * Handles add user form email search\r\n * @param {string} email\r\n * @memberof AddUserRosterComponent\r\n */\r\n formSearchApply(email: string): void {\r\n this.isAddUserFormEmailSearch = true;\r\n if (email.trim()) this.searchUserByEmail(email.trim());\r\n else {\r\n this.userInfo.name = '';\r\n this.addUserFormGroupRef?.get('fullName')?.setValue('');\r\n this.isSubmitButtonDisabled = true;\r\n }\r\n }\r\n\r\n /**\r\n * Assigns role to user on form submission.\r\n * @param {FormGroup[]} form\r\n * @memberof AddUserRosterComponent\r\n */\r\n onAddUserFormSubmit(form: FormGroup[]): void {\r\n form[0]?.markAllAsTouched();\r\n // Block submit if an uncommitted, invalid free-text token remains in the\r\n // org field even when other controls / selected chips are valid.\r\n if (this.hasInvalidOrgFreeText) {\r\n return;\r\n }\r\n if (\r\n (form[0].get('representingOrg')?.status === FormStatus?.INVALID &&\r\n this.isAllOtherControlsValid() &&\r\n this.selectedOrganizations.length > 0) ||\r\n form[0].status === FormStatus?.VALID\r\n ) {\r\n this.groupService\r\n .addNewGroupUser(this.getAddNewUserPayload(form[0]?.getRawValue()))\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (res) => {\r\n if (res?.status) {\r\n this.submitFormResponse.emit(res);\r\n }\r\n },\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n error: (error: any) => {\r\n this.handleErrors(error);\r\n },\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Get add user form group reference.\r\n * @param {FormGroup[]} form\r\n * @memberof AddUserRosterComponent\r\n */\r\n getAddUserFormGroupRef(form: FormGroup[]) {\r\n this.addUserFormGroupRef = form[0];\r\n this.registerRepresentingOrgControl();\r\n }\r\n\r\n /**\r\n * Registers the `representingOrg` reactive control on the dynamic form's\r\n * FormGroup for INDIVIDUAL rosters. The field itself is rendered by the custom\r\n * OrgMultiSelectComponent (not the dynamic form), but keeping this control on\r\n * the same FormGroup — with the original validators — means all existing\r\n * submit/Save-button logic that reads `form.get('representingOrg')` keeps\r\n * working unchanged. Its value is the selected-organizations array, kept in\r\n * sync by getSelectedOrganizations().\r\n * @memberof AddUserRosterComponent\r\n */\r\n registerRepresentingOrgControl(): void {\r\n if (\r\n this.groupRosterType !== GroupRosterType.INDIVIDUAL ||\r\n !this.addUserFormGroupRef ||\r\n this.addUserFormGroupRef.contains('representingOrg')\r\n ) {\r\n return;\r\n }\r\n this.addUserFormGroupRef.addControl(\r\n 'representingOrg',\r\n new FormControl(\r\n this.selectedOrganizations.length ? this.selectedOrganizations : '',\r\n {\r\n updateOn: 'blur',\r\n validators: [\r\n representingOrgRequiredValidator(),\r\n skipWhenArray(\r\n Validators.maxLength(\r\n GroupsValidationPatterns.representingOrgNameMaxLength\r\n )\r\n ),\r\n skipWhenArray(\r\n Validators.minLength(\r\n GroupsValidationPatterns.representingOrgNameMinLength\r\n )\r\n ),\r\n skipWhenArray(\r\n Validators.pattern(\r\n GroupsValidationPatterns.representingOrganization\r\n )\r\n ),\r\n ],\r\n }\r\n )\r\n );\r\n }\r\n\r\n /**\r\n * Handles user role selection in add user form.\r\n * @param {CheckboxOption} event\r\n * @memberof AddUserRosterComponent\r\n */\r\n onUserRoleSelection(event: CheckboxOption): void {\r\n if (event?.checked) {\r\n this.selectedUserRoles?.push(event.id as string);\r\n } else {\r\n this.selectedUserRoles = this.selectedUserRoles.filter(\r\n (value) => value !== event.id\r\n );\r\n }\r\n // Recompute through the single source of truth so role selection and form\r\n // validity stay in sync for both roster types.\r\n this.updateSubmitButtonStatus();\r\n }\r\n /**\r\n * Emits form cancel event.\r\n * @memberof AddUserRosterComponent\r\n */\r\n onFormCancel(): void {\r\n this.formCancel.emit();\r\n }\r\n /**\r\n * Gets the classifications from master data.\r\n * @memberof AddUserRosterComponent\r\n */\r\n getClassifications(): void {\r\n this.groupService\r\n .getClassifications()\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (response) => {\r\n response?.body?.forEach((option) => {\r\n this.classifications?.push({\r\n id: option.classificationId,\r\n name: option.classificationDesc,\r\n });\r\n });\r\n this.updateFormControlOptions(\r\n 'classification',\r\n 'dropdownOptions',\r\n this.classifications\r\n );\r\n },\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n error: (error: any) => {\r\n this.handleErrors(error);\r\n },\r\n });\r\n }\r\n /**\r\n * Gets the member types from master data.\r\n * @memberof AddUserRosterComponent\r\n */\r\n getMemberTypes(): void {\r\n const memberTypes = this.groupService.getMemberTypes();\r\n memberTypes?.forEach((option) => {\r\n this.memberTypes?.push({\r\n id: option.roleId,\r\n name: option.roleName,\r\n });\r\n });\r\n this.updateFormControlOptions(\r\n 'memberType',\r\n 'dropdownOptions',\r\n this.memberTypes\r\n );\r\n }\r\n /**\r\n * Gets the representing Organizations.\r\n * @param {string} orgName\r\n * @memberof AddUserRosterComponent\r\n */\r\n getOrganizations(orgName: string): void {\r\n this.organizations = [];\r\n orgName = orgName?.trimStart();\r\n if (!orgName) return;\r\n const orgRequestPayload: OrganizationRequestPayload = {\r\n payload: { orgName: orgName },\r\n };\r\n this.groupService\r\n .getOrganizations(orgRequestPayload)\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (response) => {\r\n this.organizations = [];\r\n response?.body?.forEach((option) => {\r\n this.organizations?.push({\r\n id: option.orgId,\r\n name: option.orgName,\r\n });\r\n });\r\n // this.organizations is bound to the custom OrgMultiSelectComponent's\r\n // [options] input; assigning a new array reference opens its dropdown.\r\n this.organizations = [...this.organizations];\r\n },\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n error: (error: any) => {\r\n this.handleErrors(error);\r\n },\r\n });\r\n }\r\n /**\r\n * Update the dropdown options of Classification, Member Type and Representing Organization form fields.\r\n * @param {string} formControlName\r\n * @param {string} formControlInputProperty\r\n * @param {SelectOption[]} options\r\n * @memberof AddUserRosterComponent\r\n */\r\n updateFormControlOptions(\r\n formControlName: string,\r\n formControlInputProperty: string,\r\n options: SelectOption[]\r\n ): void {\r\n const formFields = this.dynamicFormComponent?.formFields?.toArray();\r\n formFields?.forEach((formField) => {\r\n if (\r\n formField?.component?.instance?.config?.controlName ===\r\n formControlName &&\r\n formField?.component?.instance?.[formControlInputProperty]\r\n )\r\n formField.component.instance[formControlInputProperty] = options;\r\n });\r\n }\r\n\r\n /**\r\n * Handles the custom errors while searching user by email, validating user existence and adding new user to roster.\r\n * @param {*} error\r\n * @memberof AddUserRosterComponent\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n handleErrors(error: any): void {\r\n const errorCodes = error?.error?.body?.errorCodes;\r\n if (Array.isArray(errorCodes) && !error?.error?.status) {\r\n if (errorCodes[0] !== '3004') {\r\n const errorMessage = this.groupService.parseErrorMessage(errorCodes);\r\n this.showAlertMessage(\r\n errorMessage,\r\n AlertType.ERROR,\r\n errorCodes[0] === '2024'\r\n );\r\n }\r\n } else if (error && error instanceof HttpErrorResponse) {\r\n this.globalErrorHandlerService.handleError(error);\r\n }\r\n }\r\n /**\r\n * Handles add user form change event.\r\n * @param {FormGroup[]} form\r\n * @memberof AddUserRosterComponent\r\n */\r\n onAddUserFormChange(form: FormGroup[]): void {\r\n this.addUserFormGroupRef = form[0];\r\n this.updateSubmitButtonStatus();\r\n }\r\n\r\n /**\r\n * Checks if all other control except representingOrg are valid.\r\n * @return {boolean}\r\n * @memberof AddUserRosterComponent\r\n */\r\n isAllOtherControlsValid(): boolean {\r\n if (!this.addUserFormGroupRef?.controls) {\r\n return false;\r\n }\r\n return Object.keys(this.addUserFormGroupRef.controls)\r\n ?.filter((controlName) => controlName !== 'representingOrg')\r\n .every(\r\n (controlName) =>\r\n this.addUserFormGroupRef?.get(controlName)?.status ===\r\n FormStatus?.VALID\r\n );\r\n }\r\n /**\r\n * Single source of truth for the Save button enabled/disabled state.\r\n *\r\n * Combines both inputs that gate the form so every callback (form change,\r\n * role selection, org selection) computes the same result — mirroring the\r\n * edit-user-roles flow:\r\n * 1. Base validity via GroupsService.isSubmitButtonDisabled, which accounts\r\n * for the reactive form status AND (for SYSTEM_USER) the selected roles,\r\n * since roles live in `selectedUserRoles`, not the form.\r\n * 2. For INDIVIDUAL only: the `representingOrg` control stays INVALID because\r\n * its value is held in `selectedOrganizations` (a multiselect autocomplete),\r\n * not the control. So also enable when every other control is valid and at\r\n * least one organization is selected, even though the form status is\r\n * INVALID.\r\n * @memberof AddUserRosterComponent\r\n */\r\n updateSubmitButtonStatus(): void {\r\n let isDisabled = this.groupService.isSubmitButtonDisabled(\r\n this.groupRosterType,\r\n this.addUserFormGroupRef?.status,\r\n this.selectedUserRoles\r\n );\r\n\r\n // For INDIVIDUAL, the `representingOrg` control stays INVALID because its\r\n // value is held in `selectedOrganizations` (a multiselect autocomplete),\r\n // not the control. So enable when every other control is valid and at least\r\n // one organization is selected — even though the form status is INVALID.\r\n if (\r\n this.groupRosterType === GroupRosterType.INDIVIDUAL &&\r\n this.addUserFormGroupRef?.get('representingOrg')?.status ===\r\n FormStatus?.INVALID &&\r\n this.isAllOtherControlsValid() &&\r\n this.selectedOrganizations?.length > 0\r\n ) {\r\n isDisabled = false;\r\n }\r\n\r\n // An uncommitted, invalid free-text token in the org field must block submit\r\n // regardless of any valid chips already selected.\r\n if (this.hasInvalidOrgFreeText) {\r\n isDisabled = true;\r\n }\r\n\r\n this.isSubmitButtonDisabled = isDisabled;\r\n }\r\n\r\n /**\r\n * Constructs add new user payload from the form data depends on the GroupRosterType and returns.\r\n * @param {*} formData\r\n * @return {(AddOrEditUserPayload | AddOrEditUserIndividualRosterPayload)}\r\n * @memberof AddUserRosterComponent\r\n */\r\n getAddNewUserPayload(\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n formData: any\r\n ): AddOrEditUserPayload | AddOrEditUserIndividualRosterPayload {\r\n let payload: AddOrEditUserPayload | AddOrEditUserIndividualRosterPayload;\r\n if (this.groupRosterType === GroupRosterType.INDIVIDUAL) {\r\n const formattedOptions = this.selectedOrganizations.map((option) => {\r\n return {\r\n orgId: option.id as string,\r\n orgName: option.name,\r\n };\r\n });\r\n payload = {\r\n payload: {\r\n email: this.isUserExist\r\n ? this.userInfo?.email\r\n : formData?.emailSearch,\r\n roles: this.selectedUserRoles,\r\n groupId: this.groupService.selectedGroupInfo?.groupId as string,\r\n organizations: formattedOptions,\r\n },\r\n };\r\n if (this.hasClassification)\r\n payload.payload.classification = {\r\n classificationId: formData?.classification\r\n ? formData?.classification?.id\r\n : '',\r\n };\r\n if (\r\n formData?.memberType &&\r\n !payload.payload.roles?.includes(formData?.memberType?.id)\r\n )\r\n payload.payload.roles?.push(formData?.memberType?.id);\r\n } else\r\n payload = {\r\n payload: {\r\n email: this.isUserExist\r\n ? this.userInfo?.email\r\n : formData?.emailSearch,\r\n roles: this.selectedUserRoles,\r\n groupId: this.groupService.selectedGroupInfo?.groupId as string,\r\n },\r\n };\r\n if (this.isUserExist) {\r\n payload.payload.userId = this.userInfo?.userId;\r\n } else {\r\n payload.payload.firstName = formData?.firstName?.trim();\r\n payload.payload.lastName = formData?.lastName?.trim();\r\n }\r\n return payload;\r\n }\r\n\r\n /**\r\n * Disables form submit button when org name length is less than minCharToSearch and greater than zero.\r\n * @memberof AddUserRosterComponent\r\n */\r\n disableSubmitButton(): void {\r\n if (this.selectedOrganizations.length === 0) {\r\n this.updateFormControlOptions(\r\n 'representingOrg',\r\n 'multiSelectAutoCompleteOptions',\r\n []\r\n );\r\n this.isSubmitButtonDisabled = true;\r\n }\r\n }\r\n\r\n /**\r\n * Handles alerts for error, warning.\r\n * @param {(string | string[])} message -error or warning message\r\n * @param {AlertType} alertType\r\n * @return -returns nothing\r\n * @memberof AddUserRosterComponent\r\n */\r\n showAlertMessage(\r\n message: string | string[],\r\n alertType: AlertType,\r\n isHtmlContent?: boolean\r\n ): void {\r\n this.alertService?.showMessage({\r\n status: 'custom',\r\n message: message,\r\n alertType: alertType,\r\n isCloseNeeded: true,\r\n isHtmlContent: isHtmlContent ?? false,\r\n });\r\n }\r\n\r\n /**\r\n * Gets selected organizations.\r\n * @param {AutoCompleteOption[]} selectedOrg\r\n * @memberof AddUserRosterComponent\r\n */\r\n getSelectedOrganizations(selectedOrg: AutoCompleteOption[]): void {\r\n this.selectedOrganizations = selectedOrg;\r\n // Keep the reactive control's value in sync with the selection so the\r\n // required validator and submit/Save-button logic stay accurate.\r\n this.addUserFormGroupRef\r\n ?.get('representingOrg')\r\n ?.setValue(selectedOrg?.length ? selectedOrg : '');\r\n // Recompute through the single source of truth so the representingOrg\r\n // exception (org selected while the control is INVALID) is applied.\r\n this.updateSubmitButtonStatus();\r\n }\r\n\r\n /**\r\n * NgOnDestroy performs necessary cleanup tasks, such as unsubscribing from subscription when the component is being destroyed.\r\n * @memberof AddUserRosterComponent\r\n */\r\n ngOnDestroy(): void {\r\n if (this.destroy$) {\r\n this.destroy$.next(true);\r\n this.destroy$.unsubscribe();\r\n if (this.timeOutId) clearTimeout(this.timeOutId);\r\n }\r\n }\r\n}\r\n","<ieeesa-dynamic-form\r\n *ngIf=\"searchUserFormGroup && isSearchUserForm\"\r\n class=\"ieeesa-search-user-form\"\r\n [leftButtonLabel]=\"leftButtonLabel\"\r\n [rightButtonLabel]=\"rightButtonLabel\"\r\n [isLegendVisible]=\"false\"\r\n [colWidth]=\"colWidth\"\r\n [actionButtonAlign]=\"actionButtonAlign\"\r\n [formGroups]=\"searchUserFormGroup\"\r\n [isLeftButtonNeeded]=\"true\"\r\n (formSubmit)=\"onSearchUserFormSubmit($event)\"\r\n (formLeftButtonClicked)=\"onFormCancel()\"\r\n></ieeesa-dynamic-form>\r\n\r\n<ieeesa-dynamic-form\r\n *ngIf=\"addUserFormGroup && !isSearchUserForm\"\r\n class=\"ieeesa-add-user-form\"\r\n [leftButtonLabel]=\"leftButtonLabel\"\r\n [rightButtonLabel]=\"rightButtonLabel\"\r\n [isLegendVisible]=\"false\"\r\n [isSubmitButtonDisabled]=\"isSubmitButtonDisabled\"\r\n [colWidth]=\"colWidth\"\r\n [actionButtonAlign]=\"actionButtonAlign\"\r\n [formGroups]=\"addUserFormGroup\"\r\n [isLeftButtonNeeded]=\"true\"\r\n (formSubmit)=\"onAddUserFormSubmit($event)\"\r\n (formSearchApply)=\"formSearchApply($event)\"\r\n (formLeftButtonClicked)=\"onFormCancel()\"\r\n (formGroupsReference)=\"getAddUserFormGroupRef($event)\"\r\n (formCheckboxSelection)=\"onUserRoleSelection($event)\"\r\n (formChange)=\"onAddUserFormChange($event)\"\r\n>\r\n <!--\r\n Representing Organization (INDIVIDUAL rosters only). Projected into the\r\n dynamic form's [component] slot so it renders after the other fields but\r\n BEFORE the Save/Cancel action buttons. Uses the custom multi-select field so\r\n multiple orgs can be picked from an open dropdown without the Material\r\n autocomplete closing or clearing the typed text. Its value stays synced to\r\n the reactive `representingOrg` control via getSelectedOrganizations().\r\n -->\r\n <ieeesa-org-multi-select\r\n component\r\n *ngIf=\"addUserFormGroup && !isSearchUserForm && isIndividualRoster\"\r\n class=\"ieeesa-add-user-form__org\"\r\n [label]=\"addUserRosterTexts?.label?.representingOrganization + '*'\"\r\n [ariaLabel]=\"addUserRosterTexts?.label?.ariaLabel?.representingOrganization\"\r\n [supportMessage]=\"addUserRosterTexts?.supportText?.representingOrganization\"\r\n [options]=\"organizations\"\r\n [selectedOptions]=\"selectedOrganizations\"\r\n (search)=\"getOrganizations($event)\"\r\n (selectionChange)=\"getSelectedOrganizations($event)\"\r\n (invalidFreeText)=\"onOrgInvalidFreeText($event)\"\r\n ></ieeesa-org-multi-select>\r\n</ieeesa-dynamic-form>\r\n","/* eslint-disable no-unused-vars */\r\nexport enum FilterType {\r\n ROLE = 'Role',\r\n MEMBER_TYPE = 'Member Type',\r\n CLASSIFICATION = 'Classification',\r\n}\r\n","/* eslint-disable no-unused-vars */\r\nexport enum TableColumnSchemaUserGroup {\r\n NAME = 'name',\r\n EMAIL = 'email',\r\n ROLE = 'role',\r\n EMPLOYER = 'employer',\r\n CLASSIFICATION = 'classification',\r\n ORGANIZATION = 'org_name',\r\n MEMBER_TYPE = 'memberType',\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { HttpClient, HttpParams, HttpResponse } from '@angular/common/http';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { BehaviorSubject, EMPTY, Subject, takeUntil } from 'rxjs';\r\nimport { map, catchError } from 'rxjs/operators';\r\nimport { saveAs } from 'file-saver';\r\nimport {\r\n ExportFormat,\r\n ExportFormatOption,\r\n PolicyConfirmationDialogComponent,\r\n PolicyConfirmationDialogData,\r\n ExportSuccessDialogComponent,\r\n ExportSuccessDialogData,\r\n} from '@ieeesa-npm/presentation';\r\nimport { AlertType } from '@ieeesa-npm/models';\r\nimport { AlertsService } from '@ieeesa-npm/utility';\r\nimport * as screenTexts from '../assets/constants.json';\r\n\r\n/**\r\n * RosterExportService owns the complete group roster export flow:\r\n * 1. Manages export popover open/close state\r\n * 2. Opens IEEE Data Access and Use Policy confirmation dialog\r\n * 3. Calls the backend roster export API (blob response)\r\n * 4. Triggers file download via File System Access API / file-saver\r\n * 5. Shows success/error dialogs and toasts\r\n *\r\n * The component only needs to:\r\n * - Subscribe to `isPopoverOpen$` for popover visibility\r\n * - Call `togglePopover()` on Export button click\r\n * - Call `onFormatSelected(format, groupId, groupName)` when user picks a format\r\n *\r\n * Follows the same pattern as MeetingExportService in the events-and-meetings library.\r\n * @export\r\n * @class RosterExportService\r\n */\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class RosterExportService {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private constants: any = screenTexts;\r\n private apiBaseUrl!: string;\r\n private destroy$ = new Subject<boolean>();\r\n\r\n /** Controls popover open/close state */\r\n private isPopoverOpenSubject$ = new BehaviorSubject<boolean>(false);\r\n isPopoverOpen$ = this.isPopoverOpenSubject$.asObservable();\r\n\r\n /** Controls in-progress state for button disable */\r\n private isExportInProgressSubject$ = new BehaviorSubject<boolean>(false);\r\n isExportInProgress$ = this.isExportInProgressSubject$.asObservable();\r\n\r\n /** Format options for the export popover */\r\n exportFormatOptions: ExportFormatOption[] = [\r\n {\r\n label: this.constants?.rosterExport?.formatOptions?.csv?.label ?? 'CSV',\r\n value: ExportFormat.CSV,\r\n ariaLabel: this.constants?.rosterExport?.formatOptions?.csv?.ariaLabel ?? 'Export roster as CSV',\r\n },\r\n {\r\n label: this.constants?.rosterExport?.formatOptions?.excel?.label ?? 'Excel',\r\n value: ExportFormat.EXCEL,\r\n ariaLabel: this.constants?.rosterExport?.formatOptions?.excel?.ariaLabel ?? 'Export roster as Excel',\r\n },\r\n ];\r\n\r\n /** Subtitle labels for the format selection cards */\r\n exportFormatSubtitles: Record<string, string> = {\r\n csv: this.constants?.rosterExport?.formatOptions?.csv?.subtitle ?? 'Comma separated file',\r\n xls: this.constants?.rosterExport?.formatOptions?.excel?.subtitle ?? 'Spreadsheet File',\r\n };\r\n\r\n /** Popover title */\r\n popoverTitle = this.constants?.rosterExport?.popoverTitle ?? 'Select the file format for roster export.';\r\n\r\n constructor(\r\n // eslint-disable-next-line no-unused-vars\r\n private httpClient: HttpClient,\r\n // eslint-disable-next-line no-unused-vars\r\n private dialog: MatDialog,\r\n // eslint-disable-next-line no-unused-vars\r\n private alertService: AlertsService\r\n ) {}\r\n\r\n /**\r\n * Sets the API base URL for roster export calls.\r\n * @param {string} url - Base URL (e.g., 'https://saappsapidev.ieee.org/v1')\r\n * @memberof RosterExportService\r\n */\r\n setApiBaseUrl(url: string): void {\r\n this.apiBaseUrl = url;\r\n }\r\n\r\n /**\r\n * Toggles the export format popover open/closed.\r\n * Called by the component on Export button click.\r\n * @memberof RosterExportService\r\n */\r\n togglePopover(): void {\r\n this.isPopoverOpenSubject$.next(!this.isPopoverOpenSubject$.getValue());\r\n }\r\n\r\n /**\r\n * Closes the export format popover.\r\n * @memberof RosterExportService\r\n */\r\n closePopover(): void {\r\n this.isPopoverOpenSubject$.next(false);\r\n }\r\n\r\n /**\r\n * Handles format selection from the export popover.\r\n * Closes popover, opens IEEE Policy dialog, on confirm triggers export.\r\n * This is the main entry point called by the component after user picks a format.\r\n * @param {ExportFormat} format - Selected format (CSV or XLS)\r\n * @param {string} groupId - The group ID to export the roster for\r\n * @param {string} groupName - The group name for filename generation\r\n * @memberof RosterExportService\r\n */\r\n onFormatSelected(format: ExportFormat, groupId: string, groupName: string): void {\r\n this.closePopover();\r\n\r\n const dialogData: PolicyConfirmationDialogData = {\r\n title: this.constants?.rosterExport?.policyDialog?.title ?? 'IEEE Data Access and Use Policy',\r\n bodyText: this.constants?.rosterExport?.policyDialog?.bodyText ?? 'The application is governed by IEEE\\'s data access and use policy. Data can only be used for its original intended purpose. Click \"Confirm\" to export the data into a CSV/Excel file or click \"Cancel\" to cancel the download.',\r\n policyUrl: this.constants?.rosterExport?.policyDialog?.policyUrl ?? 'https://www.ieee.org/ieee-data-access-and-use-policy.html',\r\n policyLinkText: this.constants?.rosterExport?.policyDialog?.policyLinkText ?? 'data access and use policy',\r\n cancelLabel: this.constants?.rosterExport?.policyDialog?.cancelLabel ?? 'Cancel',\r\n confirmLabel: this.constants?.rosterExport?.policyDialog?.confirmLabel ?? 'Confirm',\r\n };\r\n\r\n const dialogRef = this.dialog.open(PolicyConfirmationDialogComponent, {\r\n data: dialogData,\r\n width: '637px',\r\n panelClass: ['ieeesa-policy-dialog'],\r\n });\r\n\r\n dialogRef.afterClosed()\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe((confirmed: boolean) => {\r\n if (confirmed) {\r\n this.startExport(format, groupId, groupName);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Starts the export after the user confirms the policy dialog.\r\n *\r\n * When the File System Access API is available, the native Save picker is opened\r\n * HERE — synchronously within the confirm handler — while the user activation from\r\n * the confirm click is still valid. (Opening it later, inside the async HTTP\r\n * response callback, would exceed the activation window and the browser would\r\n * reject it with a SecurityError.) The obtained file handle is then passed to the\r\n * HTTP flow, which writes the downloaded bytes to it once the response arrives, so\r\n * the success dialog is still shown only AFTER the file is saved.\r\n *\r\n * If the user cancels the picker we abort before making the request. If the API is\r\n * unavailable (Firefox/Safari) we proceed without a handle and fall back to\r\n * `saveAs()` after the response.\r\n * @param {ExportFormat} format\r\n * @param {string} groupId\r\n * @param {string} groupName\r\n * @memberof RosterExportService\r\n */\r\n private startExport(format: ExportFormat, groupId: string, groupName: string): void {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n const showSaveFilePicker = (window as any).showSaveFilePicker;\r\n\r\n if (typeof showSaveFilePicker !== 'function') {\r\n // API unavailable: no handle; executeExport() will use the saveAs() fallback.\r\n this.executeExport(format, groupId, groupName, null);\r\n return;\r\n }\r\n\r\n const mimeType = format === ExportFormat.CSV\r\n ? 'text/csv'\r\n : 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';\r\n const extension = format === ExportFormat.CSV ? '.csv' : '.xlsx';\r\n const suggestedName = this.buildFilename(groupName, format);\r\n\r\n // Open the picker now, while the confirm-click activation is still valid.\r\n showSaveFilePicker({\r\n suggestedName,\r\n types: [\r\n {\r\n description: format === ExportFormat.CSV ? 'CSV File' : 'Excel File',\r\n accept: { [mimeType]: [extension] },\r\n },\r\n ],\r\n })\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n .then((handle: any) => {\r\n this.executeExport(format, groupId, groupName, handle);\r\n })\r\n .catch((error: unknown) => {\r\n // User cancelled the Save dialog — abort silently, no request made.\r\n if (error instanceof DOMException && error.name === 'AbortError') {\r\n return;\r\n }\r\n // Any other picker error: fall back to the saveAs() flow.\r\n this.executeExport(format, groupId, groupName, null);\r\n });\r\n }\r\n\r\n /**\r\n * Executes the roster export API call and writes the downloaded file.\r\n * Endpoint: GET /v1/groups/roster/export/{groupId}?format=csv|xlsx\r\n * When a pre-obtained file handle is provided (from the picker opened at confirm\r\n * time) the bytes are written to it; otherwise it falls back to `saveAs()`.\r\n * The success dialog is shown only after the file has been written.\r\n * @param {ExportFormat} format - The selected export format\r\n * @param {string} groupId - The group identifier\r\n * @param {string} groupName - The group name for filename\r\n * @param {FileSystemFileHandle | null} fileHandle - Handle from the Save picker, or null\r\n * @memberof RosterExportService\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private executeExport(format: ExportFormat, groupId: string, groupName: string, fileHandle: any): void {\r\n this.isExportInProgressSubject$.next(true);\r\n\r\n // Backend expects 'csv' or 'xlsx'. The ExportFormat.EXCEL enum value is\r\n // 'xls', so it must be mapped to 'xlsx' here — sending 'xls' is rejected\r\n // with error code 1079.\r\n const formatValue = format === ExportFormat.CSV ? 'csv' : 'xlsx';\r\n const params = new HttpParams().set('format', formatValue);\r\n const url = `${this.getExportApiUrl()}/groups/roster/export/${groupId}`;\r\n\r\n this.httpClient\r\n .get(url, {\r\n params,\r\n responseType: 'blob',\r\n observe: 'response',\r\n })\r\n .pipe(\r\n map((response: HttpResponse<Blob>) => {\r\n const filename = this.extractFilenameFromResponse(response, format, groupName);\r\n return { blob: response.body as Blob, filename };\r\n }),\r\n catchError(() => {\r\n this.isExportInProgressSubject$.next(false);\r\n this.alertService.showMessage({\r\n status: 'custom',\r\n message: this.constants?.rosterExport?.messages?.exportFailed ?? 'Failed to export roster. Please try again.',\r\n alertType: AlertType.ERROR,\r\n isCloseNeeded: true,\r\n });\r\n // Error is fully handled (alert shown). Complete the stream instead of\r\n // rethrowing, so the next-only subscribe does not report it as an\r\n // unhandled RxJS error.\r\n return EMPTY;\r\n }),\r\n takeUntil(this.destroy$)\r\n )\r\n .subscribe({\r\n next: (result) => {\r\n // Write to the pre-obtained handle (picker opened at confirm time) or fall\r\n // back to saveAs(). Success dialog only shows after the file is written.\r\n this.downloadFile(result.blob, result.filename, format, fileHandle)\r\n .then(({ saved }) => {\r\n this.isExportInProgressSubject$.next(false);\r\n if (saved) {\r\n this.showExportSuccessDialogAfterDownload(result.filename);\r\n }\r\n })\r\n .catch(() => {\r\n this.isExportInProgressSubject$.next(false);\r\n this.alertService.showMessage({\r\n status: 'custom',\r\n message: this.constants?.rosterExport?.messages?.exportFailed ?? 'Failed to export roster. Please try again.',\r\n alertType: AlertType.ERROR,\r\n isCloseNeeded: true,\r\n });\r\n });\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Shows the export success dialog after a successful file download.\r\n * @param {string} filename - The downloaded filename\r\n * @memberof RosterExportService\r\n */\r\n private showExportSuccessDialogAfterDownload(filename: string): void {\r\n const successMessage = this.constants?.rosterExport?.successDialog?.message ?? 'The file was downloaded successfully.';\r\n const closeLabel = this.constants?.rosterExport?.successDialog?.closeButton ?? 'Close';\r\n\r\n const dialogData: ExportSuccessDialogData = {\r\n message: successMessage,\r\n filename,\r\n closeLabel,\r\n };\r\n\r\n this.dialog.open(ExportSuccessDialogComponent, {\r\n data: dialogData,\r\n width: '467px',\r\n panelClass: ['ieeesa-export-success-dialog-panel'],\r\n autoFocus: false,\r\n });\r\n }\r\n\r\n /**\r\n * Returns the API base URL for roster export.\r\n * @return {string}\r\n * @memberof RosterExportService\r\n */\r\n private getExportApiUrl(): string {\r\n if (!this.apiBaseUrl) {\r\n throw new Error('RosterExportService apiBaseUrl is not set. Call setApiBaseUrl() before export.');\r\n }\r\n // apiBaseUrl already carries the version segment (e.g. '.../v1'), same as every\r\n // other GroupsService call which is built as `${apiBaseUrl}/groups/...`. So the\r\n // caller only appends '/groups/roster/export/{groupId}' — the version is NOT\r\n // repeated here. Strip a trailing slash to avoid a double slash before '/groups'.\r\n return this.apiBaseUrl.replace(/\\/+$/, '');\r\n }\r\n\r\n /**\r\n * Extracts filename from Content-Disposition header.\r\n * Falls back to buildFilename() if header is missing.\r\n * @param {HttpResponse<Blob>} response\r\n * @param {ExportFormat} format\r\n * @param {string} groupName\r\n * @return {string}\r\n * @memberof RosterExportService\r\n */\r\n private extractFilenameFromResponse(response: HttpResponse<Blob>, format: ExportFormat, groupName: string): string {\r\n const contentDisposition = response.headers.get('Content-Disposition');\r\n if (contentDisposition) {\r\n const filenameMatch = contentDisposition.match(/filename=\"?([^\"]+)\"?/);\r\n if (filenameMatch && filenameMatch[1]) {\r\n return filenameMatch[1].replace(/[/\\\\:*?\"<>|]/g, '_').substring(0, 200);\r\n }\r\n }\r\n return this.buildFilename(groupName, format);\r\n }\r\n\r\n /**\r\n * Builds a sanitized filename for the roster export.\r\n * Pattern: {SanitizedGroupName}_Roster.{extension}\r\n * @param {string} groupName\r\n * @param {ExportFormat} format\r\n * @return {string}\r\n * @memberof RosterExportService\r\n */\r\n buildFilename(groupName: string, format: ExportFormat): string {\r\n const sanitized = this.sanitizeGroupName(groupName);\r\n const extension = format === ExportFormat.CSV ? 'csv' : 'xlsx';\r\n return `${sanitized}_Roster.${extension}`;\r\n }\r\n\r\n /**\r\n * Sanitizes the group name for use in a filename.\r\n * Replaces non-alphanumeric characters (except hyphen/underscore) with underscore,\r\n * collapses consecutive underscores, and truncates to 200 chars.\r\n * @param {string} groupName\r\n * @return {string}\r\n * @memberof RosterExportService\r\n */\r\n sanitizeGroupName(groupName: string): string {\r\n if (!groupName) {\r\n return 'Unnamed_Group';\r\n }\r\n const sanitized = groupName\r\n .replace(/[^a-zA-Z0-9_-]/g, '_')\r\n .replace(/_+/g, '_')\r\n .substring(0, 200);\r\n\r\n return sanitized || 'Unnamed_Group';\r\n }\r\n\r\n /**\r\n * Writes the downloaded bytes to disk and resolves ONLY when the save has actually\r\n * completed.\r\n *\r\n * The Save picker is opened earlier (at policy-confirm time, while user activation\r\n * is still valid — see {@link startExport}); this method only writes to the handle\r\n * it produced. That keeps the \"success dialog after save\" ordering without hitting\r\n * the SecurityError that occurs when the picker is opened from this async callback.\r\n *\r\n * When no handle is provided (File System Access API unavailable, or the picker\r\n * errored), we fall back to FileSaver's `saveAs()`, which resolves immediately.\r\n * @param {Blob} blob - The file contents\r\n * @param {string} filename - The suggested filename (used by the saveAs fallback)\r\n * @param {ExportFormat} format - The selected export format (drives MIME type)\r\n * @param {FileSystemFileHandle | null} fileHandle - Handle from the Save picker, or null\r\n * @return {Promise<{ saved: boolean }>} Resolves with `saved: true` once written.\r\n * @memberof RosterExportService\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n async downloadFile(blob: Blob, filename: string, format: ExportFormat, fileHandle: any): Promise<{ saved: boolean }> {\r\n const mimeType = format === ExportFormat.CSV\r\n ? 'text/csv'\r\n : 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';\r\n const typedBlob = new Blob([blob], { type: mimeType });\r\n\r\n // No handle (API unavailable or picker errored) → standard download.\r\n if (!fileHandle) {\r\n saveAs(typedBlob, filename);\r\n return { saved: true };\r\n }\r\n\r\n // Write to the location the user already chose at confirm time.\r\n const writable = await fileHandle.createWritable();\r\n await writable.write(typedBlob);\r\n await writable.close();\r\n return { saved: true };\r\n }\r\n\r\n /**\r\n * Cleanup — call from the component's ngOnDestroy.\r\n * @memberof RosterExportService\r\n */\r\n destroy(): void {\r\n this.destroy$.next(true);\r\n // This service is providedIn: 'root' (singleton), so its state survives\r\n // navigation. Reset the UI-facing flags so a new roster component instance\r\n // does not inherit a stale-open popover or a permanently-disabled export\r\n // button if the user left the page mid-export or with the popover open.\r\n this.isPopoverOpenSubject$.next(false);\r\n this.isExportInProgressSubject$.next(false);\r\n // Signal current takeUntil subscriptions to unsubscribe, then re-create the\r\n // subject. This service is a providedIn: 'root' singleton whose destroy() is\r\n // called on every ViewRosterComponent teardown; completing destroy$ would\r\n // permanently close it, so later exports could never be torn down. A fresh\r\n // subject keeps the teardown channel usable across component lifecycles.\r\n this.destroy$.next(true);\r\n this.destroy$ = new Subject<boolean>();\r\n }\r\n}\r\n","import {\r\n AfterViewInit,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n ElementRef,\r\n HostListener,\r\n OnDestroy,\r\n OnInit,\r\n ViewChild,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { HttpErrorResponse } from '@angular/common/http';\r\nimport { Subject, takeUntil } from 'rxjs';\r\nimport { Sort } from '@angular/material/sort';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatMenuModule, MatMenuTrigger } from '@angular/material/menu';\r\nimport { MatDialog, MatDialogModule } from '@angular/material/dialog';\r\nimport {\r\n TableColumnSchema,\r\n TableColumnType,\r\n TableActions,\r\n TableColumnSortDirection,\r\n ChipsType,\r\n AlignType,\r\n ChipOption,\r\n CheckboxOption,\r\n FiltersAndOptions,\r\n DataTableComponent,\r\n ModalConfirmationComponent,\r\n ExportFormat,\r\n ExportFormatPopoverComponent,\r\n} from '@ieeesa-npm/presentation';\r\nimport {\r\n AlertsService,\r\n GlobalErrorHandlerService,\r\n} from '@ieeesa-npm/utility';\r\nimport { AlertType } from '@ieeesa-npm/models';\r\nimport { GroupsService } from '../../services/groups.service';\r\nimport {\r\n SearchUsersPayload,\r\n FilterUsersPayload,\r\n User,\r\n LoggedInUserInfo,\r\n} from '../../models/user.model';\r\nimport * as constants from '../../assets/constants.json';\r\nimport { DeleteUserGroupPayload } from '../../models/delete-user-group.model';\r\nimport { GroupFunctionType } from '../../models/group-function-type.model';\r\nimport { RosterFunctionType } from '../../models/roster-function-type.model';\r\nimport { GroupUserInfo } from '../../models/group-user-info.model';\r\nimport { GroupRosterType } from '../../models/roster-type.model';\r\nimport { FilterType } from '../../models/filter-type.model';\r\nimport { TableColumnSchemaUserGroup } from '../../models/table-column-schema-user-group.model';\r\nimport { PermissionType } from '../../models/permission-type.model';\r\nimport { RosterExportService } from '../../services/roster-export.service';\r\n\r\n/**\r\n * ViewRosterComponent implements the functionalities to add, edit, delete user to group roster, assign and modify roles(s) to the group users, and search user from roster.\r\n * @export\r\n * @class ViewRosterComponent\r\n * @implements {OnDestroy}\r\n */\r\n@Component({\r\n selector: 'ieeesa-view-roster',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n DataTableComponent,\r\n MatDialogModule,\r\n MatButtonModule,\r\n MatMenuModule,\r\n ExportFormatPopoverComponent,\r\n ],\r\n templateUrl: './view-roster.component.html',\r\n styleUrls: ['./view-roster.component.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class ViewRosterComponent implements AfterViewInit, OnDestroy, OnInit {\r\n destroy$: Subject<boolean> = new Subject<boolean>();\r\n /** Trigger for the \"Add\" menu (Add Manually / Bulk Import). */\r\n @ViewChild('addMenuTrigger') addMenuTrigger?: MatMenuTrigger;\r\n /** Invisible anchor element the \"Add\" menu attaches to. */\r\n @ViewChild('addMenuTrigger', { read: ElementRef })\r\n addMenuAnchor?: ElementRef<HTMLElement>;\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n constants: any = constants;\r\n viewRosterConstants = this.constants?.viewRoster;\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n dialogRef: any;\r\n alignmentType = AlignType;\r\n filters!: ChipOption[];\r\n columnSchema!: TableColumnSchema[];\r\n tableData!: User[];\r\n selectedRoleIds: string[] = [];\r\n selectedMemberTypeIds: string[] = [];\r\n selectedClassificationIds: string[] = [];\r\n searchPlaceholderText!: string;\r\n selectedRoles: FiltersAndOptions = {};\r\n selectedMemberTypes: FiltersAndOptions = {};\r\n selectedClassifications: FiltersAndOptions = {};\r\n roles: CheckboxOption[] = [];\r\n filterOptions: CheckboxOption[] = [];\r\n memberTypes: CheckboxOption[] = [];\r\n classifications: CheckboxOption[] = [];\r\n rosterActions: TableActions = {\r\n isSearchNeeded: true,\r\n isFilterNeeded: true,\r\n isAddNeeded: false,\r\n isDeleteNeeded: false,\r\n isEditNeeded: false,\r\n };\r\n defaultSortedColumn!: string;\r\n dataTableClassName!: string;\r\n hasClassification = false;\r\n searchTerm!: string;\r\n groupRosterType!: GroupRosterType;\r\n defaultColumnSortDirection = true;\r\n tableColumnsForIndividual =\r\n this.viewRosterConstants?.tableColumnsForIndividual;\r\n tableColumnsForSystemUsers =\r\n this.viewRosterConstants?.tableColumnsForSystemUsers;\r\n emptyFieldValueReplacedBy =\r\n this.viewRosterConstants?.emptyFieldValueReplacedBy;\r\n userInfo!: LoggedInUserInfo;\r\n constructor(\r\n // eslint-disable-next-line no-unused-vars\r\n public dialog: MatDialog,\r\n // eslint-disable-next-line no-unused-vars\r\n private groupService: GroupsService,\r\n // eslint-disable-next-line no-unused-vars\r\n private alertService: AlertsService,\r\n // eslint-disable-next-line no-unused-vars\r\n private cdr: ChangeDetectorRef,\r\n // eslint-disable-next-line no-unused-vars\r\n private globalErrorHandlerService: GlobalErrorHandlerService,\r\n // eslint-disable-next-line no-unused-vars\r\n public rosterExportService: RosterExportService\r\n ) {\r\n this.rosterActions.isAddNeeded = this.getManageRosterActionsPermission();\r\n this.rosterActions.isEditNeeded = this.getManageRosterActionsPermission();\r\n this.rosterActions.isDeleteNeeded = this.getManageRosterActionsPermission();\r\n }\r\n ngOnInit(): void {\r\n this.userInfo = this.groupService?.getUserInfo();\r\n this.rosterExportService.setApiBaseUrl(this.groupService?.apiBaseUrl);\r\n const groupType = this.groupService.getBusinessRuleOfSelectedGroup();\r\n this.hasClassification = groupType?.hasClassification ?? false;\r\n this.groupRosterType = groupType?.rosterType as GroupRosterType;\r\n if (!this.groupRosterType)\r\n this.alertService.showMessage({\r\n status: 'custom',\r\n message: this.constants?.errors?.ER1001,\r\n alertType: AlertType.WARNING,\r\n isCloseNeeded: true,\r\n });\r\n this.configureTableInfo();\r\n this.getGroupUsersAndInitializeTableView(\r\n this.defaultSortedColumn,\r\n this.defaultColumnSortDirection\r\n );\r\n }\r\n /**\r\n * Show add new user success message when canShowMessage is set true\r\n * @memberof ViewRosterComponent\r\n */\r\n ngAfterViewInit(): void {\r\n if (this.groupService?.canShowMessage) {\r\n this.groupService.canShowMessage = false;\r\n if (\r\n this.groupService?.rosterFunctionType ===\r\n RosterFunctionType?.ADD_USER_TO_ROSTER\r\n ) {\r\n this.showAlertMessage(\r\n this.constants?.addUserRoster?.message?.success?.submission,\r\n AlertType.SUCCESS\r\n );\r\n } else if (\r\n this.groupService?.rosterFunctionType ===\r\n RosterFunctionType?.EDIT_ROSTER_USER_ROLE\r\n ) {\r\n this.showAlertMessage(\r\n this.constants?.editUserRoles?.message?.success?.submission,\r\n AlertType.SUCCESS\r\n );\r\n }\r\n }\r\n const groupType = this.groupService.getBusinessRuleOfSelectedGroup();\r\n this.groupRosterType = groupType?.rosterType as GroupRosterType;\r\n }\r\n /**\r\n * Hides or shows roster add user, edit user and delete user actions based on user group permissions.\r\n * @return {boolean}\r\n * @memberof ViewRosterComponent\r\n */\r\n getManageRosterActionsPermission(): boolean {\r\n return (\r\n this.groupService.validateAccess(PermissionType.MANAGE_SYSTEM_USERS) ||\r\n this.groupService.validateAccess(PermissionType.MANAGE_GROUP_OFFICERS) ||\r\n this.groupService.validateAccess(PermissionType.MANAGE_GROUP_MEMBERS) ||\r\n this.groupService.validateAccess(PermissionType.MANAGE_ALL_ROSTERS)\r\n );\r\n }\r\n /**\r\n * Configure Table information based on group roster type\r\n * @memberof ViewRosterComponent\r\n */\r\n configureTableInfo(): void {\r\n if (this.groupRosterType === GroupRosterType.INDIVIDUAL) {\r\n this.dataTableClassName = 'ieeesa-individual-roster';\r\n this.searchPlaceholderText =\r\n this.viewRosterConstants?.searchPlaceholderIndividual;\r\n this.filters = [\r\n {\r\n id: FilterType.MEMBER_TYPE,\r\n name: FilterType.MEMBER_TYPE,\r\n checked: false,\r\n chipType: ChipsType.TOGGLE,\r\n },\r\n ];\r\n this.columnSchema = [\r\n {\r\n id: 1,\r\n columnDef: TableColumnType.SELECT,\r\n heading: '',\r\n columnType: TableColumnType.SELECT,\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n cellData: (element: any) => `${element.select}`,\r\n },\r\n {\r\n id: 2,\r\n columnDef: TableColumnSchemaUserGroup.NAME,\r\n heading: this.tableColumnsForIndividual?.name,\r\n columnType: TableColumnType.TEXT,\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n cellData: (element: any) => `${element.name}`,\r\n isSortableColumn: true,\r\n },\r\n {\r\n id: 3,\r\n columnDef: TableColumnSchemaUserGroup.EMPLOYER,\r\n heading: this.tableColumnsForIndividual?.employer,\r\n columnType: TableColumnType.TEXT,\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n cellData: (element: any) =>\r\n `${element.employer ?? this.emptyFieldValueReplacedBy}`,\r\n isSortableColumn: true,\r\n },\r\n {\r\n id: 4,\r\n columnDef: TableColumnSchemaUserGroup.EMAIL,\r\n heading: this.tableColumnsForIndividual?.email,\r\n columnType: TableColumnType.TEXT,\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n cellData: (element: any) =>\r\n `${element.email ?? this.emptyFieldValueReplacedBy}`,\r\n isSortableColumn: true,\r\n },\r\n {\r\n id: 5,\r\n columnDef: TableColumnSchemaUserGroup.MEMBER_TYPE,\r\n heading: this.tableColumnsForIndividual?.memberType,\r\n columnType: TableColumnType.TEXT,\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n cellData: (element: any) =>\r\n `${element.memberStatus ?? this.emptyFieldValueReplacedBy}`,\r\n },\r\n {\r\n id: 6,\r\n columnDef: TableColumnSchemaUserGroup.ORGANIZATION,\r\n heading: this.tableColumnsForIndividual?.organizationName,\r\n columnType: TableColumnType.TEXT,\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n cellData: (element: any) =>\r\n `${element.organization ?? this.emptyFieldValueReplacedBy}`,\r\n isSortableColumn: true,\r\n },\r\n {\r\n id: 8,\r\n columnDef: TableColumnSchemaUserGroup.ROLE,\r\n heading: this.tableColumnsForIndividual?.role,\r\n columnType: TableColumnType.TEXT,\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n cellData: (element: any) =>\r\n `${element.role ?? this.emptyFieldValueReplacedBy}`,\r\n },\r\n ];\r\n if (this.hasClassification) {\r\n this.getClassifications();\r\n this.columnSchema.splice(this.columnSchema.length - 1, 0, {\r\n id: 7,\r\n columnDef: TableColumnSchemaUserGroup.CLASSIFICATION,\r\n heading: this.tableColumnsForIndividual?.classification,\r\n columnType: TableColumnType.TEXT,\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n cellData: (element: any) =>\r\n `${element.classification ?? this.emptyFieldValueReplacedBy}`,\r\n isSortableColumn: true,\r\n });\r\n this.filters.push({\r\n id: FilterType.CLASSIFICATION,\r\n name: FilterType.CLASSIFICATION,\r\n checked: false,\r\n chipType: ChipsType.TOGGLE,\r\n });\r\n }\r\n } else if (this.groupRosterType === GroupRosterType.SYSTEM_USER) {\r\n this.dataTableClassName = 'ieeesa-system-users-roster';\r\n this.searchPlaceholderText =\r\n this.viewRosterConstants?.searchPlaceholderSystemUsers;\r\n this.filters = [\r\n {\r\n id: FilterType.ROLE,\r\n name: FilterType.ROLE,\r\n checked: false,\r\n chipType: ChipsType.TOGGLE,\r\n },\r\n ];\r\n this.columnSchema = [\r\n {\r\n id: 1,\r\n columnDef: TableColumnType.SELECT,\r\n heading: '',\r\n columnType: TableColumnType.SELECT,\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n cellData: (element: any) => `${element.select}`,\r\n },\r\n {\r\n id: 2,\r\n columnDef: TableColumnSchemaUserGroup.NAME,\r\n heading: this.tableColumnsForSystemUsers?.name,\r\n columnType: TableColumnType.TEXT,\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n cellData: (element: any) => `${element.name}`,\r\n isSortableColumn: true,\r\n },\r\n {\r\n id: 3,\r\n columnDef: TableColumnSchemaUserGroup.EMAIL,\r\n heading: this.tableColumnsForSystemUsers?.email,\r\n columnType: TableColumnType.TEXT,\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n cellData: (element: any) => `${element.email}`,\r\n isSortableColumn: true,\r\n },\r\n {\r\n id: 4,\r\n columnDef: TableColumnSchemaUserGroup.ROLE,\r\n heading: this.tableColumnsForSystemUsers?.role,\r\n columnType: TableColumnType.TEXT,\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n cellData: (element: any) =>\r\n `${element.role ?? this.emptyFieldValueReplacedBy}`,\r\n },\r\n ];\r\n }\r\n this.getRoles();\r\n this.defaultSortedColumn = this.columnSchema[1].columnDef;\r\n }\r\n /**\r\n * Gets the group users by calling getGroupUsers() from groupService and sets tableData to display the users in a grid.\r\n * @memberof ViewRosterComponent\r\n */\r\n getGroupUsersAndInitializeTableView(\r\n sortColumn: string,\r\n sortDirection: boolean\r\n ): void {\r\n this.groupService\r\n .getGroupUsers(\r\n this.groupService.getSelectedGroupInfo()?.groupId as string,\r\n sortColumn,\r\n sortDirection\r\n )\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (response) => {\r\n this.tableData =\r\n this.groupService.transformUserRolesNameAsString(response);\r\n this.cdr.detectChanges();\r\n },\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n error: (error: any) => {\r\n const errorCodes = error?.error?.body?.errorCodes;\r\n if (errorCodes?.includes('1026')) {\r\n this.tableData = [];\r\n this.cdr.detectChanges();\r\n } else this.handleErrors(error);\r\n },\r\n });\r\n }\r\n /**\r\n * Gets the groups based on the column name and sort direction.\r\n * @param {Sort} sort\r\n * @memberof ViewRosterComponent\r\n */\r\n onSortGroupUsers(sort: Sort) {\r\n this.defaultSortedColumn = sort.active;\r\n this.defaultColumnSortDirection =\r\n sort.direction === TableColumnSortDirection.ASCENDING;\r\n if (sort.direction === TableColumnSortDirection.NO_SORT) return;\r\n if (this.groupRosterType === GroupRosterType.SYSTEM_USER) {\r\n if (this.selectedRoleIds.length)\r\n this.onFilterGroupUsers([this.selectedRoles]);\r\n else\r\n this.getGroupUsersAndInitializeTableView(\r\n this.defaultSortedColumn,\r\n this.defaultColumnSortDirection\r\n );\r\n } else if (this.groupRosterType === GroupRosterType.INDIVIDUAL) {\r\n if (\r\n this.selectedClassificationIds.length ||\r\n this.selectedMemberTypeIds.length\r\n ) {\r\n this.onFilterGroupUsers([\r\n this.selectedClassifications,\r\n this.selectedMemberTypes,\r\n ]);\r\n } else\r\n this.getGroupUsersAndInitializeTableView(\r\n this.defaultSortedColumn,\r\n this.defaultColumnSortDirection\r\n );\r\n }\r\n }\r\n /**\r\n * Gets the selected group type roles by calling getGroupTypeRoles() from groupService and sets assign roles.\r\n * @memberof ViewRosterComponent\r\n */\r\n getRoles(): void {\r\n this.groupService\r\n .getGroupTypeRoles(\r\n this.groupService.getSelectedGroupInfo()?.groupType as string\r\n )\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (response) => {\r\n this.roles = response;\r\n if (this.groupRosterType === GroupRosterType.INDIVIDUAL) {\r\n this.getMemberTypes();\r\n }\r\n },\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n error: (error: any) => {\r\n this.handleErrors(error);\r\n },\r\n });\r\n }\r\n /**\r\n * Gets the classification by calling getClassifications() from groupService and sets classifications.\r\n * @memberof ViewUserRosterComponent\r\n */\r\n getClassifications(): void {\r\n this.groupService\r\n .getClassifications()\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (response) => {\r\n response?.body?.forEach((option) => {\r\n this.classifications?.push({\r\n id: option.classificationId,\r\n name: option.classificationName,\r\n checked: false,\r\n disabled: false,\r\n });\r\n });\r\n },\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n error: (error: any) => {\r\n this.handleErrors(error);\r\n },\r\n });\r\n }\r\n /**\r\n * Gets the member types by calling getMemberTypes() from groupService and sets member types.\r\n * @memberof ViewUserRosterComponent\r\n */\r\n getMemberTypes(): void {\r\n const memberTypes = this.groupService.getMemberTypes();\r\n memberTypes?.forEach((option) => {\r\n this.memberTypes?.push({\r\n id: option.roleId,\r\n name: option.roleName,\r\n checked: false,\r\n disabled: false,\r\n });\r\n });\r\n }\r\n /**\r\n * Sets the selected filter options for Member Type or Classification filter depends on the selection.\r\n * @param {ChipOption} option\r\n * @memberof ViewRosterComponent\r\n */\r\n setSelectedFilterOptions(option: ChipOption) {\r\n switch (option.id) {\r\n case FilterType.MEMBER_TYPE: {\r\n this.filterOptions = this.memberTypes;\r\n break;\r\n }\r\n case FilterType.CLASSIFICATION: {\r\n this.filterOptions = this.classifications;\r\n break;\r\n }\r\n case FilterType.ROLE: {\r\n this.filterOptions = this.roles;\r\n break;\r\n }\r\n default:\r\n break;\r\n }\r\n }\r\n /**\r\n * Gets the group users by calling searchGroupUsers() from groupService and sets tableData to display the users in a grid.\r\n * @param {string} searchTerm -searchTerm can be user name or email and user is searched based on the email or name.\r\n * @memberof ViewRosterComponent\r\n */\r\n onSearchGroupUsers(searchTerm: string): void {\r\n this.searchTerm = searchTerm?.trim();\r\n let payload!: SearchUsersPayload;\r\n switch (this.groupRosterType) {\r\n case GroupRosterType.SYSTEM_USER: {\r\n if (!this.searchTerm) {\r\n if (this.selectedRoleIds?.length === 0) {\r\n this.getGroupUsersAndInitializeTableView(\r\n this.defaultSortedColumn,\r\n this.defaultColumnSortDirection\r\n );\r\n return;\r\n } else if (this.selectedRoleIds?.length > 0) {\r\n this.onFilterGroupUsers([this.selectedRoles]);\r\n return;\r\n }\r\n }\r\n payload = {\r\n payload: {\r\n groupId: this.groupService.getSelectedGroupInfo()\r\n ?.groupId as string,\r\n searchByNameOrEmailOrRepOrg: this.searchTerm,\r\n filterByRoleClassificationMemberStatusIds: this.selectedRoleIds,\r\n sortColumn: this.defaultSortedColumn,\r\n ascendingOrder: this.defaultColumnSortDirection,\r\n },\r\n };\r\n break;\r\n }\r\n case GroupRosterType.INDIVIDUAL: {\r\n if (!this.searchTerm) {\r\n if (\r\n this.selectedMemberTypeIds?.length === 0 &&\r\n this.selectedClassificationIds?.length === 0\r\n ) {\r\n this.getGroupUsersAndInitializeTableView(\r\n this.defaultSortedColumn,\r\n this.defaultColumnSortDirection\r\n );\r\n return;\r\n } else if (\r\n this.selectedClassificationIds?.length > 0 ||\r\n this.selectedMemberTypeIds?.length > 0\r\n ) {\r\n this.onFilterGroupUsers([\r\n this.selectedClassifications,\r\n this.selectedMemberTypes,\r\n ]);\r\n return;\r\n }\r\n }\r\n payload = {\r\n payload: {\r\n groupId: this.groupService.getSelectedGroupInfo()\r\n ?.groupId as string,\r\n searchByNameOrEmailOrRepOrg: this.searchTerm,\r\n filterByRoleClassificationMemberStatusIds: [\r\n ...this.selectedClassificationIds,\r\n ...this.selectedMemberTypeIds,\r\n ],\r\n sortColumn: this.defaultSortedColumn,\r\n ascendingOrder: this.defaultColumnSortDirection,\r\n },\r\n };\r\n break;\r\n }\r\n default:\r\n break;\r\n }\r\n this.groupService\r\n .searchGroupUsers(payload)\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (response) => {\r\n this.tableData =\r\n this.groupService.transformUserRolesNameAsString(response);\r\n this.cdr.detectChanges();\r\n },\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n error: (error: any) => {\r\n const errorCodes = error?.error?.body?.errorCodes;\r\n const noUsersFoundErrorCodes = ['1029', '1030', '1031', '1032'];\r\n if (errorCodes && noUsersFoundErrorCodes.includes(errorCodes[0])) {\r\n this.tableData = [];\r\n this.cdr.detectChanges();\r\n } else this.handleErrors(error);\r\n },\r\n });\r\n }\r\n /**\r\n * Sets the selected options of filters and returns id of selected options\r\n * @param {FiltersAndOptions[]} selectedOptions\r\n * @param {FilterType} filterType\r\n * @param {FiltersAndOptions} selectedFilterOptions\r\n * @return {*}\r\n * @memberof ViewRosterComponent\r\n */\r\n getSelectedFilterOptionsAndIds(\r\n selectedOptions: FiltersAndOptions[],\r\n filterType: FilterType,\r\n selectedFilterOptions: FiltersAndOptions,\r\n selectedFilterIds: string[]\r\n ) {\r\n selectedOptions?.forEach((selectedOption) => {\r\n for (const [key, value] of Object.entries(selectedOption)) {\r\n if (key === filterType) {\r\n const selectedFilterOptionsList: CheckboxOption[] = [];\r\n value?.forEach((option) => {\r\n selectedFilterIds.push(option.id as string);\r\n selectedFilterOptionsList.push(option);\r\n });\r\n selectedFilterOptions[key] = selectedFilterOptionsList;\r\n }\r\n }\r\n });\r\n }\r\n /**\r\n * Gets the group users by calling getGroupUsersByRoles() from groupService and sets tableData to display the users in a grid.\r\n * @param {ChipOption[] | | CheckboxOption[]} roles\r\n * @memberof ViewRosterComponent\r\n */\r\n onFilterGroupUsers(selectedOptions: FiltersAndOptions[]): void {\r\n this.selectedRoleIds = [];\r\n this.selectedMemberTypeIds = [];\r\n this.selectedClassificationIds = [];\r\n this.selectedClassifications = {};\r\n this.selectedMemberTypes = {};\r\n let payload!: FilterUsersPayload;\r\n switch (this.groupRosterType) {\r\n case GroupRosterType.SYSTEM_USER: {\r\n this.getSelectedFilterOptionsAndIds(\r\n selectedOptions,\r\n FilterType.ROLE,\r\n this.selectedRoles,\r\n this.selectedRoleIds\r\n );\r\n if (selectedOptions?.length === 0 && !this.searchTerm) {\r\n this.getGroupUsersAndInitializeTableView(\r\n this.defaultSortedColumn,\r\n this.defaultColumnSortDirection\r\n );\r\n return;\r\n } else if (this.searchTerm) {\r\n this.onSearchGroupUsers(this.searchTerm);\r\n return;\r\n }\r\n payload = {\r\n payload: {\r\n groupId: this.groupService.getSelectedGroupInfo()\r\n ?.groupId as string,\r\n filterByRoleClassificationMemberStatusIds: this.selectedRoleIds,\r\n sortColumn: this.defaultSortedColumn,\r\n ascendingOrder: this.defaultColumnSortDirection,\r\n },\r\n };\r\n break;\r\n }\r\n case GroupRosterType.INDIVIDUAL: {\r\n this.getSelectedFilterOptionsAndIds(\r\n selectedOptions,\r\n FilterType.MEMBER_TYPE,\r\n this.selectedMemberTypes,\r\n this.selectedMemberTypeIds\r\n );\r\n this.getSelectedFilterOptionsAndIds(\r\n selectedOptions,\r\n FilterType.CLASSIFICATION,\r\n this.selectedClassifications,\r\n this.selectedClassificationIds\r\n );\r\n if (selectedOptions?.length === 0 && !this.searchTerm) {\r\n this.getGroupUsersAndInitializeTableView(\r\n this.defaultSortedColumn,\r\n this.defaultColumnSortDirection\r\n );\r\n return;\r\n } else if (this.searchTerm) {\r\n this.onSearchGroupUsers(this.searchTerm);\r\n return;\r\n }\r\n payload = {\r\n payload: {\r\n groupId: this.groupService.getSelectedGroupInfo()\r\n ?.groupId as string,\r\n filterByRoleClassificationMemberStatusIds: [\r\n ...this.selectedMemberTypeIds,\r\n ...this.selectedClassificationIds,\r\n ],\r\n sortColumn: this.defaultSortedColumn,\r\n ascendingOrder: this.defaultColumnSortDirection,\r\n },\r\n };\r\n break;\r\n }\r\n default:\r\n break;\r\n }\r\n this.groupService\r\n .getGroupUsersByRoles(payload)\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (response) => {\r\n this.tableData =\r\n this.groupService.transformUserRolesNameAsString(response);\r\n this.cdr.detectChanges();\r\n },\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, no-unused-vars, @typescript-eslint/no-unused-vars\r\n error: (error: any) => {\r\n const errorCodes = error?.error?.body?.errorCodes;\r\n if (errorCodes?.includes('1027')) {\r\n this.tableData = [];\r\n this.cdr.detectChanges();\r\n } else this.handleErrors(error);\r\n },\r\n });\r\n }\r\n /**\r\n * Handles the custom errors while retrieving groups users, roles, search users, filter user by roles.\r\n * @param {*} error\r\n * @memberof ViewRosterComponent\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n handleErrors(error: any): void {\r\n const errorCodes = error?.error?.body?.errorCodes;\r\n if (Array.isArray(errorCodes) && !error?.error?.status) {\r\n const errorMessage = this.groupService.parseErrorMessage(errorCodes);\r\n this.showAlertMessage(errorMessage, AlertType.ERROR);\r\n } else if (error && error instanceof HttpErrorResponse) {\r\n this.globalErrorHandlerService.handleError(error);\r\n }\r\n }\r\n /**\r\n * Opens the confirmation modal to get user confirmation to delete the users from the selected group.\r\n * @memberof ViewRosterComponent\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n openUserDeleteConfirmationModal(selectedUsers: any): void {\r\n const userIds = selectedUsers.map((user: User) => user?.userId);\r\n if (\r\n userIds.includes(this.userInfo?.userId) &&\r\n this.groupService.isAdminUser() &&\r\n this.groupService?.getBusinessRuleOfSelectedGroup()?.isAdmin\r\n ) {\r\n this.showAlertMessage(`${constants?.errors?.[1039]}`, AlertType.ERROR);\r\n } else {\r\n const selectedGroupInfo = this.groupService?.getSelectedGroupInfo();\r\n const confirmationInfo = constants?.deleteUsersGroup?.confirmationInfo;\r\n const deleteUserGroupModalOptions = {\r\n leftButtonLabel: confirmationInfo?.leftButtonLabel,\r\n rightButtonLabel: confirmationInfo?.rightButtonLabel,\r\n promptMessage: `${confirmationInfo?.promptMessagePart1} ${userIds?.length} ${confirmationInfo?.promptMessagePart2} ${selectedGroupInfo?.groupName}?`,\r\n actionButtonAlign: this.alignmentType?.MIDDLE,\r\n };\r\n this.dialogRef = this.dialog.open(ModalConfirmationComponent, {\r\n data: deleteUserGroupModalOptions,\r\n width: 'auto',\r\n autoFocus: 'dialog',\r\n ariaLabel: constants?.ariaLabel?.alert,\r\n });\r\n this.dialogRef\r\n .afterClosed()\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe((result: boolean) => {\r\n if (result) {\r\n this.deleteUsersGroup(\r\n selectedGroupInfo?.groupId as string,\r\n userIds\r\n );\r\n }\r\n });\r\n }\r\n }\r\n /**\r\n * Send API request to delete the selected user(s) from the selected group and handles the success and error response.\r\n * @memberof ViewRosterComponent\r\n */\r\n deleteUsersGroup(groupId: string, userIds: string[]) {\r\n const deleteUsersGroupTexts = constants?.deleteUsersGroup;\r\n const deleteUserGroupPayload: DeleteUserGroupPayload = {\r\n payload: {\r\n [groupId]: userIds,\r\n },\r\n };\r\n this.groupService\r\n .deleteUsersGroup(deleteUserGroupPayload)\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n next: (res: any) => {\r\n if (res?.status) {\r\n this.showAlertMessage(\r\n `${res.body} ${deleteUsersGroupTexts?.message?.success?.removed}`,\r\n AlertType.SUCCESS\r\n );\r\n this.getGroupUsersAndInitializeTableView(\r\n this.defaultSortedColumn,\r\n this.defaultColumnSortDirection\r\n );\r\n }\r\n },\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n error: (error: any) => {\r\n this.handleErrors(error);\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Sets selected user info and emits event openModalNotifier with EDIT_ROSTER_USER_ROLE value.\r\n * @param {GroupUserInfo[]} selectedUserInfo\r\n * @memberof ViewRosterComponent\r\n */\r\n onEditUserRoles(selectedUserInfo: GroupUserInfo[]): void {\r\n if (this.groupRosterType === GroupRosterType.INDIVIDUAL)\r\n this.groupService.setSelectedUserInfo({\r\n email: selectedUserInfo[0]?.email,\r\n name: selectedUserInfo[0]?.name,\r\n role: selectedUserInfo[0]?.role,\r\n userId: selectedUserInfo[0]?.userId,\r\n classification: selectedUserInfo[0]?.classification,\r\n organization: selectedUserInfo[0]?.organization,\r\n memberStatus: selectedUserInfo[0]?.memberStatus,\r\n canDelete: selectedUserInfo[0]?.canDelete,\r\n });\r\n else\r\n this.groupService.setSelectedUserInfo({\r\n email: selectedUserInfo[0]?.email,\r\n name: selectedUserInfo[0]?.name,\r\n role: selectedUserInfo[0]?.role,\r\n userId: selectedUserInfo[0]?.userId,\r\n canDelete: selectedUserInfo[0]?.canDelete,\r\n });\r\n\r\n this.groupService?.openModalNotifier?.next(\r\n GroupFunctionType.EDIT_ROSTER_USER_ROLE\r\n );\r\n }\r\n\r\n /**\r\n * Handles a click on the data-table's add-user icon. The add icon lives inside\r\n * the shared DataTableComponent and only emits (addRow), so we can't attach a\r\n * menu trigger to it directly. Instead we position an invisible, fixed-position\r\n * anchor at the add icon's on-screen location, then open the menu from that\r\n * anchor — so the menu appears directly beneath the add icon (matching the\r\n * Figma) rather than at the far-right export area.\r\n * @memberof ViewRosterComponent\r\n */\r\n onAddIconClick(): void {\r\n this.positionAddMenuAnchorAtAddIcon();\r\n this.addMenuTrigger?.openMenu();\r\n }\r\n\r\n /**\r\n * Closes the \"Add\" menu on window resize/scroll. The menu is anchored to a\r\n * point measured at open time, so a layout change (resize/scroll) would leave\r\n * it detached from the add icon; closing it avoids showing it in a stale spot.\r\n * The user can simply click the add icon again.\r\n * @memberof ViewRosterComponent\r\n */\r\n @HostListener('window:resize')\r\n @HostListener('window:scroll')\r\n closeAddMenuOnViewportChange(): void {\r\n if (this.addMenuTrigger?.menuOpen) {\r\n this.addMenuTrigger.closeMenu();\r\n }\r\n }\r\n\r\n /**\r\n * Places the add-menu anchor at the add-user icon's bottom edge. Locates the\r\n * icon by finding the add-user sprite (icon-add-user) within the roster's\r\n * data-table action row.\r\n * @memberof ViewRosterComponent\r\n */\r\n private positionAddMenuAnchorAtAddIcon(): void {\r\n const anchor = this.addMenuAnchor?.nativeElement;\r\n if (!anchor) {\r\n return;\r\n }\r\n const scope =\r\n (anchor.closest('.ieeesa-modal, .mat-mdc-dialog-container') as HTMLElement) ??\r\n document.body;\r\n // The add-user icon is the data-table action button with aria-label\r\n // \"Add user(s)\" (dataTable.buttons[2], id 3 → class ieeesa-icon-button__3).\r\n // Target it within the actions row specifically so we don't match a row-level\r\n // action button elsewhere in the table.\r\n const addIcon = (scope?.querySelector(\r\n '.ieeesa-data-table__actions .ieeesa-icon-button__3'\r\n ) ??\r\n scope?.querySelector(\r\n '.ieeesa-data-table__actions button[aria-label=\"Add user(s)\"]'\r\n )) as HTMLElement | null;\r\n if (!addIcon) {\r\n return;\r\n }\r\n const rect = addIcon.getBoundingClientRect();\r\n // Anchor is a zero-size point at the add icon's bottom-RIGHT corner. With the\r\n // menu's xPosition=\"before\" the menu's right edge aligns to this point, so the\r\n // menu opens leftward from the add icon (matching the Figma, where the icon\r\n // sits above the right portion of the popover).\r\n anchor.style.position = 'fixed';\r\n anchor.style.top = `${rect.bottom}px`;\r\n anchor.style.left = `${rect.right}px`;\r\n anchor.style.width = '0';\r\n anchor.style.height = '0';\r\n }\r\n\r\n /**\r\n * \"Add Manually\" menu option — opens the existing add-user-to-roster flow.\r\n * @memberof ViewRosterComponent\r\n */\r\n onAddManually(): void {\r\n this.groupService?.openModalNotifier?.next(\r\n GroupFunctionType.ADD_USER_TO_ROSTER\r\n );\r\n }\r\n\r\n /**\r\n * \"Bulk Import\" menu option — opens the bulk roster import dialog.\r\n * @memberof ViewRosterComponent\r\n */\r\n onImportRoster(): void {\r\n this.groupService?.openModalNotifier?.next(\r\n GroupFunctionType.IMPORT_ROSTER\r\n );\r\n }\r\n\r\n /**\r\n * Handles alerts for success, error, warning.\r\n * @param {(string | string[])} message -error or warning message\r\n * @param {AlertType} alertType\r\n * @return -returns nothing\r\n * @memberof ViewRosterComponent\r\n */\r\n showAlertMessage(message: string | string[], alertType: AlertType): void {\r\n this.alertService?.showMessage({\r\n status: 'custom',\r\n message: message,\r\n alertType: alertType,\r\n isCloseNeeded: true,\r\n });\r\n }\r\n\r\n /**\r\n * Toggles the export format popover — delegates to RosterExportService.\r\n * @memberof ViewRosterComponent\r\n */\r\n onExportClick(): void {\r\n this.rosterExportService.togglePopover();\r\n }\r\n\r\n /**\r\n * Handles export format selection — delegates to RosterExportService using the\r\n * currently selected group's id and name.\r\n * @param {ExportFormat} format\r\n * @memberof ViewRosterComponent\r\n */\r\n onExportFormatSelected(format: ExportFormat): void {\r\n const selectedGroupInfo = this.groupService?.getSelectedGroupInfo();\r\n const groupId = selectedGroupInfo?.groupId as string;\r\n // Without a group id the export URL would be malformed, so guard here\r\n // instead of firing a bad request.\r\n if (!groupId) {\r\n this.showAlertMessage(this.constants?.errors?.default, AlertType.ERROR);\r\n return;\r\n }\r\n const groupName = selectedGroupInfo?.groupName ?? '';\r\n this.rosterExportService.onFormatSelected(format, groupId, groupName);\r\n }\r\n\r\n /**\r\n * NgOnDestroy performs necessary cleanup tasks, such as unsubscribing from subscription when the component is being destroyed.\r\n * @memberof ViewRosterComponent\r\n */\r\n ngOnDestroy(): void {\r\n this.rosterExportService.destroy();\r\n this.destroy$.next(true);\r\n this.destroy$.unsubscribe();\r\n }\r\n}\r\n","<ieeesa-data-table\r\n [tableDataInfo]=\"tableData\"\r\n [columnSchemaInfo]=\"columnSchema\"\r\n [searchPlaceHolderText]=\"searchPlaceholderText\"\r\n [tableActions]=\"rosterActions\"\r\n [isCellTextOverflowEllipsis]=\"true\"\r\n [filters]=\"filters\"\r\n [className]=\"dataTableClassName\"\r\n [selectedFilterOptions]=\"filterOptions\"\r\n [defaultSortedColumn]=\"defaultSortedColumn\"\r\n (selectedFilter)=\"setSelectedFilterOptions($event)\"\r\n (removeFilteredOption)=\"onFilterGroupUsers($event)\"\r\n (filteredOptions)=\"onFilterGroupUsers($event)\"\r\n (searchedValue)=\"onSearchGroupUsers($event)\"\r\n (selectedRowToEdit)=\"onEditUserRoles($event)\"\r\n (selectedRowsToDelete)=\"openUserDeleteConfirmationModal($event)\"\r\n (sortChange)=\"onSortGroupUsers($event)\"\r\n (addRow)=\"onAddIconClick()\"\r\n>\r\n <!-- Export Roster action — projected into the data-table action row,\r\n inline after the delete icon. -->\r\n <div dataTableActions class=\"ieeesa-view-roster__export-wrapper\">\r\n <button\r\n mat-button\r\n class=\"mat-tertiary-button ieeesa-view-roster__export-btn\"\r\n type=\"button\"\r\n [attr.aria-label]=\"constants?.rosterExport?.ariaLabel\"\r\n [disabled]=\"!tableData?.length || (rosterExportService.isExportInProgress$ | async)\"\r\n (click)=\"onExportClick()\"\r\n >\r\n <svg class=\"ieeesa-view-roster__export-btn-icon\" aria-hidden=\"true\">\r\n <use xlink:href=\"assets/images/sprites/sprites.svg#icon-export\"></use>\r\n </svg>\r\n {{ constants?.rosterExport?.buttonLabel }}\r\n </button>\r\n\r\n <ieeesa-export-format-popover\r\n [formatOptions]=\"rosterExportService.exportFormatOptions\"\r\n [isOpen]=\"(rosterExportService.isPopoverOpen$ | async) ?? false\"\r\n [popoverTitle]=\"rosterExportService.popoverTitle\"\r\n [formatSubtitles]=\"rosterExportService.exportFormatSubtitles\"\r\n (formatSelected)=\"onExportFormatSelected($event)\"\r\n (closed)=\"rosterExportService.closePopover()\"\r\n ></ieeesa-export-format-popover>\r\n\r\n <!-- Invisible anchor for the \"Add\" menu (Add Manually / Bulk Import).\r\n The add-user icon lives inside the data-table and only emits (addRow);\r\n onAddIconClick() opens this menu programmatically, anchored here so it\r\n appears just under the add icon. -->\r\n <span\r\n #addMenuTrigger=\"matMenuTrigger\"\r\n [matMenuTriggerFor]=\"addMenu\"\r\n class=\"ieeesa-view-roster__add-menu-anchor\"\r\n aria-hidden=\"true\"\r\n ></span>\r\n <mat-menu\r\n #addMenu=\"matMenu\"\r\n class=\"ieeesa-view-roster__add-menu\"\r\n xPosition=\"before\"\r\n yPosition=\"below\"\r\n >\r\n <button\r\n mat-menu-item\r\n type=\"button\"\r\n class=\"ieeesa-view-roster__add-menu-item\"\r\n (click)=\"onAddManually()\"\r\n >\r\n <span class=\"ieeesa-view-roster__add-menu-item-title\">\r\n {{ constants?.addRosterMenu?.addManually?.title ?? 'Add Manually' }}\r\n </span>\r\n <span class=\"ieeesa-view-roster__add-menu-item-subtitle\">\r\n {{ constants?.addRosterMenu?.addManually?.subtitle ?? 'Search by email, fill details' }}\r\n </span>\r\n </button>\r\n <button\r\n mat-menu-item\r\n type=\"button\"\r\n class=\"ieeesa-view-roster__add-menu-item\"\r\n (click)=\"onImportRoster()\"\r\n >\r\n <span class=\"ieeesa-view-roster__add-menu-item-title\">\r\n {{ constants?.addRosterMenu?.bulkImport?.title ?? 'Bulk Import' }}\r\n </span>\r\n <span class=\"ieeesa-view-roster__add-menu-item-subtitle\">\r\n {{ constants?.addRosterMenu?.bulkImport?.subtitle ?? 'Upload CSV or XLS file' }}\r\n </span>\r\n </button>\r\n </mat-menu>\r\n </div>\r\n</ieeesa-data-table>\r\n","import { CommonModule } from '@angular/common';\r\nimport { HttpErrorResponse } from '@angular/common/http';\r\nimport {\r\n Component,\r\n Input,\r\n OnDestroy,\r\n ViewEncapsulation,\r\n OnInit,\r\n} from '@angular/core';\r\nimport { MatDialog, MatDialogModule } from '@angular/material/dialog';\r\nimport { CreateGroupComponent } from './components/create-group/create-group.component';\r\nimport { GroupsService } from './services/groups.service';\r\nimport { Subject, takeUntil } from 'rxjs';\r\nimport { GroupInfo } from './models/group-info.model';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport {\r\n SelectOption,\r\n IconButtonComponent,\r\n IconButton,\r\n AlignType,\r\n ModalConfirmationComponent,\r\n SelectComponent,\r\n LegendComponent,\r\n SearchType,\r\n SearchComponent,\r\n ModalComponent,\r\n BreakpointObserverService\r\n} from '@ieeesa-npm/presentation';\r\nimport { TreeViewComponent } from './components/tree-view/tree-view.component';\r\nimport { GroupType, GroupTypeConfigValue } from './models/group-types.model';\r\nimport {\r\n AlertsService,\r\n GlobalErrorHandlerService,\r\n} from '@ieeesa-npm/utility';\r\nimport { AlertType, ModalType } from '@ieeesa-npm/models';\r\nimport * as screenTexts from './assets/constants.json';\r\nimport { GroupFunctionType } from './models/group-function-type.model';\r\nimport { RosterFunctionType } from './models/roster-function-type.model';\r\nimport { GetGroupsPayload } from './models/view-group.model';\r\nimport { DeleteGroupPayload } from './models/delete-group.model';\r\nimport { AddUserRosterComponent } from './components/add-user-roster/add-user-roster.component';\r\nimport { ViewRosterComponent } from './components/view-roster/view-roster.component';\r\nimport { RosterImportComponent } from './components/roster-import/roster-import.component';\r\nimport { EditGroupAndParentInfo } from './models/edit-group.model';\r\nimport { EditUserRolesComponent } from './components/edit-user-roles/edit-user-roles.component';\r\nimport { UserPermissionsService } from './services/user-permissions.service';\r\nimport {\r\n GroupPermission,\r\n UserPermission,\r\n} from './models/group-permissions.model';\r\nimport { PermissionType } from './models/permission-type.model';\r\nimport { GroupPermissionsMapService } from './services/group-permissions-map-service';\r\nimport { LoggedInUserInfo } from './models/user.model';\r\n\r\n/**\r\n * Groups component is a wrapper or container component for groups management reusable component and in this component integrates all group management functionalities and this will be entry component for managing groups when it is consumed in other applications.\r\n * @class GroupsComponent\r\n */\r\n@Component({\r\n // eslint-disable-next-line @angular-eslint/component-selector\r\n selector: 'ieeesa-groups',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n MatDialogModule,\r\n MatButtonModule,\r\n SearchComponent,\r\n SelectComponent,\r\n TreeViewComponent,\r\n LegendComponent,\r\n IconButtonComponent,\r\n ],\r\n templateUrl: './groups.component.html',\r\n styleUrls: ['./groups.component.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n providers: [AlertsService],\r\n})\r\nexport class GroupsComponent implements OnInit, OnDestroy {\r\n destroy$: Subject<boolean> = new Subject<boolean>();\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n dialogRef: any;\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n constants: any = screenTexts;\r\n viewGroupTexts = this.constants?.viewGroups;\r\n createGroupText = this.constants?.createGroup;\r\n editGroupTexts = this.constants?.editGroup;\r\n editUserRolesTexts = this.constants?.editUserRoles;\r\n addUserRosterTexts = this.constants?.addUserRoster;\r\n isGroupSearchActive = false;\r\n isGroupFilterActive = false;\r\n isGroupSearchOrFilterActive = false;\r\n isMobileView = false;\r\n childGroupsInfo!: GroupInfo[];\r\n selectedGroupType!: SelectOption;\r\n parentGroupsInfo!: GroupInfo[];\r\n selectGroupOptions!: SelectOption[];\r\n deletedGroupId!: string;\r\n deleteGroupName!: string;\r\n groupTypes!: GroupTypeConfigValue;\r\n searchPlaceHolderText: string = this.viewGroupTexts?.placeholderText?.search;\r\n filterPlaceHolderText: string = this.viewGroupTexts?.placeholderText?.filter;\r\n createGroupIcon: IconButton = {\r\n id: 1,\r\n ariaLabel: this.viewGroupTexts?.ariaLabel.add,\r\n iconURL: this.viewGroupTexts?.createGroupIcon,\r\n toolTip: this.viewGroupTexts?.ariaLabel.add,\r\n };\r\n filterGroupIcon: IconButton = {\r\n id: 2,\r\n ariaLabel: this.viewGroupTexts?.ariaLabel.filter,\r\n iconURL: this.viewGroupTexts?.filterGroupIcon,\r\n toolTip: this.viewGroupTexts?.ariaLabel.filter,\r\n };\r\n searchGroupIcon: IconButton = {\r\n id: 3,\r\n ariaLabel: this.viewGroupTexts?.ariaLabel.search,\r\n iconURL: this.viewGroupTexts?.searchGroupIcon,\r\n toolTip: this.viewGroupTexts?.ariaLabel.search,\r\n };\r\n getGroupsPayload: GetGroupsPayload = { groupId: '', groupTypeId: '' };\r\n @Input() groupsPageInfo: {\r\n groupsTitle: string;\r\n groupsDescription: string;\r\n } = {\r\n groupsTitle: this.viewGroupTexts?.groupsTitle,\r\n groupsDescription: this.viewGroupTexts?.groupsDescription,\r\n };\r\n @Input() applicationId!: string;\r\n @Input() apiBaseURL!: string;\r\n @Input() userPermissions!: UserPermission[];\r\n @Input() userInfo!: LoggedInUserInfo;\r\n permissionType = PermissionType;\r\n functionType!: GroupFunctionType;\r\n alignmentType = AlignType;\r\n canReopenViewRosterModal = false;\r\n searchType: SearchType = SearchType.ON_CLICK;\r\n minCharacterToSearch = 3;\r\n trimmedSearchTerm = '';\r\n userGroupPermissions!: GroupPermission[];\r\n supportMessage!: string;\r\n constructor(\r\n // eslint-disable-next-line no-unused-vars\r\n public dialog: MatDialog,\r\n // eslint-disable-next-line no-unused-vars\r\n private groupsService: GroupsService,\r\n // eslint-disable-next-line no-unused-vars\r\n public alertService: AlertsService,\r\n // eslint-disable-next-line no-unused-vars\r\n private breakpointObserverService: BreakpointObserverService,\r\n // eslint-disable-next-line no-unused-vars\r\n public globalErrorHandlerService: GlobalErrorHandlerService,\r\n // eslint-disable-next-line no-unused-vars\r\n private userPermissionsService: UserPermissionsService,\r\n // eslint-disable-next-line no-unused-vars\r\n private groupPermissionsService: GroupPermissionsMapService\r\n ) {\r\n this.breakpointObserverService\r\n .getBreakpoint()\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe((result: { matches: boolean }) => {\r\n this.isMobileView = result?.matches;\r\n });\r\n this.groupsService?.openModalNotifier?.next(GroupFunctionType.VIEW_ROSTER);\r\n }\r\n /**\r\n * Initialize the groups component.\r\n * @return -returns nothing\r\n * @memberof GroupsComponent\r\n */\r\n ngOnInit(): void {\r\n this.groupsService?.setUserInfo(this.userInfo);\r\n this.supportMessage =\r\n this.viewGroupTexts?.minCharRequiredToSearch1 +\r\n ' ' +\r\n this.minCharacterToSearch +\r\n ' ' +\r\n this.viewGroupTexts?.minCharRequiredToSearch2;\r\n this.userGroupPermissions =\r\n this.userPermissionsService.filterUserGroupPermissions(\r\n this.userPermissions,\r\n this.groupPermissionsService?.getGlobalGroupPermissions()\r\n );\r\n this.groupsService.setUserGroupPermissions(this.userGroupPermissions);\r\n this.groupsService?.setAppConfig(this.apiBaseURL, this.userPermissions);\r\n this.getGroupTypes();\r\n this.groupsService?.openModalNotifier\r\n ?.pipe(takeUntil(this.destroy$))\r\n ?.subscribe((response) => {\r\n this.dialogRef?.close();\r\n const selectedGroupInfo = this.groupsService.getSelectedGroupInfo();\r\n if (response === GroupFunctionType.EDIT_ROSTER_USER_ROLE) {\r\n this.openEditUserRolesModal(selectedGroupInfo as GroupInfo);\r\n }\r\n if (response === GroupFunctionType.ADD_USER_TO_ROSTER) {\r\n this.openAddUserRosterModal(selectedGroupInfo as GroupInfo);\r\n }\r\n if (response === GroupFunctionType.IMPORT_ROSTER) {\r\n this.openRosterImportModal(selectedGroupInfo as GroupInfo);\r\n }\r\n });\r\n }\r\n /**\r\n * Validates permission based access for provided feature.\r\n * @param {PermissionType} permissionType\r\n * @return {boolean}\r\n * @memberof GroupsComponent\r\n */\r\n validateAccess(permissionType: PermissionType): boolean {\r\n return this.userPermissionsService.validateAccessPermission(\r\n permissionType,\r\n this.userGroupPermissions\r\n );\r\n }\r\n /**\r\n * Sets the dialog options for create group modal and calls openModal method.\r\n * @param {GroupInfo} [parentGroupInfo] -An optional parameter. Parent group info to be passed for create child group.\r\n * @return -returns nothing\r\n * @memberof GroupsComponent\r\n */\r\n openCreateGroupForm(parentGroupInfo?: GroupInfo): void {\r\n const groupTypes = this.groupsService.getLoadedGroupTypes();\r\n if (groupTypes && groupTypes?.length > 0) {\r\n this.groupsService?.setSelectedGroupInfo(parentGroupInfo ?? undefined);\r\n this.groupsService?.setGroupFunctionType(GroupFunctionType?.CREATE);\r\n const dialogOptions = {\r\n heading: this.createGroupText?.heading,\r\n isCloseNeeded: true,\r\n componentReference: CreateGroupComponent,\r\n modalType: ModalType.FORM,\r\n };\r\n this.functionType = GroupFunctionType?.CREATE;\r\n this.openModal(dialogOptions, 'ieeesa-create-group', parentGroupInfo);\r\n } else\r\n this.showAlertMessage(AlertType.ERROR, this.constants?.errors?.['1010']);\r\n }\r\n /**\r\n * Sets the dialog options for edit group modal and calls openModal method.\r\n * @param {EditGroupAndParentInfo} editGroupInfo -editing group and its parent group info to be passed for populating edit group form fields.\r\n * @return -returns nothing\r\n * @memberof GroupsComponent\r\n */\r\n openEditGroupForm(editGroupInfo: EditGroupAndParentInfo): void {\r\n this.groupsService?.setSelectedGroupInfo(\r\n editGroupInfo?.groupInfo,\r\n editGroupInfo?.parentGroupInfo\r\n );\r\n this.groupsService?.setGroupFunctionType(GroupFunctionType?.EDIT);\r\n const dialogOptions = {\r\n heading: editGroupInfo?.groupInfo?.groupName,\r\n isCloseNeeded: true,\r\n componentReference: CreateGroupComponent,\r\n modalType: ModalType.FORM,\r\n };\r\n this.functionType = GroupFunctionType?.EDIT;\r\n this.openModal(dialogOptions, 'ieeesa-edit-group', editGroupInfo);\r\n }\r\n /**\r\n * Sets the dialog options for edit user roles and calls openModal method.\r\n * @memberof GroupsComponent\r\n */\r\n openEditUserRolesModal(selectedGroupInfo: GroupInfo): void {\r\n const selectedUserInfo = this.groupsService?.getSelectedUserInfo();\r\n const dialogOptions = {\r\n heading: selectedGroupInfo?.groupName,\r\n subHeading: selectedUserInfo?.name,\r\n isCloseNeeded: true,\r\n componentReference: EditUserRolesComponent,\r\n modalType: ModalType.FORM,\r\n };\r\n this.functionType = GroupFunctionType.EDIT_ROSTER_USER_ROLE;\r\n this.groupsService?.setGroupFunctionType(this.functionType);\r\n this.openModal(dialogOptions, 'ieeesa-edit-user-roles');\r\n }\r\n /**\r\n * Sets the dialog options for add users modal and calls openModal method.\r\n * @memberof GroupsComponent\r\n */\r\n openAddUserRosterModal(selectedGroupInfo: GroupInfo): void {\r\n const dialogOptions = {\r\n heading: selectedGroupInfo?.groupName,\r\n subHeading: this.addUserRosterTexts?.heading,\r\n isCloseNeeded: true,\r\n componentReference: AddUserRosterComponent,\r\n modalType: ModalType.FORM,\r\n };\r\n this.functionType = GroupFunctionType.ADD_USER_TO_ROSTER;\r\n this.groupsService?.setGroupFunctionType(this.functionType);\r\n this.openModal(dialogOptions, 'ieeesa-add-user-roster');\r\n }\r\n /**\r\n * Sets the dialog options for the bulk roster import modal and opens it.\r\n * Passes the selected group's id/name to the dynamically-instantiated\r\n * RosterImportComponent via the ModalComponent dynamic-input pattern.\r\n * @param {GroupInfo} selectedGroupInfo\r\n * @memberof GroupsComponent\r\n */\r\n openRosterImportModal(selectedGroupInfo: GroupInfo): void {\r\n const dialogOptions = {\r\n // Modal title row: \"← Back to Rosters / Import Roster\" + X close.\r\n // The \"Bulk Import Participants\" band + Import Roster action button are\r\n // rendered by RosterImportComponent itself (per the Figma).\r\n backButtonLabel: this.constants?.rosterImport?.backToRosters,\r\n heading: this.constants?.rosterImport?.heading,\r\n headingClass: 'ieeesa-modal-title__heading--breadcrumb',\r\n isCloseNeeded: true,\r\n componentReference: RosterImportComponent,\r\n modalType: ModalType.FORM,\r\n data2DynamicComponent: {\r\n groupId: selectedGroupInfo?.groupId,\r\n groupName: selectedGroupInfo?.groupName,\r\n },\r\n dataInputName: 'componentData',\r\n };\r\n this.functionType = GroupFunctionType.IMPORT_ROSTER;\r\n this.groupsService?.setGroupFunctionType(this.functionType);\r\n this.openModal(dialogOptions, 'ieeesa-roster-import-dialog');\r\n }\r\n /**\r\n * Sets the dialog options for users modal and calls openModal method.\r\n * @param {GroupInfo} group\r\n * @memberof GroupsComponent\r\n */\r\n viewRoster(group: GroupInfo): void {\r\n const dialogOptions = {\r\n heading: group?.groupName,\r\n isCloseNeeded: true,\r\n componentReference: ViewRosterComponent,\r\n modalType: ModalType.FORM_AND_CONTENT,\r\n };\r\n this.groupsService.setSelectedGroupInfo(group);\r\n this.functionType = GroupFunctionType.VIEW_ROSTER;\r\n this.groupsService?.setGroupFunctionType(GroupFunctionType?.EDIT);\r\n this.openModal(dialogOptions, 'ieeesa-view-roster');\r\n }\r\n /**\r\n * Opens modal component with for received params and handles form submission success and errors.\r\n * @param {*} dialogOptions\r\n * @param {string} [className]\r\n * @return -returns nothing\r\n * @memberof GroupsComponent\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-inferrable-types, no-unused-vars\r\n openModal(\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n dialogOptions: any,\r\n className?: string,\r\n groupInfo?: GroupInfo | EditGroupAndParentInfo\r\n ): void {\r\n className = className ?? '';\r\n this.dialogRef = this.dialog?.open(ModalComponent, {\r\n data: dialogOptions,\r\n width:\r\n this.functionType === GroupFunctionType.VIEW_ROSTER ||\r\n this.functionType === GroupFunctionType.EDIT_ROSTER_USER_ROLE ||\r\n this.functionType === GroupFunctionType.ADD_USER_TO_ROSTER ||\r\n this.functionType === GroupFunctionType.IMPORT_ROSTER ||\r\n this.functionType === GroupFunctionType.CREATE ||\r\n this.functionType === GroupFunctionType.EDIT\r\n ? ''\r\n : 'auto',\r\n panelClass: ['ieeesa-modal-dialog', className],\r\n ariaModal: true,\r\n });\r\n // Optional modal back button (e.g. roster import \"Back to Rosters\") — close\r\n // and return to the roster preview.\r\n this.dialogRef?.componentInstance?.backClick\r\n ?.pipe(takeUntil(this.destroy$))\r\n .subscribe(() => {\r\n // Clear the reopen flag before closing so the afterClosed handler (which\r\n // reopens the roster when canReopenViewRosterModal is true) does not fire\r\n // a second roster dialog — this handler performs the single reopen.\r\n this.canReopenViewRosterModal = false;\r\n this.dialogRef?.close();\r\n if (this.functionType === GroupFunctionType.IMPORT_ROSTER) {\r\n this.viewRoster(this.groupsService.selectedGroupInfo as GroupInfo);\r\n }\r\n });\r\n this.dialogRef?.componentInstance?.submitFormResponse\r\n .pipe(takeUntil(this.destroy$))\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, no-unused-vars\r\n .subscribe((result: any) => {\r\n this.dialogRef?.close();\r\n switch (this.functionType) {\r\n case GroupFunctionType?.CREATE: {\r\n this.showAlertMessage(\r\n AlertType?.SUCCESS,\r\n this.createGroupText?.message?.success?.submission\r\n );\r\n const createGroupInfo = groupInfo as GroupInfo;\r\n if (this.trimmedSearchTerm)\r\n this.onGroupSearchClick(this.trimmedSearchTerm);\r\n else if (this.selectedGroupType.id !== '')\r\n this.onGroupTypeFiltered(this.selectedGroupType);\r\n else if (createGroupInfo) this.getGroups(createGroupInfo);\r\n else this.getGroups();\r\n break;\r\n }\r\n case GroupFunctionType?.EDIT: {\r\n this.showAlertMessage(\r\n AlertType?.SUCCESS,\r\n this.editGroupTexts?.message?.success?.submission\r\n );\r\n const isParentGroupChanged =\r\n this.groupsService.getParentGroupChangeStatus();\r\n const editGroupInfo = groupInfo as EditGroupAndParentInfo;\r\n if (this.trimmedSearchTerm)\r\n this.onGroupSearchClick(this.trimmedSearchTerm);\r\n else if (this.selectedGroupType.id !== '')\r\n this.onGroupTypeFiltered(this.selectedGroupType);\r\n else if (editGroupInfo?.parentGroupInfo?.groupId === undefined) {\r\n this.getGroups();\r\n } else if (isParentGroupChanged) {\r\n this.groupsService.setGroupFunctionType(\r\n GroupFunctionType.REASSIGN_PARENT_GROUP\r\n );\r\n this.groupsService.setParentGroupChangeStatus(false);\r\n this.getGroups();\r\n } else this.getGroups(editGroupInfo.parentGroupInfo);\r\n break;\r\n }\r\n case GroupFunctionType?.EDIT_ROSTER_USER_ROLE: {\r\n this.groupsService.canShowMessage = true;\r\n this.groupsService.setRosterFunctionType(\r\n RosterFunctionType.EDIT_ROSTER_USER_ROLE\r\n );\r\n break;\r\n }\r\n case GroupFunctionType?.ADD_USER_TO_ROSTER: {\r\n this.groupsService.canShowMessage = true;\r\n this.groupsService.setRosterFunctionType(\r\n RosterFunctionType.ADD_USER_TO_ROSTER\r\n );\r\n break;\r\n }\r\n case GroupFunctionType?.IMPORT_ROSTER: {\r\n // Re-open the roster so the newly imported members are shown.\r\n this.canReopenViewRosterModal = false;\r\n this.viewRoster(\r\n this.groupsService.selectedGroupInfo as GroupInfo\r\n );\r\n break;\r\n }\r\n default:\r\n break;\r\n }\r\n });\r\n this.dialogRef?.componentInstance?.formCancel\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe(() => {\r\n this.dialogRef?.close();\r\n if (\r\n this.functionType === GroupFunctionType.ADD_USER_TO_ROSTER ||\r\n this.functionType === GroupFunctionType.EDIT_ROSTER_USER_ROLE ||\r\n this.functionType === GroupFunctionType.IMPORT_ROSTER\r\n ) {\r\n this.canReopenViewRosterModal = false;\r\n this.viewRoster(this.groupsService.selectedGroupInfo as GroupInfo);\r\n }\r\n });\r\n this.dialogRef\r\n ?.afterOpened()\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe(() => {\r\n if (\r\n this.functionType === GroupFunctionType.ADD_USER_TO_ROSTER ||\r\n this.functionType === GroupFunctionType.EDIT_ROSTER_USER_ROLE ||\r\n this.functionType === GroupFunctionType.IMPORT_ROSTER\r\n ) {\r\n this.canReopenViewRosterModal = true;\r\n }\r\n });\r\n this.dialogRef\r\n ?.afterClosed()\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe(() => {\r\n if (this.canReopenViewRosterModal) {\r\n this.canReopenViewRosterModal = false;\r\n this.viewRoster(this.groupsService.selectedGroupInfo as GroupInfo);\r\n }\r\n });\r\n }\r\n /**\r\n * Opens the confirmation modal to get user confirmation to delete the selected group.\r\n * @memberof GroupComponent\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n openDeleteConfirmationModal(groupInfo: GroupInfo): void {\r\n const confirmationInfo = screenTexts?.deleteGroup?.confirmationInfo;\r\n const deleteGroupModalOptions = {\r\n leftButtonLabel: confirmationInfo?.leftButtonLabel,\r\n rightButtonLabel: confirmationInfo?.rightButtonLabel,\r\n promptMessage:\r\n confirmationInfo?.promptMessage + groupInfo?.groupName + '?',\r\n actionButtonAlign: this.alignmentType?.MIDDLE,\r\n };\r\n this.dialogRef = this.dialog?.open(ModalConfirmationComponent, {\r\n data: deleteGroupModalOptions,\r\n width: 'auto',\r\n autoFocus: 'dialog',\r\n ariaLabel: this.constants?.ariaLabel?.alert,\r\n });\r\n this.dialogRef\r\n .afterClosed()\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe((result: boolean) => {\r\n if (result) {\r\n this.deleteGroup(groupInfo);\r\n }\r\n });\r\n }\r\n /**\r\n * This method sends API Request to delete the selected group and handles the success and error response of the http request.\r\n * @memberof GroupComponent\r\n */\r\n deleteGroup(groupInfo: GroupInfo): void {\r\n const deleteGroupText = screenTexts?.deleteGroup;\r\n this.deleteGroupName = groupInfo?.groupName;\r\n const deleteGroupPayload: DeleteGroupPayload = {\r\n payload: {\r\n groupId: groupInfo?.groupId,\r\n },\r\n };\r\n this.groupsService\r\n .deleteGroup(deleteGroupPayload)\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n next: (res: any) => {\r\n this.dialogRef?.close();\r\n if (res?.status) {\r\n if (this.trimmedSearchTerm)\r\n this.onGroupSearchClick(this.trimmedSearchTerm);\r\n else if (this.selectedGroupType.id !== '')\r\n this.onGroupTypeFiltered(this.selectedGroupType);\r\n else this.deletedGroupId = groupInfo?.groupId;\r\n this.showAlertMessage(\r\n AlertType?.SUCCESS,\r\n groupInfo?.groupName + deleteGroupText?.message?.success?.deletion\r\n );\r\n }\r\n },\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n error: (error: any) => {\r\n this.handleErrors(error);\r\n },\r\n });\r\n }\r\n /**\r\n * Shows the search field on click of search icon in case of mobile view\r\n * @memberof GroupsComponent\r\n */\r\n onGroupSearch(): void {\r\n this.isGroupSearchActive = true;\r\n this.isGroupFilterActive = false;\r\n }\r\n /**\r\n * Shows the Filter by dropdown options on click of filter icon in case of mobile view\r\n * @memberof GroupsComponent\r\n */\r\n showGroupFilter(): void {\r\n this.isGroupFilterActive = true;\r\n this.isGroupSearchActive = false;\r\n }\r\n /**\r\n * Sets isGroupSearchOrFilterActive to true and loads the groups those are configured with selected group type.\r\n * @param {string} searchTerm\r\n * @memberof GroupsComponent\r\n */\r\n\r\n onGroupSearchClick(searchTerm: string): void {\r\n this.trimmedSearchTerm = searchTerm.trim();\r\n this.groupsService.setGroupFunctionType(GroupFunctionType.SEARCH);\r\n if (\r\n !this.trimmedSearchTerm &&\r\n (this.isGroupSearchActive || this.isGroupFilterActive)\r\n ) {\r\n this.onGroupTypeFiltered(this.selectedGroupType);\r\n return;\r\n }\r\n if (!this.trimmedSearchTerm) return;\r\n this.isGroupSearchOrFilterActive = !!this.trimmedSearchTerm;\r\n this.onGroupSearch();\r\n this.groupsService\r\n .groupsByNameAcronym(\r\n this.trimmedSearchTerm,\r\n this.viewGroupTexts?.allGroupTypesOption ===\r\n this.selectedGroupType?.name\r\n ? undefined\r\n : (this.selectedGroupType?.id as number)\r\n )\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (response) => {\r\n if (response?.status) {\r\n this.parentGroupsInfo = this.viewGroupResponse(response?.body);\r\n }\r\n },\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n error: (error: any) => {\r\n this.parentGroupsInfo = [];\r\n this.handleErrors(error);\r\n },\r\n });\r\n }\r\n /**\r\n * Sets select group type options from groupTypes response\r\n * @return {*} {SelectOption[]}\r\n * @memberof GroupsComponent\r\n */\r\n getGroupTypeOptions(): SelectOption[] {\r\n const groupTypeOptions: SelectOption[] = [];\r\n groupTypeOptions.push({\r\n id: '',\r\n name: this.viewGroupTexts?.allGroupTypesOption,\r\n });\r\n this.sortGroupTypes()?.forEach((node) => {\r\n groupTypeOptions.push({ id: node[0], name: node[1]?.name });\r\n });\r\n return groupTypeOptions;\r\n }\r\n /**\r\n * Returns the sorted group types based on the view order.\r\n * @return [string, GroupType][]\r\n * @memberof GroupsComponent\r\n */\r\n sortGroupTypes(): [string, GroupType][] {\r\n return Object.entries(this.groupTypes).sort(\r\n (groupA: [string, GroupType], groupB: [string, GroupType]) =>\r\n (groupA[1]?.viewOrder as number) - (groupB[1]?.viewOrder as number)\r\n );\r\n }\r\n /**\r\n * Sets the isGroupSearchOrFilterActive flag and loads parent group info as per selected filter option.\r\n * @param {SelectOption} event\r\n * @memberof GroupsComponent\r\n */\r\n onGroupTypeFiltered(event: SelectOption): void {\r\n this.selectedGroupType = event;\r\n this.isGroupSearchOrFilterActive = !!this.selectedGroupType?.id;\r\n if (this.trimmedSearchTerm) {\r\n this.onGroupSearchClick(this.trimmedSearchTerm);\r\n this.showGroupFilter();\r\n return;\r\n }\r\n this.getGroupsPayload = {\r\n groupId: '',\r\n groupTypeId: this.selectedGroupType?.id as string,\r\n };\r\n this.trimmedSearchTerm = '';\r\n this.groupsService?.setGroupFunctionType(GroupFunctionType?.FILTER);\r\n this.getGroups();\r\n }\r\n /**\r\n * Loads all the parent groups information.\r\n * @memberof GroupsComponent\r\n */\r\n getGroups(group?: GroupInfo): void {\r\n if (group) {\r\n this.getGroupsPayload = {\r\n groupId: group?.groupId ?? '',\r\n groupTypeId: '',\r\n };\r\n } else if (this.getGroupsPayload.groupTypeId === '') {\r\n this.getGroupsPayload = {\r\n groupId: '',\r\n groupTypeId: '',\r\n };\r\n }\r\n this.groupsService\r\n .getGroups(this.getGroupsPayload)\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (response) => {\r\n if (response?.status) {\r\n if (group) {\r\n this.childGroupsInfo = this.viewGroupResponse(response?.body);\r\n } else {\r\n this.parentGroupsInfo = this.viewGroupResponse(response?.body);\r\n }\r\n }\r\n },\r\n error: (error) => {\r\n this.handleErrors(error);\r\n },\r\n });\r\n }\r\n /**\r\n * Sets groupType info with group response from groupType response\r\n * @param {GroupInfo[]} response\r\n * @return {*} {GroupInfo[]}\r\n * @memberof GroupsComponent\r\n */\r\n viewGroupResponse(response: GroupInfo[]): GroupInfo[] {\r\n response?.forEach((node) => {\r\n const groupTypeInfo: GroupType = this.groupTypes[node.groupType];\r\n node.groupTypeInfo = groupTypeInfo;\r\n });\r\n return response;\r\n }\r\n /**\r\n * Loads the group types.\r\n * @memberof GroupsComponent\r\n */\r\n getGroupTypes(): void {\r\n this.groupsService\r\n .getGroupTypes()\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (res) => {\r\n if (res?.status) {\r\n this.groupTypes = this.groupsService?.getFormattedGroupTypes(\r\n res?.body\r\n );\r\n this.selectGroupOptions = this.getGroupTypeOptions();\r\n this.selectedGroupType = this.selectGroupOptions[0];\r\n this.onGroupTypeFiltered(this.selectedGroupType);\r\n }\r\n },\r\n error: (error) => {\r\n this.handleErrors(error);\r\n },\r\n });\r\n }\r\n /**\r\n * Handles alerts for success, error and warning.\r\n * @param {(string | string[])} message -success or error or warning message.\r\n * @param {AlertType} alertType\r\n * @return -returns nothing\r\n * @memberof GroupsComponent\r\n */\r\n showAlertMessage(alertType: AlertType, message: string | string[]): void {\r\n this.alertService?.showMessage({\r\n status: 'custom',\r\n message: message,\r\n alertType: alertType,\r\n isCloseNeeded: true,\r\n });\r\n }\r\n /**\r\n * Captures the server side errors and handles it based on the custom or Http errors.\r\n * @param {HttpErrorResponse} error\r\n * @return -returns nothing\r\n * @memberof GroupsComponent\r\n */\r\n handleErrors(error: HttpErrorResponse): void {\r\n const errorCodes: string[] = error?.error?.body?.errorCodes;\r\n if (Array.isArray(errorCodes)) {\r\n const errorMessage: string[] =\r\n this.groupsService?.parseErrorMessage(errorCodes);\r\n if (errorCodes?.includes('1008')) {\r\n errorMessage[0] = this.deleteGroupName + errorMessage?.[0];\r\n }\r\n this.showAlertMessage(AlertType.ERROR, errorMessage);\r\n if (errorCodes?.includes('1010')) this.parentGroupsInfo = [];\r\n } else if (error && error instanceof HttpErrorResponse) {\r\n this.globalErrorHandlerService?.handleError(error);\r\n }\r\n }\r\n /**\r\n * NgOnDestroy performs necessary cleanup tasks, such as unsubscribing from subscription when the component is being destroyed.\r\n * @memberof GroupsComponent\r\n */\r\n ngOnDestroy(): void {\r\n this.destroy$.next(true);\r\n this.destroy$.unsubscribe();\r\n }\r\n}\r\n","<div class=\"ieeesa-groups px-4\">\r\n <div\r\n class=\"ieeesa-groups__info d-flex justify-content-between pb-3 align-items-center\"\r\n [ngClass]=\"\r\n isMobileView\r\n ? 'ieeesa-groups__info--white-bg'\r\n : 'ieeesa-groups__info--blue-bg'\r\n \"\r\n >\r\n <p\r\n class=\"mb-0\"\r\n [ngClass]=\"\r\n isMobileView\r\n ? 'ieeesa-title-lg-24 p-0'\r\n : 'ieeesa-headline-lg-32 ieeesa-groups__info__heading'\r\n \"\r\n >\r\n {{ groupsPageInfo?.groupsTitle }}\r\n </p>\r\n <div\r\n class=\"d-flex d-sm-flex d-md-none d-lg-none d-xl-none ieeesa-groups__mobile-icons gap-2\"\r\n >\r\n <ieeesa-icon-button\r\n [iconButton]=\"createGroupIcon\"\r\n *ngIf=\"\r\n validateAccess(permissionType.CREATE_ROOT_GROUP) ||\r\n validateAccess(this.permissionType.MANAGE_ALL_GROUPS)\r\n \"\r\n (iconButtonClick)=\"openCreateGroupForm()\"\r\n >\r\n </ieeesa-icon-button>\r\n <ieeesa-icon-button\r\n [iconButton]=\"filterGroupIcon\"\r\n (iconButtonClick)=\"showGroupFilter()\"\r\n >\r\n </ieeesa-icon-button>\r\n <ieeesa-icon-button\r\n [iconButton]=\"searchGroupIcon\"\r\n (iconButtonClick)=\"onGroupSearch()\"\r\n >\r\n </ieeesa-icon-button>\r\n </div>\r\n </div>\r\n <div\r\n class=\"ieeesa-groups__actions\"\r\n [ngClass]=\"\r\n isMobileView\r\n ? 'ieeesa-groups__actions--white-bg'\r\n : 'ieeesa-groups__actions--blue-bg'\r\n \"\r\n >\r\n <div class=\"ieeesa-groups__actions--search row\">\r\n <div\r\n class=\"order-2 order-sm-1 col-12 col-md-7 col-lg-7 col-xl-7 d-flex flex-column justify-content-between\"\r\n >\r\n <p class=\"ieeesa-body-md-16\">\r\n {{ groupsPageInfo?.groupsDescription }}\r\n </p>\r\n <button\r\n [ngClass]=\"\r\n isMobileView ? 'p-0' : 'ieeesa-groups__actions__add-group-btn'\r\n \"\r\n mat-button\r\n *ngIf=\"\r\n validateAccess(permissionType.CREATE_ROOT_GROUP) ||\r\n validateAccess(this.permissionType.MANAGE_ALL_GROUPS)\r\n \"\r\n class=\"ieeesa-groups__create-subgroup mat-tertiary-button d-none d-sm-none d-md-block d-lg-block d-xl-block\"\r\n (click)=\"openCreateGroupForm()\"\r\n [attr.aria-label]=\"constants?.viewGroups?.ariaLabel?.addGroup\"\r\n >\r\n {{ constants?.viewGroups?.addGroup }}\r\n </button>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"\r\n ((isGroupSearchActive || isGroupFilterActive) && isMobileView) ||\r\n !isMobileView\r\n \"\r\n class=\"order-1 order-sm-2 col-12 col-md-5 col-lg-5 col-xl-5 d-flex flex-column\"\r\n [ngClass]=\"isMobileView ? 'ieeesa-search-mobile-view' : ''\"\r\n >\r\n <ieeesa-search\r\n *ngIf=\"isGroupSearchActive || !isMobileView\"\r\n (searchValue)=\"onGroupSearchClick($event)\"\r\n [searchTerm]=\"trimmedSearchTerm\"\r\n [searchType]=\"searchType\"\r\n [placeholderLabel]=\"searchPlaceHolderText\"\r\n [minCharacterToSearch]=\"minCharacterToSearch\"\r\n [supportMessage]=\"supportMessage\"\r\n ></ieeesa-search>\r\n\r\n <ieeesa-select\r\n *ngIf=\"isGroupFilterActive || !isMobileView\"\r\n class=\"align-self-end pt-lg-4 pt-md-4 pt-xl-4\"\r\n [isSortNeeded]=\"false\"\r\n [dropdownOptions]=\"selectGroupOptions\"\r\n [isLabelAlignedLeft]=\"true\"\r\n [selectLabel]=\"constants?.viewGroups?.filterByLabel\"\r\n (optionSelected)=\"onGroupTypeFiltered($event)\"\r\n [placeholderText]=\"filterPlaceHolderText\"\r\n [selectedOptions]=\"selectedGroupType\"\r\n ></ieeesa-select>\r\n </div>\r\n </div>\r\n <ieeesa-tree\r\n *ngIf=\"parentGroupsInfo && parentGroupsInfo.length > 0\"\r\n [parentGroupsInfo]=\"parentGroupsInfo\"\r\n [childGroupsInfo]=\"childGroupsInfo\"\r\n [deletedGroupIdInfo]=\"deletedGroupId\"\r\n [isGroupSearchOrFilterActive]=\"isGroupSearchOrFilterActive\"\r\n [userGroupPermissions]=\"userGroupPermissions\"\r\n (toggleGroupClick)=\"getGroups($event)\"\r\n (createGroupClick)=\"openCreateGroupForm($event)\"\r\n (deleteGroupClick)=\"openDeleteConfirmationModal($event)\"\r\n (viewRosterClick)=\"viewRoster($event)\"\r\n (editGroupClick)=\"openEditGroupForm($event)\"\r\n ></ieeesa-tree>\r\n </div>\r\n</div>\r\n","import { NgModule } from '@angular/core';\r\n\r\n@NgModule({\r\n declarations: [],\r\n imports: [\r\n ],\r\n exports: []\r\n})\r\nexport class GroupsModule { }\r\n","/*\r\n * Public API Surface of groups\r\n */\r\nexport * from './lib/components/create-group/create-group.component';\r\nexport * from './lib/components/tree-view/tree-view.component';\r\nexport * from './lib/components/edit-user-roles/edit-user-roles.component';\r\nexport * from './lib/components/reciprocal-credit-section/reciprocal-credit-section.component';\r\nexport * from './lib/components/add-working-groups/add-working-groups.component';\r\nexport * from './lib/components/roster-import/roster-import.component';\r\nexport * from './lib/groups.component';\r\n\r\nexport * from './lib/models/create-group.model';\r\nexport * from './lib/models/group-action.model';\r\nexport * from './lib/models/group-function-type.model';\r\nexport * from './lib/models/group-info.model';\r\nexport * from './lib/models/group-types.model';\r\nexport * from './lib/models/view-group.model';\r\nexport * from './lib/models/edit-group.model';\r\nexport * from './lib/models/delete-group.model';\r\nexport * from './lib/models/group-user-info.model';\r\nexport * from './lib/models/add-or-edit-user-group.model';\r\nexport * from './lib/models/roster-function-type.model';\r\nexport * from './lib/models/classification.model';\r\nexport * from './lib/models/filter-type.model';\r\nexport * from './lib/models/organization.model';\r\nexport * from './lib/models/role-type.model';\r\nexport * from './lib/models/roster-type.model';\r\nexport * from './lib/models/table-column-schema-user-group.model';\r\nexport * from './lib/models/parent-groups-info.model';\r\nexport * from './lib/models/reciprocal-credit.model';\r\n\r\nexport * from './lib/services/groups.service';\r\nexport * from './lib/services/roster-export.service';\r\n\r\nexport * from './lib/models/roster-import.model';\r\n\r\nexport * from './lib/assets/form-validations';\r\n\r\nexport * from './lib/groups.module';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i3","i1.GroupPermissionsMapService","screenTexts?.errors","i1","i2.UserPermissionsService","i3.GroupPermissionsMapService","i1.GroupsService","i2","screenTexts?.createGroup","takeUntil","map","constants","i4","catchError","constants?.errors","constants?.deleteUsersGroup","constants?.ariaLabel","i2.GroupsService","i4.RosterExportService","i5","i6","screenTexts?.deleteGroup","i5.UserPermissionsService","i6.GroupPermissionsMapService","i7"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ieeesa-npm-groups.mjs","sources":["../../../projects/groups/src/lib/assets/form-validations.ts","../../../projects/groups/src/lib/models/group-function-type.model.ts","../../../projects/groups/src/lib/components/add-working-groups/add-working-groups.component.ts","../../../projects/groups/src/lib/components/add-working-groups/add-working-groups.component.html","../../../projects/groups/src/lib/models/roster-type.model.ts","../../../projects/groups/src/lib/models/permission-type.model.ts","../../../projects/groups/src/lib/models/role-type.model.ts","../../../projects/groups/src/lib/services/group-permissions-map-service.ts","../../../projects/groups/src/lib/services/user-permissions.service.ts","../../../projects/groups/src/lib/services/groups.service.ts","../../../projects/groups/src/lib/components/reciprocal-credit-section/reciprocal-credit-section.component.ts","../../../projects/groups/src/lib/components/reciprocal-credit-section/reciprocal-credit-section.component.html","../../../projects/groups/src/lib/components/create-group/create-group.component.ts","../../../projects/groups/src/lib/components/create-group/create-group.component.html","../../../projects/groups/src/lib/models/group-action.model.ts","../../../projects/groups/src/lib/components/tree-view/tree-view.component.ts","../../../projects/groups/src/lib/components/tree-view/tree-view.component.html","../../../projects/groups/src/lib/components/org-multi-select/org-multi-select.component.ts","../../../projects/groups/src/lib/components/org-multi-select/org-multi-select.component.html","../../../projects/groups/src/lib/components/edit-user-roles/edit-user-roles.component.ts","../../../projects/groups/src/lib/components/edit-user-roles/edit-user-roles.component.html","../../../projects/groups/src/lib/services/roster-import-api.service.ts","../../../projects/groups/src/lib/components/roster-import/roster-import.component.ts","../../../projects/groups/src/lib/components/roster-import/roster-import.component.html","../../../projects/groups/src/lib/components/roster-import-history/roster-import-history.component.ts","../../../projects/groups/src/lib/components/roster-import-history/roster-import-history.component.html","../../../projects/groups/src/lib/components/interested-rosters/interested-rosters.component.ts","../../../projects/groups/src/lib/components/interested-rosters/interested-rosters.component.html","../../../projects/groups/src/lib/components/interest-form/interest-form.component.ts","../../../projects/groups/src/lib/components/interest-form/interest-form.component.html","../../../projects/groups/src/lib/components/interest-form-management/interest-form-management.component.ts","../../../projects/groups/src/lib/components/interest-form-management/interest-form-management.component.html","../../../projects/groups/src/lib/models/roster-function-type.model.ts","../../../projects/groups/src/lib/components/add-user-roster/add-user-roster.component.ts","../../../projects/groups/src/lib/components/add-user-roster/add-user-roster.component.html","../../../projects/groups/src/lib/models/filter-type.model.ts","../../../projects/groups/src/lib/models/table-column-schema-user-group.model.ts","../../../projects/groups/src/lib/services/roster-export.service.ts","../../../projects/groups/src/lib/components/view-roster/view-roster.component.ts","../../../projects/groups/src/lib/components/view-roster/view-roster.component.html","../../../projects/groups/src/lib/groups.component.ts","../../../projects/groups/src/lib/groups.component.html","../../../projects/groups/src/lib/models/roster-import.model.ts","../../../projects/groups/src/lib/groups.module.ts","../../../projects/groups/src/public-api.ts","../../../projects/groups/src/ieeesa-npm-groups.ts"],"sourcesContent":["/* eslint-disable no-useless-escape */\r\nimport { AbstractControl, ValidationErrors, ValidatorFn } from '@angular/forms';\r\n\r\n/**\r\n * Required validator for the multi-select-autocomplete \"Representing Organization\"\r\n * control. The control's value is the array of selected chips (set by the\r\n * component), so this treats a non-empty array — or a non-empty string — as\r\n * valid. Keying off the selection (rather than the raw input text) prevents the\r\n * required error from flashing when Material momentarily writes a transient\r\n * empty value during option selection.\r\n * @return {ValidatorFn}\r\n */\r\nexport function representingOrgRequiredValidator(): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n const value = control?.value;\r\n const hasSelection = Array.isArray(value)\r\n ? value.length > 0\r\n : !!(typeof value === 'string' ? value.trim() : value);\r\n return hasSelection ? null : { required: true };\r\n };\r\n}\r\n\r\n/**\r\n * Wraps a string-oriented validator (minLength/maxLength/pattern) so it is\r\n * skipped when the control value is the selection array. Those built-in\r\n * validators evaluate `.length` / string shape and would incorrectly fail\r\n * against the chips array; they should only constrain free-text input.\r\n * @param {ValidatorFn} validator the underlying string validator\r\n * @return {ValidatorFn}\r\n */\r\nexport function skipWhenArray(validator: ValidatorFn): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n if (Array.isArray(control?.value)) {\r\n return null;\r\n }\r\n return validator(control);\r\n };\r\n}\r\n\r\nexport const GroupsValidationPatterns = {\r\n // Group Name field regular expression, which accept Alpha Numeric, Special Characters (ASCII) and whitespace.\r\n groupName: /^(?=.*[a-zA-Z])[\\w\\s!\"#$%&'()*+,-.\\/\\:;<=>?@[\\]^_`{|}~\\\\]+$/i,\r\n // Group Short Name field regular expression which accept letters, numbers and \".\",\",\" , \"/\", \"-\" , \"_\" characters.\r\n shortName: /^(?=[a-zA-Z0-9])[a-zA-Z0-9.,\\/\\-_]+$/,\r\n // Group Scope field regular expression which accept Alpha Numeric, Special Characters and whitespace.\r\n groupScope: /^(?=.*[a-zA-Z])[\\w\\s!\"#$%&'()*+,-.\\/\\:;<=>?@[\\]^_`{|}~\\\\]+$/i,\r\n email: /^[\\w-\\.]+@([\\w-]+\\.)+[\\w-]{2,4}$/,\r\n representingOrgNameMaxLength: 250,\r\n representingOrgNameMinLength: 3,\r\n // Representing Organization field regular expression which accept Alpha Numeric, Special Characters and whitespace.\r\n representingOrganization:\r\n /^(?=.*[a-zA-Z])[\\w\\s!\"#$%&'()*+,-.\\/\\:;<=>?@[\\]^_`{|}~\\\\]+$/i,\r\n // First or Last Name field regular expression which does not allow only whitespace or empty string.\r\n firstOrLastName: /^(?!\\s*$).+/\r\n};\r\n","/* eslint-disable no-unused-vars */\r\nexport enum GroupFunctionType {\r\n CREATE = 'CREATE',\r\n EDIT = 'EDIT',\r\n VIEW_ROSTER = 'VIEW_ROSTER',\r\n FILTER = 'FILTER',\r\n TOGGLE = 'TOGGLE',\r\n SEARCH = 'SEARCH',\r\n REASSIGN_PARENT_GROUP = 'REASSIGN_PARENT_GROUP',\r\n EDIT_ROSTER_USER_ROLE = 'EDIT_ROSTER_USER_ROLE',\r\n ADD_USER_TO_ROSTER = 'ADD_USER_TO_ROSTER',\r\n IMPORT_ROSTER = 'IMPORT_ROSTER',\r\n VIEW_IMPORT_HISTORY = 'VIEW_IMPORT_HISTORY',\r\n}","import { Component, Inject, ViewEncapsulation } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport {\r\n MAT_DIALOG_DATA,\r\n MatDialogModule,\r\n MatDialogRef,\r\n} from '@angular/material/dialog';\r\nimport { AvailableForeignGroup } from '../../models/reciprocal-credit.model';\r\n\r\n/** Data passed into the Add Working Groups modal. */\r\nexport interface AddWorkingGroupsDialogData {\r\n availableGroups: AvailableForeignGroup[];\r\n selectedGroupIds: string[];\r\n}\r\n\r\n/** Row model with a local selection flag. */\r\ninterface WorkingGroupRow extends AvailableForeignGroup {\r\n selected: boolean;\r\n}\r\n\r\n/**\r\n * Modal to select one or more foreign working groups (under the same committee)\r\n * for reciprocal credit. Provides search and a checkbox table. Returns the\r\n * selected AvailableForeignGroup[] on Add.\r\n * @export\r\n * @class AddWorkingGroupsComponent\r\n */\r\n@Component({\r\n // eslint-disable-next-line @angular-eslint/component-selector\r\n selector: 'ieeesa-add-working-groups',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule, MatButtonModule, MatDialogModule],\r\n templateUrl: './add-working-groups.component.html',\r\n styleUrls: ['./add-working-groups.component.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class AddWorkingGroupsComponent {\r\n rows: WorkingGroupRow[] = [];\r\n searchTerm = '';\r\n\r\n // eslint-disable-next-line no-unused-vars\r\n constructor(\r\n // eslint-disable-next-line no-unused-vars\r\n private dialogRef: MatDialogRef<AddWorkingGroupsComponent>,\r\n // eslint-disable-next-line no-unused-vars\r\n @Inject(MAT_DIALOG_DATA) private data: AddWorkingGroupsDialogData\r\n ) {\r\n const selectedIds = new Set(this.data?.selectedGroupIds ?? []);\r\n this.rows = (this.data?.availableGroups ?? []).map((group) => ({\r\n ...group,\r\n selected: selectedIds.has(group.groupId),\r\n }));\r\n }\r\n\r\n /** Rows filtered by the search term (group name). */\r\n get filteredRows(): WorkingGroupRow[] {\r\n const term = this.searchTerm.trim().toLowerCase();\r\n if (!term) return this.rows;\r\n return this.rows.filter((row) =>\r\n row.groupName.toLowerCase().includes(term)\r\n );\r\n }\r\n\r\n /** Count of currently selected rows (for the title). */\r\n get selectedCount(): number {\r\n return this.rows.filter((row) => row.selected).length;\r\n }\r\n\r\n /** Toggle a row's selection. */\r\n toggleRow(row: WorkingGroupRow): void {\r\n row.selected = !row.selected;\r\n }\r\n\r\n onCancel(): void {\r\n this.dialogRef.close();\r\n }\r\n\r\n onAdd(): void {\r\n const selected: AvailableForeignGroup[] = this.rows\r\n .filter((row) => row.selected)\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars, no-unused-vars\r\n .map(({ selected, ...group }) => group);\r\n this.dialogRef.close(selected);\r\n }\r\n}\r\n","<div class=\"ieeesa-add-working-groups\">\r\n <div class=\"ieeesa-add-working-groups__header\">\r\n <h2 class=\"ieeesa-add-working-groups__title\">\r\n Add Working Groups ({{ selectedCount }})\r\n </h2>\r\n <button\r\n type=\"button\"\r\n class=\"ieeesa-add-working-groups__close\"\r\n (click)=\"onCancel()\"\r\n aria-label=\"Close\"\r\n >\r\n ×\r\n </button>\r\n </div>\r\n\r\n <p class=\"ieeesa-add-working-groups__subtitle\">Choose working groups under the same committee</p>\r\n\r\n <!-- Search -->\r\n <div class=\"ieeesa-add-working-groups__search\">\r\n <input\r\n type=\"text\"\r\n [(ngModel)]=\"searchTerm\"\r\n placeholder=\"Search by name...\"\r\n aria-label=\"Search working groups\"\r\n />\r\n </div>\r\n\r\n <!-- Table -->\r\n <div class=\"ieeesa-add-working-groups__table\">\r\n <div class=\"ieeesa-add-working-groups__table-head\">\r\n <span class=\"ieeesa-add-working-groups__col-name\">Working Group</span>\r\n </div>\r\n\r\n <div\r\n *ngFor=\"let row of filteredRows\"\r\n class=\"ieeesa-add-working-groups__row\"\r\n >\r\n <label class=\"ieeesa-add-working-groups__col-name\">\r\n <input\r\n type=\"checkbox\"\r\n [checked]=\"row.selected\"\r\n (change)=\"toggleRow(row)\"\r\n />\r\n <span>{{ row.groupName }}</span>\r\n </label>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"filteredRows.length === 0\"\r\n class=\"ieeesa-add-working-groups__empty\"\r\n >\r\n No working groups found.\r\n </div>\r\n </div>\r\n\r\n <!-- Actions -->\r\n <div class=\"ieeesa-add-working-groups__actions\">\r\n <button\r\n mat-button\r\n type=\"button\"\r\n class=\"mat-tertiary-button\"\r\n (click)=\"onCancel()\"\r\n >\r\n Cancel\r\n </button>\r\n <button\r\n mat-button\r\n type=\"button\"\r\n class=\"mat-primary-button\"\r\n [disabled]=\"selectedCount === 0\"\r\n (click)=\"onAdd()\"\r\n >\r\n Add\r\n </button>\r\n </div>\r\n</div>\r\n","/* eslint-disable no-unused-vars */\r\nexport enum GroupRosterType {\r\n INDIVIDUAL = 'Individual',\r\n SYSTEM_USER = 'User',\r\n ENTITY = 'Entity',\r\n}\r\n","/* eslint-disable no-unused-vars */\r\nexport enum PermissionType {\r\n VIEW_GROUPS = 'VIEW_GROUPS',\r\n CREATE_ROOT_GROUP = 'CREATE_ROOT_GROUP',\r\n CREATE_SUBGROUP = 'CREATE_SUBGROUP',\r\n EDIT_GROUP = 'EDIT_GROUP',\r\n DELETE_GROUP = 'DELETE_GROUP',\r\n VIEW_GROUP_OFFICERS = 'VIEW_GROUP_OFFICERS',\r\n MANAGE_GROUP_OFFICERS = 'MANAGE_GROUP_OFFICERS',\r\n VIEW_GROUP_MEMBERS = 'VIEW_GROUP_MEMBERS',\r\n MANAGE_GROUP_MEMBERS = 'MANAGE_GROUP_MEMBERS',\r\n MANAGE_SYSTEM_USERS = 'MANAGE_SYSTEM_USERS',\r\n VIEW_ALL_GROUPS = 'VIEW_ALL_GROUPS',\r\n MANAGE_ALL_GROUPS = 'MANAGE_ALL_GROUPS',\r\n VIEW_ALL_ROSTERS = 'VIEW_ALL_ROSTERS',\r\n MANAGE_ALL_ROSTERS = 'MANAGE_ALL_ROSTERS',\r\n MANAGE_CUSTOM_INTEREST_QUESTIONS = 'MANAGE_CUSTOM_INTEREST_QUESTIONS',\r\n}\r\n","/* eslint-disable no-unused-vars */\r\nexport enum RoleType {\r\n OFFICER = 'Officer',\r\n SYSTEM = 'System',\r\n MEMBER_LEVEL = 'Member Level',\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { GroupPermission } from '../models/group-permissions.model';\r\nimport { PermissionType } from '../models/permission-type.model';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class GroupPermissionsMapService {\r\n groupPermissions: GroupPermission[] = [\r\n {\r\n permissionType: PermissionType.VIEW_GROUPS,\r\n permissionName: 'View Groups',\r\n permissionId: 'PERM_c05ff592-7178-4614-b730-7a7a8828824e',\r\n },\r\n {\r\n permissionType: PermissionType.CREATE_ROOT_GROUP,\r\n permissionName: 'Create Parent Group',\r\n permissionId: 'PERM_fc522748-e2d4-440c-b6c6-41aaca75a80f',\r\n },\r\n {\r\n permissionType: PermissionType.CREATE_SUBGROUP,\r\n permissionName: 'Create Subgroup',\r\n permissionId: 'PERM_8f8a203e-d992-4555-9c42-ac6970f2d376',\r\n },\r\n {\r\n permissionType: PermissionType.DELETE_GROUP,\r\n permissionName: 'Delete Group',\r\n permissionId: 'PERM_008229bf-6a12-4281-88d8-4a2bc9597573',\r\n },\r\n {\r\n permissionType: PermissionType.EDIT_GROUP,\r\n permissionName: 'Edit Group Details',\r\n permissionId: 'PERM_d64e1f09-d3f7-4f86-a94c-4782a2f60571',\r\n },\r\n {\r\n permissionType: PermissionType.VIEW_GROUP_OFFICERS,\r\n permissionName: 'View Group Officers',\r\n permissionId: 'PERM_f80ac8a3-60b8-4ae4-bedf-ce1d89c54354',\r\n },\r\n {\r\n permissionType: PermissionType.MANAGE_GROUP_OFFICERS,\r\n permissionName: 'Manage Group Officers',\r\n permissionId: 'PERM_9ddd51db-f481-47ea-946b-e88815973cfb',\r\n },\r\n {\r\n permissionType: PermissionType.VIEW_GROUP_MEMBERS,\r\n permissionName: 'View Group Members',\r\n permissionId: 'PERM_5a8edb91-a132-4670-90a3-25fb6982307a',\r\n },\r\n {\r\n permissionType: PermissionType.MANAGE_GROUP_MEMBERS,\r\n permissionName: 'Manage Group Member',\r\n permissionId: 'PERM_1969fecb-6383-446e-9276-b6a7b7265cb4',\r\n },\r\n ];\r\n globalGroupPermissions: GroupPermission[] = [\r\n {\r\n permissionType: PermissionType.MANAGE_SYSTEM_USERS,\r\n permissionName: 'Manage System Users',\r\n permissionId: 'PERM_d2c103e9-20c6-4dd5-b320-f7d4d017c574',\r\n },\r\n {\r\n permissionType: PermissionType.VIEW_ALL_GROUPS,\r\n permissionName: 'View All Group Details',\r\n permissionId: 'PERM_741d7504-7595-4bec-811f-8d601333e7c4',\r\n },\r\n {\r\n permissionType: PermissionType.MANAGE_ALL_GROUPS,\r\n permissionName: 'Manage All Group Details',\r\n permissionId: 'PERM_eebde105-0b53-44c8-babc-066be903229f',\r\n },\r\n {\r\n permissionType: PermissionType.VIEW_ALL_ROSTERS,\r\n permissionName: 'View All Rosters',\r\n permissionId: 'PERM_0109d7c7-6d64-4673-b63b-3a23f3323530',\r\n },\r\n {\r\n permissionType: PermissionType.MANAGE_ALL_ROSTERS,\r\n permissionName: 'Manage All Rosters',\r\n permissionId: 'PERM_6fec2e8c-1b48-46a9-b394-34d3648d6fe8',\r\n },\r\n ];\r\n /**\r\n * Returns group-wise permission mappings.\r\n * @return {GroupPermission[]}\r\n * @memberof GroupPermissionsMapService\r\n */\r\n getGroupPermissions(): GroupPermission[] {\r\n return this.groupPermissions;\r\n }\r\n /**\r\n * Returns global permissions mapping for groups.\r\n * Global permissions are maintained separately as global permissions also include role based group wise permissions irrespective of the attached group.\r\n * @return {GroupPermission[]}\r\n * @memberof GroupPermissionsMapService\r\n */\r\n getGlobalGroupPermissions(): GroupPermission[] {\r\n return this.globalGroupPermissions;\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { PermissionType } from '../models/permission-type.model';\r\nimport { GroupPermissionsMapService } from './group-permissions-map-service';\r\nimport {\r\n GroupPermission,\r\n UserPermission,\r\n} from '../models/group-permissions.model';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class UserPermissionsService {\r\n // eslint-disable-next-line no-unused-vars, no-empty-function\r\n constructor(private groupPermissionsService: GroupPermissionsMapService) {}\r\n\r\n /**\r\n * Returns access provision for the passed action/feature based on whether the signed in user has appropriate permission.\r\n * @param {PermissionType} permission\r\n * @param {GroupPermission[]} userGroupPermissions\r\n * @return {boolean}\r\n * @memberof UserPermissionsService\r\n */\r\n validateAccessPermission(\r\n permission: PermissionType,\r\n userGroupPermissions: GroupPermission[]\r\n ): boolean {\r\n const isPermitted = userGroupPermissions\r\n ? userGroupPermissions?.some(\r\n ({ permissionType }) => permissionType === permission\r\n )\r\n : false;\r\n return isPermitted;\r\n }\r\n\r\n /**\r\n * Filters signed in user group permissions from entire group permissions.\r\n * @param {UserPermissions[]} userPermissions\r\n * @return {GroupPermissions[]}\r\n * @memberof UserPermissionsService\r\n */\r\n filterUserGroupPermissions(\r\n userPermissions: UserPermission[],\r\n groupPermissions: GroupPermission[]\r\n ): GroupPermission[] {\r\n const userGroupPermissions = groupPermissions?.filter(\r\n (permission: GroupPermission) =>\r\n userPermissions?.find(\r\n ({ permissionId }) => permission?.permissionId === permissionId\r\n )\r\n );\r\n return userGroupPermissions;\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Observable, map, catchError, BehaviorSubject } from 'rxjs';\r\nimport {\r\n CreateGroupPayload,\r\n CreateGroupResponse,\r\n} from '../models/create-group.model';\r\nimport {\r\n BusinessRule,\r\n GroupTypeConfiguration,\r\n GroupTypeConfigValue,\r\n GroupTypeResponse,\r\n} from '../models/group-types.model';\r\nimport { AlertsService, HttpService } from '@ieeesa-npm/utility';\r\nimport { GetGroupResponse, GetGroupsPayload } from '../models/view-group.model';\r\nimport * as screenTexts from '../assets/constants.json';\r\nimport { DeleteGroupPayload } from '../models/delete-group.model';\r\nimport { GroupInfo } from '../models/group-info.model';\r\nimport {\r\n SearchUsersPayload,\r\n FilterUsersPayload,\r\n GetGroupUsersResponse,\r\n User,\r\n LoggedInUserInfo,\r\n} from '../models/user.model';\r\nimport { Role } from '../models/role.model';\r\nimport { EditGroupPayload } from '../models/edit-group.model';\r\nimport {\r\n AvailableForeignGroup,\r\n ReciprocalCreditConfigRow,\r\n ReciprocalCreditResponse,\r\n SaveReciprocalCreditPayload,\r\n} from '../models/reciprocal-credit.model';\r\nimport { GroupFunctionType } from '../models/group-function-type.model';\r\nimport { RosterFunctionType } from '../models/roster-function-type.model';\r\nimport { GroupUserInfo } from '../models/group-user-info.model';\r\nimport {\r\n AddOrEditUserPayload,\r\n AddOrEditGroupUserDetailsResponse,\r\n AddOrEditUserIndividualRosterPayload,\r\n RepresentingOrganization,\r\n} from '../models/add-or-edit-user-group.model';\r\nimport { DeleteUserGroupPayload } from '../models/delete-user-group.model';\r\nimport {\r\n GetUserDetailsPayload,\r\n SearchUserByEmailResponse,\r\n} from '../models/add-new-user.model';\r\nimport {\r\n OrganizationRequestPayload,\r\n OrganizationResponse,\r\n} from '../models/organization.model';\r\nimport { ClassificationResponse } from '../models/classification.model';\r\nimport { GroupRosterType } from '../models/roster-type.model';\r\nimport { FormStatus, CheckboxOption, AlertType } from '@ieeesa-npm/models';\r\nimport { FormControlStatus } from '@angular/forms';\r\nimport {\r\n GroupPermission,\r\n UserPermission,\r\n} from '../models/group-permissions.model';\r\nimport { PermissionType } from '../models/permission-type.model';\r\nimport { UserPermissionsService } from './user-permissions.service';\r\nimport { GroupPermissionsMapService } from './group-permissions-map-service';\r\nimport { ParentGroupsInfo } from '../models/parent-groups-info.model';\r\nimport { RoleType } from '../models/role-type.model';\r\n\r\n/**\r\n * Groups service is an abstract layer and responsible for managing groups REST API calls.\r\n * @class GroupsService\r\n */\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class GroupsService {\r\n groupsText = screenTexts?.errors;\r\n apiBaseUrl!: string;\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n userPermission: any;\r\n selectedGroupInfo!: GroupInfo | undefined;\r\n groupFunctionType!: GroupFunctionType;\r\n selectedGroupParentInfo!: GroupInfo | undefined;\r\n openModalNotifier = new BehaviorSubject<GroupFunctionType>(\r\n GroupFunctionType.VIEW_ROSTER\r\n );\r\n groupTypeRoles!: CheckboxOption[];\r\n selectedUserInfo!: GroupUserInfo;\r\n canShowMessage = false;\r\n rosterFunctionType!: RosterFunctionType;\r\n userGroupPermissions!: GroupPermission[];\r\n groupTypes!: GroupTypeConfiguration[];\r\n isParentGroupChanged = false;\r\n userInfo!: LoggedInUserInfo;\r\n memberTypes!: Role[];\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n representingOrganizations: RepresentingOrganization[] = [];\r\n // eslint-disable-next-line no-empty-function, no-unused-vars\r\n constructor(\r\n // eslint-disable-next-line no-unused-vars\r\n private httpService: HttpService,\r\n // eslint-disable-next-line no-unused-vars\r\n private userPermissionsService: UserPermissionsService,\r\n // eslint-disable-next-line no-unused-vars\r\n private groupPermissionsService: GroupPermissionsMapService,\r\n // eslint-disable-next-line no-unused-vars\r\n public alertService: AlertsService // eslint-disable-next-line no-empty-function\r\n ) {}\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n setAppConfig(apiBaseUrl: string, userPermission: any) {\r\n this.apiBaseUrl = apiBaseUrl;\r\n this.userPermission = userPermission;\r\n }\r\n /**\r\n * Gets application group types from API and returns it as an observable.\r\n * @return {Observable<GroupTypeResponse>} -It returns group types if success else error.\r\n * @memberof GroupsService\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n getGroupTypes(): Observable<GroupTypeResponse> {\r\n return this.httpService\r\n .getData(`${this.apiBaseUrl}/groups/config/groupTypeConfigInfo`)\r\n .pipe(\r\n map((response) => {\r\n this.setLoadedGroupTypes(response?.body);\r\n return response;\r\n }),\r\n catchError((error) => {\r\n throw error;\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Get allowed parent groups from API and returns it as an observable.\r\n * @param {string} groupId\r\n * @return {Observable<GroupTypeResponse>}\r\n * @memberof GroupsService\r\n */\r\n getAllowedParentGroups(groupId: string): Observable<ParentGroupsInfo[]> {\r\n return this.httpService\r\n .getData(`${this.apiBaseUrl}/groups/allowedParentGroups/${groupId}`)\r\n .pipe(\r\n map((response) => {\r\n return response?.body;\r\n }),\r\n catchError((error) => {\r\n throw error;\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Returns all the groups based on passed group Id and group type.\r\n * @param {GetGroupsPayload} getGroupsPayload\r\n * @return {Observable<GetGroupResponse>}\r\n * @memberof GroupsService\r\n */\r\n getGroups(getGroupsPayload: GetGroupsPayload): Observable<GetGroupResponse> {\r\n let url = 'rootGroups';\r\n if (getGroupsPayload.groupId)\r\n url = 'immChildGroupsByGroupId/' + getGroupsPayload.groupId;\r\n else if (getGroupsPayload.groupTypeId)\r\n url = 'groupsByGroupType/' + getGroupsPayload.groupTypeId;\r\n\r\n return this.httpService.getData(`${this.apiBaseUrl}/groups/${url}`).pipe(\r\n map((response) => {\r\n return response;\r\n }),\r\n catchError((errorRes) => {\r\n throw errorRes;\r\n })\r\n );\r\n }\r\n /**\r\n * Deletes a group based on the provided information\r\n * @param {groupId} string -groupId of the group which is to be deleted\r\n * @return {*} {Observable<any>} -Observable representing the group deletion response\r\n * @memberof GroupsService\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n deleteGroup(deleteGroupPayload: DeleteGroupPayload): Observable<any> {\r\n return this.httpService\r\n .putData(`${this.apiBaseUrl}/groups/delete`, deleteGroupPayload)\r\n .pipe(\r\n map((response) => {\r\n return response;\r\n }),\r\n catchError((error) => {\r\n throw error;\r\n })\r\n );\r\n }\r\n /**\r\n * Deletes a user from group based on the provided information\r\n * @param {groupId} string -groupId of the selected group from where selected user to be deleted.\r\n * @param {userId} Array -user ids of selected users who are deleted from the selected group\r\n * @return {*} {Observable<any>} -Observable representing the group deletion response\r\n * @memberof GroupsService\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n deleteUsersGroup(\r\n deleteUserGroupPayload: DeleteUserGroupPayload\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n ): Observable<any> {\r\n return this.httpService\r\n .putData(\r\n `${this.apiBaseUrl}/groups/roster/deleteGroupUsers`,\r\n deleteUserGroupPayload\r\n )\r\n .pipe(\r\n map((response) => {\r\n return response;\r\n }),\r\n catchError((error) => {\r\n throw error;\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Posts create group form data to server using HttpService for creating new group.\r\n * @param {CreateGroupPayload} createGroupPayload -create group form data which includes group name, type, short name, scope.\r\n * @return {Observable<CreateGroupResponse>} -returns create group API response (success or error) as an observable.\r\n * @memberof GroupsService\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n createGroup(\r\n createGroupPayload: CreateGroupPayload\r\n ): Observable<CreateGroupResponse> {\r\n return this.httpService\r\n .postData(`${this.apiBaseUrl}/groups/create`, createGroupPayload)\r\n .pipe(\r\n map((response) => {\r\n return response;\r\n }),\r\n catchError((error) => {\r\n throw error;\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Updates group form data to server using HttpService.\r\n * @param {EditGroupPayload} editGroupPayload -edit group form data which includes group name, short name, scope.\r\n * @return {Observable<EditGroupPayload>} -returns edit group API response (success or error) as an observable.\r\n * @memberof GroupsService\r\n */\r\n editGroup(\r\n editGroupPayload: EditGroupPayload\r\n ): Observable<CreateGroupResponse> {\r\n return this.httpService\r\n .putData(`${this.apiBaseUrl}/groups/edit`, editGroupPayload)\r\n .pipe(\r\n map((response) => {\r\n return response;\r\n }),\r\n catchError((error) => {\r\n throw error;\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * This method will parse the error codes and return the respective error message for each code.\r\n * @param {string[]} errorCodes\r\n * @return {string[]} errorMessage\r\n * @memberof GroupsService\r\n */\r\n parseErrorMessage(errorCodes: string[]) {\r\n const errorMessage: string[] = [];\r\n errorCodes?.forEach((item: string, index: number) => {\r\n const errorMessageKey = errorCodes[index] as keyof typeof this.groupsText;\r\n errorMessage.push(\r\n this.groupsText[errorMessageKey] ?? this.groupsText?.default\r\n );\r\n });\r\n return errorMessage;\r\n }\r\n\r\n /**\r\n * Handles custom API errors: maps BE error codes to messages and shows an\r\n * alert. Mirrors the events-and-meetings error handling so reciprocal-credit\r\n * failures (e.g. MTG-011 duplicate, MTG-012 permission) surface consistently.\r\n * @param {*} error the HttpErrorResponse from a failed call\r\n * @param {boolean} [showAlert=true] whether to display the alert\r\n * @memberof GroupsService\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n handleErrors(error: any, showAlert = true): void {\r\n const errorCodes = error?.error?.body?.errorCodes;\r\n if (Array.isArray(errorCodes) && !error?.error?.status) {\r\n const errorMessage = this.parseErrorMessage(errorCodes);\r\n if (showAlert) {\r\n this.alertService?.showMessage({\r\n status: 'custom',\r\n message: errorMessage,\r\n alertType: AlertType.ERROR,\r\n isCloseNeeded: true,\r\n });\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Sets selected group info.\r\n * @param {(GroupInfo | undefined)} selectedGroupInfo -selected group info.\r\n * @param {(GroupInfo | undefined)} [selectedGroupParentInfo] -selected parent group info.\r\n * @memberof GroupsService\r\n */\r\n setSelectedGroupInfo(\r\n selectedGroupInfo: GroupInfo | undefined,\r\n selectedGroupParentInfo?: GroupInfo | undefined\r\n ) {\r\n this.selectedGroupInfo = selectedGroupInfo;\r\n this.selectedGroupParentInfo = selectedGroupParentInfo;\r\n }\r\n\r\n /**\r\n * Returns the selected group info.\r\n * @return {(GroupInfo | undefined)} -group info.\r\n * @memberof GroupsService\r\n */\r\n getSelectedGroupInfo(): GroupInfo | undefined {\r\n return this.selectedGroupInfo;\r\n }\r\n\r\n /**\r\n * Returns the selected group parent group info.\r\n * @return {(GroupInfo | undefined)} -group info.\r\n * @memberof GroupsService\r\n */\r\n getSelectedGroupParentInfo(): GroupInfo | undefined {\r\n return this.selectedGroupParentInfo;\r\n }\r\n\r\n /**\r\n * Sets group function type.\r\n * @param {GroupFunctionType} groupFunctionType -group function type.\r\n * @memberof GroupsService\r\n */\r\n setGroupFunctionType(groupFunctionType: GroupFunctionType): void {\r\n this.groupFunctionType = groupFunctionType;\r\n }\r\n\r\n /**\r\n * Returns group function type.\r\n * @return {GroupFunctionType} -group function type.\r\n * @memberof GroupsService\r\n */\r\n getGroupFunctionType(): GroupFunctionType {\r\n return this.groupFunctionType;\r\n }\r\n\r\n /**\r\n * Gets the group users for the given group id.\r\n * @param {string} groupId\r\n * @return {Observable<GetGroupUsersResponse>}\r\n * @memberof GroupsService\r\n */\r\n // eslint-disable-next-line no-unused-vars\r\n getGroupUsers(\r\n groupId: string,\r\n sortColumn: string,\r\n sortDirection: boolean\r\n ): Observable<GetGroupUsersResponse> {\r\n return this.httpService\r\n .getData(\r\n `${this.apiBaseUrl}/groups/roster/${groupId}?sortColumn=${sortColumn}&ascendingOrder=${sortDirection}`\r\n )\r\n .pipe(\r\n map((response) => {\r\n return response;\r\n }),\r\n catchError((errorRes) => {\r\n throw errorRes;\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Gets the group users based on the filtered roles.\r\n * @param {FilterUsersPayload} payload\r\n * @return {Observable<GetGroupUsersResponse>}\r\n * @memberof GroupsService\r\n */\r\n getGroupUsersByRoles(\r\n payload: FilterUsersPayload\r\n ): Observable<GetGroupUsersResponse> {\r\n return this.httpService\r\n .postData(`${this.apiBaseUrl}/groups/roster/groupUsersFilter`, payload)\r\n .pipe(\r\n map((response) => {\r\n return response;\r\n }),\r\n catchError((errorRes) => {\r\n throw errorRes;\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Gets the group users based on searched name or email\r\n * @param {SearchUsersPayload} payload\r\n * @return {Observable<GetGroupUsersResponse>}\r\n * @memberof GroupsService\r\n */\r\n searchGroupUsers(\r\n payload: SearchUsersPayload\r\n ): Observable<GetGroupUsersResponse> {\r\n return this.httpService\r\n .postData(`${this.apiBaseUrl}/groups/roster/groupUsersSearch`, payload)\r\n .pipe(\r\n map((response) => {\r\n return response;\r\n }),\r\n catchError((errorRes) => {\r\n throw errorRes;\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Gets the group roles based on the group type.\r\n * @param {string} groupTypeId\r\n * @return {Observable<CheckboxOption[]>}\r\n * @memberof GroupsService\r\n */\r\n // eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars\r\n getGroupTypeRoles(groupTypeId: string): Observable<CheckboxOption[]> {\r\n return this.httpService\r\n .getData(\r\n `${this.apiBaseUrl}/groups/config/rolesByGroupType/${groupTypeId}`\r\n )\r\n .pipe(\r\n map((response) => {\r\n const rolesOption: CheckboxOption[] = [];\r\n const memberTypes: Role[] = [];\r\n response?.body?.forEach((role: Role) => {\r\n if (role?.roleTypeName === RoleType.MEMBER_LEVEL) {\r\n memberTypes.push(role);\r\n } else {\r\n rolesOption.push({\r\n id: role.roleId,\r\n name: role.roleName,\r\n disabled: false,\r\n checked: false,\r\n });\r\n }\r\n });\r\n this.setGroupTypeUserRoles(rolesOption);\r\n this.setMemberTypes(memberTypes);\r\n return rolesOption;\r\n }),\r\n catchError((errorRes) => {\r\n throw errorRes;\r\n })\r\n );\r\n }\r\n /**\r\n * Fetches the classifications master data from configuration and returns.\r\n * @return {Observable<ClassificationResponse>}\r\n * @memberof GroupsService\r\n */\r\n getClassifications(): Observable<ClassificationResponse> {\r\n return this.httpService\r\n .getData(`${this.apiBaseUrl}/groups/roster/classification`)\r\n .pipe(\r\n map((response) => {\r\n return response;\r\n }),\r\n catchError((errorRes) => {\r\n throw errorRes;\r\n })\r\n );\r\n }\r\n /**\r\n * Returns the true if logged in user is admin.\r\n * @return {boolean}\r\n * @memberof GroupsService\r\n */\r\n isAdminUser(): boolean {\r\n return this.validateAccess(PermissionType.MANAGE_SYSTEM_USERS);\r\n }\r\n /**\r\n * Concatenates the group users assigned roles name separated by comma as string and returns the group users in an array.\r\n * @param {GetGroupUsersResponse} response\r\n * @return {User[]}\r\n * @memberof GroupsService\r\n */\r\n transformUserRolesNameAsString(response: GetGroupUsersResponse): User[] {\r\n const users: User[] = [];\r\n this.representingOrganizations = [];\r\n response?.body?.forEach((item) => {\r\n const classificationDesc =\r\n item.classification?.classificationName +\r\n ' (' +\r\n item.classification?.classificationDesc +\r\n ')';\r\n const rolesList = item?.rolesList?.reduce(\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n (roleList: any, role: Role) => {\r\n roleList[\r\n role.roleTypeName === RoleType.MEMBER_LEVEL ? 'memberType' : 'roles'\r\n ].push(role?.roleName);\r\n return roleList;\r\n },\r\n { memberType: [], roles: [] }\r\n );\r\n this.representingOrganizations?.push({\r\n userId: item?.userId,\r\n organizations: item?.organizations,\r\n });\r\n const organizations = item?.organizations\r\n ? item?.organizations?.map((org) => org?.orgName).join('; ')\r\n : null;\r\n users.push({\r\n userId: item.userId,\r\n name: item.name,\r\n email: item.email,\r\n role: rolesList?.roles?.length ? rolesList?.roles?.join(', ') : null,\r\n classification: item.classification?.classificationId\r\n ? classificationDesc\r\n : null,\r\n memberStatus: rolesList?.memberType?.length\r\n ? rolesList?.memberType[0]\r\n : null,\r\n organization: organizations,\r\n employer: item.employer?.orgName ?? null,\r\n canDelete: !(\r\n item?.userId === this.userInfo?.userId &&\r\n this.isAdminUser() &&\r\n this.getBusinessRuleOfSelectedGroup()?.isAdmin\r\n ),\r\n });\r\n });\r\n return users;\r\n }\r\n /**\r\n * Returns formatted group types.\r\n * @param {GroupTypeConfiguration[]} groupTypeResponse\r\n * @return {GroupTypeConfigValue}\r\n * @memberof GroupsService\r\n */\r\n getFormattedGroupTypes(\r\n groupTypeResponse: GroupTypeConfiguration[]\r\n ): GroupTypeConfigValue {\r\n const groupTypes: GroupTypeConfigValue = {};\r\n groupTypeResponse.forEach((item) => {\r\n groupTypes[item.configFieldId] = item.configFieldValue;\r\n });\r\n return groupTypes;\r\n }\r\n\r\n /**\r\n * Returns group user details if email is found, else throws error.\r\n * @param {string} email\r\n * @return {Observable<SearchUserByEmailResponse>}\r\n * @memberof GroupsService\r\n */\r\n getUserByEmail(email: string): Observable<SearchUserByEmailResponse> {\r\n return this.httpService\r\n .getData(`${this.apiBaseUrl}/groups/users/userByEmail/${email}`)\r\n .pipe(\r\n map((response) => {\r\n return response;\r\n }),\r\n catchError((errorRes) => {\r\n throw errorRes;\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Gets the user details for the selected group\r\n * @param {GetUserDetailsPayload} payload\r\n * @return {Observable<AddOrEditGroupUserDetailsResponse>}\r\n * @memberof GroupsService\r\n */\r\n getGroupUserDetails(\r\n payload: GetUserDetailsPayload\r\n ): Observable<AddOrEditGroupUserDetailsResponse> {\r\n return this.httpService\r\n .postData(`${this.apiBaseUrl}/groups/roster/userDetails`, payload)\r\n .pipe(\r\n map((response) => {\r\n return response;\r\n }),\r\n catchError((error) => {\r\n throw error;\r\n })\r\n );\r\n }\r\n /**\r\n * Posts add new user form data to the API for the selected group and returns the success or failure response.\r\n * @param {(AddOrEditUserPayload\r\n * | AddOrEditUserIndividualRosterPayload)} AddOrEditUserPayload\r\n * @param {GroupRosterType} groupRosterType\r\n * @return {Observable<AddOrEditGroupUserDetailsResponse>}\r\n * @memberof GroupsService\r\n */\r\n addNewGroupUser(\r\n AddOrEditUserPayload:\r\n | AddOrEditUserPayload\r\n | AddOrEditUserIndividualRosterPayload\r\n ): Observable<AddOrEditGroupUserDetailsResponse> {\r\n return this.httpService\r\n .postData(\r\n `${this.apiBaseUrl}/groups/roster/createGroupUserRole`,\r\n AddOrEditUserPayload\r\n )\r\n .pipe(\r\n map((response) => {\r\n return response;\r\n }),\r\n catchError((error) => {\r\n throw error;\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Sets the loaded group type user roles\r\n * @param {CheckboxOption[]} userRoles\r\n * @memberof GroupsService\r\n */\r\n setGroupTypeUserRoles(userRoles: CheckboxOption[]): void {\r\n this.groupTypeRoles = userRoles;\r\n }\r\n\r\n /**\r\n * Returns the group type user roles.\r\n * @return {CheckboxOption[]}\r\n * @memberof GroupsService\r\n */\r\n getGroupTypeUserRoles(): CheckboxOption[] {\r\n this.groupTypeRoles?.map((option) => (option.checked = false));\r\n return this.groupTypeRoles;\r\n }\r\n\r\n /**\r\n * Sets the selected user info.\r\n * @param {GroupUserInfo} userInfo\r\n * @memberof GroupsService\r\n */\r\n setSelectedUserInfo(userInfo: GroupUserInfo): void {\r\n this.selectedUserInfo = userInfo;\r\n }\r\n\r\n /**\r\n * Returns selected user info.\r\n * @return {GroupUserInfo}\r\n * @memberof GroupsService\r\n */\r\n getSelectedUserInfo(): GroupUserInfo {\r\n return this.selectedUserInfo;\r\n }\r\n\r\n /**\r\n * Updates group user roles and other details to server using HttpService.\r\n * @param {(AddOrEditUserPayload | AddOrEditUserIndividualRosterPayload)} payload\r\n * @return {Observable<AddOrEditGroupUserDetailsResponse>}\r\n * @memberof GroupsService\r\n */\r\n editGroupsUserRole(\r\n payload: AddOrEditUserPayload | AddOrEditUserIndividualRosterPayload\r\n ): Observable<AddOrEditGroupUserDetailsResponse> {\r\n return this.httpService\r\n .putData(`${this.apiBaseUrl}/groups/roster/editGroupUserRole`, payload)\r\n .pipe(\r\n map((response) => {\r\n return response;\r\n }),\r\n catchError((error) => {\r\n throw error;\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Sets roster function type.\r\n * @param {RosterFunctionType} rosterFunctionType\r\n * @memberof GroupsService\r\n */\r\n setRosterFunctionType(rosterFunctionType: RosterFunctionType): void {\r\n this.rosterFunctionType = rosterFunctionType;\r\n }\r\n\r\n /**\r\n * Returns roster function type.\r\n * @return {RosterFunctionType}\r\n * @memberof GroupsService\r\n */\r\n getRosterFunctionType(): RosterFunctionType {\r\n return this.rosterFunctionType;\r\n }\r\n /**\r\n * Gets the groups based on the search by group name or acronym.\r\n * @param {string} searchTerm\r\n * @return {Observable<GetGroupUsersResponse>}\r\n * @memberof GroupsService\r\n */\r\n groupsByNameAcronym(\r\n searchTerm: string,\r\n filteredGroupType?: number\r\n ): Observable<GetGroupResponse> {\r\n const searchGroupsUrl = `${this.apiBaseUrl}/groups/groupsByNameAcronym?name=${searchTerm}`;\r\n return this.httpService\r\n .getData(\r\n filteredGroupType\r\n ? searchGroupsUrl + `&groupType=${filteredGroupType}`\r\n : searchGroupsUrl\r\n )\r\n .pipe(\r\n map((response) => {\r\n return response;\r\n }),\r\n catchError((errorRes) => {\r\n throw errorRes;\r\n })\r\n );\r\n }\r\n /**\r\n * Sets the user group permissions\r\n * @param {GroupPermission[]} userGroupPermissions\r\n * @memberof GroupsService\r\n */\r\n setUserGroupPermissions(userGroupPermissions: GroupPermission[]) {\r\n this.userGroupPermissions = userGroupPermissions;\r\n }\r\n /**\r\n * Returns the user group permissions\r\n * @return {GroupPermission[]}\r\n * @memberof GroupsService\r\n */\r\n getUserGroupPermissions(): GroupPermission[] {\r\n return this.userGroupPermissions;\r\n }\r\n /**\r\n * Sets the logged In user information.\r\n * @param {LoggedInUserInfo} userInfo\r\n * @memberof GroupsService\r\n */\r\n setUserInfo(userInfo: LoggedInUserInfo): void {\r\n this.userInfo = userInfo;\r\n }\r\n /**\r\n * Returns the logged in user information.\r\n * @return {LoggedInUserInfo}\r\n * @memberof GroupsService\r\n */\r\n getUserInfo(): LoggedInUserInfo {\r\n return this.userInfo;\r\n }\r\n /**\r\n * Validates permission based access for provided feature.\r\n * Checks for group level permissions, and provides access based on individual group permissions.\r\n * For global permissions provides access across the individual groups or System groups.\r\n * @param {PermissionType} permissionType\r\n * @return {boolean}\r\n * @memberof GroupsService\r\n */\r\n validateAccess(\r\n permissionType: PermissionType,\r\n permissions?: UserPermission[] | null\r\n ): boolean {\r\n if (permissions) {\r\n const userPermissionsToGroup =\r\n this.userPermissionsService.filterUserGroupPermissions(\r\n permissions,\r\n this.groupPermissionsService.getGroupPermissions()\r\n );\r\n return this.userPermissionsService.validateAccessPermission(\r\n permissionType,\r\n userPermissionsToGroup\r\n );\r\n }\r\n return this.userPermissionsService.validateAccessPermission(\r\n permissionType,\r\n this.getUserGroupPermissions()\r\n );\r\n }\r\n /**\r\n * Store the loaded group types.\r\n * @param {GroupTypeConfiguration[]} groupTypes\r\n * @memberof GroupsService\r\n */\r\n setLoadedGroupTypes(groupTypes: GroupTypeConfiguration[]) {\r\n this.groupTypes = groupTypes;\r\n }\r\n /**\r\n * Return the loaded group types.\r\n * @return {GroupTypeConfiguration[]}\r\n * @memberof GroupsService\r\n */\r\n getLoadedGroupTypes(): GroupTypeConfiguration[] {\r\n return this.groupTypes;\r\n }\r\n\r\n /**\r\n *\r\n * @param {OrganizationRequestPayload} orgRequestPayload\r\n * @return {Observable<OrganizationResponse>}\r\n * @memberof GroupsService\r\n */\r\n getOrganizations(\r\n orgRequestPayload: OrganizationRequestPayload\r\n ): Observable<OrganizationResponse> {\r\n return this.httpService\r\n .postData(\r\n `${this.apiBaseUrl}/groups/roster/organizations`,\r\n orgRequestPayload\r\n )\r\n .pipe(\r\n map((response) => {\r\n return response;\r\n }),\r\n catchError((errorRes) => {\r\n throw errorRes;\r\n })\r\n );\r\n }\r\n /**\r\n * Returns the group type configuration Business rule for the selected group.\r\n * @return {(BusinessRule | undefined)}\r\n * @memberof GroupsService\r\n */\r\n getBusinessRuleOfSelectedGroup(): BusinessRule | undefined {\r\n const businessRule = this.getLoadedGroupTypes()?.find(\r\n (group) => group?.configFieldId === this.getSelectedGroupInfo()?.groupType\r\n )?.configFieldValue?.businessRule;\r\n if(businessRule?.rosterType === GroupRosterType.ENTITY)\r\n businessRule.rosterType = GroupRosterType.INDIVIDUAL;\r\n return businessRule;\r\n }\r\n /**\r\n * Enables or disables the form submit button based on passed parameters.\r\n * @param {GroupRosterType} groupRosterType\r\n * @param {FormControlStatus} formStatus\r\n * @param {string[]} selectedUserRoles\r\n * @return {boolean}\r\n * @memberof GroupsService\r\n */\r\n isSubmitButtonDisabled(\r\n groupRosterType: GroupRosterType,\r\n formStatus: FormControlStatus,\r\n selectedUserRoles: string[]\r\n ): boolean {\r\n if (groupRosterType === GroupRosterType.INDIVIDUAL)\r\n return formStatus === FormStatus.INVALID;\r\n return selectedUserRoles?.length === 0 || formStatus === FormStatus.INVALID;\r\n }\r\n\r\n /**\r\n * Sets isParentGroupChanged true or false.\r\n * @param {boolean} isParentGroupChanged\r\n * @memberof GroupsService\r\n */\r\n setParentGroupChangeStatus(isParentGroupChanged: boolean): void {\r\n this.isParentGroupChanged = isParentGroupChanged;\r\n }\r\n\r\n /**\r\n * Returns isParentGroupChanged value.\r\n * @return {boolean}\r\n * @memberof GroupsService\r\n */\r\n getParentGroupChangeStatus(): boolean {\r\n return this.isParentGroupChanged;\r\n }\r\n\r\n /**\r\n * Sets the member types.\r\n * @param {Role[]} memberTypes\r\n * @memberof GroupsService\r\n */\r\n setMemberTypes(memberTypes: Role[]): void {\r\n this.memberTypes = memberTypes;\r\n }\r\n /**\r\n * Returns the member types.\r\n * @return {Role[]}\r\n * @memberof GroupsService\r\n */\r\n getMemberTypes(): Role[] {\r\n return this.memberTypes;\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // Reciprocal Credit (SP3M-22)\r\n // The reciprocal controller lives on the MEETINGS service, reached through the\r\n // gateway. apiBaseUrl = appConfig.baseApiUrl (ends in `/v1`), and the gateway\r\n // routes the meetings service under `${apiBaseUrl}/meetings` (same as every other\r\n // meetings/events call, e.g. `${apiBaseUrl}/meetings/event/...`).\r\n //\r\n // The reciprocal controller sits on the meetings service under `admin/reciprocal-credit`.\r\n // apiBaseUrl already carries the version segment (`.../v1`), and the gateway routes\r\n // the meetings service under `${apiBaseUrl}/meetings`, so the version is NOT repeated\r\n // (no second `/v1` or `/api/v1`). The full path is:\r\n // `${apiBaseUrl}/meetings/admin/reciprocal-credit/...`\r\n // = https://saappsapidev.ieee.org/v1/meetings/admin/reciprocal-credit/...\r\n // Every method builds URLs from RECIPROCAL_BASE_PATH below.\r\n // ---------------------------------------------------------------------------\r\n\r\n /** Path prefix (relative to apiBaseUrl) for the reciprocal-credit endpoints. */\r\n private readonly RECIPROCAL_BASE_PATH = 'meetings/admin/reciprocal-credit';\r\n\r\n /**\r\n * Build a reciprocal-credit endpoint URL from apiBaseUrl + the base path,\r\n * guarding against accidental double slashes if apiBaseUrl has a trailing slash.\r\n * @param {string} [suffix] extra path/query appended after the base path.\r\n * @return {string}\r\n */\r\n private buildReciprocalUrl(suffix = ''): string {\r\n const base = this.apiBaseUrl?.replace(/\\/+$/, '') ?? '';\r\n return `${base}/${this.RECIPROCAL_BASE_PATH}${suffix}`;\r\n }\r\n\r\n /**\r\n * Fetch the foreign groups available for reciprocal credit for a home group.\r\n * GET {apiBaseUrl}/meetings/admin/reciprocal-credit/{homeGroupId}/available-groups\r\n * @param {string} homeGroupId\r\n * @return {Observable<ReciprocalCreditResponse<AvailableForeignGroup[]>>}\r\n * @memberof GroupsService\r\n */\r\n getAvailableReciprocalGroups(\r\n homeGroupId: string\r\n ): Observable<ReciprocalCreditResponse<AvailableForeignGroup[]>> {\r\n return this.httpService\r\n .getData(this.buildReciprocalUrl(`/${homeGroupId}/available-groups`))\r\n .pipe(\r\n map((response) => response),\r\n catchError((error) => {\r\n throw error;\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Load existing reciprocal-credit config rows for a home group (edit prefill).\r\n * GET {apiBaseUrl}/meetings/admin/reciprocal-credit/{homeGroupId}[?eventId=...]\r\n * Returns one row per foreign group; an empty array means reciprocal credit is off.\r\n * @param {string} homeGroupId\r\n * @param {string} [eventId] optional — filters to an event-scoped config.\r\n * @return {Observable<ReciprocalCreditResponse<ReciprocalCreditConfigRow[]>>}\r\n * @memberof GroupsService\r\n */\r\n getReciprocalConfig(\r\n homeGroupId: string,\r\n eventId?: string\r\n ): Observable<ReciprocalCreditResponse<ReciprocalCreditConfigRow[]>> {\r\n const query = eventId ? `?eventId=${encodeURIComponent(eventId)}` : '';\r\n return this.httpService\r\n .getData(this.buildReciprocalUrl(`/${homeGroupId}${query}`))\r\n .pipe(\r\n map((response) => response),\r\n catchError((error) => {\r\n throw error;\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Save a reciprocal-credit config (creates/reactivates one row per foreign group).\r\n * POST {apiBaseUrl}/meetings/admin/reciprocal-credit\r\n * @param {SaveReciprocalCreditPayload} payload\r\n * @return {Observable<ReciprocalCreditResponse<ReciprocalCreditConfigRow[]>>}\r\n * @memberof GroupsService\r\n */\r\n saveReciprocalCredit(\r\n payload: SaveReciprocalCreditPayload\r\n ): Observable<ReciprocalCreditResponse<ReciprocalCreditConfigRow[]>> {\r\n return this.httpService\r\n .postData(this.buildReciprocalUrl(), payload)\r\n .pipe(\r\n map((response) => response),\r\n catchError((error) => {\r\n throw error;\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Remove (soft delete) a single reciprocal-credit config row by its configId.\r\n * POST {apiBaseUrl}/meetings/admin/reciprocal-credit/{configId}/remove\r\n * @param {string} configId\r\n * @return {Observable<ReciprocalCreditResponse<null>>}\r\n * @memberof GroupsService\r\n */\r\n removeReciprocalConfig(\r\n configId: string\r\n ): Observable<ReciprocalCreditResponse<null>> {\r\n return this.httpService\r\n .postData(this.buildReciprocalUrl(`/${configId}/remove`), {})\r\n .pipe(\r\n map((response) => response),\r\n catchError((error) => {\r\n throw error;\r\n })\r\n );\r\n }\r\n}\r\n","import {\r\n Component,\r\n EventEmitter,\r\n Input,\r\n OnDestroy,\r\n OnInit,\r\n Output,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatDialog, MatDialogModule } from '@angular/material/dialog';\r\nimport {\r\n SlideToggleComponent,\r\n SlideToggleOption,\r\n} from '@ieeesa-npm/presentation';\r\nimport { Subject, takeUntil } from 'rxjs';\r\nimport { GroupsService } from '../../services/groups.service';\r\nimport {\r\n AvailableForeignGroup,\r\n ReciprocalCreditConfigRow,\r\n} from '../../models/reciprocal-credit.model';\r\nimport { AddWorkingGroupsComponent } from '../add-working-groups/add-working-groups.component';\r\n\r\n/**\r\n * A selected foreign group shown as a chip. `configId` is present only for groups\r\n * that were loaded from an existing (saved) config — it is needed to remove that\r\n * specific row on the BE when the group is de-selected or the toggle is turned off.\r\n */\r\nexport interface SelectedForeignGroup {\r\n groupId: string;\r\n groupName: string;\r\n configId?: string;\r\n}\r\n\r\n/**\r\n * Reciprocal Credit configuration section shown inside the group create/edit\r\n * form — ONLY when the group is a Working Group. Provides the enable toggle,\r\n * selected foreign-group chips, and the \"+ Add Working Groups\" launcher.\r\n *\r\n * The toggle has no backend flag: it is derived from whether any config rows\r\n * exist for the home group. Enabling persists nothing until at least one foreign\r\n * group is added (POST); disabling soft-deletes every existing config row\r\n * (one POST /{configId}/remove per row).\r\n *\r\n * The parent form reads `enabled` and `selectedForeignGroups` to build the save\r\n * request, and `removedConfigIds` to know which existing rows to remove.\r\n * @export\r\n * @class ReciprocalCreditSectionComponent\r\n */\r\n@Component({\r\n // eslint-disable-next-line @angular-eslint/component-selector\r\n selector: 'ieeesa-reciprocal-credit-section',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n MatButtonModule,\r\n MatDialogModule,\r\n SlideToggleComponent,\r\n ],\r\n templateUrl: './reciprocal-credit-section.component.html',\r\n styleUrls: ['./reciprocal-credit-section.component.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class ReciprocalCreditSectionComponent implements OnInit, OnDestroy {\r\n destroy$ = new Subject<boolean>();\r\n\r\n /** Home group id (present in edit; absent in create until the group is saved). */\r\n @Input() homeGroupId?: string;\r\n /** Optional event id for event-scoped configs (omit for global/Groups screen). */\r\n @Input() eventId?: string;\r\n /** Parent committee name for the helper text (\"Only groups under ...\"). */\r\n @Input() parentCommitteeName?: string;\r\n\r\n /** Emits the current enabled state whenever it changes. */\r\n @Output() enabledChange = new EventEmitter<boolean>();\r\n /** Emits the current selected foreign groups whenever they change. */\r\n @Output() selectionChange = new EventEmitter<SelectedForeignGroup[]>();\r\n /**\r\n * Emits the config ids of previously-saved rows that have been removed locally\r\n * (chip de-selected or toggle turned off), so the parent can soft-delete each\r\n * on save.\r\n */\r\n @Output() removedConfigIdsChange = new EventEmitter<string[]>();\r\n\r\n /** Toggle state. */\r\n enabled = false;\r\n /** Option config for the shared ieeesa-slide-toggle. */\r\n toggleOption: SlideToggleOption = {\r\n id: 1,\r\n label: '',\r\n checked: false,\r\n ariaLabel: 'Enable Reciprocal Credit',\r\n };\r\n /** Selected foreign working groups (chips). */\r\n selectedForeignGroups: SelectedForeignGroup[] = [];\r\n /**\r\n * Persistent map of foreignGroupId → configId for the rows that existed on the\r\n * initial load. Kept for the whole edit session so a saved group re-selected\r\n * after being de-selected recovers its configId (and its queued removal is undone).\r\n */\r\n private savedConfigIdByGroupId = new Map<string, string>();\r\n /**\r\n * Config ids that existed on load but have since been removed locally (either by\r\n * de-selecting a chip or turning the toggle off). The parent removes each on save.\r\n */\r\n removedConfigIds: string[] = [];\r\n /** All foreign working groups available under the same committee. */\r\n availableGroups: AvailableForeignGroup[] = [];\r\n isLoading = false;\r\n\r\n // eslint-disable-next-line no-unused-vars\r\n constructor(\r\n // eslint-disable-next-line no-unused-vars\r\n private groupsService: GroupsService,\r\n // eslint-disable-next-line no-unused-vars\r\n private dialog: MatDialog\r\n ) {}\r\n\r\n ngOnInit(): void {\r\n if (this.homeGroupId) {\r\n this.loadAvailableGroups(this.homeGroupId);\r\n this.loadExistingConfig(this.homeGroupId);\r\n }\r\n }\r\n\r\n /** Fetch the foreign working groups available for selection. */\r\n private loadAvailableGroups(homeGroupId: string): void {\r\n this.groupsService\r\n .getAvailableReciprocalGroups(homeGroupId)\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (res) => {\r\n this.availableGroups = res?.body ?? [];\r\n },\r\n error: (error) => {\r\n this.groupsService.handleErrors(error);\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Load existing reciprocal config rows for the edit-prefill path. The toggle is\r\n * ON when one or more rows exist; each chip keeps its own configId for removal.\r\n */\r\n private loadExistingConfig(homeGroupId: string): void {\r\n this.isLoading = true;\r\n this.groupsService\r\n .getReciprocalConfig(homeGroupId, this.eventId)\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (res) => {\r\n const rows: ReciprocalCreditConfigRow[] = res?.body ?? [];\r\n this.selectedForeignGroups = rows.map((row) => ({\r\n groupId: row.foreignGroupId,\r\n groupName: row.foreignGroupName,\r\n configId: row.configId,\r\n }));\r\n // Remember each saved row's configId so it can be recovered if the\r\n // group is de-selected and then re-selected before saving.\r\n this.savedConfigIdByGroupId = new Map(\r\n rows.map((row) => [row.foreignGroupId, row.configId])\r\n );\r\n this.enabled = this.selectedForeignGroups.length > 0;\r\n this.toggleOption = { ...this.toggleOption, checked: this.enabled };\r\n this.removedConfigIds = [];\r\n this.emitState();\r\n this.isLoading = false;\r\n },\r\n error: (error) => {\r\n this.isLoading = false;\r\n this.groupsService.handleErrors(error);\r\n },\r\n });\r\n }\r\n\r\n /** Handle the enable/disable toggle (shared ieeesa-slide-toggle emits SlideToggleOption). */\r\n onToggleChange(option: SlideToggleOption): void {\r\n this.enabled = !!option?.checked;\r\n this.toggleOption = { ...this.toggleOption, checked: this.enabled };\r\n if (!this.enabled) {\r\n // Turning off queues every existing (saved) row for removal and clears chips.\r\n this.queueRemovalOf(this.selectedForeignGroups);\r\n this.selectedForeignGroups = [];\r\n }\r\n this.emitState();\r\n }\r\n\r\n /** Open the Add Working Groups modal. */\r\n onAddWorkingGroups(): void {\r\n const dialogRef = this.dialog.open(AddWorkingGroupsComponent, {\r\n panelClass: 'ieeesa-modal-dialog',\r\n data: {\r\n availableGroups: this.availableGroups,\r\n selectedGroupIds: this.selectedForeignGroups.map((g) => g.groupId),\r\n },\r\n });\r\n dialogRef\r\n .afterClosed()\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe((result: AvailableForeignGroup[] | undefined) => {\r\n if (result) {\r\n this.mergeSelection(result);\r\n this.emitState();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Merge the modal's returned selection into the current chips. Groups that are\r\n * no longer selected but were saved get queued for removal; already-selected\r\n * groups keep their existing configId.\r\n */\r\n private mergeSelection(selected: AvailableForeignGroup[]): void {\r\n const selectedIds = new Set(selected.map((g) => g.groupId));\r\n\r\n // Queue removal for previously-saved chips that are no longer selected.\r\n const dropped = this.selectedForeignGroups.filter(\r\n (g) => !selectedIds.has(g.groupId)\r\n );\r\n this.queueRemovalOf(dropped);\r\n\r\n // Rebuild the selection, recovering each saved group's original configId\r\n // from the persistent load-time map (not just the currently-selected list),\r\n // so a de-selected-then-re-selected saved group keeps its configId.\r\n this.selectedForeignGroups = selected.map((g) => ({\r\n groupId: g.groupId,\r\n groupName: g.groupName,\r\n configId: this.savedConfigIdByGroupId.get(g.groupId),\r\n }));\r\n\r\n // Un-queue removal for any saved group that is (re)selected — it should be\r\n // kept, not removed, on save.\r\n this.removedConfigIds = this.removedConfigIds.filter((configId) => {\r\n const stillSelected = this.selectedForeignGroups.some(\r\n (g) => g.configId === configId\r\n );\r\n return !stillSelected;\r\n });\r\n }\r\n\r\n /** Remove a selected foreign group chip. */\r\n removeGroup(groupId: string): void {\r\n const removed = this.selectedForeignGroups.filter(\r\n (g) => g.groupId === groupId\r\n );\r\n this.queueRemovalOf(removed);\r\n this.selectedForeignGroups = this.selectedForeignGroups.filter(\r\n (g) => g.groupId !== groupId\r\n );\r\n this.emitState();\r\n }\r\n\r\n /** Track saved rows (those with a configId) that must be removed on the BE. */\r\n private queueRemovalOf(groups: SelectedForeignGroup[]): void {\r\n groups.forEach((g) => {\r\n if (g.configId && !this.removedConfigIds.includes(g.configId)) {\r\n this.removedConfigIds.push(g.configId);\r\n }\r\n });\r\n }\r\n\r\n /** True when the section is valid (toggle off, OR toggle on with ≥1 group). */\r\n get isValid(): boolean {\r\n return !this.enabled || this.selectedForeignGroups.length > 0;\r\n }\r\n\r\n private emitState(): void {\r\n this.enabledChange.emit(this.enabled);\r\n this.selectionChange.emit(this.selectedForeignGroups);\r\n this.removedConfigIdsChange.emit([...this.removedConfigIds]);\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroy$.next(true);\r\n this.destroy$.complete();\r\n }\r\n}\r\n","<div class=\"ieeesa-reciprocal-credit\">\r\n <p class=\"ieeesa-reciprocal-credit__title\">Reciprocal Credit</p>\r\n\r\n <!-- Enable toggle -->\r\n <div class=\"ieeesa-reciprocal-credit__toggle-row\">\r\n <ieeesa-slide-toggle\r\n [slideToggle]=\"toggleOption\"\r\n (slideToggleChange)=\"onToggleChange($event)\"\r\n ></ieeesa-slide-toggle>\r\n <div class=\"ieeesa-reciprocal-credit__toggle-text\">\r\n <span class=\"ieeesa-reciprocal-credit__toggle-label\">Enable Reciprocal Credit</span>\r\n <span class=\"ieeesa-reciprocal-credit__toggle-subtext\">\r\n Use this configuration in eligible event attendance calculations.\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <!-- Info banner (always shown in the section) -->\r\n <div class=\"ieeesa-reciprocal-credit__info-banner\">\r\n <strong>Available only for Working Groups.</strong>\r\n Voting members of this Home Working Group can receive attendance credit when they\r\n attend meetings hosted by selected Foreign Working Groups under the same Standards Committee.\r\n </div>\r\n\r\n <!-- Selection UI (only when enabled) -->\r\n <ng-container *ngIf=\"enabled\">\r\n <label class=\"ieeesa-reciprocal-credit__field-label\">\r\n Eligible Foreign Working Groups*\r\n </label>\r\n\r\n <div class=\"ieeesa-reciprocal-credit__chips-box\">\r\n <span\r\n *ngFor=\"let group of selectedForeignGroups\"\r\n class=\"ieeesa-reciprocal-credit__chip\"\r\n >\r\n {{ group.groupName }}\r\n <button\r\n type=\"button\"\r\n class=\"ieeesa-reciprocal-credit__chip-remove\"\r\n (click)=\"removeGroup(group.groupId)\"\r\n [attr.aria-label]=\"'Remove ' + group.groupName\"\r\n >\r\n ×\r\n </button>\r\n </span>\r\n <span\r\n *ngIf=\"selectedForeignGroups.length === 0\"\r\n class=\"ieeesa-reciprocal-credit__chips-placeholder\"\r\n >\r\n No working groups selected\r\n </span>\r\n </div>\r\n\r\n <p class=\"ieeesa-reciprocal-credit__helper\" *ngIf=\"parentCommitteeName\">\r\n Only groups under {{ parentCommitteeName }} are available.\r\n </p>\r\n\r\n <div class=\"ieeesa-reciprocal-credit__add-row\">\r\n <button\r\n mat-button\r\n type=\"button\"\r\n class=\"mat-tertiary-button ieeesa-reciprocal-credit__add-btn\"\r\n (click)=\"onAddWorkingGroups()\"\r\n >\r\n + Add Working Groups\r\n </button>\r\n </div>\r\n\r\n <!-- One-way relationship warning -->\r\n <div class=\"ieeesa-reciprocal-credit__warning-banner\">\r\n <strong>One-way relationship:</strong> Adding a Foreign Working Group here does not\r\n automatically enable reciprocal credit in the opposite direction.\r\n </div>\r\n </ng-container>\r\n</div>\r\n","import {\r\n Component,\r\n EventEmitter,\r\n OnDestroy,\r\n OnInit,\r\n Output,\r\n ViewChild,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormGroup, Validators } from '@angular/forms';\r\nimport {\r\n FormGrid,\r\n FormModel,\r\n SelectOption,\r\n AlignType,\r\n SlideToggleOption,\r\n FieldConfig,\r\n FormControlType,\r\n DynamicFormComponent,\r\n} from '@ieeesa-npm/presentation';\r\nimport {\r\n AlertsService,\r\n GlobalErrorHandlerService,\r\n} from '@ieeesa-npm/utility';\r\nimport * as screenTexts from '../../assets/constants.json';\r\nimport { GroupsValidationPatterns } from '../../assets/form-validations';\r\nimport { CreateGroupPayload } from '../../models/create-group.model';\r\nimport { GroupsService } from '../../services/groups.service';\r\nimport { HttpErrorResponse } from '@angular/common/http';\r\nimport { MatDialogModule } from '@angular/material/dialog';\r\nimport { Subject, forkJoin, takeUntil } from 'rxjs';\r\nimport { GroupType } from '../../models/group-types.model';\r\nimport { GroupInfo } from '../../models/group-info.model';\r\nimport { EditGroupPayload } from '../../models/edit-group.model';\r\nimport { FormStatus, AlertType } from '@ieeesa-npm/models';\r\nimport { GroupFunctionType } from '../../models/group-function-type.model';\r\nimport { ParentGroupsInfo } from '../../models/parent-groups-info.model';\r\nimport {\r\n ReciprocalCreditSectionComponent,\r\n SelectedForeignGroup,\r\n} from '../reciprocal-credit-section/reciprocal-credit-section.component';\r\nconst INDEX_VALUE = 4;\r\n/** Group type name that enables the Reciprocal Credit section. */\r\nconst WORKING_GROUP_TYPE_NAME = 'Working Group';\r\n\r\n/**\r\n * CreateGroupComponent uses DynamicFormComponent to build create new group form or edit group and implement the functionalities of submission of form and handling success and error scenarios.\r\n * @class CreateGroupComponent\r\n * @implements {OnInit}\r\n * @implements {OnDestroy}\r\n */\r\n@Component({\r\n // eslint-disable-next-line @angular-eslint/component-selector\r\n selector: 'ieeesa-create-group',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n DynamicFormComponent,\r\n MatDialogModule,\r\n ReciprocalCreditSectionComponent,\r\n ],\r\n templateUrl: './create-group.component.html',\r\n styleUrls: ['./create-group.component.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n providers: [AlertsService],\r\n})\r\nexport class CreateGroupComponent implements OnInit, OnDestroy {\r\n destroy$: Subject<boolean> = new Subject<boolean>();\r\n /**\r\n * Event emitted when the form is successfully submitted.\r\n * @memberof CreateGroupComponent\r\n */\r\n @Output() submitFormResponse = new EventEmitter();\r\n /**\r\n * Event emitted when the form is cancelled.\r\n * @memberof CreateGroupComponent\r\n */\r\n @Output() formCancel = new EventEmitter();\r\n createGroupText = screenTexts?.createGroup;\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n constants: any = screenTexts;\r\n leftButtonLabel = this.createGroupText?.label?.leftButtonLabel;\r\n rightButtonLabel = this.createGroupText?.label?.rightButtonLabel;\r\n isLegendVisible = false;\r\n isLeftButtonNeeded = true;\r\n colWidth: FormGrid = { xs: 12, xl: 12, sm: 12, md: 12, lg: 12 };\r\n formGroup!: FormModel;\r\n groupTypes!: SelectOption[];\r\n actionButtonAlign = AlignType.LEFT;\r\n form!: FormGroup;\r\n selectedGroupInfo!: GroupInfo | undefined;\r\n groupFunctionType!: GroupFunctionType;\r\n selectedGroupParentInfo!: GroupInfo | undefined;\r\n allowedParentGroups: ParentGroupsInfo[] = [];\r\n allowedParentGroupsOptions: SelectOption[] = [];\r\n isParentGroupChanged = false;\r\n slideToggleOption: SlideToggleOption = {\r\n id: 1,\r\n label: this.createGroupText?.label?.changeParentGroup,\r\n checked: false,\r\n };\r\n /** Reciprocal credit state (Working Group only) — captured for Save. */\r\n reciprocalEnabled = false;\r\n reciprocalSelectedGroups: SelectedForeignGroup[] = [];\r\n /** Config ids of previously-saved reciprocal rows removed locally — for soft-delete on Save. */\r\n reciprocalRemovedConfigIds: string[] = [];\r\n /** Group type currently selected in the create form (for gating the section). */\r\n selectedCreateGroupTypeId?: string;\r\n @ViewChild(DynamicFormComponent) dynamicFormComponent!: DynamicFormComponent;\r\n // eslint-disable-next-line no-unused-vars, no-empty-function\r\n constructor(\r\n // eslint-disable-next-line no-unused-vars\r\n private groupsService: GroupsService,\r\n // eslint-disable-next-line no-unused-vars\r\n private globalErrorHandlerService: GlobalErrorHandlerService,\r\n // eslint-disable-next-line no-unused-vars\r\n public alertService: AlertsService // eslint-disable-next-line no-empty-function,\r\n ) {}\r\n\r\n /**\r\n * Initialize the create group form group array and component.\r\n * @return -returns nothing\r\n * @memberof CreateGroupComponent\r\n */\r\n ngOnInit(): void {\r\n this.groupFunctionType = this.groupsService?.getGroupFunctionType();\r\n this.selectedGroupInfo = this.groupsService?.getSelectedGroupInfo();\r\n if (this.groupFunctionType === GroupFunctionType.EDIT) {\r\n this.selectedGroupParentInfo =\r\n this.groupsService?.getSelectedGroupParentInfo();\r\n if (this.selectedGroupInfo?.groupParentId)\r\n this.getParentGroups(this.selectedGroupInfo?.groupId);\r\n this.createFormGroup();\r\n } else {\r\n const groupTypes = this.groupsService?.getFormattedGroupTypes(\r\n this.groupsService?.getLoadedGroupTypes()\r\n );\r\n if (this.selectedGroupInfo?.groupType) {\r\n const allowedGroupType =\r\n groupTypes[this.selectedGroupInfo?.groupType]?.businessRule\r\n ?.allowedGroupType;\r\n if (allowedGroupType?.length) {\r\n this.groupTypes = allowedGroupType.map((groupTypeId: string) => ({\r\n id: groupTypeId,\r\n name: groupTypes[groupTypeId]?.name,\r\n }));\r\n this.groupTypes = this.groupTypes.filter(\r\n (groupType) => !groupTypes[groupType.id]?.businessRule?.isAdmin\r\n );\r\n } else {\r\n this.showAlertMessage(screenTexts?.errors?.ER1000, AlertType.ERROR);\r\n }\r\n } else {\r\n this.groupTypes = Object.entries(groupTypes).map(\r\n ([id, item]: [string, GroupType]) => ({\r\n id,\r\n name: item?.name,\r\n })\r\n );\r\n this.groupTypes = this.groupTypes.filter(\r\n (groupType) =>\r\n groupTypes[groupType.id]?.hierarchy === 0 &&\r\n !groupTypes[groupType.id]?.businessRule?.isAdmin\r\n );\r\n }\r\n if (this.groupTypes?.length) {\r\n this.createFormGroup();\r\n } else {\r\n this.showAlertMessage(screenTexts?.errors?.['1010'], AlertType.ERROR);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Constructs and returns the group type form field based on edit group or not.\r\n * @return {FieldConfig} -group type form field.\r\n * @memberof CreateGroupComponent\r\n */\r\n getGroupTypeField(): FieldConfig {\r\n let groupTypeField: FieldConfig;\r\n if (this.groupFunctionType === GroupFunctionType.EDIT) {\r\n groupTypeField = {\r\n type: FormControlType?.TEXT_AREA,\r\n label: this.createGroupText?.label?.groupType,\r\n controlName: 'groupType',\r\n isReadonly: true,\r\n ariaMultiline: false,\r\n value: this.selectedGroupInfo?.groupTypeInfo?.name,\r\n ariaLabel: this.constants?.editGroup?.ariaLabel?.groupType,\r\n ariaDescribedById:\r\n this.createGroupText?.label?.ariaDescribedById?.groupType,\r\n isResize: true,\r\n };\r\n } else {\r\n groupTypeField = {\r\n type: FormControlType?.SELECT,\r\n label: this.createGroupText?.label?.groupType + '*',\r\n controlName: 'groupType',\r\n requiredErrorMessage: this.createGroupText?.message?.error?.required,\r\n value: '',\r\n validation: [Validators.required],\r\n dropdownOptions: this.groupTypes,\r\n supportMessage: this.createGroupText?.supportText?.groupType,\r\n ariaLabel: this.createGroupText?.label?.ariaLabel?.groupType,\r\n ariaDescribedById:\r\n this.createGroupText?.label?.ariaDescribedById?.groupType,\r\n placeholder: '',\r\n };\r\n }\r\n return groupTypeField;\r\n }\r\n\r\n /**\r\n * Initialize the create group form group array.\r\n * @memberof CreateGroupComponent\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n createFormGroup(formValue?: any): void {\r\n this.formGroup = {\r\n formGroup: [\r\n {\r\n legend: '',\r\n controls: [\r\n this.getGroupTypeField(),\r\n {\r\n type: FormControlType?.INPUT,\r\n label: this.createGroupText?.label?.groupName + '*',\r\n controlName: 'groupName',\r\n requiredErrorMessage:\r\n this.createGroupText?.message?.error?.required,\r\n value:\r\n this.groupFunctionType === GroupFunctionType.EDIT\r\n ? formValue\r\n ? formValue?.groupName\r\n : this.selectedGroupInfo?.groupName\r\n : '',\r\n placeholder: '',\r\n supportMessage: this.createGroupText?.supportText?.groupName,\r\n patternErrorMessage:\r\n this.createGroupText?.message?.error?.pattern?.groupName,\r\n validation: [\r\n Validators.required,\r\n Validators.maxLength(\r\n screenTexts?.createGroup?.characterLimit?.character500\r\n ),\r\n Validators.pattern(GroupsValidationPatterns?.groupName),\r\n ],\r\n maxErrorMessage:\r\n this.createGroupText?.message?.error?.limit?.groupName,\r\n ariaLabel: this.createGroupText?.label?.ariaLabel?.groupName,\r\n ariaDescribedById:\r\n this.createGroupText?.label?.ariaDescribedById?.groupName,\r\n },\r\n {\r\n type: FormControlType?.INPUT,\r\n label: this.createGroupText?.label?.shortName + '*',\r\n controlName: 'shortName',\r\n requiredErrorMessage:\r\n this.createGroupText?.message?.error?.required,\r\n value:\r\n this.groupFunctionType === GroupFunctionType.EDIT\r\n ? formValue\r\n ? formValue?.shortName\r\n : this.selectedGroupInfo?.groupShortName\r\n : '',\r\n patternErrorMessage:\r\n this.createGroupText?.message?.error?.pattern?.shortName,\r\n placeholder: '',\r\n supportMessage: this.createGroupText?.supportText?.shortName,\r\n validation: [\r\n Validators.required,\r\n Validators.maxLength(\r\n screenTexts?.createGroup?.characterLimit?.character15\r\n ),\r\n Validators.pattern(GroupsValidationPatterns?.shortName),\r\n ],\r\n maxErrorMessage:\r\n this.createGroupText?.message?.error?.limit?.shortName,\r\n ariaLabel: this.createGroupText?.label?.ariaLabel?.shortName,\r\n ariaDescribedById:\r\n this.createGroupText?.label?.ariaDescribedById?.shortName,\r\n },\r\n {\r\n type: FormControlType.TEXT_AREA,\r\n label: this.createGroupText?.label?.groupScope,\r\n controlName: 'groupScope',\r\n patternErrorMessage:\r\n this.createGroupText?.message?.error?.pattern?.groupScope,\r\n value:\r\n this.groupFunctionType === GroupFunctionType.EDIT\r\n ? formValue\r\n ? formValue?.groupScope\r\n : this.selectedGroupInfo?.groupDesc\r\n : '',\r\n placeholder: '',\r\n supportMessage: this.createGroupText?.supportText?.groupScope,\r\n isResize: true,\r\n maxLength:\r\n screenTexts?.createGroup?.characterLimit?.character2000,\r\n validation: [\r\n Validators.maxLength(\r\n screenTexts?.createGroup?.characterLimit?.character1500\r\n ),\r\n Validators.pattern(GroupsValidationPatterns?.groupScope),\r\n ],\r\n maxErrorMessage:\r\n this.createGroupText?.message?.error?.limit?.groupScope,\r\n ariaLabel: this.createGroupText?.label?.ariaLabel?.groupScope,\r\n ariaDescribedById:\r\n this.createGroupText?.label?.ariaDescribedById?.groupScope,\r\n },\r\n ],\r\n },\r\n ],\r\n };\r\n if (this.selectedGroupInfo?.groupId) {\r\n this.updateCreateFormGroup(this.selectedGroupInfo);\r\n }\r\n }\r\n\r\n /**\r\n * Update the create sub group form group array.\r\n * @param {GroupInfo} parentGroupInfo -Parent group info.\r\n * @return -returns nothing\r\n * @memberof CreateGroupComponent\r\n */\r\n updateCreateFormGroup(parentGroupInfo: GroupInfo): void {\r\n if (\r\n (this.groupFunctionType === GroupFunctionType.EDIT &&\r\n parentGroupInfo?.groupParentId) ||\r\n this.groupFunctionType === GroupFunctionType.CREATE\r\n ) {\r\n this.updateAddUserFormControls(\r\n this.formGroup?.formGroup[0]?.controls?.length - INDEX_VALUE,\r\n {\r\n type: FormControlType?.TEXT_AREA,\r\n label: this.createGroupText?.label?.parentGroup,\r\n controlName: 'parentGroup',\r\n value:\r\n this.selectedGroupParentInfo?.groupName ??\r\n parentGroupInfo?.groupName,\r\n ariaLabel: this.createGroupText?.label?.ariaLabel?.parentGroup,\r\n ariaDescribedById:\r\n this.createGroupText?.label?.ariaDescribedById?.parentGroup,\r\n isReadonly: true,\r\n ariaMultiline: false,\r\n isResize: true,\r\n }\r\n );\r\n\r\n if (this.groupFunctionType === GroupFunctionType.EDIT) {\r\n this.updateAddUserFormControls(\r\n this.formGroup?.formGroup[0]?.controls?.length - INDEX_VALUE,\r\n {\r\n type: FormControlType?.SLIDE_TOGGLE,\r\n controlName: 'changeParentGroup',\r\n ariaLabel:\r\n this.createGroupText?.label?.ariaLabel?.changeParentGroup,\r\n ariaDescribedById:\r\n this.createGroupText?.label?.ariaDescribedById?.changeParentGroup,\r\n slideToggleOption: this.slideToggleOption,\r\n disabled: this.allowedParentGroupsOptions.length === 0,\r\n }\r\n );\r\n if (this.isParentGroupChanged) {\r\n this.updateAddUserFormControls(\r\n this.formGroup?.formGroup[0]?.controls?.length - INDEX_VALUE,\r\n {\r\n type: FormControlType?.SELECT,\r\n label: this.createGroupText?.label?.newParentGroup + '*',\r\n controlName: 'newParentGroup',\r\n value: this.allowedParentGroupsOptions?.filter(\r\n (option) => option?.id === this.selectedGroupInfo?.groupId\r\n )[0],\r\n requiredErrorMessage:\r\n this.createGroupText?.message?.error?.required,\r\n validation: [Validators.required],\r\n dropdownOptions: this.allowedParentGroupsOptions,\r\n placeholder: '',\r\n supportMessage: this.createGroupText?.supportText?.newParentGroup,\r\n ariaLabel: this.createGroupText?.label?.ariaLabel?.newParentGroup,\r\n ariaDescribedById:\r\n this.createGroupText?.label?.ariaDescribedById?.newParentGroup,\r\n }\r\n );\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Updates the create or edit user form group controls by adding fieldConfig at required index.\r\n * @param {number} indexPosition\r\n * @param {FieldConfig} fieldConfig\r\n * @return -returns nothing\r\n * @memberof CreateGroupComponent\r\n */\r\n updateAddUserFormControls(\r\n indexPosition: number,\r\n fieldConfig: FieldConfig\r\n ): void {\r\n this.formGroup?.formGroup[0]?.controls?.splice(\r\n indexPosition,\r\n 0,\r\n fieldConfig\r\n );\r\n }\r\n\r\n /**\r\n * Handles client side validation and calls create group or edit group methods.\r\n * @param {FormGroup[]} form -Array of formGroup\r\n * @return -returns nothing\r\n * @memberof CreateGroupComponent\r\n */\r\n onFormSubmit(form: FormGroup[]): void {\r\n form[0]?.markAllAsTouched();\r\n // Reciprocal Credit: if the toggle is ON, at least one foreign group is\r\n // required (BE rejects an empty foreign-group list). Block Save otherwise.\r\n if (this.isReciprocalInvalid) {\r\n this.showAlertMessage(\r\n this.createGroupText?.reciprocalCredit?.selectAtLeastOneGroup ??\r\n 'Please add at least one Working Group to enable Reciprocal Credit, or turn off the toggle.',\r\n AlertType.ERROR\r\n );\r\n return;\r\n }\r\n if (form[0].status === FormStatus.VALID) {\r\n const formData = form[0]?.getRawValue();\r\n // eslint-disable-next-line no-unused-expressions\r\n this.groupFunctionType === GroupFunctionType.EDIT\r\n ? this.editGroup(formData)\r\n : this.createGroup(formData);\r\n }\r\n }\r\n /**\r\n * Constructs create group payload and calls create group API and emits create group API response.\r\n * @param formData\r\n * @return -returns nothing\r\n * @memberof CreateGroupComponent\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n createGroup(formData: any): void {\r\n const createGroupPayload: CreateGroupPayload = {\r\n payload: {\r\n groupName: formData?.groupName,\r\n groupShortName: formData?.shortName,\r\n groupType: formData?.groupType?.id,\r\n groupDesc: formData?.groupScope,\r\n groupParentId: this.selectedGroupInfo?.groupId ?? null,\r\n },\r\n };\r\n this.groupsService\r\n .createGroup(createGroupPayload)\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (res) => {\r\n if (res?.status) {\r\n this.submitFormResponse?.emit(res);\r\n }\r\n },\r\n error: (error) => {\r\n this.handleErrors(error);\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Constructs edit group payload and calls edit group API and emits create group API response.\r\n * @param formData\r\n * @return -returns nothing\r\n * @memberof CreateGroupComponent\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n editGroup(formData: any): void {\r\n this.groupsService?.setParentGroupChangeStatus(this.isParentGroupChanged);\r\n const editGroupPayload: EditGroupPayload = {\r\n payload: {\r\n groupName: formData?.groupName,\r\n groupShortName: formData?.shortName,\r\n groupDesc: formData?.groupScope,\r\n groupParentId: this.isParentGroupChanged\r\n ? formData?.newParentGroup?.id\r\n : this.selectedGroupInfo?.groupParentId ?? null,\r\n groupId: this.selectedGroupInfo?.groupId as string,\r\n },\r\n };\r\n this.groupsService\r\n .editGroup(editGroupPayload)\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (res) => {\r\n if (res?.status) {\r\n // Persist reciprocal-credit changes (Working Group edit only), then emit.\r\n this.persistReciprocalCredit(res);\r\n }\r\n },\r\n error: (error) => {\r\n this.handleErrors(error);\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Persists reciprocal-credit changes captured from the section after a\r\n * successful group edit: POSTs newly-added foreign groups (those without a\r\n * configId) and soft-deletes each removed config id. Emits the group-edit\r\n * response once persistence completes (or immediately if there's nothing to do).\r\n * @param {*} editResponse the successful edit-group response\r\n * @memberof CreateGroupComponent\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private persistReciprocalCredit(editResponse: any): void {\r\n const homeGroupId = this.selectedGroupInfo?.groupId;\r\n // Nothing to persist when the section isn't shown or there's no home group.\r\n if (!this.isReciprocalSectionVisible || !homeGroupId) {\r\n this.submitFormResponse?.emit(editResponse);\r\n return;\r\n }\r\n\r\n // Add: selected groups that were not already saved (no configId yet).\r\n const foreignGroupIdsToAdd = this.reciprocalSelectedGroups\r\n .filter((group) => !group.configId)\r\n .map((group) => group.groupId);\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n const calls: any[] = [];\r\n if (this.reciprocalEnabled && foreignGroupIdsToAdd.length > 0) {\r\n calls.push(\r\n this.groupsService.saveReciprocalCredit({\r\n homeGroupId,\r\n foreignGroupIds: foreignGroupIdsToAdd,\r\n })\r\n );\r\n }\r\n // Remove: each previously-saved config id removed locally.\r\n this.reciprocalRemovedConfigIds.forEach((configId) => {\r\n calls.push(this.groupsService.removeReciprocalConfig(configId));\r\n });\r\n\r\n // Nothing to persist — emit the edit response as-is.\r\n if (calls.length === 0) {\r\n this.submitFormResponse?.emit(editResponse);\r\n return;\r\n }\r\n\r\n forkJoin(calls)\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: () => {\r\n this.submitFormResponse?.emit(editResponse);\r\n },\r\n error: (error) => {\r\n // Group edit already succeeded; surface the reciprocal error but still\r\n // emit so the parent completes the edit flow.\r\n this.groupsService.handleErrors(error);\r\n this.submitFormResponse?.emit(editResponse);\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Captures the server side errors and handles the errors based on the custom or Http errors.\r\n * @param {HttpErrorResponse} error\r\n * @return -returns nothing\r\n * @memberof CreateGroupComponent\r\n */\r\n handleErrors(error: HttpErrorResponse): void {\r\n const errorCodes: string[] = error?.error?.body?.errorCodes;\r\n if (Array.isArray(errorCodes)) {\r\n const errorMessage: string[] =\r\n this.groupsService?.parseErrorMessage(errorCodes);\r\n this.showAlertMessage(errorMessage, AlertType.ERROR);\r\n } else if (error && error instanceof HttpErrorResponse) {\r\n this.globalErrorHandlerService?.handleError(error);\r\n }\r\n }\r\n\r\n /**\r\n * Get form reference.\r\n * @param {FormGroup[]} form\r\n * @memberof CreateGroupComponent\r\n */\r\n getFormGroupReference(form: FormGroup[]) {\r\n this.form = form[0];\r\n }\r\n\r\n /**\r\n * Handles alerts for error, warning.\r\n * @param {(string | string[])} message -error or warning message\r\n * @param {AlertType} alertType\r\n * @return -returns nothing\r\n * @memberof CreateGroupComponent\r\n */\r\n showAlertMessage(message: string | string[], alertType: AlertType): void {\r\n this.alertService?.showMessage({\r\n status: 'custom',\r\n message: message,\r\n alertType: alertType,\r\n isCloseNeeded: true,\r\n });\r\n }\r\n\r\n /**\r\n * Emits form cancel event.\r\n * @return -returns nothing\r\n * @memberof CreateGroupComponent\r\n */\r\n createGroupCancelled(): void {\r\n this.formCancel?.emit();\r\n }\r\n\r\n /**\r\n * True when the group being created/edited is a Working Group — gates the\r\n * Reciprocal Credit section.\r\n * @return {boolean}\r\n * @memberof CreateGroupComponent\r\n */\r\n get isWorkingGroup(): boolean {\r\n const groupTypeId =\r\n this.groupFunctionType === GroupFunctionType.EDIT\r\n ? this.selectedGroupInfo?.groupType\r\n : this.selectedCreateGroupTypeId;\r\n if (!groupTypeId) return false;\r\n const groupTypes = this.groupsService?.getFormattedGroupTypes(\r\n this.groupsService?.getLoadedGroupTypes()\r\n );\r\n return groupTypes?.[groupTypeId]?.name === WORKING_GROUP_TYPE_NAME;\r\n }\r\n\r\n /**\r\n * True when the Reciprocal Credit section should be shown: only for a Working\r\n * Group in EDIT mode. Hidden during create because the home group has no id\r\n * yet and the create flow is still being finalized with the client team.\r\n * @return {boolean}\r\n * @memberof CreateGroupComponent\r\n */\r\n get isReciprocalSectionVisible(): boolean {\r\n return (\r\n this.groupFunctionType === GroupFunctionType.EDIT && this.isWorkingGroup\r\n );\r\n }\r\n\r\n /**\r\n * True when the reciprocal section is shown, the toggle is ON, but no foreign\r\n * group has been added — an invalid state (BE rejects an empty foreign-group\r\n * list). Used to block the edit Save.\r\n * @return {boolean}\r\n * @memberof CreateGroupComponent\r\n */\r\n get isReciprocalInvalid(): boolean {\r\n return (\r\n this.isReciprocalSectionVisible &&\r\n this.reciprocalEnabled &&\r\n this.reciprocalSelectedGroups.length === 0\r\n );\r\n }\r\n\r\n /** Home group id for the reciprocal section (present in edit). */\r\n get reciprocalHomeGroupId(): string | undefined {\r\n return this.groupFunctionType === GroupFunctionType.EDIT\r\n ? this.selectedGroupInfo?.groupId\r\n : undefined;\r\n }\r\n\r\n /** Parent committee name shown in the reciprocal helper text. */\r\n get reciprocalParentCommitteeName(): string | undefined {\r\n return this.selectedGroupParentInfo?.groupName;\r\n }\r\n\r\n /** Capture reciprocal toggle state from the section. */\r\n onReciprocalEnabledChange(enabled: boolean): void {\r\n this.reciprocalEnabled = enabled;\r\n }\r\n\r\n /** Capture reciprocal foreign-group selection from the section. */\r\n onReciprocalSelectionChange(groups: SelectedForeignGroup[]): void {\r\n this.reciprocalSelectedGroups = groups;\r\n }\r\n\r\n /** Capture the config ids to soft-delete on Save from the section. */\r\n onReciprocalRemovedConfigIdsChange(configIds: string[]): void {\r\n this.reciprocalRemovedConfigIds = configIds;\r\n }\r\n\r\n /**\r\n * Gets allowed parent groups for reassigning the parent.\r\n * @param {string} groupId\r\n * @return -returns nothing\r\n * @memberof CreateGroupComponent\r\n */\r\n getParentGroups(groupId: string): void {\r\n this.allowedParentGroups = [];\r\n this.groupsService\r\n .getAllowedParentGroups(groupId)\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (response) => {\r\n response?.forEach((option) => {\r\n this.allowedParentGroupsOptions?.push({\r\n id: option?.groupId,\r\n name: option?.groupName + ' (' + option?.groupAcronym + ')',\r\n });\r\n });\r\n this.allowedParentGroups = response;\r\n if (this.allowedParentGroupsOptions.length > 0) {\r\n this.updateFormControlOptions(\r\n 'changeParentGroup',\r\n 'isDisabled',\r\n false\r\n );\r\n this.updateFormControlOptions(\r\n 'newParentGroup',\r\n 'dropdownOptions',\r\n this.allowedParentGroupsOptions\r\n );\r\n }\r\n },\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n error: (error: any) => {\r\n this.handleErrors(error);\r\n this.updateFormControlOptions(\r\n 'changeParentGroup',\r\n 'isDisabled',\r\n this.allowedParentGroupsOptions.length === 0\r\n );\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Update passed form field values.\r\n * @param {string} formControlName\r\n * @param {string} formControlInputProperty\r\n * @param {*} value\r\n * @memberof CreateGroupComponent\r\n */\r\n updateFormControlOptions(\r\n formControlName: string,\r\n formControlInputProperty: string,\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n value: any\r\n ): void {\r\n const formFields = this.dynamicFormComponent?.formFields?.toArray();\r\n formFields?.forEach((formField) => {\r\n if (\r\n formField?.component?.instance?.config?.controlName ===\r\n formControlName &&\r\n formField?.component?.instance?.[formControlInputProperty]\r\n )\r\n formField.component.instance[formControlInputProperty] = value;\r\n });\r\n }\r\n\r\n /**\r\n * Adds/removes new parent group selection options whenever Change Parent Group slider is toggled.\r\n * @param {SlideToggleOption} toggle\r\n * @return -returns nothing\r\n * @memberof CreateGroupComponent\r\n */\r\n onFormSlideToggleChange(toggle: SlideToggleOption): void {\r\n this.slideToggleOption.checked = toggle?.checked;\r\n this.isParentGroupChanged = toggle?.checked;\r\n this.createFormGroup(this.form?.value);\r\n }\r\n\r\n /**\r\n * Handles create group form change event.\r\n * @param {FormGroup[]} form\r\n * @return -returns nothing\r\n * @memberof CreateGroupComponent\r\n */\r\n onCreateGroupFormChange(form: FormGroup[]): void {\r\n if (this.isParentGroupChanged) {\r\n const selectedParentGroup = this.allowedParentGroups?.filter(\r\n (option: ParentGroupsInfo) =>\r\n option?.groupId ===\r\n form[0]?.controls['newParentGroup']?.value?.id?.toString()\r\n )[0];\r\n this.form?.get('parentGroup')?.setValue(selectedParentGroup?.groupName);\r\n }\r\n // Track the selected group type in create mode so the Reciprocal Credit\r\n // section can render only for Working Groups.\r\n if (this.groupFunctionType !== GroupFunctionType.EDIT) {\r\n this.selectedCreateGroupTypeId =\r\n form[0]?.controls['groupType']?.value?.id ??\r\n form[0]?.controls['groupType']?.value;\r\n }\r\n }\r\n\r\n /**\r\n * NgOnDestroy performs necessary cleanup tasks, such as unsubscribing from subscription when the component is being destroyed.\r\n * @memberof CreateGroupComponent\r\n */\r\n ngOnDestroy(): void {\r\n this.destroy$.next(true);\r\n this.destroy$.unsubscribe();\r\n }\r\n}\r\n","<ieeesa-dynamic-form\r\n *ngIf=\"formGroup\"\r\n [leftButtonLabel]=\"leftButtonLabel\"\r\n [rightButtonLabel]=\"rightButtonLabel\"\r\n [isLegendVisible]=\"isLegendVisible\"\r\n [colWidth]=\"colWidth\"\r\n [actionButtonAlign]=\"actionButtonAlign\"\r\n [formGroups]=\"formGroup\"\r\n [isLeftButtonNeeded]=\"isLeftButtonNeeded\"\r\n (formSubmit)=\"onFormSubmit($event)\"\r\n (formLeftButtonClicked)=\"createGroupCancelled()\"\r\n (formGroupsReference)=\"getFormGroupReference($event)\"\r\n (formSlideToggleChange)=\"onFormSlideToggleChange($event)\"\r\n (formChange)=\"onCreateGroupFormChange($event)\"\r\n>\r\n <!-- Reciprocal Credit section — Working Groups in EDIT mode only.\r\n Hidden during create (no home group id yet; create flow pending client team).\r\n Projected via [component] so it renders ABOVE the form's Save/Cancel buttons. -->\r\n <ieeesa-reciprocal-credit-section\r\n component\r\n *ngIf=\"isReciprocalSectionVisible\"\r\n [homeGroupId]=\"reciprocalHomeGroupId\"\r\n [parentCommitteeName]=\"reciprocalParentCommitteeName\"\r\n (enabledChange)=\"onReciprocalEnabledChange($event)\"\r\n (selectionChange)=\"onReciprocalSelectionChange($event)\"\r\n (removedConfigIdsChange)=\"onReciprocalRemovedConfigIdsChange($event)\"\r\n ></ieeesa-reciprocal-credit-section>\r\n</ieeesa-dynamic-form>","/* eslint-disable no-unused-vars */\r\nexport enum GroupAction {\r\n VIEW_ROSTER = 1,\r\n CREATE_SUB_GROUP = 2,\r\n EDIT_GROUP = 3,\r\n DELETE_GROUP = 4,\r\n EXPAND_GROUP_VIEW = 5,\r\n COLLAPSE_GROUP_VIEW = 6,\r\n MANAGE_INTEREST_FORM = 7,\r\n}\r\n","import {\r\n Component,\r\n ElementRef,\r\n EventEmitter,\r\n Injectable,\r\n Input,\r\n OnInit,\r\n Output,\r\n AfterViewInit,\r\n OnDestroy,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport {\r\n MenuComponent,\r\n Menu,\r\n IconButtonComponent,\r\n IconButton,\r\n TextTruncatedDirective,\r\n BreakpointObserverService\r\n} from '@ieeesa-npm/presentation';\r\nimport * as constants from '../../assets/constants.json';\r\nimport { GroupAction } from '../../models/group-action.model';\r\nimport { CommonModule } from '@angular/common';\r\nimport {\r\n CollectionViewer,\r\n SelectionChange,\r\n DataSource,\r\n} from '@angular/cdk/collections';\r\nimport { FlatTreeControl } from '@angular/cdk/tree';\r\nimport { BehaviorSubject, merge, Observable, Subject } from 'rxjs';\r\nimport { map, takeUntil } from 'rxjs/operators';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatTreeModule, MatTreeNodePadding } from '@angular/material/tree';\r\nimport { GroupInfo } from '../../models/group-info.model';\r\nimport { EditGroupAndParentInfo } from '../../models/edit-group.model';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { GroupsService } from '../../services/groups.service';\r\nimport { GroupFunctionType } from '../../models/group-function-type.model';\r\nimport { PermissionType } from '../../models/permission-type.model';\r\nimport { GroupPermission } from '../../models/group-permissions.model';\r\n/**\r\n * Dynamic Flat node creates a node structure\r\n * @export\r\n * @class GroupNode\r\n */\r\nexport class GroupNode {\r\n constructor(\r\n // eslint-disable-next-line no-unused-vars\r\n public item: GroupInfo,\r\n // eslint-disable-next-line no-unused-vars\r\n public level = 1,\r\n // eslint-disable-next-line no-unused-vars\r\n public expandable = false,\r\n // eslint-disable-next-line no-unused-vars\r\n public isLoading = false // eslint-disable-next-line no-empty-function\r\n ) {}\r\n}\r\n\r\n/**\r\n * Groups stores the parent nodes and child nodes\r\n * @export\r\n * @class Groups\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class Groups {\r\n rootLevelNodes!: GroupInfo[];\r\n /** Initial data from database */\r\n private childGroups!: GroupInfo[];\r\n /**\r\n * Get the Child groups info\r\n * @return {*} {GroupInfo[]}\r\n * @memberof Groups\r\n */\r\n getChildGroupsInfo(): GroupInfo[] {\r\n return this.childGroups;\r\n }\r\n /**\r\n * Sets the Child groups info\r\n * @param {GroupInfo[]} value\r\n * @memberof Groups\r\n */\r\n setChildGroupsInfo(value: GroupInfo[]): void {\r\n this.childGroups = value;\r\n }\r\n /**\r\n * Initialize the groups data and creates the node structure for mat tree\r\n * @param {GroupInfo[]} data\r\n * @return {*} {GroupNode[]}\r\n * @memberof Groups\r\n */\r\n initialData(data: GroupInfo[]): GroupNode[] {\r\n this.rootLevelNodes = data;\r\n return this.rootLevelNodes?.map(\r\n (node) => new GroupNode(node, 0, this.isExpandable(node))\r\n );\r\n }\r\n /**\r\n * Checks the node is expandable or not\r\n * @param {GroupInfo} node\r\n * @return {*} {boolean}\r\n * @memberof Groups\r\n */\r\n isExpandable(node: GroupInfo): boolean {\r\n return (\r\n (!!node?.children && node?.children?.length > 0) || node?.hasChildren\r\n );\r\n }\r\n}\r\n/**\r\n * Dynamic Data Source handles the connection with dynamic data base\r\n * @export\r\n * @class GroupsDataSource\r\n * @implements {DataSource<GroupNode>}\r\n */\r\nexport class GroupsDataSource implements DataSource<GroupNode> {\r\n destroy$: Subject<boolean> = new Subject<boolean>();\r\n dataChange = new BehaviorSubject<GroupNode[]>([]);\r\n /**\r\n * Gets the updated tree control data\r\n * @type {GroupNode[]}\r\n * @memberof GroupsDataSource\r\n */\r\n get data(): GroupNode[] {\r\n return this.dataChange?.value;\r\n }\r\n /**\r\n * Sets the data to tree control and emit the value to intimate the data change\r\n * @memberof GroupsDataSource\r\n */\r\n set data(value: GroupNode[]) {\r\n this.treeControl.dataNodes = value;\r\n this.dataChange.next(value);\r\n }\r\n\r\n constructor(\r\n // eslint-disable-next-line no-unused-vars\r\n private treeControl: FlatTreeControl<GroupNode>,\r\n // eslint-disable-next-line no-unused-vars\r\n private database: Groups // eslint-disable-next-line no-empty-function\r\n ) {}\r\n\r\n /**\r\n * Handles the connection between the data base and mat tree\r\n * @param {CollectionViewer} collectionViewer\r\n * @return {*} {Observable<GroupNode[]>}\r\n * @memberof GroupsDataSource\r\n */\r\n connect(collectionViewer: CollectionViewer): Observable<GroupNode[]> {\r\n this.treeControl?.expansionModel?.changed\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe((change) => {\r\n if (\r\n (change as SelectionChange<GroupNode>).added ||\r\n (change as SelectionChange<GroupNode>).removed\r\n ) {\r\n this.handleTreeControl(change as SelectionChange<GroupNode>);\r\n }\r\n });\r\n return merge(collectionViewer?.viewChange, this.dataChange).pipe(\r\n map(() => this.data)\r\n );\r\n }\r\n /**\r\n * Disconnect the connection with mat tree\r\n * @param {CollectionViewer} collectionViewer\r\n * @memberof GroupsDataSource\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-empty-function, no-empty-function, no-unused-vars, @typescript-eslint/no-unused-vars\r\n disconnect(collectionViewer: CollectionViewer): void {\r\n this.destroy$.next(true);\r\n this.destroy$.unsubscribe();\r\n }\r\n\r\n /**\r\n * Adds/removes the child nodes while expands/collapses the parent node\r\n * @param {SelectionChange<GroupNode>} change\r\n * @memberof GroupsDataSource\r\n */\r\n handleTreeControl(change: SelectionChange<GroupNode>) {\r\n if (change?.added) {\r\n change.added?.forEach((node) => this.toggleNode(node, true));\r\n }\r\n if (change?.removed) {\r\n change.removed\r\n .slice()\r\n .reverse()\r\n .forEach((node) => this.toggleNode(node, false));\r\n }\r\n }\r\n\r\n /**\r\n * Toggle the node, add/removes the node from display\r\n * @param {GroupNode} clickedNode\r\n * @param {boolean} expand\r\n * @return {*}\r\n * @memberof GroupsDataSource\r\n */\r\n toggleNode(clickedNode: GroupNode, expand: boolean) {\r\n const children = this.database?.getChildGroupsInfo();\r\n const index = this.data?.indexOf(clickedNode);\r\n if (!children || index < 0) {\r\n // If no children, or cannot find the node, no op\r\n return;\r\n }\r\n\r\n if (expand) {\r\n clickedNode.item.noOfChildren = children.length;\r\n const nodes = children?.map(\r\n (node) =>\r\n new GroupNode(\r\n node,\r\n clickedNode?.level + 1,\r\n this.database?.isExpandable(node)\r\n )\r\n );\r\n this.data?.splice(index + 1, 0, ...nodes);\r\n } else {\r\n let count = 0;\r\n for (\r\n let i = index + 1;\r\n i < this.data?.length && this.data[i]?.level > clickedNode?.level;\r\n i++, count++ // eslint-disable-next-line no-empty\r\n ) {}\r\n this.data?.splice(index + 1, count);\r\n }\r\n\r\n // Notify the change\r\n this.dataChange?.next(this.data);\r\n }\r\n}\r\n/**\r\n * Displays the groups where parent/child relationships are represented in a tree view/hierarchy.\r\n * @export\r\n * @class TreeViewComponent\r\n * @implements {OnInit}\r\n */\r\n@Component({\r\n selector: 'ieeesa-tree',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n MatTreeModule,\r\n MatIconModule,\r\n MatButtonModule,\r\n MenuComponent,\r\n IconButtonComponent,\r\n MatTooltipModule,\r\n TextTruncatedDirective,\r\n ],\r\n templateUrl: './tree-view.component.html',\r\n styleUrls: ['./tree-view.component.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class TreeViewComponent implements OnInit, AfterViewInit, OnDestroy {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n constants: any = constants;\r\n buttons: Menu[] = this.constants?.viewGroups?.buttons;\r\n treePaddingIndent: number = this.constants?.viewGroups?.treePaddingIndent;\r\n selectedGroup!: GroupNode;\r\n selectedGroupAction!: Menu | IconButton;\r\n treeControl!: FlatTreeControl<GroupNode>;\r\n dataSource!: GroupsDataSource;\r\n destroy$: Subject<boolean> = new Subject<boolean>();\r\n matTreeNodePadding!: MatTreeNodePadding<GroupNode>;\r\n plusCircleIconButton: IconButton = this.buttons[4];\r\n minusCircleIconButton: IconButton = this.buttons[5];\r\n editGroupAndParentGroupInfo!: EditGroupAndParentInfo;\r\n permissionType = PermissionType;\r\n\r\n menuItems: Menu[] = this.buttons?.filter(\r\n (e) =>\r\n e.id !== GroupAction?.EXPAND_GROUP_VIEW &&\r\n e.id !== GroupAction?.COLLAPSE_GROUP_VIEW\r\n );\r\n private parentGroups!: GroupInfo[];\r\n @Input()\r\n set parentGroupsInfo(value: GroupInfo[]) {\r\n this.parentGroups = value;\r\n if (value) this.setGroupDataSource();\r\n }\r\n get parentGroupsInfo(): GroupInfo[] {\r\n return this.parentGroups;\r\n }\r\n private childGroups!: GroupInfo[];\r\n @Input()\r\n set childGroupsInfo(value: GroupInfo[]) {\r\n this.childGroups = value;\r\n this.loadChildGroups();\r\n }\r\n get childGroupsInfo(): GroupInfo[] {\r\n return this.childGroups;\r\n }\r\n private isGroupSearchOrFilter = false;\r\n @Input()\r\n set isGroupSearchOrFilterActive(value: boolean) {\r\n this.isGroupSearchOrFilter = value;\r\n }\r\n get isGroupSearchOrFilterActive(): boolean {\r\n return this.isGroupSearchOrFilter;\r\n }\r\n private deletedGroupId!: string | undefined;\r\n @Input()\r\n set deletedGroupIdInfo(id: string | undefined) {\r\n this.deletedGroupId = id;\r\n this.deleteGroupNode(this.deletedGroupId);\r\n }\r\n get deletedGroupIdInfo(): string | undefined {\r\n return this.deletedGroupId;\r\n }\r\n @Input()\r\n userGroupPermissions!: GroupPermission[];\r\n\r\n @Output() toggleGroupClick = new EventEmitter<GroupInfo>();\r\n @Output() createGroupClick = new EventEmitter<GroupInfo>();\r\n @Output() editGroupClick = new EventEmitter<EditGroupAndParentInfo>();\r\n @Output() deleteGroupClick = new EventEmitter<GroupInfo>();\r\n @Output() viewRosterClick = new EventEmitter<GroupInfo>();\r\n @Output() manageInterestFormClick = new EventEmitter<GroupInfo>();\r\n isMobileView = false;\r\n groupFunctionType = GroupFunctionType;\r\n // eslint-disable-next-line no-unused-vars\r\n constructor(\r\n // eslint-disable-next-line no-unused-vars\r\n public database: Groups,\r\n // eslint-disable-next-line no-unused-vars\r\n public elementRef: ElementRef,\r\n // eslint-disable-next-line no-unused-vars\r\n public groupsService: GroupsService,\r\n // eslint-disable-next-line no-unused-vars\r\n private breakpointObserverService: BreakpointObserverService\r\n ) {\r\n this.breakpointObserverService\r\n .getBreakpoint()\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe((result: { matches: boolean }) => {\r\n this.isMobileView = result?.matches;\r\n });\r\n }\r\n /**\r\n * Initializes the tree view component\r\n * @memberof TreeViewComponent\r\n */\r\n ngOnInit(): void {\r\n this.setGroupDataSource();\r\n }\r\n /**\r\n * Assign ARIA role for all mat tree nodes as \"row\"\r\n * @memberof TreeViewComponent\r\n */\r\n ngAfterViewInit(): void {\r\n this.dataSource?.dataChange\r\n ?.pipe(takeUntil(this.destroy$))\r\n .subscribe(() => {\r\n const treeItemNodes =\r\n this.elementRef?.nativeElement?.querySelectorAll('[role=treeitem]');\r\n treeItemNodes?.forEach((node: HTMLElement) => (node.role = 'row'));\r\n });\r\n }\r\n /**\r\n * Gets the level of the node\r\n * @param {GroupNode} node\r\n * @memberof TreeViewComponent\r\n */\r\n getLevel = (node: GroupNode) => node?.level;\r\n\r\n /**\r\n * Checks the node is expandable or not\r\n * @param {GroupNode} node\r\n * @memberof TreeViewComponent\r\n */\r\n isExpandable = (node: GroupNode) => node?.expandable;\r\n\r\n /**\r\n * Returns true if passed node has children otherwise false\r\n * @param {number} index\r\n * @param {GroupNode} node\r\n * @return {boolean}\r\n * @memberof TreeViewComponent\r\n */\r\n hasChildGroups = (index: number, _nodeData: GroupNode) =>\r\n _nodeData.expandable;\r\n /**\r\n * Emits the group info when the toggle group is clicked or toggles the group view\r\n * @param {GroupNode} group\r\n * @memberof TreeViewComponent\r\n */\r\n viewChildGroups(node: GroupNode) {\r\n if (!node?.item?.hasChildren) {\r\n return;\r\n }\r\n if (this.treeControl?.isExpanded(node)) {\r\n this.treeControl?.toggle(node);\r\n } else {\r\n this.groupsService.setGroupFunctionType(GroupFunctionType.TOGGLE);\r\n this.toggleGroupClick.emit(node?.item);\r\n this.selectedGroup = node;\r\n }\r\n }\r\n /**\r\n * Sets the box shadow based on the group type legend color\r\n * @return {*}\r\n * @memberof TreeViewComponent\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n getBoxShadow(): any {\r\n return {\r\n boxShadow: '0px 1px 0px 0px #c9cbd0 inset',\r\n };\r\n }\r\n /**\r\n * Sets the dataSource with parent groups data\r\n * @memberof TreeViewComponent\r\n */\r\n setGroupDataSource(): void {\r\n if (\r\n this.dataSource &&\r\n this.groupsService.getGroupFunctionType() === GroupFunctionType.CREATE\r\n ) {\r\n this.parentGroupsInfo?.forEach((parentGroupNode) => {\r\n if (\r\n this.dataSource?.data?.findIndex(\r\n (node) => node?.item?.groupId === parentGroupNode?.groupId\r\n ) === -1\r\n ) {\r\n const newGroupNode = new GroupNode(\r\n parentGroupNode,\r\n 0,\r\n this.database.isExpandable(parentGroupNode)\r\n );\r\n const groupNodesReference = this.dataSource?.data;\r\n groupNodesReference?.push(newGroupNode);\r\n this.dataSource.data = groupNodesReference;\r\n this.sortParentGroupsAlphabetically();\r\n }\r\n });\r\n } else if (\r\n this.groupsService.getGroupFunctionType() === GroupFunctionType.EDIT\r\n ) {\r\n this.editGroup(this.parentGroupsInfo);\r\n this.sortParentGroupsAlphabetically();\r\n } else {\r\n this.treeControl = new FlatTreeControl<GroupNode>(\r\n this.getLevel,\r\n this.isExpandable\r\n );\r\n this.dataSource = new GroupsDataSource(this.treeControl, this.database);\r\n this.dataSource.data = this.database?.initialData(this.parentGroupsInfo);\r\n }\r\n }\r\n /**\r\n * Sets the updated node information\r\n * @param {GroupInfo[]} groupsInfo\r\n * @memberof TreeViewComponent\r\n */\r\n editGroup(groupsInfo: GroupInfo[]) {\r\n const groupNodeReference = this.dataSource?.data;\r\n const editedNode = groupsInfo?.find(\r\n (node) =>\r\n node?.groupId === this.editGroupAndParentGroupInfo?.groupInfo?.groupId\r\n );\r\n groupNodeReference?.forEach((node) => {\r\n if (\r\n node?.item?.groupId ===\r\n this.editGroupAndParentGroupInfo?.groupInfo?.groupId\r\n ) {\r\n const noOfChildrenReference = node.item.noOfChildren;\r\n node.item = editedNode as GroupInfo;\r\n node.item.noOfChildren = noOfChildrenReference;\r\n node.expandable = this.database.isExpandable(node?.item);\r\n if (node.item.hasChildren && this.treeControl.isExpanded(node)) {\r\n this.treeControl.toggle(node);\r\n }\r\n }\r\n });\r\n this.dataSource.data = groupNodeReference;\r\n }\r\n /**\r\n * Loads the child groups and updates the tree view.\r\n * @memberof TreeViewComponent\r\n */\r\n loadChildGroups() {\r\n this.database?.setChildGroupsInfo(this.childGroupsInfo);\r\n const groupNodesReference = this.dataSource?.data;\r\n if (\r\n this.groupsService.getGroupFunctionType() === GroupFunctionType.CREATE\r\n ) {\r\n if (!this.selectedGroup?.item?.hasChildren) {\r\n this.selectedGroup.item.hasChildren = true;\r\n const groupParentNode = new GroupNode(\r\n this.selectedGroup.item,\r\n this.selectedGroup.level,\r\n true\r\n );\r\n groupNodesReference.splice(\r\n groupNodesReference.indexOf(this.selectedGroup),\r\n 1,\r\n groupParentNode\r\n );\r\n this.treeControl.expand(groupParentNode);\r\n }\r\n if (this.treeControl.isExpanded(this.selectedGroup)) {\r\n const children = this.database.getChildGroupsInfo();\r\n children?.forEach((groupNode) => {\r\n if (\r\n this.dataSource?.data?.findIndex(\r\n (node) => node?.item?.groupId === groupNode?.groupId\r\n ) === -1\r\n ) {\r\n const newGroupNode = new GroupNode(\r\n groupNode,\r\n this.selectedGroup?.level + 1,\r\n this.database?.isExpandable(groupNode)\r\n );\r\n const groupNodesReference = this.dataSource?.data;\r\n groupNodesReference.forEach((node) => {\r\n if (node.item.groupId === this.selectedGroup.item.groupId) {\r\n node.item.noOfChildren = children.length;\r\n }\r\n });\r\n groupNodesReference.splice(\r\n groupNodesReference.indexOf(this.selectedGroup) + 1,\r\n 0,\r\n newGroupNode\r\n );\r\n this.dataSource.data = groupNodesReference;\r\n }\r\n });\r\n }\r\n const selectedGroupIndex = this.dataSource.data.findIndex(\r\n (node) => node.item.groupId === this.selectedGroup?.item.groupId\r\n );\r\n this.sortChildGroupsAlphabetically(\r\n selectedGroupIndex + 1,\r\n this.getNextGroup(selectedGroupIndex, this.dataSource.data)\r\n );\r\n } else if (\r\n this.groupsService.getGroupFunctionType() === GroupFunctionType.EDIT\r\n ) {\r\n this.editGroup(this.childGroupsInfo);\r\n const selectedParentGroupIndex = this.dataSource.data.findIndex(\r\n (node) => node.item.groupId === this.selectedGroup?.item.groupParentId\r\n );\r\n this.sortChildGroupsAlphabetically(\r\n selectedParentGroupIndex + 1,\r\n this.getNextGroup(selectedParentGroupIndex, this.dataSource.data)\r\n );\r\n } else if (\r\n this.groupsService.getGroupFunctionType() === GroupFunctionType.TOGGLE\r\n ) {\r\n this.treeControl?.toggle(this.selectedGroup);\r\n }\r\n }\r\n /**\r\n * Deletes the selected group and updates the tree view.\r\n * @param {string} deletedGroupId\r\n * @memberof TreeViewComponent\r\n */\r\n deleteGroupNode(deletedGroupId: string | undefined): void {\r\n if (this.treeControl && deletedGroupId) {\r\n const deletedGroupIndex = this.dataSource.data.findIndex(\r\n (node) => node.item.groupId === deletedGroupId\r\n );\r\n const deletedGroup = this.dataSource.data.at(deletedGroupIndex);\r\n const dataSourceReference = this.dataSource.data;\r\n if (deletedGroupIndex !== -1) {\r\n if (deletedGroup?.item.groupParentId !== null) {\r\n const deletedParentGroupIndex = this.dataSource.data.findIndex(\r\n (node) => node.item.groupId === deletedGroup?.item.groupParentId\r\n );\r\n if (deletedParentGroupIndex !== -1) {\r\n const deletedParentGroup = this.dataSource.data.at(\r\n deletedParentGroupIndex\r\n );\r\n if (deletedParentGroup && deletedParentGroup.item.noOfChildren) {\r\n deletedParentGroup.item.noOfChildren =\r\n deletedParentGroup.item.noOfChildren - 1;\r\n if (deletedParentGroup.item.noOfChildren === 0) {\r\n deletedParentGroup.item.hasChildren = false;\r\n const newNode = new GroupNode(\r\n deletedParentGroup.item,\r\n deletedParentGroup.level,\r\n false\r\n );\r\n dataSourceReference.splice(deletedGroupIndex - 1, 2, newNode);\r\n } else {\r\n dataSourceReference.splice(deletedGroupIndex, 1);\r\n }\r\n }\r\n } else {\r\n dataSourceReference.splice(deletedGroupIndex, 1);\r\n }\r\n } else {\r\n dataSourceReference.splice(deletedGroupIndex, 1);\r\n }\r\n }\r\n this.dataSource.data = dataSourceReference;\r\n this.deletedGroupId = undefined;\r\n }\r\n }\r\n /**\r\n * Returns the index of next group at the same level.\r\n * @param {number} selectedGroupIndex\r\n * @param {GroupNode[]} dataSource\r\n * @return {*} {number}\r\n * @memberof TreeViewComponent\r\n */\r\n getNextGroup(selectedGroupIndex: number, dataSource: GroupNode[]): number {\r\n const selectedGroupAcronym =\r\n dataSource[selectedGroupIndex].item.groupAcronym;\r\n let index = 0;\r\n for (index = selectedGroupIndex + 1; index < dataSource.length; index++) {\r\n if (dataSource[index].item.groupAcronym?.includes(selectedGroupAcronym)) {\r\n if (dataSource[selectedGroupIndex].level === 0) {\r\n if (\r\n dataSource[selectedGroupIndex].level === dataSource[index].level\r\n ) {\r\n break;\r\n }\r\n }\r\n } else break;\r\n }\r\n return index;\r\n }\r\n /**\r\n * Sort the groups alphabetically from given start index to end index.\r\n * @param {number} startIndex\r\n * @param {number} endIndex\r\n * @memberof TreeViewComponent\r\n */\r\n sortChildGroupsAlphabetically(startIndex: number, endIndex: number): void {\r\n const dataSource = this.dataSource.data;\r\n dataSource.splice(\r\n startIndex,\r\n endIndex - startIndex,\r\n ...this.groupsSorting(this.dataSource.data.slice(startIndex, endIndex))\r\n );\r\n this.dataSource.data = dataSource;\r\n }\r\n /**\r\n * Sort the root level parent groups alphabetically.\r\n * @memberof TreeViewComponent\r\n */\r\n sortParentGroupsAlphabetically(): void {\r\n let dataSource = this.dataSource.data;\r\n for (\r\n let groupA = 0;\r\n groupA < dataSource.length;\r\n groupA = this.getNextGroup(groupA, dataSource)\r\n ) {\r\n let lowestGroup = groupA;\r\n for (\r\n let groupB = this.getNextGroup(groupA, dataSource);\r\n groupB < dataSource.length;\r\n groupB = this.getNextGroup(groupB, dataSource)\r\n ) {\r\n lowestGroup =\r\n this.groupsSorting([\r\n dataSource[groupB],\r\n dataSource[lowestGroup],\r\n ])[0] === dataSource[groupB]\r\n ? groupB\r\n : lowestGroup;\r\n }\r\n if (lowestGroup !== groupA) {\r\n const leftGroup = dataSource.slice(\r\n groupA,\r\n this.getNextGroup(groupA, dataSource)\r\n );\r\n const rightGroup = dataSource.slice(\r\n lowestGroup,\r\n this.getNextGroup(lowestGroup, dataSource)\r\n );\r\n const dataSourceReference = dataSource.slice(0, groupA);\r\n dataSourceReference.push(...rightGroup);\r\n dataSourceReference.push(\r\n ...dataSource.slice(\r\n this.getNextGroup(groupA, dataSource),\r\n lowestGroup\r\n )\r\n );\r\n dataSourceReference.push(...leftGroup);\r\n dataSourceReference.push(\r\n ...dataSource.slice(\r\n this.getNextGroup(lowestGroup, dataSource),\r\n dataSource.length\r\n )\r\n );\r\n dataSource = dataSourceReference;\r\n }\r\n }\r\n this.dataSource.data = dataSource;\r\n }\r\n /**\r\n * Utility method to sort groups by group acronym in ascending order.\r\n * @param {GroupNode[]} groups\r\n * @return {*} {GroupNode[]}\r\n * @memberof TreeViewComponent\r\n */\r\n groupsSorting(groups: GroupNode[]): GroupNode[] {\r\n return groups.sort((groupA: GroupNode, groupB: GroupNode) => {\r\n const lowerGroupA = groupA.item.groupAcronym.toLowerCase();\r\n const lowerGroupB = groupB.item.groupAcronym.toLowerCase();\r\n if (lowerGroupA < lowerGroupB) return -1;\r\n else if (lowerGroupA > lowerGroupB) return 1;\r\n else if (lowerGroupA === lowerGroupB) {\r\n let index = 0;\r\n while (index < groupA?.item?.groupAcronym?.length) {\r\n if (groupA.item.groupAcronym[index] < groupB.item.groupAcronym[index])\r\n return 1;\r\n else if (\r\n groupA.item.groupAcronym[index] > groupB.item.groupAcronym[index]\r\n )\r\n return -1;\r\n index++;\r\n }\r\n }\r\n return 0;\r\n });\r\n }\r\n /**\r\n * Sets the selected menu group action\r\n * @param {Menu} menu\r\n * @memberof TreeViewComponent\r\n */\r\n onGroupActionsClick(menu: Menu | IconButton): void {\r\n this.selectedGroupAction = menu;\r\n }\r\n /**\r\n * Changes the expand/collapse icon based on the toggle\r\n * @param {GroupNode} group\r\n * @return {*} {*}\r\n * @memberof TreeViewComponent\r\n */\r\n getToggleButtonInfo(group: GroupNode): IconButton {\r\n if (this.treeControl?.isExpanded(group)) return this.minusCircleIconButton;\r\n return this.plusCircleIconButton;\r\n }\r\n /**\r\n * Handles the emitted group actions event. Emits the corresponding output\r\n * for the selected action: view roster, create sub group, edit group,\r\n * delete group, or manage interest form.\r\n * @param {GroupNode} group\r\n * @memberof TreeViewComponent\r\n */\r\n handleGroupActions(group: GroupNode): void {\r\n if (this.selectedGroupAction?.id === GroupAction.VIEW_ROSTER) {\r\n this.viewRosterClick.emit(group?.item);\r\n } else if (this.selectedGroupAction?.id === GroupAction.CREATE_SUB_GROUP) {\r\n this.selectedGroup = group;\r\n this.createGroupClick.emit(group?.item);\r\n } else if (this.selectedGroupAction?.id === GroupAction.EDIT_GROUP) {\r\n this.selectedGroup = group;\r\n const editGroupParentInfo = this.dataSource?.data?.filter(\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n (item: any) => item?.item?.groupId === group?.item?.groupParentId\r\n )[0]?.item;\r\n this.editGroupAndParentGroupInfo = {\r\n groupInfo: group?.item,\r\n parentGroupInfo: editGroupParentInfo,\r\n };\r\n this.editGroupClick.emit(this.editGroupAndParentGroupInfo);\r\n } else if (this.selectedGroupAction?.id === GroupAction.DELETE_GROUP) {\r\n this.deleteGroupClick.emit(group?.item);\r\n } else if (\r\n this.selectedGroupAction?.id === GroupAction.MANAGE_INTEREST_FORM\r\n ) {\r\n this.selectedGroup = group;\r\n this.manageInterestFormClick.emit(group?.item);\r\n }\r\n }\r\n /**\r\n * Returns the filtered menu items based on groups hasChildren.\r\n * @param {GroupNode} group\r\n * @return {Menu[]}\r\n * @memberof TreeViewComponent\r\n */\r\n getFilteredGroupActions(group: GroupNode): Menu[] {\r\n const filteredMenu: Menu[] = [];\r\n const isAdminGroupType = group?.item?.groupTypeInfo?.businessRule?.isAdmin;\r\n const groupPermissions = group?.item?.permissions;\r\n this.menuItems?.forEach((e) => {\r\n e.isToolTipNeeded = false;\r\n if (\r\n (e?.id === GroupAction.VIEW_ROSTER &&\r\n ((isAdminGroupType &&\r\n this.groupsService.validateAccess(\r\n this.permissionType.MANAGE_SYSTEM_USERS,\r\n groupPermissions\r\n )) ||\r\n (!isAdminGroupType &&\r\n (this.groupsService.validateAccess(\r\n this.permissionType.VIEW_GROUP_OFFICERS,\r\n groupPermissions\r\n ) ||\r\n this.groupsService.validateAccess(\r\n this.permissionType.MANAGE_GROUP_OFFICERS,\r\n groupPermissions\r\n ) ||\r\n this.groupsService.validateAccess(\r\n this.permissionType.VIEW_GROUP_MEMBERS,\r\n groupPermissions\r\n ) ||\r\n this.groupsService.validateAccess(\r\n this.permissionType.VIEW_ALL_ROSTERS\r\n ) ||\r\n this.groupsService.validateAccess(\r\n this.permissionType.MANAGE_GROUP_MEMBERS,\r\n groupPermissions\r\n ))))) ||\r\n (e?.id === GroupAction.EDIT_GROUP &&\r\n !isAdminGroupType &&\r\n (this.groupsService.validateAccess(\r\n this.permissionType.EDIT_GROUP,\r\n groupPermissions\r\n ) ||\r\n this.groupsService.validateAccess(\r\n this.permissionType.MANAGE_ALL_GROUPS\r\n ))) ||\r\n (e?.id === GroupAction.DELETE_GROUP &&\r\n !isAdminGroupType &&\r\n (this.groupsService.validateAccess(\r\n this.permissionType.DELETE_GROUP,\r\n groupPermissions\r\n ) ||\r\n this.groupsService.validateAccess(\r\n this.permissionType.MANAGE_ALL_GROUPS\r\n )) &&\r\n !group?.item?.hasChildren) ||\r\n (e?.id === GroupAction.CREATE_SUB_GROUP &&\r\n group?.item?.groupTypeInfo?.businessRule?.allowSubGroup &&\r\n (this.groupsService.validateAccess(\r\n this.permissionType.CREATE_SUBGROUP,\r\n groupPermissions\r\n ) ||\r\n this.groupsService.validateAccess(\r\n this.permissionType.MANAGE_ALL_GROUPS\r\n )) &&\r\n !isAdminGroupType) ||\r\n // TODO: Gate with MANAGE_CUSTOM_INTEREST_QUESTIONS permission (SP3M-380)\r\n // once permissions are implemented. Shown unconditionally for now to\r\n // support UI development.\r\n e?.id === GroupAction.MANAGE_INTEREST_FORM\r\n ) {\r\n filteredMenu.push(e);\r\n }\r\n });\r\n // Show the Manage Interest Form action first (leftmost) per the design.\r\n filteredMenu.sort((menuA, menuB) => {\r\n if (menuA?.id === GroupAction.MANAGE_INTEREST_FORM) return -1;\r\n if (menuB?.id === GroupAction.MANAGE_INTEREST_FORM) return 1;\r\n return 0;\r\n });\r\n return filteredMenu;\r\n }\r\n /**\r\n * Takes the index and the icon button as arguments and needs to return the unique identifier for this icon button.\r\n * @param {number} index\r\n * @param {IconButton} iconButton\r\n * @return {number}\r\n * @memberof TreeViewComponent\r\n */\r\n trackByFn(index: number, iconButton: IconButton): number {\r\n return iconButton.id;\r\n }\r\n /**\r\n * NgOnDestroy performs necessary cleanup tasks, such as unsubscribing from subscription when the component is being destroyed.\r\n * @memberof GroupsComponent\r\n */\r\n ngOnDestroy(): void {\r\n this.destroy$.next(true);\r\n this.destroy$.unsubscribe();\r\n }\r\n}\r\n","<div class=\"ieeesa-tree\">\r\n <mat-tree\r\n [dataSource]=\"dataSource\"\r\n [treeControl]=\"treeControl\"\r\n class=\"ieeesa-tree__root\"\r\n #rootSelector\r\n role=\"treegrid\"\r\n >\r\n <mat-tree-node\r\n *matTreeNodeDef=\"let node\"\r\n matTreeNodePadding\r\n [matTreeNodePaddingIndent]=\"treePaddingIndent\"\r\n class=\"ieeesa-body-md-16\"\r\n >\r\n <div\r\n class=\"ieeesa-tree__node w-100 d-flex\"\r\n [ngStyle]=\"getBoxShadow()\"\r\n [ngClass]=\"\r\n node?.item?.groupParentId &&\r\n groupsService.getGroupFunctionType() !== groupFunctionType.FILTER &&\r\n groupsService.getGroupFunctionType() !== groupFunctionType.SEARCH\r\n ? 'ieeesa-tree__root-node-white-bg'\r\n : 'ieeesa-tree__root-node'\r\n \"\r\n >\r\n <div\r\n [ngClass]=\"\r\n !isGroupSearchOrFilterActive ? 'ieeesa-tree__collapse-icon' : ''\r\n \"\r\n role=\"gridcell\"\r\n ></div>\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n ieeesaGroupNodeOutlet;\r\n context: { $implicit: node }\r\n \"\r\n ></ng-container>\r\n </div>\r\n </mat-tree-node>\r\n <mat-tree-node\r\n *matTreeNodeDef=\"let node; when: hasChildGroups\"\r\n matTreeNodePadding\r\n [matTreeNodePaddingIndent]=\"treePaddingIndent\"\r\n class=\"ieeesa-body-md-16 ieeesa-tree__parent-node-wrapper\"\r\n >\r\n <div\r\n [ngClass]=\"[\r\n treeControl.isExpanded(node) ? 'ieeesa-tree__expanded' : '',\r\n node?.item?.groupParentId &&\r\n groupsService.getGroupFunctionType() !== groupFunctionType.FILTER &&\r\n groupsService.getGroupFunctionType() !== groupFunctionType.SEARCH\r\n ? 'ieeesa-tree__root-node-white-bg'\r\n : 'ieeesa-tree__root-node'\r\n ]\"\r\n class=\"ieeesa-tree__node w-100 d-flex\"\r\n [ngStyle]=\"getBoxShadow()\"\r\n >\r\n <div role=\"gridcell\">\r\n <ieeesa-icon-button\r\n *ngIf=\"!isGroupSearchOrFilterActive\"\r\n (iconButtonClick)=\"viewChildGroups(node)\"\r\n [iconButton]=\"getToggleButtonInfo(node)\"\r\n ></ieeesa-icon-button>\r\n </div>\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n ieeesaGroupNodeOutlet;\r\n context: { $implicit: node }\r\n \"\r\n ></ng-container>\r\n </div>\r\n </mat-tree-node>\r\n <ng-template #ieeesaGroupNodeOutlet let-node>\r\n <ng-container\r\n *ngTemplateOutlet=\"ieeesaGroupInfoOutlet; context: { $implicit: node }\"\r\n ></ng-container>\r\n <div\r\n class=\"d-flex d-none gap-3 d-sm-flex d-md-flex d-lg-flex ieeesa-tree__group-actions\"\r\n role=\"gridcell\"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n ieeesaGroupActionsOutlet;\r\n context: { $implicit: node }\r\n \"\r\n >\r\n </ng-container>\r\n </div>\r\n <ieeesa-menu\r\n [button]=\"constants?.viewGroups?.groupActionsMenu\"\r\n [menuItems]=\"getFilteredGroupActions(node)\"\r\n (menuItemClick)=\"onGroupActionsClick($event); handleGroupActions(node)\"\r\n class=\"d-lg-none d-md-none d-sm-none\"\r\n role=\"gridcell\"\r\n ></ieeesa-menu>\r\n </ng-template>\r\n <ng-template #ieeesaGroupInfoOutlet let-node>\r\n <div class=\"ieeesa-tree__group-info-wrapper\">\r\n <div class=\"ieeesa-tree__group-info d-flex align-items-baseline\">\r\n <p\r\n class=\"ieeesa-tree__node-group-name ieeesa-title-md-18\"\r\n [matTooltip]=\"node?.item?.groupName\"\r\n ieeesaTextTruncated\r\n role=\"gridcell\"\r\n >{{ node?.item?.groupName }}</p>\r\n <p\r\n class=\"ieeesa-tree__node-group-acronym ieeesa-title-sm-16\"\r\n [matTooltip]=\"node?.item?.groupAcronym\"\r\n ieeesaTextTruncated\r\n role=\"gridcell\"\r\n >{{ node?.item?.groupAcronym }}</p>\r\n </div>\r\n <div class=\"ieeesa-tree__node-group-desc\">\r\n {{ node?.item?.groupTypeInfo?.name }}\r\n </div>\r\n </div>\r\n </ng-template>\r\n <ng-template #ieeesaGroupActionsOutlet let-node>\r\n <ieeesa-icon-button\r\n *ngFor=\"let item of getFilteredGroupActions(node); trackBy: trackByFn\"\r\n [iconButton]=\"item\"\r\n (iconButtonClick)=\"\r\n onGroupActionsClick($event); handleGroupActions(node)\r\n \"\r\n >\r\n </ieeesa-icon-button>\r\n </ng-template>\r\n </mat-tree>\r\n</div>\r\n","import {\r\n COMMA,\r\n DOWN_ARROW,\r\n ENTER,\r\n ESCAPE,\r\n UP_ARROW,\r\n} from '@angular/cdk/keycodes';\r\nimport { CommonModule } from '@angular/common';\r\nimport {\r\n Component,\r\n ElementRef,\r\n EventEmitter,\r\n Input,\r\n OnDestroy,\r\n OnInit,\r\n Output,\r\n ViewChild,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { Subject, Subscription, timer } from 'rxjs';\r\nimport { SelectOption } from '@ieeesa-npm/presentation';\r\nimport * as screenTexts from '../../assets/constants.json';\r\nimport { GroupsValidationPatterns } from '../../assets/form-validations';\r\n\r\n/**\r\n * A self-contained multi-select organization field used inside the Add/Edit\r\n * roster popups.\r\n *\r\n * It intentionally does NOT reuse the shared MultiSelectAutocompleteComponent\r\n * (which is built on mat-autocomplete). Material's autocomplete closes its panel\r\n * and overwrites the input on every option pick, which made multi-selection\r\n * feel single-select and cleared the user's typed text. This component uses a\r\n * fully-owned custom dropdown (<div> + checkboxes) so:\r\n * - the panel stays open while the user ticks several results,\r\n * - the typed search text is never overwritten by a pick,\r\n * - pressing Enter adds the typed value as a free-text chip,\r\n * - clicking outside clears any leftover typed text (old behavior),\r\n * - selected values render as removable chips (old behavior).\r\n *\r\n * The parent supplies search results via {@link options} and reacts to\r\n * {@link search} (debounced typed term) and {@link selectionChange}.\r\n * @export\r\n * @class OrgMultiSelectComponent\r\n */\r\n@Component({\r\n selector: 'ieeesa-org-multi-select',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n MatButtonModule,\r\n MatCheckboxModule,\r\n MatIconModule,\r\n MatTooltipModule,\r\n ],\r\n templateUrl: './org-multi-select.component.html',\r\n styleUrls: ['./org-multi-select.component.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class OrgMultiSelectComponent implements OnInit, OnDestroy {\r\n /** Field label (e.g. \"Representing Organization *\"). */\r\n @Input() label = '';\r\n\r\n /** Placeholder for the input. */\r\n @Input() placeholder = '';\r\n\r\n /** Support/help text shown below the field. */\r\n @Input() supportMessage = '';\r\n\r\n /** aria-label for the input. */\r\n @Input() ariaLabel = '';\r\n\r\n /** Search results supplied by the parent (repopulated on each search). */\r\n @Input() set options(value: SelectOption[]) {\r\n this._options = value ?? [];\r\n // Reset keyboard highlight whenever the result set changes.\r\n this.activeOptionIndex = -1;\r\n // Open the dropdown as soon as fresh results arrive while the user is still\r\n // typing/searching (has non-empty text). Closes when results are emptied.\r\n this.isDropdownOpen =\r\n this._options.length > 0 && this.searchText.trim().length > 0;\r\n }\r\n get options(): SelectOption[] {\r\n return this._options;\r\n }\r\n private _options: SelectOption[] = [];\r\n\r\n /** Pre-selected options (edit prefill). Rendered as chips. */\r\n @Input() set selectedOptions(value: SelectOption[]) {\r\n this._selectedOptions = value ?? [];\r\n }\r\n get selectedOptions(): SelectOption[] {\r\n return this._selectedOptions;\r\n }\r\n private _selectedOptions: SelectOption[] = [];\r\n\r\n /** Marks the field required (drives the required message + error border). */\r\n @Input() required = true;\r\n\r\n /**\r\n * Icon URLs (same sprite refs the shared multi-select field used). Defaulted\r\n * so the popups don't need to pass them; overridable via input if needed.\r\n */\r\n @Input() removeIconURL = 'assets/images/sprites/sprites.svg#icon-trailing';\r\n @Input() clearAllIconURL =\r\n 'assets/images/sprites/sprites.svg#icon-clear-all';\r\n\r\n /** Emits the trimmed typed term (debounced) so the parent can call the API. */\r\n @Output() search = new EventEmitter<string>();\r\n\r\n /** Emits the current selection array whenever it changes. */\r\n @Output() selectionChange = new EventEmitter<SelectOption[]>();\r\n\r\n /** Emitted when the field is blurred (parent can re-evaluate validation). */\r\n @Output() fieldBlur = new EventEmitter<void>();\r\n\r\n /**\r\n * Emits true when the input holds an uncommitted free-text token that fails\r\n * validation (too short / too long / invalid pattern), and false when the\r\n * input is empty or the token is valid. The parent uses this to keep the Save\r\n * button disabled while an invalid token remains — otherwise a previously\r\n * added valid chip would keep the parent control valid and let the form submit\r\n * with an invalid token still in the input.\r\n */\r\n @Output() invalidFreeText = new EventEmitter<boolean>();\r\n\r\n /** Tracks the last emitted invalid-token state to avoid duplicate emits. */\r\n private hasInvalidFreeText = false;\r\n\r\n @ViewChild('searchInput') searchInput!: ElementRef<HTMLInputElement>;\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n constants: any = screenTexts;\r\n addUserRosterTexts = this.constants?.addUserRoster;\r\n\r\n /** Whether the results dropdown is open. */\r\n isDropdownOpen = false;\r\n\r\n /** The current typed search text. */\r\n searchText = '';\r\n\r\n /** Inline validation message for the free-text (Enter) path. */\r\n errorMessage = '';\r\n\r\n /** Whether the field has been touched (to show required error after blur). */\r\n isTouched = false;\r\n\r\n /**\r\n * Index of the keyboard-highlighted result row (-1 = none). Enables arrow-key\r\n * navigation and Enter-to-toggle for keyboard users, mirroring the mat-option\r\n * behavior this custom dropdown replaces.\r\n */\r\n activeOptionIndex = -1;\r\n\r\n /** Stable id prefix for option rows (used for aria-activedescendant). */\r\n readonly optionIdPrefix = 'ieeesa-org-option-';\r\n\r\n private destroy$ = new Subject<boolean>();\r\n private searchDebounce?: Subscription;\r\n private blurTimer?: Subscription;\r\n private readonly debounceMs = 300;\r\n private readonly minCharToSearch = 3;\r\n\r\n private separatorKeys = [ENTER, COMMA];\r\n\r\n ngOnInit(): void {\r\n // Fallback labels from the shared constants if inputs are not provided.\r\n this.placeholder = this.placeholder ?? '';\r\n }\r\n\r\n /**\r\n * Handles typing in the search input: tracks the text, opens/closes the\r\n * dropdown and debounces the search emit to the parent.\r\n * @param {Event} event -input event.\r\n * @memberof OrgMultiSelectComponent\r\n */\r\n onInput(event: Event): void {\r\n const value = (event.target as HTMLInputElement).value;\r\n this.searchText = value;\r\n this.errorMessage = '';\r\n // Any non-empty, uncommitted text is a pending token — flag the field\r\n // invalid so the parent disables Save until it is committed (Enter) or\r\n // cleared. Cleared text resets the flag.\r\n this.emitInvalidState(!!value.trim());\r\n const trimmed = value.trim();\r\n this.searchDebounce?.unsubscribe();\r\n if (trimmed.length < this.minCharToSearch) {\r\n this.options = [];\r\n this.isDropdownOpen = false;\r\n return;\r\n }\r\n this.searchDebounce = timer(this.debounceMs).subscribe(() => {\r\n this.search.emit(trimmed);\r\n });\r\n }\r\n\r\n /**\r\n * Emits the invalid-free-text state to the parent (deduped). True means an\r\n * uncommitted token is present and Save should stay disabled.\r\n * @param {boolean} isInvalid -whether an uncommitted token is present.\r\n * @memberof OrgMultiSelectComponent\r\n */\r\n private emitInvalidState(isInvalid: boolean): void {\r\n if (this.hasInvalidFreeText !== isInvalid) {\r\n this.hasInvalidFreeText = isInvalid;\r\n this.invalidFreeText.emit(isInvalid);\r\n }\r\n }\r\n\r\n /**\r\n * Opens the dropdown on focus only when there are results AND the input still\r\n * holds a valid search term (at or above minCharToSearch). This prevents\r\n * re-opening stale results — e.g. a late API response that populated options\r\n * after the input was cleared — when the user simply refocuses the field.\r\n * @memberof OrgMultiSelectComponent\r\n */\r\n onFocus(): void {\r\n if (\r\n this.options?.length &&\r\n this.searchText.trim().length >= this.minCharToSearch\r\n ) {\r\n this.isDropdownOpen = true;\r\n }\r\n }\r\n\r\n /**\r\n * Called by the parent (via a setter re-assign) or internally after new\r\n * options arrive so the dropdown opens to show them.\r\n * @memberof OrgMultiSelectComponent\r\n */\r\n showResults(): void {\r\n this.isDropdownOpen = !!this.options?.length;\r\n }\r\n\r\n /**\r\n * Handles keydown for the Enter/comma \"add typed value\" path.\r\n * @param {KeyboardEvent} event -keyboard event.\r\n * @memberof OrgMultiSelectComponent\r\n */\r\n onKeydown(event: KeyboardEvent): void {\r\n // Arrow keys move the highlight through the open results list (opening it\r\n // first if there are results). This makes the custom dropdown operable by\r\n // keyboard, matching the mat-option list it replaces.\r\n if (event.keyCode === DOWN_ARROW || event.keyCode === UP_ARROW) {\r\n if (!this.options?.length) {\r\n return;\r\n }\r\n event.preventDefault();\r\n this.isDropdownOpen = true;\r\n this.moveActiveOption(event.keyCode === DOWN_ARROW ? 1 : -1);\r\n return;\r\n }\r\n\r\n // Escape closes the results without committing anything.\r\n if (event.keyCode === ESCAPE) {\r\n if (this.isDropdownOpen) {\r\n event.preventDefault();\r\n this.isDropdownOpen = false;\r\n this.activeOptionIndex = -1;\r\n }\r\n return;\r\n }\r\n\r\n if (!this.separatorKeys.includes(event.keyCode)) {\r\n return;\r\n }\r\n event.preventDefault();\r\n // Enter/comma: if a result row is highlighted, toggle that option (keyboard\r\n // parity with clicking it). Otherwise fall back to adding the typed text as\r\n // a free-text chip.\r\n if (\r\n this.isDropdownOpen &&\r\n this.activeOptionIndex >= 0 &&\r\n this.activeOptionIndex < this.options.length\r\n ) {\r\n this.toggleOption(this.options[this.activeOptionIndex]);\r\n return;\r\n }\r\n this.addTypedValue();\r\n }\r\n\r\n /**\r\n * Moves the keyboard highlight up/down the results list, wrapping at the ends.\r\n * @param {number} delta -+1 to move down, -1 to move up.\r\n * @memberof OrgMultiSelectComponent\r\n */\r\n private moveActiveOption(delta: number): void {\r\n const count = this.options.length;\r\n if (!count) {\r\n return;\r\n }\r\n const next = this.activeOptionIndex + delta;\r\n // Wrap around so the highlight cycles through the list.\r\n this.activeOptionIndex = (next + count) % count;\r\n }\r\n\r\n /**\r\n * Whether the given result index is the keyboard-highlighted row.\r\n * @param {number} index -the option's index.\r\n * @return {boolean}\r\n * @memberof OrgMultiSelectComponent\r\n */\r\n isActiveOption(index: number): boolean {\r\n return index === this.activeOptionIndex;\r\n }\r\n\r\n /**\r\n * Adds the typed free-text value as a selection (chip) after validating its\r\n * length and pattern (parity with the previous chip-input behavior).\r\n * @memberof OrgMultiSelectComponent\r\n */\r\n addTypedValue(): void {\r\n const value = this.searchText.trim();\r\n if (!value) {\r\n return;\r\n }\r\n const validationError = this.validateFreeText(value);\r\n if (validationError) {\r\n this.errorMessage = validationError;\r\n // Keep the field flagged invalid so the parent's Save button stays\r\n // disabled even when a valid chip already exists — the uncommitted token\r\n // is invalid and must be corrected or cleared before submitting.\r\n this.emitInvalidState(true);\r\n return;\r\n }\r\n // Avoid duplicates (case-insensitive by name).\r\n const exists = this._selectedOptions.some(\r\n (option) => option.name?.toLowerCase() === value.toLowerCase()\r\n );\r\n if (!exists) {\r\n this._selectedOptions = [\r\n ...this._selectedOptions,\r\n { id: '', name: value },\r\n ];\r\n this.emitSelection();\r\n }\r\n // Token committed successfully — input is cleared, so the field is valid.\r\n this.clearSearchText();\r\n }\r\n\r\n /**\r\n * Validates a free-text organization value against the shared min/max/pattern\r\n * rules. Returns an error message when invalid, otherwise an empty string.\r\n * @param {string} value -the typed value.\r\n * @return {string}\r\n * @memberof OrgMultiSelectComponent\r\n */\r\n validateFreeText(value: string): string {\r\n const messages = this.addUserRosterTexts?.message?.error;\r\n if (value.length < GroupsValidationPatterns.representingOrgNameMinLength) {\r\n return messages?.limit?.representingOrganizationMinChars ?? '';\r\n }\r\n if (value.length > GroupsValidationPatterns.representingOrgNameMaxLength) {\r\n return messages?.limit?.representingOrganizationMaxChars ?? '';\r\n }\r\n if (!GroupsValidationPatterns.representingOrganization.test(value)) {\r\n return messages?.pattern?.representingOrganization ?? '';\r\n }\r\n return '';\r\n }\r\n\r\n /**\r\n * Toggles selection of a result option. Keeps the dropdown open and the typed\r\n * text intact so the user can keep selecting.\r\n * @param {SelectOption} option -the clicked result option.\r\n * @memberof OrgMultiSelectComponent\r\n */\r\n toggleOption(option: SelectOption): void {\r\n const index = this._selectedOptions.findIndex(\r\n (item) => item.id === option.id && item.name === option.name\r\n );\r\n if (index >= 0) {\r\n this._selectedOptions = this._selectedOptions.filter(\r\n (_, i) => i !== index\r\n );\r\n } else {\r\n this._selectedOptions = [...this._selectedOptions, option];\r\n }\r\n this.emitSelection();\r\n // Keep focus in the input so the user can continue typing/selecting.\r\n this.searchInput?.nativeElement?.focus();\r\n }\r\n\r\n /**\r\n * Whether an option is currently selected (drives the checkbox checked state).\r\n * @param {SelectOption} option -option to test.\r\n * @return {boolean}\r\n * @memberof OrgMultiSelectComponent\r\n */\r\n isSelected(option: SelectOption): boolean {\r\n return this._selectedOptions.some(\r\n (item) => item.id === option.id && item.name === option.name\r\n );\r\n }\r\n\r\n /**\r\n * Removes a selected chip.\r\n * @param {SelectOption} option -the option to remove.\r\n * @memberof OrgMultiSelectComponent\r\n */\r\n removeOption(option: SelectOption): void {\r\n this._selectedOptions = this._selectedOptions.filter(\r\n (item) => !(item.id === option.id && item.name === option.name)\r\n );\r\n this.emitSelection();\r\n }\r\n\r\n /**\r\n * Clears all selected chips.\r\n * @memberof OrgMultiSelectComponent\r\n */\r\n clearAll(): void {\r\n this._selectedOptions = [];\r\n this.options = [];\r\n this.isDropdownOpen = false;\r\n this.emitSelection();\r\n }\r\n\r\n /**\r\n * Clears the leftover typed text on blur (old behavior) and closes the\r\n * dropdown. Deferred so a click on a dropdown option (which also blurs the\r\n * input) is handled first.\r\n * @memberof OrgMultiSelectComponent\r\n */\r\n onBlur(): void {\r\n this.isTouched = true;\r\n this.blurTimer?.unsubscribe();\r\n this.blurTimer = timer(150).subscribe(() => {\r\n // If focus moved into the dropdown (option click), the click handler\r\n // re-focuses the input, so document.activeElement is the input again.\r\n const active = document.activeElement;\r\n if (active === this.searchInput?.nativeElement) {\r\n return;\r\n }\r\n this.clearSearchText();\r\n this.isDropdownOpen = false;\r\n this.fieldBlur.emit();\r\n });\r\n }\r\n\r\n /**\r\n * Whether the required error should show (touched, no selection).\r\n * @return {boolean}\r\n * @memberof OrgMultiSelectComponent\r\n */\r\n get showRequiredError(): boolean {\r\n return (\r\n this.required && this.isTouched && this._selectedOptions.length === 0\r\n );\r\n }\r\n\r\n /**\r\n * Clears the typed search text and hides the results.\r\n * @memberof OrgMultiSelectComponent\r\n */\r\n private clearSearchText(): void {\r\n // Cancel any pending debounced search so a blur/clear before the timer\r\n // expires does not emit the now-cleared query to the parent.\r\n this.searchDebounce?.unsubscribe();\r\n this.searchDebounce = undefined;\r\n this.searchText = '';\r\n if (this.searchInput?.nativeElement) {\r\n this.searchInput.nativeElement.value = '';\r\n }\r\n this.options = [];\r\n this.errorMessage = '';\r\n // No leftover text — the field is no longer holding an invalid token.\r\n this.emitInvalidState(false);\r\n }\r\n\r\n /**\r\n * Emits the current selection to the parent.\r\n * @memberof OrgMultiSelectComponent\r\n */\r\n private emitSelection(): void {\r\n this.selectionChange.emit(\r\n this._selectedOptions.map((option) => ({\r\n id: option.id,\r\n name: option.name,\r\n }))\r\n );\r\n }\r\n\r\n /**\r\n * TrackBy for both result and chip lists.\r\n * @param {number} index -list index.\r\n * @param {SelectOption} option -the option.\r\n * @return {(string | number)}\r\n * @memberof OrgMultiSelectComponent\r\n */\r\n trackByFn(index: number, option: SelectOption): string | number {\r\n return `${option.id}-${option.name}`;\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.searchDebounce?.unsubscribe();\r\n this.blurTimer?.unsubscribe();\r\n this.destroy$.next(true);\r\n this.destroy$.complete();\r\n }\r\n}\r\n","<div\r\n class=\"ieeesa-org-multi-select\"\r\n [class.ieeesa-org-multi-select--invalid]=\"showRequiredError || errorMessage\"\r\n>\r\n <label class=\"ieeesa-org-multi-select__label ieeesa-body-sm-14\">\r\n {{ label }}\r\n </label>\r\n\r\n <div class=\"ieeesa-org-multi-select__field\">\r\n <!--\r\n Chips and the search input flow together inline (like the Material\r\n chip-grid). This keeps a single-row field appearance that grows as chips\r\n wrap, with the clear-all button pinned to the right as a suffix.\r\n -->\r\n <div class=\"ieeesa-org-multi-select__control\">\r\n <span\r\n class=\"ieeesa-org-multi-select__chip\"\r\n *ngFor=\"let option of selectedOptions; trackBy: trackByFn\"\r\n [attr.aria-label]=\"option.name\"\r\n >\r\n <span class=\"ieeesa-org-multi-select__chip-label\">\r\n {{ option.name }}\r\n </span>\r\n <button\r\n type=\"button\"\r\n class=\"ieeesa-org-multi-select__chip-remove\"\r\n [attr.aria-label]=\"'Remove ' + option.name\"\r\n (click)=\"removeOption(option)\"\r\n >\r\n <svg\r\n class=\"ieeesa-org-multi-select__chip-remove-icon\"\r\n *ngIf=\"removeIconURL\"\r\n >\r\n <use [attr.xlink:href]=\"removeIconURL\"></use>\r\n </svg>\r\n <span *ngIf=\"!removeIconURL\" aria-hidden=\"true\">×</span>\r\n </button>\r\n </span>\r\n\r\n <input\r\n #searchInput\r\n type=\"text\"\r\n class=\"ieeesa-org-multi-select__input ieeesa-title-sm-16\"\r\n role=\"combobox\"\r\n aria-haspopup=\"listbox\"\r\n [attr.aria-expanded]=\"isDropdownOpen\"\r\n [attr.aria-controls]=\"optionIdPrefix + 'listbox'\"\r\n [attr.aria-activedescendant]=\"\r\n isDropdownOpen && activeOptionIndex >= 0\r\n ? optionIdPrefix + activeOptionIndex\r\n : null\r\n \"\r\n [attr.aria-label]=\"ariaLabel\"\r\n [placeholder]=\"placeholder\"\r\n [value]=\"searchText\"\r\n (input)=\"onInput($event)\"\r\n (focus)=\"onFocus()\"\r\n (keydown)=\"onKeydown($event)\"\r\n (blur)=\"onBlur()\"\r\n />\r\n </div>\r\n\r\n <button\r\n type=\"button\"\r\n class=\"ieeesa-org-multi-select__clear-all\"\r\n [matTooltip]=\"'Clear all'\"\r\n aria-label=\"Clear all\"\r\n *ngIf=\"selectedOptions.length\"\r\n (click)=\"clearAll()\"\r\n >\r\n <svg\r\n class=\"ieeesa-org-multi-select__clear-all-icon\"\r\n *ngIf=\"clearAllIconURL\"\r\n >\r\n <use [attr.xlink:href]=\"clearAllIconURL\"></use>\r\n </svg>\r\n <span *ngIf=\"!clearAllIconURL\" aria-hidden=\"true\">×</span>\r\n </button>\r\n\r\n <!--\r\n Custom results dropdown. Fully owned (not mat-autocomplete) so a pick never\r\n closes the panel or overwrites the typed text. mousedown is prevented so\r\n clicking a row does not blur the input before the click registers.\r\n -->\r\n <div\r\n class=\"ieeesa-org-multi-select__dropdown\"\r\n role=\"listbox\"\r\n [id]=\"optionIdPrefix + 'listbox'\"\r\n aria-multiselectable=\"true\"\r\n *ngIf=\"isDropdownOpen && options.length\"\r\n (mousedown)=\"$event.preventDefault()\"\r\n >\r\n <div\r\n class=\"ieeesa-org-multi-select__option\"\r\n role=\"option\"\r\n *ngFor=\"let option of options; let i = index; trackBy: trackByFn\"\r\n [id]=\"optionIdPrefix + i\"\r\n [attr.aria-selected]=\"isSelected(option)\"\r\n [class.ieeesa-org-multi-select__option--selected]=\"isSelected(option)\"\r\n [class.ieeesa-org-multi-select__option--active]=\"isActiveOption(i)\"\r\n (click)=\"toggleOption(option)\"\r\n (mouseenter)=\"activeOptionIndex = i\"\r\n >\r\n <mat-checkbox\r\n color=\"primary\"\r\n [checked]=\"isSelected(option)\"\r\n (click)=\"$event.preventDefault()\"\r\n ></mat-checkbox>\r\n <span\r\n class=\"ieeesa-org-multi-select__option-label ieeesa-title-sm-16\"\r\n >\r\n {{ option.name }}\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Inline free-text validation error (Enter path) -->\r\n <p\r\n class=\"ieeesa-org-multi-select__error ieeesa-body-sm-14\"\r\n *ngIf=\"errorMessage\"\r\n >\r\n {{ errorMessage }}\r\n </p>\r\n\r\n <!-- Required error (touched, nothing selected) -->\r\n <p\r\n class=\"ieeesa-org-multi-select__error ieeesa-body-sm-14\"\r\n *ngIf=\"showRequiredError && !errorMessage\"\r\n >\r\n {{ addUserRosterTexts?.message?.error?.required }}\r\n </p>\r\n\r\n <!-- Support/help text -->\r\n <p\r\n class=\"ieeesa-org-multi-select__support ieeesa-body-sm-14\"\r\n *ngIf=\"supportMessage && !errorMessage && !showRequiredError\"\r\n >\r\n {{ supportMessage }}\r\n </p>\r\n</div>\r\n","import {\r\n Component,\r\n EventEmitter,\r\n OnDestroy,\r\n OnInit,\r\n Output,\r\n ViewChild,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { GroupsService } from '../../services/groups.service';\r\nimport {\r\n AlignType,\r\n AutoCompleteOption,\r\n CheckboxOption,\r\n FieldConfig,\r\n FormControlType,\r\n FormGrid,\r\n FormModel,\r\n SelectOption,\r\n DynamicFormComponent,\r\n} from '@ieeesa-npm/presentation';\r\nimport * as screenTexts from '../../assets/constants.json';\r\nimport { FormArray, FormControl, FormGroup, Validators } from '@angular/forms';\r\nimport { GroupUserInfo } from '../../models/group-user-info.model';\r\nimport { Subject, takeUntil } from 'rxjs';\r\nimport { FormStatus, AlertType } from '@ieeesa-npm/models';\r\nimport { HttpErrorResponse } from '@angular/common/http';\r\nimport {\r\n AlertsService,\r\n GlobalErrorHandlerService,\r\n} from '@ieeesa-npm/utility';\r\nimport {\r\n AddOrEditUserIndividualRosterPayload,\r\n AddOrEditUserPayload,\r\n RepresentingOrganization,\r\n} from '../../models/add-or-edit-user-group.model';\r\nimport { GroupTypeConfiguration } from '../../models/group-types.model';\r\nimport { GroupRosterType } from '../../models/roster-type.model';\r\nimport {\r\n GroupsValidationPatterns,\r\n representingOrgRequiredValidator,\r\n skipWhenArray,\r\n} from '../../assets/form-validations';\r\nimport {\r\n Organization,\r\n OrganizationRequestPayload,\r\n} from '../../models/organization.model';\r\nimport { OrgMultiSelectComponent } from '../org-multi-select/org-multi-select.component';\r\n\r\n/**\r\n * Component implements the view and functionalities to edit group users to roster.\r\n * @class EditUserRolesComponent\r\n * @implements {OnInit}\r\n * @implements {OnDestroy}\r\n */\r\n@Component({\r\n selector: 'ieeesa-edit-user-roles',\r\n standalone: true,\r\n imports: [CommonModule, DynamicFormComponent, OrgMultiSelectComponent],\r\n templateUrl: './edit-user-roles.component.html',\r\n styleUrls: ['./edit-user-roles.component.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class EditUserRolesComponent implements OnInit, OnDestroy {\r\n destroy$ = new Subject<boolean>();\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n constants: any = screenTexts;\r\n addUserRosterTexts = this.constants?.addUserRoster;\r\n leftButtonLabel = this.addUserRosterTexts?.label?.leftButtonLabel;\r\n rightButtonLabel = this.addUserRosterTexts?.label?.saveButtonLabel;\r\n isSubmitButtonDisabled = false;\r\n colWidth: FormGrid = { xs: 12, xl: 12, sm: 12, md: 12, lg: 12 };\r\n editUserRoleFormGroup!: FormModel;\r\n editUserRoleFormGroupRef!: FormGroup;\r\n userRoles!: CheckboxOption[];\r\n selectedUserRoleIds: string[] = [];\r\n selectedUserInfo!: GroupUserInfo;\r\n actionButtonAlign = AlignType.LEFT;\r\n classifications: SelectOption[] = [];\r\n memberTypes: SelectOption[] = [];\r\n organizations: SelectOption[] = [];\r\n groupTypes!: GroupTypeConfiguration[];\r\n hasClassification = false;\r\n groupRosterType!: GroupRosterType;\r\n representingOrganizations: SelectOption[] = [];\r\n orgSearchValue = '';\r\n\r\n /**\r\n * True when the selected group's roster type is INDIVIDUAL (the only roster\r\n * type that shows the Representing Organization field).\r\n * @readonly\r\n * @memberof EditUserRolesComponent\r\n */\r\n get isIndividualRoster(): boolean {\r\n return this.groupRosterType === GroupRosterType.INDIVIDUAL;\r\n }\r\n\r\n /**\r\n * True when the org field holds an uncommitted, invalid free-text token. Used\r\n * to keep Save disabled even when a valid chip already exists.\r\n */\r\n hasInvalidOrgFreeText = false;\r\n @ViewChild(DynamicFormComponent) dynamicFormComponent!: DynamicFormComponent;\r\n @Output() submitFormResponse = new EventEmitter();\r\n @Output() formCancel = new EventEmitter();\r\n constructor(\r\n // eslint-disable-next-line no-unused-vars\r\n private groupsService: GroupsService,\r\n // eslint-disable-next-line no-unused-vars\r\n public globalErrorHandlerService: GlobalErrorHandlerService,\r\n // eslint-disable-next-line no-unused-vars\r\n public alertService: AlertsService // eslint-disable-next-line no-empty-function\r\n ) {}\r\n\r\n /**\r\n * Initialize the edit user role required information and form group array.\r\n * @return -returns nothing\r\n * @memberof EditUserRolesComponent\r\n */\r\n ngOnInit(): void {\r\n this.selectedUserInfo = this.groupsService?.getSelectedUserInfo();\r\n this.groupsService.representingOrganizations.forEach(\r\n (user: RepresentingOrganization) => {\r\n if (\r\n this.selectedUserInfo.userId === user.userId &&\r\n user.organizations?.length\r\n ) {\r\n user.organizations.forEach((option: Organization) => {\r\n this.representingOrganizations?.push({\r\n id: option.orgId,\r\n name: option.orgName,\r\n });\r\n });\r\n }\r\n }\r\n );\r\n // eslint-disable-next-line no-unused-expressions\r\n this.representingOrganizations?.length\r\n ? (this.isSubmitButtonDisabled = false)\r\n : (this.isSubmitButtonDisabled = true);\r\n const selectedUserRoleNames = this.selectedUserInfo?.role\r\n ?.split(',')\r\n .map((role) => role?.trim());\r\n this.userRoles = this.groupsService?.getGroupTypeUserRoles();\r\n this.userRoles?.forEach((role) => {\r\n if (selectedUserRoleNames?.includes(role?.name as string)) {\r\n role.checked = true;\r\n this.selectedUserRoleIds?.push(role?.id as string);\r\n }\r\n });\r\n const groupType = this.groupsService.getBusinessRuleOfSelectedGroup();\r\n this.hasClassification = groupType?.hasClassification ?? false;\r\n this.groupRosterType = groupType?.rosterType as GroupRosterType;\r\n if (!this.groupRosterType)\r\n this.alertService.showMessage({\r\n status: 'custom',\r\n message: this.constants?.errors?.ER1001,\r\n alertType: AlertType.ERROR,\r\n isCloseNeeded: true,\r\n });\r\n else {\r\n if (this.groupRosterType === GroupRosterType?.INDIVIDUAL) {\r\n if (this.hasClassification) this.getClassifications();\r\n this.getMemberTypes();\r\n }\r\n this.editUserRolesFormGroup();\r\n }\r\n }\r\n\r\n /**\r\n * Initialize the edit user role form group array.\r\n * @memberof EditUserRolesComponent\r\n */\r\n editUserRolesFormGroup() {\r\n this.editUserRoleFormGroup = {\r\n formGroup: [\r\n {\r\n legend: '',\r\n controls: [\r\n {\r\n type: FormControlType?.TEXT_AREA,\r\n label: this.addUserRosterTexts?.label?.email + '*',\r\n controlName: 'email',\r\n value: this.selectedUserInfo?.email,\r\n ariaLabel: this.addUserRosterTexts?.label?.ariaLabel?.email,\r\n ariaDescribedById:\r\n this.addUserRosterTexts?.label?.ariaDescribedById?.email,\r\n isReadonly: true,\r\n ariaMultiline: false,\r\n isResize: true,\r\n },\r\n {\r\n type: FormControlType.TEXT_AREA,\r\n label: this.addUserRosterTexts?.label?.fullName + '*',\r\n controlName: 'fullName',\r\n value: this.selectedUserInfo?.name,\r\n ariaLabel: this.addUserRosterTexts?.label?.ariaLabel?.fullName,\r\n ariaDescribedById:\r\n this.addUserRosterTexts?.label?.ariaDescribedById?.fullName,\r\n isReadonly: true,\r\n ariaMultiline: false,\r\n isResize: true,\r\n },\r\n {\r\n type: FormControlType.CHECKBOX,\r\n label:\r\n this.groupRosterType === GroupRosterType.INDIVIDUAL\r\n ? this.addUserRosterTexts?.label?.role\r\n : this.addUserRosterTexts?.label?.role + '*',\r\n controlName: 'roles',\r\n checkboxOptions: this.userRoles,\r\n minSelectionRequired: 1,\r\n ariaLabel: this.addUserRosterTexts?.label?.ariaLabel?.role,\r\n ariaDescribedById:\r\n this.addUserRosterTexts?.label?.ariaDescribedById?.role,\r\n supportMessage:\r\n this.groupRosterType === GroupRosterType.INDIVIDUAL\r\n ? this.addUserRosterTexts?.supportText\r\n ?.roleForIndividualRoster\r\n : this.addUserRosterTexts?.supportText?.role,\r\n requiredErrorMessage:\r\n this.addUserRosterTexts?.message?.error?.required,\r\n validation:\r\n this.groupRosterType === GroupRosterType.INDIVIDUAL\r\n ? []\r\n : [Validators.required],\r\n },\r\n ],\r\n },\r\n ],\r\n };\r\n if (this.groupRosterType === GroupRosterType?.INDIVIDUAL) {\r\n this.updateEditUserRoleFormGroup();\r\n }\r\n }\r\n\r\n /**\r\n * Adds classification, Member Type and Representing Organization form controls while editing new user to an individual group roster.\r\n * @memberof AddUserRosterComponent\r\n */\r\n updateEditUserRoleFormGroup(): void {\r\n if (this.hasClassification)\r\n this.updateEditUserRoleFormControls(\r\n this.editUserRoleFormGroup?.formGroup[0]?.controls?.length - 1,\r\n {\r\n type: FormControlType.SELECT,\r\n label: this.addUserRosterTexts?.label?.classification + '*',\r\n controlName: 'classification',\r\n dropdownOptions: this.classifications,\r\n value: this.classifications?.filter(\r\n (option) => option?.name === this.selectedUserInfo?.classification\r\n )[0],\r\n validation: [Validators.required],\r\n placeholder: '',\r\n supportMessage: this.addUserRosterTexts?.supportText?.classification,\r\n requiredErrorMessage:\r\n this.addUserRosterTexts?.message?.error?.required,\r\n ariaLabel: this.addUserRosterTexts?.label?.ariaLabel?.classification,\r\n ariaDescribedById:\r\n this.addUserRosterTexts?.label?.ariaDescribedById?.classification,\r\n }\r\n );\r\n this.updateEditUserRoleFormControls(\r\n this.editUserRoleFormGroup?.formGroup[0]?.controls?.length - 1,\r\n {\r\n type: FormControlType.SELECT,\r\n label: this.addUserRosterTexts?.label?.memberType + '*',\r\n controlName: 'memberType',\r\n dropdownOptions: this.memberTypes,\r\n value: this.memberTypes?.filter(\r\n (option) => option?.name === this.selectedUserInfo?.memberStatus\r\n )[0],\r\n validation: [Validators.required],\r\n placeholder: '',\r\n supportMessage: this.addUserRosterTexts?.supportText?.memberType,\r\n requiredErrorMessage: this.addUserRosterTexts?.message?.error?.required,\r\n ariaLabel: this.addUserRosterTexts?.label?.ariaLabel?.memberType,\r\n ariaDescribedById:\r\n this.addUserRosterTexts?.label?.ariaDescribedById?.memberType,\r\n }\r\n );\r\n // The \"Representing Organization\" field is rendered by the custom\r\n // OrgMultiSelectComponent in the template (not by the dynamic form). The\r\n // reactive `representingOrg` control is registered on the captured form\r\n // group ref in registerRepresentingOrgControl() so all existing submit/\r\n // Save-button logic (which reads form.get('representingOrg')) keeps working.\r\n // Its value stays in sync via getSelectedOrganizations().\r\n }\r\n\r\n /**\r\n * Gets selected organizations.\r\n * @param {AutoCompleteOption[]} selectedOrg\r\n * @memberof EditUserRolesComponent\r\n */\r\n getSelectedOrganizations(selectedOrg: AutoCompleteOption[]): void {\r\n this.representingOrganizations = selectedOrg;\r\n // Keep the reactive control's value in sync with the selection so the\r\n // required validator and submit/Save-button logic stay accurate.\r\n this.editUserRoleFormGroupRef\r\n ?.get('representingOrg')\r\n ?.setValue(selectedOrg?.length ? selectedOrg : '');\r\n // eslint-disable-next-line no-unused-expressions\r\n this.representingOrganizations.length && !this.hasInvalidOrgFreeText\r\n ? (this.isSubmitButtonDisabled = false)\r\n : (this.isSubmitButtonDisabled = true);\r\n }\r\n\r\n /**\r\n * Handles the org field's invalid-free-text state. Disables Save while an\r\n * uncommitted invalid token remains; re-evaluates when it clears.\r\n * @param {boolean} isInvalid -whether an uncommitted invalid token is present.\r\n * @memberof EditUserRolesComponent\r\n */\r\n onOrgInvalidFreeText(isInvalid: boolean): void {\r\n this.hasInvalidOrgFreeText = isInvalid;\r\n if (isInvalid) {\r\n this.isSubmitButtonDisabled = true;\r\n } else {\r\n // Recompute from the selection when the invalid token clears.\r\n this.isSubmitButtonDisabled = !this.representingOrganizations.length;\r\n }\r\n }\r\n /**\r\n * Updates the edit user form group controls by adding fieldConfig at required index.\r\n * @param {number} indexPosition\r\n * @param {FieldConfig} fieldConfig\r\n * @memberof EditUserRolesComponent\r\n */\r\n updateEditUserRoleFormControls(\r\n indexPosition: number,\r\n fieldConfig: FieldConfig\r\n ): void {\r\n this.editUserRoleFormGroup.formGroup[0].controls.splice(\r\n indexPosition,\r\n 0,\r\n fieldConfig\r\n );\r\n }\r\n\r\n /**\r\n * Handles user role selection and save button enable disable in edit user roles form.\r\n * @param {CheckboxOption} event\r\n * @memberof EditUserRolesComponent\r\n */\r\n onUserRoleSelection(event: CheckboxOption): void {\r\n if (event?.checked) {\r\n this.selectedUserRoleIds?.push(event?.id as string);\r\n } else {\r\n this.selectedUserRoleIds = this.selectedUserRoleIds?.filter(\r\n (id) => id !== event?.id\r\n );\r\n }\r\n if (this.groupRosterType === GroupRosterType.SYSTEM_USER) {\r\n this.isSubmitButtonDisabled = this.groupsService.isSubmitButtonDisabled(\r\n this.groupRosterType,\r\n this.editUserRoleFormGroupRef?.status,\r\n this.selectedUserRoleIds\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Update roles and details of user on form submission.\r\n * @param {FormGroup[]} form\r\n * @memberof EditUserRolesComponent\r\n */\r\n onEditUserRoleFormSubmit(form: FormGroup[]): void {\r\n form[0]?.markAllAsTouched();\r\n // Block submit if an uncommitted, invalid free-text token remains in the\r\n // org field even when other controls / selected chips are valid.\r\n if (this.hasInvalidOrgFreeText) {\r\n return;\r\n }\r\n const isAllOtherControlsValid = Object.keys(form[0].controls)\r\n .filter((controlName) => controlName !== 'representingOrg')\r\n .every(\r\n (controlName) => form[0].get(controlName)?.status === FormStatus?.VALID\r\n );\r\n if (\r\n (form[0].get('representingOrg')?.status === FormStatus?.INVALID &&\r\n isAllOtherControlsValid &&\r\n this.representingOrganizations.length > 0) ||\r\n form[0].status === FormStatus?.VALID\r\n ) {\r\n this.groupsService\r\n .editGroupsUserRole(this.getEditUserRolePayload(form[0]?.getRawValue()))\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (res) => {\r\n if (res?.status) {\r\n this.submitFormResponse?.emit(res);\r\n }\r\n },\r\n error: (error) => {\r\n this.handleErrors(error);\r\n },\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Constructs edit user payload from the form data depends on the GroupRosterType and returns.\r\n * @param {*} formData\r\n * @return {(AddOrEditUserPayload | AddOrEditUserIndividualRosterPayload)}\r\n * @memberof EditUserRolesComponent\r\n */\r\n getEditUserRolePayload(\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n formData: any\r\n ): AddOrEditUserPayload | AddOrEditUserIndividualRosterPayload {\r\n let payload: AddOrEditUserPayload | AddOrEditUserIndividualRosterPayload;\r\n if (this.groupRosterType === GroupRosterType?.INDIVIDUAL) {\r\n const formattedOptions = this.representingOrganizations.map((option) => {\r\n return {\r\n orgId: option.id as string,\r\n orgName: option.name,\r\n };\r\n });\r\n payload = {\r\n payload: {\r\n userId: this.selectedUserInfo?.userId,\r\n email: this.selectedUserInfo?.email,\r\n roles: this.selectedUserRoleIds,\r\n groupId: this.groupsService.selectedGroupInfo?.groupId as string,\r\n organizations: formattedOptions,\r\n },\r\n };\r\n if (this.hasClassification)\r\n payload.payload.classification = {\r\n classificationId: formData?.classification\r\n ? formData?.classification?.id\r\n : '',\r\n };\r\n\r\n if (\r\n formData?.memberType &&\r\n !payload.payload.roles?.includes(formData?.memberType?.id)\r\n )\r\n payload.payload.roles?.push(formData?.memberType?.id);\r\n } else\r\n payload = {\r\n payload: {\r\n email: this.selectedUserInfo?.email,\r\n userId: this.selectedUserInfo?.userId,\r\n roles: this.selectedUserRoleIds,\r\n groupId: this.groupsService?.selectedGroupInfo?.groupId as string,\r\n },\r\n };\r\n return payload;\r\n }\r\n\r\n /**\r\n * Emits form cancel event.\r\n * @memberof EditUserRolesComponent\r\n */\r\n onEditUserRoleCancelled(): void {\r\n this.formCancel?.emit();\r\n }\r\n\r\n /**\r\n * Get form reference.\r\n * @param {FormGroup[]} form\r\n * @memberof EditUserRolesComponent\r\n */\r\n getFormGroupReference(form: FormGroup[]) {\r\n this.editUserRoleFormGroupRef = form[0];\r\n if (!this.selectedUserInfo?.canDelete) {\r\n (this.editUserRoleFormGroupRef?.controls['roles'] as FormArray)\r\n ?.at(0)\r\n ?.disable();\r\n }\r\n this.registerRepresentingOrgControl();\r\n }\r\n\r\n /**\r\n * Registers the `representingOrg` reactive control on the dynamic form's\r\n * FormGroup for INDIVIDUAL rosters. The field itself is rendered by the custom\r\n * OrgMultiSelectComponent (not the dynamic form), but keeping this control on\r\n * the same FormGroup — with the original validators — means all existing\r\n * submit/Save-button logic that reads `form.get('representingOrg')` keeps\r\n * working unchanged. Its value is the selected-organizations array, kept in\r\n * sync by getSelectedOrganizations(). Prefilled with the user's existing\r\n * organizations on edit.\r\n * @memberof EditUserRolesComponent\r\n */\r\n registerRepresentingOrgControl(): void {\r\n if (\r\n this.groupRosterType !== GroupRosterType.INDIVIDUAL ||\r\n !this.editUserRoleFormGroupRef ||\r\n this.editUserRoleFormGroupRef.contains('representingOrg')\r\n ) {\r\n return;\r\n }\r\n this.editUserRoleFormGroupRef.addControl(\r\n 'representingOrg',\r\n new FormControl(\r\n this.representingOrganizations?.length\r\n ? this.representingOrganizations\r\n : '',\r\n {\r\n updateOn: 'blur',\r\n validators: [\r\n representingOrgRequiredValidator(),\r\n skipWhenArray(\r\n Validators.maxLength(\r\n GroupsValidationPatterns.representingOrgNameMaxLength\r\n )\r\n ),\r\n skipWhenArray(\r\n Validators.minLength(\r\n GroupsValidationPatterns.representingOrgNameMinLength\r\n )\r\n ),\r\n skipWhenArray(\r\n Validators.pattern(\r\n GroupsValidationPatterns.representingOrganization\r\n )\r\n ),\r\n ],\r\n }\r\n )\r\n );\r\n }\r\n\r\n /**\r\n * Handles edit user role form change event.\r\n * @param {FormGroup[]} form\r\n * @memberof editUserRoleFormGroupRef\r\n */\r\n onEditUserRoleFormChange(form: FormGroup[]): void {\r\n this.editUserRoleFormGroupRef = form[0];\r\n this.isSubmitButtonDisabled = this.groupsService.isSubmitButtonDisabled(\r\n this.groupRosterType,\r\n this.editUserRoleFormGroupRef?.status,\r\n this.selectedUserRoleIds\r\n );\r\n if (\r\n this.representingOrganizations.length &&\r\n this.editUserRoleFormGroupRef.controls['representingOrg'].status ===\r\n FormStatus.INVALID\r\n ) {\r\n this.isSubmitButtonDisabled = false;\r\n } else if (this.representingOrganizations.length === 0) {\r\n this.isSubmitButtonDisabled = true;\r\n }\r\n // An uncommitted, invalid free-text token in the org field must block submit\r\n // regardless of any valid chips already selected.\r\n if (this.hasInvalidOrgFreeText) {\r\n this.isSubmitButtonDisabled = true;\r\n }\r\n }\r\n\r\n /**\r\n * Gets the classifications from master data.\r\n * @memberof EditUserRolesComponent\r\n */\r\n getClassifications(): void {\r\n this.groupsService\r\n .getClassifications()\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (response) => {\r\n response?.body?.forEach((option) => {\r\n this.classifications?.push({\r\n id: option.classificationId,\r\n name: option.classificationDesc,\r\n });\r\n });\r\n this.updateFormControlOptions(\r\n 'classification',\r\n 'dropdownOptions',\r\n this.classifications,\r\n this.selectedUserInfo?.classification\r\n );\r\n },\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n error: (error: any) => {\r\n this.handleErrors(error);\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Gets the member types from master data.\r\n * @memberof EditUserRolesComponent\r\n */\r\n getMemberTypes(): void {\r\n const memberTypes = this.groupsService.getMemberTypes();\r\n memberTypes?.forEach((option) => {\r\n this.memberTypes?.push({\r\n id: option.roleId,\r\n name: option.roleName,\r\n });\r\n });\r\n this.updateFormControlOptions(\r\n 'memberType',\r\n 'dropdownOptions',\r\n this.memberTypes,\r\n this.selectedUserInfo?.memberStatus\r\n );\r\n }\r\n\r\n /**\r\n * Gets the representing Organizations.\r\n * @param {string} orgName\r\n * @memberof AddUserRosterComponent\r\n */\r\n getOrganizations(orgName: string): void {\r\n this.orgSearchValue = orgName;\r\n this.organizations = [];\r\n orgName = orgName?.trimStart();\r\n this.updateFormControlOptions(\r\n 'representingOrg',\r\n 'multiSelectAutoCompleteOptions',\r\n [],\r\n ''\r\n );\r\n if (!orgName) return;\r\n const orgRequestPayload: OrganizationRequestPayload = {\r\n payload: { orgName: orgName },\r\n };\r\n this.groupsService\r\n .getOrganizations(orgRequestPayload)\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (response) => {\r\n const orgs: SelectOption[] = [];\r\n response?.body?.forEach((option) => {\r\n orgs.push({\r\n id: option.orgId,\r\n name: option.orgName,\r\n });\r\n });\r\n // Assign a new array reference so the custom OrgMultiSelectComponent's\r\n // [options] setter runs and opens the results dropdown. Free-text\r\n // min/max/pattern validation is handled inside that component.\r\n this.organizations = orgs;\r\n },\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n error: (error: any) => {\r\n this.handleErrors(error);\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Update the dropdown options of Classification, Member Type and Representing Organization form fields.\r\n * @param {string} formControlName\r\n * @param {string} formControlInputProperty\r\n * @param {SelectOption[]} options\r\n * @memberof EditUserRolesComponent\r\n */\r\n updateFormControlOptions(\r\n formControlName: string,\r\n formControlInputProperty: string,\r\n options: SelectOption[],\r\n selectedOption?: string\r\n ): void {\r\n const formFields = this.dynamicFormComponent?.formFields?.toArray();\r\n formFields?.forEach((formField) => {\r\n const searchedOrgName = options?.filter((option) =>\r\n selectedOption?.includes(option?.name)\r\n )[0];\r\n if (\r\n formField?.component?.instance?.config?.controlName ===\r\n formControlName &&\r\n formField?.component?.instance?.[formControlInputProperty]\r\n )\r\n formField.component.instance[formControlInputProperty] = options;\r\n if (selectedOption && searchedOrgName) {\r\n this.editUserRoleFormGroupRef\r\n .get(formControlName)\r\n ?.setValue(searchedOrgName);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Captures the server side errors and handles it based on the custom or Http errors.\r\n * @param {HttpErrorResponse} error\r\n * @return -returns nothing\r\n * @memberof EditUserRolesComponent\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n handleErrors(error: any): void {\r\n const errorCodes = error?.error?.body?.errorCodes;\r\n if (Array.isArray(errorCodes) && !error?.error?.status) {\r\n if (errorCodes[0] !== '3004') {\r\n const errorMessage = this.groupsService?.parseErrorMessage(errorCodes);\r\n this.alertService.showMessage({\r\n status: 'custom',\r\n message: errorMessage,\r\n alertType: AlertType.ERROR,\r\n isCloseNeeded: true,\r\n });\r\n }\r\n } else if (error && error instanceof HttpErrorResponse) {\r\n this.globalErrorHandlerService?.handleError(error);\r\n }\r\n }\r\n /**\r\n * Disables form submit button when org name length is less than minCharToSearch and greater than zero.\r\n * @memberof EditUserRolesComponent\r\n */\r\n disableSubmitButton(): void {\r\n if (this.representingOrganizations.length === 0) {\r\n this.updateFormControlOptions(\r\n 'representingOrg',\r\n 'multiSelectAutoCompleteOptions',\r\n []\r\n );\r\n this.isSubmitButtonDisabled = true;\r\n }\r\n }\r\n\r\n /**\r\n * NgOnDestroy performs necessary cleanup tasks, such as unsubscribing from subscription when the component is being destroyed.\r\n * @memberof EditUserRolesComponent\r\n */\r\n ngOnDestroy(): void {\r\n this.destroy$.next(true);\r\n this.destroy$.unsubscribe();\r\n }\r\n}\r\n","<ieeesa-dynamic-form\r\n [leftButtonLabel]=\"leftButtonLabel\"\r\n [rightButtonLabel]=\"rightButtonLabel\"\r\n [isLegendVisible]=\"false\"\r\n [isSubmitButtonDisabled]=\"isSubmitButtonDisabled\"\r\n [colWidth]=\"colWidth\"\r\n [actionButtonAlign]=\"actionButtonAlign\"\r\n [formGroups]=\"editUserRoleFormGroup\"\r\n [isLeftButtonNeeded]=\"true\"\r\n (formSubmit)=\"onEditUserRoleFormSubmit($event)\"\r\n (formLeftButtonClicked)=\"onEditUserRoleCancelled()\"\r\n (formCheckboxSelection)=\"onUserRoleSelection($event)\"\r\n (formGroupsReference)=\"getFormGroupReference($event)\"\r\n (formChange)=\"onEditUserRoleFormChange($event)\"\r\n>\r\n <!--\r\n Representing Organization (INDIVIDUAL rosters only). Projected into the\r\n dynamic form's [component] slot so it renders after the other fields but\r\n BEFORE the Save/Cancel action buttons. Uses the custom multi-select field so\r\n multiple orgs can be picked from an open dropdown without the Material\r\n autocomplete closing or clearing the typed text. Prefilled with the user's\r\n existing organizations and synced to the reactive `representingOrg` control\r\n via getSelectedOrganizations().\r\n -->\r\n <ieeesa-org-multi-select\r\n component\r\n *ngIf=\"isIndividualRoster\"\r\n class=\"ieeesa-edit-user-roles__org\"\r\n [label]=\"addUserRosterTexts?.label?.representingOrganization + '*'\"\r\n [ariaLabel]=\"addUserRosterTexts?.label?.ariaLabel?.representingOrganization\"\r\n [supportMessage]=\"addUserRosterTexts?.supportText?.representingOrganization\"\r\n [options]=\"organizations\"\r\n [selectedOptions]=\"representingOrganizations\"\r\n (search)=\"getOrganizations($event)\"\r\n (selectionChange)=\"getSelectedOrganizations($event)\"\r\n (invalidFreeText)=\"onOrgInvalidFreeText($event)\"\r\n ></ieeesa-org-multi-select>\r\n</ieeesa-dynamic-form>\r\n","import { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { map, catchError } from 'rxjs/operators';\r\nimport { HttpService } from '@ieeesa-npm/utility';\r\nimport {\r\n RosterImportJob,\r\n RosterImportPreview,\r\n} from '../models/roster-import.model';\r\n\r\n/**\r\n * RosterImportApiService wraps the backend roster-import state-machine API\r\n * exposed by sa-saapps-groups-api's `RosterImportController`\r\n * (`/v1/groups/roster/import`). It drives the upload → validate → preview →\r\n * confirm / cancel lifecycle plus the read-only import history.\r\n *\r\n * All calls return the standard `Response<T>` envelope from the platform\r\n * (`{ status, body }`); each method maps through the envelope's `body` where\r\n * useful and rethrows errors so callers can inspect `error.error.body.errorCodes`\r\n * (e.g. 1072 unsupported format, 1073 too large, 1074 row-limit, 1075 invalid\r\n * status transition) — mirroring the existing GroupsService pattern.\r\n *\r\n * The base URL already carries the version segment (e.g. `.../v1`), matching\r\n * every other GroupsService call built as `${apiBaseUrl}/groups/...`, so the\r\n * version is NOT repeated here. Call {@link setApiBaseUrl} before use.\r\n *\r\n * @export\r\n * @class RosterImportApiService\r\n */\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class RosterImportApiService {\r\n private apiBaseUrl!: string;\r\n\r\n /** Path prefix (relative to apiBaseUrl) for the roster-import endpoints. */\r\n private readonly IMPORT_BASE_PATH = 'groups/roster/import';\r\n\r\n constructor(\r\n // eslint-disable-next-line no-unused-vars\r\n private httpService: HttpService\r\n ) {}\r\n\r\n /**\r\n * Sets the API base URL for roster-import calls.\r\n * @param {string} url - Base URL ending in the version segment (e.g. '.../v1').\r\n * @memberof RosterImportApiService\r\n */\r\n setApiBaseUrl(url: string): void {\r\n this.apiBaseUrl = url;\r\n }\r\n\r\n /**\r\n * Builds an import endpoint URL from apiBaseUrl + the base path, guarding\r\n * against a double slash if apiBaseUrl has a trailing slash.\r\n * @param {string} [suffix] - Extra path appended after the base path.\r\n * @return {string}\r\n * @memberof RosterImportApiService\r\n */\r\n private buildUrl(suffix = ''): string {\r\n if (!this.apiBaseUrl) {\r\n throw new Error(\r\n 'RosterImportApiService apiBaseUrl is not set. Call setApiBaseUrl() first.'\r\n );\r\n }\r\n const base = this.apiBaseUrl.replace(/\\/+$/, '');\r\n return `${base}/${this.IMPORT_BASE_PATH}${suffix}`;\r\n }\r\n\r\n /**\r\n * Uploads a roster-import file for a group and creates a PENDING import job.\r\n * POST {apiBaseUrl}/groups/roster/import/upload (multipart form-data).\r\n *\r\n * Server validation may reject with: 1072 (unsupported format — only .xlsx /\r\n * .csv), 1073 (file > 10MB), 1074 (> 10,000 data rows).\r\n * @param {File} file - The .xlsx or .csv roster file.\r\n * @param {string} groupId - The target group id.\r\n * @return {Observable<RosterImportJob>} - The created PENDING import job.\r\n * @memberof RosterImportApiService\r\n */\r\n uploadImportFile(file: File, groupId: string): Observable<RosterImportJob> {\r\n const formData = new FormData();\r\n formData.append('file', file);\r\n formData.append('groupId', groupId);\r\n return this.httpService\r\n .postFormData(this.buildUrl('/upload'), formData)\r\n .pipe(\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n map((response: any) => response?.body as RosterImportJob),\r\n catchError((errorRes) => {\r\n throw errorRes;\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Transitions a PENDING import job to VALIDATING and returns the per-row\r\n * validation preview.\r\n * POST {apiBaseUrl}/groups/roster/import/{importId}/validate.\r\n * @param {string} importId - The import job identifier.\r\n * @return {Observable<RosterImportPreview>}\r\n * @memberof RosterImportApiService\r\n */\r\n validateImportJob(importId: string): Observable<RosterImportPreview> {\r\n return this.httpService\r\n .postData(this.buildUrl(`/${importId}/validate`), {})\r\n .pipe(\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n map((response: any) => response?.body as RosterImportPreview),\r\n catchError((errorRes) => {\r\n throw errorRes;\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Returns the per-row validation preview for a validated import job without\r\n * committing any roster changes.\r\n * GET {apiBaseUrl}/groups/roster/import/{importId}/preview.\r\n * @param {string} importId - The import job identifier.\r\n * @return {Observable<RosterImportPreview>}\r\n * @memberof RosterImportApiService\r\n */\r\n getImportPreview(importId: string): Observable<RosterImportPreview> {\r\n return this.httpService.getData(this.buildUrl(`/${importId}/preview`)).pipe(\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n map((response: any) => response?.body as RosterImportPreview),\r\n catchError((errorRes) => {\r\n throw errorRes;\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Commits a validated import job's roster changes and returns the job with\r\n * its terminal status (COMPLETED / PARTIAL / FAILED).\r\n * POST {apiBaseUrl}/groups/roster/import/{importId}/confirm.\r\n *\r\n * May reject with 1075 (invalid status transition) if the job is not in a\r\n * confirmable state.\r\n * @param {string} importId - The import job identifier.\r\n * @return {Observable<RosterImportJob>}\r\n * @memberof RosterImportApiService\r\n */\r\n confirmImportJob(importId: string): Observable<RosterImportJob> {\r\n return this.httpService\r\n .postData(this.buildUrl(`/${importId}/confirm`), {})\r\n .pipe(\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n map((response: any) => response?.body as RosterImportJob),\r\n catchError((errorRes) => {\r\n throw errorRes;\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Cancels an import job after preview without committing any roster changes.\r\n * POST {apiBaseUrl}/groups/roster/import/{importId}/cancel.\r\n * @param {string} importId - The import job identifier.\r\n * @return {Observable<string>} - The cancellation confirmation message.\r\n * @memberof RosterImportApiService\r\n */\r\n cancelImportJob(importId: string): Observable<string> {\r\n return this.httpService\r\n .postData(this.buildUrl(`/${importId}/cancel`), {})\r\n .pipe(\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n map((response: any) => response?.body as string),\r\n catchError((errorRes) => {\r\n throw errorRes;\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Returns the roster import history for a group (read-only), scoped by the\r\n * requester's app_id on the server.\r\n * GET {apiBaseUrl}/groups/roster/import/history/{groupId}.\r\n *\r\n * May reject with 403 if the requester lacks view-roster permission for the\r\n * group.\r\n * @param {string} groupId - The group whose import history is requested.\r\n * @return {Observable<RosterImportJob[]>} - The import jobs (never null).\r\n * @memberof RosterImportApiService\r\n */\r\n getImportHistory(groupId: string): Observable<RosterImportJob[]> {\r\n return this.httpService\r\n .getData(this.buildUrl(`/history/${groupId}`))\r\n .pipe(\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n map((response: any) => (response?.body as RosterImportJob[]) ?? []),\r\n catchError((errorRes) => {\r\n throw errorRes;\r\n })\r\n );\r\n }\r\n}\r\n","import {\r\n Component,\r\n EventEmitter,\r\n Input,\r\n OnDestroy,\r\n OnInit,\r\n Output,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\r\nimport { Subject, switchMap, takeUntil } from 'rxjs';\r\nimport {\r\n RosterImportErrorReport,\r\n RosterImportJob,\r\n} from '../../models/roster-import.model';\r\nimport { RosterImportApiService } from '../../services/roster-import-api.service';\r\nimport { GroupsService } from '../../services/groups.service';\r\nimport * as constants from '../../assets/constants.json';\r\n\r\n/** States of the roster import flow. */\r\ntype RosterImportState = 'upload' | 'processing' | 'result';\r\n\r\n/**\r\n * View-model for the result screen. Populated from the confirmed\r\n * {@link RosterImportJob} returned by the backend.\r\n */\r\ninterface RosterImportResult {\r\n totalRecords: number;\r\n successCount: number;\r\n failureCount: number;\r\n}\r\n\r\n/** Row error shown on the result screen (mapped from the BE error report). */\r\ninterface RosterImportRowError {\r\n rowNumber: number;\r\n field?: string;\r\n errorMessage: string;\r\n}\r\n\r\n/**\r\n * Roster Import dialog.\r\n *\r\n * Lets an admin upload a CSV/XLSX roster file, shows a processing progress\r\n * bar, then a result summary (added / skipped) with per-row errors and an\r\n * error-log download.\r\n *\r\n * Wired to the real backend roster-import state machine\r\n * (sa-saapps-groups-api `RosterImportController`) via\r\n * {@link RosterImportApiService}: on Import it runs\r\n * upload → validate → confirm and renders the confirmed job's terminal counts\r\n * and per-row errors. Server-side validation errors (1072 unsupported format,\r\n * 1073 too large, 1074 row limit, 1075 invalid status) are surfaced inline.\r\n *\r\n * @export\r\n * @class RosterImportComponent\r\n */\r\n@Component({\r\n selector: 'ieeesa-roster-import',\r\n standalone: true,\r\n imports: [CommonModule, MatButtonModule, MatProgressBarModule],\r\n templateUrl: './roster-import.component.html',\r\n styleUrls: ['./roster-import.component.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class RosterImportComponent implements OnInit, OnDestroy {\r\n /** Carries the { groupId, groupName } payload from the opening dialog. */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n @Input() componentData: any;\r\n\r\n /** Emitted after an import that added at least one row (parent refreshes). */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n @Output() submitFormResponse = new EventEmitter<any>();\r\n\r\n /** Emitted when the user cancels/closes without a successful add. */\r\n @Output() formCancel = new EventEmitter<void>();\r\n\r\n destroy$ = new Subject<boolean>();\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n constants: any = constants;\r\n screenTexts = this.constants?.rosterImport;\r\n\r\n /** Current state of the import flow. */\r\n importState: RosterImportState = 'upload';\r\n\r\n /** The selected file. */\r\n selectedFile: File | null = null;\r\n\r\n /** File drag-over state. */\r\n isDragOver = false;\r\n\r\n /** Terminal upload result. */\r\n uploadResult: RosterImportResult | null = null;\r\n\r\n /** Row-level errors for the completed job. */\r\n jobErrors: RosterImportRowError[] = [];\r\n\r\n /** Inline validation / API error message. */\r\n errorMessage: string | null = null;\r\n\r\n /**\r\n * Info banner shown when the file has headers but no data rows\r\n * (Figma: \"No roster data found...\").\r\n */\r\n noDataMessage: string | null = null;\r\n\r\n /** The import job id returned by upload (kept so cancel can clean it up). */\r\n private importId: string | null = null;\r\n\r\n /** Maximum file size in bytes (10 MB) — matches the BE 10MB limit. */\r\n readonly MAX_FILE_SIZE = 10_485_760;\r\n\r\n /** Accepted file extensions (must match the BE contract: only .csv / .xlsx). */\r\n readonly ACCEPTED_EXTENSIONS = ['.csv', '.xlsx'];\r\n\r\n constructor(\r\n // eslint-disable-next-line no-unused-vars\r\n private rosterImportApiService: RosterImportApiService,\r\n // eslint-disable-next-line no-unused-vars\r\n private groupService: GroupsService\r\n ) {}\r\n\r\n /** Required column headers for display. */\r\n get requiredColumns(): string[] {\r\n return this.screenTexts?.requiredColumns ?? [];\r\n }\r\n\r\n /** Comma-separated accepted file types for the input element. */\r\n get acceptedFileTypes(): string {\r\n return this.ACCEPTED_EXTENSIONS.join(',');\r\n }\r\n\r\n /** The target group id from the dialog payload (falls back to selection). */\r\n private get groupId(): string {\r\n return (\r\n this.componentData?.groupId ??\r\n (this.groupService?.getSelectedGroupInfo()?.groupId as string) ??\r\n ''\r\n );\r\n }\r\n\r\n /**\r\n * Sets the API base URL on the import service.\r\n * @memberof RosterImportComponent\r\n */\r\n ngOnInit(): void {\r\n this.rosterImportApiService.setApiBaseUrl(this.groupService?.apiBaseUrl);\r\n }\r\n\r\n /**\r\n * Cleans up subscriptions when the component is destroyed.\r\n * @memberof RosterImportComponent\r\n */\r\n ngOnDestroy(): void {\r\n this.destroy$.next(true);\r\n this.destroy$.complete();\r\n }\r\n\r\n /**\r\n * Handles a file selected via the browse dialog.\r\n * @param {Event} event - The change event from the hidden file input.\r\n * @memberof RosterImportComponent\r\n */\r\n onFileSelected(event: Event): void {\r\n const input = event.target as HTMLInputElement;\r\n if (!input.files || input.files.length === 0) {\r\n return;\r\n }\r\n if (input.files.length > 1) {\r\n this.showSingleFileOnlyError();\r\n return;\r\n }\r\n this.processFile(input.files[0]);\r\n }\r\n\r\n /**\r\n * Handles a file dropped onto the dropzone.\r\n * @param {DragEvent} event - The drop event.\r\n * @memberof RosterImportComponent\r\n */\r\n onFileDrop(event: DragEvent): void {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.isDragOver = false;\r\n const files = event.dataTransfer?.files;\r\n if (!files || files.length === 0) {\r\n return;\r\n }\r\n if (files.length > 1) {\r\n this.showSingleFileOnlyError();\r\n return;\r\n }\r\n this.processFile(files[0]);\r\n }\r\n\r\n /**\r\n * Handles drag-over on the dropzone.\r\n * @param {DragEvent} event - The dragover event.\r\n * @memberof RosterImportComponent\r\n */\r\n onDragOver(event: DragEvent): void {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.isDragOver = true;\r\n }\r\n\r\n /**\r\n * Handles drag-leave on the dropzone.\r\n * @param {DragEvent} event - The dragleave event.\r\n * @memberof RosterImportComponent\r\n */\r\n onDragLeave(event: DragEvent): void {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.isDragOver = false;\r\n }\r\n\r\n /**\r\n * Validates the file type and size, then either sets it or shows an error.\r\n * @param {File} file - The candidate file.\r\n * @memberof RosterImportComponent\r\n */\r\n processFile(file: File): void {\r\n this.errorMessage = null;\r\n this.noDataMessage = null;\r\n this.uploadResult = null;\r\n this.importId = null;\r\n // Clear any previously selected (valid) file so an invalid new selection\r\n // can't leave the Import button enabled for a stale file.\r\n this.selectedFile = null;\r\n\r\n const fileName = file.name.toLowerCase();\r\n const isValidExtension = this.ACCEPTED_EXTENSIONS.some((ext) =>\r\n fileName.endsWith(ext)\r\n );\r\n if (!isValidExtension) {\r\n this.errorMessage =\r\n this.screenTexts?.validation?.unsupportedType ??\r\n 'Incorrect file type. Please upload a valid .csv or .xlsx file.';\r\n return;\r\n }\r\n\r\n if (file.size === 0) {\r\n this.errorMessage =\r\n this.screenTexts?.validation?.emptyFile ??\r\n 'The selected file is empty. Please upload a file with roster records.';\r\n return;\r\n }\r\n\r\n if (file.size > this.MAX_FILE_SIZE) {\r\n this.errorMessage =\r\n this.screenTexts?.validation?.fileTooLarge ??\r\n 'File size exceeds the maximum allowed size of 10MB.';\r\n return;\r\n }\r\n\r\n this.selectedFile = file;\r\n }\r\n\r\n /**\r\n * Shows the single-file-only validation message.\r\n * @memberof RosterImportComponent\r\n */\r\n showSingleFileOnlyError(): void {\r\n this.errorMessage =\r\n this.screenTexts?.validation?.singleFileOnly ??\r\n 'Please upload a single file at a time.';\r\n }\r\n\r\n /**\r\n * Removes the currently selected file and resets to the upload state.\r\n * @memberof RosterImportComponent\r\n */\r\n onRemoveFile(): void {\r\n this.selectedFile = null;\r\n this.errorMessage = null;\r\n this.noDataMessage = null;\r\n this.uploadResult = null;\r\n this.importId = null;\r\n this.importState = 'upload';\r\n }\r\n\r\n /**\r\n * Runs the real import: upload → validate → confirm. The progress bar is\r\n * shown in indeterminate mode while the chain is in flight, then the\r\n * confirmed job's terminal counts + per-row errors drive the result screen.\r\n * @memberof RosterImportComponent\r\n */\r\n onImport(): void {\r\n if (!this.selectedFile) {\r\n return;\r\n }\r\n if (!this.groupId) {\r\n this.errorMessage =\r\n this.screenTexts?.validation?.uploadFailed ??\r\n 'An error occurred while importing the roster. Please try again.';\r\n return;\r\n }\r\n this.errorMessage = null;\r\n this.noDataMessage = null;\r\n this.uploadResult = null;\r\n this.jobErrors = [];\r\n this.importId = null;\r\n this.importState = 'processing';\r\n\r\n this.rosterImportApiService\r\n .uploadImportFile(this.selectedFile, this.groupId)\r\n .pipe(\r\n switchMap((job: RosterImportJob) => {\r\n this.importId = job?.importId ?? null;\r\n return this.rosterImportApiService.validateImportJob(\r\n this.importId as string\r\n );\r\n }),\r\n switchMap(() =>\r\n this.rosterImportApiService.confirmImportJob(this.importId as string)\r\n ),\r\n takeUntil(this.destroy$)\r\n )\r\n .subscribe({\r\n next: (confirmedJob: RosterImportJob) => {\r\n this.finalizeResult(confirmedJob);\r\n },\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n error: (error: any) => {\r\n this.handleImportError(error);\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Maps a failed import call to an inline error message and returns the UI to\r\n * the upload state so the user can retry. Known BE error codes (1072–1075)\r\n * are mapped via constants; anything else uses the generic message.\r\n * @param {*} error - The HttpErrorResponse.\r\n * @memberof RosterImportComponent\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private handleImportError(error: any): void {\r\n this.importState = 'upload';\r\n const errorCodes: string[] | undefined = error?.error?.body?.errorCodes;\r\n if (Array.isArray(errorCodes) && errorCodes.length) {\r\n const code = errorCodes[0] as keyof typeof this.constants.errors;\r\n this.errorMessage =\r\n this.constants?.errors?.[code] ??\r\n this.screenTexts?.validation?.uploadFailed ??\r\n 'An error occurred while importing the roster. Please try again.';\r\n return;\r\n }\r\n this.errorMessage =\r\n this.screenTexts?.validation?.uploadFailed ??\r\n 'An error occurred while importing the roster. Please try again.';\r\n }\r\n\r\n /**\r\n * Stores the terminal result and moves to the result state. When the job had\r\n * no data rows, shows the \"no roster data\" info banner instead of the summary\r\n * cards.\r\n * @param {RosterImportJob} job - The confirmed import job.\r\n * @memberof RosterImportComponent\r\n */\r\n finalizeResult(job: RosterImportJob): void {\r\n const totalRecords = job?.totalRows ?? 0;\r\n const successCount = job?.successRows ?? 0;\r\n const failureCount = job?.failedRows ?? 0;\r\n\r\n this.uploadResult = { totalRecords, successCount, failureCount };\r\n this.jobErrors = this.parseErrorReport(job?.errorReport);\r\n this.importState = 'result';\r\n\r\n if (totalRecords === 0) {\r\n this.noDataMessage =\r\n this.screenTexts?.validation?.noDataRecords ??\r\n 'No roster data found. The selected file contains headers but no roster records.';\r\n }\r\n }\r\n\r\n /**\r\n * Parses the BE `errorReport` raw JSON string into row-error view models.\r\n *\r\n * The BE stores the report as a JSONB document wrapping the per-row entries:\r\n * `{ \"rows\": [ { \"row\": 2, \"field\": \"Email\", \"message\": \"...\" } ] }`\r\n * (serialized by its `ErrorReportWrapper`) and returns it verbatim via\r\n * `@JsonRawValue`. So we read `parsed.rows`. A bare top-level array is also\r\n * accepted as a fallback in case the contract is ever flattened.\r\n * @param {(string | undefined)} errorReport - Raw JSON error report string.\r\n * @return {RosterImportRowError[]}\r\n * @memberof RosterImportComponent\r\n */\r\n private parseErrorReport(errorReport?: string): RosterImportRowError[] {\r\n if (!errorReport) {\r\n return [];\r\n }\r\n try {\r\n const parsed = JSON.parse(errorReport) as\r\n | { rows?: RosterImportErrorReport[] }\r\n | RosterImportErrorReport[];\r\n const entries: RosterImportErrorReport[] = Array.isArray(parsed)\r\n ? parsed\r\n : parsed?.rows ?? [];\r\n return entries.map((entry) => ({\r\n rowNumber: entry?.row,\r\n field: entry?.field,\r\n errorMessage: entry?.message,\r\n }));\r\n } catch {\r\n // Malformed error report — surface no per-row errors rather than crash.\r\n return [];\r\n }\r\n }\r\n\r\n /**\r\n * Whether the result state should show the summary cards (added / skipped).\r\n * Hidden for the \"no data records\" case.\r\n * @return {boolean}\r\n * @memberof RosterImportComponent\r\n */\r\n get showSummaryCards(): boolean {\r\n return !!this.uploadResult && this.uploadResult.totalRecords > 0;\r\n }\r\n\r\n /**\r\n * Whether every processed row was skipped (drives the \"All Rows are skipped\"\r\n * header on the errors card).\r\n * @return {boolean}\r\n * @memberof RosterImportComponent\r\n */\r\n get allRowsSkipped(): boolean {\r\n return (\r\n !!this.uploadResult &&\r\n this.uploadResult.totalRecords > 0 &&\r\n this.uploadResult.successCount === 0\r\n );\r\n }\r\n\r\n /**\r\n * Builds a client-side CSV sample file from the required columns and triggers\r\n * a browser download. (Client-side generation until the template API exists.)\r\n * @memberof RosterImportComponent\r\n */\r\n downloadSampleFile(): void {\r\n const headerLine = this.requiredColumns\r\n .map((col) => this.toCsvCell(col))\r\n .join(',');\r\n\r\n // Sample data rows so the downloaded file shows the expected format, not\r\n // just the column headers. Sourced from constants; each row is aligned to\r\n // the required columns.\r\n const sampleRows: string[][] = this.screenTexts?.sampleRows ?? [];\r\n const dataLines = sampleRows.map((row) =>\r\n row.map((cell) => this.toCsvCell(cell)).join(',')\r\n );\r\n\r\n const csvContent = [headerLine, ...dataLines].join('\\r\\n') + '\\r\\n';\r\n const blob = new Blob([csvContent], {\r\n type: 'text/csv;charset=utf-8;',\r\n });\r\n const fileName = this.screenTexts?.sampleFileName ?? 'Roster_Sample.csv';\r\n this.triggerDownload(blob, fileName);\r\n }\r\n\r\n /**\r\n * Builds a CSV from the row-level errors and triggers a browser download so\r\n * the user can correct and re-upload.\r\n * @memberof RosterImportComponent\r\n */\r\n downloadErrorLog(): void {\r\n if (!this.jobErrors.length) {\r\n return;\r\n }\r\n const headers: string[] = this.screenTexts?.errorLog?.headers ?? [\r\n 'Row',\r\n 'Field',\r\n 'Error',\r\n ];\r\n const rows = this.jobErrors.map((rowErr) =>\r\n [rowErr.rowNumber, rowErr.field, rowErr.errorMessage]\r\n .map((value) => this.toCsvCell(value))\r\n .join(',')\r\n );\r\n const csvContent = [\r\n headers.map((header) => this.toCsvCell(header)).join(','),\r\n ...rows,\r\n ].join('\\r\\n');\r\n const fileName =\r\n this.screenTexts?.errorLog?.fileName ?? 'Roster_Import_Error_Log.csv';\r\n const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' });\r\n this.triggerDownload(blob, fileName);\r\n }\r\n\r\n /**\r\n * Escapes a value for safe inclusion in a CSV cell.\r\n * @param {(string | number | undefined | null)} value - The raw cell value.\r\n * @return {string} - the CSV-safe cell string.\r\n * @memberof RosterImportComponent\r\n */\r\n toCsvCell(value: string | number | undefined | null): string {\r\n const raw = value === undefined || value === null ? '' : String(value);\r\n if (/[\",\\r\\n]/.test(raw)) {\r\n return `\"${raw.replace(/\"/g, '\"\"')}\"`;\r\n }\r\n return raw;\r\n }\r\n\r\n /**\r\n * Closes the dialog. Emits submitFormResponse when at least one row was added\r\n * so the parent refreshes; otherwise emits formCancel.\r\n * @memberof RosterImportComponent\r\n */\r\n onCancel(): void {\r\n if (this.uploadResult && this.uploadResult.successCount > 0) {\r\n this.submitFormResponse.emit(this.uploadResult);\r\n } else {\r\n this.formCancel.emit();\r\n }\r\n }\r\n\r\n /**\r\n * Triggers a browser download for a generated blob.\r\n * @param {Blob} blob - The file content.\r\n * @param {string} fileName - The suggested filename.\r\n * @memberof RosterImportComponent\r\n */\r\n private triggerDownload(blob: Blob, fileName: string): void {\r\n const url = URL.createObjectURL(blob);\r\n const link = document.createElement('a');\r\n link.href = url;\r\n link.download = fileName;\r\n link.click();\r\n URL.revokeObjectURL(url);\r\n }\r\n}\r\n","<div class=\"ieeesa-roster-import\">\r\n <!-- Sub-heading band: \"Bulk Import Participants\" on the left, Import Roster\r\n action on the right (appears once a file is selected) — matches the Figma.\r\n The \"← Back to Rosters / Import Roster\" title row + X are rendered by the\r\n shared ModalComponent above this. -->\r\n <div class=\"ieeesa-roster-import__subheader\">\r\n <span class=\"ieeesa-roster-import__subheader-title\">\r\n {{ screenTexts?.subHeading ?? 'Bulk Import Participants' }}\r\n </span>\r\n <button\r\n *ngIf=\"selectedFile\"\r\n mat-button\r\n type=\"button\"\r\n class=\"mat-tertiary-button ieeesa-roster-import__import-btn\"\r\n [disabled]=\"importState === 'processing'\"\r\n (click)=\"onImport()\"\r\n [attr.aria-label]=\"screenTexts?.buttons?.import ?? 'Import Roster'\"\r\n >\r\n <svg class=\"ieeesa-roster-import__import-btn-icon\" width=\"14\" height=\"14\" aria-hidden=\"true\">\r\n <use xlink:href=\"assets/images/sprites/sprites.svg#icon-import\"></use>\r\n </svg>\r\n {{ screenTexts?.buttons?.import ?? 'Import Roster' }}\r\n </button>\r\n </div>\r\n\r\n <!-- Required Columns Info -->\r\n <div class=\"ieeesa-roster-import__columns-card\">\r\n <div class=\"ieeesa-roster-import__columns-content\">\r\n <p class=\"ieeesa-roster-import__columns-title\">\r\n {{ screenTexts?.requiredColumnsTitle ?? 'Required columns' }}\r\n </p>\r\n <div class=\"ieeesa-roster-import__columns-chips\">\r\n <span\r\n *ngFor=\"let col of requiredColumns\"\r\n class=\"ieeesa-roster-import__chip\"\r\n >\r\n {{ col }}\r\n </span>\r\n </div>\r\n </div>\r\n <div class=\"ieeesa-roster-import__sample-wrapper\">\r\n <button\r\n mat-button\r\n class=\"mat-tertiary-button ieeesa-roster-import__download-btn\"\r\n (click)=\"downloadSampleFile()\"\r\n type=\"button\"\r\n [attr.aria-label]=\"screenTexts?.ariaLabel?.downloadSample ?? 'Download Sample File'\"\r\n >\r\n <svg\r\n class=\"ieeesa-roster-import__download-btn-icon\"\r\n aria-hidden=\"true\"\r\n >\r\n <use xlink:href=\"assets/images/sprites/sprites.svg#icon-file-doc\"></use>\r\n </svg>\r\n {{ screenTexts?.downloadSampleLabel ?? 'Download Sample File' }}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <p class=\"ieeesa-roster-import__upload-label\">\r\n {{ screenTexts?.uploadLabel ?? 'Upload your file' }}\r\n </p>\r\n\r\n <!-- Upload State -->\r\n <ng-container *ngIf=\"importState === 'upload'\">\r\n <!-- Hidden file input -->\r\n <input\r\n #fileInput\r\n type=\"file\"\r\n [accept]=\"acceptedFileTypes\"\r\n (change)=\"onFileSelected($event)\"\r\n hidden\r\n [attr.aria-label]=\"screenTexts?.uploadLabel ?? 'Upload your file'\"\r\n />\r\n\r\n <!-- Drag & Drop Zone -->\r\n <div\r\n class=\"ieeesa-roster-import__dropzone\"\r\n [class.ieeesa-roster-import__dropzone--active]=\"isDragOver\"\r\n (dragover)=\"onDragOver($event)\"\r\n (dragleave)=\"onDragLeave($event)\"\r\n (drop)=\"onFileDrop($event)\"\r\n (click)=\"fileInput.click()\"\r\n role=\"button\"\r\n tabindex=\"0\"\r\n (keydown.enter)=\"fileInput.click()\"\r\n (keydown.space)=\"fileInput.click()\"\r\n [attr.aria-label]=\"screenTexts?.ariaLabel?.dropzone ?? 'Drag and drop file upload area'\"\r\n >\r\n <ng-container *ngIf=\"!selectedFile\">\r\n <svg class=\"ieeesa-roster-import__upload-icon\" width=\"22\" height=\"22\">\r\n <use xlink:href=\"assets/images/sprites/sprites.svg#icon-upload-gray\"></use>\r\n </svg>\r\n <p class=\"ieeesa-roster-import__dropzone-text\">\r\n {{ screenTexts?.dropzoneText ?? 'Drag & drop a file here, or click to browse' }}\r\n </p>\r\n <p class=\"ieeesa-roster-import__dropzone-hint\">\r\n {{ screenTexts?.dropzoneHint ?? 'Accepted formats: .csv, .xlsx' }}\r\n </p>\r\n </ng-container>\r\n <ng-container *ngIf=\"selectedFile\">\r\n <svg class=\"ieeesa-roster-import__upload-icon\" width=\"22\" height=\"22\">\r\n <use xlink:href=\"assets/images/sprites/sprites.svg#icon-upload-gray\"></use>\r\n </svg>\r\n <div class=\"ieeesa-roster-import__file-row\">\r\n <p class=\"ieeesa-roster-import__file-name\">\r\n <svg width=\"14\" height=\"14\">\r\n <use xlink:href=\"assets/images/sprites/sprites.svg#icon-file-doc\"></use>\r\n </svg>\r\n {{ selectedFile.name }}\r\n </p>\r\n <button\r\n mat-button\r\n class=\"ieeesa-roster-import__remove-file-btn\"\r\n (click)=\"onRemoveFile(); $event.stopPropagation()\"\r\n type=\"button\"\r\n [attr.aria-label]=\"screenTexts?.ariaLabel?.remove ?? 'Remove selected file'\"\r\n >\r\n ×\r\n </button>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- Inline Error Message -->\r\n <div\r\n *ngIf=\"errorMessage\"\r\n class=\"ieeesa-roster-import__error-banner\"\r\n role=\"alert\"\r\n >\r\n {{ errorMessage }}\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Processing / Result share the file display + progress bar -->\r\n <ng-container *ngIf=\"importState === 'processing' || importState === 'result'\">\r\n <div\r\n class=\"ieeesa-roster-import__dropzone ieeesa-roster-import__dropzone--result\"\r\n >\r\n <svg class=\"ieeesa-roster-import__upload-icon\" width=\"22\" height=\"22\">\r\n <use xlink:href=\"assets/images/sprites/sprites.svg#icon-upload-gray\"></use>\r\n </svg>\r\n <p class=\"ieeesa-roster-import__file-name\">\r\n <svg width=\"14\" height=\"14\">\r\n <use xlink:href=\"assets/images/sprites/sprites.svg#icon-file-doc\"></use>\r\n </svg>\r\n {{ selectedFile?.name }}\r\n </p>\r\n </div>\r\n\r\n <!-- Progress label (processing only) -->\r\n <div\r\n *ngIf=\"importState === 'processing'\"\r\n class=\"ieeesa-roster-import__progress-head\"\r\n >\r\n <span class=\"ieeesa-roster-import__progress-label\">\r\n {{ screenTexts?.processingLabel ?? 'Processing file records....' }}\r\n </span>\r\n </div>\r\n <mat-progress-bar\r\n *ngIf=\"importState === 'processing'\"\r\n class=\"ieeesa-roster-import__progress-bar\"\r\n mode=\"indeterminate\"\r\n [attr.aria-label]=\"screenTexts?.processingLabel ?? 'Processing file records....'\"\r\n ></mat-progress-bar>\r\n </ng-container>\r\n\r\n <!-- Result State (summary + errors) -->\r\n <ng-container *ngIf=\"importState === 'result' && uploadResult\">\r\n <!-- No data records banner (headers only, zero rows) -->\r\n <div\r\n *ngIf=\"noDataMessage\"\r\n class=\"ieeesa-roster-import__no-data-banner\"\r\n role=\"status\"\r\n >\r\n {{ noDataMessage }}\r\n </div>\r\n\r\n <!-- Summary cards -->\r\n <div *ngIf=\"showSummaryCards\" class=\"ieeesa-roster-import__summary-cards\">\r\n <div\r\n class=\"ieeesa-roster-import__summary-card ieeesa-roster-import__summary-card--success\"\r\n >\r\n <p class=\"ieeesa-roster-import__summary-card-count\">\r\n {{ uploadResult.successCount }}\r\n </p>\r\n <p class=\"ieeesa-roster-import__summary-card-label\">\r\n {{ screenTexts?.result?.successCardLabel ?? 'Rosters added successfully' }}\r\n </p>\r\n </div>\r\n <div\r\n class=\"ieeesa-roster-import__summary-card ieeesa-roster-import__summary-card--skipped\"\r\n >\r\n <p class=\"ieeesa-roster-import__summary-card-count\">\r\n {{ uploadResult.failureCount }}\r\n </p>\r\n <p class=\"ieeesa-roster-import__summary-card-label\">\r\n {{ screenTexts?.result?.skippedCardLabel ?? 'Skipped Rows' }}\r\n </p>\r\n </div>\r\n </div>\r\n\r\n <!-- Row Errors Card -->\r\n <div *ngIf=\"jobErrors.length\" class=\"ieeesa-roster-import__errors-card\">\r\n <p class=\"ieeesa-roster-import__errors-header\">\r\n <ng-container *ngIf=\"allRowsSkipped; else someErrors\">\r\n {{ screenTexts?.result?.allRowsSkippedHeader ?? 'All Rows are skipped' }}\r\n </ng-container>\r\n <ng-template #someErrors>\r\n {{ screenTexts?.result?.errorsHeader ?? 'Row errors — these rows will be skipped' }}\r\n </ng-template>\r\n </p>\r\n <div class=\"ieeesa-roster-import__errors-body\">\r\n <div\r\n *ngFor=\"let rowErr of jobErrors\"\r\n class=\"ieeesa-roster-import__error-row\"\r\n >\r\n <p class=\"ieeesa-roster-import__error-row-title\">\r\n Row {{ rowErr.rowNumber }} — {{ rowErr.errorMessage }}\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Footer actions -->\r\n <div class=\"ieeesa-roster-import__actions\">\r\n <button\r\n mat-button\r\n class=\"mat-tertiary-button ieeesa-roster-import__cancel-btn\"\r\n (click)=\"onCancel()\"\r\n type=\"button\"\r\n >\r\n {{ screenTexts?.buttons?.cancel ?? 'Cancel' }}\r\n </button>\r\n <button\r\n *ngIf=\"importState === 'result' && jobErrors.length\"\r\n mat-button\r\n type=\"button\"\r\n class=\"mat-primary-button ieeesa-roster-import__error-log-btn\"\r\n (click)=\"downloadErrorLog()\"\r\n [attr.aria-label]=\"screenTexts?.ariaLabel?.downloadErrorLog ?? 'Download Error log'\"\r\n >\r\n {{ screenTexts?.buttons?.downloadErrorLog ?? 'Download Error log' }}\r\n </button>\r\n </div>\r\n</div>\r\n","import {\r\n ChangeDetectorRef,\r\n Component,\r\n Input,\r\n OnDestroy,\r\n OnInit,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { HttpErrorResponse } from '@angular/common/http';\r\nimport { Subject, takeUntil } from 'rxjs';\r\nimport {\r\n DataTableComponent,\r\n TableActions,\r\n TableColumnSchema,\r\n TableColumnType,\r\n} from '@ieeesa-npm/presentation';\r\nimport { GlobalErrorHandlerService } from '@ieeesa-npm/utility';\r\nimport { RosterImportJob } from '../../models/roster-import.model';\r\nimport { RosterImportApiService } from '../../services/roster-import-api.service';\r\nimport { GroupsService } from '../../services/groups.service';\r\nimport * as constants from '../../assets/constants.json';\r\n\r\n/** A single row shown in the \"Imported Files\" table. */\r\ninterface RosterImportHistoryRow {\r\n timestamp: string;\r\n personImported: string;\r\n fileName: string;\r\n addedRows: number | string;\r\n errors: number | string;\r\n targetGroup: string;\r\n}\r\n\r\n/**\r\n * Roster import-history (\"View History\") dialog body.\r\n *\r\n * Rendered inside the shared ModalComponent (which supplies the\r\n * \"← Back to Rosters / View History\" breadcrumb title row + X close). Shows the\r\n * selected group's name and an \"Imported Files\" table listing prior roster\r\n * imports.\r\n *\r\n * Data comes from the real BE endpoint via {@link RosterImportApiService}:\r\n * `GET /v1/groups/roster/import/history/{groupId}`. The response is a list of\r\n * `RosterImportJob` whose JSON view exposes `fileName`, `successRows`,\r\n * `failedRows`, `status` and ids — but NOT `createdOn` / `createdBy` (both are\r\n * `@JsonIgnore` on the BE entity). So the \"Timestamp\" and \"Person Imported\"\r\n * columns render a placeholder until the BE exposes those fields. \"Target\r\n * Group\" uses the current group's name (history is scoped to one group).\r\n *\r\n * @export\r\n * @class RosterImportHistoryComponent\r\n */\r\n@Component({\r\n selector: 'ieeesa-roster-import-history',\r\n standalone: true,\r\n imports: [CommonModule, DataTableComponent],\r\n templateUrl: './roster-import-history.component.html',\r\n styleUrls: ['./roster-import-history.component.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class RosterImportHistoryComponent implements OnInit, OnDestroy {\r\n /** Carries the { groupId, groupName } payload from the opening dialog. */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n @Input() componentData: any;\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n constants: any = constants;\r\n screenTexts = this.constants?.rosterImportHistory;\r\n\r\n private destroy$ = new Subject<boolean>();\r\n\r\n /** Table column definitions for the \"Imported Files\" table. */\r\n columnSchema: TableColumnSchema[] = [];\r\n\r\n /** Import-history rows mapped for the table. */\r\n tableData: RosterImportHistoryRow[] = [];\r\n\r\n /** True while the history request is in flight. */\r\n isLoading = false;\r\n\r\n /** Inline error message when the history request fails. */\r\n errorMessage: string | null = null;\r\n\r\n /** Read-only table — no search / filter / add / edit / delete actions. */\r\n tableActions: TableActions = {\r\n isSearchNeeded: false,\r\n isFilterNeeded: false,\r\n isAddNeeded: false,\r\n isEditNeeded: false,\r\n isDeleteNeeded: false,\r\n };\r\n\r\n /** Placeholder shown for fields the BE does not return (timestamp / person). */\r\n private readonly placeholder =\r\n this.screenTexts?.emptyFieldPlaceholder ?? '—';\r\n\r\n constructor(\r\n // eslint-disable-next-line no-unused-vars\r\n private rosterImportApiService: RosterImportApiService,\r\n // eslint-disable-next-line no-unused-vars\r\n private groupService: GroupsService,\r\n // eslint-disable-next-line no-unused-vars\r\n private cdr: ChangeDetectorRef,\r\n // eslint-disable-next-line no-unused-vars\r\n private globalErrorHandlerService: GlobalErrorHandlerService\r\n ) {}\r\n\r\n /** The group name shown as the heading above the Imported Files table. */\r\n get groupName(): string {\r\n return (\r\n this.componentData?.groupName ??\r\n this.groupService?.getSelectedGroupInfo()?.groupName ??\r\n ''\r\n );\r\n }\r\n\r\n /** The group id whose history is fetched. */\r\n private get groupId(): string {\r\n return (\r\n this.componentData?.groupId ??\r\n (this.groupService?.getSelectedGroupInfo()?.groupId as string) ??\r\n ''\r\n );\r\n }\r\n\r\n /**\r\n * Builds the table schema and loads the import history from the BE.\r\n * @memberof RosterImportHistoryComponent\r\n */\r\n ngOnInit(): void {\r\n this.buildColumnSchema();\r\n this.rosterImportApiService.setApiBaseUrl(this.groupService?.apiBaseUrl);\r\n this.loadImportHistory();\r\n }\r\n\r\n /**\r\n * Cleans up subscriptions when the component is destroyed.\r\n * @memberof RosterImportHistoryComponent\r\n */\r\n ngOnDestroy(): void {\r\n this.destroy$.next(true);\r\n this.destroy$.complete();\r\n }\r\n\r\n /**\r\n * Fetches the import history for the current group and maps it to table rows.\r\n * @memberof RosterImportHistoryComponent\r\n */\r\n loadImportHistory(): void {\r\n if (!this.groupId) {\r\n return;\r\n }\r\n this.isLoading = true;\r\n this.errorMessage = null;\r\n this.rosterImportApiService\r\n .getImportHistory(this.groupId)\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (jobs: RosterImportJob[]) => {\r\n this.tableData = (jobs ?? []).map((job) => this.mapJobToRow(job));\r\n this.isLoading = false;\r\n this.cdr.detectChanges();\r\n },\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n error: (error: any) => {\r\n this.isLoading = false;\r\n this.handleError(error);\r\n this.cdr.detectChanges();\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Maps a BE import job to a table row. Timestamp and Person Imported are not\r\n * present in the response (BE `@JsonIgnore`), so they render a placeholder.\r\n * Target Group uses the current group's name (history is per-group).\r\n * @param {RosterImportJob} job - The BE import job.\r\n * @return {RosterImportHistoryRow}\r\n * @memberof RosterImportHistoryComponent\r\n */\r\n private mapJobToRow(job: RosterImportJob): RosterImportHistoryRow {\r\n return {\r\n timestamp: this.placeholder,\r\n personImported: this.placeholder,\r\n fileName: job?.fileName ?? this.placeholder,\r\n addedRows: job?.successRows ?? 0,\r\n errors: job?.failedRows ?? 0,\r\n targetGroup: this.groupName || this.placeholder,\r\n };\r\n }\r\n\r\n /**\r\n * Maps a failed history request to a user-facing inline error message.\r\n * A 403 gets the permission-specific message; other errors get the generic\r\n * one and are forwarded to the global handler for logging/interceptors.\r\n * @param {*} error - The HttpErrorResponse.\r\n * @memberof RosterImportHistoryComponent\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private handleError(error: any): void {\r\n this.tableData = [];\r\n const status = error?.status ?? error?.error?.status;\r\n if (status === 403) {\r\n this.errorMessage =\r\n this.screenTexts?.forbiddenMessage ??\r\n 'You do not have permission to view the import history for this group.';\r\n return;\r\n }\r\n this.errorMessage =\r\n this.screenTexts?.errorMessage ??\r\n 'Unable to load import history. Please try again.';\r\n if (error instanceof HttpErrorResponse) {\r\n this.globalErrorHandlerService.handleError(error);\r\n }\r\n }\r\n\r\n /**\r\n * Defines the \"Imported Files\" table columns.\r\n * @memberof RosterImportHistoryComponent\r\n */\r\n private buildColumnSchema(): void {\r\n const columns = this.screenTexts?.tableColumns;\r\n this.columnSchema = [\r\n {\r\n id: 1,\r\n columnDef: 'timestamp',\r\n heading: columns?.timestamp ?? 'Timestamp',\r\n columnType: TableColumnType.TEXT,\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n cellData: (element: any) => `${element.timestamp}`,\r\n },\r\n {\r\n id: 2,\r\n columnDef: 'personImported',\r\n heading: columns?.personImported ?? 'Person Imported',\r\n columnType: TableColumnType.TEXT,\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n cellData: (element: any) => `${element.personImported}`,\r\n },\r\n {\r\n id: 3,\r\n columnDef: 'fileName',\r\n heading: columns?.fileName ?? 'File Name',\r\n columnType: TableColumnType.TEXT,\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n cellData: (element: any) => `${element.fileName}`,\r\n },\r\n {\r\n id: 4,\r\n columnDef: 'addedRows',\r\n heading: columns?.addedRows ?? 'Added Rows',\r\n columnType: TableColumnType.TEXT,\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n cellData: (element: any) => `${element.addedRows}`,\r\n },\r\n {\r\n id: 5,\r\n columnDef: 'errors',\r\n heading: columns?.errors ?? 'Errors',\r\n columnType: TableColumnType.TEXT,\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n cellData: (element: any) => `${element.errors}`,\r\n },\r\n {\r\n id: 6,\r\n columnDef: 'targetGroup',\r\n heading: columns?.targetGroup ?? 'Target Group',\r\n columnType: TableColumnType.TEXT,\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n cellData: (element: any) => `${element.targetGroup}`,\r\n },\r\n ];\r\n }\r\n}\r\n","<div class=\"ieeesa-roster-import-history\">\r\n <!-- The \"← Back to Rosters / View History\" title row + X close are rendered\r\n by the shared ModalComponent above this. -->\r\n\r\n <!-- Group name heading (Figma: bold group name above the table). -->\r\n <p class=\"ieeesa-roster-import-history__group-name\">\r\n {{ groupName }}\r\n </p>\r\n\r\n <!-- \"Imported Files\" section title. -->\r\n <p class=\"ieeesa-roster-import-history__section-title\">\r\n {{ screenTexts?.importedFilesTitle ?? 'Imported Files' }}\r\n </p>\r\n\r\n <!-- Loading state -->\r\n <p\r\n *ngIf=\"isLoading\"\r\n class=\"ieeesa-roster-import-history__status\"\r\n role=\"status\"\r\n >\r\n {{ screenTexts?.loadingMessage ?? 'Loading import history...' }}\r\n </p>\r\n\r\n <!-- Error state -->\r\n <div\r\n *ngIf=\"!isLoading && errorMessage\"\r\n class=\"ieeesa-roster-import-history__error\"\r\n role=\"alert\"\r\n >\r\n {{ errorMessage }}\r\n </div>\r\n\r\n <!-- Imported Files table (read-only). Shown once loaded without error. -->\r\n <ieeesa-data-table\r\n *ngIf=\"!isLoading && !errorMessage\"\r\n class=\"ieeesa-roster-import-history__table\"\r\n [tableDataInfo]=\"tableData\"\r\n [columnSchemaInfo]=\"columnSchema\"\r\n [tableActions]=\"tableActions\"\r\n [isCellTextOverflowEllipsis]=\"true\"\r\n [className]=\"'ieeesa-roster-import-history-table'\"\r\n ></ieeesa-data-table>\r\n</div>\r\n","import { Component, ViewEncapsulation } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport * as constants from '../../assets/constants.json';\r\n\r\n/**\r\n * \"Interested Rosters\" tab content of the Roster Interests dialog (SP3M-317).\r\n * Displays the list of users who expressed interest in the group. This is a\r\n * placeholder shell for now; the submissions table will be implemented in a\r\n * later increment once the backend is available (data will be mocked in the\r\n * service layer meanwhile).\r\n * @export\r\n * @class InterestedRostersComponent\r\n */\r\n@Component({\r\n selector: 'ieeesa-interested-rosters',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './interested-rosters.component.html',\r\n styleUrls: ['./interested-rosters.component.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class InterestedRostersComponent {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n constants: any = constants;\r\n interestedRostersTexts = this.constants?.rosterInterests?.interestedRosters;\r\n placeholderMessage = this.interestedRostersTexts?.placeholderMessage;\r\n}\r\n","<div class=\"ieeesa-interested-rosters ieeesa-body-md-16\">\r\n {{ placeholderMessage }}\r\n</div>\r\n","import { Component, OnInit, Optional, ViewEncapsulation } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatDialogRef } from '@angular/material/dialog';\r\nimport {\r\n RadioComponent,\r\n RadioOption,\r\n SlideToggleComponent,\r\n SlideToggleOption,\r\n} from '@ieeesa-npm/presentation';\r\nimport * as constants from '../../assets/constants.json';\r\n\r\n/**\r\n * Standard (locked) question row shown in the Interest Form tab.\r\n * @export\r\n * @interface StandardQuestionRow\r\n */\r\nexport interface StandardQuestionRow {\r\n id: number;\r\n label: string;\r\n tag: string;\r\n}\r\n\r\n/**\r\n * \"Interest Form\" tab content of the Roster Interests dialog (SP3M-317). The\r\n * group admin configures the interest form here: enable/disable the form, view\r\n * the locked standard questions, choose the default membership level and manage\r\n * custom questions. Interactive controls reuse the shared presentation\r\n * components (slide toggle, radio). Persistence via a mocked service and the\r\n * custom-question builder will be added in subsequent increments.\r\n * @export\r\n * @class InterestFormComponent\r\n */\r\n@Component({\r\n selector: 'ieeesa-interest-form',\r\n standalone: true,\r\n imports: [CommonModule, SlideToggleComponent, RadioComponent],\r\n templateUrl: './interest-form.component.html',\r\n styleUrls: ['./interest-form.component.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class InterestFormComponent implements OnInit {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n constants: any = constants;\r\n interestFormTexts = this.constants?.rosterInterests?.interestForm;\r\n changesNotice = this.interestFormTexts?.changesNotice;\r\n sectionTitle = this.interestFormTexts?.sectionTitle;\r\n sectionDescription = this.interestFormTexts?.sectionDescription;\r\n standardQuestionsTitle = this.interestFormTexts?.standardQuestionsTitle;\r\n standardQuestionsHint = this.interestFormTexts?.standardQuestionsHint;\r\n defaultMembershipTitle = this.interestFormTexts?.defaultMembershipTitle;\r\n defaultMembershipDescription =\r\n this.interestFormTexts?.defaultMembershipDescription;\r\n customQuestionsTitle = this.interestFormTexts?.customQuestionsTitle;\r\n addQuestionLabel = this.interestFormTexts?.addQuestionLabel;\r\n standardTag = this.interestFormTexts?.standardTag;\r\n cancelLabel = this.constants?.rosterInterests?.footer?.cancel;\r\n previewLabel = this.constants?.rosterInterests?.footer?.preview;\r\n\r\n enableFormToggle!: SlideToggleOption;\r\n standardQuestions: StandardQuestionRow[] = [];\r\n membershipLevels: RadioOption[] = [];\r\n // Controls whether the lower sections (standard questions, default membership\r\n // level, custom questions) are shown. When the interest form is disabled only\r\n // the toggle section is visible.\r\n isFormEnabled = true;\r\n\r\n constructor(\r\n // eslint-disable-next-line no-unused-vars\r\n @Optional() private dialogRef: MatDialogRef<unknown>\r\n ) {}\r\n\r\n /**\r\n * Initializes the toggle, locked standard questions and default membership\r\n * level options from constants.\r\n * @memberof InterestFormComponent\r\n */\r\n ngOnInit(): void {\r\n this.enableFormToggle = {\r\n id: 1,\r\n label: '',\r\n checked: this.isFormEnabled,\r\n ariaLabel: this.sectionTitle,\r\n };\r\n this.standardQuestions = (\r\n this.interestFormTexts?.standardQuestions ?? []\r\n ).map((label: string, index: number) => ({\r\n id: index + 1,\r\n label,\r\n tag: this.standardTag,\r\n }));\r\n this.membershipLevels = (\r\n this.interestFormTexts?.membershipLevels ?? []\r\n ).map((label: string, index: number) => ({\r\n id: index + 1,\r\n label,\r\n checked: index === 0,\r\n }));\r\n }\r\n\r\n /**\r\n * Updates the form-enabled state when the toggle changes so the dependent\r\n * sections show or hide accordingly.\r\n * @param {SlideToggleOption} toggle\r\n * @memberof InterestFormComponent\r\n */\r\n onEnableFormToggle(toggle: SlideToggleOption): void {\r\n this.isFormEnabled = toggle?.checked;\r\n }\r\n\r\n /**\r\n * Closes the Roster Interests dialog (Cancel action).\r\n * @memberof InterestFormComponent\r\n */\r\n onCancel(): void {\r\n this.dialogRef?.close();\r\n }\r\n\r\n /**\r\n * Returns the unique identifier for a standard question row for ngFor\r\n * tracking.\r\n * @param {number} index\r\n * @param {StandardQuestionRow} question\r\n * @return {number}\r\n * @memberof InterestFormComponent\r\n */\r\n trackByFn(index: number, question: StandardQuestionRow): number {\r\n return question.id;\r\n }\r\n}\r\n","<div class=\"ieeesa-interest-form\">\r\n <div class=\"ieeesa-interest-form__notice ieeesa-body-sm-14\" role=\"note\">\r\n <svg\r\n class=\"ieeesa-interest-form__notice-icon\"\r\n width=\"16\"\r\n height=\"16\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n aria-hidden=\"true\"\r\n >\r\n <path\r\n d=\"M12 2L1 21h22L12 2zm0 4.5L19.5 19.5h-15L12 6.5zM11 10v5h2v-5h-2zm0 6v2h2v-2h-2z\"\r\n fill=\"currentColor\"\r\n />\r\n </svg>\r\n <span>{{ changesNotice }}</span>\r\n </div>\r\n\r\n <section class=\"ieeesa-interest-form__section\">\r\n <div\r\n class=\"ieeesa-interest-form__row d-flex justify-content-between align-items-start\"\r\n >\r\n <div>\r\n <h2 class=\"ieeesa-interest-form__section-title ieeesa-body-lg-bold-16 m-0\">\r\n {{ sectionTitle }}\r\n </h2>\r\n <p class=\"ieeesa-interest-form__section-desc ieeesa-body-sm-14 m-0\">\r\n {{ sectionDescription }}\r\n </p>\r\n </div>\r\n <ieeesa-slide-toggle\r\n [slideToggle]=\"enableFormToggle\"\r\n (slideToggleChange)=\"onEnableFormToggle($event)\"\r\n ></ieeesa-slide-toggle>\r\n </div>\r\n </section>\r\n\r\n <section *ngIf=\"isFormEnabled\" class=\"ieeesa-interest-form__section\">\r\n <div\r\n class=\"ieeesa-interest-form__section-heading d-flex align-items-center gap-2\"\r\n >\r\n <svg\r\n class=\"ieeesa-interest-form__lock\"\r\n width=\"16\"\r\n height=\"16\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n aria-hidden=\"true\"\r\n >\r\n <path\r\n d=\"M12 2a5 5 0 0 0-5 5v3H6a2 2 0 0 0-2 2v8a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-8a2 2 0 0 0-2-2h-1V7a5 5 0 0 0-5-5zm-3 5a3 3 0 0 1 6 0v3H9V7zm-3 5h12v8H6v-8z\"\r\n fill=\"currentColor\"\r\n />\r\n </svg>\r\n <h2 class=\"ieeesa-interest-form__section-title ieeesa-body-lg-bold-16 m-0\">\r\n {{ standardQuestionsTitle }}\r\n </h2>\r\n <span class=\"ieeesa-interest-form__hint ieeesa-body-sm-14\">{{\r\n standardQuestionsHint\r\n }}</span>\r\n </div>\r\n <ul class=\"ieeesa-interest-form__standard-list\">\r\n <li\r\n *ngFor=\"let question of standardQuestions; trackBy: trackByFn\"\r\n class=\"ieeesa-interest-form__standard-row d-flex justify-content-between align-items-center\"\r\n >\r\n <span class=\"ieeesa-interest-form__standard-label ieeesa-body-sm-14\">{{\r\n question.label\r\n }}</span>\r\n <span class=\"ieeesa-interest-form__standard-tag ieeesa-body-sm-14\">{{\r\n question.tag\r\n }}</span>\r\n </li>\r\n </ul>\r\n </section>\r\n\r\n <section *ngIf=\"isFormEnabled\" class=\"ieeesa-interest-form__section\">\r\n <h2 class=\"ieeesa-interest-form__section-title ieeesa-body-lg-bold-16 m-0\">\r\n {{ defaultMembershipTitle }}\r\n </h2>\r\n <p class=\"ieeesa-interest-form__section-desc ieeesa-body-sm-14\">\r\n {{ defaultMembershipDescription }}\r\n </p>\r\n <ieeesa-radio\r\n formControlName=\"defaultMembershipLevel\"\r\n [radioGroup]=\"membershipLevels\"\r\n ></ieeesa-radio>\r\n </section>\r\n\r\n <section\r\n *ngIf=\"isFormEnabled\"\r\n class=\"ieeesa-interest-form__section ieeesa-interest-form__section--custom d-flex justify-content-between align-items-center\"\r\n >\r\n <h2 class=\"ieeesa-interest-form__section-title ieeesa-body-lg-bold-16 m-0\">\r\n {{ customQuestionsTitle }}\r\n </h2>\r\n <button\r\n type=\"button\"\r\n class=\"ieeesa-interest-form__add-question ieeesa-body-sm-14\"\r\n [attr.aria-label]=\"addQuestionLabel\"\r\n >\r\n {{ addQuestionLabel }}\r\n </button>\r\n </section>\r\n\r\n <div class=\"ieeesa-interest-form__footer d-flex justify-content-start gap-3\">\r\n <button\r\n type=\"button\"\r\n class=\"ieeesa-interest-form__cancel\"\r\n (click)=\"onCancel()\"\r\n [attr.aria-label]=\"cancelLabel\"\r\n >\r\n {{ cancelLabel }}\r\n </button>\r\n <button\r\n *ngIf=\"isFormEnabled\"\r\n type=\"button\"\r\n class=\"ieeesa-interest-form__preview\"\r\n [attr.aria-label]=\"previewLabel\"\r\n >\r\n {{ previewLabel }}\r\n </button>\r\n </div>\r\n</div>\r\n","import { Component, Inject, ViewEncapsulation } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport {\r\n MAT_DIALOG_DATA,\r\n MatDialogModule,\r\n MatDialogRef,\r\n} from '@angular/material/dialog';\r\nimport { Tab, TabsComponent } from '@ieeesa-npm/presentation';\r\nimport { GroupInfo } from '../../models/group-info.model';\r\nimport { InterestedRostersComponent } from '../interested-rosters/interested-rosters.component';\r\nimport { InterestFormComponent } from '../interest-form/interest-form.component';\r\nimport * as constants from '../../assets/constants.json';\r\n\r\n/**\r\n * Roster Interests dialog host (SP3M-317). Opened from the \"Manage Interest\r\n * Form\" action on a group row. Renders a two-tab layout using the shared\r\n * TabsComponent: \"Interested Rosters\" (submissions list) and \"Interest Form\"\r\n * (admin configuration). The group being managed is provided via the dialog\r\n * data. The tab content components are rendered dynamically by TabsComponent\r\n * through each tab's componentRef.\r\n * @export\r\n * @class InterestFormManagementComponent\r\n */\r\n@Component({\r\n selector: 'ieeesa-interest-form-management',\r\n standalone: true,\r\n imports: [CommonModule, MatDialogModule, TabsComponent],\r\n templateUrl: './interest-form-management.component.html',\r\n styleUrls: ['./interest-form-management.component.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class InterestFormManagementComponent {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n constants: any = constants;\r\n rosterInterestsTexts = this.constants?.rosterInterests;\r\n heading = this.rosterInterestsTexts?.heading;\r\n closeAriaLabel = this.rosterInterestsTexts?.closeAriaLabel;\r\n tabs: Tab[] = [\r\n {\r\n id: 1,\r\n label: this.rosterInterestsTexts?.tabs?.interestedRosters,\r\n componentRef: InterestedRostersComponent,\r\n },\r\n {\r\n id: 2,\r\n label: this.rosterInterestsTexts?.tabs?.interestForm,\r\n componentRef: InterestFormComponent,\r\n },\r\n ];\r\n\r\n constructor(\r\n // eslint-disable-next-line no-unused-vars\r\n public dialogRef: MatDialogRef<InterestFormManagementComponent>,\r\n // eslint-disable-next-line no-unused-vars\r\n @Inject(MAT_DIALOG_DATA) public group: GroupInfo\r\n ) {}\r\n\r\n /**\r\n * Closes the Roster Interests dialog.\r\n * @memberof InterestFormManagementComponent\r\n */\r\n onClose(): void {\r\n this.dialogRef?.close();\r\n }\r\n}\r\n","<div class=\"ieeesa-interest-form-management\">\r\n <div\r\n class=\"ieeesa-interest-form-management__header d-flex justify-content-between align-items-center\"\r\n >\r\n <h1 class=\"ieeesa-interest-form-management__title ieeesa-title-lg-24 m-0\">\r\n {{ heading }}\r\n </h1>\r\n <button\r\n type=\"button\"\r\n class=\"ieeesa-interest-form-management__close\"\r\n (click)=\"onClose()\"\r\n [attr.aria-label]=\"closeAriaLabel\"\r\n >\r\n ×\r\n </button>\r\n </div>\r\n\r\n <div class=\"ieeesa-interest-form-management__body\">\r\n <ieeesa-tabs\r\n [tabs]=\"tabs\"\r\n [selectedTabIndex]=\"0\"\r\n ></ieeesa-tabs>\r\n </div>\r\n</div>\r\n","/* eslint-disable no-unused-vars */\r\nexport enum RosterFunctionType {\r\n EDIT_ROSTER_USER_ROLE = 'EDIT_ROSTER_USER_ROLE',\r\n ADD_USER_TO_ROSTER = 'ADD_USER_TO_ROSTER',\r\n}","import {\r\n Component,\r\n ElementRef,\r\n EventEmitter,\r\n OnDestroy,\r\n OnInit,\r\n Output,\r\n ViewChild,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { FormControl, FormGroup, Validators } from '@angular/forms';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatDialogModule } from '@angular/material/dialog';\r\nimport { Subject } from 'rxjs';\r\nimport { takeUntil } from 'rxjs/operators';\r\nimport { HttpErrorResponse } from '@angular/common/http';\r\nimport {\r\n AlertsService,\r\n GlobalErrorHandlerService,\r\n} from '@ieeesa-npm/utility';\r\nimport {\r\n FormGrid,\r\n FormControlType,\r\n AlignType,\r\n SearchType,\r\n CheckboxOption,\r\n SelectOption,\r\n FormModel,\r\n FieldConfig,\r\n AutoCompleteOption,\r\n DynamicFormComponent,\r\n} from '@ieeesa-npm/presentation';\r\nimport * as screenTexts from '../../assets/constants.json';\r\nimport {\r\n GroupsValidationPatterns,\r\n representingOrgRequiredValidator,\r\n skipWhenArray,\r\n} from '../../assets/form-validations';\r\nimport { FormStatus, AlertType } from '@ieeesa-npm/models';\r\nimport { GroupsService } from '../../services/groups.service';\r\nimport {\r\n AddOrEditUserIndividualRosterPayload,\r\n AddOrEditUserPayload,\r\n} from '../../models/add-or-edit-user-group.model';\r\nimport { UserInfo } from '../../models/user-info.model';\r\nimport { GroupRosterType } from '../../models/roster-type.model';\r\nimport { OrganizationRequestPayload } from '../../models/organization.model';\r\nimport { OrgMultiSelectComponent } from '../org-multi-select/org-multi-select.component';\r\n\r\n/**\r\n * Component implements the view and functionalities to add group users to roster.\r\n * @export\r\n * @class AddUserRosterComponent\r\n * @implements {OnInit}\r\n * @implements {OnDestroy}\r\n */\r\n@Component({\r\n selector: 'ieeesa-add-user-roster',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n DynamicFormComponent,\r\n MatDialogModule,\r\n OrgMultiSelectComponent,\r\n ],\r\n templateUrl: './add-user-roster.component.html',\r\n styleUrls: ['./add-user-roster.component.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n providers: [AlertsService],\r\n})\r\nexport class AddUserRosterComponent implements OnInit, OnDestroy {\r\n destroy$ = new Subject<boolean>();\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n constants: any = screenTexts;\r\n addUserRosterTexts = this.constants?.addUserRoster;\r\n leftButtonLabel = this.addUserRosterTexts?.label?.leftButtonLabel;\r\n rightButtonLabel = this.addUserRosterTexts?.label?.rightButtonLabel;\r\n isSubmitButtonDisabled = false;\r\n colWidth: FormGrid = { xs: 12, xl: 12, sm: 12, md: 12, lg: 12 };\r\n searchUserFormGroup!: FormModel;\r\n addUserFormGroup!: FormModel;\r\n actionButtonAlign = AlignType.LEFT;\r\n addUserFormGroupRef!: FormGroup;\r\n isSearchUserForm = true;\r\n userRoles: CheckboxOption[] = [];\r\n selectedUserRoles: string[] = [];\r\n userInfo: UserInfo = {\r\n email: '',\r\n name: '',\r\n userId: '',\r\n };\r\n isAddUserFormEmailSearch = false;\r\n classifications: SelectOption[] = [];\r\n memberTypes: SelectOption[] = [];\r\n organizations: SelectOption[] = [];\r\n hasClassification = false;\r\n groupRosterType!: GroupRosterType;\r\n isUserExist = false;\r\n selectedOrganizations: AutoCompleteOption[] = [];\r\n timeOutId!: ReturnType<typeof setTimeout>;\r\n\r\n /**\r\n * True when the selected group's roster type is INDIVIDUAL (the only roster\r\n * type that shows the Representing Organization field).\r\n * @readonly\r\n * @memberof AddUserRosterComponent\r\n */\r\n get isIndividualRoster(): boolean {\r\n return this.groupRosterType === GroupRosterType.INDIVIDUAL;\r\n }\r\n\r\n /**\r\n * True when the org field holds an uncommitted, invalid free-text token. Used\r\n * to keep Save disabled even when a valid chip already exists.\r\n */\r\n hasInvalidOrgFreeText = false;\r\n\r\n /**\r\n * Handles the org field's invalid-free-text state and recomputes Save-button\r\n * state so the form cannot be submitted while an invalid token remains.\r\n * @param {boolean} isInvalid -whether an uncommitted invalid token is present.\r\n * @memberof AddUserRosterComponent\r\n */\r\n onOrgInvalidFreeText(isInvalid: boolean): void {\r\n this.hasInvalidOrgFreeText = isInvalid;\r\n this.updateSubmitButtonStatus();\r\n }\r\n @ViewChild(DynamicFormComponent) dynamicFormComponent!: DynamicFormComponent;\r\n @Output() submitFormResponse = new EventEmitter();\r\n @Output() formCancel = new EventEmitter();\r\n\r\n constructor(\r\n // eslint-disable-next-line no-unused-vars\r\n private groupService: GroupsService,\r\n // eslint-disable-next-line no-unused-vars\r\n private globalErrorHandlerService: GlobalErrorHandlerService,\r\n // eslint-disable-next-line no-unused-vars\r\n public alertService: AlertsService,\r\n // eslint-disable-next-line no-unused-vars\r\n public elementRef: ElementRef // eslint-disable-next-line no-empty-function, no-unused-vars\r\n ) {}\r\n\r\n /**\r\n * Initializes user roles and searchUserFormGroup.\r\n * @memberof AddUserRosterComponent\r\n */\r\n ngOnInit(): void {\r\n this.userRoles = this.groupService.getGroupTypeUserRoles();\r\n const groupType = this.groupService.getBusinessRuleOfSelectedGroup();\r\n this.hasClassification = groupType?.hasClassification ?? false;\r\n this.groupRosterType = groupType?.rosterType as GroupRosterType;\r\n if (!this.groupRosterType)\r\n this.showAlertMessage(this.constants?.errors?.ER1001, AlertType.ERROR);\r\n else {\r\n if (this.groupRosterType === GroupRosterType.INDIVIDUAL) {\r\n if (this.hasClassification) this.getClassifications();\r\n this.getMemberTypes();\r\n }\r\n this.createSearchUserFormGroup();\r\n }\r\n this.alertService.isAlertClosed\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe((isClosed: boolean) => {\r\n if (isClosed && !this.isSearchUserForm) {\r\n this.elementRef?.nativeElement?.querySelector('input')?.focus();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Creates search user form group\r\n * @memberof AddUserRosterComponent\r\n */\r\n createSearchUserFormGroup(): void {\r\n this.searchUserFormGroup = {\r\n formGroup: [\r\n {\r\n legend: '',\r\n controls: [\r\n {\r\n type: FormControlType.INPUT,\r\n label: this.addUserRosterTexts?.label?.email + '*',\r\n controlName: 'emailAddress',\r\n requiredErrorMessage:\r\n this.addUserRosterTexts?.message?.error?.required,\r\n isEmail: true,\r\n supportMessage:\r\n this.addUserRosterTexts?.supportText?.emailAddress,\r\n patternErrorMessage:\r\n this.addUserRosterTexts?.message?.error?.pattern?.email,\r\n validation: [\r\n Validators.required,\r\n Validators.pattern(GroupsValidationPatterns.email),\r\n ],\r\n ariaLabel: this.addUserRosterTexts?.label?.ariaLabel?.email,\r\n ariaDescribedById:\r\n this.addUserRosterTexts?.label?.ariaDescribedById?.email,\r\n },\r\n ],\r\n },\r\n ],\r\n };\r\n }\r\n\r\n /**\r\n * Checks form validity and searches the user by entered email.\r\n * @param {FormGroup[]} form\r\n * @memberof AddUserRosterComponent\r\n */\r\n onSearchUserFormSubmit(form: FormGroup[]): void {\r\n this.isAddUserFormEmailSearch = false;\r\n if (form[0]?.status === FormStatus.VALID) {\r\n this.searchUserByEmail(form[0].getRawValue()?.emailAddress);\r\n }\r\n }\r\n\r\n /**\r\n * Searches the user by entered email and gets the user details when the email id is found.\r\n * @param {string} email\r\n * @memberof AddUserRosterComponent\r\n */\r\n searchUserByEmail(email: string): void {\r\n this.groupService\r\n .getUserByEmail(email)\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (res) => {\r\n if (res?.status) {\r\n this.userInfo = res?.body;\r\n this.isUserExist = true;\r\n if (this.userInfo?.userId) this.validateUserExistence();\r\n else this.initializeAddUserFormGroup();\r\n }\r\n },\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n error: (error: any) => {\r\n this.isUserExist = false;\r\n const errorCodes = error?.error?.body?.errorCodes;\r\n if (errorCodes?.includes('2001')) {\r\n this.isSearchUserForm = false;\r\n this.rightButtonLabel =\r\n this.addUserRosterTexts?.label?.saveButtonLabel;\r\n this.isSubmitButtonDisabled = true;\r\n if (\r\n !this.isAddUserFormEmailSearch ||\r\n !(\r\n this.addUserFormGroupRef.contains('firstName') &&\r\n this.addUserFormGroupRef.contains('lastName')\r\n )\r\n ) {\r\n this.userInfo.email = email;\r\n this.updateAddUserFormGroupValues(\r\n JSON.stringify(this.addUserFormGroupRef?.value)\r\n );\r\n } else {\r\n this.addUserFormGroupRef?.get('firstName')?.setValue('');\r\n this.addUserFormGroupRef?.get('lastName')?.setValue('');\r\n }\r\n this.showAlertMessage(\r\n this.constants?.errors?.['2001'],\r\n AlertType.ERROR\r\n );\r\n } else {\r\n this.handleErrors(error);\r\n }\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Validates whether the user is exists in the selected group and then creates add user form when the user does not exist in the selected group.\r\n * @memberof AddUserRosterComponent\r\n */\r\n validateUserExistence(): void {\r\n const payload = {\r\n payload: {\r\n groupId: this.groupService.getSelectedGroupInfo()?.groupId as string,\r\n userId: this.userInfo?.userId as string,\r\n },\r\n };\r\n this.groupService\r\n .getGroupUserDetails(payload)\r\n .pipe(takeUntil(this.destroy$))\r\n ?.subscribe({\r\n next: () => {\r\n this.showAlertMessage(\r\n this.constants?.errors?.['1022'],\r\n AlertType.ERROR\r\n );\r\n this.isSubmitButtonDisabled = true;\r\n },\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n error: (error: any) => {\r\n const errorCodes = error?.error?.body?.errorCodes;\r\n if (errorCodes?.includes('1026')) {\r\n this.initializeAddUserFormGroup();\r\n } else this.handleErrors(error);\r\n },\r\n });\r\n }\r\n /**\r\n * Initialize the form fields required for add new user to the roster based on the searched email.\r\n * @memberof AddUserRosterComponent\r\n */\r\n initializeAddUserFormGroup() {\r\n this.isSearchUserForm = false;\r\n this.rightButtonLabel = this.addUserRosterTexts?.label?.saveButtonLabel;\r\n const addUserFormGroupPrevValues = JSON.stringify(\r\n this.addUserFormGroupRef?.value\r\n );\r\n if (!this.isAddUserFormEmailSearch) {\r\n this.selectedUserRoles = [];\r\n this.isSubmitButtonDisabled = true;\r\n this.createAddUserFormGroup();\r\n if (this.groupRosterType === GroupRosterType.INDIVIDUAL) {\r\n this.updateAddUserFormGroup();\r\n }\r\n } else {\r\n this.updateAddUserFormGroupValues(addUserFormGroupPrevValues);\r\n this.addUserFormGroupRef\r\n ?.get('emailSearch')\r\n ?.setValue(this.userInfo?.email);\r\n this.addUserFormGroupRef?.get('fullName')?.setValue(this.userInfo?.name);\r\n if (this.timeOutId) clearTimeout(this.timeOutId);\r\n this.timeOutId = setTimeout(() => {\r\n this.updateSubmitButtonStatus();\r\n }, 0);\r\n }\r\n }\r\n\r\n /**\r\n * Creates add user form group and updates it with prev form values.\r\n * @param {string} stringifiedAddUserFormPrevValues\r\n * @memberof AddUserRosterComponent\r\n */\r\n updateAddUserFormGroupValues(addUserFormValues: string): void {\r\n this.createAddUserFormGroup(this.userInfo?.email);\r\n if (this.groupRosterType === GroupRosterType.INDIVIDUAL) {\r\n const formValues = addUserFormValues ? JSON.parse(addUserFormValues) : '';\r\n this.updateAddUserFormGroup({\r\n classification: formValues?.classification,\r\n memberType: formValues?.memberType,\r\n representingOrg: formValues?.representingOrg,\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Initialize the add user form group array.\r\n * @param {string} [email]\r\n * @memberof AddUserRosterComponent\r\n */\r\n createAddUserFormGroup(email?: string): void {\r\n this.addUserFormGroup = {\r\n formGroup: [\r\n {\r\n legend: '',\r\n controls: [\r\n {\r\n type: FormControlType.SEARCH,\r\n label: this.addUserRosterTexts?.label?.email + '*',\r\n controlName: 'emailSearch',\r\n value: this.isUserExist ? this.userInfo?.email : email,\r\n searchType: SearchType.ON_CLICK,\r\n validation: [\r\n Validators.required,\r\n Validators.pattern(GroupsValidationPatterns.email),\r\n ],\r\n supportMessage:\r\n this.addUserRosterTexts?.supportText?.emailAddress,\r\n requiredErrorMessage:\r\n this.addUserRosterTexts?.message?.error?.required,\r\n patternErrorMessage:\r\n this.addUserRosterTexts?.message?.error?.pattern?.email,\r\n ariaLabel: this.addUserRosterTexts?.label?.ariaLabel?.email,\r\n ariaDescribedById:\r\n this.addUserRosterTexts?.label?.ariaDescribedById?.email,\r\n },\r\n ...(this.isUserExist\r\n ? [\r\n {\r\n type: FormControlType.TEXT_AREA,\r\n label: this.addUserRosterTexts?.label?.fullName + '*',\r\n controlName: 'fullName',\r\n value: this.userInfo?.name,\r\n validation: [Validators.required],\r\n requiredErrorMessage:\r\n this.addUserRosterTexts?.message?.error?.required,\r\n isReadonly: true,\r\n ariaMultiline: false,\r\n ariaLabel:\r\n this.addUserRosterTexts?.label?.ariaLabel?.fullName,\r\n ariaDescribedById:\r\n this.addUserRosterTexts?.label?.ariaDescribedById\r\n ?.fullName,\r\n },\r\n ]\r\n : [\r\n {\r\n type: FormControlType.INPUT,\r\n label: this.addUserRosterTexts?.label?.firstName + '*',\r\n controlName: 'firstName',\r\n validation: [\r\n Validators.required,\r\n Validators.pattern(\r\n GroupsValidationPatterns.firstOrLastName\r\n ),\r\n ],\r\n requiredErrorMessage:\r\n this.addUserRosterTexts?.message?.error?.required,\r\n patternErrorMessage:\r\n this.addUserRosterTexts?.message?.error?.pattern\r\n ?.firstOrLastName,\r\n ariaLabel:\r\n this.addUserRosterTexts?.label?.ariaLabel?.firstName,\r\n ariaDescribedById:\r\n this.addUserRosterTexts?.label?.ariaDescribedById\r\n ?.firstName,\r\n supportMessage:\r\n this.addUserRosterTexts?.supportText?.firstName,\r\n },\r\n {\r\n type: FormControlType.INPUT,\r\n label: this.addUserRosterTexts?.label?.lastName + '*',\r\n controlName: 'lastName',\r\n validation: [\r\n Validators.required,\r\n Validators.pattern(\r\n GroupsValidationPatterns.firstOrLastName\r\n ),\r\n ],\r\n requiredErrorMessage:\r\n this.addUserRosterTexts?.message?.error?.required,\r\n patternErrorMessage:\r\n this.addUserRosterTexts?.message?.error?.pattern\r\n ?.firstOrLastName,\r\n ariaLabel:\r\n this.addUserRosterTexts?.label?.ariaLabel?.lastName,\r\n ariaDescribedById:\r\n this.addUserRosterTexts?.label?.ariaDescribedById\r\n ?.lastName,\r\n supportMessage:\r\n this.addUserRosterTexts?.supportText?.lastName,\r\n },\r\n ]),\r\n {\r\n type: FormControlType.CHECKBOX,\r\n label:\r\n this.groupRosterType === GroupRosterType.INDIVIDUAL\r\n ? this.addUserRosterTexts?.label?.role\r\n : this.addUserRosterTexts?.label?.role + '*',\r\n controlName: 'roles',\r\n checkboxOptions: this.userRoles,\r\n minSelectionRequired: 1,\r\n ariaLabel: this.addUserRosterTexts?.label?.ariaLabel?.role,\r\n ariaDescribedById:\r\n this.addUserRosterTexts?.label?.ariaDescribedById?.role,\r\n supportMessage:\r\n this.groupRosterType === GroupRosterType.INDIVIDUAL\r\n ? this.addUserRosterTexts?.supportText\r\n ?.roleForIndividualRoster\r\n : this.addUserRosterTexts?.supportText?.role,\r\n requiredErrorMessage:\r\n this.addUserRosterTexts?.message?.error?.required,\r\n validation:\r\n this.groupRosterType === GroupRosterType.INDIVIDUAL\r\n ? []\r\n : [Validators.required],\r\n },\r\n ],\r\n },\r\n ],\r\n };\r\n }\r\n\r\n /**\r\n * Adds classification, Member Type and Representing Organization form controls while adding new user to an individual group roster.\r\n * @param {{\r\n * classification: SelectOption;\r\n * memberType: SelectOption;\r\n * representingOrg: SelectOption;\r\n * }} [addUserFormGroupPrevValues]\r\n * @memberof AddUserRosterComponent\r\n */\r\n updateAddUserFormGroup(addUserFormGroupPrevValues?: {\r\n classification: SelectOption;\r\n memberType: SelectOption;\r\n representingOrg: SelectOption;\r\n }): void {\r\n if (this.hasClassification)\r\n this.updateAddUserFormControls(\r\n this.addUserFormGroup.formGroup[0].controls.length - 1,\r\n {\r\n type: FormControlType.SELECT,\r\n label: this.addUserRosterTexts?.label?.classification + '*',\r\n controlName: 'classification',\r\n dropdownOptions: this.classifications,\r\n value: this.classifications?.find(\r\n (classification) =>\r\n classification.id ===\r\n addUserFormGroupPrevValues?.classification?.id\r\n ),\r\n validation: [Validators.required],\r\n placeholder: '',\r\n supportMessage: this.addUserRosterTexts?.supportText?.classification,\r\n requiredErrorMessage:\r\n this.addUserRosterTexts?.message?.error?.required,\r\n ariaLabel: this.addUserRosterTexts?.label?.ariaLabel?.classification,\r\n ariaDescribedById:\r\n this.addUserRosterTexts?.label?.ariaDescribedById?.classification,\r\n }\r\n );\r\n this.updateAddUserFormControls(\r\n this.addUserFormGroup.formGroup[0].controls.length - 1,\r\n {\r\n type: FormControlType.SELECT,\r\n label: this.addUserRosterTexts?.label?.memberType + '*',\r\n controlName: 'memberType',\r\n dropdownOptions: this.memberTypes,\r\n value: this.memberTypes?.find(\r\n (memberType) =>\r\n memberType.id === addUserFormGroupPrevValues?.memberType?.id\r\n ),\r\n validation: [Validators.required],\r\n placeholder: '',\r\n supportMessage: this.addUserRosterTexts?.supportText?.memberType,\r\n requiredErrorMessage: this.addUserRosterTexts?.message?.error?.required,\r\n ariaLabel: this.addUserRosterTexts?.label?.ariaLabel?.memberType,\r\n ariaDescribedById:\r\n this.addUserRosterTexts?.label?.ariaDescribedById?.memberType,\r\n }\r\n );\r\n // The \"Representing Organization\" field is rendered by the custom\r\n // OrgMultiSelectComponent in the template (not by the dynamic form), so we\r\n // no longer add a MULTI_SELECT_AUTO_COMPLETE control to the dynamic-form\r\n // config here. The reactive `representingOrg` control is registered on the\r\n // captured form group ref in registerRepresentingOrgControl() so all\r\n // existing submit/Save-button logic (which reads form.get('representingOrg'))\r\n // keeps working unchanged. Its value stays in sync via selectedOrganizations.\r\n }\r\n /**\r\n * Updates the add user form group controls by adding fieldConfig at required index.\r\n * @param {number} indexPosition\r\n * @param {FieldConfig} fieldConfig\r\n * @memberof AddUserRosterComponent\r\n */\r\n updateAddUserFormControls(\r\n indexPosition: number,\r\n fieldConfig: FieldConfig\r\n ): void {\r\n this.addUserFormGroup.formGroup[0].controls.splice(\r\n indexPosition,\r\n 0,\r\n fieldConfig\r\n );\r\n }\r\n\r\n /**\r\n * Handles add user form email search\r\n * @param {string} email\r\n * @memberof AddUserRosterComponent\r\n */\r\n formSearchApply(email: string): void {\r\n this.isAddUserFormEmailSearch = true;\r\n if (email.trim()) this.searchUserByEmail(email.trim());\r\n else {\r\n this.userInfo.name = '';\r\n this.addUserFormGroupRef?.get('fullName')?.setValue('');\r\n this.isSubmitButtonDisabled = true;\r\n }\r\n }\r\n\r\n /**\r\n * Assigns role to user on form submission.\r\n * @param {FormGroup[]} form\r\n * @memberof AddUserRosterComponent\r\n */\r\n onAddUserFormSubmit(form: FormGroup[]): void {\r\n form[0]?.markAllAsTouched();\r\n // Block submit if an uncommitted, invalid free-text token remains in the\r\n // org field even when other controls / selected chips are valid.\r\n if (this.hasInvalidOrgFreeText) {\r\n return;\r\n }\r\n if (\r\n (form[0].get('representingOrg')?.status === FormStatus?.INVALID &&\r\n this.isAllOtherControlsValid() &&\r\n this.selectedOrganizations.length > 0) ||\r\n form[0].status === FormStatus?.VALID\r\n ) {\r\n this.groupService\r\n .addNewGroupUser(this.getAddNewUserPayload(form[0]?.getRawValue()))\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (res) => {\r\n if (res?.status) {\r\n this.submitFormResponse.emit(res);\r\n }\r\n },\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n error: (error: any) => {\r\n this.handleErrors(error);\r\n },\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Get add user form group reference.\r\n * @param {FormGroup[]} form\r\n * @memberof AddUserRosterComponent\r\n */\r\n getAddUserFormGroupRef(form: FormGroup[]) {\r\n this.addUserFormGroupRef = form[0];\r\n this.registerRepresentingOrgControl();\r\n }\r\n\r\n /**\r\n * Registers the `representingOrg` reactive control on the dynamic form's\r\n * FormGroup for INDIVIDUAL rosters. The field itself is rendered by the custom\r\n * OrgMultiSelectComponent (not the dynamic form), but keeping this control on\r\n * the same FormGroup — with the original validators — means all existing\r\n * submit/Save-button logic that reads `form.get('representingOrg')` keeps\r\n * working unchanged. Its value is the selected-organizations array, kept in\r\n * sync by getSelectedOrganizations().\r\n * @memberof AddUserRosterComponent\r\n */\r\n registerRepresentingOrgControl(): void {\r\n if (\r\n this.groupRosterType !== GroupRosterType.INDIVIDUAL ||\r\n !this.addUserFormGroupRef ||\r\n this.addUserFormGroupRef.contains('representingOrg')\r\n ) {\r\n return;\r\n }\r\n this.addUserFormGroupRef.addControl(\r\n 'representingOrg',\r\n new FormControl(\r\n this.selectedOrganizations.length ? this.selectedOrganizations : '',\r\n {\r\n updateOn: 'blur',\r\n validators: [\r\n representingOrgRequiredValidator(),\r\n skipWhenArray(\r\n Validators.maxLength(\r\n GroupsValidationPatterns.representingOrgNameMaxLength\r\n )\r\n ),\r\n skipWhenArray(\r\n Validators.minLength(\r\n GroupsValidationPatterns.representingOrgNameMinLength\r\n )\r\n ),\r\n skipWhenArray(\r\n Validators.pattern(\r\n GroupsValidationPatterns.representingOrganization\r\n )\r\n ),\r\n ],\r\n }\r\n )\r\n );\r\n }\r\n\r\n /**\r\n * Handles user role selection in add user form.\r\n * @param {CheckboxOption} event\r\n * @memberof AddUserRosterComponent\r\n */\r\n onUserRoleSelection(event: CheckboxOption): void {\r\n if (event?.checked) {\r\n this.selectedUserRoles?.push(event.id as string);\r\n } else {\r\n this.selectedUserRoles = this.selectedUserRoles.filter(\r\n (value) => value !== event.id\r\n );\r\n }\r\n // Recompute through the single source of truth so role selection and form\r\n // validity stay in sync for both roster types.\r\n this.updateSubmitButtonStatus();\r\n }\r\n /**\r\n * Emits form cancel event.\r\n * @memberof AddUserRosterComponent\r\n */\r\n onFormCancel(): void {\r\n this.formCancel.emit();\r\n }\r\n /**\r\n * Gets the classifications from master data.\r\n * @memberof AddUserRosterComponent\r\n */\r\n getClassifications(): void {\r\n this.groupService\r\n .getClassifications()\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (response) => {\r\n response?.body?.forEach((option) => {\r\n this.classifications?.push({\r\n id: option.classificationId,\r\n name: option.classificationDesc,\r\n });\r\n });\r\n this.updateFormControlOptions(\r\n 'classification',\r\n 'dropdownOptions',\r\n this.classifications\r\n );\r\n },\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n error: (error: any) => {\r\n this.handleErrors(error);\r\n },\r\n });\r\n }\r\n /**\r\n * Gets the member types from master data.\r\n * @memberof AddUserRosterComponent\r\n */\r\n getMemberTypes(): void {\r\n const memberTypes = this.groupService.getMemberTypes();\r\n memberTypes?.forEach((option) => {\r\n this.memberTypes?.push({\r\n id: option.roleId,\r\n name: option.roleName,\r\n });\r\n });\r\n this.updateFormControlOptions(\r\n 'memberType',\r\n 'dropdownOptions',\r\n this.memberTypes\r\n );\r\n }\r\n /**\r\n * Gets the representing Organizations.\r\n * @param {string} orgName\r\n * @memberof AddUserRosterComponent\r\n */\r\n getOrganizations(orgName: string): void {\r\n this.organizations = [];\r\n orgName = orgName?.trimStart();\r\n if (!orgName) return;\r\n const orgRequestPayload: OrganizationRequestPayload = {\r\n payload: { orgName: orgName },\r\n };\r\n this.groupService\r\n .getOrganizations(orgRequestPayload)\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (response) => {\r\n this.organizations = [];\r\n response?.body?.forEach((option) => {\r\n this.organizations?.push({\r\n id: option.orgId,\r\n name: option.orgName,\r\n });\r\n });\r\n // this.organizations is bound to the custom OrgMultiSelectComponent's\r\n // [options] input; assigning a new array reference opens its dropdown.\r\n this.organizations = [...this.organizations];\r\n },\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n error: (error: any) => {\r\n this.handleErrors(error);\r\n },\r\n });\r\n }\r\n /**\r\n * Update the dropdown options of Classification, Member Type and Representing Organization form fields.\r\n * @param {string} formControlName\r\n * @param {string} formControlInputProperty\r\n * @param {SelectOption[]} options\r\n * @memberof AddUserRosterComponent\r\n */\r\n updateFormControlOptions(\r\n formControlName: string,\r\n formControlInputProperty: string,\r\n options: SelectOption[]\r\n ): void {\r\n const formFields = this.dynamicFormComponent?.formFields?.toArray();\r\n formFields?.forEach((formField) => {\r\n if (\r\n formField?.component?.instance?.config?.controlName ===\r\n formControlName &&\r\n formField?.component?.instance?.[formControlInputProperty]\r\n )\r\n formField.component.instance[formControlInputProperty] = options;\r\n });\r\n }\r\n\r\n /**\r\n * Handles the custom errors while searching user by email, validating user existence and adding new user to roster.\r\n * @param {*} error\r\n * @memberof AddUserRosterComponent\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n handleErrors(error: any): void {\r\n const errorCodes = error?.error?.body?.errorCodes;\r\n if (Array.isArray(errorCodes) && !error?.error?.status) {\r\n if (errorCodes[0] !== '3004') {\r\n const errorMessage = this.groupService.parseErrorMessage(errorCodes);\r\n this.showAlertMessage(\r\n errorMessage,\r\n AlertType.ERROR,\r\n errorCodes[0] === '2024'\r\n );\r\n }\r\n } else if (error && error instanceof HttpErrorResponse) {\r\n this.globalErrorHandlerService.handleError(error);\r\n }\r\n }\r\n /**\r\n * Handles add user form change event.\r\n * @param {FormGroup[]} form\r\n * @memberof AddUserRosterComponent\r\n */\r\n onAddUserFormChange(form: FormGroup[]): void {\r\n this.addUserFormGroupRef = form[0];\r\n this.updateSubmitButtonStatus();\r\n }\r\n\r\n /**\r\n * Checks if all other control except representingOrg are valid.\r\n * @return {boolean}\r\n * @memberof AddUserRosterComponent\r\n */\r\n isAllOtherControlsValid(): boolean {\r\n if (!this.addUserFormGroupRef?.controls) {\r\n return false;\r\n }\r\n return Object.keys(this.addUserFormGroupRef.controls)\r\n ?.filter((controlName) => controlName !== 'representingOrg')\r\n .every(\r\n (controlName) =>\r\n this.addUserFormGroupRef?.get(controlName)?.status ===\r\n FormStatus?.VALID\r\n );\r\n }\r\n /**\r\n * Single source of truth for the Save button enabled/disabled state.\r\n *\r\n * Combines both inputs that gate the form so every callback (form change,\r\n * role selection, org selection) computes the same result — mirroring the\r\n * edit-user-roles flow:\r\n * 1. Base validity via GroupsService.isSubmitButtonDisabled, which accounts\r\n * for the reactive form status AND (for SYSTEM_USER) the selected roles,\r\n * since roles live in `selectedUserRoles`, not the form.\r\n * 2. For INDIVIDUAL only: the `representingOrg` control stays INVALID because\r\n * its value is held in `selectedOrganizations` (a multiselect autocomplete),\r\n * not the control. So also enable when every other control is valid and at\r\n * least one organization is selected, even though the form status is\r\n * INVALID.\r\n * @memberof AddUserRosterComponent\r\n */\r\n updateSubmitButtonStatus(): void {\r\n let isDisabled = this.groupService.isSubmitButtonDisabled(\r\n this.groupRosterType,\r\n this.addUserFormGroupRef?.status,\r\n this.selectedUserRoles\r\n );\r\n\r\n // For INDIVIDUAL, the `representingOrg` control stays INVALID because its\r\n // value is held in `selectedOrganizations` (a multiselect autocomplete),\r\n // not the control. So enable when every other control is valid and at least\r\n // one organization is selected — even though the form status is INVALID.\r\n if (\r\n this.groupRosterType === GroupRosterType.INDIVIDUAL &&\r\n this.addUserFormGroupRef?.get('representingOrg')?.status ===\r\n FormStatus?.INVALID &&\r\n this.isAllOtherControlsValid() &&\r\n this.selectedOrganizations?.length > 0\r\n ) {\r\n isDisabled = false;\r\n }\r\n\r\n // An uncommitted, invalid free-text token in the org field must block submit\r\n // regardless of any valid chips already selected.\r\n if (this.hasInvalidOrgFreeText) {\r\n isDisabled = true;\r\n }\r\n\r\n this.isSubmitButtonDisabled = isDisabled;\r\n }\r\n\r\n /**\r\n * Constructs add new user payload from the form data depends on the GroupRosterType and returns.\r\n * @param {*} formData\r\n * @return {(AddOrEditUserPayload | AddOrEditUserIndividualRosterPayload)}\r\n * @memberof AddUserRosterComponent\r\n */\r\n getAddNewUserPayload(\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n formData: any\r\n ): AddOrEditUserPayload | AddOrEditUserIndividualRosterPayload {\r\n let payload: AddOrEditUserPayload | AddOrEditUserIndividualRosterPayload;\r\n if (this.groupRosterType === GroupRosterType.INDIVIDUAL) {\r\n const formattedOptions = this.selectedOrganizations.map((option) => {\r\n return {\r\n orgId: option.id as string,\r\n orgName: option.name,\r\n };\r\n });\r\n payload = {\r\n payload: {\r\n email: this.isUserExist\r\n ? this.userInfo?.email\r\n : formData?.emailSearch,\r\n roles: this.selectedUserRoles,\r\n groupId: this.groupService.selectedGroupInfo?.groupId as string,\r\n organizations: formattedOptions,\r\n },\r\n };\r\n if (this.hasClassification)\r\n payload.payload.classification = {\r\n classificationId: formData?.classification\r\n ? formData?.classification?.id\r\n : '',\r\n };\r\n if (\r\n formData?.memberType &&\r\n !payload.payload.roles?.includes(formData?.memberType?.id)\r\n )\r\n payload.payload.roles?.push(formData?.memberType?.id);\r\n } else\r\n payload = {\r\n payload: {\r\n email: this.isUserExist\r\n ? this.userInfo?.email\r\n : formData?.emailSearch,\r\n roles: this.selectedUserRoles,\r\n groupId: this.groupService.selectedGroupInfo?.groupId as string,\r\n },\r\n };\r\n if (this.isUserExist) {\r\n payload.payload.userId = this.userInfo?.userId;\r\n } else {\r\n payload.payload.firstName = formData?.firstName?.trim();\r\n payload.payload.lastName = formData?.lastName?.trim();\r\n }\r\n return payload;\r\n }\r\n\r\n /**\r\n * Disables form submit button when org name length is less than minCharToSearch and greater than zero.\r\n * @memberof AddUserRosterComponent\r\n */\r\n disableSubmitButton(): void {\r\n if (this.selectedOrganizations.length === 0) {\r\n this.updateFormControlOptions(\r\n 'representingOrg',\r\n 'multiSelectAutoCompleteOptions',\r\n []\r\n );\r\n this.isSubmitButtonDisabled = true;\r\n }\r\n }\r\n\r\n /**\r\n * Handles alerts for error, warning.\r\n * @param {(string | string[])} message -error or warning message\r\n * @param {AlertType} alertType\r\n * @return -returns nothing\r\n * @memberof AddUserRosterComponent\r\n */\r\n showAlertMessage(\r\n message: string | string[],\r\n alertType: AlertType,\r\n isHtmlContent?: boolean\r\n ): void {\r\n this.alertService?.showMessage({\r\n status: 'custom',\r\n message: message,\r\n alertType: alertType,\r\n isCloseNeeded: true,\r\n isHtmlContent: isHtmlContent ?? false,\r\n });\r\n }\r\n\r\n /**\r\n * Gets selected organizations.\r\n * @param {AutoCompleteOption[]} selectedOrg\r\n * @memberof AddUserRosterComponent\r\n */\r\n getSelectedOrganizations(selectedOrg: AutoCompleteOption[]): void {\r\n this.selectedOrganizations = selectedOrg;\r\n // Keep the reactive control's value in sync with the selection so the\r\n // required validator and submit/Save-button logic stay accurate.\r\n this.addUserFormGroupRef\r\n ?.get('representingOrg')\r\n ?.setValue(selectedOrg?.length ? selectedOrg : '');\r\n // Recompute through the single source of truth so the representingOrg\r\n // exception (org selected while the control is INVALID) is applied.\r\n this.updateSubmitButtonStatus();\r\n }\r\n\r\n /**\r\n * NgOnDestroy performs necessary cleanup tasks, such as unsubscribing from subscription when the component is being destroyed.\r\n * @memberof AddUserRosterComponent\r\n */\r\n ngOnDestroy(): void {\r\n if (this.destroy$) {\r\n this.destroy$.next(true);\r\n this.destroy$.unsubscribe();\r\n if (this.timeOutId) clearTimeout(this.timeOutId);\r\n }\r\n }\r\n}\r\n","<ieeesa-dynamic-form\r\n *ngIf=\"searchUserFormGroup && isSearchUserForm\"\r\n class=\"ieeesa-search-user-form\"\r\n [leftButtonLabel]=\"leftButtonLabel\"\r\n [rightButtonLabel]=\"rightButtonLabel\"\r\n [isLegendVisible]=\"false\"\r\n [colWidth]=\"colWidth\"\r\n [actionButtonAlign]=\"actionButtonAlign\"\r\n [formGroups]=\"searchUserFormGroup\"\r\n [isLeftButtonNeeded]=\"true\"\r\n (formSubmit)=\"onSearchUserFormSubmit($event)\"\r\n (formLeftButtonClicked)=\"onFormCancel()\"\r\n></ieeesa-dynamic-form>\r\n\r\n<ieeesa-dynamic-form\r\n *ngIf=\"addUserFormGroup && !isSearchUserForm\"\r\n class=\"ieeesa-add-user-form\"\r\n [leftButtonLabel]=\"leftButtonLabel\"\r\n [rightButtonLabel]=\"rightButtonLabel\"\r\n [isLegendVisible]=\"false\"\r\n [isSubmitButtonDisabled]=\"isSubmitButtonDisabled\"\r\n [colWidth]=\"colWidth\"\r\n [actionButtonAlign]=\"actionButtonAlign\"\r\n [formGroups]=\"addUserFormGroup\"\r\n [isLeftButtonNeeded]=\"true\"\r\n (formSubmit)=\"onAddUserFormSubmit($event)\"\r\n (formSearchApply)=\"formSearchApply($event)\"\r\n (formLeftButtonClicked)=\"onFormCancel()\"\r\n (formGroupsReference)=\"getAddUserFormGroupRef($event)\"\r\n (formCheckboxSelection)=\"onUserRoleSelection($event)\"\r\n (formChange)=\"onAddUserFormChange($event)\"\r\n>\r\n <!--\r\n Representing Organization (INDIVIDUAL rosters only). Projected into the\r\n dynamic form's [component] slot so it renders after the other fields but\r\n BEFORE the Save/Cancel action buttons. Uses the custom multi-select field so\r\n multiple orgs can be picked from an open dropdown without the Material\r\n autocomplete closing or clearing the typed text. Its value stays synced to\r\n the reactive `representingOrg` control via getSelectedOrganizations().\r\n -->\r\n <ieeesa-org-multi-select\r\n component\r\n *ngIf=\"addUserFormGroup && !isSearchUserForm && isIndividualRoster\"\r\n class=\"ieeesa-add-user-form__org\"\r\n [label]=\"addUserRosterTexts?.label?.representingOrganization + '*'\"\r\n [ariaLabel]=\"addUserRosterTexts?.label?.ariaLabel?.representingOrganization\"\r\n [supportMessage]=\"addUserRosterTexts?.supportText?.representingOrganization\"\r\n [options]=\"organizations\"\r\n [selectedOptions]=\"selectedOrganizations\"\r\n (search)=\"getOrganizations($event)\"\r\n (selectionChange)=\"getSelectedOrganizations($event)\"\r\n (invalidFreeText)=\"onOrgInvalidFreeText($event)\"\r\n ></ieeesa-org-multi-select>\r\n</ieeesa-dynamic-form>\r\n","/* eslint-disable no-unused-vars */\r\nexport enum FilterType {\r\n ROLE = 'Role',\r\n MEMBER_TYPE = 'Member Type',\r\n CLASSIFICATION = 'Classification',\r\n}\r\n","/* eslint-disable no-unused-vars */\r\nexport enum TableColumnSchemaUserGroup {\r\n NAME = 'name',\r\n EMAIL = 'email',\r\n ROLE = 'role',\r\n EMPLOYER = 'employer',\r\n CLASSIFICATION = 'classification',\r\n ORGANIZATION = 'org_name',\r\n MEMBER_TYPE = 'memberType',\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { HttpClient, HttpParams, HttpResponse } from '@angular/common/http';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { BehaviorSubject, EMPTY, Subject, takeUntil } from 'rxjs';\r\nimport { map, catchError } from 'rxjs/operators';\r\nimport { saveAs } from 'file-saver';\r\nimport {\r\n ExportFormat,\r\n ExportFormatOption,\r\n PolicyConfirmationDialogComponent,\r\n PolicyConfirmationDialogData,\r\n ExportSuccessDialogComponent,\r\n ExportSuccessDialogData,\r\n} from '@ieeesa-npm/presentation';\r\nimport { AlertType } from '@ieeesa-npm/models';\r\nimport { AlertsService } from '@ieeesa-npm/utility';\r\nimport * as screenTexts from '../assets/constants.json';\r\n\r\n/**\r\n * RosterExportService owns the complete group roster export flow:\r\n * 1. Manages export popover open/close state\r\n * 2. Opens IEEE Data Access and Use Policy confirmation dialog\r\n * 3. Calls the backend roster export API (blob response)\r\n * 4. Triggers file download via File System Access API / file-saver\r\n * 5. Shows success/error dialogs and toasts\r\n *\r\n * The component only needs to:\r\n * - Subscribe to `isPopoverOpen$` for popover visibility\r\n * - Call `togglePopover()` on Export button click\r\n * - Call `onFormatSelected(format, groupId, groupName)` when user picks a format\r\n *\r\n * Follows the same pattern as MeetingExportService in the events-and-meetings library.\r\n * @export\r\n * @class RosterExportService\r\n */\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class RosterExportService {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private constants: any = screenTexts;\r\n private apiBaseUrl!: string;\r\n private destroy$ = new Subject<boolean>();\r\n\r\n /** Controls popover open/close state */\r\n private isPopoverOpenSubject$ = new BehaviorSubject<boolean>(false);\r\n isPopoverOpen$ = this.isPopoverOpenSubject$.asObservable();\r\n\r\n /** Controls in-progress state for button disable */\r\n private isExportInProgressSubject$ = new BehaviorSubject<boolean>(false);\r\n isExportInProgress$ = this.isExportInProgressSubject$.asObservable();\r\n\r\n /** Format options for the export popover */\r\n exportFormatOptions: ExportFormatOption[] = [\r\n {\r\n label: this.constants?.rosterExport?.formatOptions?.csv?.label ?? 'CSV',\r\n value: ExportFormat.CSV,\r\n ariaLabel: this.constants?.rosterExport?.formatOptions?.csv?.ariaLabel ?? 'Export roster as CSV',\r\n },\r\n {\r\n label: this.constants?.rosterExport?.formatOptions?.excel?.label ?? 'Excel',\r\n value: ExportFormat.EXCEL,\r\n ariaLabel: this.constants?.rosterExport?.formatOptions?.excel?.ariaLabel ?? 'Export roster as Excel',\r\n },\r\n ];\r\n\r\n /** Subtitle labels for the format selection cards */\r\n exportFormatSubtitles: Record<string, string> = {\r\n csv: this.constants?.rosterExport?.formatOptions?.csv?.subtitle ?? 'Comma separated file',\r\n xls: this.constants?.rosterExport?.formatOptions?.excel?.subtitle ?? 'Spreadsheet File',\r\n };\r\n\r\n /** Popover title */\r\n popoverTitle = this.constants?.rosterExport?.popoverTitle ?? 'Select the file format for roster export.';\r\n\r\n constructor(\r\n // eslint-disable-next-line no-unused-vars\r\n private httpClient: HttpClient,\r\n // eslint-disable-next-line no-unused-vars\r\n private dialog: MatDialog,\r\n // eslint-disable-next-line no-unused-vars\r\n private alertService: AlertsService\r\n ) {}\r\n\r\n /**\r\n * Sets the API base URL for roster export calls.\r\n * @param {string} url - Base URL (e.g., 'https://saappsapidev.ieee.org/v1')\r\n * @memberof RosterExportService\r\n */\r\n setApiBaseUrl(url: string): void {\r\n this.apiBaseUrl = url;\r\n }\r\n\r\n /**\r\n * Toggles the export format popover open/closed.\r\n * Called by the component on Export button click.\r\n * @memberof RosterExportService\r\n */\r\n togglePopover(): void {\r\n this.isPopoverOpenSubject$.next(!this.isPopoverOpenSubject$.getValue());\r\n }\r\n\r\n /**\r\n * Closes the export format popover.\r\n * @memberof RosterExportService\r\n */\r\n closePopover(): void {\r\n this.isPopoverOpenSubject$.next(false);\r\n }\r\n\r\n /**\r\n * Handles format selection from the export popover.\r\n * Closes popover, opens IEEE Policy dialog, on confirm triggers export.\r\n * This is the main entry point called by the component after user picks a format.\r\n * @param {ExportFormat} format - Selected format (CSV or XLS)\r\n * @param {string} groupId - The group ID to export the roster for\r\n * @param {string} groupName - The group name for filename generation\r\n * @memberof RosterExportService\r\n */\r\n onFormatSelected(format: ExportFormat, groupId: string, groupName: string): void {\r\n this.closePopover();\r\n\r\n const dialogData: PolicyConfirmationDialogData = {\r\n title: this.constants?.rosterExport?.policyDialog?.title ?? 'IEEE Data Access and Use Policy',\r\n bodyText: this.constants?.rosterExport?.policyDialog?.bodyText ?? 'The application is governed by IEEE\\'s data access and use policy. Data can only be used for its original intended purpose. Click \"Confirm\" to export the data into a CSV/Excel file or click \"Cancel\" to cancel the download.',\r\n policyUrl: this.constants?.rosterExport?.policyDialog?.policyUrl ?? 'https://www.ieee.org/ieee-data-access-and-use-policy.html',\r\n policyLinkText: this.constants?.rosterExport?.policyDialog?.policyLinkText ?? 'data access and use policy',\r\n cancelLabel: this.constants?.rosterExport?.policyDialog?.cancelLabel ?? 'Cancel',\r\n confirmLabel: this.constants?.rosterExport?.policyDialog?.confirmLabel ?? 'Confirm',\r\n };\r\n\r\n const dialogRef = this.dialog.open(PolicyConfirmationDialogComponent, {\r\n data: dialogData,\r\n width: '637px',\r\n panelClass: ['ieeesa-policy-dialog'],\r\n });\r\n\r\n dialogRef.afterClosed()\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe((confirmed: boolean) => {\r\n if (confirmed) {\r\n this.startExport(format, groupId, groupName);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Starts the export after the user confirms the policy dialog.\r\n *\r\n * When the File System Access API is available, the native Save picker is opened\r\n * HERE — synchronously within the confirm handler — while the user activation from\r\n * the confirm click is still valid. (Opening it later, inside the async HTTP\r\n * response callback, would exceed the activation window and the browser would\r\n * reject it with a SecurityError.) The obtained file handle is then passed to the\r\n * HTTP flow, which writes the downloaded bytes to it once the response arrives, so\r\n * the success dialog is still shown only AFTER the file is saved.\r\n *\r\n * If the user cancels the picker we abort before making the request. If the API is\r\n * unavailable (Firefox/Safari) we proceed without a handle and fall back to\r\n * `saveAs()` after the response.\r\n * @param {ExportFormat} format\r\n * @param {string} groupId\r\n * @param {string} groupName\r\n * @memberof RosterExportService\r\n */\r\n private startExport(format: ExportFormat, groupId: string, groupName: string): void {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n const showSaveFilePicker = (window as any).showSaveFilePicker;\r\n\r\n if (typeof showSaveFilePicker !== 'function') {\r\n // API unavailable: no handle; executeExport() will use the saveAs() fallback.\r\n this.executeExport(format, groupId, groupName, null);\r\n return;\r\n }\r\n\r\n const mimeType = format === ExportFormat.CSV\r\n ? 'text/csv'\r\n : 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';\r\n const extension = format === ExportFormat.CSV ? '.csv' : '.xlsx';\r\n const suggestedName = this.buildFilename(groupName, format);\r\n\r\n // Open the picker now, while the confirm-click activation is still valid.\r\n showSaveFilePicker({\r\n suggestedName,\r\n types: [\r\n {\r\n description: format === ExportFormat.CSV ? 'CSV File' : 'Excel File',\r\n accept: { [mimeType]: [extension] },\r\n },\r\n ],\r\n })\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n .then((handle: any) => {\r\n this.executeExport(format, groupId, groupName, handle);\r\n })\r\n .catch((error: unknown) => {\r\n // User cancelled the Save dialog — abort silently, no request made.\r\n if (error instanceof DOMException && error.name === 'AbortError') {\r\n return;\r\n }\r\n // Any other picker error: fall back to the saveAs() flow.\r\n this.executeExport(format, groupId, groupName, null);\r\n });\r\n }\r\n\r\n /**\r\n * Executes the roster export API call and writes the downloaded file.\r\n * Endpoint: GET /v1/groups/roster/export/{groupId}?format=csv|xlsx\r\n * When a pre-obtained file handle is provided (from the picker opened at confirm\r\n * time) the bytes are written to it; otherwise it falls back to `saveAs()`.\r\n * The success dialog is shown only after the file has been written.\r\n * @param {ExportFormat} format - The selected export format\r\n * @param {string} groupId - The group identifier\r\n * @param {string} groupName - The group name for filename\r\n * @param {FileSystemFileHandle | null} fileHandle - Handle from the Save picker, or null\r\n * @memberof RosterExportService\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private executeExport(format: ExportFormat, groupId: string, groupName: string, fileHandle: any): void {\r\n this.isExportInProgressSubject$.next(true);\r\n\r\n // Backend expects 'csv' or 'xlsx'. The ExportFormat.EXCEL enum value is\r\n // 'xls', so it must be mapped to 'xlsx' here — sending 'xls' is rejected\r\n // with error code 1079.\r\n const formatValue = format === ExportFormat.CSV ? 'csv' : 'xlsx';\r\n const params = new HttpParams().set('format', formatValue);\r\n const url = `${this.getExportApiUrl()}/groups/roster/export/${groupId}`;\r\n\r\n this.httpClient\r\n .get(url, {\r\n params,\r\n responseType: 'blob',\r\n observe: 'response',\r\n })\r\n .pipe(\r\n map((response: HttpResponse<Blob>) => {\r\n const filename = this.extractFilenameFromResponse(response, format, groupName);\r\n return { blob: response.body as Blob, filename };\r\n }),\r\n catchError(() => {\r\n this.isExportInProgressSubject$.next(false);\r\n this.alertService.showMessage({\r\n status: 'custom',\r\n message: this.constants?.rosterExport?.messages?.exportFailed ?? 'Failed to export roster. Please try again.',\r\n alertType: AlertType.ERROR,\r\n isCloseNeeded: true,\r\n });\r\n // Error is fully handled (alert shown). Complete the stream instead of\r\n // rethrowing, so the next-only subscribe does not report it as an\r\n // unhandled RxJS error.\r\n return EMPTY;\r\n }),\r\n takeUntil(this.destroy$)\r\n )\r\n .subscribe({\r\n next: (result) => {\r\n // Write to the pre-obtained handle (picker opened at confirm time) or fall\r\n // back to saveAs(). Success dialog only shows after the file is written.\r\n this.downloadFile(result.blob, result.filename, format, fileHandle)\r\n .then(({ saved }) => {\r\n this.isExportInProgressSubject$.next(false);\r\n if (saved) {\r\n this.showExportSuccessDialogAfterDownload(result.filename);\r\n }\r\n })\r\n .catch(() => {\r\n this.isExportInProgressSubject$.next(false);\r\n this.alertService.showMessage({\r\n status: 'custom',\r\n message: this.constants?.rosterExport?.messages?.exportFailed ?? 'Failed to export roster. Please try again.',\r\n alertType: AlertType.ERROR,\r\n isCloseNeeded: true,\r\n });\r\n });\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Shows the export success dialog after a successful file download.\r\n * @param {string} filename - The downloaded filename\r\n * @memberof RosterExportService\r\n */\r\n private showExportSuccessDialogAfterDownload(filename: string): void {\r\n const successMessage = this.constants?.rosterExport?.successDialog?.message ?? 'The file was downloaded successfully.';\r\n const closeLabel = this.constants?.rosterExport?.successDialog?.closeButton ?? 'Close';\r\n\r\n const dialogData: ExportSuccessDialogData = {\r\n message: successMessage,\r\n filename,\r\n closeLabel,\r\n };\r\n\r\n this.dialog.open(ExportSuccessDialogComponent, {\r\n data: dialogData,\r\n width: '467px',\r\n panelClass: ['ieeesa-export-success-dialog-panel'],\r\n autoFocus: false,\r\n });\r\n }\r\n\r\n /**\r\n * Returns the API base URL for roster export.\r\n * @return {string}\r\n * @memberof RosterExportService\r\n */\r\n private getExportApiUrl(): string {\r\n if (!this.apiBaseUrl) {\r\n throw new Error('RosterExportService apiBaseUrl is not set. Call setApiBaseUrl() before export.');\r\n }\r\n // apiBaseUrl already carries the version segment (e.g. '.../v1'), same as every\r\n // other GroupsService call which is built as `${apiBaseUrl}/groups/...`. So the\r\n // caller only appends '/groups/roster/export/{groupId}' — the version is NOT\r\n // repeated here. Strip a trailing slash to avoid a double slash before '/groups'.\r\n return this.apiBaseUrl.replace(/\\/+$/, '');\r\n }\r\n\r\n /**\r\n * Extracts filename from Content-Disposition header.\r\n * Falls back to buildFilename() if header is missing.\r\n * @param {HttpResponse<Blob>} response\r\n * @param {ExportFormat} format\r\n * @param {string} groupName\r\n * @return {string}\r\n * @memberof RosterExportService\r\n */\r\n private extractFilenameFromResponse(response: HttpResponse<Blob>, format: ExportFormat, groupName: string): string {\r\n const contentDisposition = response.headers.get('Content-Disposition');\r\n if (contentDisposition) {\r\n const filenameMatch = contentDisposition.match(/filename=\"?([^\"]+)\"?/);\r\n if (filenameMatch && filenameMatch[1]) {\r\n return filenameMatch[1].replace(/[/\\\\:*?\"<>|]/g, '_').substring(0, 200);\r\n }\r\n }\r\n return this.buildFilename(groupName, format);\r\n }\r\n\r\n /**\r\n * Builds a sanitized filename for the roster export.\r\n * Pattern: {SanitizedGroupName}_Roster.{extension}\r\n * @param {string} groupName\r\n * @param {ExportFormat} format\r\n * @return {string}\r\n * @memberof RosterExportService\r\n */\r\n buildFilename(groupName: string, format: ExportFormat): string {\r\n const sanitized = this.sanitizeGroupName(groupName);\r\n const extension = format === ExportFormat.CSV ? 'csv' : 'xlsx';\r\n return `${sanitized}_Roster.${extension}`;\r\n }\r\n\r\n /**\r\n * Sanitizes the group name for use in a filename.\r\n * Replaces non-alphanumeric characters (except hyphen/underscore) with underscore,\r\n * collapses consecutive underscores, and truncates to 200 chars.\r\n * @param {string} groupName\r\n * @return {string}\r\n * @memberof RosterExportService\r\n */\r\n sanitizeGroupName(groupName: string): string {\r\n if (!groupName) {\r\n return 'Unnamed_Group';\r\n }\r\n const sanitized = groupName\r\n .replace(/[^a-zA-Z0-9_-]/g, '_')\r\n .replace(/_+/g, '_')\r\n .substring(0, 200);\r\n\r\n return sanitized || 'Unnamed_Group';\r\n }\r\n\r\n /**\r\n * Writes the downloaded bytes to disk and resolves ONLY when the save has actually\r\n * completed.\r\n *\r\n * The Save picker is opened earlier (at policy-confirm time, while user activation\r\n * is still valid — see {@link startExport}); this method only writes to the handle\r\n * it produced. That keeps the \"success dialog after save\" ordering without hitting\r\n * the SecurityError that occurs when the picker is opened from this async callback.\r\n *\r\n * When no handle is provided (File System Access API unavailable, or the picker\r\n * errored), we fall back to FileSaver's `saveAs()`, which resolves immediately.\r\n * @param {Blob} blob - The file contents\r\n * @param {string} filename - The suggested filename (used by the saveAs fallback)\r\n * @param {ExportFormat} format - The selected export format (drives MIME type)\r\n * @param {FileSystemFileHandle | null} fileHandle - Handle from the Save picker, or null\r\n * @return {Promise<{ saved: boolean }>} Resolves with `saved: true` once written.\r\n * @memberof RosterExportService\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n async downloadFile(blob: Blob, filename: string, format: ExportFormat, fileHandle: any): Promise<{ saved: boolean }> {\r\n const mimeType = format === ExportFormat.CSV\r\n ? 'text/csv'\r\n : 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';\r\n const typedBlob = new Blob([blob], { type: mimeType });\r\n\r\n // No handle (API unavailable or picker errored) → standard download.\r\n if (!fileHandle) {\r\n saveAs(typedBlob, filename);\r\n return { saved: true };\r\n }\r\n\r\n // Write to the location the user already chose at confirm time.\r\n const writable = await fileHandle.createWritable();\r\n await writable.write(typedBlob);\r\n await writable.close();\r\n return { saved: true };\r\n }\r\n\r\n /**\r\n * Cleanup — call from the component's ngOnDestroy.\r\n * @memberof RosterExportService\r\n */\r\n destroy(): void {\r\n this.destroy$.next(true);\r\n // This service is providedIn: 'root' (singleton), so its state survives\r\n // navigation. Reset the UI-facing flags so a new roster component instance\r\n // does not inherit a stale-open popover or a permanently-disabled export\r\n // button if the user left the page mid-export or with the popover open.\r\n this.isPopoverOpenSubject$.next(false);\r\n this.isExportInProgressSubject$.next(false);\r\n // Signal current takeUntil subscriptions to unsubscribe, then re-create the\r\n // subject. This service is a providedIn: 'root' singleton whose destroy() is\r\n // called on every ViewRosterComponent teardown; completing destroy$ would\r\n // permanently close it, so later exports could never be torn down. A fresh\r\n // subject keeps the teardown channel usable across component lifecycles.\r\n this.destroy$.next(true);\r\n this.destroy$ = new Subject<boolean>();\r\n }\r\n}\r\n","import {\r\n AfterViewInit,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n ElementRef,\r\n HostListener,\r\n OnDestroy,\r\n OnInit,\r\n ViewChild,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { HttpErrorResponse } from '@angular/common/http';\r\nimport { Subject, takeUntil } from 'rxjs';\r\nimport { Sort } from '@angular/material/sort';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatMenuModule, MatMenuTrigger } from '@angular/material/menu';\r\nimport { MatDialog, MatDialogModule } from '@angular/material/dialog';\r\nimport {\r\n TableColumnSchema,\r\n TableColumnType,\r\n TableActions,\r\n TableColumnSortDirection,\r\n ChipsType,\r\n AlignType,\r\n ChipOption,\r\n CheckboxOption,\r\n FiltersAndOptions,\r\n DataTableComponent,\r\n ModalConfirmationComponent,\r\n ExportFormat,\r\n ExportFormatPopoverComponent,\r\n} from '@ieeesa-npm/presentation';\r\nimport {\r\n AlertsService,\r\n GlobalErrorHandlerService,\r\n} from '@ieeesa-npm/utility';\r\nimport { AlertType } from '@ieeesa-npm/models';\r\nimport { GroupsService } from '../../services/groups.service';\r\nimport {\r\n SearchUsersPayload,\r\n FilterUsersPayload,\r\n User,\r\n LoggedInUserInfo,\r\n} from '../../models/user.model';\r\nimport * as constants from '../../assets/constants.json';\r\nimport { DeleteUserGroupPayload } from '../../models/delete-user-group.model';\r\nimport { GroupFunctionType } from '../../models/group-function-type.model';\r\nimport { RosterFunctionType } from '../../models/roster-function-type.model';\r\nimport { GroupUserInfo } from '../../models/group-user-info.model';\r\nimport { GroupRosterType } from '../../models/roster-type.model';\r\nimport { FilterType } from '../../models/filter-type.model';\r\nimport { TableColumnSchemaUserGroup } from '../../models/table-column-schema-user-group.model';\r\nimport { PermissionType } from '../../models/permission-type.model';\r\nimport { RosterExportService } from '../../services/roster-export.service';\r\n\r\n/**\r\n * ViewRosterComponent implements the functionalities to add, edit, delete user to group roster, assign and modify roles(s) to the group users, and search user from roster.\r\n * @export\r\n * @class ViewRosterComponent\r\n * @implements {OnDestroy}\r\n */\r\n@Component({\r\n selector: 'ieeesa-view-roster',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n DataTableComponent,\r\n MatDialogModule,\r\n MatButtonModule,\r\n MatMenuModule,\r\n ExportFormatPopoverComponent,\r\n ],\r\n templateUrl: './view-roster.component.html',\r\n styleUrls: ['./view-roster.component.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class ViewRosterComponent implements AfterViewInit, OnDestroy, OnInit {\r\n destroy$: Subject<boolean> = new Subject<boolean>();\r\n /** Trigger for the \"Add\" menu (Add Manually / Bulk Import). */\r\n @ViewChild('addMenuTrigger') addMenuTrigger?: MatMenuTrigger;\r\n /** Invisible anchor element the \"Add\" menu attaches to. */\r\n @ViewChild('addMenuTrigger', { read: ElementRef })\r\n addMenuAnchor?: ElementRef<HTMLElement>;\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n constants: any = constants;\r\n viewRosterConstants = this.constants?.viewRoster;\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n dialogRef: any;\r\n alignmentType = AlignType;\r\n filters!: ChipOption[];\r\n columnSchema!: TableColumnSchema[];\r\n tableData!: User[];\r\n selectedRoleIds: string[] = [];\r\n selectedMemberTypeIds: string[] = [];\r\n selectedClassificationIds: string[] = [];\r\n searchPlaceholderText!: string;\r\n selectedRoles: FiltersAndOptions = {};\r\n selectedMemberTypes: FiltersAndOptions = {};\r\n selectedClassifications: FiltersAndOptions = {};\r\n roles: CheckboxOption[] = [];\r\n filterOptions: CheckboxOption[] = [];\r\n memberTypes: CheckboxOption[] = [];\r\n classifications: CheckboxOption[] = [];\r\n rosterActions: TableActions = {\r\n isSearchNeeded: true,\r\n isFilterNeeded: true,\r\n isAddNeeded: false,\r\n isDeleteNeeded: false,\r\n isEditNeeded: false,\r\n };\r\n defaultSortedColumn!: string;\r\n dataTableClassName!: string;\r\n hasClassification = false;\r\n searchTerm!: string;\r\n groupRosterType!: GroupRosterType;\r\n defaultColumnSortDirection = true;\r\n tableColumnsForIndividual =\r\n this.viewRosterConstants?.tableColumnsForIndividual;\r\n tableColumnsForSystemUsers =\r\n this.viewRosterConstants?.tableColumnsForSystemUsers;\r\n emptyFieldValueReplacedBy =\r\n this.viewRosterConstants?.emptyFieldValueReplacedBy;\r\n userInfo!: LoggedInUserInfo;\r\n constructor(\r\n // eslint-disable-next-line no-unused-vars\r\n public dialog: MatDialog,\r\n // eslint-disable-next-line no-unused-vars\r\n private groupService: GroupsService,\r\n // eslint-disable-next-line no-unused-vars\r\n private alertService: AlertsService,\r\n // eslint-disable-next-line no-unused-vars\r\n private cdr: ChangeDetectorRef,\r\n // eslint-disable-next-line no-unused-vars\r\n private globalErrorHandlerService: GlobalErrorHandlerService,\r\n // eslint-disable-next-line no-unused-vars\r\n public rosterExportService: RosterExportService\r\n ) {\r\n this.rosterActions.isAddNeeded = this.getManageRosterActionsPermission();\r\n this.rosterActions.isEditNeeded = this.getManageRosterActionsPermission();\r\n this.rosterActions.isDeleteNeeded = this.getManageRosterActionsPermission();\r\n }\r\n ngOnInit(): void {\r\n this.userInfo = this.groupService?.getUserInfo();\r\n this.rosterExportService.setApiBaseUrl(this.groupService?.apiBaseUrl);\r\n const groupType = this.groupService.getBusinessRuleOfSelectedGroup();\r\n this.hasClassification = groupType?.hasClassification ?? false;\r\n this.groupRosterType = groupType?.rosterType as GroupRosterType;\r\n if (!this.groupRosterType)\r\n this.alertService.showMessage({\r\n status: 'custom',\r\n message: this.constants?.errors?.ER1001,\r\n alertType: AlertType.WARNING,\r\n isCloseNeeded: true,\r\n });\r\n this.configureTableInfo();\r\n this.getGroupUsersAndInitializeTableView(\r\n this.defaultSortedColumn,\r\n this.defaultColumnSortDirection\r\n );\r\n }\r\n /**\r\n * Show add new user success message when canShowMessage is set true\r\n * @memberof ViewRosterComponent\r\n */\r\n ngAfterViewInit(): void {\r\n if (this.groupService?.canShowMessage) {\r\n this.groupService.canShowMessage = false;\r\n if (\r\n this.groupService?.rosterFunctionType ===\r\n RosterFunctionType?.ADD_USER_TO_ROSTER\r\n ) {\r\n this.showAlertMessage(\r\n this.constants?.addUserRoster?.message?.success?.submission,\r\n AlertType.SUCCESS\r\n );\r\n } else if (\r\n this.groupService?.rosterFunctionType ===\r\n RosterFunctionType?.EDIT_ROSTER_USER_ROLE\r\n ) {\r\n this.showAlertMessage(\r\n this.constants?.editUserRoles?.message?.success?.submission,\r\n AlertType.SUCCESS\r\n );\r\n }\r\n }\r\n const groupType = this.groupService.getBusinessRuleOfSelectedGroup();\r\n this.groupRosterType = groupType?.rosterType as GroupRosterType;\r\n }\r\n /**\r\n * Hides or shows roster add user, edit user and delete user actions based on user group permissions.\r\n * @return {boolean}\r\n * @memberof ViewRosterComponent\r\n */\r\n getManageRosterActionsPermission(): boolean {\r\n return (\r\n this.groupService.validateAccess(PermissionType.MANAGE_SYSTEM_USERS) ||\r\n this.groupService.validateAccess(PermissionType.MANAGE_GROUP_OFFICERS) ||\r\n this.groupService.validateAccess(PermissionType.MANAGE_GROUP_MEMBERS) ||\r\n this.groupService.validateAccess(PermissionType.MANAGE_ALL_ROSTERS)\r\n );\r\n }\r\n /**\r\n * Configure Table information based on group roster type\r\n * @memberof ViewRosterComponent\r\n */\r\n configureTableInfo(): void {\r\n if (this.groupRosterType === GroupRosterType.INDIVIDUAL) {\r\n this.dataTableClassName = 'ieeesa-individual-roster';\r\n this.searchPlaceholderText =\r\n this.viewRosterConstants?.searchPlaceholderIndividual;\r\n this.filters = [\r\n {\r\n id: FilterType.MEMBER_TYPE,\r\n name: FilterType.MEMBER_TYPE,\r\n checked: false,\r\n chipType: ChipsType.TOGGLE,\r\n },\r\n ];\r\n this.columnSchema = [\r\n {\r\n id: 1,\r\n columnDef: TableColumnType.SELECT,\r\n heading: '',\r\n columnType: TableColumnType.SELECT,\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n cellData: (element: any) => `${element.select}`,\r\n },\r\n {\r\n id: 2,\r\n columnDef: TableColumnSchemaUserGroup.NAME,\r\n heading: this.tableColumnsForIndividual?.name,\r\n columnType: TableColumnType.TEXT,\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n cellData: (element: any) => `${element.name}`,\r\n isSortableColumn: true,\r\n },\r\n {\r\n id: 3,\r\n columnDef: TableColumnSchemaUserGroup.EMPLOYER,\r\n heading: this.tableColumnsForIndividual?.employer,\r\n columnType: TableColumnType.TEXT,\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n cellData: (element: any) =>\r\n `${element.employer ?? this.emptyFieldValueReplacedBy}`,\r\n isSortableColumn: true,\r\n },\r\n {\r\n id: 4,\r\n columnDef: TableColumnSchemaUserGroup.EMAIL,\r\n heading: this.tableColumnsForIndividual?.email,\r\n columnType: TableColumnType.TEXT,\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n cellData: (element: any) =>\r\n `${element.email ?? this.emptyFieldValueReplacedBy}`,\r\n isSortableColumn: true,\r\n },\r\n {\r\n id: 5,\r\n columnDef: TableColumnSchemaUserGroup.MEMBER_TYPE,\r\n heading: this.tableColumnsForIndividual?.memberType,\r\n columnType: TableColumnType.TEXT,\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n cellData: (element: any) =>\r\n `${element.memberStatus ?? this.emptyFieldValueReplacedBy}`,\r\n },\r\n {\r\n id: 6,\r\n columnDef: TableColumnSchemaUserGroup.ORGANIZATION,\r\n heading: this.tableColumnsForIndividual?.organizationName,\r\n columnType: TableColumnType.TEXT,\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n cellData: (element: any) =>\r\n `${element.organization ?? this.emptyFieldValueReplacedBy}`,\r\n isSortableColumn: true,\r\n },\r\n {\r\n id: 8,\r\n columnDef: TableColumnSchemaUserGroup.ROLE,\r\n heading: this.tableColumnsForIndividual?.role,\r\n columnType: TableColumnType.TEXT,\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n cellData: (element: any) =>\r\n `${element.role ?? this.emptyFieldValueReplacedBy}`,\r\n },\r\n ];\r\n if (this.hasClassification) {\r\n this.getClassifications();\r\n this.columnSchema.splice(this.columnSchema.length - 1, 0, {\r\n id: 7,\r\n columnDef: TableColumnSchemaUserGroup.CLASSIFICATION,\r\n heading: this.tableColumnsForIndividual?.classification,\r\n columnType: TableColumnType.TEXT,\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n cellData: (element: any) =>\r\n `${element.classification ?? this.emptyFieldValueReplacedBy}`,\r\n isSortableColumn: true,\r\n });\r\n this.filters.push({\r\n id: FilterType.CLASSIFICATION,\r\n name: FilterType.CLASSIFICATION,\r\n checked: false,\r\n chipType: ChipsType.TOGGLE,\r\n });\r\n }\r\n } else if (this.groupRosterType === GroupRosterType.SYSTEM_USER) {\r\n this.dataTableClassName = 'ieeesa-system-users-roster';\r\n this.searchPlaceholderText =\r\n this.viewRosterConstants?.searchPlaceholderSystemUsers;\r\n this.filters = [\r\n {\r\n id: FilterType.ROLE,\r\n name: FilterType.ROLE,\r\n checked: false,\r\n chipType: ChipsType.TOGGLE,\r\n },\r\n ];\r\n this.columnSchema = [\r\n {\r\n id: 1,\r\n columnDef: TableColumnType.SELECT,\r\n heading: '',\r\n columnType: TableColumnType.SELECT,\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n cellData: (element: any) => `${element.select}`,\r\n },\r\n {\r\n id: 2,\r\n columnDef: TableColumnSchemaUserGroup.NAME,\r\n heading: this.tableColumnsForSystemUsers?.name,\r\n columnType: TableColumnType.TEXT,\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n cellData: (element: any) => `${element.name}`,\r\n isSortableColumn: true,\r\n },\r\n {\r\n id: 3,\r\n columnDef: TableColumnSchemaUserGroup.EMAIL,\r\n heading: this.tableColumnsForSystemUsers?.email,\r\n columnType: TableColumnType.TEXT,\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n cellData: (element: any) => `${element.email}`,\r\n isSortableColumn: true,\r\n },\r\n {\r\n id: 4,\r\n columnDef: TableColumnSchemaUserGroup.ROLE,\r\n heading: this.tableColumnsForSystemUsers?.role,\r\n columnType: TableColumnType.TEXT,\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n cellData: (element: any) =>\r\n `${element.role ?? this.emptyFieldValueReplacedBy}`,\r\n },\r\n ];\r\n }\r\n this.getRoles();\r\n this.defaultSortedColumn = this.columnSchema[1].columnDef;\r\n }\r\n /**\r\n * Gets the group users by calling getGroupUsers() from groupService and sets tableData to display the users in a grid.\r\n * @memberof ViewRosterComponent\r\n */\r\n getGroupUsersAndInitializeTableView(\r\n sortColumn: string,\r\n sortDirection: boolean\r\n ): void {\r\n this.groupService\r\n .getGroupUsers(\r\n this.groupService.getSelectedGroupInfo()?.groupId as string,\r\n sortColumn,\r\n sortDirection\r\n )\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (response) => {\r\n this.tableData =\r\n this.groupService.transformUserRolesNameAsString(response);\r\n this.cdr.detectChanges();\r\n },\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n error: (error: any) => {\r\n const errorCodes = error?.error?.body?.errorCodes;\r\n if (errorCodes?.includes('1026')) {\r\n this.tableData = [];\r\n this.cdr.detectChanges();\r\n } else this.handleErrors(error);\r\n },\r\n });\r\n }\r\n /**\r\n * Gets the groups based on the column name and sort direction.\r\n * @param {Sort} sort\r\n * @memberof ViewRosterComponent\r\n */\r\n onSortGroupUsers(sort: Sort) {\r\n this.defaultSortedColumn = sort.active;\r\n this.defaultColumnSortDirection =\r\n sort.direction === TableColumnSortDirection.ASCENDING;\r\n if (sort.direction === TableColumnSortDirection.NO_SORT) return;\r\n if (this.groupRosterType === GroupRosterType.SYSTEM_USER) {\r\n if (this.selectedRoleIds.length)\r\n this.onFilterGroupUsers([this.selectedRoles]);\r\n else\r\n this.getGroupUsersAndInitializeTableView(\r\n this.defaultSortedColumn,\r\n this.defaultColumnSortDirection\r\n );\r\n } else if (this.groupRosterType === GroupRosterType.INDIVIDUAL) {\r\n if (\r\n this.selectedClassificationIds.length ||\r\n this.selectedMemberTypeIds.length\r\n ) {\r\n this.onFilterGroupUsers([\r\n this.selectedClassifications,\r\n this.selectedMemberTypes,\r\n ]);\r\n } else\r\n this.getGroupUsersAndInitializeTableView(\r\n this.defaultSortedColumn,\r\n this.defaultColumnSortDirection\r\n );\r\n }\r\n }\r\n /**\r\n * Gets the selected group type roles by calling getGroupTypeRoles() from groupService and sets assign roles.\r\n * @memberof ViewRosterComponent\r\n */\r\n getRoles(): void {\r\n this.groupService\r\n .getGroupTypeRoles(\r\n this.groupService.getSelectedGroupInfo()?.groupType as string\r\n )\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (response) => {\r\n this.roles = response;\r\n if (this.groupRosterType === GroupRosterType.INDIVIDUAL) {\r\n this.getMemberTypes();\r\n }\r\n },\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n error: (error: any) => {\r\n this.handleErrors(error);\r\n },\r\n });\r\n }\r\n /**\r\n * Gets the classification by calling getClassifications() from groupService and sets classifications.\r\n * @memberof ViewUserRosterComponent\r\n */\r\n getClassifications(): void {\r\n this.groupService\r\n .getClassifications()\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (response) => {\r\n response?.body?.forEach((option) => {\r\n this.classifications?.push({\r\n id: option.classificationId,\r\n name: option.classificationName,\r\n checked: false,\r\n disabled: false,\r\n });\r\n });\r\n },\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n error: (error: any) => {\r\n this.handleErrors(error);\r\n },\r\n });\r\n }\r\n /**\r\n * Gets the member types by calling getMemberTypes() from groupService and sets member types.\r\n * @memberof ViewUserRosterComponent\r\n */\r\n getMemberTypes(): void {\r\n const memberTypes = this.groupService.getMemberTypes();\r\n memberTypes?.forEach((option) => {\r\n this.memberTypes?.push({\r\n id: option.roleId,\r\n name: option.roleName,\r\n checked: false,\r\n disabled: false,\r\n });\r\n });\r\n }\r\n /**\r\n * Sets the selected filter options for Member Type or Classification filter depends on the selection.\r\n * @param {ChipOption} option\r\n * @memberof ViewRosterComponent\r\n */\r\n setSelectedFilterOptions(option: ChipOption) {\r\n switch (option.id) {\r\n case FilterType.MEMBER_TYPE: {\r\n this.filterOptions = this.memberTypes;\r\n break;\r\n }\r\n case FilterType.CLASSIFICATION: {\r\n this.filterOptions = this.classifications;\r\n break;\r\n }\r\n case FilterType.ROLE: {\r\n this.filterOptions = this.roles;\r\n break;\r\n }\r\n default:\r\n break;\r\n }\r\n }\r\n /**\r\n * Gets the group users by calling searchGroupUsers() from groupService and sets tableData to display the users in a grid.\r\n * @param {string} searchTerm -searchTerm can be user name or email and user is searched based on the email or name.\r\n * @memberof ViewRosterComponent\r\n */\r\n onSearchGroupUsers(searchTerm: string): void {\r\n this.searchTerm = searchTerm?.trim();\r\n let payload!: SearchUsersPayload;\r\n switch (this.groupRosterType) {\r\n case GroupRosterType.SYSTEM_USER: {\r\n if (!this.searchTerm) {\r\n if (this.selectedRoleIds?.length === 0) {\r\n this.getGroupUsersAndInitializeTableView(\r\n this.defaultSortedColumn,\r\n this.defaultColumnSortDirection\r\n );\r\n return;\r\n } else if (this.selectedRoleIds?.length > 0) {\r\n this.onFilterGroupUsers([this.selectedRoles]);\r\n return;\r\n }\r\n }\r\n payload = {\r\n payload: {\r\n groupId: this.groupService.getSelectedGroupInfo()\r\n ?.groupId as string,\r\n searchByNameOrEmailOrRepOrg: this.searchTerm,\r\n filterByRoleClassificationMemberStatusIds: this.selectedRoleIds,\r\n sortColumn: this.defaultSortedColumn,\r\n ascendingOrder: this.defaultColumnSortDirection,\r\n },\r\n };\r\n break;\r\n }\r\n case GroupRosterType.INDIVIDUAL: {\r\n if (!this.searchTerm) {\r\n if (\r\n this.selectedMemberTypeIds?.length === 0 &&\r\n this.selectedClassificationIds?.length === 0\r\n ) {\r\n this.getGroupUsersAndInitializeTableView(\r\n this.defaultSortedColumn,\r\n this.defaultColumnSortDirection\r\n );\r\n return;\r\n } else if (\r\n this.selectedClassificationIds?.length > 0 ||\r\n this.selectedMemberTypeIds?.length > 0\r\n ) {\r\n this.onFilterGroupUsers([\r\n this.selectedClassifications,\r\n this.selectedMemberTypes,\r\n ]);\r\n return;\r\n }\r\n }\r\n payload = {\r\n payload: {\r\n groupId: this.groupService.getSelectedGroupInfo()\r\n ?.groupId as string,\r\n searchByNameOrEmailOrRepOrg: this.searchTerm,\r\n filterByRoleClassificationMemberStatusIds: [\r\n ...this.selectedClassificationIds,\r\n ...this.selectedMemberTypeIds,\r\n ],\r\n sortColumn: this.defaultSortedColumn,\r\n ascendingOrder: this.defaultColumnSortDirection,\r\n },\r\n };\r\n break;\r\n }\r\n default:\r\n break;\r\n }\r\n this.groupService\r\n .searchGroupUsers(payload)\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (response) => {\r\n this.tableData =\r\n this.groupService.transformUserRolesNameAsString(response);\r\n this.cdr.detectChanges();\r\n },\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n error: (error: any) => {\r\n const errorCodes = error?.error?.body?.errorCodes;\r\n const noUsersFoundErrorCodes = ['1029', '1030', '1031', '1032'];\r\n if (errorCodes && noUsersFoundErrorCodes.includes(errorCodes[0])) {\r\n this.tableData = [];\r\n this.cdr.detectChanges();\r\n } else this.handleErrors(error);\r\n },\r\n });\r\n }\r\n /**\r\n * Sets the selected options of filters and returns id of selected options\r\n * @param {FiltersAndOptions[]} selectedOptions\r\n * @param {FilterType} filterType\r\n * @param {FiltersAndOptions} selectedFilterOptions\r\n * @return {*}\r\n * @memberof ViewRosterComponent\r\n */\r\n getSelectedFilterOptionsAndIds(\r\n selectedOptions: FiltersAndOptions[],\r\n filterType: FilterType,\r\n selectedFilterOptions: FiltersAndOptions,\r\n selectedFilterIds: string[]\r\n ) {\r\n selectedOptions?.forEach((selectedOption) => {\r\n for (const [key, value] of Object.entries(selectedOption)) {\r\n if (key === filterType) {\r\n const selectedFilterOptionsList: CheckboxOption[] = [];\r\n value?.forEach((option) => {\r\n selectedFilterIds.push(option.id as string);\r\n selectedFilterOptionsList.push(option);\r\n });\r\n selectedFilterOptions[key] = selectedFilterOptionsList;\r\n }\r\n }\r\n });\r\n }\r\n /**\r\n * Gets the group users by calling getGroupUsersByRoles() from groupService and sets tableData to display the users in a grid.\r\n * @param {ChipOption[] | | CheckboxOption[]} roles\r\n * @memberof ViewRosterComponent\r\n */\r\n onFilterGroupUsers(selectedOptions: FiltersAndOptions[]): void {\r\n this.selectedRoleIds = [];\r\n this.selectedMemberTypeIds = [];\r\n this.selectedClassificationIds = [];\r\n this.selectedClassifications = {};\r\n this.selectedMemberTypes = {};\r\n let payload!: FilterUsersPayload;\r\n switch (this.groupRosterType) {\r\n case GroupRosterType.SYSTEM_USER: {\r\n this.getSelectedFilterOptionsAndIds(\r\n selectedOptions,\r\n FilterType.ROLE,\r\n this.selectedRoles,\r\n this.selectedRoleIds\r\n );\r\n if (selectedOptions?.length === 0 && !this.searchTerm) {\r\n this.getGroupUsersAndInitializeTableView(\r\n this.defaultSortedColumn,\r\n this.defaultColumnSortDirection\r\n );\r\n return;\r\n } else if (this.searchTerm) {\r\n this.onSearchGroupUsers(this.searchTerm);\r\n return;\r\n }\r\n payload = {\r\n payload: {\r\n groupId: this.groupService.getSelectedGroupInfo()\r\n ?.groupId as string,\r\n filterByRoleClassificationMemberStatusIds: this.selectedRoleIds,\r\n sortColumn: this.defaultSortedColumn,\r\n ascendingOrder: this.defaultColumnSortDirection,\r\n },\r\n };\r\n break;\r\n }\r\n case GroupRosterType.INDIVIDUAL: {\r\n this.getSelectedFilterOptionsAndIds(\r\n selectedOptions,\r\n FilterType.MEMBER_TYPE,\r\n this.selectedMemberTypes,\r\n this.selectedMemberTypeIds\r\n );\r\n this.getSelectedFilterOptionsAndIds(\r\n selectedOptions,\r\n FilterType.CLASSIFICATION,\r\n this.selectedClassifications,\r\n this.selectedClassificationIds\r\n );\r\n if (selectedOptions?.length === 0 && !this.searchTerm) {\r\n this.getGroupUsersAndInitializeTableView(\r\n this.defaultSortedColumn,\r\n this.defaultColumnSortDirection\r\n );\r\n return;\r\n } else if (this.searchTerm) {\r\n this.onSearchGroupUsers(this.searchTerm);\r\n return;\r\n }\r\n payload = {\r\n payload: {\r\n groupId: this.groupService.getSelectedGroupInfo()\r\n ?.groupId as string,\r\n filterByRoleClassificationMemberStatusIds: [\r\n ...this.selectedMemberTypeIds,\r\n ...this.selectedClassificationIds,\r\n ],\r\n sortColumn: this.defaultSortedColumn,\r\n ascendingOrder: this.defaultColumnSortDirection,\r\n },\r\n };\r\n break;\r\n }\r\n default:\r\n break;\r\n }\r\n this.groupService\r\n .getGroupUsersByRoles(payload)\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (response) => {\r\n this.tableData =\r\n this.groupService.transformUserRolesNameAsString(response);\r\n this.cdr.detectChanges();\r\n },\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, no-unused-vars, @typescript-eslint/no-unused-vars\r\n error: (error: any) => {\r\n const errorCodes = error?.error?.body?.errorCodes;\r\n if (errorCodes?.includes('1027')) {\r\n this.tableData = [];\r\n this.cdr.detectChanges();\r\n } else this.handleErrors(error);\r\n },\r\n });\r\n }\r\n /**\r\n * Handles the custom errors while retrieving groups users, roles, search users, filter user by roles.\r\n * @param {*} error\r\n * @memberof ViewRosterComponent\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n handleErrors(error: any): void {\r\n const errorCodes = error?.error?.body?.errorCodes;\r\n if (Array.isArray(errorCodes) && !error?.error?.status) {\r\n const errorMessage = this.groupService.parseErrorMessage(errorCodes);\r\n this.showAlertMessage(errorMessage, AlertType.ERROR);\r\n } else if (error && error instanceof HttpErrorResponse) {\r\n this.globalErrorHandlerService.handleError(error);\r\n }\r\n }\r\n /**\r\n * Opens the confirmation modal to get user confirmation to delete the users from the selected group.\r\n * @memberof ViewRosterComponent\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n openUserDeleteConfirmationModal(selectedUsers: any): void {\r\n const userIds = selectedUsers.map((user: User) => user?.userId);\r\n if (\r\n userIds.includes(this.userInfo?.userId) &&\r\n this.groupService.isAdminUser() &&\r\n this.groupService?.getBusinessRuleOfSelectedGroup()?.isAdmin\r\n ) {\r\n this.showAlertMessage(`${constants?.errors?.[1039]}`, AlertType.ERROR);\r\n } else {\r\n const selectedGroupInfo = this.groupService?.getSelectedGroupInfo();\r\n const confirmationInfo = constants?.deleteUsersGroup?.confirmationInfo;\r\n const deleteUserGroupModalOptions = {\r\n leftButtonLabel: confirmationInfo?.leftButtonLabel,\r\n rightButtonLabel: confirmationInfo?.rightButtonLabel,\r\n promptMessage: `${confirmationInfo?.promptMessagePart1} ${userIds?.length} ${confirmationInfo?.promptMessagePart2} ${selectedGroupInfo?.groupName}?`,\r\n actionButtonAlign: this.alignmentType?.MIDDLE,\r\n };\r\n this.dialogRef = this.dialog.open(ModalConfirmationComponent, {\r\n data: deleteUserGroupModalOptions,\r\n width: 'auto',\r\n autoFocus: 'dialog',\r\n ariaLabel: constants?.ariaLabel?.alert,\r\n });\r\n this.dialogRef\r\n .afterClosed()\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe((result: boolean) => {\r\n if (result) {\r\n this.deleteUsersGroup(\r\n selectedGroupInfo?.groupId as string,\r\n userIds\r\n );\r\n }\r\n });\r\n }\r\n }\r\n /**\r\n * Send API request to delete the selected user(s) from the selected group and handles the success and error response.\r\n * @memberof ViewRosterComponent\r\n */\r\n deleteUsersGroup(groupId: string, userIds: string[]) {\r\n const deleteUsersGroupTexts = constants?.deleteUsersGroup;\r\n const deleteUserGroupPayload: DeleteUserGroupPayload = {\r\n payload: {\r\n [groupId]: userIds,\r\n },\r\n };\r\n this.groupService\r\n .deleteUsersGroup(deleteUserGroupPayload)\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n next: (res: any) => {\r\n if (res?.status) {\r\n this.showAlertMessage(\r\n `${res.body} ${deleteUsersGroupTexts?.message?.success?.removed}`,\r\n AlertType.SUCCESS\r\n );\r\n this.getGroupUsersAndInitializeTableView(\r\n this.defaultSortedColumn,\r\n this.defaultColumnSortDirection\r\n );\r\n }\r\n },\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n error: (error: any) => {\r\n this.handleErrors(error);\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Sets selected user info and emits event openModalNotifier with EDIT_ROSTER_USER_ROLE value.\r\n * @param {GroupUserInfo[]} selectedUserInfo\r\n * @memberof ViewRosterComponent\r\n */\r\n onEditUserRoles(selectedUserInfo: GroupUserInfo[]): void {\r\n if (this.groupRosterType === GroupRosterType.INDIVIDUAL)\r\n this.groupService.setSelectedUserInfo({\r\n email: selectedUserInfo[0]?.email,\r\n name: selectedUserInfo[0]?.name,\r\n role: selectedUserInfo[0]?.role,\r\n userId: selectedUserInfo[0]?.userId,\r\n classification: selectedUserInfo[0]?.classification,\r\n organization: selectedUserInfo[0]?.organization,\r\n memberStatus: selectedUserInfo[0]?.memberStatus,\r\n canDelete: selectedUserInfo[0]?.canDelete,\r\n });\r\n else\r\n this.groupService.setSelectedUserInfo({\r\n email: selectedUserInfo[0]?.email,\r\n name: selectedUserInfo[0]?.name,\r\n role: selectedUserInfo[0]?.role,\r\n userId: selectedUserInfo[0]?.userId,\r\n canDelete: selectedUserInfo[0]?.canDelete,\r\n });\r\n\r\n this.groupService?.openModalNotifier?.next(\r\n GroupFunctionType.EDIT_ROSTER_USER_ROLE\r\n );\r\n }\r\n\r\n /**\r\n * Handles a click on the data-table's add-user icon. The add icon lives inside\r\n * the shared DataTableComponent and only emits (addRow), so we can't attach a\r\n * menu trigger to it directly. Instead we position an invisible, fixed-position\r\n * anchor at the add icon's on-screen location, then open the menu from that\r\n * anchor — so the menu appears directly beneath the add icon (matching the\r\n * Figma) rather than at the far-right export area.\r\n * @memberof ViewRosterComponent\r\n */\r\n onAddIconClick(): void {\r\n this.positionAddMenuAnchorAtAddIcon();\r\n this.addMenuTrigger?.openMenu();\r\n }\r\n\r\n /**\r\n * Closes the \"Add\" menu on window resize/scroll. The menu is anchored to a\r\n * point measured at open time, so a layout change (resize/scroll) would leave\r\n * it detached from the add icon; closing it avoids showing it in a stale spot.\r\n * The user can simply click the add icon again.\r\n * @memberof ViewRosterComponent\r\n */\r\n @HostListener('window:resize')\r\n @HostListener('window:scroll')\r\n closeAddMenuOnViewportChange(): void {\r\n if (this.addMenuTrigger?.menuOpen) {\r\n this.addMenuTrigger.closeMenu();\r\n }\r\n }\r\n\r\n /**\r\n * Places the add-menu anchor at the add-user icon's bottom edge. Locates the\r\n * icon by finding the add-user sprite (icon-add-user) within the roster's\r\n * data-table action row.\r\n * @memberof ViewRosterComponent\r\n */\r\n private positionAddMenuAnchorAtAddIcon(): void {\r\n const anchor = this.addMenuAnchor?.nativeElement;\r\n if (!anchor) {\r\n return;\r\n }\r\n const scope =\r\n (anchor.closest('.ieeesa-modal, .mat-mdc-dialog-container') as HTMLElement) ??\r\n document.body;\r\n // The add-user icon is the data-table action button with aria-label\r\n // \"Add user(s)\" (dataTable.buttons[2], id 3 → class ieeesa-icon-button__3).\r\n // Target it within the actions row specifically so we don't match a row-level\r\n // action button elsewhere in the table.\r\n const addIcon = (scope?.querySelector(\r\n '.ieeesa-data-table__actions .ieeesa-icon-button__3'\r\n ) ??\r\n scope?.querySelector(\r\n '.ieeesa-data-table__actions button[aria-label=\"Add user(s)\"]'\r\n )) as HTMLElement | null;\r\n if (!addIcon) {\r\n return;\r\n }\r\n const rect = addIcon.getBoundingClientRect();\r\n // Anchor is a zero-size point at the add icon's bottom-RIGHT corner. With the\r\n // menu's xPosition=\"before\" the menu's right edge aligns to this point, so the\r\n // menu opens leftward from the add icon (matching the Figma, where the icon\r\n // sits above the right portion of the popover).\r\n anchor.style.position = 'fixed';\r\n anchor.style.top = `${rect.bottom}px`;\r\n anchor.style.left = `${rect.right}px`;\r\n anchor.style.width = '0';\r\n anchor.style.height = '0';\r\n }\r\n\r\n /**\r\n * \"Add Manually\" menu option — opens the existing add-user-to-roster flow.\r\n * @memberof ViewRosterComponent\r\n */\r\n onAddManually(): void {\r\n this.groupService?.openModalNotifier?.next(\r\n GroupFunctionType.ADD_USER_TO_ROSTER\r\n );\r\n }\r\n\r\n /**\r\n * \"Bulk Import\" menu option — opens the bulk roster import dialog.\r\n * @memberof ViewRosterComponent\r\n */\r\n onImportRoster(): void {\r\n this.groupService?.openModalNotifier?.next(\r\n GroupFunctionType.IMPORT_ROSTER\r\n );\r\n }\r\n\r\n /**\r\n * \"View History\" action — opens the roster import-history popup.\r\n * @memberof ViewRosterComponent\r\n */\r\n onViewHistory(): void {\r\n this.groupService?.openModalNotifier?.next(\r\n GroupFunctionType.VIEW_IMPORT_HISTORY\r\n );\r\n }\r\n\r\n /**\r\n * Handles alerts for success, error, warning.\r\n * @param {(string | string[])} message -error or warning message\r\n * @param {AlertType} alertType\r\n * @return -returns nothing\r\n * @memberof ViewRosterComponent\r\n */\r\n showAlertMessage(message: string | string[], alertType: AlertType): void {\r\n this.alertService?.showMessage({\r\n status: 'custom',\r\n message: message,\r\n alertType: alertType,\r\n isCloseNeeded: true,\r\n });\r\n }\r\n\r\n /**\r\n * Toggles the export format popover — delegates to RosterExportService.\r\n * @memberof ViewRosterComponent\r\n */\r\n onExportClick(): void {\r\n this.rosterExportService.togglePopover();\r\n }\r\n\r\n /**\r\n * Handles export format selection — delegates to RosterExportService using the\r\n * currently selected group's id and name.\r\n * @param {ExportFormat} format\r\n * @memberof ViewRosterComponent\r\n */\r\n onExportFormatSelected(format: ExportFormat): void {\r\n const selectedGroupInfo = this.groupService?.getSelectedGroupInfo();\r\n const groupId = selectedGroupInfo?.groupId as string;\r\n // Without a group id the export URL would be malformed, so guard here\r\n // instead of firing a bad request.\r\n if (!groupId) {\r\n this.showAlertMessage(this.constants?.errors?.default, AlertType.ERROR);\r\n return;\r\n }\r\n const groupName = selectedGroupInfo?.groupName ?? '';\r\n this.rosterExportService.onFormatSelected(format, groupId, groupName);\r\n }\r\n\r\n /**\r\n * NgOnDestroy performs necessary cleanup tasks, such as unsubscribing from subscription when the component is being destroyed.\r\n * @memberof ViewRosterComponent\r\n */\r\n ngOnDestroy(): void {\r\n this.rosterExportService.destroy();\r\n this.destroy$.next(true);\r\n this.destroy$.unsubscribe();\r\n }\r\n}\r\n","<ieeesa-data-table\r\n [tableDataInfo]=\"tableData\"\r\n [columnSchemaInfo]=\"columnSchema\"\r\n [searchPlaceHolderText]=\"searchPlaceholderText\"\r\n [tableActions]=\"rosterActions\"\r\n [isCellTextOverflowEllipsis]=\"true\"\r\n [filters]=\"filters\"\r\n [className]=\"dataTableClassName\"\r\n [selectedFilterOptions]=\"filterOptions\"\r\n [defaultSortedColumn]=\"defaultSortedColumn\"\r\n (selectedFilter)=\"setSelectedFilterOptions($event)\"\r\n (removeFilteredOption)=\"onFilterGroupUsers($event)\"\r\n (filteredOptions)=\"onFilterGroupUsers($event)\"\r\n (searchedValue)=\"onSearchGroupUsers($event)\"\r\n (selectedRowToEdit)=\"onEditUserRoles($event)\"\r\n (selectedRowsToDelete)=\"openUserDeleteConfirmationModal($event)\"\r\n (sortChange)=\"onSortGroupUsers($event)\"\r\n (addRow)=\"onAddIconClick()\"\r\n>\r\n <!-- Export Roster action — projected into the data-table action row,\r\n inline after the delete icon. -->\r\n <div dataTableActions class=\"ieeesa-view-roster__export-wrapper\">\r\n <button\r\n mat-button\r\n class=\"mat-tertiary-button ieeesa-view-roster__export-btn\"\r\n type=\"button\"\r\n [attr.aria-label]=\"constants?.rosterExport?.ariaLabel\"\r\n [disabled]=\"!tableData?.length || (rosterExportService.isExportInProgress$ | async)\"\r\n (click)=\"onExportClick()\"\r\n >\r\n <svg class=\"ieeesa-view-roster__export-btn-icon\" aria-hidden=\"true\">\r\n <use xlink:href=\"assets/images/sprites/sprites.svg#icon-export\"></use>\r\n </svg>\r\n {{ constants?.rosterExport?.buttonLabel }}\r\n </button>\r\n\r\n <!-- View History action — opens the import-history popup (mock data). -->\r\n <button\r\n mat-button\r\n class=\"mat-tertiary-button ieeesa-view-roster__history-btn\"\r\n type=\"button\"\r\n [attr.aria-label]=\"constants?.rosterImportHistory?.ariaLabel\"\r\n (click)=\"onViewHistory()\"\r\n >\r\n {{ constants?.rosterImportHistory?.buttonLabel }}\r\n </button>\r\n\r\n <ieeesa-export-format-popover\r\n [formatOptions]=\"rosterExportService.exportFormatOptions\"\r\n [isOpen]=\"(rosterExportService.isPopoverOpen$ | async) ?? false\"\r\n [popoverTitle]=\"rosterExportService.popoverTitle\"\r\n [formatSubtitles]=\"rosterExportService.exportFormatSubtitles\"\r\n (formatSelected)=\"onExportFormatSelected($event)\"\r\n (closed)=\"rosterExportService.closePopover()\"\r\n ></ieeesa-export-format-popover>\r\n\r\n <!-- Invisible anchor for the \"Add\" menu (Add Manually / Bulk Import).\r\n The add-user icon lives inside the data-table and only emits (addRow);\r\n onAddIconClick() opens this menu programmatically, anchored here so it\r\n appears just under the add icon. -->\r\n <span\r\n #addMenuTrigger=\"matMenuTrigger\"\r\n [matMenuTriggerFor]=\"addMenu\"\r\n class=\"ieeesa-view-roster__add-menu-anchor\"\r\n aria-hidden=\"true\"\r\n ></span>\r\n <mat-menu\r\n #addMenu=\"matMenu\"\r\n class=\"ieeesa-view-roster__add-menu\"\r\n xPosition=\"before\"\r\n yPosition=\"below\"\r\n >\r\n <button\r\n mat-menu-item\r\n type=\"button\"\r\n class=\"ieeesa-view-roster__add-menu-item\"\r\n (click)=\"onAddManually()\"\r\n >\r\n <span class=\"ieeesa-view-roster__add-menu-item-title\">\r\n {{ constants?.addRosterMenu?.addManually?.title ?? 'Add Manually' }}\r\n </span>\r\n <span class=\"ieeesa-view-roster__add-menu-item-subtitle\">\r\n {{ constants?.addRosterMenu?.addManually?.subtitle ?? 'Search by email, fill details' }}\r\n </span>\r\n </button>\r\n <button\r\n mat-menu-item\r\n type=\"button\"\r\n class=\"ieeesa-view-roster__add-menu-item\"\r\n (click)=\"onImportRoster()\"\r\n >\r\n <span class=\"ieeesa-view-roster__add-menu-item-title\">\r\n {{ constants?.addRosterMenu?.bulkImport?.title ?? 'Bulk Import' }}\r\n </span>\r\n <span class=\"ieeesa-view-roster__add-menu-item-subtitle\">\r\n {{ constants?.addRosterMenu?.bulkImport?.subtitle ?? 'Upload CSV or XLS file' }}\r\n </span>\r\n </button>\r\n </mat-menu>\r\n </div>\r\n</ieeesa-data-table>\r\n","import { CommonModule } from '@angular/common';\r\nimport { HttpErrorResponse } from '@angular/common/http';\r\nimport {\r\n Component,\r\n Input,\r\n OnDestroy,\r\n ViewEncapsulation,\r\n OnInit,\r\n} from '@angular/core';\r\nimport { MatDialog, MatDialogModule } from '@angular/material/dialog';\r\nimport { CreateGroupComponent } from './components/create-group/create-group.component';\r\nimport { GroupsService } from './services/groups.service';\r\nimport { Subject, takeUntil } from 'rxjs';\r\nimport { GroupInfo } from './models/group-info.model';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport {\r\n SelectOption,\r\n IconButtonComponent,\r\n IconButton,\r\n AlignType,\r\n ModalConfirmationComponent,\r\n SelectComponent,\r\n LegendComponent,\r\n SearchType,\r\n SearchComponent,\r\n ModalComponent,\r\n BreakpointObserverService\r\n} from '@ieeesa-npm/presentation';\r\nimport { TreeViewComponent } from './components/tree-view/tree-view.component';\r\nimport { GroupType, GroupTypeConfigValue } from './models/group-types.model';\r\nimport {\r\n AlertsService,\r\n GlobalErrorHandlerService,\r\n} from '@ieeesa-npm/utility';\r\nimport { AlertType, ModalType } from '@ieeesa-npm/models';\r\nimport * as screenTexts from './assets/constants.json';\r\nimport { GroupFunctionType } from './models/group-function-type.model';\r\nimport { RosterFunctionType } from './models/roster-function-type.model';\r\nimport { GetGroupsPayload } from './models/view-group.model';\r\nimport { DeleteGroupPayload } from './models/delete-group.model';\r\nimport { AddUserRosterComponent } from './components/add-user-roster/add-user-roster.component';\r\nimport { ViewRosterComponent } from './components/view-roster/view-roster.component';\r\nimport { RosterImportComponent } from './components/roster-import/roster-import.component';\r\nimport { RosterImportHistoryComponent } from './components/roster-import-history/roster-import-history.component';\r\nimport { InterestFormManagementComponent } from './components/interest-form-management/interest-form-management.component';\r\nimport { EditGroupAndParentInfo } from './models/edit-group.model';\r\nimport { EditUserRolesComponent } from './components/edit-user-roles/edit-user-roles.component';\r\nimport { UserPermissionsService } from './services/user-permissions.service';\r\nimport {\r\n GroupPermission,\r\n UserPermission,\r\n} from './models/group-permissions.model';\r\nimport { PermissionType } from './models/permission-type.model';\r\nimport { GroupPermissionsMapService } from './services/group-permissions-map-service';\r\nimport { LoggedInUserInfo } from './models/user.model';\r\n\r\n/**\r\n * Groups component is a wrapper or container component for groups management reusable component and in this component integrates all group management functionalities and this will be entry component for managing groups when it is consumed in other applications.\r\n * @class GroupsComponent\r\n */\r\n@Component({\r\n // eslint-disable-next-line @angular-eslint/component-selector\r\n selector: 'ieeesa-groups',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n MatDialogModule,\r\n MatButtonModule,\r\n SearchComponent,\r\n SelectComponent,\r\n TreeViewComponent,\r\n LegendComponent,\r\n IconButtonComponent,\r\n ],\r\n templateUrl: './groups.component.html',\r\n styleUrls: ['./groups.component.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n providers: [AlertsService],\r\n})\r\nexport class GroupsComponent implements OnInit, OnDestroy {\r\n destroy$: Subject<boolean> = new Subject<boolean>();\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n dialogRef: any;\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n constants: any = screenTexts;\r\n viewGroupTexts = this.constants?.viewGroups;\r\n createGroupText = this.constants?.createGroup;\r\n editGroupTexts = this.constants?.editGroup;\r\n editUserRolesTexts = this.constants?.editUserRoles;\r\n addUserRosterTexts = this.constants?.addUserRoster;\r\n isGroupSearchActive = false;\r\n isGroupFilterActive = false;\r\n isGroupSearchOrFilterActive = false;\r\n isMobileView = false;\r\n childGroupsInfo!: GroupInfo[];\r\n selectedGroupType!: SelectOption;\r\n parentGroupsInfo!: GroupInfo[];\r\n selectGroupOptions!: SelectOption[];\r\n deletedGroupId!: string;\r\n deleteGroupName!: string;\r\n groupTypes!: GroupTypeConfigValue;\r\n searchPlaceHolderText: string = this.viewGroupTexts?.placeholderText?.search;\r\n filterPlaceHolderText: string = this.viewGroupTexts?.placeholderText?.filter;\r\n createGroupIcon: IconButton = {\r\n id: 1,\r\n ariaLabel: this.viewGroupTexts?.ariaLabel.add,\r\n iconURL: this.viewGroupTexts?.createGroupIcon,\r\n toolTip: this.viewGroupTexts?.ariaLabel.add,\r\n };\r\n filterGroupIcon: IconButton = {\r\n id: 2,\r\n ariaLabel: this.viewGroupTexts?.ariaLabel.filter,\r\n iconURL: this.viewGroupTexts?.filterGroupIcon,\r\n toolTip: this.viewGroupTexts?.ariaLabel.filter,\r\n };\r\n searchGroupIcon: IconButton = {\r\n id: 3,\r\n ariaLabel: this.viewGroupTexts?.ariaLabel.search,\r\n iconURL: this.viewGroupTexts?.searchGroupIcon,\r\n toolTip: this.viewGroupTexts?.ariaLabel.search,\r\n };\r\n getGroupsPayload: GetGroupsPayload = { groupId: '', groupTypeId: '' };\r\n @Input() groupsPageInfo: {\r\n groupsTitle: string;\r\n groupsDescription: string;\r\n } = {\r\n groupsTitle: this.viewGroupTexts?.groupsTitle,\r\n groupsDescription: this.viewGroupTexts?.groupsDescription,\r\n };\r\n @Input() applicationId!: string;\r\n @Input() apiBaseURL!: string;\r\n @Input() userPermissions!: UserPermission[];\r\n @Input() userInfo!: LoggedInUserInfo;\r\n permissionType = PermissionType;\r\n functionType!: GroupFunctionType;\r\n alignmentType = AlignType;\r\n canReopenViewRosterModal = false;\r\n searchType: SearchType = SearchType.ON_CLICK;\r\n minCharacterToSearch = 3;\r\n trimmedSearchTerm = '';\r\n userGroupPermissions!: GroupPermission[];\r\n supportMessage!: string;\r\n constructor(\r\n // eslint-disable-next-line no-unused-vars\r\n public dialog: MatDialog,\r\n // eslint-disable-next-line no-unused-vars\r\n private groupsService: GroupsService,\r\n // eslint-disable-next-line no-unused-vars\r\n public alertService: AlertsService,\r\n // eslint-disable-next-line no-unused-vars\r\n private breakpointObserverService: BreakpointObserverService,\r\n // eslint-disable-next-line no-unused-vars\r\n public globalErrorHandlerService: GlobalErrorHandlerService,\r\n // eslint-disable-next-line no-unused-vars\r\n private userPermissionsService: UserPermissionsService,\r\n // eslint-disable-next-line no-unused-vars\r\n private groupPermissionsService: GroupPermissionsMapService\r\n ) {\r\n this.breakpointObserverService\r\n .getBreakpoint()\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe((result: { matches: boolean }) => {\r\n this.isMobileView = result?.matches;\r\n });\r\n this.groupsService?.openModalNotifier?.next(GroupFunctionType.VIEW_ROSTER);\r\n }\r\n /**\r\n * Initialize the groups component.\r\n * @return -returns nothing\r\n * @memberof GroupsComponent\r\n */\r\n ngOnInit(): void {\r\n this.groupsService?.setUserInfo(this.userInfo);\r\n this.supportMessage =\r\n this.viewGroupTexts?.minCharRequiredToSearch1 +\r\n ' ' +\r\n this.minCharacterToSearch +\r\n ' ' +\r\n this.viewGroupTexts?.minCharRequiredToSearch2;\r\n this.userGroupPermissions =\r\n this.userPermissionsService.filterUserGroupPermissions(\r\n this.userPermissions,\r\n this.groupPermissionsService?.getGlobalGroupPermissions()\r\n );\r\n this.groupsService.setUserGroupPermissions(this.userGroupPermissions);\r\n this.groupsService?.setAppConfig(this.apiBaseURL, this.userPermissions);\r\n this.getGroupTypes();\r\n this.groupsService?.openModalNotifier\r\n ?.pipe(takeUntil(this.destroy$))\r\n ?.subscribe((response) => {\r\n this.dialogRef?.close();\r\n const selectedGroupInfo = this.groupsService.getSelectedGroupInfo();\r\n if (response === GroupFunctionType.EDIT_ROSTER_USER_ROLE) {\r\n this.openEditUserRolesModal(selectedGroupInfo as GroupInfo);\r\n }\r\n if (response === GroupFunctionType.ADD_USER_TO_ROSTER) {\r\n this.openAddUserRosterModal(selectedGroupInfo as GroupInfo);\r\n }\r\n if (response === GroupFunctionType.IMPORT_ROSTER) {\r\n this.openRosterImportModal(selectedGroupInfo as GroupInfo);\r\n }\r\n if (response === GroupFunctionType.VIEW_IMPORT_HISTORY) {\r\n this.openRosterImportHistoryModal(selectedGroupInfo as GroupInfo);\r\n }\r\n });\r\n }\r\n /**\r\n * Validates permission based access for provided feature.\r\n * @param {PermissionType} permissionType\r\n * @return {boolean}\r\n * @memberof GroupsComponent\r\n */\r\n validateAccess(permissionType: PermissionType): boolean {\r\n return this.userPermissionsService.validateAccessPermission(\r\n permissionType,\r\n this.userGroupPermissions\r\n );\r\n }\r\n /**\r\n * Sets the dialog options for create group modal and calls openModal method.\r\n * @param {GroupInfo} [parentGroupInfo] -An optional parameter. Parent group info to be passed for create child group.\r\n * @return -returns nothing\r\n * @memberof GroupsComponent\r\n */\r\n openCreateGroupForm(parentGroupInfo?: GroupInfo): void {\r\n const groupTypes = this.groupsService.getLoadedGroupTypes();\r\n if (groupTypes && groupTypes?.length > 0) {\r\n this.groupsService?.setSelectedGroupInfo(parentGroupInfo ?? undefined);\r\n this.groupsService?.setGroupFunctionType(GroupFunctionType?.CREATE);\r\n const dialogOptions = {\r\n heading: this.createGroupText?.heading,\r\n isCloseNeeded: true,\r\n componentReference: CreateGroupComponent,\r\n modalType: ModalType.FORM,\r\n };\r\n this.functionType = GroupFunctionType?.CREATE;\r\n this.openModal(dialogOptions, 'ieeesa-create-group', parentGroupInfo);\r\n } else\r\n this.showAlertMessage(AlertType.ERROR, this.constants?.errors?.['1010']);\r\n }\r\n /**\r\n * Sets the dialog options for edit group modal and calls openModal method.\r\n * @param {EditGroupAndParentInfo} editGroupInfo -editing group and its parent group info to be passed for populating edit group form fields.\r\n * @return -returns nothing\r\n * @memberof GroupsComponent\r\n */\r\n openEditGroupForm(editGroupInfo: EditGroupAndParentInfo): void {\r\n this.groupsService?.setSelectedGroupInfo(\r\n editGroupInfo?.groupInfo,\r\n editGroupInfo?.parentGroupInfo\r\n );\r\n this.groupsService?.setGroupFunctionType(GroupFunctionType?.EDIT);\r\n const dialogOptions = {\r\n heading: editGroupInfo?.groupInfo?.groupName,\r\n isCloseNeeded: true,\r\n componentReference: CreateGroupComponent,\r\n modalType: ModalType.FORM,\r\n };\r\n this.functionType = GroupFunctionType?.EDIT;\r\n this.openModal(dialogOptions, 'ieeesa-edit-group', editGroupInfo);\r\n }\r\n /**\r\n * Sets the dialog options for edit user roles and calls openModal method.\r\n * @memberof GroupsComponent\r\n */\r\n openEditUserRolesModal(selectedGroupInfo: GroupInfo): void {\r\n const selectedUserInfo = this.groupsService?.getSelectedUserInfo();\r\n const dialogOptions = {\r\n heading: selectedGroupInfo?.groupName,\r\n subHeading: selectedUserInfo?.name,\r\n isCloseNeeded: true,\r\n componentReference: EditUserRolesComponent,\r\n modalType: ModalType.FORM,\r\n };\r\n this.functionType = GroupFunctionType.EDIT_ROSTER_USER_ROLE;\r\n this.groupsService?.setGroupFunctionType(this.functionType);\r\n this.openModal(dialogOptions, 'ieeesa-edit-user-roles');\r\n }\r\n /**\r\n * Sets the dialog options for add users modal and calls openModal method.\r\n * @memberof GroupsComponent\r\n */\r\n openAddUserRosterModal(selectedGroupInfo: GroupInfo): void {\r\n const dialogOptions = {\r\n heading: selectedGroupInfo?.groupName,\r\n subHeading: this.addUserRosterTexts?.heading,\r\n isCloseNeeded: true,\r\n componentReference: AddUserRosterComponent,\r\n modalType: ModalType.FORM,\r\n };\r\n this.functionType = GroupFunctionType.ADD_USER_TO_ROSTER;\r\n this.groupsService?.setGroupFunctionType(this.functionType);\r\n this.openModal(dialogOptions, 'ieeesa-add-user-roster');\r\n }\r\n /**\r\n * Sets the dialog options for the bulk roster import modal and opens it.\r\n * Passes the selected group's id/name to the dynamically-instantiated\r\n * RosterImportComponent via the ModalComponent dynamic-input pattern.\r\n * @param {GroupInfo} selectedGroupInfo\r\n * @memberof GroupsComponent\r\n */\r\n openRosterImportModal(selectedGroupInfo: GroupInfo): void {\r\n const dialogOptions = {\r\n // Modal title row: \"← Back to Rosters / Import Roster\" + X close.\r\n // The \"Bulk Import Participants\" band + Import Roster action button are\r\n // rendered by RosterImportComponent itself (per the Figma).\r\n backButtonLabel: this.constants?.rosterImport?.backToRosters,\r\n heading: this.constants?.rosterImport?.heading,\r\n headingClass: 'ieeesa-modal-title__heading--breadcrumb',\r\n isCloseNeeded: true,\r\n componentReference: RosterImportComponent,\r\n modalType: ModalType.FORM,\r\n data2DynamicComponent: {\r\n groupId: selectedGroupInfo?.groupId,\r\n groupName: selectedGroupInfo?.groupName,\r\n },\r\n dataInputName: 'componentData',\r\n };\r\n this.functionType = GroupFunctionType.IMPORT_ROSTER;\r\n this.groupsService?.setGroupFunctionType(this.functionType);\r\n this.openModal(dialogOptions, 'ieeesa-roster-import-dialog');\r\n }\r\n /**\r\n * Sets the dialog options for the roster import-history (\"View History\")\r\n * modal and opens it. Passes the selected group's id/name to the\r\n * dynamically-instantiated RosterImportHistoryComponent via the\r\n * ModalComponent dynamic-input pattern.\r\n * @param {GroupInfo} selectedGroupInfo\r\n * @memberof GroupsComponent\r\n */\r\n openRosterImportHistoryModal(selectedGroupInfo: GroupInfo): void {\r\n const dialogOptions = {\r\n // Modal title row: \"← Back to Rosters / View History\" + X close.\r\n backButtonLabel: this.constants?.rosterImportHistory?.backToRosters,\r\n heading: this.constants?.rosterImportHistory?.heading,\r\n headingClass: 'ieeesa-modal-title__heading--breadcrumb',\r\n isCloseNeeded: true,\r\n componentReference: RosterImportHistoryComponent,\r\n modalType: ModalType.FORM,\r\n data2DynamicComponent: {\r\n groupId: selectedGroupInfo?.groupId,\r\n groupName: selectedGroupInfo?.groupName,\r\n },\r\n dataInputName: 'componentData',\r\n };\r\n this.functionType = GroupFunctionType.VIEW_IMPORT_HISTORY;\r\n this.groupsService?.setGroupFunctionType(this.functionType);\r\n this.openModal(dialogOptions, 'ieeesa-roster-import-history-dialog');\r\n }\r\n /**\r\n * Sets the dialog options for users modal and calls openModal method.\r\n * @param {GroupInfo} group\r\n * @memberof GroupsComponent\r\n */\r\n viewRoster(group: GroupInfo): void {\r\n const dialogOptions = {\r\n heading: group?.groupName,\r\n isCloseNeeded: true,\r\n componentReference: ViewRosterComponent,\r\n modalType: ModalType.FORM_AND_CONTENT,\r\n };\r\n this.groupsService.setSelectedGroupInfo(group);\r\n this.functionType = GroupFunctionType.VIEW_ROSTER;\r\n this.groupsService?.setGroupFunctionType(GroupFunctionType?.EDIT);\r\n this.openModal(dialogOptions, 'ieeesa-view-roster');\r\n }\r\n /**\r\n * Opens the Roster Interests dialog for the selected group (SP3M-317). The\r\n * dialog hosts the \"Interested Rosters\" and \"Interest Form\" tabs and receives\r\n * the group via the dialog data.\r\n * @param {GroupInfo} group\r\n * @memberof GroupsComponent\r\n */\r\n openRosterInterests(group: GroupInfo): void {\r\n this.groupsService.setSelectedGroupInfo(group);\r\n this.dialog?.open(InterestFormManagementComponent, {\r\n data: group,\r\n width: '1100px',\r\n maxWidth: '92vw',\r\n maxHeight: '90vh',\r\n panelClass: ['ieeesa-modal-dialog', 'ieeesa-roster-interests'],\r\n ariaModal: true,\r\n });\r\n }\r\n /**\r\n * Opens modal component with for received params and handles form submission success and errors.\r\n * @param {*} dialogOptions\r\n * @param {string} [className]\r\n * @return -returns nothing\r\n * @memberof GroupsComponent\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-inferrable-types, no-unused-vars\r\n openModal(\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n dialogOptions: any,\r\n className?: string,\r\n groupInfo?: GroupInfo | EditGroupAndParentInfo\r\n ): void {\r\n className = className ?? '';\r\n this.dialogRef = this.dialog?.open(ModalComponent, {\r\n data: dialogOptions,\r\n width:\r\n this.functionType === GroupFunctionType.VIEW_ROSTER ||\r\n this.functionType === GroupFunctionType.EDIT_ROSTER_USER_ROLE ||\r\n this.functionType === GroupFunctionType.ADD_USER_TO_ROSTER ||\r\n this.functionType === GroupFunctionType.IMPORT_ROSTER ||\r\n this.functionType === GroupFunctionType.VIEW_IMPORT_HISTORY ||\r\n this.functionType === GroupFunctionType.CREATE ||\r\n this.functionType === GroupFunctionType.EDIT\r\n ? ''\r\n : 'auto',\r\n panelClass: ['ieeesa-modal-dialog', className],\r\n ariaModal: true,\r\n });\r\n // Optional modal back button (e.g. roster import \"Back to Rosters\") — close\r\n // and return to the roster preview.\r\n this.dialogRef?.componentInstance?.backClick\r\n ?.pipe(takeUntil(this.destroy$))\r\n .subscribe(() => {\r\n // Clear the reopen flag before closing so the afterClosed handler (which\r\n // reopens the roster when canReopenViewRosterModal is true) does not fire\r\n // a second roster dialog — this handler performs the single reopen.\r\n this.canReopenViewRosterModal = false;\r\n this.dialogRef?.close();\r\n if (\r\n this.functionType === GroupFunctionType.IMPORT_ROSTER ||\r\n this.functionType === GroupFunctionType.VIEW_IMPORT_HISTORY\r\n ) {\r\n this.viewRoster(this.groupsService.selectedGroupInfo as GroupInfo);\r\n }\r\n });\r\n this.dialogRef?.componentInstance?.submitFormResponse\r\n .pipe(takeUntil(this.destroy$))\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, no-unused-vars\r\n .subscribe((result: any) => {\r\n this.dialogRef?.close();\r\n switch (this.functionType) {\r\n case GroupFunctionType?.CREATE: {\r\n this.showAlertMessage(\r\n AlertType?.SUCCESS,\r\n this.createGroupText?.message?.success?.submission\r\n );\r\n const createGroupInfo = groupInfo as GroupInfo;\r\n if (this.trimmedSearchTerm)\r\n this.onGroupSearchClick(this.trimmedSearchTerm);\r\n else if (this.selectedGroupType.id !== '')\r\n this.onGroupTypeFiltered(this.selectedGroupType);\r\n else if (createGroupInfo) this.getGroups(createGroupInfo);\r\n else this.getGroups();\r\n break;\r\n }\r\n case GroupFunctionType?.EDIT: {\r\n this.showAlertMessage(\r\n AlertType?.SUCCESS,\r\n this.editGroupTexts?.message?.success?.submission\r\n );\r\n const isParentGroupChanged =\r\n this.groupsService.getParentGroupChangeStatus();\r\n const editGroupInfo = groupInfo as EditGroupAndParentInfo;\r\n if (this.trimmedSearchTerm)\r\n this.onGroupSearchClick(this.trimmedSearchTerm);\r\n else if (this.selectedGroupType.id !== '')\r\n this.onGroupTypeFiltered(this.selectedGroupType);\r\n else if (editGroupInfo?.parentGroupInfo?.groupId === undefined) {\r\n this.getGroups();\r\n } else if (isParentGroupChanged) {\r\n this.groupsService.setGroupFunctionType(\r\n GroupFunctionType.REASSIGN_PARENT_GROUP\r\n );\r\n this.groupsService.setParentGroupChangeStatus(false);\r\n this.getGroups();\r\n } else this.getGroups(editGroupInfo.parentGroupInfo);\r\n break;\r\n }\r\n case GroupFunctionType?.EDIT_ROSTER_USER_ROLE: {\r\n this.groupsService.canShowMessage = true;\r\n this.groupsService.setRosterFunctionType(\r\n RosterFunctionType.EDIT_ROSTER_USER_ROLE\r\n );\r\n break;\r\n }\r\n case GroupFunctionType?.ADD_USER_TO_ROSTER: {\r\n this.groupsService.canShowMessage = true;\r\n this.groupsService.setRosterFunctionType(\r\n RosterFunctionType.ADD_USER_TO_ROSTER\r\n );\r\n break;\r\n }\r\n case GroupFunctionType?.IMPORT_ROSTER: {\r\n // Re-open the roster so the newly imported members are shown.\r\n this.canReopenViewRosterModal = false;\r\n this.viewRoster(\r\n this.groupsService.selectedGroupInfo as GroupInfo\r\n );\r\n break;\r\n }\r\n default:\r\n break;\r\n }\r\n });\r\n this.dialogRef?.componentInstance?.formCancel\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe(() => {\r\n this.dialogRef?.close();\r\n if (\r\n this.functionType === GroupFunctionType.ADD_USER_TO_ROSTER ||\r\n this.functionType === GroupFunctionType.EDIT_ROSTER_USER_ROLE ||\r\n this.functionType === GroupFunctionType.IMPORT_ROSTER ||\r\n this.functionType === GroupFunctionType.VIEW_IMPORT_HISTORY\r\n ) {\r\n this.canReopenViewRosterModal = false;\r\n this.viewRoster(this.groupsService.selectedGroupInfo as GroupInfo);\r\n }\r\n });\r\n this.dialogRef\r\n ?.afterOpened()\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe(() => {\r\n if (\r\n this.functionType === GroupFunctionType.ADD_USER_TO_ROSTER ||\r\n this.functionType === GroupFunctionType.EDIT_ROSTER_USER_ROLE ||\r\n this.functionType === GroupFunctionType.IMPORT_ROSTER ||\r\n this.functionType === GroupFunctionType.VIEW_IMPORT_HISTORY\r\n ) {\r\n this.canReopenViewRosterModal = true;\r\n }\r\n });\r\n this.dialogRef\r\n ?.afterClosed()\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe(() => {\r\n if (this.canReopenViewRosterModal) {\r\n this.canReopenViewRosterModal = false;\r\n this.viewRoster(this.groupsService.selectedGroupInfo as GroupInfo);\r\n }\r\n });\r\n }\r\n /**\r\n * Opens the confirmation modal to get user confirmation to delete the selected group.\r\n * @memberof GroupComponent\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n openDeleteConfirmationModal(groupInfo: GroupInfo): void {\r\n const confirmationInfo = screenTexts?.deleteGroup?.confirmationInfo;\r\n const deleteGroupModalOptions = {\r\n leftButtonLabel: confirmationInfo?.leftButtonLabel,\r\n rightButtonLabel: confirmationInfo?.rightButtonLabel,\r\n promptMessage:\r\n confirmationInfo?.promptMessage + groupInfo?.groupName + '?',\r\n actionButtonAlign: this.alignmentType?.MIDDLE,\r\n };\r\n this.dialogRef = this.dialog?.open(ModalConfirmationComponent, {\r\n data: deleteGroupModalOptions,\r\n width: 'auto',\r\n autoFocus: 'dialog',\r\n ariaLabel: this.constants?.ariaLabel?.alert,\r\n });\r\n this.dialogRef\r\n .afterClosed()\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe((result: boolean) => {\r\n if (result) {\r\n this.deleteGroup(groupInfo);\r\n }\r\n });\r\n }\r\n /**\r\n * This method sends API Request to delete the selected group and handles the success and error response of the http request.\r\n * @memberof GroupComponent\r\n */\r\n deleteGroup(groupInfo: GroupInfo): void {\r\n const deleteGroupText = screenTexts?.deleteGroup;\r\n this.deleteGroupName = groupInfo?.groupName;\r\n const deleteGroupPayload: DeleteGroupPayload = {\r\n payload: {\r\n groupId: groupInfo?.groupId,\r\n },\r\n };\r\n this.groupsService\r\n .deleteGroup(deleteGroupPayload)\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n next: (res: any) => {\r\n this.dialogRef?.close();\r\n if (res?.status) {\r\n if (this.trimmedSearchTerm)\r\n this.onGroupSearchClick(this.trimmedSearchTerm);\r\n else if (this.selectedGroupType.id !== '')\r\n this.onGroupTypeFiltered(this.selectedGroupType);\r\n else this.deletedGroupId = groupInfo?.groupId;\r\n this.showAlertMessage(\r\n AlertType?.SUCCESS,\r\n groupInfo?.groupName + deleteGroupText?.message?.success?.deletion\r\n );\r\n }\r\n },\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n error: (error: any) => {\r\n this.handleErrors(error);\r\n },\r\n });\r\n }\r\n /**\r\n * Shows the search field on click of search icon in case of mobile view\r\n * @memberof GroupsComponent\r\n */\r\n onGroupSearch(): void {\r\n this.isGroupSearchActive = true;\r\n this.isGroupFilterActive = false;\r\n }\r\n /**\r\n * Shows the Filter by dropdown options on click of filter icon in case of mobile view\r\n * @memberof GroupsComponent\r\n */\r\n showGroupFilter(): void {\r\n this.isGroupFilterActive = true;\r\n this.isGroupSearchActive = false;\r\n }\r\n /**\r\n * Sets isGroupSearchOrFilterActive to true and loads the groups those are configured with selected group type.\r\n * @param {string} searchTerm\r\n * @memberof GroupsComponent\r\n */\r\n\r\n onGroupSearchClick(searchTerm: string): void {\r\n this.trimmedSearchTerm = searchTerm.trim();\r\n this.groupsService.setGroupFunctionType(GroupFunctionType.SEARCH);\r\n if (\r\n !this.trimmedSearchTerm &&\r\n (this.isGroupSearchActive || this.isGroupFilterActive)\r\n ) {\r\n this.onGroupTypeFiltered(this.selectedGroupType);\r\n return;\r\n }\r\n if (!this.trimmedSearchTerm) return;\r\n this.isGroupSearchOrFilterActive = !!this.trimmedSearchTerm;\r\n this.onGroupSearch();\r\n this.groupsService\r\n .groupsByNameAcronym(\r\n this.trimmedSearchTerm,\r\n this.viewGroupTexts?.allGroupTypesOption ===\r\n this.selectedGroupType?.name\r\n ? undefined\r\n : (this.selectedGroupType?.id as number)\r\n )\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (response) => {\r\n if (response?.status) {\r\n this.parentGroupsInfo = this.viewGroupResponse(response?.body);\r\n }\r\n },\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n error: (error: any) => {\r\n this.parentGroupsInfo = [];\r\n this.handleErrors(error);\r\n },\r\n });\r\n }\r\n /**\r\n * Sets select group type options from groupTypes response\r\n * @return {*} {SelectOption[]}\r\n * @memberof GroupsComponent\r\n */\r\n getGroupTypeOptions(): SelectOption[] {\r\n const groupTypeOptions: SelectOption[] = [];\r\n groupTypeOptions.push({\r\n id: '',\r\n name: this.viewGroupTexts?.allGroupTypesOption,\r\n });\r\n this.sortGroupTypes()?.forEach((node) => {\r\n groupTypeOptions.push({ id: node[0], name: node[1]?.name });\r\n });\r\n return groupTypeOptions;\r\n }\r\n /**\r\n * Returns the sorted group types based on the view order.\r\n * @return [string, GroupType][]\r\n * @memberof GroupsComponent\r\n */\r\n sortGroupTypes(): [string, GroupType][] {\r\n return Object.entries(this.groupTypes).sort(\r\n (groupA: [string, GroupType], groupB: [string, GroupType]) =>\r\n (groupA[1]?.viewOrder as number) - (groupB[1]?.viewOrder as number)\r\n );\r\n }\r\n /**\r\n * Sets the isGroupSearchOrFilterActive flag and loads parent group info as per selected filter option.\r\n * @param {SelectOption} event\r\n * @memberof GroupsComponent\r\n */\r\n onGroupTypeFiltered(event: SelectOption): void {\r\n this.selectedGroupType = event;\r\n this.isGroupSearchOrFilterActive = !!this.selectedGroupType?.id;\r\n if (this.trimmedSearchTerm) {\r\n this.onGroupSearchClick(this.trimmedSearchTerm);\r\n this.showGroupFilter();\r\n return;\r\n }\r\n this.getGroupsPayload = {\r\n groupId: '',\r\n groupTypeId: this.selectedGroupType?.id as string,\r\n };\r\n this.trimmedSearchTerm = '';\r\n this.groupsService?.setGroupFunctionType(GroupFunctionType?.FILTER);\r\n this.getGroups();\r\n }\r\n /**\r\n * Loads all the parent groups information.\r\n * @memberof GroupsComponent\r\n */\r\n getGroups(group?: GroupInfo): void {\r\n if (group) {\r\n this.getGroupsPayload = {\r\n groupId: group?.groupId ?? '',\r\n groupTypeId: '',\r\n };\r\n } else if (this.getGroupsPayload.groupTypeId === '') {\r\n this.getGroupsPayload = {\r\n groupId: '',\r\n groupTypeId: '',\r\n };\r\n }\r\n this.groupsService\r\n .getGroups(this.getGroupsPayload)\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (response) => {\r\n if (response?.status) {\r\n if (group) {\r\n this.childGroupsInfo = this.viewGroupResponse(response?.body);\r\n } else {\r\n this.parentGroupsInfo = this.viewGroupResponse(response?.body);\r\n }\r\n }\r\n },\r\n error: (error) => {\r\n this.handleErrors(error);\r\n },\r\n });\r\n }\r\n /**\r\n * Sets groupType info with group response from groupType response\r\n * @param {GroupInfo[]} response\r\n * @return {*} {GroupInfo[]}\r\n * @memberof GroupsComponent\r\n */\r\n viewGroupResponse(response: GroupInfo[]): GroupInfo[] {\r\n response?.forEach((node) => {\r\n const groupTypeInfo: GroupType = this.groupTypes[node.groupType];\r\n node.groupTypeInfo = groupTypeInfo;\r\n });\r\n return response;\r\n }\r\n /**\r\n * Loads the group types.\r\n * @memberof GroupsComponent\r\n */\r\n getGroupTypes(): void {\r\n this.groupsService\r\n .getGroupTypes()\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (res) => {\r\n if (res?.status) {\r\n this.groupTypes = this.groupsService?.getFormattedGroupTypes(\r\n res?.body\r\n );\r\n this.selectGroupOptions = this.getGroupTypeOptions();\r\n this.selectedGroupType = this.selectGroupOptions[0];\r\n this.onGroupTypeFiltered(this.selectedGroupType);\r\n }\r\n },\r\n error: (error) => {\r\n this.handleErrors(error);\r\n },\r\n });\r\n }\r\n /**\r\n * Handles alerts for success, error and warning.\r\n * @param {(string | string[])} message -success or error or warning message.\r\n * @param {AlertType} alertType\r\n * @return -returns nothing\r\n * @memberof GroupsComponent\r\n */\r\n showAlertMessage(alertType: AlertType, message: string | string[]): void {\r\n this.alertService?.showMessage({\r\n status: 'custom',\r\n message: message,\r\n alertType: alertType,\r\n isCloseNeeded: true,\r\n });\r\n }\r\n /**\r\n * Captures the server side errors and handles it based on the custom or Http errors.\r\n * @param {HttpErrorResponse} error\r\n * @return -returns nothing\r\n * @memberof GroupsComponent\r\n */\r\n handleErrors(error: HttpErrorResponse): void {\r\n const errorCodes: string[] = error?.error?.body?.errorCodes;\r\n if (Array.isArray(errorCodes)) {\r\n const errorMessage: string[] =\r\n this.groupsService?.parseErrorMessage(errorCodes);\r\n if (errorCodes?.includes('1008')) {\r\n errorMessage[0] = this.deleteGroupName + errorMessage?.[0];\r\n }\r\n this.showAlertMessage(AlertType.ERROR, errorMessage);\r\n if (errorCodes?.includes('1010')) this.parentGroupsInfo = [];\r\n } else if (error && error instanceof HttpErrorResponse) {\r\n this.globalErrorHandlerService?.handleError(error);\r\n }\r\n }\r\n /**\r\n * NgOnDestroy performs necessary cleanup tasks, such as unsubscribing from subscription when the component is being destroyed.\r\n * @memberof GroupsComponent\r\n */\r\n ngOnDestroy(): void {\r\n this.destroy$.next(true);\r\n this.destroy$.unsubscribe();\r\n }\r\n}\r\n","<div class=\"ieeesa-groups px-4\">\r\n <div\r\n class=\"ieeesa-groups__info d-flex justify-content-between pb-3 align-items-center\"\r\n [ngClass]=\"\r\n isMobileView\r\n ? 'ieeesa-groups__info--white-bg'\r\n : 'ieeesa-groups__info--blue-bg'\r\n \"\r\n >\r\n <p\r\n class=\"mb-0\"\r\n [ngClass]=\"\r\n isMobileView\r\n ? 'ieeesa-title-lg-24 p-0'\r\n : 'ieeesa-headline-lg-32 ieeesa-groups__info__heading'\r\n \"\r\n >\r\n {{ groupsPageInfo?.groupsTitle }}\r\n </p>\r\n <div\r\n class=\"d-flex d-sm-flex d-md-none d-lg-none d-xl-none ieeesa-groups__mobile-icons gap-2\"\r\n >\r\n <ieeesa-icon-button\r\n [iconButton]=\"createGroupIcon\"\r\n *ngIf=\"\r\n validateAccess(permissionType.CREATE_ROOT_GROUP) ||\r\n validateAccess(this.permissionType.MANAGE_ALL_GROUPS)\r\n \"\r\n (iconButtonClick)=\"openCreateGroupForm()\"\r\n >\r\n </ieeesa-icon-button>\r\n <ieeesa-icon-button\r\n [iconButton]=\"filterGroupIcon\"\r\n (iconButtonClick)=\"showGroupFilter()\"\r\n >\r\n </ieeesa-icon-button>\r\n <ieeesa-icon-button\r\n [iconButton]=\"searchGroupIcon\"\r\n (iconButtonClick)=\"onGroupSearch()\"\r\n >\r\n </ieeesa-icon-button>\r\n </div>\r\n </div>\r\n <div\r\n class=\"ieeesa-groups__actions\"\r\n [ngClass]=\"\r\n isMobileView\r\n ? 'ieeesa-groups__actions--white-bg'\r\n : 'ieeesa-groups__actions--blue-bg'\r\n \"\r\n >\r\n <div class=\"ieeesa-groups__actions--search row\">\r\n <div\r\n class=\"order-2 order-sm-1 col-12 col-md-7 col-lg-7 col-xl-7 d-flex flex-column justify-content-between\"\r\n >\r\n <p class=\"ieeesa-body-md-16\">\r\n {{ groupsPageInfo?.groupsDescription }}\r\n </p>\r\n <button\r\n [ngClass]=\"\r\n isMobileView ? 'p-0' : 'ieeesa-groups__actions__add-group-btn'\r\n \"\r\n mat-button\r\n *ngIf=\"\r\n validateAccess(permissionType.CREATE_ROOT_GROUP) ||\r\n validateAccess(this.permissionType.MANAGE_ALL_GROUPS)\r\n \"\r\n class=\"ieeesa-groups__create-subgroup mat-tertiary-button d-none d-sm-none d-md-block d-lg-block d-xl-block\"\r\n (click)=\"openCreateGroupForm()\"\r\n [attr.aria-label]=\"constants?.viewGroups?.ariaLabel?.addGroup\"\r\n >\r\n {{ constants?.viewGroups?.addGroup }}\r\n </button>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"\r\n ((isGroupSearchActive || isGroupFilterActive) && isMobileView) ||\r\n !isMobileView\r\n \"\r\n class=\"order-1 order-sm-2 col-12 col-md-5 col-lg-5 col-xl-5 d-flex flex-column\"\r\n [ngClass]=\"isMobileView ? 'ieeesa-search-mobile-view' : ''\"\r\n >\r\n <ieeesa-search\r\n *ngIf=\"isGroupSearchActive || !isMobileView\"\r\n (searchValue)=\"onGroupSearchClick($event)\"\r\n [searchTerm]=\"trimmedSearchTerm\"\r\n [searchType]=\"searchType\"\r\n [placeholderLabel]=\"searchPlaceHolderText\"\r\n [minCharacterToSearch]=\"minCharacterToSearch\"\r\n [supportMessage]=\"supportMessage\"\r\n ></ieeesa-search>\r\n\r\n <ieeesa-select\r\n *ngIf=\"isGroupFilterActive || !isMobileView\"\r\n class=\"align-self-end pt-lg-4 pt-md-4 pt-xl-4\"\r\n [isSortNeeded]=\"false\"\r\n [dropdownOptions]=\"selectGroupOptions\"\r\n [isLabelAlignedLeft]=\"true\"\r\n [selectLabel]=\"constants?.viewGroups?.filterByLabel\"\r\n (optionSelected)=\"onGroupTypeFiltered($event)\"\r\n [placeholderText]=\"filterPlaceHolderText\"\r\n [selectedOptions]=\"selectedGroupType\"\r\n ></ieeesa-select>\r\n </div>\r\n </div>\r\n <ieeesa-tree\r\n *ngIf=\"parentGroupsInfo && parentGroupsInfo.length > 0\"\r\n [parentGroupsInfo]=\"parentGroupsInfo\"\r\n [childGroupsInfo]=\"childGroupsInfo\"\r\n [deletedGroupIdInfo]=\"deletedGroupId\"\r\n [isGroupSearchOrFilterActive]=\"isGroupSearchOrFilterActive\"\r\n [userGroupPermissions]=\"userGroupPermissions\"\r\n (toggleGroupClick)=\"getGroups($event)\"\r\n (createGroupClick)=\"openCreateGroupForm($event)\"\r\n (deleteGroupClick)=\"openDeleteConfirmationModal($event)\"\r\n (viewRosterClick)=\"viewRoster($event)\"\r\n (editGroupClick)=\"openEditGroupForm($event)\"\r\n (manageInterestFormClick)=\"openRosterInterests($event)\"\r\n ></ieeesa-tree>\r\n </div>\r\n</div>\r\n","/* eslint-disable no-unused-vars */\r\n\r\n/**\r\n * Roster-import status state machine. Mirrors the BE `ImportStatus` enum\r\n * (sa-saapps-groups-api: org.ieee.standards.groups.model.ImportStatus) and the\r\n * `status` CHECK constraint on `roster_import_job_tb`.\r\n *\r\n * - PENDING upload accepted, awaiting validation (default)\r\n * - VALIDATING rows are being validated\r\n * - COMPLETED all rows imported successfully (terminal)\r\n * - FAILED no rows imported successfully (terminal)\r\n * - PARTIAL some rows imported, some failed (terminal)\r\n */\r\nexport enum RosterImportStatus {\r\n PENDING = 'PENDING',\r\n VALIDATING = 'VALIDATING',\r\n COMPLETED = 'COMPLETED',\r\n FAILED = 'FAILED',\r\n PARTIAL = 'PARTIAL',\r\n}\r\n\r\n/**\r\n * A single per-row validation error stored in the import job's `error_report`\r\n * JSONB column. Mirrors the BE `ErrorReport` POJO ({@code {row, field, message}}).\r\n */\r\nexport interface RosterImportErrorReport {\r\n /** 1-based data-row number in the uploaded file. */\r\n row: number;\r\n /** The field/column the error relates to (e.g. \"Name\", \"Email\"). */\r\n field?: string;\r\n /** Human-readable error message. */\r\n message: string;\r\n}\r\n\r\n/**\r\n * Roster import job as returned by the BE (upload / confirm / history).\r\n * Mirrors the JSON-serialized view of the BE `RosterImportJob` entity.\r\n *\r\n * IMPORTANT: The BE marks `createdOn`, `createdBy`, `updatedOn`, `updatedBy` as\r\n * `@JsonIgnore`, so the response carries NO timestamp and NO importer identity.\r\n * If the \"View History\" screen needs those (Timestamp / Person Imported\r\n * columns), the BE must expose them first — this is a BE change, tracked\r\n * separately. `errorReport` arrives as a raw JSON string (JSONB passthrough);\r\n * parse it into {@link RosterImportErrorReport}[] on the client when needed.\r\n */\r\nexport interface RosterImportJob {\r\n /** Import job identifier. */\r\n importId: string;\r\n /** The target group the roster was imported into. */\r\n groupId: string;\r\n /** Uploaded file name (e.g. \"07_tenant_custom_fields.csv\"). */\r\n fileName?: string;\r\n /** Current status (see {@link RosterImportStatus}). */\r\n status: string;\r\n /** Total data rows detected (`totalRows = successRows + failedRows`). */\r\n totalRows?: number;\r\n /** Rows successfully added/updated. */\r\n successRows?: number;\r\n /** Rows skipped due to validation errors. */\r\n failedRows?: number;\r\n /**\r\n * Row-level errors as a RAW JSON string (BE `error_report` JSONB passthrough).\r\n * Parse with `JSON.parse(...)` into {@link RosterImportErrorReport}[].\r\n */\r\n errorReport?: string;\r\n}\r\n\r\n/**\r\n * Per-row validation outcome in a validate/preview response. Mirrors the BE\r\n * `RosterImportRowOutcome` POJO.\r\n */\r\nexport interface RosterImportRowOutcome {\r\n /** 1-based data-row number in the uploaded file. */\r\n row: number;\r\n /** Whether this row passed validation. */\r\n valid: boolean;\r\n /** The field/column the error relates to, for an invalid row. */\r\n field?: string;\r\n /** Validation error message, for an invalid row. */\r\n error?: string;\r\n}\r\n\r\n/**\r\n * Validation preview returned by validate / preview. Mirrors the BE\r\n * `RosterImportPreview` POJO. Building a preview commits no roster changes.\r\n * `rows` is never null (BE guarantees an empty list at minimum).\r\n */\r\nexport interface RosterImportPreview {\r\n /** Import job identifier. */\r\n importId: string;\r\n /** Current status (see {@link RosterImportStatus}). */\r\n status: string;\r\n /** Total data rows (`totalRows = successRows + failedRows`). */\r\n totalRows: number;\r\n /** Rows that passed validation. */\r\n successRows: number;\r\n /** Rows that failed validation. */\r\n failedRows: number;\r\n /** Per-row outcomes (never null). */\r\n rows: RosterImportRowOutcome[];\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// DEPRECATED COMPATIBILITY EXPORTS\r\n//\r\n// These symbols were part of the public API (re-exported via\r\n// projects/groups/src/public-api.ts) before the roster-import model was\r\n// aligned to the backend contract. They are retained so downstream consumers\r\n// that still import them keep compiling. Prefer the BE-aligned types above:\r\n// - RosterUploadStatus -> RosterImportStatus\r\n// - RosterUploadResponse -> RosterImportJob / RosterImportPreview\r\n// - RosterUploadError -> RosterImportErrorReport / RosterImportRowOutcome\r\n// Remove these in the next major (breaking) release.\r\n// ---------------------------------------------------------------------------\r\n\r\n/**\r\n * @deprecated Use {@link RosterImportStatus} instead. Retained for backward\r\n * compatibility with the pre-BE-integration public API.\r\n */\r\nexport enum RosterUploadStatus {\r\n PROCESSING = 'PROCESSING',\r\n COMPLETED = 'COMPLETED',\r\n FAILED = 'FAILED',\r\n}\r\n\r\n/**\r\n * @deprecated Use {@link RosterImportErrorReport} (`{ row, field, message }`)\r\n * or {@link RosterImportRowOutcome} instead. Retained for backward\r\n * compatibility with the pre-BE-integration public API.\r\n */\r\nexport interface RosterUploadError {\r\n /** 1-based row number in the uploaded file. */\r\n rowNumber: number;\r\n /** The field/column the error relates to (e.g. \"Name\", \"Email\"). */\r\n field?: string;\r\n /** The offending value, when relevant (e.g. an unrecognized role). */\r\n value?: string;\r\n /** Human-readable error message shown in the row-errors list. */\r\n errorMessage: string;\r\n}\r\n\r\n/**\r\n * @deprecated Use {@link RosterImportJob} (confirm/history) or\r\n * {@link RosterImportPreview} (validate) instead. Retained for backward\r\n * compatibility with the pre-BE-integration public API.\r\n */\r\nexport interface RosterUploadResponse {\r\n /** Job identifier. */\r\n uploadJobId?: string;\r\n /** Terminal job status. */\r\n status: RosterUploadStatus;\r\n /** Total data rows detected in the file (excludes the header row). */\r\n totalRecords: number;\r\n /** Rows successfully added/updated. */\r\n successCount: number;\r\n /** Rows skipped due to validation errors. */\r\n failureCount: number;\r\n /** Row-level errors (present when failureCount > 0). */\r\n rowErrors: RosterUploadError[];\r\n}\r\n","import { NgModule } from '@angular/core';\r\n\r\n@NgModule({\r\n declarations: [],\r\n imports: [\r\n ],\r\n exports: []\r\n})\r\nexport class GroupsModule { }\r\n","/*\r\n * Public API Surface of groups\r\n */\r\nexport * from './lib/components/create-group/create-group.component';\r\nexport * from './lib/components/tree-view/tree-view.component';\r\nexport * from './lib/components/edit-user-roles/edit-user-roles.component';\r\nexport * from './lib/components/reciprocal-credit-section/reciprocal-credit-section.component';\r\nexport * from './lib/components/add-working-groups/add-working-groups.component';\r\nexport * from './lib/components/roster-import/roster-import.component';\r\nexport * from './lib/components/roster-import-history/roster-import-history.component';\r\nexport * from './lib/components/interest-form-management/interest-form-management.component';\r\nexport * from './lib/components/interested-rosters/interested-rosters.component';\r\nexport * from './lib/components/interest-form/interest-form.component';\r\nexport * from './lib/groups.component';\r\n\r\nexport * from './lib/models/create-group.model';\r\nexport * from './lib/models/group-action.model';\r\nexport * from './lib/models/group-function-type.model';\r\nexport * from './lib/models/group-info.model';\r\nexport * from './lib/models/group-types.model';\r\nexport * from './lib/models/view-group.model';\r\nexport * from './lib/models/edit-group.model';\r\nexport * from './lib/models/delete-group.model';\r\nexport * from './lib/models/group-user-info.model';\r\nexport * from './lib/models/add-or-edit-user-group.model';\r\nexport * from './lib/models/roster-function-type.model';\r\nexport * from './lib/models/classification.model';\r\nexport * from './lib/models/filter-type.model';\r\nexport * from './lib/models/organization.model';\r\nexport * from './lib/models/role-type.model';\r\nexport * from './lib/models/roster-type.model';\r\nexport * from './lib/models/table-column-schema-user-group.model';\r\nexport * from './lib/models/parent-groups-info.model';\r\nexport * from './lib/models/reciprocal-credit.model';\r\n\r\nexport * from './lib/services/groups.service';\r\nexport * from './lib/services/roster-export.service';\r\nexport * from './lib/services/roster-import-api.service';\r\n\r\nexport * from './lib/models/roster-import.model';\r\n\r\nexport * from './lib/assets/form-validations';\r\n\r\nexport * from './lib/groups.module';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i3","i1.GroupPermissionsMapService","screenTexts?.errors","i1","i2.UserPermissionsService","i3.GroupPermissionsMapService","i1.GroupsService","i2","screenTexts?.createGroup","takeUntil","map","constants","i4","catchError","i1.RosterImportApiService","i2.GroupsService","i5","constants?.errors","constants?.deleteUsersGroup","constants?.ariaLabel","i4.RosterExportService","i6","screenTexts?.deleteGroup","i5.UserPermissionsService","i6.GroupPermissionsMapService","i7"],"mappings":"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"}
|