@ieeesa-npm/groups 0.15.2 → 0.15.4

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.
@@ -5,23 +5,25 @@ import { CommonModule } from '@angular/common';
5
5
  import * as i3$1 from '@angular/forms';
6
6
  import { FormsModule, Validators } from '@angular/forms';
7
7
  import * as i2$1 from '@ieeesa-npm/presentation';
8
- import { SlideToggleComponent, AlignType, FormControlType, DynamicFormComponent, MenuComponent, IconButtonComponent, TextTruncatedDirective, SearchType, ChipsType, TableColumnType, TableColumnSortDirection, ModalConfirmationComponent, DataTableComponent, ModalComponent, SearchComponent, SelectComponent, LegendComponent } from '@ieeesa-npm/presentation';
8
+ import { SlideToggleComponent, AlignType, FormControlType, DynamicFormComponent, MenuComponent, IconButtonComponent, TextTruncatedDirective, SearchType, ExportFormat, PolicyConfirmationDialogComponent, ExportSuccessDialogComponent, ChipsType, TableColumnType, TableColumnSortDirection, ModalConfirmationComponent, DataTableComponent, ExportFormatPopoverComponent, ModalComponent, SearchComponent, SelectComponent, LegendComponent } from '@ieeesa-npm/presentation';
9
9
  import * as i2 from '@ieeesa-npm/utility';
10
10
  import { AlertsService } from '@ieeesa-npm/utility';
11
- import { HttpErrorResponse } from '@angular/common/http';
11
+ import * as i1$1 from '@angular/common/http';
12
+ import { HttpErrorResponse, HttpParams } from '@angular/common/http';
12
13
  import * as i1 from '@angular/material/dialog';
13
14
  import { MAT_DIALOG_DATA, MatDialogModule } from '@angular/material/dialog';
14
- import { BehaviorSubject, map, catchError, Subject, takeUntil, forkJoin, merge } from 'rxjs';
15
+ import { BehaviorSubject, map, catchError, Subject, takeUntil, forkJoin, merge, EMPTY } from 'rxjs';
15
16
  import { AlertType, FormStatus, ModalType } from '@ieeesa-npm/models';
16
17
  import * as i4 from '@angular/material/button';
17
18
  import { MatButtonModule } from '@angular/material/button';
18
19
  import { FlatTreeControl } from '@angular/cdk/tree';
19
- import { takeUntil as takeUntil$1, map as map$1 } from 'rxjs/operators';
20
+ import { takeUntil as takeUntil$1, map as map$1, catchError as catchError$1 } from 'rxjs/operators';
20
21
  import { MatIconModule } from '@angular/material/icon';
21
22
  import * as i4$1 from '@angular/material/tree';
22
23
  import { MatTreeModule } from '@angular/material/tree';
23
24
  import * as i5 from '@angular/material/tooltip';
24
25
  import { MatTooltipModule } from '@angular/material/tooltip';
26
+ import { saveAs } from 'file-saver';
25
27
 
26
28
  var addUserRoster = {
27
29
  heading: "New User",
@@ -279,6 +281,38 @@ var viewRoster = {
279
281
  searchPlaceholderIndividual: "Search by Name/Email Address/Representing Org",
280
282
  emptyFieldValueReplacedBy: "-"
281
283
  };
284
+ var rosterExport = {
285
+ buttonLabel: "Export",
286
+ ariaLabel: "Export roster",
287
+ popoverTitle: "Select the file format for roster export.",
288
+ formatOptions: {
289
+ csv: {
290
+ label: "CSV",
291
+ subtitle: "Comma separated file",
292
+ ariaLabel: "Export roster as CSV"
293
+ },
294
+ excel: {
295
+ label: "Excel",
296
+ subtitle: "Spreadsheet File",
297
+ ariaLabel: "Export roster as Excel"
298
+ }
299
+ },
300
+ policyDialog: {
301
+ title: "IEEE Data Access and Use Policy",
302
+ 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.",
303
+ policyUrl: "https://www.ieee.org/ieee-data-access-and-use-policy.html",
304
+ policyLinkText: "data access and use policy",
305
+ cancelLabel: "Cancel",
306
+ confirmLabel: "Confirm"
307
+ },
308
+ successDialog: {
309
+ message: "The file was downloaded successfully.",
310
+ closeButton: "Close"
311
+ },
312
+ messages: {
313
+ exportFailed: "Failed to export roster. Please try again."
314
+ }
315
+ };
282
316
  var editUserRoles = {
283
317
  heading: "Edit System User",
284
318
  message: {
@@ -363,6 +397,7 @@ var constants = {
363
397
  deleteGroup: deleteGroup,
364
398
  deleteUsersGroup: deleteUsersGroup,
365
399
  viewRoster: viewRoster,
400
+ rosterExport: rosterExport,
366
401
  editUserRoles: editUserRoles,
367
402
  errors: errors,
368
403
  ariaLabel: ariaLabel
@@ -379,11 +414,45 @@ var screenTexts = /*#__PURE__*/Object.freeze({
379
414
  editGroup: editGroup,
380
415
  editUserRoles: editUserRoles,
381
416
  errors: errors,
417
+ rosterExport: rosterExport,
382
418
  viewGroups: viewGroups,
383
419
  viewRoster: viewRoster
384
420
  });
385
421
 
386
- /* eslint-disable no-useless-escape */
422
+ /**
423
+ * Required validator for the multi-select-autocomplete "Representing Organization"
424
+ * control. The control's value is the array of selected chips (set by the
425
+ * component), so this treats a non-empty array — or a non-empty string — as
426
+ * valid. Keying off the selection (rather than the raw input text) prevents the
427
+ * required error from flashing when Material momentarily writes a transient
428
+ * empty value during option selection.
429
+ * @return {ValidatorFn}
430
+ */
431
+ function representingOrgRequiredValidator() {
432
+ return (control) => {
433
+ const value = control?.value;
434
+ const hasSelection = Array.isArray(value)
435
+ ? value.length > 0
436
+ : !!(typeof value === 'string' ? value.trim() : value);
437
+ return hasSelection ? null : { required: true };
438
+ };
439
+ }
440
+ /**
441
+ * Wraps a string-oriented validator (minLength/maxLength/pattern) so it is
442
+ * skipped when the control value is the selection array. Those built-in
443
+ * validators evaluate `.length` / string shape and would incorrectly fail
444
+ * against the chips array; they should only constrain free-text input.
445
+ * @param {ValidatorFn} validator the underlying string validator
446
+ * @return {ValidatorFn}
447
+ */
448
+ function skipWhenArray(validator) {
449
+ return (control) => {
450
+ if (Array.isArray(control?.value)) {
451
+ return null;
452
+ }
453
+ return validator(control);
454
+ };
455
+ }
387
456
  const GroupsValidationPatterns = {
388
457
  // Group Name field regular expression, which accept Alpha Numeric, Special Characters (ASCII) and whitespace.
389
458
  groupName: /^(?=.*[a-zA-Z])[\w\s!"#$%&'()*+,-.\/\:;<=>?@[\]^_`{|}~\\]+$/i,
@@ -3136,11 +3205,14 @@ class EditUserRolesComponent {
3136
3205
  type: FormControlType.MULTI_SELECT_AUTO_COMPLETE,
3137
3206
  label: this.addUserRosterTexts?.label?.representingOrganization + '*',
3138
3207
  controlName: 'representingOrg',
3208
+ // Validate on blur so the required error surfaces only after the user
3209
+ // leaves the field — never mid-selection (avoids the error flash).
3210
+ updateOn: 'blur',
3139
3211
  validation: [
3140
- Validators.required,
3141
- Validators.maxLength(GroupsValidationPatterns.representingOrgNameMaxLength),
3142
- Validators.minLength(GroupsValidationPatterns.representingOrgNameMinLength),
3143
- Validators.pattern(GroupsValidationPatterns.representingOrganization),
3212
+ representingOrgRequiredValidator(),
3213
+ skipWhenArray(Validators.maxLength(GroupsValidationPatterns.representingOrgNameMaxLength)),
3214
+ skipWhenArray(Validators.minLength(GroupsValidationPatterns.representingOrgNameMinLength)),
3215
+ skipWhenArray(Validators.pattern(GroupsValidationPatterns.representingOrganization)),
3144
3216
  ],
3145
3217
  multiSelectAutoCompleteOptions: this.organizations,
3146
3218
  value: this.representingOrganizations?.length
@@ -3864,14 +3936,17 @@ class AddUserRosterComponent {
3864
3936
  type: FormControlType.MULTI_SELECT_AUTO_COMPLETE,
3865
3937
  label: this.addUserRosterTexts?.label?.representingOrganization + '*',
3866
3938
  controlName: 'representingOrg',
3939
+ // Validate on blur so the required error surfaces only after the user
3940
+ // leaves the field — never mid-selection (avoids the error flash).
3941
+ updateOn: 'blur',
3867
3942
  value: this.selectedOrganizations.length
3868
3943
  ? this.selectedOrganizations
3869
3944
  : '',
3870
3945
  validation: [
3871
- Validators.required,
3872
- Validators.maxLength(GroupsValidationPatterns.representingOrgNameMaxLength),
3873
- Validators.minLength(GroupsValidationPatterns.representingOrgNameMinLength),
3874
- Validators.pattern(GroupsValidationPatterns.representingOrganization),
3946
+ representingOrgRequiredValidator(),
3947
+ skipWhenArray(Validators.maxLength(GroupsValidationPatterns.representingOrgNameMaxLength)),
3948
+ skipWhenArray(Validators.minLength(GroupsValidationPatterns.representingOrgNameMinLength)),
3949
+ skipWhenArray(Validators.pattern(GroupsValidationPatterns.representingOrganization)),
3875
3950
  ],
3876
3951
  multiSelectAutoCompleteOptions: this.organizations,
3877
3952
  supportMessage: this.addUserRosterTexts?.supportText?.representingOrganization,
@@ -4247,6 +4322,390 @@ var TableColumnSchemaUserGroup;
4247
4322
  TableColumnSchemaUserGroup["MEMBER_TYPE"] = "memberType";
4248
4323
  })(TableColumnSchemaUserGroup || (TableColumnSchemaUserGroup = {}));
4249
4324
 
4325
+ /**
4326
+ * RosterExportService owns the complete group roster export flow:
4327
+ * 1. Manages export popover open/close state
4328
+ * 2. Opens IEEE Data Access and Use Policy confirmation dialog
4329
+ * 3. Calls the backend roster export API (blob response)
4330
+ * 4. Triggers file download via File System Access API / file-saver
4331
+ * 5. Shows success/error dialogs and toasts
4332
+ *
4333
+ * The component only needs to:
4334
+ * - Subscribe to `isPopoverOpen$` for popover visibility
4335
+ * - Call `togglePopover()` on Export button click
4336
+ * - Call `onFormatSelected(format, groupId, groupName)` when user picks a format
4337
+ *
4338
+ * Follows the same pattern as MeetingExportService in the events-and-meetings library.
4339
+ * @export
4340
+ * @class RosterExportService
4341
+ */
4342
+ class RosterExportService {
4343
+ constructor(
4344
+ // eslint-disable-next-line no-unused-vars
4345
+ httpClient,
4346
+ // eslint-disable-next-line no-unused-vars
4347
+ dialog,
4348
+ // eslint-disable-next-line no-unused-vars
4349
+ alertService) {
4350
+ this.httpClient = httpClient;
4351
+ this.dialog = dialog;
4352
+ this.alertService = alertService;
4353
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
4354
+ this.constants = screenTexts;
4355
+ this.destroy$ = new Subject();
4356
+ /** Controls popover open/close state */
4357
+ this.isPopoverOpenSubject$ = new BehaviorSubject(false);
4358
+ this.isPopoverOpen$ = this.isPopoverOpenSubject$.asObservable();
4359
+ /** Controls in-progress state for button disable */
4360
+ this.isExportInProgressSubject$ = new BehaviorSubject(false);
4361
+ this.isExportInProgress$ = this.isExportInProgressSubject$.asObservable();
4362
+ /** Format options for the export popover */
4363
+ this.exportFormatOptions = [
4364
+ {
4365
+ label: this.constants?.rosterExport?.formatOptions?.csv?.label ?? 'CSV',
4366
+ value: ExportFormat.CSV,
4367
+ ariaLabel: this.constants?.rosterExport?.formatOptions?.csv?.ariaLabel ?? 'Export roster as CSV',
4368
+ },
4369
+ {
4370
+ label: this.constants?.rosterExport?.formatOptions?.excel?.label ?? 'Excel',
4371
+ value: ExportFormat.EXCEL,
4372
+ ariaLabel: this.constants?.rosterExport?.formatOptions?.excel?.ariaLabel ?? 'Export roster as Excel',
4373
+ },
4374
+ ];
4375
+ /** Subtitle labels for the format selection cards */
4376
+ this.exportFormatSubtitles = {
4377
+ csv: this.constants?.rosterExport?.formatOptions?.csv?.subtitle ?? 'Comma separated file',
4378
+ xls: this.constants?.rosterExport?.formatOptions?.excel?.subtitle ?? 'Spreadsheet File',
4379
+ };
4380
+ /** Popover title */
4381
+ this.popoverTitle = this.constants?.rosterExport?.popoverTitle ?? 'Select the file format for roster export.';
4382
+ }
4383
+ /**
4384
+ * Sets the API base URL for roster export calls.
4385
+ * @param {string} url - Base URL (e.g., 'https://saappsapidev.ieee.org/v1')
4386
+ * @memberof RosterExportService
4387
+ */
4388
+ setApiBaseUrl(url) {
4389
+ this.apiBaseUrl = url;
4390
+ }
4391
+ /**
4392
+ * Toggles the export format popover open/closed.
4393
+ * Called by the component on Export button click.
4394
+ * @memberof RosterExportService
4395
+ */
4396
+ togglePopover() {
4397
+ this.isPopoverOpenSubject$.next(!this.isPopoverOpenSubject$.getValue());
4398
+ }
4399
+ /**
4400
+ * Closes the export format popover.
4401
+ * @memberof RosterExportService
4402
+ */
4403
+ closePopover() {
4404
+ this.isPopoverOpenSubject$.next(false);
4405
+ }
4406
+ /**
4407
+ * Handles format selection from the export popover.
4408
+ * Closes popover, opens IEEE Policy dialog, on confirm triggers export.
4409
+ * This is the main entry point called by the component after user picks a format.
4410
+ * @param {ExportFormat} format - Selected format (CSV or XLS)
4411
+ * @param {string} groupId - The group ID to export the roster for
4412
+ * @param {string} groupName - The group name for filename generation
4413
+ * @memberof RosterExportService
4414
+ */
4415
+ onFormatSelected(format, groupId, groupName) {
4416
+ this.closePopover();
4417
+ const dialogData = {
4418
+ title: this.constants?.rosterExport?.policyDialog?.title ?? 'IEEE Data Access and Use Policy',
4419
+ 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.',
4420
+ policyUrl: this.constants?.rosterExport?.policyDialog?.policyUrl ?? 'https://www.ieee.org/ieee-data-access-and-use-policy.html',
4421
+ policyLinkText: this.constants?.rosterExport?.policyDialog?.policyLinkText ?? 'data access and use policy',
4422
+ cancelLabel: this.constants?.rosterExport?.policyDialog?.cancelLabel ?? 'Cancel',
4423
+ confirmLabel: this.constants?.rosterExport?.policyDialog?.confirmLabel ?? 'Confirm',
4424
+ };
4425
+ const dialogRef = this.dialog.open(PolicyConfirmationDialogComponent, {
4426
+ data: dialogData,
4427
+ width: '637px',
4428
+ panelClass: ['ieeesa-policy-dialog'],
4429
+ });
4430
+ dialogRef.afterClosed()
4431
+ .pipe(takeUntil(this.destroy$))
4432
+ .subscribe((confirmed) => {
4433
+ if (confirmed) {
4434
+ this.startExport(format, groupId, groupName);
4435
+ }
4436
+ });
4437
+ }
4438
+ /**
4439
+ * Starts the export after the user confirms the policy dialog.
4440
+ *
4441
+ * When the File System Access API is available, the native Save picker is opened
4442
+ * HERE — synchronously within the confirm handler — while the user activation from
4443
+ * the confirm click is still valid. (Opening it later, inside the async HTTP
4444
+ * response callback, would exceed the activation window and the browser would
4445
+ * reject it with a SecurityError.) The obtained file handle is then passed to the
4446
+ * HTTP flow, which writes the downloaded bytes to it once the response arrives, so
4447
+ * the success dialog is still shown only AFTER the file is saved.
4448
+ *
4449
+ * If the user cancels the picker we abort before making the request. If the API is
4450
+ * unavailable (Firefox/Safari) we proceed without a handle and fall back to
4451
+ * `saveAs()` after the response.
4452
+ * @param {ExportFormat} format
4453
+ * @param {string} groupId
4454
+ * @param {string} groupName
4455
+ * @memberof RosterExportService
4456
+ */
4457
+ startExport(format, groupId, groupName) {
4458
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
4459
+ const showSaveFilePicker = window.showSaveFilePicker;
4460
+ if (typeof showSaveFilePicker !== 'function') {
4461
+ // API unavailable: no handle; executeExport() will use the saveAs() fallback.
4462
+ this.executeExport(format, groupId, groupName, null);
4463
+ return;
4464
+ }
4465
+ const mimeType = format === ExportFormat.CSV
4466
+ ? 'text/csv'
4467
+ : 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';
4468
+ const extension = format === ExportFormat.CSV ? '.csv' : '.xlsx';
4469
+ const suggestedName = this.buildFilename(groupName, format);
4470
+ // Open the picker now, while the confirm-click activation is still valid.
4471
+ showSaveFilePicker({
4472
+ suggestedName,
4473
+ types: [
4474
+ {
4475
+ description: format === ExportFormat.CSV ? 'CSV File' : 'Excel File',
4476
+ accept: { [mimeType]: [extension] },
4477
+ },
4478
+ ],
4479
+ })
4480
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
4481
+ .then((handle) => {
4482
+ this.executeExport(format, groupId, groupName, handle);
4483
+ })
4484
+ .catch((error) => {
4485
+ // User cancelled the Save dialog — abort silently, no request made.
4486
+ if (error instanceof DOMException && error.name === 'AbortError') {
4487
+ return;
4488
+ }
4489
+ // Any other picker error: fall back to the saveAs() flow.
4490
+ this.executeExport(format, groupId, groupName, null);
4491
+ });
4492
+ }
4493
+ /**
4494
+ * Executes the roster export API call and writes the downloaded file.
4495
+ * Endpoint: GET /v1/groups/roster/export/{groupId}?format=csv|xlsx
4496
+ * When a pre-obtained file handle is provided (from the picker opened at confirm
4497
+ * time) the bytes are written to it; otherwise it falls back to `saveAs()`.
4498
+ * The success dialog is shown only after the file has been written.
4499
+ * @param {ExportFormat} format - The selected export format
4500
+ * @param {string} groupId - The group identifier
4501
+ * @param {string} groupName - The group name for filename
4502
+ * @param {FileSystemFileHandle | null} fileHandle - Handle from the Save picker, or null
4503
+ * @memberof RosterExportService
4504
+ */
4505
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
4506
+ executeExport(format, groupId, groupName, fileHandle) {
4507
+ this.isExportInProgressSubject$.next(true);
4508
+ // Backend expects 'csv' or 'xlsx'. The ExportFormat.EXCEL enum value is
4509
+ // 'xls', so it must be mapped to 'xlsx' here — sending 'xls' is rejected
4510
+ // with error code 1079.
4511
+ const formatValue = format === ExportFormat.CSV ? 'csv' : 'xlsx';
4512
+ const params = new HttpParams().set('format', formatValue);
4513
+ const url = `${this.getExportApiUrl()}/groups/roster/export/${groupId}`;
4514
+ this.httpClient
4515
+ .get(url, {
4516
+ params,
4517
+ responseType: 'blob',
4518
+ observe: 'response',
4519
+ })
4520
+ .pipe(map$1((response) => {
4521
+ const filename = this.extractFilenameFromResponse(response, format, groupName);
4522
+ return { blob: response.body, filename };
4523
+ }), catchError$1(() => {
4524
+ this.isExportInProgressSubject$.next(false);
4525
+ this.alertService.showMessage({
4526
+ status: 'custom',
4527
+ message: this.constants?.rosterExport?.messages?.exportFailed ?? 'Failed to export roster. Please try again.',
4528
+ alertType: AlertType.ERROR,
4529
+ isCloseNeeded: true,
4530
+ });
4531
+ // Error is fully handled (alert shown). Complete the stream instead of
4532
+ // rethrowing, so the next-only subscribe does not report it as an
4533
+ // unhandled RxJS error.
4534
+ return EMPTY;
4535
+ }), takeUntil(this.destroy$))
4536
+ .subscribe({
4537
+ next: (result) => {
4538
+ // Write to the pre-obtained handle (picker opened at confirm time) or fall
4539
+ // back to saveAs(). Success dialog only shows after the file is written.
4540
+ this.downloadFile(result.blob, result.filename, format, fileHandle)
4541
+ .then(({ saved }) => {
4542
+ this.isExportInProgressSubject$.next(false);
4543
+ if (saved) {
4544
+ this.showExportSuccessDialogAfterDownload(result.filename);
4545
+ }
4546
+ })
4547
+ .catch(() => {
4548
+ this.isExportInProgressSubject$.next(false);
4549
+ this.alertService.showMessage({
4550
+ status: 'custom',
4551
+ message: this.constants?.rosterExport?.messages?.exportFailed ?? 'Failed to export roster. Please try again.',
4552
+ alertType: AlertType.ERROR,
4553
+ isCloseNeeded: true,
4554
+ });
4555
+ });
4556
+ },
4557
+ });
4558
+ }
4559
+ /**
4560
+ * Shows the export success dialog after a successful file download.
4561
+ * @param {string} filename - The downloaded filename
4562
+ * @memberof RosterExportService
4563
+ */
4564
+ showExportSuccessDialogAfterDownload(filename) {
4565
+ const successMessage = this.constants?.rosterExport?.successDialog?.message ?? 'The file was downloaded successfully.';
4566
+ const closeLabel = this.constants?.rosterExport?.successDialog?.closeButton ?? 'Close';
4567
+ const dialogData = {
4568
+ message: successMessage,
4569
+ filename,
4570
+ closeLabel,
4571
+ };
4572
+ this.dialog.open(ExportSuccessDialogComponent, {
4573
+ data: dialogData,
4574
+ width: '467px',
4575
+ panelClass: ['ieeesa-export-success-dialog-panel'],
4576
+ autoFocus: false,
4577
+ });
4578
+ }
4579
+ /**
4580
+ * Returns the API base URL for roster export.
4581
+ * @return {string}
4582
+ * @memberof RosterExportService
4583
+ */
4584
+ getExportApiUrl() {
4585
+ if (!this.apiBaseUrl) {
4586
+ throw new Error('RosterExportService apiBaseUrl is not set. Call setApiBaseUrl() before export.');
4587
+ }
4588
+ // apiBaseUrl already carries the version segment (e.g. '.../v1'), same as every
4589
+ // other GroupsService call which is built as `${apiBaseUrl}/groups/...`. So the
4590
+ // caller only appends '/groups/roster/export/{groupId}' — the version is NOT
4591
+ // repeated here. Strip a trailing slash to avoid a double slash before '/groups'.
4592
+ return this.apiBaseUrl.replace(/\/+$/, '');
4593
+ }
4594
+ /**
4595
+ * Extracts filename from Content-Disposition header.
4596
+ * Falls back to buildFilename() if header is missing.
4597
+ * @param {HttpResponse<Blob>} response
4598
+ * @param {ExportFormat} format
4599
+ * @param {string} groupName
4600
+ * @return {string}
4601
+ * @memberof RosterExportService
4602
+ */
4603
+ extractFilenameFromResponse(response, format, groupName) {
4604
+ const contentDisposition = response.headers.get('Content-Disposition');
4605
+ if (contentDisposition) {
4606
+ const filenameMatch = contentDisposition.match(/filename="?([^"]+)"?/);
4607
+ if (filenameMatch && filenameMatch[1]) {
4608
+ return filenameMatch[1].replace(/[/\\:*?"<>|]/g, '_').substring(0, 200);
4609
+ }
4610
+ }
4611
+ return this.buildFilename(groupName, format);
4612
+ }
4613
+ /**
4614
+ * Builds a sanitized filename for the roster export.
4615
+ * Pattern: {SanitizedGroupName}_Roster.{extension}
4616
+ * @param {string} groupName
4617
+ * @param {ExportFormat} format
4618
+ * @return {string}
4619
+ * @memberof RosterExportService
4620
+ */
4621
+ buildFilename(groupName, format) {
4622
+ const sanitized = this.sanitizeGroupName(groupName);
4623
+ const extension = format === ExportFormat.CSV ? 'csv' : 'xlsx';
4624
+ return `${sanitized}_Roster.${extension}`;
4625
+ }
4626
+ /**
4627
+ * Sanitizes the group name for use in a filename.
4628
+ * Replaces non-alphanumeric characters (except hyphen/underscore) with underscore,
4629
+ * collapses consecutive underscores, and truncates to 200 chars.
4630
+ * @param {string} groupName
4631
+ * @return {string}
4632
+ * @memberof RosterExportService
4633
+ */
4634
+ sanitizeGroupName(groupName) {
4635
+ if (!groupName) {
4636
+ return 'Unnamed_Group';
4637
+ }
4638
+ const sanitized = groupName
4639
+ .replace(/[^a-zA-Z0-9_-]/g, '_')
4640
+ .replace(/_+/g, '_')
4641
+ .substring(0, 200);
4642
+ return sanitized || 'Unnamed_Group';
4643
+ }
4644
+ /**
4645
+ * Writes the downloaded bytes to disk and resolves ONLY when the save has actually
4646
+ * completed.
4647
+ *
4648
+ * The Save picker is opened earlier (at policy-confirm time, while user activation
4649
+ * is still valid — see {@link startExport}); this method only writes to the handle
4650
+ * it produced. That keeps the "success dialog after save" ordering without hitting
4651
+ * the SecurityError that occurs when the picker is opened from this async callback.
4652
+ *
4653
+ * When no handle is provided (File System Access API unavailable, or the picker
4654
+ * errored), we fall back to FileSaver's `saveAs()`, which resolves immediately.
4655
+ * @param {Blob} blob - The file contents
4656
+ * @param {string} filename - The suggested filename (used by the saveAs fallback)
4657
+ * @param {ExportFormat} format - The selected export format (drives MIME type)
4658
+ * @param {FileSystemFileHandle | null} fileHandle - Handle from the Save picker, or null
4659
+ * @return {Promise<{ saved: boolean }>} Resolves with `saved: true` once written.
4660
+ * @memberof RosterExportService
4661
+ */
4662
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
4663
+ async downloadFile(blob, filename, format, fileHandle) {
4664
+ const mimeType = format === ExportFormat.CSV
4665
+ ? 'text/csv'
4666
+ : 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';
4667
+ const typedBlob = new Blob([blob], { type: mimeType });
4668
+ // No handle (API unavailable or picker errored) → standard download.
4669
+ if (!fileHandle) {
4670
+ saveAs(typedBlob, filename);
4671
+ return { saved: true };
4672
+ }
4673
+ // Write to the location the user already chose at confirm time.
4674
+ const writable = await fileHandle.createWritable();
4675
+ await writable.write(typedBlob);
4676
+ await writable.close();
4677
+ return { saved: true };
4678
+ }
4679
+ /**
4680
+ * Cleanup — call from the component's ngOnDestroy.
4681
+ * @memberof RosterExportService
4682
+ */
4683
+ destroy() {
4684
+ this.destroy$.next(true);
4685
+ // This service is providedIn: 'root' (singleton), so its state survives
4686
+ // navigation. Reset the UI-facing flags so a new roster component instance
4687
+ // does not inherit a stale-open popover or a permanently-disabled export
4688
+ // button if the user left the page mid-export or with the popover open.
4689
+ this.isPopoverOpenSubject$.next(false);
4690
+ this.isExportInProgressSubject$.next(false);
4691
+ // Signal current takeUntil subscriptions to unsubscribe, then re-create the
4692
+ // subject. This service is a providedIn: 'root' singleton whose destroy() is
4693
+ // called on every ViewRosterComponent teardown; completing destroy$ would
4694
+ // permanently close it, so later exports could never be torn down. A fresh
4695
+ // subject keeps the teardown channel usable across component lifecycles.
4696
+ this.destroy$.next(true);
4697
+ this.destroy$ = new Subject();
4698
+ }
4699
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RosterExportService, deps: [{ token: i1$1.HttpClient }, { token: i1.MatDialog }, { token: i2.AlertsService }], target: i0.ɵɵFactoryTarget.Injectable }); }
4700
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RosterExportService, providedIn: 'root' }); }
4701
+ }
4702
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RosterExportService, decorators: [{
4703
+ type: Injectable,
4704
+ args: [{
4705
+ providedIn: 'root',
4706
+ }]
4707
+ }], ctorParameters: function () { return [{ type: i1$1.HttpClient }, { type: i1.MatDialog }, { type: i2.AlertsService }]; } });
4708
+
4250
4709
  /**
4251
4710
  * 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.
4252
4711
  * @export
@@ -4264,12 +4723,15 @@ class ViewRosterComponent {
4264
4723
  // eslint-disable-next-line no-unused-vars
4265
4724
  cdr,
4266
4725
  // eslint-disable-next-line no-unused-vars
4267
- globalErrorHandlerService) {
4726
+ globalErrorHandlerService,
4727
+ // eslint-disable-next-line no-unused-vars
4728
+ rosterExportService) {
4268
4729
  this.dialog = dialog;
4269
4730
  this.groupService = groupService;
4270
4731
  this.alertService = alertService;
4271
4732
  this.cdr = cdr;
4272
4733
  this.globalErrorHandlerService = globalErrorHandlerService;
4734
+ this.rosterExportService = rosterExportService;
4273
4735
  this.destroy$ = new Subject();
4274
4736
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
4275
4737
  this.constants = screenTexts;
@@ -4303,6 +4765,7 @@ class ViewRosterComponent {
4303
4765
  }
4304
4766
  ngOnInit() {
4305
4767
  this.userInfo = this.groupService?.getUserInfo();
4768
+ this.rosterExportService.setApiBaseUrl(this.groupService?.apiBaseUrl);
4306
4769
  const groupType = this.groupService.getBusinessRuleOfSelectedGroup();
4307
4770
  this.hasClassification = groupType?.hasClassification ?? false;
4308
4771
  this.groupRosterType = groupType?.rosterType;
@@ -4958,21 +5421,53 @@ class ViewRosterComponent {
4958
5421
  isCloseNeeded: true,
4959
5422
  });
4960
5423
  }
5424
+ /**
5425
+ * Toggles the export format popover — delegates to RosterExportService.
5426
+ * @memberof ViewRosterComponent
5427
+ */
5428
+ onExportClick() {
5429
+ this.rosterExportService.togglePopover();
5430
+ }
5431
+ /**
5432
+ * Handles export format selection — delegates to RosterExportService using the
5433
+ * currently selected group's id and name.
5434
+ * @param {ExportFormat} format
5435
+ * @memberof ViewRosterComponent
5436
+ */
5437
+ onExportFormatSelected(format) {
5438
+ const selectedGroupInfo = this.groupService?.getSelectedGroupInfo();
5439
+ const groupId = selectedGroupInfo?.groupId;
5440
+ // Without a group id the export URL would be malformed, so guard here
5441
+ // instead of firing a bad request.
5442
+ if (!groupId) {
5443
+ this.showAlertMessage(this.constants?.errors?.default, AlertType.ERROR);
5444
+ return;
5445
+ }
5446
+ const groupName = selectedGroupInfo?.groupName ?? '';
5447
+ this.rosterExportService.onFormatSelected(format, groupId, groupName);
5448
+ }
4961
5449
  /**
4962
5450
  * NgOnDestroy performs necessary cleanup tasks, such as unsubscribing from subscription when the component is being destroyed.
4963
5451
  * @memberof ViewRosterComponent
4964
5452
  */
4965
5453
  ngOnDestroy() {
5454
+ this.rosterExportService.destroy();
4966
5455
  this.destroy$.next(true);
4967
5456
  this.destroy$.unsubscribe();
4968
5457
  }
4969
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ViewRosterComponent, deps: [{ token: i1.MatDialog }, { token: GroupsService }, { token: i2.AlertsService }, { token: i0.ChangeDetectorRef }, { token: i2.GlobalErrorHandlerService }], target: i0.ɵɵFactoryTarget.Component }); }
4970
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: ViewRosterComponent, isStandalone: true, selector: "ieeesa-view-roster", ngImport: i0, template: "<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)=\"onAddNewUser()\"\r\n></ieeesa-data-table>\r\n", styles: [".ieeesa-subtitle{text-align:left;font-family:Calibri Regular;font-size:1.5625rem;letter-spacing:0;color:#000;opacity:1}.ieeesa-body{text-align:left;font-family:Calibri Regular;font-size:1.25rem;letter-spacing:0;color:#000;opacity:1}.ieeesa-display-lg-57{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:3.5625rem;line-height:64px;color:#000;letter-spacing:0}.ieeesa-display-md-45{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2.813rem;line-height:52px;color:#000;letter-spacing:0}.ieeesa-display-md-47{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2.9375rem;line-height:52px;color:#000;letter-spacing:0}.ieeesa-display-sm-38{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2.375rem;line-height:44px;color:#000;letter-spacing:0}.ieeesa-headline-lg-32{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2rem;line-height:40px;color:#000;letter-spacing:0}.ieeesa-headline-lg-34{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2.125rem;line-height:40px;color:#000;letter-spacing:0}.ieeesa-headline-md-30{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.875rem;line-height:36px;color:#000;letter-spacing:0}.ieeesa-headline-sm-24{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.5rem;line-height:32px;color:#00629b;letter-spacing:0}.ieeesa-headline-sm-26{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.625rem;line-height:32px;color:#000;letter-spacing:0}.ieeesa-title-lg-bold-24{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1.5rem;line-height:28px;color:#000;letter-spacing:0}.ieeesa-title-lg-24{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.5rem;line-height:28px;color:#000;letter-spacing:0}.ieeesa-title-md-18{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.125rem;line-height:24px;color:#000;letter-spacing:.009375em}.ieeesa-title-sm-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:20px;color:#000;letter-spacing:.00625em}.ieeesa-title-sm-16{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1rem;line-height:20px;color:#000;letter-spacing:.00625em}.ieeesa-label-lg-bold-16{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1rem;line-height:20px;color:#000;letter-spacing:.00625em}.ieeesa-label-lg-16{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1rem;line-height:20px;color:#000;letter-spacing:.00625em}.ieeesa-btn-label-lg-bold-16{font-family:Calibri Regular;font-style:normal;font-weight:700;font-size:1rem;line-height:20px;color:#00629b;letter-spacing:.00625em}.ieeesa-label-md-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:16px;color:#000;letter-spacing:.03125em}.ieeesa-label-sm-13{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.8125rem;line-height:16px;color:#000;letter-spacing:.03125em}.ieeesa-body-lg-bold-16{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1rem;line-height:24px;color:#000;letter-spacing:.03125em}.ieeesa-body-lg-bold-18{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1.125rem;line-height:24px;color:#000;letter-spacing:.03125em}.ieeesa-body-lg-18{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.125rem;line-height:24px;color:#000;letter-spacing:.03125em}.ieeesa-body-md-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:20px;color:#1c1b1f;letter-spacing:.015625em}.ieeesa-body-md-16{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1rem;line-height:20px;color:#000;letter-spacing:.015625em}.ieeesa-body-sm-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:16px;color:#000;letter-spacing:.025em}.ieeesa-body-sm-12{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.75rem;line-height:16px;color:#000;letter-spacing:.025em}.ieeesa-body-color-sm-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:18px;color:#49454f;letter-spacing:.025em}.ieeesa-body-sm-bold-14{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:.875rem;line-height:16px;color:#000;letter-spacing:.025em}.ieeesa-title-inter-lg-bold-24{font-family:Inter Bold;font-style:normal;font-weight:700;font-size:1.5rem;line-height:29px;color:#000;letter-spacing:0}.mat-mdc-button.mat-mdc-button-base.mat-primary-button,.mat-mdc-button.mat-mdc-button-base.mat-secondary-button,.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button,.mat-mdc-button.mat-mdc-button-base.mat-text-button{min-width:103px;width:auto;min-height:40px;height:auto;border-radius:3px;text-align:center;padding:.625em 1.5em;border:none;font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1rem;line-height:20px;color:#000;letter-spacing:.00625em}.mat-mdc-button.mat-mdc-button-base>.mat-icon{margin-right:11px}.mat-mdc-button.mat-mdc-button-base.mat-primary-button{background-color:#00629b;color:#fff}.mat-mdc-button.mat-mdc-button-base.mat-primary-button:focus{background:#1f75a7}.mat-mdc-button.mat-mdc-button-base.mat-primary-button:hover{background-color:#003e65}.mat-mdc-button.mat-mdc-button-base.mat-primary-button:active{background-color:#00629b}.mat-mdc-button.mat-mdc-button-base.mat-primary-button:disabled{background-color:#1c1b1f1f}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button{color:#fff;background:#a7a8aa;box-shadow:0 1px 2px #0000004d,0 2px 6px 2px #00000026}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button:hover{background:#a7a8aa}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button:focus{background:#f0f5f9}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button:active{background:#1d192b1f}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button:disabled{background:#1c1b1f1f;color:#1c1b1f;opacity:.38}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button{background-color:#fff;border:1px solid #00629b;color:#00629b}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button:hover{background-color:#6750a414}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button:focus{background-color:#f0f5f9}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button:active{background:#6750a41f}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button:disabled{border:1px solid rgba(28,27,31,.12);color:#1c1b1f;opacity:.38}.mat-mdc-button.mat-mdc-button-base.mat-text-button{color:#00629b}.mat-mdc-button.mat-mdc-button-base.mat-text-button:hover,.mat-mdc-button.mat-mdc-button-base.mat-text-button:active{background:#6750a414}.mat-mdc-button.mat-mdc-button-base.mat-text-button:disabled{color:#1c1b1f;opacity:.38}.ieeesa-text-button{color:#cac4d0;background:none;border:none}.ieeesa-view-more-or-less-button{border:none;background:none;text-decoration:underline;color:#00629b}.flex-align-center{display:flex;align-items:center;justify-content:center}.mat-button-toggle-checked{background-color:#a7a8aa}.mat-button-toggle-checked .mat-button-toggle-label-content:before{font-family:\"Font Awesome 5 Free\";font-weight:900;content:\"\\f00c\";padding-right:.5625em}.mat-button-toggle-group .mat-button-toggle-label-content{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1rem;line-height:20px;color:#1c1b1f;letter-spacing:.00625em}.no-bg-color-btn{color:#00629b;border-radius:3px;border:1px solid #00629b;min-height:40px;height:auto}@media (max-width: 768px){.mat-button-toggle-group .mat-button-toggle-label-content{max-width:8ch;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;position:relative}}.cdk-overlay-pane .mat-mdc-tooltip .mdc-tooltip__surface{color:#525252;padding:6px 12px;font-family:Calibri Regular;font-size:1rem;border:1px solid #cac4d0;background:#fff;box-shadow:0 4px 8px #00000040;max-width:unset!important}.cdk-overlay-pane .mat-mdc-option .mdc-list-item__primary-text{font-family:Calibri Regular!important}.cdk-overlay-pane.ieeesa-modal-confirm-dialog,.cdk-overlay-pane.ieeesa-modal-dialog,.cdk-overlay-pane.ieeesa-alert-dialog{width:100%;min-width:312px}.mat-mdc-form-field{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1rem;line-height:24px;color:#49454f;letter-spacing:.03125em}.ieeesa-cancel-modal-confirm-dialog{width:25vw!important}.ieeesa-cancel-modal-confirm-dialog .ieeesa-confirmation{padding:1.5em 1.5em 1em}.ieeesa-cancel-modal-confirm-dialog .ieeesa-confirmation .mat-mdc-dialog-content{text-align:center;padding:0 0 1em!important}.mat-mdc-button,.mat-mdc-outlined-button{--mat-mdc-button-persistent-ripple-color: unset}@media (max-width: 768px){.ieeesa-cancel-modal-confirm-dialog{width:90vw!important}}.ieeesa-wrapper-border{border:1px solid #b2b7be;border-top:none;padding:1.5em;border-radius:0 0 4px 4px}.ieeesa-modal-dialog.ieeesa-view-roster{max-width:90vw!important}.ieeesa-modal-dialog.ieeesa-view-roster .ieeesa-modal{box-shadow:0 3px #11b7e5 inset,0 4px 24px #00000080;padding-bottom:3em}.ieeesa-modal-dialog.ieeesa-view-roster .ieeesa-modal .mat-mdc-dialog-content{padding:0;min-height:405px}.ieeesa-modal-dialog.ieeesa-view-roster .ieeesa-data-table__content{height:500px}.ieeesa-modal-dialog.ieeesa-view-roster .ieeesa-data-table__no-table-data{height:auto}.ieeesa-modal-dialog.ieeesa-view-roster .ieeesa-data-table__filter{padding-bottom:1em}.ieeesa-modal-dialog.ieeesa-view-roster .ieeesa-data-table .ieeesa-filter{--mdc-checkbox-state-layer-size: 2.5em}.ieeesa-modal-dialog.ieeesa-view-roster .ieeesa-data-table .ieeesa-filter .ieeesa-chip .mat-mdc-chip{background-color:#fffbfe!important}.ieeesa-modal-dialog.ieeesa-view-roster .ieeesa-data-table .cdk-column-select{width:7%}.ieeesa-modal-dialog.ieeesa-view-roster .ieeesa-data-table .ieeesa-system-users-roster .cdk-column-name{width:11.25em;max-width:11.25em}.ieeesa-modal-dialog.ieeesa-view-roster .ieeesa-data-table .ieeesa-system-users-roster .cdk-column-email{width:15em;max-width:15em}.ieeesa-modal-dialog.ieeesa-view-roster .ieeesa-data-table .ieeesa-individual-roster .cdk-column-name{width:11em;max-width:11em}.ieeesa-modal-dialog.ieeesa-view-roster .ieeesa-data-table .ieeesa-individual-roster .cdk-column-email{width:13em;max-width:13em}.ieeesa-modal-dialog.ieeesa-view-roster .ieeesa-data-table .ieeesa-individual-roster .cdk-column-memberType,.ieeesa-modal-dialog.ieeesa-view-roster .ieeesa-data-table .ieeesa-individual-roster .cdk-column-role,.ieeesa-modal-dialog.ieeesa-view-roster .ieeesa-data-table .ieeesa-individual-roster .cdk-column-employer{width:8.25em;max-width:8.25em}.ieeesa-modal-dialog.ieeesa-view-roster .ieeesa-data-table .ieeesa-individual-roster .cdk-column-org_name,.ieeesa-modal-dialog.ieeesa-view-roster .ieeesa-data-table .ieeesa-individual-roster .cdk-column{width:10em;max-width:10em}.ieeesa-modal-dialog.ieeesa-view-roster .ieeesa-data-table .ieeesa-individual-roster .cdk-column-classification{width:15em;max-width:15em}@media (max-width: 576px){.ieeesa-modal-dialog.ieeesa-view-roster{max-width:95vw!important}.ieeesa-modal-dialog.ieeesa-view-roster .ieeesa-data-table{padding-right:0!important}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: DataTableComponent, selector: "ieeesa-data-table", inputs: ["tableDataInfo", "nestedTableDataInfo", "columnSchemaInfo", "nestedTableColumnSchemaInfo", "tableActions", "hasNestedTable", "tableColumnActions", "tableColumnActionMenuSize", "tableRowActions", "nestedTableRowActions", "caption", "viewAll", "paginatorConfig", "nestedPaginatorConfig", "legends", "pageIndex", "pageSize", "searchPlaceHolderText", "rowEditButton", "rowDeleteButton", "tableEditButton", "tableDeleteButton", "rowExpandButton", "rowCollapseButton", "isNestedTableHeaderNeeded", "addButton", "defaultColumnSortDirection", "defaultSortedColumn", "isClearSortNeeded", "filters", "selectedFilterOptions", "appliedFilterOptions", "searchType", "className", "searchSupportMessage", "inbuiltSortingNeeded", "isCellTextOverflowEllipsis", "isTableHeaderNeeded", "tableColumnsHeaderText", "verticalColumnHeaderNumber", "scrollbarSupportMessage", "isScrollSupportMessageNeeded", "isStickyHeaderNeeded", "customStickyHeaderNeeded", "headerElementClassName", "minCharToSearch", "searchResultMessage", "rowMenuActionIcon", "canDisableCheckbox", "isEllipsisRequiredForLink"], outputs: ["rowSelected", "selectedRowToEdit", "selectedRowToDelete", "selectedRowsToDelete", "rowLink", "addRow", "columnDataOnRowLinkClick", "menuActionClick", "selectActionMenu", "paginationChange", "selectedFilter", "removeFilteredOption", "filteredOptions", "searchedValue", "sortChange", "selectedRowsInfo", "rowExpansionClick", "tableColumnMenuActionClick", "tableColumnMenuToggleButton", "rowSlideToggle"] }, { kind: "ngmodule", type: MatDialogModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
5458
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ViewRosterComponent, deps: [{ token: i1.MatDialog }, { token: GroupsService }, { token: i2.AlertsService }, { token: i0.ChangeDetectorRef }, { token: i2.GlobalErrorHandlerService }, { token: RosterExportService }], target: i0.ɵɵFactoryTarget.Component }); }
5459
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: ViewRosterComponent, isStandalone: true, selector: "ieeesa-view-roster", ngImport: i0, template: "<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)=\"onAddNewUser()\"\r\n>\r\n <!-- Export Roster Button + Popover \u2014 projected into the data-table action row,\r\n inline after the delete icon. -->\r\n <div dataTableActions class=\"ieeesa-view-roster__export-wrapper\">\r\n <button\r\n mat-button\r\n class=\"mat-tertiary-button ieeesa-view-roster__export-btn\"\r\n type=\"button\"\r\n [attr.aria-label]=\"constants?.rosterExport?.ariaLabel\"\r\n [disabled]=\"rosterExportService.isExportInProgress$ | async\"\r\n (click)=\"onExportClick()\"\r\n >\r\n <svg class=\"ieeesa-view-roster__export-btn-icon\" aria-hidden=\"true\">\r\n <use xlink:href=\"assets/images/sprites/sprites.svg#icon-export\"></use>\r\n </svg>\r\n {{ constants?.rosterExport?.buttonLabel }}\r\n </button>\r\n\r\n <ieeesa-export-format-popover\r\n [formatOptions]=\"rosterExportService.exportFormatOptions\"\r\n [isOpen]=\"(rosterExportService.isPopoverOpen$ | async) ?? false\"\r\n [popoverTitle]=\"rosterExportService.popoverTitle\"\r\n [formatSubtitles]=\"rosterExportService.exportFormatSubtitles\"\r\n (formatSelected)=\"onExportFormatSelected($event)\"\r\n (closed)=\"rosterExportService.closePopover()\"\r\n ></ieeesa-export-format-popover>\r\n </div>\r\n</ieeesa-data-table>\r\n", styles: [".ieeesa-subtitle{text-align:left;font-family:Calibri Regular;font-size:1.5625rem;letter-spacing:0;color:#000;opacity:1}.ieeesa-body{text-align:left;font-family:Calibri Regular;font-size:1.25rem;letter-spacing:0;color:#000;opacity:1}.ieeesa-display-lg-57{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:3.5625rem;line-height:64px;color:#000;letter-spacing:0}.ieeesa-display-md-45{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2.813rem;line-height:52px;color:#000;letter-spacing:0}.ieeesa-display-md-47{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2.9375rem;line-height:52px;color:#000;letter-spacing:0}.ieeesa-display-sm-38{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2.375rem;line-height:44px;color:#000;letter-spacing:0}.ieeesa-headline-lg-32{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2rem;line-height:40px;color:#000;letter-spacing:0}.ieeesa-headline-lg-34{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2.125rem;line-height:40px;color:#000;letter-spacing:0}.ieeesa-headline-md-30{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.875rem;line-height:36px;color:#000;letter-spacing:0}.ieeesa-headline-sm-24{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.5rem;line-height:32px;color:#00629b;letter-spacing:0}.ieeesa-headline-sm-26{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.625rem;line-height:32px;color:#000;letter-spacing:0}.ieeesa-title-lg-bold-24{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1.5rem;line-height:28px;color:#000;letter-spacing:0}.ieeesa-title-lg-24{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.5rem;line-height:28px;color:#000;letter-spacing:0}.ieeesa-title-md-18{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.125rem;line-height:24px;color:#000;letter-spacing:.009375em}.ieeesa-title-sm-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:20px;color:#000;letter-spacing:.00625em}.ieeesa-title-sm-16{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1rem;line-height:20px;color:#000;letter-spacing:.00625em}.ieeesa-label-lg-bold-16{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1rem;line-height:20px;color:#000;letter-spacing:.00625em}.ieeesa-label-lg-16{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1rem;line-height:20px;color:#000;letter-spacing:.00625em}.ieeesa-btn-label-lg-bold-16{font-family:Calibri Regular;font-style:normal;font-weight:700;font-size:1rem;line-height:20px;color:#00629b;letter-spacing:.00625em}.ieeesa-label-md-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:16px;color:#000;letter-spacing:.03125em}.ieeesa-label-sm-13{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.8125rem;line-height:16px;color:#000;letter-spacing:.03125em}.ieeesa-body-lg-bold-16{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1rem;line-height:24px;color:#000;letter-spacing:.03125em}.ieeesa-body-lg-bold-18{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1.125rem;line-height:24px;color:#000;letter-spacing:.03125em}.ieeesa-body-lg-18{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.125rem;line-height:24px;color:#000;letter-spacing:.03125em}.ieeesa-body-md-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:20px;color:#1c1b1f;letter-spacing:.015625em}.ieeesa-body-md-16{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1rem;line-height:20px;color:#000;letter-spacing:.015625em}.ieeesa-body-sm-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:16px;color:#000;letter-spacing:.025em}.ieeesa-body-sm-12{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.75rem;line-height:16px;color:#000;letter-spacing:.025em}.ieeesa-body-color-sm-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:18px;color:#49454f;letter-spacing:.025em}.ieeesa-body-sm-bold-14{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:.875rem;line-height:16px;color:#000;letter-spacing:.025em}.ieeesa-title-inter-lg-bold-24{font-family:Inter Bold;font-style:normal;font-weight:700;font-size:1.5rem;line-height:29px;color:#000;letter-spacing:0}.mat-mdc-button.mat-mdc-button-base.mat-primary-button,.mat-mdc-button.mat-mdc-button-base.mat-secondary-button,.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button,.mat-mdc-button.mat-mdc-button-base.mat-text-button{min-width:103px;width:auto;min-height:40px;height:auto;border-radius:3px;text-align:center;padding:.625em 1.5em;border:none;font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1rem;line-height:20px;color:#000;letter-spacing:.00625em}.mat-mdc-button.mat-mdc-button-base>.mat-icon{margin-right:11px}.mat-mdc-button.mat-mdc-button-base.mat-primary-button{background-color:#00629b;color:#fff}.mat-mdc-button.mat-mdc-button-base.mat-primary-button:focus{background:#1f75a7}.mat-mdc-button.mat-mdc-button-base.mat-primary-button:hover{background-color:#003e65}.mat-mdc-button.mat-mdc-button-base.mat-primary-button:active{background-color:#00629b}.mat-mdc-button.mat-mdc-button-base.mat-primary-button:disabled{background-color:#1c1b1f1f}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button{color:#fff;background:#a7a8aa;box-shadow:0 1px 2px #0000004d,0 2px 6px 2px #00000026}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button:hover{background:#a7a8aa}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button:focus{background:#f0f5f9}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button:active{background:#1d192b1f}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button:disabled{background:#1c1b1f1f;color:#1c1b1f;opacity:.38}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button{background-color:#fff;border:1px solid #00629b;color:#00629b}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button:hover{background-color:#6750a414}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button:focus{background-color:#f0f5f9}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button:active{background:#6750a41f}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button:disabled{border:1px solid rgba(28,27,31,.12);color:#1c1b1f;opacity:.38}.mat-mdc-button.mat-mdc-button-base.mat-text-button{color:#00629b}.mat-mdc-button.mat-mdc-button-base.mat-text-button:hover,.mat-mdc-button.mat-mdc-button-base.mat-text-button:active{background:#6750a414}.mat-mdc-button.mat-mdc-button-base.mat-text-button:disabled{color:#1c1b1f;opacity:.38}.ieeesa-text-button{color:#cac4d0;background:none;border:none}.ieeesa-view-more-or-less-button{border:none;background:none;text-decoration:underline;color:#00629b}.flex-align-center{display:flex;align-items:center;justify-content:center}.mat-button-toggle-checked{background-color:#a7a8aa}.mat-button-toggle-checked .mat-button-toggle-label-content:before{font-family:\"Font Awesome 5 Free\";font-weight:900;content:\"\\f00c\";padding-right:.5625em}.mat-button-toggle-group .mat-button-toggle-label-content{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1rem;line-height:20px;color:#1c1b1f;letter-spacing:.00625em}.no-bg-color-btn{color:#00629b;border-radius:3px;border:1px solid #00629b;min-height:40px;height:auto}@media (max-width: 768px){.mat-button-toggle-group .mat-button-toggle-label-content{max-width:8ch;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;position:relative}}.cdk-overlay-pane .mat-mdc-tooltip .mdc-tooltip__surface{color:#525252;padding:6px 12px;font-family:Calibri Regular;font-size:1rem;border:1px solid #cac4d0;background:#fff;box-shadow:0 4px 8px #00000040;max-width:unset!important}.cdk-overlay-pane .mat-mdc-option .mdc-list-item__primary-text{font-family:Calibri Regular!important}.cdk-overlay-pane.ieeesa-modal-confirm-dialog,.cdk-overlay-pane.ieeesa-modal-dialog,.cdk-overlay-pane.ieeesa-alert-dialog{width:100%;min-width:312px}.mat-mdc-form-field{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1rem;line-height:24px;color:#49454f;letter-spacing:.03125em}.ieeesa-cancel-modal-confirm-dialog{width:25vw!important}.ieeesa-cancel-modal-confirm-dialog .ieeesa-confirmation{padding:1.5em 1.5em 1em}.ieeesa-cancel-modal-confirm-dialog .ieeesa-confirmation .mat-mdc-dialog-content{text-align:center;padding:0 0 1em!important}.mat-mdc-button,.mat-mdc-outlined-button{--mat-mdc-button-persistent-ripple-color: unset}@media (max-width: 768px){.ieeesa-cancel-modal-confirm-dialog{width:90vw!important}}.ieeesa-wrapper-border{border:1px solid #b2b7be;border-top:none;padding:1.5em;border-radius:0 0 4px 4px}.ieeesa-modal-dialog.ieeesa-view-roster{max-width:90vw!important}.ieeesa-modal-dialog.ieeesa-view-roster .ieeesa-modal{box-shadow:0 3px #11b7e5 inset,0 4px 24px #00000080;padding-bottom:3em}.ieeesa-modal-dialog.ieeesa-view-roster .ieeesa-modal .mat-mdc-dialog-content{padding:0;min-height:405px}.ieeesa-modal-dialog.ieeesa-view-roster .ieeesa-data-table__content{height:500px}.ieeesa-modal-dialog.ieeesa-view-roster .ieeesa-data-table__no-table-data{height:auto}.ieeesa-modal-dialog.ieeesa-view-roster .ieeesa-data-table__filter{padding-bottom:1em}.ieeesa-modal-dialog.ieeesa-view-roster .ieeesa-data-table .ieeesa-filter{--mdc-checkbox-state-layer-size: 2.5em}.ieeesa-modal-dialog.ieeesa-view-roster .ieeesa-data-table .ieeesa-filter .ieeesa-chip .mat-mdc-chip{background-color:#fffbfe!important}.ieeesa-modal-dialog.ieeesa-view-roster .ieeesa-data-table .cdk-column-select{width:7%}.ieeesa-modal-dialog.ieeesa-view-roster .ieeesa-data-table .ieeesa-system-users-roster .cdk-column-name{width:11.25em;max-width:11.25em}.ieeesa-modal-dialog.ieeesa-view-roster .ieeesa-data-table .ieeesa-system-users-roster .cdk-column-email{width:15em;max-width:15em}.ieeesa-modal-dialog.ieeesa-view-roster .ieeesa-data-table .ieeesa-individual-roster .cdk-column-name{width:11em;max-width:11em}.ieeesa-modal-dialog.ieeesa-view-roster .ieeesa-data-table .ieeesa-individual-roster .cdk-column-email{width:13em;max-width:13em}.ieeesa-modal-dialog.ieeesa-view-roster .ieeesa-data-table .ieeesa-individual-roster .cdk-column-memberType,.ieeesa-modal-dialog.ieeesa-view-roster .ieeesa-data-table .ieeesa-individual-roster .cdk-column-role,.ieeesa-modal-dialog.ieeesa-view-roster .ieeesa-data-table .ieeesa-individual-roster .cdk-column-employer{width:8.25em;max-width:8.25em}.ieeesa-modal-dialog.ieeesa-view-roster .ieeesa-data-table .ieeesa-individual-roster .cdk-column-org_name,.ieeesa-modal-dialog.ieeesa-view-roster .ieeesa-data-table .ieeesa-individual-roster .cdk-column{width:10em;max-width:10em}.ieeesa-modal-dialog.ieeesa-view-roster .ieeesa-data-table .ieeesa-individual-roster .cdk-column-classification{width:15em;max-width:15em}@media (max-width: 576px){.ieeesa-modal-dialog.ieeesa-view-roster{max-width:95vw!important}.ieeesa-modal-dialog.ieeesa-view-roster .ieeesa-data-table{padding-right:0!important}}.ieeesa-view-roster__export-wrapper{position:relative}.ieeesa-view-roster__export-btn.mat-mdc-button.mat-mdc-button-base{display:inline-flex;flex-direction:row;align-items:center;gap:6px;font-size:13px;white-space:nowrap}.ieeesa-view-roster__export-btn-icon{width:16px;height:16px;flex-shrink:0}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "component", type: DataTableComponent, selector: "ieeesa-data-table", inputs: ["tableDataInfo", "nestedTableDataInfo", "columnSchemaInfo", "nestedTableColumnSchemaInfo", "tableActions", "hasNestedTable", "tableColumnActions", "tableColumnActionMenuSize", "tableRowActions", "nestedTableRowActions", "caption", "viewAll", "paginatorConfig", "nestedPaginatorConfig", "legends", "pageIndex", "pageSize", "searchPlaceHolderText", "rowEditButton", "rowDeleteButton", "tableEditButton", "tableDeleteButton", "rowExpandButton", "rowCollapseButton", "isNestedTableHeaderNeeded", "addButton", "defaultColumnSortDirection", "defaultSortedColumn", "isClearSortNeeded", "filters", "selectedFilterOptions", "appliedFilterOptions", "searchType", "className", "searchSupportMessage", "inbuiltSortingNeeded", "isCellTextOverflowEllipsis", "isTableHeaderNeeded", "tableColumnsHeaderText", "verticalColumnHeaderNumber", "scrollbarSupportMessage", "isScrollSupportMessageNeeded", "isStickyHeaderNeeded", "customStickyHeaderNeeded", "headerElementClassName", "minCharToSearch", "searchResultMessage", "rowMenuActionIcon", "canDisableCheckbox", "isEllipsisRequiredForLink"], outputs: ["rowSelected", "selectedRowToEdit", "selectedRowToDelete", "selectedRowsToDelete", "rowLink", "addRow", "columnDataOnRowLinkClick", "menuActionClick", "selectActionMenu", "paginationChange", "selectedFilter", "removeFilteredOption", "filteredOptions", "searchedValue", "sortChange", "selectedRowsInfo", "rowExpansionClick", "tableColumnMenuActionClick", "tableColumnMenuToggleButton", "rowSlideToggle"] }, { kind: "ngmodule", type: MatDialogModule }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i4.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: ExportFormatPopoverComponent, selector: "ieeesa-export-format-popover", inputs: ["formatOptions", "origin", "isOpen", "popoverTitle", "formatSubtitles"], outputs: ["formatSelected", "closed"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
4971
5460
  }
4972
5461
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ViewRosterComponent, decorators: [{
4973
5462
  type: Component,
4974
- args: [{ selector: 'ieeesa-view-roster', standalone: true, imports: [CommonModule, DataTableComponent, MatDialogModule], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<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)=\"onAddNewUser()\"\r\n></ieeesa-data-table>\r\n", styles: [".ieeesa-subtitle{text-align:left;font-family:Calibri Regular;font-size:1.5625rem;letter-spacing:0;color:#000;opacity:1}.ieeesa-body{text-align:left;font-family:Calibri Regular;font-size:1.25rem;letter-spacing:0;color:#000;opacity:1}.ieeesa-display-lg-57{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:3.5625rem;line-height:64px;color:#000;letter-spacing:0}.ieeesa-display-md-45{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2.813rem;line-height:52px;color:#000;letter-spacing:0}.ieeesa-display-md-47{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2.9375rem;line-height:52px;color:#000;letter-spacing:0}.ieeesa-display-sm-38{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2.375rem;line-height:44px;color:#000;letter-spacing:0}.ieeesa-headline-lg-32{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2rem;line-height:40px;color:#000;letter-spacing:0}.ieeesa-headline-lg-34{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2.125rem;line-height:40px;color:#000;letter-spacing:0}.ieeesa-headline-md-30{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.875rem;line-height:36px;color:#000;letter-spacing:0}.ieeesa-headline-sm-24{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.5rem;line-height:32px;color:#00629b;letter-spacing:0}.ieeesa-headline-sm-26{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.625rem;line-height:32px;color:#000;letter-spacing:0}.ieeesa-title-lg-bold-24{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1.5rem;line-height:28px;color:#000;letter-spacing:0}.ieeesa-title-lg-24{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.5rem;line-height:28px;color:#000;letter-spacing:0}.ieeesa-title-md-18{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.125rem;line-height:24px;color:#000;letter-spacing:.009375em}.ieeesa-title-sm-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:20px;color:#000;letter-spacing:.00625em}.ieeesa-title-sm-16{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1rem;line-height:20px;color:#000;letter-spacing:.00625em}.ieeesa-label-lg-bold-16{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1rem;line-height:20px;color:#000;letter-spacing:.00625em}.ieeesa-label-lg-16{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1rem;line-height:20px;color:#000;letter-spacing:.00625em}.ieeesa-btn-label-lg-bold-16{font-family:Calibri Regular;font-style:normal;font-weight:700;font-size:1rem;line-height:20px;color:#00629b;letter-spacing:.00625em}.ieeesa-label-md-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:16px;color:#000;letter-spacing:.03125em}.ieeesa-label-sm-13{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.8125rem;line-height:16px;color:#000;letter-spacing:.03125em}.ieeesa-body-lg-bold-16{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1rem;line-height:24px;color:#000;letter-spacing:.03125em}.ieeesa-body-lg-bold-18{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1.125rem;line-height:24px;color:#000;letter-spacing:.03125em}.ieeesa-body-lg-18{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.125rem;line-height:24px;color:#000;letter-spacing:.03125em}.ieeesa-body-md-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:20px;color:#1c1b1f;letter-spacing:.015625em}.ieeesa-body-md-16{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1rem;line-height:20px;color:#000;letter-spacing:.015625em}.ieeesa-body-sm-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:16px;color:#000;letter-spacing:.025em}.ieeesa-body-sm-12{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.75rem;line-height:16px;color:#000;letter-spacing:.025em}.ieeesa-body-color-sm-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:18px;color:#49454f;letter-spacing:.025em}.ieeesa-body-sm-bold-14{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:.875rem;line-height:16px;color:#000;letter-spacing:.025em}.ieeesa-title-inter-lg-bold-24{font-family:Inter Bold;font-style:normal;font-weight:700;font-size:1.5rem;line-height:29px;color:#000;letter-spacing:0}.mat-mdc-button.mat-mdc-button-base.mat-primary-button,.mat-mdc-button.mat-mdc-button-base.mat-secondary-button,.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button,.mat-mdc-button.mat-mdc-button-base.mat-text-button{min-width:103px;width:auto;min-height:40px;height:auto;border-radius:3px;text-align:center;padding:.625em 1.5em;border:none;font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1rem;line-height:20px;color:#000;letter-spacing:.00625em}.mat-mdc-button.mat-mdc-button-base>.mat-icon{margin-right:11px}.mat-mdc-button.mat-mdc-button-base.mat-primary-button{background-color:#00629b;color:#fff}.mat-mdc-button.mat-mdc-button-base.mat-primary-button:focus{background:#1f75a7}.mat-mdc-button.mat-mdc-button-base.mat-primary-button:hover{background-color:#003e65}.mat-mdc-button.mat-mdc-button-base.mat-primary-button:active{background-color:#00629b}.mat-mdc-button.mat-mdc-button-base.mat-primary-button:disabled{background-color:#1c1b1f1f}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button{color:#fff;background:#a7a8aa;box-shadow:0 1px 2px #0000004d,0 2px 6px 2px #00000026}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button:hover{background:#a7a8aa}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button:focus{background:#f0f5f9}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button:active{background:#1d192b1f}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button:disabled{background:#1c1b1f1f;color:#1c1b1f;opacity:.38}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button{background-color:#fff;border:1px solid #00629b;color:#00629b}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button:hover{background-color:#6750a414}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button:focus{background-color:#f0f5f9}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button:active{background:#6750a41f}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button:disabled{border:1px solid rgba(28,27,31,.12);color:#1c1b1f;opacity:.38}.mat-mdc-button.mat-mdc-button-base.mat-text-button{color:#00629b}.mat-mdc-button.mat-mdc-button-base.mat-text-button:hover,.mat-mdc-button.mat-mdc-button-base.mat-text-button:active{background:#6750a414}.mat-mdc-button.mat-mdc-button-base.mat-text-button:disabled{color:#1c1b1f;opacity:.38}.ieeesa-text-button{color:#cac4d0;background:none;border:none}.ieeesa-view-more-or-less-button{border:none;background:none;text-decoration:underline;color:#00629b}.flex-align-center{display:flex;align-items:center;justify-content:center}.mat-button-toggle-checked{background-color:#a7a8aa}.mat-button-toggle-checked .mat-button-toggle-label-content:before{font-family:\"Font Awesome 5 Free\";font-weight:900;content:\"\\f00c\";padding-right:.5625em}.mat-button-toggle-group .mat-button-toggle-label-content{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1rem;line-height:20px;color:#1c1b1f;letter-spacing:.00625em}.no-bg-color-btn{color:#00629b;border-radius:3px;border:1px solid #00629b;min-height:40px;height:auto}@media (max-width: 768px){.mat-button-toggle-group .mat-button-toggle-label-content{max-width:8ch;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;position:relative}}.cdk-overlay-pane .mat-mdc-tooltip .mdc-tooltip__surface{color:#525252;padding:6px 12px;font-family:Calibri Regular;font-size:1rem;border:1px solid #cac4d0;background:#fff;box-shadow:0 4px 8px #00000040;max-width:unset!important}.cdk-overlay-pane .mat-mdc-option .mdc-list-item__primary-text{font-family:Calibri Regular!important}.cdk-overlay-pane.ieeesa-modal-confirm-dialog,.cdk-overlay-pane.ieeesa-modal-dialog,.cdk-overlay-pane.ieeesa-alert-dialog{width:100%;min-width:312px}.mat-mdc-form-field{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1rem;line-height:24px;color:#49454f;letter-spacing:.03125em}.ieeesa-cancel-modal-confirm-dialog{width:25vw!important}.ieeesa-cancel-modal-confirm-dialog .ieeesa-confirmation{padding:1.5em 1.5em 1em}.ieeesa-cancel-modal-confirm-dialog .ieeesa-confirmation .mat-mdc-dialog-content{text-align:center;padding:0 0 1em!important}.mat-mdc-button,.mat-mdc-outlined-button{--mat-mdc-button-persistent-ripple-color: unset}@media (max-width: 768px){.ieeesa-cancel-modal-confirm-dialog{width:90vw!important}}.ieeesa-wrapper-border{border:1px solid #b2b7be;border-top:none;padding:1.5em;border-radius:0 0 4px 4px}.ieeesa-modal-dialog.ieeesa-view-roster{max-width:90vw!important}.ieeesa-modal-dialog.ieeesa-view-roster .ieeesa-modal{box-shadow:0 3px #11b7e5 inset,0 4px 24px #00000080;padding-bottom:3em}.ieeesa-modal-dialog.ieeesa-view-roster .ieeesa-modal .mat-mdc-dialog-content{padding:0;min-height:405px}.ieeesa-modal-dialog.ieeesa-view-roster .ieeesa-data-table__content{height:500px}.ieeesa-modal-dialog.ieeesa-view-roster .ieeesa-data-table__no-table-data{height:auto}.ieeesa-modal-dialog.ieeesa-view-roster .ieeesa-data-table__filter{padding-bottom:1em}.ieeesa-modal-dialog.ieeesa-view-roster .ieeesa-data-table .ieeesa-filter{--mdc-checkbox-state-layer-size: 2.5em}.ieeesa-modal-dialog.ieeesa-view-roster .ieeesa-data-table .ieeesa-filter .ieeesa-chip .mat-mdc-chip{background-color:#fffbfe!important}.ieeesa-modal-dialog.ieeesa-view-roster .ieeesa-data-table .cdk-column-select{width:7%}.ieeesa-modal-dialog.ieeesa-view-roster .ieeesa-data-table .ieeesa-system-users-roster .cdk-column-name{width:11.25em;max-width:11.25em}.ieeesa-modal-dialog.ieeesa-view-roster .ieeesa-data-table .ieeesa-system-users-roster .cdk-column-email{width:15em;max-width:15em}.ieeesa-modal-dialog.ieeesa-view-roster .ieeesa-data-table .ieeesa-individual-roster .cdk-column-name{width:11em;max-width:11em}.ieeesa-modal-dialog.ieeesa-view-roster .ieeesa-data-table .ieeesa-individual-roster .cdk-column-email{width:13em;max-width:13em}.ieeesa-modal-dialog.ieeesa-view-roster .ieeesa-data-table .ieeesa-individual-roster .cdk-column-memberType,.ieeesa-modal-dialog.ieeesa-view-roster .ieeesa-data-table .ieeesa-individual-roster .cdk-column-role,.ieeesa-modal-dialog.ieeesa-view-roster .ieeesa-data-table .ieeesa-individual-roster .cdk-column-employer{width:8.25em;max-width:8.25em}.ieeesa-modal-dialog.ieeesa-view-roster .ieeesa-data-table .ieeesa-individual-roster .cdk-column-org_name,.ieeesa-modal-dialog.ieeesa-view-roster .ieeesa-data-table .ieeesa-individual-roster .cdk-column{width:10em;max-width:10em}.ieeesa-modal-dialog.ieeesa-view-roster .ieeesa-data-table .ieeesa-individual-roster .cdk-column-classification{width:15em;max-width:15em}@media (max-width: 576px){.ieeesa-modal-dialog.ieeesa-view-roster{max-width:95vw!important}.ieeesa-modal-dialog.ieeesa-view-roster .ieeesa-data-table{padding-right:0!important}}\n"] }]
4975
- }], ctorParameters: function () { return [{ type: i1.MatDialog }, { type: GroupsService }, { type: i2.AlertsService }, { type: i0.ChangeDetectorRef }, { type: i2.GlobalErrorHandlerService }]; } });
5463
+ args: [{ selector: 'ieeesa-view-roster', standalone: true, imports: [
5464
+ CommonModule,
5465
+ DataTableComponent,
5466
+ MatDialogModule,
5467
+ MatButtonModule,
5468
+ ExportFormatPopoverComponent,
5469
+ ], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<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)=\"onAddNewUser()\"\r\n>\r\n <!-- Export Roster Button + Popover \u2014 projected into the data-table action row,\r\n inline after the delete icon. -->\r\n <div dataTableActions class=\"ieeesa-view-roster__export-wrapper\">\r\n <button\r\n mat-button\r\n class=\"mat-tertiary-button ieeesa-view-roster__export-btn\"\r\n type=\"button\"\r\n [attr.aria-label]=\"constants?.rosterExport?.ariaLabel\"\r\n [disabled]=\"rosterExportService.isExportInProgress$ | async\"\r\n (click)=\"onExportClick()\"\r\n >\r\n <svg class=\"ieeesa-view-roster__export-btn-icon\" aria-hidden=\"true\">\r\n <use xlink:href=\"assets/images/sprites/sprites.svg#icon-export\"></use>\r\n </svg>\r\n {{ constants?.rosterExport?.buttonLabel }}\r\n </button>\r\n\r\n <ieeesa-export-format-popover\r\n [formatOptions]=\"rosterExportService.exportFormatOptions\"\r\n [isOpen]=\"(rosterExportService.isPopoverOpen$ | async) ?? false\"\r\n [popoverTitle]=\"rosterExportService.popoverTitle\"\r\n [formatSubtitles]=\"rosterExportService.exportFormatSubtitles\"\r\n (formatSelected)=\"onExportFormatSelected($event)\"\r\n (closed)=\"rosterExportService.closePopover()\"\r\n ></ieeesa-export-format-popover>\r\n </div>\r\n</ieeesa-data-table>\r\n", styles: [".ieeesa-subtitle{text-align:left;font-family:Calibri Regular;font-size:1.5625rem;letter-spacing:0;color:#000;opacity:1}.ieeesa-body{text-align:left;font-family:Calibri Regular;font-size:1.25rem;letter-spacing:0;color:#000;opacity:1}.ieeesa-display-lg-57{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:3.5625rem;line-height:64px;color:#000;letter-spacing:0}.ieeesa-display-md-45{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2.813rem;line-height:52px;color:#000;letter-spacing:0}.ieeesa-display-md-47{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2.9375rem;line-height:52px;color:#000;letter-spacing:0}.ieeesa-display-sm-38{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2.375rem;line-height:44px;color:#000;letter-spacing:0}.ieeesa-headline-lg-32{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2rem;line-height:40px;color:#000;letter-spacing:0}.ieeesa-headline-lg-34{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2.125rem;line-height:40px;color:#000;letter-spacing:0}.ieeesa-headline-md-30{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.875rem;line-height:36px;color:#000;letter-spacing:0}.ieeesa-headline-sm-24{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.5rem;line-height:32px;color:#00629b;letter-spacing:0}.ieeesa-headline-sm-26{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.625rem;line-height:32px;color:#000;letter-spacing:0}.ieeesa-title-lg-bold-24{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1.5rem;line-height:28px;color:#000;letter-spacing:0}.ieeesa-title-lg-24{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.5rem;line-height:28px;color:#000;letter-spacing:0}.ieeesa-title-md-18{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.125rem;line-height:24px;color:#000;letter-spacing:.009375em}.ieeesa-title-sm-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:20px;color:#000;letter-spacing:.00625em}.ieeesa-title-sm-16{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1rem;line-height:20px;color:#000;letter-spacing:.00625em}.ieeesa-label-lg-bold-16{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1rem;line-height:20px;color:#000;letter-spacing:.00625em}.ieeesa-label-lg-16{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1rem;line-height:20px;color:#000;letter-spacing:.00625em}.ieeesa-btn-label-lg-bold-16{font-family:Calibri Regular;font-style:normal;font-weight:700;font-size:1rem;line-height:20px;color:#00629b;letter-spacing:.00625em}.ieeesa-label-md-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:16px;color:#000;letter-spacing:.03125em}.ieeesa-label-sm-13{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.8125rem;line-height:16px;color:#000;letter-spacing:.03125em}.ieeesa-body-lg-bold-16{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1rem;line-height:24px;color:#000;letter-spacing:.03125em}.ieeesa-body-lg-bold-18{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1.125rem;line-height:24px;color:#000;letter-spacing:.03125em}.ieeesa-body-lg-18{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.125rem;line-height:24px;color:#000;letter-spacing:.03125em}.ieeesa-body-md-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:20px;color:#1c1b1f;letter-spacing:.015625em}.ieeesa-body-md-16{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1rem;line-height:20px;color:#000;letter-spacing:.015625em}.ieeesa-body-sm-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:16px;color:#000;letter-spacing:.025em}.ieeesa-body-sm-12{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.75rem;line-height:16px;color:#000;letter-spacing:.025em}.ieeesa-body-color-sm-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:18px;color:#49454f;letter-spacing:.025em}.ieeesa-body-sm-bold-14{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:.875rem;line-height:16px;color:#000;letter-spacing:.025em}.ieeesa-title-inter-lg-bold-24{font-family:Inter Bold;font-style:normal;font-weight:700;font-size:1.5rem;line-height:29px;color:#000;letter-spacing:0}.mat-mdc-button.mat-mdc-button-base.mat-primary-button,.mat-mdc-button.mat-mdc-button-base.mat-secondary-button,.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button,.mat-mdc-button.mat-mdc-button-base.mat-text-button{min-width:103px;width:auto;min-height:40px;height:auto;border-radius:3px;text-align:center;padding:.625em 1.5em;border:none;font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1rem;line-height:20px;color:#000;letter-spacing:.00625em}.mat-mdc-button.mat-mdc-button-base>.mat-icon{margin-right:11px}.mat-mdc-button.mat-mdc-button-base.mat-primary-button{background-color:#00629b;color:#fff}.mat-mdc-button.mat-mdc-button-base.mat-primary-button:focus{background:#1f75a7}.mat-mdc-button.mat-mdc-button-base.mat-primary-button:hover{background-color:#003e65}.mat-mdc-button.mat-mdc-button-base.mat-primary-button:active{background-color:#00629b}.mat-mdc-button.mat-mdc-button-base.mat-primary-button:disabled{background-color:#1c1b1f1f}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button{color:#fff;background:#a7a8aa;box-shadow:0 1px 2px #0000004d,0 2px 6px 2px #00000026}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button:hover{background:#a7a8aa}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button:focus{background:#f0f5f9}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button:active{background:#1d192b1f}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button:disabled{background:#1c1b1f1f;color:#1c1b1f;opacity:.38}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button{background-color:#fff;border:1px solid #00629b;color:#00629b}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button:hover{background-color:#6750a414}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button:focus{background-color:#f0f5f9}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button:active{background:#6750a41f}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button:disabled{border:1px solid rgba(28,27,31,.12);color:#1c1b1f;opacity:.38}.mat-mdc-button.mat-mdc-button-base.mat-text-button{color:#00629b}.mat-mdc-button.mat-mdc-button-base.mat-text-button:hover,.mat-mdc-button.mat-mdc-button-base.mat-text-button:active{background:#6750a414}.mat-mdc-button.mat-mdc-button-base.mat-text-button:disabled{color:#1c1b1f;opacity:.38}.ieeesa-text-button{color:#cac4d0;background:none;border:none}.ieeesa-view-more-or-less-button{border:none;background:none;text-decoration:underline;color:#00629b}.flex-align-center{display:flex;align-items:center;justify-content:center}.mat-button-toggle-checked{background-color:#a7a8aa}.mat-button-toggle-checked .mat-button-toggle-label-content:before{font-family:\"Font Awesome 5 Free\";font-weight:900;content:\"\\f00c\";padding-right:.5625em}.mat-button-toggle-group .mat-button-toggle-label-content{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1rem;line-height:20px;color:#1c1b1f;letter-spacing:.00625em}.no-bg-color-btn{color:#00629b;border-radius:3px;border:1px solid #00629b;min-height:40px;height:auto}@media (max-width: 768px){.mat-button-toggle-group .mat-button-toggle-label-content{max-width:8ch;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;position:relative}}.cdk-overlay-pane .mat-mdc-tooltip .mdc-tooltip__surface{color:#525252;padding:6px 12px;font-family:Calibri Regular;font-size:1rem;border:1px solid #cac4d0;background:#fff;box-shadow:0 4px 8px #00000040;max-width:unset!important}.cdk-overlay-pane .mat-mdc-option .mdc-list-item__primary-text{font-family:Calibri Regular!important}.cdk-overlay-pane.ieeesa-modal-confirm-dialog,.cdk-overlay-pane.ieeesa-modal-dialog,.cdk-overlay-pane.ieeesa-alert-dialog{width:100%;min-width:312px}.mat-mdc-form-field{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1rem;line-height:24px;color:#49454f;letter-spacing:.03125em}.ieeesa-cancel-modal-confirm-dialog{width:25vw!important}.ieeesa-cancel-modal-confirm-dialog .ieeesa-confirmation{padding:1.5em 1.5em 1em}.ieeesa-cancel-modal-confirm-dialog .ieeesa-confirmation .mat-mdc-dialog-content{text-align:center;padding:0 0 1em!important}.mat-mdc-button,.mat-mdc-outlined-button{--mat-mdc-button-persistent-ripple-color: unset}@media (max-width: 768px){.ieeesa-cancel-modal-confirm-dialog{width:90vw!important}}.ieeesa-wrapper-border{border:1px solid #b2b7be;border-top:none;padding:1.5em;border-radius:0 0 4px 4px}.ieeesa-modal-dialog.ieeesa-view-roster{max-width:90vw!important}.ieeesa-modal-dialog.ieeesa-view-roster .ieeesa-modal{box-shadow:0 3px #11b7e5 inset,0 4px 24px #00000080;padding-bottom:3em}.ieeesa-modal-dialog.ieeesa-view-roster .ieeesa-modal .mat-mdc-dialog-content{padding:0;min-height:405px}.ieeesa-modal-dialog.ieeesa-view-roster .ieeesa-data-table__content{height:500px}.ieeesa-modal-dialog.ieeesa-view-roster .ieeesa-data-table__no-table-data{height:auto}.ieeesa-modal-dialog.ieeesa-view-roster .ieeesa-data-table__filter{padding-bottom:1em}.ieeesa-modal-dialog.ieeesa-view-roster .ieeesa-data-table .ieeesa-filter{--mdc-checkbox-state-layer-size: 2.5em}.ieeesa-modal-dialog.ieeesa-view-roster .ieeesa-data-table .ieeesa-filter .ieeesa-chip .mat-mdc-chip{background-color:#fffbfe!important}.ieeesa-modal-dialog.ieeesa-view-roster .ieeesa-data-table .cdk-column-select{width:7%}.ieeesa-modal-dialog.ieeesa-view-roster .ieeesa-data-table .ieeesa-system-users-roster .cdk-column-name{width:11.25em;max-width:11.25em}.ieeesa-modal-dialog.ieeesa-view-roster .ieeesa-data-table .ieeesa-system-users-roster .cdk-column-email{width:15em;max-width:15em}.ieeesa-modal-dialog.ieeesa-view-roster .ieeesa-data-table .ieeesa-individual-roster .cdk-column-name{width:11em;max-width:11em}.ieeesa-modal-dialog.ieeesa-view-roster .ieeesa-data-table .ieeesa-individual-roster .cdk-column-email{width:13em;max-width:13em}.ieeesa-modal-dialog.ieeesa-view-roster .ieeesa-data-table .ieeesa-individual-roster .cdk-column-memberType,.ieeesa-modal-dialog.ieeesa-view-roster .ieeesa-data-table .ieeesa-individual-roster .cdk-column-role,.ieeesa-modal-dialog.ieeesa-view-roster .ieeesa-data-table .ieeesa-individual-roster .cdk-column-employer{width:8.25em;max-width:8.25em}.ieeesa-modal-dialog.ieeesa-view-roster .ieeesa-data-table .ieeesa-individual-roster .cdk-column-org_name,.ieeesa-modal-dialog.ieeesa-view-roster .ieeesa-data-table .ieeesa-individual-roster .cdk-column{width:10em;max-width:10em}.ieeesa-modal-dialog.ieeesa-view-roster .ieeesa-data-table .ieeesa-individual-roster .cdk-column-classification{width:15em;max-width:15em}@media (max-width: 576px){.ieeesa-modal-dialog.ieeesa-view-roster{max-width:95vw!important}.ieeesa-modal-dialog.ieeesa-view-roster .ieeesa-data-table{padding-right:0!important}}.ieeesa-view-roster__export-wrapper{position:relative}.ieeesa-view-roster__export-btn.mat-mdc-button.mat-mdc-button-base{display:inline-flex;flex-direction:row;align-items:center;gap:6px;font-size:13px;white-space:nowrap}.ieeesa-view-roster__export-btn-icon{width:16px;height:16px;flex-shrink:0}\n"] }]
5470
+ }], ctorParameters: function () { return [{ type: i1.MatDialog }, { type: GroupsService }, { type: i2.AlertsService }, { type: i0.ChangeDetectorRef }, { type: i2.GlobalErrorHandlerService }, { type: RosterExportService }]; } });
4976
5471
 
4977
5472
  /**
4978
5473
  * 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.
@@ -5613,5 +6108,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
5613
6108
  * Generated bundle index. Do not edit.
5614
6109
  */
5615
6110
 
5616
- export { AddWorkingGroupsComponent, CreateGroupComponent, EditUserRolesComponent, FilterType, GroupAction, GroupFunctionType, GroupNode, GroupRosterType, Groups, GroupsComponent, GroupsDataSource, GroupsModule, GroupsService, GroupsValidationPatterns, ReciprocalCreditSectionComponent, RoleType, RosterFunctionType, TableColumnSchemaUserGroup, TreeViewComponent };
6111
+ export { AddWorkingGroupsComponent, CreateGroupComponent, EditUserRolesComponent, FilterType, GroupAction, GroupFunctionType, GroupNode, GroupRosterType, Groups, GroupsComponent, GroupsDataSource, GroupsModule, GroupsService, GroupsValidationPatterns, ReciprocalCreditSectionComponent, RoleType, RosterExportService, RosterFunctionType, TableColumnSchemaUserGroup, TreeViewComponent, representingOrgRequiredValidator, skipWhenArray };
5617
6112
  //# sourceMappingURL=ieeesa-npm-groups.mjs.map