cloud-ide-layout 1.0.337 → 1.0.339

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (24) hide show
  1. package/fesm2022/{cloud-ide-layout-api-endpoint-manager.component-CabJGesJ.mjs → cloud-ide-layout-api-endpoint-manager.component-b1M-QRv0.mjs} +2 -2
  2. package/fesm2022/{cloud-ide-layout-api-endpoint-manager.component-CabJGesJ.mjs.map → cloud-ide-layout-api-endpoint-manager.component-b1M-QRv0.mjs.map} +1 -1
  3. package/fesm2022/cloud-ide-layout-cide-lyt-drawer-base.class-fqh3uHtY.mjs +41 -0
  4. package/fesm2022/cloud-ide-layout-cide-lyt-drawer-base.class-fqh3uHtY.mjs.map +1 -0
  5. package/fesm2022/{cloud-ide-layout-cloud-ide-layout-CiGurNgW.mjs → cloud-ide-layout-cloud-ide-layout-BNs30VIP.mjs} +28 -25
  6. package/fesm2022/cloud-ide-layout-cloud-ide-layout-BNs30VIP.mjs.map +1 -0
  7. package/fesm2022/{cloud-ide-layout-dashboard-manager.component-BfA8oY0m.mjs → cloud-ide-layout-dashboard-manager.component-B92CXNIp.mjs} +2 -2
  8. package/fesm2022/{cloud-ide-layout-dashboard-manager.component-BfA8oY0m.mjs.map → cloud-ide-layout-dashboard-manager.component-B92CXNIp.mjs.map} +1 -1
  9. package/fesm2022/cloud-ide-layout-drawer-docs.component-dMNtwaEn.mjs +43 -0
  10. package/fesm2022/cloud-ide-layout-drawer-docs.component-dMNtwaEn.mjs.map +1 -0
  11. package/fesm2022/cloud-ide-layout-drawer-theme.component-Cx5KfJ8Y.mjs +346 -0
  12. package/fesm2022/cloud-ide-layout-drawer-theme.component-Cx5KfJ8Y.mjs.map +1 -0
  13. package/fesm2022/{cloud-ide-layout-home-wrapper.component-B-ZvfHeg.mjs → cloud-ide-layout-home-wrapper.component-C-uiRwZ_.mjs} +2 -2
  14. package/fesm2022/{cloud-ide-layout-home-wrapper.component-B-ZvfHeg.mjs.map → cloud-ide-layout-home-wrapper.component-C-uiRwZ_.mjs.map} +1 -1
  15. package/fesm2022/cloud-ide-layout-sidedrawer-notes.component-BgmT99VO.mjs +226 -0
  16. package/fesm2022/cloud-ide-layout-sidedrawer-notes.component-BgmT99VO.mjs.map +1 -0
  17. package/fesm2022/cloud-ide-layout.mjs +1 -1
  18. package/index.d.ts +2 -0
  19. package/package.json +1 -1
  20. package/fesm2022/cloud-ide-layout-cloud-ide-layout-CiGurNgW.mjs.map +0 -1
  21. package/fesm2022/cloud-ide-layout-drawer-theme.component-NKRNKJw5.mjs +0 -346
  22. package/fesm2022/cloud-ide-layout-drawer-theme.component-NKRNKJw5.mjs.map +0 -1
  23. package/fesm2022/cloud-ide-layout-sidedrawer-notes.component-DEhojtjd.mjs +0 -256
  24. package/fesm2022/cloud-ide-layout-sidedrawer-notes.component-DEhojtjd.mjs.map +0 -1
@@ -7,7 +7,7 @@ import { FormBuilder, Validators, ReactiveFormsModule, FormsModule } from '@angu
7
7
  import { generateStringFromObject, cidePath, hostManagerRoutesUrl, coreRoutesUrl, MApiEndpointMasterGetByIdPayload, MApiEndpointMasterDeletePayload, ApiEndpointMasterSaveUpdatePayload, MApiEndpointMaster } from 'cloud-ide-lms-model';
8
8
  import { HttpClient } from '@angular/common/http';
9
9
  import { CideEleFloatingContainerService } from 'cloud-ide-element';
10
- import { C as CideLytSharedWrapperComponent } from './cloud-ide-layout-cloud-ide-layout-CiGurNgW.mjs';
10
+ import { C as CideLytSharedWrapperComponent } from './cloud-ide-layout-cloud-ide-layout-BNs30VIP.mjs';
11
11
 
12
12
  class ApiEndpointMasterService {
13
13
  http = inject(HttpClient);
@@ -285,4 +285,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
285
285
  }], ctorParameters: () => [] });
286
286
 
287
287
  export { ApiEndpointManagerComponent };
288
- //# sourceMappingURL=cloud-ide-layout-api-endpoint-manager.component-CabJGesJ.mjs.map
288
+ //# sourceMappingURL=cloud-ide-layout-api-endpoint-manager.component-b1M-QRv0.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"cloud-ide-layout-api-endpoint-manager.component-CabJGesJ.mjs","sources":["../../../projects/cloud-ide-layout/src/lib/services/api-endpoint-master.service.ts","../../../projects/cloud-ide-layout/src/lib/components/api-endpoint-manager/api-endpoint-form.component.ts","../../../projects/cloud-ide-layout/src/lib/components/api-endpoint-manager/api-endpoint-form.component.html","../../../projects/cloud-ide-layout/src/lib/components/api-endpoint-manager/api-endpoint-manager.component.ts","../../../projects/cloud-ide-layout/src/lib/components/api-endpoint-manager/api-endpoint-manager.component.html"],"sourcesContent":["import { Injectable, inject } from '@angular/core';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { Observable } from 'rxjs';\r\nimport {\r\n cidePath,\r\n coreRoutesUrl,\r\n hostManagerRoutesUrl,\r\n apiEndpointMasterControllerResponse,\r\n apiEndpointMasterByIdControllerResponse,\r\n apiEndpointMasterInsertUpdateControllerResponse,\r\n controllerResponse,\r\n MApiEndpointMaster,\r\n ApiEndpointMasterSaveUpdatePayload,\r\n generateStringFromObject,\r\n MApiEndpointMasterGetByIdPayload,\r\n MApiEndpointMasterDeletePayload\r\n} from 'cloud-ide-lms-model';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ApiEndpointMasterService {\r\n private http = inject(HttpClient);\r\n\r\n /**\r\n * Get API endpoint master list\r\n * @param payload - MApiEndpointMaster payload for filtering\r\n * @returns Observable of API endpoints list response\r\n */\r\n getApiEndpointMasterList(payload: Partial<MApiEndpointMaster>): Observable<apiEndpointMasterControllerResponse> {\r\n const query = generateStringFromObject(payload);\r\n const url = cidePath.join([\r\n hostManagerRoutesUrl.cideSuiteHost,\r\n coreRoutesUrl.module,\r\n coreRoutesUrl.apiEndpointMaster,\r\n query\r\n ]);\r\n\r\n return this.http.get(url) as Observable<apiEndpointMasterControllerResponse>;\r\n }\r\n\r\n /**\r\n * Get API endpoint by ID\r\n * @param api_id - API ID\r\n * @returns Observable of API endpoint response\r\n */\r\n getApiEndpointById(api_id: string): Observable<apiEndpointMasterByIdControllerResponse> {\r\n const payload = new MApiEndpointMasterGetByIdPayload({ api_id });\r\n const query = generateStringFromObject(payload);\r\n const url = cidePath.join([\r\n hostManagerRoutesUrl.cideSuiteHost,\r\n coreRoutesUrl.module,\r\n coreRoutesUrl.apiEndpointMaster,\r\n 'byId',\r\n query\r\n ]);\r\n\r\n return this.http.get(url) as Observable<apiEndpointMasterByIdControllerResponse>;\r\n }\r\n\r\n /**\r\n * Create or update API endpoint\r\n * @param payload - ApiEndpointMasterSaveUpdatePayload\r\n * @returns Observable of insert/update response\r\n */\r\n saveUpdateApiEndpoint(payload: ApiEndpointMasterSaveUpdatePayload): Observable<apiEndpointMasterInsertUpdateControllerResponse> {\r\n const url = cidePath.join([\r\n hostManagerRoutesUrl.cideSuiteHost,\r\n coreRoutesUrl.module,\r\n coreRoutesUrl.apiEndpointMaster\r\n ]);\r\n\r\n return this.http.post(url, payload) as Observable<apiEndpointMasterInsertUpdateControllerResponse>;\r\n }\r\n\r\n /**\r\n * Delete API endpoint\r\n * @param api_id - API ID\r\n * @returns Observable of delete response\r\n */\r\n deleteApiEndpoint(api_id: string): Observable<controllerResponse> {\r\n const payload = new MApiEndpointMasterDeletePayload({ api_id });\r\n const query = generateStringFromObject(payload);\r\n const url = cidePath.join([\r\n hostManagerRoutesUrl.cideSuiteHost,\r\n coreRoutesUrl.module,\r\n coreRoutesUrl.apiEndpointMaster,\r\n query\r\n ]);\r\n\r\n return this.http.delete(url) as Observable<controllerResponse>;\r\n }\r\n}\r\n","import { Component, inject, signal, input, output, OnInit, effect } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormBuilder, FormGroup, Validators, ReactiveFormsModule } from '@angular/forms';\r\nimport { CoreApiEndpointMaster, ApiEndpointMasterSaveUpdatePayload } from 'cloud-ide-lms-model';\r\nimport { ApiEndpointMasterService } from '../../services/api-endpoint-master.service';\r\nimport { CideEleFloatingContainerService } from 'cloud-ide-element';\r\n\r\n@Component({\r\n selector: 'app-api-endpoint-form',\r\n standalone: true,\r\n imports: [CommonModule, ReactiveFormsModule],\r\n templateUrl: './api-endpoint-form.component.html',\r\n styleUrls: ['./api-endpoint-form.component.css']\r\n})\r\nexport class ApiEndpointFormComponent implements OnInit {\r\n private fb = inject(FormBuilder);\r\n private apiService = inject(ApiEndpointMasterService);\r\n private floatingContainerService = inject(CideEleFloatingContainerService);\r\n\r\n // Inputs\r\n containerId = input<string>('');\r\n editApiData = input<CoreApiEndpointMaster | null>(null);\r\n\r\n // Outputs\r\n saved = output<void>();\r\n cancelled = output<void>();\r\n\r\n // State\r\n apiForm!: FormGroup;\r\n isSubmitting = signal<boolean>(false);\r\n errorMessage = signal<string>('');\r\n\r\n constructor() {\r\n this.initForm();\r\n\r\n // React to input changes\r\n effect(() => {\r\n const data = this.editApiData();\r\n if (data) {\r\n this.apiForm.patchValue({\r\n api_endpoint: data.api_endpoint,\r\n api_method: data.api_method,\r\n api_description: data.api_description,\r\n api_category: data.api_category,\r\n api_requires_auth: data.api_requires_auth\r\n });\r\n }\r\n });\r\n }\r\n\r\n ngOnInit(): void {\r\n // Form already initialized in constructor\r\n }\r\n\r\n private initForm() {\r\n this.apiForm = this.fb.group({\r\n api_endpoint: ['', [Validators.required]],\r\n api_method: ['GET', [Validators.required]],\r\n api_description: ['', [Validators.required]],\r\n api_category: ['', [Validators.required]],\r\n api_requires_auth: [true]\r\n });\r\n }\r\n\r\n onSubmit() {\r\n if (this.apiForm.invalid) {\r\n this.apiForm.markAllAsTouched();\r\n return;\r\n }\r\n\r\n this.isSubmitting.set(true);\r\n this.errorMessage.set('');\r\n\r\n const formValue = this.apiForm.value;\r\n const apiData: CoreApiEndpointMaster = {\r\n ...formValue\r\n };\r\n\r\n if (this.editApiData()) {\r\n apiData._id = this.editApiData()!._id;\r\n }\r\n\r\n const payload = new ApiEndpointMasterSaveUpdatePayload({\r\n core_api_endpoint_master: apiData\r\n });\r\n\r\n this.apiService.saveUpdateApiEndpoint(payload).subscribe({\r\n next: (response) => {\r\n if (response.success) {\r\n this.saved.emit();\r\n this.closeContainer();\r\n } else {\r\n this.errorMessage.set(response.message || 'Failed to save API endpoint');\r\n }\r\n this.isSubmitting.set(false);\r\n },\r\n error: (err) => {\r\n console.error('Error saving API endpoint:', err);\r\n this.errorMessage.set('An error occurred while saving');\r\n this.isSubmitting.set(false);\r\n }\r\n });\r\n }\r\n\r\n onCancel() {\r\n this.cancelled.emit();\r\n this.closeContainer();\r\n }\r\n\r\n private closeContainer() {\r\n if (this.containerId()) {\r\n this.floatingContainerService.hide(this.containerId());\r\n }\r\n }\r\n}\r\n","<div class=\"h-full flex flex-col bg-white dark:bg-gray-800\">\r\n <form [formGroup]=\"apiForm\" (ngSubmit)=\"onSubmit()\" class=\"flex-1 flex flex-col h-full\">\r\n <!-- Form Body -->\r\n <div class=\"flex-1 overflow-y-auto p-6 space-y-6\">\r\n\r\n <!-- Error Message -->\r\n <div *ngIf=\"errorMessage()\"\r\n class=\"bg-red-50 dark:bg-red-900/30 border border-red-200 dark:border-red-800 text-red-600 dark:text-red-400 p-3 rounded-lg text-sm\">\r\n {{ errorMessage() }}\r\n </div>\r\n\r\n <!-- Endpoint -->\r\n <div>\r\n <label for=\"api_endpoint\" class=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1\">\r\n Endpoint Path <span class=\"text-red-500\">*</span>\r\n </label>\r\n <input type=\"text\" id=\"api_endpoint\" formControlName=\"api_endpoint\" placeholder=\"/core/example/:id\"\r\n class=\"w-full px-3 py-2 rounded-lg border border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-700 text-gray-900 dark:text-gray-100 focus:ring-2 focus:ring-blue-500 hover:border-blue-400 outline-none transition-all font-mono text-sm\"\r\n [class.border-red-500]=\"apiForm.get('api_endpoint')?.invalid && apiForm.get('api_endpoint')?.touched\">\r\n <p *ngIf=\"apiForm.get('api_endpoint')?.invalid && apiForm.get('api_endpoint')?.touched\"\r\n class=\"mt-1 text-xs text-red-500\">\r\n Endpoint path is required\r\n </p>\r\n </div>\r\n\r\n <!-- Method -->\r\n <div>\r\n <label for=\"api_method\" class=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1\">\r\n HTTP Method\r\n </label>\r\n <select id=\"api_method\" formControlName=\"api_method\"\r\n class=\"w-full px-3 py-2 rounded-lg border border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-700 text-gray-900 dark:text-gray-100 focus:ring-2 focus:ring-blue-500 outline-none transition-all\">\r\n <option value=\"GET\">GET</option>\r\n <option value=\"POST\">POST</option>\r\n <option value=\"PUT\">PUT</option>\r\n <option value=\"DELETE\">DELETE</option>\r\n <option value=\"PATCH\">PATCH</option>\r\n </select>\r\n </div>\r\n\r\n <!-- Category -->\r\n <div>\r\n <label for=\"api_category\" class=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1\">\r\n Category <span class=\"text-red-500\">*</span>\r\n </label>\r\n <input type=\"text\" id=\"api_category\" formControlName=\"api_category\"\r\n placeholder=\"e.g. Dashboard, User Management\"\r\n class=\"w-full px-3 py-2 rounded-lg border border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-700 text-gray-900 dark:text-gray-100 focus:ring-2 focus:ring-blue-500 hover:border-blue-400 outline-none transition-all\"\r\n [class.border-red-500]=\"apiForm.get('api_category')?.invalid && apiForm.get('api_category')?.touched\">\r\n <p *ngIf=\"apiForm.get('api_category')?.invalid && apiForm.get('api_category')?.touched\"\r\n class=\"mt-1 text-xs text-red-500\">\r\n Category is required\r\n </p>\r\n </div>\r\n\r\n <!-- Description -->\r\n <div>\r\n <label for=\"api_description\" class=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1\">\r\n Description <span class=\"text-red-500\">*</span>\r\n </label>\r\n <textarea id=\"api_description\" formControlName=\"api_description\" rows=\"3\"\r\n placeholder=\"What does this endpoint do?\"\r\n class=\"w-full px-3 py-2 rounded-lg border border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-700 text-gray-900 dark:text-gray-100 focus:ring-2 focus:ring-blue-500 hover:border-blue-400 outline-none transition-all resize-none\"\r\n [class.border-red-500]=\"apiForm.get('api_description')?.invalid && apiForm.get('api_description')?.touched\"></textarea>\r\n <p *ngIf=\"apiForm.get('api_description')?.invalid && apiForm.get('api_description')?.touched\"\r\n class=\"mt-1 text-xs text-red-500\">\r\n Description is required\r\n </p>\r\n </div>\r\n\r\n <!-- Auth Required -->\r\n <div class=\"flex items-center\">\r\n <input type=\"checkbox\" id=\"api_requires_auth\" formControlName=\"api_requires_auth\"\r\n class=\"w-4 h-4 text-blue-600 border-gray-300 rounded focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-700\">\r\n <label for=\"api_requires_auth\" class=\"ml-2 block text-sm text-gray-700 dark:text-gray-300\">\r\n Requires Authentication\r\n </label>\r\n </div>\r\n\r\n </div>\r\n\r\n <!-- Footer Actions -->\r\n <div\r\n class=\"p-4 border-t border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-900/50 flex justify-end gap-3\">\r\n <button type=\"button\" (click)=\"onCancel()\"\r\n class=\"px-4 py-2 text-sm font-medium text-gray-700 dark:text-gray-300 bg-white dark:bg-gray-800 border border-gray-300 dark:border-gray-600 rounded-lg hover:bg-gray-50 dark:hover:bg-gray-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-gray-500 transition-colors\">\r\n Cancel\r\n </button>\r\n <button type=\"submit\" [disabled]=\"isSubmitting() || apiForm.invalid || apiForm.pristine\"\r\n class=\"px-4 py-2 text-sm font-medium text-white bg-blue-600 rounded-lg hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 disabled:opacity-50 disabled:cursor-not-allowed transition-colors flex items-center gap-2\">\r\n <span *ngIf=\"isSubmitting()\"\r\n class=\"w-4 h-4 border-2 border-white/30 border-t-white rounded-full animate-spin\"></span>\r\n {{ editApiData() ? 'Update' : 'Create' }}\r\n </button>\r\n </div>\r\n </form>\r\n</div>","import { Component, inject, signal, OnInit } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport {\n CoreApiEndpointMaster,\n MApiEndpointMaster,\n ApiEndpointMasterListResponse\n} from 'cloud-ide-lms-model';\nimport { ApiEndpointMasterService } from '../../services/api-endpoint-master.service';\nimport { CideEleFloatingContainerService, FloatingContainerConfig } from 'cloud-ide-element';\nimport { ApiEndpointFormComponent } from './api-endpoint-form.component';\nimport { CideLytSharedWrapperComponent } from '../../layout/shared/shared-wrapper/shared-wrapper.component';\n\n@Component({\n selector: 'app-api-endpoint-manager',\n standalone: true,\n imports: [CommonModule, FormsModule, ReactiveFormsModule, CideLytSharedWrapperComponent],\n templateUrl: './api-endpoint-manager.component.html',\n styleUrls: ['./api-endpoint-manager.component.css']\n})\nexport class ApiEndpointManagerComponent implements OnInit {\n private apiService = inject(ApiEndpointMasterService);\n private floatingContainerService = inject(CideEleFloatingContainerService);\n\n shared_wrapper_setup_param = {\n sypg_page_code: \"cide_lyt_api_endpoint_manager\"\n };\n\n // Signals\n apiList = signal<ApiEndpointMasterListResponse[]>([]);\n totalRecords = signal<number>(0);\n loading = signal<boolean>(false);\n searchQuery = signal<string>('');\n\n // Pagination\n pageSize = signal<number>(20);\n pageIndex = signal<number>(1);\n\n constructor() {\n // Register the form component with the floating container service\n this.floatingContainerService.registerComponent('api-endpoint-form', ApiEndpointFormComponent);\n }\n\n ngOnInit(): void {\n this.loadApiList();\n }\n\n loadApiList() {\n this.loading.set(true);\n const payload = new MApiEndpointMaster({\n query: this.searchQuery(),\n pageSize: this.pageSize(),\n pageIndex: this.pageIndex()\n });\n\n this.apiService.getApiEndpointMasterList(payload).subscribe({\n next: (response) => {\n if (response.success && response.data) {\n this.apiList.set(response.data);\n this.totalRecords.set(response.total || 0);\n } else {\n this.apiList.set([]);\n this.totalRecords.set(0);\n }\n this.loading.set(false);\n },\n error: (err) => {\n console.error('Error fetching API list:', err);\n this.loading.set(false);\n }\n });\n }\n\n onSearch(query: string) {\n this.searchQuery.set(query);\n this.pageIndex.set(1);\n this.loadApiList();\n }\n\n onPageChange(page: number) {\n this.pageIndex.set(page);\n this.loadApiList();\n }\n\n openApiForm(apiData?: CoreApiEndpointMaster | ApiEndpointMasterListResponse) {\n const config: FloatingContainerConfig = {\n id: apiData ? `edit-api-${apiData._id}` : 'new-api-endpoint',\n title: apiData ? 'Edit API Endpoint' : 'Add New API Endpoint',\n width: '500px',\n height: 'auto',\n minWidth: '400px',\n minHeight: '300px',\n backdrop: true,\n componentId: 'api-endpoint-form',\n componentConfig: {\n inputs: {\n containerId: signal(apiData ? `edit-api-${apiData._id}` : 'new-api-endpoint'),\n editApiData: signal(apiData || null)\n },\n outputs: {\n saved: () => {\n this.loadApiList();\n },\n cancelled: () => {\n // Container handles closing\n }\n }\n }\n };\n\n this.floatingContainerService.show(config);\n }\n\n deleteApi(apiId?: string) {\n if (!apiId) {\n console.error('API endpoint id is missing');\n return;\n }\n\n if (confirm('Are you sure you want to delete this API endpoint?')) {\n this.apiService.deleteApiEndpoint(apiId).subscribe({\n next: (response) => {\n if (response.success) {\n this.loadApiList();\n }\n },\n error: (err) => {\n console.error('Error deleting API endpoint:', err);\n }\n });\n }\n }\n}\n","<cide-lyt-shared-wrapper [shared_wrapper_setup_param]=\"shared_wrapper_setup_param\">\r\n <!-- Breadcrumb Actions -->\r\n <div breadcrumb-actions>\r\n <button (click)=\"openApiForm()\"\r\n class=\"bg-blue-600 hover:bg-blue-700 text-white px-4 py-2 rounded-lg flex items-center gap-2 transition-colors\">\r\n <i class=\"cide-icon-plus\"></i>\r\n <span>Add New Endpoint</span>\r\n </button>\r\n </div>\r\n\r\n <!-- Main Content -->\r\n <div class=\"h-full flex flex-col bg-gray-50 dark:bg-gray-900 p-4\">\r\n\r\n <!-- Search & Filter -->\r\n <div class=\"mb-6\">\r\n <div class=\"relative max-w-md\">\r\n <input type=\"text\" [ngModel]=\"searchQuery()\" (ngModelChange)=\"onSearch($event)\"\r\n placeholder=\"Search endpoints, descriptions...\"\r\n class=\"w-full pl-10 pr-4 py-2 rounded-lg border border-gray-300 dark:border-gray-700 bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100 focus:ring-2 focus:ring-blue-500 focus:border-transparent outline-none transition-all\">\r\n <i class=\"cide-icon-search absolute left-3 top-1/2 -translate-y-1/2 text-gray-400\"></i>\r\n </div>\r\n </div>\r\n\r\n <!-- Data Table -->\r\n <div\r\n class=\"flex-1 overflow-hidden bg-white dark:bg-gray-800 rounded-xl shadow-sm border border-gray-200 dark:border-gray-700 flex flex-col\">\r\n <div class=\"overflow-x-auto flex-1\">\r\n <table class=\"w-full text-left border-collapse\">\r\n <thead class=\"bg-gray-50 dark:bg-gray-900/50 sticky top-0 z-10\">\r\n <tr>\r\n <th\r\n class=\"p-4 text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wider border-b border-gray-200 dark:border-gray-700\">\r\n Method</th>\r\n <th\r\n class=\"p-4 text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wider border-b border-gray-200 dark:border-gray-700\">\r\n Endpoint</th>\r\n <th\r\n class=\"p-4 text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wider border-b border-gray-200 dark:border-gray-700\">\r\n Description</th>\r\n <th\r\n class=\"p-4 text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wider border-b border-gray-200 dark:border-gray-700\">\r\n Category</th>\r\n <th\r\n class=\"p-4 text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wider border-b border-gray-200 dark:border-gray-700 text-center\">\r\n Auth</th>\r\n <th\r\n class=\"p-4 text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wider border-b border-gray-200 dark:border-gray-700 text-right\">\r\n Actions</th>\r\n </tr>\r\n </thead>\r\n <tbody class=\"divide-y divide-gray-200 dark:divide-gray-700\">\r\n <tr *ngFor=\"let api of apiList()\"\r\n class=\"hover:bg-gray-50 dark:hover:bg-gray-700/50 transition-colors\">\r\n <td class=\"p-4 whitespace-nowrap\">\r\n <span class=\"px-2 py-1 text-xs font-bold rounded\" [ngClass]=\"{\r\n 'bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400': api.api_method === 'GET',\r\n 'bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400': api.api_method === 'POST',\r\n 'bg-yellow-100 text-yellow-700 dark:bg-yellow-900/30 dark:text-yellow-400': api.api_method === 'PUT',\r\n 'bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400': api.api_method === 'DELETE',\r\n 'bg-purple-100 text-purple-700 dark:bg-purple-900/30 dark:text-purple-400': api.api_method === 'PATCH'\r\n }\">\r\n {{ api.api_method }}\r\n </span>\r\n </td>\r\n <td class=\"p-4 text-sm font-medium text-gray-900 dark:text-gray-100 font-mono\">{{\r\n api.api_endpoint }}</td>\r\n <td class=\"p-4 text-sm text-gray-500 dark:text-gray-400 max-w-xs truncate\"\r\n title=\"{{ api.api_description }}\">{{ api.api_description }}</td>\r\n <td class=\"p-4 text-sm text-gray-500 dark:text-gray-400\">\r\n <span\r\n class=\"inline-flex items-center px-2 py-0.5 rounded text-xs font-medium bg-gray-100 text-gray-800 dark:bg-gray-700 dark:text-gray-300\">\r\n {{ api.api_category }}\r\n </span>\r\n </td>\r\n <td class=\"p-4 text-center\">\r\n <i class=\"text-sm\"\r\n [ngClass]=\"api.api_requires_auth ? 'cide-icon-lock text-green-500' : 'cide-icon-unlock text-gray-400'\"></i>\r\n </td>\r\n <td class=\"p-4 text-right whitespace-nowrap\">\r\n <button (click)=\"openApiForm(api)\"\r\n class=\"text-blue-600 hover:text-blue-800 p-1 mr-2 transition-colors\" title=\"Edit\">\r\n <i class=\"cide-icon-edit\"></i>\r\n </button>\r\n <button (click)=\"deleteApi(api._id)\"\r\n class=\"text-red-600 hover:text-red-800 p-1 transition-colors\" title=\"Delete\">\r\n <i class=\"cide-icon-trash\"></i>\r\n </button>\r\n </td>\r\n </tr>\r\n <tr *ngIf=\"apiList().length === 0 && !loading()\">\r\n <td colspan=\"6\" class=\"p-8 text-center text-gray-500 dark:text-gray-400\">\r\n <div class=\"flex flex-col items-center\">\r\n <i class=\"cide-icon-database text-4xl mb-3 opacity-50\"></i>\r\n <p>No API endpoints found</p>\r\n </div>\r\n </td>\r\n </tr>\r\n <tr *ngIf=\"loading()\">\r\n <td colspan=\"6\" class=\"p-8 text-center\">\r\n <div class=\"flex justify-center\">\r\n <div class=\"animate-spin rounded-full h-8 w-8 border-b-2 border-blue-600\"></div>\r\n </div>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n <!-- Footer / Pagination -->\r\n <div\r\n class=\"p-4 border-t border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-900/50 flex justify-between items-center text-sm text-gray-600 dark:text-gray-400\">\r\n <span>Showing {{ apiList().length }} of {{ totalRecords() }} endpoints</span>\r\n <div class=\"flex gap-2\">\r\n <button [disabled]=\"pageIndex() <= 1\" (click)=\"onPageChange(pageIndex() - 1)\"\r\n class=\"px-3 py-1 rounded border border-gray-300 dark:border-gray-600 disabled:opacity-50 hover:bg-gray-100 dark:hover:bg-gray-800 transition-colors\">\r\n Previous\r\n </button>\r\n <button [disabled]=\"apiList().length < pageSize()\" (click)=\"onPageChange(pageIndex() + 1)\"\r\n class=\"px-3 py-1 rounded border border-gray-300 dark:border-gray-600 disabled:opacity-50 hover:bg-gray-100 dark:hover:bg-gray-800 transition-colors\">\r\n Next\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</cide-lyt-shared-wrapper>"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cloud-ide-layout-api-endpoint-manager.component-b1M-QRv0.mjs","sources":["../../../projects/cloud-ide-layout/src/lib/services/api-endpoint-master.service.ts","../../../projects/cloud-ide-layout/src/lib/components/api-endpoint-manager/api-endpoint-form.component.ts","../../../projects/cloud-ide-layout/src/lib/components/api-endpoint-manager/api-endpoint-form.component.html","../../../projects/cloud-ide-layout/src/lib/components/api-endpoint-manager/api-endpoint-manager.component.ts","../../../projects/cloud-ide-layout/src/lib/components/api-endpoint-manager/api-endpoint-manager.component.html"],"sourcesContent":["import { Injectable, inject } from '@angular/core';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { Observable } from 'rxjs';\r\nimport {\r\n cidePath,\r\n coreRoutesUrl,\r\n hostManagerRoutesUrl,\r\n apiEndpointMasterControllerResponse,\r\n apiEndpointMasterByIdControllerResponse,\r\n apiEndpointMasterInsertUpdateControllerResponse,\r\n controllerResponse,\r\n MApiEndpointMaster,\r\n ApiEndpointMasterSaveUpdatePayload,\r\n generateStringFromObject,\r\n MApiEndpointMasterGetByIdPayload,\r\n MApiEndpointMasterDeletePayload\r\n} from 'cloud-ide-lms-model';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ApiEndpointMasterService {\r\n private http = inject(HttpClient);\r\n\r\n /**\r\n * Get API endpoint master list\r\n * @param payload - MApiEndpointMaster payload for filtering\r\n * @returns Observable of API endpoints list response\r\n */\r\n getApiEndpointMasterList(payload: Partial<MApiEndpointMaster>): Observable<apiEndpointMasterControllerResponse> {\r\n const query = generateStringFromObject(payload);\r\n const url = cidePath.join([\r\n hostManagerRoutesUrl.cideSuiteHost,\r\n coreRoutesUrl.module,\r\n coreRoutesUrl.apiEndpointMaster,\r\n query\r\n ]);\r\n\r\n return this.http.get(url) as Observable<apiEndpointMasterControllerResponse>;\r\n }\r\n\r\n /**\r\n * Get API endpoint by ID\r\n * @param api_id - API ID\r\n * @returns Observable of API endpoint response\r\n */\r\n getApiEndpointById(api_id: string): Observable<apiEndpointMasterByIdControllerResponse> {\r\n const payload = new MApiEndpointMasterGetByIdPayload({ api_id });\r\n const query = generateStringFromObject(payload);\r\n const url = cidePath.join([\r\n hostManagerRoutesUrl.cideSuiteHost,\r\n coreRoutesUrl.module,\r\n coreRoutesUrl.apiEndpointMaster,\r\n 'byId',\r\n query\r\n ]);\r\n\r\n return this.http.get(url) as Observable<apiEndpointMasterByIdControllerResponse>;\r\n }\r\n\r\n /**\r\n * Create or update API endpoint\r\n * @param payload - ApiEndpointMasterSaveUpdatePayload\r\n * @returns Observable of insert/update response\r\n */\r\n saveUpdateApiEndpoint(payload: ApiEndpointMasterSaveUpdatePayload): Observable<apiEndpointMasterInsertUpdateControllerResponse> {\r\n const url = cidePath.join([\r\n hostManagerRoutesUrl.cideSuiteHost,\r\n coreRoutesUrl.module,\r\n coreRoutesUrl.apiEndpointMaster\r\n ]);\r\n\r\n return this.http.post(url, payload) as Observable<apiEndpointMasterInsertUpdateControllerResponse>;\r\n }\r\n\r\n /**\r\n * Delete API endpoint\r\n * @param api_id - API ID\r\n * @returns Observable of delete response\r\n */\r\n deleteApiEndpoint(api_id: string): Observable<controllerResponse> {\r\n const payload = new MApiEndpointMasterDeletePayload({ api_id });\r\n const query = generateStringFromObject(payload);\r\n const url = cidePath.join([\r\n hostManagerRoutesUrl.cideSuiteHost,\r\n coreRoutesUrl.module,\r\n coreRoutesUrl.apiEndpointMaster,\r\n query\r\n ]);\r\n\r\n return this.http.delete(url) as Observable<controllerResponse>;\r\n }\r\n}\r\n","import { Component, inject, signal, input, output, OnInit, effect } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormBuilder, FormGroup, Validators, ReactiveFormsModule } from '@angular/forms';\r\nimport { CoreApiEndpointMaster, ApiEndpointMasterSaveUpdatePayload } from 'cloud-ide-lms-model';\r\nimport { ApiEndpointMasterService } from '../../services/api-endpoint-master.service';\r\nimport { CideEleFloatingContainerService } from 'cloud-ide-element';\r\n\r\n@Component({\r\n selector: 'app-api-endpoint-form',\r\n standalone: true,\r\n imports: [CommonModule, ReactiveFormsModule],\r\n templateUrl: './api-endpoint-form.component.html',\r\n styleUrls: ['./api-endpoint-form.component.css']\r\n})\r\nexport class ApiEndpointFormComponent implements OnInit {\r\n private fb = inject(FormBuilder);\r\n private apiService = inject(ApiEndpointMasterService);\r\n private floatingContainerService = inject(CideEleFloatingContainerService);\r\n\r\n // Inputs\r\n containerId = input<string>('');\r\n editApiData = input<CoreApiEndpointMaster | null>(null);\r\n\r\n // Outputs\r\n saved = output<void>();\r\n cancelled = output<void>();\r\n\r\n // State\r\n apiForm!: FormGroup;\r\n isSubmitting = signal<boolean>(false);\r\n errorMessage = signal<string>('');\r\n\r\n constructor() {\r\n this.initForm();\r\n\r\n // React to input changes\r\n effect(() => {\r\n const data = this.editApiData();\r\n if (data) {\r\n this.apiForm.patchValue({\r\n api_endpoint: data.api_endpoint,\r\n api_method: data.api_method,\r\n api_description: data.api_description,\r\n api_category: data.api_category,\r\n api_requires_auth: data.api_requires_auth\r\n });\r\n }\r\n });\r\n }\r\n\r\n ngOnInit(): void {\r\n // Form already initialized in constructor\r\n }\r\n\r\n private initForm() {\r\n this.apiForm = this.fb.group({\r\n api_endpoint: ['', [Validators.required]],\r\n api_method: ['GET', [Validators.required]],\r\n api_description: ['', [Validators.required]],\r\n api_category: ['', [Validators.required]],\r\n api_requires_auth: [true]\r\n });\r\n }\r\n\r\n onSubmit() {\r\n if (this.apiForm.invalid) {\r\n this.apiForm.markAllAsTouched();\r\n return;\r\n }\r\n\r\n this.isSubmitting.set(true);\r\n this.errorMessage.set('');\r\n\r\n const formValue = this.apiForm.value;\r\n const apiData: CoreApiEndpointMaster = {\r\n ...formValue\r\n };\r\n\r\n if (this.editApiData()) {\r\n apiData._id = this.editApiData()!._id;\r\n }\r\n\r\n const payload = new ApiEndpointMasterSaveUpdatePayload({\r\n core_api_endpoint_master: apiData\r\n });\r\n\r\n this.apiService.saveUpdateApiEndpoint(payload).subscribe({\r\n next: (response) => {\r\n if (response.success) {\r\n this.saved.emit();\r\n this.closeContainer();\r\n } else {\r\n this.errorMessage.set(response.message || 'Failed to save API endpoint');\r\n }\r\n this.isSubmitting.set(false);\r\n },\r\n error: (err) => {\r\n console.error('Error saving API endpoint:', err);\r\n this.errorMessage.set('An error occurred while saving');\r\n this.isSubmitting.set(false);\r\n }\r\n });\r\n }\r\n\r\n onCancel() {\r\n this.cancelled.emit();\r\n this.closeContainer();\r\n }\r\n\r\n private closeContainer() {\r\n if (this.containerId()) {\r\n this.floatingContainerService.hide(this.containerId());\r\n }\r\n }\r\n}\r\n","<div class=\"h-full flex flex-col bg-white dark:bg-gray-800\">\r\n <form [formGroup]=\"apiForm\" (ngSubmit)=\"onSubmit()\" class=\"flex-1 flex flex-col h-full\">\r\n <!-- Form Body -->\r\n <div class=\"flex-1 overflow-y-auto p-6 space-y-6\">\r\n\r\n <!-- Error Message -->\r\n <div *ngIf=\"errorMessage()\"\r\n class=\"bg-red-50 dark:bg-red-900/30 border border-red-200 dark:border-red-800 text-red-600 dark:text-red-400 p-3 rounded-lg text-sm\">\r\n {{ errorMessage() }}\r\n </div>\r\n\r\n <!-- Endpoint -->\r\n <div>\r\n <label for=\"api_endpoint\" class=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1\">\r\n Endpoint Path <span class=\"text-red-500\">*</span>\r\n </label>\r\n <input type=\"text\" id=\"api_endpoint\" formControlName=\"api_endpoint\" placeholder=\"/core/example/:id\"\r\n class=\"w-full px-3 py-2 rounded-lg border border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-700 text-gray-900 dark:text-gray-100 focus:ring-2 focus:ring-blue-500 hover:border-blue-400 outline-none transition-all font-mono text-sm\"\r\n [class.border-red-500]=\"apiForm.get('api_endpoint')?.invalid && apiForm.get('api_endpoint')?.touched\">\r\n <p *ngIf=\"apiForm.get('api_endpoint')?.invalid && apiForm.get('api_endpoint')?.touched\"\r\n class=\"mt-1 text-xs text-red-500\">\r\n Endpoint path is required\r\n </p>\r\n </div>\r\n\r\n <!-- Method -->\r\n <div>\r\n <label for=\"api_method\" class=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1\">\r\n HTTP Method\r\n </label>\r\n <select id=\"api_method\" formControlName=\"api_method\"\r\n class=\"w-full px-3 py-2 rounded-lg border border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-700 text-gray-900 dark:text-gray-100 focus:ring-2 focus:ring-blue-500 outline-none transition-all\">\r\n <option value=\"GET\">GET</option>\r\n <option value=\"POST\">POST</option>\r\n <option value=\"PUT\">PUT</option>\r\n <option value=\"DELETE\">DELETE</option>\r\n <option value=\"PATCH\">PATCH</option>\r\n </select>\r\n </div>\r\n\r\n <!-- Category -->\r\n <div>\r\n <label for=\"api_category\" class=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1\">\r\n Category <span class=\"text-red-500\">*</span>\r\n </label>\r\n <input type=\"text\" id=\"api_category\" formControlName=\"api_category\"\r\n placeholder=\"e.g. Dashboard, User Management\"\r\n class=\"w-full px-3 py-2 rounded-lg border border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-700 text-gray-900 dark:text-gray-100 focus:ring-2 focus:ring-blue-500 hover:border-blue-400 outline-none transition-all\"\r\n [class.border-red-500]=\"apiForm.get('api_category')?.invalid && apiForm.get('api_category')?.touched\">\r\n <p *ngIf=\"apiForm.get('api_category')?.invalid && apiForm.get('api_category')?.touched\"\r\n class=\"mt-1 text-xs text-red-500\">\r\n Category is required\r\n </p>\r\n </div>\r\n\r\n <!-- Description -->\r\n <div>\r\n <label for=\"api_description\" class=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1\">\r\n Description <span class=\"text-red-500\">*</span>\r\n </label>\r\n <textarea id=\"api_description\" formControlName=\"api_description\" rows=\"3\"\r\n placeholder=\"What does this endpoint do?\"\r\n class=\"w-full px-3 py-2 rounded-lg border border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-700 text-gray-900 dark:text-gray-100 focus:ring-2 focus:ring-blue-500 hover:border-blue-400 outline-none transition-all resize-none\"\r\n [class.border-red-500]=\"apiForm.get('api_description')?.invalid && apiForm.get('api_description')?.touched\"></textarea>\r\n <p *ngIf=\"apiForm.get('api_description')?.invalid && apiForm.get('api_description')?.touched\"\r\n class=\"mt-1 text-xs text-red-500\">\r\n Description is required\r\n </p>\r\n </div>\r\n\r\n <!-- Auth Required -->\r\n <div class=\"flex items-center\">\r\n <input type=\"checkbox\" id=\"api_requires_auth\" formControlName=\"api_requires_auth\"\r\n class=\"w-4 h-4 text-blue-600 border-gray-300 rounded focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-700\">\r\n <label for=\"api_requires_auth\" class=\"ml-2 block text-sm text-gray-700 dark:text-gray-300\">\r\n Requires Authentication\r\n </label>\r\n </div>\r\n\r\n </div>\r\n\r\n <!-- Footer Actions -->\r\n <div\r\n class=\"p-4 border-t border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-900/50 flex justify-end gap-3\">\r\n <button type=\"button\" (click)=\"onCancel()\"\r\n class=\"px-4 py-2 text-sm font-medium text-gray-700 dark:text-gray-300 bg-white dark:bg-gray-800 border border-gray-300 dark:border-gray-600 rounded-lg hover:bg-gray-50 dark:hover:bg-gray-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-gray-500 transition-colors\">\r\n Cancel\r\n </button>\r\n <button type=\"submit\" [disabled]=\"isSubmitting() || apiForm.invalid || apiForm.pristine\"\r\n class=\"px-4 py-2 text-sm font-medium text-white bg-blue-600 rounded-lg hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 disabled:opacity-50 disabled:cursor-not-allowed transition-colors flex items-center gap-2\">\r\n <span *ngIf=\"isSubmitting()\"\r\n class=\"w-4 h-4 border-2 border-white/30 border-t-white rounded-full animate-spin\"></span>\r\n {{ editApiData() ? 'Update' : 'Create' }}\r\n </button>\r\n </div>\r\n </form>\r\n</div>","import { Component, inject, signal, OnInit } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport {\n CoreApiEndpointMaster,\n MApiEndpointMaster,\n ApiEndpointMasterListResponse\n} from 'cloud-ide-lms-model';\nimport { ApiEndpointMasterService } from '../../services/api-endpoint-master.service';\nimport { CideEleFloatingContainerService, FloatingContainerConfig } from 'cloud-ide-element';\nimport { ApiEndpointFormComponent } from './api-endpoint-form.component';\nimport { CideLytSharedWrapperComponent } from '../../layout/shared/shared-wrapper/shared-wrapper.component';\n\n@Component({\n selector: 'app-api-endpoint-manager',\n standalone: true,\n imports: [CommonModule, FormsModule, ReactiveFormsModule, CideLytSharedWrapperComponent],\n templateUrl: './api-endpoint-manager.component.html',\n styleUrls: ['./api-endpoint-manager.component.css']\n})\nexport class ApiEndpointManagerComponent implements OnInit {\n private apiService = inject(ApiEndpointMasterService);\n private floatingContainerService = inject(CideEleFloatingContainerService);\n\n shared_wrapper_setup_param = {\n sypg_page_code: \"cide_lyt_api_endpoint_manager\"\n };\n\n // Signals\n apiList = signal<ApiEndpointMasterListResponse[]>([]);\n totalRecords = signal<number>(0);\n loading = signal<boolean>(false);\n searchQuery = signal<string>('');\n\n // Pagination\n pageSize = signal<number>(20);\n pageIndex = signal<number>(1);\n\n constructor() {\n // Register the form component with the floating container service\n this.floatingContainerService.registerComponent('api-endpoint-form', ApiEndpointFormComponent);\n }\n\n ngOnInit(): void {\n this.loadApiList();\n }\n\n loadApiList() {\n this.loading.set(true);\n const payload = new MApiEndpointMaster({\n query: this.searchQuery(),\n pageSize: this.pageSize(),\n pageIndex: this.pageIndex()\n });\n\n this.apiService.getApiEndpointMasterList(payload).subscribe({\n next: (response) => {\n if (response.success && response.data) {\n this.apiList.set(response.data);\n this.totalRecords.set(response.total || 0);\n } else {\n this.apiList.set([]);\n this.totalRecords.set(0);\n }\n this.loading.set(false);\n },\n error: (err) => {\n console.error('Error fetching API list:', err);\n this.loading.set(false);\n }\n });\n }\n\n onSearch(query: string) {\n this.searchQuery.set(query);\n this.pageIndex.set(1);\n this.loadApiList();\n }\n\n onPageChange(page: number) {\n this.pageIndex.set(page);\n this.loadApiList();\n }\n\n openApiForm(apiData?: CoreApiEndpointMaster | ApiEndpointMasterListResponse) {\n const config: FloatingContainerConfig = {\n id: apiData ? `edit-api-${apiData._id}` : 'new-api-endpoint',\n title: apiData ? 'Edit API Endpoint' : 'Add New API Endpoint',\n width: '500px',\n height: 'auto',\n minWidth: '400px',\n minHeight: '300px',\n backdrop: true,\n componentId: 'api-endpoint-form',\n componentConfig: {\n inputs: {\n containerId: signal(apiData ? `edit-api-${apiData._id}` : 'new-api-endpoint'),\n editApiData: signal(apiData || null)\n },\n outputs: {\n saved: () => {\n this.loadApiList();\n },\n cancelled: () => {\n // Container handles closing\n }\n }\n }\n };\n\n this.floatingContainerService.show(config);\n }\n\n deleteApi(apiId?: string) {\n if (!apiId) {\n console.error('API endpoint id is missing');\n return;\n }\n\n if (confirm('Are you sure you want to delete this API endpoint?')) {\n this.apiService.deleteApiEndpoint(apiId).subscribe({\n next: (response) => {\n if (response.success) {\n this.loadApiList();\n }\n },\n error: (err) => {\n console.error('Error deleting API endpoint:', err);\n }\n });\n }\n }\n}\n","<cide-lyt-shared-wrapper [shared_wrapper_setup_param]=\"shared_wrapper_setup_param\">\r\n <!-- Breadcrumb Actions -->\r\n <div breadcrumb-actions>\r\n <button (click)=\"openApiForm()\"\r\n class=\"bg-blue-600 hover:bg-blue-700 text-white px-4 py-2 rounded-lg flex items-center gap-2 transition-colors\">\r\n <i class=\"cide-icon-plus\"></i>\r\n <span>Add New Endpoint</span>\r\n </button>\r\n </div>\r\n\r\n <!-- Main Content -->\r\n <div class=\"h-full flex flex-col bg-gray-50 dark:bg-gray-900 p-4\">\r\n\r\n <!-- Search & Filter -->\r\n <div class=\"mb-6\">\r\n <div class=\"relative max-w-md\">\r\n <input type=\"text\" [ngModel]=\"searchQuery()\" (ngModelChange)=\"onSearch($event)\"\r\n placeholder=\"Search endpoints, descriptions...\"\r\n class=\"w-full pl-10 pr-4 py-2 rounded-lg border border-gray-300 dark:border-gray-700 bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100 focus:ring-2 focus:ring-blue-500 focus:border-transparent outline-none transition-all\">\r\n <i class=\"cide-icon-search absolute left-3 top-1/2 -translate-y-1/2 text-gray-400\"></i>\r\n </div>\r\n </div>\r\n\r\n <!-- Data Table -->\r\n <div\r\n class=\"flex-1 overflow-hidden bg-white dark:bg-gray-800 rounded-xl shadow-sm border border-gray-200 dark:border-gray-700 flex flex-col\">\r\n <div class=\"overflow-x-auto flex-1\">\r\n <table class=\"w-full text-left border-collapse\">\r\n <thead class=\"bg-gray-50 dark:bg-gray-900/50 sticky top-0 z-10\">\r\n <tr>\r\n <th\r\n class=\"p-4 text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wider border-b border-gray-200 dark:border-gray-700\">\r\n Method</th>\r\n <th\r\n class=\"p-4 text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wider border-b border-gray-200 dark:border-gray-700\">\r\n Endpoint</th>\r\n <th\r\n class=\"p-4 text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wider border-b border-gray-200 dark:border-gray-700\">\r\n Description</th>\r\n <th\r\n class=\"p-4 text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wider border-b border-gray-200 dark:border-gray-700\">\r\n Category</th>\r\n <th\r\n class=\"p-4 text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wider border-b border-gray-200 dark:border-gray-700 text-center\">\r\n Auth</th>\r\n <th\r\n class=\"p-4 text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wider border-b border-gray-200 dark:border-gray-700 text-right\">\r\n Actions</th>\r\n </tr>\r\n </thead>\r\n <tbody class=\"divide-y divide-gray-200 dark:divide-gray-700\">\r\n <tr *ngFor=\"let api of apiList()\"\r\n class=\"hover:bg-gray-50 dark:hover:bg-gray-700/50 transition-colors\">\r\n <td class=\"p-4 whitespace-nowrap\">\r\n <span class=\"px-2 py-1 text-xs font-bold rounded\" [ngClass]=\"{\r\n 'bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400': api.api_method === 'GET',\r\n 'bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400': api.api_method === 'POST',\r\n 'bg-yellow-100 text-yellow-700 dark:bg-yellow-900/30 dark:text-yellow-400': api.api_method === 'PUT',\r\n 'bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400': api.api_method === 'DELETE',\r\n 'bg-purple-100 text-purple-700 dark:bg-purple-900/30 dark:text-purple-400': api.api_method === 'PATCH'\r\n }\">\r\n {{ api.api_method }}\r\n </span>\r\n </td>\r\n <td class=\"p-4 text-sm font-medium text-gray-900 dark:text-gray-100 font-mono\">{{\r\n api.api_endpoint }}</td>\r\n <td class=\"p-4 text-sm text-gray-500 dark:text-gray-400 max-w-xs truncate\"\r\n title=\"{{ api.api_description }}\">{{ api.api_description }}</td>\r\n <td class=\"p-4 text-sm text-gray-500 dark:text-gray-400\">\r\n <span\r\n class=\"inline-flex items-center px-2 py-0.5 rounded text-xs font-medium bg-gray-100 text-gray-800 dark:bg-gray-700 dark:text-gray-300\">\r\n {{ api.api_category }}\r\n </span>\r\n </td>\r\n <td class=\"p-4 text-center\">\r\n <i class=\"text-sm\"\r\n [ngClass]=\"api.api_requires_auth ? 'cide-icon-lock text-green-500' : 'cide-icon-unlock text-gray-400'\"></i>\r\n </td>\r\n <td class=\"p-4 text-right whitespace-nowrap\">\r\n <button (click)=\"openApiForm(api)\"\r\n class=\"text-blue-600 hover:text-blue-800 p-1 mr-2 transition-colors\" title=\"Edit\">\r\n <i class=\"cide-icon-edit\"></i>\r\n </button>\r\n <button (click)=\"deleteApi(api._id)\"\r\n class=\"text-red-600 hover:text-red-800 p-1 transition-colors\" title=\"Delete\">\r\n <i class=\"cide-icon-trash\"></i>\r\n </button>\r\n </td>\r\n </tr>\r\n <tr *ngIf=\"apiList().length === 0 && !loading()\">\r\n <td colspan=\"6\" class=\"p-8 text-center text-gray-500 dark:text-gray-400\">\r\n <div class=\"flex flex-col items-center\">\r\n <i class=\"cide-icon-database text-4xl mb-3 opacity-50\"></i>\r\n <p>No API endpoints found</p>\r\n </div>\r\n </td>\r\n </tr>\r\n <tr *ngIf=\"loading()\">\r\n <td colspan=\"6\" class=\"p-8 text-center\">\r\n <div class=\"flex justify-center\">\r\n <div class=\"animate-spin rounded-full h-8 w-8 border-b-2 border-blue-600\"></div>\r\n </div>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n <!-- Footer / Pagination -->\r\n <div\r\n class=\"p-4 border-t border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-900/50 flex justify-between items-center text-sm text-gray-600 dark:text-gray-400\">\r\n <span>Showing {{ apiList().length }} of {{ totalRecords() }} endpoints</span>\r\n <div class=\"flex gap-2\">\r\n <button [disabled]=\"pageIndex() <= 1\" (click)=\"onPageChange(pageIndex() - 1)\"\r\n class=\"px-3 py-1 rounded border border-gray-300 dark:border-gray-600 disabled:opacity-50 hover:bg-gray-100 dark:hover:bg-gray-800 transition-colors\">\r\n Previous\r\n </button>\r\n <button [disabled]=\"apiList().length < pageSize()\" (click)=\"onPageChange(pageIndex() + 1)\"\r\n class=\"px-3 py-1 rounded border border-gray-300 dark:border-gray-600 disabled:opacity-50 hover:bg-gray-100 dark:hover:bg-gray-800 transition-colors\">\r\n Next\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</cide-lyt-shared-wrapper>"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import * as i0 from '@angular/core';
2
+ import { inject, Directive } from '@angular/core';
3
+ import { c as CideLytSidedrawerService } from './cloud-ide-layout-cloud-ide-layout-BNs30VIP.mjs';
4
+
5
+ class CideLytDrawerBase {
6
+ _pageId = null;
7
+ _themeId = null;
8
+ sidedrawerService = inject(CideLytSidedrawerService);
9
+ ngOnInit() {
10
+ // Automatically initialize context from the service
11
+ const pageId = this.sidedrawerService.pageId;
12
+ const themeId = this.sidedrawerService.themeId;
13
+ if (pageId && themeId) {
14
+ this.setContext(pageId, themeId);
15
+ }
16
+ this.afterContextInit();
17
+ }
18
+ // Child classes can override this for additional setup
19
+ afterContextInit() { }
20
+ setContext(pageId, themeId) {
21
+ this._pageId = pageId;
22
+ this._themeId = themeId;
23
+ }
24
+ get pageId() {
25
+ return this._pageId;
26
+ }
27
+ get themeId() {
28
+ return this._themeId;
29
+ }
30
+ getStorageKey(suffix) {
31
+ return `drawer_${suffix}_${this._pageId || 'unknown'}`;
32
+ }
33
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CideLytDrawerBase, deps: [], target: i0.ɵɵFactoryTarget.Directive });
34
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.15", type: CideLytDrawerBase, isStandalone: true, ngImport: i0 });
35
+ }
36
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CideLytDrawerBase, decorators: [{
37
+ type: Directive
38
+ }] });
39
+
40
+ export { CideLytDrawerBase as C };
41
+ //# sourceMappingURL=cloud-ide-layout-cide-lyt-drawer-base.class-fqh3uHtY.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloud-ide-layout-cide-lyt-drawer-base.class-fqh3uHtY.mjs","sources":["../../../projects/cloud-ide-layout/src/lib/layout/sidedrawer/cide-lyt-drawer-base.class.ts"],"sourcesContent":["import { Directive, OnInit, inject } from '@angular/core';\r\nimport { CideLytSidedrawerService } from './sidedrawer.service';\r\n\r\n@Directive()\r\nexport abstract class CideLytDrawerBase implements OnInit {\r\n private _pageId: string | null = null;\r\n private _themeId: string | null = null;\r\n protected sidedrawerService = inject(CideLytSidedrawerService);\r\n\r\n ngOnInit(): void {\r\n // Automatically initialize context from the service\r\n const pageId = this.sidedrawerService.pageId;\r\n const themeId = this.sidedrawerService.themeId;\r\n if (pageId && themeId) {\r\n this.setContext(pageId, themeId);\r\n }\r\n this.afterContextInit();\r\n }\r\n\r\n // Child classes can override this for additional setup\r\n protected afterContextInit(): void {}\r\n\r\n setContext(pageId: string, themeId: string) {\r\n this._pageId = pageId;\r\n this._themeId = themeId;\r\n }\r\n\r\n get pageId(): string | null {\r\n return this._pageId;\r\n }\r\n\r\n get themeId(): string | null {\r\n return this._themeId;\r\n }\r\n\r\n protected getStorageKey(suffix: string): string {\r\n return `drawer_${suffix}_${this._pageId || 'unknown'}`;\r\n }\r\n} "],"names":[],"mappings":";;;;MAIsB,iBAAiB,CAAA;IAC7B,OAAO,GAAkB,IAAI;IAC7B,QAAQ,GAAkB,IAAI;AAC5B,IAAA,iBAAiB,GAAG,MAAM,CAAC,wBAAwB,CAAC;IAE9D,QAAQ,GAAA;;AAEN,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM;AAC5C,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO;AAC9C,QAAA,IAAI,MAAM,IAAI,OAAO,EAAE;AACrB,YAAA,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC;QAClC;QACA,IAAI,CAAC,gBAAgB,EAAE;IACzB;;AAGU,IAAA,gBAAgB,KAAU;IAEpC,UAAU,CAAC,MAAc,EAAE,OAAe,EAAA;AACxC,QAAA,IAAI,CAAC,OAAO,GAAG,MAAM;AACrB,QAAA,IAAI,CAAC,QAAQ,GAAG,OAAO;IACzB;AAEA,IAAA,IAAI,MAAM,GAAA;QACR,OAAO,IAAI,CAAC,OAAO;IACrB;AAEA,IAAA,IAAI,OAAO,GAAA;QACT,OAAO,IAAI,CAAC,QAAQ;IACtB;AAEU,IAAA,aAAa,CAAC,MAAc,EAAA;QACpC,OAAO,CAAA,OAAA,EAAU,MAAM,CAAA,CAAA,EAAI,IAAI,CAAC,OAAO,IAAI,SAAS,CAAA,CAAE;IACxD;wGAjCoB,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAjB,iBAAiB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;4FAAjB,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBADtC;;;;;"}
@@ -248,14 +248,15 @@ class CideLytSidedrawerService {
248
248
  updateDrawerItems(layout) {
249
249
  if (layout?.sytm_layout_drawer && layout.sytm_layout_drawer.length > 0) {
250
250
  const items = layout.sytm_layout_drawer
251
- .filter((item) => item.syth_status && item?.core_system_config?.syco_isactive) // Only show active items
251
+ .filter((item) => item.syth_status && (item?.core_system_config?.syco_isactive ?? true)) // Show if no config or active
252
252
  .map(item => ({
253
253
  status: item.syth_status,
254
254
  configFor: item.syth_config_syco_for,
255
- title: item.core_system_config?.syco_title,
256
- icon: item.core_system_config?.syco_configuration.syco_icon,
255
+ title: item.core_system_config?.syco_title || (item.syth_config_syco_for === 'drawer_docs' ? 'Docs' : item.syth_config_syco_for),
256
+ icon: item.core_system_config?.syco_configuration?.syco_icon || (item.syth_config_syco_for === 'drawer_docs' ? 'description' : ''),
257
257
  description: item.core_system_config?.syco_desc || "",
258
- isActive: item.core_system_config?.syco_isactive || false
258
+ isActive: item.core_system_config?.syco_isactive ?? true,
259
+ configJson: item.syth_config_json
259
260
  }));
260
261
  this.drawerItemsSignal.set(items);
261
262
  }
@@ -5584,8 +5585,10 @@ class CideLytSidedrawerWrapperComponent {
5584
5585
  });
5585
5586
  }
5586
5587
  ngOnInit() {
5587
- this.componentMap['drowar_notes'] = () => import('./cloud-ide-layout-sidedrawer-notes.component-DEhojtjd.mjs').then(m => m.CideLytSidedrawerNotesComponent);
5588
- this.componentMap['drawer_theme'] = () => import('./cloud-ide-layout-drawer-theme.component-NKRNKJw5.mjs').then(m => m.CideLytDrawerThemeComponent);
5588
+ this.componentMap['drowar_notes'] = () => import('./cloud-ide-layout-sidedrawer-notes.component-BgmT99VO.mjs').then(m => m.CideLytSidedrawerNotesComponent);
5589
+ this.componentMap['drawer_notes'] = () => import('./cloud-ide-layout-sidedrawer-notes.component-BgmT99VO.mjs').then(m => m.CideLytSidedrawerNotesComponent);
5590
+ this.componentMap['drawer_theme'] = () => import('./cloud-ide-layout-drawer-theme.component-Cx5KfJ8Y.mjs').then(m => m.CideLytDrawerThemeComponent);
5591
+ this.componentMap['drawer_docs'] = () => import('./cloud-ide-layout-drawer-docs.component-dMNtwaEn.mjs').then(m => m.CideLytDrawerDocsComponent);
5589
5592
  if (this.aiDrawerComponent) {
5590
5593
  this.componentMap['drawer_ai'] = () => Promise.resolve(this.aiDrawerComponent);
5591
5594
  }
@@ -5666,6 +5669,10 @@ class CideLytSidedrawerWrapperComponent {
5666
5669
  if (configFor === 'drawer_ai') {
5667
5670
  this.currentComponentRef.setInput('embedded', true);
5668
5671
  }
5672
+ if (configFor === 'drawer_docs') {
5673
+ const item = this.sidedrawerService.drawerItems().find(d => d.configFor === 'drawer_docs');
5674
+ this.currentComponentRef.setInput('configJson', item?.configJson ?? []);
5675
+ }
5669
5676
  if (context) {
5670
5677
  this.currentComponentRef.setInput('context', context);
5671
5678
  }
@@ -5673,24 +5680,20 @@ class CideLytSidedrawerWrapperComponent {
5673
5680
  }
5674
5681
  // This function needs to be enhanced to handle contexts for different components
5675
5682
  getNotesContext(configFor) {
5683
+ const activeTab = this.requestService.activeTab();
5684
+ const baseContext = { pageId: activeTab?.sytm_page_id_sypg, themeId: activeTab?.themeId };
5676
5685
  switch (configFor) {
5677
- case 'drowar_notes': {
5678
- // Example for notes component context
5679
- const activeTab = this.requestService.activeTab(); // Use the computed signal for active tab
5680
- return {
5681
- pageId: activeTab?.sytm_page_id_sypg,
5682
- themeId: activeTab?.themeId,
5683
- // Add other properties as needed for notes
5684
- };
5685
- }
5686
+ case 'drowar_notes':
5687
+ case 'drawer_notes':
5688
+ return baseContext;
5686
5689
  case 'drawer_theme':
5687
5690
  return {};
5688
- case 'drawer_ai': {
5689
- const activeTab = this.requestService.activeTab();
5690
- return { pageId: activeTab?.sytm_page_id_sypg, themeId: activeTab?.themeId };
5691
- }
5691
+ case 'drawer_ai':
5692
+ return baseContext;
5693
+ case 'drawer_docs':
5694
+ return baseContext;
5692
5695
  default:
5693
- return null; // Or a default context if appropriate
5696
+ return null;
5694
5697
  }
5695
5698
  }
5696
5699
  onItemClick(item) {
@@ -7322,7 +7325,7 @@ const layoutControlPannelChildRoutes = [{
7322
7325
  },
7323
7326
  {
7324
7327
  path: "home",
7325
- loadComponent: () => import('./cloud-ide-layout-home-wrapper.component-B-ZvfHeg.mjs').then(c => c.CideLytHomeWrapperComponent),
7328
+ loadComponent: () => import('./cloud-ide-layout-home-wrapper.component-C-uiRwZ_.mjs').then(c => c.CideLytHomeWrapperComponent),
7326
7329
  canActivate: [authGuard],
7327
7330
  data: {
7328
7331
  sypg_page_code: "cide_lyt_home" // Used by RequestService to fetch tab properties
@@ -7330,7 +7333,7 @@ const layoutControlPannelChildRoutes = [{
7330
7333
  },
7331
7334
  {
7332
7335
  path: "dashboard-manager",
7333
- loadComponent: () => import('./cloud-ide-layout-dashboard-manager.component-BfA8oY0m.mjs').then(c => c.DashboardManagerComponent),
7336
+ loadComponent: () => import('./cloud-ide-layout-dashboard-manager.component-B92CXNIp.mjs').then(c => c.DashboardManagerComponent),
7334
7337
  canActivate: [authGuard],
7335
7338
  data: {
7336
7339
  sypg_page_code: "cide_lyt_dashboard_manager"
@@ -7338,7 +7341,7 @@ const layoutControlPannelChildRoutes = [{
7338
7341
  },
7339
7342
  {
7340
7343
  path: "api-endpoint-manager",
7341
- loadComponent: () => import('./cloud-ide-layout-api-endpoint-manager.component-CabJGesJ.mjs').then(c => c.ApiEndpointManagerComponent),
7344
+ loadComponent: () => import('./cloud-ide-layout-api-endpoint-manager.component-b1M-QRv0.mjs').then(c => c.ApiEndpointManagerComponent),
7342
7345
  canActivate: [authGuard],
7343
7346
  data: {
7344
7347
  sypg_page_code: "cide_lyt_api_endpoint_manager"
@@ -9155,5 +9158,5 @@ var floatingEntitySelection_component = /*#__PURE__*/Object.freeze({
9155
9158
  * Generated bundle index. Do not edit.
9156
9159
  */
9157
9160
 
9158
- export { AppStateHelperService as A, CideLytSharedWrapperComponent as C, ENVIRONMENT_CONFIG as E, NotificationSettingsService as N, RightsService as R, CideLytSidebarService as a, CideLytSidedrawerService as b, CideLytThemeService as c, CloudIdeLayoutService as d, CloudIdeLayoutComponent as e, CideLytSharedService as f, ComponentContextService as g, layoutControlPannelChildRoutes as h, CustomRouteReuseStrategy as i, CideLytRequestService as j, AppStateService as k, layoutRoutes as l, CideLytUserStatusService as m, CacheManagerService as n, CideLytFileManagerService as o, processThemeVariable as p, ENTITY_RIGHTS_SHARING_COMPONENT_TOKEN as q, CideLytFloatingEntityRightsSharingComponent as r, setCSSVariable as s, themeFactory as t, CideLytFloatingEntityRightsSharingService as u, CideLytFloatingEntitySelectionComponent as v, CideLytFloatingEntitySelectionService as w };
9159
- //# sourceMappingURL=cloud-ide-layout-cloud-ide-layout-CiGurNgW.mjs.map
9161
+ export { AppStateHelperService as A, CideLytSharedWrapperComponent as C, ENVIRONMENT_CONFIG as E, NotificationSettingsService as N, RightsService as R, CideLytSidebarService as a, CideLytThemeService as b, CideLytSidedrawerService as c, CloudIdeLayoutService as d, CloudIdeLayoutComponent as e, CideLytSharedService as f, ComponentContextService as g, layoutControlPannelChildRoutes as h, CustomRouteReuseStrategy as i, CideLytRequestService as j, AppStateService as k, layoutRoutes as l, CideLytUserStatusService as m, CacheManagerService as n, CideLytFileManagerService as o, processThemeVariable as p, ENTITY_RIGHTS_SHARING_COMPONENT_TOKEN as q, CideLytFloatingEntityRightsSharingComponent as r, setCSSVariable as s, themeFactory as t, CideLytFloatingEntityRightsSharingService as u, CideLytFloatingEntitySelectionComponent as v, CideLytFloatingEntitySelectionService as w };
9162
+ //# sourceMappingURL=cloud-ide-layout-cloud-ide-layout-BNs30VIP.mjs.map