@csmart/ngc-smart-core 0.7.95 → 1.13.2

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 (91) hide show
  1. package/csmart-ngc-smart-core.d.ts +1 -5
  2. package/esm2020/csmart-ngc-smart-core.mjs +5 -0
  3. package/esm2020/lib/ngc-smart-core.module.mjs +97 -0
  4. package/esm2020/lib/smart-auth/smart-access-control-config.mjs +12 -0
  5. package/esm2020/lib/smart-auth/smart-access-control.directive.mjs +40 -0
  6. package/esm2020/lib/smart-auth/smart-auth.service.mjs +479 -0
  7. package/esm2020/lib/smart-auth/smart-authorization-guard.service.mjs +35 -0
  8. package/esm2020/lib/smart-auth/smart-error.component.mjs +37 -0
  9. package/esm2020/lib/smart-auth/smart-login-staff-resolver.service.mjs +59 -0
  10. package/esm2020/lib/smart-auth/smart-selected-offender-resolver.service.mjs +49 -0
  11. package/esm2020/lib/smart-navbar/smart-navbar-config.mjs +2 -0
  12. package/esm2020/lib/smart-navbar/smart-navbar.component.mjs +132 -0
  13. package/esm2020/lib/smart-navbar/smart-navbar.service.mjs +63 -0
  14. package/esm2020/lib/smart-offender-header/smart-offender-header.component.mjs +151 -0
  15. package/esm2020/lib/smart-offender-header/smart-offender-header.service.mjs +41 -0
  16. package/esm2020/lib/smart-staff-offender-options/smart-staff-offender-options-resolver.service.mjs +25 -0
  17. package/esm2020/lib/smart-staff-offender-options/smart-staff-offender-options.component.mjs +78 -0
  18. package/esm2020/lib/smart-staff-offender-options/smart-staff-offender-options.service.mjs +134 -0
  19. package/esm2020/lib/smart-storage/smart-storage-model.mjs +30 -0
  20. package/esm2020/lib/smart-storage/xdm.service.mjs +158 -0
  21. package/esm2020/public-api.mjs +20 -0
  22. package/fesm2015/csmart-ngc-smart-core.mjs +1529 -0
  23. package/fesm2015/csmart-ngc-smart-core.mjs.map +1 -0
  24. package/fesm2020/csmart-ngc-smart-core.mjs +1514 -0
  25. package/fesm2020/csmart-ngc-smart-core.mjs.map +1 -0
  26. package/lib/ngc-smart-core.module.d.ts +18 -0
  27. package/lib/smart-auth/smart-access-control.directive.d.ts +3 -0
  28. package/lib/smart-auth/smart-auth.service.d.ts +4 -0
  29. package/lib/smart-auth/smart-authorization-guard.service.d.ts +3 -0
  30. package/lib/smart-auth/smart-error.component.d.ts +3 -0
  31. package/lib/smart-auth/smart-login-staff-resolver.service.d.ts +3 -0
  32. package/lib/smart-auth/smart-selected-offender-resolver.service.d.ts +3 -0
  33. package/lib/smart-navbar/smart-navbar.component.d.ts +6 -3
  34. package/lib/smart-navbar/smart-navbar.service.d.ts +3 -0
  35. package/lib/smart-offender-header/smart-offender-header.component.d.ts +4 -1
  36. package/lib/smart-offender-header/smart-offender-header.service.d.ts +3 -0
  37. package/lib/smart-staff-offender-options/smart-staff-offender-options-resolver.service.d.ts +3 -0
  38. package/lib/smart-staff-offender-options/smart-staff-offender-options.component.d.ts +3 -0
  39. package/lib/smart-staff-offender-options/smart-staff-offender-options.service.d.ts +6 -3
  40. package/lib/smart-storage/xdm.service.d.ts +3 -0
  41. package/package.json +25 -14
  42. package/public-api.d.ts +3 -0
  43. package/bundles/csmart-ngc-smart-core.umd.js +0 -2620
  44. package/bundles/csmart-ngc-smart-core.umd.js.map +0 -1
  45. package/bundles/csmart-ngc-smart-core.umd.min.js +0 -2
  46. package/bundles/csmart-ngc-smart-core.umd.min.js.map +0 -1
  47. package/csmart-ngc-smart-core.metadata.json +0 -1
  48. package/esm2015/csmart-ngc-smart-core.js +0 -15
  49. package/esm2015/lib/ngc-smart-core.module.js +0 -59
  50. package/esm2015/lib/smart-auth/smart-access-control-config.js +0 -32
  51. package/esm2015/lib/smart-auth/smart-access-control.directive.js +0 -70
  52. package/esm2015/lib/smart-auth/smart-auth.service.js +0 -693
  53. package/esm2015/lib/smart-auth/smart-authorization-guard.service.js +0 -63
  54. package/esm2015/lib/smart-auth/smart-error.component.js +0 -77
  55. package/esm2015/lib/smart-auth/smart-login-staff-resolver.service.js +0 -94
  56. package/esm2015/lib/smart-auth/smart-selected-offender-resolver.service.js +0 -101
  57. package/esm2015/lib/smart-navbar/smart-navbar-config.js +0 -22
  58. package/esm2015/lib/smart-navbar/smart-navbar.component.js +0 -224
  59. package/esm2015/lib/smart-navbar/smart-navbar.service.js +0 -89
  60. package/esm2015/lib/smart-offender-header/smart-offender-header.component.js +0 -253
  61. package/esm2015/lib/smart-offender-header/smart-offender-header.service.js +0 -85
  62. package/esm2015/lib/smart-staff-offender-options/smart-staff-offender-options-resolver.service.js +0 -49
  63. package/esm2015/lib/smart-staff-offender-options/smart-staff-offender-options.component.js +0 -151
  64. package/esm2015/lib/smart-staff-offender-options/smart-staff-offender-options.service.js +0 -222
  65. package/esm2015/lib/smart-storage/smart-storage-model.js +0 -131
  66. package/esm2015/lib/smart-storage/xdm.service.js +0 -317
  67. package/esm2015/public-api.js +0 -22
  68. package/esm5/csmart-ngc-smart-core.js +0 -15
  69. package/esm5/lib/ngc-smart-core.module.js +0 -63
  70. package/esm5/lib/smart-auth/smart-access-control-config.js +0 -32
  71. package/esm5/lib/smart-auth/smart-access-control.directive.js +0 -74
  72. package/esm5/lib/smart-auth/smart-auth.service.js +0 -762
  73. package/esm5/lib/smart-auth/smart-authorization-guard.service.js +0 -67
  74. package/esm5/lib/smart-auth/smart-error.component.js +0 -83
  75. package/esm5/lib/smart-auth/smart-login-staff-resolver.service.js +0 -98
  76. package/esm5/lib/smart-auth/smart-selected-offender-resolver.service.js +0 -108
  77. package/esm5/lib/smart-navbar/smart-navbar-config.js +0 -22
  78. package/esm5/lib/smart-navbar/smart-navbar.component.js +0 -251
  79. package/esm5/lib/smart-navbar/smart-navbar.service.js +0 -114
  80. package/esm5/lib/smart-offender-header/smart-offender-header.component.js +0 -283
  81. package/esm5/lib/smart-offender-header/smart-offender-header.service.js +0 -76
  82. package/esm5/lib/smart-staff-offender-options/smart-staff-offender-options-resolver.service.js +0 -52
  83. package/esm5/lib/smart-staff-offender-options/smart-staff-offender-options.component.js +0 -165
  84. package/esm5/lib/smart-staff-offender-options/smart-staff-offender-options.service.js +0 -232
  85. package/esm5/lib/smart-storage/smart-storage-model.js +0 -155
  86. package/esm5/lib/smart-storage/xdm.service.js +0 -389
  87. package/esm5/public-api.js +0 -22
  88. package/fesm2015/csmart-ngc-smart-core.js +0 -2231
  89. package/fesm2015/csmart-ngc-smart-core.js.map +0 -1
  90. package/fesm5/csmart-ngc-smart-core.js +0 -2502
  91. package/fesm5/csmart-ngc-smart-core.js.map +0 -1
@@ -0,0 +1,1529 @@
1
+ import * as i0 from '@angular/core';
2
+ import { InjectionToken, isDevMode, Injectable, Inject, Component, ViewEncapsulation, Input, ViewChild, Directive, NgModule } from '@angular/core';
3
+ import * as i8 from '@angular/common';
4
+ import { DOCUMENT, CommonModule } from '@angular/common';
5
+ import * as i5$1 from '@angular/material/button';
6
+ import { MatButtonModule } from '@angular/material/button';
7
+ import * as i4 from '@angular/material/tabs';
8
+ import { MatTabsModule } from '@angular/material/tabs';
9
+ import * as i6 from '@angular/material/select';
10
+ import { MatSelectModule } from '@angular/material/select';
11
+ import * as i5$2 from '@angular/material/checkbox';
12
+ import { MatCheckboxModule } from '@angular/material/checkbox';
13
+ import * as i4$1 from '@angular/material/card';
14
+ import { MatCardModule } from '@angular/material/card';
15
+ import * as i2$2 from '@angular/material/snack-bar';
16
+ import { MatSnackBar } from '@angular/material/snack-bar';
17
+ import { MatMenuModule } from '@angular/material/menu';
18
+ import * as i1 from '@angular/common/http';
19
+ import { HttpClientModule } from '@angular/common/http';
20
+ import * as i7$1 from '@angular/forms';
21
+ import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';
22
+ import { Subject, of, from, throwError, EMPTY, concat } from 'rxjs';
23
+ import { map, switchMap, take, catchError, mergeMap, retryWhen, delay } from 'rxjs/operators';
24
+ import { connectToChild } from 'penpal';
25
+ import * as i2 from '@azure/msal-angular';
26
+ import * as i2$1 from '@angular/router';
27
+ import * as i5 from '@angular/material/form-field';
28
+ import * as i7 from '@angular/material/core';
29
+ import { __awaiter } from 'tslib';
30
+
31
+ class Permission {
32
+ }
33
+ class Role {
34
+ }
35
+ class Option {
36
+ }
37
+ class LoginStaff {
38
+ constructor() {
39
+ this.selectedRole = '*';
40
+ }
41
+ }
42
+ class SelectedOffender {
43
+ constructor() {
44
+ this.intakeFlag = false;
45
+ }
46
+ }
47
+ class OffenderQuery {
48
+ }
49
+ class StorageKey {
50
+ }
51
+ StorageKey.selectedOffender = 'smart-selected-offender';
52
+ StorageKey.loginStaff = 'smart-login-staff';
53
+ StorageKey.offenderQuery = 'smart-offender-query';
54
+ const SMART_WEB_STORAGE_LISTENER_URL = new InjectionToken('SMART Web Storage Listener URL');
55
+ const SMART_WEB_PORTAL_URL = new InjectionToken('SMART Web Portal URL');
56
+ const SMART_DATA_SERVICE_URL = new InjectionToken('SMART Data Service URL');
57
+ //exception for redirection
58
+ const SMART_DOMAIN_FORMAT = new InjectionToken('SMART Domain Format URL');
59
+
60
+ class XdmService {
61
+ constructor(document, smartStorageListenerUrl, httpClient, smartDataServiceUrl) {
62
+ this.document = document;
63
+ this.smartStorageListenerUrl = smartStorageListenerUrl;
64
+ this.httpClient = httpClient;
65
+ this.smartDataServiceUrl = smartDataServiceUrl;
66
+ this.offenderSubject = new Subject();
67
+ this.staffSubject = new Subject();
68
+ this.offenderQuerySubject = new Subject();
69
+ if (isDevMode) {
70
+ console.log('SmartStorage XdmService (Client) - constructor()');
71
+ }
72
+ this.init();
73
+ }
74
+ init() {
75
+ const frame = this.document.createElement('iframe');
76
+ frame.src = this.smartStorageListenerUrl;
77
+ frame.id = 'childframe';
78
+ frame.name = Math.random().toString();
79
+ frame.onload = null;
80
+ frame.style.visibility = 'hidden';
81
+ this.document.body.appendChild(frame);
82
+ this.connection = connectToChild({
83
+ iframe: frame,
84
+ debug: false,
85
+ });
86
+ }
87
+ getStaffOffenderListOptions(staffId) {
88
+ const queryString = `{findvStaffOffenderListOptions(input:{
89
+ where:{
90
+ staffId: ${staffId}
91
+ }
92
+ }){
93
+ data{
94
+ offenderListOptionId
95
+ name
96
+ serviceApiFieldName
97
+ selectedFlag
98
+ }
99
+ } }`;
100
+ return this.httpClient
101
+ .post(this.smartDataServiceUrl, { query: queryString })
102
+ .pipe(map(({ data }) => {
103
+ data.findvStaffOffenderListOptions.data['offenderOptionListId'] =
104
+ data.findvStaffOffenderListOptions.data['offenderListOptionId'];
105
+ return data.findvStaffOffenderListOptions.data;
106
+ }));
107
+ /*return of([
108
+ { offenderListOptionId: 'genderCode', name: '', selectedFlag: true }]);*/
109
+ }
110
+ clearAll() {
111
+ this.connection.promise.then((child) => {
112
+ child.clearAll();
113
+ this.offenderSubject.next();
114
+ this.staffSubject.next();
115
+ });
116
+ }
117
+ /*************************************
118
+ * Offender
119
+ **************************************/
120
+ setSelectedOffender(selectedOffender) {
121
+ this.connection.promise.then((child) => {
122
+ child.setSelectedOffender(selectedOffender);
123
+ this.offenderSubject.next(selectedOffender);
124
+ });
125
+ }
126
+ getSelectedOffender() {
127
+ return this.connection.promise.then((child) => child.getSelectedOffender(StorageKey.selectedOffender));
128
+ }
129
+ clearSelectedOffender() {
130
+ this.connection.promise.then((child) => {
131
+ child.clearSelectedOffender();
132
+ this.offenderSubject.next();
133
+ });
134
+ }
135
+ getOffenderUpdate() {
136
+ return this.offenderSubject.asObservable();
137
+ }
138
+ /************************************************************************
139
+ * Staff
140
+ ************************************************************************/
141
+ setLoginStaff(loginStaff) {
142
+ this.connection.promise.then((child) => {
143
+ child.setLoginStaff(loginStaff);
144
+ this.staffSubject.next(loginStaff);
145
+ });
146
+ }
147
+ getLoginStaff() {
148
+ return this.connection.promise.then((child) => child.getLoginStaff(StorageKey.loginStaff));
149
+ }
150
+ clearLoginStaff() {
151
+ this.connection.promise.then((child) => {
152
+ child.clearLoginStaff();
153
+ this.staffSubject.next();
154
+ });
155
+ }
156
+ getStaffUpdate() {
157
+ return this.staffSubject.asObservable();
158
+ }
159
+ refreshLoginStaffOptions() {
160
+ this.getLoginStaff().then((oldLoginStaff) => {
161
+ this.getStaffOffenderListOptions(oldLoginStaff.staffId).subscribe((optionData) => {
162
+ console.log(optionData);
163
+ oldLoginStaff.options = optionData;
164
+ this.setLoginStaff(oldLoginStaff);
165
+ });
166
+ });
167
+ }
168
+ /************************************************************************
169
+ * Offender Query
170
+ ************************************************************************/
171
+ setOffenderQuery(offenderQuery) {
172
+ this.connection.promise.then((child) => {
173
+ child.setOffenderQuery(offenderQuery);
174
+ this.offenderQuerySubject.next(offenderQuery);
175
+ });
176
+ }
177
+ getOffenderQuery() {
178
+ return this.connection.promise.then((child) => child.getOffenderQuery(StorageKey.offenderQuery));
179
+ }
180
+ clearOffenderQuery() {
181
+ this.connection.promise.then((child) => {
182
+ child.clearOffenderQuery();
183
+ this.offenderQuerySubject.next();
184
+ });
185
+ }
186
+ getOffenderQueryUpdate() {
187
+ return this.offenderQuerySubject.asObservable();
188
+ }
189
+ }
190
+ /** @nocollapse */ /** @nocollapse */ XdmService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: XdmService, deps: [{ token: DOCUMENT }, { token: SMART_WEB_STORAGE_LISTENER_URL }, { token: i1.HttpClient }, { token: SMART_DATA_SERVICE_URL }], target: i0.ɵɵFactoryTarget.Injectable });
191
+ /** @nocollapse */ /** @nocollapse */ XdmService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: XdmService, providedIn: 'root' });
192
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: XdmService, decorators: [{
193
+ type: Injectable,
194
+ args: [{
195
+ providedIn: 'root',
196
+ }]
197
+ }], ctorParameters: function () {
198
+ return [{ type: undefined, decorators: [{
199
+ type: Inject,
200
+ args: [DOCUMENT]
201
+ }] }, { type: undefined, decorators: [{
202
+ type: Inject,
203
+ args: [SMART_WEB_STORAGE_LISTENER_URL]
204
+ }] }, { type: i1.HttpClient }, { type: undefined, decorators: [{
205
+ type: Inject,
206
+ args: [SMART_DATA_SERVICE_URL]
207
+ }] }];
208
+ } });
209
+
210
+ class SmartOffenderHeaderService {
211
+ constructor(smartDataServiceUrl, http) {
212
+ this.smartDataServiceUrl = smartDataServiceUrl;
213
+ this.http = http;
214
+ }
215
+ getStaffOffenders(staffId) {
216
+ const queryString = `
217
+ query getStaffOffenderList{
218
+ filterOffenderList(input: {staffId: ${staffId}}) {
219
+ data {
220
+ offenderId
221
+ offenderName
222
+ pdId
223
+ birthDate
224
+ gender
225
+ }
226
+ }
227
+ }
228
+ `;
229
+ return this.http
230
+ .post(this.smartDataServiceUrl, { query: queryString })
231
+ .pipe(map(({ data }) => {
232
+ return data.filterOffenderList.data;
233
+ }));
234
+ }
235
+ }
236
+ /** @nocollapse */ /** @nocollapse */ SmartOffenderHeaderService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: SmartOffenderHeaderService, deps: [{ token: SMART_DATA_SERVICE_URL }, { token: i1.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
237
+ /** @nocollapse */ /** @nocollapse */ SmartOffenderHeaderService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: SmartOffenderHeaderService });
238
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: SmartOffenderHeaderService, decorators: [{
239
+ type: Injectable
240
+ }], ctorParameters: function () {
241
+ return [{ type: undefined, decorators: [{
242
+ type: Inject,
243
+ args: [SMART_DATA_SERVICE_URL]
244
+ }] }, { type: i1.HttpClient }];
245
+ } });
246
+
247
+ class SmartOffenderHeaderComponent {
248
+ // public isAuthenticated: boolean;
249
+ constructor(xdmService, authnService, smartOffenderHeaderService, router) {
250
+ this.xdmService = xdmService;
251
+ this.authnService = authnService;
252
+ this.smartOffenderHeaderService = smartOffenderHeaderService;
253
+ this.router = router;
254
+ this.selectedOffenderControl$ = new FormControl();
255
+ }
256
+ ngOnInit() {
257
+ // this.isAuthenticated = this.authnService.getAccount() ? true : false;
258
+ this.xdmService.getLoginStaff().then((loginStaff) => {
259
+ this.loginStaff = loginStaff ? loginStaff : null;
260
+ });
261
+ this.xdmService.getSelectedOffender().then((selectedOffender) => {
262
+ this.selectedOffender =
263
+ selectedOffender && selectedOffender.offenderId
264
+ ? selectedOffender
265
+ : null;
266
+ });
267
+ this.subscription = this.xdmService
268
+ .getOffenderUpdate()
269
+ .subscribe((selectedOffender) => {
270
+ this.selectedOffender = selectedOffender;
271
+ this.setSelectedOffenderControl();
272
+ });
273
+ this.xdmService.getOffenderQuery().then((offenderQuery) => {
274
+ if (offenderQuery) {
275
+ this.offenderQueryList = offenderQuery.offenders;
276
+ this.setSelectedOffenderControl();
277
+ }
278
+ });
279
+ this.offenderQuerySubscription = this.xdmService
280
+ .getOffenderQueryUpdate()
281
+ .subscribe((offenderList) => {
282
+ if (offenderList && offenderList.offenders) {
283
+ this.offenderQueryList = [...offenderList.offenders];
284
+ }
285
+ });
286
+ this.selectedOffenderControl$.valueChanges.subscribe((o) => this.onOffenderSelected(o));
287
+ this.router.routeReuseStrategy.shouldReuseRoute = () => {
288
+ return false;
289
+ };
290
+ }
291
+ get isAuthenticated() {
292
+ return this.authnService.instance.getAllAccounts().length > 0;
293
+ }
294
+ ngOnDestroy() {
295
+ this.subscription.unsubscribe();
296
+ }
297
+ onOffenderSelected(offender) {
298
+ if (offender) {
299
+ // const o = offender.offenderName.split(',');
300
+ // if (o.length === 2) {
301
+ // const offenderName = `${o[1]} ${o[0]}`;
302
+ // this.selectedOffender = {
303
+ // offenderId: offender.offenderId,
304
+ // name: offenderName,
305
+ // pdId: offender.pdId,
306
+ // birthDate: offender.birthDate,
307
+ // gender: offender.genderCode,
308
+ // assignmentStaffRelationId: '',
309
+ // intakeFlag: this.loginStaff
310
+ // ? this.hasIntakeRole(this.loginStaff.roles)
311
+ // : false,
312
+ // } as SelectedOffender;
313
+ this.selectedOffender = offender;
314
+ this.xdmService.setSelectedOffender(this.selectedOffender);
315
+ this.reloadCurrentRoute();
316
+ }
317
+ }
318
+ setSelectedOffenderControl() {
319
+ if (this.selectedOffender &&
320
+ this.offenderQueryList &&
321
+ this.offenderQueryList.length > 0) {
322
+ const o = this.offenderQueryList.find((x) => x.offenderId === this.selectedOffender.offenderId);
323
+ if (o) {
324
+ this.selectedOffenderControl$.setValue(o, { emitEvent: false });
325
+ }
326
+ if (!o && this.offenderQueryList.length > 0) {
327
+ this.selectedOffenderControl$.setValue(this.offenderQueryList[0], {
328
+ emitEvent: false,
329
+ });
330
+ }
331
+ }
332
+ }
333
+ reloadCurrentRoute() {
334
+ try {
335
+ const urlTree = this.router.parseUrl(this.router.url);
336
+ if (urlTree &&
337
+ urlTree.root &&
338
+ urlTree.root.segments &&
339
+ urlTree.root.segments.length > 1) {
340
+ this.router.navigate([urlTree.root.segments[0].path]);
341
+ }
342
+ else if (urlTree &&
343
+ urlTree.root &&
344
+ urlTree.root.children &&
345
+ urlTree.root.children.primary &&
346
+ urlTree.root.children.primary.segments &&
347
+ urlTree.root.children.primary.segments.length > 1) {
348
+ this.router.navigate([urlTree.root.children.primary.segments[0].path]);
349
+ }
350
+ else {
351
+ this.router.navigate([this.router.url]);
352
+ }
353
+ }
354
+ catch (_a) {
355
+ this.router.navigateByUrl('/');
356
+ }
357
+ }
358
+ hasIntakeRole(roles) {
359
+ if (roles && roles.length > 0) {
360
+ return roles.findIndex(this.isIntakeRole) > -1;
361
+ }
362
+ return false;
363
+ }
364
+ isIntakeRole(role) {
365
+ switch (role.roleId) {
366
+ case 'OPA':
367
+ case 'OPS':
368
+ case 'SOPS':
369
+ return true;
370
+ default:
371
+ return false;
372
+ }
373
+ }
374
+ }
375
+ /** @nocollapse */ /** @nocollapse */ SmartOffenderHeaderComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: SmartOffenderHeaderComponent, deps: [{ token: XdmService }, { token: i2.MsalService }, { token: SmartOffenderHeaderService }, { token: i2$1.Router }], target: i0.ɵɵFactoryTarget.Component });
376
+ /** @nocollapse */ /** @nocollapse */ SmartOffenderHeaderComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.5", type: SmartOffenderHeaderComponent, selector: "app-smart-offender-header", ngImport: i0, template: "<div\r\n class=\"offender-header-container\"\r\n *ngIf=\"selectedOffender && isAuthenticated\">\r\n <div class=\"offender-header-name-item\">\r\n <mat-form-field appearance=\"standard\" class=\"switch-offender\">\r\n <mat-label>Switch Offender</mat-label>\r\n <mat-select [formControl]=\"selectedOffenderControl$\">\r\n <mat-option\r\n *ngFor=\"let offender of offenderQueryList\"\r\n [value]=\"offender\">\r\n {{ offender?.name}} ({{offender?.offenderId}})\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n <div>\r\n <div class=\"offender-header-id-item\">\r\n <span class=\"item-label\">PDID:</span> {{ selectedOffender.pdId }}\r\n </div>\r\n <div class=\"offender-header-id-item\">\r\n <span class=\"item-label\">CSOSA ID:</span>\r\n {{ selectedOffender.offenderId }}\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".offender-header-container{display:grid;grid-template-columns:2fr 1fr;grid-column-gap:20px;width:100%;margin:4px;background-color:#eae9e9;font-family:Roboto,Helvetica Neue,sans-serif;font-size:14px;font-weight:500;padding-top:8px;justify-items:end}.offender-header-name-item{width:50%}.offender-header-id-item{text-align:left;display:grid;grid-template-columns:80px 80px;margin-top:8px}.switch-offender{width:100%!important}@media only screen and (max-width: 740px){.offender-header-container{display:grid;grid-template-rows:1fr 1fr;grid-template-columns:1fr;align-items:center;background-color:#eae9e9;font-family:Roboto,Helvetica Neue,sans-serif;font-size:14px;font-weight:500;height:100%;margin:4px;padding-left:16px;justify-items:start}.offender-header-name-item{text-align:left}}\n"], components: [{ type: i5.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { type: i6.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { type: i7.MatOption, selector: "mat-option", exportAs: ["matOption"] }], directives: [{ type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i5.MatLabel, selector: "mat-label" }, { type: i7$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i7$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
377
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: SmartOffenderHeaderComponent, decorators: [{
378
+ type: Component,
379
+ args: [{ selector: 'app-smart-offender-header', template: "<div\r\n class=\"offender-header-container\"\r\n *ngIf=\"selectedOffender && isAuthenticated\">\r\n <div class=\"offender-header-name-item\">\r\n <mat-form-field appearance=\"standard\" class=\"switch-offender\">\r\n <mat-label>Switch Offender</mat-label>\r\n <mat-select [formControl]=\"selectedOffenderControl$\">\r\n <mat-option\r\n *ngFor=\"let offender of offenderQueryList\"\r\n [value]=\"offender\">\r\n {{ offender?.name}} ({{offender?.offenderId}})\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n <div>\r\n <div class=\"offender-header-id-item\">\r\n <span class=\"item-label\">PDID:</span> {{ selectedOffender.pdId }}\r\n </div>\r\n <div class=\"offender-header-id-item\">\r\n <span class=\"item-label\">CSOSA ID:</span>\r\n {{ selectedOffender.offenderId }}\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".offender-header-container{display:grid;grid-template-columns:2fr 1fr;grid-column-gap:20px;width:100%;margin:4px;background-color:#eae9e9;font-family:Roboto,Helvetica Neue,sans-serif;font-size:14px;font-weight:500;padding-top:8px;justify-items:end}.offender-header-name-item{width:50%}.offender-header-id-item{text-align:left;display:grid;grid-template-columns:80px 80px;margin-top:8px}.switch-offender{width:100%!important}@media only screen and (max-width: 740px){.offender-header-container{display:grid;grid-template-rows:1fr 1fr;grid-template-columns:1fr;align-items:center;background-color:#eae9e9;font-family:Roboto,Helvetica Neue,sans-serif;font-size:14px;font-weight:500;height:100%;margin:4px;padding-left:16px;justify-items:start}.offender-header-name-item{text-align:left}}\n"] }]
380
+ }], ctorParameters: function () { return [{ type: XdmService }, { type: i2.MsalService }, { type: SmartOffenderHeaderService }, { type: i2$1.Router }]; } });
381
+
382
+ class SmartNavbarService {
383
+ constructor(http) {
384
+ this.http = http;
385
+ }
386
+ /*
387
+ public getNavbarConfigs(): SmartNavbarConfig[] {
388
+ this.configs = [
389
+ {appModuleId: 'SMART', name: 'SMART', url: 'http://localhost:4200', offenderSpecific: false, displayOrder: 1 },
390
+ {appModuleId: 'OFFENDER', name: 'Offender', url: 'http://localhost:4200', offenderSpecific: true, displayOrder: 2 },
391
+ {appModuleId: 'SPRVSN', name: 'Supervision', url: 'http://localhost:4200', offenderSpecific: true, displayOrder: 3 },
392
+ ];
393
+
394
+ return this.configs;
395
+ }
396
+ */
397
+ /*
398
+ public getNavbarConfigs(serviceApiUrl: string): Observable<SmartNavbarConfig[]> {
399
+ return this.http.get<SmartNavbarConfig[]>(serviceApiUrl + '/AppModules');
400
+ }
401
+ */
402
+ getNavbarConfigs(serviceApiUrl) {
403
+ const queryString = `
404
+ {
405
+ findAppModules {
406
+ data {
407
+ appModuleId
408
+ name
409
+ url
410
+ offenderSpecificFlag
411
+ displayOrder
412
+ }
413
+ }
414
+ }`;
415
+ /*
416
+ const httpHeaders = new HttpHeaders({
417
+ 'Content-Type': 'application/json',
418
+ 'Cache-Control': 'no-cache'
419
+ });
420
+ const options = {
421
+ headers: httpHeaders
422
+ };
423
+ */
424
+ return this.http
425
+ .post(serviceApiUrl, { query: queryString })
426
+ .pipe(map(({ data }) => {
427
+ if (isDevMode()) {
428
+ console.log(data);
429
+ }
430
+ return data.findAppModules.data;
431
+ }));
432
+ }
433
+ }
434
+ /** @nocollapse */ /** @nocollapse */ SmartNavbarService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: SmartNavbarService, deps: [{ token: i1.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
435
+ /** @nocollapse */ /** @nocollapse */ SmartNavbarService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: SmartNavbarService });
436
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: SmartNavbarService, decorators: [{
437
+ type: Injectable
438
+ }], ctorParameters: function () { return [{ type: i1.HttpClient }]; } });
439
+
440
+ class SmartNavbarComponent {
441
+ constructor(navbarConfigService, xdmService,
442
+ // private zone: NgZone,
443
+ authnService) {
444
+ this.navbarConfigService = navbarConfigService;
445
+ this.xdmService = xdmService;
446
+ this.authnService = authnService;
447
+ this.appModuleId = 'SMART';
448
+ }
449
+ ngOnChanges() {
450
+ /*
451
+ console.log(this.selectedTab);
452
+ setTimeout(() => {
453
+ this.tabGroup.selectedIndex = this.selectedTab;
454
+ }, 1000);
455
+ */
456
+ }
457
+ ngOnInit() {
458
+ this.xdmService.getSelectedOffender().then((selectedOffender) => {
459
+ this.selectedOffender =
460
+ selectedOffender && selectedOffender.offenderId
461
+ ? selectedOffender
462
+ : null;
463
+ });
464
+ this.xdmService.getLoginStaff().then((loginStaff) => {
465
+ // this.zone.run(() => {
466
+ this.loginStaff = loginStaff ? loginStaff : null;
467
+ // });
468
+ });
469
+ this.offenderSubscription = this.xdmService
470
+ .getOffenderUpdate()
471
+ .subscribe((selectedOffender) => {
472
+ // this.zone.run(() => {
473
+ this.selectedOffender = selectedOffender;
474
+ // });
475
+ });
476
+ this.staffSubscription = this.xdmService
477
+ .getStaffUpdate()
478
+ .subscribe((loginStaff) => {
479
+ // this.zone.run(() => {
480
+ this.loginStaff = loginStaff;
481
+ // });
482
+ });
483
+ this.navbarConfigService
484
+ .getNavbarConfigs(this.serviceApiUrl)
485
+ .subscribe((configs) => {
486
+ this.navbarConfigs = configs.sort((a, b) => {
487
+ if (a.displayOrder < b.displayOrder) {
488
+ return -1;
489
+ }
490
+ else if (a.displayOrder > b.displayOrder) {
491
+ return 1;
492
+ }
493
+ return 0;
494
+ });
495
+ });
496
+ // this.isAuthenticated = this.authnService.getAccount() ? true : false;
497
+ }
498
+ ngOnDestroy() {
499
+ this.offenderSubscription.unsubscribe();
500
+ this.staffSubscription.unsubscribe();
501
+ }
502
+ logout() {
503
+ this.xdmService.clearAll();
504
+ this.authnService.logout();
505
+ }
506
+ get isAuthenticated() {
507
+ return this.authnService.instance.getAllAccounts().length > 0;
508
+ }
509
+ getAppModuleUrl(config) {
510
+ return config && this.selectedOffender && config.appModuleId === 'PPMAS'
511
+ ? `${config.url}?skipAppMetadata=true&OffenderId=${this.selectedOffender.offenderId}`
512
+ : config.url;
513
+ }
514
+ hasAppModulePermission(appModuleId) {
515
+ if (this.loginStaff &&
516
+ this.loginStaff.permissions &&
517
+ this.loginStaff.permissions.length > 0) {
518
+ return (this.loginStaff.permissions.findIndex((p) => p.appModuleId === appModuleId) > -1);
519
+ }
520
+ return false;
521
+ }
522
+ get hasExternalUserRole() {
523
+ if (this.loginStaff &&
524
+ this.loginStaff.roles &&
525
+ this.loginStaff.roles.length > 0) {
526
+ return this.loginStaff.roles.findIndex(this.isExternalRole) > -1;
527
+ }
528
+ return false;
529
+ }
530
+ isExternalRole(role) {
531
+ switch (role.roleId) {
532
+ case 'EUDTL':
533
+ case 'EUDUSM':
534
+ case 'EUJDG':
535
+ case 'EUMPD':
536
+ case 'EUSOTV':
537
+ case 'EUUSA2':
538
+ case 'EUUSAO':
539
+ case 'EUUSPC':
540
+ return true;
541
+ default:
542
+ return false;
543
+ }
544
+ }
545
+ }
546
+ /** @nocollapse */ /** @nocollapse */ SmartNavbarComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: SmartNavbarComponent, deps: [{ token: SmartNavbarService }, { token: XdmService }, { token: i2.MsalService }], target: i0.ɵɵFactoryTarget.Component });
547
+ /** @nocollapse */ /** @nocollapse */ SmartNavbarComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.5", type: SmartNavbarComponent, selector: "app-smart-navbar", inputs: { serviceApiUrl: "serviceApiUrl", appModuleId: "appModuleId" }, viewQueries: [{ propertyName: "tabGroup", first: true, predicate: ["tabs"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<!--\r\n<a class=\"smart-navbar-toggle open\" href=\"#nav\">\r\n <i class=\"material-icons\">menu</i>\r\n</a>\r\n\r\n<nav id=\"nav\" role=\"navigation\" class=\"smart-navbar-container\">\r\n <a class=\"smart-navbar-toggle close\" href=\"#\">\r\n <i class=\"material-icons\">close</i>\r\n </a>\r\n\r\n <span *ngFor=\"let config of navbarConfigs\">\r\n <a mat-button class=\"smart-navbar-item\" \r\n *ngIf=\"(config.offenderSpecificFlag === false || selectedOffender) && isAuthenticated && loginStaff\" href=\"{{config.url}}\">{{config.name}}</a>\r\n </span>\r\n\r\n <button mat-button class=\"smart-navbar-item\" [matMenuTriggerFor]=\"menuTheme\">Set Theme</button>\r\n <mat-menu #menuTheme=\"matMenu\">\r\n <button mat-menu-item (click)=\"onSetTheme('blue-theme')\">Blue</button>\r\n <button mat-menu-item (click)=\"onSetTheme('red-theme')\">Red</button>\r\n <button mat-menu-item (click)=\"onSetTheme('green-theme')\">Green</button>\r\n </mat-menu>\r\n <button mat-button class=\"smart-navbar-item smart-navbar-last-item\" [matMenuTriggerFor]=\"menu\"\r\n *ngIf=\"isAuthenticated && loginStaff\">{{loginStaff.firstName + ' ' + loginStaff.lastName}}</button>\r\n <mat-menu #menu=\"matMenu\">\r\n <button mat-menu-item>Profile</button>\r\n <button mat-menu-item (click)=\"logout()\">Sign Out</button>\r\n </mat-menu>\r\n</nav>\r\n-->\r\n\r\n<!-- <nav mat-tab-nav-bar>\r\n <a mat-tab-link mat-flat-button *ngFor=\"let config of navbarConfigs\" [active]=\"appModuleId == config.appModuleId\" href=\"{{config.url}}\">{{config.name}}</a>\r\n</nav> -->\r\n\r\n<mat-tab-group class=\"nav-tab-group\" [selectedIndex]=\"null\">\r\n <ng-container *ngFor=\"let config of navbarConfigs\">\r\n <mat-tab\r\n *ngIf=\"\r\n ((hasExternalUserRole && hasAppModulePermission(config.appModuleId)) ||\r\n (!hasExternalUserRole && (config.offenderSpecificFlag === false || selectedOffender))) &&\r\n isAuthenticated &&\r\n loginStaff \r\n \"\r\n label=\"config.name\"\r\n >\r\n <ng-template mat-tab-label>\r\n <a\r\n mat-flat-button\r\n [ngClass]=\"{ 'main-menu-active': appModuleId == config.appModuleId }\"\r\n [href]=\"getAppModuleUrl(config)\"\r\n >{{ config.name }}</a\r\n >\r\n </ng-template>\r\n </mat-tab>\r\n </ng-container>\r\n</mat-tab-group>\r\n", styles: [".smart-navbar-container{display:flex;flex-wrap:wrap;flex-direction:column}.smart-navbar-item{font-size:1.2rem;line-height:1.2rem;padding:.5rem;background-color:var(--primary-color, #9fa8da);-webkit-text-decoration-line:none;text-decoration-line:none;display:block;text-align:left;border-radius:.3rem;margin:.1rem}.smart-navbar-last-item{margin-left:auto}.main-menu-active{border-bottom:3px solid darkblue!important;border-radius:0!important}.nav-tab-group.mat-primary .mat-ink-bar{background-color:inherit!important}.mat-tab-links{flex-direction:row;margin:4px;flex-wrap:wrap;font-family:Roboto,arial,sans-serif;font-size:13px}.mat-tab-link{min-width:16px!important}@media only screen and (min-width: 768px){.smart-navbar-container{flex-direction:row}.smart-navbar-item{text-align:center}.smart-navbar-toggle{display:none}}@media only screen and (max-width: 767px){#nav{position:fixed;top:0;bottom:0;width:300px;left:-340px;transition:transform .3s ease-in-out}#nav:target{transform:translate(340px)}}.mat-tab-labels{display:flex!important;justify-content:flex-start!important}.mat-tab-label,.mat-tab-label.mat-tab-label-active{min-width:25px!important;padding:0 5px!important;justify-content:flex-start!important;font-weight:700}\n"], components: [{ type: i4.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "disableRipple"], exportAs: ["matTabGroup"] }, { type: i4.MatTab, selector: "mat-tab", inputs: ["disabled", "label", "aria-label", "aria-labelledby", "labelClass", "bodyClass"], exportAs: ["matTab"] }, { type: i5$1.MatAnchor, selector: "a[mat-button], a[mat-raised-button], a[mat-icon-button], a[mat-fab], a[mat-mini-fab], a[mat-stroked-button], a[mat-flat-button]", inputs: ["disabled", "disableRipple", "color", "tabIndex"], exportAs: ["matButton", "matAnchor"] }], directives: [{ type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.MatTabLabel, selector: "[mat-tab-label], [matTabLabel]" }, { type: i8.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], encapsulation: i0.ViewEncapsulation.None });
548
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: SmartNavbarComponent, decorators: [{
549
+ type: Component,
550
+ args: [{ selector: 'app-smart-navbar', encapsulation: ViewEncapsulation.None, template: "<!--\r\n<a class=\"smart-navbar-toggle open\" href=\"#nav\">\r\n <i class=\"material-icons\">menu</i>\r\n</a>\r\n\r\n<nav id=\"nav\" role=\"navigation\" class=\"smart-navbar-container\">\r\n <a class=\"smart-navbar-toggle close\" href=\"#\">\r\n <i class=\"material-icons\">close</i>\r\n </a>\r\n\r\n <span *ngFor=\"let config of navbarConfigs\">\r\n <a mat-button class=\"smart-navbar-item\" \r\n *ngIf=\"(config.offenderSpecificFlag === false || selectedOffender) && isAuthenticated && loginStaff\" href=\"{{config.url}}\">{{config.name}}</a>\r\n </span>\r\n\r\n <button mat-button class=\"smart-navbar-item\" [matMenuTriggerFor]=\"menuTheme\">Set Theme</button>\r\n <mat-menu #menuTheme=\"matMenu\">\r\n <button mat-menu-item (click)=\"onSetTheme('blue-theme')\">Blue</button>\r\n <button mat-menu-item (click)=\"onSetTheme('red-theme')\">Red</button>\r\n <button mat-menu-item (click)=\"onSetTheme('green-theme')\">Green</button>\r\n </mat-menu>\r\n <button mat-button class=\"smart-navbar-item smart-navbar-last-item\" [matMenuTriggerFor]=\"menu\"\r\n *ngIf=\"isAuthenticated && loginStaff\">{{loginStaff.firstName + ' ' + loginStaff.lastName}}</button>\r\n <mat-menu #menu=\"matMenu\">\r\n <button mat-menu-item>Profile</button>\r\n <button mat-menu-item (click)=\"logout()\">Sign Out</button>\r\n </mat-menu>\r\n</nav>\r\n-->\r\n\r\n<!-- <nav mat-tab-nav-bar>\r\n <a mat-tab-link mat-flat-button *ngFor=\"let config of navbarConfigs\" [active]=\"appModuleId == config.appModuleId\" href=\"{{config.url}}\">{{config.name}}</a>\r\n</nav> -->\r\n\r\n<mat-tab-group class=\"nav-tab-group\" [selectedIndex]=\"null\">\r\n <ng-container *ngFor=\"let config of navbarConfigs\">\r\n <mat-tab\r\n *ngIf=\"\r\n ((hasExternalUserRole && hasAppModulePermission(config.appModuleId)) ||\r\n (!hasExternalUserRole && (config.offenderSpecificFlag === false || selectedOffender))) &&\r\n isAuthenticated &&\r\n loginStaff \r\n \"\r\n label=\"config.name\"\r\n >\r\n <ng-template mat-tab-label>\r\n <a\r\n mat-flat-button\r\n [ngClass]=\"{ 'main-menu-active': appModuleId == config.appModuleId }\"\r\n [href]=\"getAppModuleUrl(config)\"\r\n >{{ config.name }}</a\r\n >\r\n </ng-template>\r\n </mat-tab>\r\n </ng-container>\r\n</mat-tab-group>\r\n", styles: [".smart-navbar-container{display:flex;flex-wrap:wrap;flex-direction:column}.smart-navbar-item{font-size:1.2rem;line-height:1.2rem;padding:.5rem;background-color:var(--primary-color, #9fa8da);-webkit-text-decoration-line:none;text-decoration-line:none;display:block;text-align:left;border-radius:.3rem;margin:.1rem}.smart-navbar-last-item{margin-left:auto}.main-menu-active{border-bottom:3px solid darkblue!important;border-radius:0!important}.nav-tab-group.mat-primary .mat-ink-bar{background-color:inherit!important}.mat-tab-links{flex-direction:row;margin:4px;flex-wrap:wrap;font-family:Roboto,arial,sans-serif;font-size:13px}.mat-tab-link{min-width:16px!important}@media only screen and (min-width: 768px){.smart-navbar-container{flex-direction:row}.smart-navbar-item{text-align:center}.smart-navbar-toggle{display:none}}@media only screen and (max-width: 767px){#nav{position:fixed;top:0;bottom:0;width:300px;left:-340px;transition:transform .3s ease-in-out}#nav:target{transform:translate(340px)}}.mat-tab-labels{display:flex!important;justify-content:flex-start!important}.mat-tab-label,.mat-tab-label.mat-tab-label-active{min-width:25px!important;padding:0 5px!important;justify-content:flex-start!important;font-weight:700}\n"] }]
551
+ }], ctorParameters: function () { return [{ type: SmartNavbarService }, { type: XdmService }, { type: i2.MsalService }]; }, propDecorators: { serviceApiUrl: [{
552
+ type: Input
553
+ }], appModuleId: [{
554
+ type: Input
555
+ }], tabGroup: [{
556
+ type: ViewChild,
557
+ args: ['tabs']
558
+ }] } });
559
+
560
+ class SmartErrorComponent {
561
+ constructor(authnService, route, smartWebPortalUrl) {
562
+ this.authnService = authnService;
563
+ this.route = route;
564
+ this.smartWebPortalUrl = smartWebPortalUrl;
565
+ }
566
+ ngOnInit() {
567
+ this.type = this.route.snapshot.queryParamMap.get('type') || 'staff';
568
+ this.message =
569
+ this.route.snapshot.queryParamMap.get('message') || 'Error occured.';
570
+ }
571
+ logout() {
572
+ this.authnService.logout();
573
+ }
574
+ portal() {
575
+ window.location.href = this.smartWebPortalUrl;
576
+ }
577
+ }
578
+ /** @nocollapse */ /** @nocollapse */ SmartErrorComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: SmartErrorComponent, deps: [{ token: i2.MsalService }, { token: i2$1.ActivatedRoute }, { token: SMART_WEB_PORTAL_URL }], target: i0.ɵɵFactoryTarget.Component });
579
+ /** @nocollapse */ /** @nocollapse */ SmartErrorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.5", type: SmartErrorComponent, selector: "app-smart-error", ngImport: i0, template: "<div>\r\n <h2>\r\n {{ message }}\r\n </h2>\r\n <p>\r\n Please contact help desk if needed.\r\n </p>\r\n <div>\r\n <button (click)=\"logout()\" *ngIf=\"type === 'staff'\">OK</button>\r\n <button (click)=\"portal()\" *ngIf=\"type === 'offender'\">OK</button>\r\n </div>\r\n</div>\r\n", styles: ["div{text-align:center}\n"], directives: [{ type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
580
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: SmartErrorComponent, decorators: [{
581
+ type: Component,
582
+ args: [{ selector: 'app-smart-error', template: "<div>\r\n <h2>\r\n {{ message }}\r\n </h2>\r\n <p>\r\n Please contact help desk if needed.\r\n </p>\r\n <div>\r\n <button (click)=\"logout()\" *ngIf=\"type === 'staff'\">OK</button>\r\n <button (click)=\"portal()\" *ngIf=\"type === 'offender'\">OK</button>\r\n </div>\r\n</div>\r\n", styles: ["div{text-align:center}\n"] }]
583
+ }], ctorParameters: function () {
584
+ return [{ type: i2.MsalService }, { type: i2$1.ActivatedRoute }, { type: undefined, decorators: [{
585
+ type: Inject,
586
+ args: [SMART_WEB_PORTAL_URL]
587
+ }] }];
588
+ } });
589
+
590
+ class SmartStaffOffenderOptionsService {
591
+ constructor(http, matSnackBar, serviceApiUrl) {
592
+ this.http = http;
593
+ this.matSnackBar = matSnackBar;
594
+ this.serviceApiUrl = serviceApiUrl;
595
+ }
596
+ showMessage(message) {
597
+ this.matSnackBar.open(message, null, {
598
+ duration: 2000,
599
+ });
600
+ }
601
+ convertEmptyToNull(jsonObject) {
602
+ if (!jsonObject) {
603
+ return;
604
+ }
605
+ if (jsonObject instanceof Array) {
606
+ jsonObject.forEach(obj => {
607
+ this.convertEmptyToNull(obj);
608
+ });
609
+ }
610
+ const keys = Object.keys(jsonObject);
611
+ keys.forEach(key => {
612
+ if (typeof jsonObject[key] === 'object') {
613
+ this.convertEmptyToNull(jsonObject[key]);
614
+ }
615
+ else if (typeof jsonObject[key] === 'string' && jsonObject[key].trim() === '') {
616
+ jsonObject[key] = null;
617
+ }
618
+ });
619
+ }
620
+ getGraphQueryData(queryName, queryString) {
621
+ return this.http
622
+ .post(this.serviceApiUrl, { query: queryString })
623
+ .pipe(map(({ data }) => {
624
+ return data[queryName];
625
+ }));
626
+ }
627
+ getOffenderListOptions() {
628
+ const queryName = 'findOffenderListOptions';
629
+ const queryString = `{
630
+ ${queryName} {
631
+ data {
632
+ offenderListOptionId
633
+ name
634
+ serviceApiFieldName
635
+ }
636
+ message
637
+ }
638
+ }`;
639
+ return this.getGraphQueryData(queryName, queryString);
640
+ }
641
+ getStaffOffenderListOptions(staffId) {
642
+ const queryString = `{findStaffOffenderListOptions(input:{
643
+ where:{
644
+ staffId: ${staffId}
645
+ }
646
+ }){
647
+ data{
648
+ offenderListOptionId
649
+ }
650
+ } }`;
651
+ return this.http
652
+ .post(this.serviceApiUrl, { query: queryString })
653
+ .pipe(map(({ data }) => {
654
+ return data.findStaffOffenderListOptions.data;
655
+ }));
656
+ }
657
+ saveStaffOffenderListOptionsData(dataToSave) {
658
+ // this.convertEmptyToNull(dataToSave);
659
+ const queryName = 'upsertStaffOffenderListOption';
660
+ const query = `mutation {
661
+ upsertStaffOffenderListOption(input: ${this.convertToString(dataToSave)}) {
662
+ message
663
+ }
664
+ }`;
665
+ ;
666
+ return this.http
667
+ .post(this.serviceApiUrl, { query });
668
+ /*.pipe(
669
+ map(({ data }) => {
670
+ return data[queryName];
671
+ }));*/
672
+ }
673
+ convertToString(obj) {
674
+ let result = '';
675
+ if (!obj) {
676
+ return result;
677
+ }
678
+ if (obj instanceof Array) {
679
+ result += ' [';
680
+ obj.forEach(eObj => {
681
+ result += this.convertToString(eObj);
682
+ });
683
+ result += '],';
684
+ }
685
+ else {
686
+ result += '{';
687
+ const keys = Object.keys(obj);
688
+ keys.forEach((key) => {
689
+ if (typeof obj[key] === 'object') {
690
+ result += key + ':' + this.convertToString(obj[key]);
691
+ }
692
+ else {
693
+ if (isNaN(obj[key])) {
694
+ result += key + ':"' + obj[key] + '",';
695
+ }
696
+ else {
697
+ result += key + ':' + obj[key] + ',';
698
+ }
699
+ }
700
+ });
701
+ result = result.substring(0, result.length - 1);
702
+ result += '},';
703
+ }
704
+ return result;
705
+ }
706
+ }
707
+ /** @nocollapse */ /** @nocollapse */ SmartStaffOffenderOptionsService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: SmartStaffOffenderOptionsService, deps: [{ token: i1.HttpClient }, { token: i2$2.MatSnackBar }, { token: SMART_DATA_SERVICE_URL }], target: i0.ɵɵFactoryTarget.Injectable });
708
+ /** @nocollapse */ /** @nocollapse */ SmartStaffOffenderOptionsService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: SmartStaffOffenderOptionsService });
709
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: SmartStaffOffenderOptionsService, decorators: [{
710
+ type: Injectable
711
+ }], ctorParameters: function () {
712
+ return [{ type: i1.HttpClient }, { type: i2$2.MatSnackBar }, { type: undefined, decorators: [{
713
+ type: Inject,
714
+ args: [SMART_DATA_SERVICE_URL]
715
+ }] }];
716
+ } });
717
+
718
+ class SmartStaffOffenderOptionsComponent {
719
+ constructor(route, offenderService, xdmService) {
720
+ this.route = route;
721
+ this.offenderService = offenderService;
722
+ this.xdmService = xdmService;
723
+ this.offenderListOptions = [];
724
+ }
725
+ ngOnInit() {
726
+ const routData = this.route.snapshot.data;
727
+ this.loginStaff = routData.loginStaff;
728
+ this.offenderListOptions = routData.selectedOffenderResolverService;
729
+ this.frmGroup = this.createForm();
730
+ this.offenderService.getStaffOffenderListOptions(this.loginStaff.staffId).subscribe(data => {
731
+ this.fillForm(data);
732
+ });
733
+ }
734
+ fillForm(data) {
735
+ if (data) {
736
+ const offenderListOptionsFg = this.frmGroup.get('offenderListOptions');
737
+ data.forEach(element => {
738
+ offenderListOptionsFg.get(element.offenderListOptionId).setValue(true);
739
+ });
740
+ }
741
+ }
742
+ createForm() {
743
+ const offenderListOptionsFg = new FormGroup({});
744
+ this.offenderListOptions.forEach((dt, i) => {
745
+ offenderListOptionsFg.addControl(dt.offenderListOptionId, new FormControl(false));
746
+ });
747
+ return new FormGroup({
748
+ offenderListOptions: offenderListOptionsFg,
749
+ });
750
+ }
751
+ onSave() {
752
+ const data = {
753
+ options: [],
754
+ staffId: this.loginStaff.staffId,
755
+ modifiedBy: this.loginStaff.staffId
756
+ };
757
+ const offenderListOptionsVal = this.frmGroup.get('offenderListOptions').value;
758
+ const keys = Object.keys(offenderListOptionsVal);
759
+ keys.forEach(key => {
760
+ if (offenderListOptionsVal[key]) {
761
+ data.options.push({ 'offenderListOptionId': key });
762
+ }
763
+ });
764
+ this.offenderService.saveStaffOffenderListOptionsData(data).subscribe(rtrDatea => {
765
+ if (rtrDatea.message) {
766
+ this.offenderService.showMessage(rtrDatea.message);
767
+ }
768
+ else {
769
+ this.offenderService.showMessage('Saved successfully');
770
+ this.xdmService.refreshLoginStaffOptions();
771
+ }
772
+ });
773
+ }
774
+ }
775
+ /** @nocollapse */ /** @nocollapse */ SmartStaffOffenderOptionsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: SmartStaffOffenderOptionsComponent, deps: [{ token: i2$1.ActivatedRoute }, { token: SmartStaffOffenderOptionsService }, { token: XdmService }], target: i0.ɵɵFactoryTarget.Component });
776
+ /** @nocollapse */ /** @nocollapse */ SmartStaffOffenderOptionsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.5", type: SmartStaffOffenderOptionsComponent, selector: "lib-smart-staff-offender-options", ngImport: i0, template: "<form class=\"main-form\" [formGroup]=\"frmGroup\">\r\n <mat-card role=\"group\">\r\n <mat-card-content>\r\n <div formGroupName=\"offenderListOptions\">\r\n <div style=\"float:left;\">\r\n <div *ngFor=\"let offenderListOption of offenderListOptions; let i = index\">\r\n <mat-checkbox *ngIf=\"i%2!=0\" color=\"primary\" formControlName=\"{{offenderListOption.offenderListOptionId}}\">\r\n {{offenderListOption.name}}\r\n </mat-checkbox>\r\n </div>\r\n </div>\r\n <div>\r\n <div *ngFor=\"let offenderListOption of offenderListOptions; let i = index\" >\r\n <mat-checkbox *ngIf=\"i%2==0\" color=\"primary\" formControlName=\"{{offenderListOption.offenderListOptionId}}\">\r\n {{offenderListOption.name}}\r\n </mat-checkbox> \r\n </div>\r\n </div>\r\n </div>\r\n </mat-card-content>\r\n <div align=\"center\">\r\n <button mat-raised-button color=\"accent\" (click)=\"onSave()\">Save</button>\r\n </div>\r\n </mat-card>\r\n </form>\r\n ", styles: [""], components: [{ type: i4$1.MatCard, selector: "mat-card", exportAs: ["matCard"] }, { type: i5$2.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex", "aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { type: i5$1.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }], directives: [{ type: i7$1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i7$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i7$1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i4$1.MatCardContent, selector: "mat-card-content, [mat-card-content], [matCardContent]" }, { type: i7$1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i7$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i7$1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }] });
777
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: SmartStaffOffenderOptionsComponent, decorators: [{
778
+ type: Component,
779
+ args: [{ selector: 'lib-smart-staff-offender-options', template: "<form class=\"main-form\" [formGroup]=\"frmGroup\">\r\n <mat-card role=\"group\">\r\n <mat-card-content>\r\n <div formGroupName=\"offenderListOptions\">\r\n <div style=\"float:left;\">\r\n <div *ngFor=\"let offenderListOption of offenderListOptions; let i = index\">\r\n <mat-checkbox *ngIf=\"i%2!=0\" color=\"primary\" formControlName=\"{{offenderListOption.offenderListOptionId}}\">\r\n {{offenderListOption.name}}\r\n </mat-checkbox>\r\n </div>\r\n </div>\r\n <div>\r\n <div *ngFor=\"let offenderListOption of offenderListOptions; let i = index\" >\r\n <mat-checkbox *ngIf=\"i%2==0\" color=\"primary\" formControlName=\"{{offenderListOption.offenderListOptionId}}\">\r\n {{offenderListOption.name}}\r\n </mat-checkbox> \r\n </div>\r\n </div>\r\n </div>\r\n </mat-card-content>\r\n <div align=\"center\">\r\n <button mat-raised-button color=\"accent\" (click)=\"onSave()\">Save</button>\r\n </div>\r\n </mat-card>\r\n </form>\r\n ", styles: [""] }]
780
+ }], ctorParameters: function () { return [{ type: i2$1.ActivatedRoute }, { type: SmartStaffOffenderOptionsService }, { type: XdmService }]; } });
781
+
782
+ // import { stringify } from 'querystring';
783
+ class SmartAuthService {
784
+ constructor(http, authnService, xdmService, smartDataServiceUrl, smartDomainFormatUrl) {
785
+ this.http = http;
786
+ this.authnService = authnService;
787
+ this.xdmService = xdmService;
788
+ this.smartDataServiceUrl = smartDataServiceUrl;
789
+ this.smartDomainFormatUrl = smartDomainFormatUrl;
790
+ }
791
+ getLoginStaff() {
792
+ if (isDevMode) {
793
+ console.log('SmartAuthService - getLoginStaff()');
794
+ }
795
+ if (!isDevMode && this.loginStaff) {
796
+ if (this.loginStaff.staffId) {
797
+ if (isDevMode) {
798
+ console.log('##### getLoginStaff(): get internal instance in service', this.loginStaff);
799
+ }
800
+ return of(this.loginStaff);
801
+ }
802
+ else if (this.loginStaff.userName) {
803
+ if (isDevMode) {
804
+ console.log('##### getLoginStaff(): get using preset user name', this.loginStaff);
805
+ }
806
+ return this.getStaff(this.loginStaff.userName);
807
+ }
808
+ }
809
+ return from(this.xdmService.getLoginStaff()).pipe(switchMap((storedResult) => {
810
+ if (storedResult && storedResult.staffId) {
811
+ if (isDevMode) {
812
+ console.log('##### getLoginStaff(): get from session.', storedResult);
813
+ }
814
+ this.loginStaff = storedResult;
815
+ return of(storedResult);
816
+ }
817
+ else if (storedResult && storedResult.userName) {
818
+ if (isDevMode) {
819
+ console.log('##### getLoginStaff(): get using preset user name', this.loginStaff);
820
+ }
821
+ return this.getStaff(storedResult.userName);
822
+ }
823
+ else {
824
+ const userName = this.userName;
825
+ const staffName = userName.substring(0, userName.indexOf('@'));
826
+ if (isDevMode) {
827
+ console.log('##### loginLoginStaff(): get using login staff name ', staffName);
828
+ }
829
+ return this.getStaff(staffName);
830
+ }
831
+ }));
832
+ }
833
+ get userName() {
834
+ if (this.authnService.instance.getAllAccounts().length > 0) {
835
+ const account = this.authnService.instance.getAllAccounts()[0];
836
+ return account.username;
837
+ }
838
+ return '';
839
+ }
840
+ getTeamUrl(app, afterHash) {
841
+ return this.smartDomainFormatUrl.replace('${APP}', app) + afterHash;
842
+ }
843
+ isSameHost(url, app) {
844
+ return this.smartDomainFormatUrl.replace('${APP}', app) === url;
845
+ }
846
+ redirectToTeam(loginStaff) {
847
+ if (loginStaff.roles.findIndex((role) => role.roleId === 'EUUSPC') > -1) {
848
+ if (!this.isSameHost(window.location.origin, 'investigation')) {
849
+ window.location.href = this.getTeamUrl('investigation', '/assignment');
850
+ }
851
+ }
852
+ else if (loginStaff.roles.findIndex((role) => role.roleId.substring(0, 3) === 'RSC') > -1) {
853
+ if (!this.isSameHost(window.location.origin, 'rsc')) {
854
+ window.location.href = this.getTeamUrl('rsc', '/offender-list');
855
+ }
856
+ }
857
+ }
858
+ setSelectedOffender(selectedOffender) {
859
+ return __awaiter(this, void 0, void 0, function* () {
860
+ if (selectedOffender) {
861
+ // if (!selectedOffender.assignmentStaffRelationId) {
862
+ const relation = yield this.getStaffOffenderRelation(this.loginStaff.staffId, selectedOffender.offenderId).toPromise();
863
+ if (relation) {
864
+ selectedOffender.assignmentStaffRelationId = relation;
865
+ }
866
+ else {
867
+ selectedOffender.assignmentStaffRelationId = 'NOASSIGN';
868
+ }
869
+ // }
870
+ }
871
+ this.xdmService.setSelectedOffender(selectedOffender);
872
+ this.selectedOffender = selectedOffender;
873
+ });
874
+ }
875
+ logout() {
876
+ this.xdmService.clearAll();
877
+ this.authnService.logout();
878
+ }
879
+ setPermission(appModuleId, route) {
880
+ return __awaiter(this, void 0, void 0, function* () {
881
+ if (!this.loginStaff) {
882
+ this.loginStaff = yield this.xdmService.getLoginStaff();
883
+ }
884
+ const permissions = this.loginStaff.permissions;
885
+ const resource = (route.url && route.url.length > 0) ? route.url[0].path : '';
886
+ if (!this.selectedOffender) {
887
+ this.selectedOffender = yield this.xdmService.getSelectedOffender();
888
+ }
889
+ if (this.selectedOffender) {
890
+ // if (!this.selectedOffender.assignmentStaffRelationId) {
891
+ const relation = yield this.getStaffOffenderRelation(this.loginStaff.staffId, this.selectedOffender.offenderId).toPromise();
892
+ if (relation) {
893
+ this.selectedOffender.assignmentStaffRelationId = relation;
894
+ }
895
+ else {
896
+ this.selectedOffender.assignmentStaffRelationId = 'NOASSIGN';
897
+ }
898
+ this.xdmService.setSelectedOffender(this.selectedOffender);
899
+ // }
900
+ }
901
+ const assignmentStaffRelationId = this.selectedOffender
902
+ .assignmentStaffRelationId;
903
+ const elements = document.querySelectorAll('[class^="sac-"]');
904
+ const pattern = /^sac-(\S+)-(\S+)$/i;
905
+ Array.from(elements).forEach((element) => {
906
+ let hide;
907
+ let disable;
908
+ element.classList.forEach((c) => {
909
+ const results = c.match(pattern);
910
+ // console.log(results);
911
+ if (results && results.length > 2) {
912
+ const roleId = results[1] ? results[1].toUpperCase() : null;
913
+ const right = results[2];
914
+ // console.log(results[0]);
915
+ // console.log(results[1]);
916
+ // console.log(results[2]);
917
+ const permission = permissions.find(function (p) {
918
+ return (p.appModuleId === appModuleId &&
919
+ p.resource === resource &&
920
+ p.roleId === roleId &&
921
+ p.assignmentStaffRelationId === assignmentStaffRelationId);
922
+ });
923
+ /*
924
+ console.log('##### setPermission() resource: ', resource);
925
+ console.log('##### setPermission() appModuleId: ', appModuleId);
926
+ console.log('##### setPermission() roleId: ', roleId);
927
+ console.log(
928
+ '##### setPermission() assignment relation: ',
929
+ assignmentStaffRelationId,
930
+ );
931
+ */
932
+ console.log('##### Matched permission: ', permission);
933
+ if (permission) {
934
+ if (right === 'read') {
935
+ if (!permission.readFlag) {
936
+ if (hide !== false) {
937
+ hide = true;
938
+ }
939
+ }
940
+ else {
941
+ hide = false;
942
+ }
943
+ }
944
+ else if ((right === 'create' && !permission.createFlag) ||
945
+ (right === 'update' && !permission.updateFlag) ||
946
+ (right === 'delete' && !permission.deleteFlag) ||
947
+ (right === 'assign' && !permission.assignFlag) ||
948
+ (right === 'close' && !permission.closeFlag) ||
949
+ (right === 'expunge' && !permission.expungeFlag) ||
950
+ (right === 'reopen' && !permission.reopenFlag)) {
951
+ if (element.nodeName === 'BUTTON') {
952
+ if (hide !== false) {
953
+ hide = true;
954
+ }
955
+ }
956
+ else {
957
+ if (disable !== false) {
958
+ disable = true;
959
+ }
960
+ }
961
+ }
962
+ else {
963
+ if (element.nodeName === 'BUTTON') {
964
+ hide = false;
965
+ }
966
+ else {
967
+ disable = false;
968
+ }
969
+ }
970
+ }
971
+ else {
972
+ if (right === 'read') {
973
+ if (hide !== false) {
974
+ hide = true;
975
+ }
976
+ }
977
+ else if (element.nodeName === 'BUTTON') {
978
+ if (hide !== false) {
979
+ hide = true;
980
+ }
981
+ }
982
+ else if (disable !== false) {
983
+ disable = true;
984
+ }
985
+ }
986
+ }
987
+ });
988
+ console.log('hide: ', hide);
989
+ console.log('disable: ', disable);
990
+ if (hide === true) {
991
+ this.hideHtmlElement(element);
992
+ }
993
+ else if (disable === true) {
994
+ this.disableHtmlElement(element);
995
+ }
996
+ });
997
+ });
998
+ }
999
+ checkPermission(accessControlConfig) {
1000
+ const selData = accessControlConfig.route.data;
1001
+ this.loginStaff = selData.loginStaff;
1002
+ this.selectedOffender = selData.selectedOffender;
1003
+ let routePath = '';
1004
+ if (accessControlConfig.route.url && accessControlConfig.route.url.length > 0) {
1005
+ routePath = accessControlConfig.route.url[0].path;
1006
+ }
1007
+ const permissions = this.loginStaff.permissions;
1008
+ const resource = routePath;
1009
+ const roleId = accessControlConfig.roleId
1010
+ ? accessControlConfig.roleId.toUpperCase()
1011
+ : null;
1012
+ const accessType = accessControlConfig.accessType;
1013
+ const assignmentStaffRelationId = !this.selectedOffender
1014
+ .assignmentStaffRelationId
1015
+ ? 'N/A'
1016
+ : this.selectedOffender.assignmentStaffRelationId;
1017
+ const permission = permissions.find((p) => {
1018
+ return (p.appModuleId === accessControlConfig.appModuleId
1019
+ && p.resource === resource
1020
+ && (!roleId || p.roleId === roleId)
1021
+ && (p.assignmentStaffRelationId === 'N/A' ||
1022
+ p.assignmentStaffRelationId === assignmentStaffRelationId));
1023
+ });
1024
+ if (permission) {
1025
+ if (accessType === 'read') {
1026
+ if (!permission.readFlag) {
1027
+ return false;
1028
+ }
1029
+ else {
1030
+ return true;
1031
+ }
1032
+ }
1033
+ else if ((accessType === 'create' && !permission.createFlag) ||
1034
+ (accessType === 'update' && !permission.updateFlag) ||
1035
+ (accessType === 'delete' && !permission.deleteFlag) ||
1036
+ (accessType === 'assign' && !permission.assignFlag) ||
1037
+ (accessType === 'close' && !permission.closeFlag) ||
1038
+ (accessType === 'expunge' && !permission.expungeFlag) ||
1039
+ (accessType === 'reopen' && !permission.reopenFlag)) {
1040
+ return false;
1041
+ }
1042
+ else {
1043
+ return true;
1044
+ }
1045
+ }
1046
+ else {
1047
+ if (accessType === 'read') {
1048
+ return false;
1049
+ }
1050
+ }
1051
+ return false;
1052
+ }
1053
+ canAppFeatureActivate(loginStaff, feature, appModuleId = null) {
1054
+ // if (!this.isAuthEnable(loginStaff.roles, appModuleId)) {
1055
+ // return true;
1056
+ // }
1057
+ return this.hasAppFeaturePermission(loginStaff.permissions, feature, appModuleId);
1058
+ }
1059
+ // public isAuthEnable(roles: Role[], appModuleId: string) {
1060
+ // if (roles && roles.length > 0) {
1061
+ // return roles.map(r => r.roleId).findIndex(this.isExternalRole) > -1 || appModuleId === 'RR';
1062
+ // }
1063
+ // return false;
1064
+ // }
1065
+ hasIntakeRole(roles) {
1066
+ if (roles && roles.length > 0) {
1067
+ return roles.findIndex(this.isIntakeRole) > -1;
1068
+ }
1069
+ return false;
1070
+ }
1071
+ hasAppFeaturePermission(permissions, feature, appModuleId) {
1072
+ if (permissions && permissions.length > 0) {
1073
+ if (appModuleId) {
1074
+ return (permissions.findIndex((p) => p.resource === feature && p.appModuleId === appModuleId) > -1);
1075
+ }
1076
+ else {
1077
+ return permissions.findIndex((p) => p.resource === feature) > -1;
1078
+ }
1079
+ }
1080
+ return false;
1081
+ }
1082
+ isExternalRole(roleId) {
1083
+ switch (roleId) {
1084
+ case 'EUDTL':
1085
+ case 'EUDUSM':
1086
+ case 'EUJDG':
1087
+ case 'EUMPD':
1088
+ case 'EUSOTV':
1089
+ case 'EUUSA2':
1090
+ case 'EUUSAO':
1091
+ case 'EUUSPC':
1092
+ return true;
1093
+ default:
1094
+ return false;
1095
+ }
1096
+ }
1097
+ isIntakeRole(role) {
1098
+ switch (role.roleId) {
1099
+ case 'OPA':
1100
+ case 'OPS':
1101
+ case 'SOPS':
1102
+ return true;
1103
+ default:
1104
+ return false;
1105
+ }
1106
+ }
1107
+ disableHtmlElement(element) {
1108
+ // console.log(element);
1109
+ switch (element.nodeName) {
1110
+ case 'A':
1111
+ element.setAttribute('style', 'pointer-events: none;cursor: not-allowed;');
1112
+ element.setAttribute('tabIndex', '-1');
1113
+ break;
1114
+ default:
1115
+ element.setAttribute('disabled', 'disabled');
1116
+ break;
1117
+ }
1118
+ }
1119
+ hideHtmlElement(element) {
1120
+ // element.setAttribute('hidden', 'hidden');
1121
+ element.setAttribute('style', 'display: none;');
1122
+ }
1123
+ getStaff(userName) {
1124
+ const queryString = `
1125
+ {
1126
+ findvStaffs(input: {where: {userName: "${userName}", activeFlag: true}}) {
1127
+ totalCount
1128
+ message
1129
+ data {
1130
+ staffId
1131
+ userName
1132
+ lastName
1133
+ firstName
1134
+ phone
1135
+ email
1136
+ roles {
1137
+ roleId
1138
+ role
1139
+ }
1140
+ permissions {
1141
+ roleId
1142
+ appModuleId
1143
+ resource
1144
+ assignmentStaffRelationId
1145
+ readFlag
1146
+ createFlag
1147
+ updateFlag
1148
+ deleteFlag
1149
+ assignFlag
1150
+ reopenFlag
1151
+ closeFlag
1152
+ expungeFlag
1153
+ }
1154
+ options {
1155
+ offenderListOptionId
1156
+ name
1157
+ serviceApiFieldName
1158
+ selectedFlag
1159
+ }
1160
+ }
1161
+ }
1162
+ }`;
1163
+ return this.http
1164
+ .post(this.smartDataServiceUrl, { query: queryString })
1165
+ .pipe(take(1), map((result) => {
1166
+ if (isDevMode) {
1167
+ console.log('##### getStaff() from service ', result);
1168
+ }
1169
+ if (result.data.findvStaffs.data.length > 0) {
1170
+ const data = result.data.findvStaffs.data[0];
1171
+ this.xdmService.setLoginStaff(data);
1172
+ this.loginStaff = data;
1173
+ return data;
1174
+ }
1175
+ else {
1176
+ return null;
1177
+ // return throwError('No access right.');
1178
+ }
1179
+ }), catchError((error) => {
1180
+ console.log('error ' + error);
1181
+ return null;
1182
+ }));
1183
+ }
1184
+ getStaffOffenderRelation(staffId, offenderId) {
1185
+ const queryString = `
1186
+ {
1187
+ findvStaffOffenderRelations(input: {where: {staffId: ${staffId}, offenderId: ${offenderId}}}) {
1188
+ data {
1189
+ assignmentStaffRelationId
1190
+ }
1191
+ }
1192
+ }`;
1193
+ return this.http
1194
+ .post(this.smartDataServiceUrl, { query: queryString })
1195
+ .pipe(take(1), map((result) => {
1196
+ if (isDevMode) {
1197
+ console.log('##### getStaffOffenderRelation() from service ', result);
1198
+ }
1199
+ if (result.data.findvStaffOffenderRelations.data.length > 0) {
1200
+ const data = result.data.findvStaffOffenderRelations.data[0];
1201
+ return data.assignmentStaffRelationId;
1202
+ }
1203
+ else {
1204
+ return null;
1205
+ // return throwError('No access right.');
1206
+ }
1207
+ }), catchError((error) => {
1208
+ console.log('error ' + error);
1209
+ return null;
1210
+ }));
1211
+ }
1212
+ getRolePermissions(appModuleId, resource) {
1213
+ const queryString = `
1214
+ query findvRolePermissionPivots{
1215
+ findvRolePermissionPivots(input: {where: {appModuleId: ${appModuleId}, resource: ${resource}}}){
1216
+ totalCount
1217
+ message
1218
+ }
1219
+ }`;
1220
+ return this.http
1221
+ .post(this.smartDataServiceUrl, { query: queryString })
1222
+ .pipe(take(1), map((result) => {
1223
+ if (isDevMode) {
1224
+ console.log('##### findvRolePermissionPivots() from service ', result);
1225
+ }
1226
+ if (result.data.findvRolePermissionPivots.totalCount > 0) {
1227
+ return true;
1228
+ }
1229
+ else {
1230
+ return false;
1231
+ // return throwError('No access right.');
1232
+ }
1233
+ }), catchError((error) => {
1234
+ console.log('error ' + error);
1235
+ return throwError(error);
1236
+ }));
1237
+ }
1238
+ }
1239
+ /** @nocollapse */ /** @nocollapse */ SmartAuthService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: SmartAuthService, deps: [{ token: i1.HttpClient }, { token: i2.MsalService }, { token: XdmService }, { token: SMART_DATA_SERVICE_URL }, { token: SMART_DOMAIN_FORMAT }], target: i0.ɵɵFactoryTarget.Injectable });
1240
+ /** @nocollapse */ /** @nocollapse */ SmartAuthService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: SmartAuthService, providedIn: 'root' });
1241
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: SmartAuthService, decorators: [{
1242
+ type: Injectable,
1243
+ args: [{
1244
+ providedIn: 'root',
1245
+ }]
1246
+ }], ctorParameters: function () {
1247
+ return [{ type: i1.HttpClient }, { type: i2.MsalService }, { type: XdmService }, { type: undefined, decorators: [{
1248
+ type: Inject,
1249
+ args: [SMART_DATA_SERVICE_URL]
1250
+ }] }, { type: undefined, decorators: [{
1251
+ type: Inject,
1252
+ args: [SMART_DOMAIN_FORMAT]
1253
+ }] }];
1254
+ } });
1255
+
1256
+ class SmartAccessControlDirective {
1257
+ constructor(elementRef, auth) {
1258
+ this.elementRef = elementRef;
1259
+ this.auth = auth;
1260
+ }
1261
+ ngOnInit() {
1262
+ this.checkAccess();
1263
+ }
1264
+ checkAccess() {
1265
+ if (!this.accessControlConfig ||
1266
+ !this.accessControlConfig.route ||
1267
+ !this.accessControlConfig.route.data ||
1268
+ !this.accessControlConfig.route.data.loginStaff ||
1269
+ !this.accessControlConfig.route.data.selectedOffender) {
1270
+ return;
1271
+ }
1272
+ // const loginStaff = this.accessControlConfig.route.data.loginStaff;
1273
+ // if (!this.auth.isAuthEnable(loginStaff.roles, this.accessControlConfig.appModuleId)) {
1274
+ // return;
1275
+ // }
1276
+ this.elementRef.nativeElement.style.display = this.auth.checkPermission(this.accessControlConfig)
1277
+ ? 'block'
1278
+ : 'none';
1279
+ }
1280
+ }
1281
+ /** @nocollapse */ /** @nocollapse */ SmartAccessControlDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: SmartAccessControlDirective, deps: [{ token: i0.ElementRef }, { token: SmartAuthService }], target: i0.ɵɵFactoryTarget.Directive });
1282
+ /** @nocollapse */ /** @nocollapse */ SmartAccessControlDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.2.5", type: SmartAccessControlDirective, selector: "[accessControl]", inputs: { accessControlConfig: "accessControlConfig" }, ngImport: i0 });
1283
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: SmartAccessControlDirective, decorators: [{
1284
+ type: Directive,
1285
+ args: [{
1286
+ selector: '[accessControl]',
1287
+ }]
1288
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: SmartAuthService }]; }, propDecorators: { accessControlConfig: [{
1289
+ type: Input
1290
+ }] } });
1291
+
1292
+ // smart-authorization.service
1293
+ class SmartAuthorizationGuard {
1294
+ constructor(authnService) {
1295
+ this.authnService = authnService;
1296
+ }
1297
+ canActivate(route) {
1298
+ return this.authnService.getLoginStaff().pipe(take(1), mergeMap((loginStaff) => {
1299
+ if (!loginStaff || !route || !route.routeConfig) {
1300
+ return of(false);
1301
+ }
1302
+ // if (!this.authnService.isAuthEnable(loginStaff.roles, null)) {
1303
+ // return of(true);
1304
+ // }
1305
+ const resource = route.routeConfig.path
1306
+ ? route.routeConfig.path.split('/')[0]
1307
+ : '';
1308
+ const isFeatureValid = this.authnService.canAppFeatureActivate(loginStaff, resource);
1309
+ return of(isFeatureValid);
1310
+ }), catchError((error) => {
1311
+ return of(false);
1312
+ }));
1313
+ }
1314
+ }
1315
+ /** @nocollapse */ /** @nocollapse */ SmartAuthorizationGuard.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: SmartAuthorizationGuard, deps: [{ token: SmartAuthService }], target: i0.ɵɵFactoryTarget.Injectable });
1316
+ /** @nocollapse */ /** @nocollapse */ SmartAuthorizationGuard.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: SmartAuthorizationGuard });
1317
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: SmartAuthorizationGuard, decorators: [{
1318
+ type: Injectable
1319
+ }], ctorParameters: function () { return [{ type: SmartAuthService }]; } });
1320
+
1321
+ class NgcSmartCoreModule {
1322
+ }
1323
+ /** @nocollapse */ /** @nocollapse */ NgcSmartCoreModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: NgcSmartCoreModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
1324
+ /** @nocollapse */ /** @nocollapse */ NgcSmartCoreModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: NgcSmartCoreModule, declarations: [SmartOffenderHeaderComponent,
1325
+ SmartNavbarComponent,
1326
+ SmartErrorComponent,
1327
+ SmartStaffOffenderOptionsComponent,
1328
+ SmartAccessControlDirective], imports: [CommonModule,
1329
+ HttpClientModule,
1330
+ MatButtonModule,
1331
+ MatMenuModule,
1332
+ MatTabsModule,
1333
+ MatSelectModule,
1334
+ MatCardModule,
1335
+ MatCheckboxModule,
1336
+ ReactiveFormsModule], exports: [SmartOffenderHeaderComponent,
1337
+ SmartNavbarComponent,
1338
+ SmartErrorComponent,
1339
+ SmartStaffOffenderOptionsComponent,
1340
+ SmartAccessControlDirective] });
1341
+ /** @nocollapse */ /** @nocollapse */ NgcSmartCoreModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: NgcSmartCoreModule, providers: [
1342
+ SmartNavbarService,
1343
+ SmartOffenderHeaderService,
1344
+ SmartStaffOffenderOptionsService,
1345
+ SmartAuthorizationGuard,
1346
+ MatSnackBar,
1347
+ ], imports: [[
1348
+ CommonModule,
1349
+ HttpClientModule,
1350
+ MatButtonModule,
1351
+ MatMenuModule,
1352
+ MatTabsModule,
1353
+ MatSelectModule,
1354
+ MatCardModule,
1355
+ MatCheckboxModule,
1356
+ ReactiveFormsModule,
1357
+ ]] });
1358
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: NgcSmartCoreModule, decorators: [{
1359
+ type: NgModule,
1360
+ args: [{
1361
+ declarations: [
1362
+ SmartOffenderHeaderComponent,
1363
+ SmartNavbarComponent,
1364
+ SmartErrorComponent,
1365
+ SmartStaffOffenderOptionsComponent,
1366
+ SmartAccessControlDirective,
1367
+ ],
1368
+ imports: [
1369
+ CommonModule,
1370
+ HttpClientModule,
1371
+ MatButtonModule,
1372
+ MatMenuModule,
1373
+ MatTabsModule,
1374
+ MatSelectModule,
1375
+ MatCardModule,
1376
+ MatCheckboxModule,
1377
+ ReactiveFormsModule,
1378
+ ],
1379
+ exports: [
1380
+ SmartOffenderHeaderComponent,
1381
+ SmartNavbarComponent,
1382
+ SmartErrorComponent,
1383
+ SmartStaffOffenderOptionsComponent,
1384
+ SmartAccessControlDirective,
1385
+ ],
1386
+ providers: [
1387
+ SmartNavbarService,
1388
+ SmartOffenderHeaderService,
1389
+ SmartStaffOffenderOptionsService,
1390
+ SmartAuthorizationGuard,
1391
+ MatSnackBar,
1392
+ ],
1393
+ }]
1394
+ }] });
1395
+
1396
+ class LoginStaffResolverService {
1397
+ constructor(authnService,
1398
+ // private zone: NgZone,
1399
+ router) {
1400
+ this.authnService = authnService;
1401
+ this.router = router;
1402
+ }
1403
+ resolve(route, state) {
1404
+ return this.authnService.getLoginStaff().pipe(take(1), mergeMap((loginStaff) => {
1405
+ if (isDevMode) {
1406
+ console.log('LoginStaffResolverService: ', loginStaff);
1407
+ }
1408
+ if (loginStaff) {
1409
+ return of(loginStaff);
1410
+ }
1411
+ else {
1412
+ return throwError('Not authorized to access SMART.');
1413
+ // return EMPTY;
1414
+ /*
1415
+ this.zone.run(() => {
1416
+ this.router.navigate(['/smart-error'], {
1417
+ queryParams: {
1418
+ type: 'staff',
1419
+ message: 'Not authorized to access SMART.'
1420
+ }
1421
+ });
1422
+ });
1423
+ return EMPTY;
1424
+ */
1425
+ }
1426
+ }), catchError((error) => {
1427
+ console.log('LoginStaffResolverService: ' + error);
1428
+ this.router.navigate(['/smart-error'], {
1429
+ queryParams: {
1430
+ type: 'staff',
1431
+ message: 'SMART Authentication: ' + error,
1432
+ },
1433
+ });
1434
+ return EMPTY;
1435
+ }));
1436
+ }
1437
+ }
1438
+ /** @nocollapse */ /** @nocollapse */ LoginStaffResolverService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: LoginStaffResolverService, deps: [{ token: SmartAuthService }, { token: i2$1.Router }], target: i0.ɵɵFactoryTarget.Injectable });
1439
+ /** @nocollapse */ /** @nocollapse */ LoginStaffResolverService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: LoginStaffResolverService, providedIn: 'root' });
1440
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: LoginStaffResolverService, decorators: [{
1441
+ type: Injectable,
1442
+ args: [{
1443
+ providedIn: 'root',
1444
+ }]
1445
+ }], ctorParameters: function () { return [{ type: SmartAuthService }, { type: i2$1.Router }]; } });
1446
+
1447
+ class SelectedOffenderResolverService {
1448
+ constructor(service, zone, router) {
1449
+ this.service = service;
1450
+ this.zone = zone;
1451
+ this.router = router;
1452
+ }
1453
+ resolve(route, state) {
1454
+ return from(this.service.getSelectedOffender()).pipe(mergeMap((selectedOffender) => {
1455
+ if (isDevMode) {
1456
+ console.log(selectedOffender);
1457
+ }
1458
+ if (!selectedOffender) {
1459
+ return throwError('No offender selected.');
1460
+ }
1461
+ return of(selectedOffender);
1462
+ }), retryWhen((errors) => errors.pipe(
1463
+ // tap(() => console.log('Retry getting selected offender.')),
1464
+ delay(1000), take(5), (o) => concat(o, throwError('No offender selected (failed after retries).')))), catchError((error) => {
1465
+ /*
1466
+ this.zone.run(() => {
1467
+ this.router.navigate(['/smart-error'], {
1468
+ queryParams: { type: 'offender', message: error }
1469
+ });
1470
+ });
1471
+ */
1472
+ this.router.navigate(['/smart-error'], {
1473
+ queryParams: { type: 'offender', message: error },
1474
+ });
1475
+ return EMPTY;
1476
+ }));
1477
+ }
1478
+ }
1479
+ /** @nocollapse */ /** @nocollapse */ SelectedOffenderResolverService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: SelectedOffenderResolverService, deps: [{ token: XdmService }, { token: i0.NgZone }, { token: i2$1.Router }], target: i0.ɵɵFactoryTarget.Injectable });
1480
+ /** @nocollapse */ /** @nocollapse */ SelectedOffenderResolverService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: SelectedOffenderResolverService, providedIn: 'root' });
1481
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: SelectedOffenderResolverService, decorators: [{
1482
+ type: Injectable,
1483
+ args: [{
1484
+ providedIn: 'root',
1485
+ }]
1486
+ }], ctorParameters: function () { return [{ type: XdmService }, { type: i0.NgZone }, { type: i2$1.Router }]; } });
1487
+
1488
+ class SmartStaffOffenderOptionsResolverService {
1489
+ constructor(offenderService) {
1490
+ this.offenderService = offenderService;
1491
+ }
1492
+ resolve() {
1493
+ return this.offenderService.getOffenderListOptions()
1494
+ .pipe(map(({ data }) => {
1495
+ return data;
1496
+ }));
1497
+ }
1498
+ }
1499
+ /** @nocollapse */ /** @nocollapse */ SmartStaffOffenderOptionsResolverService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: SmartStaffOffenderOptionsResolverService, deps: [{ token: SmartStaffOffenderOptionsService }], target: i0.ɵɵFactoryTarget.Injectable });
1500
+ /** @nocollapse */ /** @nocollapse */ SmartStaffOffenderOptionsResolverService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: SmartStaffOffenderOptionsResolverService, providedIn: 'root' });
1501
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: SmartStaffOffenderOptionsResolverService, decorators: [{
1502
+ type: Injectable,
1503
+ args: [{
1504
+ providedIn: 'root',
1505
+ }]
1506
+ }], ctorParameters: function () { return [{ type: SmartStaffOffenderOptionsService }]; } });
1507
+
1508
+ var AccessType;
1509
+ (function (AccessType) {
1510
+ AccessType["READ"] = "read";
1511
+ AccessType["CREATE"] = "create";
1512
+ AccessType["UPDATE"] = "update";
1513
+ AccessType["DELETE"] = "delete";
1514
+ AccessType["EXPUNGE"] = "expunge";
1515
+ AccessType["ASSIGN"] = "assign";
1516
+ AccessType["REOPEN"] = "reopen";
1517
+ AccessType["CLOSE"] = "close";
1518
+ })(AccessType || (AccessType = {}));
1519
+
1520
+ /*
1521
+ * Public API Surface of ngc-smart-core
1522
+ */
1523
+
1524
+ /**
1525
+ * Generated bundle index. Do not edit.
1526
+ */
1527
+
1528
+ export { AccessType, LoginStaff, LoginStaffResolverService, NgcSmartCoreModule, OffenderQuery, Option, Permission, Role, SMART_DATA_SERVICE_URL, SMART_DOMAIN_FORMAT, SMART_WEB_PORTAL_URL, SMART_WEB_STORAGE_LISTENER_URL, SelectedOffender, SelectedOffenderResolverService, SmartAccessControlDirective, SmartAuthService, SmartAuthorizationGuard, SmartErrorComponent, SmartNavbarComponent, SmartNavbarService, SmartOffenderHeaderComponent, SmartStaffOffenderOptionsComponent, SmartStaffOffenderOptionsResolverService, StorageKey, XdmService };
1529
+ //# sourceMappingURL=csmart-ngc-smart-core.mjs.map