cloud-ide-shared 1.0.4 → 1.0.6

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.
@@ -1,8 +1,11 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { Component, InjectionToken, inject, Injectable, input, output, signal } from '@angular/core';
3
3
  import { Router } from '@angular/router';
4
- import { Observable } from 'rxjs';
4
+ import { Observable, BehaviorSubject, throwError } from 'rxjs';
5
5
  import { CideEleFileManagerService, CideEleButtonComponent, CideIconComponent, CideSpinnerComponent } from 'cloud-ide-element';
6
+ import { HttpClient } from '@angular/common/http';
7
+ import { tap, catchError } from 'rxjs/operators';
8
+ import { generateStringFromObject, cidePath, hostManagerRoutesUrl, coreRoutesUrl } from 'cloud-ide-lms-model';
6
9
  import * as i1 from '@angular/common';
7
10
  import { CommonModule } from '@angular/common';
8
11
 
@@ -256,6 +259,313 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImpor
256
259
  }]
257
260
  }] });
258
261
 
262
+ class CideCoreGeneralMasterTypeService {
263
+ http = inject(HttpClient);
264
+ generalMasterTypeListSubject = new BehaviorSubject([]);
265
+ generalMasterTypeList$ = this.generalMasterTypeListSubject.asObservable();
266
+ constructor() {
267
+ console.log('CideCoreGeneralMasterTypeService initialized - using real API');
268
+ }
269
+ /**
270
+ * Get general master type list from API
271
+ */
272
+ getTypeList(body) {
273
+ const query = generateStringFromObject(body);
274
+ return this.http?.get(cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, coreRoutesUrl?.module, coreRoutesUrl?.generalMasterType, query]))
275
+ .pipe(tap((response) => {
276
+ if (response?.success) {
277
+ this.generalMasterTypeListSubject.next(response?.data || []);
278
+ }
279
+ }), catchError(error => {
280
+ console.error('CideCoreGeneralMasterTypeService API error:', error);
281
+ return this.handleError(error);
282
+ }));
283
+ }
284
+ /**
285
+ * Get general master type list from cache (if available)
286
+ */
287
+ getTypeListFromCache() {
288
+ return this.generalMasterTypeListSubject.value;
289
+ }
290
+ /**
291
+ * Create or update general master type
292
+ * POST ${coreRoutesUrl?.generalMasterType} - payload: IGeneralMasterTypeCreateUpdatePayload, response: generalMasterTypeInsertUpdateControllerResponse
293
+ * If type._id exists, it will update; otherwise, it will create a new type
294
+ */
295
+ saveType(type) {
296
+ const isUpdate = !!type._id;
297
+ console.log(`${isUpdate ? 'Updating' : 'Creating'} general master type:`, type);
298
+ // Create proper payload - backend will determine create vs update based on _id presence
299
+ const payload = {
300
+ ...(type._id && { _id: type._id }), // Only include _id if it exists
301
+ sygmt_code: type.sygmt_code,
302
+ sygmt_title: type.sygmt_title,
303
+ sygmt_desc: type.sygmt_desc,
304
+ sygmt_isactive: type.sygmt_isactive,
305
+ sygmt_configuration: type.sygmt_configuration,
306
+ sygmt_id_sygmt: type.sygmt_id_sygmt
307
+ };
308
+ const url = cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, coreRoutesUrl?.module, coreRoutesUrl?.generalMasterType]);
309
+ return this.http.post(url, payload)
310
+ .pipe(tap((response) => {
311
+ if (response.success) {
312
+ this.refreshTypeList();
313
+ }
314
+ }), catchError(this.handleError));
315
+ }
316
+ /**
317
+ * Get general master type by ID
318
+ * GET ${coreRoutesUrl?.generalMasterType}/byId/:query - payload: { sygmt_id: string }, response: generalMasterTypeByIdControllerResponse
319
+ */
320
+ getTypeById(id) {
321
+ console.log('Getting general master type by ID:', id);
322
+ const payload = { sygmt_id: id };
323
+ const query = generateStringFromObject(payload);
324
+ const url = cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, coreRoutesUrl?.module, coreRoutesUrl?.generalMasterType, 'byId', query]);
325
+ return this.http.get(url)
326
+ .pipe(catchError(this.handleError));
327
+ }
328
+ /**
329
+ * Delete general master type
330
+ * DELETE ${coreRoutesUrl?.generalMasterType}/:query - payload: { sygmt_id: string }, response: generalMasterTypeDeleteControllerResponse
331
+ */
332
+ deleteType(id) {
333
+ const payload = { sygmt_id: id };
334
+ const query = generateStringFromObject(payload);
335
+ const url = cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, coreRoutesUrl?.module, coreRoutesUrl?.generalMasterType, query]);
336
+ return this.http.delete(url)
337
+ .pipe(tap((response) => {
338
+ if (response.success) {
339
+ this.refreshTypeList();
340
+ }
341
+ }), catchError(this.handleError));
342
+ }
343
+ /**
344
+ * Toggle general master type active status
345
+ */
346
+ toggleTypeStatus(id) {
347
+ console.log('Toggling general master type status:', id);
348
+ const payload = { id };
349
+ const query = generateStringFromObject(payload);
350
+ const url = cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, coreRoutesUrl?.module, coreRoutesUrl?.generalMasterType, query]);
351
+ return this.http.put(url, {})
352
+ .pipe(tap((response) => {
353
+ if (response.success) {
354
+ this.refreshTypeList();
355
+ }
356
+ }), catchError(this.handleError));
357
+ }
358
+ /**
359
+ * Check if type code exists
360
+ */
361
+ checkTypeCodeExists(code, excludeId) {
362
+ const payload = { code };
363
+ if (excludeId) {
364
+ payload['excludeId'] = excludeId;
365
+ }
366
+ const query = generateStringFromObject(payload);
367
+ const url = cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, coreRoutesUrl?.module, coreRoutesUrl?.generalMasterType, 'checkCodeExists', query]);
368
+ return this.http.get(url)
369
+ .pipe(catchError(this.handleError));
370
+ }
371
+ /**
372
+ * Refresh general master type list from server
373
+ */
374
+ refreshTypeList() {
375
+ const defaultBody = {};
376
+ this.getTypeList(defaultBody).subscribe({
377
+ next: () => {
378
+ console.log('General master type list refreshed successfully');
379
+ },
380
+ error: (error) => {
381
+ console.error('Error refreshing general master type list:', error);
382
+ }
383
+ });
384
+ }
385
+ /**
386
+ * Handle errors
387
+ */
388
+ handleError(error) {
389
+ let errorMessage = 'An error occurred';
390
+ if (error instanceof Error) {
391
+ errorMessage = error.message;
392
+ }
393
+ else if (typeof error === 'string') {
394
+ errorMessage = error;
395
+ }
396
+ console.error('General Master Type Service Error:', errorMessage);
397
+ return throwError(() => new Error(errorMessage));
398
+ }
399
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: CideCoreGeneralMasterTypeService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
400
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: CideCoreGeneralMasterTypeService, providedIn: 'root' });
401
+ }
402
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: CideCoreGeneralMasterTypeService, decorators: [{
403
+ type: Injectable,
404
+ args: [{
405
+ providedIn: 'root'
406
+ }]
407
+ }], ctorParameters: () => [] });
408
+
409
+ class CideCoreGeneralMasterService {
410
+ http = inject(HttpClient);
411
+ generalMasterListSubject = new BehaviorSubject([]);
412
+ generalMasterList$ = this.generalMasterListSubject.asObservable();
413
+ constructor() {
414
+ console.log('CideCoreGeneralMasterService initialized - using real API');
415
+ }
416
+ /**
417
+ * Get general master list from API
418
+ */
419
+ getMasterList(payload) {
420
+ const query = generateStringFromObject(payload);
421
+ return this.http?.get(cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, coreRoutesUrl?.module, coreRoutesUrl?.generalMaster, query]))
422
+ .pipe(tap((response) => {
423
+ if (response?.success) {
424
+ this.generalMasterListSubject.next(response?.data || []);
425
+ }
426
+ }), catchError(error => {
427
+ console.error('CideCoreGeneralMasterService API error:', error);
428
+ return this.handleError(error);
429
+ }));
430
+ }
431
+ /**
432
+ * Get general master list from cache (if available)
433
+ */
434
+ getMasterListFromCache() {
435
+ return this.generalMasterListSubject.value;
436
+ }
437
+ /**
438
+ * Save general master (create or update)
439
+ * POST ${coreRoutesUrl?.generalMaster} - payload: ICoreSygms, response: generalMasterInsertUpdateControllerResponse
440
+ */
441
+ saveMaster(master) {
442
+ const isUpdate = !!master._id;
443
+ console.log(`${isUpdate ? 'Updating' : 'Creating'} general master:`, master);
444
+ // Create proper payload
445
+ const payload = {
446
+ ...(master._id && { _id: master._id }), // Only include _id if it exists
447
+ sygms_code: master.sygms_code,
448
+ sygms_id_sygmt: master.sygms_id_sygmt,
449
+ sygms_title: master.sygms_title,
450
+ sygms_desc: master.sygms_desc,
451
+ sygms_isactive: master.sygms_isactive,
452
+ sygms_id_sygms: master.sygms_id_sygms,
453
+ sygms_configuration: master.sygms_configuration,
454
+ sygms_entity_id_syen: master.sygms_entity_id_syen
455
+ };
456
+ const url = cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, coreRoutesUrl?.module, coreRoutesUrl?.generalMaster]);
457
+ return this.http.post(url, payload)
458
+ .pipe(tap((response) => {
459
+ if (response.success) {
460
+ this.refreshMasterList();
461
+ }
462
+ }), catchError(this.handleError));
463
+ }
464
+ /**
465
+ * Create new general master (backward compatibility)
466
+ */
467
+ createMaster(master) {
468
+ return this.saveMaster(master);
469
+ }
470
+ /**
471
+ * Update existing general master (backward compatibility)
472
+ */
473
+ updateMaster(id, master) {
474
+ return this.saveMaster({ ...master, _id: id });
475
+ }
476
+ /**
477
+ * Get general master by ID
478
+ * GET ${coreRoutesUrl?.generalMaster}/byId/:query - payload: { sygms_id: string }, response: generalMasterByIdControllerResponse
479
+ */
480
+ getMasterById(id) {
481
+ console.log('Getting general master by ID:', id);
482
+ const payload = { sygms_id: id };
483
+ const query = generateStringFromObject(payload);
484
+ const url = cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, coreRoutesUrl?.module, coreRoutesUrl?.generalMaster, 'byId', query]);
485
+ return this.http.get(url)
486
+ .pipe(catchError(this.handleError));
487
+ }
488
+ /**
489
+ * Delete general master
490
+ * DELETE ${coreRoutesUrl?.generalMaster}/:query - payload: { sygms_id: string }, response: generalMasterDeleteControllerResponse
491
+ */
492
+ deleteMaster(id) {
493
+ const payload = { sygms_id: id };
494
+ const query = generateStringFromObject(payload);
495
+ const url = cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, coreRoutesUrl?.module, coreRoutesUrl?.generalMaster, query]);
496
+ return this.http.delete(url)
497
+ .pipe(tap((response) => {
498
+ if (response.success) {
499
+ this.refreshMasterList();
500
+ }
501
+ }), catchError(this.handleError));
502
+ }
503
+ /**
504
+ * Toggle general master active status
505
+ */
506
+ toggleMasterStatus(id) {
507
+ console.log('Toggling general master status:', id);
508
+ const payload = { id };
509
+ const query = generateStringFromObject(payload);
510
+ const url = cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, coreRoutesUrl?.module, coreRoutesUrl?.generalMaster, query]);
511
+ return this.http.put(url, {})
512
+ .pipe(tap((response) => {
513
+ if (response.success) {
514
+ this.refreshMasterList();
515
+ }
516
+ }), catchError(this.handleError));
517
+ }
518
+ /**
519
+ * Check if master code exists
520
+ */
521
+ checkMasterCodeExists(code, typeId, excludeId) {
522
+ const payload = { code, typeId };
523
+ if (excludeId) {
524
+ payload['excludeId'] = excludeId;
525
+ }
526
+ const query = generateStringFromObject(payload);
527
+ const url = cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, coreRoutesUrl?.module, coreRoutesUrl?.generalMaster, 'checkCodeExists', query]);
528
+ return this.http.get(url)
529
+ .pipe(catchError(this.handleError));
530
+ }
531
+ /**
532
+ * Refresh general master list from server
533
+ */
534
+ refreshMasterList() {
535
+ const defaultPayload = {};
536
+ this.getMasterList(defaultPayload).subscribe({
537
+ next: () => {
538
+ console.log('General master list refreshed successfully');
539
+ },
540
+ error: (error) => {
541
+ console.error('Error refreshing general master list:', error);
542
+ }
543
+ });
544
+ }
545
+ /**
546
+ * Handle errors
547
+ */
548
+ handleError(error) {
549
+ let errorMessage = 'An error occurred';
550
+ if (error instanceof Error) {
551
+ errorMessage = error.message;
552
+ }
553
+ else if (typeof error === 'string') {
554
+ errorMessage = error;
555
+ }
556
+ console.error('General Master Service Error:', errorMessage);
557
+ return throwError(() => new Error(errorMessage));
558
+ }
559
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: CideCoreGeneralMasterService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
560
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: CideCoreGeneralMasterService, providedIn: 'root' });
561
+ }
562
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: CideCoreGeneralMasterService, decorators: [{
563
+ type: Injectable,
564
+ args: [{
565
+ providedIn: 'root'
566
+ }]
567
+ }], ctorParameters: () => [] });
568
+
259
569
  // Injection token for entity service
260
570
  const ENTITY_SERVICE_TOKEN = new InjectionToken('EntityService');
261
571
  class CideSharedOrgStructureComponent {
@@ -311,16 +621,10 @@ class CideSharedOrgStructureComponent {
311
621
  // First pass: create all nodes
312
622
  entities.forEach(entity => {
313
623
  const node = {
314
- _id: entity._id || '',
315
- syen_name: entity.syen_name || 'Unnamed Entity',
316
- syen_entity_code: entity.syen_entity_code || '',
317
- syen_entity_type_sygms: entity.syen_entity_type_sygms || '',
318
- syen_isactive: entity.syen_isactive || false,
319
- children: [],
320
- level: 0,
321
- parentId: entity.syen_id_syen || undefined
624
+ ...entity,
625
+ children: []
322
626
  };
323
- nodeMap.set(node._id, node);
627
+ nodeMap.set(entity._id || '', node);
324
628
  });
325
629
  // Second pass: build hierarchy
326
630
  entities.forEach(entity => {
@@ -331,10 +635,8 @@ class CideSharedOrgStructureComponent {
331
635
  const parent = nodeMap.get(parentId);
332
636
  parent.children = parent.children || [];
333
637
  parent.children.push(node);
334
- node.level = this.calculateLevel(parent, nodeMap);
335
638
  }
336
639
  else {
337
- node.level = 0;
338
640
  rootNodes.push(node);
339
641
  }
340
642
  }
@@ -349,9 +651,9 @@ class CideSharedOrgStructureComponent {
349
651
  calculateLevel(node, nodeMap) {
350
652
  let level = 0;
351
653
  let current = node;
352
- while (current.parentId && nodeMap.has(current.parentId)) {
654
+ while (current.syen_id_syen && nodeMap.has(current.syen_id_syen)) {
353
655
  level++;
354
- current = nodeMap.get(current.parentId);
656
+ current = nodeMap.get(current.syen_id_syen);
355
657
  }
356
658
  return level;
357
659
  }
@@ -359,7 +661,7 @@ class CideSharedOrgStructureComponent {
359
661
  * Sort children recursively by name
360
662
  */
361
663
  sortChildrenRecursively(nodes) {
362
- nodes.sort((a, b) => a.syen_name.localeCompare(b.syen_name));
664
+ nodes.sort((a, b) => (a.syen_name || '').localeCompare(b.syen_name || ''));
363
665
  nodes.forEach(node => {
364
666
  if (node.children && node.children.length > 0) {
365
667
  this.sortChildrenRecursively(node.children);
@@ -417,7 +719,7 @@ class CideSharedOrgStructureComponent {
417
719
  });
418
720
  }
419
721
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: CideSharedOrgStructureComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
420
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.7", type: CideSharedOrgStructureComponent, isStandalone: true, selector: "cide-shared-org-structure", inputs: { allowSwitching: { classPropertyName: "allowSwitching", publicName: "allowSwitching", isSignal: true, isRequired: false, transformFunction: null }, showActions: { classPropertyName: "showActions", publicName: "showActions", isSignal: true, isRequired: false, transformFunction: null }, mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { entityClick: "entityClick", entitySelect: "entitySelect", entityView: "entityView" }, ngImport: i0, template: "<!-- Organization Structure Component -->\n<div class=\"tw-flex-1 tw-overflow-hidden\">\n @if (loading()) {\n <div class=\"tw-flex tw-items-center tw-justify-center tw-py-12\">\n <cide-ele-spinner size=\"md\"></cide-ele-spinner>\n <span class=\"tw-ml-3 tw-text-gray-600 tw-text-sm\">Loading organization structure...</span>\n </div>\n } @else if (error()) {\n <div class=\"tw-text-center tw-py-12\">\n <div class=\"tw-w-16 tw-h-16 tw-bg-red-100 tw-rounded-full tw-flex tw-items-center tw-justify-center tw-mx-auto tw-mb-4\">\n <cide-ele-icon class=\"tw-w-8 tw-h-8 tw-text-red-500\">error</cide-ele-icon>\n </div>\n <h3 class=\"tw-text-lg tw-font-medium tw-text-gray-900 tw-mb-2\">Error Loading Structure</h3>\n <p class=\"tw-text-gray-600 tw-mb-4\">{{ error() }}</p>\n <button cideEleButton variant=\"primary\" size=\"sm\" (click)=\"loadOrgStructure()\">\n <cide-ele-icon>refresh</cide-ele-icon>\n Try Again\n </button>\n </div>\n } @else if (orgStructure().length === 0) {\n <div class=\"tw-text-center tw-py-12\">\n <div class=\"tw-w-16 tw-h-16 tw-bg-gray-100 tw-rounded-full tw-flex tw-items-center tw-justify-center tw-mx-auto tw-mb-4\">\n <cide-ele-icon class=\"tw-w-8 tw-h-8 tw-text-gray-400\">account_tree</cide-ele-icon>\n </div>\n <h3 class=\"tw-text-lg tw-font-medium tw-text-gray-900 tw-mb-2\">No Entities Found</h3>\n <p class=\"tw-text-gray-600 tw-mb-4\">No entities are available to display in the organization structure.</p>\n @if (mode() === 'view') {\n <button cideEleButton variant=\"primary\" size=\"sm\" (click)=\"router.navigate(['/control-panel/entity-list'])\">\n <cide-ele-icon>add</cide-ele-icon>\n Create First Entity\n </button>\n }\n </div>\n } @else {\n <!-- Organization Chart Container -->\n <div class=\"tw-relative tw-min-h-screen tw-bg-gray-50 tw-py-8\">\n <!-- Background Grid Pattern -->\n <div class=\"tw-absolute tw-inset-0 tw-opacity-30\" style=\"background-image: radial-gradient(circle, #e5e7eb 1px, transparent 1px); background-size: 20px 20px;\"></div>\n \n <!-- Chart Content -->\n <div class=\"tw-relative tw-z-10\">\n @for (rootNode of orgStructure(); track rootNode._id) {\n <div class=\"tw-flex tw-flex-col tw-items-center tw-mb-12\">\n <!-- Render node recursively with unlimited depth -->\n <ng-container [ngTemplateOutlet]=\"entityNodeTemplate\" [ngTemplateOutletContext]=\"{ $implicit: rootNode, level: 0 }\"></ng-container>\n </div>\n }\n </div>\n </div>\n }\n</div>\n\n<!-- Entity Node Template (Recursive) -->\n<ng-template #entityNodeTemplate let-node let-level=\"level\">\n <div class=\"tw-flex tw-flex-col tw-items-center\">\n \n <!-- Entity Card -->\n <div class=\"tw-bg-white tw-shadow-lg tw-rounded-lg tw-p-4 tw-min-w-64 tw-max-w-72 tw-border-t-4 tw-transition-shadow tw-cursor-pointer hover:tw-shadow-xl\"\n [class.level-0]=\"level === 0\"\n [class.level-1]=\"level === 1\"\n [class.level-2]=\"level === 2\"\n [class.level-3]=\"level === 3\"\n [class.level-4]=\"level === 4\"\n [class.level-5]=\"level === 5\"\n (click)=\"viewEntity(node._id)\">\n \n <!-- Card Content -->\n <div class=\"tw-flex tw-items-center tw-space-x-3\">\n <!-- Avatar -->\n <div class=\"tw-w-12 tw-h-12 tw-bg-purple-100 tw-rounded-full tw-flex tw-items-center tw-justify-center tw-flex-shrink-0\">\n <cide-ele-icon class=\"tw-w-6 tw-h-6 tw-text-purple-600\">person</cide-ele-icon>\n </div>\n \n <!-- Entity Info -->\n <div class=\"tw-flex-1 tw-min-w-0\">\n <h3 class=\"tw-text-sm tw-font-semibold tw-text-gray-900 tw-whitespace-nowrap tw-overflow-hidden tw-text-ellipsis\">{{ node.syen_name }}</h3>\n <p class=\"tw-text-xs tw-text-gray-600 tw-mt-1\">{{ node.syen_entity_code }}</p>\n <p class=\"tw-text-xs tw-text-gray-500 tw-mt-1\">{{ node.syen_entity_type_sygms }}</p>\n </div>\n </div>\n \n <!-- Action Icons -->\n <div class=\"tw-flex tw-items-center tw-justify-between tw-mt-3\">\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\n <!-- Phone Icon -->\n <button class=\"tw-w-6 tw-h-6 tw-rounded-full tw-bg-gray-100 tw-flex tw-items-center tw-justify-center tw-text-gray-600 hover:tw-bg-gray-200 tw-transition-colors\">\n <cide-ele-icon class=\"tw-text-xs\">phone</cide-ele-icon>\n </button>\n \n <!-- Email Icon -->\n <button class=\"tw-w-6 tw-h-6 tw-rounded-full tw-bg-gray-100 tw-flex tw-items-center tw-justify-center tw-text-gray-600 hover:tw-bg-gray-200 tw-transition-colors\">\n <cide-ele-icon class=\"tw-text-xs\">email</cide-ele-icon>\n </button>\n \n <!-- LinkedIn Icon -->\n <button class=\"tw-w-6 tw-h-6 tw-rounded-full tw-bg-blue-100 tw-flex tw-items-center tw-justify-center tw-text-blue-600 hover:tw-bg-blue-200 tw-transition-colors\">\n <cide-ele-icon class=\"tw-text-xs\">attach_money</cide-ele-icon>\n </button>\n \n <!-- Document Icon -->\n <button class=\"tw-w-6 tw-h-6 tw-rounded-full tw-bg-gray-100 tw-flex tw-items-center tw-justify-center tw-text-gray-600 hover:tw-bg-gray-200 tw-transition-colors\">\n <cide-ele-icon class=\"tw-text-xs\">description</cide-ele-icon>\n </button>\n \n <!-- More Options Icon -->\n <button class=\"tw-w-6 tw-h-6 tw-rounded-full tw-bg-gray-100 tw-flex tw-items-center tw-justify-center tw-text-gray-600 hover:tw-bg-gray-200 tw-transition-colors\">\n <cide-ele-icon class=\"tw-text-xs\">more_horiz</cide-ele-icon>\n </button>\n </div>\n \n <!-- Status Badge -->\n <div class=\"tw-flex-shrink-0\">\n @if (node.syen_isactive) {\n <div class=\"tw-inline-flex tw-items-center tw-px-1.5 tw-py-0.5 tw-rounded-full tw-text-xs tw-font-medium tw-bg-green-100 tw-text-green-800\">\n <div class=\"tw-w-1.5 tw-h-1.5 tw-bg-green-500 tw-rounded-full tw-mr-1\"></div>\n Active\n </div>\n } @else {\n <div class=\"tw-inline-flex tw-items-center tw-px-1.5 tw-py-0.5 tw-rounded-full tw-text-xs tw-font-medium tw-bg-red-100 tw-text-red-800\">\n <div class=\"tw-w-1.5 tw-h-1.5 tw-bg-red-500 tw-rounded-full tw-mr-1\"></div>\n Inactive\n </div>\n }\n </div>\n </div>\n </div>\n \n <!-- Children Entities (Recursive) -->\n @if (node.children && node.children.length > 0) {\n <!-- Ultra-Compact Connection Lines -->\n <div class=\"tw-relative tw-flex tw-flex-col tw-items-center tw-mt-2\">\n <!-- Minimal connection dot -->\n <div class=\"tw-absolute tw-left-1/2 tw-transform tw--translate-x-1/2\" style=\"top: -8px;\">\n <div class=\"tw-w-2 tw-h-2 tw-bg-purple-600 tw-rounded-full tw-border tw-border-white\"></div>\n </div>\n \n <!-- Ultra-Compact SVG Lines -->\n <div class=\"tw-relative tw-w-full\" style=\"height: 30px;\">\n @if (node.children && node.children.length === 1) {\n <!-- Single child - minimal line -->\n <svg class=\"tw-absolute tw-left-1/2 connection-line-compact\" style=\"transform: translateX(-50%); width: 2px; height: 30px; top: 0;\">\n <line x1=\"1\" y1=\"0\" x2=\"1\" y2=\"30\" stroke=\"#9333ea\" stroke-width=\"2\" stroke-linecap=\"round\"/>\n </svg>\n }\n @else if (node.children && node.children.length > 1) {\n <!-- Multiple children - minimal design -->\n <svg class=\"tw-absolute tw-left-1/2 connection-line-compact\" [attr.style]=\"'transform: translateX(-50%); width: ' + ((node.children.length - 1) * 336 + 256) + 'px; height: 30px; top: 0;'\">\n <!-- Vertical line -->\n <line [attr.x1]=\"((node.children.length - 1) * 336 + 256) / 2\" \n y1=\"0\" \n [attr.x2]=\"((node.children.length - 1) * 336 + 256) / 2\" \n y2=\"12\" \n stroke=\"#9333ea\" \n stroke-width=\"2\" \n stroke-linecap=\"round\"/>\n \n <!-- Horizontal line -->\n <path [attr.d]=\"'M 128 15 L ' + ((node.children.length - 1) * 336 + 128) + ' 15'\" \n stroke=\"#9333ea\" \n stroke-width=\"2\" \n stroke-linecap=\"round\"/>\n \n <!-- Vertical lines to children -->\n @for (child of node.children; track child._id; let i = $index) {\n <line [attr.x1]=\"(i * 336) + 128\" \n y1=\"15\" \n [attr.x2]=\"(i * 336) + 128\" \n y2=\"28\" \n stroke=\"#9333ea\" \n stroke-width=\"2\" \n stroke-linecap=\"round\"/>\n <!-- Tiny dot -->\n <circle [attr.cx]=\"(i * 336) + 128\" cy=\"28\" r=\"2.5\" fill=\"#9333ea\" stroke=\"#fff\" stroke-width=\"1\"/>\n }\n </svg>\n }\n </div>\n \n <!-- Children -->\n <div class=\"tw-flex tw-justify-center tw-gap-20\">\n @for (child of node.children; track child._id) {\n <div class=\"tw-flex tw-flex-col tw-items-center\">\n <!-- Child node -->\n <ng-container [ngTemplateOutlet]=\"entityNodeTemplate\" [ngTemplateOutletContext]=\"{ $implicit: child, level: level + 1 }\"></ng-container>\n </div>\n }\n </div>\n </div>\n }\n </div>\n</ng-template>\n", styles: [":host{height:100%;display:flex;flex-direction:column}.tw-overflow-y-auto::-webkit-scrollbar{width:6px}.tw-overflow-y-auto::-webkit-scrollbar-track{background:#f1f5f9;border-radius:3px}.tw-overflow-y-auto::-webkit-scrollbar-thumb{background:#cbd5e1;border-radius:3px}.tw-overflow-y-auto::-webkit-scrollbar-thumb:hover{background:#94a3b8}.tw-transition-shadow{transition:box-shadow .2s ease-in-out}.tw-shadow-lg:hover{box-shadow:0 20px 25px -5px #0000001a,0 10px 10px -5px #0000000a;transform:translateY(-2px);transition:all .2s ease-in-out}.tw-bg-purple-300,.tw-bg-purple-400{transition:all .3s ease-in-out}.connection-line-compact{display:block;overflow:visible}.connection-line-compact path,.connection-line-compact line{stroke-linecap:round;stroke-linejoin:round;transition:stroke-width .2s ease}.connection-line-compact:hover path,.connection-line-compact:hover line{stroke-width:3}.connection-line-compact circle{transition:all .2s ease}.connection-line-compact circle:hover{filter:drop-shadow(0 2px 4px rgba(147,51,234,.4))}.level-0{border-color:#fb923c!important}.level-1{border-color:#60a5fa!important}.level-2{border-color:#a78bfa!important}.level-3{border-color:#4ade80!important}.level-4{border-color:#818cf8!important}.level-5{border-color:#f472b6!important}@media (max-width: 1200px){.tw-max-w-7xl{max-width:100%}.tw-gap-6{gap:1rem}.tw-min-w-64{min-width:14rem}.tw-max-w-72{max-width:16rem}}@media (max-width: 768px){.tw-min-w-64{min-width:12rem}.tw-max-w-72{max-width:14rem}.tw-max-w-7xl{max-width:100%}.tw-gap-6{gap:.75rem}.tw-p-4{padding:.75rem}.tw-mb-4{margin-bottom:.75rem}.tw-space-x-3{gap:.5rem}.tw-space-x-2{gap:.375rem}.tw-w-12{width:2.5rem}.tw-h-12{height:2.5rem}}@media (max-width: 480px){.tw-min-w-72{min-width:12rem}.tw-max-w-80{max-width:14rem}.tw-p-4{padding:.5rem}.tw-space-x-3{gap:.375rem}.tw-space-x-2{gap:.25rem}.tw-mb-3{margin-bottom:.5rem}.tw-w-12{width:2rem}.tw-h-12{height:2rem}.tw-w-8{width:1.5rem}.tw-h-8{height:1.5rem}}@media print{.tw-bg-gray-50{background:#fff!important}.tw-shadow-lg{box-shadow:none!important;border:1px solid #e5e7eb!important}.tw-bg-purple-300{background:#6b7280!important}.tw-border-purple-300{border-color:#6b7280!important}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { 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: CideIconComponent, selector: "cide-ele-icon", inputs: ["size", "type", "toolTip"] }, { kind: "component", type: CideSpinnerComponent, selector: "cide-ele-spinner", inputs: ["size", "type"] }] });
722
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.7", type: CideSharedOrgStructureComponent, isStandalone: true, selector: "cide-shared-org-structure", inputs: { allowSwitching: { classPropertyName: "allowSwitching", publicName: "allowSwitching", isSignal: true, isRequired: false, transformFunction: null }, showActions: { classPropertyName: "showActions", publicName: "showActions", isSignal: true, isRequired: false, transformFunction: null }, mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { entityClick: "entityClick", entitySelect: "entitySelect", entityView: "entityView" }, ngImport: i0, template: "<!-- Organization Structure Component -->\n<div class=\"tw-flex-1 tw-overflow-hidden\">\n @if (loading()) {\n <div class=\"tw-flex tw-items-center tw-justify-center tw-py-12\">\n <cide-ele-spinner size=\"md\"></cide-ele-spinner>\n <span class=\"tw-ml-3 tw-text-gray-600 tw-text-sm\">Loading organization structure...</span>\n </div>\n } @else if (error()) {\n <div class=\"tw-text-center tw-py-12\">\n <div class=\"tw-w-16 tw-h-16 tw-bg-red-100 tw-rounded-full tw-flex tw-items-center tw-justify-center tw-mx-auto tw-mb-4\">\n <cide-ele-icon class=\"tw-w-8 tw-h-8 tw-text-red-500\">error</cide-ele-icon>\n </div>\n <h3 class=\"tw-text-lg tw-font-medium tw-text-gray-900 tw-mb-2\">Error Loading Structure</h3>\n <p class=\"tw-text-gray-600 tw-mb-4\">{{ error() }}</p>\n <button cideEleButton variant=\"primary\" size=\"sm\" (click)=\"loadOrgStructure()\">\n <cide-ele-icon>refresh</cide-ele-icon>\n Try Again\n </button>\n </div>\n } @else if (orgStructure().length === 0) {\n <div class=\"tw-text-center tw-py-12\">\n <div class=\"tw-w-16 tw-h-16 tw-bg-gray-100 tw-rounded-full tw-flex tw-items-center tw-justify-center tw-mx-auto tw-mb-4\">\n <cide-ele-icon class=\"tw-w-8 tw-h-8 tw-text-gray-400\">account_tree</cide-ele-icon>\n </div>\n <h3 class=\"tw-text-lg tw-font-medium tw-text-gray-900 tw-mb-2\">No Entities Found</h3>\n <p class=\"tw-text-gray-600 tw-mb-4\">No entities are available to display in the organization structure.</p>\n @if (mode() === 'view') {\n <button cideEleButton variant=\"primary\" size=\"sm\" (click)=\"router.navigate(['/control-panel/entity-list'])\">\n <cide-ele-icon>add</cide-ele-icon>\n Create First Entity\n </button>\n }\n </div>\n } @else {\n <!-- Organization Chart Container -->\n <div class=\"tw-relative tw-min-h-screen tw-bg-gray-50 tw-py-8 tw-overflow-x-auto org-chart-container\">\n <!-- Background Grid Pattern -->\n <div class=\"tw-absolute tw-inset-0 tw-opacity-30\" style=\"background-image: radial-gradient(circle, #e5e7eb 1px, transparent 1px); background-size: 20px 20px;\"></div>\n \n <!-- Chart Content -->\n <div class=\"tw-relative tw-z-10 tw-min-w-max tw-px-4 org-chart-content\">\n @for (rootNode of orgStructure(); track rootNode._id) {\n <div class=\"tw-flex tw-flex-col tw-items-center tw-mb-12\">\n <!-- Render node recursively with unlimited depth -->\n <ng-container [ngTemplateOutlet]=\"entityNodeTemplate\" [ngTemplateOutletContext]=\"{ $implicit: rootNode, level: 0 }\"></ng-container>\n </div>\n }\n </div>\n </div>\n }\n</div>\n\n<!-- Entity Node Template (Recursive) -->\n<ng-template #entityNodeTemplate let-node let-level=\"level\">\n <div class=\"tw-flex tw-flex-col tw-items-center\">\n \n <!-- Entity Card -->\n <div class=\"tw-bg-white tw-shadow-lg tw-rounded-lg tw-p-4 tw-w-64 tw-max-w-72 tw-border-t-4 tw-transition-all tw-cursor-pointer hover:tw-shadow-xl hover:tw-scale-105 entity-card\"\n [class.level-0]=\"level === 0\"\n [class.level-1]=\"level === 1\"\n [class.level-2]=\"level === 2\"\n [class.level-3]=\"level === 3\"\n [class.level-4]=\"level === 4\"\n [class.level-5]=\"level === 5\"\n (click)=\"viewEntity(node._id)\">\n \n <!-- Card Content -->\n <div class=\"tw-flex tw-items-center tw-space-x-3\">\n <!-- Avatar -->\n <div class=\"tw-w-12 tw-h-12 tw-bg-purple-100 tw-rounded-full tw-flex tw-items-center tw-justify-center tw-flex-shrink-0\">\n <cide-ele-icon class=\"tw-w-6 tw-h-6 tw-text-purple-600\">person</cide-ele-icon>\n </div>\n \n <!-- Entity Info -->\n <div class=\"tw-flex-1 tw-min-w-0\">\n <h3 class=\"tw-text-sm tw-font-semibold tw-text-gray-900 tw-whitespace-nowrap tw-overflow-hidden tw-text-ellipsis\">{{ node.syen_name }}</h3>\n <p class=\"tw-text-xs tw-text-gray-600 tw-mt-1\">{{ node.syen_entity_code }}</p>\n <p class=\"tw-text-xs tw-text-gray-500 tw-mt-1\">{{ node.syen_entity_type_sygms }}</p>\n </div>\n </div>\n \n <!-- Action Icons -->\n <div class=\"tw-flex tw-items-center tw-justify-between tw-mt-3\">\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\n <!-- Phone Icon -->\n <button class=\"tw-w-6 tw-h-6 tw-rounded-full tw-bg-gray-100 tw-flex tw-items-center tw-justify-center tw-text-gray-600 hover:tw-bg-gray-200 tw-transition-colors\">\n <cide-ele-icon class=\"tw-text-xs\">phone</cide-ele-icon>\n </button>\n \n <!-- Email Icon -->\n <button class=\"tw-w-6 tw-h-6 tw-rounded-full tw-bg-gray-100 tw-flex tw-items-center tw-justify-center tw-text-gray-600 hover:tw-bg-gray-200 tw-transition-colors\">\n <cide-ele-icon class=\"tw-text-xs\">email</cide-ele-icon>\n </button>\n \n <!-- LinkedIn Icon -->\n <button class=\"tw-w-6 tw-h-6 tw-rounded-full tw-bg-blue-100 tw-flex tw-items-center tw-justify-center tw-text-blue-600 hover:tw-bg-blue-200 tw-transition-colors\">\n <cide-ele-icon class=\"tw-text-xs\">attach_money</cide-ele-icon>\n </button>\n \n <!-- Document Icon -->\n <button class=\"tw-w-6 tw-h-6 tw-rounded-full tw-bg-gray-100 tw-flex tw-items-center tw-justify-center tw-text-gray-600 hover:tw-bg-gray-200 tw-transition-colors\">\n <cide-ele-icon class=\"tw-text-xs\">description</cide-ele-icon>\n </button>\n \n <!-- More Options Icon -->\n <button class=\"tw-w-6 tw-h-6 tw-rounded-full tw-bg-gray-100 tw-flex tw-items-center tw-justify-center tw-text-gray-600 hover:tw-bg-gray-200 tw-transition-colors\">\n <cide-ele-icon class=\"tw-text-xs\">more_horiz</cide-ele-icon>\n </button>\n </div>\n \n <!-- Status Badge -->\n <div class=\"tw-flex-shrink-0\">\n @if (node.syen_isactive) {\n <div class=\"tw-inline-flex tw-items-center tw-px-1.5 tw-py-0.5 tw-rounded-full tw-text-xs tw-font-medium tw-bg-green-100 tw-text-green-800\">\n <div class=\"tw-w-1.5 tw-h-1.5 tw-bg-green-500 tw-rounded-full tw-mr-1\"></div>\n Active\n </div>\n } @else {\n <div class=\"tw-inline-flex tw-items-center tw-px-1.5 tw-py-0.5 tw-rounded-full tw-text-xs tw-font-medium tw-bg-red-100 tw-text-red-800\">\n <div class=\"tw-w-1.5 tw-h-1.5 tw-bg-red-500 tw-rounded-full tw-mr-1\"></div>\n Inactive\n </div>\n }\n </div>\n </div>\n </div>\n \n <!-- Children Entities (Recursive) -->\n @if (node.children && node.children.length > 0) {\n <!-- Flexible Connection Lines -->\n <div class=\"tw-relative tw-flex tw-flex-col tw-items-center tw-mt-4\">\n <!-- Connection dot -->\n <div class=\"tw-absolute tw-left-1/2 tw-transform tw--translate-x-1/2\" style=\"top: -8px;\">\n <div class=\"tw-w-2 tw-h-2 tw-bg-purple-600 tw-rounded-full tw-border tw-border-white\"></div>\n </div>\n \n <!-- Flexible SVG Lines -->\n <div class=\"tw-relative tw-w-full tw-flex tw-justify-center flexible-connection-lines\">\n @if (node.children && node.children.length === 1) {\n <!-- Single child - simple vertical line -->\n <svg class=\"tw-absolute tw-left-1/2\" style=\"transform: translateX(-50%); width: 2px; height: 40px; top: 0;\">\n <line x1=\"1\" y1=\"0\" x2=\"1\" y2=\"40\" stroke=\"#9333ea\" stroke-width=\"2\" stroke-linecap=\"round\"/>\n </svg>\n }\n @else if (node.children && node.children.length > 1) {\n <!-- Multiple children - flexible design -->\n <svg class=\"tw-absolute tw-left-1/2\" style=\"transform: translateX(-50%); width: 100%; height: 40px; top: 0;\">\n <!-- Vertical line from parent -->\n <line x1=\"50%\" y1=\"0\" x2=\"50%\" y2=\"15\" stroke=\"#9333ea\" stroke-width=\"2\" stroke-linecap=\"round\"/>\n \n <!-- Horizontal line spanning children -->\n <line x1=\"20%\" y1=\"15\" x2=\"80%\" y2=\"15\" stroke=\"#9333ea\" stroke-width=\"2\" stroke-linecap=\"round\"/>\n \n <!-- Vertical lines to children -->\n @for (child of node.children; track child._id; let i = $index) {\n <line [attr.x1]=\"(20 + (60 * i) / (node.children.length - 1)) + '%'\" \n y1=\"15\" \n [attr.x2]=\"(20 + (60 * i) / (node.children.length - 1)) + '%'\" \n y2=\"35\" \n stroke=\"#9333ea\" \n stroke-width=\"2\" \n stroke-linecap=\"round\"/>\n <!-- Connection dot -->\n <circle [attr.cx]=\"(20 + (60 * i) / (node.children.length - 1)) + '%'\" cy=\"35\" r=\"2.5\" fill=\"#9333ea\" stroke=\"#fff\" stroke-width=\"1\"/>\n }\n </svg>\n }\n </div>\n \n <!-- Children Container - Flexible Layout -->\n <div class=\"tw-flex tw-flex-wrap tw-justify-center tw-gap-4 tw-w-full tw-max-w-6xl tw-px-4 children-container\">\n @for (child of node.children; track child._id) {\n <div class=\"tw-flex tw-flex-col tw-items-center tw-flex-shrink-0\">\n <!-- Child node -->\n <ng-container [ngTemplateOutlet]=\"entityNodeTemplate\" [ngTemplateOutletContext]=\"{ $implicit: child, level: level + 1 }\"></ng-container>\n </div>\n }\n </div>\n </div>\n }\n </div>\n</ng-template>\n", styles: [".org-chart-container{overflow-x:auto;overflow-y:visible;min-height:100vh}.org-chart-content{min-width:max-content;padding:2rem 1rem}.flexible-connection-lines{position:relative;width:100%;height:40px}.flexible-connection-lines svg{position:absolute;left:50%;transform:translate(-50%);width:100%;height:100%;top:0}.children-container{display:flex;flex-wrap:wrap;justify-content:center;gap:1rem;width:100%;max-width:80rem;padding:0 1rem}.children-container>div{flex-shrink:0;display:flex;flex-direction:column;align-items:center}.entity-card{width:16rem;max-width:18rem;transition:all .2s ease-in-out}.entity-card:hover{transform:translateY(-2px) scale(1.02);box-shadow:0 20px 25px -5px #0000001a,0 10px 10px -5px #0000000a}@media (max-width: 1400px){.children-container{max-width:70rem;gap:.875rem}.entity-card{width:15rem;max-width:17rem}}@media (max-width: 1200px){.children-container{max-width:60rem;gap:.75rem}.entity-card{width:14rem;max-width:16rem}}@media (max-width: 992px){.children-container{max-width:50rem;gap:.625rem}.entity-card{width:13rem;max-width:15rem}}@media (max-width: 768px){.children-container{max-width:40rem;gap:.5rem}.entity-card{width:12rem;max-width:14rem}.org-chart-content{padding:1.5rem .75rem}}@media (max-width: 576px){.children-container{max-width:30rem;gap:.375rem}.entity-card{width:11rem;max-width:13rem}.org-chart-content{padding:1rem .5rem}}.tw-overflow-y-auto::-webkit-scrollbar{width:6px}.tw-overflow-y-auto::-webkit-scrollbar-track{background:#f1f5f9;border-radius:3px}.tw-overflow-y-auto::-webkit-scrollbar-thumb{background:#cbd5e1;border-radius:3px}.tw-overflow-y-auto::-webkit-scrollbar-thumb:hover{background:#94a3b8}.tw-transition-shadow{transition:box-shadow .2s ease-in-out}.tw-shadow-lg:hover{box-shadow:0 20px 25px -5px #0000001a,0 10px 10px -5px #0000000a;transform:translateY(-2px);transition:all .2s ease-in-out}.tw-bg-purple-300,.tw-bg-purple-400{transition:all .3s ease-in-out}.connection-line-compact{display:block;overflow:visible}.connection-line-compact path,.connection-line-compact line{stroke-linecap:round;stroke-linejoin:round;transition:stroke-width .2s ease}.connection-line-compact:hover path,.connection-line-compact:hover line{stroke-width:3}.connection-line-compact circle{transition:all .2s ease}.connection-line-compact circle:hover{filter:drop-shadow(0 2px 4px rgba(147,51,234,.4))}.level-0{border-color:#fb923c!important}.level-1{border-color:#60a5fa!important}.level-2{border-color:#a78bfa!important}.level-3{border-color:#4ade80!important}.level-4{border-color:#818cf8!important}.level-5{border-color:#f472b6!important}@media (max-width: 1200px){.tw-max-w-7xl{max-width:100%}.tw-gap-6{gap:1rem}.tw-min-w-64{min-width:14rem}.tw-max-w-72{max-width:16rem}}@media (max-width: 768px){.tw-min-w-64{min-width:12rem}.tw-max-w-72{max-width:14rem}.tw-max-w-7xl{max-width:100%}.tw-gap-6{gap:.75rem}.tw-p-4{padding:.75rem}.tw-mb-4{margin-bottom:.75rem}.tw-space-x-3{gap:.5rem}.tw-space-x-2{gap:.375rem}.tw-w-12{width:2.5rem}.tw-h-12{height:2.5rem}}@media (max-width: 480px){.tw-min-w-72{min-width:12rem}.tw-max-w-80{max-width:14rem}.tw-p-4{padding:.5rem}.tw-space-x-3{gap:.375rem}.tw-space-x-2{gap:.25rem}.tw-mb-3{margin-bottom:.5rem}.tw-w-12{width:2rem}.tw-h-12{height:2rem}.tw-w-8{width:1.5rem}.tw-h-8{height:1.5rem}}@media print{.tw-bg-gray-50{background:#fff!important}.tw-shadow-lg{box-shadow:none!important;border:1px solid #e5e7eb!important}.tw-bg-purple-300{background:#6b7280!important}.tw-border-purple-300{border-color:#6b7280!important}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { 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: CideIconComponent, selector: "cide-ele-icon", inputs: ["size", "type", "toolTip"] }, { kind: "component", type: CideSpinnerComponent, selector: "cide-ele-spinner", inputs: ["size", "type"] }] });
421
723
  }
422
724
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: CideSharedOrgStructureComponent, decorators: [{
423
725
  type: Component,
@@ -426,7 +728,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImpor
426
728
  CideEleButtonComponent,
427
729
  CideIconComponent,
428
730
  CideSpinnerComponent
429
- ], template: "<!-- Organization Structure Component -->\n<div class=\"tw-flex-1 tw-overflow-hidden\">\n @if (loading()) {\n <div class=\"tw-flex tw-items-center tw-justify-center tw-py-12\">\n <cide-ele-spinner size=\"md\"></cide-ele-spinner>\n <span class=\"tw-ml-3 tw-text-gray-600 tw-text-sm\">Loading organization structure...</span>\n </div>\n } @else if (error()) {\n <div class=\"tw-text-center tw-py-12\">\n <div class=\"tw-w-16 tw-h-16 tw-bg-red-100 tw-rounded-full tw-flex tw-items-center tw-justify-center tw-mx-auto tw-mb-4\">\n <cide-ele-icon class=\"tw-w-8 tw-h-8 tw-text-red-500\">error</cide-ele-icon>\n </div>\n <h3 class=\"tw-text-lg tw-font-medium tw-text-gray-900 tw-mb-2\">Error Loading Structure</h3>\n <p class=\"tw-text-gray-600 tw-mb-4\">{{ error() }}</p>\n <button cideEleButton variant=\"primary\" size=\"sm\" (click)=\"loadOrgStructure()\">\n <cide-ele-icon>refresh</cide-ele-icon>\n Try Again\n </button>\n </div>\n } @else if (orgStructure().length === 0) {\n <div class=\"tw-text-center tw-py-12\">\n <div class=\"tw-w-16 tw-h-16 tw-bg-gray-100 tw-rounded-full tw-flex tw-items-center tw-justify-center tw-mx-auto tw-mb-4\">\n <cide-ele-icon class=\"tw-w-8 tw-h-8 tw-text-gray-400\">account_tree</cide-ele-icon>\n </div>\n <h3 class=\"tw-text-lg tw-font-medium tw-text-gray-900 tw-mb-2\">No Entities Found</h3>\n <p class=\"tw-text-gray-600 tw-mb-4\">No entities are available to display in the organization structure.</p>\n @if (mode() === 'view') {\n <button cideEleButton variant=\"primary\" size=\"sm\" (click)=\"router.navigate(['/control-panel/entity-list'])\">\n <cide-ele-icon>add</cide-ele-icon>\n Create First Entity\n </button>\n }\n </div>\n } @else {\n <!-- Organization Chart Container -->\n <div class=\"tw-relative tw-min-h-screen tw-bg-gray-50 tw-py-8\">\n <!-- Background Grid Pattern -->\n <div class=\"tw-absolute tw-inset-0 tw-opacity-30\" style=\"background-image: radial-gradient(circle, #e5e7eb 1px, transparent 1px); background-size: 20px 20px;\"></div>\n \n <!-- Chart Content -->\n <div class=\"tw-relative tw-z-10\">\n @for (rootNode of orgStructure(); track rootNode._id) {\n <div class=\"tw-flex tw-flex-col tw-items-center tw-mb-12\">\n <!-- Render node recursively with unlimited depth -->\n <ng-container [ngTemplateOutlet]=\"entityNodeTemplate\" [ngTemplateOutletContext]=\"{ $implicit: rootNode, level: 0 }\"></ng-container>\n </div>\n }\n </div>\n </div>\n }\n</div>\n\n<!-- Entity Node Template (Recursive) -->\n<ng-template #entityNodeTemplate let-node let-level=\"level\">\n <div class=\"tw-flex tw-flex-col tw-items-center\">\n \n <!-- Entity Card -->\n <div class=\"tw-bg-white tw-shadow-lg tw-rounded-lg tw-p-4 tw-min-w-64 tw-max-w-72 tw-border-t-4 tw-transition-shadow tw-cursor-pointer hover:tw-shadow-xl\"\n [class.level-0]=\"level === 0\"\n [class.level-1]=\"level === 1\"\n [class.level-2]=\"level === 2\"\n [class.level-3]=\"level === 3\"\n [class.level-4]=\"level === 4\"\n [class.level-5]=\"level === 5\"\n (click)=\"viewEntity(node._id)\">\n \n <!-- Card Content -->\n <div class=\"tw-flex tw-items-center tw-space-x-3\">\n <!-- Avatar -->\n <div class=\"tw-w-12 tw-h-12 tw-bg-purple-100 tw-rounded-full tw-flex tw-items-center tw-justify-center tw-flex-shrink-0\">\n <cide-ele-icon class=\"tw-w-6 tw-h-6 tw-text-purple-600\">person</cide-ele-icon>\n </div>\n \n <!-- Entity Info -->\n <div class=\"tw-flex-1 tw-min-w-0\">\n <h3 class=\"tw-text-sm tw-font-semibold tw-text-gray-900 tw-whitespace-nowrap tw-overflow-hidden tw-text-ellipsis\">{{ node.syen_name }}</h3>\n <p class=\"tw-text-xs tw-text-gray-600 tw-mt-1\">{{ node.syen_entity_code }}</p>\n <p class=\"tw-text-xs tw-text-gray-500 tw-mt-1\">{{ node.syen_entity_type_sygms }}</p>\n </div>\n </div>\n \n <!-- Action Icons -->\n <div class=\"tw-flex tw-items-center tw-justify-between tw-mt-3\">\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\n <!-- Phone Icon -->\n <button class=\"tw-w-6 tw-h-6 tw-rounded-full tw-bg-gray-100 tw-flex tw-items-center tw-justify-center tw-text-gray-600 hover:tw-bg-gray-200 tw-transition-colors\">\n <cide-ele-icon class=\"tw-text-xs\">phone</cide-ele-icon>\n </button>\n \n <!-- Email Icon -->\n <button class=\"tw-w-6 tw-h-6 tw-rounded-full tw-bg-gray-100 tw-flex tw-items-center tw-justify-center tw-text-gray-600 hover:tw-bg-gray-200 tw-transition-colors\">\n <cide-ele-icon class=\"tw-text-xs\">email</cide-ele-icon>\n </button>\n \n <!-- LinkedIn Icon -->\n <button class=\"tw-w-6 tw-h-6 tw-rounded-full tw-bg-blue-100 tw-flex tw-items-center tw-justify-center tw-text-blue-600 hover:tw-bg-blue-200 tw-transition-colors\">\n <cide-ele-icon class=\"tw-text-xs\">attach_money</cide-ele-icon>\n </button>\n \n <!-- Document Icon -->\n <button class=\"tw-w-6 tw-h-6 tw-rounded-full tw-bg-gray-100 tw-flex tw-items-center tw-justify-center tw-text-gray-600 hover:tw-bg-gray-200 tw-transition-colors\">\n <cide-ele-icon class=\"tw-text-xs\">description</cide-ele-icon>\n </button>\n \n <!-- More Options Icon -->\n <button class=\"tw-w-6 tw-h-6 tw-rounded-full tw-bg-gray-100 tw-flex tw-items-center tw-justify-center tw-text-gray-600 hover:tw-bg-gray-200 tw-transition-colors\">\n <cide-ele-icon class=\"tw-text-xs\">more_horiz</cide-ele-icon>\n </button>\n </div>\n \n <!-- Status Badge -->\n <div class=\"tw-flex-shrink-0\">\n @if (node.syen_isactive) {\n <div class=\"tw-inline-flex tw-items-center tw-px-1.5 tw-py-0.5 tw-rounded-full tw-text-xs tw-font-medium tw-bg-green-100 tw-text-green-800\">\n <div class=\"tw-w-1.5 tw-h-1.5 tw-bg-green-500 tw-rounded-full tw-mr-1\"></div>\n Active\n </div>\n } @else {\n <div class=\"tw-inline-flex tw-items-center tw-px-1.5 tw-py-0.5 tw-rounded-full tw-text-xs tw-font-medium tw-bg-red-100 tw-text-red-800\">\n <div class=\"tw-w-1.5 tw-h-1.5 tw-bg-red-500 tw-rounded-full tw-mr-1\"></div>\n Inactive\n </div>\n }\n </div>\n </div>\n </div>\n \n <!-- Children Entities (Recursive) -->\n @if (node.children && node.children.length > 0) {\n <!-- Ultra-Compact Connection Lines -->\n <div class=\"tw-relative tw-flex tw-flex-col tw-items-center tw-mt-2\">\n <!-- Minimal connection dot -->\n <div class=\"tw-absolute tw-left-1/2 tw-transform tw--translate-x-1/2\" style=\"top: -8px;\">\n <div class=\"tw-w-2 tw-h-2 tw-bg-purple-600 tw-rounded-full tw-border tw-border-white\"></div>\n </div>\n \n <!-- Ultra-Compact SVG Lines -->\n <div class=\"tw-relative tw-w-full\" style=\"height: 30px;\">\n @if (node.children && node.children.length === 1) {\n <!-- Single child - minimal line -->\n <svg class=\"tw-absolute tw-left-1/2 connection-line-compact\" style=\"transform: translateX(-50%); width: 2px; height: 30px; top: 0;\">\n <line x1=\"1\" y1=\"0\" x2=\"1\" y2=\"30\" stroke=\"#9333ea\" stroke-width=\"2\" stroke-linecap=\"round\"/>\n </svg>\n }\n @else if (node.children && node.children.length > 1) {\n <!-- Multiple children - minimal design -->\n <svg class=\"tw-absolute tw-left-1/2 connection-line-compact\" [attr.style]=\"'transform: translateX(-50%); width: ' + ((node.children.length - 1) * 336 + 256) + 'px; height: 30px; top: 0;'\">\n <!-- Vertical line -->\n <line [attr.x1]=\"((node.children.length - 1) * 336 + 256) / 2\" \n y1=\"0\" \n [attr.x2]=\"((node.children.length - 1) * 336 + 256) / 2\" \n y2=\"12\" \n stroke=\"#9333ea\" \n stroke-width=\"2\" \n stroke-linecap=\"round\"/>\n \n <!-- Horizontal line -->\n <path [attr.d]=\"'M 128 15 L ' + ((node.children.length - 1) * 336 + 128) + ' 15'\" \n stroke=\"#9333ea\" \n stroke-width=\"2\" \n stroke-linecap=\"round\"/>\n \n <!-- Vertical lines to children -->\n @for (child of node.children; track child._id; let i = $index) {\n <line [attr.x1]=\"(i * 336) + 128\" \n y1=\"15\" \n [attr.x2]=\"(i * 336) + 128\" \n y2=\"28\" \n stroke=\"#9333ea\" \n stroke-width=\"2\" \n stroke-linecap=\"round\"/>\n <!-- Tiny dot -->\n <circle [attr.cx]=\"(i * 336) + 128\" cy=\"28\" r=\"2.5\" fill=\"#9333ea\" stroke=\"#fff\" stroke-width=\"1\"/>\n }\n </svg>\n }\n </div>\n \n <!-- Children -->\n <div class=\"tw-flex tw-justify-center tw-gap-20\">\n @for (child of node.children; track child._id) {\n <div class=\"tw-flex tw-flex-col tw-items-center\">\n <!-- Child node -->\n <ng-container [ngTemplateOutlet]=\"entityNodeTemplate\" [ngTemplateOutletContext]=\"{ $implicit: child, level: level + 1 }\"></ng-container>\n </div>\n }\n </div>\n </div>\n }\n </div>\n</ng-template>\n", styles: [":host{height:100%;display:flex;flex-direction:column}.tw-overflow-y-auto::-webkit-scrollbar{width:6px}.tw-overflow-y-auto::-webkit-scrollbar-track{background:#f1f5f9;border-radius:3px}.tw-overflow-y-auto::-webkit-scrollbar-thumb{background:#cbd5e1;border-radius:3px}.tw-overflow-y-auto::-webkit-scrollbar-thumb:hover{background:#94a3b8}.tw-transition-shadow{transition:box-shadow .2s ease-in-out}.tw-shadow-lg:hover{box-shadow:0 20px 25px -5px #0000001a,0 10px 10px -5px #0000000a;transform:translateY(-2px);transition:all .2s ease-in-out}.tw-bg-purple-300,.tw-bg-purple-400{transition:all .3s ease-in-out}.connection-line-compact{display:block;overflow:visible}.connection-line-compact path,.connection-line-compact line{stroke-linecap:round;stroke-linejoin:round;transition:stroke-width .2s ease}.connection-line-compact:hover path,.connection-line-compact:hover line{stroke-width:3}.connection-line-compact circle{transition:all .2s ease}.connection-line-compact circle:hover{filter:drop-shadow(0 2px 4px rgba(147,51,234,.4))}.level-0{border-color:#fb923c!important}.level-1{border-color:#60a5fa!important}.level-2{border-color:#a78bfa!important}.level-3{border-color:#4ade80!important}.level-4{border-color:#818cf8!important}.level-5{border-color:#f472b6!important}@media (max-width: 1200px){.tw-max-w-7xl{max-width:100%}.tw-gap-6{gap:1rem}.tw-min-w-64{min-width:14rem}.tw-max-w-72{max-width:16rem}}@media (max-width: 768px){.tw-min-w-64{min-width:12rem}.tw-max-w-72{max-width:14rem}.tw-max-w-7xl{max-width:100%}.tw-gap-6{gap:.75rem}.tw-p-4{padding:.75rem}.tw-mb-4{margin-bottom:.75rem}.tw-space-x-3{gap:.5rem}.tw-space-x-2{gap:.375rem}.tw-w-12{width:2.5rem}.tw-h-12{height:2.5rem}}@media (max-width: 480px){.tw-min-w-72{min-width:12rem}.tw-max-w-80{max-width:14rem}.tw-p-4{padding:.5rem}.tw-space-x-3{gap:.375rem}.tw-space-x-2{gap:.25rem}.tw-mb-3{margin-bottom:.5rem}.tw-w-12{width:2rem}.tw-h-12{height:2rem}.tw-w-8{width:1.5rem}.tw-h-8{height:1.5rem}}@media print{.tw-bg-gray-50{background:#fff!important}.tw-shadow-lg{box-shadow:none!important;border:1px solid #e5e7eb!important}.tw-bg-purple-300{background:#6b7280!important}.tw-border-purple-300{border-color:#6b7280!important}}\n"] }]
731
+ ], template: "<!-- Organization Structure Component -->\n<div class=\"tw-flex-1 tw-overflow-hidden\">\n @if (loading()) {\n <div class=\"tw-flex tw-items-center tw-justify-center tw-py-12\">\n <cide-ele-spinner size=\"md\"></cide-ele-spinner>\n <span class=\"tw-ml-3 tw-text-gray-600 tw-text-sm\">Loading organization structure...</span>\n </div>\n } @else if (error()) {\n <div class=\"tw-text-center tw-py-12\">\n <div class=\"tw-w-16 tw-h-16 tw-bg-red-100 tw-rounded-full tw-flex tw-items-center tw-justify-center tw-mx-auto tw-mb-4\">\n <cide-ele-icon class=\"tw-w-8 tw-h-8 tw-text-red-500\">error</cide-ele-icon>\n </div>\n <h3 class=\"tw-text-lg tw-font-medium tw-text-gray-900 tw-mb-2\">Error Loading Structure</h3>\n <p class=\"tw-text-gray-600 tw-mb-4\">{{ error() }}</p>\n <button cideEleButton variant=\"primary\" size=\"sm\" (click)=\"loadOrgStructure()\">\n <cide-ele-icon>refresh</cide-ele-icon>\n Try Again\n </button>\n </div>\n } @else if (orgStructure().length === 0) {\n <div class=\"tw-text-center tw-py-12\">\n <div class=\"tw-w-16 tw-h-16 tw-bg-gray-100 tw-rounded-full tw-flex tw-items-center tw-justify-center tw-mx-auto tw-mb-4\">\n <cide-ele-icon class=\"tw-w-8 tw-h-8 tw-text-gray-400\">account_tree</cide-ele-icon>\n </div>\n <h3 class=\"tw-text-lg tw-font-medium tw-text-gray-900 tw-mb-2\">No Entities Found</h3>\n <p class=\"tw-text-gray-600 tw-mb-4\">No entities are available to display in the organization structure.</p>\n @if (mode() === 'view') {\n <button cideEleButton variant=\"primary\" size=\"sm\" (click)=\"router.navigate(['/control-panel/entity-list'])\">\n <cide-ele-icon>add</cide-ele-icon>\n Create First Entity\n </button>\n }\n </div>\n } @else {\n <!-- Organization Chart Container -->\n <div class=\"tw-relative tw-min-h-screen tw-bg-gray-50 tw-py-8 tw-overflow-x-auto org-chart-container\">\n <!-- Background Grid Pattern -->\n <div class=\"tw-absolute tw-inset-0 tw-opacity-30\" style=\"background-image: radial-gradient(circle, #e5e7eb 1px, transparent 1px); background-size: 20px 20px;\"></div>\n \n <!-- Chart Content -->\n <div class=\"tw-relative tw-z-10 tw-min-w-max tw-px-4 org-chart-content\">\n @for (rootNode of orgStructure(); track rootNode._id) {\n <div class=\"tw-flex tw-flex-col tw-items-center tw-mb-12\">\n <!-- Render node recursively with unlimited depth -->\n <ng-container [ngTemplateOutlet]=\"entityNodeTemplate\" [ngTemplateOutletContext]=\"{ $implicit: rootNode, level: 0 }\"></ng-container>\n </div>\n }\n </div>\n </div>\n }\n</div>\n\n<!-- Entity Node Template (Recursive) -->\n<ng-template #entityNodeTemplate let-node let-level=\"level\">\n <div class=\"tw-flex tw-flex-col tw-items-center\">\n \n <!-- Entity Card -->\n <div class=\"tw-bg-white tw-shadow-lg tw-rounded-lg tw-p-4 tw-w-64 tw-max-w-72 tw-border-t-4 tw-transition-all tw-cursor-pointer hover:tw-shadow-xl hover:tw-scale-105 entity-card\"\n [class.level-0]=\"level === 0\"\n [class.level-1]=\"level === 1\"\n [class.level-2]=\"level === 2\"\n [class.level-3]=\"level === 3\"\n [class.level-4]=\"level === 4\"\n [class.level-5]=\"level === 5\"\n (click)=\"viewEntity(node._id)\">\n \n <!-- Card Content -->\n <div class=\"tw-flex tw-items-center tw-space-x-3\">\n <!-- Avatar -->\n <div class=\"tw-w-12 tw-h-12 tw-bg-purple-100 tw-rounded-full tw-flex tw-items-center tw-justify-center tw-flex-shrink-0\">\n <cide-ele-icon class=\"tw-w-6 tw-h-6 tw-text-purple-600\">person</cide-ele-icon>\n </div>\n \n <!-- Entity Info -->\n <div class=\"tw-flex-1 tw-min-w-0\">\n <h3 class=\"tw-text-sm tw-font-semibold tw-text-gray-900 tw-whitespace-nowrap tw-overflow-hidden tw-text-ellipsis\">{{ node.syen_name }}</h3>\n <p class=\"tw-text-xs tw-text-gray-600 tw-mt-1\">{{ node.syen_entity_code }}</p>\n <p class=\"tw-text-xs tw-text-gray-500 tw-mt-1\">{{ node.syen_entity_type_sygms }}</p>\n </div>\n </div>\n \n <!-- Action Icons -->\n <div class=\"tw-flex tw-items-center tw-justify-between tw-mt-3\">\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\n <!-- Phone Icon -->\n <button class=\"tw-w-6 tw-h-6 tw-rounded-full tw-bg-gray-100 tw-flex tw-items-center tw-justify-center tw-text-gray-600 hover:tw-bg-gray-200 tw-transition-colors\">\n <cide-ele-icon class=\"tw-text-xs\">phone</cide-ele-icon>\n </button>\n \n <!-- Email Icon -->\n <button class=\"tw-w-6 tw-h-6 tw-rounded-full tw-bg-gray-100 tw-flex tw-items-center tw-justify-center tw-text-gray-600 hover:tw-bg-gray-200 tw-transition-colors\">\n <cide-ele-icon class=\"tw-text-xs\">email</cide-ele-icon>\n </button>\n \n <!-- LinkedIn Icon -->\n <button class=\"tw-w-6 tw-h-6 tw-rounded-full tw-bg-blue-100 tw-flex tw-items-center tw-justify-center tw-text-blue-600 hover:tw-bg-blue-200 tw-transition-colors\">\n <cide-ele-icon class=\"tw-text-xs\">attach_money</cide-ele-icon>\n </button>\n \n <!-- Document Icon -->\n <button class=\"tw-w-6 tw-h-6 tw-rounded-full tw-bg-gray-100 tw-flex tw-items-center tw-justify-center tw-text-gray-600 hover:tw-bg-gray-200 tw-transition-colors\">\n <cide-ele-icon class=\"tw-text-xs\">description</cide-ele-icon>\n </button>\n \n <!-- More Options Icon -->\n <button class=\"tw-w-6 tw-h-6 tw-rounded-full tw-bg-gray-100 tw-flex tw-items-center tw-justify-center tw-text-gray-600 hover:tw-bg-gray-200 tw-transition-colors\">\n <cide-ele-icon class=\"tw-text-xs\">more_horiz</cide-ele-icon>\n </button>\n </div>\n \n <!-- Status Badge -->\n <div class=\"tw-flex-shrink-0\">\n @if (node.syen_isactive) {\n <div class=\"tw-inline-flex tw-items-center tw-px-1.5 tw-py-0.5 tw-rounded-full tw-text-xs tw-font-medium tw-bg-green-100 tw-text-green-800\">\n <div class=\"tw-w-1.5 tw-h-1.5 tw-bg-green-500 tw-rounded-full tw-mr-1\"></div>\n Active\n </div>\n } @else {\n <div class=\"tw-inline-flex tw-items-center tw-px-1.5 tw-py-0.5 tw-rounded-full tw-text-xs tw-font-medium tw-bg-red-100 tw-text-red-800\">\n <div class=\"tw-w-1.5 tw-h-1.5 tw-bg-red-500 tw-rounded-full tw-mr-1\"></div>\n Inactive\n </div>\n }\n </div>\n </div>\n </div>\n \n <!-- Children Entities (Recursive) -->\n @if (node.children && node.children.length > 0) {\n <!-- Flexible Connection Lines -->\n <div class=\"tw-relative tw-flex tw-flex-col tw-items-center tw-mt-4\">\n <!-- Connection dot -->\n <div class=\"tw-absolute tw-left-1/2 tw-transform tw--translate-x-1/2\" style=\"top: -8px;\">\n <div class=\"tw-w-2 tw-h-2 tw-bg-purple-600 tw-rounded-full tw-border tw-border-white\"></div>\n </div>\n \n <!-- Flexible SVG Lines -->\n <div class=\"tw-relative tw-w-full tw-flex tw-justify-center flexible-connection-lines\">\n @if (node.children && node.children.length === 1) {\n <!-- Single child - simple vertical line -->\n <svg class=\"tw-absolute tw-left-1/2\" style=\"transform: translateX(-50%); width: 2px; height: 40px; top: 0;\">\n <line x1=\"1\" y1=\"0\" x2=\"1\" y2=\"40\" stroke=\"#9333ea\" stroke-width=\"2\" stroke-linecap=\"round\"/>\n </svg>\n }\n @else if (node.children && node.children.length > 1) {\n <!-- Multiple children - flexible design -->\n <svg class=\"tw-absolute tw-left-1/2\" style=\"transform: translateX(-50%); width: 100%; height: 40px; top: 0;\">\n <!-- Vertical line from parent -->\n <line x1=\"50%\" y1=\"0\" x2=\"50%\" y2=\"15\" stroke=\"#9333ea\" stroke-width=\"2\" stroke-linecap=\"round\"/>\n \n <!-- Horizontal line spanning children -->\n <line x1=\"20%\" y1=\"15\" x2=\"80%\" y2=\"15\" stroke=\"#9333ea\" stroke-width=\"2\" stroke-linecap=\"round\"/>\n \n <!-- Vertical lines to children -->\n @for (child of node.children; track child._id; let i = $index) {\n <line [attr.x1]=\"(20 + (60 * i) / (node.children.length - 1)) + '%'\" \n y1=\"15\" \n [attr.x2]=\"(20 + (60 * i) / (node.children.length - 1)) + '%'\" \n y2=\"35\" \n stroke=\"#9333ea\" \n stroke-width=\"2\" \n stroke-linecap=\"round\"/>\n <!-- Connection dot -->\n <circle [attr.cx]=\"(20 + (60 * i) / (node.children.length - 1)) + '%'\" cy=\"35\" r=\"2.5\" fill=\"#9333ea\" stroke=\"#fff\" stroke-width=\"1\"/>\n }\n </svg>\n }\n </div>\n \n <!-- Children Container - Flexible Layout -->\n <div class=\"tw-flex tw-flex-wrap tw-justify-center tw-gap-4 tw-w-full tw-max-w-6xl tw-px-4 children-container\">\n @for (child of node.children; track child._id) {\n <div class=\"tw-flex tw-flex-col tw-items-center tw-flex-shrink-0\">\n <!-- Child node -->\n <ng-container [ngTemplateOutlet]=\"entityNodeTemplate\" [ngTemplateOutletContext]=\"{ $implicit: child, level: level + 1 }\"></ng-container>\n </div>\n }\n </div>\n </div>\n }\n </div>\n</ng-template>\n", styles: [".org-chart-container{overflow-x:auto;overflow-y:visible;min-height:100vh}.org-chart-content{min-width:max-content;padding:2rem 1rem}.flexible-connection-lines{position:relative;width:100%;height:40px}.flexible-connection-lines svg{position:absolute;left:50%;transform:translate(-50%);width:100%;height:100%;top:0}.children-container{display:flex;flex-wrap:wrap;justify-content:center;gap:1rem;width:100%;max-width:80rem;padding:0 1rem}.children-container>div{flex-shrink:0;display:flex;flex-direction:column;align-items:center}.entity-card{width:16rem;max-width:18rem;transition:all .2s ease-in-out}.entity-card:hover{transform:translateY(-2px) scale(1.02);box-shadow:0 20px 25px -5px #0000001a,0 10px 10px -5px #0000000a}@media (max-width: 1400px){.children-container{max-width:70rem;gap:.875rem}.entity-card{width:15rem;max-width:17rem}}@media (max-width: 1200px){.children-container{max-width:60rem;gap:.75rem}.entity-card{width:14rem;max-width:16rem}}@media (max-width: 992px){.children-container{max-width:50rem;gap:.625rem}.entity-card{width:13rem;max-width:15rem}}@media (max-width: 768px){.children-container{max-width:40rem;gap:.5rem}.entity-card{width:12rem;max-width:14rem}.org-chart-content{padding:1.5rem .75rem}}@media (max-width: 576px){.children-container{max-width:30rem;gap:.375rem}.entity-card{width:11rem;max-width:13rem}.org-chart-content{padding:1rem .5rem}}.tw-overflow-y-auto::-webkit-scrollbar{width:6px}.tw-overflow-y-auto::-webkit-scrollbar-track{background:#f1f5f9;border-radius:3px}.tw-overflow-y-auto::-webkit-scrollbar-thumb{background:#cbd5e1;border-radius:3px}.tw-overflow-y-auto::-webkit-scrollbar-thumb:hover{background:#94a3b8}.tw-transition-shadow{transition:box-shadow .2s ease-in-out}.tw-shadow-lg:hover{box-shadow:0 20px 25px -5px #0000001a,0 10px 10px -5px #0000000a;transform:translateY(-2px);transition:all .2s ease-in-out}.tw-bg-purple-300,.tw-bg-purple-400{transition:all .3s ease-in-out}.connection-line-compact{display:block;overflow:visible}.connection-line-compact path,.connection-line-compact line{stroke-linecap:round;stroke-linejoin:round;transition:stroke-width .2s ease}.connection-line-compact:hover path,.connection-line-compact:hover line{stroke-width:3}.connection-line-compact circle{transition:all .2s ease}.connection-line-compact circle:hover{filter:drop-shadow(0 2px 4px rgba(147,51,234,.4))}.level-0{border-color:#fb923c!important}.level-1{border-color:#60a5fa!important}.level-2{border-color:#a78bfa!important}.level-3{border-color:#4ade80!important}.level-4{border-color:#818cf8!important}.level-5{border-color:#f472b6!important}@media (max-width: 1200px){.tw-max-w-7xl{max-width:100%}.tw-gap-6{gap:1rem}.tw-min-w-64{min-width:14rem}.tw-max-w-72{max-width:16rem}}@media (max-width: 768px){.tw-min-w-64{min-width:12rem}.tw-max-w-72{max-width:14rem}.tw-max-w-7xl{max-width:100%}.tw-gap-6{gap:.75rem}.tw-p-4{padding:.75rem}.tw-mb-4{margin-bottom:.75rem}.tw-space-x-3{gap:.5rem}.tw-space-x-2{gap:.375rem}.tw-w-12{width:2.5rem}.tw-h-12{height:2.5rem}}@media (max-width: 480px){.tw-min-w-72{min-width:12rem}.tw-max-w-80{max-width:14rem}.tw-p-4{padding:.5rem}.tw-space-x-3{gap:.375rem}.tw-space-x-2{gap:.25rem}.tw-mb-3{margin-bottom:.5rem}.tw-w-12{width:2rem}.tw-h-12{height:2rem}.tw-w-8{width:1.5rem}.tw-h-8{height:1.5rem}}@media print{.tw-bg-gray-50{background:#fff!important}.tw-shadow-lg{box-shadow:none!important;border:1px solid #e5e7eb!important}.tw-bg-purple-300{background:#6b7280!important}.tw-border-purple-300{border-color:#6b7280!important}}\n"] }]
430
732
  }] });
431
733
 
432
734
  /*
@@ -437,5 +739,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImpor
437
739
  * Generated bundle index. Do not edit.
438
740
  */
439
741
 
440
- export { APP_STATE_SERVICE_TOKEN, AUTH_SERVICE_TOKEN, CideSharedOrgStructureComponent, CloudIdeShared, ENTITY_SERVICE_TOKEN, SharedObjectIdService, authGuard };
742
+ export { APP_STATE_SERVICE_TOKEN, AUTH_SERVICE_TOKEN, CideCoreGeneralMasterService, CideCoreGeneralMasterTypeService, CideSharedOrgStructureComponent, CloudIdeShared, ENTITY_SERVICE_TOKEN, SharedObjectIdService, authGuard };
441
743
  //# sourceMappingURL=cloud-ide-shared.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"cloud-ide-shared.mjs","sources":["../../../projects/cloud-ide-shared/src/lib/cloud-ide-shared.ts","../../../projects/cloud-ide-shared/src/lib/services/auth.service.interface.ts","../../../projects/cloud-ide-shared/src/lib/guards/auth.guard.ts","../../../projects/cloud-ide-shared/src/lib/services/shared-object-id.service.ts","../../../projects/cloud-ide-shared/src/lib/components/org-structure/org-structure.component.ts","../../../projects/cloud-ide-shared/src/lib/components/org-structure/org-structure.component.html","../../../projects/cloud-ide-shared/src/public-api.ts","../../../projects/cloud-ide-shared/src/cloud-ide-shared.ts"],"sourcesContent":["import { Component } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'lib-cloud-ide-shared',\r\n imports: [],\r\n template: `\r\n <p>\r\n cloud-ide-shared works!\r\n </p>\r\n `,\r\n styles: ``\r\n})\r\nexport class CloudIdeShared {\r\n\r\n}\r\n","import { InjectionToken } from '@angular/core';\n\n// Interface for auth service to avoid circular dependency\nexport interface IAuthService {\n isAuthenticated(): boolean;\n isTokenExpired(): boolean;\n signOut(): void;\n refreshAuthState(): void;\n}\n\n// Interface for app state service to avoid circular dependency\nexport interface IAppStateService {\n isUserAuthenticated(): boolean;\n refreshFromLocalStorage(): void;\n}\n\n// Tokens for dependency injection\nexport const AUTH_SERVICE_TOKEN = new InjectionToken<IAuthService>('AuthService');\nexport const APP_STATE_SERVICE_TOKEN = new InjectionToken<IAppStateService>('AppStateService');\n","import { inject } from '@angular/core';\r\nimport { CanActivateFn, Router } from '@angular/router';\r\nimport { IAuthService, AUTH_SERVICE_TOKEN, IAppStateService, APP_STATE_SERVICE_TOKEN } from '../services/auth.service.interface';\r\n\r\nexport const authGuard: CanActivateFn = (route, state) => {\r\n const authService = inject(AUTH_SERVICE_TOKEN) as IAuthService;\r\n const appState = inject(APP_STATE_SERVICE_TOKEN) as IAppStateService;\r\n const router = inject(Router);\r\n \r\n // Refresh auth state to make sure it's current\r\n authService.refreshAuthState();\r\n \r\n // Refresh app state from localStorage to ensure synchronization\r\n appState.refreshFromLocalStorage();\r\n \r\n // Check if user is authenticated using app state (modern approach)\r\n if (appState.isUserAuthenticated() && !authService.isTokenExpired()) {\r\n return true;\r\n }\r\n \r\n // Redirect to login page with the intended destination\r\n router.navigate(['/auth/sign-in'], { \r\n queryParams: { returnUrl: state.url }\r\n });\r\n \r\n return false;\r\n};\r\n","import { Injectable, inject } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { CideEleFileManagerService } from 'cloud-ide-element';\r\nimport { mongooseObjectIdCreateControllerResponse } from 'cloud-ide-element';\r\n\r\n/**\r\n * Shared Object ID Generation Service\r\n * \r\n * This service provides a consistent interface for generating Object IDs\r\n * across all libraries. It internally uses the FileManagerService but\r\n * provides a standardized API that can be used throughout the application.\r\n * \r\n * Benefits:\r\n * - Consistent interface across all libraries\r\n * - Centralized Object ID generation logic\r\n * - Easy to maintain and update\r\n * - Prevents confusion with different Object ID generation methods\r\n */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class SharedObjectIdService {\r\n private fileManagerService = inject(CideEleFileManagerService);\r\n\r\n /**\r\n * Generate a new Object ID\r\n * \r\n * This method internally uses the FileManagerService to generate\r\n * a unique Object ID that can be used for any entity in the system.\r\n * \r\n * @returns Observable<mongooseObjectIdCreateControllerResponse> - The generated Object ID response\r\n * \r\n * @example\r\n * ```typescript\r\n * // Generate Object ID for a new user\r\n * this.sharedObjectIdService.generateObjectId().subscribe({\r\n * next: (response) => {\r\n * if (response.success && response.data?.objectId) {\r\n * const newUserId = response.data.objectId;\r\n * // Use the Object ID for creating a new user\r\n * }\r\n * },\r\n * error: (error) => {\r\n * console.error('Failed to generate Object ID:', error);\r\n * }\r\n * });\r\n * ```\r\n */\r\n generateObjectId(): Observable<mongooseObjectIdCreateControllerResponse> {\r\n console.log('🆔 [SharedObjectIdService] Generating Object ID via FileManagerService');\r\n \r\n return this.fileManagerService.generateObjectId();\r\n }\r\n\r\n /**\r\n * Generate Object ID as Promise\r\n * \r\n * Convenience method that converts the Observable to a Promise\r\n * for easier use with async/await syntax.\r\n * \r\n * @returns Promise<string> - The generated Object ID string\r\n * \r\n * @example\r\n * ```typescript\r\n * // Generate Object ID using async/await\r\n * try {\r\n * const objectId = await this.sharedObjectIdService.generateObjectIdAsync();\r\n * console.log('Generated Object ID:', objectId);\r\n * } catch (error) {\r\n * console.error('Failed to generate Object ID:', error);\r\n * }\r\n * ```\r\n */\r\n async generateObjectIdAsync(): Promise<string> {\r\n try {\r\n const response = await this.generateObjectId().toPromise();\r\n if (response?.success && response?.data?.objectId) {\r\n console.log('🆔 [SharedObjectIdService] Generated Object ID:', response.data.objectId);\r\n return response.data.objectId;\r\n } else {\r\n throw new Error('Failed to generate Object ID: Invalid response');\r\n }\r\n } catch (error) {\r\n console.error('❌ [SharedObjectIdService] Error generating Object ID:', error);\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Generate multiple Object IDs at once\r\n * \r\n * Useful when you need multiple Object IDs for batch operations.\r\n * \r\n * @param count - Number of Object IDs to generate\r\n * @returns Observable<string[]> - Array of generated Object IDs\r\n * \r\n * @example\r\n * ```typescript\r\n * // Generate 5 Object IDs for batch creation\r\n * this.sharedObjectIdService.generateMultipleObjectIds(5).subscribe({\r\n * next: (objectIds) => {\r\n * console.log('Generated Object IDs:', objectIds);\r\n * // Use the Object IDs for batch operations\r\n * }\r\n * });\r\n * ```\r\n */\r\n generateMultipleObjectIds(count: number): Observable<string[]> {\r\n console.log(`🆔 [SharedObjectIdService] Generating ${count} Object IDs`);\r\n \r\n const requests = Array.from({ length: count }, () => this.generateObjectId());\r\n \r\n return new Observable(observer => {\r\n let completed = 0;\r\n const objectIds: string[] = [];\r\n \r\n requests.forEach((request, index) => {\r\n request.subscribe({\r\n next: (response) => {\r\n if (response?.success && response?.data?.objectId) {\r\n objectIds[index] = response.data.objectId;\r\n } else {\r\n observer.error(new Error(`Failed to generate Object ID at index ${index}`));\r\n return;\r\n }\r\n \r\n completed++;\r\n if (completed === count) {\r\n observer.next(objectIds);\r\n observer.complete();\r\n }\r\n },\r\n error: (error) => {\r\n observer.error(error);\r\n }\r\n });\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Generate Object ID with validation\r\n * \r\n * Generates an Object ID and validates it before returning.\r\n * \r\n * @param validator - Optional validation function\r\n * @returns Observable<string> - Validated Object ID\r\n * \r\n * @example\r\n * ```typescript\r\n * // Generate Object ID with custom validation\r\n * const validator = (id: string) => id.length === 24; // MongoDB ObjectId length\r\n * this.sharedObjectIdService.generateObjectIdWithValidation(validator).subscribe({\r\n * next: (validatedId) => {\r\n * console.log('Validated Object ID:', validatedId);\r\n * }\r\n * });\r\n * ```\r\n */\r\n generateObjectIdWithValidation(validator?: (id: string) => boolean): Observable<string> {\r\n return new Observable(observer => {\r\n this.generateObjectId().subscribe({\r\n next: (response) => {\r\n if (response?.success && response?.data?.objectId) {\r\n const objectId = response.data.objectId;\r\n \r\n // Apply validation if provided\r\n if (validator && !validator(objectId)) {\r\n observer.error(new Error('Generated Object ID failed validation'));\r\n return;\r\n }\r\n \r\n observer.next(objectId);\r\n observer.complete();\r\n } else {\r\n observer.error(new Error('Failed to generate Object ID: Invalid response'));\r\n }\r\n },\r\n error: (error) => {\r\n observer.error(error);\r\n }\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Check if a string is a valid Object ID format\r\n * \r\n * @param id - String to validate\r\n * @returns boolean - True if valid Object ID format\r\n * \r\n * @example\r\n * ```typescript\r\n * const isValid = this.sharedObjectIdService.isValidObjectId('507f1f77bcf86cd799439011');\r\n * console.log('Is valid Object ID:', isValid); // true\r\n * ```\r\n */\r\n isValidObjectId(id: string): boolean {\r\n // MongoDB ObjectId is 24 characters long and contains only hexadecimal characters\r\n const objectIdRegex = /^[0-9a-fA-F]{24}$/;\r\n return objectIdRegex.test(id);\r\n }\r\n\r\n /**\r\n * Get Object ID generation statistics\r\n * \r\n * Returns information about Object ID generation for monitoring purposes.\r\n * \r\n * @returns Object with statistics\r\n */\r\n getGenerationStats(): { serviceName: string; description: string; internalService: string } {\r\n return {\r\n serviceName: 'SharedObjectIdService',\r\n description: 'Centralized Object ID generation service',\r\n internalService: 'CideEleFileManagerService'\r\n };\r\n }\r\n}\r\n","import { Component, signal, OnInit, inject, input, output, InjectionToken } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { Router } from '@angular/router';\nimport { CideEleButtonComponent, CideIconComponent, CideSpinnerComponent } from 'cloud-ide-element';\nimport { entityControllerResponse, MEntity } from 'cloud-ide-lms-model';\nimport { Observable } from 'rxjs';\n\nexport interface OrgStructureNode {\n _id: string; // Primary key\n syen_name: string;\n syen_entity_code: string;\n syen_entity_type_sygms: string;\n syen_isactive: boolean;\n children?: OrgStructureNode[];\n level: number;\n parentId?: string; // Foreign key referencing syen_id_syen (empty string \"\" means root level)\n}\n\n// Interface for entity service to avoid circular dependency\nexport interface IEntityService {\n getEntityList(params: MEntity): Observable<entityControllerResponse>;\n}\n\n// Injection token for entity service\nexport const ENTITY_SERVICE_TOKEN = new InjectionToken<IEntityService>('EntityService');\n\n@Component({\n selector: 'cide-shared-org-structure',\n standalone: true,\n imports: [\n CommonModule,\n CideEleButtonComponent,\n CideIconComponent,\n CideSpinnerComponent\n ],\n templateUrl: './org-structure.component.html',\n styleUrl: './org-structure.component.scss'\n})\nexport class CideSharedOrgStructureComponent implements OnInit {\n // Input parameters for configuration\n allowSwitching = input<boolean>(true); // Allow entity switching (default: true)\n showActions = input<boolean>(true); // Show action buttons (default: true)\n mode = input<'selection' | 'view'>('view'); // Mode: selection or view-only\n\n // Output events\n entityClick = output<OrgStructureNode>(); // Emit when entity is clicked\n entitySelect = output<OrgStructureNode>(); // Emit when entity is selected for switching\n entityView = output<OrgStructureNode>(); // Emit when entity is viewed\n\n private entityService = inject(ENTITY_SERVICE_TOKEN) as IEntityService;\n public router = inject(Router);\n\n // Signals\n loading = signal(false);\n error = signal<string | null>(null);\n orgStructure = signal<OrgStructureNode[]>([]);\n\n ngOnInit(): void {\n this.loadOrgStructure();\n }\n\n /**\n * Load organization structure\n */\n loadOrgStructure(): void {\n this.loading.set(true);\n this.error.set(null);\n\n this.entityService.getEntityList({}).subscribe({\n next: (response: entityControllerResponse) => {\n if (response?.success && response?.data) {\n const structure = this.buildOrgStructure(response.data);\n this.orgStructure.set(structure);\n console.log('🏢 [OrgStructure] Loaded organization structure:', structure.length, 'root entities');\n } else {\n this.error.set('Failed to load organization structure');\n console.error('❌ [OrgStructure] Failed to load entities:', response);\n }\n this.loading.set(false);\n },\n error: (error: any) => {\n this.error.set('Error loading organization structure');\n console.error('❌ [OrgStructure] Error loading entities:', error);\n this.loading.set(false);\n }\n });\n }\n\n /**\n * Build organization structure from flat entity list\n */\n private buildOrgStructure(entities: any[]): OrgStructureNode[] {\n const nodeMap = new Map<string, OrgStructureNode>();\n const rootNodes: OrgStructureNode[] = [];\n\n // First pass: create all nodes\n entities.forEach(entity => {\n const node: OrgStructureNode = {\n _id: entity._id || '',\n syen_name: entity.syen_name || 'Unnamed Entity',\n syen_entity_code: entity.syen_entity_code || '',\n syen_entity_type_sygms: entity.syen_entity_type_sygms || '',\n syen_isactive: entity.syen_isactive || false,\n children: [],\n level: 0,\n parentId: entity.syen_id_syen || undefined\n };\n nodeMap.set(node._id, node);\n });\n\n // Second pass: build hierarchy\n entities.forEach(entity => {\n const node = nodeMap.get(entity._id || '');\n if (node) {\n const parentId = entity.syen_id_syen;\n if (parentId && parentId !== \"\" && nodeMap.has(parentId)) {\n const parent = nodeMap.get(parentId)!;\n parent.children = parent.children || [];\n parent.children.push(node);\n node.level = this.calculateLevel(parent, nodeMap);\n } else {\n node.level = 0;\n rootNodes.push(node);\n }\n }\n });\n\n // Sort children recursively\n this.sortChildrenRecursively(rootNodes);\n return rootNodes;\n }\n\n /**\n * Calculate level of a node based on its parent\n */\n private calculateLevel(node: OrgStructureNode, nodeMap: Map<string, OrgStructureNode>): number {\n let level = 0;\n let current = node;\n \n while (current.parentId && nodeMap.has(current.parentId)) {\n level++;\n current = nodeMap.get(current.parentId)!;\n }\n \n return level;\n }\n\n /**\n * Sort children recursively by name\n */\n private sortChildrenRecursively(nodes: OrgStructureNode[]): void {\n nodes.sort((a, b) => a.syen_name.localeCompare(b.syen_name));\n \n nodes.forEach(node => {\n if (node.children && node.children.length > 0) {\n this.sortChildrenRecursively(node.children);\n }\n });\n }\n\n\n /**\n * View entity details\n */\n viewEntity(entityId: string): void {\n // Find the entity in the structure\n const entity = this.findEntityById(entityId);\n if (entity) {\n // Emit the appropriate event based on mode\n this.entityClick.emit(entity);\n \n if (this.mode() === 'selection' && this.allowSwitching()) {\n this.entitySelect.emit(entity);\n } else {\n this.entityView.emit(entity);\n }\n }\n\n // Only navigate if not in selection mode\n if (this.mode() !== 'selection') {\n this.router.navigate(['/control-panel/entity-list'], { \n queryParams: { view: entityId } \n });\n }\n }\n\n /**\n * Find entity by ID in the structure\n */\n private findEntityById(entityId: string): OrgStructureNode | null {\n const findInNodes = (nodes: OrgStructureNode[]): OrgStructureNode | null => {\n for (const node of nodes) {\n if (node._id === entityId) {\n return node;\n }\n if (node.children && node.children.length > 0) {\n const found = findInNodes(node.children);\n if (found) return found;\n }\n }\n return null;\n };\n \n return findInNodes(this.orgStructure());\n }\n\n /**\n * Edit entity\n */\n editEntity(entityId: string): void {\n this.router.navigate(['/control-panel/entity-list/entity-create'], { \n queryParams: { edit: entityId } \n });\n }\n}\n","<!-- Organization Structure Component -->\n<div class=\"tw-flex-1 tw-overflow-hidden\">\n @if (loading()) {\n <div class=\"tw-flex tw-items-center tw-justify-center tw-py-12\">\n <cide-ele-spinner size=\"md\"></cide-ele-spinner>\n <span class=\"tw-ml-3 tw-text-gray-600 tw-text-sm\">Loading organization structure...</span>\n </div>\n } @else if (error()) {\n <div class=\"tw-text-center tw-py-12\">\n <div class=\"tw-w-16 tw-h-16 tw-bg-red-100 tw-rounded-full tw-flex tw-items-center tw-justify-center tw-mx-auto tw-mb-4\">\n <cide-ele-icon class=\"tw-w-8 tw-h-8 tw-text-red-500\">error</cide-ele-icon>\n </div>\n <h3 class=\"tw-text-lg tw-font-medium tw-text-gray-900 tw-mb-2\">Error Loading Structure</h3>\n <p class=\"tw-text-gray-600 tw-mb-4\">{{ error() }}</p>\n <button cideEleButton variant=\"primary\" size=\"sm\" (click)=\"loadOrgStructure()\">\n <cide-ele-icon>refresh</cide-ele-icon>\n Try Again\n </button>\n </div>\n } @else if (orgStructure().length === 0) {\n <div class=\"tw-text-center tw-py-12\">\n <div class=\"tw-w-16 tw-h-16 tw-bg-gray-100 tw-rounded-full tw-flex tw-items-center tw-justify-center tw-mx-auto tw-mb-4\">\n <cide-ele-icon class=\"tw-w-8 tw-h-8 tw-text-gray-400\">account_tree</cide-ele-icon>\n </div>\n <h3 class=\"tw-text-lg tw-font-medium tw-text-gray-900 tw-mb-2\">No Entities Found</h3>\n <p class=\"tw-text-gray-600 tw-mb-4\">No entities are available to display in the organization structure.</p>\n @if (mode() === 'view') {\n <button cideEleButton variant=\"primary\" size=\"sm\" (click)=\"router.navigate(['/control-panel/entity-list'])\">\n <cide-ele-icon>add</cide-ele-icon>\n Create First Entity\n </button>\n }\n </div>\n } @else {\n <!-- Organization Chart Container -->\n <div class=\"tw-relative tw-min-h-screen tw-bg-gray-50 tw-py-8\">\n <!-- Background Grid Pattern -->\n <div class=\"tw-absolute tw-inset-0 tw-opacity-30\" style=\"background-image: radial-gradient(circle, #e5e7eb 1px, transparent 1px); background-size: 20px 20px;\"></div>\n \n <!-- Chart Content -->\n <div class=\"tw-relative tw-z-10\">\n @for (rootNode of orgStructure(); track rootNode._id) {\n <div class=\"tw-flex tw-flex-col tw-items-center tw-mb-12\">\n <!-- Render node recursively with unlimited depth -->\n <ng-container [ngTemplateOutlet]=\"entityNodeTemplate\" [ngTemplateOutletContext]=\"{ $implicit: rootNode, level: 0 }\"></ng-container>\n </div>\n }\n </div>\n </div>\n }\n</div>\n\n<!-- Entity Node Template (Recursive) -->\n<ng-template #entityNodeTemplate let-node let-level=\"level\">\n <div class=\"tw-flex tw-flex-col tw-items-center\">\n \n <!-- Entity Card -->\n <div class=\"tw-bg-white tw-shadow-lg tw-rounded-lg tw-p-4 tw-min-w-64 tw-max-w-72 tw-border-t-4 tw-transition-shadow tw-cursor-pointer hover:tw-shadow-xl\"\n [class.level-0]=\"level === 0\"\n [class.level-1]=\"level === 1\"\n [class.level-2]=\"level === 2\"\n [class.level-3]=\"level === 3\"\n [class.level-4]=\"level === 4\"\n [class.level-5]=\"level === 5\"\n (click)=\"viewEntity(node._id)\">\n \n <!-- Card Content -->\n <div class=\"tw-flex tw-items-center tw-space-x-3\">\n <!-- Avatar -->\n <div class=\"tw-w-12 tw-h-12 tw-bg-purple-100 tw-rounded-full tw-flex tw-items-center tw-justify-center tw-flex-shrink-0\">\n <cide-ele-icon class=\"tw-w-6 tw-h-6 tw-text-purple-600\">person</cide-ele-icon>\n </div>\n \n <!-- Entity Info -->\n <div class=\"tw-flex-1 tw-min-w-0\">\n <h3 class=\"tw-text-sm tw-font-semibold tw-text-gray-900 tw-whitespace-nowrap tw-overflow-hidden tw-text-ellipsis\">{{ node.syen_name }}</h3>\n <p class=\"tw-text-xs tw-text-gray-600 tw-mt-1\">{{ node.syen_entity_code }}</p>\n <p class=\"tw-text-xs tw-text-gray-500 tw-mt-1\">{{ node.syen_entity_type_sygms }}</p>\n </div>\n </div>\n \n <!-- Action Icons -->\n <div class=\"tw-flex tw-items-center tw-justify-between tw-mt-3\">\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\n <!-- Phone Icon -->\n <button class=\"tw-w-6 tw-h-6 tw-rounded-full tw-bg-gray-100 tw-flex tw-items-center tw-justify-center tw-text-gray-600 hover:tw-bg-gray-200 tw-transition-colors\">\n <cide-ele-icon class=\"tw-text-xs\">phone</cide-ele-icon>\n </button>\n \n <!-- Email Icon -->\n <button class=\"tw-w-6 tw-h-6 tw-rounded-full tw-bg-gray-100 tw-flex tw-items-center tw-justify-center tw-text-gray-600 hover:tw-bg-gray-200 tw-transition-colors\">\n <cide-ele-icon class=\"tw-text-xs\">email</cide-ele-icon>\n </button>\n \n <!-- LinkedIn Icon -->\n <button class=\"tw-w-6 tw-h-6 tw-rounded-full tw-bg-blue-100 tw-flex tw-items-center tw-justify-center tw-text-blue-600 hover:tw-bg-blue-200 tw-transition-colors\">\n <cide-ele-icon class=\"tw-text-xs\">attach_money</cide-ele-icon>\n </button>\n \n <!-- Document Icon -->\n <button class=\"tw-w-6 tw-h-6 tw-rounded-full tw-bg-gray-100 tw-flex tw-items-center tw-justify-center tw-text-gray-600 hover:tw-bg-gray-200 tw-transition-colors\">\n <cide-ele-icon class=\"tw-text-xs\">description</cide-ele-icon>\n </button>\n \n <!-- More Options Icon -->\n <button class=\"tw-w-6 tw-h-6 tw-rounded-full tw-bg-gray-100 tw-flex tw-items-center tw-justify-center tw-text-gray-600 hover:tw-bg-gray-200 tw-transition-colors\">\n <cide-ele-icon class=\"tw-text-xs\">more_horiz</cide-ele-icon>\n </button>\n </div>\n \n <!-- Status Badge -->\n <div class=\"tw-flex-shrink-0\">\n @if (node.syen_isactive) {\n <div class=\"tw-inline-flex tw-items-center tw-px-1.5 tw-py-0.5 tw-rounded-full tw-text-xs tw-font-medium tw-bg-green-100 tw-text-green-800\">\n <div class=\"tw-w-1.5 tw-h-1.5 tw-bg-green-500 tw-rounded-full tw-mr-1\"></div>\n Active\n </div>\n } @else {\n <div class=\"tw-inline-flex tw-items-center tw-px-1.5 tw-py-0.5 tw-rounded-full tw-text-xs tw-font-medium tw-bg-red-100 tw-text-red-800\">\n <div class=\"tw-w-1.5 tw-h-1.5 tw-bg-red-500 tw-rounded-full tw-mr-1\"></div>\n Inactive\n </div>\n }\n </div>\n </div>\n </div>\n \n <!-- Children Entities (Recursive) -->\n @if (node.children && node.children.length > 0) {\n <!-- Ultra-Compact Connection Lines -->\n <div class=\"tw-relative tw-flex tw-flex-col tw-items-center tw-mt-2\">\n <!-- Minimal connection dot -->\n <div class=\"tw-absolute tw-left-1/2 tw-transform tw--translate-x-1/2\" style=\"top: -8px;\">\n <div class=\"tw-w-2 tw-h-2 tw-bg-purple-600 tw-rounded-full tw-border tw-border-white\"></div>\n </div>\n \n <!-- Ultra-Compact SVG Lines -->\n <div class=\"tw-relative tw-w-full\" style=\"height: 30px;\">\n @if (node.children && node.children.length === 1) {\n <!-- Single child - minimal line -->\n <svg class=\"tw-absolute tw-left-1/2 connection-line-compact\" style=\"transform: translateX(-50%); width: 2px; height: 30px; top: 0;\">\n <line x1=\"1\" y1=\"0\" x2=\"1\" y2=\"30\" stroke=\"#9333ea\" stroke-width=\"2\" stroke-linecap=\"round\"/>\n </svg>\n }\n @else if (node.children && node.children.length > 1) {\n <!-- Multiple children - minimal design -->\n <svg class=\"tw-absolute tw-left-1/2 connection-line-compact\" [attr.style]=\"'transform: translateX(-50%); width: ' + ((node.children.length - 1) * 336 + 256) + 'px; height: 30px; top: 0;'\">\n <!-- Vertical line -->\n <line [attr.x1]=\"((node.children.length - 1) * 336 + 256) / 2\" \n y1=\"0\" \n [attr.x2]=\"((node.children.length - 1) * 336 + 256) / 2\" \n y2=\"12\" \n stroke=\"#9333ea\" \n stroke-width=\"2\" \n stroke-linecap=\"round\"/>\n \n <!-- Horizontal line -->\n <path [attr.d]=\"'M 128 15 L ' + ((node.children.length - 1) * 336 + 128) + ' 15'\" \n stroke=\"#9333ea\" \n stroke-width=\"2\" \n stroke-linecap=\"round\"/>\n \n <!-- Vertical lines to children -->\n @for (child of node.children; track child._id; let i = $index) {\n <line [attr.x1]=\"(i * 336) + 128\" \n y1=\"15\" \n [attr.x2]=\"(i * 336) + 128\" \n y2=\"28\" \n stroke=\"#9333ea\" \n stroke-width=\"2\" \n stroke-linecap=\"round\"/>\n <!-- Tiny dot -->\n <circle [attr.cx]=\"(i * 336) + 128\" cy=\"28\" r=\"2.5\" fill=\"#9333ea\" stroke=\"#fff\" stroke-width=\"1\"/>\n }\n </svg>\n }\n </div>\n \n <!-- Children -->\n <div class=\"tw-flex tw-justify-center tw-gap-20\">\n @for (child of node.children; track child._id) {\n <div class=\"tw-flex tw-flex-col tw-items-center\">\n <!-- Child node -->\n <ng-container [ngTemplateOutlet]=\"entityNodeTemplate\" [ngTemplateOutletContext]=\"{ $implicit: child, level: level + 1 }\"></ng-container>\n </div>\n }\n </div>\n </div>\n }\n </div>\n</ng-template>\n","/*\n * Public API Surface of cloud-ide-shared\n */\n\nexport * from './lib/cloud-ide-shared';\n\n// Guards\nexport * from './lib/guards/auth.guard';\n\n// Services\nexport * from './lib/services/auth.service.interface';\nexport * from './lib/services/shared-object-id.service';\n\n// Components\nexport * from './lib/components/org-structure/org-structure.component';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cloud-ide-shared.mjs","sources":["../../../projects/cloud-ide-shared/src/lib/cloud-ide-shared.ts","../../../projects/cloud-ide-shared/src/lib/services/auth.service.interface.ts","../../../projects/cloud-ide-shared/src/lib/guards/auth.guard.ts","../../../projects/cloud-ide-shared/src/lib/services/shared-object-id.service.ts","../../../projects/cloud-ide-shared/src/lib/services/general-master-type.service.ts","../../../projects/cloud-ide-shared/src/lib/services/general-master.service.ts","../../../projects/cloud-ide-shared/src/lib/components/org-structure/org-structure.component.ts","../../../projects/cloud-ide-shared/src/lib/components/org-structure/org-structure.component.html","../../../projects/cloud-ide-shared/src/public-api.ts","../../../projects/cloud-ide-shared/src/cloud-ide-shared.ts"],"sourcesContent":["import { Component } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'lib-cloud-ide-shared',\r\n imports: [],\r\n template: `\r\n <p>\r\n cloud-ide-shared works!\r\n </p>\r\n `,\r\n styles: ``\r\n})\r\nexport class CloudIdeShared {\r\n\r\n}\r\n","import { InjectionToken } from '@angular/core';\n\n// Interface for auth service to avoid circular dependency\nexport interface IAuthService {\n isAuthenticated(): boolean;\n isTokenExpired(): boolean;\n signOut(): void;\n refreshAuthState(): void;\n}\n\n// Interface for app state service to avoid circular dependency\nexport interface IAppStateService {\n isUserAuthenticated(): boolean;\n refreshFromLocalStorage(): void;\n}\n\n// Tokens for dependency injection\nexport const AUTH_SERVICE_TOKEN = new InjectionToken<IAuthService>('AuthService');\nexport const APP_STATE_SERVICE_TOKEN = new InjectionToken<IAppStateService>('AppStateService');\n","import { inject } from '@angular/core';\r\nimport { CanActivateFn, Router } from '@angular/router';\r\nimport { IAuthService, AUTH_SERVICE_TOKEN, IAppStateService, APP_STATE_SERVICE_TOKEN } from '../services/auth.service.interface';\r\n\r\nexport const authGuard: CanActivateFn = (route, state) => {\r\n const authService = inject(AUTH_SERVICE_TOKEN) as IAuthService;\r\n const appState = inject(APP_STATE_SERVICE_TOKEN) as IAppStateService;\r\n const router = inject(Router);\r\n \r\n // Refresh auth state to make sure it's current\r\n authService.refreshAuthState();\r\n \r\n // Refresh app state from localStorage to ensure synchronization\r\n appState.refreshFromLocalStorage();\r\n \r\n // Check if user is authenticated using app state (modern approach)\r\n if (appState.isUserAuthenticated() && !authService.isTokenExpired()) {\r\n return true;\r\n }\r\n \r\n // Redirect to login page with the intended destination\r\n router.navigate(['/auth/sign-in'], { \r\n queryParams: { returnUrl: state.url }\r\n });\r\n \r\n return false;\r\n};\r\n","import { Injectable, inject } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { CideEleFileManagerService } from 'cloud-ide-element';\r\nimport { mongooseObjectIdCreateControllerResponse } from 'cloud-ide-element';\r\n\r\n/**\r\n * Shared Object ID Generation Service\r\n * \r\n * This service provides a consistent interface for generating Object IDs\r\n * across all libraries. It internally uses the FileManagerService but\r\n * provides a standardized API that can be used throughout the application.\r\n * \r\n * Benefits:\r\n * - Consistent interface across all libraries\r\n * - Centralized Object ID generation logic\r\n * - Easy to maintain and update\r\n * - Prevents confusion with different Object ID generation methods\r\n */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class SharedObjectIdService {\r\n private fileManagerService = inject(CideEleFileManagerService);\r\n\r\n /**\r\n * Generate a new Object ID\r\n * \r\n * This method internally uses the FileManagerService to generate\r\n * a unique Object ID that can be used for any entity in the system.\r\n * \r\n * @returns Observable<mongooseObjectIdCreateControllerResponse> - The generated Object ID response\r\n * \r\n * @example\r\n * ```typescript\r\n * // Generate Object ID for a new user\r\n * this.sharedObjectIdService.generateObjectId().subscribe({\r\n * next: (response) => {\r\n * if (response.success && response.data?.objectId) {\r\n * const newUserId = response.data.objectId;\r\n * // Use the Object ID for creating a new user\r\n * }\r\n * },\r\n * error: (error) => {\r\n * console.error('Failed to generate Object ID:', error);\r\n * }\r\n * });\r\n * ```\r\n */\r\n generateObjectId(): Observable<mongooseObjectIdCreateControllerResponse> {\r\n console.log('🆔 [SharedObjectIdService] Generating Object ID via FileManagerService');\r\n \r\n return this.fileManagerService.generateObjectId();\r\n }\r\n\r\n /**\r\n * Generate Object ID as Promise\r\n * \r\n * Convenience method that converts the Observable to a Promise\r\n * for easier use with async/await syntax.\r\n * \r\n * @returns Promise<string> - The generated Object ID string\r\n * \r\n * @example\r\n * ```typescript\r\n * // Generate Object ID using async/await\r\n * try {\r\n * const objectId = await this.sharedObjectIdService.generateObjectIdAsync();\r\n * console.log('Generated Object ID:', objectId);\r\n * } catch (error) {\r\n * console.error('Failed to generate Object ID:', error);\r\n * }\r\n * ```\r\n */\r\n async generateObjectIdAsync(): Promise<string> {\r\n try {\r\n const response = await this.generateObjectId().toPromise();\r\n if (response?.success && response?.data?.objectId) {\r\n console.log('🆔 [SharedObjectIdService] Generated Object ID:', response.data.objectId);\r\n return response.data.objectId;\r\n } else {\r\n throw new Error('Failed to generate Object ID: Invalid response');\r\n }\r\n } catch (error) {\r\n console.error('❌ [SharedObjectIdService] Error generating Object ID:', error);\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Generate multiple Object IDs at once\r\n * \r\n * Useful when you need multiple Object IDs for batch operations.\r\n * \r\n * @param count - Number of Object IDs to generate\r\n * @returns Observable<string[]> - Array of generated Object IDs\r\n * \r\n * @example\r\n * ```typescript\r\n * // Generate 5 Object IDs for batch creation\r\n * this.sharedObjectIdService.generateMultipleObjectIds(5).subscribe({\r\n * next: (objectIds) => {\r\n * console.log('Generated Object IDs:', objectIds);\r\n * // Use the Object IDs for batch operations\r\n * }\r\n * });\r\n * ```\r\n */\r\n generateMultipleObjectIds(count: number): Observable<string[]> {\r\n console.log(`🆔 [SharedObjectIdService] Generating ${count} Object IDs`);\r\n \r\n const requests = Array.from({ length: count }, () => this.generateObjectId());\r\n \r\n return new Observable(observer => {\r\n let completed = 0;\r\n const objectIds: string[] = [];\r\n \r\n requests.forEach((request, index) => {\r\n request.subscribe({\r\n next: (response) => {\r\n if (response?.success && response?.data?.objectId) {\r\n objectIds[index] = response.data.objectId;\r\n } else {\r\n observer.error(new Error(`Failed to generate Object ID at index ${index}`));\r\n return;\r\n }\r\n \r\n completed++;\r\n if (completed === count) {\r\n observer.next(objectIds);\r\n observer.complete();\r\n }\r\n },\r\n error: (error) => {\r\n observer.error(error);\r\n }\r\n });\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Generate Object ID with validation\r\n * \r\n * Generates an Object ID and validates it before returning.\r\n * \r\n * @param validator - Optional validation function\r\n * @returns Observable<string> - Validated Object ID\r\n * \r\n * @example\r\n * ```typescript\r\n * // Generate Object ID with custom validation\r\n * const validator = (id: string) => id.length === 24; // MongoDB ObjectId length\r\n * this.sharedObjectIdService.generateObjectIdWithValidation(validator).subscribe({\r\n * next: (validatedId) => {\r\n * console.log('Validated Object ID:', validatedId);\r\n * }\r\n * });\r\n * ```\r\n */\r\n generateObjectIdWithValidation(validator?: (id: string) => boolean): Observable<string> {\r\n return new Observable(observer => {\r\n this.generateObjectId().subscribe({\r\n next: (response) => {\r\n if (response?.success && response?.data?.objectId) {\r\n const objectId = response.data.objectId;\r\n \r\n // Apply validation if provided\r\n if (validator && !validator(objectId)) {\r\n observer.error(new Error('Generated Object ID failed validation'));\r\n return;\r\n }\r\n \r\n observer.next(objectId);\r\n observer.complete();\r\n } else {\r\n observer.error(new Error('Failed to generate Object ID: Invalid response'));\r\n }\r\n },\r\n error: (error) => {\r\n observer.error(error);\r\n }\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Check if a string is a valid Object ID format\r\n * \r\n * @param id - String to validate\r\n * @returns boolean - True if valid Object ID format\r\n * \r\n * @example\r\n * ```typescript\r\n * const isValid = this.sharedObjectIdService.isValidObjectId('507f1f77bcf86cd799439011');\r\n * console.log('Is valid Object ID:', isValid); // true\r\n * ```\r\n */\r\n isValidObjectId(id: string): boolean {\r\n // MongoDB ObjectId is 24 characters long and contains only hexadecimal characters\r\n const objectIdRegex = /^[0-9a-fA-F]{24}$/;\r\n return objectIdRegex.test(id);\r\n }\r\n\r\n /**\r\n * Get Object ID generation statistics\r\n * \r\n * Returns information about Object ID generation for monitoring purposes.\r\n * \r\n * @returns Object with statistics\r\n */\r\n getGenerationStats(): { serviceName: string; description: string; internalService: string } {\r\n return {\r\n serviceName: 'SharedObjectIdService',\r\n description: 'Centralized Object ID generation service',\r\n internalService: 'CideEleFileManagerService'\r\n };\r\n }\r\n}\r\n\r\n","import { Injectable, inject } from '@angular/core';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { Observable, throwError, BehaviorSubject } from 'rxjs';\r\nimport { catchError, tap } from 'rxjs/operators';\r\nimport { \r\n cidePath,\r\n coreRoutesUrl,\r\n generateStringFromObject,\r\n hostManagerRoutesUrl,\r\n generalMasterTypeListControllerResponse,\r\n generalMasterTypeByIdControllerResponse,\r\n generalMasterTypeInsertUpdateControllerResponse,\r\n generalMasterTypeDeleteControllerResponse,\r\n generalMasterTypeToggleStatusControllerResponse,\r\n MGeneralMasterType,\r\n ICoreSygmt\r\n} from 'cloud-ide-lms-model';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class CideCoreGeneralMasterTypeService {\r\n private http = inject(HttpClient);\r\n private generalMasterTypeListSubject = new BehaviorSubject<ICoreSygmt[]>([]);\r\n public generalMasterTypeList$ = this.generalMasterTypeListSubject.asObservable();\r\n\r\n constructor() {\r\n console.log('CideCoreGeneralMasterTypeService initialized - using real API');\r\n }\r\n\r\n /**\r\n * Get general master type list from API\r\n */\r\n getTypeList(body: MGeneralMasterType): Observable<generalMasterTypeListControllerResponse> {\r\n const query = generateStringFromObject(body);\r\n return this.http?.get<generalMasterTypeListControllerResponse>(cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, coreRoutesUrl?.module, coreRoutesUrl?.generalMasterType, query]))\r\n .pipe(\r\n tap((response: generalMasterTypeListControllerResponse) => {\r\n if (response?.success) {\r\n this.generalMasterTypeListSubject.next(response?.data || []);\r\n }\r\n }),\r\n catchError(error => {\r\n console.error('CideCoreGeneralMasterTypeService API error:', error);\r\n return this.handleError(error);\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Get general master type list from cache (if available)\r\n */\r\n getTypeListFromCache(): ICoreSygmt[] {\r\n return this.generalMasterTypeListSubject.value;\r\n }\r\n\r\n /**\r\n * Create or update general master type\r\n * POST ${coreRoutesUrl?.generalMasterType} - payload: IGeneralMasterTypeCreateUpdatePayload, response: generalMasterTypeInsertUpdateControllerResponse\r\n * If type._id exists, it will update; otherwise, it will create a new type\r\n */\r\n saveType(type: ICoreSygmt): Observable<generalMasterTypeInsertUpdateControllerResponse> {\r\n const isUpdate = !!type._id;\r\n console.log(`${isUpdate ? 'Updating' : 'Creating'} general master type:`, type);\r\n \r\n // Create proper payload - backend will determine create vs update based on _id presence\r\n const payload: ICoreSygmt = {\r\n ...(type._id && { _id: type._id }), // Only include _id if it exists\r\n sygmt_code: type.sygmt_code,\r\n sygmt_title: type.sygmt_title,\r\n sygmt_desc: type.sygmt_desc,\r\n sygmt_isactive: type.sygmt_isactive,\r\n sygmt_configuration: type.sygmt_configuration,\r\n sygmt_id_sygmt: type.sygmt_id_sygmt\r\n };\r\n \r\n const url = cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, coreRoutesUrl?.module, coreRoutesUrl?.generalMasterType]);\r\n return this.http.post<generalMasterTypeInsertUpdateControllerResponse>(url, payload)\r\n .pipe(\r\n tap((response: generalMasterTypeInsertUpdateControllerResponse) => {\r\n if (response.success) {\r\n this.refreshTypeList();\r\n }\r\n }),\r\n catchError(this.handleError)\r\n );\r\n }\r\n\r\n /**\r\n * Get general master type by ID\r\n * GET ${coreRoutesUrl?.generalMasterType}/byId/:query - payload: { sygmt_id: string }, response: generalMasterTypeByIdControllerResponse\r\n */\r\n getTypeById(id: string): Observable<generalMasterTypeByIdControllerResponse> {\r\n console.log('Getting general master type by ID:', id);\r\n const payload = { sygmt_id: id };\r\n const query = generateStringFromObject(payload);\r\n const url = cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, coreRoutesUrl?.module, coreRoutesUrl?.generalMasterType, 'byId', query]);\r\n return this.http.get<generalMasterTypeByIdControllerResponse>(url)\r\n .pipe(\r\n catchError(this.handleError)\r\n );\r\n }\r\n\r\n /**\r\n * Delete general master type\r\n * DELETE ${coreRoutesUrl?.generalMasterType}/:query - payload: { sygmt_id: string }, response: generalMasterTypeDeleteControllerResponse\r\n */\r\n deleteType(id: string): Observable<generalMasterTypeDeleteControllerResponse> {\r\n const payload = { sygmt_id: id };\r\n const query = generateStringFromObject(payload);\r\n const url = cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, coreRoutesUrl?.module, coreRoutesUrl?.generalMasterType, query]);\r\n return this.http.delete<generalMasterTypeDeleteControllerResponse>(url)\r\n .pipe(\r\n tap((response: generalMasterTypeDeleteControllerResponse) => {\r\n if (response.success) {\r\n this.refreshTypeList();\r\n }\r\n }),\r\n catchError(this.handleError)\r\n );\r\n }\r\n\r\n /**\r\n * Toggle general master type active status\r\n */\r\n toggleTypeStatus(id: string): Observable<generalMasterTypeToggleStatusControllerResponse> {\r\n console.log('Toggling general master type status:', id);\r\n const payload = { id };\r\n const query = generateStringFromObject(payload);\r\n const url = cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, coreRoutesUrl?.module, coreRoutesUrl?.generalMasterType, query]);\r\n return this.http.put<generalMasterTypeToggleStatusControllerResponse>(url, {})\r\n .pipe(\r\n tap((response: generalMasterTypeToggleStatusControllerResponse) => {\r\n if (response.success) {\r\n this.refreshTypeList();\r\n }\r\n }),\r\n catchError(this.handleError)\r\n );\r\n }\r\n\r\n /**\r\n * Check if type code exists\r\n */\r\n checkTypeCodeExists(code: string, excludeId?: string): Observable<{ success: boolean; message: string; exists: boolean }> {\r\n const payload: Record<string, string> = { code };\r\n if (excludeId) {\r\n payload['excludeId'] = excludeId;\r\n }\r\n const query = generateStringFromObject(payload);\r\n const url = cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, coreRoutesUrl?.module, coreRoutesUrl?.generalMasterType, 'checkCodeExists', query]);\r\n return this.http.get<{ success: boolean; message: string; exists: boolean }>(url)\r\n .pipe(\r\n catchError(this.handleError)\r\n );\r\n }\r\n\r\n /**\r\n * Refresh general master type list from server\r\n */\r\n private refreshTypeList(): void {\r\n const defaultBody: MGeneralMasterType = {};\r\n this.getTypeList(defaultBody).subscribe({\r\n next: () => {\r\n console.log('General master type list refreshed successfully');\r\n },\r\n error: (error) => {\r\n console.error('Error refreshing general master type list:', error);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Handle errors\r\n */\r\n private handleError(error: unknown): Observable<never> {\r\n let errorMessage = 'An error occurred';\r\n\r\n if (error instanceof Error) {\r\n errorMessage = error.message;\r\n } else if (typeof error === 'string') {\r\n errorMessage = error;\r\n }\r\n\r\n console.error('General Master Type Service Error:', errorMessage);\r\n return throwError(() => new Error(errorMessage));\r\n }\r\n}\r\n","import { Injectable, inject } from '@angular/core';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { Observable, throwError, BehaviorSubject } from 'rxjs';\r\nimport { catchError, tap } from 'rxjs/operators';\r\nimport { \r\n cidePath,\r\n coreRoutesUrl,\r\n generateStringFromObject,\r\n hostManagerRoutesUrl,\r\n generalMasterListControllerResponse,\r\n generalMasterByIdControllerResponse,\r\n generalMasterInsertUpdateControllerResponse,\r\n generalMasterDeleteControllerResponse,\r\n generalMasterToggleStatusControllerResponse,\r\n ICoreSygms,\r\n IGeneralMasterListRequest,\r\n} from 'cloud-ide-lms-model';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class CideCoreGeneralMasterService {\r\n private http = inject(HttpClient);\r\n private generalMasterListSubject = new BehaviorSubject<ICoreSygms[]>([]);\r\n public generalMasterList$ = this.generalMasterListSubject.asObservable();\r\n\r\n constructor() {\r\n console.log('CideCoreGeneralMasterService initialized - using real API');\r\n }\r\n\r\n /**\r\n * Get general master list from API\r\n */\r\n getMasterList(payload: IGeneralMasterListRequest): Observable<generalMasterListControllerResponse> {\r\n const query = generateStringFromObject(payload);\r\n return this.http?.get<generalMasterListControllerResponse>(cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, coreRoutesUrl?.module, coreRoutesUrl?.generalMaster, query]))\r\n .pipe(\r\n tap((response: generalMasterListControllerResponse) => {\r\n if (response?.success) {\r\n this.generalMasterListSubject.next(response?.data || []);\r\n }\r\n }),\r\n catchError(error => {\r\n console.error('CideCoreGeneralMasterService API error:', error);\r\n return this.handleError(error);\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Get general master list from cache (if available)\r\n */\r\n getMasterListFromCache(): ICoreSygms[] {\r\n return this.generalMasterListSubject.value;\r\n }\r\n\r\n /**\r\n * Save general master (create or update)\r\n * POST ${coreRoutesUrl?.generalMaster} - payload: ICoreSygms, response: generalMasterInsertUpdateControllerResponse\r\n */\r\n saveMaster(master: ICoreSygms): Observable<generalMasterInsertUpdateControllerResponse> {\r\n const isUpdate = !!master._id;\r\n console.log(`${isUpdate ? 'Updating' : 'Creating'} general master:`, master);\r\n \r\n // Create proper payload\r\n const payload: ICoreSygms = {\r\n ...(master._id && { _id: master._id }), // Only include _id if it exists\r\n sygms_code: master.sygms_code,\r\n sygms_id_sygmt: master.sygms_id_sygmt,\r\n sygms_title: master.sygms_title,\r\n sygms_desc: master.sygms_desc,\r\n sygms_isactive: master.sygms_isactive,\r\n sygms_id_sygms: master.sygms_id_sygms,\r\n sygms_configuration: master.sygms_configuration,\r\n sygms_entity_id_syen: master.sygms_entity_id_syen\r\n };\r\n \r\n const url = cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, coreRoutesUrl?.module, coreRoutesUrl?.generalMaster]);\r\n return this.http.post<generalMasterInsertUpdateControllerResponse>(url, payload)\r\n .pipe(\r\n tap((response: generalMasterInsertUpdateControllerResponse) => {\r\n if (response.success) {\r\n this.refreshMasterList();\r\n }\r\n }),\r\n catchError(this.handleError)\r\n );\r\n }\r\n\r\n /**\r\n * Create new general master (backward compatibility)\r\n */\r\n createMaster(master: ICoreSygms): Observable<generalMasterInsertUpdateControllerResponse> {\r\n return this.saveMaster(master);\r\n }\r\n\r\n /**\r\n * Update existing general master (backward compatibility)\r\n */\r\n updateMaster(id: string, master: ICoreSygms): Observable<generalMasterInsertUpdateControllerResponse> {\r\n return this.saveMaster({ ...master, _id: id });\r\n }\r\n\r\n /**\r\n * Get general master by ID\r\n * GET ${coreRoutesUrl?.generalMaster}/byId/:query - payload: { sygms_id: string }, response: generalMasterByIdControllerResponse\r\n */\r\n getMasterById(id: string): Observable<generalMasterByIdControllerResponse> {\r\n console.log('Getting general master by ID:', id);\r\n const payload = { sygms_id: id };\r\n const query = generateStringFromObject(payload);\r\n const url = cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, coreRoutesUrl?.module, coreRoutesUrl?.generalMaster, 'byId', query]);\r\n return this.http.get<generalMasterByIdControllerResponse>(url)\r\n .pipe(\r\n catchError(this.handleError)\r\n );\r\n }\r\n\r\n /**\r\n * Delete general master\r\n * DELETE ${coreRoutesUrl?.generalMaster}/:query - payload: { sygms_id: string }, response: generalMasterDeleteControllerResponse\r\n */\r\n deleteMaster(id: string): Observable<generalMasterDeleteControllerResponse> {\r\n const payload = { sygms_id: id };\r\n const query = generateStringFromObject(payload);\r\n const url = cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, coreRoutesUrl?.module, coreRoutesUrl?.generalMaster, query]);\r\n return this.http.delete<generalMasterDeleteControllerResponse>(url)\r\n .pipe(\r\n tap((response: generalMasterDeleteControllerResponse) => {\r\n if (response.success) {\r\n this.refreshMasterList();\r\n }\r\n }),\r\n catchError(this.handleError)\r\n );\r\n }\r\n\r\n /**\r\n * Toggle general master active status\r\n */\r\n toggleMasterStatus(id: string): Observable<generalMasterToggleStatusControllerResponse> {\r\n console.log('Toggling general master status:', id);\r\n const payload = { id };\r\n const query = generateStringFromObject(payload);\r\n const url = cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, coreRoutesUrl?.module, coreRoutesUrl?.generalMaster, query]);\r\n return this.http.put<generalMasterToggleStatusControllerResponse>(url, {})\r\n .pipe(\r\n tap((response: generalMasterToggleStatusControllerResponse) => {\r\n if (response.success) {\r\n this.refreshMasterList();\r\n }\r\n }),\r\n catchError(this.handleError)\r\n );\r\n }\r\n\r\n /**\r\n * Check if master code exists\r\n */\r\n checkMasterCodeExists(code: string, typeId: string, excludeId?: string): Observable<{ success: boolean; message: string; exists: boolean }> {\r\n const payload: Record<string, string> = { code, typeId };\r\n if (excludeId) {\r\n payload['excludeId'] = excludeId;\r\n }\r\n const query = generateStringFromObject(payload);\r\n const url = cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, coreRoutesUrl?.module, coreRoutesUrl?.generalMaster, 'checkCodeExists', query]);\r\n return this.http.get<{ success: boolean; message: string; exists: boolean }>(url)\r\n .pipe(\r\n catchError(this.handleError)\r\n );\r\n }\r\n\r\n /**\r\n * Refresh general master list from server\r\n */\r\n private refreshMasterList(): void {\r\n const defaultPayload: IGeneralMasterListRequest = {};\r\n this.getMasterList(defaultPayload).subscribe({\r\n next: () => {\r\n console.log('General master list refreshed successfully');\r\n },\r\n error: (error) => {\r\n console.error('Error refreshing general master list:', error);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Handle errors\r\n */\r\n private handleError(error: unknown): Observable<never> {\r\n let errorMessage = 'An error occurred';\r\n\r\n if (error instanceof Error) {\r\n errorMessage = error.message;\r\n } else if (typeof error === 'string') {\r\n errorMessage = error;\r\n }\r\n\r\n console.error('General Master Service Error:', errorMessage);\r\n return throwError(() => new Error(errorMessage));\r\n }\r\n}\r\n","import { Component, signal, OnInit, inject, input, output, InjectionToken } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { Router } from '@angular/router';\nimport { CideEleButtonComponent, CideIconComponent, CideSpinnerComponent } from 'cloud-ide-element';\nimport { entityControllerResponse, MEntity, CoreSystemEntityListResponse } from 'cloud-ide-lms-model';\nimport { Observable } from 'rxjs';\n\n// Interface for entity service to avoid circular dependency\nexport interface IEntityService {\n getEntityList(params: MEntity): Observable<entityControllerResponse>;\n}\n\n// Injection token for entity service\nexport const ENTITY_SERVICE_TOKEN = new InjectionToken<IEntityService>('EntityService');\n\n@Component({\n selector: 'cide-shared-org-structure',\n standalone: true,\n imports: [\n CommonModule,\n CideEleButtonComponent,\n CideIconComponent,\n CideSpinnerComponent\n ],\n templateUrl: './org-structure.component.html',\n styleUrl: './org-structure.component.scss'\n})\nexport class CideSharedOrgStructureComponent implements OnInit {\n // Input parameters for configuration\n allowSwitching = input<boolean>(true); // Allow entity switching (default: true)\n showActions = input<boolean>(true); // Show action buttons (default: true)\n mode = input<'selection' | 'view'>('view'); // Mode: selection or view-only\n\n // Output events\n entityClick = output<CoreSystemEntityListResponse>(); // Emit when entity is clicked\n entitySelect = output<CoreSystemEntityListResponse>(); // Emit when entity is selected for switching\n entityView = output<CoreSystemEntityListResponse>(); // Emit when entity is viewed\n\n private entityService = inject(ENTITY_SERVICE_TOKEN) as IEntityService;\n public router = inject(Router);\n\n // Signals\n loading = signal(false);\n error = signal<string | null>(null);\n orgStructure = signal<CoreSystemEntityListResponse[]>([]);\n\n ngOnInit(): void {\n this.loadOrgStructure();\n }\n\n /**\n * Load organization structure\n */\n loadOrgStructure(): void {\n this.loading.set(true);\n this.error.set(null);\n\n this.entityService.getEntityList({}).subscribe({\n next: (response: entityControllerResponse) => {\n if (response?.success && response?.data) {\n const structure = this.buildOrgStructure(response.data);\n this.orgStructure.set(structure);\n console.log('🏢 [OrgStructure] Loaded organization structure:', structure.length, 'root entities');\n } else {\n this.error.set('Failed to load organization structure');\n console.error('❌ [OrgStructure] Failed to load entities:', response);\n }\n this.loading.set(false);\n },\n error: (error: any) => {\n this.error.set('Error loading organization structure');\n console.error('❌ [OrgStructure] Error loading entities:', error);\n this.loading.set(false);\n }\n });\n }\n\n /**\n * Build organization structure from flat entity list\n */\n private buildOrgStructure(entities: CoreSystemEntityListResponse[]): CoreSystemEntityListResponse[] {\n const nodeMap = new Map<string, CoreSystemEntityListResponse>();\n const rootNodes: CoreSystemEntityListResponse[] = [];\n\n // First pass: create all nodes\n entities.forEach(entity => {\n const node: CoreSystemEntityListResponse = {\n ...entity,\n children: []\n };\n nodeMap.set(entity._id || '', node);\n });\n\n // Second pass: build hierarchy\n entities.forEach(entity => {\n const node = nodeMap.get(entity._id || '');\n if (node) {\n const parentId = entity.syen_id_syen;\n if (parentId && parentId !== \"\" && nodeMap.has(parentId)) {\n const parent = nodeMap.get(parentId)!;\n parent.children = parent.children || [];\n parent.children.push(node);\n } else {\n rootNodes.push(node);\n }\n }\n });\n\n // Sort children recursively\n this.sortChildrenRecursively(rootNodes);\n return rootNodes;\n }\n\n /**\n * Calculate level of a node based on its parent\n */\n private calculateLevel(node: CoreSystemEntityListResponse, nodeMap: Map<string, CoreSystemEntityListResponse>): number {\n let level = 0;\n let current = node;\n \n while (current.syen_id_syen && nodeMap.has(current.syen_id_syen)) {\n level++;\n current = nodeMap.get(current.syen_id_syen)!;\n }\n \n return level;\n }\n\n /**\n * Sort children recursively by name\n */\n private sortChildrenRecursively(nodes: CoreSystemEntityListResponse[]): void {\n nodes.sort((a, b) => (a.syen_name || '').localeCompare(b.syen_name || ''));\n \n nodes.forEach(node => {\n if (node.children && node.children.length > 0) {\n this.sortChildrenRecursively(node.children);\n }\n });\n }\n\n\n /**\n * View entity details\n */\n viewEntity(entityId: string): void {\n // Find the entity in the structure\n const entity = this.findEntityById(entityId);\n if (entity) {\n // Emit the appropriate event based on mode\n this.entityClick.emit(entity);\n \n if (this.mode() === 'selection' && this.allowSwitching()) {\n this.entitySelect.emit(entity);\n } else {\n this.entityView.emit(entity);\n }\n }\n\n // Only navigate if not in selection mode\n if (this.mode() !== 'selection') {\n this.router.navigate(['/control-panel/entity-list'], { \n queryParams: { view: entityId } \n });\n }\n }\n\n /**\n * Find entity by ID in the structure\n */\n private findEntityById(entityId: string): CoreSystemEntityListResponse | null {\n const findInNodes = (nodes: CoreSystemEntityListResponse[]): CoreSystemEntityListResponse | null => {\n for (const node of nodes) {\n if (node._id === entityId) {\n return node;\n }\n if (node.children && node.children.length > 0) {\n const found = findInNodes(node.children);\n if (found) return found;\n }\n }\n return null;\n };\n \n return findInNodes(this.orgStructure());\n }\n\n /**\n * Edit entity\n */\n editEntity(entityId: string): void {\n this.router.navigate(['/control-panel/entity-list/entity-create'], { \n queryParams: { edit: entityId } \n });\n }\n}\n","<!-- Organization Structure Component -->\n<div class=\"tw-flex-1 tw-overflow-hidden\">\n @if (loading()) {\n <div class=\"tw-flex tw-items-center tw-justify-center tw-py-12\">\n <cide-ele-spinner size=\"md\"></cide-ele-spinner>\n <span class=\"tw-ml-3 tw-text-gray-600 tw-text-sm\">Loading organization structure...</span>\n </div>\n } @else if (error()) {\n <div class=\"tw-text-center tw-py-12\">\n <div class=\"tw-w-16 tw-h-16 tw-bg-red-100 tw-rounded-full tw-flex tw-items-center tw-justify-center tw-mx-auto tw-mb-4\">\n <cide-ele-icon class=\"tw-w-8 tw-h-8 tw-text-red-500\">error</cide-ele-icon>\n </div>\n <h3 class=\"tw-text-lg tw-font-medium tw-text-gray-900 tw-mb-2\">Error Loading Structure</h3>\n <p class=\"tw-text-gray-600 tw-mb-4\">{{ error() }}</p>\n <button cideEleButton variant=\"primary\" size=\"sm\" (click)=\"loadOrgStructure()\">\n <cide-ele-icon>refresh</cide-ele-icon>\n Try Again\n </button>\n </div>\n } @else if (orgStructure().length === 0) {\n <div class=\"tw-text-center tw-py-12\">\n <div class=\"tw-w-16 tw-h-16 tw-bg-gray-100 tw-rounded-full tw-flex tw-items-center tw-justify-center tw-mx-auto tw-mb-4\">\n <cide-ele-icon class=\"tw-w-8 tw-h-8 tw-text-gray-400\">account_tree</cide-ele-icon>\n </div>\n <h3 class=\"tw-text-lg tw-font-medium tw-text-gray-900 tw-mb-2\">No Entities Found</h3>\n <p class=\"tw-text-gray-600 tw-mb-4\">No entities are available to display in the organization structure.</p>\n @if (mode() === 'view') {\n <button cideEleButton variant=\"primary\" size=\"sm\" (click)=\"router.navigate(['/control-panel/entity-list'])\">\n <cide-ele-icon>add</cide-ele-icon>\n Create First Entity\n </button>\n }\n </div>\n } @else {\n <!-- Organization Chart Container -->\n <div class=\"tw-relative tw-min-h-screen tw-bg-gray-50 tw-py-8 tw-overflow-x-auto org-chart-container\">\n <!-- Background Grid Pattern -->\n <div class=\"tw-absolute tw-inset-0 tw-opacity-30\" style=\"background-image: radial-gradient(circle, #e5e7eb 1px, transparent 1px); background-size: 20px 20px;\"></div>\n \n <!-- Chart Content -->\n <div class=\"tw-relative tw-z-10 tw-min-w-max tw-px-4 org-chart-content\">\n @for (rootNode of orgStructure(); track rootNode._id) {\n <div class=\"tw-flex tw-flex-col tw-items-center tw-mb-12\">\n <!-- Render node recursively with unlimited depth -->\n <ng-container [ngTemplateOutlet]=\"entityNodeTemplate\" [ngTemplateOutletContext]=\"{ $implicit: rootNode, level: 0 }\"></ng-container>\n </div>\n }\n </div>\n </div>\n }\n</div>\n\n<!-- Entity Node Template (Recursive) -->\n<ng-template #entityNodeTemplate let-node let-level=\"level\">\n <div class=\"tw-flex tw-flex-col tw-items-center\">\n \n <!-- Entity Card -->\n <div class=\"tw-bg-white tw-shadow-lg tw-rounded-lg tw-p-4 tw-w-64 tw-max-w-72 tw-border-t-4 tw-transition-all tw-cursor-pointer hover:tw-shadow-xl hover:tw-scale-105 entity-card\"\n [class.level-0]=\"level === 0\"\n [class.level-1]=\"level === 1\"\n [class.level-2]=\"level === 2\"\n [class.level-3]=\"level === 3\"\n [class.level-4]=\"level === 4\"\n [class.level-5]=\"level === 5\"\n (click)=\"viewEntity(node._id)\">\n \n <!-- Card Content -->\n <div class=\"tw-flex tw-items-center tw-space-x-3\">\n <!-- Avatar -->\n <div class=\"tw-w-12 tw-h-12 tw-bg-purple-100 tw-rounded-full tw-flex tw-items-center tw-justify-center tw-flex-shrink-0\">\n <cide-ele-icon class=\"tw-w-6 tw-h-6 tw-text-purple-600\">person</cide-ele-icon>\n </div>\n \n <!-- Entity Info -->\n <div class=\"tw-flex-1 tw-min-w-0\">\n <h3 class=\"tw-text-sm tw-font-semibold tw-text-gray-900 tw-whitespace-nowrap tw-overflow-hidden tw-text-ellipsis\">{{ node.syen_name }}</h3>\n <p class=\"tw-text-xs tw-text-gray-600 tw-mt-1\">{{ node.syen_entity_code }}</p>\n <p class=\"tw-text-xs tw-text-gray-500 tw-mt-1\">{{ node.syen_entity_type_sygms }}</p>\n </div>\n </div>\n \n <!-- Action Icons -->\n <div class=\"tw-flex tw-items-center tw-justify-between tw-mt-3\">\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\n <!-- Phone Icon -->\n <button class=\"tw-w-6 tw-h-6 tw-rounded-full tw-bg-gray-100 tw-flex tw-items-center tw-justify-center tw-text-gray-600 hover:tw-bg-gray-200 tw-transition-colors\">\n <cide-ele-icon class=\"tw-text-xs\">phone</cide-ele-icon>\n </button>\n \n <!-- Email Icon -->\n <button class=\"tw-w-6 tw-h-6 tw-rounded-full tw-bg-gray-100 tw-flex tw-items-center tw-justify-center tw-text-gray-600 hover:tw-bg-gray-200 tw-transition-colors\">\n <cide-ele-icon class=\"tw-text-xs\">email</cide-ele-icon>\n </button>\n \n <!-- LinkedIn Icon -->\n <button class=\"tw-w-6 tw-h-6 tw-rounded-full tw-bg-blue-100 tw-flex tw-items-center tw-justify-center tw-text-blue-600 hover:tw-bg-blue-200 tw-transition-colors\">\n <cide-ele-icon class=\"tw-text-xs\">attach_money</cide-ele-icon>\n </button>\n \n <!-- Document Icon -->\n <button class=\"tw-w-6 tw-h-6 tw-rounded-full tw-bg-gray-100 tw-flex tw-items-center tw-justify-center tw-text-gray-600 hover:tw-bg-gray-200 tw-transition-colors\">\n <cide-ele-icon class=\"tw-text-xs\">description</cide-ele-icon>\n </button>\n \n <!-- More Options Icon -->\n <button class=\"tw-w-6 tw-h-6 tw-rounded-full tw-bg-gray-100 tw-flex tw-items-center tw-justify-center tw-text-gray-600 hover:tw-bg-gray-200 tw-transition-colors\">\n <cide-ele-icon class=\"tw-text-xs\">more_horiz</cide-ele-icon>\n </button>\n </div>\n \n <!-- Status Badge -->\n <div class=\"tw-flex-shrink-0\">\n @if (node.syen_isactive) {\n <div class=\"tw-inline-flex tw-items-center tw-px-1.5 tw-py-0.5 tw-rounded-full tw-text-xs tw-font-medium tw-bg-green-100 tw-text-green-800\">\n <div class=\"tw-w-1.5 tw-h-1.5 tw-bg-green-500 tw-rounded-full tw-mr-1\"></div>\n Active\n </div>\n } @else {\n <div class=\"tw-inline-flex tw-items-center tw-px-1.5 tw-py-0.5 tw-rounded-full tw-text-xs tw-font-medium tw-bg-red-100 tw-text-red-800\">\n <div class=\"tw-w-1.5 tw-h-1.5 tw-bg-red-500 tw-rounded-full tw-mr-1\"></div>\n Inactive\n </div>\n }\n </div>\n </div>\n </div>\n \n <!-- Children Entities (Recursive) -->\n @if (node.children && node.children.length > 0) {\n <!-- Flexible Connection Lines -->\n <div class=\"tw-relative tw-flex tw-flex-col tw-items-center tw-mt-4\">\n <!-- Connection dot -->\n <div class=\"tw-absolute tw-left-1/2 tw-transform tw--translate-x-1/2\" style=\"top: -8px;\">\n <div class=\"tw-w-2 tw-h-2 tw-bg-purple-600 tw-rounded-full tw-border tw-border-white\"></div>\n </div>\n \n <!-- Flexible SVG Lines -->\n <div class=\"tw-relative tw-w-full tw-flex tw-justify-center flexible-connection-lines\">\n @if (node.children && node.children.length === 1) {\n <!-- Single child - simple vertical line -->\n <svg class=\"tw-absolute tw-left-1/2\" style=\"transform: translateX(-50%); width: 2px; height: 40px; top: 0;\">\n <line x1=\"1\" y1=\"0\" x2=\"1\" y2=\"40\" stroke=\"#9333ea\" stroke-width=\"2\" stroke-linecap=\"round\"/>\n </svg>\n }\n @else if (node.children && node.children.length > 1) {\n <!-- Multiple children - flexible design -->\n <svg class=\"tw-absolute tw-left-1/2\" style=\"transform: translateX(-50%); width: 100%; height: 40px; top: 0;\">\n <!-- Vertical line from parent -->\n <line x1=\"50%\" y1=\"0\" x2=\"50%\" y2=\"15\" stroke=\"#9333ea\" stroke-width=\"2\" stroke-linecap=\"round\"/>\n \n <!-- Horizontal line spanning children -->\n <line x1=\"20%\" y1=\"15\" x2=\"80%\" y2=\"15\" stroke=\"#9333ea\" stroke-width=\"2\" stroke-linecap=\"round\"/>\n \n <!-- Vertical lines to children -->\n @for (child of node.children; track child._id; let i = $index) {\n <line [attr.x1]=\"(20 + (60 * i) / (node.children.length - 1)) + '%'\" \n y1=\"15\" \n [attr.x2]=\"(20 + (60 * i) / (node.children.length - 1)) + '%'\" \n y2=\"35\" \n stroke=\"#9333ea\" \n stroke-width=\"2\" \n stroke-linecap=\"round\"/>\n <!-- Connection dot -->\n <circle [attr.cx]=\"(20 + (60 * i) / (node.children.length - 1)) + '%'\" cy=\"35\" r=\"2.5\" fill=\"#9333ea\" stroke=\"#fff\" stroke-width=\"1\"/>\n }\n </svg>\n }\n </div>\n \n <!-- Children Container - Flexible Layout -->\n <div class=\"tw-flex tw-flex-wrap tw-justify-center tw-gap-4 tw-w-full tw-max-w-6xl tw-px-4 children-container\">\n @for (child of node.children; track child._id) {\n <div class=\"tw-flex tw-flex-col tw-items-center tw-flex-shrink-0\">\n <!-- Child node -->\n <ng-container [ngTemplateOutlet]=\"entityNodeTemplate\" [ngTemplateOutletContext]=\"{ $implicit: child, level: level + 1 }\"></ng-container>\n </div>\n }\n </div>\n </div>\n }\n </div>\n</ng-template>\n","/*\n * Public API Surface of cloud-ide-shared\n */\n\nexport * from './lib/cloud-ide-shared';\n\n// Guards\nexport * from './lib/guards/auth.guard';\n\n// Services\nexport * from './lib/services/auth.service.interface';\nexport * from './lib/services/shared-object-id.service';\nexport * from './lib/services/general-master-type.service';\nexport * from './lib/services/general-master.service';\n\n// Components\nexport * from './lib/components/org-structure/org-structure.component';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
package/index.d.ts CHANGED
@@ -1,13 +1,13 @@
1
- import * as _angular_core from '@angular/core';
1
+ import * as i0 from '@angular/core';
2
2
  import { InjectionToken, OnInit } from '@angular/core';
3
3
  import { CanActivateFn, Router } from '@angular/router';
4
4
  import { Observable } from 'rxjs';
5
5
  import { mongooseObjectIdCreateControllerResponse } from 'cloud-ide-element';
6
- import { MEntity, entityControllerResponse } from 'cloud-ide-lms-model';
6
+ import { ICoreSygmt, MGeneralMasterType, generalMasterTypeListControllerResponse, generalMasterTypeInsertUpdateControllerResponse, generalMasterTypeByIdControllerResponse, generalMasterTypeDeleteControllerResponse, generalMasterTypeToggleStatusControllerResponse, ICoreSygms, IGeneralMasterListRequest, generalMasterListControllerResponse, generalMasterInsertUpdateControllerResponse, generalMasterByIdControllerResponse, generalMasterDeleteControllerResponse, generalMasterToggleStatusControllerResponse, MEntity, entityControllerResponse, CoreSystemEntityListResponse } from 'cloud-ide-lms-model';
7
7
 
8
8
  declare class CloudIdeShared {
9
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<CloudIdeShared, never>;
10
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<CloudIdeShared, "lib-cloud-ide-shared", never, {}, {}, never, never, true, never>;
9
+ static ɵfac: i0.ɵɵFactoryDeclaration<CloudIdeShared, never>;
10
+ static ɵcmp: i0.ɵɵComponentDeclaration<CloudIdeShared, "lib-cloud-ide-shared", never, {}, {}, never, never, true, never>;
11
11
  }
12
12
 
13
13
  declare const authGuard: CanActivateFn;
@@ -150,36 +150,139 @@ declare class SharedObjectIdService {
150
150
  description: string;
151
151
  internalService: string;
152
152
  };
153
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<SharedObjectIdService, never>;
154
- static ɵprov: _angular_core.ɵɵInjectableDeclaration<SharedObjectIdService>;
153
+ static ɵfac: i0.ɵɵFactoryDeclaration<SharedObjectIdService, never>;
154
+ static ɵprov: i0.ɵɵInjectableDeclaration<SharedObjectIdService>;
155
155
  }
156
156
 
157
- interface OrgStructureNode {
158
- _id: string;
159
- syen_name: string;
160
- syen_entity_code: string;
161
- syen_entity_type_sygms: string;
162
- syen_isactive: boolean;
163
- children?: OrgStructureNode[];
164
- level: number;
165
- parentId?: string;
157
+ declare class CideCoreGeneralMasterTypeService {
158
+ private http;
159
+ private generalMasterTypeListSubject;
160
+ generalMasterTypeList$: Observable<ICoreSygmt[]>;
161
+ constructor();
162
+ /**
163
+ * Get general master type list from API
164
+ */
165
+ getTypeList(body: MGeneralMasterType): Observable<generalMasterTypeListControllerResponse>;
166
+ /**
167
+ * Get general master type list from cache (if available)
168
+ */
169
+ getTypeListFromCache(): ICoreSygmt[];
170
+ /**
171
+ * Create or update general master type
172
+ * POST ${coreRoutesUrl?.generalMasterType} - payload: IGeneralMasterTypeCreateUpdatePayload, response: generalMasterTypeInsertUpdateControllerResponse
173
+ * If type._id exists, it will update; otherwise, it will create a new type
174
+ */
175
+ saveType(type: ICoreSygmt): Observable<generalMasterTypeInsertUpdateControllerResponse>;
176
+ /**
177
+ * Get general master type by ID
178
+ * GET ${coreRoutesUrl?.generalMasterType}/byId/:query - payload: { sygmt_id: string }, response: generalMasterTypeByIdControllerResponse
179
+ */
180
+ getTypeById(id: string): Observable<generalMasterTypeByIdControllerResponse>;
181
+ /**
182
+ * Delete general master type
183
+ * DELETE ${coreRoutesUrl?.generalMasterType}/:query - payload: { sygmt_id: string }, response: generalMasterTypeDeleteControllerResponse
184
+ */
185
+ deleteType(id: string): Observable<generalMasterTypeDeleteControllerResponse>;
186
+ /**
187
+ * Toggle general master type active status
188
+ */
189
+ toggleTypeStatus(id: string): Observable<generalMasterTypeToggleStatusControllerResponse>;
190
+ /**
191
+ * Check if type code exists
192
+ */
193
+ checkTypeCodeExists(code: string, excludeId?: string): Observable<{
194
+ success: boolean;
195
+ message: string;
196
+ exists: boolean;
197
+ }>;
198
+ /**
199
+ * Refresh general master type list from server
200
+ */
201
+ private refreshTypeList;
202
+ /**
203
+ * Handle errors
204
+ */
205
+ private handleError;
206
+ static ɵfac: i0.ɵɵFactoryDeclaration<CideCoreGeneralMasterTypeService, never>;
207
+ static ɵprov: i0.ɵɵInjectableDeclaration<CideCoreGeneralMasterTypeService>;
166
208
  }
209
+
210
+ declare class CideCoreGeneralMasterService {
211
+ private http;
212
+ private generalMasterListSubject;
213
+ generalMasterList$: Observable<ICoreSygms[]>;
214
+ constructor();
215
+ /**
216
+ * Get general master list from API
217
+ */
218
+ getMasterList(payload: IGeneralMasterListRequest): Observable<generalMasterListControllerResponse>;
219
+ /**
220
+ * Get general master list from cache (if available)
221
+ */
222
+ getMasterListFromCache(): ICoreSygms[];
223
+ /**
224
+ * Save general master (create or update)
225
+ * POST ${coreRoutesUrl?.generalMaster} - payload: ICoreSygms, response: generalMasterInsertUpdateControllerResponse
226
+ */
227
+ saveMaster(master: ICoreSygms): Observable<generalMasterInsertUpdateControllerResponse>;
228
+ /**
229
+ * Create new general master (backward compatibility)
230
+ */
231
+ createMaster(master: ICoreSygms): Observable<generalMasterInsertUpdateControllerResponse>;
232
+ /**
233
+ * Update existing general master (backward compatibility)
234
+ */
235
+ updateMaster(id: string, master: ICoreSygms): Observable<generalMasterInsertUpdateControllerResponse>;
236
+ /**
237
+ * Get general master by ID
238
+ * GET ${coreRoutesUrl?.generalMaster}/byId/:query - payload: { sygms_id: string }, response: generalMasterByIdControllerResponse
239
+ */
240
+ getMasterById(id: string): Observable<generalMasterByIdControllerResponse>;
241
+ /**
242
+ * Delete general master
243
+ * DELETE ${coreRoutesUrl?.generalMaster}/:query - payload: { sygms_id: string }, response: generalMasterDeleteControllerResponse
244
+ */
245
+ deleteMaster(id: string): Observable<generalMasterDeleteControllerResponse>;
246
+ /**
247
+ * Toggle general master active status
248
+ */
249
+ toggleMasterStatus(id: string): Observable<generalMasterToggleStatusControllerResponse>;
250
+ /**
251
+ * Check if master code exists
252
+ */
253
+ checkMasterCodeExists(code: string, typeId: string, excludeId?: string): Observable<{
254
+ success: boolean;
255
+ message: string;
256
+ exists: boolean;
257
+ }>;
258
+ /**
259
+ * Refresh general master list from server
260
+ */
261
+ private refreshMasterList;
262
+ /**
263
+ * Handle errors
264
+ */
265
+ private handleError;
266
+ static ɵfac: i0.ɵɵFactoryDeclaration<CideCoreGeneralMasterService, never>;
267
+ static ɵprov: i0.ɵɵInjectableDeclaration<CideCoreGeneralMasterService>;
268
+ }
269
+
167
270
  interface IEntityService {
168
271
  getEntityList(params: MEntity): Observable<entityControllerResponse>;
169
272
  }
170
273
  declare const ENTITY_SERVICE_TOKEN: InjectionToken<IEntityService>;
171
274
  declare class CideSharedOrgStructureComponent implements OnInit {
172
- allowSwitching: _angular_core.InputSignal<boolean>;
173
- showActions: _angular_core.InputSignal<boolean>;
174
- mode: _angular_core.InputSignal<"selection" | "view">;
175
- entityClick: _angular_core.OutputEmitterRef<OrgStructureNode>;
176
- entitySelect: _angular_core.OutputEmitterRef<OrgStructureNode>;
177
- entityView: _angular_core.OutputEmitterRef<OrgStructureNode>;
275
+ allowSwitching: i0.InputSignal<boolean>;
276
+ showActions: i0.InputSignal<boolean>;
277
+ mode: i0.InputSignal<"selection" | "view">;
278
+ entityClick: i0.OutputEmitterRef<CoreSystemEntityListResponse>;
279
+ entitySelect: i0.OutputEmitterRef<CoreSystemEntityListResponse>;
280
+ entityView: i0.OutputEmitterRef<CoreSystemEntityListResponse>;
178
281
  private entityService;
179
282
  router: Router;
180
- loading: _angular_core.WritableSignal<boolean>;
181
- error: _angular_core.WritableSignal<string | null>;
182
- orgStructure: _angular_core.WritableSignal<OrgStructureNode[]>;
283
+ loading: i0.WritableSignal<boolean>;
284
+ error: i0.WritableSignal<string | null>;
285
+ orgStructure: i0.WritableSignal<CoreSystemEntityListResponse[]>;
183
286
  ngOnInit(): void;
184
287
  /**
185
288
  * Load organization structure
@@ -209,9 +312,9 @@ declare class CideSharedOrgStructureComponent implements OnInit {
209
312
  * Edit entity
210
313
  */
211
314
  editEntity(entityId: string): void;
212
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<CideSharedOrgStructureComponent, never>;
213
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<CideSharedOrgStructureComponent, "cide-shared-org-structure", never, { "allowSwitching": { "alias": "allowSwitching"; "required": false; "isSignal": true; }; "showActions": { "alias": "showActions"; "required": false; "isSignal": true; }; "mode": { "alias": "mode"; "required": false; "isSignal": true; }; }, { "entityClick": "entityClick"; "entitySelect": "entitySelect"; "entityView": "entityView"; }, never, never, true, never>;
315
+ static ɵfac: i0.ɵɵFactoryDeclaration<CideSharedOrgStructureComponent, never>;
316
+ static ɵcmp: i0.ɵɵComponentDeclaration<CideSharedOrgStructureComponent, "cide-shared-org-structure", never, { "allowSwitching": { "alias": "allowSwitching"; "required": false; "isSignal": true; }; "showActions": { "alias": "showActions"; "required": false; "isSignal": true; }; "mode": { "alias": "mode"; "required": false; "isSignal": true; }; }, { "entityClick": "entityClick"; "entitySelect": "entitySelect"; "entityView": "entityView"; }, never, never, true, never>;
214
317
  }
215
318
 
216
- export { APP_STATE_SERVICE_TOKEN, AUTH_SERVICE_TOKEN, CideSharedOrgStructureComponent, CloudIdeShared, ENTITY_SERVICE_TOKEN, SharedObjectIdService, authGuard };
217
- export type { IAppStateService, IAuthService, IEntityService, OrgStructureNode };
319
+ export { APP_STATE_SERVICE_TOKEN, AUTH_SERVICE_TOKEN, CideCoreGeneralMasterService, CideCoreGeneralMasterTypeService, CideSharedOrgStructureComponent, CloudIdeShared, ENTITY_SERVICE_TOKEN, SharedObjectIdService, authGuard };
320
+ export type { IAppStateService, IAuthService, IEntityService };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cloud-ide-shared",
3
- "version": "1.0.4",
3
+ "version": "1.0.6",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^20.1.0",
6
6
  "@angular/core": "^20.1.0",