cloud-ide-admin 1.0.1 → 1.0.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 (37) hide show
  1. package/README.md +49 -10
  2. package/fesm2022/cloud-ide-admin-cide-adm-home-wrapper.component-DpAhYlMT.mjs +21 -0
  3. package/fesm2022/{cloud-ide-admin-cide-adm-home-wrapper.component-Cu0sr3ST.mjs.map → cloud-ide-admin-cide-adm-home-wrapper.component-DpAhYlMT.mjs.map} +1 -1
  4. package/fesm2022/cloud-ide-admin.mjs +27 -1818
  5. package/fesm2022/cloud-ide-admin.mjs.map +1 -1
  6. package/index.d.ts +21 -5
  7. package/package.json +3 -5
  8. package/esm2022/cloud-ide-admin.mjs +0 -5
  9. package/esm2022/lib/admin-module/entity/create/cide-adm-entity.component.mjs +0 -834
  10. package/esm2022/lib/admin-module/entity/create/cide-adm-entity.service.mjs +0 -79
  11. package/esm2022/lib/admin-module/entity/create/country-select.service.mjs +0 -33
  12. package/esm2022/lib/admin-module/entity/create/currency-select.service.mjs +0 -48
  13. package/esm2022/lib/admin-module/entity/create/general-master-select.service.mjs +0 -44
  14. package/esm2022/lib/admin-module/entity/create/pin-code-select.service.mjs +0 -60
  15. package/esm2022/lib/admin-module/entity/create/user-select.service.mjs +0 -58
  16. package/esm2022/lib/admin-module/entity/list/cide-adm-entity-list.component.mjs +0 -600
  17. package/esm2022/lib/admin-module/entity/list/cide-adm-entity-list.service.mjs +0 -52
  18. package/esm2022/lib/admin-module/home/home-wrapper/cide-adm-home-wrapper.component.mjs +0 -21
  19. package/esm2022/lib/cide-adm-admin.component.mjs +0 -29
  20. package/esm2022/lib/cide-adm-admin.service.mjs +0 -14
  21. package/esm2022/lib/cloud-ide-admin.routes.mjs +0 -38
  22. package/esm2022/public-api.mjs +0 -10
  23. package/fesm2022/cloud-ide-admin-cide-adm-home-wrapper.component-Cu0sr3ST.mjs +0 -24
  24. package/lib/admin-module/entity/create/cide-adm-entity.component.d.ts +0 -73
  25. package/lib/admin-module/entity/create/cide-adm-entity.service.d.ts +0 -39
  26. package/lib/admin-module/entity/create/country-select.service.d.ts +0 -13
  27. package/lib/admin-module/entity/create/currency-select.service.d.ts +0 -19
  28. package/lib/admin-module/entity/create/general-master-select.service.d.ts +0 -24
  29. package/lib/admin-module/entity/create/pin-code-select.service.d.ts +0 -31
  30. package/lib/admin-module/entity/create/user-select.service.d.ts +0 -31
  31. package/lib/admin-module/entity/list/cide-adm-entity-list.component.d.ts +0 -94
  32. package/lib/admin-module/entity/list/cide-adm-entity-list.service.d.ts +0 -25
  33. package/lib/admin-module/home/home-wrapper/cide-adm-home-wrapper.component.d.ts +0 -9
  34. package/lib/cide-adm-admin.component.d.ts +0 -9
  35. package/lib/cide-adm-admin.service.d.ts +0 -6
  36. package/lib/cloud-ide-admin.routes.d.ts +0 -2
  37. package/public-api.d.ts +0 -6
@@ -1,21 +1,14 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Injectable, Component, inject, signal, ViewChild } from '@angular/core';
2
+ import { Injectable, Component } from '@angular/core';
3
3
  import { CideLytSharedWrapperComponent } from 'cloud-ide-layout';
4
- import * as i1 from '@angular/forms';
5
- import { FormBuilder, Validators, ReactiveFormsModule, FormsModule } from '@angular/forms';
6
- import { ActivatedRoute, Router } from '@angular/router';
7
- import { HttpClient } from '@angular/common/http';
8
- import { cidePath, hostManagerRoutesUrl, coreRoutesUrl, generateStringFromObject, userRoutesUrl, generateObjectFromString } from 'cloud-ide-lms-model';
9
- import { CideInputComponent, CideSelectComponent, CideTextareaComponent, CideEleFileInputComponent, CideEleTabComponent, CideEleButtonComponent, CideEleDataGridComponent, CideIconComponent, TooltipDirective } from 'cloud-ide-element';
10
- import { Subject, takeUntil, debounceTime, distinctUntilChanged } from 'rxjs';
11
- import { CommonModule } from '@angular/common';
4
+ import { authGuard } from 'cloud-ide-auth';
12
5
 
13
6
  class CideAdmAdminService {
14
7
  constructor() { }
15
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CideAdmAdminService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
16
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CideAdmAdminService, providedIn: 'root' }); }
8
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: CideAdmAdminService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
9
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: CideAdmAdminService, providedIn: 'root' });
17
10
  }
18
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CideAdmAdminService, decorators: [{
11
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: CideAdmAdminService, decorators: [{
19
12
  type: Injectable,
20
13
  args: [{
21
14
  providedIn: 'root'
@@ -23,23 +16,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImpor
23
16
  }], ctorParameters: () => [] });
24
17
 
25
18
  class CideAdmAdminComponent extends CideLytSharedWrapperComponent {
26
- constructor() {
27
- super(...arguments);
28
- this.shared_wrapper_setup_param = {
29
- sypg_page_code: "default_home_adm"
30
- };
31
- }
19
+ shared_wrapper_setup_param = {
20
+ sypg_page_code: "default_home_adm"
21
+ };
32
22
  ngOnInit() {
33
23
  super.ngOnInit?.();
34
24
  }
35
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CideAdmAdminComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
36
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.7", type: CideAdmAdminComponent, isStandalone: true, selector: "cide-adm-admin", usesInheritance: true, ngImport: i0, template: `
25
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: CideAdmAdminComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
26
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.1.7", type: CideAdmAdminComponent, isStandalone: true, selector: "cide-adm-admin", usesInheritance: true, ngImport: i0, template: `
37
27
  <p>
38
28
  cide-adm-admin works!
39
29
  </p>
40
- `, isInline: true, styles: [""] }); }
30
+ `, isInline: true, styles: [""] });
41
31
  }
42
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CideAdmAdminComponent, decorators: [{
32
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: CideAdmAdminComponent, decorators: [{
43
33
  type: Component,
44
34
  args: [{ selector: 'cide-adm-admin', standalone: true, imports: [], template: `
45
35
  <p>
@@ -48,1815 +38,34 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImpor
48
38
  ` }]
49
39
  }] });
50
40
 
51
- class CideAdmEntityService {
52
- constructor() {
53
- this.http = inject(HttpClient);
54
- }
55
- getEntityTypes() {
56
- return this.http.get('/api/core/entity-types');
57
- }
58
- getCurrencies() {
59
- return this.http.get('/api/core/currencies');
60
- }
61
- getUsers() {
62
- return this.http.get('/api/core/users');
63
- }
64
- getPostalCodes() {
65
- return this.http.get('/api/core/postal-codes');
66
- }
67
- /**
68
- * Save entity data using coreRoutesUrl?.entity endpoint
69
- * @param data - Entity data to save
70
- * @param logoFile - Optional logo file
71
- * @returns Observable of the save response
72
- */
73
- saveUpdateEntity(data) {
74
- const url = cidePath.join([
75
- hostManagerRoutesUrl.cideSuiteHost,
76
- coreRoutesUrl.module,
77
- coreRoutesUrl?.entity
78
- ]);
79
- console.log('🏢 ENTITY SERVICE: Making POST request to:', url);
80
- console.log('🏢 ENTITY SERVICE: Data payload:', data);
81
- return this.http.post(url, data);
82
- }
83
- /**
84
- * Get entity by ID
85
- * @param entityId - ID of the entity to retrieve
86
- * @returns Observable of the entity data
87
- */
88
- getEntityById(entityId) {
89
- const payload = {
90
- syen_id: entityId
91
- };
92
- const query = generateStringFromObject(payload);
93
- const url = cidePath.join([
94
- hostManagerRoutesUrl.cideSuiteHost,
95
- coreRoutesUrl.module,
96
- coreRoutesUrl?.entity,
97
- query
98
- ]);
99
- return this.http.get(url);
100
- }
101
- /**
102
- * Delete entity by ID
103
- * @param entityId - ID of the entity to delete
104
- * @returns Observable of the delete response
105
- */
106
- deleteEntity(entityId) {
107
- const url = cidePath.join([
108
- hostManagerRoutesUrl.cideSuiteHost,
109
- coreRoutesUrl.module,
110
- coreRoutesUrl?.entity,
111
- entityId
112
- ]);
113
- console.log('🏢 ENTITY SERVICE: Making DELETE request to:', url);
114
- return this.http.delete(url);
115
- }
116
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CideAdmEntityService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
117
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CideAdmEntityService, providedIn: 'root' }); }
118
- }
119
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CideAdmEntityService, decorators: [{
120
- type: Injectable,
121
- args: [{
122
- providedIn: 'root'
123
- }]
124
- }] });
125
-
126
- class GeneralMasterSelectService {
127
- constructor() {
128
- this.http = inject(HttpClient);
129
- }
130
- /**
131
- * Get general master data from API
132
- * @param body - MGeneralMaster payload with sygmt_code
133
- * @returns Observable of generalMasterListControllerResponse
134
- */
135
- getGeneralMasterData(body) {
136
- const url = cidePath.join([
137
- hostManagerRoutesUrl.cideSuiteHost,
138
- coreRoutesUrl.module,
139
- coreRoutesUrl?.generalMaster
140
- ]);
141
- console.log('🔍 GENERAL MASTER SERVICE: Making API call to:', url);
142
- console.log('🔍 GENERAL MASTER SERVICE: Payload:', body);
143
- return this.http.post(url, body);
144
- }
145
- /**
146
- * Get general master data by code
147
- * @param code - The general master code
148
- * @returns Observable of generalMasterListControllerResponse
149
- */
150
- getGeneralMasterByCode(code) {
151
- const payload = {
152
- sygmt_code: code
153
- };
154
- return this.getGeneralMasterData(payload);
155
- }
156
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: GeneralMasterSelectService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
157
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: GeneralMasterSelectService, providedIn: 'root' }); }
158
- }
159
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: GeneralMasterSelectService, decorators: [{
160
- type: Injectable,
161
- args: [{
162
- providedIn: 'root'
163
- }]
164
- }] });
165
-
166
- class PinCodeSelectService {
167
- constructor() {
168
- this.http = inject(HttpClient);
169
- }
170
- /**
171
- * Get pin code data from API
172
- * @param body - MPinCodeSelect payload with sypin_pincode
173
- * @returns Observable of pinCodeSelectControllerResponse
174
- */
175
- getPinCodeData(body) {
176
- const url = cidePath.join([
177
- hostManagerRoutesUrl.cideSuiteHost,
178
- coreRoutesUrl.module,
179
- coreRoutesUrl?.pinCode
180
- ]);
181
- console.log('🔍 PIN CODE SERVICE: Making API call to:', url);
182
- console.log('🔍 PIN CODE SERVICE: Payload:', body);
183
- return this.http.post(url, body);
184
- }
185
- /**
186
- * Get pin code data by pincode
187
- * @param pincode - The pin code to search for
188
- * @returns Observable of pinCodeSelectControllerResponse
189
- */
190
- getPinCodeByCode(pincode) {
191
- const payload = {
192
- sypin_pincode: pincode
193
- };
194
- return this.getPinCodeData(payload);
195
- }
196
- /**
197
- * Get all postal codes
198
- * @returns Observable of pinCodeSelectControllerResponse
199
- */
200
- getAllPostalCodes() {
201
- const payload = { sypin_pincode: '440022' };
202
- return this.getPinCodeData(payload);
203
- }
204
- /**
205
- * Search pin codes with partial match
206
- * @param searchTerm - Partial pin code or area name to search
207
- * @returns Observable of pinCodeSelectControllerResponse
208
- */
209
- searchPinCodes(payload) {
210
- return this.getPinCodeData(payload);
211
- }
212
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: PinCodeSelectService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
213
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: PinCodeSelectService, providedIn: 'root' }); }
214
- }
215
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: PinCodeSelectService, decorators: [{
216
- type: Injectable,
217
- args: [{
218
- providedIn: 'root'
219
- }]
220
- }] });
221
-
222
- class UserSelectService {
223
- constructor() {
224
- this.http = inject(HttpClient);
225
- }
226
- /**
227
- * Get user data from API
228
- * @param body - MUserSelect payload
229
- * @returns Observable of userSelectControllerResponse
230
- */
231
- getUserData(body) {
232
- const url = cidePath.join([
233
- hostManagerRoutesUrl.cideSuiteHost,
234
- userRoutesUrl.module,
235
- userRoutesUrl?.user
236
- ]);
237
- console.log('🔍 USER SELECT SERVICE: Making API call to:', url);
238
- console.log('🔍 USER SELECT SERVICE: Payload:', body);
239
- return this.http.post(url, body);
240
- }
241
- /**
242
- * Get all users
243
- * @returns Observable of userSelectControllerResponse
244
- */
245
- getAllUsers() {
246
- const payload = {};
247
- return this.getUserData(payload);
248
- }
249
- /**
250
- * Search users by full name
251
- * @param userFullname - The user full name to search for
252
- * @returns Observable of userSelectControllerResponse
253
- */
254
- searchUsersByFullname(payload) {
255
- return this.getUserData(payload);
256
- }
257
- /**
258
- * Search users with filters
259
- * @param filters - Filter parameters for user search
260
- * @returns Observable of userSelectControllerResponse
261
- */
262
- searchUsers(filters) {
263
- const payload = { ...filters };
264
- return this.getUserData(payload);
265
- }
266
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: UserSelectService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
267
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: UserSelectService, providedIn: 'root' }); }
268
- }
269
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: UserSelectService, decorators: [{
270
- type: Injectable,
271
- args: [{
272
- providedIn: 'root'
273
- }]
274
- }] });
275
-
276
- class CurrencySelectService {
277
- constructor() {
278
- this.http = inject(HttpClient);
279
- }
280
- /**
281
- * Get currency data from API
282
- * @returns Observable of currencyListControllerResponse
283
- */
284
- getAllCurrencies(body) {
285
- const query = generateStringFromObject(body);
286
- const url = cidePath.join([
287
- hostManagerRoutesUrl.cideSuiteHost,
288
- coreRoutesUrl.module,
289
- coreRoutesUrl?.currency,
290
- query
291
- ]);
292
- console.log('🔍 CURRENCY SERVICE: Making API call to:', url);
293
- return this.http.get(url);
294
- }
295
- /**
296
- * Search currencies with filters
297
- * @param filters - MSycrList payload for filtering
298
- * @returns Observable of currencyListControllerResponse
299
- */
300
- searchCurrencies(filters) {
301
- const url = cidePath.join([
302
- hostManagerRoutesUrl.cideSuiteHost,
303
- coreRoutesUrl.module,
304
- coreRoutesUrl?.currency
305
- ]);
306
- console.log('🔍 CURRENCY SERVICE: Making search API call to:', url);
307
- console.log('🔍 CURRENCY SERVICE: Filters:', filters);
308
- return this.http.post(url, filters);
309
- }
310
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CurrencySelectService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
311
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CurrencySelectService, providedIn: 'root' }); }
312
- }
313
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CurrencySelectService, decorators: [{
314
- type: Injectable,
315
- args: [{
316
- providedIn: 'root'
317
- }]
318
- }] });
319
-
320
- class CountrySelectService {
321
- constructor() {
322
- this.http = inject(HttpClient);
323
- }
324
- /**
325
- * Get country data from API
326
- * @returns Observable of country response
327
- */
328
- getAllCountries(body) {
329
- const query = generateStringFromObject(body);
330
- const url = cidePath.join([
331
- hostManagerRoutesUrl.cideSuiteHost,
332
- coreRoutesUrl.module,
333
- coreRoutesUrl.country,
334
- query
335
- ]);
336
- console.log('🔍 COUNTRY SERVICE: Making API call to:', url);
337
- return this.http.get(url);
338
- }
339
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CountrySelectService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
340
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CountrySelectService, providedIn: 'root' }); }
341
- }
342
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CountrySelectService, decorators: [{
343
- type: Injectable,
344
- args: [{
345
- providedIn: 'root'
346
- }]
347
- }] });
348
-
349
- class CideAdmEntityComponent {
350
- constructor() {
351
- this.entityTypes = signal([]);
352
- this.currencies = signal([]);
353
- this.users = signal([]);
354
- this.postalCodes = signal([]);
355
- this.photoIdDocuments = signal([]);
356
- this.countries = signal([]);
357
- // Store the full pin code data for auto-population
358
- this.pinCodeDataMap = new Map();
359
- this.loading = signal(false);
360
- this.error = signal(null);
361
- this.success = signal(null);
362
- // Loading states for individual dropdowns
363
- this.postalCodesLoading = signal(false);
364
- this.usersLoading = signal(false);
365
- this.countriesLoading = signal(false);
366
- // Entity mode and ID
367
- this.isEditMode = signal(false);
368
- this.entityId = signal(null);
369
- // Tab configuration
370
- this.activeTab = signal('basic');
371
- this.entityTabs = signal([
372
- { id: 'basic', label: 'Basic Information', icon: 'ℹ️' },
373
- { id: 'corporate', label: 'Corporate Address', icon: '🏢' },
374
- { id: 'contact', label: 'Contact Information', icon: '📧' },
375
- { id: 'registered', label: 'Registered Address', icon: '🏠' },
376
- { id: 'documents', label: 'Documents & Media', icon: '📄' }
377
- ]);
378
- // Modern dependency injection using inject()
379
- this.entityService = inject(CideAdmEntityService);
380
- this.generalMasterService = inject(GeneralMasterSelectService);
381
- this.pinCodeService = inject(PinCodeSelectService);
382
- this.userService = inject(UserSelectService);
383
- this.currencyService = inject(CurrencySelectService);
384
- this.countryService = inject(CountrySelectService);
385
- this.fb = inject(FormBuilder);
386
- this.route = inject(ActivatedRoute);
387
- this.destroy$ = new Subject();
388
- this.entityForm = this.fb.group({
389
- // Basic Information
390
- syen_name: ['', [Validators.required]],
391
- syen_entity_code: ['', [Validators.required, Validators.maxLength(40)]],
392
- syen_entity_type_gmst: ['', [Validators.required]],
393
- syen_udise_no: [''],
394
- syen_affiliation_no: [''],
395
- syen_isactive: [true],
396
- // Corporate Address
397
- syen_corporate_address: [''],
398
- syen_corporate_city_sypin: [''],
399
- syen_corporate_state_sypin: [''],
400
- syen_corporate_country_syctr: [''],
401
- syen_corporate_pin_sypin: [''],
402
- // Contact Information
403
- syen_corporate_contact_person_user: [''],
404
- syen_corporate_phone: [''],
405
- syen_corporate_phone_alt: [''],
406
- syen_corporate_fax: [''],
407
- syen_corporate_email: ['', [Validators.email]],
408
- syen_corporate_email_alt: ['', [Validators.email]],
409
- syen_website: ['', [Validators.pattern(/^https?:\/\/.+/)]],
410
- syen_currency_sycr: [''],
411
- // Registered Address
412
- syen_registered_address: [''],
413
- syen_registered_city_sypin: [''],
414
- syen_registered_state_sypin: [''],
415
- syen_registered_country_syctr: [''],
416
- syen_registered_pin_sypin: [''],
417
- syen_registered_contact_person_user: [''],
418
- syen_registered_phone: [''],
419
- syen_registered_email: ['', [Validators.email]],
420
- syen_registered_fax: [''],
421
- // Documents
422
- syen_photo_id_cyfm: ['']
423
- });
424
- // Listen for postal code changes to auto-populate address fields
425
- this.setupPostalCodeListeners();
426
- }
427
- ngOnInit() {
428
- // Add global error handler to catch any unhandled errors
429
- const errorHandler = (event) => {
430
- console.error('💥 GLOBAL ERROR:', event.error);
431
- };
432
- const rejectionHandler = (event) => {
433
- console.error('💥 UNHANDLED PROMISE REJECTION:', event.reason);
434
- };
435
- window.addEventListener('error', errorHandler);
436
- window.addEventListener('unhandledrejection', rejectionHandler);
437
- // Store handlers for cleanup
438
- this.globalErrorHandler = errorHandler;
439
- this.globalRejectionHandler = rejectionHandler;
440
- // Check for entity ID in query parameters
441
- this.checkForEntityId();
442
- this.loadDropdowns();
443
- }
444
- ngOnDestroy() {
445
- // Clean up global event listeners
446
- if (this.globalErrorHandler) {
447
- window.removeEventListener('error', this.globalErrorHandler);
448
- }
449
- if (this.globalRejectionHandler) {
450
- window.removeEventListener('unhandledrejection', this.globalRejectionHandler);
451
- }
452
- // Clean up RxJS subscriptions
453
- this.destroy$.next();
454
- this.destroy$.complete();
455
- }
456
- // Check for entity ID in query parameters
457
- checkForEntityId() {
458
- console.log('🔍 Checking for entity ID in query parameters', this.route.params);
459
- this.route.params.pipe(takeUntil(this.destroy$)).subscribe(params => {
460
- console.log('🔍 Query params:', params);
461
- // Check for entityId, id, or entity parameter
462
- const queryParams = params['query'];
463
- const queryData = generateObjectFromString(queryParams);
464
- // If entityId is an object string (from generateStringFromObject), try to parse it
465
- const entityId = queryData.syen_id;
466
- if (entityId) {
467
- console.log('🔍 Entity ID found in query params:', entityId);
468
- this.entityId.set(entityId);
469
- this.isEditMode.set(true);
470
- this.loadEntityData(entityId);
471
- }
472
- else {
473
- console.log('🆕 No entity ID found - creating new entity');
474
- this.isEditMode.set(false);
475
- this.entityId.set(null);
476
- }
477
- });
478
- }
479
- // Load entity data for editing
480
- loadEntityData(entityId) {
481
- this.loading.set(true);
482
- this.error.set(null);
483
- console.log('📥 Loading entity data for ID:', entityId);
484
- this.entityService.getEntityById(entityId).pipe(takeUntil(this.destroy$)).subscribe({
485
- next: (response) => {
486
- console.log('✅ Entity data loaded:', response);
487
- if (response?.success && response?.data) {
488
- // Handle both array and single object responses
489
- const entityData = Array.isArray(response.data) ? response.data[0] : response.data;
490
- if (entityData) {
491
- this.populateFormWithEntityData(entityData);
492
- this.success.set('Entity data loaded successfully');
493
- }
494
- else {
495
- this.error.set('Entity data not found');
496
- console.error('❌ Entity data not found in response:', response);
497
- }
498
- }
499
- else {
500
- this.error.set('Failed to load entity data');
501
- console.error('❌ Entity data response invalid:', response);
502
- }
503
- this.loading.set(false);
504
- },
505
- error: (err) => {
506
- console.error('❌ Failed to load entity data:', err);
507
- let errorMessage = 'Failed to load entity data.';
508
- if (err?.error?.message) {
509
- errorMessage = err.error.message;
510
- }
511
- else if (err?.message) {
512
- errorMessage = err.message;
513
- }
514
- else if (err?.status === 404) {
515
- errorMessage = 'Entity not found.';
516
- }
517
- else if (err?.status === 500) {
518
- errorMessage = 'Server error. Please try again later.';
519
- }
520
- this.error.set(errorMessage);
521
- this.loading.set(false);
522
- }
523
- });
524
- }
525
- // Populate form with entity data
526
- populateFormWithEntityData(entityData) {
527
- try {
528
- console.log('📝 Populating form with entity data:', entityData);
529
- // Map the entity data to form controls - only use properties that exist in entityResponseData
530
- const formData = {
531
- // Basic Information
532
- syen_name: entityData.syen_name || '',
533
- syen_entity_code: entityData.syen_entity_code || '',
534
- syen_entity_type_gmst: entityData.syen_entity_type_gmst || '',
535
- syen_isactive: entityData.syen_isactive !== undefined ? entityData.syen_isactive : true,
536
- // Contact Information (only properties that exist in entityResponseData)
537
- syen_corporate_contact_person_user: entityData.syen_corporate_contact_person_user || '',
538
- syen_corporate_phone: entityData.syen_corporate_phone || '',
539
- syen_corporate_email: entityData.syen_corporate_email || '',
540
- // Set default values for other fields since they're not in entityResponseData
541
- syen_udise_no: entityData.syen_udise_no || '',
542
- syen_affiliation_no: entityData.syen_affiliation_no || '',
543
- syen_corporate_address: entityData.syen_corporate_address || '',
544
- syen_corporate_city_sypin: entityData.syen_corporate_city_sypin || '',
545
- syen_corporate_state_sypin: entityData.syen_corporate_state_sypin || '',
546
- syen_corporate_country_syctr: entityData.syen_corporate_country_syctr || '',
547
- syen_corporate_pin_sypin: entityData.syen_corporate_pin_sypin || '',
548
- syen_corporate_phone_alt: entityData.syen_corporate_phone_alt || '',
549
- syen_corporate_fax: entityData.syen_corporate_fax || '',
550
- syen_corporate_email_alt: entityData.syen_corporate_email_alt || '',
551
- syen_website: entityData.syen_website || '',
552
- syen_currency_sycr: entityData.syen_currency_sycr || '',
553
- syen_registered_address: entityData.syen_registered_address || '',
554
- syen_registered_city_sypin: entityData.syen_registered_city_sypin || '',
555
- syen_registered_state_sypin: entityData.syen_registered_state_sypin || '',
556
- syen_registered_country_syctr: entityData.syen_registered_country_syctr || '',
557
- syen_registered_pin_sypin: entityData.syen_registered_pin_sypin || '',
558
- syen_registered_contact_person_user: entityData.syen_registered_contact_person_user || '',
559
- syen_registered_phone: entityData.syen_registered_phone || '',
560
- syen_registered_email: entityData.syen_registered_email || '',
561
- syen_registered_fax: entityData.syen_registered_fax || '',
562
- syen_photo_id_cyfm: entityData.syen_photo_id_cyfm || ''
563
- };
564
- // Patch the form with the entity data
565
- this.entityForm.patchValue(formData, { emitEvent: false });
566
- console.log('✅ Form populated successfully');
567
- }
568
- catch (error) {
569
- console.error('💥 Error populating form with entity data:', error);
570
- this.error.set('Error loading entity data into form');
571
- }
572
- }
573
- // Setup listeners for postal code changes
574
- setupPostalCodeListeners() {
575
- // Corporate postal code listener
576
- this.entityForm.get('syen_corporate_pin_sypin')?.valueChanges.pipe(debounceTime(300), distinctUntilChanged(), takeUntil(this.destroy$)).subscribe(pinCodeId => {
577
- if (pinCodeId) {
578
- this.populateAddressFromPinCode(pinCodeId, 'corporate');
579
- }
580
- });
581
- // Registered postal code listener
582
- this.entityForm.get('syen_registered_pin_sypin')?.valueChanges.pipe(debounceTime(300), distinctUntilChanged(), takeUntil(this.destroy$)).subscribe(pinCodeId => {
583
- if (pinCodeId) {
584
- this.populateAddressFromPinCode(pinCodeId, 'registered');
585
- }
586
- });
587
- }
588
- // Auto-populate address fields based on selected postal code
589
- populateAddressFromPinCode(pinCodeId, addressType) {
590
- const pinCodeData = this.pinCodeDataMap.get(pinCodeId);
591
- console.log('🔍 Pin Code Data:', pinCodeData);
592
- if (!pinCodeData) {
593
- console.warn(`Pin code data not found for ID: ${pinCodeId}`);
594
- return;
595
- }
596
- const prefix = addressType === 'corporate' ? 'syen_corporate' : 'syen_registered';
597
- // Populate city, state, and country fields
598
- this.entityForm.patchValue({
599
- [`${prefix}_city_sypin`]: pinCodeData.sypin_district || '',
600
- [`${prefix}_state_sypin`]: pinCodeData.sypin_state_name || '',
601
- [`${prefix}_country_syctr`]: pinCodeData.sypin_country_id_syctr || ''
602
- }, { emitEvent: false });
603
- console.log(`📍 Auto-populated ${addressType} address from pin code:`, {
604
- city: pinCodeData.sypin_district,
605
- state: pinCodeData.sypin_state_name,
606
- country: pinCodeData.sypin_country_id_syctr
607
- });
608
- }
609
- loadDropdowns() {
610
- try {
611
- console.log('🚀 Loading dropdowns...');
612
- // Load entity types via general master service
613
- this.generalMasterService.getGeneralMasterByCode('core_entity_type').subscribe({
614
- next: (response) => {
615
- try {
616
- console.log('✅ Entity types response:', response);
617
- const types = this.transformGeneralMasterToDropdown(response);
618
- this.entityTypes.set(types);
619
- console.log('📋 Loaded entity types:', types.length);
620
- }
621
- catch (error) {
622
- console.error('💥 Entity types transform error:', error);
623
- this.entityTypes.set([]);
624
- }
625
- },
626
- error: (err) => {
627
- console.error('❌ Failed to load entity types:', err);
628
- this.entityTypes.set([]);
629
- }
630
- });
631
- // Load currencies via currency service
632
- this.currencyService.getAllCurrencies({}).subscribe({
633
- next: (response) => {
634
- try {
635
- console.log('✅ Currencies response:', response);
636
- const currencies = this.transformCurrencyToDropdown(response);
637
- this.currencies.set(currencies);
638
- console.log('💰 Loaded currencies:', currencies.length);
639
- }
640
- catch (error) {
641
- console.error('💥 Currencies transform error:', error);
642
- this.currencies.set([]);
643
- }
644
- },
645
- error: (err) => {
646
- console.error('❌ Failed to load currencies:', err);
647
- this.currencies.set([]);
648
- }
649
- });
650
- // Load users via user service
651
- this.userService.getAllUsers().subscribe({
652
- next: (response) => {
653
- try {
654
- console.log('✅ Users response:', response);
655
- const users = this.transformUserToDropdown(response);
656
- this.users.set(users);
657
- console.log('👥 Loaded users:', users.length);
658
- }
659
- catch (error) {
660
- console.error('💥 Users transform error:', error);
661
- this.users.set([]);
662
- }
663
- },
664
- error: (err) => {
665
- console.error('❌ Failed to load users:', err);
666
- this.users.set([]);
667
- }
668
- });
669
- // Load postal codes via pin code service
670
- this.pinCodeService.getAllPostalCodes().subscribe({
671
- next: (response) => {
672
- try {
673
- console.log('✅ Postal codes response:', response);
674
- const postalCodes = this.transformPinCodeToDropdown(response);
675
- this.postalCodes.set(postalCodes);
676
- console.log('📮 Loaded postal codes:', postalCodes.length);
677
- }
678
- catch (error) {
679
- console.error('💥 Postal codes transform error:', error);
680
- this.postalCodes.set([]);
681
- }
682
- },
683
- error: (err) => {
684
- console.error('❌ Failed to load postal codes:', err);
685
- this.postalCodes.set([]);
686
- }
687
- });
688
- // Load photo ID documents via general master service
689
- this.generalMasterService.getGeneralMasterByCode('core_photo_id_document').subscribe({
690
- next: (response) => {
691
- try {
692
- console.log('✅ Photo ID documents response:', response);
693
- const documents = this.transformGeneralMasterToDropdown(response);
694
- this.photoIdDocuments.set(documents);
695
- console.log('📄 Loaded photo ID documents:', documents.length);
696
- }
697
- catch (error) {
698
- console.error('💥 Photo ID documents transform error:', error);
699
- this.photoIdDocuments.set([]);
700
- }
701
- },
702
- error: (err) => {
703
- console.error('❌ Failed to load photo ID documents:', err);
704
- // Fallback to static data
705
- this.photoIdDocuments.set([
706
- { value: 'passport', label: 'Passport' },
707
- { value: 'license', label: 'Driver License' },
708
- { value: 'national_id', label: 'National ID' },
709
- { value: 'voter_id', label: 'Voter ID' },
710
- { value: 'other', label: 'Other' }
711
- ]);
712
- }
713
- });
714
- // Load countries via country service
715
- this.countryService.getAllCountries({}).subscribe({
716
- next: (response) => {
717
- try {
718
- console.log('✅ Countries response:', response);
719
- const countries = this.transformCountryToDropdown(response);
720
- this.countries.set(countries);
721
- console.log('🌍 Loaded countries:', countries.length);
722
- }
723
- catch (error) {
724
- console.error('💥 Countries transform error:', error);
725
- this.countries.set([]);
726
- }
727
- },
728
- error: (err) => {
729
- console.error('❌ Failed to load countries:', err);
730
- this.countries.set([]);
731
- }
732
- });
733
- }
734
- catch (error) {
735
- console.error('💥 LOADDROPDOWNS EXCEPTION:', error);
736
- }
737
- }
738
- // Helper method to transform general master response to dropdown options
739
- transformGeneralMasterToDropdown(response) {
740
- if (!response?.success || !response?.data) {
741
- return [];
742
- }
743
- let dataArray = [];
744
- // Handle different response structures - all general master data is in core_general_master
745
- if (Array.isArray(response.data)) {
746
- dataArray = response.data;
747
- }
748
- return dataArray.map((item, index) => {
749
- return {
750
- // API response already includes value and label fields
751
- value: item.value || item._id || `value_${index}`,
752
- label: item.label || item.sygms_title || 'Untitled'
753
- };
754
- });
755
- }
756
- // Helper method to transform currency response to dropdown options
757
- transformCurrencyToDropdown(response) {
758
- if (!response?.success || !response?.data) {
759
- return [];
760
- }
761
- console.log('🔍 Currency Response:', response);
762
- // Handle different response structures
763
- let dataArray = [];
764
- if (Array.isArray(response.data)) {
765
- dataArray = response.data;
766
- }
767
- return dataArray.map((item) => {
768
- return {
769
- value: item._id,
770
- label: `${item.sycr_code} - ${item.sycr_name} (${item.sycr_symbol})`
771
- };
772
- });
773
- }
774
- // Helper method to transform user response to dropdown options
775
- transformUserToDropdown(response) {
776
- if (!response?.success || !response?.data) {
777
- return [];
778
- }
779
- let dataArray = [];
780
- // Handle different response structures
781
- if (response.data.auth_user_mst) {
782
- dataArray = response.data.auth_user_mst;
783
- }
784
- else if (Array.isArray(response.data)) {
785
- dataArray = response.data;
786
- }
787
- return dataArray.map((item) => {
788
- return {
789
- value: item._id || "",
790
- label: item?.user_fullname || ""
791
- };
792
- });
793
- }
794
- // Helper method to transform pin code response to dropdown options
795
- transformPinCodeToDropdown(response) {
796
- if (!response?.success || !response?.data) {
797
- return [];
798
- }
799
- let dataArray = [];
800
- // Handle different response structures
801
- if ('core_pin_code' in response.data && response.data.core_pin_code) {
802
- dataArray = response.data.core_pin_code;
803
- }
804
- // Clear the data map and rebuild it
805
- this.pinCodeDataMap.clear();
806
- return dataArray.map((item) => {
807
- const pinCodeId = String(item._id);
808
- // Store the full pin code data for auto-population
809
- this.pinCodeDataMap.set(pinCodeId, item);
810
- // API response already includes value and label fields
811
- return {
812
- value: pinCodeId,
813
- label: `${item.sypin_pincode} - ${item.sypin_office_name || 'Unknown Office'}`
814
- };
815
- });
816
- }
817
- // Helper method to transform country response to dropdown options
818
- transformCountryToDropdown(response) {
819
- try {
820
- if (!response?.success || !response?.data) {
821
- console.warn('⚠️ Country response missing success or data:', response);
822
- return [];
823
- }
824
- console.log('🔍 Country Response:', response);
825
- let dataArray = [];
826
- // Handle different response structures
827
- if (Array.isArray(response.data)) {
828
- dataArray = response.data;
829
- }
830
- else if (response.data) {
831
- dataArray = response.data;
832
- }
833
- console.log('🔍 Country data array length:', dataArray.length);
834
- return dataArray.map((item) => {
835
- return {
836
- value: item._id || "",
837
- label: `${item.syctr_country_iso_name || 'Unknown'} (${item.syctr_country_iso_code_two_char || 'XX'})`
838
- };
839
- });
840
- }
841
- catch (error) {
842
- console.error('💥 COUNTRY TRANSFORM EXCEPTION:', error);
843
- return [];
844
- }
845
- }
846
- // Helper method to get form control
847
- getControl(controlName) {
848
- return this.entityForm.get(controlName);
849
- }
850
- // Handle postal code search with debouncing
851
- onPostalCodeSearch(event) {
852
- try {
853
- console.log('🔍 POSTAL CODE SEARCH EVENT:', event);
854
- // Set loading state
855
- this.postalCodesLoading.set(true);
856
- const payload = {
857
- sypin_pincode: event.query || "",
858
- sypin_id: event.value || ""
859
- };
860
- console.log('🔍 POSTAL CODE PAYLOAD:', payload);
861
- this.pinCodeService.searchPinCodes(payload).pipe(takeUntil(this.destroy$)).subscribe({
862
- next: (response) => {
863
- console.log('✅ POSTAL CODE SEARCH SUCCESS:', response);
864
- const postalCodes = this.transformPinCodeToDropdown(response);
865
- this.postalCodes.set(postalCodes);
866
- console.log('📮 Updated postal codes count:', postalCodes.length);
867
- },
868
- error: (err) => {
869
- console.error('❌ POSTAL CODE SEARCH ERROR:', err);
870
- this.postalCodes.set([]);
871
- },
872
- complete: () => {
873
- // Clear loading state
874
- this.postalCodesLoading.set(false);
875
- }
876
- });
877
- }
878
- catch (error) {
879
- console.error('💥 POSTAL CODE SEARCH EXCEPTION:', error);
880
- this.postalCodes.set([]);
881
- this.postalCodesLoading.set(false);
882
- }
883
- }
884
- // Handle user search
885
- onUserSearch(event) {
886
- try {
887
- console.log('🔍 USER SEARCH EVENT:', event);
888
- // Set loading state
889
- this.usersLoading.set(true);
890
- const payload = {
891
- user_fullname: event?.query || "",
892
- user_id: event?.value || "",
893
- };
894
- console.log('🔍 USER SEARCH PAYLOAD:', payload);
895
- this.userService.searchUsersByFullname(payload).subscribe({
896
- next: (response) => {
897
- console.log('✅ USER SEARCH SUCCESS:', response);
898
- const users = this.transformUserToDropdown(response);
899
- this.users.set(users);
900
- console.log('👥 Updated users count:', users.length);
901
- },
902
- error: (err) => {
903
- console.error('❌ USER SEARCH ERROR:', err);
904
- this.users.set([]);
905
- },
906
- complete: () => {
907
- // Clear loading state
908
- this.usersLoading.set(false);
909
- }
910
- });
911
- }
912
- catch (error) {
913
- console.error('💥 USER SEARCH EXCEPTION:', error);
914
- this.users.set([]);
915
- this.usersLoading.set(false);
916
- }
917
- }
918
- // Handle country search
919
- onCountrySearch(event) {
920
- try {
921
- console.log('🔍 COUNTRY SEARCH EVENT:', event);
922
- // Set loading state
923
- this.countriesLoading.set(true);
924
- const payload = {
925
- query: event.query,
926
- syctr_id: event.value,
927
- };
928
- console.log('🔍 COUNTRY SEARCH PAYLOAD:', payload);
929
- this.countryService.getAllCountries(payload).subscribe({
930
- next: (response) => {
931
- console.log('✅ COUNTRY SEARCH SUCCESS:', response);
932
- const countries = this.transformCountryToDropdown(response);
933
- this.countries.set(countries);
934
- console.log('🌍 Updated countries count:', countries.length);
935
- },
936
- error: (err) => {
937
- console.error('❌ COUNTRY SEARCH ERROR:', err);
938
- this.countries.set([]);
939
- },
940
- complete: () => {
941
- // Clear loading state
942
- this.countriesLoading.set(false);
943
- }
944
- });
945
- }
946
- catch (error) {
947
- console.error('💥 COUNTRY SEARCH EXCEPTION:', error);
948
- this.countries.set([]);
949
- this.countriesLoading.set(false);
950
- }
951
- }
952
- // Handle postal code selection
953
- onPostalCodeSelection(event) {
954
- let pinCodeId = '';
955
- if (typeof event === 'string') {
956
- pinCodeId = event;
957
- }
958
- else {
959
- const target = event.target;
960
- pinCodeId = target?.value || '';
961
- }
962
- console.log('📍 Postal Code Selected:', pinCodeId);
963
- // The auto-population is handled by the form value change listeners
964
- // This method can be used for additional logic if needed
965
- }
966
- // Check if a field has an error
967
- hasError(controlName, errorType) {
968
- const control = this.getControl(controlName);
969
- if (!control)
970
- return false;
971
- if (errorType) {
972
- return control.hasError(errorType) && (control.dirty || control.touched);
973
- }
974
- return control.invalid && (control.dirty || control.touched);
975
- }
976
- // Get error message for a field
977
- getErrorMessage(controlName) {
978
- const control = this.getControl(controlName);
979
- if (!control || !control.errors)
980
- return '';
981
- const fieldName = controlName.replace('syen_', '').replace(/_/g, ' ').replace(/\b\w/g, l => l.toUpperCase());
982
- if (control.hasError('required')) {
983
- return `${fieldName} is required`;
984
- }
985
- if (control.hasError('maxlength')) {
986
- return `Maximum length is ${control.errors['maxlength'].requiredLength} characters`;
987
- }
988
- if (control.hasError('email')) {
989
- return 'Please enter a valid email address';
990
- }
991
- if (control.hasError('pattern')) {
992
- return 'Please enter a valid URL starting with http:// or https://';
993
- }
994
- return 'Invalid input';
995
- }
996
- // Get form validation summary
997
- getFormValidationSummary() {
998
- const errors = [];
999
- Object.keys(this.entityForm.controls).forEach(key => {
1000
- const control = this.entityForm.get(key);
1001
- if (control && control.invalid && (control.dirty || control.touched)) {
1002
- errors.push(this.getErrorMessage(key));
1003
- }
1004
- });
1005
- return errors;
1006
- }
1007
- // Check if form is valid
1008
- get isFormValid() {
1009
- return this.entityForm.valid;
1010
- }
1011
- // Get current mode for display
1012
- get currentMode() {
1013
- return this.isEditMode() ? 'Edit' : 'Create';
1014
- }
1015
- // Get current entity ID for display
1016
- get currentEntityId() {
1017
- return this.entityId();
1018
- }
1019
- onFileChange(event) {
1020
- if (event && event.length > 0) {
1021
- this.logoFile = event[0];
1022
- console.log('�� Logo File Selected:', this.logoFile.name);
1023
- }
1024
- else {
1025
- this.logoFile = undefined;
1026
- console.log('📄 No logo file selected.');
1027
- }
1028
- }
1029
- onTabChange(tab) {
1030
- this.activeTab.set(tab.id);
1031
- }
1032
- onSubmit() {
1033
- if (this.entityForm.valid) {
1034
- this.loading.set(true);
1035
- this.error.set(null);
1036
- this.success.set(null);
1037
- const formData = this.entityForm.value;
1038
- const isEdit = this.isEditMode();
1039
- const entityId = this.entityId();
1040
- console.log(`🏢 ENTITY ${isEdit ? 'UPDATE' : 'CREATE'}: Form data:`, formData);
1041
- // Validate required fields before submission
1042
- const requiredFields = ['syen_name', 'syen_entity_code', 'syen_entity_type_gmst'];
1043
- const missingFields = requiredFields.filter(field => !formData[field]);
1044
- if (missingFields.length > 0) {
1045
- this.error.set(`Missing required fields: ${missingFields.join(', ')}`);
1046
- this.loading.set(false);
1047
- return;
1048
- }
1049
- // Add entity ID to form data if in edit mode
1050
- if (isEdit && entityId) {
1051
- formData._id = entityId;
1052
- }
1053
- const saveOperation = this.entityService.saveUpdateEntity(formData);
1054
- saveOperation.pipe(takeUntil(this.destroy$))
1055
- .subscribe({
1056
- next: (response) => {
1057
- console.log(`✅ ENTITY ${isEdit ? 'UPDATE' : 'CREATE'} SUCCESS:`, response);
1058
- if (response?.success) {
1059
- const successMessage = isEdit
1060
- ? 'Entity updated successfully!'
1061
- : 'Entity created successfully!';
1062
- this.success.set(successMessage);
1063
- // Update the entity ID if it's a new entity
1064
- if (!isEdit && response?.data) {
1065
- const entityData = Array.isArray(response.data) ? response.data[0] : response.data;
1066
- if (entityData?._id) {
1067
- this.entityId.set(entityData._id);
1068
- this.isEditMode.set(true);
1069
- }
1070
- }
1071
- // Optionally redirect to list or stay on form
1072
- // this.router.navigate(['/admin/entities']);
1073
- }
1074
- else {
1075
- this.error.set(response?.message || `Failed to ${isEdit ? 'update' : 'create'} entity. Please try again.`);
1076
- }
1077
- this.loading.set(false);
1078
- },
1079
- error: (err) => {
1080
- console.error(`❌ ENTITY ${isEdit ? 'UPDATE' : 'CREATE'} ERROR:`, err);
1081
- let errorMessage = `Failed to ${isEdit ? 'update' : 'save'} entity settings.`;
1082
- if (err?.error?.message) {
1083
- errorMessage = err.error.message;
1084
- }
1085
- else if (err?.message) {
1086
- errorMessage = err.message;
1087
- }
1088
- else if (err?.status === 400) {
1089
- errorMessage = 'Invalid data provided. Please check your input.';
1090
- }
1091
- else if (err?.status === 404 && isEdit) {
1092
- errorMessage = 'Entity not found. It may have been deleted.';
1093
- }
1094
- else if (err?.status === 409) {
1095
- errorMessage = 'Entity with this code already exists. Please use a different code.';
1096
- }
1097
- else if (err?.status === 500) {
1098
- errorMessage = 'Server error. Please try again later.';
1099
- }
1100
- this.error.set(errorMessage);
1101
- this.loading.set(false);
1102
- }
1103
- });
1104
- }
1105
- else {
1106
- // Mark all fields as touched to show validation errors
1107
- this.entityForm.markAllAsTouched();
1108
- const validationErrors = this.getFormValidationSummary();
1109
- console.warn('⚠️ FORM VALIDATION ERRORS:', validationErrors);
1110
- this.error.set(`Please fix the following errors: ${validationErrors.join(', ')}`);
1111
- }
1112
- }
1113
- onReset() {
1114
- // Clear logo file
1115
- this.logoFile = undefined;
1116
- // Reset form to initial values
1117
- this.entityForm.reset({
1118
- syen_name: '',
1119
- syen_entity_type_gmst: '',
1120
- syen_entity_code: '',
1121
- syen_udise_no: '',
1122
- syen_affiliation_no: '',
1123
- syen_isactive: true,
1124
- syen_corporate_address: '',
1125
- syen_corporate_pin_sypin: '',
1126
- syen_corporate_city_sypin: '',
1127
- syen_corporate_state_sypin: '',
1128
- syen_corporate_country_syctr: '',
1129
- syen_corporate_contact_person_user: '',
1130
- syen_corporate_phone: '',
1131
- syen_corporate_phone_alt: '',
1132
- syen_corporate_fax: '',
1133
- syen_corporate_email: '',
1134
- syen_corporate_email_alt: '',
1135
- syen_website: '',
1136
- syen_currency_sycr: '',
1137
- syen_registered_address: '',
1138
- syen_registered_pin_sypin: '',
1139
- syen_registered_city_sypin: '',
1140
- syen_registered_state_sypin: '',
1141
- syen_registered_country_syctr: '',
1142
- syen_registered_contact_person_user: '',
1143
- syen_registered_phone: '',
1144
- syen_registered_fax: '',
1145
- syen_registered_email: '',
1146
- syen_photo_id_cyfm: ''
1147
- });
1148
- this.success.set(null);
1149
- this.error.set(null);
1150
- console.log('🔄 Form reset completed');
1151
- }
1152
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CideAdmEntityComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1153
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.7", type: CideAdmEntityComponent, isStandalone: true, selector: "cide-adm-entity", ngImport: i0, template: "<!-- \n DYNAMIC GRID SYSTEM FEATURES:\n \n Basic Grids: grid-1, grid-2, grid-3, grid-4, grid-5, grid-6\n \n Auto-fit Grids: grid-auto-fit-sm/md/lg/xl (dynamic columns based on content)\n Auto-fill Grids: grid-auto-fill-sm/md/lg (always fill available space)\n \n Custom Ratios: grid-ratio-1-2, grid-ratio-2-1, grid-ratio-1-3, grid-ratio-3-1, etc.\n Fractional: grid-quarter-three, grid-third-two, grid-half-half\n \n Gap Control: gap-xs, gap-sm, gap-md, gap-lg, gap-xl\n Specific Gaps: row-gap-xs/sm/md/lg, col-gap-xs/sm/md/lg\n \n Alignment: align-start/center/end/stretch, justify-start/center/end/stretch\n \n Responsive: xl-grid-*, lg-grid-*, md-grid-*, sm-grid-*, xs-grid-*\n \n Grid Items: span-1/2/3/4/5/6/full, row-span-*, start-*, end-*\n Item Alignment: self-start/center/end/stretch, justify-self-*\n \n Special: grid-dense (auto-fills gaps), grid-masonry (masonry layout)\n-->\n\n<div class=\"entity-form-container\">\n <form class=\"entity-form\" [formGroup]=\"entityForm\" [class.loading]=\"loading()\" (ngSubmit)=\"onSubmit()\">\n \n <!-- Header Section -->\n <div class=\"form-header\">\n <h2 class=\"form-title\">Create New Entity</h2>\n <p class=\"form-subtitle\">Add a new educational institution to the system</p>\n </div>\n\n <!-- Success and Error Messages -->\n @if (success()) {\n <div class=\"alert alert-success\">\n <svg class=\"alert-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M5 13l4 4L19 7\"></path>\n </svg>\n {{ success() }}\n </div>\n }\n @if (error()) {\n <div class=\"alert alert-error\">\n <svg class=\"alert-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M6 18L18 6M6 6l12 12\"></path>\n </svg>\n {{ error() }}\n </div>\n }\n\n <!-- Tab Navigation -->\n <div class=\"form-tabs\">\n <cide-ele-tab \n [tabs]=\"entityTabs()\"\n [activeTabId]=\"activeTab()\"\n size=\"md\"\n variant=\"default\"\n (tabChange)=\"onTabChange($event)\">\n </cide-ele-tab>\n </div>\n\n <!-- Tab Content -->\n <div class=\"tab-content\"\n [class.loading]=\"loading()\">\n @switch (activeTab()) {\n \n @case ('basic') {\n <!-- Basic Information Section -->\n <div class=\"form-section\">\n <div class=\"grid grid-auto-fit-md gap-md lg-grid-2 md-grid-1\">\n <div class=\"grid-item span-2 md-span-full\">\n <cide-ele-input \n id=\"syen_name\" \n type=\"text\"\n label=\"Institution Name\" \n formControlName=\"syen_name\"\n placeholder=\"Enter full institution name\">\n </cide-ele-input>\n </div>\n \n <cide-ele-input \n label=\"Institution Code\" \n formControlName=\"syen_entity_code\"\n id=\"syen_entity_code\"\n placeholder=\"Enter unique code (max 40 characters)\">\n </cide-ele-input>\n </div>\n\n <div class=\"grid grid-ratio-2-1-1 gap-md lg-grid-3 md-grid-2 sm-grid-1\">\n <cide-ele-select \n label=\"Entity Type\" \n [options]=\"entityTypes()\" \n formControlName=\"syen_entity_type_gmst\"\n placeholder=\"Select entity type\">\n </cide-ele-select>\n \n <cide-ele-input \n label=\"UDISE Number\" \n formControlName=\"syen_udise_no\"\n placeholder=\"Enter UDISE number\">\n </cide-ele-input>\n \n <cide-ele-input \n label=\"Affiliation Number\" \n formControlName=\"syen_affiliation_no\"\n placeholder=\"Enter affiliation number\">\n </cide-ele-input>\n </div>\n\n <div class=\"grid grid-1 gap-sm\">\n <div class=\"checkbox-field\">\n <label class=\"checkbox-label\">\n <input \n type=\"checkbox\" \n formControlName=\"syen_isactive\"\n class=\"checkbox-input\" />\n <span class=\"checkbox-text\">Active Status</span>\n <span class=\"checkbox-description\">Enable this entity for system operations</span>\n </label>\n </div>\n </div>\n </div>\n }\n\n @case ('corporate') {\n <!-- Corporate Address Section -->\n <div class=\"form-section\">\n <div class=\"grid grid-1 gap-md\">\n <div class=\"grid-item span-full\">\n <cide-ele-textarea \n label=\"Corporate Address\" \n formControlName=\"syen_corporate_address\"\n placeholder=\"Enter complete corporate address\"\n [rows]=\"3\">\n </cide-ele-textarea>\n </div>\n </div>\n\n <div class=\"grid grid-auto-fit-sm gap-lg xl-grid-4 lg-grid-3 md-grid-2 sm-grid-1 align-end\">\n <cide-ele-select \n label=\"Postal Code\"\n [options]=\"postalCodes()\" \n formControlName=\"syen_corporate_pin_sypin\"\n placeholder=\"Select postal code\"\n [searchable]=\"true\"\n [loading]=\"postalCodesLoading()\"\n (searchChange)=\"onPostalCodeSearch($event)\"\n (selectionChange)=\"onPostalCodeSelection($event)\">\n </cide-ele-select>\n \n <cide-ele-input \n label=\"City\" \n formControlName=\"syen_corporate_city_sypin\"\n placeholder=\"Enter city\">\n </cide-ele-input>\n \n <cide-ele-input \n label=\"State\" \n formControlName=\"syen_corporate_state_sypin\"\n placeholder=\"Enter state\">\n </cide-ele-input>\n \n <cide-ele-select \n label=\"Country\" \n [options]=\"countries()\" \n formControlName=\"syen_corporate_country_syctr\"\n placeholder=\"Select country\"\n [searchable]=\"true\"\n [loading]=\"countriesLoading()\"\n (searchChange)=\"onCountrySearch($event)\">\n </cide-ele-select>\n </div>\n </div>\n }\n\n @case ('contact') {\n <!-- Contact Information Section -->\n <div class=\"form-section\">\n <div class=\"grid grid-ratio-3-1 gap-lg md-grid-2 sm-grid-1 justify-stretch\">\n <div class=\"grid-item justify-self-stretch\">\n <cide-ele-select \n label=\"Primary Contact Person\"\n [options]=\"users()\" \n formControlName=\"syen_corporate_contact_person_user\"\n placeholder=\"Select contact person\"\n [searchable]=\"true\"\n [loading]=\"usersLoading()\"\n (searchChange)=\"onUserSearch($event)\">\n </cide-ele-select>\n </div>\n \n <div class=\"grid-item justify-self-stretch\">\n <cide-ele-select \n label=\"Currency\" \n [options]=\"currencies()\" \n formControlName=\"syen_currency_sycr\"\n placeholder=\"Select currency\">\n </cide-ele-select>\n </div>\n </div>\n\n <div class=\"grid grid-auto-fill-md gap-md col-gap-lg row-gap-sm xl-grid-3 lg-grid-2 md-grid-1 grid-dense\">\n <cide-ele-input \n label=\"Primary Phone\" \n formControlName=\"syen_corporate_phone\"\n type=\"tel\"\n placeholder=\"Enter phone number\">\n </cide-ele-input>\n \n <cide-ele-input \n label=\"Alternate Phone\" \n formControlName=\"syen_corporate_phone_alt\"\n type=\"tel\"\n placeholder=\"Enter alternate phone\">\n </cide-ele-input>\n \n <cide-ele-input \n label=\"Fax Number\" \n formControlName=\"syen_corporate_fax\"\n placeholder=\"Enter fax number\">\n </cide-ele-input>\n </div>\n\n <div class=\"grid grid-ratio-1-2-1 gap-xl lg-grid-3 md-grid-2 sm-grid-1 align-center\">\n <div class=\"grid-item self-stretch\">\n <cide-ele-input \n label=\"Primary Email\" \n formControlName=\"syen_corporate_email\"\n type=\"email\"\n placeholder=\"Enter primary email\">\n </cide-ele-input>\n </div>\n \n <div class=\"grid-item span-2 lg-span-1 self-stretch\">\n <cide-ele-input \n label=\"Website URL\" \n formControlName=\"syen_website\"\n type=\"url\"\n placeholder=\"Enter website URL\">\n </cide-ele-input>\n </div>\n \n <div class=\"grid-item self-stretch\">\n <cide-ele-input \n label=\"Alternate Email\" \n formControlName=\"syen_corporate_email_alt\"\n type=\"email\"\n placeholder=\"Enter alternate email\">\n </cide-ele-input>\n </div>\n </div>\n </div>\n }\n\n @case ('registered') {\n <!-- Registered Address Section -->\n <div class=\"form-section\">\n <div class=\"grid grid-1\">\n <cide-ele-textarea \n label=\"Registered Address\" \n formControlName=\"syen_registered_address\"\n placeholder=\"Enter complete registered address\"\n [rows]=\"3\">\n </cide-ele-textarea>\n </div>\n\n <div class=\"grid grid-4\">\n <cide-ele-select \n label=\"Registered Postal Code\"\n [options]=\"postalCodes()\" \n formControlName=\"syen_registered_pin_sypin\"\n placeholder=\"Select postal code\"\n [searchable]=\"true\"\n [loading]=\"postalCodesLoading()\"\n (searchChange)=\"onPostalCodeSearch($event)\"\n (selectionChange)=\"onPostalCodeSelection($event)\">\n </cide-ele-select>\n \n <cide-ele-input \n label=\"Registered City\" \n formControlName=\"syen_registered_city_sypin\"\n placeholder=\"Enter city\">\n </cide-ele-input>\n \n <cide-ele-input \n label=\"Registered State\" \n formControlName=\"syen_registered_state_sypin\"\n placeholder=\"Enter state\">\n </cide-ele-input>\n \n <cide-ele-select \n label=\"Registered Country\" \n [options]=\"countries()\" \n formControlName=\"syen_registered_country_syctr\"\n placeholder=\"Select country\"\n [searchable]=\"true\"\n [loading]=\"countriesLoading()\"\n (searchChange)=\"onCountrySearch($event)\">\n </cide-ele-select>\n </div>\n\n <div class=\"grid grid-3\">\n <cide-ele-select \n label=\"Registered Contact Person\"\n [options]=\"users()\" \n formControlName=\"syen_registered_contact_person_user\"\n placeholder=\"Select contact person\"\n [searchable]=\"true\"\n [loading]=\"usersLoading()\"\n (searchChange)=\"onUserSearch($event)\">\n </cide-ele-select>\n \n <cide-ele-input \n label=\"Registered Phone\" \n formControlName=\"syen_registered_phone\"\n type=\"tel\"\n placeholder=\"Enter phone number\">\n </cide-ele-input>\n \n <cide-ele-input \n label=\"Registered Email\" \n formControlName=\"syen_registered_email\"\n type=\"email\"\n placeholder=\"Enter email\">\n </cide-ele-input>\n @if (hasError('syen_registered_email')) {\n <div class=\"error-message\">{{ getErrorMessage('syen_registered_email') }}</div>\n }\n </div>\n\n <div class=\"grid grid-1\">\n <cide-ele-input \n label=\"Registered Fax\" \n formControlName=\"syen_registered_fax\"\n placeholder=\"Enter fax number\">\n </cide-ele-input>\n </div>\n </div>\n }\n\n @case ('documents') {\n <!-- Documents Section -->\n <div class=\"form-section\">\n <!-- Photo ID Document -->\n <div class=\"grid grid-1 gap-md\">\n <cide-ele-select \n label=\"Photo ID Document\" \n [options]=\"photoIdDocuments()\" \n formControlName=\"syen_photo_id_cyfm\"\n placeholder=\"Select photo ID document\">\n </cide-ele-select>\n </div>\n\n <!-- Logo Upload -->\n <div class=\"grid grid-quarter-three gap-lg md-grid-1 align-center\">\n <div class=\"grid-item self-center justify-self-center\">\n <!-- Logo preview placeholder -->\n <div style=\"width: 120px; height: 120px; border: 2px dashed #cbd5e1; border-radius: 8px; display: flex; align-items: center; justify-content: center; color: #9ca3af; font-size: 0.875rem; text-align: center;\">\n Logo Preview\n </div>\n </div>\n <div class=\"grid-item self-stretch\">\n <cide-ele-file-input \n label=\"Upload Logo\" \n accept=\"image/*\" \n [multiple]=\"false\" \n (fileChange)=\"onFileChange($event)\"\n placeholder=\"Select institution logo or image\">\n </cide-ele-file-input>\n </div>\n </div>\n </div>\n }\n }\n </div>\n\n <!-- Form Actions -->\n <div class=\"form-actions\">\n <button cideEleButton\n type=\"button\" \n variant=\"secondary\" \n (click)=\"onReset()\" \n leftIcon=\"refresh\"\n [disabled]=\"loading()\">\n Reset Form\n </button>\n \n <button cideEleButton\n type=\"submit\" \n variant=\"primary\" \n [disabled]=\"loading() || entityForm.invalid\"\n [loading]=\"loading()\"\n leftIcon=\"check\">\n Create Entity\n </button>\n </div>\n </form>\n</div> ", styles: [".entity-form-container{background:transparent;padding:1rem;width:100%;box-sizing:border-box}.entity-form{max-width:1200px;margin:0 auto;background:transparent;border:none;box-shadow:none;width:100%}.entity-form.loading{opacity:.6;pointer-events:none}.form-header{background:transparent;color:#1f2937;padding:1.25rem 0;text-align:left}.form-header .form-title{font-size:1.5rem;font-weight:700;margin:0 0 .25rem;color:#1f2937}.form-header .form-subtitle{font-size:.95rem;opacity:.7;margin:0;font-weight:400;color:#6b7280}.form-section{padding:1.25rem 0;border-bottom:none;margin-bottom:1.5rem}.form-section:last-of-type{margin-bottom:0}.form-section .section-title{font-size:1.125rem;font-weight:600;color:#1f2937;margin:0 0 1rem;padding-bottom:.5rem;border-bottom:1px solid #e5e7eb;position:relative}.form-section .section-title:after{content:\"\";position:absolute;bottom:-1px;left:0;width:40px;height:1px;background:#667eea;border-radius:1px}.grid{display:grid;gap:1rem;margin-bottom:.75rem;transition:all .3s ease}.grid:last-child{margin-bottom:0}.grid.grid-1{grid-template-columns:1fr}.grid.grid-2{grid-template-columns:repeat(2,1fr)}.grid.grid-3{grid-template-columns:repeat(3,1fr)}.grid.grid-4{grid-template-columns:repeat(4,1fr)}.grid.grid-5{grid-template-columns:repeat(5,1fr)}.grid.grid-6{grid-template-columns:repeat(6,1fr)}.grid.grid-auto-fit-sm{grid-template-columns:repeat(auto-fit,minmax(200px,1fr))}.grid.grid-auto-fit-md{grid-template-columns:repeat(auto-fit,minmax(250px,1fr))}.grid.grid-auto-fit-lg{grid-template-columns:repeat(auto-fit,minmax(300px,1fr))}.grid.grid-auto-fit-xl{grid-template-columns:repeat(auto-fit,minmax(350px,1fr))}.grid.grid-auto-fill-sm{grid-template-columns:repeat(auto-fill,minmax(200px,1fr))}.grid.grid-auto-fill-md{grid-template-columns:repeat(auto-fill,minmax(250px,1fr))}.grid.grid-auto-fill-lg{grid-template-columns:repeat(auto-fill,minmax(300px,1fr))}.grid.grid-ratio-1-2{grid-template-columns:1fr 2fr}.grid.grid-ratio-2-1{grid-template-columns:2fr 1fr}.grid.grid-ratio-1-3{grid-template-columns:1fr 3fr}.grid.grid-ratio-3-1{grid-template-columns:3fr 1fr}.grid.grid-ratio-1-2-1{grid-template-columns:1fr 2fr 1fr}.grid.grid-ratio-2-1-1{grid-template-columns:2fr 1fr 1fr}.grid.grid-quarter-three{grid-template-columns:1fr 3fr}.grid.grid-third-two{grid-template-columns:1fr 2fr}.grid.grid-half-half{grid-template-columns:1fr 1fr}.grid.gap-xs{gap:.25rem}.grid.gap-sm{gap:.5rem}.grid.gap-md{gap:1rem}.grid.gap-lg{gap:1.5rem}.grid.gap-xl{gap:2rem}.grid.row-gap-xs{row-gap:.25rem}.grid.row-gap-sm{row-gap:.5rem}.grid.row-gap-md{row-gap:1rem}.grid.row-gap-lg{row-gap:1.5rem}.grid.col-gap-xs{column-gap:.25rem}.grid.col-gap-sm{column-gap:.5rem}.grid.col-gap-md{column-gap:1rem}.grid.col-gap-lg{column-gap:1.5rem}.grid.align-start{align-items:start}.grid.align-center{align-items:center}.grid.align-end{align-items:end}.grid.align-stretch{align-items:stretch}.grid.justify-start{justify-items:start}.grid.justify-center{justify-items:center}.grid.justify-end{justify-items:end}.grid.justify-stretch{justify-items:stretch}.grid.grid-dense{grid-auto-flow:dense}.grid.grid-masonry{grid-auto-rows:min-content;align-items:start}@media (min-width: 1200px){.grid.xl-grid-1{grid-template-columns:1fr}.grid.xl-grid-2{grid-template-columns:repeat(2,1fr)}.grid.xl-grid-3{grid-template-columns:repeat(3,1fr)}.grid.xl-grid-4{grid-template-columns:repeat(4,1fr)}.grid.xl-grid-5{grid-template-columns:repeat(5,1fr)}.grid.xl-grid-6{grid-template-columns:repeat(6,1fr)}}@media (max-width: 1199px) and (min-width: 992px){.grid.lg-grid-1{grid-template-columns:1fr}.grid.lg-grid-2{grid-template-columns:repeat(2,1fr)}.grid.lg-grid-3{grid-template-columns:repeat(3,1fr)}.grid.lg-grid-4{grid-template-columns:repeat(4,1fr)}}@media (max-width: 991px) and (min-width: 768px){.grid.md-grid-1{grid-template-columns:1fr}.grid.md-grid-2{grid-template-columns:repeat(2,1fr)}.grid.md-grid-3{grid-template-columns:repeat(3,1fr)}}@media (max-width: 767px) and (min-width: 576px){.grid.sm-grid-1{grid-template-columns:1fr}.grid.sm-grid-2{grid-template-columns:repeat(2,1fr)}}@media (max-width: 575px){.grid.xs-grid-1{grid-template-columns:1fr}}@media (max-width: 1024px){.grid.grid-4:not([class*=lg-grid]):not([class*=md-grid]){grid-template-columns:repeat(2,1fr)}.grid.grid-5:not([class*=lg-grid]):not([class*=md-grid]),.grid.grid-6:not([class*=lg-grid]):not([class*=md-grid]){grid-template-columns:repeat(3,1fr)}}@media (max-width: 768px){.grid{gap:.75rem}.grid.grid-2:not([class*=sm-grid]):not([class*=xs-grid]),.grid.grid-3:not([class*=sm-grid]):not([class*=xs-grid]),.grid.grid-4:not([class*=sm-grid]):not([class*=xs-grid]),.grid.grid-5:not([class*=sm-grid]):not([class*=xs-grid]),.grid.grid-6:not([class*=sm-grid]):not([class*=xs-grid]){grid-template-columns:1fr}.grid.gap-lg{gap:1rem}.grid.gap-xl{gap:1.25rem}}@media (max-width: 480px){.grid{gap:.5rem}.grid:not([class*=xs-grid]){grid-template-columns:1fr!important}.grid.gap-md{gap:.75rem}.grid.gap-lg,.grid.gap-xl{gap:1rem}}.grid-item.span-1{grid-column:span 1}.grid-item.span-2{grid-column:span 2}.grid-item.span-3{grid-column:span 3}.grid-item.span-4{grid-column:span 4}.grid-item.span-5{grid-column:span 5}.grid-item.span-6{grid-column:span 6}.grid-item.span-full{grid-column:1/-1}.grid-item.row-span-1{grid-row:span 1}.grid-item.row-span-2{grid-row:span 2}.grid-item.row-span-3{grid-row:span 3}.grid-item.row-span-4{grid-row:span 4}.grid-item.start-1{grid-column-start:1}.grid-item.start-2{grid-column-start:2}.grid-item.start-3{grid-column-start:3}.grid-item.start-4{grid-column-start:4}.grid-item.end-1{grid-column-end:1}.grid-item.end-2{grid-column-end:2}.grid-item.end-3{grid-column-end:3}.grid-item.end-4{grid-column-end:4}.grid-item.end-auto{grid-column-end:auto}.grid-item.self-start{align-self:start}.grid-item.self-center{align-self:center}.grid-item.self-end{align-self:end}.grid-item.self-stretch{align-self:stretch}.grid-item.justify-self-start{justify-self:start}.grid-item.justify-self-center{justify-self:center}.grid-item.justify-self-end{justify-self:end}.grid-item.justify-self-stretch{justify-self:stretch}@media (max-width: 768px){.grid-item.md-span-1{grid-column:span 1}.grid-item.md-span-2{grid-column:span 2}.grid-item.md-span-full{grid-column:1/-1}}@media (max-width: 480px){.grid-item.sm-span-full{grid-column:1/-1}}.checkbox-field{margin:.25rem 0}.checkbox-label{display:flex;flex-direction:column;gap:.25rem;cursor:pointer;padding:.75rem 0;background:transparent;border:none;border-radius:0;transition:all .2s ease}.checkbox-label:hover{background:#667eea05}.checkbox-label .checkbox-input{width:1rem;height:1rem;accent-color:#667eea;border-radius:3px;margin-bottom:.125rem}.checkbox-label .checkbox-text{font-weight:600;color:#374151;font-size:.875rem}.checkbox-label .checkbox-description{font-size:.75rem;color:#6b7280;margin-top:.125rem}.alert{display:flex;align-items:center;gap:.5rem;padding:.75rem 0;margin:1rem 0;border-radius:0;font-weight:500;font-size:.875rem;border-left:3px solid}.alert .alert-icon{width:1rem;height:1rem;flex-shrink:0}.alert.alert-success{background:#dcfce74d;border-left-color:#22c55e;color:#166534}.alert.alert-error{background:#fef2f24d;border-left-color:#ef4444;color:#dc2626}.error-message{font-size:.75rem;color:#dc2626;margin-top:.25rem;padding-left:.125rem;font-weight:500}.form-tabs{padding:0;margin:1rem 0;border-bottom:1px solid #e5e7eb}.tab-content{transition:opacity .2s ease}.tab-content.loading{opacity:.6;pointer-events:none}.form-actions{display:flex;justify-content:flex-end;gap:.75rem;padding:1rem 0;background:#fff;border-top:1px solid #e5e7eb;margin-top:2rem;position:sticky;bottom:0}@media (max-width: 640px){.form-actions{flex-direction:column-reverse}}.btn{display:inline-flex;align-items:center;justify-content:center;gap:.375rem;padding:.5rem 1rem;font-weight:600;font-size:.8125rem;border-radius:6px;border:none;cursor:pointer;transition:all .2s ease;min-width:120px;position:relative}.btn .btn-icon{width:.875rem;height:.875rem}.btn:disabled{opacity:.6;cursor:not-allowed}.btn.btn-primary{background:linear-gradient(135deg,#667eea,#764ba2);color:#fff;box-shadow:0 4px 6px -1px #667eea4d}.btn.btn-primary:hover:not(:disabled){transform:translateY(-1px);box-shadow:0 8px 12px -2px #667eea66}.btn.btn-primary:active:not(:disabled){transform:translateY(0)}.btn.btn-secondary{background:#fff;color:#6b7280;border:2px solid #e5e7eb}.btn.btn-secondary:hover:not(:disabled){background:#f9fafb;border-color:#d1d5db;color:#374151}.entity-type-selector{display:flex;flex-direction:column;gap:.375rem}.input-label{font-size:.875rem;font-weight:500;color:#374151;margin-bottom:.25rem}.entity-type-button{display:flex;align-items:center;justify-content:space-between;width:100%;padding:.75rem;background:#fff;border:1px solid #d1d5db;border-radius:6px;cursor:pointer;transition:all .15s ease;text-align:left;font-size:.875rem;color:#6b7280}.entity-type-button:hover{border-color:#9ca3af;background:#f9fafb}.entity-type-button:focus{outline:none;border-color:var(--cide-theme-primary-color);box-shadow:0 0 0 3px #3b82f61a}.entity-type-button.has-value{color:#374151}.entity-type-button.invalid{border-color:#dc2626;color:#dc2626}.entity-type-button.invalid:hover{border-color:#b91c1c}.entity-type-button.invalid:focus{border-color:#dc2626;box-shadow:0 0 0 3px #dc26261a}.entity-type-button .button-text{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.entity-type-button .button-icon{width:1rem;height:1rem;margin-left:.5rem;flex-shrink:0}.animate-spin{animation:spin 1s linear infinite}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}cide-ele-input,cide-ele-select,cide-ele-textarea,cide-ele-file-input{transition:all .2s ease}@media (max-width: 768px){.entity-form-container{padding:.75rem}.form-header{padding:1rem 0}.form-header .form-title{font-size:1.25rem}.form-header .form-subtitle{font-size:.875rem}.form-tabs{margin:.5rem 0}.tab-content{padding:1rem 0 5rem}.form-section{padding:1rem 0}.form-section .section-title{font-size:1rem}.form-actions{padding:1rem 0;margin-top:1.5rem}}@media (max-width: 480px){.entity-form-container{padding:.25rem}.form-header{padding:.75rem 0}.form-tabs{margin:.25rem 0}.tab-content{padding:.75rem 0 4rem}.form-section{padding:.75rem 0}.form-actions{padding:.75rem 0;margin-top:1rem}}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: CideInputComponent, selector: "cide-ele-input", inputs: ["fill", "label", "labelHide", "disabled", "clearInput", "labelPlacement", "labelDir", "placeholder", "leadingIcon", "trailingIcon", "helperText", "helperTextCollapse", "hideHelperAndErrorText", "errorText", "maxlength", "minlength", "required", "autocapitalize", "autocomplete", "type", "width", "id", "ngModel", "option", "min", "max", "size"], outputs: ["ngModelChange"] }, { kind: "component", type: CideSelectComponent, selector: "cide-ele-select", inputs: ["label", "labelHide", "placeholder", "helperText", "errorText", "required", "disabled", "id", "ngModel", "size", "fill", "labelPlacement", "labelDir", "leadingIcon", "trailingIcon", "clearInput", "options", "multiple", "searchable", "showSearchInput", "loading"], outputs: ["ngModelChange", "change", "searchChange"] }, { kind: "component", type: CideTextareaComponent, selector: "cide-ele-textarea", inputs: ["label", "labelHide", "placeholder", "helperText", "errorText", "required", "disabled", "minlength", "maxlength", "rows", "id", "ngModel", "size", "fill", "labelPlacement", "labelDir", "leadingIcon", "trailingIcon", "clearInput"], outputs: ["ngModelChange"] }, { kind: "component", type: CideEleFileInputComponent, selector: "cide-ele-file-input", inputs: ["label", "accept", "multiple", "disabled", "helperText", "errorText"], outputs: ["fileChange"] }, { kind: "component", type: CideEleTabComponent, selector: "cide-ele-tab", inputs: ["tabs", "activeTabId", "size", "variant", "fullWidth", "disabled"], outputs: ["tabChange"] }, { kind: "component", type: CideEleButtonComponent, selector: "button[cideEleButton], a[cideEleButton]", inputs: ["label", "variant", "size", "type", "shape", "elevation", "disabled", "id", "loading", "fullWidth", "leftIcon", "rightIcon", "customClass", "tooltip", "ariaLabel", "testId", "routerLink", "routerExtras", "preventDoubleClick", "animated"], outputs: ["btnClick", "doubleClick"] }] }); }
1154
- }
1155
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CideAdmEntityComponent, decorators: [{
1156
- type: Component,
1157
- args: [{ selector: 'cide-adm-entity', standalone: true, imports: [
1158
- ReactiveFormsModule,
1159
- CideInputComponent,
1160
- CideSelectComponent,
1161
- CideTextareaComponent,
1162
- CideEleFileInputComponent,
1163
- CideEleTabComponent,
1164
- CideEleButtonComponent
1165
- ], template: "<!-- \n DYNAMIC GRID SYSTEM FEATURES:\n \n Basic Grids: grid-1, grid-2, grid-3, grid-4, grid-5, grid-6\n \n Auto-fit Grids: grid-auto-fit-sm/md/lg/xl (dynamic columns based on content)\n Auto-fill Grids: grid-auto-fill-sm/md/lg (always fill available space)\n \n Custom Ratios: grid-ratio-1-2, grid-ratio-2-1, grid-ratio-1-3, grid-ratio-3-1, etc.\n Fractional: grid-quarter-three, grid-third-two, grid-half-half\n \n Gap Control: gap-xs, gap-sm, gap-md, gap-lg, gap-xl\n Specific Gaps: row-gap-xs/sm/md/lg, col-gap-xs/sm/md/lg\n \n Alignment: align-start/center/end/stretch, justify-start/center/end/stretch\n \n Responsive: xl-grid-*, lg-grid-*, md-grid-*, sm-grid-*, xs-grid-*\n \n Grid Items: span-1/2/3/4/5/6/full, row-span-*, start-*, end-*\n Item Alignment: self-start/center/end/stretch, justify-self-*\n \n Special: grid-dense (auto-fills gaps), grid-masonry (masonry layout)\n-->\n\n<div class=\"entity-form-container\">\n <form class=\"entity-form\" [formGroup]=\"entityForm\" [class.loading]=\"loading()\" (ngSubmit)=\"onSubmit()\">\n \n <!-- Header Section -->\n <div class=\"form-header\">\n <h2 class=\"form-title\">Create New Entity</h2>\n <p class=\"form-subtitle\">Add a new educational institution to the system</p>\n </div>\n\n <!-- Success and Error Messages -->\n @if (success()) {\n <div class=\"alert alert-success\">\n <svg class=\"alert-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M5 13l4 4L19 7\"></path>\n </svg>\n {{ success() }}\n </div>\n }\n @if (error()) {\n <div class=\"alert alert-error\">\n <svg class=\"alert-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M6 18L18 6M6 6l12 12\"></path>\n </svg>\n {{ error() }}\n </div>\n }\n\n <!-- Tab Navigation -->\n <div class=\"form-tabs\">\n <cide-ele-tab \n [tabs]=\"entityTabs()\"\n [activeTabId]=\"activeTab()\"\n size=\"md\"\n variant=\"default\"\n (tabChange)=\"onTabChange($event)\">\n </cide-ele-tab>\n </div>\n\n <!-- Tab Content -->\n <div class=\"tab-content\"\n [class.loading]=\"loading()\">\n @switch (activeTab()) {\n \n @case ('basic') {\n <!-- Basic Information Section -->\n <div class=\"form-section\">\n <div class=\"grid grid-auto-fit-md gap-md lg-grid-2 md-grid-1\">\n <div class=\"grid-item span-2 md-span-full\">\n <cide-ele-input \n id=\"syen_name\" \n type=\"text\"\n label=\"Institution Name\" \n formControlName=\"syen_name\"\n placeholder=\"Enter full institution name\">\n </cide-ele-input>\n </div>\n \n <cide-ele-input \n label=\"Institution Code\" \n formControlName=\"syen_entity_code\"\n id=\"syen_entity_code\"\n placeholder=\"Enter unique code (max 40 characters)\">\n </cide-ele-input>\n </div>\n\n <div class=\"grid grid-ratio-2-1-1 gap-md lg-grid-3 md-grid-2 sm-grid-1\">\n <cide-ele-select \n label=\"Entity Type\" \n [options]=\"entityTypes()\" \n formControlName=\"syen_entity_type_gmst\"\n placeholder=\"Select entity type\">\n </cide-ele-select>\n \n <cide-ele-input \n label=\"UDISE Number\" \n formControlName=\"syen_udise_no\"\n placeholder=\"Enter UDISE number\">\n </cide-ele-input>\n \n <cide-ele-input \n label=\"Affiliation Number\" \n formControlName=\"syen_affiliation_no\"\n placeholder=\"Enter affiliation number\">\n </cide-ele-input>\n </div>\n\n <div class=\"grid grid-1 gap-sm\">\n <div class=\"checkbox-field\">\n <label class=\"checkbox-label\">\n <input \n type=\"checkbox\" \n formControlName=\"syen_isactive\"\n class=\"checkbox-input\" />\n <span class=\"checkbox-text\">Active Status</span>\n <span class=\"checkbox-description\">Enable this entity for system operations</span>\n </label>\n </div>\n </div>\n </div>\n }\n\n @case ('corporate') {\n <!-- Corporate Address Section -->\n <div class=\"form-section\">\n <div class=\"grid grid-1 gap-md\">\n <div class=\"grid-item span-full\">\n <cide-ele-textarea \n label=\"Corporate Address\" \n formControlName=\"syen_corporate_address\"\n placeholder=\"Enter complete corporate address\"\n [rows]=\"3\">\n </cide-ele-textarea>\n </div>\n </div>\n\n <div class=\"grid grid-auto-fit-sm gap-lg xl-grid-4 lg-grid-3 md-grid-2 sm-grid-1 align-end\">\n <cide-ele-select \n label=\"Postal Code\"\n [options]=\"postalCodes()\" \n formControlName=\"syen_corporate_pin_sypin\"\n placeholder=\"Select postal code\"\n [searchable]=\"true\"\n [loading]=\"postalCodesLoading()\"\n (searchChange)=\"onPostalCodeSearch($event)\"\n (selectionChange)=\"onPostalCodeSelection($event)\">\n </cide-ele-select>\n \n <cide-ele-input \n label=\"City\" \n formControlName=\"syen_corporate_city_sypin\"\n placeholder=\"Enter city\">\n </cide-ele-input>\n \n <cide-ele-input \n label=\"State\" \n formControlName=\"syen_corporate_state_sypin\"\n placeholder=\"Enter state\">\n </cide-ele-input>\n \n <cide-ele-select \n label=\"Country\" \n [options]=\"countries()\" \n formControlName=\"syen_corporate_country_syctr\"\n placeholder=\"Select country\"\n [searchable]=\"true\"\n [loading]=\"countriesLoading()\"\n (searchChange)=\"onCountrySearch($event)\">\n </cide-ele-select>\n </div>\n </div>\n }\n\n @case ('contact') {\n <!-- Contact Information Section -->\n <div class=\"form-section\">\n <div class=\"grid grid-ratio-3-1 gap-lg md-grid-2 sm-grid-1 justify-stretch\">\n <div class=\"grid-item justify-self-stretch\">\n <cide-ele-select \n label=\"Primary Contact Person\"\n [options]=\"users()\" \n formControlName=\"syen_corporate_contact_person_user\"\n placeholder=\"Select contact person\"\n [searchable]=\"true\"\n [loading]=\"usersLoading()\"\n (searchChange)=\"onUserSearch($event)\">\n </cide-ele-select>\n </div>\n \n <div class=\"grid-item justify-self-stretch\">\n <cide-ele-select \n label=\"Currency\" \n [options]=\"currencies()\" \n formControlName=\"syen_currency_sycr\"\n placeholder=\"Select currency\">\n </cide-ele-select>\n </div>\n </div>\n\n <div class=\"grid grid-auto-fill-md gap-md col-gap-lg row-gap-sm xl-grid-3 lg-grid-2 md-grid-1 grid-dense\">\n <cide-ele-input \n label=\"Primary Phone\" \n formControlName=\"syen_corporate_phone\"\n type=\"tel\"\n placeholder=\"Enter phone number\">\n </cide-ele-input>\n \n <cide-ele-input \n label=\"Alternate Phone\" \n formControlName=\"syen_corporate_phone_alt\"\n type=\"tel\"\n placeholder=\"Enter alternate phone\">\n </cide-ele-input>\n \n <cide-ele-input \n label=\"Fax Number\" \n formControlName=\"syen_corporate_fax\"\n placeholder=\"Enter fax number\">\n </cide-ele-input>\n </div>\n\n <div class=\"grid grid-ratio-1-2-1 gap-xl lg-grid-3 md-grid-2 sm-grid-1 align-center\">\n <div class=\"grid-item self-stretch\">\n <cide-ele-input \n label=\"Primary Email\" \n formControlName=\"syen_corporate_email\"\n type=\"email\"\n placeholder=\"Enter primary email\">\n </cide-ele-input>\n </div>\n \n <div class=\"grid-item span-2 lg-span-1 self-stretch\">\n <cide-ele-input \n label=\"Website URL\" \n formControlName=\"syen_website\"\n type=\"url\"\n placeholder=\"Enter website URL\">\n </cide-ele-input>\n </div>\n \n <div class=\"grid-item self-stretch\">\n <cide-ele-input \n label=\"Alternate Email\" \n formControlName=\"syen_corporate_email_alt\"\n type=\"email\"\n placeholder=\"Enter alternate email\">\n </cide-ele-input>\n </div>\n </div>\n </div>\n }\n\n @case ('registered') {\n <!-- Registered Address Section -->\n <div class=\"form-section\">\n <div class=\"grid grid-1\">\n <cide-ele-textarea \n label=\"Registered Address\" \n formControlName=\"syen_registered_address\"\n placeholder=\"Enter complete registered address\"\n [rows]=\"3\">\n </cide-ele-textarea>\n </div>\n\n <div class=\"grid grid-4\">\n <cide-ele-select \n label=\"Registered Postal Code\"\n [options]=\"postalCodes()\" \n formControlName=\"syen_registered_pin_sypin\"\n placeholder=\"Select postal code\"\n [searchable]=\"true\"\n [loading]=\"postalCodesLoading()\"\n (searchChange)=\"onPostalCodeSearch($event)\"\n (selectionChange)=\"onPostalCodeSelection($event)\">\n </cide-ele-select>\n \n <cide-ele-input \n label=\"Registered City\" \n formControlName=\"syen_registered_city_sypin\"\n placeholder=\"Enter city\">\n </cide-ele-input>\n \n <cide-ele-input \n label=\"Registered State\" \n formControlName=\"syen_registered_state_sypin\"\n placeholder=\"Enter state\">\n </cide-ele-input>\n \n <cide-ele-select \n label=\"Registered Country\" \n [options]=\"countries()\" \n formControlName=\"syen_registered_country_syctr\"\n placeholder=\"Select country\"\n [searchable]=\"true\"\n [loading]=\"countriesLoading()\"\n (searchChange)=\"onCountrySearch($event)\">\n </cide-ele-select>\n </div>\n\n <div class=\"grid grid-3\">\n <cide-ele-select \n label=\"Registered Contact Person\"\n [options]=\"users()\" \n formControlName=\"syen_registered_contact_person_user\"\n placeholder=\"Select contact person\"\n [searchable]=\"true\"\n [loading]=\"usersLoading()\"\n (searchChange)=\"onUserSearch($event)\">\n </cide-ele-select>\n \n <cide-ele-input \n label=\"Registered Phone\" \n formControlName=\"syen_registered_phone\"\n type=\"tel\"\n placeholder=\"Enter phone number\">\n </cide-ele-input>\n \n <cide-ele-input \n label=\"Registered Email\" \n formControlName=\"syen_registered_email\"\n type=\"email\"\n placeholder=\"Enter email\">\n </cide-ele-input>\n @if (hasError('syen_registered_email')) {\n <div class=\"error-message\">{{ getErrorMessage('syen_registered_email') }}</div>\n }\n </div>\n\n <div class=\"grid grid-1\">\n <cide-ele-input \n label=\"Registered Fax\" \n formControlName=\"syen_registered_fax\"\n placeholder=\"Enter fax number\">\n </cide-ele-input>\n </div>\n </div>\n }\n\n @case ('documents') {\n <!-- Documents Section -->\n <div class=\"form-section\">\n <!-- Photo ID Document -->\n <div class=\"grid grid-1 gap-md\">\n <cide-ele-select \n label=\"Photo ID Document\" \n [options]=\"photoIdDocuments()\" \n formControlName=\"syen_photo_id_cyfm\"\n placeholder=\"Select photo ID document\">\n </cide-ele-select>\n </div>\n\n <!-- Logo Upload -->\n <div class=\"grid grid-quarter-three gap-lg md-grid-1 align-center\">\n <div class=\"grid-item self-center justify-self-center\">\n <!-- Logo preview placeholder -->\n <div style=\"width: 120px; height: 120px; border: 2px dashed #cbd5e1; border-radius: 8px; display: flex; align-items: center; justify-content: center; color: #9ca3af; font-size: 0.875rem; text-align: center;\">\n Logo Preview\n </div>\n </div>\n <div class=\"grid-item self-stretch\">\n <cide-ele-file-input \n label=\"Upload Logo\" \n accept=\"image/*\" \n [multiple]=\"false\" \n (fileChange)=\"onFileChange($event)\"\n placeholder=\"Select institution logo or image\">\n </cide-ele-file-input>\n </div>\n </div>\n </div>\n }\n }\n </div>\n\n <!-- Form Actions -->\n <div class=\"form-actions\">\n <button cideEleButton\n type=\"button\" \n variant=\"secondary\" \n (click)=\"onReset()\" \n leftIcon=\"refresh\"\n [disabled]=\"loading()\">\n Reset Form\n </button>\n \n <button cideEleButton\n type=\"submit\" \n variant=\"primary\" \n [disabled]=\"loading() || entityForm.invalid\"\n [loading]=\"loading()\"\n leftIcon=\"check\">\n Create Entity\n </button>\n </div>\n </form>\n</div> ", styles: [".entity-form-container{background:transparent;padding:1rem;width:100%;box-sizing:border-box}.entity-form{max-width:1200px;margin:0 auto;background:transparent;border:none;box-shadow:none;width:100%}.entity-form.loading{opacity:.6;pointer-events:none}.form-header{background:transparent;color:#1f2937;padding:1.25rem 0;text-align:left}.form-header .form-title{font-size:1.5rem;font-weight:700;margin:0 0 .25rem;color:#1f2937}.form-header .form-subtitle{font-size:.95rem;opacity:.7;margin:0;font-weight:400;color:#6b7280}.form-section{padding:1.25rem 0;border-bottom:none;margin-bottom:1.5rem}.form-section:last-of-type{margin-bottom:0}.form-section .section-title{font-size:1.125rem;font-weight:600;color:#1f2937;margin:0 0 1rem;padding-bottom:.5rem;border-bottom:1px solid #e5e7eb;position:relative}.form-section .section-title:after{content:\"\";position:absolute;bottom:-1px;left:0;width:40px;height:1px;background:#667eea;border-radius:1px}.grid{display:grid;gap:1rem;margin-bottom:.75rem;transition:all .3s ease}.grid:last-child{margin-bottom:0}.grid.grid-1{grid-template-columns:1fr}.grid.grid-2{grid-template-columns:repeat(2,1fr)}.grid.grid-3{grid-template-columns:repeat(3,1fr)}.grid.grid-4{grid-template-columns:repeat(4,1fr)}.grid.grid-5{grid-template-columns:repeat(5,1fr)}.grid.grid-6{grid-template-columns:repeat(6,1fr)}.grid.grid-auto-fit-sm{grid-template-columns:repeat(auto-fit,minmax(200px,1fr))}.grid.grid-auto-fit-md{grid-template-columns:repeat(auto-fit,minmax(250px,1fr))}.grid.grid-auto-fit-lg{grid-template-columns:repeat(auto-fit,minmax(300px,1fr))}.grid.grid-auto-fit-xl{grid-template-columns:repeat(auto-fit,minmax(350px,1fr))}.grid.grid-auto-fill-sm{grid-template-columns:repeat(auto-fill,minmax(200px,1fr))}.grid.grid-auto-fill-md{grid-template-columns:repeat(auto-fill,minmax(250px,1fr))}.grid.grid-auto-fill-lg{grid-template-columns:repeat(auto-fill,minmax(300px,1fr))}.grid.grid-ratio-1-2{grid-template-columns:1fr 2fr}.grid.grid-ratio-2-1{grid-template-columns:2fr 1fr}.grid.grid-ratio-1-3{grid-template-columns:1fr 3fr}.grid.grid-ratio-3-1{grid-template-columns:3fr 1fr}.grid.grid-ratio-1-2-1{grid-template-columns:1fr 2fr 1fr}.grid.grid-ratio-2-1-1{grid-template-columns:2fr 1fr 1fr}.grid.grid-quarter-three{grid-template-columns:1fr 3fr}.grid.grid-third-two{grid-template-columns:1fr 2fr}.grid.grid-half-half{grid-template-columns:1fr 1fr}.grid.gap-xs{gap:.25rem}.grid.gap-sm{gap:.5rem}.grid.gap-md{gap:1rem}.grid.gap-lg{gap:1.5rem}.grid.gap-xl{gap:2rem}.grid.row-gap-xs{row-gap:.25rem}.grid.row-gap-sm{row-gap:.5rem}.grid.row-gap-md{row-gap:1rem}.grid.row-gap-lg{row-gap:1.5rem}.grid.col-gap-xs{column-gap:.25rem}.grid.col-gap-sm{column-gap:.5rem}.grid.col-gap-md{column-gap:1rem}.grid.col-gap-lg{column-gap:1.5rem}.grid.align-start{align-items:start}.grid.align-center{align-items:center}.grid.align-end{align-items:end}.grid.align-stretch{align-items:stretch}.grid.justify-start{justify-items:start}.grid.justify-center{justify-items:center}.grid.justify-end{justify-items:end}.grid.justify-stretch{justify-items:stretch}.grid.grid-dense{grid-auto-flow:dense}.grid.grid-masonry{grid-auto-rows:min-content;align-items:start}@media (min-width: 1200px){.grid.xl-grid-1{grid-template-columns:1fr}.grid.xl-grid-2{grid-template-columns:repeat(2,1fr)}.grid.xl-grid-3{grid-template-columns:repeat(3,1fr)}.grid.xl-grid-4{grid-template-columns:repeat(4,1fr)}.grid.xl-grid-5{grid-template-columns:repeat(5,1fr)}.grid.xl-grid-6{grid-template-columns:repeat(6,1fr)}}@media (max-width: 1199px) and (min-width: 992px){.grid.lg-grid-1{grid-template-columns:1fr}.grid.lg-grid-2{grid-template-columns:repeat(2,1fr)}.grid.lg-grid-3{grid-template-columns:repeat(3,1fr)}.grid.lg-grid-4{grid-template-columns:repeat(4,1fr)}}@media (max-width: 991px) and (min-width: 768px){.grid.md-grid-1{grid-template-columns:1fr}.grid.md-grid-2{grid-template-columns:repeat(2,1fr)}.grid.md-grid-3{grid-template-columns:repeat(3,1fr)}}@media (max-width: 767px) and (min-width: 576px){.grid.sm-grid-1{grid-template-columns:1fr}.grid.sm-grid-2{grid-template-columns:repeat(2,1fr)}}@media (max-width: 575px){.grid.xs-grid-1{grid-template-columns:1fr}}@media (max-width: 1024px){.grid.grid-4:not([class*=lg-grid]):not([class*=md-grid]){grid-template-columns:repeat(2,1fr)}.grid.grid-5:not([class*=lg-grid]):not([class*=md-grid]),.grid.grid-6:not([class*=lg-grid]):not([class*=md-grid]){grid-template-columns:repeat(3,1fr)}}@media (max-width: 768px){.grid{gap:.75rem}.grid.grid-2:not([class*=sm-grid]):not([class*=xs-grid]),.grid.grid-3:not([class*=sm-grid]):not([class*=xs-grid]),.grid.grid-4:not([class*=sm-grid]):not([class*=xs-grid]),.grid.grid-5:not([class*=sm-grid]):not([class*=xs-grid]),.grid.grid-6:not([class*=sm-grid]):not([class*=xs-grid]){grid-template-columns:1fr}.grid.gap-lg{gap:1rem}.grid.gap-xl{gap:1.25rem}}@media (max-width: 480px){.grid{gap:.5rem}.grid:not([class*=xs-grid]){grid-template-columns:1fr!important}.grid.gap-md{gap:.75rem}.grid.gap-lg,.grid.gap-xl{gap:1rem}}.grid-item.span-1{grid-column:span 1}.grid-item.span-2{grid-column:span 2}.grid-item.span-3{grid-column:span 3}.grid-item.span-4{grid-column:span 4}.grid-item.span-5{grid-column:span 5}.grid-item.span-6{grid-column:span 6}.grid-item.span-full{grid-column:1/-1}.grid-item.row-span-1{grid-row:span 1}.grid-item.row-span-2{grid-row:span 2}.grid-item.row-span-3{grid-row:span 3}.grid-item.row-span-4{grid-row:span 4}.grid-item.start-1{grid-column-start:1}.grid-item.start-2{grid-column-start:2}.grid-item.start-3{grid-column-start:3}.grid-item.start-4{grid-column-start:4}.grid-item.end-1{grid-column-end:1}.grid-item.end-2{grid-column-end:2}.grid-item.end-3{grid-column-end:3}.grid-item.end-4{grid-column-end:4}.grid-item.end-auto{grid-column-end:auto}.grid-item.self-start{align-self:start}.grid-item.self-center{align-self:center}.grid-item.self-end{align-self:end}.grid-item.self-stretch{align-self:stretch}.grid-item.justify-self-start{justify-self:start}.grid-item.justify-self-center{justify-self:center}.grid-item.justify-self-end{justify-self:end}.grid-item.justify-self-stretch{justify-self:stretch}@media (max-width: 768px){.grid-item.md-span-1{grid-column:span 1}.grid-item.md-span-2{grid-column:span 2}.grid-item.md-span-full{grid-column:1/-1}}@media (max-width: 480px){.grid-item.sm-span-full{grid-column:1/-1}}.checkbox-field{margin:.25rem 0}.checkbox-label{display:flex;flex-direction:column;gap:.25rem;cursor:pointer;padding:.75rem 0;background:transparent;border:none;border-radius:0;transition:all .2s ease}.checkbox-label:hover{background:#667eea05}.checkbox-label .checkbox-input{width:1rem;height:1rem;accent-color:#667eea;border-radius:3px;margin-bottom:.125rem}.checkbox-label .checkbox-text{font-weight:600;color:#374151;font-size:.875rem}.checkbox-label .checkbox-description{font-size:.75rem;color:#6b7280;margin-top:.125rem}.alert{display:flex;align-items:center;gap:.5rem;padding:.75rem 0;margin:1rem 0;border-radius:0;font-weight:500;font-size:.875rem;border-left:3px solid}.alert .alert-icon{width:1rem;height:1rem;flex-shrink:0}.alert.alert-success{background:#dcfce74d;border-left-color:#22c55e;color:#166534}.alert.alert-error{background:#fef2f24d;border-left-color:#ef4444;color:#dc2626}.error-message{font-size:.75rem;color:#dc2626;margin-top:.25rem;padding-left:.125rem;font-weight:500}.form-tabs{padding:0;margin:1rem 0;border-bottom:1px solid #e5e7eb}.tab-content{transition:opacity .2s ease}.tab-content.loading{opacity:.6;pointer-events:none}.form-actions{display:flex;justify-content:flex-end;gap:.75rem;padding:1rem 0;background:#fff;border-top:1px solid #e5e7eb;margin-top:2rem;position:sticky;bottom:0}@media (max-width: 640px){.form-actions{flex-direction:column-reverse}}.btn{display:inline-flex;align-items:center;justify-content:center;gap:.375rem;padding:.5rem 1rem;font-weight:600;font-size:.8125rem;border-radius:6px;border:none;cursor:pointer;transition:all .2s ease;min-width:120px;position:relative}.btn .btn-icon{width:.875rem;height:.875rem}.btn:disabled{opacity:.6;cursor:not-allowed}.btn.btn-primary{background:linear-gradient(135deg,#667eea,#764ba2);color:#fff;box-shadow:0 4px 6px -1px #667eea4d}.btn.btn-primary:hover:not(:disabled){transform:translateY(-1px);box-shadow:0 8px 12px -2px #667eea66}.btn.btn-primary:active:not(:disabled){transform:translateY(0)}.btn.btn-secondary{background:#fff;color:#6b7280;border:2px solid #e5e7eb}.btn.btn-secondary:hover:not(:disabled){background:#f9fafb;border-color:#d1d5db;color:#374151}.entity-type-selector{display:flex;flex-direction:column;gap:.375rem}.input-label{font-size:.875rem;font-weight:500;color:#374151;margin-bottom:.25rem}.entity-type-button{display:flex;align-items:center;justify-content:space-between;width:100%;padding:.75rem;background:#fff;border:1px solid #d1d5db;border-radius:6px;cursor:pointer;transition:all .15s ease;text-align:left;font-size:.875rem;color:#6b7280}.entity-type-button:hover{border-color:#9ca3af;background:#f9fafb}.entity-type-button:focus{outline:none;border-color:var(--cide-theme-primary-color);box-shadow:0 0 0 3px #3b82f61a}.entity-type-button.has-value{color:#374151}.entity-type-button.invalid{border-color:#dc2626;color:#dc2626}.entity-type-button.invalid:hover{border-color:#b91c1c}.entity-type-button.invalid:focus{border-color:#dc2626;box-shadow:0 0 0 3px #dc26261a}.entity-type-button .button-text{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.entity-type-button .button-icon{width:1rem;height:1rem;margin-left:.5rem;flex-shrink:0}.animate-spin{animation:spin 1s linear infinite}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}cide-ele-input,cide-ele-select,cide-ele-textarea,cide-ele-file-input{transition:all .2s ease}@media (max-width: 768px){.entity-form-container{padding:.75rem}.form-header{padding:1rem 0}.form-header .form-title{font-size:1.25rem}.form-header .form-subtitle{font-size:.875rem}.form-tabs{margin:.5rem 0}.tab-content{padding:1rem 0 5rem}.form-section{padding:1rem 0}.form-section .section-title{font-size:1rem}.form-actions{padding:1rem 0;margin-top:1.5rem}}@media (max-width: 480px){.entity-form-container{padding:.25rem}.form-header{padding:.75rem 0}.form-tabs{margin:.25rem 0}.tab-content{padding:.75rem 0 4rem}.form-section{padding:.75rem 0}.form-actions{padding:.75rem 0;margin-top:1rem}}\n"] }]
1166
- }], ctorParameters: () => [] });
1167
-
1168
- var cideAdmEntity_component = /*#__PURE__*/Object.freeze({
1169
- __proto__: null,
1170
- CideAdmEntityComponent: CideAdmEntityComponent
1171
- });
1172
-
1173
- class CideAdmEntityListService {
1174
- constructor() {
1175
- this.http = inject(HttpClient);
1176
- }
1177
- /**
1178
- * Get list of entities using the proper API endpoint
1179
- * @param body - MEntity payload for filtering/pagination
1180
- * @returns Observable of entityControllerResponse
1181
- */
1182
- getEntityList(body) {
1183
- const query = generateStringFromObject(body);
1184
- const url = cidePath.join([
1185
- hostManagerRoutesUrl.cideSuiteHost,
1186
- coreRoutesUrl.module,
1187
- coreRoutesUrl.entity,
1188
- query
1189
- ]);
1190
- console.log('🔍 ENTITY SERVICE: Making API call to:', url);
1191
- console.log('🔍 ENTITY SERVICE: Payload:', body);
1192
- return this.http.get(url);
1193
- }
1194
- /**
1195
- * Get entity list with default parameters
1196
- * @returns Observable of entityControllerResponse
1197
- */
1198
- getAllEntities() {
1199
- const defaultPayload = {};
1200
- return this.getEntityList(defaultPayload);
1201
- }
1202
- /**
1203
- * Get filtered entity list
1204
- * @param filters - Filter parameters
1205
- * @returns Observable of entityControllerResponse
1206
- */
1207
- getFilteredEntities(filters) {
1208
- const payload = { ...filters };
1209
- return this.getEntityList(payload);
1210
- }
1211
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CideAdmEntityListService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
1212
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CideAdmEntityListService, providedIn: 'root' }); }
1213
- }
1214
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CideAdmEntityListService, decorators: [{
1215
- type: Injectable,
1216
- args: [{
1217
- providedIn: 'root'
1218
- }]
1219
- }] });
1220
-
1221
- class CideAdmEntityListComponent {
1222
- constructor() {
1223
- // Modern dependency injection using inject()
1224
- this.router = inject(Router); // Made public for template access
1225
- this.entityService = inject(CideAdmEntityListService);
1226
- // State management using Angular Signals
1227
- this.entities = signal([]);
1228
- this.loading = signal(false);
1229
- this.error = signal(null);
1230
- this.searchQuery = signal('');
1231
- this.currentPage = signal(1);
1232
- this.pageSize = signal(10);
1233
- this.totalItems = signal(0);
1234
- this.selectedEntityType = signal('');
1235
- // Pagination calculations
1236
- this.totalPages = signal(0);
1237
- this.hasNextPage = signal(false);
1238
- this.hasPreviousPage = signal(false);
1239
- this.jumpToPage = 1;
1240
- this.loadStartTime = 0;
1241
- // Filter options
1242
- this.entityTypeOptions = signal([
1243
- { value: '', label: 'All Entity Types' },
1244
- { value: 'school', label: 'School' },
1245
- { value: 'college', label: 'College' },
1246
- { value: 'university', label: 'University' },
1247
- { value: 'institute', label: 'Institute' }
1248
- ]);
1249
- // Grid configuration signal
1250
- this.gridConfig = signal({
1251
- id: 'entity-list-grid',
1252
- title: '',
1253
- subtitle: '',
1254
- columns: [
1255
- {
1256
- key: 'details',
1257
- header: 'Entity Details',
1258
- type: 'custom',
1259
- width: 'lg',
1260
- truncate: true,
1261
- align: 'left',
1262
- renderer: 'entityDetailsRenderer'
1263
- },
1264
- {
1265
- key: 'contact',
1266
- header: 'Contact Information',
1267
- type: 'custom',
1268
- width: 'lg',
1269
- truncate: true,
1270
- align: 'left',
1271
- renderer: 'contactInfoRenderer'
1272
- },
1273
- {
1274
- key: 'syen_isactive',
1275
- header: 'Status',
1276
- type: 'status',
1277
- width: 'md',
1278
- truncate: false,
1279
- align: 'center',
1280
- statusConfig: {
1281
- activeValue: true,
1282
- activeLabel: 'Active',
1283
- inactiveLabel: 'Inactive',
1284
- activeClass: 'tw-bg-green-100 tw-text-green-800',
1285
- inactiveClass: 'tw-bg-red-100 tw-text-red-800'
1286
- }
1287
- },
1288
- {
1289
- key: 'syen_entity_type_gmst',
1290
- header: 'Entity Type',
1291
- type: 'text',
1292
- width: 'md',
1293
- truncate: false,
1294
- align: 'center'
1295
- },
1296
- {
1297
- key: 'actions',
1298
- header: 'Actions',
1299
- type: 'actions',
1300
- width: 'md',
1301
- truncate: false,
1302
- align: 'right',
1303
- actions: [
1304
- {
1305
- key: 'edit',
1306
- label: 'Edit',
1307
- icon: 'pencil',
1308
- variant: 'outline',
1309
- tooltip: 'Edit entity',
1310
- onClick: 'onEditEntity'
1311
- },
1312
- {
1313
- key: 'delete',
1314
- label: 'Delete',
1315
- icon: 'trash',
1316
- variant: 'danger',
1317
- tooltip: 'Delete entity',
1318
- onClick: 'onDeleteEntity'
1319
- }
1320
- ]
1321
- }
1322
- ],
1323
- data: [],
1324
- trackBy: '_id',
1325
- pagination: {
1326
- enabled: true,
1327
- pageSize: 10,
1328
- pageSizeOptions: [10, 25, 50, 100],
1329
- showQuickJump: true,
1330
- showPageInfo: true,
1331
- showRefresh: true
1332
- },
1333
- search: {
1334
- enabled: true,
1335
- placeholder: 'Search entities...',
1336
- searchableColumns: ['syen_name', 'syen_entity_code', 'syen_corporate_email'],
1337
- debounceMs: 300
1338
- },
1339
- loading: {
1340
- useDefer: true,
1341
- skeletonRows: 5,
1342
- showOverlay: false
1343
- },
1344
- responsive: true,
1345
- striped: false,
1346
- bordered: true,
1347
- compact: false,
1348
- fullHeight: true,
1349
- onRowClick: 'onEntityRowClick',
1350
- onRefresh: 'onEntityRefresh',
1351
- tree: {
1352
- enabled: true,
1353
- primaryKey: '_id',
1354
- foreignKey: 'syen_parent_entity_id',
1355
- childrenKey: 'children',
1356
- levelKey: 'level',
1357
- expandedKey: 'isExpanded',
1358
- hasChildrenKey: 'hasChildren'
1359
- }
1360
- });
1361
- // Custom renderers for complex columns
1362
- this.customRenderers = {
1363
- entityDetailsRenderer: (value, row) => {
1364
- const entityCode = row.syen_entity_code || 'N/A';
1365
- const entityName = row.syen_name || 'Unknown Entity';
1366
- return `
1367
- <div class="tw-flex tw-items-center tw-space-x-3">
1368
- <div class="tw-flex-shrink-0 tw-w-10 tw-h-10 tw-bg-blue-100 tw-rounded-full tw-flex tw-items-center tw-justify-center">
1369
- <span class="tw-text-blue-600 tw-font-semibold tw-text-sm">
1370
- ${entityCode.substring(0, 2).toUpperCase()}
1371
- </span>
1372
- </div>
1373
- <div class="tw-flex-1 tw-min-w-0">
1374
- <p class="tw-text-sm tw-font-medium tw-text-gray-900 tw-truncate" title="${entityName}">
1375
- ${entityName}
1376
- </p>
1377
- <p class="tw-text-sm tw-text-gray-500 tw-truncate" title="${entityCode}">
1378
- Code: ${entityCode}
1379
- </p>
1380
- </div>
1381
- </div>
1382
- `;
1383
- },
1384
- contactInfoRenderer: (value, row) => {
1385
- const contactPerson = row.syen_corporate_contact_person_user || 'N/A';
1386
- const email = row.syen_corporate_email || 'N/A';
1387
- const phone = row.syen_corporate_phone ? String(row.syen_corporate_phone) : 'N/A';
1388
- return `
1389
- <div class="tw-space-y-1">
1390
- <p class="tw-text-sm tw-text-gray-900 tw-truncate tw-flex tw-items-center" title="${contactPerson}">
1391
- <svg class="tw-flex-shrink-0 tw-w-4 tw-h-4 tw-text-gray-400 tw-mr-2" fill="currentColor" viewBox="0 0 20 20">
1392
- <path d="M10 9a3 3 0 100-6 3 3 0 000 6zm-7 9a7 7 0 1114 0H3z"/>
1393
- </svg>
1394
- <span class="tw-truncate">${contactPerson}</span>
1395
- </p>
1396
- <p class="tw-text-sm tw-text-gray-600 tw-truncate tw-flex tw-items-center" title="${email}">
1397
- <svg class="tw-flex-shrink-0 tw-w-4 tw-h-4 tw-text-gray-400 tw-mr-2" fill="currentColor" viewBox="0 0 20 20">
1398
- <path d="M2.003 5.884L10 9.882l7.997-3.998A2 2 0 0016 4H4a2 2 0 00-1.997 1.884z"/>
1399
- <path d="M18 8.118l-8 4-8-4V14a2 2 0 002 2h12a2 2 0 002-2V8.118z"/>
1400
- </svg>
1401
- <span class="tw-truncate">${email}</span>
1402
- </p>
1403
- <p class="tw-text-sm tw-text-gray-600 tw-truncate tw-flex tw-items-center" title="${phone}">
1404
- <svg class="tw-flex-shrink-0 tw-w-4 tw-h-4 tw-text-gray-400 tw-mr-2" fill="currentColor" viewBox="0 0 20 20">
1405
- <path d="M2 3a1 1 0 011-1h2.153a1 1 0 01.986.836l.74 4.435a1 1 0 01-.54 1.06l-1.548.773a11.037 11.037 0 006.105 6.105l.774-1.548a1 1 0 011.059-.54l4.435.74a1 1 0 01.836.986V17a1 1 0 01-1 1h-2C7.82 18 2 12.18 2 5V3z"/>
1406
- </svg>
1407
- <span class="tw-truncate">${phone}</span>
1408
- </p>
1409
- </div>
1410
- `;
1411
- }
1412
- };
1413
- // Action handlers
1414
- this.actionHandlers = {
1415
- onEditEntity: (entity) => {
1416
- const query = generateStringFromObject({
1417
- syen_id: entity._id
1418
- });
1419
- this.router.navigate(['control-panel', 'entity-create', query]);
1420
- },
1421
- onDeleteEntity: (entity) => {
1422
- const entityName = entity.syen_name || 'this entity';
1423
- if (confirm(`Are you sure you want to delete ${entityName}?`)) {
1424
- this.onDeleteEntityConfirmed(entity._id || '');
1425
- }
1426
- }
1427
- };
1428
- }
1429
- // Getter and setter for ngModel compatibility
1430
- get selectedEntityTypeValue() {
1431
- return this.selectedEntityType();
1432
- }
1433
- set selectedEntityTypeValue(value) {
1434
- this.selectedEntityType.set(value);
1435
- }
1436
- ngOnInit() {
1437
- console.log('🔧 ENTITY LIST: Component initializing');
1438
- this.updatePaginationState();
1439
- // Set initial loading state to false to allow grid to render
1440
- this.loading.set(false);
1441
- // Load entities from API
1442
- this.loadEntities();
1443
- }
1444
- // Grid event handler
1445
- onGridEvent(event) {
1446
- console.log('📡 GRID EVENT: Received grid event:', event.type, event);
1447
- switch (event.type) {
1448
- case 'rowClick':
1449
- this.onEntityRowClick(event.data);
1450
- break;
1451
- case 'refresh':
1452
- this.onEntityRefresh();
1453
- break;
1454
- case 'search':
1455
- this.onEntitySearch(event.data);
1456
- break;
1457
- case 'pageChange':
1458
- this.onEntityPageChange(event.data);
1459
- break;
1460
- default:
1461
- console.log('Unhandled grid event:', event.type);
1462
- }
1463
- }
1464
- // Event handlers for grid events
1465
- onEntityRowClick(entity) {
1466
- console.log('Entity row clicked:', entity);
1467
- this.router.navigate(['admin', 'entity', 'view', entity._id]);
1468
- }
1469
- onEntityRefresh() {
1470
- console.log('Refreshing entities...');
1471
- this.loadEntities(true);
1472
- }
1473
- onEntitySearch(query) {
1474
- console.log('Search entities:', query);
1475
- this.searchQuery.set(query);
1476
- // The grid handles the actual filtering
1477
- }
1478
- onEntityPageChange(page) {
1479
- console.log('Page changed to:', page);
1480
- this.currentPage.set(page);
1481
- // Reload data for the new page
1482
- this.loadEntities(false);
1483
- }
1484
- onDeleteEntityConfirmed(entityId) {
1485
- // In a real app, you'd call the API to delete
1486
- console.log('Deleting entity:', entityId);
1487
- // For now, just reload the entities
1488
- this.loadEntities(true);
1489
- }
1490
- // Update grid data method
1491
- updateGridData(entities) {
1492
- console.log('📊 GRID UPDATE: Updating grid with', entities.length, 'entities');
1493
- console.log('📊 GRID UPDATE: Sample entity data:', entities[0] || 'No entities');
1494
- // Set the entities signal
1495
- this.entities.set(entities);
1496
- // Update grid configuration with new data and ensure loading is false
1497
- this.gridConfig.update(config => ({
1498
- ...config,
1499
- data: entities
1500
- }));
1501
- // Ensure loading states are cleared
1502
- this.loading.set(false);
1503
- // Clear page change loading state in the grid component
1504
- if (this.gridComponent) {
1505
- this.gridComponent.clearPageChangeLoading();
1506
- }
1507
- console.log('📊 GRID UPDATE: Grid config updated successfully');
1508
- console.log('📊 GRID UPDATE: Current grid data length:', this.gridConfig().data.length);
1509
- console.log('📊 GRID UPDATE: Loading state:', this.loading());
1510
- console.log('📊 GRID UPDATE: Full grid config for debugging:', JSON.stringify(this.gridConfig(), null, 2));
1511
- }
1512
- loadEntities(isRefresh = false) {
1513
- if (isRefresh) {
1514
- console.log('🔄 ENTITY LIST: Refreshing entities');
1515
- // Set the grid's refresh state to true
1516
- if (this.gridComponent) {
1517
- this.gridComponent.setRefreshing(true);
1518
- }
1519
- }
1520
- else {
1521
- this.loading.set(true);
1522
- console.log('🔍 ENTITY LIST: Loading entities from API');
1523
- }
1524
- this.error.set(null);
1525
- this.loadStartTime = Date.now();
1526
- this.entityService.getAllEntities().subscribe({
1527
- next: (response) => {
1528
- console.log('✅ ENTITY LIST: API response received:', response);
1529
- // Process the response data
1530
- if (response?.data) {
1531
- // Handle both array and single object responses
1532
- const entitiesData = Array.isArray(response.data) ? response.data : [response.data];
1533
- console.log('📋 ENTITY LIST: Processed entities data:', entitiesData.length, 'entities');
1534
- if (entitiesData.length > 0) {
1535
- console.log('📊 ENTITY LIST: First entity sample:', entitiesData[0]);
1536
- this.updateGridData(entitiesData);
1537
- this.totalItems.set(entitiesData.length);
1538
- }
1539
- else {
1540
- console.log('📊 ENTITY LIST: No entities returned, showing test data');
1541
- this.loadTestData();
1542
- }
1543
- }
1544
- else {
1545
- console.warn('⚠️ ENTITY LIST: No data in API response, loading test data');
1546
- this.loadTestData();
1547
- }
1548
- this.updatePaginationState();
1549
- this.loading.set(false);
1550
- // Clear page change loading state in the grid component
1551
- if (this.gridComponent) {
1552
- this.gridComponent.clearPageChangeLoading();
1553
- }
1554
- // Set the grid's refresh state to false when done
1555
- if (isRefresh && this.gridComponent) {
1556
- this.gridComponent.setRefreshing(false);
1557
- }
1558
- },
1559
- error: (err) => {
1560
- console.error('❌ ENTITY LIST: API error:', err);
1561
- console.log('🧪 ENTITY LIST: API failed, loading test data for demonstration');
1562
- // Load test data when API fails
1563
- this.loadTestData();
1564
- this.error.set('API unavailable. Showing sample data.');
1565
- this.loading.set(false);
1566
- // Clear page change loading state in the grid component
1567
- if (this.gridComponent) {
1568
- this.gridComponent.clearPageChangeLoading();
1569
- }
1570
- // Set the grid's refresh state to false when done
1571
- if (isRefresh && this.gridComponent) {
1572
- this.gridComponent.setRefreshing(false);
1573
- }
1574
- }
1575
- });
1576
- }
1577
- loadTestData() {
1578
- console.log('🧪 ENTITY LIST: Loading test data');
1579
- const testData = [
1580
- {
1581
- _id: 'test-1',
1582
- syen_name: 'Test University',
1583
- syen_entity_code: 'TEST001',
1584
- syen_corporate_email: 'test@university.com',
1585
- syen_corporate_contact_person_user: 'John Doe',
1586
- syen_corporate_phone: 9876543210, // Now a number
1587
- syen_isactive: true,
1588
- syen_entity_type_gmst: 'university',
1589
- children: []
1590
- },
1591
- {
1592
- _id: 'test-2',
1593
- syen_name: 'Sample College',
1594
- syen_entity_code: 'SAMP002',
1595
- syen_corporate_email: 'info@samplecollege.edu',
1596
- syen_corporate_contact_person_user: 'Jane Smith',
1597
- syen_corporate_phone: 9876543211,
1598
- syen_isactive: false,
1599
- syen_entity_type_gmst: 'college',
1600
- children: []
1601
- },
1602
- {
1603
- _id: 'test-3',
1604
- syen_name: 'Global Institute of Technology',
1605
- syen_entity_code: 'GIT003',
1606
- syen_corporate_email: 'admin@git.edu',
1607
- syen_corporate_contact_person_user: 'Bob Johnson',
1608
- syen_corporate_phone: 9876543212,
1609
- syen_isactive: true,
1610
- syen_entity_type_gmst: 'institute',
1611
- children: []
1612
- }
1613
- ];
1614
- console.log('🧪 ENTITY LIST: Test data prepared:', testData);
1615
- this.updateGridData(testData);
1616
- this.totalItems.set(testData.length);
1617
- }
1618
- updatePaginationState() {
1619
- const total = Math.ceil(this.totalItems() / this.pageSize());
1620
- this.totalPages.set(total);
1621
- this.hasNextPage.set(this.currentPage() < total);
1622
- this.hasPreviousPage.set(this.currentPage() > 1);
1623
- }
1624
- onSearch() {
1625
- this.currentPage.set(1);
1626
- this.loadEntities();
1627
- }
1628
- onFilterChange() {
1629
- this.currentPage.set(1);
1630
- this.loadEntities();
1631
- }
1632
- onPageChange(page) {
1633
- if (parseInt(page) >= 1 && parseInt(page) <= this.totalPages()) {
1634
- this.currentPage.set(parseInt(page));
1635
- this.loadEntities();
1636
- }
1637
- }
1638
- onPageSizeChange() {
1639
- this.currentPage.set(1);
1640
- this.loadEntities();
1641
- }
1642
- onRefresh() {
1643
- this.loadEntities(true); // Pass true for refresh
1644
- }
1645
- onAddEntity() {
1646
- // Navigate to entity create form
1647
- this.router.navigate(['/control-panel/entity-create']);
1648
- }
1649
- onEditEntity(entity) {
1650
- // TODO: Implement edit functionality - navigate to edit form with entity ID
1651
- this.router.navigate(['/control-panel/entity-create'], {
1652
- queryParams: { id: entity._id, mode: 'edit' }
1653
- });
1654
- console.log('Edit entity:', entity);
1655
- }
1656
- onViewEntity(entity) {
1657
- // TODO: Implement view functionality
1658
- console.log('View entity:', entity);
1659
- }
1660
- onDeleteEntity(entity) {
1661
- if (confirm(`Are you sure you want to delete "${entity.syen_name}"?`)) {
1662
- // TODO: Implement delete functionality
1663
- console.log('Delete entity:', entity);
1664
- }
1665
- }
1666
- getStatusClass(isActive) {
1667
- return isActive
1668
- ? 'tw-bg-green-100 tw-text-green-800'
1669
- : 'tw-bg-red-100 tw-text-red-800';
1670
- }
1671
- getStatusText(isActive) {
1672
- return isActive ? 'Active' : 'Inactive';
1673
- }
1674
- formatDate(date) {
1675
- if (!date)
1676
- return 'N/A';
1677
- return new Date(date).toLocaleDateString();
1678
- }
1679
- // Pagination helper methods
1680
- getPageNumbers() {
1681
- const total = this.totalPages();
1682
- const current = this.currentPage();
1683
- const delta = 2; // Number of pages to show on each side of current page
1684
- const pages = [];
1685
- const start = Math.max(1, current - delta);
1686
- const end = Math.min(total, current + delta);
1687
- for (let i = start; i <= end; i++) {
1688
- pages.push(i);
1689
- }
1690
- return pages;
1691
- }
1692
- getItemRangeText() {
1693
- const start = (this.currentPage() - 1) * this.pageSize() + 1;
1694
- const end = Math.min(this.currentPage() * this.pageSize(), this.totalItems());
1695
- const total = this.totalItems();
1696
- return `${start}-${end} of ${total}`;
1697
- }
1698
- trackByEntityId(index, entity) {
1699
- return entity?._id || '';
1700
- }
1701
- // ===== Enhanced Pagination Methods =====
1702
- /**
1703
- * Get enhanced page numbers with ellipsis for better navigation
1704
- */
1705
- getEnhancedPageNumbers() {
1706
- const total = this.totalPages();
1707
- const current = this.currentPage();
1708
- const pages = [];
1709
- if (total <= 7) {
1710
- // Show all pages if 7 or fewer
1711
- for (let i = 1; i <= total; i++) {
1712
- pages.push(i);
1713
- }
1714
- }
1715
- else {
1716
- // Always show first page
1717
- pages.push(1);
1718
- if (current <= 4) {
1719
- // Current page is near the beginning
1720
- for (let i = 2; i <= 5; i++) {
1721
- pages.push(i);
1722
- }
1723
- pages.push('...');
1724
- pages.push(total);
1725
- }
1726
- else if (current >= total - 3) {
1727
- // Current page is near the end
1728
- pages.push('...');
1729
- for (let i = total - 4; i <= total; i++) {
1730
- pages.push(i);
1731
- }
1732
- }
1733
- else {
1734
- // Current page is in the middle
1735
- pages.push('...');
1736
- for (let i = current - 1; i <= current + 1; i++) {
1737
- pages.push(i);
1738
- }
1739
- pages.push('...');
1740
- pages.push(total);
1741
- }
1742
- }
1743
- return pages;
1744
- }
1745
- /**
1746
- * Calculate progress percentage based on current position
1747
- */
1748
- getProgressPercentage() {
1749
- if (this.totalPages() === 0)
1750
- return 0;
1751
- return Math.round((this.currentPage() / this.totalPages()) * 100);
1752
- }
1753
- /**
1754
- * Jump to specific page functionality
1755
- */
1756
- onJumpToPage() {
1757
- if (this.jumpToPage >= 1 && this.jumpToPage <= this.totalPages()) {
1758
- this.onPageChange(this.jumpToPage);
1759
- }
1760
- }
1761
- /**
1762
- * Get simulated load time for performance display
1763
- */
1764
- getLoadTime() {
1765
- return this.loadStartTime > 0 ? Date.now() - this.loadStartTime : 0;
1766
- }
1767
- /**
1768
- * Get total data size for display
1769
- */
1770
- getTotalDataSize() {
1771
- return this.totalItems();
1772
- }
1773
- /**
1774
- * Export current page entities
1775
- */
1776
- onExportCurrentPage() {
1777
- const currentPageEntities = this.entities();
1778
- console.log('Exporting current page:', currentPageEntities);
1779
- // TODO: Implement actual export functionality
1780
- alert(`Exporting ${currentPageEntities.length} entities from current page`);
1781
- }
1782
- /**
1783
- * Export all entities
1784
- */
1785
- onExportAll() {
1786
- console.log('Exporting all entities');
1787
- // TODO: Implement actual export functionality
1788
- alert(`Exporting all ${this.totalItems()} entities`);
1789
- }
1790
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CideAdmEntityListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1791
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.7", type: CideAdmEntityListComponent, isStandalone: true, selector: "cide-adm-entity-list", viewQueries: [{ propertyName: "gridComponent", first: true, predicate: CideEleDataGridComponent, descendants: true }], ngImport: i0, template: "<!-- Entity List Container -->\n<div class=\"entity-list-container tw-bg-white tw-shadow-lg tw-rounded-lg tw-overflow-hidden\">\n \n <!-- Header Section with Filters -->\n <div class=\"tw-px-6 tw-py-4 tw-border-b tw-border-gray-200 tw-bg-gray-50\">\n <div class=\"tw-flex tw-flex-col sm:tw-flex-row tw-justify-between tw-items-start sm:tw-items-center tw-space-y-4 sm:tw-space-y-0\">\n \n <!-- Title -->\n <div class=\"tw-flex tw-items-center tw-space-x-3\">\n <cide-ele-icon class=\"tw-text-blue-600\">apartment</cide-ele-icon>\n <div>\n <h5 class=\"tw-text-md tw-font-semibold tw-text-gray-900\">Entity Management</h5>\n <p class=\"tw-text-sm tw-text-gray-600\">Manage and view all entities in the system</p>\n </div>\n </div>\n\n <!-- Actions -->\n <div class=\"tw-flex tw-items-center tw-space-x-3\">\n <!-- Entity Type Filter -->\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\n <label for=\"entityTypeFilter\" class=\"tw-text-sm tw-font-medium tw-text-gray-700\">Type:</label>\n <cide-ele-select\n id=\"entityTypeFilter\"\n [options]=\"entityTypeOptions()\"\n [(ngModel)]=\"selectedEntityTypeValue\"\n (ngModelChange)=\"loadEntities()\"\n class=\"tw-min-w-40\">\n </cide-ele-select>\n </div>\n\n <!-- Add Entity Button -->\n <button\n cideEleButton\n variant=\"primary\"\n size=\"sm\"\n (click)=\"router.navigate(['control-panel', 'entity-create'])\"\n class=\"tw-whitespace-nowrap tw-flex tw-items-center tw-gap-2\">\n <cide-ele-icon size=\"xs\" class=\"tw-w-6 tw-h-5\">add</cide-ele-icon>\n Add Entity\n </button>\n </div>\n </div>\n\n <!-- Error Message -->\n @if (error()) {\n <div class=\"tw-mt-4 tw-p-4 tw-bg-red-50 tw-border tw-border-red-200 tw-rounded-md\">\n <div class=\"tw-flex\">\n <cide-ele-icon name=\"exclamation-triangle\" class=\"tw-text-red-400\"></cide-ele-icon>\n <div class=\"tw-ml-3\">\n <h3 class=\"tw-text-sm tw-font-medium tw-text-red-800\">Error</h3>\n <p class=\"tw-text-sm tw-text-red-700 tw-mt-1\">{{ error() }}</p>\n </div>\n </div>\n </div>\n }\n </div>\n\n <!-- Data Grid Component -->\n <cide-ele-data-grid\n [config]=\"gridConfig()\"\n [customRenderers]=\"customRenderers\"\n [actionHandlers]=\"actionHandlers\"\n (gridEvent)=\"onGridEvent($event)\">\n </cide-ele-data-grid>\n\n</div>", styles: [".entity-list-container table tr{transition:background-color .15s ease}.entity-list-container table th{font-weight:600;letter-spacing:.025em}.entity-list-container table td{vertical-align:top}.entity-list-container .tw-text-red-600:hover{background-color:theme(\"colors.red.50\")}.entity-list-container .tw-animate-spin{animation:spin 1s linear infinite}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.entity-list-container .tw-overflow-x-auto{scrollbar-width:thin;scrollbar-color:theme(\"colors.gray.300\") theme(\"colors.gray.100\")}.entity-list-container .tw-overflow-x-auto::-webkit-scrollbar{height:8px}.entity-list-container .tw-overflow-x-auto::-webkit-scrollbar-track{background:theme(\"colors.gray.100\");border-radius:4px}.entity-list-container .tw-overflow-x-auto::-webkit-scrollbar-thumb{background:theme(\"colors.gray.300\");border-radius:4px}.entity-list-container .tw-overflow-x-auto::-webkit-scrollbar-thumb:hover{background:theme(\"colors.gray.400\")}@media (max-width: 768px){.entity-list-container .tw-px-6{padding-left:theme(\"spacing.4\");padding-right:theme(\"spacing.4\")}}\n", ":host{height:100%;display:flex;flex-direction:column}.entity-list-container{height:100%;display:flex;flex-direction:column;overflow:hidden}.tw-overflow-auto{flex:1;min-height:0}cide-ele-data-grid{flex:1;min-height:0;display:flex;flex-direction:column}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: CideIconComponent, selector: "cide-ele-icon", inputs: ["size", "type", "toolTip"] }, { kind: "component", type: CideEleButtonComponent, selector: "button[cideEleButton], a[cideEleButton]", inputs: ["label", "variant", "size", "type", "shape", "elevation", "disabled", "id", "loading", "fullWidth", "leftIcon", "rightIcon", "customClass", "tooltip", "ariaLabel", "testId", "routerLink", "routerExtras", "preventDoubleClick", "animated"], outputs: ["btnClick", "doubleClick"] }, { kind: "component", type: CideSelectComponent, selector: "cide-ele-select", inputs: ["label", "labelHide", "placeholder", "helperText", "errorText", "required", "disabled", "id", "ngModel", "size", "fill", "labelPlacement", "labelDir", "leadingIcon", "trailingIcon", "clearInput", "options", "multiple", "searchable", "showSearchInput", "loading"], outputs: ["ngModelChange", "change", "searchChange"] }, { kind: "component", type: CideEleDataGridComponent, selector: "cide-ele-data-grid", inputs: ["config", "customRenderers", "templateRenderers", "customFormatters", "actionHandlers", "serverSidePagination", "totalServerItems", "currentServerPage", "currentServerPageSize", "dragDropEnabled"], outputs: ["gridEvent"] }] }); }
1792
- }
1793
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CideAdmEntityListComponent, decorators: [{
1794
- type: Component,
1795
- args: [{ selector: 'cide-adm-entity-list', standalone: true, imports: [
1796
- CommonModule,
1797
- FormsModule,
1798
- CideInputComponent,
1799
- CideIconComponent,
1800
- CideEleButtonComponent,
1801
- CideSelectComponent,
1802
- TooltipDirective,
1803
- CideEleDataGridComponent
1804
- ], template: "<!-- Entity List Container -->\n<div class=\"entity-list-container tw-bg-white tw-shadow-lg tw-rounded-lg tw-overflow-hidden\">\n \n <!-- Header Section with Filters -->\n <div class=\"tw-px-6 tw-py-4 tw-border-b tw-border-gray-200 tw-bg-gray-50\">\n <div class=\"tw-flex tw-flex-col sm:tw-flex-row tw-justify-between tw-items-start sm:tw-items-center tw-space-y-4 sm:tw-space-y-0\">\n \n <!-- Title -->\n <div class=\"tw-flex tw-items-center tw-space-x-3\">\n <cide-ele-icon class=\"tw-text-blue-600\">apartment</cide-ele-icon>\n <div>\n <h5 class=\"tw-text-md tw-font-semibold tw-text-gray-900\">Entity Management</h5>\n <p class=\"tw-text-sm tw-text-gray-600\">Manage and view all entities in the system</p>\n </div>\n </div>\n\n <!-- Actions -->\n <div class=\"tw-flex tw-items-center tw-space-x-3\">\n <!-- Entity Type Filter -->\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\n <label for=\"entityTypeFilter\" class=\"tw-text-sm tw-font-medium tw-text-gray-700\">Type:</label>\n <cide-ele-select\n id=\"entityTypeFilter\"\n [options]=\"entityTypeOptions()\"\n [(ngModel)]=\"selectedEntityTypeValue\"\n (ngModelChange)=\"loadEntities()\"\n class=\"tw-min-w-40\">\n </cide-ele-select>\n </div>\n\n <!-- Add Entity Button -->\n <button\n cideEleButton\n variant=\"primary\"\n size=\"sm\"\n (click)=\"router.navigate(['control-panel', 'entity-create'])\"\n class=\"tw-whitespace-nowrap tw-flex tw-items-center tw-gap-2\">\n <cide-ele-icon size=\"xs\" class=\"tw-w-6 tw-h-5\">add</cide-ele-icon>\n Add Entity\n </button>\n </div>\n </div>\n\n <!-- Error Message -->\n @if (error()) {\n <div class=\"tw-mt-4 tw-p-4 tw-bg-red-50 tw-border tw-border-red-200 tw-rounded-md\">\n <div class=\"tw-flex\">\n <cide-ele-icon name=\"exclamation-triangle\" class=\"tw-text-red-400\"></cide-ele-icon>\n <div class=\"tw-ml-3\">\n <h3 class=\"tw-text-sm tw-font-medium tw-text-red-800\">Error</h3>\n <p class=\"tw-text-sm tw-text-red-700 tw-mt-1\">{{ error() }}</p>\n </div>\n </div>\n </div>\n }\n </div>\n\n <!-- Data Grid Component -->\n <cide-ele-data-grid\n [config]=\"gridConfig()\"\n [customRenderers]=\"customRenderers\"\n [actionHandlers]=\"actionHandlers\"\n (gridEvent)=\"onGridEvent($event)\">\n </cide-ele-data-grid>\n\n</div>", styles: [".entity-list-container table tr{transition:background-color .15s ease}.entity-list-container table th{font-weight:600;letter-spacing:.025em}.entity-list-container table td{vertical-align:top}.entity-list-container .tw-text-red-600:hover{background-color:theme(\"colors.red.50\")}.entity-list-container .tw-animate-spin{animation:spin 1s linear infinite}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.entity-list-container .tw-overflow-x-auto{scrollbar-width:thin;scrollbar-color:theme(\"colors.gray.300\") theme(\"colors.gray.100\")}.entity-list-container .tw-overflow-x-auto::-webkit-scrollbar{height:8px}.entity-list-container .tw-overflow-x-auto::-webkit-scrollbar-track{background:theme(\"colors.gray.100\");border-radius:4px}.entity-list-container .tw-overflow-x-auto::-webkit-scrollbar-thumb{background:theme(\"colors.gray.300\");border-radius:4px}.entity-list-container .tw-overflow-x-auto::-webkit-scrollbar-thumb:hover{background:theme(\"colors.gray.400\")}@media (max-width: 768px){.entity-list-container .tw-px-6{padding-left:theme(\"spacing.4\");padding-right:theme(\"spacing.4\")}}\n", ":host{height:100%;display:flex;flex-direction:column}.entity-list-container{height:100%;display:flex;flex-direction:column;overflow:hidden}.tw-overflow-auto{flex:1;min-height:0}cide-ele-data-grid{flex:1;min-height:0;display:flex;flex-direction:column}\n"] }]
1805
- }], propDecorators: { gridComponent: [{
1806
- type: ViewChild,
1807
- args: [CideEleDataGridComponent]
1808
- }] } });
1809
-
1810
- var cideAdmEntityList_component = /*#__PURE__*/Object.freeze({
1811
- __proto__: null,
1812
- CideAdmEntityListComponent: CideAdmEntityListComponent
1813
- });
1814
-
1815
- // import { authGuard } from '../../../../src/app/guards/auth.guard';
1816
41
  const adminRoutes = [{
1817
42
  path: "admin-home",
1818
- loadComponent: () => import('./cloud-ide-admin-cide-adm-home-wrapper.component-Cu0sr3ST.mjs').then(c => c.CideAdmHomeWrapperComponent),
1819
- // canActivate: [authGuard],
43
+ loadComponent: () => import('./cloud-ide-admin-cide-adm-home-wrapper.component-DpAhYlMT.mjs').then(c => c.CideAdmHomeWrapperComponent),
44
+ canActivate: [authGuard],
1820
45
  },
1821
46
  {
1822
47
  path: "home-admin",
1823
- loadComponent: () => import('./cloud-ide-admin-cide-adm-home-wrapper.component-Cu0sr3ST.mjs').then(c => c.CideAdmHomeWrapperComponent),
1824
- },
1825
- {
1826
- path: "entity-list",
1827
- loadComponent: () => Promise.resolve().then(function () { return cideAdmEntityList_component; }).then(c => c.CideAdmEntityListComponent),
1828
- // canActivate: [authGuard],
1829
- data: {
1830
- reuseTab: true,
1831
- sypg_page_code: "admin_entity_list"
1832
- }
1833
- },
1834
- {
1835
- path: "entity-create",
1836
- loadComponent: () => Promise.resolve().then(function () { return cideAdmEntity_component; }).then(c => c.CideAdmEntityComponent),
1837
- // canActivate: [authGuard],
1838
- data: {
1839
- reuseTab: true,
1840
- sypg_page_code: "core_entity_form"
1841
- }
1842
- },
1843
- {
1844
- path: "entity-create/:query",
1845
- loadComponent: () => Promise.resolve().then(function () { return cideAdmEntity_component; }).then(c => c.CideAdmEntityComponent),
1846
- // canActivate: [authGuard],
1847
- data: {
1848
- reuseTab: true,
1849
- sypg_page_code: "core_entity_form"
1850
- }
48
+ loadComponent: () => import('./cloud-ide-admin-cide-adm-home-wrapper.component-DpAhYlMT.mjs').then(c => c.CideAdmHomeWrapperComponent),
49
+ canActivate: [authGuard],
1851
50
  }];
1852
51
 
1853
52
  /*
1854
53
  * Public API Surface of cloud-ide-admin
1855
54
  */
55
+ // Main Admin Service and Component
56
+ // User Master Components (if they exist)
57
+ // export * from './lib/user-master/cide-adm-user-master.component';
58
+ // export * from './lib/user-master/cide-adm-user-master.service';
59
+ // export * from './lib/user-master/cide-adm-user-master-listing.component';
60
+ // export * from './lib/user-master/forms/cide-adm-user-contact-addresses.component';
61
+ // export * from './lib/user-master/forms/cide-adm-user-documents.component';
62
+ // export * from './lib/user-master/forms/cide-adm-user-family-details.component';
63
+ // export * from './lib/user-master/forms/cide-adm-user-attributes.component';
64
+ // export * from './lib/user-master/forms/cide-adm-user-entity-access.component';
1856
65
 
1857
66
  /**
1858
67
  * Generated bundle index. Do not edit.
1859
68
  */
1860
69
 
1861
- export { CideAdmAdminComponent, CideAdmAdminService, CideAdmEntityComponent, CideAdmEntityListComponent, CideAdmEntityService, adminRoutes };
70
+ export { CideAdmAdminComponent, CideAdmAdminService, adminRoutes };
1862
71
  //# sourceMappingURL=cloud-ide-admin.mjs.map