@ieeesa-npm/tenants 0.4.2 → 0.4.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.
Files changed (138) hide show
  1. package/.eslintrc.json +31 -0
  2. package/ng-package.json +8 -0
  3. package/package.json +12 -25
  4. package/src/lib/assets/constants.json +454 -0
  5. package/src/lib/assets/tenant-validations.ts +18 -0
  6. package/src/lib/assets/tenants-mock.ts +1240 -0
  7. package/src/lib/components/create-modify-group-type/create-modify-group-type.component.html +15 -0
  8. package/src/lib/components/create-modify-group-type/create-modify-group-type.component.scss +44 -0
  9. package/src/lib/components/create-modify-group-type/create-modify-group-type.component.spec.ts +574 -0
  10. package/src/lib/components/create-modify-group-type/create-modify-group-type.component.ts +602 -0
  11. package/src/lib/components/create-modify-role/create-modify-role.component.html +15 -0
  12. package/src/lib/components/create-modify-role/create-modify-role.component.scss +83 -0
  13. package/src/lib/components/create-modify-role/create-modify-role.component.spec.ts +346 -0
  14. package/src/lib/components/create-modify-role/create-modify-role.component.ts +321 -0
  15. package/src/lib/components/create-tenant-application/create-tenant-application.component.html +18 -0
  16. package/src/lib/components/create-tenant-application/create-tenant-application.component.scss +73 -0
  17. package/src/lib/components/create-tenant-application/create-tenant-application.component.spec.ts +775 -0
  18. package/src/lib/components/create-tenant-application/create-tenant-application.component.ts +638 -0
  19. package/src/lib/components/roles-and-permissions-mapping/roles-and-permissions-mapping.component.html +22 -0
  20. package/src/lib/components/roles-and-permissions-mapping/roles-and-permissions-mapping.component.scss +79 -0
  21. package/src/lib/components/roles-and-permissions-mapping/roles-and-permissions-mapping.component.spec.ts +716 -0
  22. package/src/lib/components/roles-and-permissions-mapping/roles-and-permissions-mapping.component.ts +504 -0
  23. package/src/lib/components/tenant-basic-details/tenant-basic-details.component.html +44 -0
  24. package/src/lib/components/tenant-basic-details/tenant-basic-details.component.scss +16 -0
  25. package/src/lib/components/tenant-basic-details/tenant-basic-details.component.spec.ts +115 -0
  26. package/src/lib/components/tenant-basic-details/tenant-basic-details.component.ts +109 -0
  27. package/src/lib/components/view-tenant-details/view-tenant-details.component.html +195 -0
  28. package/src/lib/components/view-tenant-details/view-tenant-details.component.scss +163 -0
  29. package/src/lib/components/view-tenant-details/view-tenant-details.component.spec.ts +1221 -0
  30. package/src/lib/components/view-tenant-details/view-tenant-details.component.ts +876 -0
  31. package/src/lib/components/view-tenant-group-types/view-tenant-group-types.component.html +10 -0
  32. package/src/lib/components/view-tenant-group-types/view-tenant-group-types.component.scss +44 -0
  33. package/src/lib/components/view-tenant-group-types/view-tenant-group-types.component.spec.ts +410 -0
  34. package/src/lib/components/view-tenant-group-types/view-tenant-group-types.component.ts +219 -0
  35. package/src/lib/components/view-tenants-list/view-tenants-list.component.html +32 -0
  36. package/src/lib/components/view-tenants-list/view-tenants-list.component.scss +35 -0
  37. package/src/lib/components/view-tenants-list/view-tenants-list.component.spec.ts +464 -0
  38. package/src/lib/components/view-tenants-list/view-tenants-list.component.ts +388 -0
  39. package/src/lib/models/app-type-config.model.ts +14 -0
  40. package/src/lib/models/app-type.model.ts +5 -0
  41. package/src/lib/models/create-group-type-config.model.ts +18 -0
  42. package/src/lib/models/create-group-type.model.ts +46 -0
  43. package/src/lib/models/feature-permission-id.model.ts +6 -0
  44. package/src/lib/models/features.model.ts +15 -0
  45. package/src/lib/models/form-status.model.ts +5 -0
  46. package/src/lib/models/permission-type.model.ts +9 -0
  47. package/src/lib/models/role-menu-action.model.ts +5 -0
  48. package/src/lib/models/role-type.model.ts +34 -0
  49. package/src/lib/models/roles-and-permissions-table-type.model.ts +5 -0
  50. package/src/lib/models/roles-and-permissions.model.ts +113 -0
  51. package/src/lib/models/route-config.model.ts +4 -0
  52. package/src/lib/models/table-column-schema-view-tenant-list.model.ts +21 -0
  53. package/src/lib/models/tenant-function-type.model.ts +10 -0
  54. package/src/lib/models/tenant.model.ts +47 -0
  55. package/src/lib/models/tenants-permission.model.ts +9 -0
  56. package/src/lib/models/update-tenant-status.model.ts +12 -0
  57. package/src/lib/models/view-tenant-group-types.model.ts +34 -0
  58. package/src/lib/services/tenant-applications.service.spec.ts +1245 -0
  59. package/src/lib/services/tenant-applications.service.ts +798 -0
  60. package/src/lib/services/tenant-permissions-map.service.spec.ts +25 -0
  61. package/src/lib/services/tenant-permissions-map.service.ts +28 -0
  62. package/src/lib/services/tenant-permissions.service.spec.ts +62 -0
  63. package/src/lib/services/tenant-permissions.service.ts +49 -0
  64. package/src/lib/tenant-applications.component.html +0 -0
  65. package/src/lib/tenant-applications.component.scss +0 -0
  66. package/src/lib/tenant-applications.component.spec.ts +28 -0
  67. package/src/lib/tenant-applications.component.ts +12 -0
  68. package/src/lib/tenant-applications.module.ts +8 -0
  69. package/{public-api.d.ts → src/public-api.ts} +40 -30
  70. package/tsconfig.lib.json +14 -0
  71. package/tsconfig.lib.prod.json +10 -0
  72. package/tsconfig.spec.json +14 -0
  73. package/esm2022/ieeesa-npm-tenants.mjs +0 -5
  74. package/esm2022/lib/assets/constants.json +0 -390
  75. package/esm2022/lib/assets/tenant-validations.mjs +0 -13
  76. package/esm2022/lib/components/create-modify-role/create-modify-role.component.mjs +0 -280
  77. package/esm2022/lib/components/create-tenant-application/create-tenant-application.component.mjs +0 -512
  78. package/esm2022/lib/components/roles-and-permissions-mapping/roles-and-permissions-mapping.component.mjs +0 -391
  79. package/esm2022/lib/components/tenant-basic-details/tenant-basic-details.component.mjs +0 -95
  80. package/esm2022/lib/components/view-tenant-details/view-tenant-details.component.mjs +0 -708
  81. package/esm2022/lib/components/view-tenant-group-types/view-tenant-group-types.component.mjs +0 -174
  82. package/esm2022/lib/components/view-tenants-list/view-tenants-list.component.mjs +0 -334
  83. package/esm2022/lib/models/app-type-config.model.mjs +0 -2
  84. package/esm2022/lib/models/app-type.model.mjs +0 -7
  85. package/esm2022/lib/models/feature-permission-id.model.mjs +0 -8
  86. package/esm2022/lib/models/features.model.mjs +0 -2
  87. package/esm2022/lib/models/form-status.model.mjs +0 -7
  88. package/esm2022/lib/models/permission-type.model.mjs +0 -12
  89. package/esm2022/lib/models/role-menu-action.model.mjs +0 -7
  90. package/esm2022/lib/models/role-type.model.mjs +0 -2
  91. package/esm2022/lib/models/roles-and-permissions-table-type.model.mjs +0 -7
  92. package/esm2022/lib/models/roles-and-permissions.model.mjs +0 -2
  93. package/esm2022/lib/models/route-config.model.mjs +0 -2
  94. package/esm2022/lib/models/table-column-schema-view-tenant-list.model.mjs +0 -16
  95. package/esm2022/lib/models/tenant-function-type.model.mjs +0 -10
  96. package/esm2022/lib/models/tenant.model.mjs +0 -2
  97. package/esm2022/lib/models/tenants-permission.model.mjs +0 -2
  98. package/esm2022/lib/models/update-tenant-status.model.mjs +0 -2
  99. package/esm2022/lib/models/view-tenant-group-types.model.mjs +0 -9
  100. package/esm2022/lib/services/tenant-applications.service.mjs +0 -542
  101. package/esm2022/lib/services/tenant-permissions-map.service.mjs +0 -36
  102. package/esm2022/lib/services/tenant-permissions.service.mjs +0 -38
  103. package/esm2022/lib/tenant-applications.component.mjs +0 -14
  104. package/esm2022/lib/tenant-applications.module.mjs +0 -16
  105. package/esm2022/public-api.mjs +0 -34
  106. package/fesm2022/ieeesa-npm-tenants.mjs +0 -3565
  107. package/fesm2022/ieeesa-npm-tenants.mjs.map +0 -1
  108. package/index.d.ts +0 -5
  109. package/lib/assets/tenant-validations.d.ts +0 -11
  110. package/lib/components/create-modify-role/create-modify-role.component.d.ts +0 -103
  111. package/lib/components/create-tenant-application/create-tenant-application.component.d.ts +0 -128
  112. package/lib/components/roles-and-permissions-mapping/roles-and-permissions-mapping.component.d.ts +0 -106
  113. package/lib/components/tenant-basic-details/tenant-basic-details.component.d.ts +0 -408
  114. package/lib/components/view-tenant-details/view-tenant-details.component.d.ts +0 -216
  115. package/lib/components/view-tenant-group-types/view-tenant-group-types.component.d.ts +0 -58
  116. package/lib/components/view-tenants-list/view-tenants-list.component.d.ts +0 -134
  117. package/lib/models/app-type-config.model.d.ts +0 -14
  118. package/lib/models/app-type.model.d.ts +0 -4
  119. package/lib/models/feature-permission-id.model.d.ts +0 -4
  120. package/lib/models/features.model.d.ts +0 -15
  121. package/lib/models/form-status.model.d.ts +0 -4
  122. package/lib/models/permission-type.model.d.ts +0 -8
  123. package/lib/models/role-menu-action.model.d.ts +0 -4
  124. package/lib/models/role-type.model.d.ts +0 -27
  125. package/lib/models/roles-and-permissions-table-type.model.d.ts +0 -4
  126. package/lib/models/roles-and-permissions.model.d.ts +0 -119
  127. package/lib/models/route-config.model.d.ts +0 -4
  128. package/lib/models/table-column-schema-view-tenant-list.model.d.ts +0 -20
  129. package/lib/models/tenant-function-type.model.d.ts +0 -7
  130. package/lib/models/tenant.model.d.ts +0 -51
  131. package/lib/models/tenants-permission.model.d.ts +0 -9
  132. package/lib/models/update-tenant-status.model.d.ts +0 -14
  133. package/lib/models/view-tenant-group-types.model.d.ts +0 -27
  134. package/lib/services/tenant-applications.service.d.ts +0 -357
  135. package/lib/services/tenant-permissions-map.service.d.ts +0 -13
  136. package/lib/services/tenant-permissions.service.d.ts +0 -22
  137. package/lib/tenant-applications.component.d.ts +0 -5
  138. package/lib/tenant-applications.module.d.ts +0 -6
@@ -0,0 +1,504 @@
1
+ import {
2
+ Component,
3
+ ElementRef,
4
+ EventEmitter,
5
+ OnDestroy,
6
+ OnInit,
7
+ Output,
8
+ ViewChild,
9
+ ViewEncapsulation,
10
+ } from '@angular/core';
11
+ import { CommonModule } from '@angular/common';
12
+ import { FormGroup } from '@angular/forms';
13
+ import { Subject, takeUntil } from 'rxjs';
14
+ import {
15
+ AlignType,
16
+ FormGrid,
17
+ FormModel,
18
+ SelectOption,
19
+ SlideToggleOption,
20
+ FormControlType,
21
+ DynamicFormComponent,
22
+ DataTableComponent,
23
+ TableColumnSchema,
24
+ TableColumnType,
25
+ } from '@ieeesa-npm/presentation';
26
+ import { AlertType } from '@ieeesa-npm/utility';
27
+ import { TenantApplicationsService } from '../../services/tenant-applications.service';
28
+ import {
29
+ Permission,
30
+ ModifiedRolesAndPermissionsMapping,
31
+ RolesAndPermissionsRequestPayload,
32
+ Role,
33
+ RoleDetails,
34
+ RoleOrPermissionMapping,
35
+ RolePermissionMappingRequestPayload,
36
+ } from '../../models/roles-and-permissions.model';
37
+ import { RoleAndPermissionsTableType } from '../../models/roles-and-permissions-table-type.model';
38
+ import * as screenText from '../../assets/constants.json';
39
+ import { FormUtilityService, SharedService } from '@ieeesa-npm/shared';
40
+
41
+ @Component({
42
+ selector: 'ieeesa-roles-and-permissions-mapping',
43
+ standalone: true,
44
+ imports: [CommonModule, DynamicFormComponent, DataTableComponent],
45
+ templateUrl: './roles-and-permissions-mapping.component.html',
46
+ styleUrls: ['./roles-and-permissions-mapping.component.scss'],
47
+ encapsulation: ViewEncapsulation.None,
48
+ })
49
+ export class RolesAndPermissionsMappingComponent implements OnInit, OnDestroy {
50
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
51
+ constants: any = screenText;
52
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
53
+ mapRolesAndPermissionsScreenTexts: any =
54
+ this.constants?.mapRolesAndPermissions;
55
+ formGroup!: FormModel;
56
+ colWidth: FormGrid = { xs: 12, xl: 6, sm: 12, md: 12, lg: 6 };
57
+ actionButtonAlign = AlignType.MIDDLE;
58
+ leftButtonLabel =
59
+ this.mapRolesAndPermissionsScreenTexts?.label?.leftButtonLabel;
60
+ rightButtonLabel =
61
+ this.mapRolesAndPermissionsScreenTexts?.label?.rightButtonLabel;
62
+ roles: SelectOption[] = [];
63
+ permissions: SelectOption[] = [];
64
+ appId!: string;
65
+ destroy$: Subject<boolean> = new Subject<boolean>();
66
+ tableColumnSchema: TableColumnSchema[] = [];
67
+ tableData: RoleOrPermissionMapping[] = [];
68
+ selectedRole!: RoleDetails;
69
+ selectedPermission!: Permission;
70
+ modifiedRolesAndPermissionsMapping: ModifiedRolesAndPermissionsMapping[] = [];
71
+ tableHeading = '';
72
+ rolePermissionMappingPayload: RolePermissionMappingRequestPayload = {
73
+ payload: {
74
+ appId: '',
75
+ permissionId: null,
76
+ roleId: null,
77
+ },
78
+ };
79
+ @Output() formCancel = new EventEmitter();
80
+ @ViewChild(DynamicFormComponent) dynamicFormComponent!: DynamicFormComponent;
81
+ constructor(
82
+ // eslint-disable-next-line no-unused-vars, no-empty-function, @typescript-eslint/no-unused-vars
83
+ private tenantAppService: TenantApplicationsService,
84
+ // eslint-disable-next-line no-unused-vars
85
+ private sharedService: SharedService,
86
+ // eslint-disable-next-line no-unused-vars
87
+ public elementRef: ElementRef,
88
+ // eslint-disable-next-line no-unused-vars
89
+ private formUtilityService: FormUtilityService // eslint-disable-next-line no-empty-function
90
+ ) {}
91
+ /**
92
+ * Initializes form group and all the page defaults.
93
+ * @memberof MapPermissionsRolesComponent
94
+ * @returns {void}
95
+ */
96
+ ngOnInit(): void {
97
+ this.appId = this.tenantAppService.getSelectedTenantInformation()
98
+ ?.appId as string;
99
+ this.formGroup = {
100
+ formGroup: [
101
+ {
102
+ legend: this.mapRolesAndPermissionsScreenTexts?.legend,
103
+ controls: [
104
+ {
105
+ controlName: 'role',
106
+ label: this.mapRolesAndPermissionsScreenTexts?.label?.role,
107
+ type: FormControlType.SELECT,
108
+ dropdownOptions: this.roles,
109
+ supportMessage:
110
+ this.mapRolesAndPermissionsScreenTexts?.supportText?.role,
111
+ ariaLabel:
112
+ this.mapRolesAndPermissionsScreenTexts?.label?.ariaLabel?.role,
113
+ ariaDescribedById:
114
+ this.mapRolesAndPermissionsScreenTexts?.label?.ariaDescribedById
115
+ ?.role,
116
+ },
117
+ {
118
+ controlName: 'permission',
119
+ label: this.mapRolesAndPermissionsScreenTexts?.label?.permission,
120
+ type: FormControlType.SELECT,
121
+ dropdownOptions: this.permissions,
122
+ supportMessage:
123
+ this.mapRolesAndPermissionsScreenTexts?.supportText?.permission,
124
+ ariaLabel:
125
+ this.mapRolesAndPermissionsScreenTexts?.label?.ariaLabel
126
+ ?.permission,
127
+ ariaDescribedById:
128
+ this.mapRolesAndPermissionsScreenTexts?.label?.ariaDescribedById
129
+ ?.permission,
130
+ },
131
+ ],
132
+ },
133
+ ],
134
+ };
135
+ this.getRoles();
136
+ this.getPermissions();
137
+ this.sharedService.isAlertClosed
138
+ .pipe(takeUntil(this.destroy$))
139
+ .subscribe(() => {
140
+ const alertModals = document.querySelectorAll(
141
+ '.cdk-overlay-container ieeesa-alert'
142
+ );
143
+ if (alertModals.length) {
144
+ (
145
+ document.querySelector(
146
+ '.cdk-overlay-container .mat-mdc-dialog-content .ieeesa-alert-box__close-button'
147
+ ) as HTMLElement
148
+ )?.focus();
149
+ } else {
150
+ (
151
+ this.elementRef.nativeElement.querySelector(
152
+ '.cdk-overlay-container .mat-mdc-dialog-content .ieeesa-select-field mat-select'
153
+ ) as HTMLElement
154
+ )?.focus();
155
+ }
156
+ });
157
+ }
158
+ /**
159
+ * Constructs the role or permission table schema to display the associated mapping in a table view.
160
+ * @param {FormGroup[]} formGroups
161
+ * @memberof MapPermissionsRolesComponent
162
+ * @returns {void}
163
+ */
164
+ onRoleOrPermissionSelected(formGroups: FormGroup[]): void {
165
+ this.tableColumnSchema = [];
166
+ this.modifiedRolesAndPermissionsMapping = [];
167
+ const formGroup = formGroups[0];
168
+ const role = formGroup.get('role')?.value;
169
+ const permission = formGroup.get('permission')?.value;
170
+ if (role) {
171
+ this.selectedRole = {
172
+ roleId: role.id,
173
+ roleName: role.name,
174
+ };
175
+ this.rolePermissionMappingPayload.payload.roleId = role?.id;
176
+ }
177
+ if (permission) {
178
+ this.selectedPermission = {
179
+ permissionId: permission.id,
180
+ permissionName: permission.name,
181
+ };
182
+ this.rolePermissionMappingPayload.payload.permissionId = permission?.id;
183
+ }
184
+ this.rolePermissionMappingPayload.payload.appId = this.appId;
185
+ if ((role && permission) || role) {
186
+ this.tableHeading = `${this.mapRolesAndPermissionsScreenTexts?.roleTableCaption}<strong>${role?.name}</strong>`;
187
+ this.tableColumnSchema.push({
188
+ id: 1,
189
+ columnDef: 'permission',
190
+ heading: this.mapRolesAndPermissionsScreenTexts.tableColumns.permission,
191
+ columnType: TableColumnType.TEXT,
192
+ cellData: (permissionMapping: RoleOrPermissionMapping) =>
193
+ permissionMapping?.roleOrPermissionName,
194
+ });
195
+ } else {
196
+ this.tableColumnSchema.push({
197
+ id: 1,
198
+ columnDef: 'role',
199
+ heading: this.mapRolesAndPermissionsScreenTexts.tableColumns.role,
200
+ columnType: TableColumnType.TEXT,
201
+ cellData: (roleMapping: RoleOrPermissionMapping) =>
202
+ roleMapping?.roleOrPermissionName,
203
+ });
204
+ }
205
+ if (permission) {
206
+ const permissionHeading = `${this.mapRolesAndPermissionsScreenTexts?.permissionTableCaption}<strong>${permission?.name}</strong>`;
207
+ this.tableHeading = role
208
+ ? this.tableHeading + `</br>` + permissionHeading
209
+ : permissionHeading;
210
+ }
211
+ this.tableColumnSchema.push({
212
+ id: 2,
213
+ columnDef: 'slideToggle',
214
+ heading: this.mapRolesAndPermissionsScreenTexts.tableColumns.status,
215
+ columnType: TableColumnType.SLIDE_TOGGLE,
216
+ cellData: (roleMapping: RoleOrPermissionMapping) => {
217
+ return {
218
+ id: Math.floor(Math.random() * 1000) + 1,
219
+ label: '',
220
+ ariaLabel: roleMapping.roleOrPermissionName,
221
+ checked: roleMapping.status,
222
+ };
223
+ },
224
+ });
225
+ this.dynamicFormComponent.isSubmitButtonDisabled = true;
226
+ this.getRolePermissionMapping(this.rolePermissionMappingPayload);
227
+ }
228
+ /**
229
+ * Gets the list of roles and displayed in the role dropdown.
230
+ * @memberof MapPermissionsRolesComponent
231
+ * @returns {void}
232
+ */
233
+ getRoles(): void {
234
+ this.tenantAppService
235
+ .getRoles(this.appId)
236
+ .pipe(takeUntil(this.destroy$))
237
+ .subscribe({
238
+ next: (response) => {
239
+ if (response?.status) {
240
+ const rolesList = response?.body as Role[];
241
+ rolesList.map((role: Role) => {
242
+ this.roles.push({
243
+ id: role.roleId,
244
+ name: role.roleName,
245
+ });
246
+ });
247
+ this.formUtilityService.updateFormControlOptions(
248
+ 'role',
249
+ 'dropdownOptions',
250
+ this.roles,
251
+ this.dynamicFormComponent
252
+ );
253
+ }
254
+ },
255
+ error: (error) => {
256
+ this.sharedService.handleErrors(
257
+ error,
258
+ this.mapRolesAndPermissionsScreenTexts.errors
259
+ );
260
+ },
261
+ });
262
+ }
263
+ /**
264
+ * Gets the list of permissions and displayed in the permission dropdown.
265
+ * @memberof MapPermissionsRolesComponent
266
+ * @returns {void}
267
+ */
268
+ getPermissions(): void {
269
+ this.tenantAppService
270
+ .getPermissions(this.appId)
271
+ .pipe(takeUntil(this.destroy$))
272
+ .subscribe({
273
+ next: (response) => {
274
+ if (response?.status) {
275
+ const permissionsList = response?.body as Permission[];
276
+ permissionsList.map((permission: Permission) => {
277
+ this.permissions.push({
278
+ id: permission.permissionId,
279
+ name: permission.permissionName,
280
+ });
281
+ });
282
+ this.formUtilityService.updateFormControlOptions(
283
+ 'permission',
284
+ 'dropdownOptions',
285
+ this.permissions,
286
+ this.dynamicFormComponent
287
+ );
288
+ }
289
+ },
290
+ error: (error) => {
291
+ this.sharedService.handleErrors(
292
+ error,
293
+ this.mapRolesAndPermissionsScreenTexts.errors
294
+ );
295
+ },
296
+ });
297
+ }
298
+ /**
299
+ * Gets the list of mapped roles/permissions from the backend api.
300
+ * @param {RolePermissionMappingRequestPayload} payload
301
+ * @memberof MapPermissionsRolesComponent
302
+ * @returns {void}
303
+ */
304
+ getRolePermissionMapping(payload: RolePermissionMappingRequestPayload): void {
305
+ this.tableData = [];
306
+ this.tenantAppService
307
+ .getRolePermissionMapping(payload)
308
+ .pipe(takeUntil(this.destroy$))
309
+ .subscribe({
310
+ next: (response) => {
311
+ const payloadInfo = payload.payload;
312
+ if (payloadInfo?.roleId && payloadInfo?.permissionId) {
313
+ this.tableData.push({
314
+ roleOrPermissionName: this.selectedPermission?.permissionName,
315
+ roleOrPermissionId: this.selectedPermission?.permissionId,
316
+ status: true,
317
+ });
318
+ } else if (payloadInfo?.roleId) {
319
+ this.setTableData(
320
+ this.permissions,
321
+ response.body as Permission[],
322
+ RoleAndPermissionsTableType.PERMISSION
323
+ );
324
+ } else {
325
+ this.setTableData(
326
+ this.roles,
327
+ response.body as RoleDetails[],
328
+ RoleAndPermissionsTableType.ROLE
329
+ );
330
+ }
331
+ },
332
+ error: (error) => {
333
+ const errorCodes = error?.error?.body?.errorCodes;
334
+ // Returns error code 3020 when mapped roles does not exist for given permission id.
335
+ if (errorCodes.includes('3020')) {
336
+ this.setTableData(this.roles, [], RoleAndPermissionsTableType.ROLE);
337
+ }
338
+ // Returns error code 3021 when mapped permissions does not exist for given role id.
339
+ else if (errorCodes.includes('3021')) {
340
+ this.setTableData(
341
+ this.permissions,
342
+ [],
343
+ RoleAndPermissionsTableType.PERMISSION
344
+ );
345
+ }
346
+ // Returns error code 3017 when role permission mapping does not exist for given role id.
347
+ else if (errorCodes.includes('3017')) {
348
+ this.tableData.push({
349
+ roleOrPermissionName: this.selectedPermission?.permissionName,
350
+ roleOrPermissionId: this.selectedPermission?.permissionId,
351
+ status: false,
352
+ });
353
+ } else
354
+ this.sharedService.handleErrors(
355
+ error,
356
+ this.mapRolesAndPermissionsScreenTexts.errors
357
+ );
358
+ },
359
+ });
360
+ }
361
+ /**
362
+ * Displaying the mapped roles and permissions data into the data table.
363
+ * @param {SelectOption[]} roleOrPermissions
364
+ * @param {RoleDetails[] | Permission[]} mappedRoleOrPermissions
365
+ * @param {RoleAndPermissionsTableType} tableType
366
+ * @memberof MapPermissionsRolesComponent
367
+ * @returns {void}
368
+ */
369
+ setTableData(
370
+ roleOrPermissions: SelectOption[],
371
+ mappedRoleOrPermissions: RoleDetails[] | Permission[],
372
+ tableType: RoleAndPermissionsTableType
373
+ ): void {
374
+ roleOrPermissions.map((roleOrPermission) => {
375
+ this.tableData.push({
376
+ roleOrPermissionName: roleOrPermission.name,
377
+ roleOrPermissionId: roleOrPermission.id as string,
378
+ status:
379
+ tableType === RoleAndPermissionsTableType.ROLE
380
+ ? mappedRoleOrPermissions.length > 0 &&
381
+ (mappedRoleOrPermissions as RoleDetails[]).some(
382
+ (mappedRoleOrPermission: RoleDetails) =>
383
+ mappedRoleOrPermission.roleId === roleOrPermission.id
384
+ )
385
+ : mappedRoleOrPermissions.length > 0 &&
386
+ (mappedRoleOrPermissions as Permission[]).some(
387
+ (mappedRoleOrPermission) =>
388
+ mappedRoleOrPermission.permissionId === roleOrPermission.id
389
+ ),
390
+ });
391
+ });
392
+ }
393
+ /**
394
+ * Constructs the payload based on the roles and permissions mapping (selection or deselection).
395
+ * @param roleOrPermissionStatus
396
+ * @memberof MapPermissionsRolesComponent
397
+ * @returns {void}
398
+ */
399
+ roleOrPermissionStatusChange(roleOrPermissionStatus: {
400
+ slideToggle: SlideToggleOption;
401
+ rowData: RoleOrPermissionMapping;
402
+ }): void {
403
+ if (
404
+ (this.selectedRole?.roleId && this.selectedPermission?.permissionId) ||
405
+ this.selectedRole?.roleId
406
+ ) {
407
+ if (
408
+ this.modifiedRolesAndPermissionsMapping.find(
409
+ (permission) =>
410
+ permission.permissionId ===
411
+ roleOrPermissionStatus.rowData.roleOrPermissionId
412
+ )
413
+ ) {
414
+ this.modifiedRolesAndPermissionsMapping.splice(
415
+ this.modifiedRolesAndPermissionsMapping.findIndex(
416
+ (permission) =>
417
+ permission.permissionId ===
418
+ roleOrPermissionStatus.rowData.roleOrPermissionId
419
+ ),
420
+ 1
421
+ );
422
+ } else {
423
+ this.modifiedRolesAndPermissionsMapping.push({
424
+ roleId: this.selectedRole.roleId,
425
+ permissionId: roleOrPermissionStatus.rowData.roleOrPermissionId,
426
+ appId: this.appId,
427
+ status: roleOrPermissionStatus.slideToggle.checked,
428
+ });
429
+ }
430
+ } else if (this.selectedPermission?.permissionId) {
431
+ if (
432
+ this.modifiedRolesAndPermissionsMapping.find(
433
+ (role) =>
434
+ role.roleId === roleOrPermissionStatus.rowData.roleOrPermissionId
435
+ )
436
+ ) {
437
+ this.modifiedRolesAndPermissionsMapping.splice(
438
+ this.modifiedRolesAndPermissionsMapping.findIndex(
439
+ (role) =>
440
+ role.roleId === roleOrPermissionStatus.rowData.roleOrPermissionId
441
+ ),
442
+ 1
443
+ );
444
+ } else {
445
+ this.modifiedRolesAndPermissionsMapping.push({
446
+ roleId: roleOrPermissionStatus.rowData.roleOrPermissionId,
447
+ permissionId: this.selectedPermission.permissionId,
448
+ appId: this.appId,
449
+ status: roleOrPermissionStatus.slideToggle.checked,
450
+ });
451
+ }
452
+ }
453
+ this.dynamicFormComponent.isSubmitButtonDisabled =
454
+ !this.modifiedRolesAndPermissionsMapping.length;
455
+ }
456
+ /**
457
+ * Submits the roles and permissions mappings to the server.
458
+ * @memberof MapPermissionsRolesComponent
459
+ * @returns {void}
460
+ */
461
+ onMapAndPermissionsFormSubmit(): void {
462
+ const payload: RolesAndPermissionsRequestPayload = {
463
+ payload: this.modifiedRolesAndPermissionsMapping,
464
+ };
465
+ this.dynamicFormComponent.isSubmitButtonDisabled = true;
466
+ this.modifiedRolesAndPermissionsMapping = [];
467
+ this.tenantAppService
468
+ .saveRolePermissionMapping(payload)
469
+ .pipe(takeUntil(this.destroy$))
470
+ .subscribe({
471
+ next: (response) => {
472
+ if (response?.status) {
473
+ this.sharedService.showAlertMessage(
474
+ AlertType.SUCCESS,
475
+ this.mapRolesAndPermissionsScreenTexts.message.success
476
+ .rolesAndPermissionsSubmission
477
+ );
478
+ }
479
+ },
480
+ error: (error) => {
481
+ this.sharedService.handleErrors(
482
+ error,
483
+ this.mapRolesAndPermissionsScreenTexts.errors
484
+ );
485
+ },
486
+ });
487
+ }
488
+ /**
489
+ * Closes the map and permissions modal.
490
+ * @memberof MapPermissionsRolesComponent
491
+ * @returns {void}
492
+ */
493
+ onMapAndPermissionsFormCancel(): void {
494
+ this.formCancel.emit();
495
+ }
496
+ /**
497
+ * Performs necessary cleanup tasks, such as unsubscribing from subscription when the component is being destroyed.
498
+ * @memberof ViewTenantDetailsComponent
499
+ */
500
+ ngOnDestroy(): void {
501
+ this.destroy$?.next(true);
502
+ this.destroy$?.unsubscribe();
503
+ }
504
+ }
@@ -0,0 +1,44 @@
1
+ <div *ngIf="basicInfo" class="ieeesa-tenant-basic-info d-flex flex-start flex-column">
2
+ <p class="ieeesa-body-color-sm-14 mb-0">{{ basicDetailTexts.title }}</p>
3
+ <p class="ieeesa-body-md-16">{{ basicInfo.appTitle }}</p>
4
+ <p class="ieeesa-body-color-sm-14 mb-2">{{ basicDetailTexts.logo }}</p>
5
+ <ng-container>
6
+ <ieeesa-image-preview
7
+ class="pb-3"
8
+ [imageUrl]="imageUrl"
9
+ ></ieeesa-image-preview>
10
+ </ng-container>
11
+ <span class="ieeesa-body-color-sm-14 mb-0">{{
12
+ basicDetailTexts.heading
13
+ }}</span>
14
+ <p class="ieeesa-title-sm-16">{{ basicInfo.appHeading }}</p>
15
+ <span class="ieeesa-body-color-sm-14 mb-0">{{
16
+ basicDetailTexts.description
17
+ }}</span>
18
+ <p class="ieeesa-title-sm-16 me-4">{{ basicInfo.appDescription }}</p>
19
+ <span class="ieeesa-body-color-sm-14 mb-2">{{
20
+ basicDetailTexts.bgColor
21
+ }}</span>
22
+ <p
23
+ class="ieeesa-tenant-basic-info__bgColor"
24
+ [ngStyle]="{ 'background-color': basicInfo.backgroundColor }"
25
+ ></p>
26
+ <span class="ieeesa-body-color-sm-14 mb-0">{{
27
+ basicDetailTexts.helpLink
28
+ }}</span>
29
+ <p class="ieeesa-title-sm-16">{{ basicInfo.appHelpLink }}</p>
30
+ <span class="ieeesa-body-color-sm-14 mb-0">{{
31
+ basicDetailTexts.listOfFeatures
32
+ }}</span>
33
+ <ul [ngClass]="isMobileView ? '' : 'd-flex gap-5'">
34
+ <li class="ieeesa-body-md-16" *ngFor="let feature of basicInfo.features">
35
+ {{ feature?.featureName }}
36
+ </li>
37
+ </ul>
38
+ <span class="ieeesa-body-color-sm-14 mb-0">{{
39
+ basicDetailTexts.domainURL
40
+ }}</span>
41
+ <p class="ieeesa-title-sm-16">{{ basicInfo.appDomainUrl }}</p>
42
+ <span class="ieeesa-body-color-sm-14 mb-0">{{ basicDetailTexts.type }}</span>
43
+ <p class="ieeesa-body-md-16">{{ selectedAppTypeLabel }}</p>
44
+ </div>
@@ -0,0 +1,16 @@
1
+ @import "styles.scss";
2
+
3
+ .ieeesa-tenant-basic-info {
4
+ .ieeesa-body-color-sm-14 {
5
+ color: $ieeesa-dark-grey !important;
6
+ }
7
+ &__bgColor {
8
+ width: 1.85em;
9
+ height: 1.85em;
10
+ border: 1px solid $ieeesa-background-gray;
11
+ }
12
+ .ieeesa-body-md-16,
13
+ .ieeesa-title-sm-16 {
14
+ color: $ieeesa-background-dark-color !important;
15
+ }
16
+ }
@@ -0,0 +1,115 @@
1
+ import { ComponentFixture, TestBed } from '@angular/core/testing';
2
+ import { TenantsMocks } from '../../assets/tenants-mock';
3
+ import { TenantBasicDetailsComponent } from './tenant-basic-details.component';
4
+ import { HttpService } from '@ieeesa-npm/utility';
5
+ import { RouterTestingModule } from '@angular/router/testing';
6
+ import { SharedService } from '@ieeesa-npm/shared';
7
+ import {
8
+ HttpBackend,
9
+ HttpClient,
10
+ HttpClientModule,
11
+ HttpErrorResponse,
12
+ HttpHandler,
13
+ } from '@angular/common/http';
14
+ import { FileUploadService } from '@presentation/services/file-upload.service';
15
+ import { Observable } from 'rxjs';
16
+ import { MatDialogModule } from '@angular/material/dialog';
17
+ import { TenantApplicationsService } from '@ieeesa-npm/tenants';
18
+
19
+ describe('TenantBasicDetailsComponent', () => {
20
+ let component: TenantBasicDetailsComponent;
21
+ let fixture: ComponentFixture<TenantBasicDetailsComponent>;
22
+ let fileUploadService: FileUploadService;
23
+ let sharedService: SharedService;
24
+ beforeEach(() => {
25
+ TestBed.configureTestingModule({
26
+ imports: [
27
+ RouterTestingModule,
28
+ TenantBasicDetailsComponent,
29
+ MatDialogModule,
30
+ HttpClientModule,
31
+ ],
32
+ providers: [
33
+ SharedService,
34
+ HttpClient,
35
+ FileUploadService,
36
+ HttpHandler,
37
+ HttpBackend,
38
+ HttpService,
39
+ TenantApplicationsService,
40
+ ],
41
+ });
42
+ fixture = TestBed.createComponent(TenantBasicDetailsComponent);
43
+ component = fixture.componentInstance;
44
+ fileUploadService = TestBed.inject(FileUploadService);
45
+ sharedService = TestBed.inject(SharedService);
46
+ fixture.detectChanges();
47
+ });
48
+ const presignedUrl = TenantsMocks.mockPreSignedUrlResponse.body;
49
+ it('should create', () => {
50
+ expect(component).toBeTruthy();
51
+ });
52
+ describe('#tenantDetails()', () => {
53
+ it('should set tenant details', () => {
54
+ component.tenantDetails =
55
+ TenantsMocks.viewTenantDetailsMockResponse?.body;
56
+ expect(component.logo).toEqual(
57
+ TenantsMocks.viewTenantDetailsMockResponse?.body?.appLogo
58
+ );
59
+ expect(component.selectedAppType).toEqual(
60
+ TenantsMocks.viewTenantDetailsMockResponse?.body?.appType
61
+ );
62
+ });
63
+ });
64
+
65
+ describe('#getAppType', () => {
66
+ it('should get app types', () => {
67
+ component['tenantAppService'].setApplicationType(
68
+ TenantsMocks.mockAppTypesFormattedResponse
69
+ );
70
+ component.basicInfo = TenantsMocks.viewTenantDetailsMockResponse.body;
71
+ component.getAppType();
72
+ expect(component.selectedAppTypeLabel).toEqual(
73
+ TenantsMocks.mockAppTypesFormattedResponse[0].label
74
+ );
75
+ });
76
+ });
77
+ describe('#getFileDownloadPresignedUrls', () => {
78
+ it('should call get file download presigned urls', () => {
79
+ const mockPresignedUrlResponse = TenantsMocks.mockPreSignedUrlResponse;
80
+ const fileName = 'Test.jpg';
81
+ component.imageUrl = presignedUrl;
82
+ spyOn(fileUploadService, 'getFileDownloadPresignedUrls').and.returnValue(
83
+ new Observable((subscriber) => {
84
+ subscriber.next(mockPresignedUrlResponse.body);
85
+ })
86
+ );
87
+ component.getFileDownloadPresignedUrls(fileName);
88
+ expect(component.imageUrl).toBe(
89
+ TenantsMocks.mockPreSignedUrlResponse.body
90
+ );
91
+ });
92
+ it('should throw and handle global error in retrieving file download presigned urls', () => {
93
+ const mockServerErrorResponse = new HttpErrorResponse({
94
+ error: 'test',
95
+ });
96
+ spyOn(sharedService, 'handleErrors');
97
+ spyOn(fileUploadService, 'getFileDownloadPresignedUrls').and.returnValue(
98
+ new Observable((subscriber) => {
99
+ subscriber.error(mockServerErrorResponse);
100
+ })
101
+ );
102
+ component.getFileDownloadPresignedUrls('presigned-url.jpg');
103
+ expect(sharedService.handleErrors).toHaveBeenCalled();
104
+ });
105
+ });
106
+
107
+ describe('#ngOnDestroy', () => {
108
+ it('should perform necessary cleanup tasks on ngOnDestroy', () => {
109
+ spyOn(component.destroy$, 'unsubscribe');
110
+ component.ngOnDestroy();
111
+ expect(component.destroy$.unsubscribe).toHaveBeenCalled();
112
+ expect(component.destroy$.next).toBeTruthy();
113
+ });
114
+ });
115
+ });