@ieeesa-npm/groups 0.15.31 → 0.15.32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1 +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/feature-flag.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/models/interest-response.model.ts","../../../projects/groups/src/lib/components/interest-responses/interest-responses.component.ts","../../../projects/groups/src/lib/components/interest-responses/interest-responses.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/models/custom-question.model.ts","../../../projects/groups/src/lib/components/custom-question-editor/custom-question-editor.component.ts","../../../projects/groups/src/lib/components/custom-question-editor/custom-question-editor.component.html","../../../projects/groups/src/lib/components/interest-form-preview/interest-form-preview.component.ts","../../../projects/groups/src/lib/components/interest-form-preview/interest-form-preview.component.html","../../../projects/groups/src/lib/services/interest-form.service.ts","../../../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 // Phone Number field regular expression which accepts digits, spaces and the common phone characters + - ( ) .\r\n phoneNumber: /^[+]?[0-9\\s\\-().]{1,20}$/,\r\n phoneNumberMaxLength: 20,\r\n // Address field maximum length.\r\n addressMaxLength: 500\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 VIEW_AND_MANAGE_GROUP_INTEREST = 'VIEW_AND_MANAGE_GROUP_INTEREST',\r\n RESTRICT_GROUPS_AND_ROSTERS = 'RESTRICT_GROUPS_AND_ROSTERS',\r\n}\r\n","/* eslint-disable no-unused-vars */\r\nexport enum FeatureFlag {\r\n INTEREST_FORM = 'FEATURE_INTEREST_FORM',\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\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 // SP3M-380: Per-group permission gating the \"Manage Interest Form\" action.\r\n // permissionId is the FE join key and MUST match the backend DB seed;\r\n // permissionName is the BE guard-match string and MUST equal the DB\r\n // permission_name (groups-api changelog + PermissionConstants).\r\n permissionType: PermissionType.VIEW_AND_MANAGE_GROUP_INTEREST,\r\n permissionName: 'View and Manage Group Interest Form',\r\n permissionId: 'PERM_VIEW_AND_MANAGE_GROUP_INTEREST',\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 permissionType: PermissionType.VIEW_AND_MANAGE_GROUP_INTEREST,\r\n permissionName: 'View and Manage Group Interest Form',\r\n permissionId: 'PERM_VIEW_AND_MANAGE_GROUP_INTEREST',\r\n },\r\n {\r\n permissionType: PermissionType.RESTRICT_GROUPS_AND_ROSTERS,\r\n permissionName: 'Restrict Manage Groups And Rosters',\r\n permissionId: 'PERM_RESTRICT_MANAGE_GROUPS_AND_ROSTERS',\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, StorageKeys, StorageService } 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 {\r\n FormStatus,\r\n CheckboxOption,\r\n AlertType,\r\n SelectOption,\r\n} from '@ieeesa-npm/models';\r\nimport { COUNTRY_DIAL_CODES } from '@ieeesa-npm/presentation';\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 { FeatureFlag } from '../models/feature-flag.model';\r\nimport { TenantFeature } from '../models/tenant-feature.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\nimport { CachedRequiredProfileFields } from '../models/required-profile-fields.model';\r\nimport {\r\n GroupInterestResponseView,\r\n InterestedRostersRequestPayload,\r\n InterestedRostersResponse,\r\n InterestFormResponse,\r\n UpdateMemberLevelPayload,\r\n} from '../models/interest-response.model';\r\n\r\n/**\r\n * Local storage key under which the hosting application caches the tenant's\r\n * required profile fields at login (shape: `{ appId, requiredFields }`). The\r\n * add-user / edit-user forms read this cache as the source of truth so they\r\n * always reflect the tenant configuration regardless of @Input/resolver timing.\r\n */\r\nconst REQUIRED_PROFILE_FIELDS_STORAGE_KEY = 'REQUIRED_PROFILE_FIELDS';\r\n\r\n/**\r\n * Local storage key under which the hosting application caches the tenant's\r\n * feature flags at login (shape: a bare `TenantFeature[]`). The interest-form\r\n * gate reads this cache as the source of truth so it reflects the tenant\r\n * configuration regardless of @Input/resolver timing.\r\n */\r\nconst TENANT_FEATURES_STORAGE_KEY = 'TENANT_FEATURES';\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 /**\r\n * Tenant-level required profile fields (e.g. ['phone','address','employer'])\r\n * supplied by the host app from its cached tenant configuration. Consumed by\r\n * the roster import to append tenant-mandated columns to the required-column\r\n * list and the sample file. Empty when the tenant has none configured.\r\n */\r\n requiredProfileFields: string[] = [];\r\n /**\r\n * Tenant feature flags supplied by the host app. Used by\r\n * {@link isInterestFormFeatureEnabled} to gate interest-form UI. Empty when\r\n * the host has not provided any features (fail-closed).\r\n */\r\n tenantFeatures: TenantFeature[] = [];\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,\r\n // eslint-disable-next-line no-unused-vars\r\n private storageService: StorageService // 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 * Stores the tenant-level required profile fields provided by the host app.\r\n * @param {string[]} requiredProfileFields - Field keys (e.g. 'phone').\r\n * @memberof GroupsService\r\n */\r\n setRequiredProfileFields(requiredProfileFields: string[]): void {\r\n this.requiredProfileFields = requiredProfileFields ?? [];\r\n }\r\n /**\r\n * Stores the tenant feature flags provided by the host app. Consumed by\r\n * {@link isInterestFormFeatureEnabled} to gate interest-form UI.\r\n * @param {TenantFeature[]} tenantFeatures - Tenant feature flags.\r\n * @memberof GroupsService\r\n */\r\n setTenantFeatures(tenantFeatures: TenantFeature[]): void {\r\n this.tenantFeatures = tenantFeatures ?? [];\r\n }\r\n /**\r\n * Returns the tenant feature flags (never null).\r\n *\r\n * Reads the local storage cache the hosting application writes at login (key\r\n * `TENANT_FEATURES`, a bare `TenantFeature[]`) as the source of truth, so the\r\n * interest-form gate reflects the tenant configuration regardless of the\r\n * @Input/resolver timing.\r\n *\r\n * The cache is only trusted when it is well-formed for the active\r\n * application: it must be an array and its entries must belong to the current\r\n * user's `appId`. The `TENANT_FEATURES` key is origin-wide, so a cache written\r\n * by another application on the same origin could otherwise flip the\r\n * interest-form gate with a different tenant's flags. When the cache is\r\n * missing, malformed, or scoped to another app, it falls back to the in-memory\r\n * value set via {@link setTenantFeatures} (the host @Input), then to an empty\r\n * list.\r\n * @return {TenantFeature[]}\r\n * @memberof GroupsService\r\n */\r\n getTenantFeatures(): TenantFeature[] {\r\n const cached = this.storageService?.getValue(\r\n TENANT_FEATURES_STORAGE_KEY\r\n ) as TenantFeature[] | null;\r\n const activeAppId = this.getUserInfo()?.appId;\r\n const isCacheUsable =\r\n Array.isArray(cached) &&\r\n (!activeAppId ||\r\n cached.every(\r\n (feature) => !feature?.appId || feature.appId === activeAppId\r\n ));\r\n if (isCacheUsable) return cached as TenantFeature[];\r\n return this.tenantFeatures ?? [];\r\n }\r\n /**\r\n * Returns the tenant-level required profile fields (never null).\r\n *\r\n * Reads the local storage cache the hosting application writes at login (key\r\n * `REQUIRED_PROFILE_FIELDS`) as the source of truth, so the add-user /\r\n * edit-user forms always reflect the tenant configuration regardless of the\r\n * @Input/resolver timing.\r\n *\r\n * The cache is only trusted when it is well-formed for the active\r\n * application: its `appId` must match the current user's `appId` and its\r\n * `requiredFields` must be an array. This guards against (a) a stale cache\r\n * from a previously opened application applying another tenant's fields, and\r\n * (b) a malformed cache crashing the forms when callers run\r\n * `requiredFields.includes(...)` on a non-array value. When the cache is\r\n * missing, for another app, or malformed, it falls back to the in-memory\r\n * value set via {@link setRequiredProfileFields} (the host @Input), then to\r\n * an empty list.\r\n * @return {string[]}\r\n * @memberof GroupsService\r\n */\r\n getRequiredProfileFields(): string[] {\r\n const cached = this.storageService?.getValue(\r\n REQUIRED_PROFILE_FIELDS_STORAGE_KEY\r\n ) as CachedRequiredProfileFields | null;\r\n const activeAppId = this.getUserInfo()?.appId;\r\n const isCacheUsable =\r\n !!cached &&\r\n Array.isArray(cached.requiredFields) &&\r\n (!activeAppId || cached.appId === activeAppId);\r\n if (isCacheUsable) return cached.requiredFields;\r\n return this.requiredProfileFields ?? [];\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 * Returns true when the user holds the negative permission that restricts all\r\n * group and roster write actions, regardless of any other granted permission.\r\n * @return {boolean}\r\n * @memberof GroupsService\r\n */\r\n isGroupsAndRostersRestricted(): boolean {\r\n return this.validateAccess(PermissionType.RESTRICT_GROUPS_AND_ROSTERS);\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 phoneCountryCode: item.phoneCountryCode ?? null,\r\n phoneNumber: item.phoneNumber ?? null,\r\n address: item.address ?? 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. Falls back to the USER_INFO blob\r\n * the host app persists to local storage when the userInfo input hasn't\r\n * been set yet (e.g. host wiring not completed or timing race on init).\r\n * @return {LoggedInUserInfo}\r\n * @memberof GroupsService\r\n */\r\n getUserInfo(): LoggedInUserInfo {\r\n if (this.userInfo?.appId) return this.userInfo;\r\n const storedUserInfo = this.storageService?.getValue(StorageKeys.USER_INFO);\r\n return storedUserInfo?.appId ? storedUserInfo : 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 * SP3M-380: Returns true when the interest-form feature\r\n * (`FEATURE_INTEREST_FORM`) is enabled for the current tenant. A single\r\n * boolean capability check the UI gates on. Reads the tenant features from\r\n * {@link getTenantFeatures} (local storage cache first, then the host\r\n * @Input). Fail-closed: an empty/undefined feature list, or a feature marked\r\n * deleted, yields false.\r\n * @return {boolean}\r\n * @memberof GroupsService\r\n */\r\n isInterestFormFeatureEnabled(): boolean {\r\n return this.getTenantFeatures().some(\r\n (feature) =>\r\n feature?.featureId === FeatureFlag.INTEREST_FORM && !feature?.isDeleted\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 /** Returns the unique calling codes derived from phone country metadata. */\r\n getCountryCallingCodes(): SelectOption[] {\r\n const dialCodes = [\r\n ...new Set(COUNTRY_DIAL_CODES.map((country) => country.dialCode)),\r\n ].sort(\r\n (first, second) =>\r\n Number(first.slice(1)) - Number(second.slice(1))\r\n );\r\n return dialCodes.map((dialCode) => ({ id: dialCode, name: dialCode }));\r\n }\r\n\r\n /**\r\n * Returns the stored interest-form responses for an interest record, for the\r\n * Roster Management admin \"View Responses\" view (SP3M-428, R8.7).\r\n *\r\n * GET {apiBaseUrl}/groups/interest/{interestId}/responses\r\n *\r\n * The endpoint is keyed by the interest record id ({@code GINT_SAAPPS_...}),\r\n * NOT the group id, and is guarded server-side by roster-view permissions\r\n * (VIEW_GROUP_MEMBERS on the group or the tenant-wide VIEW_ALL_ROSTERS). The\r\n * base URL already carries the version segment (e.g. `.../v1`), matching every\r\n * other GroupsService call built as `${apiBaseUrl}/groups/...`, so the version\r\n * is not repeated. The response envelope's body is the list of responses\r\n * (never null — an empty list means no answers were submitted).\r\n * @param {string} interestId - The interest record whose responses are read.\r\n * @return {Observable<InterestFormResponse[]>}\r\n * @memberof GroupsService\r\n */\r\n getInterestResponses(\r\n interestId: string\r\n ): Observable<InterestFormResponse[]> {\r\n return this.httpService\r\n .getData(`${this.apiBaseUrl}/groups/interest/${interestId}/responses`)\r\n .pipe(\r\n map((response) => (response?.body as InterestFormResponse[]) ?? []),\r\n catchError((errorRes) => {\r\n throw errorRes;\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Returns the interested-users roster for a group — one row per interest\r\n * carrying the user's name/email, organization affiliations, submitted\r\n * timestamp, the group's default membership level, and the group type id — so\r\n * the Roster Management admin \"Interested Rosters\" tab renders the whole group\r\n * in a single call (SP3M-428, R8.7).\r\n *\r\n * POST {apiBaseUrl}/groups/interest/group/{groupId}/responses\r\n *\r\n * The search term, pagination and sort options are sent in the request body\r\n * ({@link InterestedRostersRequestPayload}) so the backend can filter, page\r\n * and sort the roster server-side. Guarded server-side by roster-view\r\n * permissions (VIEW_GROUP_MEMBERS on the group or the tenant-wide\r\n * VIEW_ALL_ROSTERS). The base URL already carries the version segment,\r\n * matching every other GroupsService call built as `${apiBaseUrl}/groups/...`,\r\n * so the version is not repeated. The response envelope's body is an\r\n * {@link InterestedRostersResponse}: the roster rows live under `data` (never\r\n * null — an empty list means the group has no interests) alongside the paging\r\n * metadata (`totalRecords`, `offset`, `pageSize`).\r\n * @param {string} groupId - The group whose interested-users roster is read.\r\n * @param {InterestedRostersRequestPayload} payload - Search/pagination/sort options.\r\n * @return {Observable<InterestedRostersResponse>}\r\n * @memberof GroupsService\r\n */\r\n getInterestResponsesByGroup(\r\n groupId: string,\r\n payload: InterestedRostersRequestPayload\r\n ): Observable<InterestedRostersResponse> {\r\n return this.httpService\r\n .postData(\r\n `${this.apiBaseUrl}/groups/interest/group/${groupId}/responses`,\r\n payload\r\n )\r\n .pipe(\r\n map((response) => {\r\n const body = response?.body as InterestedRostersResponse | null;\r\n return {\r\n data: body?.data ?? [],\r\n totalRecords: body?.totalRecords ?? 0,\r\n offset: body?.offset ?? 0,\r\n pageSize: body?.pageSize ?? 0,\r\n };\r\n }),\r\n catchError((errorRes) => {\r\n throw errorRes;\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Sets/overrides the membership level for an interested user from the Roster\r\n * Management admin \"Interested Rosters\" tab (SP3M-428). Called when the admin\r\n * picks a value in a row's Member Level dropdown.\r\n *\r\n * PUT {apiBaseUrl}/groups/interest/member-level\r\n *\r\n * The group, user and selected role id are sent in the request body\r\n * ({@link UpdateMemberLevelPayload}). Guarded server-side by roster-management\r\n * permissions. The base URL already carries the version segment, matching\r\n * every other GroupsService call built as `${apiBaseUrl}/groups/...`, so the\r\n * version is not repeated. The response envelope's body is returned as-is.\r\n * @param {UpdateMemberLevelPayload} payload - Group + user + selected role id.\r\n * @return {Observable<unknown>}\r\n * @memberof GroupsService\r\n */\r\n updateInterestMemberLevel(\r\n payload: UpdateMemberLevelPayload\r\n ): Observable<unknown> {\r\n return this.httpService\r\n .putData(`${this.apiBaseUrl}/groups/interest/member-level`, payload)\r\n .pipe(\r\n map((response) => response?.body ?? null),\r\n catchError((errorRes) => {\r\n throw errorRes;\r\n })\r\n );\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 group action menu items the current user may see for the given\r\n * group, filtered by per-group permissions and group type. The \"Manage\r\n * Interest Form\" action (SP3M-380) renders only when the interest-form feature\r\n * is enabled and the group's per-group permission union holds\r\n * VIEW_AND_MANAGE_GROUP_INTEREST (strict per-group, no global fallback); it is\r\n * hidden on admin/system group types and kept leftmost by the trailing sort.\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 !this.groupsService.isGroupsAndRostersRestricted() &&\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 !this.groupsService.isGroupsAndRostersRestricted() &&\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 !this.groupsService.isGroupsAndRostersRestricted() &&\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 // Interest form: hidden on admin/system group types; else gated STRICTLY\r\n // on the group's per-group permission union (no global/tenant-wide fallback).\r\n (e?.id === GroupAction.MANAGE_INTEREST_FORM &&\r\n this.groupsService.isInterestFormFeatureEnabled() &&\r\n !isAdminGroupType &&\r\n this.groupsService.validateAccess(\r\n this.permissionType.VIEW_AND_MANAGE_GROUP_INTEREST,\r\n groupPermissions ?? []\r\n ))\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((item) =>\r\n this.isSameOption(item, option)\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((item) =>\r\n this.isSameOption(item, option)\r\n );\r\n }\r\n\r\n /**\r\n * Identity check shared by isSelected / toggleOption / removeOption so all\r\n * three agree on what \"the same option\" means.\r\n *\r\n * Why not a strict id === id && name === name match: SelectOption.id is\r\n * `number | string`, and the two sides being compared do not always carry the\r\n * same representation of the same organization. A freshly searched API result\r\n * can arrive with a numeric id while the already-selected value (from edit\r\n * prefill, or a previous search) holds the string form of that same id, so a\r\n * strict === misses them. Free-text chips are added with an empty id\r\n * (see addTypedValue), so when the same name later comes back from the API\r\n * with a real id there is no id to match on at all. Both cases made the\r\n * dropdown checkbox render unchecked for an option that is in fact selected.\r\n *\r\n * Rule:\r\n * - If BOTH sides have a non-empty id, match by String(id) === String(id)\r\n * (number-vs-string safe).\r\n * - Otherwise (either side is a free-text chip with no id) fall back to a\r\n * trimmed, case-insensitive name match.\r\n * @param {SelectOption} a -first option.\r\n * @param {SelectOption} b -second option.\r\n * @return {boolean} true when both refer to the same organization.\r\n * @memberof OrgMultiSelectComponent\r\n */\r\n private isSameOption(a: SelectOption, b: SelectOption): boolean {\r\n const aId = a?.id;\r\n const bId = b?.id;\r\n const aHasId = aId !== undefined && aId !== null && `${aId}` !== '';\r\n const bHasId = bId !== undefined && bId !== null && `${bId}` !== '';\r\n if (aHasId && bHasId) {\r\n return `${aId}` === `${bId}`;\r\n }\r\n const aName = (a?.name ?? '').trim().toLowerCase();\r\n const bName = (b?.name ?? '').trim().toLowerCase();\r\n return aName !== '' && aName === bName;\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) => !this.isSameOption(item, option)\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 class=\"ieeesa-org-multi-select__checkbox\"\r\n color=\"primary\"\r\n [checked]=\"isSelected(option)\"\r\n [disableRipple]=\"true\"\r\n tabindex=\"-1\"\r\n aria-hidden=\"true\"\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 countryCallingCodes: SelectOption[] = [];\r\n orgSearchValue = '';\r\n // Tenant-configured optional profile fields (e.g. 'phone', 'address') to show on the edit-user form.\r\n requiredProfileFields: string[] = [];\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.countryCallingCodes = this.groupsService?.getCountryCallingCodes();\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 // Build the form only once the required-profile-fields response is known,\r\n // so the phone/address fields aren't shown then yanked away.\r\n this.getRequiredProfileFields();\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 // TEMP-DISABLED phone library field (country-code dropdown + libphonenumber-js),\r\n // read-only display here. Temporarily replaced by a plain read-only text input\r\n // below. Restore this block and remove the plain INPUT block when the\r\n // libphonenumber implementation is approved. Phone is display-only on this\r\n // form and is never read back into the submit payload.\r\n // ...(this.requiredProfileFields.includes('phone')\r\n // ? [\r\n // {\r\n // type: FormControlType.PHONE,\r\n // label: this.addUserRosterTexts?.label?.phoneNumber + '*',\r\n // controlName: 'phone',\r\n // value: {\r\n // countryCode:\r\n // this.selectedUserInfo?.phoneCountryCode ?? null,\r\n // phoneNumber: this.selectedUserInfo?.phoneNumber ?? null,\r\n // },\r\n // isReadonly: true,\r\n // ariaLabel:\r\n // this.addUserRosterTexts?.label?.ariaLabel?.phoneNumber,\r\n // ariaDescribedById:\r\n // this.addUserRosterTexts?.label?.ariaDescribedById\r\n // ?.phoneNumber,\r\n // },\r\n // ]\r\n // : []),\r\n // TEMP plain phone field (read-only) — no country-code dropdown, no formatting.\r\n // Uses TEXT_AREA with isReadonly to match the sibling read-only\r\n // email/fullName/address fields on this view-only form (the INPUT\r\n // component has no read-only display state).\r\n ...(this.requiredProfileFields.includes('phone')\r\n ? [\r\n {\r\n type: FormControlType.TEXT_AREA,\r\n label: this.addUserRosterTexts?.label?.phoneNumber + '*',\r\n controlName: 'phone',\r\n value: this.selectedUserInfo?.phoneNumber ?? '',\r\n isReadonly: true,\r\n isResize: false,\r\n ariaMultiline: false,\r\n ariaLabel:\r\n this.addUserRosterTexts?.label?.ariaLabel?.phoneNumber,\r\n ariaDescribedById:\r\n this.addUserRosterTexts?.label?.ariaDescribedById\r\n ?.phoneNumber,\r\n },\r\n ]\r\n : []),\r\n ...(this.requiredProfileFields.includes('address')\r\n ? [\r\n {\r\n type: FormControlType.TEXT_AREA,\r\n label: this.addUserRosterTexts?.label?.address + '*',\r\n controlName: 'address',\r\n value: this.selectedUserInfo?.address ?? '',\r\n isReadonly: true,\r\n isResize: false,\r\n ariaMultiline: true,\r\n ariaLabel: this.addUserRosterTexts?.label?.ariaLabel?.address,\r\n ariaDescribedById:\r\n this.addUserRosterTexts?.label?.ariaDescribedById\r\n ?.address,\r\n },\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 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 tenant's required profile fields so the edit-user form only shows\r\n * the phone/address fields the tenant has configured as required. Builds the\r\n * form once resolved (or immediately if the appId isn't available).\r\n * @memberof EditUserRolesComponent\r\n */\r\n getRequiredProfileFields(): void {\r\n this.requiredProfileFields =\r\n this.groupsService.getRequiredProfileFields() ?? [];\r\n this.editUserRolesFormGroup();\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 (single-line case). */\r\n errorMessage: string | null = null;\r\n\r\n /**\r\n * All API error messages when the BE returns multiple error codes at once\r\n * (e.g. several fields failed). Rendered as a list in the error banner. Empty\r\n * for single-message validation errors (which use {@link errorMessage}).\r\n */\r\n errorMessages: string[] = [];\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 /**\r\n * Required column headers for display and the sample file. This is the static\r\n * base set from constants PLUS any tenant-level required profile fields the\r\n * host app configured (e.g. phone / address / employer), mapped to friendly\r\n * headers and de-duplicated (case-insensitive) against the base columns.\r\n * @return {string[]}\r\n */\r\n get requiredColumns(): string[] {\r\n const base: string[] = this.screenTexts?.requiredColumns ?? [];\r\n return this.mergeTenantColumns(base);\r\n }\r\n\r\n /**\r\n * Appends the tenant-configured columns (from {@link tenantExtraColumns}) to\r\n * the base column headers.\r\n * @param {string[]} base - The static base column headers.\r\n * @return {string[]}\r\n * @memberof RosterImportComponent\r\n */\r\n private mergeTenantColumns(base: string[]): string[] {\r\n const extras = this.tenantExtraColumns(base);\r\n return extras.length ? [...base, ...extras.map((c) => c.label)] : base;\r\n }\r\n\r\n /**\r\n * Resolves the tenant-configured required profile fields into the EXTRA\r\n * columns to append after the base set — the single source of truth shared by\r\n * both the header list ({@link requiredColumns}) and the sample file\r\n * ({@link downloadSampleFile}) so the two never drift out of alignment.\r\n *\r\n * Each field becomes one column with its friendly `label` (known keys use the\r\n * label map; unknown keys fall back to a title-cased key) and a `sampleValue`\r\n * for the sample row. Fields whose label already exists in the base set\r\n * (case-insensitive) are skipped so a tenant field like \"employer\" that is\r\n * already a base column is not duplicated.\r\n * @param {string[]} base - The static base column headers.\r\n * @return {{ label: string; sampleValue: string }[]}\r\n * @memberof RosterImportComponent\r\n */\r\n private tenantExtraColumns(\r\n base: string[]\r\n ): { label: string; sampleValue: string }[] {\r\n const tenantFields = this.groupService?.getRequiredProfileFields() ?? [];\r\n if (!tenantFields.length) {\r\n return [];\r\n }\r\n const sampleMap = this.screenTexts?.tenantFieldSampleValues ?? {};\r\n const seen = new Set(base.map((col) => col.toLowerCase()));\r\n const extras: { label: string; sampleValue: string }[] = [];\r\n tenantFields.forEach((field) => {\r\n const label = this.tenantFieldLabel(field);\r\n if (label && !seen.has(label.toLowerCase())) {\r\n seen.add(label.toLowerCase());\r\n extras.push({ label, sampleValue: sampleMap[field] ?? '' });\r\n }\r\n });\r\n return extras;\r\n }\r\n\r\n /**\r\n * Maps a tenant field key to its display header. Known keys use the configured\r\n * label map; unknown keys fall back to a title-cased key.\r\n * @param {string} field - The tenant field key (e.g. 'phone').\r\n * @return {string}\r\n * @memberof RosterImportComponent\r\n */\r\n private tenantFieldLabel(field: string): string {\r\n const labels = this.screenTexts?.tenantFieldLabels ?? {};\r\n if (labels[field]) {\r\n return labels[field];\r\n }\r\n // Fallback: \"phone_number\" -> \"Phone Number\".\r\n return field\r\n .replace(/[_-]+/g, ' ')\r\n .replace(/\\b\\w/g, (char) => char.toUpperCase());\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 // Reset so re-selecting the same file triggers change again.\r\n input.value = '';\r\n return;\r\n }\r\n this.processFile(input.files[0]);\r\n // Reset the native input value so picking the same file after an error\r\n // still fires the change event (otherwise the browser skips it because\r\n // the value hasn't changed).\r\n input.value = '';\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.errorMessages = [];\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.errorMessages = [];\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 * Returns from the result screen to a clean upload state so the user can\r\n * upload a corrected file (e.g. after downloading the error log) without\r\n * closing and reopening the import dialog. Clears the previous file,\r\n * result, errors and job id.\r\n * @memberof RosterImportComponent\r\n */\r\n onUploadNewFile(): void {\r\n this.selectedFile = null;\r\n this.errorMessage = null;\r\n this.errorMessages = [];\r\n this.noDataMessage = null;\r\n this.uploadResult = null;\r\n this.jobErrors = [];\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.errorMessages = [];\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 // Reset the selected file so the user can pick a new (or the same) file\r\n // after an error. Without this, selectedFile stays set and the dropzone\r\n // shows the old filename; worse, re-selecting the same file doesn't fire\r\n // the input's change event (the value hasn't changed), leaving the user\r\n // stuck.\r\n this.selectedFile = null;\r\n\r\n // BE error codes take priority when present (e.g. 1071 no permission, 1072\r\n // format, 1073 too large, 1074 row limit, 1075 invalid status). The BE can\r\n // return MULTIPLE codes at once (e.g. [\"2017\",\"2018\",\"2014\"] when several\r\n // fields fail), so map and show ALL of them — not just the first — as a\r\n // list in the error banner.\r\n const errorCodes: string[] | undefined = error?.error?.body?.errorCodes;\r\n if (Array.isArray(errorCodes) && errorCodes.length) {\r\n const messages = errorCodes.map(\r\n (code) =>\r\n this.constants?.errors?.[code as keyof typeof this.constants.errors] ??\r\n this.screenTexts?.validation?.uploadFailed ??\r\n 'An error occurred while importing the roster. Please try again.'\r\n );\r\n // De-duplicate so the same message is not repeated when two codes map to\r\n // the same text.\r\n this.errorMessages = Array.from(new Set(messages));\r\n // Keep errorMessage populated (first message) for backward compatibility\r\n // and for the single-line case.\r\n this.errorMessage = this.errorMessages[0] ?? null;\r\n return;\r\n }\r\n\r\n // A 403 with no error-code body comes from the endpoint's @PreAuthorize\r\n // (the user lacks Manage Group Member / Manage All Rosters for this group).\r\n // Show the permission message — retrying will not help.\r\n const status = error?.status ?? error?.error?.status;\r\n if (status === 403) {\r\n this.errorMessage =\r\n this.screenTexts?.validation?.forbidden ??\r\n 'You do not have permission to import a roster for this group.';\r\n return;\r\n }\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 * Normalizes the BE `error_report` into row-error view models.\r\n *\r\n * The BE wraps the per-row entries in a `{ rows: [ { row, field, message } ] }`\r\n * document, but that value has been observed to arrive in MULTIPLE shapes:\r\n * - a parsed object `{ rows: [...] }` (confirm response — the common case),\r\n * - a raw JSON string of the same object (JSONB passthrough), or\r\n * - a bare array `[ { row, field, message } ]`.\r\n * This handles all three (and `null`) so the error log renders regardless of\r\n * how the field is serialized.\r\n * @param {*} errorReport - The BE error_report (object, string, array, or null).\r\n * @return {RosterImportRowError[]}\r\n * @memberof RosterImportComponent\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private parseErrorReport(errorReport?: any): RosterImportRowError[] {\r\n if (!errorReport) {\r\n return [];\r\n }\r\n // If it's a string, parse it first; on parse failure, no row errors.\r\n let value: unknown = errorReport;\r\n if (typeof errorReport === 'string') {\r\n try {\r\n value = JSON.parse(errorReport);\r\n } catch {\r\n return [];\r\n }\r\n }\r\n // Accept either a bare array or a { rows: [...] } wrapper object.\r\n const entries: RosterImportErrorReport[] = Array.isArray(value)\r\n ? (value as RosterImportErrorReport[])\r\n : ((value as { rows?: RosterImportErrorReport[] })?.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 }\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. The base row values come from constants; sample\r\n // values for any tenant-configured columns are appended (from the SAME\r\n // source that builds the headers) so every row lines up with the\r\n // (base + tenant) header set.\r\n const base: string[] = this.screenTexts?.requiredColumns ?? [];\r\n const baseSampleRows: string[][] = this.screenTexts?.sampleRows ?? [];\r\n const tenantSampleCells = this.tenantExtraColumns(base).map(\r\n (col) => col.sampleValue\r\n );\r\n const dataLines = baseSampleRows.map((row) =>\r\n [...row, ...tenantSampleCells]\r\n .map((cell) => this.toCsvCell(cell))\r\n .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 && importState === 'upload'\"\r\n mat-button\r\n type=\"button\"\r\n class=\"mat-tertiary-button ieeesa-roster-import__import-btn\"\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=\"errorMessages.length || errorMessage\"\r\n class=\"ieeesa-roster-import__error-banner\"\r\n role=\"alert\"\r\n >\r\n <!-- Multiple API error messages (e.g. several fields failed): list them. -->\r\n <ul\r\n *ngIf=\"errorMessages.length > 1; else singleError\"\r\n class=\"ieeesa-roster-import__error-list\"\r\n >\r\n <li *ngFor=\"let message of errorMessages\">{{ message }}</li>\r\n </ul>\r\n <!-- Single message (validation errors or one API error). -->\r\n <ng-template #singleError>\r\n {{ errorMessages[0] ?? errorMessage }}\r\n </ng-template>\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 <button\r\n *ngIf=\"importState === 'result'\"\r\n mat-button\r\n type=\"button\"\r\n class=\"mat-primary-button ieeesa-roster-import__upload-new-btn\"\r\n (click)=\"onUploadNewFile()\"\r\n [attr.aria-label]=\"screenTexts?.ariaLabel?.uploadNewFile ?? 'Upload different file'\"\r\n >\r\n {{ screenTexts?.buttons?.uploadNewFile ?? 'Upload Different File' }}\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 { DateTime } from 'luxon';\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. The \"Timestamp\" and \"Person Imported\" columns\r\n * map to `createdOn` / `createdBy`; these are currently `@JsonIgnore` on the BE\r\n * entity, so until the BE exposes them the columns show a placeholder, and they\r\n * populate automatically once the response carries the fields. \"Target Group\"\r\n * 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 // createdOn / createdBy are populated only once the BE exposes them\r\n // (currently @JsonIgnore). Until then they are undefined and the\r\n // placeholder is shown.\r\n timestamp: job?.createdOn\r\n ? this.formatTimestamp(job.createdOn)\r\n : this.placeholder,\r\n personImported: job?.createdBy ?? 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 * Formats the BE `createdOn` timestamp for display, converting from UTC to the\r\n * browser's local timezone.\r\n *\r\n * The API sends a UTC wall-clock string in `dd/MM/yyyy HH:mm:ss` with NO zone\r\n * marker, so it must be parsed EXPLICITLY as UTC (otherwise luxon/JS would\r\n * assume local time and shift it incorrectly), then rendered in the system\r\n * (browser) zone via toLocal(). Uses luxon per the project's date standards\r\n * (moment is legacy — not used for new code).\r\n * @param {string} value - The raw UTC createdOn value from the BE.\r\n * @return {string} the localized display string, or the placeholder when\r\n * blank/invalid.\r\n * @memberof RosterImportHistoryComponent\r\n */\r\n private formatTimestamp(value: string): string {\r\n if (!value) {\r\n return this.placeholder;\r\n }\r\n const parsed = this.parseUtcTimestamp(value);\r\n if (!parsed || !parsed.isValid) {\r\n return this.placeholder;\r\n }\r\n // toLocal() shifts to the browser's zone; format to match the Figma:\r\n // \"20 Aug 2026 · 3:55 PM\" (no seconds, 12-hour time with AM/PM).\r\n return parsed.toLocal().toFormat(\"dd LLL yyyy '·' h:mm a\");\r\n }\r\n\r\n /**\r\n * Parses a BE timestamp string into a luxon {@link DateTime}, tolerant of the\r\n * several shapes the backend may send so the UI renders correctly regardless\r\n * of which format is used.\r\n *\r\n * The agreed/expected BE format is a UTC wall-clock string `dd/MM/yyyy HH:mm:ss`\r\n * with NO zone marker; it is tried FIRST and parsed explicitly in UTC. If the\r\n * BE instead sends a different shape, these fallbacks are tried in order:\r\n * 1. `dd/MM/yyyy HH:mm:ss` (UTC) — the expected/agreed format\r\n * 2. ISO-8601 (e.g. 2026-10-09T14:23:05Z or with offset) — zone from the string,\r\n * or assumed UTC when the string carries none\r\n * 3. SQL datetime `yyyy-MM-dd HH:mm:ss` (UTC)\r\n * 4. `dd/MM/yyyy HH:mm` (UTC, no seconds)\r\n * 5. RFC-2822 / HTTP date\r\n * 6. native JS Date (last resort) — assumed UTC\r\n * The first format that yields a valid DateTime wins. Returns null when none\r\n * parse.\r\n * @param {string} value - The raw timestamp string from the BE.\r\n * @return {(DateTime | null)}\r\n * @memberof RosterImportHistoryComponent\r\n */\r\n private parseUtcTimestamp(value: string): DateTime | null {\r\n const raw = value.trim();\r\n const utc = { zone: 'utc' };\r\n\r\n // 1. Expected/agreed format first.\r\n let parsed = DateTime.fromFormat(raw, 'dd/MM/yyyy HH:mm:ss', utc);\r\n if (parsed.isValid) {\r\n return parsed;\r\n }\r\n\r\n // 2. ISO-8601. setZone keeps an explicit offset/Z; a zoneless ISO string is\r\n // interpreted as UTC (matches the \"wall-clock is UTC\" contract).\r\n parsed = DateTime.fromISO(raw, { setZone: true });\r\n if (parsed.isValid) {\r\n // When the ISO string had no zone, luxon used the system zone; re-interpret\r\n // as UTC so a zoneless value is still treated as UTC.\r\n return /[zZ]|[+-]\\d{2}:?\\d{2}$/.test(raw)\r\n ? parsed\r\n : DateTime.fromISO(raw, utc);\r\n }\r\n\r\n // 3. SQL datetime.\r\n parsed = DateTime.fromFormat(raw, 'yyyy-MM-dd HH:mm:ss', utc);\r\n if (parsed.isValid) {\r\n return parsed;\r\n }\r\n\r\n // 4. Day/month/year without seconds.\r\n parsed = DateTime.fromFormat(raw, 'dd/MM/yyyy HH:mm', utc);\r\n if (parsed.isValid) {\r\n return parsed;\r\n }\r\n\r\n // 5. RFC-2822 / HTTP date (both carry their own zone).\r\n parsed = DateTime.fromRFC2822(raw);\r\n if (parsed.isValid) {\r\n return parsed;\r\n }\r\n parsed = DateTime.fromHTTP(raw);\r\n if (parsed.isValid) {\r\n return parsed;\r\n }\r\n\r\n // 6. Last resort: native Date, treated as UTC.\r\n const jsDate = new Date(raw);\r\n if (!isNaN(jsDate.getTime())) {\r\n return DateTime.fromJSDate(jsDate, utc);\r\n }\r\n\r\n return null;\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","/* eslint-disable no-unused-vars */\r\n\r\n/**\r\n * Interest-form field types frozen on each stored response via the backend's\r\n * {@code field_type_snapshot} column. Mirrors the BE `FieldType` enum\r\n * (sa-saapps-groups-api: org.ieee.standards.groups.model.FieldType) and drives\r\n * how {@link InterestFormResponse.answerValue} is rendered in the admin\r\n * \"View Responses\" dialog (single value vs. a list for CHECKBOX).\r\n */\r\nexport enum InterestFieldType {\r\n TEXT = 'TEXT',\r\n TEXTAREA = 'TEXTAREA',\r\n SELECT = 'SELECT',\r\n CHECKBOX = 'CHECKBOX',\r\n RADIO = 'RADIO',\r\n DATE = 'DATE',\r\n}\r\n\r\n/**\r\n * A single submitted answer to an interest-form question, as returned by the\r\n * backend from\r\n * {@code GET {apiBaseUrl}/groups/interest/{interestId}/responses}.\r\n *\r\n * Mirrors the UI-view projection of the BE `InterestFormResponse` entity\r\n * (sa-saapps-groups-api: org.ieee.standards.groups.model.InterestFormResponse);\r\n * only the fields annotated with the BE `@JsonView(UiView)` are serialized —\r\n * the audit/app_id columns are `@JsonIgnore` and never arrive on the client.\r\n *\r\n * {@link questionLabelSnapshot} and {@link fieldTypeSnapshot} freeze the\r\n * question label and field type as configured at submit time, so later form\r\n * configuration changes apply only to new submissions (R8.6, R8.8).\r\n * {@link answerValue} is a JSONB passthrough: it arrives as a plain string for\r\n * single-value fields (TEXT/TEXTAREA/SELECT/RADIO/DATE) and as a string[] for\r\n * multi-select (CHECKBOX).\r\n */\r\nexport interface InterestFormResponse {\r\n /** Response row identifier (e.g. \"IFR_SAAPPS_...\"). */\r\n responseId: string;\r\n /** The interest record this answer belongs to (e.g. \"GINT_SAAPPS_...\"). */\r\n interestId: string;\r\n /** The question this answer is for (e.g. \"IFQ_SAAPPS_...\"), when available. */\r\n questionId?: string;\r\n /** Question label frozen at submit time (R8.6, R8.8). */\r\n questionLabelSnapshot?: string;\r\n /** Field type frozen at submit time; see {@link InterestFieldType}. */\r\n fieldTypeSnapshot?: string;\r\n /**\r\n * Submitted answer. A string for single-value fields; a string[] for\r\n * CHECKBOX. `null`/undefined when the question was left unanswered.\r\n */\r\n answerValue?: string | string[] | null;\r\n}\r\n\r\n/**\r\n * A single organization affiliation on an interested-roster row, as returned\r\n * inside {@link GroupInterestResponseView.affiliation}. Mirrors the UI-view\r\n * projection of the BE `Organization` entity (only `orgId`/`orgName` are\r\n * `@JsonView(UiView)`; the rest are `@JsonIgnore`).\r\n */\r\nexport interface InterestAffiliation {\r\n /** Organization id (e.g. \"ORG_SAAPPS_...\"). */\r\n orgId: string;\r\n /** Organization display name. */\r\n orgName: string;\r\n}\r\n\r\n/**\r\n * A single membership level (role) on an interested-roster row, as returned\r\n * inside {@link GroupInterestResponseView.memberLevel}. Mirrors the UI-view\r\n * projection of the BE role object: the level is a group role, so the fields\r\n * are role-shaped ({@link roleId}/{@link roleName}). The list carries at most\r\n * one element — the interest's current/assigned membership level (empty when\r\n * none is assigned).\r\n */\r\nexport interface InterestMembershipLevel {\r\n /** Role id of the membership level (e.g. \"ROLE_SAAPPS_...\"). */\r\n roleId: string;\r\n /** Role type id, when categorized; `null` otherwise. */\r\n roleType?: string | null;\r\n /** Display name of the level (e.g. \"Member\"). Bound as the dropdown value. */\r\n roleName: string;\r\n /** Human-readable role type name; `null` otherwise. */\r\n roleTypeName?: string | null;\r\n /** Display order within the group type's role catalog. */\r\n viewOrder?: number;\r\n}\r\n\r\n/**\r\n * One interested-users roster row for a group, as returned by the backend from\r\n * {@code GET {apiBaseUrl}/groups/interest/group/{groupId}/responses}.\r\n *\r\n * Mirrors the UI-view projection of the BE `GroupInterestResponseView` read\r\n * object (sa-saapps-groups-api:\r\n * org.ieee.standards.groups.model.GroupInterestResponseView). It combines the\r\n * interest record with the interested user's name/email, their organization\r\n * affiliations for the group, the submitted timestamp, the group's default\r\n * membership level (at most one element), and the group's type id, so the whole\r\n * \"Interested\" roster renders in a single call (R8.7). Only `@JsonView(UiView)`\r\n * fields are serialized; tenant app_id and audit columns stay hidden.\r\n */\r\nexport interface GroupInterestResponseView {\r\n /** The interest record id (e.g. \"GINT_SAAPPS_...\"). */\r\n interestId: string;\r\n /** The group the interest belongs to (e.g. \"GRP_SAAPPS_...\"). */\r\n groupId?: string;\r\n /** The interested user's id (e.g. \"User_NESC_...\"). */\r\n userId: string;\r\n /** Interested user's display name. */\r\n name: string;\r\n /** Interested user's email address. */\r\n email: string;\r\n /** Organization affiliations for the group (id + name). */\r\n affiliation: InterestAffiliation[];\r\n /** Submitted timestamp (ISO date string; BE `Date`). */\r\n submittedOn: string;\r\n /** Group's default membership level (0 or 1 element). */\r\n memberLevel: InterestMembershipLevel[];\r\n /** The group's group type id. */\r\n groupTypeId?: string;\r\n}\r\n\r\n/**\r\n * Request payload for the interested-users roster list endpoint\r\n * ({@code POST {apiBaseUrl}/groups/interest/group/{groupId}/responses}).\r\n *\r\n * Follows the repo payload convention of wrapping the request body in a\r\n * {@code payload} key (matching FilterUsersPayload, SearchUsersPayload, etc.).\r\n * Supports server-side search ({@link InterestedRostersRequestBody.searchByNameOrEmail})\r\n * and pagination/sorting so the \"Interested Rosters\" table can page and sort\r\n * large rosters without loading everything client-side.\r\n */\r\nexport interface InterestedRostersRequestPayload {\r\n payload: InterestedRostersRequestBody;\r\n}\r\n\r\n/**\r\n * The body of {@link InterestedRostersRequestPayload}. All fields are sent to\r\n * the backend to filter, page and sort the interested-users roster.\r\n */\r\nexport interface InterestedRostersRequestBody {\r\n /** Free-text search term matched against the requester's name or email. */\r\n searchByNameOrEmail: string;\r\n /** Zero-based row offset for the requested page. */\r\n offset: number;\r\n /** Number of rows per page. */\r\n pageSize: number;\r\n /** Column key to sort by (e.g. \"name\", \"submittedOn\"). */\r\n sortedBy: string;\r\n /** Sort direction (e.g. \"asc\" / \"desc\"). */\r\n sortedOrderBy: string;\r\n}\r\n\r\n/**\r\n * The `body` of the interested-users roster list response, as returned by\r\n * {@code POST {apiBaseUrl}/groups/interest/group/{groupId}/responses}.\r\n *\r\n * The rows live under {@link data}; the remaining fields echo the paging state\r\n * ({@link totalRecords}, {@link offset}, {@link pageSize}) so the table can\r\n * drive pagination. The outer envelope ({@code status}/{@code message}/\r\n * {@code body}) is unwrapped by the HTTP layer, so this models the `body` only.\r\n */\r\nexport interface InterestedRostersResponse {\r\n /** The interested-roster rows for the requested page. */\r\n data: GroupInterestResponseView[];\r\n /** Total number of interested-roster rows across all pages. */\r\n totalRecords: number;\r\n /** Zero-based row offset of the returned page. */\r\n offset: number;\r\n /** Number of rows per page used for this response. */\r\n pageSize: number;\r\n}\r\n\r\n/**\r\n * A single interested-roster row shown in the Roster Management \"Interested\r\n * Rosters\" table. Carries the {@link interestId} needed to fetch that\r\n * requester's stored responses via the interest-responses endpoint and to\r\n * override their membership level. Rows are produced by mapping the backend\r\n * {@link GroupInterestResponseView} list onto this flattened display shape.\r\n */\r\nexport interface InterestedRoster {\r\n /** The interest record id (e.g. \"GINT_SAAPPS_...\"), used for responses + override. */\r\n interestId: string;\r\n /** The interested user's id (e.g. \"User_NESC_...\"), used for the level override. */\r\n userId: string;\r\n /** Requester display name. */\r\n name: string;\r\n /** Requester email address. */\r\n email: string;\r\n /** Requester affiliations (organizations). */\r\n affiliations: string[];\r\n /** Submission date, preformatted for display. */\r\n submittedOn: string;\r\n /** Current/assigned membership level name, or null when none is assigned. */\r\n memberLevel: string | null;\r\n}\r\n\r\n/**\r\n * Request payload for overriding/setting an interested user's membership level\r\n * ({@code POST {apiBaseUrl}/groups/interest/member-level}).\r\n *\r\n * Follows the repo payload convention of wrapping the request body in a\r\n * {@code payload} key. Identifies the roster row by {@link UpdateMemberLevelBody.groupId}\r\n * + {@link UpdateMemberLevelBody.userId} and carries the newly selected role in\r\n * {@link UpdateMemberLevelBody.roleId}.\r\n */\r\nexport interface UpdateMemberLevelPayload {\r\n payload: UpdateMemberLevelBody;\r\n}\r\n\r\n/**\r\n * The body of {@link UpdateMemberLevelPayload}: the group and user being\r\n * updated plus the role id of the chosen membership level.\r\n */\r\nexport interface UpdateMemberLevelBody {\r\n /** The group the interested user belongs to (e.g. \"GRP_SAAPPS_...\"). */\r\n groupId: string;\r\n /** The interested user whose membership level is being set (e.g. \"User_NESC_...\"). */\r\n userId: string;\r\n /** The selected membership-level role id (e.g. \"ROLE_SAAPPS_...\"). */\r\n roleId: string;\r\n}\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 constants from '../../assets/constants.json';\r\nimport {\r\n InterestFieldType,\r\n InterestFormResponse,\r\n} from '../../models/interest-response.model';\r\nimport { GroupsService } from '../../services/groups.service';\r\nimport { Subject, takeUntil } from 'rxjs';\r\n\r\n/**\r\n * A single question/answer pair rendered in the interest responses list. Built\r\n * from a backend {@link InterestFormResponse}; {@code value} is normalized to a\r\n * display string (CHECKBOX arrays are joined).\r\n */\r\ninterface SubmissionAnswer {\r\n label: string;\r\n value: string;\r\n}\r\n\r\n/**\r\n * Payload passed into {@link InterestResponsesComponent} by the host\r\n * {@link ModalComponent} via the dynamic-input pattern.\r\n */\r\nexport interface InterestResponsesData {\r\n /** The interest record whose stored responses are shown. */\r\n interestId: string;\r\n}\r\n\r\n/**\r\n * \"View Responses\" content of the Roster Management \"Interested Rosters\" tab\r\n * (SP3M-428). Rendered inside the shared {@link ModalComponent} (which supplies\r\n * the title row and X close), it lists a requester's submitted interest-form\r\n * answers as label/value pairs. Responses are loaded on init from\r\n * {@link GroupsService.getInterestResponses} using the interest id supplied by\r\n * the host modal. All display text is sourced from constants.json.\r\n * @export\r\n * @class InterestResponsesComponent\r\n */\r\n@Component({\r\n selector: 'ieeesa-interest-responses',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './interest-responses.component.html',\r\n styleUrls: ['./interest-responses.component.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class InterestResponsesComponent implements OnInit, OnDestroy {\r\n /**\r\n * Data supplied by the host {@link ModalComponent} via the dynamic-input\r\n * pattern (`dataInputName: 'componentData'`): carries the interest id whose\r\n * responses are loaded.\r\n */\r\n @Input() componentData: InterestResponsesData | null = null;\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n constants: any = constants;\r\n texts = this.constants?.rosterInterests?.interestedRosters;\r\n\r\n submissionAnswers: SubmissionAnswer[] = [];\r\n isLoading = false;\r\n errorMessage = '';\r\n private readonly destroy$ = new Subject<void>();\r\n\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 cdr: ChangeDetectorRef\r\n ) {}\r\n\r\n /**\r\n * Loads the interest-form responses for the supplied interest id on init.\r\n * @memberof InterestResponsesComponent\r\n */\r\n ngOnInit(): void {\r\n this.loadResponses();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n }\r\n\r\n /**\r\n * Fetches and maps the interest-form responses into displayable\r\n * question/answer pairs. Failures surface a user-facing error message and are\r\n * delegated to GroupsService for alerting, mirroring the platform pattern.\r\n * @memberof InterestResponsesComponent\r\n */\r\n private loadResponses(): void {\r\n const interestId = this.componentData?.interestId;\r\n if (!interestId) return;\r\n this.isLoading = true;\r\n this.groupsService\r\n .getInterestResponses(interestId)\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (responses) => {\r\n this.submissionAnswers = this.mapResponses(responses);\r\n this.isLoading = false;\r\n this.cdr.detectChanges();\r\n },\r\n error: (error) => {\r\n this.isLoading = false;\r\n this.errorMessage = this.texts?.errorMessage;\r\n this.groupsService.handleErrors(error);\r\n this.cdr.detectChanges();\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Maps backend responses to label/value pairs, joining multi-select\r\n * (CHECKBOX) answers and normalizing missing values to an empty string.\r\n * @param {InterestFormResponse[]} responses\r\n * @return {SubmissionAnswer[]}\r\n * @memberof InterestResponsesComponent\r\n */\r\n private mapResponses(\r\n responses: InterestFormResponse[]\r\n ): SubmissionAnswer[] {\r\n return (responses ?? []).map((response) => ({\r\n label: response?.questionLabelSnapshot ?? '',\r\n value: this.formatAnswer(response),\r\n }));\r\n }\r\n\r\n /**\r\n * Normalizes an answer value for display. CHECKBOX answers arrive as an array\r\n * and are joined with commas; all other field types render their string\r\n * value as-is.\r\n * @param {InterestFormResponse} response\r\n * @return {string}\r\n * @memberof InterestResponsesComponent\r\n */\r\n private formatAnswer(response: InterestFormResponse): string {\r\n const value = response?.answerValue;\r\n if (Array.isArray(value)) return value.join(', ');\r\n if (response?.fieldTypeSnapshot === InterestFieldType.CHECKBOX && value) {\r\n return value;\r\n }\r\n return value ?? '';\r\n }\r\n}\r\n","<section class=\"ieeesa-interest-responses\">\r\n <p class=\"ieeesa-interest-responses__error ieeesa-body-md-16\" *ngIf=\"errorMessage\" role=\"alert\">{{ errorMessage }}</p>\r\n <dl *ngIf=\"submissionAnswers.length; else noAnswers\">\r\n <div class=\"ieeesa-interest-responses__answer\" *ngFor=\"let answer of submissionAnswers\">\r\n <dt class=\"ieeesa-body-md-16\">{{ answer.label }}</dt>\r\n <dd class=\"ieeesa-title-md-18\">{{ answer.value }}</dd>\r\n </div>\r\n </dl>\r\n <ng-template #noAnswers>\r\n <p class=\"ieeesa-interest-responses__empty ieeesa-body-md-16\" *ngIf=\"!errorMessage && !isLoading\">{{ texts?.responses?.emptyMessage }}</p>\r\n </ng-template>\r\n</section>\r\n","import {\r\n ChangeDetectorRef,\r\n Component,\r\n Inject,\r\n OnDestroy,\r\n OnInit,\r\n Optional,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MAT_DIALOG_DATA, MatDialog, MatDialogModule } from '@angular/material/dialog';\r\nimport { PageEvent } from '@angular/material/paginator';\r\nimport { Sort } from '@angular/material/sort';\r\nimport { Subject, takeUntil } from 'rxjs';\r\nimport { ModalType, SelectOption } from '@ieeesa-npm/models';\r\nimport {\r\n DataTableComponent,\r\n ModalComponent,\r\n PaginatorConfig,\r\n TableActions,\r\n TableColumnSchema,\r\n TableColumnType,\r\n} from '@ieeesa-npm/presentation';\r\nimport constants from '../../assets/constants.json';\r\nimport { GroupInfo } from '../../models/group-info.model';\r\nimport {\r\n GroupInterestResponseView,\r\n InterestedRoster,\r\n InterestedRostersRequestPayload,\r\n UpdateMemberLevelPayload,\r\n} from '../../models/interest-response.model';\r\nimport { GroupsService } from '../../services/groups.service';\r\nimport { InterestResponsesComponent } from '../interest-responses/interest-responses.component';\r\n\r\n// Groups may compile against published Presentation types without the row-label callback.\r\ntype InterestedRosterColumnSchema = TableColumnSchema & {\r\n // eslint-disable-next-line no-unused-vars\r\n ariaLabel?: (row: InterestedRoster) => string;\r\n};\r\n\r\n/**\r\n * \"Interested Rosters\" tab of the Roster Interests dialog (SP3M-428). Lists the\r\n * users who expressed interest in the group and lets a Group Admin review each\r\n * requester's submitted responses and set/override their membership level from\r\n * the Roster Management screen.\r\n *\r\n * The list is rendered through the shared {@link DataTableComponent}: the\r\n * Name/Email/Affiliations/Submitted On columns are plain TEXT, Member Level is\r\n * the reusable table's DROPDOWN column (an inline {@code ieeesa-select}) and\r\n * Form is a LINK that opens the \"View Responses\" dialog. The Member Level\r\n * options are sourced from the roles API\r\n * ({@link GroupsService.getGroupTypeRoles}) filtered to the \"Member Level\" role\r\n * type. Interested-roster rows are loaded from\r\n * {@link GroupsService.getInterestResponsesByGroup} and each requester's stored\r\n * form responses are loaded on demand from\r\n * {@link GroupsService.getInterestResponses} using the row's `interestId`. All\r\n * display text is sourced from constants.json.\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, DataTableComponent, ModalComponent, MatDialogModule],\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 implements OnInit, OnDestroy {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n constants: any = constants;\r\n texts = this.constants?.rosterInterests?.interestedRosters;\r\n\r\n private destroy$ = new Subject<boolean>();\r\n\r\n /**\r\n * Member-level dropdown options, sourced from the roles API\r\n * ({@code GET /groups/config/rolesByGroupType/{groupType}}) filtered to the \"Member Level\" role type.\r\n * Each option is {@code { id: roleId, name: roleName }}.\r\n */\r\n memberLevelOptions: SelectOption[] = [];\r\n\r\n rosters: InterestedRoster[] = [];\r\n tableData: InterestedRoster[] = [];\r\n columnSchema: InterestedRosterColumnSchema[] = [];\r\n\r\n /** Total interested-roster rows reported by the backend (for paging/counts). */\r\n totalRecords = 0;\r\n\r\n paginatorConfig: PaginatorConfig = {\r\n recordsPerPage: this.texts?.pageSizeOptions?.[0],\r\n pageSizeOptions: this.texts?.pageSizeOptions,\r\n totalRecords: 0,\r\n };\r\n pageIndex = 0;\r\n defaultSortedColumn = 'submittedOn';\r\n defaultColumnSortDirection: Sort['direction'] = 'desc';\r\n private sortedBy = this.defaultSortedColumn;\r\n private sortedOrderBy = this.defaultColumnSortDirection;\r\n\r\n /** Read-only table — no search / filter / add / edit / delete actions. */\r\n tableActions: TableActions = {\r\n isPaginationNeeded: true,\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 isLoading = false;\r\n\r\n constructor(\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 groupsService: 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 @Optional() @Inject(MAT_DIALOG_DATA) public group: GroupInfo | null\r\n ) {}\r\n\r\n /**\r\n * Builds the reusable-table column schema and loads the interested-roster\r\n * list for the current group from the backend.\r\n * @memberof InterestedRostersComponent\r\n */\r\n ngOnInit(): void {\r\n this.loadMemberLevelOptions();\r\n this.buildColumnSchema();\r\n this.loadInterestedRosters();\r\n }\r\n\r\n /**\r\n * Cleans up in-flight subscriptions when the component is destroyed.\r\n * @memberof InterestedRostersComponent\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 * Resolves the current group id from the dialog data (falling back to the\r\n * service's selected group) and loads the interested-roster rows for it. Maps\r\n * each backend {@link GroupInterestResponseView} onto the flattened\r\n * {@link InterestedRoster} shape the reusable table binds to. On failure the\r\n * table is cleared and the error is delegated to GroupsService for alerting.\r\n * @memberof InterestedRostersComponent\r\n */\r\n private loadInterestedRosters(): void {\r\n const groupId =\r\n this.group?.groupId ??\r\n this.groupsService.getSelectedGroupInfo()?.groupId;\r\n if (!groupId) return;\r\n this.isLoading = true;\r\n const payload: InterestedRostersRequestPayload = {\r\n payload: {\r\n searchByNameOrEmail: '',\r\n offset: this.pageIndex * this.paginatorConfig.recordsPerPage,\r\n pageSize: this.paginatorConfig.recordsPerPage,\r\n sortedBy: this.sortedBy,\r\n sortedOrderBy: this.sortedOrderBy,\r\n },\r\n };\r\n this.groupsService\r\n .getInterestResponsesByGroup(groupId, payload)\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (response) => {\r\n this.totalRecords = response?.totalRecords ?? 0;\r\n this.paginatorConfig = {\r\n ...this.paginatorConfig,\r\n totalRecords: this.totalRecords,\r\n };\r\n this.rosters = (response?.data ?? []).map((view) =>\r\n this.mapToRoster(view)\r\n );\r\n this.tableData = this.rosters;\r\n this.isLoading = false;\r\n this.cdr.detectChanges();\r\n },\r\n error: (error) => {\r\n this.rosters = [];\r\n this.tableData = [];\r\n this.totalRecords = 0;\r\n this.paginatorConfig = { ...this.paginatorConfig, totalRecords: 0 };\r\n this.isLoading = false;\r\n this.groupsService.handleErrors(error, false);\r\n this.cdr.detectChanges();\r\n },\r\n });\r\n }\r\n\r\n onPaginationChange(event: PageEvent): void {\r\n this.pageIndex = event.pageIndex;\r\n this.paginatorConfig = {\r\n ...this.paginatorConfig,\r\n recordsPerPage: event.pageSize,\r\n };\r\n this.loadInterestedRosters();\r\n }\r\n\r\n onSortChange(event: Sort): void {\r\n this.sortedBy = event.direction ? event.active : this.defaultSortedColumn;\r\n this.sortedOrderBy = event.direction || this.defaultColumnSortDirection;\r\n this.pageIndex = 0;\r\n this.loadInterestedRosters();\r\n }\r\n\r\n /**\r\n * Maps a backend {@link GroupInterestResponseView} to the flattened\r\n * {@link InterestedRoster} row the table renders: affiliation org names are\r\n * joined into the affiliations list, the assigned membership level (if any)\r\n * becomes the role name — which the Member Level dropdown binds as its\r\n * pre-selected value — the submitted timestamp is formatted for display, and\r\n * the interest id is carried through for the responses dialog and the level\r\n * override.\r\n * @param {GroupInterestResponseView} view\r\n * @return {InterestedRoster}\r\n * @memberof InterestedRostersComponent\r\n */\r\n private mapToRoster(view: GroupInterestResponseView): InterestedRoster {\r\n return {\r\n interestId: view?.interestId,\r\n userId: view?.userId,\r\n name: view?.name,\r\n email: view?.email,\r\n affiliations: (view?.affiliation ?? []).map((org) => org?.orgName),\r\n submittedOn: this.formatSubmittedOn(view?.submittedOn),\r\n memberLevel: view?.memberLevel?.length\r\n ? view.memberLevel[0]?.roleName ?? null\r\n : null,\r\n };\r\n }\r\n\r\n /**\r\n * Formats the backend submitted timestamp (ISO date string) for display,\r\n * falling back to the raw value when it is not a parseable date.\r\n * @param {string} submittedOn\r\n * @return {string}\r\n * @memberof InterestedRostersComponent\r\n */\r\n private formatSubmittedOn(submittedOn: string): string {\r\n if (!submittedOn) return '';\r\n const date = new Date(submittedOn);\r\n return isNaN(date.getTime())\r\n ? submittedOn\r\n : date.toLocaleDateString('en-US');\r\n }\r\n\r\n /**\r\n * Loads the Member Level dropdown options from the roles API\r\n * ({@code GET /groups/config/rolesByGroupType/{groupType}}), keeping only roles whose\r\n * {@code roleTypeName} is \"Member Level\" and mapping each to a\r\n * {@link SelectOption} ({@code { id: roleId, name: roleName }}).\r\n * @memberof InterestedRostersComponent\r\n */\r\n private loadMemberLevelOptions(): void {\r\n const groupType =\r\n this.group?.groupType ??\r\n this.groupsService.getSelectedGroupInfo()?.groupType;\r\n if (!groupType) return;\r\n this.groupsService\r\n .getGroupTypeRoles(groupType)\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: () => {\r\n this.memberLevelOptions = (this.groupsService.getMemberTypes() ?? [])\r\n .map((role) => ({ id: role.roleId, name: role.roleName }));\r\n this.buildColumnSchema();\r\n this.cdr.detectChanges();\r\n },\r\n error: (error) => {\r\n this.groupsService.handleErrors(error);\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Persists the membership-level override when the admin picks a value in a\r\n * row's Member Level dropdown (bound to the reusable table's\r\n * `rowDropdownChange` output). Builds the request from the dialog's current\r\n * group id, the row's user id and the selected option's id (the role id), and\r\n * posts it to the backend. The row's displayed level is updated optimistically\r\n * and reverted if the save fails.\r\n * @param {{ row: InterestedRoster; option: SelectOption }} event\r\n * @memberof InterestedRostersComponent\r\n */\r\n onMemberLevelChange(event: {\r\n row: InterestedRoster;\r\n option: SelectOption;\r\n }): void {\r\n const row = event?.row;\r\n const option = event?.option;\r\n const groupId =\r\n this.group?.groupId ??\r\n this.groupsService.getSelectedGroupInfo()?.groupId;\r\n const roleId = option?.id as string;\r\n if (!row?.userId || !groupId || !roleId) return;\r\n\r\n const previousLevel = row.memberLevel;\r\n // Optimistically reflect the selection in the row.\r\n row.memberLevel = option?.name ?? row.memberLevel;\r\n\r\n const payload: UpdateMemberLevelPayload = {\r\n payload: {\r\n groupId,\r\n userId: row.userId,\r\n roleId,\r\n },\r\n };\r\n this.groupsService\r\n .updateInterestMemberLevel(payload)\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n error: (error) => {\r\n // Revert the optimistic change on failure and surface the error.\r\n row.memberLevel = previousLevel;\r\n this.cdr.detectChanges();\r\n this.groupsService.handleErrors(error);\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Opens the \"View Responses\" dialog for a roster row (bound to the reusable\r\n * table's LINK output) using the shared {@link ModalComponent}. The modal\r\n * supplies the title row and X close; the requester's stored interest-form\r\n * responses are rendered by {@link InterestResponsesComponent}, which loads\r\n * them from the backend using the row's {@code interestId} passed via the\r\n * ModalComponent dynamic-input pattern.\r\n * @param {InterestedRoster} row\r\n * @memberof InterestedRostersComponent\r\n */\r\n onFormLinkClick(row: InterestedRoster): void {\r\n if (!row?.interestId) return;\r\n const dialogOptions = {\r\n heading: this.texts?.responses?.title,\r\n subHeading: this.group?.groupName,\r\n headingClass: 'ieeesa-title-lg-24',\r\n isCloseNeeded: true,\r\n componentReference: InterestResponsesComponent,\r\n modalType: ModalType.FORM,\r\n data2DynamicComponent: { interestId: row.interestId },\r\n dataInputName: 'componentData',\r\n };\r\n this.dialog.open(ModalComponent, {\r\n data: dialogOptions,\r\n panelClass: ['ieeesa-modal-dialog', 'ieeesa-interest-responses-dialog'],\r\n width: '800px',\r\n maxWidth: '95vw',\r\n maxHeight: '90vh',\r\n ariaModal: true,\r\n });\r\n }\r\n\r\n /**\r\n * Defines the reusable-table columns for the Interested Rosters list. Every\r\n * `cellData`/`selectedOption` is a `(row) => ...` accessor, matching the\r\n * shared table's contract. Member Level is the DROPDOWN column seeded with the\r\n * configured levels plus \"None\"; Form is a LINK that opens the responses\r\n * dialog.\r\n * @memberof InterestedRostersComponent\r\n */\r\n private buildColumnSchema(): void {\r\n const columns = this.texts?.columns;\r\n this.columnSchema = [\r\n {\r\n id: 1,\r\n columnDef: 'name',\r\n heading: columns?.name,\r\n columnType: TableColumnType.TEXT,\r\n isSortableColumn: true,\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n cellData: (row: any) => row.name,\r\n },\r\n {\r\n id: 2,\r\n columnDef: 'email',\r\n heading: columns?.email,\r\n columnType: TableColumnType.TEXT,\r\n isSortableColumn: true,\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n cellData: (row: any) => row.email,\r\n },\r\n {\r\n id: 3,\r\n columnDef: 'affiliations',\r\n heading: columns?.affiliations,\r\n columnType: TableColumnType.TEXT,\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n cellData: (row: any) => (row.affiliations || []).join(', '),\r\n },\r\n {\r\n id: 4,\r\n columnDef: 'submittedOn',\r\n heading: columns?.submittedOn,\r\n columnType: TableColumnType.TEXT,\r\n isSortableColumn: true,\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n cellData: (row: any) => row.submittedOn,\r\n },\r\n {\r\n id: 5,\r\n columnDef: 'memberLevel',\r\n heading: columns?.memberLevel,\r\n columnType: TableColumnType.DROPDOWN,\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n cellData: (row: any) => row.memberLevel,\r\n dropdownOptions: this.memberLevelOptions,\r\n dropdownPlaceholder: this.texts?.memberLevelPlaceholder,\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n selectedOption: (row: any) =>\r\n this.memberLevelOptions.find((o) => o.name === row.memberLevel) ??\r\n null,\r\n },\r\n {\r\n id: 6,\r\n columnDef: 'form',\r\n heading: columns?.form,\r\n columnType: TableColumnType.LINK,\r\n cellData: () => this.texts?.viewLabel,\r\n ariaLabel: (row: InterestedRoster) =>\r\n `${this.texts?.viewAriaLabelPrefix} ${row?.name ?? ''}`.trim(),\r\n },\r\n ];\r\n }\r\n}\r\n","<section class=\"ieeesa-interested-rosters\" [attr.aria-label]=\"texts?.regionAriaLabel\">\r\n <p class=\"ieeesa-interested-rosters__count\">{{ totalRecords }} {{ texts?.countSuffix }}</p>\r\n <ieeesa-data-table\r\n [tableDataInfo]=\"tableData\"\r\n [columnSchemaInfo]=\"columnSchema\"\r\n [tableActions]=\"tableActions\"\r\n [paginatorConfig]=\"paginatorConfig\"\r\n [pageIndex]=\"pageIndex\"\r\n [pageSize]=\"paginatorConfig.recordsPerPage\"\r\n [defaultSortedColumn]=\"defaultSortedColumn\"\r\n [defaultColumnSortDirection]=\"defaultColumnSortDirection\"\r\n [isClearSortNeeded]=\"false\"\r\n (paginationChange)=\"onPaginationChange($event)\"\r\n (sortChange)=\"onSortChange($event)\"\r\n (rowLink)=\"onFormLinkClick($event)\"\r\n (rowDropdownChange)=\"onMemberLevelChange($event)\"\r\n ></ieeesa-data-table>\r\n</section>\r\n","/* eslint-disable no-unused-vars */\r\n\r\n/**\r\n * Supported field types for a custom interest-form question (SP3M-317). Values\r\n * match the backend FieldType enum / field_type CHECK constraint exactly.\r\n */\r\nexport enum QuestionFieldType {\r\n TEXT = 'TEXT',\r\n TEXTAREA = 'TEXTAREA',\r\n SELECT = 'SELECT',\r\n CHECKBOX = 'CHECKBOX',\r\n RADIO = 'RADIO',\r\n DATE = 'DATE',\r\n}\r\n\r\n/**\r\n * Field types that require a configurable list of options\r\n * (SELECT / CHECKBOX / RADIO), matching the backend's choice-type validation.\r\n */\r\nexport const CHOICE_FIELD_TYPES: QuestionFieldType[] = [\r\n QuestionFieldType.SELECT,\r\n QuestionFieldType.CHECKBOX,\r\n QuestionFieldType.RADIO,\r\n];\r\n\r\n/**\r\n * Interest-expression mode for a group (matches backend InterestMode).\r\n */\r\nexport enum InterestMode {\r\n DISABLED = 'DISABLED',\r\n BASIC = 'BASIC',\r\n FORM = 'FORM',\r\n}\r\n\r\n/**\r\n * A single admin-configured custom question on a group's interest form. Field\r\n * names mirror the backend InterestFormQuestion entity so payloads map directly.\r\n */\r\nexport interface CustomQuestion {\r\n questionId?: string;\r\n groupId: string;\r\n questionLabel: string;\r\n fieldType: QuestionFieldType | null;\r\n placeholder?: string;\r\n helpText?: string;\r\n isRequired: boolean;\r\n viewOrder: number;\r\n // Options are stored by the backend as a raw JSON string (JSONB). The service\r\n // layer stringifies/parses between this string and a string[] in the UI.\r\n options?: string;\r\n}\r\n\r\n/**\r\n * Lightweight transfer object for reordering questions (matches backend\r\n * QuestionOrder).\r\n */\r\nexport interface QuestionOrder {\r\n questionId: string;\r\n viewOrder: number;\r\n}\r\n\r\n/**\r\n * Group interest configuration (matches backend GroupInterestConfig).\r\n */\r\nexport interface GroupInterestConfig {\r\n groupId: string;\r\n interestMode: string;\r\n defaultLevelId: string | null;\r\n}\r\n\r\n/**\r\n * A role entry returned by GET /groups/role/{appId}. Member levels are the\r\n * subset where roleTypeName === \"Member Level\"; their roleId is used as the\r\n * interest-config defaultLevelId and roleName is the display label.\r\n */\r\nexport interface GroupRole {\r\n roleId: string;\r\n roleType: string;\r\n roleName: string;\r\n roleTypeName: string;\r\n viewOrder?: number;\r\n}\r\n\r\n/**\r\n * roleTypeName value identifying member-level roles.\r\n */\r\nexport const MEMBER_LEVEL_ROLE_TYPE = 'Member Level';\r\n","import {\r\n Component,\r\n EventEmitter,\r\n Input,\r\n OnInit,\r\n Output,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport {\r\n FormBuilder,\r\n FormGroup,\r\n ReactiveFormsModule,\r\n Validators,\r\n} from '@angular/forms';\r\nimport {\r\n CHOICE_FIELD_TYPES,\r\n CustomQuestion,\r\n QuestionFieldType,\r\n} from '../../models/custom-question.model';\r\nimport * as constants from '../../assets/constants.json';\r\n\r\n/**\r\n * Editable card for a single custom interest-form question (SP3M-317). Renders\r\n * the Question Label, Type, Required toggle, Placeholder, Help Text and (for\r\n * choice types) Options fields. Emits save/cancel so the parent manages the\r\n * questions list. The Options field is only shown for choice field types\r\n * (SELECT / CHECKBOX / RADIO), matching the backend's choice-type validation.\r\n * @export\r\n * @class CustomQuestionEditorComponent\r\n */\r\n@Component({\r\n selector: 'ieeesa-custom-question-editor',\r\n standalone: true,\r\n imports: [CommonModule, ReactiveFormsModule],\r\n templateUrl: './custom-question-editor.component.html',\r\n styleUrls: ['./custom-question-editor.component.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class CustomQuestionEditorComponent implements OnInit {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n constants: any = constants;\r\n editorTexts = this.constants?.rosterInterests?.interestForm?.questionEditor;\r\n fieldType = QuestionFieldType;\r\n typeOptions = [\r\n { value: QuestionFieldType.TEXT, label: this.editorTexts?.types?.text },\r\n {\r\n value: QuestionFieldType.TEXTAREA,\r\n label: this.editorTexts?.types?.textArea,\r\n },\r\n {\r\n value: QuestionFieldType.SELECT,\r\n label: this.editorTexts?.types?.dropdown,\r\n },\r\n {\r\n value: QuestionFieldType.CHECKBOX,\r\n label: this.editorTexts?.types?.checkbox,\r\n },\r\n { value: QuestionFieldType.RADIO, label: this.editorTexts?.types?.radio },\r\n { value: QuestionFieldType.DATE, label: this.editorTexts?.types?.date },\r\n ];\r\n\r\n @Input() question!: CustomQuestion;\r\n @Output() save = new EventEmitter<CustomQuestion>();\r\n @Output() cancel = new EventEmitter<void>();\r\n\r\n form!: FormGroup;\r\n\r\n // eslint-disable-next-line no-unused-vars\r\n constructor(private formBuilder: FormBuilder) {}\r\n\r\n /**\r\n * Builds the reactive form, seeding values from the question being edited.\r\n * The question's options are stored as a raw JSON string, so they are parsed\r\n * into one-per-line text for editing.\r\n * @memberof CustomQuestionEditorComponent\r\n */\r\n ngOnInit(): void {\r\n this.form = this.formBuilder.group({\r\n label: [this.question?.questionLabel ?? '', [Validators.required]],\r\n type: [this.question?.fieldType ?? null, [Validators.required]],\r\n required: [this.question?.isRequired ?? true],\r\n placeholder: [this.question?.placeholder ?? ''],\r\n helpText: [this.question?.helpText ?? ''],\r\n options: [this.parseOptionsString(this.question?.options)],\r\n });\r\n }\r\n\r\n /**\r\n * Parses a stored options JSON string into one-per-line text for the textarea.\r\n * @param {(string | undefined)} optionsJson\r\n * @return {string}\r\n * @memberof CustomQuestionEditorComponent\r\n */\r\n parseOptionsString(optionsJson: string[] | string | undefined): string {\r\n if (!optionsJson) return '';\r\n // Options may already be a deserialized array (the shared contract allows\r\n // string[]), so handle that before attempting to JSON.parse a raw string.\r\n if (Array.isArray(optionsJson)) return optionsJson.join('\\n');\r\n try {\r\n const parsed = JSON.parse(optionsJson);\r\n return Array.isArray(parsed) ? parsed.join('\\n') : '';\r\n } catch {\r\n return '';\r\n }\r\n }\r\n\r\n /**\r\n * Whether the currently selected type requires an options list.\r\n * @return {boolean}\r\n * @memberof CustomQuestionEditorComponent\r\n */\r\n get isChoiceType(): boolean {\r\n return CHOICE_FIELD_TYPES.includes(\r\n this.form?.get('type')?.value as QuestionFieldType\r\n );\r\n }\r\n\r\n /**\r\n * Parses the options textarea into a trimmed, non-empty string array,\r\n * stripping trailing commas.\r\n * @return {string[]}\r\n * @memberof CustomQuestionEditorComponent\r\n */\r\n parseOptions(): string[] {\r\n const raw = (this.form?.get('options')?.value ?? '') as string;\r\n return raw\r\n .split('\\n')\r\n .map((option) => option.trim().replace(/,+$/, '').trim())\r\n .filter((option) => option.length > 0);\r\n }\r\n\r\n /**\r\n * Whether the editor is valid: label and type are required, and choice types\r\n * require at least one option.\r\n * @return {boolean}\r\n * @memberof CustomQuestionEditorComponent\r\n */\r\n get isSaveDisabled(): boolean {\r\n const label = this.form?.get('label')?.value as string;\r\n // Validators.required accepts whitespace-only; onSave trims to '', so block\r\n // save when the trimmed label is empty.\r\n if (this.form?.invalid || !label?.trim()) return true;\r\n if (this.isChoiceType && this.parseOptions().length === 0) return true;\r\n return false;\r\n }\r\n\r\n /**\r\n * Emits the assembled question on save. Options are serialized to a JSON\r\n * string to match the backend's JSONB column.\r\n * @memberof CustomQuestionEditorComponent\r\n */\r\n onSave(): void {\r\n this.form.markAllAsTouched();\r\n if (this.isSaveDisabled) return;\r\n const value = this.form.getRawValue();\r\n this.save.emit({\r\n questionId: this.question?.questionId,\r\n groupId: this.question?.groupId,\r\n viewOrder: this.question?.viewOrder,\r\n questionLabel: value.label?.trim(),\r\n fieldType: value.type,\r\n isRequired: value.required,\r\n placeholder: value.placeholder?.trim(),\r\n helpText: value.helpText?.trim(),\r\n options: this.isChoiceType\r\n ? JSON.stringify(this.parseOptions())\r\n : undefined,\r\n });\r\n }\r\n\r\n /**\r\n * Emits the cancel event.\r\n * @memberof CustomQuestionEditorComponent\r\n */\r\n onCancel(): void {\r\n this.cancel.emit();\r\n }\r\n}\r\n","<form [formGroup]=\"form\" class=\"ieeesa-question-editor\">\r\n <div class=\"ieeesa-question-editor__grid\">\r\n <div class=\"ieeesa-question-editor__field\">\r\n <label class=\"ieeesa-question-editor__label ieeesa-body-sm-14\">\r\n {{ editorTexts?.labelLabel }}\r\n <span class=\"ieeesa-question-editor__required-mark\">*</span>\r\n </label>\r\n <input\r\n type=\"text\"\r\n class=\"ieeesa-question-editor__input ieeesa-body-sm-14\"\r\n formControlName=\"label\"\r\n [attr.placeholder]=\"editorTexts?.typeHerePlaceholder\"\r\n [attr.aria-label]=\"editorTexts?.labelLabel\"\r\n />\r\n </div>\r\n\r\n <div class=\"ieeesa-question-editor__field\">\r\n <label class=\"ieeesa-question-editor__label ieeesa-body-sm-14\">\r\n {{ editorTexts?.typeLabel }}\r\n </label>\r\n <select\r\n class=\"ieeesa-question-editor__input ieeesa-body-sm-14\"\r\n formControlName=\"type\"\r\n [attr.aria-label]=\"editorTexts?.typeLabel\"\r\n >\r\n <option [ngValue]=\"null\" disabled>\r\n {{ editorTexts?.selectPlaceholder }}\r\n </option>\r\n <option\r\n *ngFor=\"let option of typeOptions\"\r\n [ngValue]=\"option.value\"\r\n >\r\n {{ option.label }}\r\n </option>\r\n </select>\r\n </div>\r\n </div>\r\n\r\n <div class=\"ieeesa-question-editor__required-row d-flex align-items-center gap-2\">\r\n <span class=\"ieeesa-question-editor__label ieeesa-body-sm-14\">{{\r\n editorTexts?.requiredLabel\r\n }}</span>\r\n <label class=\"ieeesa-question-editor__switch\">\r\n <input\r\n type=\"checkbox\"\r\n formControlName=\"required\"\r\n [attr.aria-label]=\"editorTexts?.requiredLabel\"\r\n />\r\n <span class=\"ieeesa-question-editor__slider\"></span>\r\n </label>\r\n <span class=\"ieeesa-question-editor__required-hint ieeesa-body-sm-14\">{{\r\n editorTexts?.requiredLabel\r\n }}</span>\r\n </div>\r\n\r\n <div class=\"ieeesa-question-editor__grid\">\r\n <div class=\"ieeesa-question-editor__field\">\r\n <label class=\"ieeesa-question-editor__label ieeesa-body-sm-14\">\r\n {{ editorTexts?.placeholderLabel }}\r\n </label>\r\n <input\r\n type=\"text\"\r\n class=\"ieeesa-question-editor__input ieeesa-body-sm-14\"\r\n formControlName=\"placeholder\"\r\n [attr.placeholder]=\"editorTexts?.typeHerePlaceholder\"\r\n [attr.aria-label]=\"editorTexts?.placeholderLabel\"\r\n />\r\n </div>\r\n\r\n <div class=\"ieeesa-question-editor__field\">\r\n <label class=\"ieeesa-question-editor__label ieeesa-body-sm-14\">\r\n {{ editorTexts?.helpTextLabel }}\r\n </label>\r\n <input\r\n type=\"text\"\r\n class=\"ieeesa-question-editor__input ieeesa-body-sm-14\"\r\n formControlName=\"helpText\"\r\n [attr.placeholder]=\"editorTexts?.typeHerePlaceholder\"\r\n [attr.aria-label]=\"editorTexts?.helpTextLabel\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"isChoiceType\" class=\"ieeesa-question-editor__field\">\r\n <label class=\"ieeesa-question-editor__label ieeesa-body-sm-14\">\r\n {{ editorTexts?.optionsLabel }}\r\n </label>\r\n <textarea\r\n class=\"ieeesa-question-editor__textarea ieeesa-body-sm-14\"\r\n formControlName=\"options\"\r\n rows=\"5\"\r\n [attr.placeholder]=\"editorTexts?.typeHerePlaceholder\"\r\n [attr.aria-label]=\"editorTexts?.optionsLabel\"\r\n ></textarea>\r\n </div>\r\n\r\n <div class=\"ieeesa-question-editor__actions d-flex gap-3\">\r\n <button\r\n type=\"button\"\r\n class=\"ieeesa-question-editor__cancel\"\r\n (click)=\"onCancel()\"\r\n [attr.aria-label]=\"editorTexts?.cancel\"\r\n >\r\n {{ editorTexts?.cancel }}\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"ieeesa-question-editor__save\"\r\n [disabled]=\"isSaveDisabled\"\r\n (click)=\"onSave()\"\r\n [attr.aria-label]=\"editorTexts?.save\"\r\n >\r\n {{ editorTexts?.save }}\r\n </button>\r\n </div>\r\n</form>\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 { ExpressInterestDialogComponent } from '@ieeesa-npm/presentation';\r\nimport { InterestFieldType, InterestFormQuestion } from '@ieeesa-npm/models';\r\nimport { CustomQuestion } from '../../models/custom-question.model';\r\nimport * as constants from '../../assets/constants.json';\r\n\r\n/**\r\n * Data passed to the preview dialog: the group name (subtitle) and the admin's\r\n * current custom questions.\r\n */\r\nexport interface InterestFormPreviewData {\r\n groupName: string;\r\n customQuestions: CustomQuestion[];\r\n}\r\n\r\n/**\r\n * Preview host for the interest form (SP3M-317 R6.7). Reuses the shared,\r\n * presentational ExpressInterestDialogComponent in read-only preview mode so\r\n * the admin sees the form exactly as an end user would, without any submit\r\n * action — only Cancel closes the dialog. No backend call is made; the admin's\r\n * in-progress custom questions are passed straight through.\r\n * @export\r\n * @class InterestFormPreviewComponent\r\n */\r\n@Component({\r\n selector: 'ieeesa-interest-form-preview',\r\n standalone: true,\r\n imports: [CommonModule, MatDialogModule, ExpressInterestDialogComponent],\r\n templateUrl: './interest-form-preview.component.html',\r\n styleUrls: ['./interest-form-preview.component.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class InterestFormPreviewComponent {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n constants: any = constants;\r\n previewTexts = this.constants?.rosterInterests?.interestForm?.preview;\r\n subtitle = '';\r\n customQuestions: InterestFormQuestion[] = [];\r\n\r\n constructor(\r\n // eslint-disable-next-line no-unused-vars\r\n public dialogRef: MatDialogRef<InterestFormPreviewComponent>,\r\n // eslint-disable-next-line no-unused-vars\r\n @Inject(MAT_DIALOG_DATA) private data: InterestFormPreviewData\r\n ) {\r\n this.subtitle = this.data?.groupName ?? '';\r\n // Only questions with a chosen field type are previewable; a half-added\r\n // question (null fieldType) is skipped.\r\n this.customQuestions = (this.data?.customQuestions ?? [])\r\n .filter((question) => !!question.fieldType)\r\n .map((question) => ({\r\n questionId: question.questionId ?? '',\r\n questionLabel: question.questionLabel,\r\n fieldType: question.fieldType as InterestFieldType,\r\n placeholder: question.placeholder ?? null,\r\n helpText: question.helpText ?? null,\r\n isRequired: question.isRequired ?? false,\r\n viewOrder: question.viewOrder ?? null,\r\n options: question.options ?? null,\r\n }));\r\n }\r\n\r\n /**\r\n * Closes the preview dialog.\r\n * @memberof InterestFormPreviewComponent\r\n */\r\n onClose(): void {\r\n this.dialogRef?.close();\r\n }\r\n}\r\n","<ieeesa-express-interest-dialog\r\n [isPreview]=\"true\"\r\n [subtitle]=\"subtitle\"\r\n [customQuestions]=\"customQuestions\"\r\n [texts]=\"previewTexts\"\r\n (cancel)=\"onClose()\"\r\n></ieeesa-express-interest-dialog>\r\n","import { Injectable } from '@angular/core';\r\nimport { Observable, catchError, map } from 'rxjs';\r\nimport { HttpService } from '@ieeesa-npm/utility';\r\nimport {\r\n CustomQuestion,\r\n GroupInterestConfig,\r\n GroupRole,\r\n QuestionOrder,\r\n} from '../models/custom-question.model';\r\n\r\n/**\r\n * Standard API response envelope used by the groups backend.\r\n */\r\nexport interface InterestApiResponse<T> {\r\n status: boolean | string;\r\n message?: string;\r\n body?: T;\r\n}\r\n\r\n/**\r\n * Service for managing a group's interest form configuration and custom\r\n * questions (SP3M-317). Talks to the groups backend endpoints:\r\n * - GET /v1/groups/interest-config/{groupId}\r\n * - PUT /v1/groups/interest-config\r\n * - GET /v1/groups/interest-questions/{groupId}\r\n * - POST /v1/groups/interest-questions\r\n * - PUT /v1/groups/interest-questions\r\n * - PUT /v1/groups/interest-questions/reorder\r\n * - PUT /v1/groups/interest-questions/{questionId}/remove\r\n * - GET /v1/groups/interest-questions/{groupId}/preview\r\n * All write payloads are wrapped in the shared Request envelope ({ payload }).\r\n * @export\r\n * @class InterestFormService\r\n */\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class InterestFormService {\r\n apiBaseUrl!: string;\r\n\r\n // eslint-disable-next-line no-unused-vars\r\n constructor(private httpService: HttpService) {}\r\n\r\n /**\r\n * Validates the application-level envelope for a write operation. A 2xx\r\n * response can still carry an unsuccessful envelope ({ status: false }); this\r\n * throws it so callers' error handlers run instead of treating it as success.\r\n * @param {InterestApiResponse<T>} response\r\n * @return {InterestApiResponse<T>}\r\n * @memberof InterestFormService\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private assertSuccess(response: any): any {\r\n const status = response?.status;\r\n const isSuccess =\r\n status === true || status === 'true' || status === 'SUCCESS';\r\n if (!isSuccess) {\r\n throw response;\r\n }\r\n return response;\r\n }\r\n\r\n /**\r\n * Sets the API base URL (resolved from the hosting application's config).\r\n * @param {string} apiBaseUrl\r\n * @memberof InterestFormService\r\n */\r\n setApiBaseUrl(apiBaseUrl: string): void {\r\n this.apiBaseUrl = apiBaseUrl;\r\n }\r\n\r\n /**\r\n * Loads a group's interest configuration (mode + default member level).\r\n * @param {string} groupId\r\n * @return {Observable<InterestApiResponse<GroupInterestConfig>>}\r\n * @memberof InterestFormService\r\n */\r\n getInterestConfig(\r\n groupId: string\r\n ): Observable<InterestApiResponse<GroupInterestConfig>> {\r\n return this.httpService\r\n .getData(`${this.apiBaseUrl}/groups/interest-config/${groupId}`)\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 * Loads the roles configured for a group type via\r\n * GET /groups/config/rolesByGroupType/{groupTypeId}. Member levels (used to\r\n * populate the default membership level options) are the subset where\r\n * roleTypeName is \"Member Level\"; filtering is done by the caller.\r\n * @param {string} groupTypeId\r\n * @return {Observable<InterestApiResponse<GroupRole[]>>}\r\n * @memberof InterestFormService\r\n */\r\n getRoles(groupTypeId: string): Observable<InterestApiResponse<GroupRole[]>> {\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) => response),\r\n catchError((error) => {\r\n throw error;\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Saves a group's interest configuration.\r\n * @param {GroupInterestConfig} config\r\n * @return {Observable<InterestApiResponse<string>>}\r\n * @memberof InterestFormService\r\n */\r\n saveInterestConfig(\r\n config: GroupInterestConfig\r\n ): Observable<InterestApiResponse<string>> {\r\n return this.httpService\r\n .putData(`${this.apiBaseUrl}/groups/interest-config`, {\r\n payload: config,\r\n })\r\n .pipe(\r\n map((response) => this.assertSuccess(response)),\r\n catchError((error) => {\r\n throw error;\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Loads a group's custom interest questions (ordered by view order).\r\n * @param {string} groupId\r\n * @return {Observable<InterestApiResponse<CustomQuestion[]>>}\r\n * @memberof InterestFormService\r\n */\r\n getQuestions(\r\n groupId: string\r\n ): Observable<InterestApiResponse<CustomQuestion[]>> {\r\n return this.httpService\r\n .getData(`${this.apiBaseUrl}/groups/interest-questions/${groupId}`)\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 * Creates a new custom interest question.\r\n * @param {CustomQuestion} question\r\n * @return {Observable<InterestApiResponse<CustomQuestion>>}\r\n * @memberof InterestFormService\r\n */\r\n createQuestion(\r\n question: CustomQuestion\r\n ): Observable<InterestApiResponse<CustomQuestion>> {\r\n return this.httpService\r\n .postData(`${this.apiBaseUrl}/groups/interest-questions`, {\r\n payload: question,\r\n })\r\n .pipe(\r\n map((response) => this.assertSuccess(response)),\r\n catchError((error) => {\r\n throw error;\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Updates an existing custom interest question.\r\n * @param {CustomQuestion} question\r\n * @return {Observable<InterestApiResponse<string>>}\r\n * @memberof InterestFormService\r\n */\r\n updateQuestion(\r\n question: CustomQuestion\r\n ): Observable<InterestApiResponse<string>> {\r\n return this.httpService\r\n .putData(`${this.apiBaseUrl}/groups/interest-questions`, {\r\n payload: question,\r\n })\r\n .pipe(\r\n map((response) => this.assertSuccess(response)),\r\n catchError((error) => {\r\n throw error;\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Persists the updated view order for a group's custom questions.\r\n * @param {QuestionOrder[]} questionOrders\r\n * @return {Observable<InterestApiResponse<string>>}\r\n * @memberof InterestFormService\r\n */\r\n reorderQuestions(\r\n questionOrders: QuestionOrder[]\r\n ): Observable<InterestApiResponse<string>> {\r\n return this.httpService\r\n .putData(`${this.apiBaseUrl}/groups/interest-questions/reorder`, {\r\n payload: questionOrders,\r\n })\r\n .pipe(\r\n map((response) => this.assertSuccess(response)),\r\n catchError((error) => {\r\n throw error;\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Soft-deletes a custom interest question by id.\r\n * @param {string} questionId\r\n * @return {Observable<InterestApiResponse<string>>}\r\n * @memberof InterestFormService\r\n */\r\n removeQuestion(\r\n questionId: string\r\n ): Observable<InterestApiResponse<string>> {\r\n return this.httpService\r\n .putData(\r\n `${this.apiBaseUrl}/groups/interest-questions/${questionId}/remove`,\r\n {}\r\n )\r\n .pipe(\r\n map((response) => this.assertSuccess(response)),\r\n catchError((error) => {\r\n throw error;\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Builds a non-publishing preview of a group's interest form.\r\n * @param {string} groupId\r\n * @return {Observable<InterestApiResponse<unknown>>}\r\n * @memberof InterestFormService\r\n */\r\n previewForm(groupId: string): Observable<InterestApiResponse<unknown>> {\r\n return this.httpService\r\n .getData(\r\n `${this.apiBaseUrl}/groups/interest-questions/${groupId}/preview`\r\n )\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 Inject,\r\n OnDestroy,\r\n OnInit,\r\n Optional,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport {\r\n MAT_DIALOG_DATA,\r\n MatDialog,\r\n MatDialogRef,\r\n} from '@angular/material/dialog';\r\nimport { Subject, takeUntil } from 'rxjs';\r\nimport {\r\n CdkDragDrop,\r\n DragDropModule,\r\n moveItemInArray,\r\n} from '@angular/cdk/drag-drop';\r\nimport {\r\n RadioComponent,\r\n RadioOption,\r\n SlideToggleComponent,\r\n SlideToggleOption,\r\n} from '@ieeesa-npm/presentation';\r\nimport { AlertType, AlertsService } from '@ieeesa-npm/utility';\r\nimport {\r\n CustomQuestion,\r\n GroupRole,\r\n InterestMode,\r\n MEMBER_LEVEL_ROLE_TYPE,\r\n QuestionFieldType,\r\n} from '../../models/custom-question.model';\r\nimport { GroupInfo } from '../../models/group-info.model';\r\nimport { GroupsService } from '../../services/groups.service';\r\nimport { InterestFormService } from '../../services/interest-form.service';\r\nimport { CustomQuestionEditorComponent } from '../custom-question-editor/custom-question-editor.component';\r\nimport { InterestFormPreviewComponent } from '../interest-form-preview/interest-form-preview.component';\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 enables/disables the form, views locked standard questions,\r\n * chooses the default membership level and manages custom questions\r\n * (add / edit / reorder / remove), persisted to the groups backend via\r\n * InterestFormService. Each question is saved individually (create/update) and\r\n * the enable mode + default level are saved via the interest-config endpoint.\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: [\r\n CommonModule,\r\n DragDropModule,\r\n SlideToggleComponent,\r\n RadioComponent,\r\n CustomQuestionEditorComponent,\r\n ],\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, OnDestroy {\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 requiredTag = this.interestFormTexts?.requiredTag;\r\n standardTag = this.interestFormTexts?.standardTag;\r\n newQuestionLabel = this.interestFormTexts?.newQuestionLabel;\r\n editQuestionAriaLabel = this.interestFormTexts?.editQuestionAriaLabel;\r\n deleteQuestionAriaLabel = this.interestFormTexts?.deleteQuestionAriaLabel;\r\n noLevelsMessage = this.interestFormTexts?.noLevelsMessage;\r\n typeLabels = this.interestFormTexts?.questionEditor?.types;\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 // Defaults to disabled (OFF). The real state is driven by the API response in\r\n // loadConfig; when no config has been saved yet the backend returns DISABLED,\r\n // so the first-time view correctly shows the toggle OFF.\r\n isFormEnabled = false;\r\n selectedLevelId: string | null = null;\r\n levels: GroupRole[] = [];\r\n\r\n customQuestions: CustomQuestion[] = [];\r\n editingQuestionId: string | null = null;\r\n private isEditingNewQuestion = false;\r\n private destroy$ = new Subject<boolean>();\r\n\r\n constructor(\r\n // eslint-disable-next-line no-unused-vars\r\n @Optional() private dialogRef: MatDialogRef<unknown>,\r\n // eslint-disable-next-line no-unused-vars\r\n @Optional() @Inject(MAT_DIALOG_DATA) public group: GroupInfo,\r\n // eslint-disable-next-line no-unused-vars\r\n private interestFormService: InterestFormService,\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 alertService: AlertsService,\r\n // eslint-disable-next-line no-unused-vars\r\n private dialog: MatDialog\r\n ) {}\r\n\r\n /**\r\n * Initializes static UI options and loads the group's interest config and\r\n * custom questions from the backend.\r\n * @memberof InterestFormComponent\r\n */\r\n ngOnInit(): void {\r\n this.interestFormService.setApiBaseUrl(this.groupsService?.apiBaseUrl);\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 if (this.group?.groupId) {\r\n this.loadMembershipLevels();\r\n this.loadQuestions();\r\n }\r\n }\r\n\r\n /**\r\n * Loads the real membership levels for the group's group type and then the\r\n * saved interest configuration (so the saved default level can be\r\n * preselected).\r\n * @memberof InterestFormComponent\r\n */\r\n loadMembershipLevels(): void {\r\n const groupTypeId = this.group?.groupType;\r\n if (!groupTypeId) {\r\n this.loadConfig();\r\n return;\r\n }\r\n this.interestFormService\r\n .getRoles(groupTypeId)\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (response) => {\r\n // Member levels are the roles whose roleTypeName is \"Member Level\".\r\n this.levels = (response?.body ?? []).filter(\r\n (role) => role.roleTypeName === MEMBER_LEVEL_ROLE_TYPE\r\n );\r\n this.loadConfig();\r\n },\r\n error: (error) => {\r\n this.handleError(error);\r\n this.loadConfig();\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Loads the group's interest configuration (mode + default level) and syncs\r\n * the toggle and the default-level radio selection.\r\n * @memberof InterestFormComponent\r\n */\r\n loadConfig(): void {\r\n this.interestFormService\r\n .getInterestConfig(this.group.groupId)\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (response) => {\r\n const config = response?.body;\r\n this.isFormEnabled = config?.interestMode === InterestMode.FORM;\r\n this.enableFormToggle = {\r\n ...this.enableFormToggle,\r\n checked: this.isFormEnabled,\r\n };\r\n // Preselect the saved default level, else the first member level.\r\n this.selectedLevelId =\r\n config?.defaultLevelId ?? this.levels[0]?.roleId ?? null;\r\n this.buildMembershipLevelOptions();\r\n },\r\n error: (error) => this.handleError(error),\r\n });\r\n }\r\n\r\n /**\r\n * Builds the radio options from the real membership levels, marking the\r\n * currently selected level as checked.\r\n * @memberof InterestFormComponent\r\n */\r\n buildMembershipLevelOptions(): void {\r\n this.membershipLevels = this.levels.map((level) => ({\r\n id: level.roleId,\r\n label: level.roleName,\r\n checked: level.roleId === this.selectedLevelId,\r\n }));\r\n }\r\n\r\n /**\r\n * Loads the group's custom questions.\r\n * @memberof InterestFormComponent\r\n */\r\n loadQuestions(): void {\r\n this.interestFormService\r\n .getQuestions(this.group.groupId)\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (response) => {\r\n this.customQuestions = response?.body ?? [];\r\n },\r\n error: (error) => this.handleError(error),\r\n });\r\n }\r\n\r\n /**\r\n * Updates the form-enabled state and persists the new interest mode.\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 if (!this.isFormEnabled) {\r\n // Disabling always persists immediately (no level needed).\r\n this.saveConfig();\r\n return;\r\n }\r\n // Enabling requires a default level (backend rejects FORM without one). If\r\n // none is selected yet, auto-select the level flagged default, else the\r\n // first available level, so the toggle persists immediately.\r\n if (!this.selectedLevelId) {\r\n this.selectedLevelId = this.levels[0]?.roleId ?? null;\r\n this.buildMembershipLevelOptions();\r\n }\r\n if (this.selectedLevelId) {\r\n this.saveConfig();\r\n } else {\r\n // No membership levels configured for this group type: cannot enable, so\r\n // revert the toggle/enabled state to false before alerting (nothing was\r\n // persisted, and the dependent sections must not stay visible).\r\n this.isFormEnabled = false;\r\n this.enableFormToggle = {\r\n ...this.enableFormToggle,\r\n checked: false,\r\n };\r\n this.alertService?.showMessage({\r\n status: 'custom',\r\n message: this.interestFormTexts?.noLevelsMessage,\r\n alertType: AlertType?.ERROR,\r\n isCloseNeeded: true,\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Persists the interest config. The default level is only sent for the\r\n * enabled (FORM) mode; DISABLED clears it. Enabling without a selected level\r\n * is skipped so an invalid request is never sent.\r\n * @memberof InterestFormComponent\r\n */\r\n saveConfig(): void {\r\n if (!this.group?.groupId) return;\r\n if (this.isFormEnabled && !this.selectedLevelId) return;\r\n this.interestFormService\r\n .saveInterestConfig({\r\n groupId: this.group.groupId,\r\n interestMode: this.isFormEnabled\r\n ? InterestMode.FORM\r\n : InterestMode.DISABLED,\r\n defaultLevelId: this.isFormEnabled ? this.selectedLevelId : null,\r\n })\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n error: (error) => this.handleError(error),\r\n });\r\n }\r\n\r\n /**\r\n * Records the selected default membership level and persists the config when\r\n * the form is enabled.\r\n * @param {RadioOption} option\r\n * @memberof InterestFormComponent\r\n */\r\n onMembershipLevelChange(option: RadioOption): void {\r\n this.selectedLevelId = String(option?.id);\r\n if (this.isFormEnabled) {\r\n this.saveConfig();\r\n }\r\n }\r\n\r\n /**\r\n * Adds a new blank question and opens its editor. Only one editor is open at\r\n * a time.\r\n * @memberof InterestFormComponent\r\n */\r\n onAddQuestion(): void {\r\n if (this.editingQuestionId) return;\r\n const tempId = `new-${Date.now()}`;\r\n const newQuestion: CustomQuestion = {\r\n questionId: tempId,\r\n groupId: this.group?.groupId,\r\n questionLabel: '',\r\n fieldType: null,\r\n isRequired: true,\r\n placeholder: '',\r\n helpText: '',\r\n options: undefined,\r\n viewOrder: this.customQuestions.length,\r\n };\r\n this.customQuestions = [...this.customQuestions, newQuestion];\r\n this.editingQuestionId = tempId;\r\n this.isEditingNewQuestion = true;\r\n }\r\n\r\n /**\r\n * Opens the editor for an existing question.\r\n * @param {CustomQuestion} question\r\n * @memberof InterestFormComponent\r\n */\r\n onEditQuestion(question: CustomQuestion): void {\r\n if (this.editingQuestionId) return;\r\n this.editingQuestionId = question.questionId ?? null;\r\n this.isEditingNewQuestion = false;\r\n }\r\n\r\n /**\r\n * Creates or updates the question on the backend and refreshes the list.\r\n * @param {CustomQuestion} question\r\n * @memberof InterestFormComponent\r\n */\r\n onSaveQuestion(question: CustomQuestion): void {\r\n if (this.isEditingNewQuestion) {\r\n const payload: CustomQuestion = { ...question };\r\n // Remove the temporary client id so the backend generates one.\r\n delete payload.questionId;\r\n this.interestFormService\r\n .createQuestion(payload)\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: () => this.afterQuestionSaved(),\r\n error: (error) => this.handleError(error),\r\n });\r\n } else {\r\n this.interestFormService\r\n .updateQuestion(question)\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: () => this.afterQuestionSaved(),\r\n error: (error) => this.handleError(error),\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Closes the editor and reloads the questions after a successful save.\r\n * @memberof InterestFormComponent\r\n */\r\n private afterQuestionSaved(): void {\r\n this.editingQuestionId = null;\r\n this.isEditingNewQuestion = false;\r\n this.loadQuestions();\r\n }\r\n\r\n /**\r\n * Closes the editor. A newly added question is removed on cancel; an existing\r\n * question keeps its previous values.\r\n * @param {string} questionId\r\n * @memberof InterestFormComponent\r\n */\r\n onCancelQuestion(questionId: string | undefined): void {\r\n if (this.isEditingNewQuestion) {\r\n this.customQuestions = this.customQuestions.filter(\r\n (question) => question.questionId !== questionId\r\n );\r\n }\r\n this.editingQuestionId = null;\r\n this.isEditingNewQuestion = false;\r\n }\r\n\r\n /**\r\n * Removes a question on the backend and refreshes the list.\r\n * @param {string} questionId\r\n * @memberof InterestFormComponent\r\n */\r\n onDeleteQuestion(questionId: string | undefined): void {\r\n if (!questionId) return;\r\n // A not-yet-saved question only exists client-side.\r\n if (questionId.startsWith('new-')) {\r\n this.onCancelQuestion(questionId);\r\n return;\r\n }\r\n this.interestFormService\r\n .removeQuestion(questionId)\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: () => {\r\n if (this.editingQuestionId === questionId) {\r\n this.editingQuestionId = null;\r\n this.isEditingNewQuestion = false;\r\n }\r\n this.loadQuestions();\r\n },\r\n error: (error) => this.handleError(error),\r\n });\r\n }\r\n\r\n /**\r\n * Reorders questions on drag-drop and persists the new order.\r\n * @param {CdkDragDrop<CustomQuestion[]>} event\r\n * @memberof InterestFormComponent\r\n */\r\n onReorderQuestions(event: CdkDragDrop<CustomQuestion[]>): void {\r\n const reordered = [...this.customQuestions];\r\n moveItemInArray(reordered, event.previousIndex, event.currentIndex);\r\n this.customQuestions = reordered.map((question, index) => ({\r\n ...question,\r\n viewOrder: index,\r\n }));\r\n this.interestFormService\r\n .reorderQuestions(\r\n this.customQuestions.map((question) => ({\r\n questionId: question.questionId as string,\r\n viewOrder: question.viewOrder,\r\n }))\r\n )\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n // The list was reordered optimistically; if the backend rejected the\r\n // new order, reload so the client reflects the persisted order.\r\n error: (error) => {\r\n this.handleError(error);\r\n this.loadQuestions();\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Returns the display label for a question's field type.\r\n * @param {(QuestionFieldType | null)} type\r\n * @return {string}\r\n * @memberof InterestFormComponent\r\n */\r\n getTypeLabel(type: QuestionFieldType | null): string {\r\n switch (type) {\r\n case QuestionFieldType.TEXT:\r\n return this.typeLabels?.text;\r\n case QuestionFieldType.TEXTAREA:\r\n return this.typeLabels?.textArea;\r\n case QuestionFieldType.SELECT:\r\n return this.typeLabels?.dropdown;\r\n case QuestionFieldType.CHECKBOX:\r\n return this.typeLabels?.checkbox;\r\n case QuestionFieldType.RADIO:\r\n return this.typeLabels?.radio;\r\n case QuestionFieldType.DATE:\r\n return this.typeLabels?.date;\r\n default:\r\n return '';\r\n }\r\n }\r\n\r\n /**\r\n * Shows an error alert for a failed interest-form operation.\r\n * @param {*} error\r\n * @memberof InterestFormComponent\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n handleError(error: any): void {\r\n this.alertService?.showMessage({\r\n status: 'custom',\r\n message: error?.error?.message ?? error?.message,\r\n alertType: AlertType?.ERROR,\r\n isCloseNeeded: true,\r\n });\r\n }\r\n\r\n /**\r\n * Opens the interest form in read-only preview mode (SP3M-317 R6.7), reusing\r\n * the shared express-interest dialog. Shows the admin's current custom\r\n * questions as an end user would see them; no submit, Cancel only.\r\n * @memberof InterestFormComponent\r\n */\r\n onPreview(): void {\r\n this.dialog?.open(InterestFormPreviewComponent, {\r\n width: '720px',\r\n maxWidth: '92vw',\r\n maxHeight: '90vh',\r\n panelClass: ['ieeesa-modal-dialog', 'ieeesa-interest-form-preview'],\r\n ariaModal: true,\r\n data: {\r\n groupName: this.group?.groupName ?? '',\r\n customQuestions: this.customQuestions,\r\n },\r\n });\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 * ngFor tracking for standard question rows.\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 /**\r\n * ngFor tracking for custom questions.\r\n * @param {number} index\r\n * @param {CustomQuestion} question\r\n * @return {string}\r\n * @memberof InterestFormComponent\r\n */\r\n trackByQuestionId(index: number, question: CustomQuestion): string {\r\n return question.questionId as string;\r\n }\r\n\r\n /**\r\n * Emits and completes the destroy subject so any in-flight requests are\r\n * unsubscribed when the component is destroyed.\r\n * @memberof InterestFormComponent\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-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 *ngIf=\"membershipLevels.length > 0\"\r\n formControlName=\"defaultMembershipLevel\"\r\n [radioGroup]=\"membershipLevels\"\r\n (selectedRadioOption)=\"onMembershipLevelChange($event)\"\r\n ></ieeesa-radio>\r\n <p\r\n *ngIf=\"membershipLevels.length === 0\"\r\n class=\"ieeesa-interest-form__section-desc ieeesa-body-sm-14\"\r\n >\r\n {{ noLevelsMessage }}\r\n </p>\r\n </section>\r\n\r\n <section *ngIf=\"isFormEnabled\" class=\"ieeesa-interest-form__section\">\r\n <div\r\n class=\"ieeesa-interest-form__custom-header 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 [disabled]=\"editingQuestionId\"\r\n (click)=\"onAddQuestion()\"\r\n [attr.aria-label]=\"addQuestionLabel\"\r\n >\r\n {{ addQuestionLabel }}\r\n </button>\r\n </div>\r\n\r\n <div\r\n cdkDropList\r\n class=\"ieeesa-interest-form__question-list\"\r\n (cdkDropListDropped)=\"onReorderQuestions($event)\"\r\n >\r\n <div\r\n *ngFor=\"let question of customQuestions; trackBy: trackByQuestionId\"\r\n cdkDrag\r\n [cdkDragDisabled]=\"editingQuestionId\"\r\n class=\"ieeesa-interest-form__question\"\r\n [class.ieeesa-interest-form__question--editing]=\"\r\n editingQuestionId === question.questionId\r\n \"\r\n >\r\n <div\r\n class=\"ieeesa-interest-form__question-row d-flex align-items-center justify-content-between gap-2\"\r\n [class.ieeesa-interest-form__question-row--editing]=\"\r\n editingQuestionId === question.questionId\r\n \"\r\n >\r\n <div class=\"d-flex align-items-center gap-2 ieeesa-interest-form__question-main\">\r\n <span\r\n class=\"ieeesa-interest-form__drag-handle\"\r\n cdkDragHandle\r\n aria-hidden=\"true\"\r\n >\r\n <svg width=\"12\" height=\"16\" viewBox=\"0 0 12 16\" fill=\"none\">\r\n <circle cx=\"3\" cy=\"2\" r=\"1.5\" fill=\"currentColor\"/>\r\n <circle cx=\"9\" cy=\"2\" r=\"1.5\" fill=\"currentColor\"/>\r\n <circle cx=\"3\" cy=\"8\" r=\"1.5\" fill=\"currentColor\"/>\r\n <circle cx=\"9\" cy=\"8\" r=\"1.5\" fill=\"currentColor\"/>\r\n <circle cx=\"3\" cy=\"14\" r=\"1.5\" fill=\"currentColor\"/>\r\n <circle cx=\"9\" cy=\"14\" r=\"1.5\" fill=\"currentColor\"/>\r\n </svg>\r\n </span>\r\n <span class=\"ieeesa-interest-form__question-label ieeesa-body-sm-14\">\r\n {{ question.questionLabel || newQuestionLabel }}\r\n </span>\r\n </div>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <span\r\n *ngIf=\"question.fieldType\"\r\n class=\"ieeesa-interest-form__chip ieeesa-interest-form__chip--type ieeesa-body-sm-14\"\r\n >\r\n {{ getTypeLabel(question.fieldType) }}\r\n </span>\r\n <span\r\n *ngIf=\"question.isRequired\"\r\n class=\"ieeesa-interest-form__chip ieeesa-interest-form__chip--required ieeesa-body-sm-14\"\r\n >\r\n {{ requiredTag }}\r\n </span>\r\n <button\r\n *ngIf=\"editingQuestionId !== question.questionId\"\r\n type=\"button\"\r\n class=\"ieeesa-interest-form__icon-btn\"\r\n (click)=\"onEditQuestion(question)\"\r\n [attr.aria-label]=\"editQuestionAriaLabel\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 18 18\" fill=\"none\">\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M16.06.59l1.35 1.35c.79.78.79 2.05 0 2.83L4.18 18H0v-4.18L10.4 3.41 13.23.59c.78-.78 2.05-.78 2.83 0zM2 16l1.41.06L13.23 6.23l-1.41-1.41L2 14.64V16z\" fill=\"currentColor\"/>\r\n </svg>\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"ieeesa-interest-form__icon-btn ieeesa-interest-form__icon-btn--delete\"\r\n (click)=\"onDeleteQuestion(question.questionId)\"\r\n [attr.aria-label]=\"deleteQuestionAriaLabel\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M15 3V4H20V6H19V19C19 20.1 18.1 21 17 21H7C5.9 21 5 20.1 5 19V6H4V4H9V3H15ZM7 19H17V6H7V19ZM9 8H11V17H9V8ZM15 8H13V17H15V8Z\" fill=\"currentColor\"/>\r\n </svg>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <ieeesa-custom-question-editor\r\n *ngIf=\"editingQuestionId === question.questionId\"\r\n [question]=\"question\"\r\n (save)=\"onSaveQuestion($event)\"\r\n (cancel)=\"onCancelQuestion(question.questionId)\"\r\n ></ieeesa-custom-question-editor>\r\n </div>\r\n </div>\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 [disabled]=\"!!editingQuestionId\"\r\n (click)=\"onPreview()\"\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 [persistTabState]=\"true\"\r\n [tabQueryParam]=\"'interestTab'\"\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 countryCallingCodes: SelectOption[] = [];\r\n // Tenant-configured optional profile fields (e.g. 'phone', 'address') to show on the add-user form.\r\n requiredProfileFields: string[] = [];\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 this.countryCallingCodes = this.groupService.getCountryCallingCodes();\r\n this.getRequiredProfileFields();\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 // TEMP-DISABLED phone library field (country-code dropdown +\r\n // libphonenumber-js) — existing-user branch. Temporarily replaced\r\n // by a plain text input below. Restore this block and remove the\r\n // plain INPUT block when the libphonenumber implementation is\r\n // approved. See appendContactDetailsToPayload() for the submit mapping.\r\n // ...(this.requiredProfileFields.includes('phone')\r\n // ? [\r\n // {\r\n // type: FormControlType.PHONE,\r\n // label: this.addUserRosterTexts?.label?.phoneNumber + '*',\r\n // controlName: 'phone',\r\n // dropdownOptions: this.countryCallingCodes,\r\n // value: {\r\n // countryCode:\r\n // this.userInfo?.phoneCountryCode ?? null,\r\n // phoneNumber: this.userInfo?.phoneNumber ?? null,\r\n // },\r\n // isEditToggle: !!this.userInfo?.phoneNumber,\r\n // validation: [Validators.required],\r\n // maxLength:\r\n // GroupsValidationPatterns.phoneNumberMaxLength,\r\n // requiredErrorMessage:\r\n // this.addUserRosterTexts?.message?.error?.required,\r\n // supportMessage:\r\n // this.addUserRosterTexts?.supportText?.phoneNumber,\r\n // ariaLabel:\r\n // this.addUserRosterTexts?.label?.ariaLabel\r\n // ?.phoneNumber,\r\n // ariaDescribedById:\r\n // this.addUserRosterTexts?.label?.ariaDescribedById\r\n // ?.phoneNumber,\r\n // },\r\n // ]\r\n // : []),\r\n // TEMP plain phone input — no country-code dropdown, no validation/formatting.\r\n // Prefilled from the response; starts read-only with a pencil toggle\r\n // when a value exists, else editable.\r\n ...(this.requiredProfileFields.includes('phone')\r\n ? [\r\n {\r\n type: FormControlType.INPUT,\r\n label: this.addUserRosterTexts?.label?.phoneNumber + '*',\r\n controlName: 'phone',\r\n value: this.userInfo?.phoneNumber ?? '',\r\n isEditToggle: !!this.userInfo?.phoneNumber,\r\n validation: [Validators.required],\r\n requiredErrorMessage:\r\n this.addUserRosterTexts?.message?.error?.required,\r\n supportMessage:\r\n this.addUserRosterTexts?.supportText?.phoneNumber,\r\n ariaLabel:\r\n this.addUserRosterTexts?.label?.ariaLabel\r\n ?.phoneNumber,\r\n ariaDescribedById:\r\n this.addUserRosterTexts?.label?.ariaDescribedById\r\n ?.phoneNumber,\r\n },\r\n ]\r\n : []),\r\n // Address (editable), shown only when the tenant's\r\n // required-profile-fields config requests it. Prefilled when\r\n // present, empty when null. Fixed-size box (see component SCSS).\r\n ...(this.requiredProfileFields.includes('address')\r\n ? [\r\n {\r\n type: FormControlType.TEXT_AREA,\r\n label: this.addUserRosterTexts?.label?.address + '*',\r\n controlName: 'address',\r\n value: this.userInfo?.address ?? '',\r\n // When a value exists, start read-only with a pencil toggle;\r\n // when null, start directly editable.\r\n isEditToggle: !!this.userInfo?.address,\r\n validation: [\r\n Validators.required,\r\n Validators.maxLength(\r\n GroupsValidationPatterns.addressMaxLength\r\n ),\r\n ],\r\n // No live character counter — follow the Representing\r\n // Organization pattern: hard maxLength + error on breach.\r\n maxLength: GroupsValidationPatterns.addressMaxLength,\r\n requiredErrorMessage:\r\n this.addUserRosterTexts?.message?.error?.required,\r\n maxErrorMessage:\r\n this.addUserRosterTexts?.message?.error?.limit\r\n ?.addressMaxChars,\r\n supportMessage:\r\n this.addUserRosterTexts?.supportText?.address,\r\n isResize: false,\r\n ariaMultiline: true,\r\n ariaLabel:\r\n this.addUserRosterTexts?.label?.ariaLabel?.address,\r\n ariaDescribedById:\r\n this.addUserRosterTexts?.label?.ariaDescribedById\r\n ?.address,\r\n },\r\n ]\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 // TEMP-DISABLED phone library field (country-code dropdown +\r\n // libphonenumber-js) — new-user branch (always editable).\r\n // Temporarily replaced by a plain text input below. Restore this\r\n // block and remove the plain INPUT block when the libphonenumber\r\n // implementation is approved. See appendContactDetailsToPayload()\r\n // for the submit mapping.\r\n // ...(this.requiredProfileFields.includes('phone')\r\n // ? [\r\n // {\r\n // type: FormControlType.PHONE,\r\n // label: this.addUserRosterTexts?.label?.phoneNumber + '*',\r\n // controlName: 'phone',\r\n // dropdownOptions: this.countryCallingCodes,\r\n // value: {\r\n // countryCode: null,\r\n // phoneNumber: null,\r\n // },\r\n // validation: [Validators.required],\r\n // maxLength:\r\n // GroupsValidationPatterns.phoneNumberMaxLength,\r\n // requiredErrorMessage:\r\n // this.addUserRosterTexts?.message?.error?.required,\r\n // supportMessage:\r\n // this.addUserRosterTexts?.supportText?.phoneNumber,\r\n // ariaLabel:\r\n // this.addUserRosterTexts?.label?.ariaLabel\r\n // ?.phoneNumber,\r\n // ariaDescribedById:\r\n // this.addUserRosterTexts?.label?.ariaDescribedById\r\n // ?.phoneNumber,\r\n // },\r\n // ]\r\n // : []),\r\n // TEMP plain phone input — no country-code dropdown, no validation/formatting.\r\n // New user: always editable.\r\n ...(this.requiredProfileFields.includes('phone')\r\n ? [\r\n {\r\n type: FormControlType.INPUT,\r\n label: this.addUserRosterTexts?.label?.phoneNumber + '*',\r\n controlName: 'phone',\r\n value: '',\r\n validation: [Validators.required],\r\n requiredErrorMessage:\r\n this.addUserRosterTexts?.message?.error?.required,\r\n supportMessage:\r\n this.addUserRosterTexts?.supportText?.phoneNumber,\r\n ariaLabel:\r\n this.addUserRosterTexts?.label?.ariaLabel\r\n ?.phoneNumber,\r\n ariaDescribedById:\r\n this.addUserRosterTexts?.label?.ariaDescribedById\r\n ?.phoneNumber,\r\n },\r\n ]\r\n : []),\r\n // Address, shown only when the tenant's required-profile-fields\r\n // config requests it.\r\n ...(this.requiredProfileFields.includes('address')\r\n ? [\r\n {\r\n type: FormControlType.TEXT_AREA,\r\n label: this.addUserRosterTexts?.label?.address + '*',\r\n controlName: 'address',\r\n validation: [\r\n Validators.required,\r\n Validators.maxLength(\r\n GroupsValidationPatterns.addressMaxLength\r\n ),\r\n ],\r\n // No live character counter — follow the Representing\r\n // Organization pattern: hard maxLength + error on breach.\r\n maxLength: GroupsValidationPatterns.addressMaxLength,\r\n requiredErrorMessage:\r\n this.addUserRosterTexts?.message?.error?.required,\r\n maxErrorMessage:\r\n this.addUserRosterTexts?.message?.error?.limit\r\n ?.addressMaxChars,\r\n supportMessage:\r\n this.addUserRosterTexts?.supportText?.address,\r\n // Keep the box a fixed size (no drag-resize). The fixed\r\n // height with internal scroll is enforced via component SCSS\r\n // so the field doesn't grow as the user types, matching the\r\n // Representing Organization field's fixed-box behavior.\r\n isResize: false,\r\n ariaMultiline: true,\r\n ariaLabel:\r\n this.addUserRosterTexts?.label?.ariaLabel?.address,\r\n ariaDescribedById:\r\n this.addUserRosterTexts?.label?.ariaDescribedById\r\n ?.address,\r\n },\r\n ]\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 tenant's required profile fields so the add-user form only shows\r\n * the phone/address fields the tenant has configured as required.\r\n * @memberof AddUserRosterComponent\r\n */\r\n getRequiredProfileFields(): void {\r\n this.requiredProfileFields =\r\n this.groupService.getRequiredProfileFields() ?? [];\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 // Optional contact fields — apply to both new and existing users.\r\n this.appendContactDetailsToPayload(payload, formData);\r\n return payload;\r\n }\r\n\r\n /**\r\n * Appends the optional contact fields (phone country code, phone number and\r\n * address) to the payload. The country code is sent only when a phone number\r\n * is provided; phone number and address are included only when the user\r\n * entered a value (so nulls/empties are not sent to the backend).\r\n * @param {(AddOrEditUserPayload | AddOrEditUserIndividualRosterPayload)} payload\r\n * @param {*} formData\r\n * @memberof AddUserRosterComponent\r\n */\r\n appendContactDetailsToPayload(\r\n payload: AddOrEditUserPayload | AddOrEditUserIndividualRosterPayload,\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n formData: any\r\n ): void {\r\n // TEMP-DISABLED phone library mapping — the PHONE control used to store\r\n // { countryCode, phoneNumber }. While the field is a plain text input,\r\n // `formData.phone` is the raw phone-number string and no country code is\r\n // collected. Restore the object-based mapping below when the phone library\r\n // field is re-enabled.\r\n // const phoneNumber = formData?.phone?.phoneNumber?.trim();\r\n // const phoneCountryCode = formData?.phone?.countryCode;\r\n const phoneNumber = formData?.phone?.trim();\r\n const address = formData?.address?.trim();\r\n if (phoneNumber) {\r\n payload.payload.phoneNumber = phoneNumber;\r\n // No country code is collected while the plain text input is in use.\r\n // if (phoneCountryCode) payload.payload.phoneCountryCode = phoneCountryCode;\r\n }\r\n if (address) payload.payload.address = address;\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 PHONE_NUMBER = 'phone_number',\r\n ADDRESS = 'address',\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 const notRestricted = !this.groupService.isGroupsAndRostersRestricted();\r\n this.rosterActions.isAddNeeded =notRestricted && this.getManageRosterActionsPermission();\r\n this.rosterActions.isEditNeeded =notRestricted && this.getManageRosterActionsPermission();\r\n this.rosterActions.isDeleteNeeded =notRestricted && 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 // Insert Classification immediately before the Role column (its original position).\r\n const roleColumnIndex = this.columnSchema.findIndex(\r\n (column) => column.columnDef === TableColumnSchemaUserGroup.ROLE\r\n );\r\n const classificationInsertIndex =\r\n roleColumnIndex === -1 ? this.columnSchema.length - 1 : roleColumnIndex;\r\n this.columnSchema.splice(classificationInsertIndex, 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 phoneCountryCode: selectedUserInfo[0]?.phoneCountryCode,\r\n phoneNumber: selectedUserInfo[0]?.phoneNumber,\r\n address: selectedUserInfo[0]?.address,\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 phoneCountryCode: selectedUserInfo[0]?.phoneCountryCode,\r\n phoneNumber: selectedUserInfo[0]?.phoneNumber,\r\n address: selectedUserInfo[0]?.address,\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__actions-slot\">\r\n <div class=\"ieeesa-view-roster__export-anchor\">\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 <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 </div>\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 <!-- 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 StorageService,\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\nimport { TenantFeature } from './models/tenant-feature.model';\r\n\r\ninterface RosterHistoryRestoreDescriptor {\r\n version: 1;\r\n groupId: string;\r\n groupName: string;\r\n}\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 private _requiredProfileFields: string[] = [];\r\n /**\r\n * Tenant-level required profile fields (e.g. ['phone','address','employer'])\r\n * supplied by the host app from its cached tenant configuration. Passed to\r\n * GroupsService so the roster import appends them to its required columns and\r\n * sample file. Optional — defaults to none.\r\n *\r\n * Implemented as a setter so EVERY input update (including a late,\r\n * async-resolved value that arrives after ngOnInit) is propagated to the\r\n * singleton GroupsService — not just the initial binding.\r\n */\r\n @Input()\r\n set requiredProfileFields(value: string[] | null | undefined) {\r\n this._requiredProfileFields = value ?? [];\r\n this.groupsService?.setRequiredProfileFields(this._requiredProfileFields);\r\n }\r\n get requiredProfileFields(): string[] {\r\n return this._requiredProfileFields;\r\n }\r\n private _tenantFeatures: TenantFeature[] = [];\r\n /**\r\n * Tenant feature flags supplied by the host app from its cached tenant\r\n * configuration. Passed to GroupsService so interest-form UI (e.g. the\r\n * \"Manage Interest Form\" tree action) is gated on whether the feature is\r\n * enabled for the tenant. Optional — defaults to none (fail-closed).\r\n *\r\n * Implemented as a setter so EVERY input update (including a late,\r\n * async-resolved value that arrives after ngOnInit) is propagated to the\r\n * singleton GroupsService — not just the initial binding.\r\n */\r\n @Input()\r\n set tenantFeatures(value: TenantFeature[] | null | undefined) {\r\n this._tenantFeatures = value ?? [];\r\n this.groupsService?.setTenantFeatures(this._tenantFeatures);\r\n }\r\n get tenantFeatures(): TenantFeature[] {\r\n return this._tenantFeatures;\r\n }\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 private hasAttemptedHistoryRestore = false;\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 // eslint-disable-next-line no-unused-vars\r\n private storageService: StorageService\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.groupsService?.setTenantFeatures(this._tenantFeatures);\r\n // requiredProfileFields and tenantFeatures are also propagated to the\r\n // service by their @Input setters (covering both the initial binding and\r\n // any later async-resolved update).\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 * Passthrough to the service restriction check so the template can gate\r\n * group/roster write actions on the negative Restrict Groups And Rosters\r\n * permission.\r\n * @return {boolean}\r\n * @memberof GroupsComponent\r\n */\r\n isGroupsAndRostersRestricted(): boolean {\r\n return this.groupsService.isGroupsAndRostersRestricted();\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(\r\n selectedGroupInfo: GroupInfo,\r\n isRestored = false\r\n ): 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.persistRosterHistory(selectedGroupInfo);\r\n this.openModal(\r\n dialogOptions,\r\n 'ieeesa-roster-import-history-dialog',\r\n undefined,\r\n isRestored\r\n );\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 isRestoredReadOnlyDialog = false\r\n ): void {\r\n className = className ?? '';\r\n const isRosterImportHistory =\r\n this.functionType === GroupFunctionType.VIEW_IMPORT_HISTORY;\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 !isRestoredReadOnlyDialog)\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 !isRestoredReadOnlyDialog)\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 (isRosterImportHistory) {\r\n this.storageService.removeValue(this.rosterHistoryStorageKey);\r\n }\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.restoreRosterImportHistoryModal();\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 private get rosterHistoryStorageKey(): string {\r\n return `ieeesa.overlay:${window.location.pathname}${window.location.search}:roster-import-history`;\r\n }\r\n\r\n private persistRosterHistory(group: GroupInfo): void {\r\n if (!group?.groupId) {\r\n return;\r\n }\r\n const descriptor: RosterHistoryRestoreDescriptor = {\r\n version: 1,\r\n groupId: group.groupId,\r\n groupName: group.groupName,\r\n };\r\n this.storageService.setValue(this.rosterHistoryStorageKey, descriptor);\r\n }\r\n\r\n private restoreRosterImportHistoryModal(): void {\r\n if (this.hasAttemptedHistoryRestore) {\r\n return;\r\n }\r\n this.hasAttemptedHistoryRestore = true;\r\n const navigation = performance\r\n ?.getEntriesByType?.('navigation')?.[0] as\r\n | PerformanceNavigationTiming\r\n | undefined;\r\n if (navigation?.type !== 'reload') {\r\n return;\r\n }\r\n const descriptor = this.storageService.getValue(\r\n this.rosterHistoryStorageKey\r\n ) as RosterHistoryRestoreDescriptor | null;\r\n if (\r\n descriptor?.version !== 1 ||\r\n !descriptor.groupId ||\r\n !descriptor.groupName\r\n ) {\r\n return;\r\n }\r\n const selectedGroup = {\r\n groupId: descriptor.groupId,\r\n groupName: descriptor.groupName,\r\n } as GroupInfo;\r\n this.groupsService.setSelectedGroupInfo(selectedGroup);\r\n this.openRosterImportHistoryModal(selectedGroup, true);\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 !isGroupsAndRostersRestricted() &&\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 !isGroupsAndRostersRestricted() &&\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 * When the import was created (ISO timestamp). Drives the \"Timestamp\" column\r\n * in View History. Present only once the BE exposes it (currently @JsonIgnore);\r\n * undefined otherwise, in which case the UI shows a placeholder.\r\n */\r\n createdOn?: string;\r\n /**\r\n * Who ran the import (user email/name). Drives the \"Person Imported\" column in\r\n * View History. Present only once the BE exposes it (currently @JsonIgnore);\r\n * undefined otherwise, in which case the UI shows a placeholder.\r\n */\r\n createdBy?: string;\r\n /**\r\n * Row-level errors from the BE `error_report` JSONB column. Observed to arrive\r\n * EITHER as a parsed object `{ rows: RosterImportErrorReport[] }` OR as a raw\r\n * JSON string of the same shape (depending on serialization). A bare array is\r\n * also tolerated. `null` when there are no row errors. The client normalizes\r\n * all of these — see RosterImportComponent.parseErrorReport.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n errorReport?: any;\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-responses/interest-responses.component';\r\nexport * from './lib/components/interest-form/interest-form.component';\r\nexport * from './lib/components/custom-question-editor/custom-question-editor.component';\r\nexport * from './lib/components/interest-form-preview/interest-form-preview.component';\r\nexport * from './lib/models/custom-question.model';\r\nexport * from './lib/services/interest-form.service';\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\nexport * from './lib/models/required-profile-fields.model';\r\nexport * from './lib/models/tenant-feature.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\nexport * from './lib/models/interest-response.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","AlertType","i2.InterestFormService","i3.GroupsService","constants?.errors","constants?.deleteUsersGroup","constants?.ariaLabel","i4.RosterExportService","i6","screenTexts?.deleteGroup","i5.UserPermissionsService","i6.GroupPermissionsMapService","i7"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGA;;;;;;;;AAQG;SACa,gCAAgC,GAAA;IAC9C,OAAO,CAAC,OAAwB,KAA6B;AAC3D,QAAA,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,CAAC;AAC7B,QAAA,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;AACvC,cAAE,KAAK,CAAC,MAAM,GAAG,CAAC;cAChB,CAAC,EAAE,OAAO,KAAK,KAAK,QAAQ,GAAG,KAAK,CAAC,IAAI,EAAE,GAAG,KAAK,CAAC,CAAC;AACzD,QAAA,OAAO,YAAY,GAAG,IAAI,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAClD,KAAC,CAAC;AACJ,CAAC;AAED;;;;;;;AAOG;AACG,SAAU,aAAa,CAAC,SAAsB,EAAA;IAClD,OAAO,CAAC,OAAwB,KAA6B;QAC3D,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE;AACjC,YAAA,OAAO,IAAI,CAAC;AACb,SAAA;AACD,QAAA,OAAO,SAAS,CAAC,OAAO,CAAC,CAAC;AAC5B,KAAC,CAAC;AACJ,CAAC;AAEY,MAAA,wBAAwB,GAAG;;AAEtC,IAAA,SAAS,EAAE,8DAA8D;;AAEzE,IAAA,SAAS,EAAE,sCAAsC;;AAEjD,IAAA,UAAU,EAAE,8DAA8D;AAC1E,IAAA,KAAK,EAAE,kCAAkC;AACzC,IAAA,4BAA4B,EAAE,GAAG;AACjC,IAAA,4BAA4B,EAAE,CAAC;;AAE/B,IAAA,wBAAwB,EACtB,8DAA8D;;AAEhE,IAAA,eAAe,EAAE,aAAa;;AAE9B,IAAA,WAAW,EAAE,0BAA0B;AACvC,IAAA,oBAAoB,EAAE,EAAE;;AAExB,IAAA,gBAAgB,EAAE,GAAG;;;AC1DvB;IACY,kBAYX;AAZD,CAAA,UAAY,iBAAiB,EAAA;AAC3B,IAAA,iBAAA,CAAA,QAAA,CAAA,GAAA,QAAiB,CAAA;AACjB,IAAA,iBAAA,CAAA,MAAA,CAAA,GAAA,MAAa,CAAA;AACb,IAAA,iBAAA,CAAA,aAAA,CAAA,GAAA,aAA2B,CAAA;AAC3B,IAAA,iBAAA,CAAA,QAAA,CAAA,GAAA,QAAiB,CAAA;AACjB,IAAA,iBAAA,CAAA,QAAA,CAAA,GAAA,QAAiB,CAAA;AACjB,IAAA,iBAAA,CAAA,QAAA,CAAA,GAAA,QAAiB,CAAA;AACjB,IAAA,iBAAA,CAAA,uBAAA,CAAA,GAAA,uBAA+C,CAAA;AAC/C,IAAA,iBAAA,CAAA,uBAAA,CAAA,GAAA,uBAA+C,CAAA;AAC/C,IAAA,iBAAA,CAAA,oBAAA,CAAA,GAAA,oBAAyC,CAAA;AACzC,IAAA,iBAAA,CAAA,eAAA,CAAA,GAAA,eAA+B,CAAA;AAC/B,IAAA,iBAAA,CAAA,qBAAA,CAAA,GAAA,qBAA2C,CAAA;AAC7C,CAAC,EAZW,iBAAiB,KAAjB,iBAAiB,GAY5B,EAAA,CAAA,CAAA;;ACSD;;;;;;AAMG;MAUU,yBAAyB,CAAA;;AAKpC,IAAA,WAAA;;IAEU,SAAkD;;IAEzB,IAAgC,EAAA;QAFzD,IAAS,CAAA,SAAA,GAAT,SAAS,CAAyC;QAEzB,IAAI,CAAA,IAAA,GAAJ,IAAI,CAA4B;QARnE,IAAI,CAAA,IAAA,GAAsB,EAAE,CAAC;QAC7B,IAAU,CAAA,UAAA,GAAG,EAAE,CAAC;AASd,QAAA,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,gBAAgB,IAAI,EAAE,CAAC,CAAC;QAC/D,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,eAAe,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,KAAK,MAAM;AAC7D,YAAA,GAAG,KAAK;YACR,QAAQ,EAAE,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC;AACzC,SAAA,CAAC,CAAC,CAAC;KACL;;AAGD,IAAA,IAAI,YAAY,GAAA;QACd,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AAClD,QAAA,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC,IAAI,CAAC;QAC5B,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,KAC1B,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAC3C,CAAC;KACH;;AAGD,IAAA,IAAI,aAAa,GAAA;AACf,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC;KACvD;;AAGD,IAAA,SAAS,CAAC,GAAoB,EAAA;AAC5B,QAAA,GAAG,CAAC,QAAQ,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC;KAC9B;IAED,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;KACxB;IAED,KAAK,GAAA;AACH,QAAA,MAAM,QAAQ,GAA4B,IAAI,CAAC,IAAI;aAChD,MAAM,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,QAAQ,CAAC;;AAE7B,aAAA,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,KAAK,KAAK,CAAC,CAAC;AAC1C,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;KAChC;AA/CU,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,yBAAyB,8CAS1B,eAAe,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;mGATd,yBAAyB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,2BAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECtCtC,2jEA4EA,ED3CY,MAAA,EAAA,CAAA,6oUAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,YAAY,+PAAE,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,6GAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,eAAA,EAAA,OAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,eAAe,EAAA,CAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA,EAAA;;4FAK1D,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBATrC,SAAS;AAEE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,2BAA2B,EACzB,UAAA,EAAA,IAAI,EACP,OAAA,EAAA,CAAC,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,eAAe,CAAC,EAGvD,aAAA,EAAA,iBAAiB,CAAC,IAAI,EAAA,QAAA,EAAA,2jEAAA,EAAA,MAAA,EAAA,CAAA,6oUAAA,CAAA,EAAA,CAAA;;0BAWlC,MAAM;2BAAC,eAAe,CAAA;;;AE/C3B;IACY,gBAIX;AAJD,CAAA,UAAY,eAAe,EAAA;AACzB,IAAA,eAAA,CAAA,YAAA,CAAA,GAAA,YAAyB,CAAA;AACzB,IAAA,eAAA,CAAA,aAAA,CAAA,GAAA,MAAoB,CAAA;AACpB,IAAA,eAAA,CAAA,QAAA,CAAA,GAAA,QAAiB,CAAA;AACnB,CAAC,EAJW,eAAe,KAAf,eAAe,GAI1B,EAAA,CAAA,CAAA;;ACLD;AACA,IAAY,cAiBX,CAAA;AAjBD,CAAA,UAAY,cAAc,EAAA;AACxB,IAAA,cAAA,CAAA,aAAA,CAAA,GAAA,aAA2B,CAAA;AAC3B,IAAA,cAAA,CAAA,mBAAA,CAAA,GAAA,mBAAuC,CAAA;AACvC,IAAA,cAAA,CAAA,iBAAA,CAAA,GAAA,iBAAmC,CAAA;AACnC,IAAA,cAAA,CAAA,YAAA,CAAA,GAAA,YAAyB,CAAA;AACzB,IAAA,cAAA,CAAA,cAAA,CAAA,GAAA,cAA6B,CAAA;AAC7B,IAAA,cAAA,CAAA,qBAAA,CAAA,GAAA,qBAA2C,CAAA;AAC3C,IAAA,cAAA,CAAA,uBAAA,CAAA,GAAA,uBAA+C,CAAA;AAC/C,IAAA,cAAA,CAAA,oBAAA,CAAA,GAAA,oBAAyC,CAAA;AACzC,IAAA,cAAA,CAAA,sBAAA,CAAA,GAAA,sBAA6C,CAAA;AAC7C,IAAA,cAAA,CAAA,qBAAA,CAAA,GAAA,qBAA2C,CAAA;AAC3C,IAAA,cAAA,CAAA,iBAAA,CAAA,GAAA,iBAAmC,CAAA;AACnC,IAAA,cAAA,CAAA,mBAAA,CAAA,GAAA,mBAAuC,CAAA;AACvC,IAAA,cAAA,CAAA,kBAAA,CAAA,GAAA,kBAAqC,CAAA;AACrC,IAAA,cAAA,CAAA,oBAAA,CAAA,GAAA,oBAAyC,CAAA;AACzC,IAAA,cAAA,CAAA,gCAAA,CAAA,GAAA,gCAAiE,CAAA;AACjE,IAAA,cAAA,CAAA,6BAAA,CAAA,GAAA,6BAA2D,CAAA;AAC7D,CAAC,EAjBW,cAAc,KAAd,cAAc,GAiBzB,EAAA,CAAA,CAAA;;AClBD;AACA,IAAY,WAEX,CAAA;AAFD,CAAA,UAAY,WAAW,EAAA;AACrB,IAAA,WAAA,CAAA,eAAA,CAAA,GAAA,uBAAuC,CAAA;AACzC,CAAC,EAFW,WAAW,KAAX,WAAW,GAEtB,EAAA,CAAA,CAAA;;ACHD;IACY,SAIX;AAJD,CAAA,UAAY,QAAQ,EAAA;AAClB,IAAA,QAAA,CAAA,SAAA,CAAA,GAAA,SAAmB,CAAA;AACnB,IAAA,QAAA,CAAA,QAAA,CAAA,GAAA,QAAiB,CAAA;AACjB,IAAA,QAAA,CAAA,cAAA,CAAA,GAAA,cAA6B,CAAA;AAC/B,CAAC,EAJW,QAAQ,KAAR,QAAQ,GAInB,EAAA,CAAA,CAAA;;MCEY,0BAA0B,CAAA;AAHvC,IAAA,WAAA,GAAA;AAIE,QAAA,IAAA,CAAA,gBAAgB,GAAsB;AACpC,YAAA;gBACE,cAAc,EAAE,cAAc,CAAC,WAAW;AAC1C,gBAAA,cAAc,EAAE,aAAa;AAC7B,gBAAA,YAAY,EAAE,2CAA2C;AAC1D,aAAA;AACD,YAAA;gBACE,cAAc,EAAE,cAAc,CAAC,iBAAiB;AAChD,gBAAA,cAAc,EAAE,qBAAqB;AACrC,gBAAA,YAAY,EAAE,2CAA2C;AAC1D,aAAA;AACD,YAAA;gBACE,cAAc,EAAE,cAAc,CAAC,eAAe;AAC9C,gBAAA,cAAc,EAAE,iBAAiB;AACjC,gBAAA,YAAY,EAAE,2CAA2C;AAC1D,aAAA;AACD,YAAA;gBACE,cAAc,EAAE,cAAc,CAAC,YAAY;AAC3C,gBAAA,cAAc,EAAE,cAAc;AAC9B,gBAAA,YAAY,EAAE,2CAA2C;AAC1D,aAAA;AACD,YAAA;gBACE,cAAc,EAAE,cAAc,CAAC,UAAU;AACzC,gBAAA,cAAc,EAAE,oBAAoB;AACpC,gBAAA,YAAY,EAAE,2CAA2C;AAC1D,aAAA;AACD,YAAA;gBACE,cAAc,EAAE,cAAc,CAAC,mBAAmB;AAClD,gBAAA,cAAc,EAAE,qBAAqB;AACrC,gBAAA,YAAY,EAAE,2CAA2C;AAC1D,aAAA;AACD,YAAA;gBACE,cAAc,EAAE,cAAc,CAAC,qBAAqB;AACpD,gBAAA,cAAc,EAAE,uBAAuB;AACvC,gBAAA,YAAY,EAAE,2CAA2C;AAC1D,aAAA;AACD,YAAA;gBACE,cAAc,EAAE,cAAc,CAAC,kBAAkB;AACjD,gBAAA,cAAc,EAAE,oBAAoB;AACpC,gBAAA,YAAY,EAAE,2CAA2C;AAC1D,aAAA;AACD,YAAA;gBACE,cAAc,EAAE,cAAc,CAAC,oBAAoB;AACnD,gBAAA,cAAc,EAAE,qBAAqB;AACrC,gBAAA,YAAY,EAAE,2CAA2C;AAC1D,aAAA;AACD,YAAA;gBAEE,cAAc,EAAE,cAAc,CAAC,mBAAmB;AAClD,gBAAA,cAAc,EAAE,qBAAqB;AACrC,gBAAA,YAAY,EAAE,2CAA2C;AAC1D,aAAA;AACD,YAAA;;;;;gBAKE,cAAc,EAAE,cAAc,CAAC,8BAA8B;AAC7D,gBAAA,cAAc,EAAE,qCAAqC;AACrD,gBAAA,YAAY,EAAE,qCAAqC;AACpD,aAAA;SACF,CAAC;AACF,QAAA,IAAA,CAAA,sBAAsB,GAAsB;AAC1C,YAAA;gBACE,cAAc,EAAE,cAAc,CAAC,mBAAmB;AAClD,gBAAA,cAAc,EAAE,qBAAqB;AACrC,gBAAA,YAAY,EAAE,2CAA2C;AAC1D,aAAA;AACD,YAAA;gBACE,cAAc,EAAE,cAAc,CAAC,eAAe;AAC9C,gBAAA,cAAc,EAAE,wBAAwB;AACxC,gBAAA,YAAY,EAAE,2CAA2C;AAC1D,aAAA;AACD,YAAA;gBACE,cAAc,EAAE,cAAc,CAAC,iBAAiB;AAChD,gBAAA,cAAc,EAAE,0BAA0B;AAC1C,gBAAA,YAAY,EAAE,2CAA2C;AAC1D,aAAA;AACD,YAAA;gBACE,cAAc,EAAE,cAAc,CAAC,gBAAgB;AAC/C,gBAAA,cAAc,EAAE,kBAAkB;AAClC,gBAAA,YAAY,EAAE,2CAA2C;AAC1D,aAAA;AACD,YAAA;gBACE,cAAc,EAAE,cAAc,CAAC,kBAAkB;AACjD,gBAAA,cAAc,EAAE,oBAAoB;AACpC,gBAAA,YAAY,EAAE,2CAA2C;AAC1D,aAAA;AACD,YAAA;gBACE,cAAc,EAAE,cAAc,CAAC,8BAA8B;AAC7D,gBAAA,cAAc,EAAE,qCAAqC;AACrD,gBAAA,YAAY,EAAE,qCAAqC;AACpD,aAAA;AACD,YAAA;gBACE,cAAc,EAAE,cAAc,CAAC,2BAA2B;AAC1D,gBAAA,cAAc,EAAE,oCAAoC;AACpD,gBAAA,YAAY,EAAE,yCAAyC;AACxD,aAAA;SACF,CAAC;AAkBH,KAAA;AAjBC;;;;AAIG;IACH,mBAAmB,GAAA;QACjB,OAAO,IAAI,CAAC,gBAAgB,CAAC;KAC9B;AACD;;;;;AAKG;IACH,yBAAyB,GAAA;QACvB,OAAO,IAAI,CAAC,sBAAsB,CAAC;KACpC;+GApHU,0BAA0B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;AAA1B,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,0BAA0B,cAFzB,MAAM,EAAA,CAAA,CAAA,EAAA;;4FAEP,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBAHtC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA,CAAA;;;MCKY,sBAAsB,CAAA;;AAEjC,IAAA,WAAA,CAAoB,uBAAmD,EAAA;QAAnD,IAAuB,CAAA,uBAAA,GAAvB,uBAAuB,CAA4B;KAAI;AAE3E;;;;;;AAMG;IACH,wBAAwB,CACtB,UAA0B,EAC1B,oBAAuC,EAAA;QAEvC,MAAM,WAAW,GAAG,oBAAoB;AACtC,cAAE,oBAAoB,EAAE,IAAI,CACxB,CAAC,EAAE,cAAc,EAAE,KAAK,cAAc,KAAK,UAAU,CACtD;cACD,KAAK,CAAC;AACV,QAAA,OAAO,WAAW,CAAC;KACpB;AAED;;;;;AAKG;IACH,0BAA0B,CACxB,eAAiC,EACjC,gBAAmC,EAAA;AAEnC,QAAA,MAAM,oBAAoB,GAAG,gBAAgB,EAAE,MAAM,CACnD,CAAC,UAA2B,KAC1B,eAAe,EAAE,IAAI,CACnB,CAAC,EAAE,YAAY,EAAE,KAAK,UAAU,EAAE,YAAY,KAAK,YAAY,CAChE,CACJ,CAAC;AACF,QAAA,OAAO,oBAAoB,CAAC;KAC7B;+GAxCU,sBAAsB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAC,0BAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;AAAtB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,sBAAsB,cAFrB,MAAM,EAAA,CAAA,CAAA,EAAA;;4FAEP,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAHlC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA,CAAA;;;ACsED;;;;;AAKG;AACH,MAAM,mCAAmC,GAAG,yBAAyB,CAAC;AAEtE;;;;;AAKG;AACH,MAAM,2BAA2B,GAAG,iBAAiB,CAAC;AAEtD;;;AAGG;MAIU,aAAa,CAAA;;AAoCxB,IAAA,WAAA;;IAEU,WAAwB;;IAExB,sBAA8C;;IAE9C,uBAAmD;;IAEpD,YAA2B;;AAE1B,IAAA,cAA8B;;QAR9B,IAAW,CAAA,WAAA,GAAX,WAAW,CAAa;QAExB,IAAsB,CAAA,sBAAA,GAAtB,sBAAsB,CAAwB;QAE9C,IAAuB,CAAA,uBAAA,GAAvB,uBAAuB,CAA4B;QAEpD,IAAY,CAAA,YAAA,GAAZ,YAAY,CAAe;QAE1B,IAAc,CAAA,cAAA,GAAd,cAAc,CAAgB;AA7CxC,QAAA,IAAA,CAAA,UAAU,GAAGC,MAAmB,CAAC;AAIjC;;;;;AAKG;QACH,IAAqB,CAAA,qBAAA,GAAa,EAAE,CAAC;AACrC;;;;AAIG;QACH,IAAc,CAAA,cAAA,GAAoB,EAAE,CAAC;QAIrC,IAAiB,CAAA,iBAAA,GAAG,IAAI,eAAe,CACrC,iBAAiB,CAAC,WAAW,CAC9B,CAAC;QAGF,IAAc,CAAA,cAAA,GAAG,KAAK,CAAC;QAIvB,IAAoB,CAAA,oBAAA,GAAG,KAAK,CAAC;;QAI7B,IAAyB,CAAA,yBAAA,GAA+B,EAAE,CAAC;;;;;;;;;;;;;;;;;QAohC1C,IAAoB,CAAA,oBAAA,GAAG,kCAAkC,CAAC;KAvgCvE;;IAEJ,YAAY,CAAC,UAAkB,EAAE,cAAmB,EAAA;AAClD,QAAA,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;AAC7B,QAAA,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;KACtC;AACD;;;;AAIG;AACH,IAAA,wBAAwB,CAAC,qBAA+B,EAAA;AACtD,QAAA,IAAI,CAAC,qBAAqB,GAAG,qBAAqB,IAAI,EAAE,CAAC;KAC1D;AACD;;;;;AAKG;AACH,IAAA,iBAAiB,CAAC,cAA+B,EAAA;AAC/C,QAAA,IAAI,CAAC,cAAc,GAAG,cAAc,IAAI,EAAE,CAAC;KAC5C;AACD;;;;;;;;;;;;;;;;;;AAkBG;IACH,iBAAiB,GAAA;QACf,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,EAAE,QAAQ,CAC1C,2BAA2B,CACF,CAAC;QAC5B,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE,EAAE,KAAK,CAAC;AAC9C,QAAA,MAAM,aAAa,GACjB,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;AACrB,aAAC,CAAC,WAAW;gBACX,MAAM,CAAC,KAAK,CACV,CAAC,OAAO,KAAK,CAAC,OAAO,EAAE,KAAK,IAAI,OAAO,CAAC,KAAK,KAAK,WAAW,CAC9D,CAAC,CAAC;AACP,QAAA,IAAI,aAAa;AAAE,YAAA,OAAO,MAAyB,CAAC;AACpD,QAAA,OAAO,IAAI,CAAC,cAAc,IAAI,EAAE,CAAC;KAClC;AACD;;;;;;;;;;;;;;;;;;;AAmBG;IACH,wBAAwB,GAAA;QACtB,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,EAAE,QAAQ,CAC1C,mCAAmC,CACE,CAAC;QACxC,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE,EAAE,KAAK,CAAC;AAC9C,QAAA,MAAM,aAAa,GACjB,CAAC,CAAC,MAAM;AACR,YAAA,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC;aACnC,CAAC,WAAW,IAAI,MAAM,CAAC,KAAK,KAAK,WAAW,CAAC,CAAC;AACjD,QAAA,IAAI,aAAa;YAAE,OAAO,MAAM,CAAC,cAAc,CAAC;AAChD,QAAA,OAAO,IAAI,CAAC,qBAAqB,IAAI,EAAE,CAAC;KACzC;AACD;;;;AAIG;;IAEH,aAAa,GAAA;QACX,OAAO,IAAI,CAAC,WAAW;AACpB,aAAA,OAAO,CAAC,CAAG,EAAA,IAAI,CAAC,UAAU,oCAAoC,CAAC;AAC/D,aAAA,IAAI,CACH,GAAG,CAAC,CAAC,QAAQ,KAAI;AACf,YAAA,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;AACzC,YAAA,OAAO,QAAQ,CAAC;AAClB,SAAC,CAAC,EACF,UAAU,CAAC,CAAC,KAAK,KAAI;AACnB,YAAA,MAAM,KAAK,CAAC;SACb,CAAC,CACH,CAAC;KACL;AAED;;;;;AAKG;AACH,IAAA,sBAAsB,CAAC,OAAe,EAAA;QACpC,OAAO,IAAI,CAAC,WAAW;aACpB,OAAO,CAAC,GAAG,IAAI,CAAC,UAAU,CAA+B,4BAAA,EAAA,OAAO,EAAE,CAAC;AACnE,aAAA,IAAI,CACH,GAAG,CAAC,CAAC,QAAQ,KAAI;YACf,OAAO,QAAQ,EAAE,IAAI,CAAC;AACxB,SAAC,CAAC,EACF,UAAU,CAAC,CAAC,KAAK,KAAI;AACnB,YAAA,MAAM,KAAK,CAAC;SACb,CAAC,CACH,CAAC;KACL;AAED;;;;;AAKG;AACH,IAAA,SAAS,CAAC,gBAAkC,EAAA;QAC1C,IAAI,GAAG,GAAG,YAAY,CAAC;QACvB,IAAI,gBAAgB,CAAC,OAAO;AAC1B,YAAA,GAAG,GAAG,0BAA0B,GAAG,gBAAgB,CAAC,OAAO,CAAC;aACzD,IAAI,gBAAgB,CAAC,WAAW;AACnC,YAAA,GAAG,GAAG,oBAAoB,GAAG,gBAAgB,CAAC,WAAW,CAAC;QAE5D,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA,EAAG,IAAI,CAAC,UAAU,CAAA,QAAA,EAAW,GAAG,CAAE,CAAA,CAAC,CAAC,IAAI,CACtE,GAAG,CAAC,CAAC,QAAQ,KAAI;AACf,YAAA,OAAO,QAAQ,CAAC;AAClB,SAAC,CAAC,EACF,UAAU,CAAC,CAAC,QAAQ,KAAI;AACtB,YAAA,MAAM,QAAQ,CAAC;SAChB,CAAC,CACH,CAAC;KACH;AACD;;;;;AAKG;;AAEH,IAAA,WAAW,CAAC,kBAAsC,EAAA;QAChD,OAAO,IAAI,CAAC,WAAW;aACpB,OAAO,CAAC,GAAG,IAAI,CAAC,UAAU,CAAgB,cAAA,CAAA,EAAE,kBAAkB,CAAC;AAC/D,aAAA,IAAI,CACH,GAAG,CAAC,CAAC,QAAQ,KAAI;AACf,YAAA,OAAO,QAAQ,CAAC;AAClB,SAAC,CAAC,EACF,UAAU,CAAC,CAAC,KAAK,KAAI;AACnB,YAAA,MAAM,KAAK,CAAC;SACb,CAAC,CACH,CAAC;KACL;AACD;;;;;;AAMG;;AAEH,IAAA,gBAAgB,CACd,sBAA8C;;;QAG9C,OAAO,IAAI,CAAC,WAAW;aACpB,OAAO,CACN,GAAG,IAAI,CAAC,UAAU,CAAiC,+BAAA,CAAA,EACnD,sBAAsB,CACvB;AACA,aAAA,IAAI,CACH,GAAG,CAAC,CAAC,QAAQ,KAAI;AACf,YAAA,OAAO,QAAQ,CAAC;AAClB,SAAC,CAAC,EACF,UAAU,CAAC,CAAC,KAAK,KAAI;AACnB,YAAA,MAAM,KAAK,CAAC;SACb,CAAC,CACH,CAAC;KACL;AAED;;;;;AAKG;;AAEH,IAAA,WAAW,CACT,kBAAsC,EAAA;QAEtC,OAAO,IAAI,CAAC,WAAW;aACpB,QAAQ,CAAC,GAAG,IAAI,CAAC,UAAU,CAAgB,cAAA,CAAA,EAAE,kBAAkB,CAAC;AAChE,aAAA,IAAI,CACH,GAAG,CAAC,CAAC,QAAQ,KAAI;AACf,YAAA,OAAO,QAAQ,CAAC;AAClB,SAAC,CAAC,EACF,UAAU,CAAC,CAAC,KAAK,KAAI;AACnB,YAAA,MAAM,KAAK,CAAC;SACb,CAAC,CACH,CAAC;KACL;AAED;;;;;AAKG;AACH,IAAA,SAAS,CACP,gBAAkC,EAAA;QAElC,OAAO,IAAI,CAAC,WAAW;aACpB,OAAO,CAAC,GAAG,IAAI,CAAC,UAAU,CAAc,YAAA,CAAA,EAAE,gBAAgB,CAAC;AAC3D,aAAA,IAAI,CACH,GAAG,CAAC,CAAC,QAAQ,KAAI;AACf,YAAA,OAAO,QAAQ,CAAC;AAClB,SAAC,CAAC,EACF,UAAU,CAAC,CAAC,KAAK,KAAI;AACnB,YAAA,MAAM,KAAK,CAAC;SACb,CAAC,CACH,CAAC;KACL;AAED;;;;;AAKG;AACH,IAAA,iBAAiB,CAAC,UAAoB,EAAA;QACpC,MAAM,YAAY,GAAa,EAAE,CAAC;QAClC,UAAU,EAAE,OAAO,CAAC,CAAC,IAAY,EAAE,KAAa,KAAI;AAClD,YAAA,MAAM,eAAe,GAAG,UAAU,CAAC,KAAK,CAAiC,CAAC;AAC1E,YAAA,YAAY,CAAC,IAAI,CACf,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,IAAI,IAAI,CAAC,UAAU,EAAE,OAAO,CAC7D,CAAC;AACJ,SAAC,CAAC,CAAC;AACH,QAAA,OAAO,YAAY,CAAC;KACrB;AAED;;;;;;;AAOG;;AAEH,IAAA,YAAY,CAAC,KAAU,EAAE,SAAS,GAAG,IAAI,EAAA;QACvC,MAAM,UAAU,GAAG,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,CAAC;AAClD,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE;YACtD,MAAM,YAAY,GAAG,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;AACxD,YAAA,IAAI,SAAS,EAAE;AACb,gBAAA,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC;AAC7B,oBAAA,MAAM,EAAE,QAAQ;AAChB,oBAAA,OAAO,EAAE,YAAY;oBACrB,SAAS,EAAE,SAAS,CAAC,KAAK;AAC1B,oBAAA,aAAa,EAAE,IAAI;AACpB,iBAAA,CAAC,CAAC;AACJ,aAAA;AACF,SAAA;KACF;AAED;;;;;AAKG;IACH,oBAAoB,CAClB,iBAAwC,EACxC,uBAA+C,EAAA;AAE/C,QAAA,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;AAC3C,QAAA,IAAI,CAAC,uBAAuB,GAAG,uBAAuB,CAAC;KACxD;AAED;;;;AAIG;IACH,oBAAoB,GAAA;QAClB,OAAO,IAAI,CAAC,iBAAiB,CAAC;KAC/B;AAED;;;;AAIG;IACH,0BAA0B,GAAA;QACxB,OAAO,IAAI,CAAC,uBAAuB,CAAC;KACrC;AAED;;;;AAIG;AACH,IAAA,oBAAoB,CAAC,iBAAoC,EAAA;AACvD,QAAA,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;KAC5C;AAED;;;;AAIG;IACH,oBAAoB,GAAA;QAClB,OAAO,IAAI,CAAC,iBAAiB,CAAC;KAC/B;AAED;;;;;AAKG;;AAEH,IAAA,aAAa,CACX,OAAe,EACf,UAAkB,EAClB,aAAsB,EAAA;QAEtB,OAAO,IAAI,CAAC,WAAW;AACpB,aAAA,OAAO,CACN,CAAA,EAAG,IAAI,CAAC,UAAU,CAAA,eAAA,EAAkB,OAAO,CAAA,YAAA,EAAe,UAAU,CAAA,gBAAA,EAAmB,aAAa,CAAA,CAAE,CACvG;AACA,aAAA,IAAI,CACH,GAAG,CAAC,CAAC,QAAQ,KAAI;AACf,YAAA,OAAO,QAAQ,CAAC;AAClB,SAAC,CAAC,EACF,UAAU,CAAC,CAAC,QAAQ,KAAI;AACtB,YAAA,MAAM,QAAQ,CAAC;SAChB,CAAC,CACH,CAAC;KACL;AAED;;;;;AAKG;AACH,IAAA,oBAAoB,CAClB,OAA2B,EAAA;QAE3B,OAAO,IAAI,CAAC,WAAW;aACpB,QAAQ,CAAC,GAAG,IAAI,CAAC,UAAU,CAAiC,+BAAA,CAAA,EAAE,OAAO,CAAC;AACtE,aAAA,IAAI,CACH,GAAG,CAAC,CAAC,QAAQ,KAAI;AACf,YAAA,OAAO,QAAQ,CAAC;AAClB,SAAC,CAAC,EACF,UAAU,CAAC,CAAC,QAAQ,KAAI;AACtB,YAAA,MAAM,QAAQ,CAAC;SAChB,CAAC,CACH,CAAC;KACL;AAED;;;;;AAKG;AACH,IAAA,gBAAgB,CACd,OAA2B,EAAA;QAE3B,OAAO,IAAI,CAAC,WAAW;aACpB,QAAQ,CAAC,GAAG,IAAI,CAAC,UAAU,CAAiC,+BAAA,CAAA,EAAE,OAAO,CAAC;AACtE,aAAA,IAAI,CACH,GAAG,CAAC,CAAC,QAAQ,KAAI;AACf,YAAA,OAAO,QAAQ,CAAC;AAClB,SAAC,CAAC,EACF,UAAU,CAAC,CAAC,QAAQ,KAAI;AACtB,YAAA,MAAM,QAAQ,CAAC;SAChB,CAAC,CACH,CAAC;KACL;AAED;;;;;AAKG;;AAEH,IAAA,iBAAiB,CAAC,WAAmB,EAAA;QACnC,OAAO,IAAI,CAAC,WAAW;aACpB,OAAO,CACN,GAAG,IAAI,CAAC,UAAU,CAAmC,gCAAA,EAAA,WAAW,EAAE,CACnE;AACA,aAAA,IAAI,CACH,GAAG,CAAC,CAAC,QAAQ,KAAI;YACf,MAAM,WAAW,GAAqB,EAAE,CAAC;YACzC,MAAM,WAAW,GAAW,EAAE,CAAC;YAC/B,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,IAAU,KAAI;AACrC,gBAAA,IAAI,IAAI,EAAE,YAAY,KAAK,QAAQ,CAAC,YAAY,EAAE;AAChD,oBAAA,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACxB,iBAAA;AAAM,qBAAA;oBACL,WAAW,CAAC,IAAI,CAAC;wBACf,EAAE,EAAE,IAAI,CAAC,MAAM;wBACf,IAAI,EAAE,IAAI,CAAC,QAAQ;AACnB,wBAAA,QAAQ,EAAE,KAAK;AACf,wBAAA,OAAO,EAAE,KAAK;AACf,qBAAA,CAAC,CAAC;AACJ,iBAAA;AACH,aAAC,CAAC,CAAC;AACH,YAAA,IAAI,CAAC,qBAAqB,CAAC,WAAW,CAAC,CAAC;AACxC,YAAA,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;AACjC,YAAA,OAAO,WAAW,CAAC;AACrB,SAAC,CAAC,EACF,UAAU,CAAC,CAAC,QAAQ,KAAI;AACtB,YAAA,MAAM,QAAQ,CAAC;SAChB,CAAC,CACH,CAAC;KACL;AACD;;;;AAIG;IACH,kBAAkB,GAAA;QAChB,OAAO,IAAI,CAAC,WAAW;AACpB,aAAA,OAAO,CAAC,CAAG,EAAA,IAAI,CAAC,UAAU,+BAA+B,CAAC;AAC1D,aAAA,IAAI,CACH,GAAG,CAAC,CAAC,QAAQ,KAAI;AACf,YAAA,OAAO,QAAQ,CAAC;AAClB,SAAC,CAAC,EACF,UAAU,CAAC,CAAC,QAAQ,KAAI;AACtB,YAAA,MAAM,QAAQ,CAAC;SAChB,CAAC,CACH,CAAC;KACL;AACD;;;;AAIG;IACH,WAAW,GAAA;QACT,OAAO,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,mBAAmB,CAAC,CAAC;KAChE;AACD;;;;;AAKG;IACH,4BAA4B,GAAA;QAC1B,OAAO,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,2BAA2B,CAAC,CAAC;KACxE;AACD;;;;;AAKG;AACH,IAAA,8BAA8B,CAAC,QAA+B,EAAA;QAC5D,MAAM,KAAK,GAAW,EAAE,CAAC;AACzB,QAAA,IAAI,CAAC,yBAAyB,GAAG,EAAE,CAAC;QACpC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,IAAI,KAAI;AAC/B,YAAA,MAAM,kBAAkB,GACtB,IAAI,CAAC,cAAc,EAAE,kBAAkB;gBACvC,IAAI;gBACJ,IAAI,CAAC,cAAc,EAAE,kBAAkB;AACvC,gBAAA,GAAG,CAAC;AACN,YAAA,MAAM,SAAS,GAAG,IAAI,EAAE,SAAS,EAAE,MAAM;;AAEvC,YAAA,CAAC,QAAa,EAAE,IAAU,KAAI;gBAC5B,QAAQ,CACN,IAAI,CAAC,YAAY,KAAK,QAAQ,CAAC,YAAY,GAAG,YAAY,GAAG,OAAO,CACrE,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AACvB,gBAAA,OAAO,QAAQ,CAAC;aACjB,EACD,EAAE,UAAU,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAC9B,CAAC;AACF,YAAA,IAAI,CAAC,yBAAyB,EAAE,IAAI,CAAC;gBACnC,MAAM,EAAE,IAAI,EAAE,MAAM;gBACpB,aAAa,EAAE,IAAI,EAAE,aAAa;AACnC,aAAA,CAAC,CAAC;AACH,YAAA,MAAM,aAAa,GAAG,IAAI,EAAE,aAAa;kBACrC,IAAI,EAAE,aAAa,EAAE,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;kBAC1D,IAAI,CAAC;YACT,KAAK,CAAC,IAAI,CAAC;gBACT,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI;AACpE,gBAAA,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE,gBAAgB;AACnD,sBAAE,kBAAkB;AACpB,sBAAE,IAAI;AACR,gBAAA,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM;AACzC,sBAAE,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;AAC1B,sBAAE,IAAI;AACR,gBAAA,YAAY,EAAE,aAAa;AAC3B,gBAAA,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,OAAO,IAAI,IAAI;AACxC,gBAAA,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,IAAI,IAAI;AAC/C,gBAAA,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,IAAI;AACrC,gBAAA,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,IAAI;gBAC7B,SAAS,EAAE,EACT,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC,QAAQ,EAAE,MAAM;oBACtC,IAAI,CAAC,WAAW,EAAE;AAClB,oBAAA,IAAI,CAAC,8BAA8B,EAAE,EAAE,OAAO,CAC/C;AACF,aAAA,CAAC,CAAC;AACL,SAAC,CAAC,CAAC;AACH,QAAA,OAAO,KAAK,CAAC;KACd;AACD;;;;;AAKG;AACH,IAAA,sBAAsB,CACpB,iBAA2C,EAAA;QAE3C,MAAM,UAAU,GAAyB,EAAE,CAAC;AAC5C,QAAA,iBAAiB,CAAC,OAAO,CAAC,CAAC,IAAI,KAAI;YACjC,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC;AACzD,SAAC,CAAC,CAAC;AACH,QAAA,OAAO,UAAU,CAAC;KACnB;AAED;;;;;AAKG;AACH,IAAA,cAAc,CAAC,KAAa,EAAA;QAC1B,OAAO,IAAI,CAAC,WAAW;aACpB,OAAO,CAAC,GAAG,IAAI,CAAC,UAAU,CAA6B,0BAAA,EAAA,KAAK,EAAE,CAAC;AAC/D,aAAA,IAAI,CACH,GAAG,CAAC,CAAC,QAAQ,KAAI;AACf,YAAA,OAAO,QAAQ,CAAC;AAClB,SAAC,CAAC,EACF,UAAU,CAAC,CAAC,QAAQ,KAAI;AACtB,YAAA,MAAM,QAAQ,CAAC;SAChB,CAAC,CACH,CAAC;KACL;AAED;;;;;AAKG;AACH,IAAA,mBAAmB,CACjB,OAA8B,EAAA;QAE9B,OAAO,IAAI,CAAC,WAAW;aACpB,QAAQ,CAAC,GAAG,IAAI,CAAC,UAAU,CAA4B,0BAAA,CAAA,EAAE,OAAO,CAAC;AACjE,aAAA,IAAI,CACH,GAAG,CAAC,CAAC,QAAQ,KAAI;AACf,YAAA,OAAO,QAAQ,CAAC;AAClB,SAAC,CAAC,EACF,UAAU,CAAC,CAAC,KAAK,KAAI;AACnB,YAAA,MAAM,KAAK,CAAC;SACb,CAAC,CACH,CAAC;KACL;AACD;;;;;;;AAOG;AACH,IAAA,eAAe,CACb,oBAEwC,EAAA;QAExC,OAAO,IAAI,CAAC,WAAW;aACpB,QAAQ,CACP,GAAG,IAAI,CAAC,UAAU,CAAoC,kCAAA,CAAA,EACtD,oBAAoB,CACrB;AACA,aAAA,IAAI,CACH,GAAG,CAAC,CAAC,QAAQ,KAAI;AACf,YAAA,OAAO,QAAQ,CAAC;AAClB,SAAC,CAAC,EACF,UAAU,CAAC,CAAC,KAAK,KAAI;AACnB,YAAA,MAAM,KAAK,CAAC;SACb,CAAC,CACH,CAAC;KACL;AAED;;;;AAIG;AACH,IAAA,qBAAqB,CAAC,SAA2B,EAAA;AAC/C,QAAA,IAAI,CAAC,cAAc,GAAG,SAAS,CAAC;KACjC;AAED;;;;AAIG;IACH,qBAAqB,GAAA;AACnB,QAAA,IAAI,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC,MAAM,MAAM,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC;QAC/D,OAAO,IAAI,CAAC,cAAc,CAAC;KAC5B;AAED;;;;AAIG;AACH,IAAA,mBAAmB,CAAC,QAAuB,EAAA;AACzC,QAAA,IAAI,CAAC,gBAAgB,GAAG,QAAQ,CAAC;KAClC;AAED;;;;AAIG;IACH,mBAAmB,GAAA;QACjB,OAAO,IAAI,CAAC,gBAAgB,CAAC;KAC9B;AAED;;;;;AAKG;AACH,IAAA,kBAAkB,CAChB,OAAoE,EAAA;QAEpE,OAAO,IAAI,CAAC,WAAW;aACpB,OAAO,CAAC,GAAG,IAAI,CAAC,UAAU,CAAkC,gCAAA,CAAA,EAAE,OAAO,CAAC;AACtE,aAAA,IAAI,CACH,GAAG,CAAC,CAAC,QAAQ,KAAI;AACf,YAAA,OAAO,QAAQ,CAAC;AAClB,SAAC,CAAC,EACF,UAAU,CAAC,CAAC,KAAK,KAAI;AACnB,YAAA,MAAM,KAAK,CAAC;SACb,CAAC,CACH,CAAC;KACL;AAED;;;;AAIG;AACH,IAAA,qBAAqB,CAAC,kBAAsC,EAAA;AAC1D,QAAA,IAAI,CAAC,kBAAkB,GAAG,kBAAkB,CAAC;KAC9C;AAED;;;;AAIG;IACH,qBAAqB,GAAA;QACnB,OAAO,IAAI,CAAC,kBAAkB,CAAC;KAChC;AACD;;;;;AAKG;IACH,mBAAmB,CACjB,UAAkB,EAClB,iBAA0B,EAAA;QAE1B,MAAM,eAAe,GAAG,CAAG,EAAA,IAAI,CAAC,UAAU,CAAA,iCAAA,EAAoC,UAAU,CAAA,CAAE,CAAC;QAC3F,OAAO,IAAI,CAAC,WAAW;AACpB,aAAA,OAAO,CACN,iBAAiB;AACf,cAAE,eAAe,GAAG,CAAA,WAAA,EAAc,iBAAiB,CAAE,CAAA;cACnD,eAAe,CACpB;AACA,aAAA,IAAI,CACH,GAAG,CAAC,CAAC,QAAQ,KAAI;AACf,YAAA,OAAO,QAAQ,CAAC;AAClB,SAAC,CAAC,EACF,UAAU,CAAC,CAAC,QAAQ,KAAI;AACtB,YAAA,MAAM,QAAQ,CAAC;SAChB,CAAC,CACH,CAAC;KACL;AACD;;;;AAIG;AACH,IAAA,uBAAuB,CAAC,oBAAuC,EAAA;AAC7D,QAAA,IAAI,CAAC,oBAAoB,GAAG,oBAAoB,CAAC;KAClD;AACD;;;;AAIG;IACH,uBAAuB,GAAA;QACrB,OAAO,IAAI,CAAC,oBAAoB,CAAC;KAClC;AACD;;;;AAIG;AACH,IAAA,WAAW,CAAC,QAA0B,EAAA;AACpC,QAAA,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;KAC1B;AACD;;;;;;AAMG;IACH,WAAW,GAAA;AACT,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,KAAK;YAAE,OAAO,IAAI,CAAC,QAAQ,CAAC;AAC/C,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;AAC5E,QAAA,OAAO,cAAc,EAAE,KAAK,GAAG,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC;KAC/D;AACD;;;;;;;AAOG;IACH,cAAc,CACZ,cAA8B,EAC9B,WAAqC,EAAA;AAErC,QAAA,IAAI,WAAW,EAAE;AACf,YAAA,MAAM,sBAAsB,GAC1B,IAAI,CAAC,sBAAsB,CAAC,0BAA0B,CACpD,WAAW,EACX,IAAI,CAAC,uBAAuB,CAAC,mBAAmB,EAAE,CACnD,CAAC;YACJ,OAAO,IAAI,CAAC,sBAAsB,CAAC,wBAAwB,CACzD,cAAc,EACd,sBAAsB,CACvB,CAAC;AACH,SAAA;AACD,QAAA,OAAO,IAAI,CAAC,sBAAsB,CAAC,wBAAwB,CACzD,cAAc,EACd,IAAI,CAAC,uBAAuB,EAAE,CAC/B,CAAC;KACH;AACD;;;;;;;;;AASG;IACH,4BAA4B,GAAA;QAC1B,OAAO,IAAI,CAAC,iBAAiB,EAAE,CAAC,IAAI,CAClC,CAAC,OAAO,KACN,OAAO,EAAE,SAAS,KAAK,WAAW,CAAC,aAAa,IAAI,CAAC,OAAO,EAAE,SAAS,CAC1E,CAAC;KACH;AACD;;;;AAIG;AACH,IAAA,mBAAmB,CAAC,UAAoC,EAAA;AACtD,QAAA,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;KAC9B;AACD;;;;AAIG;IACH,mBAAmB,GAAA;QACjB,OAAO,IAAI,CAAC,UAAU,CAAC;KACxB;AAED;;;;;AAKG;AACH,IAAA,gBAAgB,CACd,iBAA6C,EAAA;QAE7C,OAAO,IAAI,CAAC,WAAW;aACpB,QAAQ,CACP,GAAG,IAAI,CAAC,UAAU,CAA8B,4BAAA,CAAA,EAChD,iBAAiB,CAClB;AACA,aAAA,IAAI,CACH,GAAG,CAAC,CAAC,QAAQ,KAAI;AACf,YAAA,OAAO,QAAQ,CAAC;AAClB,SAAC,CAAC,EACF,UAAU,CAAC,CAAC,QAAQ,KAAI;AACtB,YAAA,MAAM,QAAQ,CAAC;SAChB,CAAC,CACH,CAAC;KACL;AACD;;;;AAIG;IACH,8BAA8B,GAAA;AAC5B,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,mBAAmB,EAAE,EAAE,IAAI,CACnD,CAAC,KAAK,KAAK,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC,oBAAoB,EAAE,EAAE,SAAS,CAC3E,EAAE,gBAAgB,EAAE,YAAY,CAAC;AAClC,QAAA,IAAG,YAAY,EAAE,UAAU,KAAK,eAAe,CAAC,MAAM;AACpD,YAAA,YAAY,CAAC,UAAU,GAAG,eAAe,CAAC,UAAU,CAAC;AACvD,QAAA,OAAO,YAAY,CAAC;KACrB;AACD;;;;;;;AAOG;AACH,IAAA,sBAAsB,CACpB,eAAgC,EAChC,UAA6B,EAC7B,iBAA2B,EAAA;AAE3B,QAAA,IAAI,eAAe,KAAK,eAAe,CAAC,UAAU;AAChD,YAAA,OAAO,UAAU,KAAK,UAAU,CAAC,OAAO,CAAC;QAC3C,OAAO,iBAAiB,EAAE,MAAM,KAAK,CAAC,IAAI,UAAU,KAAK,UAAU,CAAC,OAAO,CAAC;KAC7E;AAED;;;;AAIG;AACH,IAAA,0BAA0B,CAAC,oBAA6B,EAAA;AACtD,QAAA,IAAI,CAAC,oBAAoB,GAAG,oBAAoB,CAAC;KAClD;AAED;;;;AAIG;IACH,0BAA0B,GAAA;QACxB,OAAO,IAAI,CAAC,oBAAoB,CAAC;KAClC;AAED;;;;AAIG;AACH,IAAA,cAAc,CAAC,WAAmB,EAAA;AAChC,QAAA,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;KAChC;AACD;;;;AAIG;IACH,cAAc,GAAA;QACZ,OAAO,IAAI,CAAC,WAAW,CAAC;KACzB;;IAGD,sBAAsB,GAAA;AACpB,QAAA,MAAM,SAAS,GAAG;AAChB,YAAA,GAAG,IAAI,GAAG,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;AAClE,SAAA,CAAC,IAAI,CACJ,CAAC,KAAK,EAAE,MAAM,KACZ,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CACnD,CAAC;QACF,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;KACxE;AAED;;;;;;;;;;;;;;;;AAgBG;AACH,IAAA,oBAAoB,CAClB,UAAkB,EAAA;QAElB,OAAO,IAAI,CAAC,WAAW;aACpB,OAAO,CAAC,GAAG,IAAI,CAAC,UAAU,CAAoB,iBAAA,EAAA,UAAU,YAAY,CAAC;aACrE,IAAI,CACH,GAAG,CAAC,CAAC,QAAQ,KAAM,QAAQ,EAAE,IAA+B,IAAI,EAAE,CAAC,EACnE,UAAU,CAAC,CAAC,QAAQ,KAAI;AACtB,YAAA,MAAM,QAAQ,CAAC;SAChB,CAAC,CACH,CAAC;KACL;AAED;;;;;;;;;;;;;;;;;;;;;;;AAuBG;IACH,2BAA2B,CACzB,OAAe,EACf,OAAwC,EAAA;QAExC,OAAO,IAAI,CAAC,WAAW;aACpB,QAAQ,CACP,CAAG,EAAA,IAAI,CAAC,UAAU,0BAA0B,OAAO,CAAA,UAAA,CAAY,EAC/D,OAAO,CACR;AACA,aAAA,IAAI,CACH,GAAG,CAAC,CAAC,QAAQ,KAAI;AACf,YAAA,MAAM,IAAI,GAAG,QAAQ,EAAE,IAAwC,CAAC;YAChE,OAAO;AACL,gBAAA,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,EAAE;AACtB,gBAAA,YAAY,EAAE,IAAI,EAAE,YAAY,IAAI,CAAC;AACrC,gBAAA,MAAM,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AACzB,gBAAA,QAAQ,EAAE,IAAI,EAAE,QAAQ,IAAI,CAAC;aAC9B,CAAC;AACJ,SAAC,CAAC,EACF,UAAU,CAAC,CAAC,QAAQ,KAAI;AACtB,YAAA,MAAM,QAAQ,CAAC;SAChB,CAAC,CACH,CAAC;KACL;AAED;;;;;;;;;;;;;;;AAeG;AACH,IAAA,yBAAyB,CACvB,OAAiC,EAAA;QAEjC,OAAO,IAAI,CAAC,WAAW;aACpB,OAAO,CAAC,GAAG,IAAI,CAAC,UAAU,CAA+B,6BAAA,CAAA,EAAE,OAAO,CAAC;aACnE,IAAI,CACH,GAAG,CAAC,CAAC,QAAQ,KAAK,QAAQ,EAAE,IAAI,IAAI,IAAI,CAAC,EACzC,UAAU,CAAC,CAAC,QAAQ,KAAI;AACtB,YAAA,MAAM,QAAQ,CAAC;SAChB,CAAC,CACH,CAAC;KACL;AAqBD;;;;;AAKG;IACK,kBAAkB,CAAC,MAAM,GAAG,EAAE,EAAA;AACpC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC;QACxD,OAAO,CAAA,EAAG,IAAI,CAAI,CAAA,EAAA,IAAI,CAAC,oBAAoB,CAAA,EAAG,MAAM,CAAA,CAAE,CAAC;KACxD;AAED;;;;;;AAMG;AACH,IAAA,4BAA4B,CAC1B,WAAmB,EAAA;QAEnB,OAAO,IAAI,CAAC,WAAW;aACpB,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAI,CAAA,EAAA,WAAW,CAAmB,iBAAA,CAAA,CAAC,CAAC;AACpE,aAAA,IAAI,CACH,GAAG,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,EAC3B,UAAU,CAAC,CAAC,KAAK,KAAI;AACnB,YAAA,MAAM,KAAK,CAAC;SACb,CAAC,CACH,CAAC;KACL;AAED;;;;;;;;AAQG;IACH,mBAAmB,CACjB,WAAmB,EACnB,OAAgB,EAAA;AAEhB,QAAA,MAAM,KAAK,GAAG,OAAO,GAAG,CAAY,SAAA,EAAA,kBAAkB,CAAC,OAAO,CAAC,CAAE,CAAA,GAAG,EAAE,CAAC;QACvE,OAAO,IAAI,CAAC,WAAW;aACpB,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAI,CAAA,EAAA,WAAW,CAAG,EAAA,KAAK,CAAE,CAAA,CAAC,CAAC;AAC3D,aAAA,IAAI,CACH,GAAG,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,EAC3B,UAAU,CAAC,CAAC,KAAK,KAAI;AACnB,YAAA,MAAM,KAAK,CAAC;SACb,CAAC,CACH,CAAC;KACL;AAED;;;;;;AAMG;AACH,IAAA,oBAAoB,CAClB,OAAoC,EAAA;QAEpC,OAAO,IAAI,CAAC,WAAW;AACpB,aAAA,QAAQ,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,OAAO,CAAC;AAC5C,aAAA,IAAI,CACH,GAAG,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,EAC3B,UAAU,CAAC,CAAC,KAAK,KAAI;AACnB,YAAA,MAAM,KAAK,CAAC;SACb,CAAC,CACH,CAAC;KACL;AAED;;;;;;AAMG;AACH,IAAA,sBAAsB,CACpB,QAAgB,EAAA;QAEhB,OAAO,IAAI,CAAC,WAAW;aACpB,QAAQ,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAI,CAAA,EAAA,QAAQ,CAAS,OAAA,CAAA,CAAC,EAAE,EAAE,CAAC;AAC5D,aAAA,IAAI,CACH,GAAG,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,EAC3B,UAAU,CAAC,CAAC,KAAK,KAAI;AACnB,YAAA,MAAM,KAAK,CAAC;SACb,CAAC,CACH,CAAC;KACL;+GArpCU,aAAa,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAC,IAAA,CAAA,WAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,sBAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,0BAAA,EAAA,EAAA,EAAA,KAAA,EAAAF,IAAA,CAAA,aAAA,EAAA,EAAA,EAAA,KAAA,EAAAA,IAAA,CAAA,cAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;AAAb,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,aAAa,cAFZ,MAAM,EAAA,CAAA,CAAA,EAAA;;4FAEP,aAAa,EAAA,UAAA,EAAA,CAAA;kBAHzB,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA,CAAA;;;ACnED;;;;;;;;;;;;;;AAcG;MAeU,gCAAgC,CAAA;;AAgD3C,IAAA,WAAA;;IAEU,aAA4B;;IAE5B,MAAiB,EAAA;QAFjB,IAAa,CAAA,aAAA,GAAb,aAAa,CAAe;QAE5B,IAAM,CAAA,MAAA,GAAN,MAAM,CAAW;AAnD3B,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,OAAO,EAAW,CAAC;;AAUxB,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,YAAY,EAAW,CAAC;;AAE5C,QAAA,IAAA,CAAA,eAAe,GAAG,IAAI,YAAY,EAA0B,CAAC;AACvE;;;;AAIG;AACO,QAAA,IAAA,CAAA,sBAAsB,GAAG,IAAI,YAAY,EAAY,CAAC;;QAGhE,IAAO,CAAA,OAAA,GAAG,KAAK,CAAC;;AAEhB,QAAA,IAAA,CAAA,YAAY,GAAsB;AAChC,YAAA,EAAE,EAAE,CAAC;AACL,YAAA,KAAK,EAAE,EAAE;AACT,YAAA,OAAO,EAAE,KAAK;AACd,YAAA,SAAS,EAAE,0BAA0B;SACtC,CAAC;;QAEF,IAAqB,CAAA,qBAAA,GAA2B,EAAE,CAAC;AACnD;;;;AAIG;AACK,QAAA,IAAA,CAAA,sBAAsB,GAAG,IAAI,GAAG,EAAkB,CAAC;AAC3D;;;AAGG;QACH,IAAgB,CAAA,gBAAA,GAAa,EAAE,CAAC;;QAEhC,IAAe,CAAA,eAAA,GAA4B,EAAE,CAAC;QAC9C,IAAS,CAAA,SAAA,GAAG,KAAK,CAAC;KAQd;IAEJ,QAAQ,GAAA;QACN,IAAI,IAAI,CAAC,WAAW,EAAE;AACpB,YAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;AAC3C,YAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;AAC3C,SAAA;KACF;;AAGO,IAAA,mBAAmB,CAAC,WAAmB,EAAA;AAC7C,QAAA,IAAI,CAAC,aAAa;aACf,4BAA4B,CAAC,WAAW,CAAC;AACzC,aAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC9B,aAAA,SAAS,CAAC;AACT,YAAA,IAAI,EAAE,CAAC,GAAG,KAAI;gBACZ,IAAI,CAAC,eAAe,GAAG,GAAG,EAAE,IAAI,IAAI,EAAE,CAAC;aACxC;AACD,YAAA,KAAK,EAAE,CAAC,KAAK,KAAI;AACf,gBAAA,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;aACxC;AACF,SAAA,CAAC,CAAC;KACN;AAED;;;AAGG;AACK,IAAA,kBAAkB,CAAC,WAAmB,EAAA;AAC5C,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;AACtB,QAAA,IAAI,CAAC,aAAa;AACf,aAAA,mBAAmB,CAAC,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC;AAC9C,aAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC9B,aAAA,SAAS,CAAC;AACT,YAAA,IAAI,EAAE,CAAC,GAAG,KAAI;AACZ,gBAAA,MAAM,IAAI,GAAgC,GAAG,EAAE,IAAI,IAAI,EAAE,CAAC;AAC1D,gBAAA,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM;oBAC9C,OAAO,EAAE,GAAG,CAAC,cAAc;oBAC3B,SAAS,EAAE,GAAG,CAAC,gBAAgB;oBAC/B,QAAQ,EAAE,GAAG,CAAC,QAAQ;AACvB,iBAAA,CAAC,CAAC,CAAC;;;gBAGJ,IAAI,CAAC,sBAAsB,GAAG,IAAI,GAAG,CACnC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,cAAc,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CACtD,CAAC;gBACF,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,qBAAqB,CAAC,MAAM,GAAG,CAAC,CAAC;AACrD,gBAAA,IAAI,CAAC,YAAY,GAAG,EAAE,GAAG,IAAI,CAAC,YAAY,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;AACpE,gBAAA,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAC;gBAC3B,IAAI,CAAC,SAAS,EAAE,CAAC;AACjB,gBAAA,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;aACxB;AACD,YAAA,KAAK,EAAE,CAAC,KAAK,KAAI;AACf,gBAAA,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;AACvB,gBAAA,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;aACxC;AACF,SAAA,CAAC,CAAC;KACN;;AAGD,IAAA,cAAc,CAAC,MAAyB,EAAA;QACtC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC;AACjC,QAAA,IAAI,CAAC,YAAY,GAAG,EAAE,GAAG,IAAI,CAAC,YAAY,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;AACpE,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;;AAEjB,YAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;AAChD,YAAA,IAAI,CAAC,qBAAqB,GAAG,EAAE,CAAC;AACjC,SAAA;QACD,IAAI,CAAC,SAAS,EAAE,CAAC;KAClB;;IAGD,kBAAkB,GAAA;QAChB,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,yBAAyB,EAAE;AAC5D,YAAA,UAAU,EAAE,qBAAqB;AACjC,YAAA,IAAI,EAAE;gBACJ,eAAe,EAAE,IAAI,CAAC,eAAe;AACrC,gBAAA,gBAAgB,EAAE,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC;AACnE,aAAA;AACF,SAAA,CAAC,CAAC;QACH,SAAS;AACN,aAAA,WAAW,EAAE;AACb,aAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC9B,aAAA,SAAS,CAAC,CAAC,MAA2C,KAAI;AACzD,YAAA,IAAI,MAAM,EAAE;AACV,gBAAA,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;gBAC5B,IAAI,CAAC,SAAS,EAAE,CAAC;AAClB,aAAA;AACH,SAAC,CAAC,CAAC;KACN;AAED;;;;AAIG;AACK,IAAA,cAAc,CAAC,QAAiC,EAAA;AACtD,QAAA,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;;QAG5D,MAAM,OAAO,GAAG,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAC/C,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CACnC,CAAC;AACF,QAAA,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;;;;AAK7B,QAAA,IAAI,CAAC,qBAAqB,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM;YAChD,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,QAAQ,EAAE,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC;AACrD,SAAA,CAAC,CAAC,CAAC;;;AAIJ,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,QAAQ,KAAI;AAChE,YAAA,MAAM,aAAa,GAAG,IAAI,CAAC,qBAAqB,CAAC,IAAI,CACnD,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAC/B,CAAC;YACF,OAAO,CAAC,aAAa,CAAC;AACxB,SAAC,CAAC,CAAC;KACJ;;AAGD,IAAA,WAAW,CAAC,OAAe,EAAA;AACzB,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAC/C,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,KAAK,OAAO,CAC7B,CAAC;AACF,QAAA,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QAC7B,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAC5D,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,KAAK,OAAO,CAC7B,CAAC;QACF,IAAI,CAAC,SAAS,EAAE,CAAC;KAClB;;AAGO,IAAA,cAAc,CAAC,MAA8B,EAAA;AACnD,QAAA,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,KAAI;AACnB,YAAA,IAAI,CAAC,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE;gBAC7D,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;AACxC,aAAA;AACH,SAAC,CAAC,CAAC;KACJ;;AAGD,IAAA,IAAI,OAAO,GAAA;AACT,QAAA,OAAO,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,qBAAqB,CAAC,MAAM,GAAG,CAAC,CAAC;KAC/D;IAEO,SAAS,GAAA;QACf,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACtC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;AACtD,QAAA,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;KAC9D;IAED,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzB,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;KAC1B;+GApNU,gCAAgC,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAG,aAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,EAAA,CAAA,SAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;mGAAhC,gCAAgC,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kCAAA,EAAA,MAAA,EAAA,EAAA,WAAA,EAAA,aAAA,EAAA,OAAA,EAAA,SAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,EAAA,OAAA,EAAA,EAAA,aAAA,EAAA,eAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,sBAAA,EAAA,wBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EChE7C,uyFA2EA,EDpBI,MAAA,EAAA,CAAA,m4UAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,YAAY,+PACZ,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,6GAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,eAAA,EAAA,OAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACf,oBAAoB,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,aAAA,EAAA,YAAA,EAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA,EAAA;;4FAMX,gCAAgC,EAAA,UAAA,EAAA,CAAA;kBAd5C,SAAS;+BAEE,kCAAkC,EAAA,UAAA,EAChC,IAAI,EACP,OAAA,EAAA;wBACP,YAAY;wBACZ,eAAe;wBACf,eAAe;wBACf,oBAAoB;qBACrB,EAGc,aAAA,EAAA,iBAAiB,CAAC,IAAI,EAAA,QAAA,EAAA,uyFAAA,EAAA,MAAA,EAAA,CAAA,m4UAAA,CAAA,EAAA,CAAA;yHAM5B,WAAW,EAAA,CAAA;sBAAnB,KAAK;gBAEG,OAAO,EAAA,CAAA;sBAAf,KAAK;gBAEG,mBAAmB,EAAA,CAAA;sBAA3B,KAAK;gBAGI,aAAa,EAAA,CAAA;sBAAtB,MAAM;gBAEG,eAAe,EAAA,CAAA;sBAAxB,MAAM;gBAMG,sBAAsB,EAAA,CAAA;sBAA/B,MAAM;;;AEzCT,MAAM,WAAW,GAAG,CAAC,CAAC;AACtB;AACA,MAAM,uBAAuB,GAAG,eAAe,CAAC;AAEhD;;;;;AAKG;MAgBU,oBAAoB,CAAA;;AA4C/B,IAAA,WAAA;;IAEU,aAA4B;;IAE5B,yBAAoD;;AAErD,IAAA,YAA2B;;QAJ1B,IAAa,CAAA,aAAA,GAAb,aAAa,CAAe;QAE5B,IAAyB,CAAA,yBAAA,GAAzB,yBAAyB,CAA2B;QAErD,IAAY,CAAA,YAAA,GAAZ,YAAY,CAAe;AAjDpC,QAAA,IAAA,CAAA,QAAQ,GAAqB,IAAI,OAAO,EAAW,CAAC;AACpD;;;AAGG;AACO,QAAA,IAAA,CAAA,kBAAkB,GAAG,IAAI,YAAY,EAAE,CAAC;AAClD;;;AAGG;AACO,QAAA,IAAA,CAAA,UAAU,GAAG,IAAI,YAAY,EAAE,CAAC;AAC1C,QAAA,IAAA,CAAA,eAAe,GAAGC,WAAwB,CAAC;;QAE3C,IAAS,CAAA,SAAA,GAAQ,WAAW,CAAC;QAC7B,IAAe,CAAA,eAAA,GAAG,IAAI,CAAC,eAAe,EAAE,KAAK,EAAE,eAAe,CAAC;QAC/D,IAAgB,CAAA,gBAAA,GAAG,IAAI,CAAC,eAAe,EAAE,KAAK,EAAE,gBAAgB,CAAC;QACjE,IAAe,CAAA,eAAA,GAAG,KAAK,CAAC;QACxB,IAAkB,CAAA,kBAAA,GAAG,IAAI,CAAC;QAC1B,IAAQ,CAAA,QAAA,GAAa,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;AAGhE,QAAA,IAAA,CAAA,iBAAiB,GAAG,SAAS,CAAC,IAAI,CAAC;QAKnC,IAAmB,CAAA,mBAAA,GAAuB,EAAE,CAAC;QAC7C,IAA0B,CAAA,0BAAA,GAAmB,EAAE,CAAC;QAChD,IAAoB,CAAA,oBAAA,GAAG,KAAK,CAAC;AAC7B,QAAA,IAAA,CAAA,iBAAiB,GAAsB;AACrC,YAAA,EAAE,EAAE,CAAC;AACL,YAAA,KAAK,EAAE,IAAI,CAAC,eAAe,EAAE,KAAK,EAAE,iBAAiB;AACrD,YAAA,OAAO,EAAE,KAAK;SACf,CAAC;;QAEF,IAAiB,CAAA,iBAAA,GAAG,KAAK,CAAC;QAC1B,IAAwB,CAAA,wBAAA,GAA2B,EAAE,CAAC;;QAEtD,IAA0B,CAAA,0BAAA,GAAa,EAAE,CAAC;KAYtC;AAEJ;;;;AAIG;IACH,QAAQ,GAAA;QACN,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,aAAa,EAAE,oBAAoB,EAAE,CAAC;QACpE,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,aAAa,EAAE,oBAAoB,EAAE,CAAC;AACpE,QAAA,IAAI,IAAI,CAAC,iBAAiB,KAAK,iBAAiB,CAAC,IAAI,EAAE;AACrD,YAAA,IAAI,CAAC,uBAAuB;AAC1B,gBAAA,IAAI,CAAC,aAAa,EAAE,0BAA0B,EAAE,CAAC;AACnD,YAAA,IAAI,IAAI,CAAC,iBAAiB,EAAE,aAAa;gBACvC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC;YACxD,IAAI,CAAC,eAAe,EAAE,CAAC;AACxB,SAAA;AAAM,aAAA;AACL,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE,sBAAsB,CAC3D,IAAI,CAAC,aAAa,EAAE,mBAAmB,EAAE,CAC1C,CAAC;AACF,YAAA,IAAI,IAAI,CAAC,iBAAiB,EAAE,SAAS,EAAE;gBACrC,MAAM,gBAAgB,GACpB,UAAU,CAAC,IAAI,CAAC,iBAAiB,EAAE,SAAS,CAAC,EAAE,YAAY;AACzD,sBAAE,gBAAgB,CAAC;gBACvB,IAAI,gBAAgB,EAAE,MAAM,EAAE;AAC5B,oBAAA,IAAI,CAAC,UAAU,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,WAAmB,MAAM;AAC/D,wBAAA,EAAE,EAAE,WAAW;AACf,wBAAA,IAAI,EAAE,UAAU,CAAC,WAAW,CAAC,EAAE,IAAI;AACpC,qBAAA,CAAC,CAAC,CAAC;oBACJ,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CACtC,CAAC,SAAS,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,YAAY,EAAE,OAAO,CAChE,CAAC;AACH,iBAAA;AAAM,qBAAA;AACL,oBAAA,IAAI,CAAC,gBAAgB,CAACN,MAAmB,EAAE,MAAM,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC;AACrE,iBAAA;AACF,aAAA;AAAM,iBAAA;gBACL,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,CAC9C,CAAC,CAAC,EAAE,EAAE,IAAI,CAAsB,MAAM;oBACpC,EAAE;oBACF,IAAI,EAAE,IAAI,EAAE,IAAI;AACjB,iBAAA,CAAC,CACH,CAAC;gBACF,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CACtC,CAAC,SAAS,KACR,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,SAAS,KAAK,CAAC;oBACzC,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,YAAY,EAAE,OAAO,CACnD,CAAC;AACH,aAAA;AACD,YAAA,IAAI,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE;gBAC3B,IAAI,CAAC,eAAe,EAAE,CAAC;AACxB,aAAA;AAAM,iBAAA;AACL,gBAAA,IAAI,CAAC,gBAAgB,CAACA,MAAmB,GAAG,MAAM,CAAC,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC;AACvE,aAAA;AACF,SAAA;KACF;AAED;;;;AAIG;IACH,iBAAiB,GAAA;AACf,QAAA,IAAI,cAA2B,CAAC;AAChC,QAAA,IAAI,IAAI,CAAC,iBAAiB,KAAK,iBAAiB,CAAC,IAAI,EAAE;AACrD,YAAA,cAAc,GAAG;gBACf,IAAI,EAAE,eAAe,EAAE,SAAS;AAChC,gBAAA,KAAK,EAAE,IAAI,CAAC,eAAe,EAAE,KAAK,EAAE,SAAS;AAC7C,gBAAA,WAAW,EAAE,WAAW;AACxB,gBAAA,UAAU,EAAE,IAAI;AAChB,gBAAA,aAAa,EAAE,KAAK;AACpB,gBAAA,KAAK,EAAE,IAAI,CAAC,iBAAiB,EAAE,aAAa,EAAE,IAAI;gBAClD,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS;gBAC1D,iBAAiB,EACf,IAAI,CAAC,eAAe,EAAE,KAAK,EAAE,iBAAiB,EAAE,SAAS;AAC3D,gBAAA,QAAQ,EAAE,IAAI;aACf,CAAC;AACH,SAAA;AAAM,aAAA;AACL,YAAA,cAAc,GAAG;gBACf,IAAI,EAAE,eAAe,EAAE,MAAM;gBAC7B,KAAK,EAAE,IAAI,CAAC,eAAe,EAAE,KAAK,EAAE,SAAS,GAAG,GAAG;AACnD,gBAAA,WAAW,EAAE,WAAW;gBACxB,oBAAoB,EAAE,IAAI,CAAC,eAAe,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ;AACpE,gBAAA,KAAK,EAAE,EAAE;AACT,gBAAA,UAAU,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;gBACjC,eAAe,EAAE,IAAI,CAAC,UAAU;AAChC,gBAAA,cAAc,EAAE,IAAI,CAAC,eAAe,EAAE,WAAW,EAAE,SAAS;gBAC5D,SAAS,EAAE,IAAI,CAAC,eAAe,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS;gBAC5D,iBAAiB,EACf,IAAI,CAAC,eAAe,EAAE,KAAK,EAAE,iBAAiB,EAAE,SAAS;AAC3D,gBAAA,WAAW,EAAE,EAAE;aAChB,CAAC;AACH,SAAA;AACD,QAAA,OAAO,cAAc,CAAC;KACvB;AAED;;;AAGG;;AAEH,IAAA,eAAe,CAAC,SAAe,EAAA;QAC7B,IAAI,CAAC,SAAS,GAAG;AACf,YAAA,SAAS,EAAE;AACT,gBAAA;AACE,oBAAA,MAAM,EAAE,EAAE;AACV,oBAAA,QAAQ,EAAE;wBACR,IAAI,CAAC,iBAAiB,EAAE;AACxB,wBAAA;4BACE,IAAI,EAAE,eAAe,EAAE,KAAK;4BAC5B,KAAK,EAAE,IAAI,CAAC,eAAe,EAAE,KAAK,EAAE,SAAS,GAAG,GAAG;AACnD,4BAAA,WAAW,EAAE,WAAW;4BACxB,oBAAoB,EAClB,IAAI,CAAC,eAAe,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ;AAChD,4BAAA,KAAK,EACH,IAAI,CAAC,iBAAiB,KAAK,iBAAiB,CAAC,IAAI;AAC/C,kCAAE,SAAS;sCACP,SAAS,EAAE,SAAS;AACtB,sCAAE,IAAI,CAAC,iBAAiB,EAAE,SAAS;AACrC,kCAAE,EAAE;AACR,4BAAA,WAAW,EAAE,EAAE;AACf,4BAAA,cAAc,EAAE,IAAI,CAAC,eAAe,EAAE,WAAW,EAAE,SAAS;4BAC5D,mBAAmB,EACjB,IAAI,CAAC,eAAe,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS;AAC1D,4BAAA,UAAU,EAAE;AACV,gCAAA,UAAU,CAAC,QAAQ;gCACnB,UAAU,CAAC,SAAS,CAClBM,WAAwB,EAAE,cAAc,EAAE,YAAY,CACvD;AACD,gCAAA,UAAU,CAAC,OAAO,CAAC,wBAAwB,EAAE,SAAS,CAAC;AACxD,6BAAA;4BACD,eAAe,EACb,IAAI,CAAC,eAAe,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS;4BACxD,SAAS,EAAE,IAAI,CAAC,eAAe,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS;4BAC5D,iBAAiB,EACf,IAAI,CAAC,eAAe,EAAE,KAAK,EAAE,iBAAiB,EAAE,SAAS;AAC5D,yBAAA;AACD,wBAAA;4BACE,IAAI,EAAE,eAAe,EAAE,KAAK;4BAC5B,KAAK,EAAE,IAAI,CAAC,eAAe,EAAE,KAAK,EAAE,SAAS,GAAG,GAAG;AACnD,4BAAA,WAAW,EAAE,WAAW;4BACxB,oBAAoB,EAClB,IAAI,CAAC,eAAe,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ;AAChD,4BAAA,KAAK,EACH,IAAI,CAAC,iBAAiB,KAAK,iBAAiB,CAAC,IAAI;AAC/C,kCAAE,SAAS;sCACP,SAAS,EAAE,SAAS;AACtB,sCAAE,IAAI,CAAC,iBAAiB,EAAE,cAAc;AAC1C,kCAAE,EAAE;4BACR,mBAAmB,EACjB,IAAI,CAAC,eAAe,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS;AAC1D,4BAAA,WAAW,EAAE,EAAE;AACf,4BAAA,cAAc,EAAE,IAAI,CAAC,eAAe,EAAE,WAAW,EAAE,SAAS;AAC5D,4BAAA,UAAU,EAAE;AACV,gCAAA,UAAU,CAAC,QAAQ;gCACnB,UAAU,CAAC,SAAS,CAClBA,WAAwB,EAAE,cAAc,EAAE,WAAW,CACtD;AACD,gCAAA,UAAU,CAAC,OAAO,CAAC,wBAAwB,EAAE,SAAS,CAAC;AACxD,6BAAA;4BACD,eAAe,EACb,IAAI,CAAC,eAAe,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS;4BACxD,SAAS,EAAE,IAAI,CAAC,eAAe,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS;4BAC5D,iBAAiB,EACf,IAAI,CAAC,eAAe,EAAE,KAAK,EAAE,iBAAiB,EAAE,SAAS;AAC5D,yBAAA;AACD,wBAAA;4BACE,IAAI,EAAE,eAAe,CAAC,SAAS;AAC/B,4BAAA,KAAK,EAAE,IAAI,CAAC,eAAe,EAAE,KAAK,EAAE,UAAU;AAC9C,4BAAA,WAAW,EAAE,YAAY;4BACzB,mBAAmB,EACjB,IAAI,CAAC,eAAe,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU;AAC3D,4BAAA,KAAK,EACH,IAAI,CAAC,iBAAiB,KAAK,iBAAiB,CAAC,IAAI;AAC/C,kCAAE,SAAS;sCACP,SAAS,EAAE,UAAU;AACvB,sCAAE,IAAI,CAAC,iBAAiB,EAAE,SAAS;AACrC,kCAAE,EAAE;AACR,4BAAA,WAAW,EAAE,EAAE;AACf,4BAAA,cAAc,EAAE,IAAI,CAAC,eAAe,EAAE,WAAW,EAAE,UAAU;AAC7D,4BAAA,QAAQ,EAAE,IAAI;AACd,4BAAA,SAAS,EACPA,WAAwB,EAAE,cAAc,EAAE,aAAa;AACzD,4BAAA,UAAU,EAAE;gCACV,UAAU,CAAC,SAAS,CAClBA,WAAwB,EAAE,cAAc,EAAE,aAAa,CACxD;AACD,gCAAA,UAAU,CAAC,OAAO,CAAC,wBAAwB,EAAE,UAAU,CAAC;AACzD,6BAAA;4BACD,eAAe,EACb,IAAI,CAAC,eAAe,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU;4BACzD,SAAS,EAAE,IAAI,CAAC,eAAe,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU;4BAC7D,iBAAiB,EACf,IAAI,CAAC,eAAe,EAAE,KAAK,EAAE,iBAAiB,EAAE,UAAU;AAC7D,yBAAA;AACF,qBAAA;AACF,iBAAA;AACF,aAAA;SACF,CAAC;AACF,QAAA,IAAI,IAAI,CAAC,iBAAiB,EAAE,OAAO,EAAE;AACnC,YAAA,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;AACpD,SAAA;KACF;AAED;;;;;AAKG;AACH,IAAA,qBAAqB,CAAC,eAA0B,EAAA;AAC9C,QAAA,IACE,CAAC,IAAI,CAAC,iBAAiB,KAAK,iBAAiB,CAAC,IAAI;YAChD,eAAe,EAAE,aAAa;AAChC,YAAA,IAAI,CAAC,iBAAiB,KAAK,iBAAiB,CAAC,MAAM,EACnD;AACA,YAAA,IAAI,CAAC,yBAAyB,CAC5B,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,WAAW,EAC5D;gBACE,IAAI,EAAE,eAAe,EAAE,SAAS;AAChC,gBAAA,KAAK,EAAE,IAAI,CAAC,eAAe,EAAE,KAAK,EAAE,WAAW;AAC/C,gBAAA,WAAW,EAAE,aAAa;AAC1B,gBAAA,KAAK,EACH,IAAI,CAAC,uBAAuB,EAAE,SAAS;AACvC,oBAAA,eAAe,EAAE,SAAS;gBAC5B,SAAS,EAAE,IAAI,CAAC,eAAe,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW;gBAC9D,iBAAiB,EACf,IAAI,CAAC,eAAe,EAAE,KAAK,EAAE,iBAAiB,EAAE,WAAW;AAC7D,gBAAA,UAAU,EAAE,IAAI;AAChB,gBAAA,aAAa,EAAE,KAAK;AACpB,gBAAA,QAAQ,EAAE,IAAI;AACf,aAAA,CACF,CAAC;AAEF,YAAA,IAAI,IAAI,CAAC,iBAAiB,KAAK,iBAAiB,CAAC,IAAI,EAAE;AACrD,gBAAA,IAAI,CAAC,yBAAyB,CAC5B,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,WAAW,EAC5D;oBACE,IAAI,EAAE,eAAe,EAAE,YAAY;AACnC,oBAAA,WAAW,EAAE,mBAAmB;oBAChC,SAAS,EACP,IAAI,CAAC,eAAe,EAAE,KAAK,EAAE,SAAS,EAAE,iBAAiB;oBAC3D,iBAAiB,EACf,IAAI,CAAC,eAAe,EAAE,KAAK,EAAE,iBAAiB,EAAE,iBAAiB;oBACnE,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;AACzC,oBAAA,QAAQ,EAAE,IAAI,CAAC,0BAA0B,CAAC,MAAM,KAAK,CAAC;AACvD,iBAAA,CACF,CAAC;gBACF,IAAI,IAAI,CAAC,oBAAoB,EAAE;AAC7B,oBAAA,IAAI,CAAC,yBAAyB,CAC5B,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,WAAW,EAC5D;wBACE,IAAI,EAAE,eAAe,EAAE,MAAM;wBAC7B,KAAK,EAAE,IAAI,CAAC,eAAe,EAAE,KAAK,EAAE,cAAc,GAAG,GAAG;AACxD,wBAAA,WAAW,EAAE,gBAAgB;wBAC7B,KAAK,EAAE,IAAI,CAAC,0BAA0B,EAAE,MAAM,CAC5C,CAAC,MAAM,KAAK,MAAM,EAAE,EAAE,KAAK,IAAI,CAAC,iBAAiB,EAAE,OAAO,CAC3D,CAAC,CAAC,CAAC;wBACJ,oBAAoB,EAClB,IAAI,CAAC,eAAe,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ;AAChD,wBAAA,UAAU,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;wBACjC,eAAe,EAAE,IAAI,CAAC,0BAA0B;AAChD,wBAAA,WAAW,EAAE,EAAE;AACf,wBAAA,cAAc,EAAE,IAAI,CAAC,eAAe,EAAE,WAAW,EAAE,cAAc;wBACjE,SAAS,EAAE,IAAI,CAAC,eAAe,EAAE,KAAK,EAAE,SAAS,EAAE,cAAc;wBACjE,iBAAiB,EACf,IAAI,CAAC,eAAe,EAAE,KAAK,EAAE,iBAAiB,EAAE,cAAc;AACjE,qBAAA,CACF,CAAC;AACH,iBAAA;AACF,aAAA;AACF,SAAA;KACF;AAED;;;;;;AAMG;IACH,yBAAyB,CACvB,aAAqB,EACrB,WAAwB,EAAA;AAExB,QAAA,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAC5C,aAAa,EACb,CAAC,EACD,WAAW,CACZ,CAAC;KACH;AAED;;;;;AAKG;AACH,IAAA,YAAY,CAAC,IAAiB,EAAA;AAC5B,QAAA,IAAI,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,CAAC;;;QAG5B,IAAI,IAAI,CAAC,mBAAmB,EAAE;YAC5B,IAAI,CAAC,gBAAgB,CACnB,IAAI,CAAC,eAAe,EAAE,gBAAgB,EAAE,qBAAqB;AAC3D,gBAAA,4FAA4F,EAC9F,SAAS,CAAC,KAAK,CAChB,CAAC;YACF,OAAO;AACR,SAAA;QACD,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,UAAU,CAAC,KAAK,EAAE;YACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC;;AAExC,YAAA,IAAI,CAAC,iBAAiB,KAAK,iBAAiB,CAAC,IAAI;AAC/C,kBAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;AAC1B,kBAAE,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;AAChC,SAAA;KACF;AACD;;;;;AAKG;;AAEH,IAAA,WAAW,CAAC,QAAa,EAAA;AACvB,QAAA,MAAM,kBAAkB,GAAuB;AAC7C,YAAA,OAAO,EAAE;gBACP,SAAS,EAAE,QAAQ,EAAE,SAAS;gBAC9B,cAAc,EAAE,QAAQ,EAAE,SAAS;AACnC,gBAAA,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE;gBAClC,SAAS,EAAE,QAAQ,EAAE,UAAU;AAC/B,gBAAA,aAAa,EAAE,IAAI,CAAC,iBAAiB,EAAE,OAAO,IAAI,IAAI;AACvD,aAAA;SACF,CAAC;AACF,QAAA,IAAI,CAAC,aAAa;aACf,WAAW,CAAC,kBAAkB,CAAC;AAC/B,aAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC9B,aAAA,SAAS,CAAC;AACT,YAAA,IAAI,EAAE,CAAC,GAAG,KAAI;gBACZ,IAAI,GAAG,EAAE,MAAM,EAAE;AACf,oBAAA,IAAI,CAAC,kBAAkB,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;AACpC,iBAAA;aACF;AACD,YAAA,KAAK,EAAE,CAAC,KAAK,KAAI;AACf,gBAAA,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;aAC1B;AACF,SAAA,CAAC,CAAC;KACN;AAED;;;;;AAKG;;AAEH,IAAA,SAAS,CAAC,QAAa,EAAA;QACrB,IAAI,CAAC,aAAa,EAAE,0BAA0B,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;AAC1E,QAAA,MAAM,gBAAgB,GAAqB;AACzC,YAAA,OAAO,EAAE;gBACP,SAAS,EAAE,QAAQ,EAAE,SAAS;gBAC9B,cAAc,EAAE,QAAQ,EAAE,SAAS;gBACnC,SAAS,EAAE,QAAQ,EAAE,UAAU;gBAC/B,aAAa,EAAE,IAAI,CAAC,oBAAoB;AACtC,sBAAE,QAAQ,EAAE,cAAc,EAAE,EAAE;AAC9B,sBAAE,IAAI,CAAC,iBAAiB,EAAE,aAAa,IAAI,IAAI;AACjD,gBAAA,OAAO,EAAE,IAAI,CAAC,iBAAiB,EAAE,OAAiB;AACnD,aAAA;SACF,CAAC;AACF,QAAA,IAAI,CAAC,aAAa;aACf,SAAS,CAAC,gBAAgB,CAAC;AAC3B,aAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC9B,aAAA,SAAS,CAAC;AACT,YAAA,IAAI,EAAE,CAAC,GAAG,KAAI;gBACZ,IAAI,GAAG,EAAE,MAAM,EAAE;;AAEf,oBAAA,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,CAAC;AACnC,iBAAA;aACF;AACD,YAAA,KAAK,EAAE,CAAC,KAAK,KAAI;AACf,gBAAA,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;aAC1B;AACF,SAAA,CAAC,CAAC;KACN;AAED;;;;;;;AAOG;;AAEK,IAAA,uBAAuB,CAAC,YAAiB,EAAA;AAC/C,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,iBAAiB,EAAE,OAAO,CAAC;;AAEpD,QAAA,IAAI,CAAC,IAAI,CAAC,0BAA0B,IAAI,CAAC,WAAW,EAAE;AACpD,YAAA,IAAI,CAAC,kBAAkB,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;YAC5C,OAAO;AACR,SAAA;;AAGD,QAAA,MAAM,oBAAoB,GAAG,IAAI,CAAC,wBAAwB;aACvD,MAAM,CAAC,CAAC,KAAK,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC;aAClC,GAAG,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,OAAO,CAAC,CAAC;;QAGjC,MAAM,KAAK,GAAU,EAAE,CAAC;QACxB,IAAI,IAAI,CAAC,iBAAiB,IAAI,oBAAoB,CAAC,MAAM,GAAG,CAAC,EAAE;YAC7D,KAAK,CAAC,IAAI,CACR,IAAI,CAAC,aAAa,CAAC,oBAAoB,CAAC;gBACtC,WAAW;AACX,gBAAA,eAAe,EAAE,oBAAoB;AACtC,aAAA,CAAC,CACH,CAAC;AACH,SAAA;;QAED,IAAI,CAAC,0BAA0B,CAAC,OAAO,CAAC,CAAC,QAAQ,KAAI;AACnD,YAAA,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,sBAAsB,CAAC,QAAQ,CAAC,CAAC,CAAC;AAClE,SAAC,CAAC,CAAC;;AAGH,QAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;AACtB,YAAA,IAAI,CAAC,kBAAkB,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;YAC5C,OAAO;AACR,SAAA;QAED,QAAQ,CAAC,KAAK,CAAC;AACZ,aAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC9B,aAAA,SAAS,CAAC;YACT,IAAI,EAAE,MAAK;AACT,gBAAA,IAAI,CAAC,kBAAkB,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;aAC7C;AACD,YAAA,KAAK,EAAE,CAAC,KAAK,KAAI;;;AAGf,gBAAA,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;AACvC,gBAAA,IAAI,CAAC,kBAAkB,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;aAC7C;AACF,SAAA,CAAC,CAAC;KACN;AAED;;;;;AAKG;AACH,IAAA,YAAY,CAAC,KAAwB,EAAA;QACnC,MAAM,UAAU,GAAa,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,CAAC;AAC5D,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE;YAC7B,MAAM,YAAY,GAChB,IAAI,CAAC,aAAa,EAAE,iBAAiB,CAAC,UAAU,CAAC,CAAC;YACpD,IAAI,CAAC,gBAAgB,CAAC,YAAY,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC;AACtD,SAAA;AAAM,aAAA,IAAI,KAAK,IAAI,KAAK,YAAY,iBAAiB,EAAE;AACtD,YAAA,IAAI,CAAC,yBAAyB,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC;AACpD,SAAA;KACF;AAED;;;;AAIG;AACH,IAAA,qBAAqB,CAAC,IAAiB,EAAA;AACrC,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;KACrB;AAED;;;;;;AAMG;IACH,gBAAgB,CAAC,OAA0B,EAAE,SAAoB,EAAA;AAC/D,QAAA,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC;AAC7B,YAAA,MAAM,EAAE,QAAQ;AAChB,YAAA,OAAO,EAAE,OAAO;AAChB,YAAA,SAAS,EAAE,SAAS;AACpB,YAAA,aAAa,EAAE,IAAI;AACpB,SAAA,CAAC,CAAC;KACJ;AAED;;;;AAIG;IACH,oBAAoB,GAAA;AAClB,QAAA,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC;KACzB;AAED;;;;;AAKG;AACH,IAAA,IAAI,cAAc,GAAA;QAChB,MAAM,WAAW,GACf,IAAI,CAAC,iBAAiB,KAAK,iBAAiB,CAAC,IAAI;AAC/C,cAAE,IAAI,CAAC,iBAAiB,EAAE,SAAS;AACnC,cAAE,IAAI,CAAC,yBAAyB,CAAC;AACrC,QAAA,IAAI,CAAC,WAAW;AAAE,YAAA,OAAO,KAAK,CAAC;AAC/B,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE,sBAAsB,CAC3D,IAAI,CAAC,aAAa,EAAE,mBAAmB,EAAE,CAC1C,CAAC;QACF,OAAO,UAAU,GAAG,WAAW,CAAC,EAAE,IAAI,KAAK,uBAAuB,CAAC;KACpE;AAED;;;;;;AAMG;AACH,IAAA,IAAI,0BAA0B,GAAA;AAC5B,QAAA,QACE,IAAI,CAAC,iBAAiB,KAAK,iBAAiB,CAAC,IAAI,IAAI,IAAI,CAAC,cAAc,EACxE;KACH;AAED;;;;;;AAMG;AACH,IAAA,IAAI,mBAAmB,GAAA;QACrB,QACE,IAAI,CAAC,0BAA0B;AAC/B,YAAA,IAAI,CAAC,iBAAiB;AACtB,YAAA,IAAI,CAAC,wBAAwB,CAAC,MAAM,KAAK,CAAC,EAC1C;KACH;;AAGD,IAAA,IAAI,qBAAqB,GAAA;AACvB,QAAA,OAAO,IAAI,CAAC,iBAAiB,KAAK,iBAAiB,CAAC,IAAI;AACtD,cAAE,IAAI,CAAC,iBAAiB,EAAE,OAAO;cAC/B,SAAS,CAAC;KACf;;AAGD,IAAA,IAAI,6BAA6B,GAAA;AAC/B,QAAA,OAAO,IAAI,CAAC,uBAAuB,EAAE,SAAS,CAAC;KAChD;;AAGD,IAAA,yBAAyB,CAAC,OAAgB,EAAA;AACxC,QAAA,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC;KAClC;;AAGD,IAAA,2BAA2B,CAAC,MAA8B,EAAA;AACxD,QAAA,IAAI,CAAC,wBAAwB,GAAG,MAAM,CAAC;KACxC;;AAGD,IAAA,kCAAkC,CAAC,SAAmB,EAAA;AACpD,QAAA,IAAI,CAAC,0BAA0B,GAAG,SAAS,CAAC;KAC7C;AAED;;;;;AAKG;AACH,IAAA,eAAe,CAAC,OAAe,EAAA;AAC7B,QAAA,IAAI,CAAC,mBAAmB,GAAG,EAAE,CAAC;AAC9B,QAAA,IAAI,CAAC,aAAa;aACf,sBAAsB,CAAC,OAAO,CAAC;AAC/B,aAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC9B,aAAA,SAAS,CAAC;AACT,YAAA,IAAI,EAAE,CAAC,QAAQ,KAAI;AACjB,gBAAA,QAAQ,EAAE,OAAO,CAAC,CAAC,MAAM,KAAI;AAC3B,oBAAA,IAAI,CAAC,0BAA0B,EAAE,IAAI,CAAC;wBACpC,EAAE,EAAE,MAAM,EAAE,OAAO;wBACnB,IAAI,EAAE,MAAM,EAAE,SAAS,GAAG,IAAI,GAAG,MAAM,EAAE,YAAY,GAAG,GAAG;AAC5D,qBAAA,CAAC,CAAC;AACL,iBAAC,CAAC,CAAC;AACH,gBAAA,IAAI,CAAC,mBAAmB,GAAG,QAAQ,CAAC;AACpC,gBAAA,IAAI,IAAI,CAAC,0BAA0B,CAAC,MAAM,GAAG,CAAC,EAAE;oBAC9C,IAAI,CAAC,wBAAwB,CAC3B,mBAAmB,EACnB,YAAY,EACZ,KAAK,CACN,CAAC;oBACF,IAAI,CAAC,wBAAwB,CAC3B,gBAAgB,EAChB,iBAAiB,EACjB,IAAI,CAAC,0BAA0B,CAChC,CAAC;AACH,iBAAA;aACF;;AAED,YAAA,KAAK,EAAE,CAAC,KAAU,KAAI;AACpB,gBAAA,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;AACzB,gBAAA,IAAI,CAAC,wBAAwB,CAC3B,mBAAmB,EACnB,YAAY,EACZ,IAAI,CAAC,0BAA0B,CAAC,MAAM,KAAK,CAAC,CAC7C,CAAC;aACH;AACF,SAAA,CAAC,CAAC;KACN;AAED;;;;;;AAMG;IACH,wBAAwB,CACtB,eAAuB,EACvB,wBAAgC;;IAEhC,KAAU,EAAA;QAEV,MAAM,UAAU,GAAG,IAAI,CAAC,oBAAoB,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;AACpE,QAAA,UAAU,EAAE,OAAO,CAAC,CAAC,SAAS,KAAI;YAChC,IACE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW;gBACjD,eAAe;AACjB,gBAAA,SAAS,EAAE,SAAS,EAAE,QAAQ,GAAG,wBAAwB,CAAC;gBAE1D,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,wBAAwB,CAAC,GAAG,KAAK,CAAC;AACnE,SAAC,CAAC,CAAC;KACJ;AAED;;;;;AAKG;AACH,IAAA,uBAAuB,CAAC,MAAyB,EAAA;QAC/C,IAAI,CAAC,iBAAiB,CAAC,OAAO,GAAG,MAAM,EAAE,OAAO,CAAC;AACjD,QAAA,IAAI,CAAC,oBAAoB,GAAG,MAAM,EAAE,OAAO,CAAC;QAC5C,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;KACxC;AAED;;;;;AAKG;AACH,IAAA,uBAAuB,CAAC,IAAiB,EAAA;QACvC,IAAI,IAAI,CAAC,oBAAoB,EAAE;AAC7B,YAAA,MAAM,mBAAmB,GAAG,IAAI,CAAC,mBAAmB,EAAE,MAAM,CAC1D,CAAC,MAAwB,KACvB,MAAM,EAAE,OAAO;AACf,gBAAA,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,CAC7D,CAAC,CAAC,CAAC,CAAC;AACL,YAAA,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,aAAa,CAAC,EAAE,QAAQ,CAAC,mBAAmB,EAAE,SAAS,CAAC,CAAC;AACzE,SAAA;;;AAGD,QAAA,IAAI,IAAI,CAAC,iBAAiB,KAAK,iBAAiB,CAAC,IAAI,EAAE;AACrD,YAAA,IAAI,CAAC,yBAAyB;gBAC5B,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,EAAE;oBACzC,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,WAAW,CAAC,EAAE,KAAK,CAAC;AACzC,SAAA;KACF;AAED;;;AAGG;IACH,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzB,QAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;KAC7B;+GA1tBU,oBAAoB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAF,aAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,IAAA,CAAA,yBAAA,EAAA,EAAA,EAAA,KAAA,EAAAA,IAAA,CAAA,aAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;AAApB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,oBAAoB,EAFpB,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,OAAA,EAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,YAAA,EAAA,EAAA,SAAA,EAAA,CAAC,aAAa,CAAC,gFA4Cf,oBAAoB,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC7GjC,+0CA2BsB,EAAA,MAAA,EAAA,CAAA,y4XAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED8BlB,YAAY,EACZ,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,oBAAoB,EACpB,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,iBAAA,EAAA,wBAAA,EAAA,sBAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,mBAAA,EAAA,kCAAA,EAAA,6BAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,EAAA,YAAA,EAAA,WAAA,EAAA,uBAAA,EAAA,iBAAA,EAAA,qBAAA,EAAA,gBAAA,EAAA,uBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,mBAAA,EAAA,wBAAA,EAAA,kCAAA,EAAA,4BAAA,EAAA,sBAAA,EAAA,uBAAA,EAAA,cAAA,EAAA,kBAAA,EAAA,sBAAA,EAAA,uBAAA,EAAA,gBAAA,EAAA,sBAAA,EAAA,uBAAA,EAAA,yBAAA,EAAA,gBAAA,EAAA,mCAAA,EAAA,6CAAA,EAAA,wCAAA,EAAA,iCAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,eAAe,+BACf,gCAAgC,EAAA,QAAA,EAAA,kCAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,SAAA,EAAA,qBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,EAAA,iBAAA,EAAA,wBAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA,EAAA;;4FAOvB,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAfhC,SAAS;+BAEE,qBAAqB,EAAA,UAAA,EACnB,IAAI,EACP,OAAA,EAAA;wBACP,YAAY;wBACZ,oBAAoB;wBACpB,eAAe;wBACf,gCAAgC;AACjC,qBAAA,EAAA,aAAA,EAGc,iBAAiB,CAAC,IAAI,EAC1B,SAAA,EAAA,CAAC,aAAa,CAAC,EAAA,QAAA,EAAA,+0CAAA,EAAA,MAAA,EAAA,CAAA,y4XAAA,CAAA,EAAA,CAAA;yKAQhB,kBAAkB,EAAA,CAAA;sBAA3B,MAAM;gBAKG,UAAU,EAAA,CAAA;sBAAnB,MAAM;gBA+B0B,oBAAoB,EAAA,CAAA;sBAApD,SAAS;uBAAC,oBAAoB,CAAA;;;AE7GjC;IACY,YAQX;AARD,CAAA,UAAY,WAAW,EAAA;AACrB,IAAA,WAAA,CAAA,WAAA,CAAA,aAAA,CAAA,GAAA,CAAA,CAAA,GAAA,aAAe,CAAA;AACf,IAAA,WAAA,CAAA,WAAA,CAAA,kBAAA,CAAA,GAAA,CAAA,CAAA,GAAA,kBAAoB,CAAA;AACpB,IAAA,WAAA,CAAA,WAAA,CAAA,YAAA,CAAA,GAAA,CAAA,CAAA,GAAA,YAAc,CAAA;AACd,IAAA,WAAA,CAAA,WAAA,CAAA,cAAA,CAAA,GAAA,CAAA,CAAA,GAAA,cAAgB,CAAA;AAChB,IAAA,WAAA,CAAA,WAAA,CAAA,mBAAA,CAAA,GAAA,CAAA,CAAA,GAAA,mBAAqB,CAAA;AACrB,IAAA,WAAA,CAAA,WAAA,CAAA,qBAAA,CAAA,GAAA,CAAA,CAAA,GAAA,qBAAuB,CAAA;AACvB,IAAA,WAAA,CAAA,WAAA,CAAA,sBAAA,CAAA,GAAA,CAAA,CAAA,GAAA,sBAAwB,CAAA;AAC1B,CAAC,EARW,WAAW,KAAX,WAAW,GAQtB,EAAA,CAAA,CAAA;;ACgCD;;;;AAIG;MACU,SAAS,CAAA;AACpB,IAAA,WAAA;;IAES,IAAe;;AAEf,IAAA,KAAA,GAAQ,CAAC;;AAET,IAAA,UAAA,GAAa,KAAK;;IAElB,SAAY,GAAA,KAAK;;QANjB,IAAI,CAAA,IAAA,GAAJ,IAAI,CAAW;QAEf,IAAK,CAAA,KAAA,GAAL,KAAK,CAAI;QAET,IAAU,CAAA,UAAA,GAAV,UAAU,CAAQ;QAElB,IAAS,CAAA,SAAA,GAAT,SAAS,CAAQ;KACtB;AACL,CAAA;AAED;;;;AAIG;MAEU,MAAM,CAAA;AAIjB;;;;AAIG;IACH,kBAAkB,GAAA;QAChB,OAAO,IAAI,CAAC,WAAW,CAAC;KACzB;AACD;;;;AAIG;AACH,IAAA,kBAAkB,CAAC,KAAkB,EAAA;AACnC,QAAA,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;KAC1B;AACD;;;;;AAKG;AACH,IAAA,WAAW,CAAC,IAAiB,EAAA;AAC3B,QAAA,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC3B,OAAO,IAAI,CAAC,cAAc,EAAE,GAAG,CAC7B,CAAC,IAAI,KAAK,IAAI,SAAS,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAC1D,CAAC;KACH;AACD;;;;;AAKG;AACH,IAAA,YAAY,CAAC,IAAe,EAAA;QAC1B,QACE,CAAC,CAAC,CAAC,IAAI,EAAE,QAAQ,IAAI,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,CAAC,KAAK,IAAI,EAAE,WAAW,EACrE;KACH;+GA1CU,MAAM,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;AAAN,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAM,cADO,MAAM,EAAA,CAAA,CAAA,EAAA;;4FACnB,MAAM,EAAA,UAAA,EAAA,CAAA;kBADlB,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE,CAAA;;AA6ClC;;;;;AAKG;MACU,gBAAgB,CAAA;AAG3B;;;;AAIG;AACH,IAAA,IAAI,IAAI,GAAA;AACN,QAAA,OAAO,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC;KAC/B;AACD;;;AAGG;IACH,IAAI,IAAI,CAAC,KAAkB,EAAA;AACzB,QAAA,IAAI,CAAC,WAAW,CAAC,SAAS,GAAG,KAAK,CAAC;AACnC,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;KAC7B;AAED,IAAA,WAAA;;IAEU,WAAuC;;AAEvC,IAAA,QAAgB;;QAFhB,IAAW,CAAA,WAAA,GAAX,WAAW,CAA4B;QAEvC,IAAQ,CAAA,QAAA,GAAR,QAAQ,CAAQ;AAvB1B,QAAA,IAAA,CAAA,QAAQ,GAAqB,IAAI,OAAO,EAAW,CAAC;AACpD,QAAA,IAAA,CAAA,UAAU,GAAG,IAAI,eAAe,CAAc,EAAE,CAAC,CAAC;KAuB9C;AAEJ;;;;;AAKG;AACH,IAAA,OAAO,CAAC,gBAAkC,EAAA;AACxC,QAAA,IAAI,CAAC,WAAW,EAAE,cAAc,EAAE,OAAO;AACtC,aAAA,IAAI,CAACE,WAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC9B,aAAA,SAAS,CAAC,CAAC,MAAM,KAAI;YACpB,IACG,MAAqC,CAAC,KAAK;gBAC3C,MAAqC,CAAC,OAAO,EAC9C;AACA,gBAAA,IAAI,CAAC,iBAAiB,CAAC,MAAoC,CAAC,CAAC;AAC9D,aAAA;AACH,SAAC,CAAC,CAAC;QACL,OAAO,KAAK,CAAC,gBAAgB,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAC9DC,KAAG,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,CACrB,CAAC;KACH;AACD;;;;AAIG;;AAEH,IAAA,UAAU,CAAC,gBAAkC,EAAA;AAC3C,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzB,QAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;KAC7B;AAED;;;;AAIG;AACH,IAAA,iBAAiB,CAAC,MAAkC,EAAA;QAClD,IAAI,MAAM,EAAE,KAAK,EAAE;AACjB,YAAA,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;AAC9D,SAAA;QACD,IAAI,MAAM,EAAE,OAAO,EAAE;AACnB,YAAA,MAAM,CAAC,OAAO;AACX,iBAAA,KAAK,EAAE;AACP,iBAAA,OAAO,EAAE;AACT,iBAAA,OAAO,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;AACpD,SAAA;KACF;AAED;;;;;;AAMG;IACH,UAAU,CAAC,WAAsB,EAAE,MAAe,EAAA;QAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,kBAAkB,EAAE,CAAC;QACrD,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;AAC9C,QAAA,IAAI,CAAC,QAAQ,IAAI,KAAK,GAAG,CAAC,EAAE;;YAE1B,OAAO;AACR,SAAA;AAED,QAAA,IAAI,MAAM,EAAE;YACV,WAAW,CAAC,IAAI,CAAC,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC;AAChD,YAAA,MAAM,KAAK,GAAG,QAAQ,EAAE,GAAG,CACzB,CAAC,IAAI,KACH,IAAI,SAAS,CACX,IAAI,EACJ,WAAW,EAAE,KAAK,GAAG,CAAC,EACtB,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,IAAI,CAAC,CAClC,CACJ,CAAC;AACF,YAAA,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,KAAK,CAAC,CAAC;AAC3C,SAAA;AAAM,aAAA;YACL,IAAI,KAAK,GAAG,CAAC,CAAC;AACd,YAAA,KACE,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,EACjB,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,GAAG,WAAW,EAAE,KAAK,EACjE,CAAC,EAAE,EAAE,KAAK,EAAE;cACZ,GAAE;YACJ,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;AACrC,SAAA;;QAGD,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;KAClC;AACF,CAAA;AACD;;;;;AAKG;MAkBU,iBAAiB,CAAA;IAsB5B,IACI,gBAAgB,CAAC,KAAkB,EAAA;AACrC,QAAA,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;AAC1B,QAAA,IAAI,KAAK;YAAE,IAAI,CAAC,kBAAkB,EAAE,CAAC;KACtC;AACD,IAAA,IAAI,gBAAgB,GAAA;QAClB,OAAO,IAAI,CAAC,YAAY,CAAC;KAC1B;IAED,IACI,eAAe,CAAC,KAAkB,EAAA;AACpC,QAAA,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QACzB,IAAI,CAAC,eAAe,EAAE,CAAC;KACxB;AACD,IAAA,IAAI,eAAe,GAAA;QACjB,OAAO,IAAI,CAAC,WAAW,CAAC;KACzB;IAED,IACI,2BAA2B,CAAC,KAAc,EAAA;AAC5C,QAAA,IAAI,CAAC,qBAAqB,GAAG,KAAK,CAAC;KACpC;AACD,IAAA,IAAI,2BAA2B,GAAA;QAC7B,OAAO,IAAI,CAAC,qBAAqB,CAAC;KACnC;IAED,IACI,kBAAkB,CAAC,EAAsB,EAAA;AAC3C,QAAA,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;AACzB,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;KAC3C;AACD,IAAA,IAAI,kBAAkB,GAAA;QACpB,OAAO,IAAI,CAAC,cAAc,CAAC;KAC5B;;AAaD,IAAA,WAAA;;IAES,QAAgB;;IAEhB,UAAsB;;IAEtB,aAA4B;;IAE3B,yBAAoD,EAAA;QANrD,IAAQ,CAAA,QAAA,GAAR,QAAQ,CAAQ;QAEhB,IAAU,CAAA,UAAA,GAAV,UAAU,CAAY;QAEtB,IAAa,CAAA,aAAA,GAAb,aAAa,CAAe;QAE3B,IAAyB,CAAA,yBAAA,GAAzB,yBAAyB,CAA2B;;QA1E9D,IAAS,CAAA,SAAA,GAAQC,WAAS,CAAC;QAC3B,IAAO,CAAA,OAAA,GAAW,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,OAAO,CAAC;QACtD,IAAiB,CAAA,iBAAA,GAAW,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,iBAAiB,CAAC;AAK1E,QAAA,IAAA,CAAA,QAAQ,GAAqB,IAAI,OAAO,EAAW,CAAC;AAEpD,QAAA,IAAA,CAAA,oBAAoB,GAAe,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AACnD,QAAA,IAAA,CAAA,qBAAqB,GAAe,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAEpD,IAAc,CAAA,cAAA,GAAG,cAAc,CAAC;AAEhC,QAAA,IAAA,CAAA,SAAS,GAAW,IAAI,CAAC,OAAO,EAAE,MAAM,CACtC,CAAC,CAAC,KACA,CAAC,CAAC,EAAE,KAAK,WAAW,EAAE,iBAAiB;AACvC,YAAA,CAAC,CAAC,EAAE,KAAK,WAAW,EAAE,mBAAmB,CAC5C,CAAC;QAmBM,IAAqB,CAAA,qBAAA,GAAG,KAAK,CAAC;AAoB5B,QAAA,IAAA,CAAA,gBAAgB,GAAG,IAAI,YAAY,EAAa,CAAC;AACjD,QAAA,IAAA,CAAA,gBAAgB,GAAG,IAAI,YAAY,EAAa,CAAC;AACjD,QAAA,IAAA,CAAA,cAAc,GAAG,IAAI,YAAY,EAA0B,CAAC;AAC5D,QAAA,IAAA,CAAA,gBAAgB,GAAG,IAAI,YAAY,EAAa,CAAC;AACjD,QAAA,IAAA,CAAA,eAAe,GAAG,IAAI,YAAY,EAAa,CAAC;AAChD,QAAA,IAAA,CAAA,uBAAuB,GAAG,IAAI,YAAY,EAAa,CAAC;QAClE,IAAY,CAAA,YAAA,GAAG,KAAK,CAAC;QACrB,IAAiB,CAAA,iBAAA,GAAG,iBAAiB,CAAC;AAuCtC;;;;AAIG;QACH,IAAQ,CAAA,QAAA,GAAG,CAAC,IAAe,KAAK,IAAI,EAAE,KAAK,CAAC;AAE5C;;;;AAIG;QACH,IAAY,CAAA,YAAA,GAAG,CAAC,IAAe,KAAK,IAAI,EAAE,UAAU,CAAC;AAErD;;;;;;AAMG;QACH,IAAc,CAAA,cAAA,GAAG,CAAC,KAAa,EAAE,SAAoB,KACnD,SAAS,CAAC,UAAU,CAAC;AAjDrB,QAAA,IAAI,CAAC,yBAAyB;AAC3B,aAAA,aAAa,EAAE;AACf,aAAA,IAAI,CAACF,WAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC9B,aAAA,SAAS,CAAC,CAAC,MAA4B,KAAI;AAC1C,YAAA,IAAI,CAAC,YAAY,GAAG,MAAM,EAAE,OAAO,CAAC;AACtC,SAAC,CAAC,CAAC;KACN;AACD;;;AAGG;IACH,QAAQ,GAAA;QACN,IAAI,CAAC,kBAAkB,EAAE,CAAC;KAC3B;AACD;;;AAGG;IACH,eAAe,GAAA;QACb,IAAI,CAAC,UAAU,EAAE,UAAU;cACvB,IAAI,CAACA,WAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;aAC/B,SAAS,CAAC,MAAK;AACd,YAAA,MAAM,aAAa,GACjB,IAAI,CAAC,UAAU,EAAE,aAAa,EAAE,gBAAgB,CAAC,iBAAiB,CAAC,CAAC;AACtE,YAAA,aAAa,EAAE,OAAO,CAAC,CAAC,IAAiB,MAAM,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC;AACrE,SAAC,CAAC,CAAC;KACN;AAwBD;;;;AAIG;AACH,IAAA,eAAe,CAAC,IAAe,EAAA;AAC7B,QAAA,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE;YAC5B,OAAO;AACR,SAAA;QACD,IAAI,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,IAAI,CAAC,EAAE;AACtC,YAAA,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;AAChC,SAAA;AAAM,aAAA;YACL,IAAI,CAAC,aAAa,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;YAClE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AACvC,YAAA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;AAC3B,SAAA;KACF;AACD;;;;AAIG;;IAEH,YAAY,GAAA;QACV,OAAO;AACL,YAAA,SAAS,EAAE,+BAA+B;SAC3C,CAAC;KACH;AACD;;;AAGG;IACH,kBAAkB,GAAA;QAChB,IACE,IAAI,CAAC,UAAU;YACf,IAAI,CAAC,aAAa,CAAC,oBAAoB,EAAE,KAAK,iBAAiB,CAAC,MAAM,EACtE;YACA,IAAI,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC,eAAe,KAAI;gBACjD,IACE,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,SAAS,CAC9B,CAAC,IAAI,KAAK,IAAI,EAAE,IAAI,EAAE,OAAO,KAAK,eAAe,EAAE,OAAO,CAC3D,KAAK,CAAC,CAAC,EACR;AACA,oBAAA,MAAM,YAAY,GAAG,IAAI,SAAS,CAChC,eAAe,EACf,CAAC,EACD,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,eAAe,CAAC,CAC5C,CAAC;AACF,oBAAA,MAAM,mBAAmB,GAAG,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC;AAClD,oBAAA,mBAAmB,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;AACxC,oBAAA,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,mBAAmB,CAAC;oBAC3C,IAAI,CAAC,8BAA8B,EAAE,CAAC;AACvC,iBAAA;AACH,aAAC,CAAC,CAAC;AACJ,SAAA;aAAM,IACL,IAAI,CAAC,aAAa,CAAC,oBAAoB,EAAE,KAAK,iBAAiB,CAAC,IAAI,EACpE;AACA,YAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YACtC,IAAI,CAAC,8BAA8B,EAAE,CAAC;AACvC,SAAA;AAAM,aAAA;AACL,YAAA,IAAI,CAAC,WAAW,GAAG,IAAI,eAAe,CACpC,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,YAAY,CAClB,CAAC;AACF,YAAA,IAAI,CAAC,UAAU,GAAG,IAAI,gBAAgB,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;AACxE,YAAA,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;AAC1E,SAAA;KACF;AACD;;;;AAIG;AACH,IAAA,SAAS,CAAC,UAAuB,EAAA;AAC/B,QAAA,MAAM,kBAAkB,GAAG,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC;QACjD,MAAM,UAAU,GAAG,UAAU,EAAE,IAAI,CACjC,CAAC,IAAI,KACH,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC,2BAA2B,EAAE,SAAS,EAAE,OAAO,CACzE,CAAC;AACF,QAAA,kBAAkB,EAAE,OAAO,CAAC,CAAC,IAAI,KAAI;AACnC,YAAA,IACE,IAAI,EAAE,IAAI,EAAE,OAAO;AACnB,gBAAA,IAAI,CAAC,2BAA2B,EAAE,SAAS,EAAE,OAAO,EACpD;AACA,gBAAA,MAAM,qBAAqB,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC;AACrD,gBAAA,IAAI,CAAC,IAAI,GAAG,UAAuB,CAAC;AACpC,gBAAA,IAAI,CAAC,IAAI,CAAC,YAAY,GAAG,qBAAqB,CAAC;AAC/C,gBAAA,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AACzD,gBAAA,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE;AAC9D,oBAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAC/B,iBAAA;AACF,aAAA;AACH,SAAC,CAAC,CAAC;AACH,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,kBAAkB,CAAC;KAC3C;AACD;;;AAGG;IACH,eAAe,GAAA;QACb,IAAI,CAAC,QAAQ,EAAE,kBAAkB,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;AACxD,QAAA,MAAM,mBAAmB,GAAG,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC;QAClD,IACE,IAAI,CAAC,aAAa,CAAC,oBAAoB,EAAE,KAAK,iBAAiB,CAAC,MAAM,EACtE;YACA,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,EAAE,WAAW,EAAE;gBAC1C,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;AAC3C,gBAAA,MAAM,eAAe,GAAG,IAAI,SAAS,CACnC,IAAI,CAAC,aAAa,CAAC,IAAI,EACvB,IAAI,CAAC,aAAa,CAAC,KAAK,EACxB,IAAI,CACL,CAAC;AACF,gBAAA,mBAAmB,CAAC,MAAM,CACxB,mBAAmB,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,EAC/C,CAAC,EACD,eAAe,CAChB,CAAC;AACF,gBAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;AAC1C,aAAA;YACD,IAAI,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE;gBACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,kBAAkB,EAAE,CAAC;AACpD,gBAAA,QAAQ,EAAE,OAAO,CAAC,CAAC,SAAS,KAAI;oBAC9B,IACE,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,SAAS,CAC9B,CAAC,IAAI,KAAK,IAAI,EAAE,IAAI,EAAE,OAAO,KAAK,SAAS,EAAE,OAAO,CACrD,KAAK,CAAC,CAAC,EACR;wBACA,MAAM,YAAY,GAAG,IAAI,SAAS,CAChC,SAAS,EACT,IAAI,CAAC,aAAa,EAAE,KAAK,GAAG,CAAC,EAC7B,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,SAAS,CAAC,CACvC,CAAC;AACF,wBAAA,MAAM,mBAAmB,GAAG,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC;AAClD,wBAAA,mBAAmB,CAAC,OAAO,CAAC,CAAC,IAAI,KAAI;AACnC,4BAAA,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE;gCACzD,IAAI,CAAC,IAAI,CAAC,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC;AAC1C,6BAAA;AACH,yBAAC,CAAC,CAAC;AACH,wBAAA,mBAAmB,CAAC,MAAM,CACxB,mBAAmB,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EACnD,CAAC,EACD,YAAY,CACb,CAAC;AACF,wBAAA,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,mBAAmB,CAAC;AAC5C,qBAAA;AACH,iBAAC,CAAC,CAAC;AACJ,aAAA;AACD,YAAA,MAAM,kBAAkB,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CACvD,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,OAAO,CACjE,CAAC;YACF,IAAI,CAAC,6BAA6B,CAChC,kBAAkB,GAAG,CAAC,EACtB,IAAI,CAAC,YAAY,CAAC,kBAAkB,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAC5D,CAAC;AACH,SAAA;aAAM,IACL,IAAI,CAAC,aAAa,CAAC,oBAAoB,EAAE,KAAK,iBAAiB,CAAC,IAAI,EACpE;AACA,YAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;AACrC,YAAA,MAAM,wBAAwB,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAC7D,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,aAAa,CACvE,CAAC;YACF,IAAI,CAAC,6BAA6B,CAChC,wBAAwB,GAAG,CAAC,EAC5B,IAAI,CAAC,YAAY,CAAC,wBAAwB,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAClE,CAAC;AACH,SAAA;aAAM,IACL,IAAI,CAAC,aAAa,CAAC,oBAAoB,EAAE,KAAK,iBAAiB,CAAC,MAAM,EACtE;YACA,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;AAC9C,SAAA;KACF;AACD;;;;AAIG;AACH,IAAA,eAAe,CAAC,cAAkC,EAAA;AAChD,QAAA,IAAI,IAAI,CAAC,WAAW,IAAI,cAAc,EAAE;YACtC,MAAM,iBAAiB,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CACtD,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,OAAO,KAAK,cAAc,CAC/C,CAAC;AACF,YAAA,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,iBAAiB,CAAC,CAAC;AAChE,YAAA,MAAM,mBAAmB,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;AACjD,YAAA,IAAI,iBAAiB,KAAK,CAAC,CAAC,EAAE;AAC5B,gBAAA,IAAI,YAAY,EAAE,IAAI,CAAC,aAAa,KAAK,IAAI,EAAE;oBAC7C,MAAM,uBAAuB,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAC5D,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,OAAO,KAAK,YAAY,EAAE,IAAI,CAAC,aAAa,CACjE,CAAC;AACF,oBAAA,IAAI,uBAAuB,KAAK,CAAC,CAAC,EAAE;AAClC,wBAAA,MAAM,kBAAkB,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAChD,uBAAuB,CACxB,CAAC;AACF,wBAAA,IAAI,kBAAkB,IAAI,kBAAkB,CAAC,IAAI,CAAC,YAAY,EAAE;4BAC9D,kBAAkB,CAAC,IAAI,CAAC,YAAY;AAClC,gCAAA,kBAAkB,CAAC,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;AAC3C,4BAAA,IAAI,kBAAkB,CAAC,IAAI,CAAC,YAAY,KAAK,CAAC,EAAE;AAC9C,gCAAA,kBAAkB,CAAC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;AAC5C,gCAAA,MAAM,OAAO,GAAG,IAAI,SAAS,CAC3B,kBAAkB,CAAC,IAAI,EACvB,kBAAkB,CAAC,KAAK,EACxB,KAAK,CACN,CAAC;gCACF,mBAAmB,CAAC,MAAM,CAAC,iBAAiB,GAAG,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;AAC/D,6BAAA;AAAM,iCAAA;AACL,gCAAA,mBAAmB,CAAC,MAAM,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC;AAClD,6BAAA;AACF,yBAAA;AACF,qBAAA;AAAM,yBAAA;AACL,wBAAA,mBAAmB,CAAC,MAAM,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC;AAClD,qBAAA;AACF,iBAAA;AAAM,qBAAA;AACL,oBAAA,mBAAmB,CAAC,MAAM,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC;AAClD,iBAAA;AACF,aAAA;AACD,YAAA,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,mBAAmB,CAAC;AAC3C,YAAA,IAAI,CAAC,cAAc,GAAG,SAAS,CAAC;AACjC,SAAA;KACF;AACD;;;;;;AAMG;IACH,YAAY,CAAC,kBAA0B,EAAE,UAAuB,EAAA;QAC9D,MAAM,oBAAoB,GACxB,UAAU,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC;QACnD,IAAI,KAAK,GAAG,CAAC,CAAC;AACd,QAAA,KAAK,KAAK,GAAG,kBAAkB,GAAG,CAAC,EAAE,KAAK,GAAG,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;AACvE,YAAA,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,oBAAoB,CAAC,EAAE;gBACvE,IAAI,UAAU,CAAC,kBAAkB,CAAC,CAAC,KAAK,KAAK,CAAC,EAAE;AAC9C,oBAAA,IACE,UAAU,CAAC,kBAAkB,CAAC,CAAC,KAAK,KAAK,UAAU,CAAC,KAAK,CAAC,CAAC,KAAK,EAChE;wBACA,MAAM;AACP,qBAAA;AACF,iBAAA;AACF,aAAA;;gBAAM,MAAM;AACd,SAAA;AACD,QAAA,OAAO,KAAK,CAAC;KACd;AACD;;;;;AAKG;IACH,6BAA6B,CAAC,UAAkB,EAAE,QAAgB,EAAA;AAChE,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;AACxC,QAAA,UAAU,CAAC,MAAM,CACf,UAAU,EACV,QAAQ,GAAG,UAAU,EACrB,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,CACxE,CAAC;AACF,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,UAAU,CAAC;KACnC;AACD;;;AAGG;IACH,8BAA8B,GAAA;AAC5B,QAAA,IAAI,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QACtC,KACE,IAAI,MAAM,GAAG,CAAC,EACd,MAAM,GAAG,UAAU,CAAC,MAAM,EAC1B,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,UAAU,CAAC,EAC9C;YACA,IAAI,WAAW,GAAG,MAAM,CAAC;AACzB,YAAA,KACE,IAAI,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,UAAU,CAAC,EAClD,MAAM,GAAG,UAAU,CAAC,MAAM,EAC1B,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,UAAU,CAAC,EAC9C;gBACA,WAAW;oBACT,IAAI,CAAC,aAAa,CAAC;wBACjB,UAAU,CAAC,MAAM,CAAC;wBAClB,UAAU,CAAC,WAAW,CAAC;AACxB,qBAAA,CAAC,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,MAAM,CAAC;AAC1B,0BAAE,MAAM;0BACN,WAAW,CAAC;AACnB,aAAA;YACD,IAAI,WAAW,KAAK,MAAM,EAAE;AAC1B,gBAAA,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,CAChC,MAAM,EACN,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,UAAU,CAAC,CACtC,CAAC;AACF,gBAAA,MAAM,UAAU,GAAG,UAAU,CAAC,KAAK,CACjC,WAAW,EACX,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,UAAU,CAAC,CAC3C,CAAC;gBACF,MAAM,mBAAmB,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;AACxD,gBAAA,mBAAmB,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,CAAC;gBACxC,mBAAmB,CAAC,IAAI,CACtB,GAAG,UAAU,CAAC,KAAK,CACjB,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,UAAU,CAAC,EACrC,WAAW,CACZ,CACF,CAAC;AACF,gBAAA,mBAAmB,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,CAAC;gBACvC,mBAAmB,CAAC,IAAI,CACtB,GAAG,UAAU,CAAC,KAAK,CACjB,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,UAAU,CAAC,EAC1C,UAAU,CAAC,MAAM,CAClB,CACF,CAAC;gBACF,UAAU,GAAG,mBAAmB,CAAC;AAClC,aAAA;AACF,SAAA;AACD,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,UAAU,CAAC;KACnC;AACD;;;;;AAKG;AACH,IAAA,aAAa,CAAC,MAAmB,EAAA;QAC/B,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,MAAiB,EAAE,MAAiB,KAAI;YAC1D,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC;YAC3D,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC;YAC3D,IAAI,WAAW,GAAG,WAAW;gBAAE,OAAO,CAAC,CAAC,CAAC;iBACpC,IAAI,WAAW,GAAG,WAAW;AAAE,gBAAA,OAAO,CAAC,CAAC;iBACxC,IAAI,WAAW,KAAK,WAAW,EAAE;gBACpC,IAAI,KAAK,GAAG,CAAC,CAAC;gBACd,OAAO,KAAK,GAAG,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE;AACjD,oBAAA,IAAI,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;AACnE,wBAAA,OAAO,CAAC,CAAC;AACN,yBAAA,IACH,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;wBAEjE,OAAO,CAAC,CAAC,CAAC;AACZ,oBAAA,KAAK,EAAE,CAAC;AACT,iBAAA;AACF,aAAA;AACD,YAAA,OAAO,CAAC,CAAC;AACX,SAAC,CAAC,CAAC;KACJ;AACD;;;;AAIG;AACH,IAAA,mBAAmB,CAAC,IAAuB,EAAA;AACzC,QAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;KACjC;AACD;;;;;AAKG;AACH,IAAA,mBAAmB,CAAC,KAAgB,EAAA;AAClC,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC,qBAAqB,CAAC;QAC3E,OAAO,IAAI,CAAC,oBAAoB,CAAC;KAClC;AACD;;;;;;AAMG;AACH,IAAA,kBAAkB,CAAC,KAAgB,EAAA;QACjC,IAAI,IAAI,CAAC,mBAAmB,EAAE,EAAE,KAAK,WAAW,CAAC,WAAW,EAAE;YAC5D,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AACxC,SAAA;aAAM,IAAI,IAAI,CAAC,mBAAmB,EAAE,EAAE,KAAK,WAAW,CAAC,gBAAgB,EAAE;AACxE,YAAA,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;YAC3B,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AACzC,SAAA;aAAM,IAAI,IAAI,CAAC,mBAAmB,EAAE,EAAE,KAAK,WAAW,CAAC,UAAU,EAAE;AAClE,YAAA,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;YAC3B,MAAM,mBAAmB,GAAG,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,MAAM;;YAEvD,CAAC,IAAS,KAAK,IAAI,EAAE,IAAI,EAAE,OAAO,KAAK,KAAK,EAAE,IAAI,EAAE,aAAa,CAClE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC;YACX,IAAI,CAAC,2BAA2B,GAAG;gBACjC,SAAS,EAAE,KAAK,EAAE,IAAI;AACtB,gBAAA,eAAe,EAAE,mBAAmB;aACrC,CAAC;YACF,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;AAC5D,SAAA;aAAM,IAAI,IAAI,CAAC,mBAAmB,EAAE,EAAE,KAAK,WAAW,CAAC,YAAY,EAAE;YACpE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AACzC,SAAA;aAAM,IACL,IAAI,CAAC,mBAAmB,EAAE,EAAE,KAAK,WAAW,CAAC,oBAAoB,EACjE;AACA,YAAA,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;YAC3B,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AAChD,SAAA;KACF;AACD;;;;;;;;;;AAUG;AACH,IAAA,uBAAuB,CAAC,KAAgB,EAAA;QACtC,MAAM,YAAY,GAAW,EAAE,CAAC;QAChC,MAAM,gBAAgB,GAAG,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,YAAY,EAAE,OAAO,CAAC;AAC3E,QAAA,MAAM,gBAAgB,GAAG,KAAK,EAAE,IAAI,EAAE,WAAW,CAAC;QAClD,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,KAAI;AAC5B,YAAA,CAAC,CAAC,eAAe,GAAG,KAAK,CAAC;AAC1B,YAAA,IACE,CAAC,CAAC,EAAE,EAAE,KAAK,WAAW,CAAC,WAAW;AAChC,iBAAC,CAAC,gBAAgB;AAChB,oBAAA,IAAI,CAAC,aAAa,CAAC,cAAc,CAC/B,IAAI,CAAC,cAAc,CAAC,mBAAmB,EACvC,gBAAgB,CACjB;AACD,qBAAC,CAAC,gBAAgB;AAChB,yBAAC,IAAI,CAAC,aAAa,CAAC,cAAc,CAChC,IAAI,CAAC,cAAc,CAAC,mBAAmB,EACvC,gBAAgB,CACjB;AACC,4BAAA,IAAI,CAAC,aAAa,CAAC,cAAc,CAC/B,IAAI,CAAC,cAAc,CAAC,qBAAqB,EACzC,gBAAgB,CACjB;AACD,4BAAA,IAAI,CAAC,aAAa,CAAC,cAAc,CAC/B,IAAI,CAAC,cAAc,CAAC,kBAAkB,EACtC,gBAAgB,CACjB;4BACD,IAAI,CAAC,aAAa,CAAC,cAAc,CAC/B,IAAI,CAAC,cAAc,CAAC,gBAAgB,CACrC;AACD,4BAAA,IAAI,CAAC,aAAa,CAAC,cAAc,CAC/B,IAAI,CAAC,cAAc,CAAC,oBAAoB,EACxC,gBAAgB,CACjB,CAAC,CAAC,CAAC;AACZ,iBAAC,CAAC,EAAE,EAAE,KAAK,WAAW,CAAC,UAAU;AAC/B,oBAAA,CAAC,IAAI,CAAC,aAAa,CAAC,4BAA4B,EAAE;AAClD,oBAAA,CAAC,gBAAgB;AACjB,qBAAC,IAAI,CAAC,aAAa,CAAC,cAAc,CAChC,IAAI,CAAC,cAAc,CAAC,UAAU,EAC9B,gBAAgB,CACjB;AACC,wBAAA,IAAI,CAAC,aAAa,CAAC,cAAc,CAC/B,IAAI,CAAC,cAAc,CAAC,iBAAiB,CACtC,CAAC,CAAC;AACP,iBAAC,CAAC,EAAE,EAAE,KAAK,WAAW,CAAC,YAAY;AACjC,oBAAA,CAAC,IAAI,CAAC,aAAa,CAAC,4BAA4B,EAAE;AAClD,oBAAA,CAAC,gBAAgB;AACjB,qBAAC,IAAI,CAAC,aAAa,CAAC,cAAc,CAChC,IAAI,CAAC,cAAc,CAAC,YAAY,EAChC,gBAAgB,CACjB;wBACC,IAAI,CAAC,aAAa,CAAC,cAAc,CAC/B,IAAI,CAAC,cAAc,CAAC,iBAAiB,CACtC,CAAC;AACJ,oBAAA,CAAC,KAAK,EAAE,IAAI,EAAE,WAAW,CAAC;AAC5B,iBAAC,CAAC,EAAE,EAAE,KAAK,WAAW,CAAC,gBAAgB;AACrC,oBAAA,CAAC,IAAI,CAAC,aAAa,CAAC,4BAA4B,EAAE;AAClD,oBAAA,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa;AACvD,qBAAC,IAAI,CAAC,aAAa,CAAC,cAAc,CAChC,IAAI,CAAC,cAAc,CAAC,eAAe,EACnC,gBAAgB,CACjB;wBACC,IAAI,CAAC,aAAa,CAAC,cAAc,CAC/B,IAAI,CAAC,cAAc,CAAC,iBAAiB,CACtC,CAAC;AACJ,oBAAA,CAAC,gBAAgB,CAAC;;;AAGpB,iBAAC,CAAC,EAAE,EAAE,KAAK,WAAW,CAAC,oBAAoB;AACzC,oBAAA,IAAI,CAAC,aAAa,CAAC,4BAA4B,EAAE;AACjD,oBAAA,CAAC,gBAAgB;AACjB,oBAAA,IAAI,CAAC,aAAa,CAAC,cAAc,CAC/B,IAAI,CAAC,cAAc,CAAC,8BAA8B,EAClD,gBAAgB,IAAI,EAAE,CACvB,CAAC,EACJ;AACA,gBAAA,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACtB,aAAA;AACH,SAAC,CAAC,CAAC;;QAEH,YAAY,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,KAAK,KAAI;AACjC,YAAA,IAAI,KAAK,EAAE,EAAE,KAAK,WAAW,CAAC,oBAAoB;gBAAE,OAAO,CAAC,CAAC,CAAC;AAC9D,YAAA,IAAI,KAAK,EAAE,EAAE,KAAK,WAAW,CAAC,oBAAoB;AAAE,gBAAA,OAAO,CAAC,CAAC;AAC7D,YAAA,OAAO,CAAC,CAAC;AACX,SAAC,CAAC,CAAC;AACH,QAAA,OAAO,YAAY,CAAC;KACrB;AACD;;;;;;AAMG;IACH,SAAS,CAAC,KAAa,EAAE,UAAsB,EAAA;QAC7C,OAAO,UAAU,CAAC,EAAE,CAAC;KACtB;AACD;;;AAGG;IACH,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzB,QAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;KAC7B;+GAvnBU,iBAAiB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,MAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAAH,aAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,yBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;AAAjB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,iBAAiB,0iBC9P9B,6pJAiIA,EAAA,MAAA,EAAA,CAAA,mzVAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDgHI,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,aAAa,EACb,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAM,IAAA,CAAA,cAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,WAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,aAAa,EACb,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,eAAe,+BACf,aAAa,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,oBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,yBAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACb,mBAAmB,EACnB,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,eAAA,EAAA,cAAA,CAAA,EAAA,OAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,gBAAgB,+HAChB,sBAAsB,EAAA,QAAA,EAAA,mCAAA,EAAA,MAAA,EAAA,CAAA,8BAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA,EAAA;;4FAMb,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAjB7B,SAAS;+BACE,aAAa,EAAA,UAAA,EACX,IAAI,EACP,OAAA,EAAA;wBACP,YAAY;wBACZ,aAAa;wBACb,aAAa;wBACb,eAAe;wBACf,aAAa;wBACb,mBAAmB;wBACnB,gBAAgB;wBAChB,sBAAsB;qBACvB,EAGc,aAAA,EAAA,iBAAiB,CAAC,IAAI,EAAA,QAAA,EAAA,6pJAAA,EAAA,MAAA,EAAA,CAAA,mzVAAA,CAAA,EAAA,CAAA;oLAyBjC,gBAAgB,EAAA,CAAA;sBADnB,KAAK;gBAUF,eAAe,EAAA,CAAA;sBADlB,KAAK;gBAUF,2BAA2B,EAAA,CAAA;sBAD9B,KAAK;gBASF,kBAAkB,EAAA,CAAA;sBADrB,KAAK;gBASN,oBAAoB,EAAA,CAAA;sBADnB,KAAK;gBAGI,gBAAgB,EAAA,CAAA;sBAAzB,MAAM;gBACG,gBAAgB,EAAA,CAAA;sBAAzB,MAAM;gBACG,cAAc,EAAA,CAAA;sBAAvB,MAAM;gBACG,gBAAgB,EAAA,CAAA;sBAAzB,MAAM;gBACG,eAAe,EAAA,CAAA;sBAAxB,MAAM;gBACG,uBAAuB,EAAA,CAAA;sBAAhC,MAAM;;;AElST;;;;;;;;;;;;;;;;;;;AAmBG;MAeU,uBAAuB,CAAA;AAdpC,IAAA,WAAA,GAAA;;QAgBW,IAAK,CAAA,KAAA,GAAG,EAAE,CAAC;;QAGX,IAAW,CAAA,WAAA,GAAG,EAAE,CAAC;;QAGjB,IAAc,CAAA,cAAA,GAAG,EAAE,CAAC;;QAGpB,IAAS,CAAA,SAAA,GAAG,EAAE,CAAC;QAehB,IAAQ,CAAA,QAAA,GAAmB,EAAE,CAAC;QAS9B,IAAgB,CAAA,gBAAA,GAAmB,EAAE,CAAC;;QAGrC,IAAQ,CAAA,QAAA,GAAG,IAAI,CAAC;AAEzB;;;AAGG;QACM,IAAa,CAAA,aAAA,GAAG,iDAAiD,CAAC;QAClE,IAAe,CAAA,eAAA,GACtB,kDAAkD,CAAC;;AAG3C,QAAA,IAAA,CAAA,MAAM,GAAG,IAAI,YAAY,EAAU,CAAC;;AAGpC,QAAA,IAAA,CAAA,eAAe,GAAG,IAAI,YAAY,EAAkB,CAAC;;AAGrD,QAAA,IAAA,CAAA,SAAS,GAAG,IAAI,YAAY,EAAQ,CAAC;AAE/C;;;;;;;AAOG;AACO,QAAA,IAAA,CAAA,eAAe,GAAG,IAAI,YAAY,EAAW,CAAC;;QAGhD,IAAkB,CAAA,kBAAA,GAAG,KAAK,CAAC;;QAKnC,IAAS,CAAA,SAAA,GAAQ,WAAW,CAAC;AAC7B,QAAA,IAAA,CAAA,kBAAkB,GAAG,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC;;QAGnD,IAAc,CAAA,cAAA,GAAG,KAAK,CAAC;;QAGvB,IAAU,CAAA,UAAA,GAAG,EAAE,CAAC;;QAGhB,IAAY,CAAA,YAAA,GAAG,EAAE,CAAC;;QAGlB,IAAS,CAAA,SAAA,GAAG,KAAK,CAAC;AAElB;;;;AAIG;QACH,IAAiB,CAAA,iBAAA,GAAG,CAAC,CAAC,CAAC;;QAGd,IAAc,CAAA,cAAA,GAAG,oBAAoB,CAAC;AAEvC,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,OAAO,EAAW,CAAC;QAGzB,IAAU,CAAA,UAAA,GAAG,GAAG,CAAC;QACjB,IAAe,CAAA,eAAA,GAAG,CAAC,CAAC;AAE7B,QAAA,IAAA,CAAA,aAAa,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AAsXxC,KAAA;;IAhdC,IAAa,OAAO,CAAC,KAAqB,EAAA;AACxC,QAAA,IAAI,CAAC,QAAQ,GAAG,KAAK,IAAI,EAAE,CAAC;;AAE5B,QAAA,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC,CAAC;;;AAG5B,QAAA,IAAI,CAAC,cAAc;AACjB,YAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;KACjE;AACD,IAAA,IAAI,OAAO,GAAA;QACT,OAAO,IAAI,CAAC,QAAQ,CAAC;KACtB;;IAID,IAAa,eAAe,CAAC,KAAqB,EAAA;AAChD,QAAA,IAAI,CAAC,gBAAgB,GAAG,KAAK,IAAI,EAAE,CAAC;KACrC;AACD,IAAA,IAAI,eAAe,GAAA;QACjB,OAAO,IAAI,CAAC,gBAAgB,CAAC;KAC9B;IAwED,QAAQ,GAAA;;QAEN,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC;KAC3C;AAED;;;;;AAKG;AACH,IAAA,OAAO,CAAC,KAAY,EAAA;AAClB,QAAA,MAAM,KAAK,GAAI,KAAK,CAAC,MAA2B,CAAC,KAAK,CAAC;AACvD,QAAA,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;AACxB,QAAA,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;;;;QAIvB,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;AACtC,QAAA,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;AAC7B,QAAA,IAAI,CAAC,cAAc,EAAE,WAAW,EAAE,CAAC;AACnC,QAAA,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,eAAe,EAAE;AACzC,YAAA,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;AAClB,YAAA,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;YAC5B,OAAO;AACR,SAAA;AACD,QAAA,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,MAAK;AAC1D,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC5B,SAAC,CAAC,CAAC;KACJ;AAED;;;;;AAKG;AACK,IAAA,gBAAgB,CAAC,SAAkB,EAAA;AACzC,QAAA,IAAI,IAAI,CAAC,kBAAkB,KAAK,SAAS,EAAE;AACzC,YAAA,IAAI,CAAC,kBAAkB,GAAG,SAAS,CAAC;AACpC,YAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AACtC,SAAA;KACF;AAED;;;;;;AAMG;IACH,OAAO,GAAA;AACL,QAAA,IACE,IAAI,CAAC,OAAO,EAAE,MAAM;YACpB,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,MAAM,IAAI,IAAI,CAAC,eAAe,EACrD;AACA,YAAA,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;AAC5B,SAAA;KACF;AAED;;;;AAIG;IACH,WAAW,GAAA;QACT,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC;KAC9C;AAED;;;;AAIG;AACH,IAAA,SAAS,CAAC,KAAoB,EAAA;;;;QAI5B,IAAI,KAAK,CAAC,OAAO,KAAK,UAAU,IAAI,KAAK,CAAC,OAAO,KAAK,QAAQ,EAAE;AAC9D,YAAA,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE;gBACzB,OAAO;AACR,aAAA;YACD,KAAK,CAAC,cAAc,EAAE,CAAC;AACvB,YAAA,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;AAC3B,YAAA,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,OAAO,KAAK,UAAU,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAC7D,OAAO;AACR,SAAA;;AAGD,QAAA,IAAI,KAAK,CAAC,OAAO,KAAK,MAAM,EAAE;YAC5B,IAAI,IAAI,CAAC,cAAc,EAAE;gBACvB,KAAK,CAAC,cAAc,EAAE,CAAC;AACvB,gBAAA,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;AAC5B,gBAAA,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC,CAAC;AAC7B,aAAA;YACD,OAAO;AACR,SAAA;QAED,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE;YAC/C,OAAO;AACR,SAAA;QACD,KAAK,CAAC,cAAc,EAAE,CAAC;;;;QAIvB,IACE,IAAI,CAAC,cAAc;YACnB,IAAI,CAAC,iBAAiB,IAAI,CAAC;YAC3B,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAC5C;AACA,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC;YACxD,OAAO;AACR,SAAA;QACD,IAAI,CAAC,aAAa,EAAE,CAAC;KACtB;AAED;;;;AAIG;AACK,IAAA,gBAAgB,CAAC,KAAa,EAAA;AACpC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;QAClC,IAAI,CAAC,KAAK,EAAE;YACV,OAAO;AACR,SAAA;AACD,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;;QAE5C,IAAI,CAAC,iBAAiB,GAAG,CAAC,IAAI,GAAG,KAAK,IAAI,KAAK,CAAC;KACjD;AAED;;;;;AAKG;AACH,IAAA,cAAc,CAAC,KAAa,EAAA;AAC1B,QAAA,OAAO,KAAK,KAAK,IAAI,CAAC,iBAAiB,CAAC;KACzC;AAED;;;;AAIG;IACH,aAAa,GAAA;QACX,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;QACrC,IAAI,CAAC,KAAK,EAAE;YACV,OAAO;AACR,SAAA;QACD,MAAM,eAAe,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;AACrD,QAAA,IAAI,eAAe,EAAE;AACnB,YAAA,IAAI,CAAC,YAAY,GAAG,eAAe,CAAC;;;;AAIpC,YAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;YAC5B,OAAO;AACR,SAAA;;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CACvC,CAAC,MAAM,KAAK,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,KAAK,CAAC,WAAW,EAAE,CAC/D,CAAC;QACF,IAAI,CAAC,MAAM,EAAE;YACX,IAAI,CAAC,gBAAgB,GAAG;gBACtB,GAAG,IAAI,CAAC,gBAAgB;AACxB,gBAAA,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;aACxB,CAAC;YACF,IAAI,CAAC,aAAa,EAAE,CAAC;AACtB,SAAA;;QAED,IAAI,CAAC,eAAe,EAAE,CAAC;KACxB;AAED;;;;;;AAMG;AACH,IAAA,gBAAgB,CAAC,KAAa,EAAA;QAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,EAAE,OAAO,EAAE,KAAK,CAAC;AACzD,QAAA,IAAI,KAAK,CAAC,MAAM,GAAG,wBAAwB,CAAC,4BAA4B,EAAE;AACxE,YAAA,OAAO,QAAQ,EAAE,KAAK,EAAE,gCAAgC,IAAI,EAAE,CAAC;AAChE,SAAA;AACD,QAAA,IAAI,KAAK,CAAC,MAAM,GAAG,wBAAwB,CAAC,4BAA4B,EAAE;AACxE,YAAA,OAAO,QAAQ,EAAE,KAAK,EAAE,gCAAgC,IAAI,EAAE,CAAC;AAChE,SAAA;QACD,IAAI,CAAC,wBAAwB,CAAC,wBAAwB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;AAClE,YAAA,OAAO,QAAQ,EAAE,OAAO,EAAE,wBAAwB,IAAI,EAAE,CAAC;AAC1D,SAAA;AACD,QAAA,OAAO,EAAE,CAAC;KACX;AAED;;;;;AAKG;AACH,IAAA,YAAY,CAAC,MAAoB,EAAA;QAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,IAAI,KACjD,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAChC,CAAC;QACF,IAAI,KAAK,IAAI,CAAC,EAAE;YACd,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAClD,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,KAAK,CACtB,CAAC;AACH,SAAA;AAAM,aAAA;YACL,IAAI,CAAC,gBAAgB,GAAG,CAAC,GAAG,IAAI,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;AAC5D,SAAA;QACD,IAAI,CAAC,aAAa,EAAE,CAAC;;AAErB,QAAA,IAAI,CAAC,WAAW,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC;KAC1C;AAED;;;;;AAKG;AACH,IAAA,UAAU,CAAC,MAAoB,EAAA;QAC7B,OAAO,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,IAAI,KACrC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAChC,CAAC;KACH;AAED;;;;;;;;;;;;;;;;;;;;;;;AAuBG;IACK,YAAY,CAAC,CAAe,EAAE,CAAe,EAAA;AACnD,QAAA,MAAM,GAAG,GAAG,CAAC,EAAE,EAAE,CAAC;AAClB,QAAA,MAAM,GAAG,GAAG,CAAC,EAAE,EAAE,CAAC;AAClB,QAAA,MAAM,MAAM,GAAG,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI,IAAI,CAAG,EAAA,GAAG,CAAE,CAAA,KAAK,EAAE,CAAC;AACpE,QAAA,MAAM,MAAM,GAAG,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI,IAAI,CAAG,EAAA,GAAG,CAAE,CAAA,KAAK,EAAE,CAAC;QACpE,IAAI,MAAM,IAAI,MAAM,EAAE;AACpB,YAAA,OAAO,GAAG,GAAG,CAAA,CAAE,KAAK,CAAG,EAAA,GAAG,EAAE,CAAC;AAC9B,SAAA;AACD,QAAA,MAAM,KAAK,GAAG,CAAC,CAAC,EAAE,IAAI,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AACnD,QAAA,MAAM,KAAK,GAAG,CAAC,CAAC,EAAE,IAAI,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AACnD,QAAA,OAAO,KAAK,KAAK,EAAE,IAAI,KAAK,KAAK,KAAK,CAAC;KACxC;AAED;;;;AAIG;AACH,IAAA,YAAY,CAAC,MAAoB,EAAA;QAC/B,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAClD,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAC3C,CAAC;QACF,IAAI,CAAC,aAAa,EAAE,CAAC;KACtB;AAED;;;AAGG;IACH,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAC;AAC3B,QAAA,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;AAClB,QAAA,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;QAC5B,IAAI,CAAC,aAAa,EAAE,CAAC;KACtB;AAED;;;;;AAKG;IACH,MAAM,GAAA;AACJ,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;AACtB,QAAA,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE,CAAC;QAC9B,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,MAAK;;;AAGzC,YAAA,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC;AACtC,YAAA,IAAI,MAAM,KAAK,IAAI,CAAC,WAAW,EAAE,aAAa,EAAE;gBAC9C,OAAO;AACR,aAAA;YACD,IAAI,CAAC,eAAe,EAAE,CAAC;AACvB,YAAA,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;AAC5B,YAAA,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;AACxB,SAAC,CAAC,CAAC;KACJ;AAED;;;;AAIG;AACH,IAAA,IAAI,iBAAiB,GAAA;AACnB,QAAA,QACE,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,gBAAgB,CAAC,MAAM,KAAK,CAAC,EACrE;KACH;AAED;;;AAGG;IACK,eAAe,GAAA;;;AAGrB,QAAA,IAAI,CAAC,cAAc,EAAE,WAAW,EAAE,CAAC;AACnC,QAAA,IAAI,CAAC,cAAc,GAAG,SAAS,CAAC;AAChC,QAAA,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;AACrB,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE,aAAa,EAAE;YACnC,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,KAAK,GAAG,EAAE,CAAC;AAC3C,SAAA;AACD,QAAA,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;AAClB,QAAA,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;;AAEvB,QAAA,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;KAC9B;AAED;;;AAGG;IACK,aAAa,GAAA;AACnB,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CACvB,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,MAAM,MAAM;YACrC,EAAE,EAAE,MAAM,CAAC,EAAE;YACb,IAAI,EAAE,MAAM,CAAC,IAAI;SAClB,CAAC,CAAC,CACJ,CAAC;KACH;AAED;;;;;;AAMG;IACH,SAAS,CAAC,KAAa,EAAE,MAAoB,EAAA;QAC3C,OAAO,CAAA,EAAG,MAAM,CAAC,EAAE,IAAI,MAAM,CAAC,IAAI,CAAA,CAAE,CAAC;KACtC;IAED,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,cAAc,EAAE,WAAW,EAAE,CAAC;AACnC,QAAA,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE,CAAC;AAC9B,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzB,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;KAC1B;+GA7dU,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;mGAAvB,uBAAuB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,OAAA,EAAA,WAAA,EAAA,aAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,SAAA,EAAA,WAAA,EAAA,OAAA,EAAA,SAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,aAAA,EAAA,eAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,EAAA,OAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,WAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,aAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,aAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC9DpC,igKAgJA,EAAA,MAAA,EAAA,CAAA,0yYAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED5FI,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAT,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,iBAAiB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAI,IAAA,CAAA,WAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,OAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACjB,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAP,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA,EAAA;;4FAMP,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAdnC,SAAS;+BACE,yBAAyB,EAAA,UAAA,EACvB,IAAI,EACP,OAAA,EAAA;wBACP,YAAY;wBACZ,eAAe;wBACf,iBAAiB;wBACjB,aAAa;wBACb,gBAAgB;qBACjB,EAGc,aAAA,EAAA,iBAAiB,CAAC,IAAI,EAAA,QAAA,EAAA,igKAAA,EAAA,MAAA,EAAA,CAAA,0yYAAA,CAAA,EAAA,CAAA;8BAI5B,KAAK,EAAA,CAAA;sBAAb,KAAK;gBAGG,WAAW,EAAA,CAAA;sBAAnB,KAAK;gBAGG,cAAc,EAAA,CAAA;sBAAtB,KAAK;gBAGG,SAAS,EAAA,CAAA;sBAAjB,KAAK;gBAGO,OAAO,EAAA,CAAA;sBAAnB,KAAK;gBAeO,eAAe,EAAA,CAAA;sBAA3B,KAAK;gBASG,QAAQ,EAAA,CAAA;sBAAhB,KAAK;gBAMG,aAAa,EAAA,CAAA;sBAArB,KAAK;gBACG,eAAe,EAAA,CAAA;sBAAvB,KAAK;gBAII,MAAM,EAAA,CAAA;sBAAf,MAAM;gBAGG,eAAe,EAAA,CAAA;sBAAxB,MAAM;gBAGG,SAAS,EAAA,CAAA;sBAAlB,MAAM;gBAUG,eAAe,EAAA,CAAA;sBAAxB,MAAM;gBAKmB,WAAW,EAAA,CAAA;sBAApC,SAAS;uBAAC,aAAa,CAAA;;;AElF1B;;;;;AAKG;MASU,sBAAsB,CAAA;AA2BjC;;;;;AAKG;AACH,IAAA,IAAI,kBAAkB,GAAA;AACpB,QAAA,OAAO,IAAI,CAAC,eAAe,KAAK,eAAe,CAAC,UAAU,CAAC;KAC5D;AAUD,IAAA,WAAA;;IAEU,aAA4B;;IAE7B,yBAAoD;;AAEpD,IAAA,YAA2B;;QAJ1B,IAAa,CAAA,aAAA,GAAb,aAAa,CAAe;QAE7B,IAAyB,CAAA,yBAAA,GAAzB,yBAAyB,CAA2B;QAEpD,IAAY,CAAA,YAAA,GAAZ,YAAY,CAAe;AAlDpC,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,OAAO,EAAW,CAAC;;QAElC,IAAS,CAAA,SAAA,GAAQ,WAAW,CAAC;AAC7B,QAAA,IAAA,CAAA,kBAAkB,GAAG,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC;QACnD,IAAe,CAAA,eAAA,GAAG,IAAI,CAAC,kBAAkB,EAAE,KAAK,EAAE,eAAe,CAAC;QAClE,IAAgB,CAAA,gBAAA,GAAG,IAAI,CAAC,kBAAkB,EAAE,KAAK,EAAE,eAAe,CAAC;QACnE,IAAsB,CAAA,sBAAA,GAAG,KAAK,CAAC;QAC/B,IAAQ,CAAA,QAAA,GAAa,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;QAIhE,IAAmB,CAAA,mBAAA,GAAa,EAAE,CAAC;AAEnC,QAAA,IAAA,CAAA,iBAAiB,GAAG,SAAS,CAAC,IAAI,CAAC;QACnC,IAAe,CAAA,eAAA,GAAmB,EAAE,CAAC;QACrC,IAAW,CAAA,WAAA,GAAmB,EAAE,CAAC;QACjC,IAAa,CAAA,aAAA,GAAmB,EAAE,CAAC;QAEnC,IAAiB,CAAA,iBAAA,GAAG,KAAK,CAAC;QAE1B,IAAyB,CAAA,yBAAA,GAAmB,EAAE,CAAC;QAC/C,IAAmB,CAAA,mBAAA,GAAmB,EAAE,CAAC;QACzC,IAAc,CAAA,cAAA,GAAG,EAAE,CAAC;;QAEpB,IAAqB,CAAA,qBAAA,GAAa,EAAE,CAAC;AAYrC;;;AAGG;QACH,IAAqB,CAAA,qBAAA,GAAG,KAAK,CAAC;AAEpB,QAAA,IAAA,CAAA,kBAAkB,GAAG,IAAI,YAAY,EAAE,CAAC;AACxC,QAAA,IAAA,CAAA,UAAU,GAAG,IAAI,YAAY,EAAE,CAAC;KAQtC;AAEJ;;;;AAIG;IACH,QAAQ,GAAA;QACN,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,aAAa,EAAE,mBAAmB,EAAE,CAAC;QAClE,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,aAAa,EAAE,sBAAsB,EAAE,CAAC;QACxE,IAAI,CAAC,aAAa,CAAC,yBAAyB,CAAC,OAAO,CAClD,CAAC,IAA8B,KAAI;YACjC,IACE,IAAI,CAAC,gBAAgB,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM;AAC5C,gBAAA,IAAI,CAAC,aAAa,EAAE,MAAM,EAC1B;gBACA,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,MAAoB,KAAI;AAClD,oBAAA,IAAI,CAAC,yBAAyB,EAAE,IAAI,CAAC;wBACnC,EAAE,EAAE,MAAM,CAAC,KAAK;wBAChB,IAAI,EAAE,MAAM,CAAC,OAAO;AACrB,qBAAA,CAAC,CAAC;AACL,iBAAC,CAAC,CAAC;AACJ,aAAA;AACH,SAAC,CACF,CAAC;;QAEF,IAAI,CAAC,yBAAyB,EAAE,MAAM;AACpC,eAAG,IAAI,CAAC,sBAAsB,GAAG,KAAK;eACnC,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,CAAC;AACzC,QAAA,MAAM,qBAAqB,GAAG,IAAI,CAAC,gBAAgB,EAAE,IAAI;cACrD,KAAK,CAAC,GAAG,CAAC;aACX,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,aAAa,EAAE,qBAAqB,EAAE,CAAC;QAC7D,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,IAAI,KAAI;YAC/B,IAAI,qBAAqB,EAAE,QAAQ,CAAC,IAAI,EAAE,IAAc,CAAC,EAAE;AACzD,gBAAA,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;gBACpB,IAAI,CAAC,mBAAmB,EAAE,IAAI,CAAC,IAAI,EAAE,EAAY,CAAC,CAAC;AACpD,aAAA;AACH,SAAC,CAAC,CAAC;QACH,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,8BAA8B,EAAE,CAAC;QACtE,IAAI,CAAC,iBAAiB,GAAG,SAAS,EAAE,iBAAiB,IAAI,KAAK,CAAC;AAC/D,QAAA,IAAI,CAAC,eAAe,GAAG,SAAS,EAAE,UAA6B,CAAC;QAChE,IAAI,CAAC,IAAI,CAAC,eAAe;AACvB,YAAA,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC;AAC5B,gBAAA,MAAM,EAAE,QAAQ;AAChB,gBAAA,OAAO,EAAE,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM;gBACvC,SAAS,EAAE,SAAS,CAAC,KAAK;AAC1B,gBAAA,aAAa,EAAE,IAAI;AACpB,aAAA,CAAC,CAAC;AACA,aAAA;AACH,YAAA,IAAI,IAAI,CAAC,eAAe,KAAK,eAAe,EAAE,UAAU,EAAE;gBACxD,IAAI,IAAI,CAAC,iBAAiB;oBAAE,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBACtD,IAAI,CAAC,cAAc,EAAE,CAAC;AACvB,aAAA;;;YAGD,IAAI,CAAC,wBAAwB,EAAE,CAAC;AACjC,SAAA;KACF;AAED;;;AAGG;IACH,sBAAsB,GAAA;QACpB,IAAI,CAAC,qBAAqB,GAAG;AAC3B,YAAA,SAAS,EAAE;AACT,gBAAA;AACE,oBAAA,MAAM,EAAE,EAAE;AACV,oBAAA,QAAQ,EAAE;AACR,wBAAA;4BACE,IAAI,EAAE,eAAe,EAAE,SAAS;4BAChC,KAAK,EAAE,IAAI,CAAC,kBAAkB,EAAE,KAAK,EAAE,KAAK,GAAG,GAAG;AAClD,4BAAA,WAAW,EAAE,OAAO;AACpB,4BAAA,KAAK,EAAE,IAAI,CAAC,gBAAgB,EAAE,KAAK;4BACnC,SAAS,EAAE,IAAI,CAAC,kBAAkB,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK;4BAC3D,iBAAiB,EACf,IAAI,CAAC,kBAAkB,EAAE,KAAK,EAAE,iBAAiB,EAAE,KAAK;AAC1D,4BAAA,UAAU,EAAE,IAAI;AAChB,4BAAA,aAAa,EAAE,KAAK;AACpB,4BAAA,QAAQ,EAAE,IAAI;AACf,yBAAA;AACD,wBAAA;4BACE,IAAI,EAAE,eAAe,CAAC,SAAS;4BAC/B,KAAK,EAAE,IAAI,CAAC,kBAAkB,EAAE,KAAK,EAAE,QAAQ,GAAG,GAAG;AACrD,4BAAA,WAAW,EAAE,UAAU;AACvB,4BAAA,KAAK,EAAE,IAAI,CAAC,gBAAgB,EAAE,IAAI;4BAClC,SAAS,EAAE,IAAI,CAAC,kBAAkB,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ;4BAC9D,iBAAiB,EACf,IAAI,CAAC,kBAAkB,EAAE,KAAK,EAAE,iBAAiB,EAAE,QAAQ;AAC7D,4BAAA,UAAU,EAAE,IAAI;AAChB,4BAAA,aAAa,EAAE,KAAK;AACpB,4BAAA,QAAQ,EAAE,IAAI;AACf,yBAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wBA8BD,IAAI,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,OAAO,CAAC;AAC9C,8BAAE;AACE,gCAAA;oCACE,IAAI,EAAE,eAAe,CAAC,SAAS;oCAC/B,KAAK,EAAE,IAAI,CAAC,kBAAkB,EAAE,KAAK,EAAE,WAAW,GAAG,GAAG;AACxD,oCAAA,WAAW,EAAE,OAAO;AACpB,oCAAA,KAAK,EAAE,IAAI,CAAC,gBAAgB,EAAE,WAAW,IAAI,EAAE;AAC/C,oCAAA,UAAU,EAAE,IAAI;AAChB,oCAAA,QAAQ,EAAE,KAAK;AACf,oCAAA,aAAa,EAAE,KAAK;oCACpB,SAAS,EACP,IAAI,CAAC,kBAAkB,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW;AACxD,oCAAA,iBAAiB,EACf,IAAI,CAAC,kBAAkB,EAAE,KAAK,EAAE,iBAAiB;AAC/C,0CAAE,WAAW;AAClB,iCAAA;AACF,6BAAA;8BACD,EAAE,CAAC;wBACP,IAAI,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,SAAS,CAAC;AAChD,8BAAE;AACE,gCAAA;oCACE,IAAI,EAAE,eAAe,CAAC,SAAS;oCAC/B,KAAK,EAAE,IAAI,CAAC,kBAAkB,EAAE,KAAK,EAAE,OAAO,GAAG,GAAG;AACpD,oCAAA,WAAW,EAAE,SAAS;AACtB,oCAAA,KAAK,EAAE,IAAI,CAAC,gBAAgB,EAAE,OAAO,IAAI,EAAE;AAC3C,oCAAA,UAAU,EAAE,IAAI;AAChB,oCAAA,QAAQ,EAAE,KAAK;AACf,oCAAA,aAAa,EAAE,IAAI;oCACnB,SAAS,EAAE,IAAI,CAAC,kBAAkB,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO;AAC7D,oCAAA,iBAAiB,EACf,IAAI,CAAC,kBAAkB,EAAE,KAAK,EAAE,iBAAiB;AAC/C,0CAAE,OAAO;AACd,iCAAA;AACF,6BAAA;8BACD,EAAE,CAAC;AACP,wBAAA;4BACE,IAAI,EAAE,eAAe,CAAC,QAAQ;AAC9B,4BAAA,KAAK,EACH,IAAI,CAAC,eAAe,KAAK,eAAe,CAAC,UAAU;AACjD,kCAAE,IAAI,CAAC,kBAAkB,EAAE,KAAK,EAAE,IAAI;kCACpC,IAAI,CAAC,kBAAkB,EAAE,KAAK,EAAE,IAAI,GAAG,GAAG;AAChD,4BAAA,WAAW,EAAE,OAAO;4BACpB,eAAe,EAAE,IAAI,CAAC,SAAS;AAC/B,4BAAA,oBAAoB,EAAE,CAAC;4BACvB,SAAS,EAAE,IAAI,CAAC,kBAAkB,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI;4BAC1D,iBAAiB,EACf,IAAI,CAAC,kBAAkB,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI;AACzD,4BAAA,cAAc,EACZ,IAAI,CAAC,eAAe,KAAK,eAAe,CAAC,UAAU;AACjD,kCAAE,IAAI,CAAC,kBAAkB,EAAE,WAAW;AAClC,sCAAE,uBAAuB;AAC7B,kCAAE,IAAI,CAAC,kBAAkB,EAAE,WAAW,EAAE,IAAI;4BAChD,oBAAoB,EAClB,IAAI,CAAC,kBAAkB,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ;AACnD,4BAAA,UAAU,EACR,IAAI,CAAC,eAAe,KAAK,eAAe,CAAC,UAAU;AACjD,kCAAE,EAAE;AACJ,kCAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;AAC5B,yBAAA;AACF,qBAAA;AACF,iBAAA;AACF,aAAA;SACF,CAAC;AACF,QAAA,IAAI,IAAI,CAAC,eAAe,KAAK,eAAe,EAAE,UAAU,EAAE;YACxD,IAAI,CAAC,2BAA2B,EAAE,CAAC;AACpC,SAAA;KACF;AAED;;;AAGG;IACH,2BAA2B,GAAA;QACzB,IAAI,IAAI,CAAC,iBAAiB;AACxB,YAAA,IAAI,CAAC,8BAA8B,CACjC,IAAI,CAAC,qBAAqB,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,CAAC,EAC9D;gBACE,IAAI,EAAE,eAAe,CAAC,MAAM;gBAC5B,KAAK,EAAE,IAAI,CAAC,kBAAkB,EAAE,KAAK,EAAE,cAAc,GAAG,GAAG;AAC3D,gBAAA,WAAW,EAAE,gBAAgB;gBAC7B,eAAe,EAAE,IAAI,CAAC,eAAe;gBACrC,KAAK,EAAE,IAAI,CAAC,eAAe,EAAE,MAAM,CACjC,CAAC,MAAM,KAAK,MAAM,EAAE,IAAI,KAAK,IAAI,CAAC,gBAAgB,EAAE,cAAc,CACnE,CAAC,CAAC,CAAC;AACJ,gBAAA,UAAU,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;AACjC,gBAAA,WAAW,EAAE,EAAE;AACf,gBAAA,cAAc,EAAE,IAAI,CAAC,kBAAkB,EAAE,WAAW,EAAE,cAAc;gBACpE,oBAAoB,EAClB,IAAI,CAAC,kBAAkB,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ;gBACnD,SAAS,EAAE,IAAI,CAAC,kBAAkB,EAAE,KAAK,EAAE,SAAS,EAAE,cAAc;gBACpE,iBAAiB,EACf,IAAI,CAAC,kBAAkB,EAAE,KAAK,EAAE,iBAAiB,EAAE,cAAc;AACpE,aAAA,CACF,CAAC;AACJ,QAAA,IAAI,CAAC,8BAA8B,CACjC,IAAI,CAAC,qBAAqB,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,CAAC,EAC9D;YACE,IAAI,EAAE,eAAe,CAAC,MAAM;YAC5B,KAAK,EAAE,IAAI,CAAC,kBAAkB,EAAE,KAAK,EAAE,UAAU,GAAG,GAAG;AACvD,YAAA,WAAW,EAAE,YAAY;YACzB,eAAe,EAAE,IAAI,CAAC,WAAW;YACjC,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,MAAM,CAC7B,CAAC,MAAM,KAAK,MAAM,EAAE,IAAI,KAAK,IAAI,CAAC,gBAAgB,EAAE,YAAY,CACjE,CAAC,CAAC,CAAC;AACJ,YAAA,UAAU,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;AACjC,YAAA,WAAW,EAAE,EAAE;AACf,YAAA,cAAc,EAAE,IAAI,CAAC,kBAAkB,EAAE,WAAW,EAAE,UAAU;YAChE,oBAAoB,EAAE,IAAI,CAAC,kBAAkB,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ;YACvE,SAAS,EAAE,IAAI,CAAC,kBAAkB,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU;YAChE,iBAAiB,EACf,IAAI,CAAC,kBAAkB,EAAE,KAAK,EAAE,iBAAiB,EAAE,UAAU;AAChE,SAAA,CACF,CAAC;;;;;;;KAOH;AAED;;;;AAIG;AACH,IAAA,wBAAwB,CAAC,WAAiC,EAAA;AACxD,QAAA,IAAI,CAAC,yBAAyB,GAAG,WAAW,CAAC;;;AAG7C,QAAA,IAAI,CAAC,wBAAwB;cACzB,GAAG,CAAC,iBAAiB,CAAC;AACxB,cAAE,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,WAAW,GAAG,EAAE,CAAC,CAAC;;QAErD,IAAI,CAAC,yBAAyB,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,qBAAqB;AAClE,eAAG,IAAI,CAAC,sBAAsB,GAAG,KAAK;eACnC,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,CAAC;KAC1C;AAED;;;;;AAKG;AACH,IAAA,oBAAoB,CAAC,SAAkB,EAAA;AACrC,QAAA,IAAI,CAAC,qBAAqB,GAAG,SAAS,CAAC;AACvC,QAAA,IAAI,SAAS,EAAE;AACb,YAAA,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC;AACpC,SAAA;AAAM,aAAA;;YAEL,IAAI,CAAC,sBAAsB,GAAG,CAAC,IAAI,CAAC,yBAAyB,CAAC,MAAM,CAAC;AACtE,SAAA;KACF;AACD;;;;;AAKG;IACH,8BAA8B,CAC5B,aAAqB,EACrB,WAAwB,EAAA;AAExB,QAAA,IAAI,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CACrD,aAAa,EACb,CAAC,EACD,WAAW,CACZ,CAAC;KACH;AAED;;;;AAIG;AACH,IAAA,mBAAmB,CAAC,KAAqB,EAAA;QACvC,IAAI,KAAK,EAAE,OAAO,EAAE;YAClB,IAAI,CAAC,mBAAmB,EAAE,IAAI,CAAC,KAAK,EAAE,EAAY,CAAC,CAAC;AACrD,SAAA;AAAM,aAAA;YACL,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,mBAAmB,EAAE,MAAM,CACzD,CAAC,EAAE,KAAK,EAAE,KAAK,KAAK,EAAE,EAAE,CACzB,CAAC;AACH,SAAA;AACD,QAAA,IAAI,IAAI,CAAC,eAAe,KAAK,eAAe,CAAC,WAAW,EAAE;YACxD,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,aAAa,CAAC,sBAAsB,CACrE,IAAI,CAAC,eAAe,EACpB,IAAI,CAAC,wBAAwB,EAAE,MAAM,EACrC,IAAI,CAAC,mBAAmB,CACzB,CAAC;AACH,SAAA;KACF;AAED;;;;AAIG;AACH,IAAA,wBAAwB,CAAC,IAAiB,EAAA;AACxC,QAAA,IAAI,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,CAAC;;;QAG5B,IAAI,IAAI,CAAC,qBAAqB,EAAE;YAC9B,OAAO;AACR,SAAA;AACD,QAAA,MAAM,uBAAuB,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;aAC1D,MAAM,CAAC,CAAC,WAAW,KAAK,WAAW,KAAK,iBAAiB,CAAC;aAC1D,KAAK,CACJ,CAAC,WAAW,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,MAAM,KAAK,UAAU,EAAE,KAAK,CACxE,CAAC;AACJ,QAAA,IACE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE,MAAM,KAAK,UAAU,EAAE,OAAO;YAC7D,uBAAuB;AACvB,YAAA,IAAI,CAAC,yBAAyB,CAAC,MAAM,GAAG,CAAC;YAC3C,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,UAAU,EAAE,KAAK,EACpC;AACA,YAAA,IAAI,CAAC,aAAa;AACf,iBAAA,kBAAkB,CAAC,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC;AACvE,iBAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC9B,iBAAA,SAAS,CAAC;AACT,gBAAA,IAAI,EAAE,CAAC,GAAG,KAAI;oBACZ,IAAI,GAAG,EAAE,MAAM,EAAE;AACf,wBAAA,IAAI,CAAC,kBAAkB,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;AACpC,qBAAA;iBACF;AACD,gBAAA,KAAK,EAAE,CAAC,KAAK,KAAI;AACf,oBAAA,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;iBAC1B;AACF,aAAA,CAAC,CAAC;AACN,SAAA;KACF;AAED;;;;;AAKG;IACH,sBAAsB;;IAEpB,QAAa,EAAA;AAEb,QAAA,IAAI,OAAoE,CAAC;AACzE,QAAA,IAAI,IAAI,CAAC,eAAe,KAAK,eAAe,EAAE,UAAU,EAAE;YACxD,MAAM,gBAAgB,GAAG,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC,CAAC,MAAM,KAAI;gBACrE,OAAO;oBACL,KAAK,EAAE,MAAM,CAAC,EAAY;oBAC1B,OAAO,EAAE,MAAM,CAAC,IAAI;iBACrB,CAAC;AACJ,aAAC,CAAC,CAAC;AACH,YAAA,OAAO,GAAG;AACR,gBAAA,OAAO,EAAE;AACP,oBAAA,MAAM,EAAE,IAAI,CAAC,gBAAgB,EAAE,MAAM;AACrC,oBAAA,KAAK,EAAE,IAAI,CAAC,gBAAgB,EAAE,KAAK;oBACnC,KAAK,EAAE,IAAI,CAAC,mBAAmB;AAC/B,oBAAA,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,iBAAiB,EAAE,OAAiB;AAChE,oBAAA,aAAa,EAAE,gBAAgB;AAChC,iBAAA;aACF,CAAC;YACF,IAAI,IAAI,CAAC,iBAAiB;AACxB,gBAAA,OAAO,CAAC,OAAO,CAAC,cAAc,GAAG;oBAC/B,gBAAgB,EAAE,QAAQ,EAAE,cAAc;AACxC,0BAAE,QAAQ,EAAE,cAAc,EAAE,EAAE;AAC9B,0BAAE,EAAE;iBACP,CAAC;YAEJ,IACE,QAAQ,EAAE,UAAU;AACpB,gBAAA,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,QAAQ,EAAE,UAAU,EAAE,EAAE,CAAC;AAE1D,gBAAA,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;AACzD,SAAA;;AACC,YAAA,OAAO,GAAG;AACR,gBAAA,OAAO,EAAE;AACP,oBAAA,KAAK,EAAE,IAAI,CAAC,gBAAgB,EAAE,KAAK;AACnC,oBAAA,MAAM,EAAE,IAAI,CAAC,gBAAgB,EAAE,MAAM;oBACrC,KAAK,EAAE,IAAI,CAAC,mBAAmB;AAC/B,oBAAA,OAAO,EAAE,IAAI,CAAC,aAAa,EAAE,iBAAiB,EAAE,OAAiB;AAClE,iBAAA;aACF,CAAC;AACJ,QAAA,OAAO,OAAO,CAAC;KAChB;AAED;;;AAGG;IACH,uBAAuB,GAAA;AACrB,QAAA,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC;KACzB;AAED;;;;AAIG;AACH,IAAA,qBAAqB,CAAC,IAAiB,EAAA;AACrC,QAAA,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;AACxC,QAAA,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,SAAS,EAAE;AACpC,YAAA,IAAI,CAAC,wBAAwB,EAAE,QAAQ,CAAC,OAAO,CAAe;kBAC3D,EAAE,CAAC,CAAC,CAAC;kBACL,OAAO,EAAE,CAAC;AACf,SAAA;QACD,IAAI,CAAC,8BAA8B,EAAE,CAAC;KACvC;AAED;;;;;;;;;;AAUG;IACH,8BAA8B,GAAA;AAC5B,QAAA,IACE,IAAI,CAAC,eAAe,KAAK,eAAe,CAAC,UAAU;YACnD,CAAC,IAAI,CAAC,wBAAwB;AAC9B,YAAA,IAAI,CAAC,wBAAwB,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EACzD;YACA,OAAO;AACR,SAAA;AACD,QAAA,IAAI,CAAC,wBAAwB,CAAC,UAAU,CACtC,iBAAiB,EACjB,IAAI,WAAW,CACb,IAAI,CAAC,yBAAyB,EAAE,MAAM;cAClC,IAAI,CAAC,yBAAyB;cAC9B,EAAE,EACN;AACE,YAAA,QAAQ,EAAE,MAAM;AAChB,YAAA,UAAU,EAAE;AACV,gBAAA,gCAAgC,EAAE;gBAClC,aAAa,CACX,UAAU,CAAC,SAAS,CAClB,wBAAwB,CAAC,4BAA4B,CACtD,CACF;gBACD,aAAa,CACX,UAAU,CAAC,SAAS,CAClB,wBAAwB,CAAC,4BAA4B,CACtD,CACF;gBACD,aAAa,CACX,UAAU,CAAC,OAAO,CAChB,wBAAwB,CAAC,wBAAwB,CAClD,CACF;AACF,aAAA;AACF,SAAA,CACF,CACF,CAAC;KACH;AAED;;;;AAIG;AACH,IAAA,wBAAwB,CAAC,IAAiB,EAAA;AACxC,QAAA,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACxC,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,aAAa,CAAC,sBAAsB,CACrE,IAAI,CAAC,eAAe,EACpB,IAAI,CAAC,wBAAwB,EAAE,MAAM,EACrC,IAAI,CAAC,mBAAmB,CACzB,CAAC;AACF,QAAA,IACE,IAAI,CAAC,yBAAyB,CAAC,MAAM;YACrC,IAAI,CAAC,wBAAwB,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC,MAAM;gBAC9D,UAAU,CAAC,OAAO,EACpB;AACA,YAAA,IAAI,CAAC,sBAAsB,GAAG,KAAK,CAAC;AACrC,SAAA;AAAM,aAAA,IAAI,IAAI,CAAC,yBAAyB,CAAC,MAAM,KAAK,CAAC,EAAE;AACtD,YAAA,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC;AACpC,SAAA;;;QAGD,IAAI,IAAI,CAAC,qBAAqB,EAAE;AAC9B,YAAA,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC;AACpC,SAAA;KACF;AAED;;;;;AAKG;IACH,wBAAwB,GAAA;AACtB,QAAA,IAAI,CAAC,qBAAqB;AACxB,YAAA,IAAI,CAAC,aAAa,CAAC,wBAAwB,EAAE,IAAI,EAAE,CAAC;QACtD,IAAI,CAAC,sBAAsB,EAAE,CAAC;KAC/B;AAED;;;AAGG;IACH,kBAAkB,GAAA;AAChB,QAAA,IAAI,CAAC,aAAa;AACf,aAAA,kBAAkB,EAAE;AACpB,aAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC9B,aAAA,SAAS,CAAC;AACT,YAAA,IAAI,EAAE,CAAC,QAAQ,KAAI;gBACjB,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,MAAM,KAAI;AACjC,oBAAA,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC;wBACzB,EAAE,EAAE,MAAM,CAAC,gBAAgB;wBAC3B,IAAI,EAAE,MAAM,CAAC,kBAAkB;AAChC,qBAAA,CAAC,CAAC;AACL,iBAAC,CAAC,CAAC;AACH,gBAAA,IAAI,CAAC,wBAAwB,CAC3B,gBAAgB,EAChB,iBAAiB,EACjB,IAAI,CAAC,eAAe,EACpB,IAAI,CAAC,gBAAgB,EAAE,cAAc,CACtC,CAAC;aACH;;AAED,YAAA,KAAK,EAAE,CAAC,KAAU,KAAI;AACpB,gBAAA,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;aAC1B;AACF,SAAA,CAAC,CAAC;KACN;AAED;;;AAGG;IACH,cAAc,GAAA;QACZ,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,cAAc,EAAE,CAAC;AACxD,QAAA,WAAW,EAAE,OAAO,CAAC,CAAC,MAAM,KAAI;AAC9B,YAAA,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC;gBACrB,EAAE,EAAE,MAAM,CAAC,MAAM;gBACjB,IAAI,EAAE,MAAM,CAAC,QAAQ;AACtB,aAAA,CAAC,CAAC;AACL,SAAC,CAAC,CAAC;AACH,QAAA,IAAI,CAAC,wBAAwB,CAC3B,YAAY,EACZ,iBAAiB,EACjB,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,gBAAgB,EAAE,YAAY,CACpC,CAAC;KACH;AAED;;;;AAIG;AACH,IAAA,gBAAgB,CAAC,OAAe,EAAA;AAC9B,QAAA,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC;AAC9B,QAAA,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;AACxB,QAAA,OAAO,GAAG,OAAO,EAAE,SAAS,EAAE,CAAC;QAC/B,IAAI,CAAC,wBAAwB,CAC3B,iBAAiB,EACjB,gCAAgC,EAChC,EAAE,EACF,EAAE,CACH,CAAC;AACF,QAAA,IAAI,CAAC,OAAO;YAAE,OAAO;AACrB,QAAA,MAAM,iBAAiB,GAA+B;AACpD,YAAA,OAAO,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE;SAC9B,CAAC;AACF,QAAA,IAAI,CAAC,aAAa;aACf,gBAAgB,CAAC,iBAAiB,CAAC;AACnC,aAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC9B,aAAA,SAAS,CAAC;AACT,YAAA,IAAI,EAAE,CAAC,QAAQ,KAAI;gBACjB,MAAM,IAAI,GAAmB,EAAE,CAAC;gBAChC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,MAAM,KAAI;oBACjC,IAAI,CAAC,IAAI,CAAC;wBACR,EAAE,EAAE,MAAM,CAAC,KAAK;wBAChB,IAAI,EAAE,MAAM,CAAC,OAAO;AACrB,qBAAA,CAAC,CAAC;AACL,iBAAC,CAAC,CAAC;;;;AAIH,gBAAA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;aAC3B;;AAED,YAAA,KAAK,EAAE,CAAC,KAAU,KAAI;AACpB,gBAAA,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;aAC1B;AACF,SAAA,CAAC,CAAC;KACN;AAED;;;;;;AAMG;AACH,IAAA,wBAAwB,CACtB,eAAuB,EACvB,wBAAgC,EAChC,OAAuB,EACvB,cAAuB,EAAA;QAEvB,MAAM,UAAU,GAAG,IAAI,CAAC,oBAAoB,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;AACpE,QAAA,UAAU,EAAE,OAAO,CAAC,CAAC,SAAS,KAAI;YAChC,MAAM,eAAe,GAAG,OAAO,EAAE,MAAM,CAAC,CAAC,MAAM,KAC7C,cAAc,EAAE,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,CACvC,CAAC,CAAC,CAAC,CAAC;YACL,IACE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW;gBACjD,eAAe;AACjB,gBAAA,SAAS,EAAE,SAAS,EAAE,QAAQ,GAAG,wBAAwB,CAAC;gBAE1D,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,wBAAwB,CAAC,GAAG,OAAO,CAAC;YACnE,IAAI,cAAc,IAAI,eAAe,EAAE;AACrC,gBAAA,IAAI,CAAC,wBAAwB;qBAC1B,GAAG,CAAC,eAAe,CAAC;AACrB,sBAAE,QAAQ,CAAC,eAAe,CAAC,CAAC;AAC/B,aAAA;AACH,SAAC,CAAC,CAAC;KACJ;AAED;;;;;AAKG;;AAEH,IAAA,YAAY,CAAC,KAAU,EAAA;QACrB,MAAM,UAAU,GAAG,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,CAAC;AAClD,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE;AACtD,YAAA,IAAI,UAAU,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE;gBAC5B,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,EAAE,iBAAiB,CAAC,UAAU,CAAC,CAAC;AACvE,gBAAA,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC;AAC5B,oBAAA,MAAM,EAAE,QAAQ;AAChB,oBAAA,OAAO,EAAE,YAAY;oBACrB,SAAS,EAAE,SAAS,CAAC,KAAK;AAC1B,oBAAA,aAAa,EAAE,IAAI;AACpB,iBAAA,CAAC,CAAC;AACJ,aAAA;AACF,SAAA;AAAM,aAAA,IAAI,KAAK,IAAI,KAAK,YAAY,iBAAiB,EAAE;AACtD,YAAA,IAAI,CAAC,yBAAyB,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC;AACpD,SAAA;KACF;AACD;;;AAGG;IACH,mBAAmB,GAAA;AACjB,QAAA,IAAI,IAAI,CAAC,yBAAyB,CAAC,MAAM,KAAK,CAAC,EAAE;YAC/C,IAAI,CAAC,wBAAwB,CAC3B,iBAAiB,EACjB,gCAAgC,EAChC,EAAE,CACH,CAAC;AACF,YAAA,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC;AACpC,SAAA;KACF;AAED;;;AAGG;IACH,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzB,QAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;KAC7B;+GAruBU,sBAAsB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAM,aAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,IAAA,CAAA,yBAAA,EAAA,EAAA,EAAA,KAAA,EAAAA,IAAA,CAAA,aAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;mGAAtB,sBAAsB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,OAAA,EAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,YAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,sBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EA0CtB,oBAAoB,EC1GjC,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,k2DAsCA,sieDqBY,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,oBAAoB,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,iBAAA,EAAA,wBAAA,EAAA,sBAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,mBAAA,EAAA,kCAAA,EAAA,6BAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,EAAA,YAAA,EAAA,WAAA,EAAA,uBAAA,EAAA,iBAAA,EAAA,qBAAA,EAAA,gBAAA,EAAA,uBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,mBAAA,EAAA,wBAAA,EAAA,kCAAA,EAAA,4BAAA,EAAA,sBAAA,EAAA,uBAAA,EAAA,cAAA,EAAA,kBAAA,EAAA,sBAAA,EAAA,uBAAA,EAAA,gBAAA,EAAA,sBAAA,EAAA,uBAAA,EAAA,yBAAA,EAAA,gBAAA,EAAA,mCAAA,EAAA,6CAAA,EAAA,wCAAA,EAAA,iCAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,uBAAuB,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,aAAA,EAAA,gBAAA,EAAA,WAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,eAAA,EAAA,iBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,iBAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA,EAAA;;4FAK1D,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBARlC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,wBAAwB,EACtB,UAAA,EAAA,IAAI,EACP,OAAA,EAAA,CAAC,YAAY,EAAE,oBAAoB,EAAE,uBAAuB,CAAC,EAGvD,aAAA,EAAA,iBAAiB,CAAC,IAAI,EAAA,QAAA,EAAA,k2DAAA,EAAA,MAAA,EAAA,CAAA,++dAAA,CAAA,EAAA,CAAA;yKA4CJ,oBAAoB,EAAA,CAAA;sBAApD,SAAS;uBAAC,oBAAoB,CAAA;gBACrB,kBAAkB,EAAA,CAAA;sBAA3B,MAAM;gBACG,UAAU,EAAA,CAAA;sBAAnB,MAAM;;;AEnGT;;;;;;;;;;;;;;;;;;AAkBG;MAIU,sBAAsB,CAAA;AAMjC,IAAA,WAAA;;IAEU,WAAwB,EAAA;QAAxB,IAAW,CAAA,WAAA,GAAX,WAAW,CAAa;;QAJjB,IAAgB,CAAA,gBAAA,GAAG,sBAAsB,CAAC;KAKvD;AAEJ;;;;AAIG;AACH,IAAA,aAAa,CAAC,GAAW,EAAA;AACvB,QAAA,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC;KACvB;AAED;;;;;;AAMG;IACK,QAAQ,CAAC,MAAM,GAAG,EAAE,EAAA;AAC1B,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;AACpB,YAAA,MAAM,IAAI,KAAK,CACb,2EAA2E,CAC5E,CAAC;AACH,SAAA;AACD,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACjD,OAAO,CAAA,EAAG,IAAI,CAAI,CAAA,EAAA,IAAI,CAAC,gBAAgB,CAAA,EAAG,MAAM,CAAA,CAAE,CAAC;KACpD;AAED;;;;;;;;;;AAUG;IACH,gBAAgB,CAAC,IAAU,EAAE,OAAe,EAAA;AAC1C,QAAA,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;AAChC,QAAA,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AAC9B,QAAA,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACpC,OAAO,IAAI,CAAC,WAAW;aACpB,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,QAAQ,CAAC;aAChD,IAAI;;AAEH,QAAAG,KAAG,CAAC,CAAC,QAAa,KAAK,QAAQ,EAAE,IAAuB,CAAC,EACzDG,YAAU,CAAC,CAAC,QAAQ,KAAI;AACtB,YAAA,MAAM,QAAQ,CAAC;SAChB,CAAC,CACH,CAAC;KACL;AAED;;;;;;;AAOG;AACH,IAAA,iBAAiB,CAAC,QAAgB,EAAA;QAChC,OAAO,IAAI,CAAC,WAAW;aACpB,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAI,CAAA,EAAA,QAAQ,CAAW,SAAA,CAAA,CAAC,EAAE,EAAE,CAAC;aACpD,IAAI;;AAEH,QAAAH,KAAG,CAAC,CAAC,QAAa,KAAK,QAAQ,EAAE,IAA2B,CAAC,EAC7DG,YAAU,CAAC,CAAC,QAAQ,KAAI;AACtB,YAAA,MAAM,QAAQ,CAAC;SAChB,CAAC,CACH,CAAC;KACL;AAED;;;;;;;AAOG;AACH,IAAA,gBAAgB,CAAC,QAAgB,EAAA;AAC/B,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAA,QAAA,CAAU,CAAC,CAAC,CAAC,IAAI;;AAEzE,QAAAH,KAAG,CAAC,CAAC,QAAa,KAAK,QAAQ,EAAE,IAA2B,CAAC,EAC7DG,YAAU,CAAC,CAAC,QAAQ,KAAI;AACtB,YAAA,MAAM,QAAQ,CAAC;SAChB,CAAC,CACH,CAAC;KACH;AAED;;;;;;;;;;AAUG;AACH,IAAA,gBAAgB,CAAC,QAAgB,EAAA;QAC/B,OAAO,IAAI,CAAC,WAAW;aACpB,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAI,CAAA,EAAA,QAAQ,CAAU,QAAA,CAAA,CAAC,EAAE,EAAE,CAAC;aACnD,IAAI;;AAEH,QAAAH,KAAG,CAAC,CAAC,QAAa,KAAK,QAAQ,EAAE,IAAuB,CAAC,EACzDG,YAAU,CAAC,CAAC,QAAQ,KAAI;AACtB,YAAA,MAAM,QAAQ,CAAC;SAChB,CAAC,CACH,CAAC;KACL;AAED;;;;;;AAMG;AACH,IAAA,eAAe,CAAC,QAAgB,EAAA;QAC9B,OAAO,IAAI,CAAC,WAAW;aACpB,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAI,CAAA,EAAA,QAAQ,CAAS,OAAA,CAAA,CAAC,EAAE,EAAE,CAAC;aAClD,IAAI;;AAEH,QAAAH,KAAG,CAAC,CAAC,QAAa,KAAK,QAAQ,EAAE,IAAc,CAAC,EAChDG,YAAU,CAAC,CAAC,QAAQ,KAAI;AACtB,YAAA,MAAM,QAAQ,CAAC;SAChB,CAAC,CACH,CAAC;KACL;AAED;;;;;;;;;;AAUG;AACH,IAAA,gBAAgB,CAAC,OAAe,EAAA;QAC9B,OAAO,IAAI,CAAC,WAAW;aACpB,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAY,SAAA,EAAA,OAAO,CAAE,CAAA,CAAC,CAAC;aAC7C,IAAI;;AAEH,QAAAH,KAAG,CAAC,CAAC,QAAa,KAAM,QAAQ,EAAE,IAA0B,IAAI,EAAE,CAAC,EACnEG,YAAU,CAAC,CAAC,QAAQ,KAAI;AACtB,YAAA,MAAM,QAAQ,CAAC;SAChB,CAAC,CACH,CAAC;KACL;+GApKU,sBAAsB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAV,IAAA,CAAA,WAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;AAAtB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,sBAAsB,cAFrB,MAAM,EAAA,CAAA,CAAA,EAAA;;4FAEP,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAHlC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA,CAAA;;;ACWD;;;;;;;;;;;;;;;;AAgBG;MASU,qBAAqB,CAAA;AA0DhC,IAAA,WAAA;;IAEU,sBAA8C;;IAE9C,YAA2B,EAAA;QAF3B,IAAsB,CAAA,sBAAA,GAAtB,sBAAsB,CAAwB;QAE9C,IAAY,CAAA,YAAA,GAAZ,YAAY,CAAe;;;AAvD3B,QAAA,IAAA,CAAA,kBAAkB,GAAG,IAAI,YAAY,EAAO,CAAC;;AAG7C,QAAA,IAAA,CAAA,UAAU,GAAG,IAAI,YAAY,EAAQ,CAAC;AAEhD,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,OAAO,EAAW,CAAC;;QAGlC,IAAS,CAAA,SAAA,GAAQQ,WAAS,CAAC;AAC3B,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC;;QAG3C,IAAW,CAAA,WAAA,GAAsB,QAAQ,CAAC;;QAG1C,IAAY,CAAA,YAAA,GAAgB,IAAI,CAAC;;QAGjC,IAAU,CAAA,UAAA,GAAG,KAAK,CAAC;;QAGnB,IAAY,CAAA,YAAA,GAA8B,IAAI,CAAC;;QAG/C,IAAS,CAAA,SAAA,GAA2B,EAAE,CAAC;;QAGvC,IAAY,CAAA,YAAA,GAAkB,IAAI,CAAC;AAEnC;;;;AAIG;QACH,IAAa,CAAA,aAAA,GAAa,EAAE,CAAC;AAE7B;;;AAGG;QACH,IAAa,CAAA,aAAA,GAAkB,IAAI,CAAC;;QAG5B,IAAQ,CAAA,QAAA,GAAkB,IAAI,CAAC;;QAG9B,IAAa,CAAA,aAAA,GAAG,QAAU,CAAC;;AAG3B,QAAA,IAAA,CAAA,mBAAmB,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAO7C;AAEJ;;;;;;AAMG;AACH,IAAA,IAAI,eAAe,GAAA;QACjB,MAAM,IAAI,GAAa,IAAI,CAAC,WAAW,EAAE,eAAe,IAAI,EAAE,CAAC;AAC/D,QAAA,OAAO,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;KACtC;AAED;;;;;;AAMG;AACK,IAAA,kBAAkB,CAAC,IAAc,EAAA;QACvC,MAAM,MAAM,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;AAC7C,QAAA,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC;KACxE;AAED;;;;;;;;;;;;;;AAcG;AACK,IAAA,kBAAkB,CACxB,IAAc,EAAA;QAEd,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,EAAE,wBAAwB,EAAE,IAAI,EAAE,CAAC;AACzE,QAAA,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE;AACxB,YAAA,OAAO,EAAE,CAAC;AACX,SAAA;QACD,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,uBAAuB,IAAI,EAAE,CAAC;QAClE,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QAC3D,MAAM,MAAM,GAA6C,EAAE,CAAC;AAC5D,QAAA,YAAY,CAAC,OAAO,CAAC,CAAC,KAAK,KAAI;YAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;AAC3C,YAAA,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,EAAE;gBAC3C,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;AAC9B,gBAAA,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AAC7D,aAAA;AACH,SAAC,CAAC,CAAC;AACH,QAAA,OAAO,MAAM,CAAC;KACf;AAED;;;;;;AAMG;AACK,IAAA,gBAAgB,CAAC,KAAa,EAAA;QACpC,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,iBAAiB,IAAI,EAAE,CAAC;AACzD,QAAA,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE;AACjB,YAAA,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACtB,SAAA;;AAED,QAAA,OAAO,KAAK;AACT,aAAA,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC;AACtB,aAAA,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;KACnD;;AAGD,IAAA,IAAI,iBAAiB,GAAA;QACnB,OAAO,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;KAC3C;;AAGD,IAAA,IAAY,OAAO,GAAA;AACjB,QAAA,QACE,IAAI,CAAC,aAAa,EAAE,OAAO;AAC1B,YAAA,IAAI,CAAC,YAAY,EAAE,oBAAoB,EAAE,EAAE,OAAkB;AAC9D,YAAA,EAAE,EACF;KACH;AAED;;;AAGG;IACH,QAAQ,GAAA;QACN,IAAI,CAAC,sBAAsB,CAAC,aAAa,CAAC,IAAI,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;KAC1E;AAED;;;AAGG;IACH,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzB,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;KAC1B;AAED;;;;AAIG;AACH,IAAA,cAAc,CAAC,KAAY,EAAA;AACzB,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,MAA0B,CAAC;AAC/C,QAAA,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;YAC5C,OAAO;AACR,SAAA;AACD,QAAA,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;YAC1B,IAAI,CAAC,uBAAuB,EAAE,CAAC;;AAE/B,YAAA,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC;YACjB,OAAO;AACR,SAAA;QACD,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;;;;AAIjC,QAAA,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC;KAClB;AAED;;;;AAIG;AACH,IAAA,UAAU,CAAC,KAAgB,EAAA;QACzB,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,KAAK,CAAC,eAAe,EAAE,CAAC;AACxB,QAAA,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;AACxB,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC;QACxC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;YAChC,OAAO;AACR,SAAA;AACD,QAAA,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;YACpB,IAAI,CAAC,uBAAuB,EAAE,CAAC;YAC/B,OAAO;AACR,SAAA;QACD,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;KAC5B;AAED;;;;AAIG;AACH,IAAA,UAAU,CAAC,KAAgB,EAAA;QACzB,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,KAAK,CAAC,eAAe,EAAE,CAAC;AACxB,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;KACxB;AAED;;;;AAIG;AACH,IAAA,WAAW,CAAC,KAAgB,EAAA;QAC1B,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,KAAK,CAAC,eAAe,EAAE,CAAC;AACxB,QAAA,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;KACzB;AAED;;;;AAIG;AACH,IAAA,WAAW,CAAC,IAAU,EAAA;AACpB,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;AACzB,QAAA,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;AACxB,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;AAC1B,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;AACzB,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;;;AAGrB,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QAEzB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QACzC,MAAM,gBAAgB,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,GAAG,KACzD,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CACvB,CAAC;QACF,IAAI,CAAC,gBAAgB,EAAE;AACrB,YAAA,IAAI,CAAC,YAAY;AACf,gBAAA,IAAI,CAAC,WAAW,EAAE,UAAU,EAAE,eAAe;AAC7C,oBAAA,gEAAgE,CAAC;YACnE,OAAO;AACR,SAAA;AAED,QAAA,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC,EAAE;AACnB,YAAA,IAAI,CAAC,YAAY;AACf,gBAAA,IAAI,CAAC,WAAW,EAAE,UAAU,EAAE,SAAS;AACvC,oBAAA,uEAAuE,CAAC;YAC1E,OAAO;AACR,SAAA;AAED,QAAA,IAAI,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,aAAa,EAAE;AAClC,YAAA,IAAI,CAAC,YAAY;AACf,gBAAA,IAAI,CAAC,WAAW,EAAE,UAAU,EAAE,YAAY;AAC1C,oBAAA,qDAAqD,CAAC;YACxD,OAAO;AACR,SAAA;AAED,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;KAC1B;AAED;;;AAGG;IACH,uBAAuB,GAAA;AACrB,QAAA,IAAI,CAAC,YAAY;AACf,YAAA,IAAI,CAAC,WAAW,EAAE,UAAU,EAAE,cAAc;AAC5C,gBAAA,wCAAwC,CAAC;KAC5C;AAED;;;AAGG;IACH,YAAY,GAAA;AACV,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;AACzB,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;AACzB,QAAA,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;AACxB,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;AAC1B,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;AACzB,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;AACrB,QAAA,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC;KAC7B;AAED;;;;;;AAMG;IACH,eAAe,GAAA;AACb,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;AACzB,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;AACzB,QAAA,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;AACxB,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;AAC1B,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;AACzB,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;AACpB,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;AACrB,QAAA,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC;KAC7B;AAED;;;;;AAKG;IACH,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;YACtB,OAAO;AACR,SAAA;AACD,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;AACjB,YAAA,IAAI,CAAC,YAAY;AACf,gBAAA,IAAI,CAAC,WAAW,EAAE,UAAU,EAAE,YAAY;AAC1C,oBAAA,iEAAiE,CAAC;YACpE,OAAO;AACR,SAAA;AACD,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;AACzB,QAAA,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;AACxB,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;AAC1B,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;AACzB,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;AACpB,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;AACrB,QAAA,IAAI,CAAC,WAAW,GAAG,YAAY,CAAC;AAEhC,QAAA,IAAI,CAAC,sBAAsB;aACxB,gBAAgB,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC;AACjD,aAAA,IAAI,CACH,SAAS,CAAC,CAAC,GAAoB,KAAI;YACjC,IAAI,CAAC,QAAQ,GAAG,GAAG,EAAE,QAAQ,IAAI,IAAI,CAAC;YACtC,OAAO,IAAI,CAAC,sBAAsB,CAAC,iBAAiB,CAClD,IAAI,CAAC,QAAkB,CACxB,CAAC;SACH,CAAC,EACF,SAAS,CAAC,MACR,IAAI,CAAC,sBAAsB,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAkB,CAAC,CACtE,EACD,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CACzB;AACA,aAAA,SAAS,CAAC;AACT,YAAA,IAAI,EAAE,CAAC,YAA6B,KAAI;AACtC,gBAAA,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;aACnC;;AAED,YAAA,KAAK,EAAE,CAAC,KAAU,KAAI;AACpB,gBAAA,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;aAC/B;AACF,SAAA,CAAC,CAAC;KACN;AAED;;;;;;AAMG;;AAEK,IAAA,iBAAiB,CAAC,KAAU,EAAA;AAClC,QAAA,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC;;;;;;AAM5B,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;;;;;;QAOzB,MAAM,UAAU,GAAyB,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,CAAC;QACxE,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC,MAAM,EAAE;AAClD,YAAA,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAC7B,CAAC,IAAI,KACH,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,IAA0C,CAAC;AACpE,gBAAA,IAAI,CAAC,WAAW,EAAE,UAAU,EAAE,YAAY;AAC1C,gBAAA,iEAAiE,CACpE,CAAC;;;AAGF,YAAA,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;;;YAGnD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;YAClD,OAAO;AACR,SAAA;;;;QAKD,MAAM,MAAM,GAAG,KAAK,EAAE,MAAM,IAAI,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC;QACrD,IAAI,MAAM,KAAK,GAAG,EAAE;AAClB,YAAA,IAAI,CAAC,YAAY;AACf,gBAAA,IAAI,CAAC,WAAW,EAAE,UAAU,EAAE,SAAS;AACvC,oBAAA,+DAA+D,CAAC;YAClE,OAAO;AACR,SAAA;AAED,QAAA,IAAI,CAAC,YAAY;AACf,YAAA,IAAI,CAAC,WAAW,EAAE,UAAU,EAAE,YAAY;AAC1C,gBAAA,iEAAiE,CAAC;KACrE;AAED;;;;;;AAMG;AACH,IAAA,cAAc,CAAC,GAAoB,EAAA;AACjC,QAAA,MAAM,YAAY,GAAG,GAAG,EAAE,SAAS,IAAI,CAAC,CAAC;AACzC,QAAA,MAAM,YAAY,GAAG,GAAG,EAAE,WAAW,IAAI,CAAC,CAAC;AAC3C,QAAA,MAAM,YAAY,GAAG,GAAG,EAAE,UAAU,IAAI,CAAC,CAAC;QAE1C,IAAI,CAAC,YAAY,GAAG,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC;QACjE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;AACzD,QAAA,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC;QAE5B,IAAI,YAAY,KAAK,CAAC,EAAE;AACtB,YAAA,IAAI,CAAC,aAAa;AAChB,gBAAA,IAAI,CAAC,WAAW,EAAE,UAAU,EAAE,aAAa;AAC3C,oBAAA,iFAAiF,CAAC;AACrF,SAAA;KACF;AAED;;;;;;;;;;;;;AAaG;;AAEK,IAAA,gBAAgB,CAAC,WAAiB,EAAA;QACxC,IAAI,CAAC,WAAW,EAAE;AAChB,YAAA,OAAO,EAAE,CAAC;AACX,SAAA;;QAED,IAAI,KAAK,GAAY,WAAW,CAAC;AACjC,QAAA,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE;YACnC,IAAI;AACF,gBAAA,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;AACjC,aAAA;YAAC,MAAM;AACN,gBAAA,OAAO,EAAE,CAAC;AACX,aAAA;AACF,SAAA;;AAED,QAAA,MAAM,OAAO,GAA8B,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;AAC7D,cAAG,KAAmC;eAClC,KAA8C,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;QAClE,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,MAAM;YAC7B,SAAS,EAAE,KAAK,EAAE,GAAG;YACrB,KAAK,EAAE,KAAK,EAAE,KAAK;YACnB,YAAY,EAAE,KAAK,EAAE,OAAO;AAC7B,SAAA,CAAC,CAAC,CAAC;KACL;AAED;;;;;AAKG;AACH,IAAA,IAAI,gBAAgB,GAAA;AAClB,QAAA,OAAO,CAAC,CAAC,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY,CAAC,YAAY,GAAG,CAAC,CAAC;KAClE;AAED;;;;;AAKG;AACH,IAAA,IAAI,cAAc,GAAA;AAChB,QAAA,QACE,CAAC,CAAC,IAAI,CAAC,YAAY;AACnB,YAAA,IAAI,CAAC,YAAY,CAAC,YAAY,GAAG,CAAC;AAClC,YAAA,IAAI,CAAC,YAAY,CAAC,YAAY,KAAK,CAAC,EACpC;KACH;AAED;;;;AAIG;IACH,kBAAkB,GAAA;AAChB,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe;AACpC,aAAA,GAAG,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;aACjC,IAAI,CAAC,GAAG,CAAC,CAAC;;;;;;QAOb,MAAM,IAAI,GAAa,IAAI,CAAC,WAAW,EAAE,eAAe,IAAI,EAAE,CAAC;QAC/D,MAAM,cAAc,GAAe,IAAI,CAAC,WAAW,EAAE,UAAU,IAAI,EAAE,CAAC;QACtE,MAAM,iBAAiB,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,GAAG,CACzD,CAAC,GAAG,KAAK,GAAG,CAAC,WAAW,CACzB,CAAC;AACF,QAAA,MAAM,SAAS,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,GAAG,KACvC,CAAC,GAAG,GAAG,EAAE,GAAG,iBAAiB,CAAC;AAC3B,aAAA,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;AACnC,aAAA,IAAI,CAAC,GAAG,CAAC,CACb,CAAC;AAEF,QAAA,MAAM,UAAU,GAAG,CAAC,UAAU,EAAE,GAAG,SAAS,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;QACpE,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,UAAU,CAAC,EAAE;AAClC,YAAA,IAAI,EAAE,yBAAyB;AAChC,SAAA,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,cAAc,IAAI,mBAAmB,CAAC;AACzE,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;KACtC;AAED;;;;AAIG;IACH,gBAAgB,GAAA;AACd,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE;YAC1B,OAAO;AACR,SAAA;QACD,MAAM,OAAO,GAAa,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,OAAO,IAAI;YAC/D,KAAK;YACL,OAAO;YACP,OAAO;SACR,CAAC;QACF,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,MAAM,KACrC,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,YAAY,CAAC;AAClD,aAAA,GAAG,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AACrC,aAAA,IAAI,CAAC,GAAG,CAAC,CACb,CAAC;AACF,QAAA,MAAM,UAAU,GAAG;AACjB,YAAA,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;AACzD,YAAA,GAAG,IAAI;AACR,SAAA,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACf,MAAM,QAAQ,GACZ,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,QAAQ,IAAI,6BAA6B,CAAC;AACxE,QAAA,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,UAAU,CAAC,EAAE,EAAE,IAAI,EAAE,yBAAyB,EAAE,CAAC,CAAC;AACzE,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;KACtC;AAED;;;;;AAKG;AACH,IAAA,SAAS,CAAC,KAAyC,EAAA;QACjD,MAAM,GAAG,GAAG,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,GAAG,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;AACvE,QAAA,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;YACxB,OAAO,CAAA,CAAA,EAAI,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA,CAAA,CAAG,CAAC;AACvC,SAAA;AACD,QAAA,OAAO,GAAG,CAAC;KACZ;AAED;;;;AAIG;IACH,QAAQ,GAAA;QACN,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY,CAAC,YAAY,GAAG,CAAC,EAAE;YAC3D,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;AACjD,SAAA;AAAM,aAAA;AACL,YAAA,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;AACxB,SAAA;KACF;AAED;;;;;AAKG;IACK,eAAe,CAAC,IAAU,EAAE,QAAgB,EAAA;QAClD,MAAM,GAAG,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;AACzC,QAAA,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC;AAChB,QAAA,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,KAAK,EAAE,CAAC;AACb,QAAA,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;KAC1B;+GAxmBU,qBAAqB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAG,sBAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,aAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;AAArB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,qBAAqB,6MClElC,ghVA0QA,EAAA,MAAA,EAAA,CAAA,4niBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED7MY,YAAY,EAAE,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,eAAe,2QAAE,oBAAoB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,cAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,OAAA,EAAA,aAAA,EAAA,MAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA,EAAA;;4FAKlD,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBARjC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,sBAAsB,EACpB,UAAA,EAAA,IAAI,EACP,OAAA,EAAA,CAAC,YAAY,EAAE,eAAe,EAAE,oBAAoB,CAAC,EAG/C,aAAA,EAAA,iBAAiB,CAAC,IAAI,EAAA,QAAA,EAAA,ghVAAA,EAAA,MAAA,EAAA,CAAA,4niBAAA,CAAA,EAAA,CAAA;mIAK5B,aAAa,EAAA,CAAA;sBAArB,KAAK;gBAII,kBAAkB,EAAA,CAAA;sBAA3B,MAAM;gBAGG,UAAU,EAAA,CAAA;sBAAnB,MAAM;;;AE1CT;;;;;;;;;;;;;;;;;;;AAmBG;MASU,4BAA4B,CAAA;AAoCvC,IAAA,WAAA;;IAEU,sBAA8C;;IAE9C,YAA2B;;IAE3B,GAAsB;;IAEtB,yBAAoD,EAAA;QANpD,IAAsB,CAAA,sBAAA,GAAtB,sBAAsB,CAAwB;QAE9C,IAAY,CAAA,YAAA,GAAZ,YAAY,CAAe;QAE3B,IAAG,CAAA,GAAA,GAAH,GAAG,CAAmB;QAEtB,IAAyB,CAAA,yBAAA,GAAzB,yBAAyB,CAA2B;;QAtC9D,IAAS,CAAA,SAAA,GAAQL,WAAS,CAAC;AAC3B,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,CAAC,SAAS,EAAE,mBAAmB,CAAC;AAE1C,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,OAAO,EAAW,CAAC;;QAG1C,IAAY,CAAA,YAAA,GAAwB,EAAE,CAAC;;QAGvC,IAAS,CAAA,SAAA,GAA6B,EAAE,CAAC;;QAGzC,IAAS,CAAA,SAAA,GAAG,KAAK,CAAC;;QAGlB,IAAY,CAAA,YAAA,GAAkB,IAAI,CAAC;;AAGnC,QAAA,IAAA,CAAA,YAAY,GAAiB;AAC3B,YAAA,cAAc,EAAE,KAAK;AACrB,YAAA,cAAc,EAAE,KAAK;AACrB,YAAA,WAAW,EAAE,KAAK;AAClB,YAAA,YAAY,EAAE,KAAK;AACnB,YAAA,cAAc,EAAE,KAAK;SACtB,CAAC;;QAGe,IAAW,CAAA,WAAA,GAC1B,IAAI,CAAC,WAAW,EAAE,qBAAqB,IAAI,GAAG,CAAC;KAW7C;;AAGJ,IAAA,IAAI,SAAS,GAAA;AACX,QAAA,QACE,IAAI,CAAC,aAAa,EAAE,SAAS;AAC7B,YAAA,IAAI,CAAC,YAAY,EAAE,oBAAoB,EAAE,EAAE,SAAS;AACpD,YAAA,EAAE,EACF;KACH;;AAGD,IAAA,IAAY,OAAO,GAAA;AACjB,QAAA,QACE,IAAI,CAAC,aAAa,EAAE,OAAO;AAC1B,YAAA,IAAI,CAAC,YAAY,EAAE,oBAAoB,EAAE,EAAE,OAAkB;AAC9D,YAAA,EAAE,EACF;KACH;AAED;;;AAGG;IACH,QAAQ,GAAA;QACN,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,IAAI,CAAC,sBAAsB,CAAC,aAAa,CAAC,IAAI,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;QACzE,IAAI,CAAC,iBAAiB,EAAE,CAAC;KAC1B;AAED;;;AAGG;IACH,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzB,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;KAC1B;AAED;;;AAGG;IACH,iBAAiB,GAAA;AACf,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YACjB,OAAO;AACR,SAAA;AACD,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;AACtB,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;AACzB,QAAA,IAAI,CAAC,sBAAsB;AACxB,aAAA,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC;AAC9B,aAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC9B,aAAA,SAAS,CAAC;AACT,YAAA,IAAI,EAAE,CAAC,IAAuB,KAAI;gBAChC,IAAI,CAAC,SAAS,GAAG,CAAC,IAAI,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;AAClE,gBAAA,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;AACvB,gBAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;aAC1B;;AAED,YAAA,KAAK,EAAE,CAAC,KAAU,KAAI;AACpB,gBAAA,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;AACvB,gBAAA,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;AACxB,gBAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;aAC1B;AACF,SAAA,CAAC,CAAC;KACN;AAED;;;;;;;AAOG;AACK,IAAA,WAAW,CAAC,GAAoB,EAAA;QACtC,OAAO;;;;YAIL,SAAS,EAAE,GAAG,EAAE,SAAS;kBACrB,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC;kBACnC,IAAI,CAAC,WAAW;AACpB,YAAA,cAAc,EAAE,GAAG,EAAE,SAAS,IAAI,IAAI,CAAC,WAAW;AAClD,YAAA,QAAQ,EAAE,GAAG,EAAE,QAAQ,IAAI,IAAI,CAAC,WAAW;AAC3C,YAAA,SAAS,EAAE,GAAG,EAAE,WAAW,IAAI,CAAC;AAChC,YAAA,MAAM,EAAE,GAAG,EAAE,UAAU,IAAI,CAAC;AAC5B,YAAA,WAAW,EAAE,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,WAAW;SAChD,CAAC;KACH;AAED;;;;;;;;;;;;;AAaG;AACK,IAAA,eAAe,CAAC,KAAa,EAAA;QACnC,IAAI,CAAC,KAAK,EAAE;YACV,OAAO,IAAI,CAAC,WAAW,CAAC;AACzB,SAAA;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;AAC7C,QAAA,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;YAC9B,OAAO,IAAI,CAAC,WAAW,CAAC;AACzB,SAAA;;;QAGD,OAAO,MAAM,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC,CAAC;KAC5D;AAED;;;;;;;;;;;;;;;;;;;;AAoBG;AACK,IAAA,iBAAiB,CAAC,KAAa,EAAA;AACrC,QAAA,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;AACzB,QAAA,MAAM,GAAG,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;;AAG5B,QAAA,IAAI,MAAM,GAAG,QAAQ,CAAC,UAAU,CAAC,GAAG,EAAE,qBAAqB,EAAE,GAAG,CAAC,CAAC;QAClE,IAAI,MAAM,CAAC,OAAO,EAAE;AAClB,YAAA,OAAO,MAAM,CAAC;AACf,SAAA;;;AAID,QAAA,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAClD,IAAI,MAAM,CAAC,OAAO,EAAE;;;AAGlB,YAAA,OAAO,wBAAwB,CAAC,IAAI,CAAC,GAAG,CAAC;AACvC,kBAAE,MAAM;kBACN,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AAChC,SAAA;;QAGD,MAAM,GAAG,QAAQ,CAAC,UAAU,CAAC,GAAG,EAAE,qBAAqB,EAAE,GAAG,CAAC,CAAC;QAC9D,IAAI,MAAM,CAAC,OAAO,EAAE;AAClB,YAAA,OAAO,MAAM,CAAC;AACf,SAAA;;QAGD,MAAM,GAAG,QAAQ,CAAC,UAAU,CAAC,GAAG,EAAE,kBAAkB,EAAE,GAAG,CAAC,CAAC;QAC3D,IAAI,MAAM,CAAC,OAAO,EAAE;AAClB,YAAA,OAAO,MAAM,CAAC;AACf,SAAA;;AAGD,QAAA,MAAM,GAAG,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,MAAM,CAAC,OAAO,EAAE;AAClB,YAAA,OAAO,MAAM,CAAC;AACf,SAAA;AACD,QAAA,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,MAAM,CAAC,OAAO,EAAE;AAClB,YAAA,OAAO,MAAM,CAAC;AACf,SAAA;;AAGD,QAAA,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,EAAE;YAC5B,OAAO,QAAQ,CAAC,UAAU,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AACzC,SAAA;AAED,QAAA,OAAO,IAAI,CAAC;KACb;AAED;;;;;;AAMG;;AAEK,IAAA,WAAW,CAAC,KAAU,EAAA;AAC5B,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;QACpB,MAAM,MAAM,GAAG,KAAK,EAAE,MAAM,IAAI,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC;QACrD,IAAI,MAAM,KAAK,GAAG,EAAE;AAClB,YAAA,IAAI,CAAC,YAAY;gBACf,IAAI,CAAC,WAAW,EAAE,gBAAgB;AAClC,oBAAA,uEAAuE,CAAC;YAC1E,OAAO;AACR,SAAA;AACD,QAAA,IAAI,CAAC,YAAY;YACf,IAAI,CAAC,WAAW,EAAE,YAAY;AAC9B,gBAAA,kDAAkD,CAAC;QACrD,IAAI,KAAK,YAAY,iBAAiB,EAAE;AACtC,YAAA,IAAI,CAAC,yBAAyB,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;AACnD,SAAA;KACF;AAED;;;AAGG;IACK,iBAAiB,GAAA;AACvB,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC;QAC/C,IAAI,CAAC,YAAY,GAAG;AAClB,YAAA;AACE,gBAAA,EAAE,EAAE,CAAC;AACL,gBAAA,SAAS,EAAE,WAAW;AACtB,gBAAA,OAAO,EAAE,OAAO,EAAE,SAAS,IAAI,WAAW;gBAC1C,UAAU,EAAE,eAAe,CAAC,IAAI;;gBAEhC,QAAQ,EAAE,CAAC,OAAY,KAAK,CAAG,EAAA,OAAO,CAAC,SAAS,CAAE,CAAA;AACnD,aAAA;AACD,YAAA;AACE,gBAAA,EAAE,EAAE,CAAC;AACL,gBAAA,SAAS,EAAE,gBAAgB;AAC3B,gBAAA,OAAO,EAAE,OAAO,EAAE,cAAc,IAAI,iBAAiB;gBACrD,UAAU,EAAE,eAAe,CAAC,IAAI;;gBAEhC,QAAQ,EAAE,CAAC,OAAY,KAAK,CAAG,EAAA,OAAO,CAAC,cAAc,CAAE,CAAA;AACxD,aAAA;AACD,YAAA;AACE,gBAAA,EAAE,EAAE,CAAC;AACL,gBAAA,SAAS,EAAE,UAAU;AACrB,gBAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,IAAI,WAAW;gBACzC,UAAU,EAAE,eAAe,CAAC,IAAI;;gBAEhC,QAAQ,EAAE,CAAC,OAAY,KAAK,CAAG,EAAA,OAAO,CAAC,QAAQ,CAAE,CAAA;AAClD,aAAA;AACD,YAAA;AACE,gBAAA,EAAE,EAAE,CAAC;AACL,gBAAA,SAAS,EAAE,WAAW;AACtB,gBAAA,OAAO,EAAE,OAAO,EAAE,SAAS,IAAI,YAAY;gBAC3C,UAAU,EAAE,eAAe,CAAC,IAAI;;gBAEhC,QAAQ,EAAE,CAAC,OAAY,KAAK,CAAG,EAAA,OAAO,CAAC,SAAS,CAAE,CAAA;AACnD,aAAA;AACD,YAAA;AACE,gBAAA,EAAE,EAAE,CAAC;AACL,gBAAA,SAAS,EAAE,QAAQ;AACnB,gBAAA,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,QAAQ;gBACpC,UAAU,EAAE,eAAe,CAAC,IAAI;;gBAEhC,QAAQ,EAAE,CAAC,OAAY,KAAK,CAAG,EAAA,OAAO,CAAC,MAAM,CAAE,CAAA;AAChD,aAAA;AACD,YAAA;AACE,gBAAA,EAAE,EAAE,CAAC;AACL,gBAAA,SAAS,EAAE,aAAa;AACxB,gBAAA,OAAO,EAAE,OAAO,EAAE,WAAW,IAAI,cAAc;gBAC/C,UAAU,EAAE,eAAe,CAAC,IAAI;;gBAEhC,QAAQ,EAAE,CAAC,OAAY,KAAK,CAAG,EAAA,OAAO,CAAC,WAAW,CAAE,CAAA;AACrD,aAAA;SACF,CAAC;KACH;+GA7TU,4BAA4B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAG,sBAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,aAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,EAAA,EAAA,KAAA,EAAAf,IAAA,CAAA,yBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;AAA5B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,4BAA4B,EC9DzC,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,8BAAA,EAAA,MAAA,EAAA,EAAA,aAAA,EAAA,eAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,q7CA2CA,EDcY,MAAA,EAAA,CAAA,ssWAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,YAAY,mIAAE,kBAAkB,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,qBAAA,EAAA,kBAAA,EAAA,6BAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,oBAAA,EAAA,2BAAA,EAAA,iBAAA,EAAA,uBAAA,EAAA,SAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,uBAAA,EAAA,SAAA,EAAA,WAAA,EAAA,UAAA,EAAA,uBAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,2BAAA,EAAA,WAAA,EAAA,4BAAA,EAAA,qBAAA,EAAA,mBAAA,EAAA,SAAA,EAAA,uBAAA,EAAA,sBAAA,EAAA,YAAA,EAAA,WAAA,EAAA,sBAAA,EAAA,sBAAA,EAAA,4BAAA,EAAA,qBAAA,EAAA,wBAAA,EAAA,4BAAA,EAAA,yBAAA,EAAA,8BAAA,EAAA,sBAAA,EAAA,0BAAA,EAAA,wBAAA,EAAA,iBAAA,EAAA,qBAAA,EAAA,mBAAA,EAAA,oBAAA,EAAA,2BAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,sBAAA,EAAA,SAAA,EAAA,QAAA,EAAA,0BAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,gBAAA,EAAA,sBAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,YAAA,EAAA,kBAAA,EAAA,mBAAA,EAAA,4BAAA,EAAA,6BAAA,EAAA,gBAAA,EAAA,mBAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA,EAAA;;4FAK/B,4BAA4B,EAAA,UAAA,EAAA,CAAA;kBARxC,SAAS;+BACE,8BAA8B,EAAA,UAAA,EAC5B,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,kBAAkB,CAAC,EAAA,aAAA,EAG5B,iBAAiB,CAAC,IAAI,EAAA,QAAA,EAAA,q7CAAA,EAAA,MAAA,EAAA,CAAA,ssWAAA,CAAA,EAAA,CAAA;6MAK5B,aAAa,EAAA,CAAA;sBAArB,KAAK;;;AEjER;AAEA;;;;;;AAMG;IACS,kBAOX;AAPD,CAAA,UAAY,iBAAiB,EAAA;AAC3B,IAAA,iBAAA,CAAA,MAAA,CAAA,GAAA,MAAa,CAAA;AACb,IAAA,iBAAA,CAAA,UAAA,CAAA,GAAA,UAAqB,CAAA;AACrB,IAAA,iBAAA,CAAA,QAAA,CAAA,GAAA,QAAiB,CAAA;AACjB,IAAA,iBAAA,CAAA,UAAA,CAAA,GAAA,UAAqB,CAAA;AACrB,IAAA,iBAAA,CAAA,OAAA,CAAA,GAAA,OAAe,CAAA;AACf,IAAA,iBAAA,CAAA,MAAA,CAAA,GAAA,MAAa,CAAA;AACf,CAAC,EAPW,iBAAiB,KAAjB,iBAAiB,GAO5B,EAAA,CAAA,CAAA;;ACoBD;;;;;;;;;AASG;MASU,0BAA0B,CAAA;AAiBrC,IAAA,WAAA;;IAEU,aAA4B;;IAE5B,GAAsB,EAAA;QAFtB,IAAa,CAAA,aAAA,GAAb,aAAa,CAAe;QAE5B,IAAG,CAAA,GAAA,GAAH,GAAG,CAAmB;AApBhC;;;;AAIG;QACM,IAAa,CAAA,aAAA,GAAiC,IAAI,CAAC;;QAG5D,IAAS,CAAA,SAAA,GAAQ,SAAS,CAAC;QAC3B,IAAK,CAAA,KAAA,GAAG,IAAI,CAAC,SAAS,EAAE,eAAe,EAAE,iBAAiB,CAAC;QAE3D,IAAiB,CAAA,iBAAA,GAAuB,EAAE,CAAC;QAC3C,IAAS,CAAA,SAAA,GAAG,KAAK,CAAC;QAClB,IAAY,CAAA,YAAA,GAAG,EAAE,CAAC;AACD,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,OAAO,EAAQ,CAAC;KAO5C;AAEJ;;;AAGG;IACH,QAAQ,GAAA;QACN,IAAI,CAAC,aAAa,EAAE,CAAC;KACtB;IAED,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;AACrB,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;KAC1B;AAED;;;;;AAKG;IACK,aAAa,GAAA;AACnB,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC;AAClD,QAAA,IAAI,CAAC,UAAU;YAAE,OAAO;AACxB,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;AACtB,QAAA,IAAI,CAAC,aAAa;aACf,oBAAoB,CAAC,UAAU,CAAC;AAChC,aAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC9B,aAAA,SAAS,CAAC;AACT,YAAA,IAAI,EAAE,CAAC,SAAS,KAAI;gBAClB,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;AACtD,gBAAA,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;AACvB,gBAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;aAC1B;AACD,YAAA,KAAK,EAAE,CAAC,KAAK,KAAI;AACf,gBAAA,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;gBACvB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,KAAK,EAAE,YAAY,CAAC;AAC7C,gBAAA,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;AACvC,gBAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;aAC1B;AACF,SAAA,CAAC,CAAC;KACN;AAED;;;;;;AAMG;AACK,IAAA,YAAY,CAClB,SAAiC,EAAA;AAEjC,QAAA,OAAO,CAAC,SAAS,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,QAAQ,MAAM;AAC1C,YAAA,KAAK,EAAE,QAAQ,EAAE,qBAAqB,IAAI,EAAE;AAC5C,YAAA,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC;AACnC,SAAA,CAAC,CAAC,CAAC;KACL;AAED;;;;;;;AAOG;AACK,IAAA,YAAY,CAAC,QAA8B,EAAA;AACjD,QAAA,MAAM,KAAK,GAAG,QAAQ,EAAE,WAAW,CAAC;AACpC,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;AAAE,YAAA,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClD,IAAI,QAAQ,EAAE,iBAAiB,KAAK,iBAAiB,CAAC,QAAQ,IAAI,KAAK,EAAE;AACvE,YAAA,OAAO,KAAK,CAAC;AACd,SAAA;QACD,OAAO,KAAK,IAAI,EAAE,CAAC;KACpB;+GAhGU,0BAA0B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAM,aAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;mGAA1B,0BAA0B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,2BAAA,EAAA,MAAA,EAAA,EAAA,aAAA,EAAA,eAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECtDvC,wsBAYA,EAAA,MAAA,EAAA,CAAA,uvUAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDqCY,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA,EAAA;;4FAKX,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBARtC,SAAS;+BACE,2BAA2B,EAAA,UAAA,EACzB,IAAI,EACP,OAAA,EAAA,CAAC,YAAY,CAAC,EAAA,aAAA,EAGR,iBAAiB,CAAC,IAAI,EAAA,QAAA,EAAA,wsBAAA,EAAA,MAAA,EAAA,CAAA,uvUAAA,CAAA,EAAA,CAAA;iIAQ5B,aAAa,EAAA,CAAA;sBAArB,KAAK;;;AEpBR;;;;;;;;;;;;;;;;;;;AAmBG;MASU,0BAA0B,CAAA;AA4CrC,IAAA,WAAA;;IAEU,MAAiB;;IAEjB,aAA4B;;IAE5B,GAAsB;;IAEc,KAAuB,EAAA;QAN3D,IAAM,CAAA,MAAA,GAAN,MAAM,CAAW;QAEjB,IAAa,CAAA,aAAA,GAAb,aAAa,CAAe;QAE5B,IAAG,CAAA,GAAA,GAAH,GAAG,CAAmB;QAEc,IAAK,CAAA,KAAA,GAAL,KAAK,CAAkB;;QAlDrE,IAAS,CAAA,SAAA,GAAQ,SAAS,CAAC;QAC3B,IAAK,CAAA,KAAA,GAAG,IAAI,CAAC,SAAS,EAAE,eAAe,EAAE,iBAAiB,CAAC;AAEnD,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,OAAO,EAAW,CAAC;AAE1C;;;;AAIG;QACH,IAAkB,CAAA,kBAAA,GAAmB,EAAE,CAAC;QAExC,IAAO,CAAA,OAAA,GAAuB,EAAE,CAAC;QACjC,IAAS,CAAA,SAAA,GAAuB,EAAE,CAAC;QACnC,IAAY,CAAA,YAAA,GAAmC,EAAE,CAAC;;QAGlD,IAAY,CAAA,YAAA,GAAG,CAAC,CAAC;AAEjB,QAAA,IAAA,CAAA,eAAe,GAAoB;YACjC,cAAc,EAAE,IAAI,CAAC,KAAK,EAAE,eAAe,GAAG,CAAC,CAAC;AAChD,YAAA,eAAe,EAAE,IAAI,CAAC,KAAK,EAAE,eAAe;AAC5C,YAAA,YAAY,EAAE,CAAC;SAChB,CAAC;QACF,IAAS,CAAA,SAAA,GAAG,CAAC,CAAC;QACd,IAAmB,CAAA,mBAAA,GAAG,aAAa,CAAC;QACpC,IAA0B,CAAA,0BAAA,GAAsB,MAAM,CAAC;AAC/C,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,CAAC,mBAAmB,CAAC;AACpC,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,CAAC,0BAA0B,CAAC;;AAGxD,QAAA,IAAA,CAAA,YAAY,GAAiB;AAC3B,YAAA,kBAAkB,EAAE,IAAI;AACxB,YAAA,cAAc,EAAE,KAAK;AACrB,YAAA,cAAc,EAAE,KAAK;AACrB,YAAA,WAAW,EAAE,KAAK;AAClB,YAAA,YAAY,EAAE,KAAK;AACnB,YAAA,cAAc,EAAE,KAAK;SACtB,CAAC;QAEF,IAAS,CAAA,SAAA,GAAG,KAAK,CAAC;KAWd;AAEJ;;;;AAIG;IACH,QAAQ,GAAA;QACN,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAC9B,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,IAAI,CAAC,qBAAqB,EAAE,CAAC;KAC9B;AAED;;;AAGG;IACH,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzB,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;KAC1B;AAED;;;;;;;AAOG;IACK,qBAAqB,GAAA;AAC3B,QAAA,MAAM,OAAO,GACX,IAAI,CAAC,KAAK,EAAE,OAAO;AACnB,YAAA,IAAI,CAAC,aAAa,CAAC,oBAAoB,EAAE,EAAE,OAAO,CAAC;AACrD,QAAA,IAAI,CAAC,OAAO;YAAE,OAAO;AACrB,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;AACtB,QAAA,MAAM,OAAO,GAAoC;AAC/C,YAAA,OAAO,EAAE;AACP,gBAAA,mBAAmB,EAAE,EAAE;gBACvB,MAAM,EAAE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,cAAc;AAC5D,gBAAA,QAAQ,EAAE,IAAI,CAAC,eAAe,CAAC,cAAc;gBAC7C,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,aAAa,EAAE,IAAI,CAAC,aAAa;AAClC,aAAA;SACF,CAAC;AACF,QAAA,IAAI,CAAC,aAAa;AACf,aAAA,2BAA2B,CAAC,OAAO,EAAE,OAAO,CAAC;AAC7C,aAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC9B,aAAA,SAAS,CAAC;AACT,YAAA,IAAI,EAAE,CAAC,QAAQ,KAAI;gBACjB,IAAI,CAAC,YAAY,GAAG,QAAQ,EAAE,YAAY,IAAI,CAAC,CAAC;gBAChD,IAAI,CAAC,eAAe,GAAG;oBACrB,GAAG,IAAI,CAAC,eAAe;oBACvB,YAAY,EAAE,IAAI,CAAC,YAAY;iBAChC,CAAC;gBACF,IAAI,CAAC,OAAO,GAAG,CAAC,QAAQ,EAAE,IAAI,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,IAAI,KAC7C,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CACvB,CAAC;AACF,gBAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC;AAC9B,gBAAA,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;AACvB,gBAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;aAC1B;AACD,YAAA,KAAK,EAAE,CAAC,KAAK,KAAI;AACf,gBAAA,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;AAClB,gBAAA,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;AACpB,gBAAA,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;AACtB,gBAAA,IAAI,CAAC,eAAe,GAAG,EAAE,GAAG,IAAI,CAAC,eAAe,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC;AACpE,gBAAA,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;gBACvB,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AAC9C,gBAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;aAC1B;AACF,SAAA,CAAC,CAAC;KACN;AAED,IAAA,kBAAkB,CAAC,KAAgB,EAAA;AACjC,QAAA,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;QACjC,IAAI,CAAC,eAAe,GAAG;YACrB,GAAG,IAAI,CAAC,eAAe;YACvB,cAAc,EAAE,KAAK,CAAC,QAAQ;SAC/B,CAAC;QACF,IAAI,CAAC,qBAAqB,EAAE,CAAC;KAC9B;AAED,IAAA,YAAY,CAAC,KAAW,EAAA;AACtB,QAAA,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,mBAAmB,CAAC;QAC1E,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC,SAAS,IAAI,IAAI,CAAC,0BAA0B,CAAC;AACxE,QAAA,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;QACnB,IAAI,CAAC,qBAAqB,EAAE,CAAC;KAC9B;AAED;;;;;;;;;;;AAWG;AACK,IAAA,WAAW,CAAC,IAA+B,EAAA;QACjD,OAAO;YACL,UAAU,EAAE,IAAI,EAAE,UAAU;YAC5B,MAAM,EAAE,IAAI,EAAE,MAAM;YACpB,IAAI,EAAE,IAAI,EAAE,IAAI;YAChB,KAAK,EAAE,IAAI,EAAE,KAAK;AAClB,YAAA,YAAY,EAAE,CAAC,IAAI,EAAE,WAAW,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,EAAE,OAAO,CAAC;YAClE,WAAW,EAAE,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,WAAW,CAAC;AACtD,YAAA,WAAW,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM;kBAClC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,QAAQ,IAAI,IAAI;AACvC,kBAAE,IAAI;SACT,CAAC;KACH;AAED;;;;;;AAMG;AACK,IAAA,iBAAiB,CAAC,WAAmB,EAAA;AAC3C,QAAA,IAAI,CAAC,WAAW;AAAE,YAAA,OAAO,EAAE,CAAC;AAC5B,QAAA,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,WAAW,CAAC,CAAC;AACnC,QAAA,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;AAC1B,cAAE,WAAW;AACb,cAAE,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;KACtC;AAED;;;;;;AAMG;IACK,sBAAsB,GAAA;AAC5B,QAAA,MAAM,SAAS,GACb,IAAI,CAAC,KAAK,EAAE,SAAS;AACrB,YAAA,IAAI,CAAC,aAAa,CAAC,oBAAoB,EAAE,EAAE,SAAS,CAAC;AACvD,QAAA,IAAI,CAAC,SAAS;YAAE,OAAO;AACvB,QAAA,IAAI,CAAC,aAAa;aACf,iBAAiB,CAAC,SAAS,CAAC;AAC5B,aAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC9B,aAAA,SAAS,CAAC;YACT,IAAI,EAAE,MAAK;AACT,gBAAA,IAAI,CAAC,kBAAkB,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,cAAc,EAAE,IAAI,EAAE;qBACjE,GAAG,CAAC,CAAC,IAAI,MAAM,EAAE,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;gBAC7D,IAAI,CAAC,iBAAiB,EAAE,CAAC;AACzB,gBAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;aAC1B;AACD,YAAA,KAAK,EAAE,CAAC,KAAK,KAAI;AACf,gBAAA,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;aACxC;AACF,SAAA,CAAC,CAAC;KACN;AAED;;;;;;;;;AASG;AACH,IAAA,mBAAmB,CAAC,KAGnB,EAAA;AACC,QAAA,MAAM,GAAG,GAAG,KAAK,EAAE,GAAG,CAAC;AACvB,QAAA,MAAM,MAAM,GAAG,KAAK,EAAE,MAAM,CAAC;AAC7B,QAAA,MAAM,OAAO,GACX,IAAI,CAAC,KAAK,EAAE,OAAO;AACnB,YAAA,IAAI,CAAC,aAAa,CAAC,oBAAoB,EAAE,EAAE,OAAO,CAAC;AACrD,QAAA,MAAM,MAAM,GAAG,MAAM,EAAE,EAAY,CAAC;QACpC,IAAI,CAAC,GAAG,EAAE,MAAM,IAAI,CAAC,OAAO,IAAI,CAAC,MAAM;YAAE,OAAO;AAEhD,QAAA,MAAM,aAAa,GAAG,GAAG,CAAC,WAAW,CAAC;;QAEtC,GAAG,CAAC,WAAW,GAAG,MAAM,EAAE,IAAI,IAAI,GAAG,CAAC,WAAW,CAAC;AAElD,QAAA,MAAM,OAAO,GAA6B;AACxC,YAAA,OAAO,EAAE;gBACP,OAAO;gBACP,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,MAAM;AACP,aAAA;SACF,CAAC;AACF,QAAA,IAAI,CAAC,aAAa;aACf,yBAAyB,CAAC,OAAO,CAAC;AAClC,aAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC9B,aAAA,SAAS,CAAC;AACT,YAAA,KAAK,EAAE,CAAC,KAAK,KAAI;;AAEf,gBAAA,GAAG,CAAC,WAAW,GAAG,aAAa,CAAC;AAChC,gBAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;AACzB,gBAAA,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;aACxC;AACF,SAAA,CAAC,CAAC;KACN;AAED;;;;;;;;;AASG;AACH,IAAA,eAAe,CAAC,GAAqB,EAAA;QACnC,IAAI,CAAC,GAAG,EAAE,UAAU;YAAE,OAAO;AAC7B,QAAA,MAAM,aAAa,GAAG;AACpB,YAAA,OAAO,EAAE,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK;AACrC,YAAA,UAAU,EAAE,IAAI,CAAC,KAAK,EAAE,SAAS;AACjC,YAAA,YAAY,EAAE,oBAAoB;AAClC,YAAA,aAAa,EAAE,IAAI;AACnB,YAAA,kBAAkB,EAAE,0BAA0B;YAC9C,SAAS,EAAE,SAAS,CAAC,IAAI;AACzB,YAAA,qBAAqB,EAAE,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE;AACrD,YAAA,aAAa,EAAE,eAAe;SAC/B,CAAC;AACF,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE;AAC/B,YAAA,IAAI,EAAE,aAAa;AACnB,YAAA,UAAU,EAAE,CAAC,qBAAqB,EAAE,kCAAkC,CAAC;AACvE,YAAA,KAAK,EAAE,OAAO;AACd,YAAA,QAAQ,EAAE,MAAM;AAChB,YAAA,SAAS,EAAE,MAAM;AACjB,YAAA,SAAS,EAAE,IAAI;AAChB,SAAA,CAAC,CAAC;KACJ;AAED;;;;;;;AAOG;IACK,iBAAiB,GAAA;AACvB,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC;QACpC,IAAI,CAAC,YAAY,GAAG;AAClB,YAAA;AACE,gBAAA,EAAE,EAAE,CAAC;AACL,gBAAA,SAAS,EAAE,MAAM;gBACjB,OAAO,EAAE,OAAO,EAAE,IAAI;gBACtB,UAAU,EAAE,eAAe,CAAC,IAAI;AAChC,gBAAA,gBAAgB,EAAE,IAAI;;gBAEtB,QAAQ,EAAE,CAAC,GAAQ,KAAK,GAAG,CAAC,IAAI;AACjC,aAAA;AACD,YAAA;AACE,gBAAA,EAAE,EAAE,CAAC;AACL,gBAAA,SAAS,EAAE,OAAO;gBAClB,OAAO,EAAE,OAAO,EAAE,KAAK;gBACvB,UAAU,EAAE,eAAe,CAAC,IAAI;AAChC,gBAAA,gBAAgB,EAAE,IAAI;;gBAEtB,QAAQ,EAAE,CAAC,GAAQ,KAAK,GAAG,CAAC,KAAK;AAClC,aAAA;AACD,YAAA;AACE,gBAAA,EAAE,EAAE,CAAC;AACL,gBAAA,SAAS,EAAE,cAAc;gBACzB,OAAO,EAAE,OAAO,EAAE,YAAY;gBAC9B,UAAU,EAAE,eAAe,CAAC,IAAI;;AAEhC,gBAAA,QAAQ,EAAE,CAAC,GAAQ,KAAK,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC;AAC5D,aAAA;AACD,YAAA;AACE,gBAAA,EAAE,EAAE,CAAC;AACL,gBAAA,SAAS,EAAE,aAAa;gBACxB,OAAO,EAAE,OAAO,EAAE,WAAW;gBAC7B,UAAU,EAAE,eAAe,CAAC,IAAI;AAChC,gBAAA,gBAAgB,EAAE,IAAI;;gBAEtB,QAAQ,EAAE,CAAC,GAAQ,KAAK,GAAG,CAAC,WAAW;AACxC,aAAA;AACD,YAAA;AACE,gBAAA,EAAE,EAAE,CAAC;AACL,gBAAA,SAAS,EAAE,aAAa;gBACxB,OAAO,EAAE,OAAO,EAAE,WAAW;gBAC7B,UAAU,EAAE,eAAe,CAAC,QAAQ;;gBAEpC,QAAQ,EAAE,CAAC,GAAQ,KAAK,GAAG,CAAC,WAAW;gBACvC,eAAe,EAAE,IAAI,CAAC,kBAAkB;AACxC,gBAAA,mBAAmB,EAAE,IAAI,CAAC,KAAK,EAAE,sBAAsB;;gBAEvD,cAAc,EAAE,CAAC,GAAQ,KACvB,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,WAAW,CAAC;oBAC/D,IAAI;AACP,aAAA;AACD,YAAA;AACE,gBAAA,EAAE,EAAE,CAAC;AACL,gBAAA,SAAS,EAAE,MAAM;gBACjB,OAAO,EAAE,OAAO,EAAE,IAAI;gBACtB,UAAU,EAAE,eAAe,CAAC,IAAI;gBAChC,QAAQ,EAAE,MAAM,IAAI,CAAC,KAAK,EAAE,SAAS;gBACrC,SAAS,EAAE,CAAC,GAAqB,KAC/B,CAAA,EAAG,IAAI,CAAC,KAAK,EAAE,mBAAmB,CAAA,CAAA,EAAI,GAAG,EAAE,IAAI,IAAI,EAAE,CAAA,CAAE,CAAC,IAAI,EAAE;AACjE,aAAA;SACF,CAAC;KACH;AAxWU,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,0BAA0B,sGAoDf,eAAe,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;AApD1B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,0BAA0B,qFCpEvC,y2BAkBA,EAAA,MAAA,EAAA,CAAA,4vCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED6CY,YAAY,EAAE,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,kBAAkB,4iDAAkB,eAAe,EAAA,CAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA,EAAA;;4FAKhE,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBARtC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,2BAA2B,EACzB,UAAA,EAAA,IAAI,EACP,OAAA,EAAA,CAAC,YAAY,EAAE,kBAAkB,EAAE,cAAc,EAAE,eAAe,CAAC,EAG7D,aAAA,EAAA,iBAAiB,CAAC,IAAI,EAAA,QAAA,EAAA,y2BAAA,EAAA,MAAA,EAAA,CAAA,4vCAAA,CAAA,EAAA,CAAA;;0BAsDlC,QAAQ;;0BAAI,MAAM;2BAAC,eAAe,CAAA;;;AExHvC;AAEA;;;AAGG;IACS,kBAOX;AAPD,CAAA,UAAY,iBAAiB,EAAA;AAC3B,IAAA,iBAAA,CAAA,MAAA,CAAA,GAAA,MAAa,CAAA;AACb,IAAA,iBAAA,CAAA,UAAA,CAAA,GAAA,UAAqB,CAAA;AACrB,IAAA,iBAAA,CAAA,QAAA,CAAA,GAAA,QAAiB,CAAA;AACjB,IAAA,iBAAA,CAAA,UAAA,CAAA,GAAA,UAAqB,CAAA;AACrB,IAAA,iBAAA,CAAA,OAAA,CAAA,GAAA,OAAe,CAAA;AACf,IAAA,iBAAA,CAAA,MAAA,CAAA,GAAA,MAAa,CAAA;AACf,CAAC,EAPW,iBAAiB,KAAjB,iBAAiB,GAO5B,EAAA,CAAA,CAAA,CAAA;AAED;;;AAGG;AACU,MAAA,kBAAkB,GAAwB;AACrD,IAAA,iBAAiB,CAAC,MAAM;AACxB,IAAA,iBAAiB,CAAC,QAAQ;AAC1B,IAAA,iBAAiB,CAAC,KAAK;EACvB;AAEF;;AAEG;IACS,aAIX;AAJD,CAAA,UAAY,YAAY,EAAA;AACtB,IAAA,YAAA,CAAA,UAAA,CAAA,GAAA,UAAqB,CAAA;AACrB,IAAA,YAAA,CAAA,OAAA,CAAA,GAAA,OAAe,CAAA;AACf,IAAA,YAAA,CAAA,MAAA,CAAA,GAAA,MAAa,CAAA;AACf,CAAC,EAJW,YAAY,KAAZ,YAAY,GAIvB,EAAA,CAAA,CAAA,CAAA;AAmDD;;AAEG;AACI,MAAM,sBAAsB,GAAG;;AChEtC;;;;;;;;AAQG;MASU,6BAA6B,CAAA;;AA8BxC,IAAA,WAAA,CAAoB,WAAwB,EAAA;QAAxB,IAAW,CAAA,WAAA,GAAX,WAAW,CAAa;;QA5B5C,IAAS,CAAA,SAAA,GAAQI,WAAS,CAAC;QAC3B,IAAW,CAAA,WAAA,GAAG,IAAI,CAAC,SAAS,EAAE,eAAe,EAAE,YAAY,EAAE,cAAc,CAAC;QAC5E,IAAS,CAAA,SAAA,GAAG,iBAAiB,CAAC;AAC9B,QAAA,IAAA,CAAA,WAAW,GAAG;AACZ,YAAA,EAAE,KAAK,EAAE,iBAAiB,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE;AACvE,YAAA;gBACE,KAAK,EAAE,iBAAiB,CAAC,QAAQ;AACjC,gBAAA,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,QAAQ;AACzC,aAAA;AACD,YAAA;gBACE,KAAK,EAAE,iBAAiB,CAAC,MAAM;AAC/B,gBAAA,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,QAAQ;AACzC,aAAA;AACD,YAAA;gBACE,KAAK,EAAE,iBAAiB,CAAC,QAAQ;AACjC,gBAAA,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,QAAQ;AACzC,aAAA;AACD,YAAA,EAAE,KAAK,EAAE,iBAAiB,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE;AACzE,YAAA,EAAE,KAAK,EAAE,iBAAiB,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE;SACxE,CAAC;AAGQ,QAAA,IAAA,CAAA,IAAI,GAAG,IAAI,YAAY,EAAkB,CAAC;AAC1C,QAAA,IAAA,CAAA,MAAM,GAAG,IAAI,YAAY,EAAQ,CAAC;KAKI;AAEhD;;;;;AAKG;IACH,QAAQ,GAAA;QACN,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;AACjC,YAAA,KAAK,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;AAClE,YAAA,IAAI,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,IAAI,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YAC/D,QAAQ,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,IAAI,IAAI,CAAC;YAC7C,WAAW,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,IAAI,EAAE,CAAC;YAC/C,QAAQ,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,IAAI,EAAE,CAAC;AACzC,YAAA,OAAO,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AAC3D,SAAA,CAAC,CAAC;KACJ;AAED;;;;;AAKG;AACH,IAAA,kBAAkB,CAAC,WAA0C,EAAA;AAC3D,QAAA,IAAI,CAAC,WAAW;AAAE,YAAA,OAAO,EAAE,CAAC;;;AAG5B,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC;AAAE,YAAA,OAAO,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9D,IAAI;YACF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;AACvC,YAAA,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;AACvD,SAAA;QAAC,MAAM;AACN,YAAA,OAAO,EAAE,CAAC;AACX,SAAA;KACF;AAED;;;;AAIG;AACH,IAAA,IAAI,YAAY,GAAA;AACd,QAAA,OAAO,kBAAkB,CAAC,QAAQ,CAChC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,KAA0B,CACnD,CAAC;KACH;AAED;;;;;AAKG;IACH,YAAY,GAAA;AACV,QAAA,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,SAAS,CAAC,EAAE,KAAK,IAAI,EAAE,CAAW,CAAC;AAC/D,QAAA,OAAO,GAAG;aACP,KAAK,CAAC,IAAI,CAAC;aACX,GAAG,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AACxD,aAAA,MAAM,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;KAC1C;AAED;;;;;AAKG;AACH,IAAA,IAAI,cAAc,GAAA;AAChB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,EAAE,KAAe,CAAC;;;QAGvD,IAAI,IAAI,CAAC,IAAI,EAAE,OAAO,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE;AAAE,YAAA,OAAO,IAAI,CAAC;QACtD,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,IAAI,CAAC;AACvE,QAAA,OAAO,KAAK,CAAC;KACd;AAED;;;;AAIG;IACH,MAAM,GAAA;AACJ,QAAA,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC7B,IAAI,IAAI,CAAC,cAAc;YAAE,OAAO;QAChC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;AACtC,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AACb,YAAA,UAAU,EAAE,IAAI,CAAC,QAAQ,EAAE,UAAU;AACrC,YAAA,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,OAAO;AAC/B,YAAA,SAAS,EAAE,IAAI,CAAC,QAAQ,EAAE,SAAS;AACnC,YAAA,aAAa,EAAE,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE;YAClC,SAAS,EAAE,KAAK,CAAC,IAAI;YACrB,UAAU,EAAE,KAAK,CAAC,QAAQ;AAC1B,YAAA,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,IAAI,EAAE;AACtC,YAAA,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE;YAChC,OAAO,EAAE,IAAI,CAAC,YAAY;kBACtB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;AACrC,kBAAE,SAAS;AACd,SAAA,CAAC,CAAC;KACJ;AAED;;;AAGG;IACH,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;KACpB;+GA1IU,6BAA6B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAR,IAAA,CAAA,WAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;AAA7B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,6BAA6B,ECvC1C,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,+BAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,wnIAoHA,EDlFY,MAAA,EAAA,CAAA,okVAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,YAAY,+PAAE,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,8CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,cAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,4BAAA,EAAA,QAAA,EAAA,uGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,0BAAA,EAAA,QAAA,EAAA,6GAAA,EAAA,MAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,0FAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA,EAAA;;4FAKhC,6BAA6B,EAAA,UAAA,EAAA,CAAA;kBARzC,SAAS;+BACE,+BAA+B,EAAA,UAAA,EAC7B,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,mBAAmB,CAAC,EAAA,aAAA,EAG7B,iBAAiB,CAAC,IAAI,EAAA,QAAA,EAAA,wnIAAA,EAAA,MAAA,EAAA,CAAA,okVAAA,CAAA,EAAA,CAAA;oGAyB5B,QAAQ,EAAA,CAAA;sBAAhB,KAAK;gBACI,IAAI,EAAA,CAAA;sBAAb,MAAM;gBACG,MAAM,EAAA,CAAA;sBAAf,MAAM;;;AE3CT;;;;;;;;AAQG;MASU,4BAA4B,CAAA;AAOvC,IAAA,WAAA;;IAES,SAAqD;;IAE3B,IAA6B,EAAA;QAFvD,IAAS,CAAA,SAAA,GAAT,SAAS,CAA4C;QAE3B,IAAI,CAAA,IAAA,GAAJ,IAAI,CAAyB;;QAThE,IAAS,CAAA,SAAA,GAAQQ,WAAS,CAAC;QAC3B,IAAY,CAAA,YAAA,GAAG,IAAI,CAAC,SAAS,EAAE,eAAe,EAAE,YAAY,EAAE,OAAO,CAAC;QACtE,IAAQ,CAAA,QAAA,GAAG,EAAE,CAAC;QACd,IAAe,CAAA,eAAA,GAA2B,EAAE,CAAC;QAQ3C,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,SAAS,IAAI,EAAE,CAAC;;;QAG3C,IAAI,CAAC,eAAe,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,eAAe,IAAI,EAAE;aACrD,MAAM,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC;AAC1C,aAAA,GAAG,CAAC,CAAC,QAAQ,MAAM;AAClB,YAAA,UAAU,EAAE,QAAQ,CAAC,UAAU,IAAI,EAAE;YACrC,aAAa,EAAE,QAAQ,CAAC,aAAa;YACrC,SAAS,EAAE,QAAQ,CAAC,SAA8B;AAClD,YAAA,WAAW,EAAE,QAAQ,CAAC,WAAW,IAAI,IAAI;AACzC,YAAA,QAAQ,EAAE,QAAQ,CAAC,QAAQ,IAAI,IAAI;AACnC,YAAA,UAAU,EAAE,QAAQ,CAAC,UAAU,IAAI,KAAK;AACxC,YAAA,SAAS,EAAE,QAAQ,CAAC,SAAS,IAAI,IAAI;AACrC,YAAA,OAAO,EAAE,QAAQ,CAAC,OAAO,IAAI,IAAI;AAClC,SAAA,CAAC,CAAC,CAAC;KACP;AAED;;;AAGG;IACH,OAAO,GAAA;AACL,QAAA,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC;KACzB;AApCU,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,4BAA4B,8CAW7B,eAAe,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;AAXd,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,4BAA4B,wFCtCzC,uOAOA,EAAA,MAAA,EAAA,CAAA,gDAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED0BY,YAAY,EAAE,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,eAAe,+BAAE,8BAA8B,EAAA,QAAA,EAAA,gCAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,UAAA,EAAA,UAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,WAAA,EAAA,YAAA,EAAA,OAAA,EAAA,wBAAA,EAAA,iBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,mBAAA,EAAA,MAAA,EAAA,QAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA,EAAA;;4FAK5D,4BAA4B,EAAA,UAAA,EAAA,CAAA;kBARxC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,8BAA8B,EAC5B,UAAA,EAAA,IAAI,EACP,OAAA,EAAA,CAAC,YAAY,EAAE,eAAe,EAAE,8BAA8B,CAAC,EAGzD,aAAA,EAAA,iBAAiB,CAAC,IAAI,EAAA,QAAA,EAAA,uOAAA,EAAA,MAAA,EAAA,CAAA,gDAAA,CAAA,EAAA,CAAA;;0BAalC,MAAM;2BAAC,eAAe,CAAA;;;AE9B3B;;;;;;;;;;;;;;AAcG;MAIU,mBAAmB,CAAA;;AAI9B,IAAA,WAAA,CAAoB,WAAwB,EAAA;QAAxB,IAAW,CAAA,WAAA,GAAX,WAAW,CAAa;KAAI;AAEhD;;;;;;;AAOG;;AAEK,IAAA,aAAa,CAAC,QAAa,EAAA;AACjC,QAAA,MAAM,MAAM,GAAG,QAAQ,EAAE,MAAM,CAAC;AAChC,QAAA,MAAM,SAAS,GACb,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,SAAS,CAAC;QAC/D,IAAI,CAAC,SAAS,EAAE;AACd,YAAA,MAAM,QAAQ,CAAC;AAChB,SAAA;AACD,QAAA,OAAO,QAAQ,CAAC;KACjB;AAED;;;;AAIG;AACH,IAAA,aAAa,CAAC,UAAkB,EAAA;AAC9B,QAAA,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;KAC9B;AAED;;;;;AAKG;AACH,IAAA,iBAAiB,CACf,OAAe,EAAA;QAEf,OAAO,IAAI,CAAC,WAAW;aACpB,OAAO,CAAC,GAAG,IAAI,CAAC,UAAU,CAA2B,wBAAA,EAAA,OAAO,EAAE,CAAC;AAC/D,aAAA,IAAI,CACH,GAAG,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,EAC3B,UAAU,CAAC,CAAC,KAAK,KAAI;AACnB,YAAA,MAAM,KAAK,CAAC;SACb,CAAC,CACH,CAAC;KACL;AAED;;;;;;;;AAQG;AACH,IAAA,QAAQ,CAAC,WAAmB,EAAA;QAC1B,OAAO,IAAI,CAAC,WAAW;aACpB,OAAO,CACN,GAAG,IAAI,CAAC,UAAU,CAAmC,gCAAA,EAAA,WAAW,EAAE,CACnE;AACA,aAAA,IAAI,CACH,GAAG,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,EAC3B,UAAU,CAAC,CAAC,KAAK,KAAI;AACnB,YAAA,MAAM,KAAK,CAAC;SACb,CAAC,CACH,CAAC;KACL;AAED;;;;;AAKG;AACH,IAAA,kBAAkB,CAChB,MAA2B,EAAA;QAE3B,OAAO,IAAI,CAAC,WAAW;AACpB,aAAA,OAAO,CAAC,CAAG,EAAA,IAAI,CAAC,UAAU,yBAAyB,EAAE;AACpD,YAAA,OAAO,EAAE,MAAM;SAChB,CAAC;aACD,IAAI,CACH,GAAG,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,EAC/C,UAAU,CAAC,CAAC,KAAK,KAAI;AACnB,YAAA,MAAM,KAAK,CAAC;SACb,CAAC,CACH,CAAC;KACL;AAED;;;;;AAKG;AACH,IAAA,YAAY,CACV,OAAe,EAAA;QAEf,OAAO,IAAI,CAAC,WAAW;aACpB,OAAO,CAAC,GAAG,IAAI,CAAC,UAAU,CAA8B,2BAAA,EAAA,OAAO,EAAE,CAAC;AAClE,aAAA,IAAI,CACH,GAAG,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,EAC3B,UAAU,CAAC,CAAC,KAAK,KAAI;AACnB,YAAA,MAAM,KAAK,CAAC;SACb,CAAC,CACH,CAAC;KACL;AAED;;;;;AAKG;AACH,IAAA,cAAc,CACZ,QAAwB,EAAA;QAExB,OAAO,IAAI,CAAC,WAAW;AACpB,aAAA,QAAQ,CAAC,CAAG,EAAA,IAAI,CAAC,UAAU,4BAA4B,EAAE;AACxD,YAAA,OAAO,EAAE,QAAQ;SAClB,CAAC;aACD,IAAI,CACH,GAAG,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,EAC/C,UAAU,CAAC,CAAC,KAAK,KAAI;AACnB,YAAA,MAAM,KAAK,CAAC;SACb,CAAC,CACH,CAAC;KACL;AAED;;;;;AAKG;AACH,IAAA,cAAc,CACZ,QAAwB,EAAA;QAExB,OAAO,IAAI,CAAC,WAAW;AACpB,aAAA,OAAO,CAAC,CAAG,EAAA,IAAI,CAAC,UAAU,4BAA4B,EAAE;AACvD,YAAA,OAAO,EAAE,QAAQ;SAClB,CAAC;aACD,IAAI,CACH,GAAG,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,EAC/C,UAAU,CAAC,CAAC,KAAK,KAAI;AACnB,YAAA,MAAM,KAAK,CAAC;SACb,CAAC,CACH,CAAC;KACL;AAED;;;;;AAKG;AACH,IAAA,gBAAgB,CACd,cAA+B,EAAA;QAE/B,OAAO,IAAI,CAAC,WAAW;AACpB,aAAA,OAAO,CAAC,CAAG,EAAA,IAAI,CAAC,UAAU,oCAAoC,EAAE;AAC/D,YAAA,OAAO,EAAE,cAAc;SACxB,CAAC;aACD,IAAI,CACH,GAAG,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,EAC/C,UAAU,CAAC,CAAC,KAAK,KAAI;AACnB,YAAA,MAAM,KAAK,CAAC;SACb,CAAC,CACH,CAAC;KACL;AAED;;;;;AAKG;AACH,IAAA,cAAc,CACZ,UAAkB,EAAA;QAElB,OAAO,IAAI,CAAC,WAAW;aACpB,OAAO,CACN,CAAG,EAAA,IAAI,CAAC,UAAU,8BAA8B,UAAU,CAAA,OAAA,CAAS,EACnE,EAAE,CACH;aACA,IAAI,CACH,GAAG,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,EAC/C,UAAU,CAAC,CAAC,KAAK,KAAI;AACnB,YAAA,MAAM,KAAK,CAAC;SACb,CAAC,CACH,CAAC;KACL;AAED;;;;;AAKG;AACH,IAAA,WAAW,CAAC,OAAe,EAAA;QACzB,OAAO,IAAI,CAAC,WAAW;aACpB,OAAO,CACN,GAAG,IAAI,CAAC,UAAU,CAA8B,2BAAA,EAAA,OAAO,UAAU,CAClE;AACA,aAAA,IAAI,CACH,GAAG,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,EAC3B,UAAU,CAAC,CAAC,KAAK,KAAI;AACnB,YAAA,MAAM,KAAK,CAAC;SACb,CAAC,CACH,CAAC;KACL;+GAzNU,mBAAmB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAR,IAAA,CAAA,WAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;AAAnB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,mBAAmB,cAFlB,MAAM,EAAA,CAAA,CAAA,EAAA;;4FAEP,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAH/B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA,CAAA;;;ACgBD;;;;;;;;;AASG;MAeU,qBAAqB,CAAA;AAuChC,IAAA,WAAA;;IAEsB,SAAgC;;IAER,KAAgB;;IAEpD,mBAAwC;;IAExC,aAA4B;;IAE5B,YAA2B;;IAE3B,MAAiB,EAAA;QAVL,IAAS,CAAA,SAAA,GAAT,SAAS,CAAuB;QAER,IAAK,CAAA,KAAA,GAAL,KAAK,CAAW;QAEpD,IAAmB,CAAA,mBAAA,GAAnB,mBAAmB,CAAqB;QAExC,IAAa,CAAA,aAAA,GAAb,aAAa,CAAe;QAE5B,IAAY,CAAA,YAAA,GAAZ,YAAY,CAAe;QAE3B,IAAM,CAAA,MAAA,GAAN,MAAM,CAAW;;QAjD3B,IAAS,CAAA,SAAA,GAAQQ,WAAS,CAAC;QAC3B,IAAiB,CAAA,iBAAA,GAAG,IAAI,CAAC,SAAS,EAAE,eAAe,EAAE,YAAY,CAAC;AAClE,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,CAAC,iBAAiB,EAAE,aAAa,CAAC;AACtD,QAAA,IAAA,CAAA,YAAY,GAAG,IAAI,CAAC,iBAAiB,EAAE,YAAY,CAAC;AACpD,QAAA,IAAA,CAAA,kBAAkB,GAAG,IAAI,CAAC,iBAAiB,EAAE,kBAAkB,CAAC;AAChE,QAAA,IAAA,CAAA,sBAAsB,GAAG,IAAI,CAAC,iBAAiB,EAAE,sBAAsB,CAAC;AACxE,QAAA,IAAA,CAAA,qBAAqB,GAAG,IAAI,CAAC,iBAAiB,EAAE,qBAAqB,CAAC;AACtE,QAAA,IAAA,CAAA,sBAAsB,GAAG,IAAI,CAAC,iBAAiB,EAAE,sBAAsB,CAAC;AACxE,QAAA,IAAA,CAAA,4BAA4B,GAC1B,IAAI,CAAC,iBAAiB,EAAE,4BAA4B,CAAC;AACvD,QAAA,IAAA,CAAA,oBAAoB,GAAG,IAAI,CAAC,iBAAiB,EAAE,oBAAoB,CAAC;AACpE,QAAA,IAAA,CAAA,gBAAgB,GAAG,IAAI,CAAC,iBAAiB,EAAE,gBAAgB,CAAC;AAC5D,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,CAAC,iBAAiB,EAAE,WAAW,CAAC;AAClD,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,CAAC,iBAAiB,EAAE,WAAW,CAAC;AAClD,QAAA,IAAA,CAAA,gBAAgB,GAAG,IAAI,CAAC,iBAAiB,EAAE,gBAAgB,CAAC;AAC5D,QAAA,IAAA,CAAA,qBAAqB,GAAG,IAAI,CAAC,iBAAiB,EAAE,qBAAqB,CAAC;AACtE,QAAA,IAAA,CAAA,uBAAuB,GAAG,IAAI,CAAC,iBAAiB,EAAE,uBAAuB,CAAC;AAC1E,QAAA,IAAA,CAAA,eAAe,GAAG,IAAI,CAAC,iBAAiB,EAAE,eAAe,CAAC;QAC1D,IAAU,CAAA,UAAA,GAAG,IAAI,CAAC,iBAAiB,EAAE,cAAc,EAAE,KAAK,CAAC;QAC3D,IAAW,CAAA,WAAA,GAAG,IAAI,CAAC,SAAS,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,CAAC;QAC9D,IAAY,CAAA,YAAA,GAAG,IAAI,CAAC,SAAS,EAAE,eAAe,EAAE,MAAM,EAAE,OAAO,CAAC;QAGhE,IAAiB,CAAA,iBAAA,GAA0B,EAAE,CAAC;QAC9C,IAAgB,CAAA,gBAAA,GAAkB,EAAE,CAAC;;;;QAIrC,IAAa,CAAA,aAAA,GAAG,KAAK,CAAC;QACtB,IAAe,CAAA,eAAA,GAAkB,IAAI,CAAC;QACtC,IAAM,CAAA,MAAA,GAAgB,EAAE,CAAC;QAEzB,IAAe,CAAA,eAAA,GAAqB,EAAE,CAAC;QACvC,IAAiB,CAAA,iBAAA,GAAkB,IAAI,CAAC;QAChC,IAAoB,CAAA,oBAAA,GAAG,KAAK,CAAC;AAC7B,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,OAAO,EAAW,CAAC;KAetC;AAEJ;;;;AAIG;IACH,QAAQ,GAAA;QACN,IAAI,CAAC,mBAAmB,CAAC,aAAa,CAAC,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;QACvE,IAAI,CAAC,gBAAgB,GAAG;AACtB,YAAA,EAAE,EAAE,CAAC;AACL,YAAA,KAAK,EAAE,EAAE;YACT,OAAO,EAAE,IAAI,CAAC,aAAa;YAC3B,SAAS,EAAE,IAAI,CAAC,YAAY;SAC7B,CAAC;QACF,IAAI,CAAC,iBAAiB,GAAG,CACvB,IAAI,CAAC,iBAAiB,EAAE,iBAAiB,IAAI,EAAE,EAC/C,GAAG,CAAC,CAAC,KAAa,EAAE,KAAa,MAAM;YACvC,EAAE,EAAE,KAAK,GAAG,CAAC;YACb,KAAK;YACL,GAAG,EAAE,IAAI,CAAC,WAAW;AACtB,SAAA,CAAC,CAAC,CAAC;AACJ,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE;YACvB,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC5B,IAAI,CAAC,aAAa,EAAE,CAAC;AACtB,SAAA;KACF;AAED;;;;;AAKG;IACH,oBAAoB,GAAA;AAClB,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,EAAE,SAAS,CAAC;QAC1C,IAAI,CAAC,WAAW,EAAE;YAChB,IAAI,CAAC,UAAU,EAAE,CAAC;YAClB,OAAO;AACR,SAAA;AACD,QAAA,IAAI,CAAC,mBAAmB;aACrB,QAAQ,CAAC,WAAW,CAAC;AACrB,aAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC9B,aAAA,SAAS,CAAC;AACT,YAAA,IAAI,EAAE,CAAC,QAAQ,KAAI;;gBAEjB,IAAI,CAAC,MAAM,GAAG,CAAC,QAAQ,EAAE,IAAI,IAAI,EAAE,EAAE,MAAM,CACzC,CAAC,IAAI,KAAK,IAAI,CAAC,YAAY,KAAK,sBAAsB,CACvD,CAAC;gBACF,IAAI,CAAC,UAAU,EAAE,CAAC;aACnB;AACD,YAAA,KAAK,EAAE,CAAC,KAAK,KAAI;AACf,gBAAA,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;gBACxB,IAAI,CAAC,UAAU,EAAE,CAAC;aACnB;AACF,SAAA,CAAC,CAAC;KACN;AAED;;;;AAIG;IACH,UAAU,GAAA;AACR,QAAA,IAAI,CAAC,mBAAmB;AACrB,aAAA,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;AACrC,aAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC9B,aAAA,SAAS,CAAC;AACT,YAAA,IAAI,EAAE,CAAC,QAAQ,KAAI;AACjB,gBAAA,MAAM,MAAM,GAAG,QAAQ,EAAE,IAAI,CAAC;gBAC9B,IAAI,CAAC,aAAa,GAAG,MAAM,EAAE,YAAY,KAAK,YAAY,CAAC,IAAI,CAAC;gBAChE,IAAI,CAAC,gBAAgB,GAAG;oBACtB,GAAG,IAAI,CAAC,gBAAgB;oBACxB,OAAO,EAAE,IAAI,CAAC,aAAa;iBAC5B,CAAC;;AAEF,gBAAA,IAAI,CAAC,eAAe;AAClB,oBAAA,MAAM,EAAE,cAAc,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,IAAI,IAAI,CAAC;gBAC3D,IAAI,CAAC,2BAA2B,EAAE,CAAC;aACpC;YACD,KAAK,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;AAC1C,SAAA,CAAC,CAAC;KACN;AAED;;;;AAIG;IACH,2BAA2B,GAAA;AACzB,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,MAAM;YAClD,EAAE,EAAE,KAAK,CAAC,MAAM;YAChB,KAAK,EAAE,KAAK,CAAC,QAAQ;AACrB,YAAA,OAAO,EAAE,KAAK,CAAC,MAAM,KAAK,IAAI,CAAC,eAAe;AAC/C,SAAA,CAAC,CAAC,CAAC;KACL;AAED;;;AAGG;IACH,aAAa,GAAA;AACX,QAAA,IAAI,CAAC,mBAAmB;AACrB,aAAA,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;AAChC,aAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC9B,aAAA,SAAS,CAAC;AACT,YAAA,IAAI,EAAE,CAAC,QAAQ,KAAI;gBACjB,IAAI,CAAC,eAAe,GAAG,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC;aAC7C;YACD,KAAK,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;AAC1C,SAAA,CAAC,CAAC;KACN;AAED;;;;AAIG;AACH,IAAA,kBAAkB,CAAC,MAAyB,EAAA;AAC1C,QAAA,IAAI,CAAC,aAAa,GAAG,MAAM,EAAE,OAAO,CAAC;AACrC,QAAA,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;;YAEvB,IAAI,CAAC,UAAU,EAAE,CAAC;YAClB,OAAO;AACR,SAAA;;;;AAID,QAAA,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE;AACzB,YAAA,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,IAAI,IAAI,CAAC;YACtD,IAAI,CAAC,2BAA2B,EAAE,CAAC;AACpC,SAAA;QACD,IAAI,IAAI,CAAC,eAAe,EAAE;YACxB,IAAI,CAAC,UAAU,EAAE,CAAC;AACnB,SAAA;AAAM,aAAA;;;;AAIL,YAAA,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;YAC3B,IAAI,CAAC,gBAAgB,GAAG;gBACtB,GAAG,IAAI,CAAC,gBAAgB;AACxB,gBAAA,OAAO,EAAE,KAAK;aACf,CAAC;AACF,YAAA,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC;AAC7B,gBAAA,MAAM,EAAE,QAAQ;AAChB,gBAAA,OAAO,EAAE,IAAI,CAAC,iBAAiB,EAAE,eAAe;gBAChD,SAAS,EAAEM,WAAS,EAAE,KAAK;AAC3B,gBAAA,aAAa,EAAE,IAAI;AACpB,aAAA,CAAC,CAAC;AACJ,SAAA;KACF;AAED;;;;;AAKG;IACH,UAAU,GAAA;AACR,QAAA,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO;YAAE,OAAO;AACjC,QAAA,IAAI,IAAI,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,eAAe;YAAE,OAAO;AACxD,QAAA,IAAI,CAAC,mBAAmB;AACrB,aAAA,kBAAkB,CAAC;AAClB,YAAA,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO;YAC3B,YAAY,EAAE,IAAI,CAAC,aAAa;kBAC5B,YAAY,CAAC,IAAI;kBACjB,YAAY,CAAC,QAAQ;AACzB,YAAA,cAAc,EAAE,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,eAAe,GAAG,IAAI;SACjE,CAAC;AACD,aAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC9B,aAAA,SAAS,CAAC;YACT,KAAK,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;AAC1C,SAAA,CAAC,CAAC;KACN;AAED;;;;;AAKG;AACH,IAAA,uBAAuB,CAAC,MAAmB,EAAA;QACzC,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC1C,IAAI,IAAI,CAAC,aAAa,EAAE;YACtB,IAAI,CAAC,UAAU,EAAE,CAAC;AACnB,SAAA;KACF;AAED;;;;AAIG;IACH,aAAa,GAAA;QACX,IAAI,IAAI,CAAC,iBAAiB;YAAE,OAAO;QACnC,MAAM,MAAM,GAAG,CAAO,IAAA,EAAA,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;AACnC,QAAA,MAAM,WAAW,GAAmB;AAClC,YAAA,UAAU,EAAE,MAAM;AAClB,YAAA,OAAO,EAAE,IAAI,CAAC,KAAK,EAAE,OAAO;AAC5B,YAAA,aAAa,EAAE,EAAE;AACjB,YAAA,SAAS,EAAE,IAAI;AACf,YAAA,UAAU,EAAE,IAAI;AAChB,YAAA,WAAW,EAAE,EAAE;AACf,YAAA,QAAQ,EAAE,EAAE;AACZ,YAAA,OAAO,EAAE,SAAS;AAClB,YAAA,SAAS,EAAE,IAAI,CAAC,eAAe,CAAC,MAAM;SACvC,CAAC;QACF,IAAI,CAAC,eAAe,GAAG,CAAC,GAAG,IAAI,CAAC,eAAe,EAAE,WAAW,CAAC,CAAC;AAC9D,QAAA,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC;AAChC,QAAA,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC;KAClC;AAED;;;;AAIG;AACH,IAAA,cAAc,CAAC,QAAwB,EAAA;QACrC,IAAI,IAAI,CAAC,iBAAiB;YAAE,OAAO;QACnC,IAAI,CAAC,iBAAiB,GAAG,QAAQ,CAAC,UAAU,IAAI,IAAI,CAAC;AACrD,QAAA,IAAI,CAAC,oBAAoB,GAAG,KAAK,CAAC;KACnC;AAED;;;;AAIG;AACH,IAAA,cAAc,CAAC,QAAwB,EAAA;QACrC,IAAI,IAAI,CAAC,oBAAoB,EAAE;AAC7B,YAAA,MAAM,OAAO,GAAmB,EAAE,GAAG,QAAQ,EAAE,CAAC;;YAEhD,OAAO,OAAO,CAAC,UAAU,CAAC;AAC1B,YAAA,IAAI,CAAC,mBAAmB;iBACrB,cAAc,CAAC,OAAO,CAAC;AACvB,iBAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC9B,iBAAA,SAAS,CAAC;AACT,gBAAA,IAAI,EAAE,MAAM,IAAI,CAAC,kBAAkB,EAAE;gBACrC,KAAK,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;AAC1C,aAAA,CAAC,CAAC;AACN,SAAA;AAAM,aAAA;AACL,YAAA,IAAI,CAAC,mBAAmB;iBACrB,cAAc,CAAC,QAAQ,CAAC;AACxB,iBAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC9B,iBAAA,SAAS,CAAC;AACT,gBAAA,IAAI,EAAE,MAAM,IAAI,CAAC,kBAAkB,EAAE;gBACrC,KAAK,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;AAC1C,aAAA,CAAC,CAAC;AACN,SAAA;KACF;AAED;;;AAGG;IACK,kBAAkB,GAAA;AACxB,QAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;AAC9B,QAAA,IAAI,CAAC,oBAAoB,GAAG,KAAK,CAAC;QAClC,IAAI,CAAC,aAAa,EAAE,CAAC;KACtB;AAED;;;;;AAKG;AACH,IAAA,gBAAgB,CAAC,UAA8B,EAAA;QAC7C,IAAI,IAAI,CAAC,oBAAoB,EAAE;YAC7B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAChD,CAAC,QAAQ,KAAK,QAAQ,CAAC,UAAU,KAAK,UAAU,CACjD,CAAC;AACH,SAAA;AACD,QAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;AAC9B,QAAA,IAAI,CAAC,oBAAoB,GAAG,KAAK,CAAC;KACnC;AAED;;;;AAIG;AACH,IAAA,gBAAgB,CAAC,UAA8B,EAAA;AAC7C,QAAA,IAAI,CAAC,UAAU;YAAE,OAAO;;AAExB,QAAA,IAAI,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE;AACjC,YAAA,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;YAClC,OAAO;AACR,SAAA;AACD,QAAA,IAAI,CAAC,mBAAmB;aACrB,cAAc,CAAC,UAAU,CAAC;AAC1B,aAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC9B,aAAA,SAAS,CAAC;YACT,IAAI,EAAE,MAAK;AACT,gBAAA,IAAI,IAAI,CAAC,iBAAiB,KAAK,UAAU,EAAE;AACzC,oBAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;AAC9B,oBAAA,IAAI,CAAC,oBAAoB,GAAG,KAAK,CAAC;AACnC,iBAAA;gBACD,IAAI,CAAC,aAAa,EAAE,CAAC;aACtB;YACD,KAAK,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;AAC1C,SAAA,CAAC,CAAC;KACN;AAED;;;;AAIG;AACH,IAAA,kBAAkB,CAAC,KAAoC,EAAA;QACrD,MAAM,SAAS,GAAG,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC;QAC5C,eAAe,CAAC,SAAS,EAAE,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;AACpE,QAAA,IAAI,CAAC,eAAe,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,KAAK,MAAM;AACzD,YAAA,GAAG,QAAQ;AACX,YAAA,SAAS,EAAE,KAAK;AACjB,SAAA,CAAC,CAAC,CAAC;AACJ,QAAA,IAAI,CAAC,mBAAmB;AACrB,aAAA,gBAAgB,CACf,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,QAAQ,MAAM;YACtC,UAAU,EAAE,QAAQ,CAAC,UAAoB;YACzC,SAAS,EAAE,QAAQ,CAAC,SAAS;AAC9B,SAAA,CAAC,CAAC,CACJ;AACA,aAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC9B,aAAA,SAAS,CAAC;;;AAGT,YAAA,KAAK,EAAE,CAAC,KAAK,KAAI;AACf,gBAAA,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;gBACxB,IAAI,CAAC,aAAa,EAAE,CAAC;aACtB;AACF,SAAA,CAAC,CAAC;KACN;AAED;;;;;AAKG;AACH,IAAA,YAAY,CAAC,IAA8B,EAAA;AACzC,QAAA,QAAQ,IAAI;YACV,KAAK,iBAAiB,CAAC,IAAI;AACzB,gBAAA,OAAO,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC;YAC/B,KAAK,iBAAiB,CAAC,QAAQ;AAC7B,gBAAA,OAAO,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC;YACnC,KAAK,iBAAiB,CAAC,MAAM;AAC3B,gBAAA,OAAO,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC;YACnC,KAAK,iBAAiB,CAAC,QAAQ;AAC7B,gBAAA,OAAO,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC;YACnC,KAAK,iBAAiB,CAAC,KAAK;AAC1B,gBAAA,OAAO,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC;YAChC,KAAK,iBAAiB,CAAC,IAAI;AACzB,gBAAA,OAAO,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC;AAC/B,YAAA;AACE,gBAAA,OAAO,EAAE,CAAC;AACb,SAAA;KACF;AAED;;;;AAIG;;AAEH,IAAA,WAAW,CAAC,KAAU,EAAA;AACpB,QAAA,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC;AAC7B,YAAA,MAAM,EAAE,QAAQ;YAChB,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,IAAI,KAAK,EAAE,OAAO;YAChD,SAAS,EAAEA,WAAS,EAAE,KAAK;AAC3B,YAAA,aAAa,EAAE,IAAI;AACpB,SAAA,CAAC,CAAC;KACJ;AAED;;;;;AAKG;IACH,SAAS,GAAA;AACP,QAAA,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,4BAA4B,EAAE;AAC9C,YAAA,KAAK,EAAE,OAAO;AACd,YAAA,QAAQ,EAAE,MAAM;AAChB,YAAA,SAAS,EAAE,MAAM;AACjB,YAAA,UAAU,EAAE,CAAC,qBAAqB,EAAE,8BAA8B,CAAC;AACnE,YAAA,SAAS,EAAE,IAAI;AACf,YAAA,IAAI,EAAE;AACJ,gBAAA,SAAS,EAAE,IAAI,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE;gBACtC,eAAe,EAAE,IAAI,CAAC,eAAe;AACtC,aAAA;AACF,SAAA,CAAC,CAAC;KACJ;AAED;;;AAGG;IACH,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC;KACzB;AAED;;;;;;AAMG;IACH,SAAS,CAAC,KAAa,EAAE,QAA6B,EAAA;QACpD,OAAO,QAAQ,CAAC,EAAE,CAAC;KACpB;AAED;;;;;;AAMG;IACH,iBAAiB,CAAC,KAAa,EAAE,QAAwB,EAAA;QACvD,OAAO,QAAQ,CAAC,UAAoB,CAAC;KACtC;AAED;;;;AAIG;IACH,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzB,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;KAC1B;AApeU,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,qBAAqB,8DA2CV,eAAe,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,mBAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,aAAA,EAAA,EAAA,EAAA,KAAA,EAAAP,IAAA,CAAA,aAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,SAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;mGA3C1B,qBAAqB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC5ElC,o1RA8NA,EAAA,MAAA,EAAA,CAAA,g3YAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED5JI,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAI,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,WAAA,EAAA,QAAA,EAAA,8BAAA,EAAA,MAAA,EAAA,CAAA,wBAAA,EAAA,iBAAA,EAAA,wBAAA,EAAA,IAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,4BAAA,EAAA,2BAAA,EAAA,0BAAA,EAAA,+BAAA,EAAA,2BAAA,CAAA,EAAA,OAAA,EAAA,CAAA,oBAAA,EAAA,oBAAA,EAAA,mBAAA,EAAA,mBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,yBAAA,EAAA,iBAAA,EAAA,0BAAA,EAAA,qBAAA,EAAA,yBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,gBAAA,EAAA,cAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,uBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACd,oBAAoB,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,aAAA,EAAA,YAAA,EAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACpB,cAAc,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,YAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACd,6BAA6B,EAAA,QAAA,EAAA,+BAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,MAAA,EAAA,QAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA,EAAA;;4FAMpB,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAdjC,SAAS;+BACE,sBAAsB,EAAA,UAAA,EACpB,IAAI,EACP,OAAA,EAAA;wBACP,YAAY;wBACZ,cAAc;wBACd,oBAAoB;wBACpB,cAAc;wBACd,6BAA6B;qBAC9B,EAGc,aAAA,EAAA,iBAAiB,CAAC,IAAI,EAAA,QAAA,EAAA,o1RAAA,EAAA,MAAA,EAAA,CAAA,g3YAAA,CAAA,EAAA,CAAA;;0BA2ClC,QAAQ;;0BAER,QAAQ;;0BAAI,MAAM;2BAAC,eAAe,CAAA;;;AE1GvC;;;;;;;;;AASG;MASU,+BAA+B,CAAA;AAmB1C,IAAA,WAAA;;IAES,SAAwD;;IAE/B,KAAgB,EAAA;QAFzC,IAAS,CAAA,SAAA,GAAT,SAAS,CAA+C;QAE/B,IAAK,CAAA,KAAA,GAAL,KAAK,CAAW;;QArBlD,IAAS,CAAA,SAAA,GAAQL,WAAS,CAAC;AAC3B,QAAA,IAAA,CAAA,oBAAoB,GAAG,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC;AACvD,QAAA,IAAA,CAAA,OAAO,GAAG,IAAI,CAAC,oBAAoB,EAAE,OAAO,CAAC;AAC7C,QAAA,IAAA,CAAA,cAAc,GAAG,IAAI,CAAC,oBAAoB,EAAE,cAAc,CAAC;AAC3D,QAAA,IAAA,CAAA,IAAI,GAAU;AACZ,YAAA;AACE,gBAAA,EAAE,EAAE,CAAC;AACL,gBAAA,KAAK,EAAE,IAAI,CAAC,oBAAoB,EAAE,IAAI,EAAE,iBAAiB;AACzD,gBAAA,YAAY,EAAE,0BAA0B;AACzC,aAAA;AACD,YAAA;AACE,gBAAA,EAAE,EAAE,CAAC;AACL,gBAAA,KAAK,EAAE,IAAI,CAAC,oBAAoB,EAAE,IAAI,EAAE,YAAY;AACpD,gBAAA,YAAY,EAAE,qBAAqB;AACpC,aAAA;SACF,CAAC;KAOE;AAEJ;;;AAGG;IACH,OAAO,GAAA;AACL,QAAA,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC;KACzB;AAhCU,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,+BAA+B,8CAuBhC,eAAe,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;AAvBd,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,+BAA+B,2FC/B5C,yxBA0BA,EAAA,MAAA,EAAA,CAAA,ygTAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDAY,YAAY,EAAE,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,eAAe,+BAAE,aAAa,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,kBAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,MAAA,EAAA,eAAA,EAAA,yBAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,WAAA,EAAA,YAAA,EAAA,YAAA,EAAA,YAAA,EAAA,cAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA,EAAA;;4FAK3C,+BAA+B,EAAA,UAAA,EAAA,CAAA;kBAR3C,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,iCAAiC,EAC/B,UAAA,EAAA,IAAI,EACP,OAAA,EAAA,CAAC,YAAY,EAAE,eAAe,EAAE,aAAa,CAAC,EAGxC,aAAA,EAAA,iBAAiB,CAAC,IAAI,EAAA,QAAA,EAAA,yxBAAA,EAAA,MAAA,EAAA,CAAA,ygTAAA,CAAA,EAAA,CAAA;;0BAyBlC,MAAM;2BAAC,eAAe,CAAA;;;AEtD3B;IACY,mBAGX;AAHD,CAAA,UAAY,kBAAkB,EAAA;AAC5B,IAAA,kBAAA,CAAA,uBAAA,CAAA,GAAA,uBAA+C,CAAA;AAC/C,IAAA,kBAAA,CAAA,oBAAA,CAAA,GAAA,oBAAyC,CAAA;AAC3C,CAAC,EAHW,kBAAkB,KAAlB,kBAAkB,GAG7B,EAAA,CAAA,CAAA;;AC6CD;;;;;;AAMG;MAeU,sBAAsB,CAAA;AAkCjC;;;;;AAKG;AACH,IAAA,IAAI,kBAAkB,GAAA;AACpB,QAAA,OAAO,IAAI,CAAC,eAAe,KAAK,eAAe,CAAC,UAAU,CAAC;KAC5D;AAQD;;;;;AAKG;AACH,IAAA,oBAAoB,CAAC,SAAkB,EAAA;AACrC,QAAA,IAAI,CAAC,qBAAqB,GAAG,SAAS,CAAC;QACvC,IAAI,CAAC,wBAAwB,EAAE,CAAC;KACjC;AAKD,IAAA,WAAA;;IAEU,YAA2B;;IAE3B,yBAAoD;;IAErD,YAA2B;;AAE3B,IAAA,UAAsB;;QANrB,IAAY,CAAA,YAAA,GAAZ,YAAY,CAAe;QAE3B,IAAyB,CAAA,yBAAA,GAAzB,yBAAyB,CAA2B;QAErD,IAAY,CAAA,YAAA,GAAZ,YAAY,CAAe;QAE3B,IAAU,CAAA,UAAA,GAAV,UAAU,CAAY;AAvE/B,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,OAAO,EAAW,CAAC;;QAElC,IAAS,CAAA,SAAA,GAAQ,WAAW,CAAC;AAC7B,QAAA,IAAA,CAAA,kBAAkB,GAAG,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC;QACnD,IAAe,CAAA,eAAA,GAAG,IAAI,CAAC,kBAAkB,EAAE,KAAK,EAAE,eAAe,CAAC;QAClE,IAAgB,CAAA,gBAAA,GAAG,IAAI,CAAC,kBAAkB,EAAE,KAAK,EAAE,gBAAgB,CAAC;QACpE,IAAsB,CAAA,sBAAA,GAAG,KAAK,CAAC;QAC/B,IAAQ,CAAA,QAAA,GAAa,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;AAGhE,QAAA,IAAA,CAAA,iBAAiB,GAAG,SAAS,CAAC,IAAI,CAAC;QAEnC,IAAgB,CAAA,gBAAA,GAAG,IAAI,CAAC;QACxB,IAAS,CAAA,SAAA,GAAqB,EAAE,CAAC;QACjC,IAAiB,CAAA,iBAAA,GAAa,EAAE,CAAC;AACjC,QAAA,IAAA,CAAA,QAAQ,GAAa;AACnB,YAAA,KAAK,EAAE,EAAE;AACT,YAAA,IAAI,EAAE,EAAE;AACR,YAAA,MAAM,EAAE,EAAE;SACX,CAAC;QACF,IAAwB,CAAA,wBAAA,GAAG,KAAK,CAAC;QACjC,IAAe,CAAA,eAAA,GAAmB,EAAE,CAAC;QACrC,IAAW,CAAA,WAAA,GAAmB,EAAE,CAAC;QACjC,IAAa,CAAA,aAAA,GAAmB,EAAE,CAAC;QACnC,IAAiB,CAAA,iBAAA,GAAG,KAAK,CAAC;QAE1B,IAAW,CAAA,WAAA,GAAG,KAAK,CAAC;QACpB,IAAqB,CAAA,qBAAA,GAAyB,EAAE,CAAC;QACjD,IAAmB,CAAA,mBAAA,GAAmB,EAAE,CAAC;;QAEzC,IAAqB,CAAA,qBAAA,GAAa,EAAE,CAAC;AAarC;;;AAGG;QACH,IAAqB,CAAA,qBAAA,GAAG,KAAK,CAAC;AAapB,QAAA,IAAA,CAAA,kBAAkB,GAAG,IAAI,YAAY,EAAE,CAAC;AACxC,QAAA,IAAA,CAAA,UAAU,GAAG,IAAI,YAAY,EAAE,CAAC;KAWtC;AAEJ;;;AAGG;IACH,QAAQ,GAAA;QACN,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,qBAAqB,EAAE,CAAC;QAC3D,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,YAAY,CAAC,sBAAsB,EAAE,CAAC;QACtE,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAChC,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,8BAA8B,EAAE,CAAC;QACrE,IAAI,CAAC,iBAAiB,GAAG,SAAS,EAAE,iBAAiB,IAAI,KAAK,CAAC;AAC/D,QAAA,IAAI,CAAC,eAAe,GAAG,SAAS,EAAE,UAA6B,CAAC;QAChE,IAAI,CAAC,IAAI,CAAC,eAAe;AACvB,YAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC;AACpE,aAAA;AACH,YAAA,IAAI,IAAI,CAAC,eAAe,KAAK,eAAe,CAAC,UAAU,EAAE;gBACvD,IAAI,IAAI,CAAC,iBAAiB;oBAAE,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBACtD,IAAI,CAAC,cAAc,EAAE,CAAC;AACvB,aAAA;YACD,IAAI,CAAC,yBAAyB,EAAE,CAAC;AAClC,SAAA;QACD,IAAI,CAAC,YAAY,CAAC,aAAa;AAC5B,aAAA,IAAI,CAACF,WAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC9B,aAAA,SAAS,CAAC,CAAC,QAAiB,KAAI;AAC/B,YAAA,IAAI,QAAQ,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE;AACtC,gBAAA,IAAI,CAAC,UAAU,EAAE,aAAa,EAAE,aAAa,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC;AACjE,aAAA;AACH,SAAC,CAAC,CAAC;KACN;AAED;;;AAGG;IACH,yBAAyB,GAAA;QACvB,IAAI,CAAC,mBAAmB,GAAG;AACzB,YAAA,SAAS,EAAE;AACT,gBAAA;AACE,oBAAA,MAAM,EAAE,EAAE;AACV,oBAAA,QAAQ,EAAE;AACR,wBAAA;4BACE,IAAI,EAAE,eAAe,CAAC,KAAK;4BAC3B,KAAK,EAAE,IAAI,CAAC,kBAAkB,EAAE,KAAK,EAAE,KAAK,GAAG,GAAG;AAClD,4BAAA,WAAW,EAAE,cAAc;4BAC3B,oBAAoB,EAClB,IAAI,CAAC,kBAAkB,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ;AACnD,4BAAA,OAAO,EAAE,IAAI;AACb,4BAAA,cAAc,EACZ,IAAI,CAAC,kBAAkB,EAAE,WAAW,EAAE,YAAY;4BACpD,mBAAmB,EACjB,IAAI,CAAC,kBAAkB,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK;AACzD,4BAAA,UAAU,EAAE;AACV,gCAAA,UAAU,CAAC,QAAQ;AACnB,gCAAA,UAAU,CAAC,OAAO,CAAC,wBAAwB,CAAC,KAAK,CAAC;AACnD,6BAAA;4BACD,SAAS,EAAE,IAAI,CAAC,kBAAkB,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK;4BAC3D,iBAAiB,EACf,IAAI,CAAC,kBAAkB,EAAE,KAAK,EAAE,iBAAiB,EAAE,KAAK;AAC3D,yBAAA;AACF,qBAAA;AACF,iBAAA;AACF,aAAA;SACF,CAAC;KACH;AAED;;;;AAIG;AACH,IAAA,sBAAsB,CAAC,IAAiB,EAAA;AACtC,QAAA,IAAI,CAAC,wBAAwB,GAAG,KAAK,CAAC;QACtC,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,KAAK,UAAU,CAAC,KAAK,EAAE;AACxC,YAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,EAAE,YAAY,CAAC,CAAC;AAC7D,SAAA;KACF;AAED;;;;AAIG;AACH,IAAA,iBAAiB,CAAC,KAAa,EAAA;AAC7B,QAAA,IAAI,CAAC,YAAY;aACd,cAAc,CAAC,KAAK,CAAC;AACrB,aAAA,IAAI,CAACA,WAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC9B,aAAA,SAAS,CAAC;AACT,YAAA,IAAI,EAAE,CAAC,GAAG,KAAI;gBACZ,IAAI,GAAG,EAAE,MAAM,EAAE;AACf,oBAAA,IAAI,CAAC,QAAQ,GAAG,GAAG,EAAE,IAAI,CAAC;AAC1B,oBAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;AACxB,oBAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,MAAM;wBAAE,IAAI,CAAC,qBAAqB,EAAE,CAAC;;wBACnD,IAAI,CAAC,0BAA0B,EAAE,CAAC;AACxC,iBAAA;aACF;;AAED,YAAA,KAAK,EAAE,CAAC,KAAU,KAAI;AACpB,gBAAA,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;gBACzB,MAAM,UAAU,GAAG,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,CAAC;AAClD,gBAAA,IAAI,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE;AAChC,oBAAA,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;AAC9B,oBAAA,IAAI,CAAC,gBAAgB;AACnB,wBAAA,IAAI,CAAC,kBAAkB,EAAE,KAAK,EAAE,eAAe,CAAC;AAClD,oBAAA,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC;oBACnC,IACE,CAAC,IAAI,CAAC,wBAAwB;wBAC9B,EACE,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,WAAW,CAAC;4BAC9C,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,UAAU,CAAC,CAC9C,EACD;AACA,wBAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,GAAG,KAAK,CAAC;AAC5B,wBAAA,IAAI,CAAC,4BAA4B,CAC/B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAChD,CAAC;AACH,qBAAA;AAAM,yBAAA;AACL,wBAAA,IAAI,CAAC,mBAAmB,EAAE,GAAG,CAAC,WAAW,CAAC,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;AACzD,wBAAA,IAAI,CAAC,mBAAmB,EAAE,GAAG,CAAC,UAAU,CAAC,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;AACzD,qBAAA;AACD,oBAAA,IAAI,CAAC,gBAAgB,CACnB,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC,EAChC,SAAS,CAAC,KAAK,CAChB,CAAC;AACH,iBAAA;AAAM,qBAAA;AACL,oBAAA,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;AAC1B,iBAAA;aACF;AACF,SAAA,CAAC,CAAC;KACN;AAED;;;AAGG;IACH,qBAAqB,GAAA;AACnB,QAAA,MAAM,OAAO,GAAG;AACd,YAAA,OAAO,EAAE;gBACP,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,oBAAoB,EAAE,EAAE,OAAiB;AACpE,gBAAA,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAgB;AACxC,aAAA;SACF,CAAC;AACF,QAAA,IAAI,CAAC,YAAY;aACd,mBAAmB,CAAC,OAAO,CAAC;AAC5B,aAAA,IAAI,CAACA,WAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC/B,cAAE,SAAS,CAAC;YACV,IAAI,EAAE,MAAK;AACT,gBAAA,IAAI,CAAC,gBAAgB,CACnB,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC,EAChC,SAAS,CAAC,KAAK,CAChB,CAAC;AACF,gBAAA,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC;aACpC;;AAED,YAAA,KAAK,EAAE,CAAC,KAAU,KAAI;gBACpB,MAAM,UAAU,GAAG,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,CAAC;AAClD,gBAAA,IAAI,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE;oBAChC,IAAI,CAAC,0BAA0B,EAAE,CAAC;AACnC,iBAAA;;AAAM,oBAAA,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;aACjC;AACF,SAAA,CAAC,CAAC;KACN;AACD;;;AAGG;IACH,0BAA0B,GAAA;AACxB,QAAA,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;QAC9B,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,kBAAkB,EAAE,KAAK,EAAE,eAAe,CAAC;AACxE,QAAA,MAAM,0BAA0B,GAAG,IAAI,CAAC,SAAS,CAC/C,IAAI,CAAC,mBAAmB,EAAE,KAAK,CAChC,CAAC;AACF,QAAA,IAAI,CAAC,IAAI,CAAC,wBAAwB,EAAE;AAClC,YAAA,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC;AAC5B,YAAA,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC;YACnC,IAAI,CAAC,sBAAsB,EAAE,CAAC;AAC9B,YAAA,IAAI,IAAI,CAAC,eAAe,KAAK,eAAe,CAAC,UAAU,EAAE;gBACvD,IAAI,CAAC,sBAAsB,EAAE,CAAC;AAC/B,aAAA;AACF,SAAA;AAAM,aAAA;AACL,YAAA,IAAI,CAAC,4BAA4B,CAAC,0BAA0B,CAAC,CAAC;AAC9D,YAAA,IAAI,CAAC,mBAAmB;kBACpB,GAAG,CAAC,aAAa,CAAC;kBAClB,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;AACnC,YAAA,IAAI,CAAC,mBAAmB,EAAE,GAAG,CAAC,UAAU,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YACzE,IAAI,IAAI,CAAC,SAAS;AAAE,gBAAA,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AACjD,YAAA,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC,MAAK;gBAC/B,IAAI,CAAC,wBAAwB,EAAE,CAAC;aACjC,EAAE,CAAC,CAAC,CAAC;AACP,SAAA;KACF;AAED;;;;AAIG;AACH,IAAA,4BAA4B,CAAC,iBAAyB,EAAA;QACpD,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;AAClD,QAAA,IAAI,IAAI,CAAC,eAAe,KAAK,eAAe,CAAC,UAAU,EAAE;AACvD,YAAA,MAAM,UAAU,GAAG,iBAAiB,GAAG,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,GAAG,EAAE,CAAC;YAC1E,IAAI,CAAC,sBAAsB,CAAC;gBAC1B,cAAc,EAAE,UAAU,EAAE,cAAc;gBAC1C,UAAU,EAAE,UAAU,EAAE,UAAU;gBAClC,eAAe,EAAE,UAAU,EAAE,eAAe;AAC7C,aAAA,CAAC,CAAC;AACJ,SAAA;KACF;AAED;;;;AAIG;AACH,IAAA,sBAAsB,CAAC,KAAc,EAAA;QACnC,IAAI,CAAC,gBAAgB,GAAG;AACtB,YAAA,SAAS,EAAE;AACT,gBAAA;AACE,oBAAA,MAAM,EAAE,EAAE;AACV,oBAAA,QAAQ,EAAE;AACR,wBAAA;4BACE,IAAI,EAAE,eAAe,CAAC,MAAM;4BAC5B,KAAK,EAAE,IAAI,CAAC,kBAAkB,EAAE,KAAK,EAAE,KAAK,GAAG,GAAG;AAClD,4BAAA,WAAW,EAAE,aAAa;AAC1B,4BAAA,KAAK,EAAE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,QAAQ,EAAE,KAAK,GAAG,KAAK;4BACtD,UAAU,EAAE,UAAU,CAAC,QAAQ;AAC/B,4BAAA,UAAU,EAAE;AACV,gCAAA,UAAU,CAAC,QAAQ;AACnB,gCAAA,UAAU,CAAC,OAAO,CAAC,wBAAwB,CAAC,KAAK,CAAC;AACnD,6BAAA;AACD,4BAAA,cAAc,EACZ,IAAI,CAAC,kBAAkB,EAAE,WAAW,EAAE,YAAY;4BACpD,oBAAoB,EAClB,IAAI,CAAC,kBAAkB,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ;4BACnD,mBAAmB,EACjB,IAAI,CAAC,kBAAkB,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK;4BACzD,SAAS,EAAE,IAAI,CAAC,kBAAkB,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK;4BAC3D,iBAAiB,EACf,IAAI,CAAC,kBAAkB,EAAE,KAAK,EAAE,iBAAiB,EAAE,KAAK;AAC3D,yBAAA;wBACD,IAAI,IAAI,CAAC,WAAW;AAClB,8BAAE;AACE,gCAAA;oCACE,IAAI,EAAE,eAAe,CAAC,SAAS;oCAC/B,KAAK,EAAE,IAAI,CAAC,kBAAkB,EAAE,KAAK,EAAE,QAAQ,GAAG,GAAG;AACrD,oCAAA,WAAW,EAAE,UAAU;AACvB,oCAAA,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI;AAC1B,oCAAA,UAAU,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;oCACjC,oBAAoB,EAClB,IAAI,CAAC,kBAAkB,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ;AACnD,oCAAA,UAAU,EAAE,IAAI;AAChB,oCAAA,aAAa,EAAE,KAAK;oCACpB,SAAS,EACP,IAAI,CAAC,kBAAkB,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ;AACrD,oCAAA,iBAAiB,EACf,IAAI,CAAC,kBAAkB,EAAE,KAAK,EAAE,iBAAiB;AAC/C,0CAAE,QAAQ;AACf,iCAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCAsCD,IAAI,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,OAAO,CAAC;AAC9C,sCAAE;AACE,wCAAA;4CACE,IAAI,EAAE,eAAe,CAAC,KAAK;4CAC3B,KAAK,EAAE,IAAI,CAAC,kBAAkB,EAAE,KAAK,EAAE,WAAW,GAAG,GAAG;AACxD,4CAAA,WAAW,EAAE,OAAO;AACpB,4CAAA,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,WAAW,IAAI,EAAE;AACvC,4CAAA,YAAY,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW;AAC1C,4CAAA,UAAU,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;4CACjC,oBAAoB,EAClB,IAAI,CAAC,kBAAkB,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ;AACnD,4CAAA,cAAc,EACZ,IAAI,CAAC,kBAAkB,EAAE,WAAW,EAAE,WAAW;AACnD,4CAAA,SAAS,EACP,IAAI,CAAC,kBAAkB,EAAE,KAAK,EAAE,SAAS;AACvC,kDAAE,WAAW;AACjB,4CAAA,iBAAiB,EACf,IAAI,CAAC,kBAAkB,EAAE,KAAK,EAAE,iBAAiB;AAC/C,kDAAE,WAAW;AAClB,yCAAA;AACF,qCAAA;sCACD,EAAE,CAAC;;;;gCAIP,IAAI,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,SAAS,CAAC;AAChD,sCAAE;AACE,wCAAA;4CACE,IAAI,EAAE,eAAe,CAAC,SAAS;4CAC/B,KAAK,EAAE,IAAI,CAAC,kBAAkB,EAAE,KAAK,EAAE,OAAO,GAAG,GAAG;AACpD,4CAAA,WAAW,EAAE,SAAS;AACtB,4CAAA,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,OAAO,IAAI,EAAE;;;AAGnC,4CAAA,YAAY,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO;AACtC,4CAAA,UAAU,EAAE;AACV,gDAAA,UAAU,CAAC,QAAQ;AACnB,gDAAA,UAAU,CAAC,SAAS,CAClB,wBAAwB,CAAC,gBAAgB,CAC1C;AACF,6CAAA;;;4CAGD,SAAS,EAAE,wBAAwB,CAAC,gBAAgB;4CACpD,oBAAoB,EAClB,IAAI,CAAC,kBAAkB,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ;4CACnD,eAAe,EACb,IAAI,CAAC,kBAAkB,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK;AAC5C,kDAAE,eAAe;AACrB,4CAAA,cAAc,EACZ,IAAI,CAAC,kBAAkB,EAAE,WAAW,EAAE,OAAO;AAC/C,4CAAA,QAAQ,EAAE,KAAK;AACf,4CAAA,aAAa,EAAE,IAAI;4CACnB,SAAS,EACP,IAAI,CAAC,kBAAkB,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO;AACpD,4CAAA,iBAAiB,EACf,IAAI,CAAC,kBAAkB,EAAE,KAAK,EAAE,iBAAiB;AAC/C,kDAAE,OAAO;AACd,yCAAA;AACF,qCAAA;sCACD,EAAE,CAAC;AACR,6BAAA;AACH,8BAAE;AACE,gCAAA;oCACE,IAAI,EAAE,eAAe,CAAC,KAAK;oCAC3B,KAAK,EAAE,IAAI,CAAC,kBAAkB,EAAE,KAAK,EAAE,SAAS,GAAG,GAAG;AACtD,oCAAA,WAAW,EAAE,WAAW;AACxB,oCAAA,UAAU,EAAE;AACV,wCAAA,UAAU,CAAC,QAAQ;AACnB,wCAAA,UAAU,CAAC,OAAO,CAChB,wBAAwB,CAAC,eAAe,CACzC;AACF,qCAAA;oCACD,oBAAoB,EAClB,IAAI,CAAC,kBAAkB,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ;oCACnD,mBAAmB,EACjB,IAAI,CAAC,kBAAkB,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO;AAC9C,0CAAE,eAAe;oCACrB,SAAS,EACP,IAAI,CAAC,kBAAkB,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS;AACtD,oCAAA,iBAAiB,EACf,IAAI,CAAC,kBAAkB,EAAE,KAAK,EAAE,iBAAiB;AAC/C,0CAAE,SAAS;AACf,oCAAA,cAAc,EACZ,IAAI,CAAC,kBAAkB,EAAE,WAAW,EAAE,SAAS;AAClD,iCAAA;AACD,gCAAA;oCACE,IAAI,EAAE,eAAe,CAAC,KAAK;oCAC3B,KAAK,EAAE,IAAI,CAAC,kBAAkB,EAAE,KAAK,EAAE,QAAQ,GAAG,GAAG;AACrD,oCAAA,WAAW,EAAE,UAAU;AACvB,oCAAA,UAAU,EAAE;AACV,wCAAA,UAAU,CAAC,QAAQ;AACnB,wCAAA,UAAU,CAAC,OAAO,CAChB,wBAAwB,CAAC,eAAe,CACzC;AACF,qCAAA;oCACD,oBAAoB,EAClB,IAAI,CAAC,kBAAkB,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ;oCACnD,mBAAmB,EACjB,IAAI,CAAC,kBAAkB,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO;AAC9C,0CAAE,eAAe;oCACrB,SAAS,EACP,IAAI,CAAC,kBAAkB,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ;AACrD,oCAAA,iBAAiB,EACf,IAAI,CAAC,kBAAkB,EAAE,KAAK,EAAE,iBAAiB;AAC/C,0CAAE,QAAQ;AACd,oCAAA,cAAc,EACZ,IAAI,CAAC,kBAAkB,EAAE,WAAW,EAAE,QAAQ;AACjD,iCAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCAoCD,IAAI,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,OAAO,CAAC;AAC9C,sCAAE;AACE,wCAAA;4CACE,IAAI,EAAE,eAAe,CAAC,KAAK;4CAC3B,KAAK,EAAE,IAAI,CAAC,kBAAkB,EAAE,KAAK,EAAE,WAAW,GAAG,GAAG;AACxD,4CAAA,WAAW,EAAE,OAAO;AACpB,4CAAA,KAAK,EAAE,EAAE;AACT,4CAAA,UAAU,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;4CACjC,oBAAoB,EAClB,IAAI,CAAC,kBAAkB,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ;AACnD,4CAAA,cAAc,EACZ,IAAI,CAAC,kBAAkB,EAAE,WAAW,EAAE,WAAW;AACnD,4CAAA,SAAS,EACP,IAAI,CAAC,kBAAkB,EAAE,KAAK,EAAE,SAAS;AACvC,kDAAE,WAAW;AACjB,4CAAA,iBAAiB,EACf,IAAI,CAAC,kBAAkB,EAAE,KAAK,EAAE,iBAAiB;AAC/C,kDAAE,WAAW;AAClB,yCAAA;AACF,qCAAA;sCACD,EAAE,CAAC;;;gCAGP,IAAI,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,SAAS,CAAC;AAChD,sCAAE;AACE,wCAAA;4CACE,IAAI,EAAE,eAAe,CAAC,SAAS;4CAC/B,KAAK,EAAE,IAAI,CAAC,kBAAkB,EAAE,KAAK,EAAE,OAAO,GAAG,GAAG;AACpD,4CAAA,WAAW,EAAE,SAAS;AACtB,4CAAA,UAAU,EAAE;AACV,gDAAA,UAAU,CAAC,QAAQ;AACnB,gDAAA,UAAU,CAAC,SAAS,CAClB,wBAAwB,CAAC,gBAAgB,CAC1C;AACF,6CAAA;;;4CAGD,SAAS,EAAE,wBAAwB,CAAC,gBAAgB;4CACpD,oBAAoB,EAClB,IAAI,CAAC,kBAAkB,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ;4CACnD,eAAe,EACb,IAAI,CAAC,kBAAkB,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK;AAC5C,kDAAE,eAAe;AACrB,4CAAA,cAAc,EACZ,IAAI,CAAC,kBAAkB,EAAE,WAAW,EAAE,OAAO;;;;;AAK/C,4CAAA,QAAQ,EAAE,KAAK;AACf,4CAAA,aAAa,EAAE,IAAI;4CACnB,SAAS,EACP,IAAI,CAAC,kBAAkB,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO;AACpD,4CAAA,iBAAiB,EACf,IAAI,CAAC,kBAAkB,EAAE,KAAK,EAAE,iBAAiB;AAC/C,kDAAE,OAAO;AACd,yCAAA;AACF,qCAAA;sCACD,EAAE,CAAC;6BACR,CAAC;AACN,wBAAA;4BACE,IAAI,EAAE,eAAe,CAAC,QAAQ;AAC9B,4BAAA,KAAK,EACH,IAAI,CAAC,eAAe,KAAK,eAAe,CAAC,UAAU;AACjD,kCAAE,IAAI,CAAC,kBAAkB,EAAE,KAAK,EAAE,IAAI;kCACpC,IAAI,CAAC,kBAAkB,EAAE,KAAK,EAAE,IAAI,GAAG,GAAG;AAChD,4BAAA,WAAW,EAAE,OAAO;4BACpB,eAAe,EAAE,IAAI,CAAC,SAAS;AAC/B,4BAAA,oBAAoB,EAAE,CAAC;4BACvB,SAAS,EAAE,IAAI,CAAC,kBAAkB,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI;4BAC1D,iBAAiB,EACf,IAAI,CAAC,kBAAkB,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI;AACzD,4BAAA,cAAc,EACZ,IAAI,CAAC,eAAe,KAAK,eAAe,CAAC,UAAU;AACjD,kCAAE,IAAI,CAAC,kBAAkB,EAAE,WAAW;AAClC,sCAAE,uBAAuB;AAC7B,kCAAE,IAAI,CAAC,kBAAkB,EAAE,WAAW,EAAE,IAAI;4BAChD,oBAAoB,EAClB,IAAI,CAAC,kBAAkB,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ;AACnD,4BAAA,UAAU,EACR,IAAI,CAAC,eAAe,KAAK,eAAe,CAAC,UAAU;AACjD,kCAAE,EAAE;AACJ,kCAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;AAC5B,yBAAA;AACF,qBAAA;AACF,iBAAA;AACF,aAAA;SACF,CAAC;KACH;AAED;;;;;;;;AAQG;AACH,IAAA,sBAAsB,CAAC,0BAItB,EAAA;QACC,IAAI,IAAI,CAAC,iBAAiB;AACxB,YAAA,IAAI,CAAC,yBAAyB,CAC5B,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EACtD;gBACE,IAAI,EAAE,eAAe,CAAC,MAAM;gBAC5B,KAAK,EAAE,IAAI,CAAC,kBAAkB,EAAE,KAAK,EAAE,cAAc,GAAG,GAAG;AAC3D,gBAAA,WAAW,EAAE,gBAAgB;gBAC7B,eAAe,EAAE,IAAI,CAAC,eAAe;AACrC,gBAAA,KAAK,EAAE,IAAI,CAAC,eAAe,EAAE,IAAI,CAC/B,CAAC,cAAc,KACb,cAAc,CAAC,EAAE;AACjB,oBAAA,0BAA0B,EAAE,cAAc,EAAE,EAAE,CACjD;AACD,gBAAA,UAAU,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;AACjC,gBAAA,WAAW,EAAE,EAAE;AACf,gBAAA,cAAc,EAAE,IAAI,CAAC,kBAAkB,EAAE,WAAW,EAAE,cAAc;gBACpE,oBAAoB,EAClB,IAAI,CAAC,kBAAkB,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ;gBACnD,SAAS,EAAE,IAAI,CAAC,kBAAkB,EAAE,KAAK,EAAE,SAAS,EAAE,cAAc;gBACpE,iBAAiB,EACf,IAAI,CAAC,kBAAkB,EAAE,KAAK,EAAE,iBAAiB,EAAE,cAAc;AACpE,aAAA,CACF,CAAC;AACJ,QAAA,IAAI,CAAC,yBAAyB,CAC5B,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EACtD;YACE,IAAI,EAAE,eAAe,CAAC,MAAM;YAC5B,KAAK,EAAE,IAAI,CAAC,kBAAkB,EAAE,KAAK,EAAE,UAAU,GAAG,GAAG;AACvD,YAAA,WAAW,EAAE,YAAY;YACzB,eAAe,EAAE,IAAI,CAAC,WAAW;YACjC,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAC3B,CAAC,UAAU,KACT,UAAU,CAAC,EAAE,KAAK,0BAA0B,EAAE,UAAU,EAAE,EAAE,CAC/D;AACD,YAAA,UAAU,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;AACjC,YAAA,WAAW,EAAE,EAAE;AACf,YAAA,cAAc,EAAE,IAAI,CAAC,kBAAkB,EAAE,WAAW,EAAE,UAAU;YAChE,oBAAoB,EAAE,IAAI,CAAC,kBAAkB,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ;YACvE,SAAS,EAAE,IAAI,CAAC,kBAAkB,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU;YAChE,iBAAiB,EACf,IAAI,CAAC,kBAAkB,EAAE,KAAK,EAAE,iBAAiB,EAAE,UAAU;AAChE,SAAA,CACF,CAAC;;;;;;;;KAQH;AACD;;;;;AAKG;IACH,yBAAyB,CACvB,aAAqB,EACrB,WAAwB,EAAA;AAExB,QAAA,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAChD,aAAa,EACb,CAAC,EACD,WAAW,CACZ,CAAC;KACH;AAED;;;;AAIG;AACH,IAAA,eAAe,CAAC,KAAa,EAAA;AAC3B,QAAA,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC;QACrC,IAAI,KAAK,CAAC,IAAI,EAAE;YAAE,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;AAClD,aAAA;AACH,YAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,GAAG,EAAE,CAAC;AACxB,YAAA,IAAI,CAAC,mBAAmB,EAAE,GAAG,CAAC,UAAU,CAAC,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;AACxD,YAAA,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC;AACpC,SAAA;KACF;AAED;;;;AAIG;AACH,IAAA,mBAAmB,CAAC,IAAiB,EAAA;AACnC,QAAA,IAAI,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,CAAC;;;QAG5B,IAAI,IAAI,CAAC,qBAAqB,EAAE;YAC9B,OAAO;AACR,SAAA;AACD,QAAA,IACE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE,MAAM,KAAK,UAAU,EAAE,OAAO;YAC7D,IAAI,CAAC,uBAAuB,EAAE;AAC9B,YAAA,IAAI,CAAC,qBAAqB,CAAC,MAAM,GAAG,CAAC;YACvC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,UAAU,EAAE,KAAK,EACpC;AACA,YAAA,IAAI,CAAC,YAAY;AACd,iBAAA,eAAe,CAAC,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC;AAClE,iBAAA,IAAI,CAACA,WAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC9B,iBAAA,SAAS,CAAC;AACT,gBAAA,IAAI,EAAE,CAAC,GAAG,KAAI;oBACZ,IAAI,GAAG,EAAE,MAAM,EAAE;AACf,wBAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACnC,qBAAA;iBACF;;AAED,gBAAA,KAAK,EAAE,CAAC,KAAU,KAAI;AACpB,oBAAA,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;iBAC1B;AACF,aAAA,CAAC,CAAC;AACN,SAAA;KACF;AAED;;;;AAIG;AACH,IAAA,sBAAsB,CAAC,IAAiB,EAAA;AACtC,QAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACnC,IAAI,CAAC,8BAA8B,EAAE,CAAC;KACvC;AAED;;;;;;;;;AASG;IACH,8BAA8B,GAAA;AAC5B,QAAA,IACE,IAAI,CAAC,eAAe,KAAK,eAAe,CAAC,UAAU;YACnD,CAAC,IAAI,CAAC,mBAAmB;AACzB,YAAA,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EACpD;YACA,OAAO;AACR,SAAA;QACD,IAAI,CAAC,mBAAmB,CAAC,UAAU,CACjC,iBAAiB,EACjB,IAAI,WAAW,CACb,IAAI,CAAC,qBAAqB,CAAC,MAAM,GAAG,IAAI,CAAC,qBAAqB,GAAG,EAAE,EACnE;AACE,YAAA,QAAQ,EAAE,MAAM;AAChB,YAAA,UAAU,EAAE;AACV,gBAAA,gCAAgC,EAAE;gBAClC,aAAa,CACX,UAAU,CAAC,SAAS,CAClB,wBAAwB,CAAC,4BAA4B,CACtD,CACF;gBACD,aAAa,CACX,UAAU,CAAC,SAAS,CAClB,wBAAwB,CAAC,4BAA4B,CACtD,CACF;gBACD,aAAa,CACX,UAAU,CAAC,OAAO,CAChB,wBAAwB,CAAC,wBAAwB,CAClD,CACF;AACF,aAAA;AACF,SAAA,CACF,CACF,CAAC;KACH;AAED;;;;AAIG;AACH,IAAA,mBAAmB,CAAC,KAAqB,EAAA;QACvC,IAAI,KAAK,EAAE,OAAO,EAAE;YAClB,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC,KAAK,CAAC,EAAY,CAAC,CAAC;AAClD,SAAA;AAAM,aAAA;YACL,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,CACpD,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,CAAC,EAAE,CAC9B,CAAC;AACH,SAAA;;;QAGD,IAAI,CAAC,wBAAwB,EAAE,CAAC;KACjC;AACD;;;AAGG;IACH,YAAY,GAAA;AACV,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;KACxB;AACD;;;;AAIG;IACH,wBAAwB,GAAA;AACtB,QAAA,IAAI,CAAC,qBAAqB;AACxB,YAAA,IAAI,CAAC,YAAY,CAAC,wBAAwB,EAAE,IAAI,EAAE,CAAC;KACtD;AACD;;;AAGG;IACH,kBAAkB,GAAA;AAChB,QAAA,IAAI,CAAC,YAAY;AACd,aAAA,kBAAkB,EAAE;AACpB,aAAA,IAAI,CAACA,WAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC9B,aAAA,SAAS,CAAC;AACT,YAAA,IAAI,EAAE,CAAC,QAAQ,KAAI;gBACjB,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,MAAM,KAAI;AACjC,oBAAA,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC;wBACzB,EAAE,EAAE,MAAM,CAAC,gBAAgB;wBAC3B,IAAI,EAAE,MAAM,CAAC,kBAAkB;AAChC,qBAAA,CAAC,CAAC;AACL,iBAAC,CAAC,CAAC;gBACH,IAAI,CAAC,wBAAwB,CAC3B,gBAAgB,EAChB,iBAAiB,EACjB,IAAI,CAAC,eAAe,CACrB,CAAC;aACH;;AAED,YAAA,KAAK,EAAE,CAAC,KAAU,KAAI;AACpB,gBAAA,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;aAC1B;AACF,SAAA,CAAC,CAAC;KACN;AACD;;;AAGG;IACH,cAAc,GAAA;QACZ,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,cAAc,EAAE,CAAC;AACvD,QAAA,WAAW,EAAE,OAAO,CAAC,CAAC,MAAM,KAAI;AAC9B,YAAA,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC;gBACrB,EAAE,EAAE,MAAM,CAAC,MAAM;gBACjB,IAAI,EAAE,MAAM,CAAC,QAAQ;AACtB,aAAA,CAAC,CAAC;AACL,SAAC,CAAC,CAAC;QACH,IAAI,CAAC,wBAAwB,CAC3B,YAAY,EACZ,iBAAiB,EACjB,IAAI,CAAC,WAAW,CACjB,CAAC;KACH;AACD;;;;AAIG;AACH,IAAA,gBAAgB,CAAC,OAAe,EAAA;AAC9B,QAAA,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;AACxB,QAAA,OAAO,GAAG,OAAO,EAAE,SAAS,EAAE,CAAC;AAC/B,QAAA,IAAI,CAAC,OAAO;YAAE,OAAO;AACrB,QAAA,MAAM,iBAAiB,GAA+B;AACpD,YAAA,OAAO,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE;SAC9B,CAAC;AACF,QAAA,IAAI,CAAC,YAAY;aACd,gBAAgB,CAAC,iBAAiB,CAAC;AACnC,aAAA,IAAI,CAACA,WAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC9B,aAAA,SAAS,CAAC;AACT,YAAA,IAAI,EAAE,CAAC,QAAQ,KAAI;AACjB,gBAAA,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;gBACxB,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,MAAM,KAAI;AACjC,oBAAA,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC;wBACvB,EAAE,EAAE,MAAM,CAAC,KAAK;wBAChB,IAAI,EAAE,MAAM,CAAC,OAAO;AACrB,qBAAA,CAAC,CAAC;AACL,iBAAC,CAAC,CAAC;;;gBAGH,IAAI,CAAC,aAAa,GAAG,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC;aAC9C;;AAED,YAAA,KAAK,EAAE,CAAC,KAAU,KAAI;AACpB,gBAAA,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;aAC1B;AACF,SAAA,CAAC,CAAC;KACN;AACD;;;;;;AAMG;AACH,IAAA,wBAAwB,CACtB,eAAuB,EACvB,wBAAgC,EAChC,OAAuB,EAAA;QAEvB,MAAM,UAAU,GAAG,IAAI,CAAC,oBAAoB,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;AACpE,QAAA,UAAU,EAAE,OAAO,CAAC,CAAC,SAAS,KAAI;YAChC,IACE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW;gBACjD,eAAe;AACjB,gBAAA,SAAS,EAAE,SAAS,EAAE,QAAQ,GAAG,wBAAwB,CAAC;gBAE1D,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,wBAAwB,CAAC,GAAG,OAAO,CAAC;AACrE,SAAC,CAAC,CAAC;KACJ;AAED;;;;AAIG;;AAEH,IAAA,YAAY,CAAC,KAAU,EAAA;QACrB,MAAM,UAAU,GAAG,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,CAAC;AAClD,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE;AACtD,YAAA,IAAI,UAAU,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE;gBAC5B,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;AACrE,gBAAA,IAAI,CAAC,gBAAgB,CACnB,YAAY,EACZ,SAAS,CAAC,KAAK,EACf,UAAU,CAAC,CAAC,CAAC,KAAK,MAAM,CACzB,CAAC;AACH,aAAA;AACF,SAAA;AAAM,aAAA,IAAI,KAAK,IAAI,KAAK,YAAY,iBAAiB,EAAE;AACtD,YAAA,IAAI,CAAC,yBAAyB,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;AACnD,SAAA;KACF;AACD;;;;AAIG;AACH,IAAA,mBAAmB,CAAC,IAAiB,EAAA;AACnC,QAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACnC,IAAI,CAAC,wBAAwB,EAAE,CAAC;KACjC;AAED;;;;AAIG;IACH,uBAAuB,GAAA;AACrB,QAAA,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,QAAQ,EAAE;AACvC,YAAA,OAAO,KAAK,CAAC;AACd,SAAA;QACD,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC;cACjD,MAAM,CAAC,CAAC,WAAW,KAAK,WAAW,KAAK,iBAAiB,CAAC;AAC3D,aAAA,KAAK,CACJ,CAAC,WAAW,KACV,IAAI,CAAC,mBAAmB,EAAE,GAAG,CAAC,WAAW,CAAC,EAAE,MAAM;YAClD,UAAU,EAAE,KAAK,CACpB,CAAC;KACL;AACD;;;;;;;;;;;;;;;AAeG;IACH,wBAAwB,GAAA;QACtB,IAAI,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,sBAAsB,CACvD,IAAI,CAAC,eAAe,EACpB,IAAI,CAAC,mBAAmB,EAAE,MAAM,EAChC,IAAI,CAAC,iBAAiB,CACvB,CAAC;;;;;AAMF,QAAA,IACE,IAAI,CAAC,eAAe,KAAK,eAAe,CAAC,UAAU;YACnD,IAAI,CAAC,mBAAmB,EAAE,GAAG,CAAC,iBAAiB,CAAC,EAAE,MAAM;AACtD,gBAAA,UAAU,EAAE,OAAO;YACrB,IAAI,CAAC,uBAAuB,EAAE;AAC9B,YAAA,IAAI,CAAC,qBAAqB,EAAE,MAAM,GAAG,CAAC,EACtC;YACA,UAAU,GAAG,KAAK,CAAC;AACpB,SAAA;;;QAID,IAAI,IAAI,CAAC,qBAAqB,EAAE;YAC9B,UAAU,GAAG,IAAI,CAAC;AACnB,SAAA;AAED,QAAA,IAAI,CAAC,sBAAsB,GAAG,UAAU,CAAC;KAC1C;AAED;;;;;AAKG;IACH,oBAAoB;;IAElB,QAAa,EAAA;AAEb,QAAA,IAAI,OAAoE,CAAC;AACzE,QAAA,IAAI,IAAI,CAAC,eAAe,KAAK,eAAe,CAAC,UAAU,EAAE;YACvD,MAAM,gBAAgB,GAAG,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC,MAAM,KAAI;gBACjE,OAAO;oBACL,KAAK,EAAE,MAAM,CAAC,EAAY;oBAC1B,OAAO,EAAE,MAAM,CAAC,IAAI;iBACrB,CAAC;AACJ,aAAC,CAAC,CAAC;AACH,YAAA,OAAO,GAAG;AACR,gBAAA,OAAO,EAAE;oBACP,KAAK,EAAE,IAAI,CAAC,WAAW;AACrB,0BAAE,IAAI,CAAC,QAAQ,EAAE,KAAK;0BACpB,QAAQ,EAAE,WAAW;oBACzB,KAAK,EAAE,IAAI,CAAC,iBAAiB;AAC7B,oBAAA,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,iBAAiB,EAAE,OAAiB;AAC/D,oBAAA,aAAa,EAAE,gBAAgB;AAChC,iBAAA;aACF,CAAC;YACF,IAAI,IAAI,CAAC,iBAAiB;AACxB,gBAAA,OAAO,CAAC,OAAO,CAAC,cAAc,GAAG;oBAC/B,gBAAgB,EAAE,QAAQ,EAAE,cAAc;AACxC,0BAAE,QAAQ,EAAE,cAAc,EAAE,EAAE;AAC9B,0BAAE,EAAE;iBACP,CAAC;YACJ,IACE,QAAQ,EAAE,UAAU;AACpB,gBAAA,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,QAAQ,EAAE,UAAU,EAAE,EAAE,CAAC;AAE1D,gBAAA,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;AACzD,SAAA;;AACC,YAAA,OAAO,GAAG;AACR,gBAAA,OAAO,EAAE;oBACP,KAAK,EAAE,IAAI,CAAC,WAAW;AACrB,0BAAE,IAAI,CAAC,QAAQ,EAAE,KAAK;0BACpB,QAAQ,EAAE,WAAW;oBACzB,KAAK,EAAE,IAAI,CAAC,iBAAiB;AAC7B,oBAAA,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,iBAAiB,EAAE,OAAiB;AAChE,iBAAA;aACF,CAAC;QACJ,IAAI,IAAI,CAAC,WAAW,EAAE;YACpB,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC;AAChD,SAAA;AAAM,aAAA;YACL,OAAO,CAAC,OAAO,CAAC,SAAS,GAAG,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;YACxD,OAAO,CAAC,OAAO,CAAC,QAAQ,GAAG,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AACvD,SAAA;;AAED,QAAA,IAAI,CAAC,6BAA6B,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;AACtD,QAAA,OAAO,OAAO,CAAC;KAChB;AAED;;;;;;;;AAQG;AACH,IAAA,6BAA6B,CAC3B,OAAoE;;IAEpE,QAAa,EAAA;;;;;;;;QASb,MAAM,WAAW,GAAG,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QAC5C,MAAM,OAAO,GAAG,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC1C,QAAA,IAAI,WAAW,EAAE;AACf,YAAA,OAAO,CAAC,OAAO,CAAC,WAAW,GAAG,WAAW,CAAC;;;AAG3C,SAAA;AACD,QAAA,IAAI,OAAO;AAAE,YAAA,OAAO,CAAC,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC;KAChD;AAED;;;AAGG;IACH,mBAAmB,GAAA;AACjB,QAAA,IAAI,IAAI,CAAC,qBAAqB,CAAC,MAAM,KAAK,CAAC,EAAE;YAC3C,IAAI,CAAC,wBAAwB,CAC3B,iBAAiB,EACjB,gCAAgC,EAChC,EAAE,CACH,CAAC;AACF,YAAA,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC;AACpC,SAAA;KACF;AAED;;;;;;AAMG;AACH,IAAA,gBAAgB,CACd,OAA0B,EAC1B,SAAoB,EACpB,aAAuB,EAAA;AAEvB,QAAA,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC;AAC7B,YAAA,MAAM,EAAE,QAAQ;AAChB,YAAA,OAAO,EAAE,OAAO;AAChB,YAAA,SAAS,EAAE,SAAS;AACpB,YAAA,aAAa,EAAE,IAAI;YACnB,aAAa,EAAE,aAAa,IAAI,KAAK;AACtC,SAAA,CAAC,CAAC;KACJ;AAED;;;;AAIG;AACH,IAAA,wBAAwB,CAAC,WAAiC,EAAA;AACxD,QAAA,IAAI,CAAC,qBAAqB,GAAG,WAAW,CAAC;;;AAGzC,QAAA,IAAI,CAAC,mBAAmB;cACpB,GAAG,CAAC,iBAAiB,CAAC;AACxB,cAAE,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,WAAW,GAAG,EAAE,CAAC,CAAC;;;QAGrD,IAAI,CAAC,wBAAwB,EAAE,CAAC;KACjC;AAED;;;AAGG;IACH,WAAW,GAAA;QACT,IAAI,IAAI,CAAC,QAAQ,EAAE;AACjB,YAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzB,YAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;YAC5B,IAAI,IAAI,CAAC,SAAS;AAAE,gBAAA,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AAClD,SAAA;KACF;+GAvpCU,sBAAsB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAH,aAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,IAAA,CAAA,yBAAA,EAAA,EAAA,EAAA,KAAA,EAAAA,IAAA,CAAA,aAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;AAAtB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,sBAAsB,EAFtB,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,OAAA,EAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,YAAA,EAAA,EAAA,SAAA,EAAA,CAAC,aAAa,CAAC,gFA8Df,oBAAoB,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EClIjC,w9EAsDA,EAAA,MAAA,EAAA,CAAA,wzbAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDMI,YAAY,EACZ,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,oBAAoB,EACpB,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,iBAAA,EAAA,wBAAA,EAAA,sBAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,mBAAA,EAAA,kCAAA,EAAA,6BAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,EAAA,YAAA,EAAA,WAAA,EAAA,uBAAA,EAAA,iBAAA,EAAA,qBAAA,EAAA,gBAAA,EAAA,uBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,mBAAA,EAAA,wBAAA,EAAA,kCAAA,EAAA,4BAAA,EAAA,sBAAA,EAAA,uBAAA,EAAA,cAAA,EAAA,kBAAA,EAAA,sBAAA,EAAA,uBAAA,EAAA,gBAAA,EAAA,sBAAA,EAAA,uBAAA,EAAA,yBAAA,EAAA,gBAAA,EAAA,mCAAA,EAAA,6CAAA,EAAA,wCAAA,EAAA,iCAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,eAAe,+BACf,uBAAuB,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,aAAA,EAAA,gBAAA,EAAA,WAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,eAAA,EAAA,iBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,iBAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA,EAAA;;4FAOd,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAdlC,SAAS;+BACE,wBAAwB,EAAA,UAAA,EACtB,IAAI,EACP,OAAA,EAAA;wBACP,YAAY;wBACZ,oBAAoB;wBACpB,eAAe;wBACf,uBAAuB;AACxB,qBAAA,EAAA,aAAA,EAGc,iBAAiB,CAAC,IAAI,EAC1B,SAAA,EAAA,CAAC,aAAa,CAAC,EAAA,QAAA,EAAA,w9EAAA,EAAA,MAAA,EAAA,CAAA,wzbAAA,CAAA,EAAA,CAAA;kMA8DO,oBAAoB,EAAA,CAAA;sBAApD,SAAS;uBAAC,oBAAoB,CAAA;gBACrB,kBAAkB,EAAA,CAAA;sBAA3B,MAAM;gBACG,UAAU,EAAA,CAAA;sBAAnB,MAAM;;;AEpIT;IACY,WAIX;AAJD,CAAA,UAAY,UAAU,EAAA;AACpB,IAAA,UAAA,CAAA,MAAA,CAAA,GAAA,MAAa,CAAA;AACb,IAAA,UAAA,CAAA,aAAA,CAAA,GAAA,aAA2B,CAAA;AAC3B,IAAA,UAAA,CAAA,gBAAA,CAAA,GAAA,gBAAiC,CAAA;AACnC,CAAC,EAJW,UAAU,KAAV,UAAU,GAIrB,EAAA,CAAA,CAAA;;ACLD;IACY,2BAUX;AAVD,CAAA,UAAY,0BAA0B,EAAA;AACpC,IAAA,0BAAA,CAAA,MAAA,CAAA,GAAA,MAAa,CAAA;AACb,IAAA,0BAAA,CAAA,OAAA,CAAA,GAAA,OAAe,CAAA;AACf,IAAA,0BAAA,CAAA,MAAA,CAAA,GAAA,MAAa,CAAA;AACb,IAAA,0BAAA,CAAA,UAAA,CAAA,GAAA,UAAqB,CAAA;AACrB,IAAA,0BAAA,CAAA,gBAAA,CAAA,GAAA,gBAAiC,CAAA;AACjC,IAAA,0BAAA,CAAA,cAAA,CAAA,GAAA,UAAyB,CAAA;AACzB,IAAA,0BAAA,CAAA,aAAA,CAAA,GAAA,YAA0B,CAAA;AAC1B,IAAA,0BAAA,CAAA,cAAA,CAAA,GAAA,cAA6B,CAAA;AAC7B,IAAA,0BAAA,CAAA,SAAA,CAAA,GAAA,SAAmB,CAAA;AACrB,CAAC,EAVW,0BAA0B,KAA1B,0BAA0B,GAUrC,EAAA,CAAA,CAAA;;ACOD;;;;;;;;;;;;;;;;AAgBG;MAIU,mBAAmB,CAAA;AAqC9B,IAAA,WAAA;;IAEU,UAAsB;;IAEtB,MAAiB;;IAEjB,YAA2B,EAAA;QAJ3B,IAAU,CAAA,UAAA,GAAV,UAAU,CAAY;QAEtB,IAAM,CAAA,MAAA,GAAN,MAAM,CAAW;QAEjB,IAAY,CAAA,YAAA,GAAZ,YAAY,CAAe;;QAzC7B,IAAS,CAAA,SAAA,GAAQ,WAAW,CAAC;AAE7B,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,OAAO,EAAW,CAAC;;AAGlC,QAAA,IAAA,CAAA,qBAAqB,GAAG,IAAI,eAAe,CAAU,KAAK,CAAC,CAAC;AACpE,QAAA,IAAA,CAAA,cAAc,GAAG,IAAI,CAAC,qBAAqB,CAAC,YAAY,EAAE,CAAC;;AAGnD,QAAA,IAAA,CAAA,0BAA0B,GAAG,IAAI,eAAe,CAAU,KAAK,CAAC,CAAC;AACzE,QAAA,IAAA,CAAA,mBAAmB,GAAG,IAAI,CAAC,0BAA0B,CAAC,YAAY,EAAE,CAAC;;AAGrE,QAAA,IAAA,CAAA,mBAAmB,GAAyB;AAC1C,YAAA;AACE,gBAAA,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,GAAG,EAAE,KAAK,IAAI,KAAK;gBACvE,KAAK,EAAE,YAAY,CAAC,GAAG;AACvB,gBAAA,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,GAAG,EAAE,SAAS,IAAI,sBAAsB;AACjG,aAAA;AACD,YAAA;AACE,gBAAA,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,IAAI,OAAO;gBAC3E,KAAK,EAAE,YAAY,CAAC,KAAK;AACzB,gBAAA,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,KAAK,EAAE,SAAS,IAAI,wBAAwB;AACrG,aAAA;SACF,CAAC;;AAGF,QAAA,IAAA,CAAA,qBAAqB,GAA2B;AAC9C,YAAA,GAAG,EAAE,IAAI,CAAC,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,GAAG,EAAE,QAAQ,IAAI,sBAAsB;AACzF,YAAA,GAAG,EAAE,IAAI,CAAC,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,KAAK,EAAE,QAAQ,IAAI,kBAAkB;SACxF,CAAC;;QAGF,IAAY,CAAA,YAAA,GAAG,IAAI,CAAC,SAAS,EAAE,YAAY,EAAE,YAAY,IAAI,2CAA2C,CAAC;KASrG;AAEJ;;;;AAIG;AACH,IAAA,aAAa,CAAC,GAAW,EAAA;AACvB,QAAA,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC;KACvB;AAED;;;;AAIG;IACH,aAAa,GAAA;AACX,QAAA,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,QAAQ,EAAE,CAAC,CAAC;KACzE;AAED;;;AAGG;IACH,YAAY,GAAA;AACV,QAAA,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;KACxC;AAED;;;;;;;;AAQG;AACH,IAAA,gBAAgB,CAAC,MAAoB,EAAE,OAAe,EAAE,SAAiB,EAAA;QACvE,IAAI,CAAC,YAAY,EAAE,CAAC;AAEpB,QAAA,MAAM,UAAU,GAAiC;YAC/C,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,KAAK,IAAI,iCAAiC;YAC7F,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,QAAQ,IAAI,gOAAgO;YAClS,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,SAAS,IAAI,2DAA2D;YAC/H,cAAc,EAAE,IAAI,CAAC,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,cAAc,IAAI,4BAA4B;YAC1G,WAAW,EAAE,IAAI,CAAC,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,IAAI,QAAQ;YAChF,YAAY,EAAE,IAAI,CAAC,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,IAAI,SAAS;SACpF,CAAC;QAEF,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,iCAAiC,EAAE;AACpE,YAAA,IAAI,EAAE,UAAU;AAChB,YAAA,KAAK,EAAE,OAAO;YACd,UAAU,EAAE,CAAC,sBAAsB,CAAC;AACrC,SAAA,CAAC,CAAC;QAEH,SAAS,CAAC,WAAW,EAAE;AACpB,aAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC9B,aAAA,SAAS,CAAC,CAAC,SAAkB,KAAI;AAChC,YAAA,IAAI,SAAS,EAAE;gBACb,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;AAC9C,aAAA;AACH,SAAC,CAAC,CAAC;KACN;AAED;;;;;;;;;;;;;;;;;;AAkBG;AACK,IAAA,WAAW,CAAC,MAAoB,EAAE,OAAe,EAAE,SAAiB,EAAA;;AAE1E,QAAA,MAAM,kBAAkB,GAAI,MAAc,CAAC,kBAAkB,CAAC;AAE9D,QAAA,IAAI,OAAO,kBAAkB,KAAK,UAAU,EAAE;;YAE5C,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;YACrD,OAAO;AACR,SAAA;AAED,QAAA,MAAM,QAAQ,GAAG,MAAM,KAAK,YAAY,CAAC,GAAG;AAC1C,cAAE,UAAU;cACV,mEAAmE,CAAC;AACxE,QAAA,MAAM,SAAS,GAAG,MAAM,KAAK,YAAY,CAAC,GAAG,GAAG,MAAM,GAAG,OAAO,CAAC;QACjE,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;;AAG5D,QAAA,kBAAkB,CAAC;YACjB,aAAa;AACb,YAAA,KAAK,EAAE;AACL,gBAAA;AACE,oBAAA,WAAW,EAAE,MAAM,KAAK,YAAY,CAAC,GAAG,GAAG,UAAU,GAAG,YAAY;oBACpE,MAAM,EAAE,EAAE,CAAC,QAAQ,GAAG,CAAC,SAAS,CAAC,EAAE;AACpC,iBAAA;AACF,aAAA;SACF,CAAC;;AAEC,aAAA,IAAI,CAAC,CAAC,MAAW,KAAI;YACpB,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;AACzD,SAAC,CAAC;AACD,aAAA,KAAK,CAAC,CAAC,KAAc,KAAI;;YAExB,IAAI,KAAK,YAAY,YAAY,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE;gBAChE,OAAO;AACR,aAAA;;YAED,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;AACvD,SAAC,CAAC,CAAC;KACN;AAED;;;;;;;;;;;AAWG;;AAEK,IAAA,aAAa,CAAC,MAAoB,EAAE,OAAe,EAAE,SAAiB,EAAE,UAAe,EAAA;AAC7F,QAAA,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;;;;AAK3C,QAAA,MAAM,WAAW,GAAG,MAAM,KAAK,YAAY,CAAC,GAAG,GAAG,KAAK,GAAG,MAAM,CAAC;AACjE,QAAA,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC,GAAG,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QAC3D,MAAM,GAAG,GAAG,CAAA,EAAG,IAAI,CAAC,eAAe,EAAE,CAAA,sBAAA,EAAyB,OAAO,CAAA,CAAE,CAAC;AAExE,QAAA,IAAI,CAAC,UAAU;aACZ,GAAG,CAAC,GAAG,EAAE;YACR,MAAM;AACN,YAAA,YAAY,EAAE,MAAM;AACpB,YAAA,OAAO,EAAE,UAAU;SACpB,CAAC;AACD,aAAA,IAAI,CACHG,KAAG,CAAC,CAAC,QAA4B,KAAI;AACnC,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,2BAA2B,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;YAC/E,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAY,EAAE,QAAQ,EAAE,CAAC;AACnD,SAAC,CAAC,EACFG,YAAU,CAAC,MAAK;AACd,YAAA,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC5C,YAAA,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC;AAC5B,gBAAA,MAAM,EAAE,QAAQ;gBAChB,OAAO,EAAE,IAAI,CAAC,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,IAAI,4CAA4C;gBAC7G,SAAS,EAAE,SAAS,CAAC,KAAK;AAC1B,gBAAA,aAAa,EAAE,IAAI;AACpB,aAAA,CAAC,CAAC;;;;AAIH,YAAA,OAAO,KAAK,CAAC;SACd,CAAC,EACF,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CACzB;AACA,aAAA,SAAS,CAAC;AACT,YAAA,IAAI,EAAE,CAAC,MAAM,KAAI;;;AAGf,gBAAA,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC;AAChE,qBAAA,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,KAAI;AAClB,oBAAA,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC5C,oBAAA,IAAI,KAAK,EAAE;AACT,wBAAA,IAAI,CAAC,oCAAoC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AAC5D,qBAAA;AACH,iBAAC,CAAC;qBACD,KAAK,CAAC,MAAK;AACV,oBAAA,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC5C,oBAAA,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC;AAC5B,wBAAA,MAAM,EAAE,QAAQ;wBAChB,OAAO,EAAE,IAAI,CAAC,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,IAAI,4CAA4C;wBAC7G,SAAS,EAAE,SAAS,CAAC,KAAK;AAC1B,wBAAA,aAAa,EAAE,IAAI;AACpB,qBAAA,CAAC,CAAC;AACL,iBAAC,CAAC,CAAC;aACN;AACF,SAAA,CAAC,CAAC;KACN;AAED;;;;AAIG;AACK,IAAA,oCAAoC,CAAC,QAAgB,EAAA;AAC3D,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,OAAO,IAAI,uCAAuC,CAAC;AACvH,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,IAAI,OAAO,CAAC;AAEvF,QAAA,MAAM,UAAU,GAA4B;AAC1C,YAAA,OAAO,EAAE,cAAc;YACvB,QAAQ;YACR,UAAU;SACX,CAAC;AAEF,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,4BAA4B,EAAE;AAC7C,YAAA,IAAI,EAAE,UAAU;AAChB,YAAA,KAAK,EAAE,OAAO;YACd,UAAU,EAAE,CAAC,oCAAoC,CAAC;AAClD,YAAA,SAAS,EAAE,KAAK;AACjB,SAAA,CAAC,CAAC;KACJ;AAED;;;;AAIG;IACK,eAAe,GAAA;AACrB,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;AACpB,YAAA,MAAM,IAAI,KAAK,CAAC,gFAAgF,CAAC,CAAC;AACnG,SAAA;;;;;QAKD,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;KAC5C;AAED;;;;;;;;AAQG;AACK,IAAA,2BAA2B,CAAC,QAA4B,EAAE,MAAoB,EAAE,SAAiB,EAAA;QACvG,MAAM,kBAAkB,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;AACvE,QAAA,IAAI,kBAAkB,EAAE;YACtB,MAAM,aAAa,GAAG,kBAAkB,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;AACvE,YAAA,IAAI,aAAa,IAAI,aAAa,CAAC,CAAC,CAAC,EAAE;AACrC,gBAAA,OAAO,aAAa,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AACzE,aAAA;AACF,SAAA;QACD,OAAO,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;KAC9C;AAED;;;;;;;AAOG;IACH,aAAa,CAAC,SAAiB,EAAE,MAAoB,EAAA;QACnD,MAAM,SAAS,GAAG,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;AACpD,QAAA,MAAM,SAAS,GAAG,MAAM,KAAK,YAAY,CAAC,GAAG,GAAG,KAAK,GAAG,MAAM,CAAC;AAC/D,QAAA,OAAO,CAAG,EAAA,SAAS,CAAW,QAAA,EAAA,SAAS,EAAE,CAAC;KAC3C;AAED;;;;;;;AAOG;AACH,IAAA,iBAAiB,CAAC,SAAiB,EAAA;QACjC,IAAI,CAAC,SAAS,EAAE;AACd,YAAA,OAAO,eAAe,CAAC;AACxB,SAAA;QACD,MAAM,SAAS,GAAG,SAAS;AACxB,aAAA,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC;AAC/B,aAAA,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;AACnB,aAAA,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAErB,OAAO,SAAS,IAAI,eAAe,CAAC;KACrC;AAED;;;;;;;;;;;;;;;;;AAiBG;;IAEH,MAAM,YAAY,CAAC,IAAU,EAAE,QAAgB,EAAE,MAAoB,EAAE,UAAe,EAAA;AACpF,QAAA,MAAM,QAAQ,GAAG,MAAM,KAAK,YAAY,CAAC,GAAG;AAC1C,cAAE,UAAU;cACV,mEAAmE,CAAC;AACxE,QAAA,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;;QAGvD,IAAI,CAAC,UAAU,EAAE;AACf,YAAA,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AAC5B,YAAA,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACxB,SAAA;;AAGD,QAAA,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,cAAc,EAAE,CAAC;AACnD,QAAA,MAAM,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;AAChC,QAAA,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC;AACvB,QAAA,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;KACxB;AAED;;;AAGG;IACH,OAAO,GAAA;AACL,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;;;;;AAKzB,QAAA,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACvC,QAAA,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;;;;;;AAM5C,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzB,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,OAAO,EAAW,CAAC;KACxC;+GAtYU,mBAAmB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAV,IAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAAI,EAAA,CAAA,SAAA,EAAA,EAAA,EAAA,KAAA,EAAAP,IAAA,CAAA,aAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;AAAnB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,mBAAmB,cAFlB,MAAM,EAAA,CAAA,CAAA,EAAA;;4FAEP,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAH/B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA,CAAA;;;ACoBD;;;;;AAKG;MAiBU,mBAAmB,CAAA;AA+C9B,IAAA,WAAA;;IAES,MAAiB;;IAEhB,YAA2B;;IAE3B,YAA2B;;IAE3B,GAAsB;;IAEtB,yBAAoD;;IAErD,mBAAwC,EAAA;QAVxC,IAAM,CAAA,MAAA,GAAN,MAAM,CAAW;QAEhB,IAAY,CAAA,YAAA,GAAZ,YAAY,CAAe;QAE3B,IAAY,CAAA,YAAA,GAAZ,YAAY,CAAe;QAE3B,IAAG,CAAA,GAAA,GAAH,GAAG,CAAmB;QAEtB,IAAyB,CAAA,yBAAA,GAAzB,yBAAyB,CAA2B;QAErD,IAAmB,CAAA,mBAAA,GAAnB,mBAAmB,CAAqB;AA1DjD,QAAA,IAAA,CAAA,QAAQ,GAAqB,IAAI,OAAO,EAAW,CAAC;;QAOpD,IAAS,CAAA,SAAA,GAAQW,WAAS,CAAC;AAC3B,QAAA,IAAA,CAAA,mBAAmB,GAAG,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC;QAGjD,IAAa,CAAA,aAAA,GAAG,SAAS,CAAC;QAI1B,IAAe,CAAA,eAAA,GAAa,EAAE,CAAC;QAC/B,IAAqB,CAAA,qBAAA,GAAa,EAAE,CAAC;QACrC,IAAyB,CAAA,yBAAA,GAAa,EAAE,CAAC;QAEzC,IAAa,CAAA,aAAA,GAAsB,EAAE,CAAC;QACtC,IAAmB,CAAA,mBAAA,GAAsB,EAAE,CAAC;QAC5C,IAAuB,CAAA,uBAAA,GAAsB,EAAE,CAAC;QAChD,IAAK,CAAA,KAAA,GAAqB,EAAE,CAAC;QAC7B,IAAa,CAAA,aAAA,GAAqB,EAAE,CAAC;QACrC,IAAW,CAAA,WAAA,GAAqB,EAAE,CAAC;QACnC,IAAe,CAAA,eAAA,GAAqB,EAAE,CAAC;AACvC,QAAA,IAAA,CAAA,aAAa,GAAiB;AAC5B,YAAA,cAAc,EAAE,IAAI;AACpB,YAAA,cAAc,EAAE,IAAI;AACpB,YAAA,WAAW,EAAE,KAAK;AAClB,YAAA,cAAc,EAAE,KAAK;AACrB,YAAA,YAAY,EAAE,KAAK;SACpB,CAAC;QAGF,IAAiB,CAAA,iBAAA,GAAG,KAAK,CAAC;QAG1B,IAA0B,CAAA,0BAAA,GAAG,IAAI,CAAC;AAClC,QAAA,IAAA,CAAA,yBAAyB,GACvB,IAAI,CAAC,mBAAmB,EAAE,yBAAyB,CAAC;AACtD,QAAA,IAAA,CAAA,0BAA0B,GACxB,IAAI,CAAC,mBAAmB,EAAE,0BAA0B,CAAC;AACvD,QAAA,IAAA,CAAA,yBAAyB,GACvB,IAAI,CAAC,mBAAmB,EAAE,yBAAyB,CAAC;QAgBpD,MAAM,aAAa,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,4BAA4B,EAAE,CAAC;QACxE,IAAI,CAAC,aAAa,CAAC,WAAW,GAAE,aAAa,IAAI,IAAI,CAAC,gCAAgC,EAAE,CAAC;QACzF,IAAI,CAAC,aAAa,CAAC,YAAY,GAAE,aAAa,IAAI,IAAI,CAAC,gCAAgC,EAAE,CAAC;QAC1F,IAAI,CAAC,aAAa,CAAC,cAAc,GAAE,aAAa,IAAI,IAAI,CAAC,gCAAgC,EAAE,CAAC;KAC7F;IACD,QAAQ,GAAA;QACN,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE,WAAW,EAAE,CAAC;QACjD,IAAI,CAAC,mBAAmB,CAAC,aAAa,CAAC,IAAI,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;QACtE,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,8BAA8B,EAAE,CAAC;QACrE,IAAI,CAAC,iBAAiB,GAAG,SAAS,EAAE,iBAAiB,IAAI,KAAK,CAAC;AAC/D,QAAA,IAAI,CAAC,eAAe,GAAG,SAAS,EAAE,UAA6B,CAAC;QAChE,IAAI,CAAC,IAAI,CAAC,eAAe;AACvB,YAAA,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC;AAC5B,gBAAA,MAAM,EAAE,QAAQ;AAChB,gBAAA,OAAO,EAAE,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM;gBACvC,SAAS,EAAE,SAAS,CAAC,OAAO;AAC5B,gBAAA,aAAa,EAAE,IAAI;AACpB,aAAA,CAAC,CAAC;QACL,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,IAAI,CAAC,mCAAmC,CACtC,IAAI,CAAC,mBAAmB,EACxB,IAAI,CAAC,0BAA0B,CAChC,CAAC;KACH;AACD;;;AAGG;IACH,eAAe,GAAA;AACb,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE,cAAc,EAAE;AACrC,YAAA,IAAI,CAAC,YAAY,CAAC,cAAc,GAAG,KAAK,CAAC;AACzC,YAAA,IACE,IAAI,CAAC,YAAY,EAAE,kBAAkB;gBACrC,kBAAkB,EAAE,kBAAkB,EACtC;AACA,gBAAA,IAAI,CAAC,gBAAgB,CACnB,IAAI,CAAC,SAAS,EAAE,aAAa,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAC3D,SAAS,CAAC,OAAO,CAClB,CAAC;AACH,aAAA;AAAM,iBAAA,IACL,IAAI,CAAC,YAAY,EAAE,kBAAkB;gBACrC,kBAAkB,EAAE,qBAAqB,EACzC;AACA,gBAAA,IAAI,CAAC,gBAAgB,CACnB,IAAI,CAAC,SAAS,EAAE,aAAa,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAC3D,SAAS,CAAC,OAAO,CAClB,CAAC;AACH,aAAA;AACF,SAAA;QACD,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,8BAA8B,EAAE,CAAC;AACrE,QAAA,IAAI,CAAC,eAAe,GAAG,SAAS,EAAE,UAA6B,CAAC;KACjE;AACD;;;;AAIG;IACH,gCAAgC,GAAA;QAC9B,QACE,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,cAAc,CAAC,mBAAmB,CAAC;YACpE,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,cAAc,CAAC,qBAAqB,CAAC;YACtE,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,cAAc,CAAC,oBAAoB,CAAC;YACrE,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,cAAc,CAAC,kBAAkB,CAAC,EACnE;KACH;AACD;;;AAGG;IACH,kBAAkB,GAAA;AAChB,QAAA,IAAI,IAAI,CAAC,eAAe,KAAK,eAAe,CAAC,UAAU,EAAE;AACvD,YAAA,IAAI,CAAC,kBAAkB,GAAG,0BAA0B,CAAC;AACrD,YAAA,IAAI,CAAC,qBAAqB;AACxB,gBAAA,IAAI,CAAC,mBAAmB,EAAE,2BAA2B,CAAC;YACxD,IAAI,CAAC,OAAO,GAAG;AACb,gBAAA;oBACE,EAAE,EAAE,UAAU,CAAC,WAAW;oBAC1B,IAAI,EAAE,UAAU,CAAC,WAAW;AAC5B,oBAAA,OAAO,EAAE,KAAK;oBACd,QAAQ,EAAE,SAAS,CAAC,MAAM;AAC3B,iBAAA;aACF,CAAC;YACF,IAAI,CAAC,YAAY,GAAG;AAClB,gBAAA;AACE,oBAAA,EAAE,EAAE,CAAC;oBACL,SAAS,EAAE,eAAe,CAAC,MAAM;AACjC,oBAAA,OAAO,EAAE,EAAE;oBACX,UAAU,EAAE,eAAe,CAAC,MAAM;;oBAElC,QAAQ,EAAE,CAAC,OAAY,KAAK,CAAG,EAAA,OAAO,CAAC,MAAM,CAAE,CAAA;AAChD,iBAAA;AACD,gBAAA;AACE,oBAAA,EAAE,EAAE,CAAC;oBACL,SAAS,EAAE,0BAA0B,CAAC,IAAI;AAC1C,oBAAA,OAAO,EAAE,IAAI,CAAC,yBAAyB,EAAE,IAAI;oBAC7C,UAAU,EAAE,eAAe,CAAC,IAAI;;oBAEhC,QAAQ,EAAE,CAAC,OAAY,KAAK,CAAG,EAAA,OAAO,CAAC,IAAI,CAAE,CAAA;AAC7C,oBAAA,gBAAgB,EAAE,IAAI;AACvB,iBAAA;AACD,gBAAA;AACE,oBAAA,EAAE,EAAE,CAAC;oBACL,SAAS,EAAE,0BAA0B,CAAC,QAAQ;AAC9C,oBAAA,OAAO,EAAE,IAAI,CAAC,yBAAyB,EAAE,QAAQ;oBACjD,UAAU,EAAE,eAAe,CAAC,IAAI;;AAEhC,oBAAA,QAAQ,EAAE,CAAC,OAAY,KACrB,CAAA,EAAG,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC,yBAAyB,CAAE,CAAA;AACzD,oBAAA,gBAAgB,EAAE,IAAI;AACvB,iBAAA;AACD,gBAAA;AACE,oBAAA,EAAE,EAAE,CAAC;oBACL,SAAS,EAAE,0BAA0B,CAAC,KAAK;AAC3C,oBAAA,OAAO,EAAE,IAAI,CAAC,yBAAyB,EAAE,KAAK;oBAC9C,UAAU,EAAE,eAAe,CAAC,IAAI;;AAEhC,oBAAA,QAAQ,EAAE,CAAC,OAAY,KACrB,CAAA,EAAG,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,yBAAyB,CAAE,CAAA;AACtD,oBAAA,gBAAgB,EAAE,IAAI;AACvB,iBAAA;AACD,gBAAA;AACE,oBAAA,EAAE,EAAE,CAAC;oBACL,SAAS,EAAE,0BAA0B,CAAC,WAAW;AACjD,oBAAA,OAAO,EAAE,IAAI,CAAC,yBAAyB,EAAE,UAAU;oBACnD,UAAU,EAAE,eAAe,CAAC,IAAI;;AAEhC,oBAAA,QAAQ,EAAE,CAAC,OAAY,KACrB,CAAA,EAAG,OAAO,CAAC,YAAY,IAAI,IAAI,CAAC,yBAAyB,CAAE,CAAA;AAC9D,iBAAA;AACD,gBAAA;AACE,oBAAA,EAAE,EAAE,CAAC;oBACL,SAAS,EAAE,0BAA0B,CAAC,YAAY;AAClD,oBAAA,OAAO,EAAE,IAAI,CAAC,yBAAyB,EAAE,gBAAgB;oBACzD,UAAU,EAAE,eAAe,CAAC,IAAI;;AAEhC,oBAAA,QAAQ,EAAE,CAAC,OAAY,KACrB,CAAA,EAAG,OAAO,CAAC,YAAY,IAAI,IAAI,CAAC,yBAAyB,CAAE,CAAA;AAC7D,oBAAA,gBAAgB,EAAE,IAAI;AACvB,iBAAA;AACD,gBAAA;AACE,oBAAA,EAAE,EAAE,CAAC;oBACL,SAAS,EAAE,0BAA0B,CAAC,IAAI;AAC1C,oBAAA,OAAO,EAAE,IAAI,CAAC,yBAAyB,EAAE,IAAI;oBAC7C,UAAU,EAAE,eAAe,CAAC,IAAI;;AAEhC,oBAAA,QAAQ,EAAE,CAAC,OAAY,KACrB,CAAA,EAAG,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,yBAAyB,CAAE,CAAA;AACtD,iBAAA;aACF,CAAC;YACF,IAAI,IAAI,CAAC,iBAAiB,EAAE;gBAC1B,IAAI,CAAC,kBAAkB,EAAE,CAAC;;gBAE1B,MAAM,eAAe,GAAG,IAAI,CAAC,YAAY,CAAC,SAAS,CACjD,CAAC,MAAM,KAAK,MAAM,CAAC,SAAS,KAAK,0BAA0B,CAAC,IAAI,CACjE,CAAC;gBACF,MAAM,yBAAyB,GAC7B,eAAe,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,GAAG,eAAe,CAAC;gBAC1E,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,yBAAyB,EAAE,CAAC,EAAE;AACrD,oBAAA,EAAE,EAAE,CAAC;oBACL,SAAS,EAAE,0BAA0B,CAAC,cAAc;AACpD,oBAAA,OAAO,EAAE,IAAI,CAAC,yBAAyB,EAAE,cAAc;oBACvD,UAAU,EAAE,eAAe,CAAC,IAAI;;AAEhC,oBAAA,QAAQ,EAAE,CAAC,OAAY,KACrB,CAAA,EAAG,OAAO,CAAC,cAAc,IAAI,IAAI,CAAC,yBAAyB,CAAE,CAAA;AAC/D,oBAAA,gBAAgB,EAAE,IAAI;AACvB,iBAAA,CAAC,CAAC;AACH,gBAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;oBAChB,EAAE,EAAE,UAAU,CAAC,cAAc;oBAC7B,IAAI,EAAE,UAAU,CAAC,cAAc;AAC/B,oBAAA,OAAO,EAAE,KAAK;oBACd,QAAQ,EAAE,SAAS,CAAC,MAAM;AAC3B,iBAAA,CAAC,CAAC;AACJ,aAAA;AACF,SAAA;AAAM,aAAA,IAAI,IAAI,CAAC,eAAe,KAAK,eAAe,CAAC,WAAW,EAAE;AAC/D,YAAA,IAAI,CAAC,kBAAkB,GAAG,4BAA4B,CAAC;AACvD,YAAA,IAAI,CAAC,qBAAqB;AACxB,gBAAA,IAAI,CAAC,mBAAmB,EAAE,4BAA4B,CAAC;YACzD,IAAI,CAAC,OAAO,GAAG;AACb,gBAAA;oBACE,EAAE,EAAE,UAAU,CAAC,IAAI;oBACnB,IAAI,EAAE,UAAU,CAAC,IAAI;AACrB,oBAAA,OAAO,EAAE,KAAK;oBACd,QAAQ,EAAE,SAAS,CAAC,MAAM;AAC3B,iBAAA;aACF,CAAC;YACF,IAAI,CAAC,YAAY,GAAG;AAClB,gBAAA;AACE,oBAAA,EAAE,EAAE,CAAC;oBACL,SAAS,EAAE,eAAe,CAAC,MAAM;AACjC,oBAAA,OAAO,EAAE,EAAE;oBACX,UAAU,EAAE,eAAe,CAAC,MAAM;;oBAElC,QAAQ,EAAE,CAAC,OAAY,KAAK,CAAG,EAAA,OAAO,CAAC,MAAM,CAAE,CAAA;AAChD,iBAAA;AACD,gBAAA;AACE,oBAAA,EAAE,EAAE,CAAC;oBACL,SAAS,EAAE,0BAA0B,CAAC,IAAI;AAC1C,oBAAA,OAAO,EAAE,IAAI,CAAC,0BAA0B,EAAE,IAAI;oBAC9C,UAAU,EAAE,eAAe,CAAC,IAAI;;oBAEhC,QAAQ,EAAE,CAAC,OAAY,KAAK,CAAG,EAAA,OAAO,CAAC,IAAI,CAAE,CAAA;AAC7C,oBAAA,gBAAgB,EAAE,IAAI;AACvB,iBAAA;AACD,gBAAA;AACE,oBAAA,EAAE,EAAE,CAAC;oBACL,SAAS,EAAE,0BAA0B,CAAC,KAAK;AAC3C,oBAAA,OAAO,EAAE,IAAI,CAAC,0BAA0B,EAAE,KAAK;oBAC/C,UAAU,EAAE,eAAe,CAAC,IAAI;;oBAEhC,QAAQ,EAAE,CAAC,OAAY,KAAK,CAAG,EAAA,OAAO,CAAC,KAAK,CAAE,CAAA;AAC9C,oBAAA,gBAAgB,EAAE,IAAI;AACvB,iBAAA;AACD,gBAAA;AACE,oBAAA,EAAE,EAAE,CAAC;oBACL,SAAS,EAAE,0BAA0B,CAAC,IAAI;AAC1C,oBAAA,OAAO,EAAE,IAAI,CAAC,0BAA0B,EAAE,IAAI;oBAC9C,UAAU,EAAE,eAAe,CAAC,IAAI;;AAEhC,oBAAA,QAAQ,EAAE,CAAC,OAAY,KACrB,CAAA,EAAG,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,yBAAyB,CAAE,CAAA;AACtD,iBAAA;aACF,CAAC;AACH,SAAA;QACD,IAAI,CAAC,QAAQ,EAAE,CAAC;QAChB,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;KAC3D;AACD;;;AAGG;IACH,mCAAmC,CACjC,UAAkB,EAClB,aAAsB,EAAA;AAEtB,QAAA,IAAI,CAAC,YAAY;AACd,aAAA,aAAa,CACZ,IAAI,CAAC,YAAY,CAAC,oBAAoB,EAAE,EAAE,OAAiB,EAC3D,UAAU,EACV,aAAa,CACd;AACA,aAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC9B,aAAA,SAAS,CAAC;AACT,YAAA,IAAI,EAAE,CAAC,QAAQ,KAAI;AACjB,gBAAA,IAAI,CAAC,SAAS;AACZ,oBAAA,IAAI,CAAC,YAAY,CAAC,8BAA8B,CAAC,QAAQ,CAAC,CAAC;AAC7D,gBAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;aAC1B;;AAED,YAAA,KAAK,EAAE,CAAC,KAAU,KAAI;gBACpB,MAAM,UAAU,GAAG,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,CAAC;AAClD,gBAAA,IAAI,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE;AAChC,oBAAA,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;AACpB,oBAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;AAC1B,iBAAA;;AAAM,oBAAA,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;aACjC;AACF,SAAA,CAAC,CAAC;KACN;AACD;;;;AAIG;AACH,IAAA,gBAAgB,CAAC,IAAU,EAAA;AACzB,QAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,MAAM,CAAC;AACvC,QAAA,IAAI,CAAC,0BAA0B;AAC7B,YAAA,IAAI,CAAC,SAAS,KAAK,wBAAwB,CAAC,SAAS,CAAC;AACxD,QAAA,IAAI,IAAI,CAAC,SAAS,KAAK,wBAAwB,CAAC,OAAO;YAAE,OAAO;AAChE,QAAA,IAAI,IAAI,CAAC,eAAe,KAAK,eAAe,CAAC,WAAW,EAAE;AACxD,YAAA,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM;gBAC7B,IAAI,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;;gBAE9C,IAAI,CAAC,mCAAmC,CACtC,IAAI,CAAC,mBAAmB,EACxB,IAAI,CAAC,0BAA0B,CAChC,CAAC;AACL,SAAA;AAAM,aAAA,IAAI,IAAI,CAAC,eAAe,KAAK,eAAe,CAAC,UAAU,EAAE;AAC9D,YAAA,IACE,IAAI,CAAC,yBAAyB,CAAC,MAAM;AACrC,gBAAA,IAAI,CAAC,qBAAqB,CAAC,MAAM,EACjC;gBACA,IAAI,CAAC,kBAAkB,CAAC;AACtB,oBAAA,IAAI,CAAC,uBAAuB;AAC5B,oBAAA,IAAI,CAAC,mBAAmB;AACzB,iBAAA,CAAC,CAAC;AACJ,aAAA;;gBACC,IAAI,CAAC,mCAAmC,CACtC,IAAI,CAAC,mBAAmB,EACxB,IAAI,CAAC,0BAA0B,CAChC,CAAC;AACL,SAAA;KACF;AACD;;;AAGG;IACH,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,YAAY;aACd,iBAAiB,CAChB,IAAI,CAAC,YAAY,CAAC,oBAAoB,EAAE,EAAE,SAAmB,CAC9D;AACA,aAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC9B,aAAA,SAAS,CAAC;AACT,YAAA,IAAI,EAAE,CAAC,QAAQ,KAAI;AACjB,gBAAA,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC;AACtB,gBAAA,IAAI,IAAI,CAAC,eAAe,KAAK,eAAe,CAAC,UAAU,EAAE;oBACvD,IAAI,CAAC,cAAc,EAAE,CAAC;AACvB,iBAAA;aACF;;AAED,YAAA,KAAK,EAAE,CAAC,KAAU,KAAI;AACpB,gBAAA,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;aAC1B;AACF,SAAA,CAAC,CAAC;KACN;AACD;;;AAGG;IACH,kBAAkB,GAAA;AAChB,QAAA,IAAI,CAAC,YAAY;AACd,aAAA,kBAAkB,EAAE;AACpB,aAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC9B,aAAA,SAAS,CAAC;AACT,YAAA,IAAI,EAAE,CAAC,QAAQ,KAAI;gBACjB,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,MAAM,KAAI;AACjC,oBAAA,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC;wBACzB,EAAE,EAAE,MAAM,CAAC,gBAAgB;wBAC3B,IAAI,EAAE,MAAM,CAAC,kBAAkB;AAC/B,wBAAA,OAAO,EAAE,KAAK;AACd,wBAAA,QAAQ,EAAE,KAAK;AAChB,qBAAA,CAAC,CAAC;AACL,iBAAC,CAAC,CAAC;aACJ;;AAED,YAAA,KAAK,EAAE,CAAC,KAAU,KAAI;AACpB,gBAAA,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;aAC1B;AACF,SAAA,CAAC,CAAC;KACN;AACD;;;AAGG;IACH,cAAc,GAAA;QACZ,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,cAAc,EAAE,CAAC;AACvD,QAAA,WAAW,EAAE,OAAO,CAAC,CAAC,MAAM,KAAI;AAC9B,YAAA,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC;gBACrB,EAAE,EAAE,MAAM,CAAC,MAAM;gBACjB,IAAI,EAAE,MAAM,CAAC,QAAQ;AACrB,gBAAA,OAAO,EAAE,KAAK;AACd,gBAAA,QAAQ,EAAE,KAAK;AAChB,aAAA,CAAC,CAAC;AACL,SAAC,CAAC,CAAC;KACJ;AACD;;;;AAIG;AACH,IAAA,wBAAwB,CAAC,MAAkB,EAAA;QACzC,QAAQ,MAAM,CAAC,EAAE;AACf,YAAA,KAAK,UAAU,CAAC,WAAW,EAAE;AAC3B,gBAAA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC;gBACtC,MAAM;AACP,aAAA;AACD,YAAA,KAAK,UAAU,CAAC,cAAc,EAAE;AAC9B,gBAAA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,eAAe,CAAC;gBAC1C,MAAM;AACP,aAAA;AACD,YAAA,KAAK,UAAU,CAAC,IAAI,EAAE;AACpB,gBAAA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC;gBAChC,MAAM;AACP,aAAA;AACD,YAAA;gBACE,MAAM;AACT,SAAA;KACF;AACD;;;;AAIG;AACH,IAAA,kBAAkB,CAAC,UAAkB,EAAA;AACnC,QAAA,IAAI,CAAC,UAAU,GAAG,UAAU,EAAE,IAAI,EAAE,CAAC;AACrC,QAAA,IAAI,OAA4B,CAAC;QACjC,QAAQ,IAAI,CAAC,eAAe;AAC1B,YAAA,KAAK,eAAe,CAAC,WAAW,EAAE;AAChC,gBAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;AACpB,oBAAA,IAAI,IAAI,CAAC,eAAe,EAAE,MAAM,KAAK,CAAC,EAAE;wBACtC,IAAI,CAAC,mCAAmC,CACtC,IAAI,CAAC,mBAAmB,EACxB,IAAI,CAAC,0BAA0B,CAChC,CAAC;wBACF,OAAO;AACR,qBAAA;AAAM,yBAAA,IAAI,IAAI,CAAC,eAAe,EAAE,MAAM,GAAG,CAAC,EAAE;wBAC3C,IAAI,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;wBAC9C,OAAO;AACR,qBAAA;AACF,iBAAA;AACD,gBAAA,OAAO,GAAG;AACR,oBAAA,OAAO,EAAE;AACP,wBAAA,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,oBAAoB,EAAE;AAC/C,8BAAE,OAAiB;wBACrB,2BAA2B,EAAE,IAAI,CAAC,UAAU;wBAC5C,yCAAyC,EAAE,IAAI,CAAC,eAAe;wBAC/D,UAAU,EAAE,IAAI,CAAC,mBAAmB;wBACpC,cAAc,EAAE,IAAI,CAAC,0BAA0B;AAChD,qBAAA;iBACF,CAAC;gBACF,MAAM;AACP,aAAA;AACD,YAAA,KAAK,eAAe,CAAC,UAAU,EAAE;AAC/B,gBAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;AACpB,oBAAA,IACE,IAAI,CAAC,qBAAqB,EAAE,MAAM,KAAK,CAAC;AACxC,wBAAA,IAAI,CAAC,yBAAyB,EAAE,MAAM,KAAK,CAAC,EAC5C;wBACA,IAAI,CAAC,mCAAmC,CACtC,IAAI,CAAC,mBAAmB,EACxB,IAAI,CAAC,0BAA0B,CAChC,CAAC;wBACF,OAAO;AACR,qBAAA;AAAM,yBAAA,IACL,IAAI,CAAC,yBAAyB,EAAE,MAAM,GAAG,CAAC;AAC1C,wBAAA,IAAI,CAAC,qBAAqB,EAAE,MAAM,GAAG,CAAC,EACtC;wBACA,IAAI,CAAC,kBAAkB,CAAC;AACtB,4BAAA,IAAI,CAAC,uBAAuB;AAC5B,4BAAA,IAAI,CAAC,mBAAmB;AACzB,yBAAA,CAAC,CAAC;wBACH,OAAO;AACR,qBAAA;AACF,iBAAA;AACD,gBAAA,OAAO,GAAG;AACR,oBAAA,OAAO,EAAE;AACP,wBAAA,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,oBAAoB,EAAE;AAC/C,8BAAE,OAAiB;wBACrB,2BAA2B,EAAE,IAAI,CAAC,UAAU;AAC5C,wBAAA,yCAAyC,EAAE;4BACzC,GAAG,IAAI,CAAC,yBAAyB;4BACjC,GAAG,IAAI,CAAC,qBAAqB;AAC9B,yBAAA;wBACD,UAAU,EAAE,IAAI,CAAC,mBAAmB;wBACpC,cAAc,EAAE,IAAI,CAAC,0BAA0B;AAChD,qBAAA;iBACF,CAAC;gBACF,MAAM;AACP,aAAA;AACD,YAAA;gBACE,MAAM;AACT,SAAA;AACD,QAAA,IAAI,CAAC,YAAY;aACd,gBAAgB,CAAC,OAAO,CAAC;AACzB,aAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC9B,aAAA,SAAS,CAAC;AACT,YAAA,IAAI,EAAE,CAAC,QAAQ,KAAI;AACjB,gBAAA,IAAI,CAAC,SAAS;AACZ,oBAAA,IAAI,CAAC,YAAY,CAAC,8BAA8B,CAAC,QAAQ,CAAC,CAAC;AAC7D,gBAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;aAC1B;;AAED,YAAA,KAAK,EAAE,CAAC,KAAU,KAAI;gBACpB,MAAM,UAAU,GAAG,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,CAAC;gBAClD,MAAM,sBAAsB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;gBAChE,IAAI,UAAU,IAAI,sBAAsB,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE;AAChE,oBAAA,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;AACpB,oBAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;AAC1B,iBAAA;;AAAM,oBAAA,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;aACjC;AACF,SAAA,CAAC,CAAC;KACN;AACD;;;;;;;AAOG;AACH,IAAA,8BAA8B,CAC5B,eAAoC,EACpC,UAAsB,EACtB,qBAAwC,EACxC,iBAA2B,EAAA;AAE3B,QAAA,eAAe,EAAE,OAAO,CAAC,CAAC,cAAc,KAAI;AAC1C,YAAA,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE;gBACzD,IAAI,GAAG,KAAK,UAAU,EAAE;oBACtB,MAAM,yBAAyB,GAAqB,EAAE,CAAC;AACvD,oBAAA,KAAK,EAAE,OAAO,CAAC,CAAC,MAAM,KAAI;AACxB,wBAAA,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAY,CAAC,CAAC;AAC5C,wBAAA,yBAAyB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACzC,qBAAC,CAAC,CAAC;AACH,oBAAA,qBAAqB,CAAC,GAAG,CAAC,GAAG,yBAAyB,CAAC;AACxD,iBAAA;AACF,aAAA;AACH,SAAC,CAAC,CAAC;KACJ;AACD;;;;AAIG;AACH,IAAA,kBAAkB,CAAC,eAAoC,EAAA;AACrD,QAAA,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC;AAC1B,QAAA,IAAI,CAAC,qBAAqB,GAAG,EAAE,CAAC;AAChC,QAAA,IAAI,CAAC,yBAAyB,GAAG,EAAE,CAAC;AACpC,QAAA,IAAI,CAAC,uBAAuB,GAAG,EAAE,CAAC;AAClC,QAAA,IAAI,CAAC,mBAAmB,GAAG,EAAE,CAAC;AAC9B,QAAA,IAAI,OAA4B,CAAC;QACjC,QAAQ,IAAI,CAAC,eAAe;AAC1B,YAAA,KAAK,eAAe,CAAC,WAAW,EAAE;AAChC,gBAAA,IAAI,CAAC,8BAA8B,CACjC,eAAe,EACf,UAAU,CAAC,IAAI,EACf,IAAI,CAAC,aAAa,EAClB,IAAI,CAAC,eAAe,CACrB,CAAC;gBACF,IAAI,eAAe,EAAE,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;oBACrD,IAAI,CAAC,mCAAmC,CACtC,IAAI,CAAC,mBAAmB,EACxB,IAAI,CAAC,0BAA0B,CAChC,CAAC;oBACF,OAAO;AACR,iBAAA;qBAAM,IAAI,IAAI,CAAC,UAAU,EAAE;AAC1B,oBAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;oBACzC,OAAO;AACR,iBAAA;AACD,gBAAA,OAAO,GAAG;AACR,oBAAA,OAAO,EAAE;AACP,wBAAA,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,oBAAoB,EAAE;AAC/C,8BAAE,OAAiB;wBACrB,yCAAyC,EAAE,IAAI,CAAC,eAAe;wBAC/D,UAAU,EAAE,IAAI,CAAC,mBAAmB;wBACpC,cAAc,EAAE,IAAI,CAAC,0BAA0B;AAChD,qBAAA;iBACF,CAAC;gBACF,MAAM;AACP,aAAA;AACD,YAAA,KAAK,eAAe,CAAC,UAAU,EAAE;AAC/B,gBAAA,IAAI,CAAC,8BAA8B,CACjC,eAAe,EACf,UAAU,CAAC,WAAW,EACtB,IAAI,CAAC,mBAAmB,EACxB,IAAI,CAAC,qBAAqB,CAC3B,CAAC;AACF,gBAAA,IAAI,CAAC,8BAA8B,CACjC,eAAe,EACf,UAAU,CAAC,cAAc,EACzB,IAAI,CAAC,uBAAuB,EAC5B,IAAI,CAAC,yBAAyB,CAC/B,CAAC;gBACF,IAAI,eAAe,EAAE,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;oBACrD,IAAI,CAAC,mCAAmC,CACtC,IAAI,CAAC,mBAAmB,EACxB,IAAI,CAAC,0BAA0B,CAChC,CAAC;oBACF,OAAO;AACR,iBAAA;qBAAM,IAAI,IAAI,CAAC,UAAU,EAAE;AAC1B,oBAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;oBACzC,OAAO;AACR,iBAAA;AACD,gBAAA,OAAO,GAAG;AACR,oBAAA,OAAO,EAAE;AACP,wBAAA,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,oBAAoB,EAAE;AAC/C,8BAAE,OAAiB;AACrB,wBAAA,yCAAyC,EAAE;4BACzC,GAAG,IAAI,CAAC,qBAAqB;4BAC7B,GAAG,IAAI,CAAC,yBAAyB;AAClC,yBAAA;wBACD,UAAU,EAAE,IAAI,CAAC,mBAAmB;wBACpC,cAAc,EAAE,IAAI,CAAC,0BAA0B;AAChD,qBAAA;iBACF,CAAC;gBACF,MAAM;AACP,aAAA;AACD,YAAA;gBACE,MAAM;AACT,SAAA;AACD,QAAA,IAAI,CAAC,YAAY;aACd,oBAAoB,CAAC,OAAO,CAAC;AAC7B,aAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC9B,aAAA,SAAS,CAAC;AACT,YAAA,IAAI,EAAE,CAAC,QAAQ,KAAI;AACjB,gBAAA,IAAI,CAAC,SAAS;AACZ,oBAAA,IAAI,CAAC,YAAY,CAAC,8BAA8B,CAAC,QAAQ,CAAC,CAAC;AAC7D,gBAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;aAC1B;;AAED,YAAA,KAAK,EAAE,CAAC,KAAU,KAAI;gBACpB,MAAM,UAAU,GAAG,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,CAAC;AAClD,gBAAA,IAAI,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE;AAChC,oBAAA,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;AACpB,oBAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;AAC1B,iBAAA;;AAAM,oBAAA,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;aACjC;AACF,SAAA,CAAC,CAAC;KACN;AACD;;;;AAIG;;AAEH,IAAA,YAAY,CAAC,KAAU,EAAA;QACrB,MAAM,UAAU,GAAG,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,CAAC;AAClD,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE;YACtD,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;YACrE,IAAI,CAAC,gBAAgB,CAAC,YAAY,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC;AACtD,SAAA;AAAM,aAAA,IAAI,KAAK,IAAI,KAAK,YAAY,iBAAiB,EAAE;AACtD,YAAA,IAAI,CAAC,yBAAyB,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;AACnD,SAAA;KACF;AACD;;;AAGG;;AAEH,IAAA,+BAA+B,CAAC,aAAkB,EAAA;AAChD,QAAA,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,IAAU,KAAK,IAAI,EAAE,MAAM,CAAC,CAAC;QAChE,IACE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC;AACvC,YAAA,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE;AAC/B,YAAA,IAAI,CAAC,YAAY,EAAE,8BAA8B,EAAE,EAAE,OAAO,EAC5D;AACA,YAAA,IAAI,CAAC,gBAAgB,CAAC,CAAG,EAAAS,MAAiB,GAAG,IAAI,CAAC,CAAE,CAAA,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC;AACxE,SAAA;AAAM,aAAA;YACL,MAAM,iBAAiB,GAAG,IAAI,CAAC,YAAY,EAAE,oBAAoB,EAAE,CAAC;AACpE,YAAA,MAAM,gBAAgB,GAAGC,gBAA2B,EAAE,gBAAgB,CAAC;AACvE,YAAA,MAAM,2BAA2B,GAAG;gBAClC,eAAe,EAAE,gBAAgB,EAAE,eAAe;gBAClD,gBAAgB,EAAE,gBAAgB,EAAE,gBAAgB;AACpD,gBAAA,aAAa,EAAE,CAAG,EAAA,gBAAgB,EAAE,kBAAkB,IAAI,OAAO,EAAE,MAAM,CAAA,CAAA,EAAI,gBAAgB,EAAE,kBAAkB,IAAI,iBAAiB,EAAE,SAAS,CAAG,CAAA,CAAA;AACpJ,gBAAA,iBAAiB,EAAE,IAAI,CAAC,aAAa,EAAE,MAAM;aAC9C,CAAC;YACF,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,0BAA0B,EAAE;AAC5D,gBAAA,IAAI,EAAE,2BAA2B;AACjC,gBAAA,KAAK,EAAE,MAAM;AACb,gBAAA,SAAS,EAAE,QAAQ;AACnB,gBAAA,SAAS,EAAEC,SAAoB,EAAE,KAAK;AACvC,aAAA,CAAC,CAAC;AACH,YAAA,IAAI,CAAC,SAAS;AACX,iBAAA,WAAW,EAAE;AACb,iBAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC9B,iBAAA,SAAS,CAAC,CAAC,MAAe,KAAI;AAC7B,gBAAA,IAAI,MAAM,EAAE;oBACV,IAAI,CAAC,gBAAgB,CACnB,iBAAiB,EAAE,OAAiB,EACpC,OAAO,CACR,CAAC;AACH,iBAAA;AACH,aAAC,CAAC,CAAC;AACN,SAAA;KACF;AACD;;;AAGG;IACH,gBAAgB,CAAC,OAAe,EAAE,OAAiB,EAAA;AACjD,QAAA,MAAM,qBAAqB,GAAGD,gBAA2B,CAAC;AAC1D,QAAA,MAAM,sBAAsB,GAA2B;AACrD,YAAA,OAAO,EAAE;gBACP,CAAC,OAAO,GAAG,OAAO;AACnB,aAAA;SACF,CAAC;AACF,QAAA,IAAI,CAAC,YAAY;aACd,gBAAgB,CAAC,sBAAsB,CAAC;AACxC,aAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC9B,aAAA,SAAS,CAAC;;AAET,YAAA,IAAI,EAAE,CAAC,GAAQ,KAAI;gBACjB,IAAI,GAAG,EAAE,MAAM,EAAE;oBACf,IAAI,CAAC,gBAAgB,CACnB,CAAA,EAAG,GAAG,CAAC,IAAI,IAAI,qBAAqB,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAA,CAAE,EACjE,SAAS,CAAC,OAAO,CAClB,CAAC;oBACF,IAAI,CAAC,mCAAmC,CACtC,IAAI,CAAC,mBAAmB,EACxB,IAAI,CAAC,0BAA0B,CAChC,CAAC;AACH,iBAAA;aACF;;AAED,YAAA,KAAK,EAAE,CAAC,KAAU,KAAI;AACpB,gBAAA,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;aAC1B;AACF,SAAA,CAAC,CAAC;KACN;AAED;;;;AAIG;AACH,IAAA,eAAe,CAAC,gBAAiC,EAAA;AAC/C,QAAA,IAAI,IAAI,CAAC,eAAe,KAAK,eAAe,CAAC,UAAU;AACrD,YAAA,IAAI,CAAC,YAAY,CAAC,mBAAmB,CAAC;AACpC,gBAAA,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAAE,KAAK;AACjC,gBAAA,IAAI,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAAE,IAAI;AAC/B,gBAAA,IAAI,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAAE,IAAI;AAC/B,gBAAA,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAAE,MAAM;AACnC,gBAAA,cAAc,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAAE,cAAc;AACnD,gBAAA,YAAY,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAAE,YAAY;AAC/C,gBAAA,YAAY,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAAE,YAAY;AAC/C,gBAAA,SAAS,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAAE,SAAS;AACzC,gBAAA,gBAAgB,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAAE,gBAAgB;AACvD,gBAAA,WAAW,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAAE,WAAW;AAC7C,gBAAA,OAAO,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAAE,OAAO;AACtC,aAAA,CAAC,CAAC;;AAEH,YAAA,IAAI,CAAC,YAAY,CAAC,mBAAmB,CAAC;AACpC,gBAAA,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAAE,KAAK;AACjC,gBAAA,IAAI,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAAE,IAAI;AAC/B,gBAAA,IAAI,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAAE,IAAI;AAC/B,gBAAA,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAAE,MAAM;AACnC,gBAAA,SAAS,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAAE,SAAS;AACzC,gBAAA,gBAAgB,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAAE,gBAAgB;AACvD,gBAAA,WAAW,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAAE,WAAW;AAC7C,gBAAA,OAAO,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAAE,OAAO;AACtC,aAAA,CAAC,CAAC;QAEL,IAAI,CAAC,YAAY,EAAE,iBAAiB,EAAE,IAAI,CACxC,iBAAiB,CAAC,qBAAqB,CACxC,CAAC;KACH;AAED;;;;;;;;AAQG;IACH,cAAc,GAAA;QACZ,IAAI,CAAC,8BAA8B,EAAE,CAAC;AACtC,QAAA,IAAI,CAAC,cAAc,EAAE,QAAQ,EAAE,CAAC;KACjC;AAED;;;;;;AAMG;IAGH,4BAA4B,GAAA;AAC1B,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE,QAAQ,EAAE;AACjC,YAAA,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,CAAC;AACjC,SAAA;KACF;AAED;;;;;AAKG;IACK,8BAA8B,GAAA;AACpC,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE,aAAa,CAAC;QACjD,IAAI,CAAC,MAAM,EAAE;YACX,OAAO;AACR,SAAA;AACD,QAAA,MAAM,KAAK,GACR,MAAM,CAAC,OAAO,CAAC,0CAA0C,CAAiB;YAC3E,QAAQ,CAAC,IAAI,CAAC;;;;;QAKhB,MAAM,OAAO,IAAI,KAAK,EAAE,aAAa,CACnC,oDAAoD,CACrD;AACC,YAAA,KAAK,EAAE,aAAa,CAClB,8DAA8D,CAC/D,CAAuB,CAAC;QAC3B,IAAI,CAAC,OAAO,EAAE;YACZ,OAAO;AACR,SAAA;AACD,QAAA,MAAM,IAAI,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC;;;;;AAK7C,QAAA,MAAM,CAAC,KAAK,CAAC,QAAQ,GAAG,OAAO,CAAC;QAChC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM,CAAA,EAAA,CAAI,CAAC;QACtC,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,IAAI,CAAC,KAAK,CAAA,EAAA,CAAI,CAAC;AACtC,QAAA,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,CAAC;AACzB,QAAA,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC;KAC3B;AAED;;;AAGG;IACH,aAAa,GAAA;QACX,IAAI,CAAC,YAAY,EAAE,iBAAiB,EAAE,IAAI,CACxC,iBAAiB,CAAC,kBAAkB,CACrC,CAAC;KACH;AAED;;;AAGG;IACH,cAAc,GAAA;QACZ,IAAI,CAAC,YAAY,EAAE,iBAAiB,EAAE,IAAI,CACxC,iBAAiB,CAAC,aAAa,CAChC,CAAC;KACH;AAED;;;AAGG;IACH,aAAa,GAAA;QACX,IAAI,CAAC,YAAY,EAAE,iBAAiB,EAAE,IAAI,CACxC,iBAAiB,CAAC,mBAAmB,CACtC,CAAC;KACH;AAED;;;;;;AAMG;IACH,gBAAgB,CAAC,OAA0B,EAAE,SAAoB,EAAA;AAC/D,QAAA,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC;AAC7B,YAAA,MAAM,EAAE,QAAQ;AAChB,YAAA,OAAO,EAAE,OAAO;AAChB,YAAA,SAAS,EAAE,SAAS;AACpB,YAAA,aAAa,EAAE,IAAI;AACpB,SAAA,CAAC,CAAC;KACJ;AAED;;;AAGG;IACH,aAAa,GAAA;AACX,QAAA,IAAI,CAAC,mBAAmB,CAAC,aAAa,EAAE,CAAC;KAC1C;AAED;;;;;AAKG;AACH,IAAA,sBAAsB,CAAC,MAAoB,EAAA;QACzC,MAAM,iBAAiB,GAAG,IAAI,CAAC,YAAY,EAAE,oBAAoB,EAAE,CAAC;AACpE,QAAA,MAAM,OAAO,GAAG,iBAAiB,EAAE,OAAiB,CAAC;;;QAGrD,IAAI,CAAC,OAAO,EAAE;AACZ,YAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC;YACxE,OAAO;AACR,SAAA;AACD,QAAA,MAAM,SAAS,GAAG,iBAAiB,EAAE,SAAS,IAAI,EAAE,CAAC;QACrD,IAAI,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;KACvE;AAED;;;AAGG;IACH,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,CAAC;AACnC,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzB,QAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;KAC7B;+GAz6BU,mBAAmB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,SAAA,EAAA,EAAA,EAAA,KAAA,EAAAN,aAAA,EAAA,EAAA,EAAA,KAAA,EAAAf,IAAA,CAAA,aAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,EAAA,EAAA,KAAA,EAAAA,IAAA,CAAA,yBAAA,EAAA,EAAA,EAAA,KAAA,EAAAuB,mBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;AAAnB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,mBAAmB,EAKO,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,eAAA,EAAA,gCAAA,EAAA,eAAA,EAAA,gCAAA,EAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,eAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,IAAA,EAAA,UAAU,ECpFjD,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,8yIAsGA,42bDnCI,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAP,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,OAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACZ,kBAAkB,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,qBAAA,EAAA,kBAAA,EAAA,6BAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,oBAAA,EAAA,2BAAA,EAAA,iBAAA,EAAA,uBAAA,EAAA,SAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,uBAAA,EAAA,SAAA,EAAA,WAAA,EAAA,UAAA,EAAA,uBAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,2BAAA,EAAA,WAAA,EAAA,4BAAA,EAAA,qBAAA,EAAA,mBAAA,EAAA,SAAA,EAAA,uBAAA,EAAA,sBAAA,EAAA,YAAA,EAAA,WAAA,EAAA,sBAAA,EAAA,sBAAA,EAAA,4BAAA,EAAA,qBAAA,EAAA,wBAAA,EAAA,4BAAA,EAAA,yBAAA,EAAA,8BAAA,EAAA,sBAAA,EAAA,0BAAA,EAAA,wBAAA,EAAA,iBAAA,EAAA,qBAAA,EAAA,mBAAA,EAAA,oBAAA,EAAA,2BAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,sBAAA,EAAA,SAAA,EAAA,QAAA,EAAA,0BAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,gBAAA,EAAA,sBAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,YAAA,EAAA,kBAAA,EAAA,mBAAA,EAAA,4BAAA,EAAA,6BAAA,EAAA,gBAAA,EAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAClB,eAAe,EACf,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,eAAe,EACf,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAQ,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,6GAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,eAAA,EAAA,OAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,aAAa,gZACb,4BAA4B,EAAA,QAAA,EAAA,8BAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,QAAA,EAAA,cAAA,EAAA,iBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA,EAAA;;4FAOnB,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAhB/B,SAAS;+BACE,oBAAoB,EAAA,UAAA,EAClB,IAAI,EACP,OAAA,EAAA;wBACP,YAAY;wBACZ,kBAAkB;wBAClB,eAAe;wBACf,eAAe;wBACf,aAAa;wBACb,4BAA4B;AAC7B,qBAAA,EAAA,aAAA,EAGc,iBAAiB,CAAC,IAAI,EACpB,eAAA,EAAA,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,8yIAAA,EAAA,MAAA,EAAA,CAAA,qzbAAA,CAAA,EAAA,CAAA;gQAKlB,cAAc,EAAA,CAAA;sBAA1C,SAAS;uBAAC,gBAAgB,CAAA;gBAG3B,aAAa,EAAA,CAAA;sBADZ,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,gBAAgB,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAA;gBAsyBjD,4BAA4B,EAAA,CAAA;sBAF3B,YAAY;uBAAC,eAAe,CAAA;;sBAC5B,YAAY;uBAAC,eAAe,CAAA;;;AEzzB/B;;;AAGG;MAoBU,eAAe,CAAA;AAuD1B;;;;;;;;;AASG;IACH,IACI,qBAAqB,CAAC,KAAkC,EAAA;AAC1D,QAAA,IAAI,CAAC,sBAAsB,GAAG,KAAK,IAAI,EAAE,CAAC;QAC1C,IAAI,CAAC,aAAa,EAAE,wBAAwB,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;KAC3E;AACD,IAAA,IAAI,qBAAqB,GAAA;QACvB,OAAO,IAAI,CAAC,sBAAsB,CAAC;KACpC;AAED;;;;;;;;;AASG;IACH,IACI,cAAc,CAAC,KAAyC,EAAA;AAC1D,QAAA,IAAI,CAAC,eAAe,GAAG,KAAK,IAAI,EAAE,CAAC;QACnC,IAAI,CAAC,aAAa,EAAE,iBAAiB,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;KAC7D;AACD,IAAA,IAAI,cAAc,GAAA;QAChB,OAAO,IAAI,CAAC,eAAe,CAAC;KAC7B;AAWD,IAAA,WAAA;;IAES,MAAiB;;IAEhB,aAA4B;;IAE7B,YAA2B;;IAE1B,yBAAoD;;IAErD,yBAAoD;;IAEnD,sBAA8C;;IAE9C,uBAAmD;;IAEnD,cAA8B,EAAA;QAd/B,IAAM,CAAA,MAAA,GAAN,MAAM,CAAW;QAEhB,IAAa,CAAA,aAAA,GAAb,aAAa,CAAe;QAE7B,IAAY,CAAA,YAAA,GAAZ,YAAY,CAAe;QAE1B,IAAyB,CAAA,yBAAA,GAAzB,yBAAyB,CAA2B;QAErD,IAAyB,CAAA,yBAAA,GAAzB,yBAAyB,CAA2B;QAEnD,IAAsB,CAAA,sBAAA,GAAtB,sBAAsB,CAAwB;QAE9C,IAAuB,CAAA,uBAAA,GAAvB,uBAAuB,CAA4B;QAEnD,IAAc,CAAA,cAAA,GAAd,cAAc,CAAgB;AArHxC,QAAA,IAAA,CAAA,QAAQ,GAAqB,IAAI,OAAO,EAAW,CAAC;;QAIpD,IAAS,CAAA,SAAA,GAAQ,WAAW,CAAC;AAC7B,QAAA,IAAA,CAAA,cAAc,GAAG,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC;AAC5C,QAAA,IAAA,CAAA,eAAe,GAAG,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC;AAC9C,QAAA,IAAA,CAAA,cAAc,GAAG,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC;AAC3C,QAAA,IAAA,CAAA,kBAAkB,GAAG,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC;AACnD,QAAA,IAAA,CAAA,kBAAkB,GAAG,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC;QACnD,IAAmB,CAAA,mBAAA,GAAG,KAAK,CAAC;QAC5B,IAAmB,CAAA,mBAAA,GAAG,KAAK,CAAC;QAC5B,IAA2B,CAAA,2BAAA,GAAG,KAAK,CAAC;QACpC,IAAY,CAAA,YAAA,GAAG,KAAK,CAAC;QAQrB,IAAqB,CAAA,qBAAA,GAAW,IAAI,CAAC,cAAc,EAAE,eAAe,EAAE,MAAM,CAAC;QAC7E,IAAqB,CAAA,qBAAA,GAAW,IAAI,CAAC,cAAc,EAAE,eAAe,EAAE,MAAM,CAAC;AAC7E,QAAA,IAAA,CAAA,eAAe,GAAe;AAC5B,YAAA,EAAE,EAAE,CAAC;AACL,YAAA,SAAS,EAAE,IAAI,CAAC,cAAc,EAAE,SAAS,CAAC,GAAG;AAC7C,YAAA,OAAO,EAAE,IAAI,CAAC,cAAc,EAAE,eAAe;AAC7C,YAAA,OAAO,EAAE,IAAI,CAAC,cAAc,EAAE,SAAS,CAAC,GAAG;SAC5C,CAAC;AACF,QAAA,IAAA,CAAA,eAAe,GAAe;AAC5B,YAAA,EAAE,EAAE,CAAC;AACL,YAAA,SAAS,EAAE,IAAI,CAAC,cAAc,EAAE,SAAS,CAAC,MAAM;AAChD,YAAA,OAAO,EAAE,IAAI,CAAC,cAAc,EAAE,eAAe;AAC7C,YAAA,OAAO,EAAE,IAAI,CAAC,cAAc,EAAE,SAAS,CAAC,MAAM;SAC/C,CAAC;AACF,QAAA,IAAA,CAAA,eAAe,GAAe;AAC5B,YAAA,EAAE,EAAE,CAAC;AACL,YAAA,SAAS,EAAE,IAAI,CAAC,cAAc,EAAE,SAAS,CAAC,MAAM;AAChD,YAAA,OAAO,EAAE,IAAI,CAAC,cAAc,EAAE,eAAe;AAC7C,YAAA,OAAO,EAAE,IAAI,CAAC,cAAc,EAAE,SAAS,CAAC,MAAM;SAC/C,CAAC;QACF,IAAgB,CAAA,gBAAA,GAAqB,EAAE,OAAO,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;AAC7D,QAAA,IAAA,CAAA,cAAc,GAGnB;AACF,YAAA,WAAW,EAAE,IAAI,CAAC,cAAc,EAAE,WAAW;AAC7C,YAAA,iBAAiB,EAAE,IAAI,CAAC,cAAc,EAAE,iBAAiB;SAC1D,CAAC;QAKM,IAAsB,CAAA,sBAAA,GAAa,EAAE,CAAC;QAmBtC,IAAe,CAAA,eAAA,GAAoB,EAAE,CAAC;QAmB9C,IAAc,CAAA,cAAA,GAAG,cAAc,CAAC;QAEhC,IAAa,CAAA,aAAA,GAAG,SAAS,CAAC;QAC1B,IAAwB,CAAA,wBAAA,GAAG,KAAK,CAAC;AACjC,QAAA,IAAA,CAAA,UAAU,GAAe,UAAU,CAAC,QAAQ,CAAC;QAC7C,IAAoB,CAAA,oBAAA,GAAG,CAAC,CAAC;QACzB,IAAiB,CAAA,iBAAA,GAAG,EAAE,CAAC;QAGf,IAA0B,CAAA,0BAAA,GAAG,KAAK,CAAC;AAmBzC,QAAA,IAAI,CAAC,yBAAyB;AAC3B,aAAA,aAAa,EAAE;AACf,aAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC9B,aAAA,SAAS,CAAC,CAAC,MAA4B,KAAI;AAC1C,YAAA,IAAI,CAAC,YAAY,GAAG,MAAM,EAAE,OAAO,CAAC;AACtC,SAAC,CAAC,CAAC;QACL,IAAI,CAAC,aAAa,EAAE,iBAAiB,EAAE,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;KAC5E;AACD;;;;AAIG;IACH,QAAQ,GAAA;QACN,IAAI,CAAC,aAAa,EAAE,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC/C,QAAA,IAAI,CAAC,cAAc;YACjB,IAAI,CAAC,cAAc,EAAE,wBAAwB;gBAC7C,GAAG;AACH,gBAAA,IAAI,CAAC,oBAAoB;gBACzB,GAAG;AACH,gBAAA,IAAI,CAAC,cAAc,EAAE,wBAAwB,CAAC;AAChD,QAAA,IAAI,CAAC,oBAAoB;AACvB,YAAA,IAAI,CAAC,sBAAsB,CAAC,0BAA0B,CACpD,IAAI,CAAC,eAAe,EACpB,IAAI,CAAC,uBAAuB,EAAE,yBAAyB,EAAE,CAC1D,CAAC;QACJ,IAAI,CAAC,aAAa,CAAC,uBAAuB,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;AACtE,QAAA,IAAI,CAAC,aAAa,EAAE,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;QACxE,IAAI,CAAC,aAAa,EAAE,iBAAiB,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;;;;QAI5D,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,IAAI,CAAC,aAAa,EAAE,iBAAiB;cACjC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAChC,cAAE,SAAS,CAAC,CAAC,QAAQ,KAAI;AACvB,YAAA,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC;YACxB,MAAM,iBAAiB,GAAG,IAAI,CAAC,aAAa,CAAC,oBAAoB,EAAE,CAAC;AACpE,YAAA,IAAI,QAAQ,KAAK,iBAAiB,CAAC,qBAAqB,EAAE;AACxD,gBAAA,IAAI,CAAC,sBAAsB,CAAC,iBAA8B,CAAC,CAAC;AAC7D,aAAA;AACD,YAAA,IAAI,QAAQ,KAAK,iBAAiB,CAAC,kBAAkB,EAAE;AACrD,gBAAA,IAAI,CAAC,sBAAsB,CAAC,iBAA8B,CAAC,CAAC;AAC7D,aAAA;AACD,YAAA,IAAI,QAAQ,KAAK,iBAAiB,CAAC,aAAa,EAAE;AAChD,gBAAA,IAAI,CAAC,qBAAqB,CAAC,iBAA8B,CAAC,CAAC;AAC5D,aAAA;AACD,YAAA,IAAI,QAAQ,KAAK,iBAAiB,CAAC,mBAAmB,EAAE;AACtD,gBAAA,IAAI,CAAC,4BAA4B,CAAC,iBAA8B,CAAC,CAAC;AACnE,aAAA;AACH,SAAC,CAAC,CAAC;KACN;AACD;;;;;AAKG;AACH,IAAA,cAAc,CAAC,cAA8B,EAAA;AAC3C,QAAA,OAAO,IAAI,CAAC,sBAAsB,CAAC,wBAAwB,CACzD,cAAc,EACd,IAAI,CAAC,oBAAoB,CAC1B,CAAC;KACH;AACD;;;;;;AAMG;IACH,4BAA4B,GAAA;AAC1B,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,4BAA4B,EAAE,CAAC;KAC1D;AACD;;;;;AAKG;AACH,IAAA,mBAAmB,CAAC,eAA2B,EAAA;QAC7C,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,mBAAmB,EAAE,CAAC;AAC5D,QAAA,IAAI,UAAU,IAAI,UAAU,EAAE,MAAM,GAAG,CAAC,EAAE;YACxC,IAAI,CAAC,aAAa,EAAE,oBAAoB,CAAC,eAAe,IAAI,SAAS,CAAC,CAAC;YACvE,IAAI,CAAC,aAAa,EAAE,oBAAoB,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;AACpE,YAAA,MAAM,aAAa,GAAG;AACpB,gBAAA,OAAO,EAAE,IAAI,CAAC,eAAe,EAAE,OAAO;AACtC,gBAAA,aAAa,EAAE,IAAI;AACnB,gBAAA,kBAAkB,EAAE,oBAAoB;gBACxC,SAAS,EAAE,SAAS,CAAC,IAAI;aAC1B,CAAC;AACF,YAAA,IAAI,CAAC,YAAY,GAAG,iBAAiB,EAAE,MAAM,CAAC;YAC9C,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,qBAAqB,EAAE,eAAe,CAAC,CAAC;AACvE,SAAA;;AACC,YAAA,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC;KAC5E;AACD;;;;;AAKG;AACH,IAAA,iBAAiB,CAAC,aAAqC,EAAA;AACrD,QAAA,IAAI,CAAC,aAAa,EAAE,oBAAoB,CACtC,aAAa,EAAE,SAAS,EACxB,aAAa,EAAE,eAAe,CAC/B,CAAC;QACF,IAAI,CAAC,aAAa,EAAE,oBAAoB,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC;AAClE,QAAA,MAAM,aAAa,GAAG;AACpB,YAAA,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,SAAS;AAC5C,YAAA,aAAa,EAAE,IAAI;AACnB,YAAA,kBAAkB,EAAE,oBAAoB;YACxC,SAAS,EAAE,SAAS,CAAC,IAAI;SAC1B,CAAC;AACF,QAAA,IAAI,CAAC,YAAY,GAAG,iBAAiB,EAAE,IAAI,CAAC;QAC5C,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,mBAAmB,EAAE,aAAa,CAAC,CAAC;KACnE;AACD;;;AAGG;AACH,IAAA,sBAAsB,CAAC,iBAA4B,EAAA;QACjD,MAAM,gBAAgB,GAAG,IAAI,CAAC,aAAa,EAAE,mBAAmB,EAAE,CAAC;AACnE,QAAA,MAAM,aAAa,GAAG;YACpB,OAAO,EAAE,iBAAiB,EAAE,SAAS;YACrC,UAAU,EAAE,gBAAgB,EAAE,IAAI;AAClC,YAAA,aAAa,EAAE,IAAI;AACnB,YAAA,kBAAkB,EAAE,sBAAsB;YAC1C,SAAS,EAAE,SAAS,CAAC,IAAI;SAC1B,CAAC;AACF,QAAA,IAAI,CAAC,YAAY,GAAG,iBAAiB,CAAC,qBAAqB,CAAC;QAC5D,IAAI,CAAC,aAAa,EAAE,oBAAoB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;AAC5D,QAAA,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,wBAAwB,CAAC,CAAC;KACzD;AACD;;;AAGG;AACH,IAAA,sBAAsB,CAAC,iBAA4B,EAAA;AACjD,QAAA,MAAM,aAAa,GAAG;YACpB,OAAO,EAAE,iBAAiB,EAAE,SAAS;AACrC,YAAA,UAAU,EAAE,IAAI,CAAC,kBAAkB,EAAE,OAAO;AAC5C,YAAA,aAAa,EAAE,IAAI;AACnB,YAAA,kBAAkB,EAAE,sBAAsB;YAC1C,SAAS,EAAE,SAAS,CAAC,IAAI;SAC1B,CAAC;AACF,QAAA,IAAI,CAAC,YAAY,GAAG,iBAAiB,CAAC,kBAAkB,CAAC;QACzD,IAAI,CAAC,aAAa,EAAE,oBAAoB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;AAC5D,QAAA,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,wBAAwB,CAAC,CAAC;KACzD;AACD;;;;;;AAMG;AACH,IAAA,qBAAqB,CAAC,iBAA4B,EAAA;AAChD,QAAA,MAAM,aAAa,GAAG;;;;AAIpB,YAAA,eAAe,EAAE,IAAI,CAAC,SAAS,EAAE,YAAY,EAAE,aAAa;AAC5D,YAAA,OAAO,EAAE,IAAI,CAAC,SAAS,EAAE,YAAY,EAAE,OAAO;AAC9C,YAAA,YAAY,EAAE,yCAAyC;AACvD,YAAA,aAAa,EAAE,IAAI;AACnB,YAAA,kBAAkB,EAAE,qBAAqB;YACzC,SAAS,EAAE,SAAS,CAAC,IAAI;AACzB,YAAA,qBAAqB,EAAE;gBACrB,OAAO,EAAE,iBAAiB,EAAE,OAAO;gBACnC,SAAS,EAAE,iBAAiB,EAAE,SAAS;AACxC,aAAA;AACD,YAAA,aAAa,EAAE,eAAe;SAC/B,CAAC;AACF,QAAA,IAAI,CAAC,YAAY,GAAG,iBAAiB,CAAC,aAAa,CAAC;QACpD,IAAI,CAAC,aAAa,EAAE,oBAAoB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;AAC5D,QAAA,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,6BAA6B,CAAC,CAAC;KAC9D;AACD;;;;;;;AAOG;AACH,IAAA,4BAA4B,CAC1B,iBAA4B,EAC5B,UAAU,GAAG,KAAK,EAAA;AAElB,QAAA,MAAM,aAAa,GAAG;;AAEpB,YAAA,eAAe,EAAE,IAAI,CAAC,SAAS,EAAE,mBAAmB,EAAE,aAAa;AACnE,YAAA,OAAO,EAAE,IAAI,CAAC,SAAS,EAAE,mBAAmB,EAAE,OAAO;AACrD,YAAA,YAAY,EAAE,yCAAyC;AACvD,YAAA,aAAa,EAAE,IAAI;AACnB,YAAA,kBAAkB,EAAE,4BAA4B;YAChD,SAAS,EAAE,SAAS,CAAC,IAAI;AACzB,YAAA,qBAAqB,EAAE;gBACrB,OAAO,EAAE,iBAAiB,EAAE,OAAO;gBACnC,SAAS,EAAE,iBAAiB,EAAE,SAAS;AACxC,aAAA;AACD,YAAA,aAAa,EAAE,eAAe;SAC/B,CAAC;AACF,QAAA,IAAI,CAAC,YAAY,GAAG,iBAAiB,CAAC,mBAAmB,CAAC;QAC1D,IAAI,CAAC,aAAa,EAAE,oBAAoB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;AAC5D,QAAA,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,CAAC;QAC7C,IAAI,CAAC,SAAS,CACZ,aAAa,EACb,qCAAqC,EACrC,SAAS,EACT,UAAU,CACX,CAAC;KACH;AACD;;;;AAIG;AACH,IAAA,UAAU,CAAC,KAAgB,EAAA;AACzB,QAAA,MAAM,aAAa,GAAG;YACpB,OAAO,EAAE,KAAK,EAAE,SAAS;AACzB,YAAA,aAAa,EAAE,IAAI;AACnB,YAAA,kBAAkB,EAAE,mBAAmB;YACvC,SAAS,EAAE,SAAS,CAAC,gBAAgB;SACtC,CAAC;AACF,QAAA,IAAI,CAAC,aAAa,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;AAC/C,QAAA,IAAI,CAAC,YAAY,GAAG,iBAAiB,CAAC,WAAW,CAAC;QAClD,IAAI,CAAC,aAAa,EAAE,oBAAoB,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC;AAClE,QAAA,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,oBAAoB,CAAC,CAAC;KACrD;AACD;;;;;;AAMG;AACH,IAAA,mBAAmB,CAAC,KAAgB,EAAA;AAClC,QAAA,IAAI,CAAC,aAAa,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;AAC/C,QAAA,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,+BAA+B,EAAE;AACjD,YAAA,IAAI,EAAE,KAAK;AACX,YAAA,KAAK,EAAE,QAAQ;AACf,YAAA,QAAQ,EAAE,MAAM;AAChB,YAAA,SAAS,EAAE,MAAM;AACjB,YAAA,UAAU,EAAE,CAAC,qBAAqB,EAAE,yBAAyB,CAAC;AAC9D,YAAA,SAAS,EAAE,IAAI;AAChB,SAAA,CAAC,CAAC;KACJ;AACD;;;;;;AAMG;;IAEH,SAAS;;AAEP,IAAA,aAAkB,EAClB,SAAkB,EAClB,SAA8C,EAC9C,wBAAwB,GAAG,KAAK,EAAA;AAEhC,QAAA,SAAS,GAAG,SAAS,IAAI,EAAE,CAAC;QAC5B,MAAM,qBAAqB,GACzB,IAAI,CAAC,YAAY,KAAK,iBAAiB,CAAC,mBAAmB,CAAC;QAC9D,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,cAAc,EAAE;AACjD,YAAA,IAAI,EAAE,aAAa;AACnB,YAAA,KAAK,EACH,IAAI,CAAC,YAAY,KAAK,iBAAiB,CAAC,WAAW;AACnD,gBAAA,IAAI,CAAC,YAAY,KAAK,iBAAiB,CAAC,qBAAqB;AAC7D,gBAAA,IAAI,CAAC,YAAY,KAAK,iBAAiB,CAAC,kBAAkB;AAC1D,gBAAA,IAAI,CAAC,YAAY,KAAK,iBAAiB,CAAC,aAAa;AACrD,gBAAA,IAAI,CAAC,YAAY,KAAK,iBAAiB,CAAC,mBAAmB;AAC3D,gBAAA,IAAI,CAAC,YAAY,KAAK,iBAAiB,CAAC,MAAM;AAC9C,gBAAA,IAAI,CAAC,YAAY,KAAK,iBAAiB,CAAC,IAAI;AAC1C,kBAAE,EAAE;AACJ,kBAAE,MAAM;AACZ,YAAA,UAAU,EAAE,CAAC,qBAAqB,EAAE,SAAS,CAAC;AAC9C,YAAA,SAAS,EAAE,IAAI;AAChB,SAAA,CAAC,CAAC;;;AAGH,QAAA,IAAI,CAAC,SAAS,EAAE,iBAAiB,EAAE,SAAS;cACxC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;aAC/B,SAAS,CAAC,MAAK;;;;AAId,YAAA,IAAI,CAAC,wBAAwB,GAAG,KAAK,CAAC;AACtC,YAAA,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC;AACxB,YAAA,IACE,IAAI,CAAC,YAAY,KAAK,iBAAiB,CAAC,aAAa;AACrD,gBAAA,IAAI,CAAC,YAAY,KAAK,iBAAiB,CAAC,mBAAmB,EAC3D;gBACA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,iBAA8B,CAAC,CAAC;AACpE,aAAA;AACH,SAAC,CAAC,CAAC;AACL,QAAA,IAAI,CAAC,SAAS,EAAE,iBAAiB,EAAE,kBAAkB;AAClD,aAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;;AAE9B,aAAA,SAAS,CAAC,CAAC,MAAW,KAAI;AACzB,YAAA,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC;YACxB,QAAQ,IAAI,CAAC,YAAY;AACvB,gBAAA,KAAK,iBAAiB,EAAE,MAAM,EAAE;AAC9B,oBAAA,IAAI,CAAC,gBAAgB,CACnB,SAAS,EAAE,OAAO,EAClB,IAAI,CAAC,eAAe,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,CACnD,CAAC;oBACF,MAAM,eAAe,GAAG,SAAsB,CAAC;oBAC/C,IAAI,IAAI,CAAC,iBAAiB;AACxB,wBAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;AAC7C,yBAAA,IAAI,IAAI,CAAC,iBAAiB,CAAC,EAAE,KAAK,EAAE;AACvC,wBAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;AAC9C,yBAAA,IAAI,eAAe;AAAE,wBAAA,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;;wBACrD,IAAI,CAAC,SAAS,EAAE,CAAC;oBACtB,MAAM;AACP,iBAAA;AACD,gBAAA,KAAK,iBAAiB,EAAE,IAAI,EAAE;AAC5B,oBAAA,IAAI,CAAC,gBAAgB,CACnB,SAAS,EAAE,OAAO,EAClB,IAAI,CAAC,cAAc,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,CAClD,CAAC;oBACF,MAAM,oBAAoB,GACxB,IAAI,CAAC,aAAa,CAAC,0BAA0B,EAAE,CAAC;oBAClD,MAAM,aAAa,GAAG,SAAmC,CAAC;oBAC1D,IAAI,IAAI,CAAC,iBAAiB;AACxB,wBAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;AAC7C,yBAAA,IAAI,IAAI,CAAC,iBAAiB,CAAC,EAAE,KAAK,EAAE;AACvC,wBAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;AAC9C,yBAAA,IAAI,aAAa,EAAE,eAAe,EAAE,OAAO,KAAK,SAAS,EAAE;wBAC9D,IAAI,CAAC,SAAS,EAAE,CAAC;AAClB,qBAAA;AAAM,yBAAA,IAAI,oBAAoB,EAAE;wBAC/B,IAAI,CAAC,aAAa,CAAC,oBAAoB,CACrC,iBAAiB,CAAC,qBAAqB,CACxC,CAAC;AACF,wBAAA,IAAI,CAAC,aAAa,CAAC,0BAA0B,CAAC,KAAK,CAAC,CAAC;wBACrD,IAAI,CAAC,SAAS,EAAE,CAAC;AAClB,qBAAA;;AAAM,wBAAA,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC;oBACrD,MAAM;AACP,iBAAA;AACD,gBAAA,KAAK,iBAAiB,EAAE,qBAAqB,EAAE;AAC7C,oBAAA,IAAI,CAAC,aAAa,CAAC,cAAc,GAAG,IAAI,CAAC;oBACzC,IAAI,CAAC,aAAa,CAAC,qBAAqB,CACtC,kBAAkB,CAAC,qBAAqB,CACzC,CAAC;oBACF,MAAM;AACP,iBAAA;AACD,gBAAA,KAAK,iBAAiB,EAAE,kBAAkB,EAAE;AAC1C,oBAAA,IAAI,CAAC,aAAa,CAAC,cAAc,GAAG,IAAI,CAAC;oBACzC,IAAI,CAAC,aAAa,CAAC,qBAAqB,CACtC,kBAAkB,CAAC,kBAAkB,CACtC,CAAC;oBACF,MAAM;AACP,iBAAA;AACD,gBAAA,KAAK,iBAAiB,EAAE,aAAa,EAAE;;AAErC,oBAAA,IAAI,CAAC,wBAAwB,GAAG,KAAK,CAAC;oBACtC,IAAI,CAAC,UAAU,CACb,IAAI,CAAC,aAAa,CAAC,iBAA8B,CAClD,CAAC;oBACF,MAAM;AACP,iBAAA;AACD,gBAAA;oBACE,MAAM;AACT,aAAA;AACH,SAAC,CAAC,CAAC;AACL,QAAA,IAAI,CAAC,SAAS,EAAE,iBAAiB,EAAE,UAAU;AAC1C,aAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;aAC9B,SAAS,CAAC,MAAK;AACd,YAAA,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC;AACxB,YAAA,IACE,IAAI,CAAC,YAAY,KAAK,iBAAiB,CAAC,kBAAkB;AAC1D,gBAAA,IAAI,CAAC,YAAY,KAAK,iBAAiB,CAAC,qBAAqB;AAC7D,gBAAA,IAAI,CAAC,YAAY,KAAK,iBAAiB,CAAC,aAAa;AACrD,iBAAC,IAAI,CAAC,YAAY,KAAK,iBAAiB,CAAC,mBAAmB;oBAC1D,CAAC,wBAAwB,CAAC,EAC5B;AACA,gBAAA,IAAI,CAAC,wBAAwB,GAAG,KAAK,CAAC;gBACtC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,iBAA8B,CAAC,CAAC;AACpE,aAAA;AACH,SAAC,CAAC,CAAC;AACL,QAAA,IAAI,CAAC,SAAS;AACZ,cAAE,WAAW,EAAE;AACd,aAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;aAC9B,SAAS,CAAC,MAAK;AACd,YAAA,IACE,IAAI,CAAC,YAAY,KAAK,iBAAiB,CAAC,kBAAkB;AAC1D,gBAAA,IAAI,CAAC,YAAY,KAAK,iBAAiB,CAAC,qBAAqB;AAC7D,gBAAA,IAAI,CAAC,YAAY,KAAK,iBAAiB,CAAC,aAAa;AACrD,iBAAC,IAAI,CAAC,YAAY,KAAK,iBAAiB,CAAC,mBAAmB;oBAC1D,CAAC,wBAAwB,CAAC,EAC5B;AACA,gBAAA,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC;AACtC,aAAA;AACH,SAAC,CAAC,CAAC;AACL,QAAA,IAAI,CAAC,SAAS;AACZ,cAAE,WAAW,EAAE;AACd,aAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;aAC9B,SAAS,CAAC,MAAK;AACd,YAAA,IAAI,qBAAqB,EAAE;gBACzB,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;AAC/D,aAAA;YACD,IAAI,IAAI,CAAC,wBAAwB,EAAE;AACjC,gBAAA,IAAI,CAAC,wBAAwB,GAAG,KAAK,CAAC;gBACtC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,iBAA8B,CAAC,CAAC;AACpE,aAAA;AACH,SAAC,CAAC,CAAC;KACN;AACD;;;AAGG;;AAEH,IAAA,2BAA2B,CAAC,SAAoB,EAAA;AAC9C,QAAA,MAAM,gBAAgB,GAAGC,WAAwB,EAAE,gBAAgB,CAAC;AACpE,QAAA,MAAM,uBAAuB,GAAG;YAC9B,eAAe,EAAE,gBAAgB,EAAE,eAAe;YAClD,gBAAgB,EAAE,gBAAgB,EAAE,gBAAgB;YACpD,aAAa,EACX,gBAAgB,EAAE,aAAa,GAAG,SAAS,EAAE,SAAS,GAAG,GAAG;AAC9D,YAAA,iBAAiB,EAAE,IAAI,CAAC,aAAa,EAAE,MAAM;SAC9C,CAAC;QACF,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,0BAA0B,EAAE;AAC7D,YAAA,IAAI,EAAE,uBAAuB;AAC7B,YAAA,KAAK,EAAE,MAAM;AACb,YAAA,SAAS,EAAE,QAAQ;AACnB,YAAA,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK;AAC5C,SAAA,CAAC,CAAC;AACH,QAAA,IAAI,CAAC,SAAS;AACX,aAAA,WAAW,EAAE;AACb,aAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC9B,aAAA,SAAS,CAAC,CAAC,MAAe,KAAI;AAC7B,YAAA,IAAI,MAAM,EAAE;AACV,gBAAA,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;AAC7B,aAAA;AACH,SAAC,CAAC,CAAC;KACN;AACD;;;AAGG;AACH,IAAA,WAAW,CAAC,SAAoB,EAAA;AAC9B,QAAA,MAAM,eAAe,GAAGA,WAAwB,CAAC;AACjD,QAAA,IAAI,CAAC,eAAe,GAAG,SAAS,EAAE,SAAS,CAAC;AAC5C,QAAA,MAAM,kBAAkB,GAAuB;AAC7C,YAAA,OAAO,EAAE;gBACP,OAAO,EAAE,SAAS,EAAE,OAAO;AAC5B,aAAA;SACF,CAAC;AACF,QAAA,IAAI,CAAC,aAAa;aACf,WAAW,CAAC,kBAAkB,CAAC;AAC/B,aAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC9B,aAAA,SAAS,CAAC;;AAET,YAAA,IAAI,EAAE,CAAC,GAAQ,KAAI;AACjB,gBAAA,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC;gBACxB,IAAI,GAAG,EAAE,MAAM,EAAE;oBACf,IAAI,IAAI,CAAC,iBAAiB;AACxB,wBAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;AAC7C,yBAAA,IAAI,IAAI,CAAC,iBAAiB,CAAC,EAAE,KAAK,EAAE;AACvC,wBAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;;AAC9C,wBAAA,IAAI,CAAC,cAAc,GAAG,SAAS,EAAE,OAAO,CAAC;AAC9C,oBAAA,IAAI,CAAC,gBAAgB,CACnB,SAAS,EAAE,OAAO,EAClB,SAAS,EAAE,SAAS,GAAG,eAAe,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,CACnE,CAAC;AACH,iBAAA;aACF;;AAED,YAAA,KAAK,EAAE,CAAC,KAAU,KAAI;AACpB,gBAAA,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;aAC1B;AACF,SAAA,CAAC,CAAC;KACN;AACD;;;AAGG;IACH,aAAa,GAAA;AACX,QAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;AAChC,QAAA,IAAI,CAAC,mBAAmB,GAAG,KAAK,CAAC;KAClC;AACD;;;AAGG;IACH,eAAe,GAAA;AACb,QAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;AAChC,QAAA,IAAI,CAAC,mBAAmB,GAAG,KAAK,CAAC;KAClC;AACD;;;;AAIG;AAEH,IAAA,kBAAkB,CAAC,UAAkB,EAAA;AACnC,QAAA,IAAI,CAAC,iBAAiB,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC;QAC3C,IAAI,CAAC,aAAa,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAClE,IACE,CAAC,IAAI,CAAC,iBAAiB;aACtB,IAAI,CAAC,mBAAmB,IAAI,IAAI,CAAC,mBAAmB,CAAC,EACtD;AACA,YAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YACjD,OAAO;AACR,SAAA;QACD,IAAI,CAAC,IAAI,CAAC,iBAAiB;YAAE,OAAO;QACpC,IAAI,CAAC,2BAA2B,GAAG,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC;QAC5D,IAAI,CAAC,aAAa,EAAE,CAAC;AACrB,QAAA,IAAI,CAAC,aAAa;aACf,mBAAmB,CAClB,IAAI,CAAC,iBAAiB,EACtB,IAAI,CAAC,cAAc,EAAE,mBAAmB;YACtC,IAAI,CAAC,iBAAiB,EAAE,IAAI;AAC5B,cAAE,SAAS;AACX,cAAG,IAAI,CAAC,iBAAiB,EAAE,EAAa,CAC3C;AACA,aAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC9B,aAAA,SAAS,CAAC;AACT,YAAA,IAAI,EAAE,CAAC,QAAQ,KAAI;gBACjB,IAAI,QAAQ,EAAE,MAAM,EAAE;oBACpB,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;AAChE,iBAAA;aACF;;AAED,YAAA,KAAK,EAAE,CAAC,KAAU,KAAI;AACpB,gBAAA,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAC;AAC3B,gBAAA,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;aAC1B;AACF,SAAA,CAAC,CAAC;KACN;AACD;;;;AAIG;IACH,mBAAmB,GAAA;QACjB,MAAM,gBAAgB,GAAmB,EAAE,CAAC;QAC5C,gBAAgB,CAAC,IAAI,CAAC;AACpB,YAAA,EAAE,EAAE,EAAE;AACN,YAAA,IAAI,EAAE,IAAI,CAAC,cAAc,EAAE,mBAAmB;AAC/C,SAAA,CAAC,CAAC;QACH,IAAI,CAAC,cAAc,EAAE,EAAE,OAAO,CAAC,CAAC,IAAI,KAAI;YACtC,gBAAgB,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;AAC9D,SAAC,CAAC,CAAC;AACH,QAAA,OAAO,gBAAgB,CAAC;KACzB;AACD;;;;AAIG;IACH,cAAc,GAAA;AACZ,QAAA,OAAO,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CACzC,CAAC,MAA2B,EAAE,MAA2B,KACtD,MAAM,CAAC,CAAC,CAAC,EAAE,SAAoB,GAAI,MAAM,CAAC,CAAC,CAAC,EAAE,SAAoB,CACtE,CAAC;KACH;AACD;;;;AAIG;AACH,IAAA,mBAAmB,CAAC,KAAmB,EAAA;AACrC,QAAA,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;QAC/B,IAAI,CAAC,2BAA2B,GAAG,CAAC,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,CAAC;QAChE,IAAI,IAAI,CAAC,iBAAiB,EAAE;AAC1B,YAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YAChD,IAAI,CAAC,eAAe,EAAE,CAAC;YACvB,OAAO;AACR,SAAA;QACD,IAAI,CAAC,gBAAgB,GAAG;AACtB,YAAA,OAAO,EAAE,EAAE;AACX,YAAA,WAAW,EAAE,IAAI,CAAC,iBAAiB,EAAE,EAAY;SAClD,CAAC;AACF,QAAA,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC;QAC5B,IAAI,CAAC,aAAa,EAAE,oBAAoB,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;QACpE,IAAI,CAAC,SAAS,EAAE,CAAC;KAClB;AACD;;;AAGG;AACH,IAAA,SAAS,CAAC,KAAiB,EAAA;AACzB,QAAA,IAAI,KAAK,EAAE;YACT,IAAI,CAAC,gBAAgB,GAAG;AACtB,gBAAA,OAAO,EAAE,KAAK,EAAE,OAAO,IAAI,EAAE;AAC7B,gBAAA,WAAW,EAAE,EAAE;aAChB,CAAC;AACH,SAAA;AAAM,aAAA,IAAI,IAAI,CAAC,gBAAgB,CAAC,WAAW,KAAK,EAAE,EAAE;YACnD,IAAI,CAAC,gBAAgB,GAAG;AACtB,gBAAA,OAAO,EAAE,EAAE;AACX,gBAAA,WAAW,EAAE,EAAE;aAChB,CAAC;AACH,SAAA;AACD,QAAA,IAAI,CAAC,aAAa;AACf,aAAA,SAAS,CAAC,IAAI,CAAC,gBAAgB,CAAC;AAChC,aAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC9B,aAAA,SAAS,CAAC;AACT,YAAA,IAAI,EAAE,CAAC,QAAQ,KAAI;gBACjB,IAAI,QAAQ,EAAE,MAAM,EAAE;AACpB,oBAAA,IAAI,KAAK,EAAE;wBACT,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;AAC/D,qBAAA;AAAM,yBAAA;wBACL,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;AAChE,qBAAA;AACF,iBAAA;aACF;AACD,YAAA,KAAK,EAAE,CAAC,KAAK,KAAI;AACf,gBAAA,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;aAC1B;AACF,SAAA,CAAC,CAAC;KACN;AACD;;;;;AAKG;AACH,IAAA,iBAAiB,CAAC,QAAqB,EAAA;AACrC,QAAA,QAAQ,EAAE,OAAO,CAAC,CAAC,IAAI,KAAI;YACzB,MAAM,aAAa,GAAc,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AACjE,YAAA,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;AACrC,SAAC,CAAC,CAAC;AACH,QAAA,OAAO,QAAQ,CAAC;KACjB;AACD;;;AAGG;IACH,aAAa,GAAA;AACX,QAAA,IAAI,CAAC,aAAa;AACf,aAAA,aAAa,EAAE;AACf,aAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC9B,aAAA,SAAS,CAAC;AACT,YAAA,IAAI,EAAE,CAAC,GAAG,KAAI;gBACZ,IAAI,GAAG,EAAE,MAAM,EAAE;AACf,oBAAA,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE,sBAAsB,CAC1D,GAAG,EAAE,IAAI,CACV,CAAC;AACF,oBAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;oBACrD,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC;oBACpD,IAAI,CAAC,+BAA+B,EAAE,CAAC;AACvC,oBAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;AAClD,iBAAA;aACF;AACD,YAAA,KAAK,EAAE,CAAC,KAAK,KAAI;AACf,gBAAA,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;aAC1B;AACF,SAAA,CAAC,CAAC;KACN;AACD,IAAA,IAAY,uBAAuB,GAAA;AACjC,QAAA,OAAO,CAAkB,eAAA,EAAA,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAG,EAAA,MAAM,CAAC,QAAQ,CAAC,MAAM,wBAAwB,CAAC;KACpG;AAEO,IAAA,oBAAoB,CAAC,KAAgB,EAAA;AAC3C,QAAA,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE;YACnB,OAAO;AACR,SAAA;AACD,QAAA,MAAM,UAAU,GAAmC;AACjD,YAAA,OAAO,EAAE,CAAC;YACV,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,SAAS,EAAE,KAAK,CAAC,SAAS;SAC3B,CAAC;QACF,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,uBAAuB,EAAE,UAAU,CAAC,CAAC;KACxE;IAEO,+BAA+B,GAAA;QACrC,IAAI,IAAI,CAAC,0BAA0B,EAAE;YACnC,OAAO;AACR,SAAA;AACD,QAAA,IAAI,CAAC,0BAA0B,GAAG,IAAI,CAAC;QACvC,MAAM,UAAU,GAAG,WAAW;cAC1B,gBAAgB,GAAG,YAAY,CAAC,GAAG,CAAC,CAE3B,CAAC;AACd,QAAA,IAAI,UAAU,EAAE,IAAI,KAAK,QAAQ,EAAE;YACjC,OAAO;AACR,SAAA;AACD,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,CAC7C,IAAI,CAAC,uBAAuB,CACY,CAAC;AAC3C,QAAA,IACE,UAAU,EAAE,OAAO,KAAK,CAAC;YACzB,CAAC,UAAU,CAAC,OAAO;YACnB,CAAC,UAAU,CAAC,SAAS,EACrB;YACA,OAAO;AACR,SAAA;AACD,QAAA,MAAM,aAAa,GAAG;YACpB,OAAO,EAAE,UAAU,CAAC,OAAO;YAC3B,SAAS,EAAE,UAAU,CAAC,SAAS;SACnB,CAAC;AACf,QAAA,IAAI,CAAC,aAAa,CAAC,oBAAoB,CAAC,aAAa,CAAC,CAAC;AACvD,QAAA,IAAI,CAAC,4BAA4B,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;KACxD;AACD;;;;;;AAMG;IACH,gBAAgB,CAAC,SAAoB,EAAE,OAA0B,EAAA;AAC/D,QAAA,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC;AAC7B,YAAA,MAAM,EAAE,QAAQ;AAChB,YAAA,OAAO,EAAE,OAAO;AAChB,YAAA,SAAS,EAAE,SAAS;AACpB,YAAA,aAAa,EAAE,IAAI;AACpB,SAAA,CAAC,CAAC;KACJ;AACD;;;;;AAKG;AACH,IAAA,YAAY,CAAC,KAAwB,EAAA;QACnC,MAAM,UAAU,GAAa,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,CAAC;AAC5D,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE;YAC7B,MAAM,YAAY,GAChB,IAAI,CAAC,aAAa,EAAE,iBAAiB,CAAC,UAAU,CAAC,CAAC;AACpD,YAAA,IAAI,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE;AAChC,gBAAA,YAAY,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,eAAe,GAAG,YAAY,GAAG,CAAC,CAAC,CAAC;AAC5D,aAAA;YACD,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;AACrD,YAAA,IAAI,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC;AAAE,gBAAA,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAC;AAC9D,SAAA;AAAM,aAAA,IAAI,KAAK,IAAI,KAAK,YAAY,iBAAiB,EAAE;AACtD,YAAA,IAAI,CAAC,yBAAyB,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC;AACpD,SAAA;KACF;AACD;;;AAGG;IACH,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzB,QAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;KAC7B;+GA51BU,eAAe,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,SAAA,EAAA,EAAA,EAAA,KAAA,EAAAV,aAAA,EAAA,EAAA,EAAA,KAAA,EAAAf,IAAA,CAAA,aAAA,EAAA,EAAA,EAAA,KAAA,EAAAY,EAAA,CAAA,yBAAA,EAAA,EAAA,EAAA,KAAA,EAAAZ,IAAA,CAAA,yBAAA,EAAA,EAAA,EAAA,KAAA,EAAA0B,sBAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,0BAAA,EAAA,EAAA,EAAA,KAAA,EAAA3B,IAAA,CAAA,cAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;AAAf,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,eAAe,gTAFf,CAAC,aAAa,CAAC,ECrF5B,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,2qJA4HA,o3TDnDI,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA4B,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,eAAe,EACf,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,eAAe,4QACf,eAAe,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,kBAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,YAAA,EAAA,sBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACf,eAAe,EACf,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,cAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,oBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,YAAA,EAAA,UAAA,EAAA,iBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,EAAA,gBAAA,EAAA,sBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,iBAAiB,6TAEjB,mBAAmB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,eAAA,EAAA,cAAA,CAAA,EAAA,OAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA,EAAA;;4FAOV,eAAe,EAAA,UAAA,EAAA,CAAA;kBAnB3B,SAAS;+BAEE,eAAe,EAAA,UAAA,EACb,IAAI,EACP,OAAA,EAAA;wBACP,YAAY;wBACZ,eAAe;wBACf,eAAe;wBACf,eAAe;wBACf,eAAe;wBACf,iBAAiB;wBACjB,eAAe;wBACf,mBAAmB;AACpB,qBAAA,EAAA,aAAA,EAGc,iBAAiB,CAAC,IAAI,EAC1B,SAAA,EAAA,CAAC,aAAa,CAAC,EAAA,QAAA,EAAA,2qJAAA,EAAA,MAAA,EAAA,CAAA,6zTAAA,CAAA,EAAA,CAAA;gVA6CjB,cAAc,EAAA,CAAA;sBAAtB,KAAK;gBAOG,aAAa,EAAA,CAAA;sBAArB,KAAK;gBACG,UAAU,EAAA,CAAA;sBAAlB,KAAK;gBACG,eAAe,EAAA,CAAA;sBAAvB,KAAK;gBACG,QAAQ,EAAA,CAAA;sBAAhB,KAAK;gBAaF,qBAAqB,EAAA,CAAA;sBADxB,KAAK;gBAoBF,cAAc,EAAA,CAAA;sBADjB,KAAK;;;AE3KR;AAEA;;;;;;;;;;AAUG;IACS,mBAMX;AAND,CAAA,UAAY,kBAAkB,EAAA;AAC5B,IAAA,kBAAA,CAAA,SAAA,CAAA,GAAA,SAAmB,CAAA;AACnB,IAAA,kBAAA,CAAA,YAAA,CAAA,GAAA,YAAyB,CAAA;AACzB,IAAA,kBAAA,CAAA,WAAA,CAAA,GAAA,WAAuB,CAAA;AACvB,IAAA,kBAAA,CAAA,QAAA,CAAA,GAAA,QAAiB,CAAA;AACjB,IAAA,kBAAA,CAAA,SAAA,CAAA,GAAA,SAAmB,CAAA;AACrB,CAAC,EANW,kBAAkB,KAAlB,kBAAkB,GAM7B,EAAA,CAAA,CAAA,CAAA;AAmGD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;;;AAGG;IACS,mBAIX;AAJD,CAAA,UAAY,kBAAkB,EAAA;AAC5B,IAAA,kBAAA,CAAA,YAAA,CAAA,GAAA,YAAyB,CAAA;AACzB,IAAA,kBAAA,CAAA,WAAA,CAAA,GAAA,WAAuB,CAAA;AACvB,IAAA,kBAAA,CAAA,QAAA,CAAA,GAAA,QAAiB,CAAA;AACnB,CAAC,EAJW,kBAAkB,KAAlB,kBAAkB,GAI7B,EAAA,CAAA,CAAA;;MCnIY,YAAY,CAAA;+GAAZ,YAAY,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA,EAAA;gHAAZ,YAAY,EAAA,CAAA,CAAA,EAAA;gHAAZ,YAAY,EAAA,CAAA,CAAA,EAAA;;4FAAZ,YAAY,EAAA,UAAA,EAAA,CAAA;kBANxB,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,YAAY,EAAE,EAAE;AAChB,oBAAA,OAAO,EAAE,EACR;AACD,oBAAA,OAAO,EAAE,EAAE;AACZ,iBAAA,CAAA;;;ACPD;;AAEG;;ACFH;;AAEG;;;;"}
|
|
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/feature-flag.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/models/interest-response.model.ts","../../../projects/groups/src/lib/components/interest-responses/interest-responses.component.ts","../../../projects/groups/src/lib/components/interest-responses/interest-responses.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/models/custom-question.model.ts","../../../projects/groups/src/lib/components/custom-question-editor/custom-question-editor.component.ts","../../../projects/groups/src/lib/components/custom-question-editor/custom-question-editor.component.html","../../../projects/groups/src/lib/components/interest-form-preview/interest-form-preview.component.ts","../../../projects/groups/src/lib/components/interest-form-preview/interest-form-preview.component.html","../../../projects/groups/src/lib/services/interest-form.service.ts","../../../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 // Phone Number field regular expression which accepts digits, spaces and the common phone characters + - ( ) .\r\n phoneNumber: /^[+]?[0-9\\s\\-().]{1,20}$/,\r\n phoneNumberMaxLength: 20,\r\n // Address field maximum length.\r\n addressMaxLength: 500\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 VIEW_AND_MANAGE_GROUP_INTEREST = 'VIEW_AND_MANAGE_GROUP_INTEREST',\r\n RESTRICT_GROUPS_AND_ROSTERS = 'RESTRICT_GROUPS_AND_ROSTERS',\r\n}\r\n","/* eslint-disable no-unused-vars */\r\nexport enum FeatureFlag {\r\n INTEREST_FORM = 'FEATURE_INTEREST_FORM',\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\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 // SP3M-380: Per-group permission gating the \"Manage Interest Form\" action.\r\n // permissionId is the FE join key and MUST match the backend DB seed;\r\n // permissionName is the BE guard-match string and MUST equal the DB\r\n // permission_name (groups-api changelog + PermissionConstants).\r\n permissionType: PermissionType.VIEW_AND_MANAGE_GROUP_INTEREST,\r\n permissionName: 'View and Manage Group Interest Form',\r\n permissionId: 'PERM_VIEW_AND_MANAGE_GROUP_INTEREST',\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 permissionType: PermissionType.VIEW_AND_MANAGE_GROUP_INTEREST,\r\n permissionName: 'View and Manage Group Interest Form',\r\n permissionId: 'PERM_VIEW_AND_MANAGE_GROUP_INTEREST',\r\n },\r\n {\r\n permissionType: PermissionType.RESTRICT_GROUPS_AND_ROSTERS,\r\n permissionName: 'Restrict Manage Groups And Rosters',\r\n permissionId: 'PERM_RESTRICT_MANAGE_GROUPS_AND_ROSTERS',\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, StorageKeys, StorageService } 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 {\r\n FormStatus,\r\n CheckboxOption,\r\n AlertType,\r\n SelectOption,\r\n} from '@ieeesa-npm/models';\r\nimport { COUNTRY_DIAL_CODES } from '@ieeesa-npm/presentation';\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 { FeatureFlag } from '../models/feature-flag.model';\r\nimport { TenantFeature } from '../models/tenant-feature.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\nimport { CachedRequiredProfileFields } from '../models/required-profile-fields.model';\r\nimport {\r\n GroupInterestResponseView,\r\n InterestedRostersRequestPayload,\r\n InterestedRostersResponse,\r\n InterestFormResponse,\r\n UpdateMemberLevelPayload,\r\n} from '../models/interest-response.model';\r\n\r\n/**\r\n * Local storage key under which the hosting application caches the tenant's\r\n * required profile fields at login (shape: `{ appId, requiredFields }`). The\r\n * add-user / edit-user forms read this cache as the source of truth so they\r\n * always reflect the tenant configuration regardless of @Input/resolver timing.\r\n */\r\nconst REQUIRED_PROFILE_FIELDS_STORAGE_KEY = 'REQUIRED_PROFILE_FIELDS';\r\n\r\n/**\r\n * Local storage key under which the hosting application caches the tenant's\r\n * feature flags at login (shape: a bare `TenantFeature[]`). The interest-form\r\n * gate reads this cache as the source of truth so it reflects the tenant\r\n * configuration regardless of @Input/resolver timing.\r\n */\r\nconst TENANT_FEATURES_STORAGE_KEY = 'TENANT_FEATURES';\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 /**\r\n * Tenant-level required profile fields (e.g. ['phone','address','employer'])\r\n * supplied by the host app from its cached tenant configuration. Consumed by\r\n * the roster import to append tenant-mandated columns to the required-column\r\n * list and the sample file. Empty when the tenant has none configured.\r\n */\r\n requiredProfileFields: string[] = [];\r\n /**\r\n * Tenant feature flags supplied by the host app. Used by\r\n * {@link isInterestFormFeatureEnabled} to gate interest-form UI. Empty when\r\n * the host has not provided any features (fail-closed).\r\n */\r\n tenantFeatures: TenantFeature[] = [];\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,\r\n // eslint-disable-next-line no-unused-vars\r\n private storageService: StorageService // 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 * Stores the tenant-level required profile fields provided by the host app.\r\n * @param {string[]} requiredProfileFields - Field keys (e.g. 'phone').\r\n * @memberof GroupsService\r\n */\r\n setRequiredProfileFields(requiredProfileFields: string[]): void {\r\n this.requiredProfileFields = requiredProfileFields ?? [];\r\n }\r\n /**\r\n * Stores the tenant feature flags provided by the host app. Consumed by\r\n * {@link isInterestFormFeatureEnabled} to gate interest-form UI.\r\n * @param {TenantFeature[]} tenantFeatures - Tenant feature flags.\r\n * @memberof GroupsService\r\n */\r\n setTenantFeatures(tenantFeatures: TenantFeature[]): void {\r\n this.tenantFeatures = tenantFeatures ?? [];\r\n }\r\n /**\r\n * Returns the tenant feature flags (never null).\r\n *\r\n * Reads the local storage cache the hosting application writes at login (key\r\n * `TENANT_FEATURES`, a bare `TenantFeature[]`) as the source of truth, so the\r\n * interest-form gate reflects the tenant configuration regardless of the\r\n * @Input/resolver timing.\r\n *\r\n * The cache is only trusted when it is well-formed for the active\r\n * application: it must be an array and its entries must belong to the current\r\n * user's `appId`. The `TENANT_FEATURES` key is origin-wide, so a cache written\r\n * by another application on the same origin could otherwise flip the\r\n * interest-form gate with a different tenant's flags. When the cache is\r\n * missing, malformed, or scoped to another app, it falls back to the in-memory\r\n * value set via {@link setTenantFeatures} (the host @Input), then to an empty\r\n * list.\r\n * @return {TenantFeature[]}\r\n * @memberof GroupsService\r\n */\r\n getTenantFeatures(): TenantFeature[] {\r\n const cached = this.storageService?.getValue(\r\n TENANT_FEATURES_STORAGE_KEY\r\n ) as TenantFeature[] | null;\r\n const activeAppId = this.getUserInfo()?.appId;\r\n const isCacheUsable =\r\n Array.isArray(cached) &&\r\n (!activeAppId ||\r\n cached.every(\r\n (feature) => !feature?.appId || feature.appId === activeAppId\r\n ));\r\n if (isCacheUsable) return cached as TenantFeature[];\r\n return this.tenantFeatures ?? [];\r\n }\r\n /**\r\n * Returns the tenant-level required profile fields (never null).\r\n *\r\n * Reads the local storage cache the hosting application writes at login (key\r\n * `REQUIRED_PROFILE_FIELDS`) as the source of truth, so the add-user /\r\n * edit-user forms always reflect the tenant configuration regardless of the\r\n * @Input/resolver timing.\r\n *\r\n * The cache is only trusted when it is well-formed for the active\r\n * application: its `appId` must match the current user's `appId` and its\r\n * `requiredFields` must be an array. This guards against (a) a stale cache\r\n * from a previously opened application applying another tenant's fields, and\r\n * (b) a malformed cache crashing the forms when callers run\r\n * `requiredFields.includes(...)` on a non-array value. When the cache is\r\n * missing, for another app, or malformed, it falls back to the in-memory\r\n * value set via {@link setRequiredProfileFields} (the host @Input), then to\r\n * an empty list.\r\n * @return {string[]}\r\n * @memberof GroupsService\r\n */\r\n getRequiredProfileFields(): string[] {\r\n const cached = this.storageService?.getValue(\r\n REQUIRED_PROFILE_FIELDS_STORAGE_KEY\r\n ) as CachedRequiredProfileFields | null;\r\n const activeAppId = this.getUserInfo()?.appId;\r\n const isCacheUsable =\r\n !!cached &&\r\n Array.isArray(cached.requiredFields) &&\r\n (!activeAppId || cached.appId === activeAppId);\r\n if (isCacheUsable) return cached.requiredFields;\r\n return this.requiredProfileFields ?? [];\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 * Returns true when the user holds the negative permission that restricts all\r\n * group and roster write actions, regardless of any other granted permission.\r\n * @return {boolean}\r\n * @memberof GroupsService\r\n */\r\n isGroupsAndRostersRestricted(): boolean {\r\n return this.validateAccess(PermissionType.RESTRICT_GROUPS_AND_ROSTERS);\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 phoneCountryCode: item.phoneCountryCode ?? null,\r\n phoneNumber: item.phoneNumber ?? null,\r\n address: item.address ?? 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. Falls back to the USER_INFO blob\r\n * the host app persists to local storage when the userInfo input hasn't\r\n * been set yet (e.g. host wiring not completed or timing race on init).\r\n * @return {LoggedInUserInfo}\r\n * @memberof GroupsService\r\n */\r\n getUserInfo(): LoggedInUserInfo {\r\n if (this.userInfo?.appId) return this.userInfo;\r\n const storedUserInfo = this.storageService?.getValue(StorageKeys.USER_INFO);\r\n return storedUserInfo?.appId ? storedUserInfo : 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 * SP3M-380: Returns true when the interest-form feature\r\n * (`FEATURE_INTEREST_FORM`) is enabled for the current tenant. A single\r\n * boolean capability check the UI gates on. Reads the tenant features from\r\n * {@link getTenantFeatures} (local storage cache first, then the host\r\n * @Input). Fail-closed: an empty/undefined feature list, or a feature marked\r\n * deleted, yields false.\r\n * @return {boolean}\r\n * @memberof GroupsService\r\n */\r\n isInterestFormFeatureEnabled(): boolean {\r\n return this.getTenantFeatures().some(\r\n (feature) =>\r\n feature?.featureId === FeatureFlag.INTEREST_FORM && !feature?.isDeleted\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 /** Returns the unique calling codes derived from phone country metadata. */\r\n getCountryCallingCodes(): SelectOption[] {\r\n const dialCodes = [\r\n ...new Set(COUNTRY_DIAL_CODES.map((country) => country.dialCode)),\r\n ].sort(\r\n (first, second) =>\r\n Number(first.slice(1)) - Number(second.slice(1))\r\n );\r\n return dialCodes.map((dialCode) => ({ id: dialCode, name: dialCode }));\r\n }\r\n\r\n /**\r\n * Returns the stored interest-form responses for an interest record, for the\r\n * Roster Management admin \"View Responses\" view (SP3M-428, R8.7).\r\n *\r\n * GET {apiBaseUrl}/groups/interest/{interestId}/responses\r\n *\r\n * The endpoint is keyed by the interest record id ({@code GINT_SAAPPS_...}),\r\n * NOT the group id, and is guarded server-side by roster-view permissions\r\n * (VIEW_GROUP_MEMBERS on the group or the tenant-wide VIEW_ALL_ROSTERS). The\r\n * base URL already carries the version segment (e.g. `.../v1`), matching every\r\n * other GroupsService call built as `${apiBaseUrl}/groups/...`, so the version\r\n * is not repeated. The response envelope's body is the list of responses\r\n * (never null — an empty list means no answers were submitted).\r\n * @param {string} interestId - The interest record whose responses are read.\r\n * @return {Observable<InterestFormResponse[]>}\r\n * @memberof GroupsService\r\n */\r\n getInterestResponses(\r\n interestId: string\r\n ): Observable<InterestFormResponse[]> {\r\n return this.httpService\r\n .getData(`${this.apiBaseUrl}/groups/interest/${interestId}/responses`)\r\n .pipe(\r\n map((response) => (response?.body as InterestFormResponse[]) ?? []),\r\n catchError((errorRes) => {\r\n throw errorRes;\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Returns the interested-users roster for a group — one row per interest\r\n * carrying the user's name/email, organization affiliations, submitted\r\n * timestamp, the group's default membership level, and the group type id — so\r\n * the Roster Management admin \"Interested Rosters\" tab renders the whole group\r\n * in a single call (SP3M-428, R8.7).\r\n *\r\n * POST {apiBaseUrl}/groups/interest/group/{groupId}/responses\r\n *\r\n * The search term, pagination and sort options are sent in the request body\r\n * ({@link InterestedRostersRequestPayload}) so the backend can filter, page\r\n * and sort the roster server-side. Guarded server-side by roster-view\r\n * permissions (VIEW_GROUP_MEMBERS on the group or the tenant-wide\r\n * VIEW_ALL_ROSTERS). The base URL already carries the version segment,\r\n * matching every other GroupsService call built as `${apiBaseUrl}/groups/...`,\r\n * so the version is not repeated. The response envelope's body is an\r\n * {@link InterestedRostersResponse}: the roster rows live under `data` (never\r\n * null — an empty list means the group has no interests) alongside the paging\r\n * metadata (`totalRecords`, `offset`, `pageSize`).\r\n * @param {string} groupId - The group whose interested-users roster is read.\r\n * @param {InterestedRostersRequestPayload} payload - Search/pagination/sort options.\r\n * @return {Observable<InterestedRostersResponse>}\r\n * @memberof GroupsService\r\n */\r\n getInterestResponsesByGroup(\r\n groupId: string,\r\n payload: InterestedRostersRequestPayload\r\n ): Observable<InterestedRostersResponse> {\r\n return this.httpService\r\n .postData(\r\n `${this.apiBaseUrl}/groups/interest/group/${groupId}/responses`,\r\n payload\r\n )\r\n .pipe(\r\n map((response) => {\r\n const body = response?.body as InterestedRostersResponse | null;\r\n return {\r\n data: body?.data ?? [],\r\n totalRecords: body?.totalRecords ?? 0,\r\n offset: body?.offset ?? 0,\r\n pageSize: body?.pageSize ?? 0,\r\n };\r\n }),\r\n catchError((errorRes) => {\r\n throw errorRes;\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Sets/overrides the membership level for an interested user from the Roster\r\n * Management admin \"Interested Rosters\" tab (SP3M-428). Called when the admin\r\n * picks a value in a row's Member Level dropdown.\r\n *\r\n * PUT {apiBaseUrl}/groups/interest/member-level\r\n *\r\n * The group, user and selected role id are sent in the request body\r\n * ({@link UpdateMemberLevelPayload}). Guarded server-side by roster-management\r\n * permissions. The base URL already carries the version segment, matching\r\n * every other GroupsService call built as `${apiBaseUrl}/groups/...`, so the\r\n * version is not repeated. The response envelope's body is returned as-is.\r\n * @param {UpdateMemberLevelPayload} payload - Group + user + selected role id.\r\n * @return {Observable<unknown>}\r\n * @memberof GroupsService\r\n */\r\n updateInterestMemberLevel(\r\n payload: UpdateMemberLevelPayload\r\n ): Observable<unknown> {\r\n return this.httpService\r\n .putData(`${this.apiBaseUrl}/groups/interest/member-level`, payload)\r\n .pipe(\r\n map((response) => response?.body ?? null),\r\n catchError((errorRes) => {\r\n throw errorRes;\r\n })\r\n );\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 group action menu items the current user may see for the given\r\n * group, filtered by per-group permissions and group type. The \"Manage\r\n * Interest Form\" action (SP3M-380) renders when the interest-form feature is\r\n * enabled and the user has VIEW_AND_MANAGE_GROUP_INTEREST globally when they\r\n * hold MANAGE_ALL_GROUPS, or in this group's permission union otherwise. It is\r\n * hidden on admin/system group types and kept leftmost by the trailing sort.\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 !this.groupsService.isGroupsAndRostersRestricted() &&\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 !this.groupsService.isGroupsAndRostersRestricted() &&\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 !this.groupsService.isGroupsAndRostersRestricted() &&\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 // Manage-all users check the global interest permission; other users\r\n // need it in this group's union.\r\n (e?.id === GroupAction.MANAGE_INTEREST_FORM &&\r\n this.groupsService.isInterestFormFeatureEnabled() &&\r\n !isAdminGroupType &&\r\n (this.groupsService.validateAccess(\r\n this.permissionType.MANAGE_ALL_GROUPS\r\n )\r\n ? this.groupsService.validateAccess(\r\n this.permissionType.VIEW_AND_MANAGE_GROUP_INTEREST\r\n )\r\n : this.groupsService.validateAccess(\r\n this.permissionType.VIEW_AND_MANAGE_GROUP_INTEREST,\r\n groupPermissions ?? []\r\n )))\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((item) =>\r\n this.isSameOption(item, option)\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((item) =>\r\n this.isSameOption(item, option)\r\n );\r\n }\r\n\r\n /**\r\n * Identity check shared by isSelected / toggleOption / removeOption so all\r\n * three agree on what \"the same option\" means.\r\n *\r\n * Why not a strict id === id && name === name match: SelectOption.id is\r\n * `number | string`, and the two sides being compared do not always carry the\r\n * same representation of the same organization. A freshly searched API result\r\n * can arrive with a numeric id while the already-selected value (from edit\r\n * prefill, or a previous search) holds the string form of that same id, so a\r\n * strict === misses them. Free-text chips are added with an empty id\r\n * (see addTypedValue), so when the same name later comes back from the API\r\n * with a real id there is no id to match on at all. Both cases made the\r\n * dropdown checkbox render unchecked for an option that is in fact selected.\r\n *\r\n * Rule:\r\n * - If BOTH sides have a non-empty id, match by String(id) === String(id)\r\n * (number-vs-string safe).\r\n * - Otherwise (either side is a free-text chip with no id) fall back to a\r\n * trimmed, case-insensitive name match.\r\n * @param {SelectOption} a -first option.\r\n * @param {SelectOption} b -second option.\r\n * @return {boolean} true when both refer to the same organization.\r\n * @memberof OrgMultiSelectComponent\r\n */\r\n private isSameOption(a: SelectOption, b: SelectOption): boolean {\r\n const aId = a?.id;\r\n const bId = b?.id;\r\n const aHasId = aId !== undefined && aId !== null && `${aId}` !== '';\r\n const bHasId = bId !== undefined && bId !== null && `${bId}` !== '';\r\n if (aHasId && bHasId) {\r\n return `${aId}` === `${bId}`;\r\n }\r\n const aName = (a?.name ?? '').trim().toLowerCase();\r\n const bName = (b?.name ?? '').trim().toLowerCase();\r\n return aName !== '' && aName === bName;\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) => !this.isSameOption(item, option)\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 class=\"ieeesa-org-multi-select__checkbox\"\r\n color=\"primary\"\r\n [checked]=\"isSelected(option)\"\r\n [disableRipple]=\"true\"\r\n tabindex=\"-1\"\r\n aria-hidden=\"true\"\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 countryCallingCodes: SelectOption[] = [];\r\n orgSearchValue = '';\r\n // Tenant-configured optional profile fields (e.g. 'phone', 'address') to show on the edit-user form.\r\n requiredProfileFields: string[] = [];\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.countryCallingCodes = this.groupsService?.getCountryCallingCodes();\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 // Build the form only once the required-profile-fields response is known,\r\n // so the phone/address fields aren't shown then yanked away.\r\n this.getRequiredProfileFields();\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 // TEMP-DISABLED phone library field (country-code dropdown + libphonenumber-js),\r\n // read-only display here. Temporarily replaced by a plain read-only text input\r\n // below. Restore this block and remove the plain INPUT block when the\r\n // libphonenumber implementation is approved. Phone is display-only on this\r\n // form and is never read back into the submit payload.\r\n // ...(this.requiredProfileFields.includes('phone')\r\n // ? [\r\n // {\r\n // type: FormControlType.PHONE,\r\n // label: this.addUserRosterTexts?.label?.phoneNumber + '*',\r\n // controlName: 'phone',\r\n // value: {\r\n // countryCode:\r\n // this.selectedUserInfo?.phoneCountryCode ?? null,\r\n // phoneNumber: this.selectedUserInfo?.phoneNumber ?? null,\r\n // },\r\n // isReadonly: true,\r\n // ariaLabel:\r\n // this.addUserRosterTexts?.label?.ariaLabel?.phoneNumber,\r\n // ariaDescribedById:\r\n // this.addUserRosterTexts?.label?.ariaDescribedById\r\n // ?.phoneNumber,\r\n // },\r\n // ]\r\n // : []),\r\n // TEMP plain phone field (read-only) — no country-code dropdown, no formatting.\r\n // Uses TEXT_AREA with isReadonly to match the sibling read-only\r\n // email/fullName/address fields on this view-only form (the INPUT\r\n // component has no read-only display state).\r\n ...(this.requiredProfileFields.includes('phone')\r\n ? [\r\n {\r\n type: FormControlType.TEXT_AREA,\r\n label: this.addUserRosterTexts?.label?.phoneNumber + '*',\r\n controlName: 'phone',\r\n value: this.selectedUserInfo?.phoneNumber ?? '',\r\n isReadonly: true,\r\n isResize: false,\r\n ariaMultiline: false,\r\n ariaLabel:\r\n this.addUserRosterTexts?.label?.ariaLabel?.phoneNumber,\r\n ariaDescribedById:\r\n this.addUserRosterTexts?.label?.ariaDescribedById\r\n ?.phoneNumber,\r\n },\r\n ]\r\n : []),\r\n ...(this.requiredProfileFields.includes('address')\r\n ? [\r\n {\r\n type: FormControlType.TEXT_AREA,\r\n label: this.addUserRosterTexts?.label?.address + '*',\r\n controlName: 'address',\r\n value: this.selectedUserInfo?.address ?? '',\r\n isReadonly: true,\r\n isResize: false,\r\n ariaMultiline: true,\r\n ariaLabel: this.addUserRosterTexts?.label?.ariaLabel?.address,\r\n ariaDescribedById:\r\n this.addUserRosterTexts?.label?.ariaDescribedById\r\n ?.address,\r\n },\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 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 tenant's required profile fields so the edit-user form only shows\r\n * the phone/address fields the tenant has configured as required. Builds the\r\n * form once resolved (or immediately if the appId isn't available).\r\n * @memberof EditUserRolesComponent\r\n */\r\n getRequiredProfileFields(): void {\r\n this.requiredProfileFields =\r\n this.groupsService.getRequiredProfileFields() ?? [];\r\n this.editUserRolesFormGroup();\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 (single-line case). */\r\n errorMessage: string | null = null;\r\n\r\n /**\r\n * All API error messages when the BE returns multiple error codes at once\r\n * (e.g. several fields failed). Rendered as a list in the error banner. Empty\r\n * for single-message validation errors (which use {@link errorMessage}).\r\n */\r\n errorMessages: string[] = [];\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 /**\r\n * Required column headers for display and the sample file. This is the static\r\n * base set from constants PLUS any tenant-level required profile fields the\r\n * host app configured (e.g. phone / address / employer), mapped to friendly\r\n * headers and de-duplicated (case-insensitive) against the base columns.\r\n * @return {string[]}\r\n */\r\n get requiredColumns(): string[] {\r\n const base: string[] = this.screenTexts?.requiredColumns ?? [];\r\n return this.mergeTenantColumns(base);\r\n }\r\n\r\n /**\r\n * Appends the tenant-configured columns (from {@link tenantExtraColumns}) to\r\n * the base column headers.\r\n * @param {string[]} base - The static base column headers.\r\n * @return {string[]}\r\n * @memberof RosterImportComponent\r\n */\r\n private mergeTenantColumns(base: string[]): string[] {\r\n const extras = this.tenantExtraColumns(base);\r\n return extras.length ? [...base, ...extras.map((c) => c.label)] : base;\r\n }\r\n\r\n /**\r\n * Resolves the tenant-configured required profile fields into the EXTRA\r\n * columns to append after the base set — the single source of truth shared by\r\n * both the header list ({@link requiredColumns}) and the sample file\r\n * ({@link downloadSampleFile}) so the two never drift out of alignment.\r\n *\r\n * Each field becomes one column with its friendly `label` (known keys use the\r\n * label map; unknown keys fall back to a title-cased key) and a `sampleValue`\r\n * for the sample row. Fields whose label already exists in the base set\r\n * (case-insensitive) are skipped so a tenant field like \"employer\" that is\r\n * already a base column is not duplicated.\r\n * @param {string[]} base - The static base column headers.\r\n * @return {{ label: string; sampleValue: string }[]}\r\n * @memberof RosterImportComponent\r\n */\r\n private tenantExtraColumns(\r\n base: string[]\r\n ): { label: string; sampleValue: string }[] {\r\n const tenantFields = this.groupService?.getRequiredProfileFields() ?? [];\r\n if (!tenantFields.length) {\r\n return [];\r\n }\r\n const sampleMap = this.screenTexts?.tenantFieldSampleValues ?? {};\r\n const seen = new Set(base.map((col) => col.toLowerCase()));\r\n const extras: { label: string; sampleValue: string }[] = [];\r\n tenantFields.forEach((field) => {\r\n const label = this.tenantFieldLabel(field);\r\n if (label && !seen.has(label.toLowerCase())) {\r\n seen.add(label.toLowerCase());\r\n extras.push({ label, sampleValue: sampleMap[field] ?? '' });\r\n }\r\n });\r\n return extras;\r\n }\r\n\r\n /**\r\n * Maps a tenant field key to its display header. Known keys use the configured\r\n * label map; unknown keys fall back to a title-cased key.\r\n * @param {string} field - The tenant field key (e.g. 'phone').\r\n * @return {string}\r\n * @memberof RosterImportComponent\r\n */\r\n private tenantFieldLabel(field: string): string {\r\n const labels = this.screenTexts?.tenantFieldLabels ?? {};\r\n if (labels[field]) {\r\n return labels[field];\r\n }\r\n // Fallback: \"phone_number\" -> \"Phone Number\".\r\n return field\r\n .replace(/[_-]+/g, ' ')\r\n .replace(/\\b\\w/g, (char) => char.toUpperCase());\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 // Reset so re-selecting the same file triggers change again.\r\n input.value = '';\r\n return;\r\n }\r\n this.processFile(input.files[0]);\r\n // Reset the native input value so picking the same file after an error\r\n // still fires the change event (otherwise the browser skips it because\r\n // the value hasn't changed).\r\n input.value = '';\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.errorMessages = [];\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.errorMessages = [];\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 * Returns from the result screen to a clean upload state so the user can\r\n * upload a corrected file (e.g. after downloading the error log) without\r\n * closing and reopening the import dialog. Clears the previous file,\r\n * result, errors and job id.\r\n * @memberof RosterImportComponent\r\n */\r\n onUploadNewFile(): void {\r\n this.selectedFile = null;\r\n this.errorMessage = null;\r\n this.errorMessages = [];\r\n this.noDataMessage = null;\r\n this.uploadResult = null;\r\n this.jobErrors = [];\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.errorMessages = [];\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 // Reset the selected file so the user can pick a new (or the same) file\r\n // after an error. Without this, selectedFile stays set and the dropzone\r\n // shows the old filename; worse, re-selecting the same file doesn't fire\r\n // the input's change event (the value hasn't changed), leaving the user\r\n // stuck.\r\n this.selectedFile = null;\r\n\r\n // BE error codes take priority when present (e.g. 1071 no permission, 1072\r\n // format, 1073 too large, 1074 row limit, 1075 invalid status). The BE can\r\n // return MULTIPLE codes at once (e.g. [\"2017\",\"2018\",\"2014\"] when several\r\n // fields fail), so map and show ALL of them — not just the first — as a\r\n // list in the error banner.\r\n const errorCodes: string[] | undefined = error?.error?.body?.errorCodes;\r\n if (Array.isArray(errorCodes) && errorCodes.length) {\r\n const messages = errorCodes.map(\r\n (code) =>\r\n this.constants?.errors?.[code as keyof typeof this.constants.errors] ??\r\n this.screenTexts?.validation?.uploadFailed ??\r\n 'An error occurred while importing the roster. Please try again.'\r\n );\r\n // De-duplicate so the same message is not repeated when two codes map to\r\n // the same text.\r\n this.errorMessages = Array.from(new Set(messages));\r\n // Keep errorMessage populated (first message) for backward compatibility\r\n // and for the single-line case.\r\n this.errorMessage = this.errorMessages[0] ?? null;\r\n return;\r\n }\r\n\r\n // A 403 with no error-code body comes from the endpoint's @PreAuthorize\r\n // (the user lacks Manage Group Member / Manage All Rosters for this group).\r\n // Show the permission message — retrying will not help.\r\n const status = error?.status ?? error?.error?.status;\r\n if (status === 403) {\r\n this.errorMessage =\r\n this.screenTexts?.validation?.forbidden ??\r\n 'You do not have permission to import a roster for this group.';\r\n return;\r\n }\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 * Normalizes the BE `error_report` into row-error view models.\r\n *\r\n * The BE wraps the per-row entries in a `{ rows: [ { row, field, message } ] }`\r\n * document, but that value has been observed to arrive in MULTIPLE shapes:\r\n * - a parsed object `{ rows: [...] }` (confirm response — the common case),\r\n * - a raw JSON string of the same object (JSONB passthrough), or\r\n * - a bare array `[ { row, field, message } ]`.\r\n * This handles all three (and `null`) so the error log renders regardless of\r\n * how the field is serialized.\r\n * @param {*} errorReport - The BE error_report (object, string, array, or null).\r\n * @return {RosterImportRowError[]}\r\n * @memberof RosterImportComponent\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private parseErrorReport(errorReport?: any): RosterImportRowError[] {\r\n if (!errorReport) {\r\n return [];\r\n }\r\n // If it's a string, parse it first; on parse failure, no row errors.\r\n let value: unknown = errorReport;\r\n if (typeof errorReport === 'string') {\r\n try {\r\n value = JSON.parse(errorReport);\r\n } catch {\r\n return [];\r\n }\r\n }\r\n // Accept either a bare array or a { rows: [...] } wrapper object.\r\n const entries: RosterImportErrorReport[] = Array.isArray(value)\r\n ? (value as RosterImportErrorReport[])\r\n : ((value as { rows?: RosterImportErrorReport[] })?.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 }\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. The base row values come from constants; sample\r\n // values for any tenant-configured columns are appended (from the SAME\r\n // source that builds the headers) so every row lines up with the\r\n // (base + tenant) header set.\r\n const base: string[] = this.screenTexts?.requiredColumns ?? [];\r\n const baseSampleRows: string[][] = this.screenTexts?.sampleRows ?? [];\r\n const tenantSampleCells = this.tenantExtraColumns(base).map(\r\n (col) => col.sampleValue\r\n );\r\n const dataLines = baseSampleRows.map((row) =>\r\n [...row, ...tenantSampleCells]\r\n .map((cell) => this.toCsvCell(cell))\r\n .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 && importState === 'upload'\"\r\n mat-button\r\n type=\"button\"\r\n class=\"mat-tertiary-button ieeesa-roster-import__import-btn\"\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=\"errorMessages.length || errorMessage\"\r\n class=\"ieeesa-roster-import__error-banner\"\r\n role=\"alert\"\r\n >\r\n <!-- Multiple API error messages (e.g. several fields failed): list them. -->\r\n <ul\r\n *ngIf=\"errorMessages.length > 1; else singleError\"\r\n class=\"ieeesa-roster-import__error-list\"\r\n >\r\n <li *ngFor=\"let message of errorMessages\">{{ message }}</li>\r\n </ul>\r\n <!-- Single message (validation errors or one API error). -->\r\n <ng-template #singleError>\r\n {{ errorMessages[0] ?? errorMessage }}\r\n </ng-template>\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 <button\r\n *ngIf=\"importState === 'result'\"\r\n mat-button\r\n type=\"button\"\r\n class=\"mat-primary-button ieeesa-roster-import__upload-new-btn\"\r\n (click)=\"onUploadNewFile()\"\r\n [attr.aria-label]=\"screenTexts?.ariaLabel?.uploadNewFile ?? 'Upload different file'\"\r\n >\r\n {{ screenTexts?.buttons?.uploadNewFile ?? 'Upload Different File' }}\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 { DateTime } from 'luxon';\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. The \"Timestamp\" and \"Person Imported\" columns\r\n * map to `createdOn` / `createdBy`; these are currently `@JsonIgnore` on the BE\r\n * entity, so until the BE exposes them the columns show a placeholder, and they\r\n * populate automatically once the response carries the fields. \"Target Group\"\r\n * 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 // createdOn / createdBy are populated only once the BE exposes them\r\n // (currently @JsonIgnore). Until then they are undefined and the\r\n // placeholder is shown.\r\n timestamp: job?.createdOn\r\n ? this.formatTimestamp(job.createdOn)\r\n : this.placeholder,\r\n personImported: job?.createdBy ?? 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 * Formats the BE `createdOn` timestamp for display, converting from UTC to the\r\n * browser's local timezone.\r\n *\r\n * The API sends a UTC wall-clock string in `dd/MM/yyyy HH:mm:ss` with NO zone\r\n * marker, so it must be parsed EXPLICITLY as UTC (otherwise luxon/JS would\r\n * assume local time and shift it incorrectly), then rendered in the system\r\n * (browser) zone via toLocal(). Uses luxon per the project's date standards\r\n * (moment is legacy — not used for new code).\r\n * @param {string} value - The raw UTC createdOn value from the BE.\r\n * @return {string} the localized display string, or the placeholder when\r\n * blank/invalid.\r\n * @memberof RosterImportHistoryComponent\r\n */\r\n private formatTimestamp(value: string): string {\r\n if (!value) {\r\n return this.placeholder;\r\n }\r\n const parsed = this.parseUtcTimestamp(value);\r\n if (!parsed || !parsed.isValid) {\r\n return this.placeholder;\r\n }\r\n // toLocal() shifts to the browser's zone; format to match the Figma:\r\n // \"20 Aug 2026 · 3:55 PM\" (no seconds, 12-hour time with AM/PM).\r\n return parsed.toLocal().toFormat(\"dd LLL yyyy '·' h:mm a\");\r\n }\r\n\r\n /**\r\n * Parses a BE timestamp string into a luxon {@link DateTime}, tolerant of the\r\n * several shapes the backend may send so the UI renders correctly regardless\r\n * of which format is used.\r\n *\r\n * The agreed/expected BE format is a UTC wall-clock string `dd/MM/yyyy HH:mm:ss`\r\n * with NO zone marker; it is tried FIRST and parsed explicitly in UTC. If the\r\n * BE instead sends a different shape, these fallbacks are tried in order:\r\n * 1. `dd/MM/yyyy HH:mm:ss` (UTC) — the expected/agreed format\r\n * 2. ISO-8601 (e.g. 2026-10-09T14:23:05Z or with offset) — zone from the string,\r\n * or assumed UTC when the string carries none\r\n * 3. SQL datetime `yyyy-MM-dd HH:mm:ss` (UTC)\r\n * 4. `dd/MM/yyyy HH:mm` (UTC, no seconds)\r\n * 5. RFC-2822 / HTTP date\r\n * 6. native JS Date (last resort) — assumed UTC\r\n * The first format that yields a valid DateTime wins. Returns null when none\r\n * parse.\r\n * @param {string} value - The raw timestamp string from the BE.\r\n * @return {(DateTime | null)}\r\n * @memberof RosterImportHistoryComponent\r\n */\r\n private parseUtcTimestamp(value: string): DateTime | null {\r\n const raw = value.trim();\r\n const utc = { zone: 'utc' };\r\n\r\n // 1. Expected/agreed format first.\r\n let parsed = DateTime.fromFormat(raw, 'dd/MM/yyyy HH:mm:ss', utc);\r\n if (parsed.isValid) {\r\n return parsed;\r\n }\r\n\r\n // 2. ISO-8601. setZone keeps an explicit offset/Z; a zoneless ISO string is\r\n // interpreted as UTC (matches the \"wall-clock is UTC\" contract).\r\n parsed = DateTime.fromISO(raw, { setZone: true });\r\n if (parsed.isValid) {\r\n // When the ISO string had no zone, luxon used the system zone; re-interpret\r\n // as UTC so a zoneless value is still treated as UTC.\r\n return /[zZ]|[+-]\\d{2}:?\\d{2}$/.test(raw)\r\n ? parsed\r\n : DateTime.fromISO(raw, utc);\r\n }\r\n\r\n // 3. SQL datetime.\r\n parsed = DateTime.fromFormat(raw, 'yyyy-MM-dd HH:mm:ss', utc);\r\n if (parsed.isValid) {\r\n return parsed;\r\n }\r\n\r\n // 4. Day/month/year without seconds.\r\n parsed = DateTime.fromFormat(raw, 'dd/MM/yyyy HH:mm', utc);\r\n if (parsed.isValid) {\r\n return parsed;\r\n }\r\n\r\n // 5. RFC-2822 / HTTP date (both carry their own zone).\r\n parsed = DateTime.fromRFC2822(raw);\r\n if (parsed.isValid) {\r\n return parsed;\r\n }\r\n parsed = DateTime.fromHTTP(raw);\r\n if (parsed.isValid) {\r\n return parsed;\r\n }\r\n\r\n // 6. Last resort: native Date, treated as UTC.\r\n const jsDate = new Date(raw);\r\n if (!isNaN(jsDate.getTime())) {\r\n return DateTime.fromJSDate(jsDate, utc);\r\n }\r\n\r\n return null;\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","/* eslint-disable no-unused-vars */\r\n\r\n/**\r\n * Interest-form field types frozen on each stored response via the backend's\r\n * {@code field_type_snapshot} column. Mirrors the BE `FieldType` enum\r\n * (sa-saapps-groups-api: org.ieee.standards.groups.model.FieldType) and drives\r\n * how {@link InterestFormResponse.answerValue} is rendered in the admin\r\n * \"View Responses\" dialog (single value vs. a list for CHECKBOX).\r\n */\r\nexport enum InterestFieldType {\r\n TEXT = 'TEXT',\r\n TEXTAREA = 'TEXTAREA',\r\n SELECT = 'SELECT',\r\n CHECKBOX = 'CHECKBOX',\r\n RADIO = 'RADIO',\r\n DATE = 'DATE',\r\n}\r\n\r\n/**\r\n * A single submitted answer to an interest-form question, as returned by the\r\n * backend from\r\n * {@code GET {apiBaseUrl}/groups/interest/{interestId}/responses}.\r\n *\r\n * Mirrors the UI-view projection of the BE `InterestFormResponse` entity\r\n * (sa-saapps-groups-api: org.ieee.standards.groups.model.InterestFormResponse);\r\n * only the fields annotated with the BE `@JsonView(UiView)` are serialized —\r\n * the audit/app_id columns are `@JsonIgnore` and never arrive on the client.\r\n *\r\n * {@link questionLabelSnapshot} and {@link fieldTypeSnapshot} freeze the\r\n * question label and field type as configured at submit time, so later form\r\n * configuration changes apply only to new submissions (R8.6, R8.8).\r\n * {@link answerValue} is a JSONB passthrough: it arrives as a plain string for\r\n * single-value fields (TEXT/TEXTAREA/SELECT/RADIO/DATE) and as a string[] for\r\n * multi-select (CHECKBOX).\r\n */\r\nexport interface InterestFormResponse {\r\n /** Response row identifier (e.g. \"IFR_SAAPPS_...\"). */\r\n responseId: string;\r\n /** The interest record this answer belongs to (e.g. \"GINT_SAAPPS_...\"). */\r\n interestId: string;\r\n /** The question this answer is for (e.g. \"IFQ_SAAPPS_...\"), when available. */\r\n questionId?: string;\r\n /** Question label frozen at submit time (R8.6, R8.8). */\r\n questionLabelSnapshot?: string;\r\n /** Field type frozen at submit time; see {@link InterestFieldType}. */\r\n fieldTypeSnapshot?: string;\r\n /**\r\n * Submitted answer. A string for single-value fields; a string[] for\r\n * CHECKBOX. `null`/undefined when the question was left unanswered.\r\n */\r\n answerValue?: string | string[] | null;\r\n}\r\n\r\n/**\r\n * A single organization affiliation on an interested-roster row, as returned\r\n * inside {@link GroupInterestResponseView.affiliation}. Mirrors the UI-view\r\n * projection of the BE `Organization` entity (only `orgId`/`orgName` are\r\n * `@JsonView(UiView)`; the rest are `@JsonIgnore`).\r\n */\r\nexport interface InterestAffiliation {\r\n /** Organization id (e.g. \"ORG_SAAPPS_...\"). */\r\n orgId: string;\r\n /** Organization display name. */\r\n orgName: string;\r\n}\r\n\r\n/**\r\n * A single membership level (role) on an interested-roster row, as returned\r\n * inside {@link GroupInterestResponseView.memberLevel}. Mirrors the UI-view\r\n * projection of the BE role object: the level is a group role, so the fields\r\n * are role-shaped ({@link roleId}/{@link roleName}). The list carries at most\r\n * one element — the interest's current/assigned membership level (empty when\r\n * none is assigned).\r\n */\r\nexport interface InterestMembershipLevel {\r\n /** Role id of the membership level (e.g. \"ROLE_SAAPPS_...\"). */\r\n roleId: string;\r\n /** Role type id, when categorized; `null` otherwise. */\r\n roleType?: string | null;\r\n /** Display name of the level (e.g. \"Member\"). Bound as the dropdown value. */\r\n roleName: string;\r\n /** Human-readable role type name; `null` otherwise. */\r\n roleTypeName?: string | null;\r\n /** Display order within the group type's role catalog. */\r\n viewOrder?: number;\r\n}\r\n\r\n/**\r\n * One interested-users roster row for a group, as returned by the backend from\r\n * {@code GET {apiBaseUrl}/groups/interest/group/{groupId}/responses}.\r\n *\r\n * Mirrors the UI-view projection of the BE `GroupInterestResponseView` read\r\n * object (sa-saapps-groups-api:\r\n * org.ieee.standards.groups.model.GroupInterestResponseView). It combines the\r\n * interest record with the interested user's name/email, their organization\r\n * affiliations for the group, the submitted timestamp, the group's default\r\n * membership level (at most one element), and the group's type id, so the whole\r\n * \"Interested\" roster renders in a single call (R8.7). Only `@JsonView(UiView)`\r\n * fields are serialized; tenant app_id and audit columns stay hidden.\r\n */\r\nexport interface GroupInterestResponseView {\r\n /** The interest record id (e.g. \"GINT_SAAPPS_...\"). */\r\n interestId: string;\r\n /** The group the interest belongs to (e.g. \"GRP_SAAPPS_...\"). */\r\n groupId?: string;\r\n /** The interested user's id (e.g. \"User_NESC_...\"). */\r\n userId: string;\r\n /** Interested user's display name. */\r\n name: string;\r\n /** Interested user's email address. */\r\n email: string;\r\n /** Organization affiliations for the group (id + name). */\r\n affiliation: InterestAffiliation[];\r\n /** Submitted timestamp (ISO date string; BE `Date`). */\r\n submittedOn: string;\r\n /** Group's default membership level (0 or 1 element). */\r\n memberLevel: InterestMembershipLevel[];\r\n /** The group's group type id. */\r\n groupTypeId?: string;\r\n}\r\n\r\n/**\r\n * Request payload for the interested-users roster list endpoint\r\n * ({@code POST {apiBaseUrl}/groups/interest/group/{groupId}/responses}).\r\n *\r\n * Follows the repo payload convention of wrapping the request body in a\r\n * {@code payload} key (matching FilterUsersPayload, SearchUsersPayload, etc.).\r\n * Supports server-side search ({@link InterestedRostersRequestBody.searchByNameOrEmail})\r\n * and pagination/sorting so the \"Interested Rosters\" table can page and sort\r\n * large rosters without loading everything client-side.\r\n */\r\nexport interface InterestedRostersRequestPayload {\r\n payload: InterestedRostersRequestBody;\r\n}\r\n\r\n/**\r\n * The body of {@link InterestedRostersRequestPayload}. All fields are sent to\r\n * the backend to filter, page and sort the interested-users roster.\r\n */\r\nexport interface InterestedRostersRequestBody {\r\n /** Free-text search term matched against the requester's name or email. */\r\n searchByNameOrEmail: string;\r\n /** Zero-based row offset for the requested page. */\r\n offset: number;\r\n /** Number of rows per page. */\r\n pageSize: number;\r\n /** Column key to sort by (e.g. \"name\", \"submittedOn\"). */\r\n sortedBy: string;\r\n /** Sort direction (e.g. \"asc\" / \"desc\"). */\r\n sortedOrderBy: string;\r\n}\r\n\r\n/**\r\n * The `body` of the interested-users roster list response, as returned by\r\n * {@code POST {apiBaseUrl}/groups/interest/group/{groupId}/responses}.\r\n *\r\n * The rows live under {@link data}; the remaining fields echo the paging state\r\n * ({@link totalRecords}, {@link offset}, {@link pageSize}) so the table can\r\n * drive pagination. The outer envelope ({@code status}/{@code message}/\r\n * {@code body}) is unwrapped by the HTTP layer, so this models the `body` only.\r\n */\r\nexport interface InterestedRostersResponse {\r\n /** The interested-roster rows for the requested page. */\r\n data: GroupInterestResponseView[];\r\n /** Total number of interested-roster rows across all pages. */\r\n totalRecords: number;\r\n /** Zero-based row offset of the returned page. */\r\n offset: number;\r\n /** Number of rows per page used for this response. */\r\n pageSize: number;\r\n}\r\n\r\n/**\r\n * A single interested-roster row shown in the Roster Management \"Interested\r\n * Rosters\" table. Carries the {@link interestId} needed to fetch that\r\n * requester's stored responses via the interest-responses endpoint and to\r\n * override their membership level. Rows are produced by mapping the backend\r\n * {@link GroupInterestResponseView} list onto this flattened display shape.\r\n */\r\nexport interface InterestedRoster {\r\n /** The interest record id (e.g. \"GINT_SAAPPS_...\"), used for responses + override. */\r\n interestId: string;\r\n /** The interested user's id (e.g. \"User_NESC_...\"), used for the level override. */\r\n userId: string;\r\n /** Requester display name. */\r\n name: string;\r\n /** Requester email address. */\r\n email: string;\r\n /** Requester affiliations (organizations). */\r\n affiliations: string[];\r\n /** Submission date, preformatted for display. */\r\n submittedOn: string;\r\n /** Current/assigned membership level name, or null when none is assigned. */\r\n memberLevel: string | null;\r\n}\r\n\r\n/**\r\n * Request payload for overriding/setting an interested user's membership level\r\n * ({@code POST {apiBaseUrl}/groups/interest/member-level}).\r\n *\r\n * Follows the repo payload convention of wrapping the request body in a\r\n * {@code payload} key. Identifies the roster row by {@link UpdateMemberLevelBody.groupId}\r\n * + {@link UpdateMemberLevelBody.userId} and carries the newly selected role in\r\n * {@link UpdateMemberLevelBody.roleId}.\r\n */\r\nexport interface UpdateMemberLevelPayload {\r\n payload: UpdateMemberLevelBody;\r\n}\r\n\r\n/**\r\n * The body of {@link UpdateMemberLevelPayload}: the group and user being\r\n * updated plus the role id of the chosen membership level.\r\n */\r\nexport interface UpdateMemberLevelBody {\r\n /** The group the interested user belongs to (e.g. \"GRP_SAAPPS_...\"). */\r\n groupId: string;\r\n /** The interested user whose membership level is being set (e.g. \"User_NESC_...\"). */\r\n userId: string;\r\n /** The selected membership-level role id (e.g. \"ROLE_SAAPPS_...\"). */\r\n roleId: string;\r\n}\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 constants from '../../assets/constants.json';\r\nimport {\r\n InterestFieldType,\r\n InterestFormResponse,\r\n} from '../../models/interest-response.model';\r\nimport { GroupsService } from '../../services/groups.service';\r\nimport { Subject, takeUntil } from 'rxjs';\r\n\r\n/**\r\n * A single question/answer pair rendered in the interest responses list. Built\r\n * from a backend {@link InterestFormResponse}; {@code value} is normalized to a\r\n * display string (CHECKBOX arrays are joined).\r\n */\r\ninterface SubmissionAnswer {\r\n label: string;\r\n value: string;\r\n}\r\n\r\n/**\r\n * Payload passed into {@link InterestResponsesComponent} by the host\r\n * {@link ModalComponent} via the dynamic-input pattern.\r\n */\r\nexport interface InterestResponsesData {\r\n /** The interest record whose stored responses are shown. */\r\n interestId: string;\r\n}\r\n\r\n/**\r\n * \"View Responses\" content of the Roster Management \"Interested Rosters\" tab\r\n * (SP3M-428). Rendered inside the shared {@link ModalComponent} (which supplies\r\n * the title row and X close), it lists a requester's submitted interest-form\r\n * answers as label/value pairs. Responses are loaded on init from\r\n * {@link GroupsService.getInterestResponses} using the interest id supplied by\r\n * the host modal. All display text is sourced from constants.json.\r\n * @export\r\n * @class InterestResponsesComponent\r\n */\r\n@Component({\r\n selector: 'ieeesa-interest-responses',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './interest-responses.component.html',\r\n styleUrls: ['./interest-responses.component.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class InterestResponsesComponent implements OnInit, OnDestroy {\r\n /**\r\n * Data supplied by the host {@link ModalComponent} via the dynamic-input\r\n * pattern (`dataInputName: 'componentData'`): carries the interest id whose\r\n * responses are loaded.\r\n */\r\n @Input() componentData: InterestResponsesData | null = null;\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n constants: any = constants;\r\n texts = this.constants?.rosterInterests?.interestedRosters;\r\n\r\n submissionAnswers: SubmissionAnswer[] = [];\r\n isLoading = false;\r\n errorMessage = '';\r\n private readonly destroy$ = new Subject<void>();\r\n\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 cdr: ChangeDetectorRef\r\n ) {}\r\n\r\n /**\r\n * Loads the interest-form responses for the supplied interest id on init.\r\n * @memberof InterestResponsesComponent\r\n */\r\n ngOnInit(): void {\r\n this.loadResponses();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n }\r\n\r\n /**\r\n * Fetches and maps the interest-form responses into displayable\r\n * question/answer pairs. Failures surface a user-facing error message and are\r\n * delegated to GroupsService for alerting, mirroring the platform pattern.\r\n * @memberof InterestResponsesComponent\r\n */\r\n private loadResponses(): void {\r\n const interestId = this.componentData?.interestId;\r\n if (!interestId) return;\r\n this.isLoading = true;\r\n this.groupsService\r\n .getInterestResponses(interestId)\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (responses) => {\r\n this.submissionAnswers = this.mapResponses(responses);\r\n this.isLoading = false;\r\n this.cdr.detectChanges();\r\n },\r\n error: (error) => {\r\n this.isLoading = false;\r\n this.errorMessage = this.texts?.errorMessage;\r\n this.groupsService.handleErrors(error);\r\n this.cdr.detectChanges();\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Maps backend responses to label/value pairs, joining multi-select\r\n * (CHECKBOX) answers and normalizing missing values to an empty string.\r\n * @param {InterestFormResponse[]} responses\r\n * @return {SubmissionAnswer[]}\r\n * @memberof InterestResponsesComponent\r\n */\r\n private mapResponses(\r\n responses: InterestFormResponse[]\r\n ): SubmissionAnswer[] {\r\n return (responses ?? []).map((response) => ({\r\n label: response?.questionLabelSnapshot ?? '',\r\n value: this.formatAnswer(response),\r\n }));\r\n }\r\n\r\n /**\r\n * Normalizes an answer value for display. CHECKBOX answers arrive as an array\r\n * and are joined with commas; all other field types render their string\r\n * value as-is.\r\n * @param {InterestFormResponse} response\r\n * @return {string}\r\n * @memberof InterestResponsesComponent\r\n */\r\n private formatAnswer(response: InterestFormResponse): string {\r\n const value = response?.answerValue;\r\n if (Array.isArray(value)) return value.join(', ');\r\n if (response?.fieldTypeSnapshot === InterestFieldType.CHECKBOX && value) {\r\n return value;\r\n }\r\n return value ?? '';\r\n }\r\n}\r\n","<section class=\"ieeesa-interest-responses\">\r\n <p class=\"ieeesa-interest-responses__error ieeesa-body-md-16\" *ngIf=\"errorMessage\" role=\"alert\">{{ errorMessage }}</p>\r\n <dl *ngIf=\"submissionAnswers.length; else noAnswers\">\r\n <div class=\"ieeesa-interest-responses__answer\" *ngFor=\"let answer of submissionAnswers\">\r\n <dt class=\"ieeesa-body-md-16\">{{ answer.label }}</dt>\r\n <dd class=\"ieeesa-title-md-18\">{{ answer.value }}</dd>\r\n </div>\r\n </dl>\r\n <ng-template #noAnswers>\r\n <p class=\"ieeesa-interest-responses__empty ieeesa-body-md-16\" *ngIf=\"!errorMessage && !isLoading\">{{ texts?.responses?.emptyMessage }}</p>\r\n </ng-template>\r\n</section>\r\n","import {\r\n ChangeDetectorRef,\r\n Component,\r\n Inject,\r\n OnDestroy,\r\n OnInit,\r\n Optional,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MAT_DIALOG_DATA, MatDialog, MatDialogModule } from '@angular/material/dialog';\r\nimport { PageEvent } from '@angular/material/paginator';\r\nimport { Sort } from '@angular/material/sort';\r\nimport { Subject, takeUntil } from 'rxjs';\r\nimport { ModalType, SelectOption } from '@ieeesa-npm/models';\r\nimport {\r\n DataTableComponent,\r\n ModalComponent,\r\n PaginatorConfig,\r\n TableActions,\r\n TableColumnSchema,\r\n TableColumnType,\r\n} from '@ieeesa-npm/presentation';\r\nimport constants from '../../assets/constants.json';\r\nimport { GroupInfo } from '../../models/group-info.model';\r\nimport {\r\n GroupInterestResponseView,\r\n InterestedRoster,\r\n InterestedRostersRequestPayload,\r\n UpdateMemberLevelPayload,\r\n} from '../../models/interest-response.model';\r\nimport { GroupsService } from '../../services/groups.service';\r\nimport { InterestResponsesComponent } from '../interest-responses/interest-responses.component';\r\n\r\n// Groups may compile against published Presentation types without the row-label callback.\r\ntype InterestedRosterColumnSchema = TableColumnSchema & {\r\n // eslint-disable-next-line no-unused-vars\r\n ariaLabel?: (row: InterestedRoster) => string;\r\n};\r\n\r\n/**\r\n * \"Interested Rosters\" tab of the Roster Interests dialog (SP3M-428). Lists the\r\n * users who expressed interest in the group and lets a Group Admin review each\r\n * requester's submitted responses and set/override their membership level from\r\n * the Roster Management screen.\r\n *\r\n * The list is rendered through the shared {@link DataTableComponent}: the\r\n * Name/Email/Affiliations/Submitted On columns are plain TEXT, Member Level is\r\n * the reusable table's DROPDOWN column (an inline {@code ieeesa-select}) and\r\n * Form is a LINK that opens the \"View Responses\" dialog. The Member Level\r\n * options are sourced from the roles API\r\n * ({@link GroupsService.getGroupTypeRoles}) filtered to the \"Member Level\" role\r\n * type. Interested-roster rows are loaded from\r\n * {@link GroupsService.getInterestResponsesByGroup} and each requester's stored\r\n * form responses are loaded on demand from\r\n * {@link GroupsService.getInterestResponses} using the row's `interestId`. All\r\n * display text is sourced from constants.json.\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, DataTableComponent, ModalComponent, MatDialogModule],\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 implements OnInit, OnDestroy {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n constants: any = constants;\r\n texts = this.constants?.rosterInterests?.interestedRosters;\r\n\r\n private destroy$ = new Subject<boolean>();\r\n\r\n /**\r\n * Member-level dropdown options, sourced from the roles API\r\n * ({@code GET /groups/config/rolesByGroupType/{groupType}}) filtered to the \"Member Level\" role type.\r\n * Each option is {@code { id: roleId, name: roleName }}.\r\n */\r\n memberLevelOptions: SelectOption[] = [];\r\n\r\n rosters: InterestedRoster[] = [];\r\n tableData: InterestedRoster[] = [];\r\n columnSchema: InterestedRosterColumnSchema[] = [];\r\n\r\n /** Total interested-roster rows reported by the backend (for paging/counts). */\r\n totalRecords = 0;\r\n\r\n paginatorConfig: PaginatorConfig = {\r\n recordsPerPage: this.texts?.pageSizeOptions?.[0],\r\n pageSizeOptions: this.texts?.pageSizeOptions,\r\n totalRecords: 0,\r\n };\r\n pageIndex = 0;\r\n defaultSortedColumn = 'submittedOn';\r\n defaultColumnSortDirection: Sort['direction'] = 'desc';\r\n private sortedBy = this.defaultSortedColumn;\r\n private sortedOrderBy = this.defaultColumnSortDirection;\r\n\r\n /** Read-only table — no search / filter / add / edit / delete actions. */\r\n tableActions: TableActions = {\r\n isPaginationNeeded: true,\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 isLoading = false;\r\n\r\n constructor(\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 groupsService: 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 @Optional() @Inject(MAT_DIALOG_DATA) public group: GroupInfo | null\r\n ) {}\r\n\r\n /**\r\n * Builds the reusable-table column schema and loads the interested-roster\r\n * list for the current group from the backend.\r\n * @memberof InterestedRostersComponent\r\n */\r\n ngOnInit(): void {\r\n this.loadMemberLevelOptions();\r\n this.buildColumnSchema();\r\n this.loadInterestedRosters();\r\n }\r\n\r\n /**\r\n * Cleans up in-flight subscriptions when the component is destroyed.\r\n * @memberof InterestedRostersComponent\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 * Resolves the current group id from the dialog data (falling back to the\r\n * service's selected group) and loads the interested-roster rows for it. Maps\r\n * each backend {@link GroupInterestResponseView} onto the flattened\r\n * {@link InterestedRoster} shape the reusable table binds to. On failure the\r\n * table is cleared and the error is delegated to GroupsService for alerting.\r\n * @memberof InterestedRostersComponent\r\n */\r\n private loadInterestedRosters(): void {\r\n const groupId =\r\n this.group?.groupId ??\r\n this.groupsService.getSelectedGroupInfo()?.groupId;\r\n if (!groupId) return;\r\n this.isLoading = true;\r\n const payload: InterestedRostersRequestPayload = {\r\n payload: {\r\n searchByNameOrEmail: '',\r\n offset: this.pageIndex * this.paginatorConfig.recordsPerPage,\r\n pageSize: this.paginatorConfig.recordsPerPage,\r\n sortedBy: this.sortedBy,\r\n sortedOrderBy: this.sortedOrderBy,\r\n },\r\n };\r\n this.groupsService\r\n .getInterestResponsesByGroup(groupId, payload)\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (response) => {\r\n this.totalRecords = response?.totalRecords ?? 0;\r\n this.paginatorConfig = {\r\n ...this.paginatorConfig,\r\n totalRecords: this.totalRecords,\r\n };\r\n this.rosters = (response?.data ?? []).map((view) =>\r\n this.mapToRoster(view)\r\n );\r\n this.tableData = this.rosters;\r\n this.isLoading = false;\r\n this.cdr.detectChanges();\r\n },\r\n error: (error) => {\r\n this.rosters = [];\r\n this.tableData = [];\r\n this.totalRecords = 0;\r\n this.paginatorConfig = { ...this.paginatorConfig, totalRecords: 0 };\r\n this.isLoading = false;\r\n this.groupsService.handleErrors(error, false);\r\n this.cdr.detectChanges();\r\n },\r\n });\r\n }\r\n\r\n onPaginationChange(event: PageEvent): void {\r\n this.pageIndex = event.pageIndex;\r\n this.paginatorConfig = {\r\n ...this.paginatorConfig,\r\n recordsPerPage: event.pageSize,\r\n };\r\n this.loadInterestedRosters();\r\n }\r\n\r\n onSortChange(event: Sort): void {\r\n this.sortedBy = event.direction ? event.active : this.defaultSortedColumn;\r\n this.sortedOrderBy = event.direction || this.defaultColumnSortDirection;\r\n this.pageIndex = 0;\r\n this.loadInterestedRosters();\r\n }\r\n\r\n /**\r\n * Maps a backend {@link GroupInterestResponseView} to the flattened\r\n * {@link InterestedRoster} row the table renders: affiliation org names are\r\n * joined into the affiliations list, the assigned membership level (if any)\r\n * becomes the role name — which the Member Level dropdown binds as its\r\n * pre-selected value — the submitted timestamp is formatted for display, and\r\n * the interest id is carried through for the responses dialog and the level\r\n * override.\r\n * @param {GroupInterestResponseView} view\r\n * @return {InterestedRoster}\r\n * @memberof InterestedRostersComponent\r\n */\r\n private mapToRoster(view: GroupInterestResponseView): InterestedRoster {\r\n return {\r\n interestId: view?.interestId,\r\n userId: view?.userId,\r\n name: view?.name,\r\n email: view?.email,\r\n affiliations: (view?.affiliation ?? []).map((org) => org?.orgName),\r\n submittedOn: this.formatSubmittedOn(view?.submittedOn),\r\n memberLevel: view?.memberLevel?.length\r\n ? view.memberLevel[0]?.roleName ?? null\r\n : null,\r\n };\r\n }\r\n\r\n /**\r\n * Formats the backend submitted timestamp (ISO date string) for display,\r\n * falling back to the raw value when it is not a parseable date.\r\n * @param {string} submittedOn\r\n * @return {string}\r\n * @memberof InterestedRostersComponent\r\n */\r\n private formatSubmittedOn(submittedOn: string): string {\r\n if (!submittedOn) return '';\r\n const date = new Date(submittedOn);\r\n return isNaN(date.getTime())\r\n ? submittedOn\r\n : date.toLocaleDateString('en-US');\r\n }\r\n\r\n /**\r\n * Loads the Member Level dropdown options from the roles API\r\n * ({@code GET /groups/config/rolesByGroupType/{groupType}}), keeping only roles whose\r\n * {@code roleTypeName} is \"Member Level\" and mapping each to a\r\n * {@link SelectOption} ({@code { id: roleId, name: roleName }}).\r\n * @memberof InterestedRostersComponent\r\n */\r\n private loadMemberLevelOptions(): void {\r\n const groupType =\r\n this.group?.groupType ??\r\n this.groupsService.getSelectedGroupInfo()?.groupType;\r\n if (!groupType) return;\r\n this.groupsService\r\n .getGroupTypeRoles(groupType)\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: () => {\r\n this.memberLevelOptions = (this.groupsService.getMemberTypes() ?? [])\r\n .map((role) => ({ id: role.roleId, name: role.roleName }));\r\n this.buildColumnSchema();\r\n this.cdr.detectChanges();\r\n },\r\n error: (error) => {\r\n this.groupsService.handleErrors(error);\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Persists the membership-level override when the admin picks a value in a\r\n * row's Member Level dropdown (bound to the reusable table's\r\n * `rowDropdownChange` output). Builds the request from the dialog's current\r\n * group id, the row's user id and the selected option's id (the role id), and\r\n * posts it to the backend. The row's displayed level is updated optimistically\r\n * and reverted if the save fails.\r\n * @param {{ row: InterestedRoster; option: SelectOption }} event\r\n * @memberof InterestedRostersComponent\r\n */\r\n onMemberLevelChange(event: {\r\n row: InterestedRoster;\r\n option: SelectOption;\r\n }): void {\r\n const row = event?.row;\r\n const option = event?.option;\r\n const groupId =\r\n this.group?.groupId ??\r\n this.groupsService.getSelectedGroupInfo()?.groupId;\r\n const roleId = option?.id as string;\r\n if (!row?.userId || !groupId || !roleId) return;\r\n\r\n const previousLevel = row.memberLevel;\r\n // Optimistically reflect the selection in the row.\r\n row.memberLevel = option?.name ?? row.memberLevel;\r\n\r\n const payload: UpdateMemberLevelPayload = {\r\n payload: {\r\n groupId,\r\n userId: row.userId,\r\n roleId,\r\n },\r\n };\r\n this.groupsService\r\n .updateInterestMemberLevel(payload)\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n error: (error) => {\r\n // Revert the optimistic change on failure and surface the error.\r\n row.memberLevel = previousLevel;\r\n this.cdr.detectChanges();\r\n this.groupsService.handleErrors(error);\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Opens the \"View Responses\" dialog for a roster row (bound to the reusable\r\n * table's LINK output) using the shared {@link ModalComponent}. The modal\r\n * supplies the title row and X close; the requester's stored interest-form\r\n * responses are rendered by {@link InterestResponsesComponent}, which loads\r\n * them from the backend using the row's {@code interestId} passed via the\r\n * ModalComponent dynamic-input pattern.\r\n * @param {InterestedRoster} row\r\n * @memberof InterestedRostersComponent\r\n */\r\n onFormLinkClick(row: InterestedRoster): void {\r\n if (!row?.interestId) return;\r\n const dialogOptions = {\r\n heading: this.texts?.responses?.title,\r\n subHeading: this.group?.groupName,\r\n headingClass: 'ieeesa-title-lg-24',\r\n isCloseNeeded: true,\r\n componentReference: InterestResponsesComponent,\r\n modalType: ModalType.FORM,\r\n data2DynamicComponent: { interestId: row.interestId },\r\n dataInputName: 'componentData',\r\n };\r\n this.dialog.open(ModalComponent, {\r\n data: dialogOptions,\r\n panelClass: ['ieeesa-modal-dialog', 'ieeesa-interest-responses-dialog'],\r\n width: '800px',\r\n maxWidth: '95vw',\r\n maxHeight: '90vh',\r\n ariaModal: true,\r\n });\r\n }\r\n\r\n /**\r\n * Defines the reusable-table columns for the Interested Rosters list. Every\r\n * `cellData`/`selectedOption` is a `(row) => ...` accessor, matching the\r\n * shared table's contract. Member Level is the DROPDOWN column seeded with the\r\n * configured levels plus \"None\"; Form is a LINK that opens the responses\r\n * dialog.\r\n * @memberof InterestedRostersComponent\r\n */\r\n private buildColumnSchema(): void {\r\n const columns = this.texts?.columns;\r\n this.columnSchema = [\r\n {\r\n id: 1,\r\n columnDef: 'name',\r\n heading: columns?.name,\r\n columnType: TableColumnType.TEXT,\r\n isSortableColumn: true,\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n cellData: (row: any) => row.name,\r\n },\r\n {\r\n id: 2,\r\n columnDef: 'email',\r\n heading: columns?.email,\r\n columnType: TableColumnType.TEXT,\r\n isSortableColumn: true,\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n cellData: (row: any) => row.email,\r\n },\r\n {\r\n id: 3,\r\n columnDef: 'affiliations',\r\n heading: columns?.affiliations,\r\n columnType: TableColumnType.TEXT,\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n cellData: (row: any) => (row.affiliations || []).join(', '),\r\n },\r\n {\r\n id: 4,\r\n columnDef: 'submittedOn',\r\n heading: columns?.submittedOn,\r\n columnType: TableColumnType.TEXT,\r\n isSortableColumn: true,\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n cellData: (row: any) => row.submittedOn,\r\n },\r\n {\r\n id: 5,\r\n columnDef: 'memberLevel',\r\n heading: columns?.memberLevel,\r\n columnType: TableColumnType.DROPDOWN,\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n cellData: (row: any) => row.memberLevel,\r\n dropdownOptions: this.memberLevelOptions,\r\n dropdownPlaceholder: this.texts?.memberLevelPlaceholder,\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n selectedOption: (row: any) =>\r\n this.memberLevelOptions.find((o) => o.name === row.memberLevel) ??\r\n null,\r\n },\r\n {\r\n id: 6,\r\n columnDef: 'form',\r\n heading: columns?.form,\r\n columnType: TableColumnType.LINK,\r\n cellData: () => this.texts?.viewLabel,\r\n ariaLabel: (row: InterestedRoster) =>\r\n `${this.texts?.viewAriaLabelPrefix} ${row?.name ?? ''}`.trim(),\r\n },\r\n ];\r\n }\r\n}\r\n","<section class=\"ieeesa-interested-rosters\" [attr.aria-label]=\"texts?.regionAriaLabel\">\r\n <p class=\"ieeesa-interested-rosters__count\">{{ totalRecords }} {{ texts?.countSuffix }}</p>\r\n <ieeesa-data-table\r\n [tableDataInfo]=\"tableData\"\r\n [columnSchemaInfo]=\"columnSchema\"\r\n [tableActions]=\"tableActions\"\r\n [paginatorConfig]=\"paginatorConfig\"\r\n [pageIndex]=\"pageIndex\"\r\n [pageSize]=\"paginatorConfig.recordsPerPage\"\r\n [defaultSortedColumn]=\"defaultSortedColumn\"\r\n [defaultColumnSortDirection]=\"defaultColumnSortDirection\"\r\n [isClearSortNeeded]=\"false\"\r\n (paginationChange)=\"onPaginationChange($event)\"\r\n (sortChange)=\"onSortChange($event)\"\r\n (rowLink)=\"onFormLinkClick($event)\"\r\n (rowDropdownChange)=\"onMemberLevelChange($event)\"\r\n ></ieeesa-data-table>\r\n</section>\r\n","/* eslint-disable no-unused-vars */\r\n\r\n/**\r\n * Supported field types for a custom interest-form question (SP3M-317). Values\r\n * match the backend FieldType enum / field_type CHECK constraint exactly.\r\n */\r\nexport enum QuestionFieldType {\r\n TEXT = 'TEXT',\r\n TEXTAREA = 'TEXTAREA',\r\n SELECT = 'SELECT',\r\n CHECKBOX = 'CHECKBOX',\r\n RADIO = 'RADIO',\r\n DATE = 'DATE',\r\n}\r\n\r\n/**\r\n * Field types that require a configurable list of options\r\n * (SELECT / CHECKBOX / RADIO), matching the backend's choice-type validation.\r\n */\r\nexport const CHOICE_FIELD_TYPES: QuestionFieldType[] = [\r\n QuestionFieldType.SELECT,\r\n QuestionFieldType.CHECKBOX,\r\n QuestionFieldType.RADIO,\r\n];\r\n\r\n/**\r\n * Interest-expression mode for a group (matches backend InterestMode).\r\n */\r\nexport enum InterestMode {\r\n DISABLED = 'DISABLED',\r\n BASIC = 'BASIC',\r\n FORM = 'FORM',\r\n}\r\n\r\n/**\r\n * A single admin-configured custom question on a group's interest form. Field\r\n * names mirror the backend InterestFormQuestion entity so payloads map directly.\r\n */\r\nexport interface CustomQuestion {\r\n questionId?: string;\r\n groupId: string;\r\n questionLabel: string;\r\n fieldType: QuestionFieldType | null;\r\n placeholder?: string;\r\n helpText?: string;\r\n isRequired: boolean;\r\n viewOrder: number;\r\n // Options are stored by the backend as a raw JSON string (JSONB). The service\r\n // layer stringifies/parses between this string and a string[] in the UI.\r\n options?: string;\r\n}\r\n\r\n/**\r\n * Lightweight transfer object for reordering questions (matches backend\r\n * QuestionOrder).\r\n */\r\nexport interface QuestionOrder {\r\n questionId: string;\r\n viewOrder: number;\r\n}\r\n\r\n/**\r\n * Group interest configuration (matches backend GroupInterestConfig).\r\n */\r\nexport interface GroupInterestConfig {\r\n groupId: string;\r\n interestMode: string;\r\n defaultLevelId: string | null;\r\n}\r\n\r\n/**\r\n * A role entry returned by GET /groups/role/{appId}. Member levels are the\r\n * subset where roleTypeName === \"Member Level\"; their roleId is used as the\r\n * interest-config defaultLevelId and roleName is the display label.\r\n */\r\nexport interface GroupRole {\r\n roleId: string;\r\n roleType: string;\r\n roleName: string;\r\n roleTypeName: string;\r\n viewOrder?: number;\r\n}\r\n\r\n/**\r\n * roleTypeName value identifying member-level roles.\r\n */\r\nexport const MEMBER_LEVEL_ROLE_TYPE = 'Member Level';\r\n","import {\r\n Component,\r\n EventEmitter,\r\n Input,\r\n OnInit,\r\n Output,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport {\r\n FormBuilder,\r\n FormGroup,\r\n ReactiveFormsModule,\r\n Validators,\r\n} from '@angular/forms';\r\nimport {\r\n CHOICE_FIELD_TYPES,\r\n CustomQuestion,\r\n QuestionFieldType,\r\n} from '../../models/custom-question.model';\r\nimport * as constants from '../../assets/constants.json';\r\n\r\n/**\r\n * Editable card for a single custom interest-form question (SP3M-317). Renders\r\n * the Question Label, Type, Required toggle, Placeholder, Help Text and (for\r\n * choice types) Options fields. Emits save/cancel so the parent manages the\r\n * questions list. The Options field is only shown for choice field types\r\n * (SELECT / CHECKBOX / RADIO), matching the backend's choice-type validation.\r\n * @export\r\n * @class CustomQuestionEditorComponent\r\n */\r\n@Component({\r\n selector: 'ieeesa-custom-question-editor',\r\n standalone: true,\r\n imports: [CommonModule, ReactiveFormsModule],\r\n templateUrl: './custom-question-editor.component.html',\r\n styleUrls: ['./custom-question-editor.component.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class CustomQuestionEditorComponent implements OnInit {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n constants: any = constants;\r\n editorTexts = this.constants?.rosterInterests?.interestForm?.questionEditor;\r\n fieldType = QuestionFieldType;\r\n typeOptions = [\r\n { value: QuestionFieldType.TEXT, label: this.editorTexts?.types?.text },\r\n {\r\n value: QuestionFieldType.TEXTAREA,\r\n label: this.editorTexts?.types?.textArea,\r\n },\r\n {\r\n value: QuestionFieldType.SELECT,\r\n label: this.editorTexts?.types?.dropdown,\r\n },\r\n {\r\n value: QuestionFieldType.CHECKBOX,\r\n label: this.editorTexts?.types?.checkbox,\r\n },\r\n { value: QuestionFieldType.RADIO, label: this.editorTexts?.types?.radio },\r\n { value: QuestionFieldType.DATE, label: this.editorTexts?.types?.date },\r\n ];\r\n\r\n @Input() question!: CustomQuestion;\r\n @Output() save = new EventEmitter<CustomQuestion>();\r\n @Output() cancel = new EventEmitter<void>();\r\n\r\n form!: FormGroup;\r\n\r\n // eslint-disable-next-line no-unused-vars\r\n constructor(private formBuilder: FormBuilder) {}\r\n\r\n /**\r\n * Builds the reactive form, seeding values from the question being edited.\r\n * The question's options are stored as a raw JSON string, so they are parsed\r\n * into one-per-line text for editing.\r\n * @memberof CustomQuestionEditorComponent\r\n */\r\n ngOnInit(): void {\r\n this.form = this.formBuilder.group({\r\n label: [this.question?.questionLabel ?? '', [Validators.required]],\r\n type: [this.question?.fieldType ?? null, [Validators.required]],\r\n required: [this.question?.isRequired ?? true],\r\n placeholder: [this.question?.placeholder ?? ''],\r\n helpText: [this.question?.helpText ?? ''],\r\n options: [this.parseOptionsString(this.question?.options)],\r\n });\r\n }\r\n\r\n /**\r\n * Parses a stored options JSON string into one-per-line text for the textarea.\r\n * @param {(string | undefined)} optionsJson\r\n * @return {string}\r\n * @memberof CustomQuestionEditorComponent\r\n */\r\n parseOptionsString(optionsJson: string[] | string | undefined): string {\r\n if (!optionsJson) return '';\r\n // Options may already be a deserialized array (the shared contract allows\r\n // string[]), so handle that before attempting to JSON.parse a raw string.\r\n if (Array.isArray(optionsJson)) return optionsJson.join('\\n');\r\n try {\r\n const parsed = JSON.parse(optionsJson);\r\n return Array.isArray(parsed) ? parsed.join('\\n') : '';\r\n } catch {\r\n return '';\r\n }\r\n }\r\n\r\n /**\r\n * Whether the currently selected type requires an options list.\r\n * @return {boolean}\r\n * @memberof CustomQuestionEditorComponent\r\n */\r\n get isChoiceType(): boolean {\r\n return CHOICE_FIELD_TYPES.includes(\r\n this.form?.get('type')?.value as QuestionFieldType\r\n );\r\n }\r\n\r\n /**\r\n * Parses the options textarea into a trimmed, non-empty string array,\r\n * stripping trailing commas.\r\n * @return {string[]}\r\n * @memberof CustomQuestionEditorComponent\r\n */\r\n parseOptions(): string[] {\r\n const raw = (this.form?.get('options')?.value ?? '') as string;\r\n return raw\r\n .split('\\n')\r\n .map((option) => option.trim().replace(/,+$/, '').trim())\r\n .filter((option) => option.length > 0);\r\n }\r\n\r\n /**\r\n * Whether the editor is valid: label and type are required, and choice types\r\n * require at least one option.\r\n * @return {boolean}\r\n * @memberof CustomQuestionEditorComponent\r\n */\r\n get isSaveDisabled(): boolean {\r\n const label = this.form?.get('label')?.value as string;\r\n // Validators.required accepts whitespace-only; onSave trims to '', so block\r\n // save when the trimmed label is empty.\r\n if (this.form?.invalid || !label?.trim()) return true;\r\n if (this.isChoiceType && this.parseOptions().length === 0) return true;\r\n return false;\r\n }\r\n\r\n /**\r\n * Emits the assembled question on save. Options are serialized to a JSON\r\n * string to match the backend's JSONB column.\r\n * @memberof CustomQuestionEditorComponent\r\n */\r\n onSave(): void {\r\n this.form.markAllAsTouched();\r\n if (this.isSaveDisabled) return;\r\n const value = this.form.getRawValue();\r\n this.save.emit({\r\n questionId: this.question?.questionId,\r\n groupId: this.question?.groupId,\r\n viewOrder: this.question?.viewOrder,\r\n questionLabel: value.label?.trim(),\r\n fieldType: value.type,\r\n isRequired: value.required,\r\n placeholder: value.placeholder?.trim(),\r\n helpText: value.helpText?.trim(),\r\n options: this.isChoiceType\r\n ? JSON.stringify(this.parseOptions())\r\n : undefined,\r\n });\r\n }\r\n\r\n /**\r\n * Emits the cancel event.\r\n * @memberof CustomQuestionEditorComponent\r\n */\r\n onCancel(): void {\r\n this.cancel.emit();\r\n }\r\n}\r\n","<form [formGroup]=\"form\" class=\"ieeesa-question-editor\">\r\n <div class=\"ieeesa-question-editor__grid\">\r\n <div class=\"ieeesa-question-editor__field\">\r\n <label class=\"ieeesa-question-editor__label ieeesa-body-sm-14\">\r\n {{ editorTexts?.labelLabel }}\r\n <span class=\"ieeesa-question-editor__required-mark\">*</span>\r\n </label>\r\n <input\r\n type=\"text\"\r\n class=\"ieeesa-question-editor__input ieeesa-body-sm-14\"\r\n formControlName=\"label\"\r\n [attr.placeholder]=\"editorTexts?.typeHerePlaceholder\"\r\n [attr.aria-label]=\"editorTexts?.labelLabel\"\r\n />\r\n </div>\r\n\r\n <div class=\"ieeesa-question-editor__field\">\r\n <label class=\"ieeesa-question-editor__label ieeesa-body-sm-14\">\r\n {{ editorTexts?.typeLabel }}\r\n </label>\r\n <select\r\n class=\"ieeesa-question-editor__input ieeesa-body-sm-14\"\r\n formControlName=\"type\"\r\n [attr.aria-label]=\"editorTexts?.typeLabel\"\r\n >\r\n <option [ngValue]=\"null\" disabled>\r\n {{ editorTexts?.selectPlaceholder }}\r\n </option>\r\n <option\r\n *ngFor=\"let option of typeOptions\"\r\n [ngValue]=\"option.value\"\r\n >\r\n {{ option.label }}\r\n </option>\r\n </select>\r\n </div>\r\n </div>\r\n\r\n <div class=\"ieeesa-question-editor__required-row d-flex align-items-center gap-2\">\r\n <span class=\"ieeesa-question-editor__label ieeesa-body-sm-14\">{{\r\n editorTexts?.requiredLabel\r\n }}</span>\r\n <label class=\"ieeesa-question-editor__switch\">\r\n <input\r\n type=\"checkbox\"\r\n formControlName=\"required\"\r\n [attr.aria-label]=\"editorTexts?.requiredLabel\"\r\n />\r\n <span class=\"ieeesa-question-editor__slider\"></span>\r\n </label>\r\n <span class=\"ieeesa-question-editor__required-hint ieeesa-body-sm-14\">{{\r\n editorTexts?.requiredLabel\r\n }}</span>\r\n </div>\r\n\r\n <div class=\"ieeesa-question-editor__grid\">\r\n <div class=\"ieeesa-question-editor__field\">\r\n <label class=\"ieeesa-question-editor__label ieeesa-body-sm-14\">\r\n {{ editorTexts?.placeholderLabel }}\r\n </label>\r\n <input\r\n type=\"text\"\r\n class=\"ieeesa-question-editor__input ieeesa-body-sm-14\"\r\n formControlName=\"placeholder\"\r\n [attr.placeholder]=\"editorTexts?.typeHerePlaceholder\"\r\n [attr.aria-label]=\"editorTexts?.placeholderLabel\"\r\n />\r\n </div>\r\n\r\n <div class=\"ieeesa-question-editor__field\">\r\n <label class=\"ieeesa-question-editor__label ieeesa-body-sm-14\">\r\n {{ editorTexts?.helpTextLabel }}\r\n </label>\r\n <input\r\n type=\"text\"\r\n class=\"ieeesa-question-editor__input ieeesa-body-sm-14\"\r\n formControlName=\"helpText\"\r\n [attr.placeholder]=\"editorTexts?.typeHerePlaceholder\"\r\n [attr.aria-label]=\"editorTexts?.helpTextLabel\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"isChoiceType\" class=\"ieeesa-question-editor__field\">\r\n <label class=\"ieeesa-question-editor__label ieeesa-body-sm-14\">\r\n {{ editorTexts?.optionsLabel }}\r\n </label>\r\n <textarea\r\n class=\"ieeesa-question-editor__textarea ieeesa-body-sm-14\"\r\n formControlName=\"options\"\r\n rows=\"5\"\r\n [attr.placeholder]=\"editorTexts?.typeHerePlaceholder\"\r\n [attr.aria-label]=\"editorTexts?.optionsLabel\"\r\n ></textarea>\r\n </div>\r\n\r\n <div class=\"ieeesa-question-editor__actions d-flex gap-3\">\r\n <button\r\n type=\"button\"\r\n class=\"ieeesa-question-editor__cancel\"\r\n (click)=\"onCancel()\"\r\n [attr.aria-label]=\"editorTexts?.cancel\"\r\n >\r\n {{ editorTexts?.cancel }}\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"ieeesa-question-editor__save\"\r\n [disabled]=\"isSaveDisabled\"\r\n (click)=\"onSave()\"\r\n [attr.aria-label]=\"editorTexts?.save\"\r\n >\r\n {{ editorTexts?.save }}\r\n </button>\r\n </div>\r\n</form>\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 { ExpressInterestDialogComponent } from '@ieeesa-npm/presentation';\r\nimport { InterestFieldType, InterestFormQuestion } from '@ieeesa-npm/models';\r\nimport { CustomQuestion } from '../../models/custom-question.model';\r\nimport * as constants from '../../assets/constants.json';\r\n\r\n/**\r\n * Data passed to the preview dialog: the group name (subtitle) and the admin's\r\n * current custom questions.\r\n */\r\nexport interface InterestFormPreviewData {\r\n groupName: string;\r\n customQuestions: CustomQuestion[];\r\n}\r\n\r\n/**\r\n * Preview host for the interest form (SP3M-317 R6.7). Reuses the shared,\r\n * presentational ExpressInterestDialogComponent in read-only preview mode so\r\n * the admin sees the form exactly as an end user would, without any submit\r\n * action — only Cancel closes the dialog. No backend call is made; the admin's\r\n * in-progress custom questions are passed straight through.\r\n * @export\r\n * @class InterestFormPreviewComponent\r\n */\r\n@Component({\r\n selector: 'ieeesa-interest-form-preview',\r\n standalone: true,\r\n imports: [CommonModule, MatDialogModule, ExpressInterestDialogComponent],\r\n templateUrl: './interest-form-preview.component.html',\r\n styleUrls: ['./interest-form-preview.component.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class InterestFormPreviewComponent {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n constants: any = constants;\r\n previewTexts = this.constants?.rosterInterests?.interestForm?.preview;\r\n subtitle = '';\r\n customQuestions: InterestFormQuestion[] = [];\r\n\r\n constructor(\r\n // eslint-disable-next-line no-unused-vars\r\n public dialogRef: MatDialogRef<InterestFormPreviewComponent>,\r\n // eslint-disable-next-line no-unused-vars\r\n @Inject(MAT_DIALOG_DATA) private data: InterestFormPreviewData\r\n ) {\r\n this.subtitle = this.data?.groupName ?? '';\r\n // Only questions with a chosen field type are previewable; a half-added\r\n // question (null fieldType) is skipped.\r\n this.customQuestions = (this.data?.customQuestions ?? [])\r\n .filter((question) => !!question.fieldType)\r\n .map((question) => ({\r\n questionId: question.questionId ?? '',\r\n questionLabel: question.questionLabel,\r\n fieldType: question.fieldType as InterestFieldType,\r\n placeholder: question.placeholder ?? null,\r\n helpText: question.helpText ?? null,\r\n isRequired: question.isRequired ?? false,\r\n viewOrder: question.viewOrder ?? null,\r\n options: question.options ?? null,\r\n }));\r\n }\r\n\r\n /**\r\n * Closes the preview dialog.\r\n * @memberof InterestFormPreviewComponent\r\n */\r\n onClose(): void {\r\n this.dialogRef?.close();\r\n }\r\n}\r\n","<ieeesa-express-interest-dialog\r\n [isPreview]=\"true\"\r\n [subtitle]=\"subtitle\"\r\n [customQuestions]=\"customQuestions\"\r\n [texts]=\"previewTexts\"\r\n (cancel)=\"onClose()\"\r\n></ieeesa-express-interest-dialog>\r\n","import { Injectable } from '@angular/core';\r\nimport { Observable, catchError, map } from 'rxjs';\r\nimport { HttpService } from '@ieeesa-npm/utility';\r\nimport {\r\n CustomQuestion,\r\n GroupInterestConfig,\r\n GroupRole,\r\n QuestionOrder,\r\n} from '../models/custom-question.model';\r\n\r\n/**\r\n * Standard API response envelope used by the groups backend.\r\n */\r\nexport interface InterestApiResponse<T> {\r\n status: boolean | string;\r\n message?: string;\r\n body?: T;\r\n}\r\n\r\n/**\r\n * Service for managing a group's interest form configuration and custom\r\n * questions (SP3M-317). Talks to the groups backend endpoints:\r\n * - GET /v1/groups/interest-config/{groupId}\r\n * - PUT /v1/groups/interest-config\r\n * - GET /v1/groups/interest-questions/{groupId}\r\n * - POST /v1/groups/interest-questions\r\n * - PUT /v1/groups/interest-questions\r\n * - PUT /v1/groups/interest-questions/reorder\r\n * - PUT /v1/groups/interest-questions/{questionId}/remove\r\n * - GET /v1/groups/interest-questions/{groupId}/preview\r\n * All write payloads are wrapped in the shared Request envelope ({ payload }).\r\n * @export\r\n * @class InterestFormService\r\n */\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class InterestFormService {\r\n apiBaseUrl!: string;\r\n\r\n // eslint-disable-next-line no-unused-vars\r\n constructor(private httpService: HttpService) {}\r\n\r\n /**\r\n * Validates the application-level envelope for a write operation. A 2xx\r\n * response can still carry an unsuccessful envelope ({ status: false }); this\r\n * throws it so callers' error handlers run instead of treating it as success.\r\n * @param {InterestApiResponse<T>} response\r\n * @return {InterestApiResponse<T>}\r\n * @memberof InterestFormService\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private assertSuccess(response: any): any {\r\n const status = response?.status;\r\n const isSuccess =\r\n status === true || status === 'true' || status === 'SUCCESS';\r\n if (!isSuccess) {\r\n throw response;\r\n }\r\n return response;\r\n }\r\n\r\n /**\r\n * Sets the API base URL (resolved from the hosting application's config).\r\n * @param {string} apiBaseUrl\r\n * @memberof InterestFormService\r\n */\r\n setApiBaseUrl(apiBaseUrl: string): void {\r\n this.apiBaseUrl = apiBaseUrl;\r\n }\r\n\r\n /**\r\n * Loads a group's interest configuration (mode + default member level).\r\n * @param {string} groupId\r\n * @return {Observable<InterestApiResponse<GroupInterestConfig>>}\r\n * @memberof InterestFormService\r\n */\r\n getInterestConfig(\r\n groupId: string\r\n ): Observable<InterestApiResponse<GroupInterestConfig>> {\r\n return this.httpService\r\n .getData(`${this.apiBaseUrl}/groups/interest-config/${groupId}`)\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 * Loads the roles configured for a group type via\r\n * GET /groups/config/rolesByGroupType/{groupTypeId}. Member levels (used to\r\n * populate the default membership level options) are the subset where\r\n * roleTypeName is \"Member Level\"; filtering is done by the caller.\r\n * @param {string} groupTypeId\r\n * @return {Observable<InterestApiResponse<GroupRole[]>>}\r\n * @memberof InterestFormService\r\n */\r\n getRoles(groupTypeId: string): Observable<InterestApiResponse<GroupRole[]>> {\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) => response),\r\n catchError((error) => {\r\n throw error;\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Saves a group's interest configuration.\r\n * @param {GroupInterestConfig} config\r\n * @return {Observable<InterestApiResponse<string>>}\r\n * @memberof InterestFormService\r\n */\r\n saveInterestConfig(\r\n config: GroupInterestConfig\r\n ): Observable<InterestApiResponse<string>> {\r\n return this.httpService\r\n .putData(`${this.apiBaseUrl}/groups/interest-config`, {\r\n payload: config,\r\n })\r\n .pipe(\r\n map((response) => this.assertSuccess(response)),\r\n catchError((error) => {\r\n throw error;\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Loads a group's custom interest questions (ordered by view order).\r\n * @param {string} groupId\r\n * @return {Observable<InterestApiResponse<CustomQuestion[]>>}\r\n * @memberof InterestFormService\r\n */\r\n getQuestions(\r\n groupId: string\r\n ): Observable<InterestApiResponse<CustomQuestion[]>> {\r\n return this.httpService\r\n .getData(`${this.apiBaseUrl}/groups/interest-questions/${groupId}`)\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 * Creates a new custom interest question.\r\n * @param {CustomQuestion} question\r\n * @return {Observable<InterestApiResponse<CustomQuestion>>}\r\n * @memberof InterestFormService\r\n */\r\n createQuestion(\r\n question: CustomQuestion\r\n ): Observable<InterestApiResponse<CustomQuestion>> {\r\n return this.httpService\r\n .postData(`${this.apiBaseUrl}/groups/interest-questions`, {\r\n payload: question,\r\n })\r\n .pipe(\r\n map((response) => this.assertSuccess(response)),\r\n catchError((error) => {\r\n throw error;\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Updates an existing custom interest question.\r\n * @param {CustomQuestion} question\r\n * @return {Observable<InterestApiResponse<string>>}\r\n * @memberof InterestFormService\r\n */\r\n updateQuestion(\r\n question: CustomQuestion\r\n ): Observable<InterestApiResponse<string>> {\r\n return this.httpService\r\n .putData(`${this.apiBaseUrl}/groups/interest-questions`, {\r\n payload: question,\r\n })\r\n .pipe(\r\n map((response) => this.assertSuccess(response)),\r\n catchError((error) => {\r\n throw error;\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Persists the updated view order for a group's custom questions.\r\n * @param {QuestionOrder[]} questionOrders\r\n * @return {Observable<InterestApiResponse<string>>}\r\n * @memberof InterestFormService\r\n */\r\n reorderQuestions(\r\n questionOrders: QuestionOrder[]\r\n ): Observable<InterestApiResponse<string>> {\r\n return this.httpService\r\n .putData(`${this.apiBaseUrl}/groups/interest-questions/reorder`, {\r\n payload: questionOrders,\r\n })\r\n .pipe(\r\n map((response) => this.assertSuccess(response)),\r\n catchError((error) => {\r\n throw error;\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Soft-deletes a custom interest question by id.\r\n * @param {string} questionId\r\n * @return {Observable<InterestApiResponse<string>>}\r\n * @memberof InterestFormService\r\n */\r\n removeQuestion(\r\n questionId: string\r\n ): Observable<InterestApiResponse<string>> {\r\n return this.httpService\r\n .putData(\r\n `${this.apiBaseUrl}/groups/interest-questions/${questionId}/remove`,\r\n {}\r\n )\r\n .pipe(\r\n map((response) => this.assertSuccess(response)),\r\n catchError((error) => {\r\n throw error;\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Builds a non-publishing preview of a group's interest form.\r\n * @param {string} groupId\r\n * @return {Observable<InterestApiResponse<unknown>>}\r\n * @memberof InterestFormService\r\n */\r\n previewForm(groupId: string): Observable<InterestApiResponse<unknown>> {\r\n return this.httpService\r\n .getData(\r\n `${this.apiBaseUrl}/groups/interest-questions/${groupId}/preview`\r\n )\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 Inject,\r\n OnDestroy,\r\n OnInit,\r\n Optional,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport {\r\n MAT_DIALOG_DATA,\r\n MatDialog,\r\n MatDialogRef,\r\n} from '@angular/material/dialog';\r\nimport { Subject, takeUntil } from 'rxjs';\r\nimport {\r\n CdkDragDrop,\r\n DragDropModule,\r\n moveItemInArray,\r\n} from '@angular/cdk/drag-drop';\r\nimport {\r\n RadioComponent,\r\n RadioOption,\r\n SlideToggleComponent,\r\n SlideToggleOption,\r\n} from '@ieeesa-npm/presentation';\r\nimport { AlertType, AlertsService } from '@ieeesa-npm/utility';\r\nimport {\r\n CustomQuestion,\r\n GroupRole,\r\n InterestMode,\r\n MEMBER_LEVEL_ROLE_TYPE,\r\n QuestionFieldType,\r\n} from '../../models/custom-question.model';\r\nimport { GroupInfo } from '../../models/group-info.model';\r\nimport { GroupsService } from '../../services/groups.service';\r\nimport { InterestFormService } from '../../services/interest-form.service';\r\nimport { CustomQuestionEditorComponent } from '../custom-question-editor/custom-question-editor.component';\r\nimport { InterestFormPreviewComponent } from '../interest-form-preview/interest-form-preview.component';\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 enables/disables the form, views locked standard questions,\r\n * chooses the default membership level and manages custom questions\r\n * (add / edit / reorder / remove), persisted to the groups backend via\r\n * InterestFormService. Each question is saved individually (create/update) and\r\n * the enable mode + default level are saved via the interest-config endpoint.\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: [\r\n CommonModule,\r\n DragDropModule,\r\n SlideToggleComponent,\r\n RadioComponent,\r\n CustomQuestionEditorComponent,\r\n ],\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, OnDestroy {\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 requiredTag = this.interestFormTexts?.requiredTag;\r\n standardTag = this.interestFormTexts?.standardTag;\r\n newQuestionLabel = this.interestFormTexts?.newQuestionLabel;\r\n editQuestionAriaLabel = this.interestFormTexts?.editQuestionAriaLabel;\r\n deleteQuestionAriaLabel = this.interestFormTexts?.deleteQuestionAriaLabel;\r\n noLevelsMessage = this.interestFormTexts?.noLevelsMessage;\r\n typeLabels = this.interestFormTexts?.questionEditor?.types;\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 // Defaults to disabled (OFF). The real state is driven by the API response in\r\n // loadConfig; when no config has been saved yet the backend returns DISABLED,\r\n // so the first-time view correctly shows the toggle OFF.\r\n isFormEnabled = false;\r\n selectedLevelId: string | null = null;\r\n levels: GroupRole[] = [];\r\n\r\n customQuestions: CustomQuestion[] = [];\r\n editingQuestionId: string | null = null;\r\n private isEditingNewQuestion = false;\r\n private destroy$ = new Subject<boolean>();\r\n\r\n constructor(\r\n // eslint-disable-next-line no-unused-vars\r\n @Optional() private dialogRef: MatDialogRef<unknown>,\r\n // eslint-disable-next-line no-unused-vars\r\n @Optional() @Inject(MAT_DIALOG_DATA) public group: GroupInfo,\r\n // eslint-disable-next-line no-unused-vars\r\n private interestFormService: InterestFormService,\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 alertService: AlertsService,\r\n // eslint-disable-next-line no-unused-vars\r\n private dialog: MatDialog\r\n ) {}\r\n\r\n /**\r\n * Initializes static UI options and loads the group's interest config and\r\n * custom questions from the backend.\r\n * @memberof InterestFormComponent\r\n */\r\n ngOnInit(): void {\r\n this.interestFormService.setApiBaseUrl(this.groupsService?.apiBaseUrl);\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 if (this.group?.groupId) {\r\n this.loadMembershipLevels();\r\n this.loadQuestions();\r\n }\r\n }\r\n\r\n /**\r\n * Loads the real membership levels for the group's group type and then the\r\n * saved interest configuration (so the saved default level can be\r\n * preselected).\r\n * @memberof InterestFormComponent\r\n */\r\n loadMembershipLevels(): void {\r\n const groupTypeId = this.group?.groupType;\r\n if (!groupTypeId) {\r\n this.loadConfig();\r\n return;\r\n }\r\n this.interestFormService\r\n .getRoles(groupTypeId)\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (response) => {\r\n // Member levels are the roles whose roleTypeName is \"Member Level\".\r\n this.levels = (response?.body ?? []).filter(\r\n (role) => role.roleTypeName === MEMBER_LEVEL_ROLE_TYPE\r\n );\r\n this.loadConfig();\r\n },\r\n error: (error) => {\r\n this.handleError(error);\r\n this.loadConfig();\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Loads the group's interest configuration (mode + default level) and syncs\r\n * the toggle and the default-level radio selection.\r\n * @memberof InterestFormComponent\r\n */\r\n loadConfig(): void {\r\n this.interestFormService\r\n .getInterestConfig(this.group.groupId)\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (response) => {\r\n const config = response?.body;\r\n this.isFormEnabled = config?.interestMode === InterestMode.FORM;\r\n this.enableFormToggle = {\r\n ...this.enableFormToggle,\r\n checked: this.isFormEnabled,\r\n };\r\n // Preselect the saved default level, else the first member level.\r\n this.selectedLevelId =\r\n config?.defaultLevelId ?? this.levels[0]?.roleId ?? null;\r\n this.buildMembershipLevelOptions();\r\n },\r\n error: (error) => this.handleError(error),\r\n });\r\n }\r\n\r\n /**\r\n * Builds the radio options from the real membership levels, marking the\r\n * currently selected level as checked.\r\n * @memberof InterestFormComponent\r\n */\r\n buildMembershipLevelOptions(): void {\r\n this.membershipLevels = this.levels.map((level) => ({\r\n id: level.roleId,\r\n label: level.roleName,\r\n checked: level.roleId === this.selectedLevelId,\r\n }));\r\n }\r\n\r\n /**\r\n * Loads the group's custom questions.\r\n * @memberof InterestFormComponent\r\n */\r\n loadQuestions(): void {\r\n this.interestFormService\r\n .getQuestions(this.group.groupId)\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (response) => {\r\n this.customQuestions = response?.body ?? [];\r\n },\r\n error: (error) => this.handleError(error),\r\n });\r\n }\r\n\r\n /**\r\n * Updates the form-enabled state and persists the new interest mode.\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 if (!this.isFormEnabled) {\r\n // Disabling always persists immediately (no level needed).\r\n this.saveConfig();\r\n return;\r\n }\r\n // Enabling requires a default level (backend rejects FORM without one). If\r\n // none is selected yet, auto-select the level flagged default, else the\r\n // first available level, so the toggle persists immediately.\r\n if (!this.selectedLevelId) {\r\n this.selectedLevelId = this.levels[0]?.roleId ?? null;\r\n this.buildMembershipLevelOptions();\r\n }\r\n if (this.selectedLevelId) {\r\n this.saveConfig();\r\n } else {\r\n // No membership levels configured for this group type: cannot enable, so\r\n // revert the toggle/enabled state to false before alerting (nothing was\r\n // persisted, and the dependent sections must not stay visible).\r\n this.isFormEnabled = false;\r\n this.enableFormToggle = {\r\n ...this.enableFormToggle,\r\n checked: false,\r\n };\r\n this.alertService?.showMessage({\r\n status: 'custom',\r\n message: this.interestFormTexts?.noLevelsMessage,\r\n alertType: AlertType?.ERROR,\r\n isCloseNeeded: true,\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Persists the interest config. The default level is only sent for the\r\n * enabled (FORM) mode; DISABLED clears it. Enabling without a selected level\r\n * is skipped so an invalid request is never sent.\r\n * @memberof InterestFormComponent\r\n */\r\n saveConfig(): void {\r\n if (!this.group?.groupId) return;\r\n if (this.isFormEnabled && !this.selectedLevelId) return;\r\n this.interestFormService\r\n .saveInterestConfig({\r\n groupId: this.group.groupId,\r\n interestMode: this.isFormEnabled\r\n ? InterestMode.FORM\r\n : InterestMode.DISABLED,\r\n defaultLevelId: this.isFormEnabled ? this.selectedLevelId : null,\r\n })\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n error: (error) => this.handleError(error),\r\n });\r\n }\r\n\r\n /**\r\n * Records the selected default membership level and persists the config when\r\n * the form is enabled.\r\n * @param {RadioOption} option\r\n * @memberof InterestFormComponent\r\n */\r\n onMembershipLevelChange(option: RadioOption): void {\r\n this.selectedLevelId = String(option?.id);\r\n if (this.isFormEnabled) {\r\n this.saveConfig();\r\n }\r\n }\r\n\r\n /**\r\n * Adds a new blank question and opens its editor. Only one editor is open at\r\n * a time.\r\n * @memberof InterestFormComponent\r\n */\r\n onAddQuestion(): void {\r\n if (this.editingQuestionId) return;\r\n const tempId = `new-${Date.now()}`;\r\n const newQuestion: CustomQuestion = {\r\n questionId: tempId,\r\n groupId: this.group?.groupId,\r\n questionLabel: '',\r\n fieldType: null,\r\n isRequired: true,\r\n placeholder: '',\r\n helpText: '',\r\n options: undefined,\r\n viewOrder: this.customQuestions.length,\r\n };\r\n this.customQuestions = [...this.customQuestions, newQuestion];\r\n this.editingQuestionId = tempId;\r\n this.isEditingNewQuestion = true;\r\n }\r\n\r\n /**\r\n * Opens the editor for an existing question.\r\n * @param {CustomQuestion} question\r\n * @memberof InterestFormComponent\r\n */\r\n onEditQuestion(question: CustomQuestion): void {\r\n if (this.editingQuestionId) return;\r\n this.editingQuestionId = question.questionId ?? null;\r\n this.isEditingNewQuestion = false;\r\n }\r\n\r\n /**\r\n * Creates or updates the question on the backend and refreshes the list.\r\n * @param {CustomQuestion} question\r\n * @memberof InterestFormComponent\r\n */\r\n onSaveQuestion(question: CustomQuestion): void {\r\n if (this.isEditingNewQuestion) {\r\n const payload: CustomQuestion = { ...question };\r\n // Remove the temporary client id so the backend generates one.\r\n delete payload.questionId;\r\n this.interestFormService\r\n .createQuestion(payload)\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: () => this.afterQuestionSaved(),\r\n error: (error) => this.handleError(error),\r\n });\r\n } else {\r\n this.interestFormService\r\n .updateQuestion(question)\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: () => this.afterQuestionSaved(),\r\n error: (error) => this.handleError(error),\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Closes the editor and reloads the questions after a successful save.\r\n * @memberof InterestFormComponent\r\n */\r\n private afterQuestionSaved(): void {\r\n this.editingQuestionId = null;\r\n this.isEditingNewQuestion = false;\r\n this.loadQuestions();\r\n }\r\n\r\n /**\r\n * Closes the editor. A newly added question is removed on cancel; an existing\r\n * question keeps its previous values.\r\n * @param {string} questionId\r\n * @memberof InterestFormComponent\r\n */\r\n onCancelQuestion(questionId: string | undefined): void {\r\n if (this.isEditingNewQuestion) {\r\n this.customQuestions = this.customQuestions.filter(\r\n (question) => question.questionId !== questionId\r\n );\r\n }\r\n this.editingQuestionId = null;\r\n this.isEditingNewQuestion = false;\r\n }\r\n\r\n /**\r\n * Removes a question on the backend and refreshes the list.\r\n * @param {string} questionId\r\n * @memberof InterestFormComponent\r\n */\r\n onDeleteQuestion(questionId: string | undefined): void {\r\n if (!questionId) return;\r\n // A not-yet-saved question only exists client-side.\r\n if (questionId.startsWith('new-')) {\r\n this.onCancelQuestion(questionId);\r\n return;\r\n }\r\n this.interestFormService\r\n .removeQuestion(questionId)\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: () => {\r\n if (this.editingQuestionId === questionId) {\r\n this.editingQuestionId = null;\r\n this.isEditingNewQuestion = false;\r\n }\r\n this.loadQuestions();\r\n },\r\n error: (error) => this.handleError(error),\r\n });\r\n }\r\n\r\n /**\r\n * Reorders questions on drag-drop and persists the new order.\r\n * @param {CdkDragDrop<CustomQuestion[]>} event\r\n * @memberof InterestFormComponent\r\n */\r\n onReorderQuestions(event: CdkDragDrop<CustomQuestion[]>): void {\r\n const reordered = [...this.customQuestions];\r\n moveItemInArray(reordered, event.previousIndex, event.currentIndex);\r\n this.customQuestions = reordered.map((question, index) => ({\r\n ...question,\r\n viewOrder: index,\r\n }));\r\n this.interestFormService\r\n .reorderQuestions(\r\n this.customQuestions.map((question) => ({\r\n questionId: question.questionId as string,\r\n viewOrder: question.viewOrder,\r\n }))\r\n )\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n // The list was reordered optimistically; if the backend rejected the\r\n // new order, reload so the client reflects the persisted order.\r\n error: (error) => {\r\n this.handleError(error);\r\n this.loadQuestions();\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Returns the display label for a question's field type.\r\n * @param {(QuestionFieldType | null)} type\r\n * @return {string}\r\n * @memberof InterestFormComponent\r\n */\r\n getTypeLabel(type: QuestionFieldType | null): string {\r\n switch (type) {\r\n case QuestionFieldType.TEXT:\r\n return this.typeLabels?.text;\r\n case QuestionFieldType.TEXTAREA:\r\n return this.typeLabels?.textArea;\r\n case QuestionFieldType.SELECT:\r\n return this.typeLabels?.dropdown;\r\n case QuestionFieldType.CHECKBOX:\r\n return this.typeLabels?.checkbox;\r\n case QuestionFieldType.RADIO:\r\n return this.typeLabels?.radio;\r\n case QuestionFieldType.DATE:\r\n return this.typeLabels?.date;\r\n default:\r\n return '';\r\n }\r\n }\r\n\r\n /**\r\n * Shows an error alert for a failed interest-form operation.\r\n * @param {*} error\r\n * @memberof InterestFormComponent\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n handleError(error: any): void {\r\n this.alertService?.showMessage({\r\n status: 'custom',\r\n message: error?.error?.message ?? error?.message,\r\n alertType: AlertType?.ERROR,\r\n isCloseNeeded: true,\r\n });\r\n }\r\n\r\n /**\r\n * Opens the interest form in read-only preview mode (SP3M-317 R6.7), reusing\r\n * the shared express-interest dialog. Shows the admin's current custom\r\n * questions as an end user would see them; no submit, Cancel only.\r\n * @memberof InterestFormComponent\r\n */\r\n onPreview(): void {\r\n this.dialog?.open(InterestFormPreviewComponent, {\r\n width: '720px',\r\n maxWidth: '92vw',\r\n maxHeight: '90vh',\r\n panelClass: ['ieeesa-modal-dialog', 'ieeesa-interest-form-preview'],\r\n ariaModal: true,\r\n data: {\r\n groupName: this.group?.groupName ?? '',\r\n customQuestions: this.customQuestions,\r\n },\r\n });\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 * ngFor tracking for standard question rows.\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 /**\r\n * ngFor tracking for custom questions.\r\n * @param {number} index\r\n * @param {CustomQuestion} question\r\n * @return {string}\r\n * @memberof InterestFormComponent\r\n */\r\n trackByQuestionId(index: number, question: CustomQuestion): string {\r\n return question.questionId as string;\r\n }\r\n\r\n /**\r\n * Emits and completes the destroy subject so any in-flight requests are\r\n * unsubscribed when the component is destroyed.\r\n * @memberof InterestFormComponent\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-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 *ngIf=\"membershipLevels.length > 0\"\r\n formControlName=\"defaultMembershipLevel\"\r\n [radioGroup]=\"membershipLevels\"\r\n (selectedRadioOption)=\"onMembershipLevelChange($event)\"\r\n ></ieeesa-radio>\r\n <p\r\n *ngIf=\"membershipLevels.length === 0\"\r\n class=\"ieeesa-interest-form__section-desc ieeesa-body-sm-14\"\r\n >\r\n {{ noLevelsMessage }}\r\n </p>\r\n </section>\r\n\r\n <section *ngIf=\"isFormEnabled\" class=\"ieeesa-interest-form__section\">\r\n <div\r\n class=\"ieeesa-interest-form__custom-header 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 [disabled]=\"editingQuestionId\"\r\n (click)=\"onAddQuestion()\"\r\n [attr.aria-label]=\"addQuestionLabel\"\r\n >\r\n {{ addQuestionLabel }}\r\n </button>\r\n </div>\r\n\r\n <div\r\n cdkDropList\r\n class=\"ieeesa-interest-form__question-list\"\r\n (cdkDropListDropped)=\"onReorderQuestions($event)\"\r\n >\r\n <div\r\n *ngFor=\"let question of customQuestions; trackBy: trackByQuestionId\"\r\n cdkDrag\r\n [cdkDragDisabled]=\"editingQuestionId\"\r\n class=\"ieeesa-interest-form__question\"\r\n [class.ieeesa-interest-form__question--editing]=\"\r\n editingQuestionId === question.questionId\r\n \"\r\n >\r\n <div\r\n class=\"ieeesa-interest-form__question-row d-flex align-items-center justify-content-between gap-2\"\r\n [class.ieeesa-interest-form__question-row--editing]=\"\r\n editingQuestionId === question.questionId\r\n \"\r\n >\r\n <div class=\"d-flex align-items-center gap-2 ieeesa-interest-form__question-main\">\r\n <span\r\n class=\"ieeesa-interest-form__drag-handle\"\r\n cdkDragHandle\r\n aria-hidden=\"true\"\r\n >\r\n <svg width=\"12\" height=\"16\" viewBox=\"0 0 12 16\" fill=\"none\">\r\n <circle cx=\"3\" cy=\"2\" r=\"1.5\" fill=\"currentColor\"/>\r\n <circle cx=\"9\" cy=\"2\" r=\"1.5\" fill=\"currentColor\"/>\r\n <circle cx=\"3\" cy=\"8\" r=\"1.5\" fill=\"currentColor\"/>\r\n <circle cx=\"9\" cy=\"8\" r=\"1.5\" fill=\"currentColor\"/>\r\n <circle cx=\"3\" cy=\"14\" r=\"1.5\" fill=\"currentColor\"/>\r\n <circle cx=\"9\" cy=\"14\" r=\"1.5\" fill=\"currentColor\"/>\r\n </svg>\r\n </span>\r\n <span class=\"ieeesa-interest-form__question-label ieeesa-body-sm-14\">\r\n {{ question.questionLabel || newQuestionLabel }}\r\n </span>\r\n </div>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <span\r\n *ngIf=\"question.fieldType\"\r\n class=\"ieeesa-interest-form__chip ieeesa-interest-form__chip--type ieeesa-body-sm-14\"\r\n >\r\n {{ getTypeLabel(question.fieldType) }}\r\n </span>\r\n <span\r\n *ngIf=\"question.isRequired\"\r\n class=\"ieeesa-interest-form__chip ieeesa-interest-form__chip--required ieeesa-body-sm-14\"\r\n >\r\n {{ requiredTag }}\r\n </span>\r\n <button\r\n *ngIf=\"editingQuestionId !== question.questionId\"\r\n type=\"button\"\r\n class=\"ieeesa-interest-form__icon-btn\"\r\n (click)=\"onEditQuestion(question)\"\r\n [attr.aria-label]=\"editQuestionAriaLabel\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 18 18\" fill=\"none\">\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M16.06.59l1.35 1.35c.79.78.79 2.05 0 2.83L4.18 18H0v-4.18L10.4 3.41 13.23.59c.78-.78 2.05-.78 2.83 0zM2 16l1.41.06L13.23 6.23l-1.41-1.41L2 14.64V16z\" fill=\"currentColor\"/>\r\n </svg>\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"ieeesa-interest-form__icon-btn ieeesa-interest-form__icon-btn--delete\"\r\n (click)=\"onDeleteQuestion(question.questionId)\"\r\n [attr.aria-label]=\"deleteQuestionAriaLabel\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M15 3V4H20V6H19V19C19 20.1 18.1 21 17 21H7C5.9 21 5 20.1 5 19V6H4V4H9V3H15ZM7 19H17V6H7V19ZM9 8H11V17H9V8ZM15 8H13V17H15V8Z\" fill=\"currentColor\"/>\r\n </svg>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <ieeesa-custom-question-editor\r\n *ngIf=\"editingQuestionId === question.questionId\"\r\n [question]=\"question\"\r\n (save)=\"onSaveQuestion($event)\"\r\n (cancel)=\"onCancelQuestion(question.questionId)\"\r\n ></ieeesa-custom-question-editor>\r\n </div>\r\n </div>\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 [disabled]=\"!!editingQuestionId\"\r\n (click)=\"onPreview()\"\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 [persistTabState]=\"true\"\r\n [tabQueryParam]=\"'interestTab'\"\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 countryCallingCodes: SelectOption[] = [];\r\n // Tenant-configured optional profile fields (e.g. 'phone', 'address') to show on the add-user form.\r\n requiredProfileFields: string[] = [];\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 this.countryCallingCodes = this.groupService.getCountryCallingCodes();\r\n this.getRequiredProfileFields();\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 // TEMP-DISABLED phone library field (country-code dropdown +\r\n // libphonenumber-js) — existing-user branch. Temporarily replaced\r\n // by a plain text input below. Restore this block and remove the\r\n // plain INPUT block when the libphonenumber implementation is\r\n // approved. See appendContactDetailsToPayload() for the submit mapping.\r\n // ...(this.requiredProfileFields.includes('phone')\r\n // ? [\r\n // {\r\n // type: FormControlType.PHONE,\r\n // label: this.addUserRosterTexts?.label?.phoneNumber + '*',\r\n // controlName: 'phone',\r\n // dropdownOptions: this.countryCallingCodes,\r\n // value: {\r\n // countryCode:\r\n // this.userInfo?.phoneCountryCode ?? null,\r\n // phoneNumber: this.userInfo?.phoneNumber ?? null,\r\n // },\r\n // isEditToggle: !!this.userInfo?.phoneNumber,\r\n // validation: [Validators.required],\r\n // maxLength:\r\n // GroupsValidationPatterns.phoneNumberMaxLength,\r\n // requiredErrorMessage:\r\n // this.addUserRosterTexts?.message?.error?.required,\r\n // supportMessage:\r\n // this.addUserRosterTexts?.supportText?.phoneNumber,\r\n // ariaLabel:\r\n // this.addUserRosterTexts?.label?.ariaLabel\r\n // ?.phoneNumber,\r\n // ariaDescribedById:\r\n // this.addUserRosterTexts?.label?.ariaDescribedById\r\n // ?.phoneNumber,\r\n // },\r\n // ]\r\n // : []),\r\n // TEMP plain phone input — no country-code dropdown, no validation/formatting.\r\n // Prefilled from the response; starts read-only with a pencil toggle\r\n // when a value exists, else editable.\r\n ...(this.requiredProfileFields.includes('phone')\r\n ? [\r\n {\r\n type: FormControlType.INPUT,\r\n label: this.addUserRosterTexts?.label?.phoneNumber + '*',\r\n controlName: 'phone',\r\n value: this.userInfo?.phoneNumber ?? '',\r\n isEditToggle: !!this.userInfo?.phoneNumber,\r\n validation: [Validators.required],\r\n requiredErrorMessage:\r\n this.addUserRosterTexts?.message?.error?.required,\r\n supportMessage:\r\n this.addUserRosterTexts?.supportText?.phoneNumber,\r\n ariaLabel:\r\n this.addUserRosterTexts?.label?.ariaLabel\r\n ?.phoneNumber,\r\n ariaDescribedById:\r\n this.addUserRosterTexts?.label?.ariaDescribedById\r\n ?.phoneNumber,\r\n },\r\n ]\r\n : []),\r\n // Address (editable), shown only when the tenant's\r\n // required-profile-fields config requests it. Prefilled when\r\n // present, empty when null. Fixed-size box (see component SCSS).\r\n ...(this.requiredProfileFields.includes('address')\r\n ? [\r\n {\r\n type: FormControlType.TEXT_AREA,\r\n label: this.addUserRosterTexts?.label?.address + '*',\r\n controlName: 'address',\r\n value: this.userInfo?.address ?? '',\r\n // When a value exists, start read-only with a pencil toggle;\r\n // when null, start directly editable.\r\n isEditToggle: !!this.userInfo?.address,\r\n validation: [\r\n Validators.required,\r\n Validators.maxLength(\r\n GroupsValidationPatterns.addressMaxLength\r\n ),\r\n ],\r\n // No live character counter — follow the Representing\r\n // Organization pattern: hard maxLength + error on breach.\r\n maxLength: GroupsValidationPatterns.addressMaxLength,\r\n requiredErrorMessage:\r\n this.addUserRosterTexts?.message?.error?.required,\r\n maxErrorMessage:\r\n this.addUserRosterTexts?.message?.error?.limit\r\n ?.addressMaxChars,\r\n supportMessage:\r\n this.addUserRosterTexts?.supportText?.address,\r\n isResize: false,\r\n ariaMultiline: true,\r\n ariaLabel:\r\n this.addUserRosterTexts?.label?.ariaLabel?.address,\r\n ariaDescribedById:\r\n this.addUserRosterTexts?.label?.ariaDescribedById\r\n ?.address,\r\n },\r\n ]\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 // TEMP-DISABLED phone library field (country-code dropdown +\r\n // libphonenumber-js) — new-user branch (always editable).\r\n // Temporarily replaced by a plain text input below. Restore this\r\n // block and remove the plain INPUT block when the libphonenumber\r\n // implementation is approved. See appendContactDetailsToPayload()\r\n // for the submit mapping.\r\n // ...(this.requiredProfileFields.includes('phone')\r\n // ? [\r\n // {\r\n // type: FormControlType.PHONE,\r\n // label: this.addUserRosterTexts?.label?.phoneNumber + '*',\r\n // controlName: 'phone',\r\n // dropdownOptions: this.countryCallingCodes,\r\n // value: {\r\n // countryCode: null,\r\n // phoneNumber: null,\r\n // },\r\n // validation: [Validators.required],\r\n // maxLength:\r\n // GroupsValidationPatterns.phoneNumberMaxLength,\r\n // requiredErrorMessage:\r\n // this.addUserRosterTexts?.message?.error?.required,\r\n // supportMessage:\r\n // this.addUserRosterTexts?.supportText?.phoneNumber,\r\n // ariaLabel:\r\n // this.addUserRosterTexts?.label?.ariaLabel\r\n // ?.phoneNumber,\r\n // ariaDescribedById:\r\n // this.addUserRosterTexts?.label?.ariaDescribedById\r\n // ?.phoneNumber,\r\n // },\r\n // ]\r\n // : []),\r\n // TEMP plain phone input — no country-code dropdown, no validation/formatting.\r\n // New user: always editable.\r\n ...(this.requiredProfileFields.includes('phone')\r\n ? [\r\n {\r\n type: FormControlType.INPUT,\r\n label: this.addUserRosterTexts?.label?.phoneNumber + '*',\r\n controlName: 'phone',\r\n value: '',\r\n validation: [Validators.required],\r\n requiredErrorMessage:\r\n this.addUserRosterTexts?.message?.error?.required,\r\n supportMessage:\r\n this.addUserRosterTexts?.supportText?.phoneNumber,\r\n ariaLabel:\r\n this.addUserRosterTexts?.label?.ariaLabel\r\n ?.phoneNumber,\r\n ariaDescribedById:\r\n this.addUserRosterTexts?.label?.ariaDescribedById\r\n ?.phoneNumber,\r\n },\r\n ]\r\n : []),\r\n // Address, shown only when the tenant's required-profile-fields\r\n // config requests it.\r\n ...(this.requiredProfileFields.includes('address')\r\n ? [\r\n {\r\n type: FormControlType.TEXT_AREA,\r\n label: this.addUserRosterTexts?.label?.address + '*',\r\n controlName: 'address',\r\n validation: [\r\n Validators.required,\r\n Validators.maxLength(\r\n GroupsValidationPatterns.addressMaxLength\r\n ),\r\n ],\r\n // No live character counter — follow the Representing\r\n // Organization pattern: hard maxLength + error on breach.\r\n maxLength: GroupsValidationPatterns.addressMaxLength,\r\n requiredErrorMessage:\r\n this.addUserRosterTexts?.message?.error?.required,\r\n maxErrorMessage:\r\n this.addUserRosterTexts?.message?.error?.limit\r\n ?.addressMaxChars,\r\n supportMessage:\r\n this.addUserRosterTexts?.supportText?.address,\r\n // Keep the box a fixed size (no drag-resize). The fixed\r\n // height with internal scroll is enforced via component SCSS\r\n // so the field doesn't grow as the user types, matching the\r\n // Representing Organization field's fixed-box behavior.\r\n isResize: false,\r\n ariaMultiline: true,\r\n ariaLabel:\r\n this.addUserRosterTexts?.label?.ariaLabel?.address,\r\n ariaDescribedById:\r\n this.addUserRosterTexts?.label?.ariaDescribedById\r\n ?.address,\r\n },\r\n ]\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 tenant's required profile fields so the add-user form only shows\r\n * the phone/address fields the tenant has configured as required.\r\n * @memberof AddUserRosterComponent\r\n */\r\n getRequiredProfileFields(): void {\r\n this.requiredProfileFields =\r\n this.groupService.getRequiredProfileFields() ?? [];\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 // Optional contact fields — apply to both new and existing users.\r\n this.appendContactDetailsToPayload(payload, formData);\r\n return payload;\r\n }\r\n\r\n /**\r\n * Appends the optional contact fields (phone country code, phone number and\r\n * address) to the payload. The country code is sent only when a phone number\r\n * is provided; phone number and address are included only when the user\r\n * entered a value (so nulls/empties are not sent to the backend).\r\n * @param {(AddOrEditUserPayload | AddOrEditUserIndividualRosterPayload)} payload\r\n * @param {*} formData\r\n * @memberof AddUserRosterComponent\r\n */\r\n appendContactDetailsToPayload(\r\n payload: AddOrEditUserPayload | AddOrEditUserIndividualRosterPayload,\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n formData: any\r\n ): void {\r\n // TEMP-DISABLED phone library mapping — the PHONE control used to store\r\n // { countryCode, phoneNumber }. While the field is a plain text input,\r\n // `formData.phone` is the raw phone-number string and no country code is\r\n // collected. Restore the object-based mapping below when the phone library\r\n // field is re-enabled.\r\n // const phoneNumber = formData?.phone?.phoneNumber?.trim();\r\n // const phoneCountryCode = formData?.phone?.countryCode;\r\n const phoneNumber = formData?.phone?.trim();\r\n const address = formData?.address?.trim();\r\n if (phoneNumber) {\r\n payload.payload.phoneNumber = phoneNumber;\r\n // No country code is collected while the plain text input is in use.\r\n // if (phoneCountryCode) payload.payload.phoneCountryCode = phoneCountryCode;\r\n }\r\n if (address) payload.payload.address = address;\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 PHONE_NUMBER = 'phone_number',\r\n ADDRESS = 'address',\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 const notRestricted = !this.groupService.isGroupsAndRostersRestricted();\r\n this.rosterActions.isAddNeeded =notRestricted && this.getManageRosterActionsPermission();\r\n this.rosterActions.isEditNeeded =notRestricted && this.getManageRosterActionsPermission();\r\n this.rosterActions.isDeleteNeeded =notRestricted && 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 // Insert Classification immediately before the Role column (its original position).\r\n const roleColumnIndex = this.columnSchema.findIndex(\r\n (column) => column.columnDef === TableColumnSchemaUserGroup.ROLE\r\n );\r\n const classificationInsertIndex =\r\n roleColumnIndex === -1 ? this.columnSchema.length - 1 : roleColumnIndex;\r\n this.columnSchema.splice(classificationInsertIndex, 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 phoneCountryCode: selectedUserInfo[0]?.phoneCountryCode,\r\n phoneNumber: selectedUserInfo[0]?.phoneNumber,\r\n address: selectedUserInfo[0]?.address,\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 phoneCountryCode: selectedUserInfo[0]?.phoneCountryCode,\r\n phoneNumber: selectedUserInfo[0]?.phoneNumber,\r\n address: selectedUserInfo[0]?.address,\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__actions-slot\">\r\n <div class=\"ieeesa-view-roster__export-anchor\">\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 <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 </div>\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 <!-- 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 StorageService,\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\nimport { TenantFeature } from './models/tenant-feature.model';\r\n\r\ninterface RosterHistoryRestoreDescriptor {\r\n version: 1;\r\n groupId: string;\r\n groupName: string;\r\n}\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 private _requiredProfileFields: string[] = [];\r\n /**\r\n * Tenant-level required profile fields (e.g. ['phone','address','employer'])\r\n * supplied by the host app from its cached tenant configuration. Passed to\r\n * GroupsService so the roster import appends them to its required columns and\r\n * sample file. Optional — defaults to none.\r\n *\r\n * Implemented as a setter so EVERY input update (including a late,\r\n * async-resolved value that arrives after ngOnInit) is propagated to the\r\n * singleton GroupsService — not just the initial binding.\r\n */\r\n @Input()\r\n set requiredProfileFields(value: string[] | null | undefined) {\r\n this._requiredProfileFields = value ?? [];\r\n this.groupsService?.setRequiredProfileFields(this._requiredProfileFields);\r\n }\r\n get requiredProfileFields(): string[] {\r\n return this._requiredProfileFields;\r\n }\r\n private _tenantFeatures: TenantFeature[] = [];\r\n /**\r\n * Tenant feature flags supplied by the host app from its cached tenant\r\n * configuration. Passed to GroupsService so interest-form UI (e.g. the\r\n * \"Manage Interest Form\" tree action) is gated on whether the feature is\r\n * enabled for the tenant. Optional — defaults to none (fail-closed).\r\n *\r\n * Implemented as a setter so EVERY input update (including a late,\r\n * async-resolved value that arrives after ngOnInit) is propagated to the\r\n * singleton GroupsService — not just the initial binding.\r\n */\r\n @Input()\r\n set tenantFeatures(value: TenantFeature[] | null | undefined) {\r\n this._tenantFeatures = value ?? [];\r\n this.groupsService?.setTenantFeatures(this._tenantFeatures);\r\n }\r\n get tenantFeatures(): TenantFeature[] {\r\n return this._tenantFeatures;\r\n }\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 private hasAttemptedHistoryRestore = false;\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 // eslint-disable-next-line no-unused-vars\r\n private storageService: StorageService\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.groupsService?.setTenantFeatures(this._tenantFeatures);\r\n // requiredProfileFields and tenantFeatures are also propagated to the\r\n // service by their @Input setters (covering both the initial binding and\r\n // any later async-resolved update).\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 * Passthrough to the service restriction check so the template can gate\r\n * group/roster write actions on the negative Restrict Groups And Rosters\r\n * permission.\r\n * @return {boolean}\r\n * @memberof GroupsComponent\r\n */\r\n isGroupsAndRostersRestricted(): boolean {\r\n return this.groupsService.isGroupsAndRostersRestricted();\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(\r\n selectedGroupInfo: GroupInfo,\r\n isRestored = false\r\n ): 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.persistRosterHistory(selectedGroupInfo);\r\n this.openModal(\r\n dialogOptions,\r\n 'ieeesa-roster-import-history-dialog',\r\n undefined,\r\n isRestored\r\n );\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 isRestoredReadOnlyDialog = false\r\n ): void {\r\n className = className ?? '';\r\n const isRosterImportHistory =\r\n this.functionType === GroupFunctionType.VIEW_IMPORT_HISTORY;\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 !isRestoredReadOnlyDialog)\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 !isRestoredReadOnlyDialog)\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 (isRosterImportHistory) {\r\n this.storageService.removeValue(this.rosterHistoryStorageKey);\r\n }\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.restoreRosterImportHistoryModal();\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 private get rosterHistoryStorageKey(): string {\r\n return `ieeesa.overlay:${window.location.pathname}${window.location.search}:roster-import-history`;\r\n }\r\n\r\n private persistRosterHistory(group: GroupInfo): void {\r\n if (!group?.groupId) {\r\n return;\r\n }\r\n const descriptor: RosterHistoryRestoreDescriptor = {\r\n version: 1,\r\n groupId: group.groupId,\r\n groupName: group.groupName,\r\n };\r\n this.storageService.setValue(this.rosterHistoryStorageKey, descriptor);\r\n }\r\n\r\n private restoreRosterImportHistoryModal(): void {\r\n if (this.hasAttemptedHistoryRestore) {\r\n return;\r\n }\r\n this.hasAttemptedHistoryRestore = true;\r\n const navigation = performance\r\n ?.getEntriesByType?.('navigation')?.[0] as\r\n | PerformanceNavigationTiming\r\n | undefined;\r\n if (navigation?.type !== 'reload') {\r\n return;\r\n }\r\n const descriptor = this.storageService.getValue(\r\n this.rosterHistoryStorageKey\r\n ) as RosterHistoryRestoreDescriptor | null;\r\n if (\r\n descriptor?.version !== 1 ||\r\n !descriptor.groupId ||\r\n !descriptor.groupName\r\n ) {\r\n return;\r\n }\r\n const selectedGroup = {\r\n groupId: descriptor.groupId,\r\n groupName: descriptor.groupName,\r\n } as GroupInfo;\r\n this.groupsService.setSelectedGroupInfo(selectedGroup);\r\n this.openRosterImportHistoryModal(selectedGroup, true);\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 !isGroupsAndRostersRestricted() &&\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 !isGroupsAndRostersRestricted() &&\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 * When the import was created (ISO timestamp). Drives the \"Timestamp\" column\r\n * in View History. Present only once the BE exposes it (currently @JsonIgnore);\r\n * undefined otherwise, in which case the UI shows a placeholder.\r\n */\r\n createdOn?: string;\r\n /**\r\n * Who ran the import (user email/name). Drives the \"Person Imported\" column in\r\n * View History. Present only once the BE exposes it (currently @JsonIgnore);\r\n * undefined otherwise, in which case the UI shows a placeholder.\r\n */\r\n createdBy?: string;\r\n /**\r\n * Row-level errors from the BE `error_report` JSONB column. Observed to arrive\r\n * EITHER as a parsed object `{ rows: RosterImportErrorReport[] }` OR as a raw\r\n * JSON string of the same shape (depending on serialization). A bare array is\r\n * also tolerated. `null` when there are no row errors. The client normalizes\r\n * all of these — see RosterImportComponent.parseErrorReport.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n errorReport?: any;\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-responses/interest-responses.component';\r\nexport * from './lib/components/interest-form/interest-form.component';\r\nexport * from './lib/components/custom-question-editor/custom-question-editor.component';\r\nexport * from './lib/components/interest-form-preview/interest-form-preview.component';\r\nexport * from './lib/models/custom-question.model';\r\nexport * from './lib/services/interest-form.service';\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\nexport * from './lib/models/required-profile-fields.model';\r\nexport * from './lib/models/tenant-feature.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\nexport * from './lib/models/interest-response.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","AlertType","i2.InterestFormService","i3.GroupsService","constants?.errors","constants?.deleteUsersGroup","constants?.ariaLabel","i4.RosterExportService","i6","screenTexts?.deleteGroup","i5.UserPermissionsService","i6.GroupPermissionsMapService","i7"],"mappings":"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"}
|