cloud-ide-admin 1.0.0

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