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.
- package/fesm2022/{cloud-ide-layout-api-endpoint-manager.component-CabJGesJ.mjs → cloud-ide-layout-api-endpoint-manager.component-b1M-QRv0.mjs} +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
- package/fesm2022/cloud-ide-layout-cide-lyt-drawer-base.class-fqh3uHtY.mjs +41 -0
- package/fesm2022/cloud-ide-layout-cide-lyt-drawer-base.class-fqh3uHtY.mjs.map +1 -0
- package/fesm2022/{cloud-ide-layout-cloud-ide-layout-CiGurNgW.mjs → cloud-ide-layout-cloud-ide-layout-BNs30VIP.mjs} +28 -25
- package/fesm2022/cloud-ide-layout-cloud-ide-layout-BNs30VIP.mjs.map +1 -0
- package/fesm2022/{cloud-ide-layout-dashboard-manager.component-BfA8oY0m.mjs → cloud-ide-layout-dashboard-manager.component-B92CXNIp.mjs} +2 -2
- package/fesm2022/{cloud-ide-layout-dashboard-manager.component-BfA8oY0m.mjs.map → cloud-ide-layout-dashboard-manager.component-B92CXNIp.mjs.map} +1 -1
- package/fesm2022/cloud-ide-layout-drawer-docs.component-dMNtwaEn.mjs +43 -0
- package/fesm2022/cloud-ide-layout-drawer-docs.component-dMNtwaEn.mjs.map +1 -0
- package/fesm2022/cloud-ide-layout-drawer-theme.component-Cx5KfJ8Y.mjs +346 -0
- package/fesm2022/cloud-ide-layout-drawer-theme.component-Cx5KfJ8Y.mjs.map +1 -0
- package/fesm2022/{cloud-ide-layout-home-wrapper.component-B-ZvfHeg.mjs → cloud-ide-layout-home-wrapper.component-C-uiRwZ_.mjs} +2 -2
- package/fesm2022/{cloud-ide-layout-home-wrapper.component-B-ZvfHeg.mjs.map → cloud-ide-layout-home-wrapper.component-C-uiRwZ_.mjs.map} +1 -1
- package/fesm2022/cloud-ide-layout-sidedrawer-notes.component-BgmT99VO.mjs +226 -0
- package/fesm2022/cloud-ide-layout-sidedrawer-notes.component-BgmT99VO.mjs.map +1 -0
- package/fesm2022/cloud-ide-layout.mjs +1 -1
- package/index.d.ts +2 -0
- package/package.json +1 -1
- package/fesm2022/cloud-ide-layout-cloud-ide-layout-CiGurNgW.mjs.map +0 -1
- package/fesm2022/cloud-ide-layout-drawer-theme.component-NKRNKJw5.mjs +0 -346
- package/fesm2022/cloud-ide-layout-drawer-theme.component-NKRNKJw5.mjs.map +0 -1
- package/fesm2022/cloud-ide-layout-sidedrawer-notes.component-DEhojtjd.mjs +0 -256
- 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-
|
|
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-
|
|
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":";;;;;;;;;;;MAqBa,wBAAwB,CAAA;AACzB,IAAA,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC;AAEjC;;;;AAIG;AACH,IAAA,wBAAwB,CAAC,OAAoC,EAAA;AACzD,QAAA,MAAM,KAAK,GAAG,wBAAwB,CAAC,OAAO,CAAC;AAC/C,QAAA,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC;AACtB,YAAA,oBAAoB,CAAC,aAAa;AAClC,YAAA,aAAa,CAAC,MAAM;AACpB,YAAA,aAAa,CAAC,iBAAiB;YAC/B;AACH,SAAA,CAAC;QAEF,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAoD;IAChF;AAEA;;;;AAIG;AACH,IAAA,kBAAkB,CAAC,MAAc,EAAA;QAC7B,MAAM,OAAO,GAAG,IAAI,gCAAgC,CAAC,EAAE,MAAM,EAAE,CAAC;AAChE,QAAA,MAAM,KAAK,GAAG,wBAAwB,CAAC,OAAO,CAAC;AAC/C,QAAA,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC;AACtB,YAAA,oBAAoB,CAAC,aAAa;AAClC,YAAA,aAAa,CAAC,MAAM;AACpB,YAAA,aAAa,CAAC,iBAAiB;YAC/B,MAAM;YACN;AACH,SAAA,CAAC;QAEF,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAwD;IACpF;AAEA;;;;AAIG;AACH,IAAA,qBAAqB,CAAC,OAA2C,EAAA;AAC7D,QAAA,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC;AACtB,YAAA,oBAAoB,CAAC,aAAa;AAClC,YAAA,aAAa,CAAC,MAAM;AACpB,YAAA,aAAa,CAAC;AACjB,SAAA,CAAC;QAEF,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAgE;IACtG;AAEA;;;;AAIG;AACH,IAAA,iBAAiB,CAAC,MAAc,EAAA;QAC5B,MAAM,OAAO,GAAG,IAAI,+BAA+B,CAAC,EAAE,MAAM,EAAE,CAAC;AAC/D,QAAA,MAAM,KAAK,GAAG,wBAAwB,CAAC,OAAO,CAAC;AAC/C,QAAA,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC;AACtB,YAAA,oBAAoB,CAAC,aAAa;AAClC,YAAA,aAAa,CAAC,MAAM;AACpB,YAAA,aAAa,CAAC,iBAAiB;YAC/B;AACH,SAAA,CAAC;QAEF,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAmC;IAClE;wGAtES,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAxB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,wBAAwB,cAFrB,MAAM,EAAA,CAAA;;4FAET,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBAHpC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,UAAU,EAAE;AACf,iBAAA;;;MCNY,wBAAwB,CAAA;AACzB,IAAA,EAAE,GAAG,MAAM,CAAC,WAAW,CAAC;AACxB,IAAA,UAAU,GAAG,MAAM,CAAC,wBAAwB,CAAC;AAC7C,IAAA,wBAAwB,GAAG,MAAM,CAAC,+BAA+B,CAAC;;AAG1E,IAAA,WAAW,GAAG,KAAK,CAAS,EAAE,uDAAC;AAC/B,IAAA,WAAW,GAAG,KAAK,CAA+B,IAAI,uDAAC;;IAGvD,KAAK,GAAG,MAAM,EAAQ;IACtB,SAAS,GAAG,MAAM,EAAQ;;AAG1B,IAAA,OAAO;AACP,IAAA,YAAY,GAAG,MAAM,CAAU,KAAK,wDAAC;AACrC,IAAA,YAAY,GAAG,MAAM,CAAS,EAAE,wDAAC;AAEjC,IAAA,WAAA,GAAA;QACI,IAAI,CAAC,QAAQ,EAAE;;QAGf,MAAM,CAAC,MAAK;AACR,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE;YAC/B,IAAI,IAAI,EAAE;AACN,gBAAA,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;oBACpB,YAAY,EAAE,IAAI,CAAC,YAAY;oBAC/B,UAAU,EAAE,IAAI,CAAC,UAAU;oBAC3B,eAAe,EAAE,IAAI,CAAC,eAAe;oBACrC,YAAY,EAAE,IAAI,CAAC,YAAY;oBAC/B,iBAAiB,EAAE,IAAI,CAAC;AAC3B,iBAAA,CAAC;YACN;AACJ,QAAA,CAAC,CAAC;IACN;IAEA,QAAQ,GAAA;;IAER;IAEQ,QAAQ,GAAA;QACZ,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC;YACzB,YAAY,EAAE,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YACzC,UAAU,EAAE,CAAC,KAAK,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YAC1C,eAAe,EAAE,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YAC5C,YAAY,EAAE,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YACzC,iBAAiB,EAAE,CAAC,IAAI;AAC3B,SAAA,CAAC;IACN;IAEA,QAAQ,GAAA;AACJ,QAAA,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;AACtB,YAAA,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE;YAC/B;QACJ;AAEA,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;AAC3B,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;AAEzB,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK;AACpC,QAAA,MAAM,OAAO,GAA0B;AACnC,YAAA,GAAG;SACN;AAED,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE;YACpB,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,WAAW,EAAG,CAAC,GAAG;QACzC;AAEA,QAAA,MAAM,OAAO,GAAG,IAAI,kCAAkC,CAAC;AACnD,YAAA,wBAAwB,EAAE;AAC7B,SAAA,CAAC;QAEF,IAAI,CAAC,UAAU,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC;AACrD,YAAA,IAAI,EAAE,CAAC,QAAQ,KAAI;AACf,gBAAA,IAAI,QAAQ,CAAC,OAAO,EAAE;AAClB,oBAAA,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;oBACjB,IAAI,CAAC,cAAc,EAAE;gBACzB;qBAAO;oBACH,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,IAAI,6BAA6B,CAAC;gBAC5E;AACA,gBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;YAChC,CAAC;AACD,YAAA,KAAK,EAAE,CAAC,GAAG,KAAI;AACX,gBAAA,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,GAAG,CAAC;AAChD,gBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,gCAAgC,CAAC;AACvD,gBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;YAChC;AACH,SAAA,CAAC;IACN;IAEA,QAAQ,GAAA;AACJ,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;QACrB,IAAI,CAAC,cAAc,EAAE;IACzB;IAEQ,cAAc,GAAA;AAClB,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE;YACpB,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QAC1D;IACJ;wGAnGS,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAxB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,wBAAwB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,KAAA,EAAA,OAAA,EAAA,SAAA,EAAA,WAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECdrC,86MAgGM,EAAA,MAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDtFQ,YAAY,kIAAE,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,8CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,4BAAA,EAAA,QAAA,EAAA,uGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,0BAAA,EAAA,QAAA,EAAA,6GAAA,EAAA,MAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,0FAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;4FAIlC,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBAPpC,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,uBAAuB,cACrB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,mBAAmB,CAAC,EAAA,QAAA,EAAA,86MAAA,EAAA;;;MEUnC,2BAA2B,CAAA;AAC5B,IAAA,UAAU,GAAG,MAAM,CAAC,wBAAwB,CAAC;AAC7C,IAAA,wBAAwB,GAAG,MAAM,CAAC,+BAA+B,CAAC;AAE1E,IAAA,0BAA0B,GAAG;AACzB,QAAA,cAAc,EAAE;KACnB;;AAGD,IAAA,OAAO,GAAG,MAAM,CAAkC,EAAE,mDAAC;AACrD,IAAA,YAAY,GAAG,MAAM,CAAS,CAAC,wDAAC;AAChC,IAAA,OAAO,GAAG,MAAM,CAAU,KAAK,mDAAC;AAChC,IAAA,WAAW,GAAG,MAAM,CAAS,EAAE,uDAAC;;AAGhC,IAAA,QAAQ,GAAG,MAAM,CAAS,EAAE,oDAAC;AAC7B,IAAA,SAAS,GAAG,MAAM,CAAS,CAAC,qDAAC;AAE7B,IAAA,WAAA,GAAA;;QAEI,IAAI,CAAC,wBAAwB,CAAC,iBAAiB,CAAC,mBAAmB,EAAE,wBAAwB,CAAC;IAClG;IAEA,QAAQ,GAAA;QACJ,IAAI,CAAC,WAAW,EAAE;IACtB;IAEA,WAAW,GAAA;AACP,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AACtB,QAAA,MAAM,OAAO,GAAG,IAAI,kBAAkB,CAAC;AACnC,YAAA,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE;AACzB,YAAA,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE;AACzB,YAAA,SAAS,EAAE,IAAI,CAAC,SAAS;AAC5B,SAAA,CAAC;QAEF,IAAI,CAAC,UAAU,CAAC,wBAAwB,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC;AACxD,YAAA,IAAI,EAAE,CAAC,QAAQ,KAAI;gBACf,IAAI,QAAQ,CAAC,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE;oBACnC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC;oBAC/B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC,CAAC;gBAC9C;qBAAO;AACH,oBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;AACpB,oBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC5B;AACA,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;YAC3B,CAAC;AACD,YAAA,KAAK,EAAE,CAAC,GAAG,KAAI;AACX,gBAAA,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,GAAG,CAAC;AAC9C,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;YAC3B;AACH,SAAA,CAAC;IACN;AAEA,IAAA,QAAQ,CAAC,KAAa,EAAA;AAClB,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC;AAC3B,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;QACrB,IAAI,CAAC,WAAW,EAAE;IACtB;AAEA,IAAA,YAAY,CAAC,IAAY,EAAA;AACrB,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;QACxB,IAAI,CAAC,WAAW,EAAE;IACtB;AAEA,IAAA,WAAW,CAAC,OAA+D,EAAA;AACvE,QAAA,MAAM,MAAM,GAA4B;AACpC,YAAA,EAAE,EAAE,OAAO,GAAG,CAAA,SAAA,EAAY,OAAO,CAAC,GAAG,CAAA,CAAE,GAAG,kBAAkB;YAC5D,KAAK,EAAE,OAAO,GAAG,mBAAmB,GAAG,sBAAsB;AAC7D,YAAA,KAAK,EAAE,OAAO;AACd,YAAA,MAAM,EAAE,MAAM;AACd,YAAA,QAAQ,EAAE,OAAO;AACjB,YAAA,SAAS,EAAE,OAAO;AAClB,YAAA,QAAQ,EAAE,IAAI;AACd,YAAA,WAAW,EAAE,mBAAmB;AAChC,YAAA,eAAe,EAAE;AACb,gBAAA,MAAM,EAAE;AACJ,oBAAA,WAAW,EAAE,MAAM,CAAC,OAAO,GAAG,CAAA,SAAA,EAAY,OAAO,CAAC,GAAG,CAAA,CAAE,GAAG,kBAAkB,CAAC;AAC7E,oBAAA,WAAW,EAAE,MAAM,CAAC,OAAO,IAAI,IAAI;AACtC,iBAAA;AACD,gBAAA,OAAO,EAAE;oBACL,KAAK,EAAE,MAAK;wBACR,IAAI,CAAC,WAAW,EAAE;oBACtB,CAAC;oBACD,SAAS,EAAE,MAAK;;oBAEhB;AACH;AACJ;SACJ;AAED,QAAA,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,MAAM,CAAC;IAC9C;AAEA,IAAA,SAAS,CAAC,KAAc,EAAA;QACpB,IAAI,CAAC,KAAK,EAAE;AACR,YAAA,OAAO,CAAC,KAAK,CAAC,4BAA4B,CAAC;YAC3C;QACJ;AAEA,QAAA,IAAI,OAAO,CAAC,oDAAoD,CAAC,EAAE;YAC/D,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC;AAC/C,gBAAA,IAAI,EAAE,CAAC,QAAQ,KAAI;AACf,oBAAA,IAAI,QAAQ,CAAC,OAAO,EAAE;wBAClB,IAAI,CAAC,WAAW,EAAE;oBACtB;gBACJ,CAAC;AACD,gBAAA,KAAK,EAAE,CAAC,GAAG,KAAI;AACX,oBAAA,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,GAAG,CAAC;gBACtD;AACH,aAAA,CAAC;QACN;IACJ;wGA/GS,2BAA2B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAA3B,2BAA2B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,0BAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECpBxC,0jRA6H0B,EAAA,MAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED7GZ,YAAY,6VAAE,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,6BAA6B,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,CAAA,4BAAA,EAAA,iBAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;4FAI9E,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBAPvC,SAAS;+BACI,0BAA0B,EAAA,UAAA,EACxB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,WAAW,EAAE,mBAAmB,EAAE,6BAA6B,CAAC,EAAA,QAAA,EAAA,0jRAAA,EAAA;;;;;"}
|
|
@@ -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) //
|
|
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.
|
|
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
|
|
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-
|
|
5588
|
-
this.componentMap['
|
|
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
|
-
|
|
5679
|
-
|
|
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
|
-
|
|
5690
|
-
|
|
5691
|
-
|
|
5691
|
+
case 'drawer_ai':
|
|
5692
|
+
return baseContext;
|
|
5693
|
+
case 'drawer_docs':
|
|
5694
|
+
return baseContext;
|
|
5692
5695
|
default:
|
|
5693
|
-
return null;
|
|
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-
|
|
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-
|
|
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-
|
|
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,
|
|
9159
|
-
//# sourceMappingURL=cloud-ide-layout-cloud-ide-layout-
|
|
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
|