cloud-ide-layout 1.0.335 → 1.0.336
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-COEBI50g.mjs → cloud-ide-layout-api-endpoint-manager.component-BYs0Pm1S.mjs} +2 -2
- package/fesm2022/{cloud-ide-layout-api-endpoint-manager.component-COEBI50g.mjs.map → cloud-ide-layout-api-endpoint-manager.component-BYs0Pm1S.mjs.map} +1 -1
- package/fesm2022/{cloud-ide-layout-cloud-ide-layout-Bu6BQJMz.mjs → cloud-ide-layout-cloud-ide-layout-jM63sEp6.mjs} +34 -9
- package/fesm2022/cloud-ide-layout-cloud-ide-layout-jM63sEp6.mjs.map +1 -0
- package/fesm2022/{cloud-ide-layout-dashboard-manager.component-DMkoW45b.mjs → cloud-ide-layout-dashboard-manager.component-cJaRAYmj.mjs} +2 -2
- package/fesm2022/{cloud-ide-layout-dashboard-manager.component-DMkoW45b.mjs.map → cloud-ide-layout-dashboard-manager.component-cJaRAYmj.mjs.map} +1 -1
- package/fesm2022/{cloud-ide-layout-drawer-theme.component-CMaPXjrU.mjs → cloud-ide-layout-drawer-theme.component-Dk3WKFoJ.mjs} +2 -2
- package/fesm2022/{cloud-ide-layout-drawer-theme.component-CMaPXjrU.mjs.map → cloud-ide-layout-drawer-theme.component-Dk3WKFoJ.mjs.map} +1 -1
- package/fesm2022/{cloud-ide-layout-home-wrapper.component-BUF1i4UZ.mjs → cloud-ide-layout-home-wrapper.component-3K6mOLI1.mjs} +2 -2
- package/fesm2022/{cloud-ide-layout-home-wrapper.component-BUF1i4UZ.mjs.map → cloud-ide-layout-home-wrapper.component-3K6mOLI1.mjs.map} +1 -1
- package/fesm2022/{cloud-ide-layout-sidedrawer-notes.component-BxQ5uYNG.mjs → cloud-ide-layout-sidedrawer-notes.component-CgnwDxY7.mjs} +2 -2
- package/fesm2022/{cloud-ide-layout-sidedrawer-notes.component-BxQ5uYNG.mjs.map → cloud-ide-layout-sidedrawer-notes.component-CgnwDxY7.mjs.map} +1 -1
- package/fesm2022/cloud-ide-layout.mjs +1 -1
- package/package.json +1 -1
- package/fesm2022/cloud-ide-layout-cloud-ide-layout-Bu6BQJMz.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-jM63sEp6.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-BYs0Pm1S.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cloud-ide-layout-api-endpoint-manager.component-COEBI50g.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-BYs0Pm1S.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,5 +1,5 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { Injectable, inject, signal, computed, effect, DestroyRef, Component, Injector, runInInjectionContext, ViewChild, ElementRef, HostListener, ChangeDetectionStrategy, ComponentRef, ViewContainerRef, ViewChildren, viewChild, input, InjectionToken, PLATFORM_ID, output } from '@angular/core';
|
|
2
|
+
import { Injectable, inject, signal, computed, effect, DestroyRef, Component, Injector, runInInjectionContext, ViewChild, ElementRef, HostListener, ChangeDetectionStrategy, ComponentRef, ViewContainerRef, afterNextRender, ViewChildren, viewChild, input, InjectionToken, PLATFORM_ID, output } from '@angular/core';
|
|
3
3
|
import { HttpClient } from '@angular/common/http';
|
|
4
4
|
import { cidePath, hostManagerRoutesUrl, coreRoutesUrl, commonRoutesUrl, designConfigRoutesUrl, generateStringFromObject } from 'cloud-ide-lms-model';
|
|
5
5
|
import { BehaviorSubject, Observable, throwError, of, interval, take as take$1, firstValueFrom } from 'rxjs';
|
|
@@ -5514,6 +5514,8 @@ class CideLytSidedrawerWrapperComponent {
|
|
|
5514
5514
|
const items = this.drawerItems();
|
|
5515
5515
|
return (items?.length ?? 0) > 0 || this.aiAllowed;
|
|
5516
5516
|
}, ...(ngDevMode ? [{ debugName: "shouldShowSidedrawer" }] : []));
|
|
5517
|
+
/** Desktop viewport (min-width: 1025px). */
|
|
5518
|
+
isDesktop = signal(typeof window !== 'undefined' && window.innerWidth >= 1025, ...(ngDevMode ? [{ debugName: "isDesktop" }] : []));
|
|
5517
5519
|
notesContainer;
|
|
5518
5520
|
currentComponentRef = null;
|
|
5519
5521
|
componentMap = {}; // Map configFor to component
|
|
@@ -5557,10 +5559,33 @@ class CideLytSidedrawerWrapperComponent {
|
|
|
5557
5559
|
// collecte the width of the sidebar by using the style property
|
|
5558
5560
|
const cide_lyt_sidedrawer_wrapper_width = parseInt(window.getComputedStyle(document.documentElement).getPropertyValue('--cide-lyt-sidedrawer-wrapper-width'));
|
|
5559
5561
|
this.sidedrawerSetupData.cide_lyt_sidedrawer_width = (cide_lyt_sidedrawer_wrapper_width);
|
|
5562
|
+
// Desktop viewport: update isDesktop on resize for inline width (350px on desktop)
|
|
5563
|
+
afterNextRender(() => {
|
|
5564
|
+
const updateDesktop = () => this.isDesktop.set(window.innerWidth >= 1025);
|
|
5565
|
+
updateDesktop();
|
|
5566
|
+
window.addEventListener('resize', updateDesktop);
|
|
5567
|
+
}, { injector: inject(Injector) });
|
|
5568
|
+
// Set inline width on #cide-lyt-sidedrawer-wrapper: 350px when expanded on desktop, 32px when collapsed
|
|
5569
|
+
effect(() => {
|
|
5570
|
+
const expanded = this.isExpanded();
|
|
5571
|
+
const desktop = this.isDesktop();
|
|
5572
|
+
const el = document.querySelector('#cide-lyt-sidedrawer-wrapper');
|
|
5573
|
+
if (!el)
|
|
5574
|
+
return;
|
|
5575
|
+
if (expanded && desktop) {
|
|
5576
|
+
el.style.width = '350px';
|
|
5577
|
+
}
|
|
5578
|
+
else if (!expanded) {
|
|
5579
|
+
el.style.width = '32px';
|
|
5580
|
+
}
|
|
5581
|
+
else {
|
|
5582
|
+
el.style.width = '';
|
|
5583
|
+
}
|
|
5584
|
+
});
|
|
5560
5585
|
}
|
|
5561
5586
|
ngOnInit() {
|
|
5562
|
-
this.componentMap['drowar_notes'] = () => import('./cloud-ide-layout-sidedrawer-notes.component-
|
|
5563
|
-
this.componentMap['drawer_theme'] = () => import('./cloud-ide-layout-drawer-theme.component-
|
|
5587
|
+
this.componentMap['drowar_notes'] = () => import('./cloud-ide-layout-sidedrawer-notes.component-CgnwDxY7.mjs').then(m => m.CideLytSidedrawerNotesComponent);
|
|
5588
|
+
this.componentMap['drawer_theme'] = () => import('./cloud-ide-layout-drawer-theme.component-Dk3WKFoJ.mjs').then(m => m.CideLytDrawerThemeComponent);
|
|
5564
5589
|
if (this.aiDrawerComponent) {
|
|
5565
5590
|
this.componentMap['drawer_ai'] = () => Promise.resolve(this.aiDrawerComponent);
|
|
5566
5591
|
}
|
|
@@ -5711,7 +5736,7 @@ class CideLytSidedrawerWrapperComponent {
|
|
|
5711
5736
|
}
|
|
5712
5737
|
}
|
|
5713
5738
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CideLytSidedrawerWrapperComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
5714
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: CideLytSidedrawerWrapperComponent, isStandalone: true, selector: "cide-lyt-sidedrawer-wrapper", viewQueries: [{ propertyName: "notesContainer", first: true, predicate: ["notesContainer"], descendants: true, read: ViewContainerRef }], ngImport: i0, template: "@if (shouldShowSidedrawer()) {\n<nav [ngClass]=\"{\n 'expanded tw-min-w-[var(--cide-lyt-sidedrawer-wrapper-width-expanded-min)]': isExpanded(),\n 'tw-w-[var(--cide-lyt-sidedrawer-wrapper-width)]': !isExpanded()\n}\"\n id=\"cide-lyt-sidedrawer-wrapper\"
|
|
5739
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: CideLytSidedrawerWrapperComponent, isStandalone: true, selector: "cide-lyt-sidedrawer-wrapper", viewQueries: [{ propertyName: "notesContainer", first: true, predicate: ["notesContainer"], descendants: true, read: ViewContainerRef }], ngImport: i0, template: "@if (shouldShowSidedrawer()) {\n<nav [ngClass]=\"{\n 'expanded tw-min-w-[var(--cide-lyt-sidedrawer-wrapper-width-expanded-min)]': isExpanded(),\n 'tw-w-[var(--cide-lyt-sidedrawer-wrapper-width)]': !isExpanded()\n}\"\n id=\"cide-lyt-sidedrawer-wrapper\"\n class=\"tw-flex tw-relative tw-flex-col tw-items-stretch tw-justify-between tw-h-full tw-bg-white tw-shadow-lg tw-border-l tw-border-gray-200 tw-min-w-0\">\n <div parentElementSelector=\"#cide-lyt-outlet-sidedrawer-wrapper\"\n [minNextSize]=\"sidedrawerSetupData.cide_lyt_sidedrawer_width\" prevElementSelector=\"#cide-lyt-outlet-wrapper\"\n nextElementSelector=\"#cide-lyt-sidedrawer-wrapper\" cideEleResizer direction=\"horizontal\" to=\"right-to-left\">\n <div class=\"cide-lyt-devider-track tw-w-full tw-h-full\"></div>\n </div>\n <div class=\"tw-flex tw-justify-between tw-h-full tw-w-full tw-min-h-0 tw-flex-1\">\n <div class=\"tw-w-8 tw-h-full tw-border-r tw-border-gray-200\">\n <div class=\"sidedrawer-icon tw-flex tw-flex-col tw-items-center tw-gap-2\">\n @if (drawerItems(); as items) {\n @for (item of items; track item.configFor) {\n <div [title]=\"item.title\"\n (click)=\"onItemClick(item)\"\n (keydown.enter)=\"onItemClick(item)\"\n (keydown.space)=\"onItemClick(item); $event.preventDefault()\"\n role=\"button\"\n tabindex=\"0\"\n [attr.aria-label]=\"item.title\">\n <cide-ele-icon [cideEleTooltip]=\"item.title\" tooltipPlacement=\"left\" width=\"1.3rem\" height=\"1.5rem\" type=\"box\">{{ item.icon }}</cide-ele-icon>\n </div>\n }\n } @else {\n <cide-ele-skeleton-loader [width]=\"'2rem'\" [height]=\"'2rem'\" [count]=\"3\" [circle]=\"true\"></cide-ele-skeleton-loader>\n }\n @if (aiAllowed) {\n <div title=\"AI Assistant\"\n (click)=\"onAiClick()\"\n (keydown.enter)=\"onAiClick()\"\n (keydown.space)=\"onAiClick(); $event.preventDefault()\"\n role=\"button\"\n tabindex=\"0\"\n aria-label=\"AI Assistant (Alt+A)\">\n <cide-ele-icon [cideEleTooltip]=\"'AI Assistant (Alt+A)'\" tooltipPlacement=\"left\" name=\"cide-ai-sparkle\" width=\"1.3rem\" height=\"1.5rem\" type=\"box\"></cide-ele-icon>\n </div>\n }\n </div>\n </div>\n <div class=\"tw-flex-1 tw-min-h-0 cide-lyt-sidedrawer-wrapper-child-holder\">\n <div #notesContainer class=\"tw-flex-1 tw-min-h-0 tw-h-full tw-w-full tw-overflow-hidden\"></div>\n </div>\n </div>\n</nav>\n}", styles: [".cide-lyt-sidebar{display:flex;box-shadow:0 4px 12px var(--sidebar-shadow-color);overflow:hidden;background-color:var(--cide-theme-sidebar-color);--sidebar-tooltip-bg: var(--cide-theme-dark-color);--sidebar-tooltip-color: var(--cide-theme-light-color);--sidebar-shadow-color: var(--cide-theme-shadow-color, rgba(0, 0, 0, .05));transition:width .3s cubic-bezier(.4,0,.2,1);max-height:100%;isolation:isolate;will-change:width;position:relative}cide-ele-icon{color:var(--cide-theme-icon-color, var(--tw-gray-500));transition:all .2s ease}cide-ele-icon:hover{color:var(--cide-theme-icon-hover-color, var(--tw-gray-700));transform:scale(1.1)}.dark-mode .cide-lyt-sidebar{background-color:var(--cide-theme-dark-color)}.dark-mode .cide-lyt-devider-track{background-color:color-mix(in srgb,var(--cide-theme-dark-color) 70%,var(--cide-theme-black, #000));border-left-color:var(--cide-theme-dark-color)}.dark-mode .cide-lyt-devider-track:hover{background-color:color-mix(in srgb,var(--cide-theme-color-brand-primary) 20%,var(--cide-theme-dark-color))}.visually-hidden{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}@media (prefers-reduced-motion: reduce){*{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important;scroll-behavior:auto!important}}.tw-text-gray-500{color:var(--cide-theme-icon-color)}.hover\\:tw-text-gray-700:hover{color:var(--cide-theme-icon-hover-color)}.tw-text-gray-700{color:var(--cide-theme-text-color)}.tw-text-red-500,.tw-text-red-600,.tw-text-red-700{color:var(--cide-theme-error-color)}.tw-bg-gray-200{background-color:var(--cide-theme-border-color)}.hover\\:tw-bg-gray-100:hover{background-color:var(--cide-theme-hover-bg-color)}.tw-bg-white{background-color:var(--cide-theme-sidebar-color)}.tw-bg-green-500{background-color:var(--cide-theme-success-color)}.tw-border-gray-100,.tw-divide-gray-100{border-color:var(--cide-theme-border-color)}.tw-shadow-lg{box-shadow:0 10px 15px -3px var(--cide-theme-shadow-color),0 4px 6px -2px var(--cide-theme-shadow-color)}.tw-shadow-sm,.hover\\:tw-shadow:hover{box-shadow:0 1px 2px 0 var(--cide-theme-shadow-color)}.sidedrawer-icon{margin:.25rem 0}.cide-lyt-sidedrawer-wrapper-child-holder{display:flex;flex-direction:column;height:100%;min-height:0;min-width:0;width:100%;overflow:hidden;-webkit-overflow-scrolling:touch}#cide-lyt-sidedrawer-wrapper{display:flex;flex-direction:column;align-items:center;justify-content:space-between;height:100%;background-color:#fff;box-shadow:-2px 0 8px #0000000d;border-left:1px solid #e5e7eb;transition:width .3s cubic-bezier(.4,0,.2,1);overflow:hidden;position:relative}.sidedrawer-icon{display:flex;flex-direction:column;align-items:center;gap:.5rem;padding:.5rem 0;width:100%}.sidedrawer-icon .sidedrawer-icon-item{min-width:44px;min-height:44px;touch-action:manipulation}@media screen and (max-width: 768px){#cide-lyt-sidedrawer-wrapper{position:fixed;top:0;right:0;bottom:0;width:0;min-width:0;z-index:45;transform:translate(100%);transition:transform .3s cubic-bezier(.4,0,.2,1),width .3s cubic-bezier(.4,0,.2,1);box-shadow:-4px 0 16px #00000026}#cide-lyt-sidedrawer-wrapper.mobile-open,#cide-lyt-sidedrawer-wrapper.expanded{width:280px;min-width:280px;max-width:85vw;transform:translate(0)}.sidedrawer-overlay{position:fixed;inset:0;background-color:#0006;backdrop-filter:blur(2px);-webkit-backdrop-filter:blur(2px);opacity:0;pointer-events:none;transition:opacity .3s ease;z-index:40}.sidedrawer-overlay.active{opacity:1;pointer-events:auto}.sidedrawer-icon{gap:.375rem;padding:.375rem 0}.cide-lyt-sidedrawer-wrapper-child-holder{padding:.5rem;font-size:.875rem}.cide-lyt-devider-track{display:none}}@media screen and (max-width: 480px){#cide-lyt-sidedrawer-wrapper.mobile-open,#cide-lyt-sidedrawer-wrapper.expanded{width:260px;min-width:260px;max-width:90vw}.sidedrawer-icon{gap:.25rem;padding:.25rem 0}.cide-lyt-sidedrawer-wrapper-child-holder{padding:.375rem;font-size:.8125rem}}@media screen and (min-width: 769px) and (max-width: 1024px){#cide-lyt-sidedrawer-wrapper{min-width:250px}.sidedrawer-icon{gap:.5rem}}@media screen and (max-width: 768px) and (orientation: landscape){#cide-lyt-sidedrawer-wrapper.mobile-open,#cide-lyt-sidedrawer-wrapper.expanded{width:300px;max-width:70vw}.sidedrawer-icon{gap:.25rem;padding:.25rem 0}}@media (hover: none) and (pointer: coarse){.sidedrawer-icon button{min-width:48px;min-height:48px}cide-ele-icon:hover{transform:none}.sidedrawer-icon button:active{transform:scale(.95);background-color:#3b82f61a}}.cide-lyt-sidedrawer-wrapper-child-holder::-webkit-scrollbar{width:6px}.cide-lyt-sidedrawer-wrapper-child-holder::-webkit-scrollbar-track{background:transparent}.cide-lyt-sidedrawer-wrapper-child-holder::-webkit-scrollbar-thumb{background-color:#d1d5db;border-radius:3px}.cide-lyt-sidedrawer-wrapper-child-holder::-webkit-scrollbar-thumb:hover{background-color:#9ca3af}:root[data-theme=dark] .cide-lyt-sidedrawer-wrapper-child-holder::-webkit-scrollbar-thumb,:root.dark-mode .cide-lyt-sidedrawer-wrapper-child-holder::-webkit-scrollbar-thumb{background-color:#4b5563}:root[data-theme=dark] .cide-lyt-sidedrawer-wrapper-child-holder::-webkit-scrollbar-thumb:hover,:root.dark-mode .cide-lyt-sidedrawer-wrapper-child-holder::-webkit-scrollbar-thumb:hover{background-color:#6b7280}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: CideIconComponent, selector: "cide-ele-icon", inputs: ["size", "type", "toolTip", "name"] }, { kind: "directive", type: CideEleResizerDirective, selector: "[cideEleResizer]", inputs: ["direction", "to", "prevElementSelector", "nextElementSelector", "parentElementSelector", "minPrevSize", "minNextSize", "usePercentage"], outputs: ["resizeStart", "resizing", "resizeEnd"] }, { kind: "component", type: CideEleSkeletonLoaderComponent, selector: "cide-ele-skeleton-loader", inputs: ["width", "height", "borderRadius", "count", "circle", "animation"] }, { kind: "directive", type: TooltipDirective, selector: "[cideEleTooltip]", inputs: ["cideEleTooltip", "tooltipColor", "tooltipBg", "tooltipPlacement", "tooltipType", "tooltipDelay", "tooltipDir", "tooltipShowArrow", "tooltipMultiline", "tooltipMaxWidth", "tooltipInteractive", "tooltipClass"] }] });
|
|
5715
5740
|
}
|
|
5716
5741
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CideLytSidedrawerWrapperComponent, decorators: [{
|
|
5717
5742
|
type: Component,
|
|
@@ -5721,7 +5746,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
|
|
|
5721
5746
|
CideEleResizerDirective,
|
|
5722
5747
|
CideEleSkeletonLoaderComponent,
|
|
5723
5748
|
TooltipDirective
|
|
5724
|
-
], template: "@if (shouldShowSidedrawer()) {\n<nav [ngClass]=\"{\n 'expanded tw-min-w-[var(--cide-lyt-sidedrawer-wrapper-width-expanded-min)]': isExpanded(),\n 'tw-w-[var(--cide-lyt-sidedrawer-wrapper-width)]': !isExpanded()\n}\"\n id=\"cide-lyt-sidedrawer-wrapper\"
|
|
5749
|
+
], template: "@if (shouldShowSidedrawer()) {\n<nav [ngClass]=\"{\n 'expanded tw-min-w-[var(--cide-lyt-sidedrawer-wrapper-width-expanded-min)]': isExpanded(),\n 'tw-w-[var(--cide-lyt-sidedrawer-wrapper-width)]': !isExpanded()\n}\"\n id=\"cide-lyt-sidedrawer-wrapper\"\n class=\"tw-flex tw-relative tw-flex-col tw-items-stretch tw-justify-between tw-h-full tw-bg-white tw-shadow-lg tw-border-l tw-border-gray-200 tw-min-w-0\">\n <div parentElementSelector=\"#cide-lyt-outlet-sidedrawer-wrapper\"\n [minNextSize]=\"sidedrawerSetupData.cide_lyt_sidedrawer_width\" prevElementSelector=\"#cide-lyt-outlet-wrapper\"\n nextElementSelector=\"#cide-lyt-sidedrawer-wrapper\" cideEleResizer direction=\"horizontal\" to=\"right-to-left\">\n <div class=\"cide-lyt-devider-track tw-w-full tw-h-full\"></div>\n </div>\n <div class=\"tw-flex tw-justify-between tw-h-full tw-w-full tw-min-h-0 tw-flex-1\">\n <div class=\"tw-w-8 tw-h-full tw-border-r tw-border-gray-200\">\n <div class=\"sidedrawer-icon tw-flex tw-flex-col tw-items-center tw-gap-2\">\n @if (drawerItems(); as items) {\n @for (item of items; track item.configFor) {\n <div [title]=\"item.title\"\n (click)=\"onItemClick(item)\"\n (keydown.enter)=\"onItemClick(item)\"\n (keydown.space)=\"onItemClick(item); $event.preventDefault()\"\n role=\"button\"\n tabindex=\"0\"\n [attr.aria-label]=\"item.title\">\n <cide-ele-icon [cideEleTooltip]=\"item.title\" tooltipPlacement=\"left\" width=\"1.3rem\" height=\"1.5rem\" type=\"box\">{{ item.icon }}</cide-ele-icon>\n </div>\n }\n } @else {\n <cide-ele-skeleton-loader [width]=\"'2rem'\" [height]=\"'2rem'\" [count]=\"3\" [circle]=\"true\"></cide-ele-skeleton-loader>\n }\n @if (aiAllowed) {\n <div title=\"AI Assistant\"\n (click)=\"onAiClick()\"\n (keydown.enter)=\"onAiClick()\"\n (keydown.space)=\"onAiClick(); $event.preventDefault()\"\n role=\"button\"\n tabindex=\"0\"\n aria-label=\"AI Assistant (Alt+A)\">\n <cide-ele-icon [cideEleTooltip]=\"'AI Assistant (Alt+A)'\" tooltipPlacement=\"left\" name=\"cide-ai-sparkle\" width=\"1.3rem\" height=\"1.5rem\" type=\"box\"></cide-ele-icon>\n </div>\n }\n </div>\n </div>\n <div class=\"tw-flex-1 tw-min-h-0 cide-lyt-sidedrawer-wrapper-child-holder\">\n <div #notesContainer class=\"tw-flex-1 tw-min-h-0 tw-h-full tw-w-full tw-overflow-hidden\"></div>\n </div>\n </div>\n</nav>\n}", styles: [".cide-lyt-sidebar{display:flex;box-shadow:0 4px 12px var(--sidebar-shadow-color);overflow:hidden;background-color:var(--cide-theme-sidebar-color);--sidebar-tooltip-bg: var(--cide-theme-dark-color);--sidebar-tooltip-color: var(--cide-theme-light-color);--sidebar-shadow-color: var(--cide-theme-shadow-color, rgba(0, 0, 0, .05));transition:width .3s cubic-bezier(.4,0,.2,1);max-height:100%;isolation:isolate;will-change:width;position:relative}cide-ele-icon{color:var(--cide-theme-icon-color, var(--tw-gray-500));transition:all .2s ease}cide-ele-icon:hover{color:var(--cide-theme-icon-hover-color, var(--tw-gray-700));transform:scale(1.1)}.dark-mode .cide-lyt-sidebar{background-color:var(--cide-theme-dark-color)}.dark-mode .cide-lyt-devider-track{background-color:color-mix(in srgb,var(--cide-theme-dark-color) 70%,var(--cide-theme-black, #000));border-left-color:var(--cide-theme-dark-color)}.dark-mode .cide-lyt-devider-track:hover{background-color:color-mix(in srgb,var(--cide-theme-color-brand-primary) 20%,var(--cide-theme-dark-color))}.visually-hidden{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}@media (prefers-reduced-motion: reduce){*{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important;scroll-behavior:auto!important}}.tw-text-gray-500{color:var(--cide-theme-icon-color)}.hover\\:tw-text-gray-700:hover{color:var(--cide-theme-icon-hover-color)}.tw-text-gray-700{color:var(--cide-theme-text-color)}.tw-text-red-500,.tw-text-red-600,.tw-text-red-700{color:var(--cide-theme-error-color)}.tw-bg-gray-200{background-color:var(--cide-theme-border-color)}.hover\\:tw-bg-gray-100:hover{background-color:var(--cide-theme-hover-bg-color)}.tw-bg-white{background-color:var(--cide-theme-sidebar-color)}.tw-bg-green-500{background-color:var(--cide-theme-success-color)}.tw-border-gray-100,.tw-divide-gray-100{border-color:var(--cide-theme-border-color)}.tw-shadow-lg{box-shadow:0 10px 15px -3px var(--cide-theme-shadow-color),0 4px 6px -2px var(--cide-theme-shadow-color)}.tw-shadow-sm,.hover\\:tw-shadow:hover{box-shadow:0 1px 2px 0 var(--cide-theme-shadow-color)}.sidedrawer-icon{margin:.25rem 0}.cide-lyt-sidedrawer-wrapper-child-holder{display:flex;flex-direction:column;height:100%;min-height:0;min-width:0;width:100%;overflow:hidden;-webkit-overflow-scrolling:touch}#cide-lyt-sidedrawer-wrapper{display:flex;flex-direction:column;align-items:center;justify-content:space-between;height:100%;background-color:#fff;box-shadow:-2px 0 8px #0000000d;border-left:1px solid #e5e7eb;transition:width .3s cubic-bezier(.4,0,.2,1);overflow:hidden;position:relative}.sidedrawer-icon{display:flex;flex-direction:column;align-items:center;gap:.5rem;padding:.5rem 0;width:100%}.sidedrawer-icon .sidedrawer-icon-item{min-width:44px;min-height:44px;touch-action:manipulation}@media screen and (max-width: 768px){#cide-lyt-sidedrawer-wrapper{position:fixed;top:0;right:0;bottom:0;width:0;min-width:0;z-index:45;transform:translate(100%);transition:transform .3s cubic-bezier(.4,0,.2,1),width .3s cubic-bezier(.4,0,.2,1);box-shadow:-4px 0 16px #00000026}#cide-lyt-sidedrawer-wrapper.mobile-open,#cide-lyt-sidedrawer-wrapper.expanded{width:280px;min-width:280px;max-width:85vw;transform:translate(0)}.sidedrawer-overlay{position:fixed;inset:0;background-color:#0006;backdrop-filter:blur(2px);-webkit-backdrop-filter:blur(2px);opacity:0;pointer-events:none;transition:opacity .3s ease;z-index:40}.sidedrawer-overlay.active{opacity:1;pointer-events:auto}.sidedrawer-icon{gap:.375rem;padding:.375rem 0}.cide-lyt-sidedrawer-wrapper-child-holder{padding:.5rem;font-size:.875rem}.cide-lyt-devider-track{display:none}}@media screen and (max-width: 480px){#cide-lyt-sidedrawer-wrapper.mobile-open,#cide-lyt-sidedrawer-wrapper.expanded{width:260px;min-width:260px;max-width:90vw}.sidedrawer-icon{gap:.25rem;padding:.25rem 0}.cide-lyt-sidedrawer-wrapper-child-holder{padding:.375rem;font-size:.8125rem}}@media screen and (min-width: 769px) and (max-width: 1024px){#cide-lyt-sidedrawer-wrapper{min-width:250px}.sidedrawer-icon{gap:.5rem}}@media screen and (max-width: 768px) and (orientation: landscape){#cide-lyt-sidedrawer-wrapper.mobile-open,#cide-lyt-sidedrawer-wrapper.expanded{width:300px;max-width:70vw}.sidedrawer-icon{gap:.25rem;padding:.25rem 0}}@media (hover: none) and (pointer: coarse){.sidedrawer-icon button{min-width:48px;min-height:48px}cide-ele-icon:hover{transform:none}.sidedrawer-icon button:active{transform:scale(.95);background-color:#3b82f61a}}.cide-lyt-sidedrawer-wrapper-child-holder::-webkit-scrollbar{width:6px}.cide-lyt-sidedrawer-wrapper-child-holder::-webkit-scrollbar-track{background:transparent}.cide-lyt-sidedrawer-wrapper-child-holder::-webkit-scrollbar-thumb{background-color:#d1d5db;border-radius:3px}.cide-lyt-sidedrawer-wrapper-child-holder::-webkit-scrollbar-thumb:hover{background-color:#9ca3af}:root[data-theme=dark] .cide-lyt-sidedrawer-wrapper-child-holder::-webkit-scrollbar-thumb,:root.dark-mode .cide-lyt-sidedrawer-wrapper-child-holder::-webkit-scrollbar-thumb{background-color:#4b5563}:root[data-theme=dark] .cide-lyt-sidedrawer-wrapper-child-holder::-webkit-scrollbar-thumb:hover,:root.dark-mode .cide-lyt-sidedrawer-wrapper-child-holder::-webkit-scrollbar-thumb:hover{background-color:#6b7280}\n"] }]
|
|
5725
5750
|
}], ctorParameters: () => [], propDecorators: { notesContainer: [{
|
|
5726
5751
|
type: ViewChild,
|
|
5727
5752
|
args: ['notesContainer', { read: ViewContainerRef }]
|
|
@@ -7297,7 +7322,7 @@ const layoutControlPannelChildRoutes = [{
|
|
|
7297
7322
|
},
|
|
7298
7323
|
{
|
|
7299
7324
|
path: "home",
|
|
7300
|
-
loadComponent: () => import('./cloud-ide-layout-home-wrapper.component-
|
|
7325
|
+
loadComponent: () => import('./cloud-ide-layout-home-wrapper.component-3K6mOLI1.mjs').then(c => c.CideLytHomeWrapperComponent),
|
|
7301
7326
|
canActivate: [authGuard],
|
|
7302
7327
|
data: {
|
|
7303
7328
|
sypg_page_code: "cide_lyt_home" // Used by RequestService to fetch tab properties
|
|
@@ -7305,7 +7330,7 @@ const layoutControlPannelChildRoutes = [{
|
|
|
7305
7330
|
},
|
|
7306
7331
|
{
|
|
7307
7332
|
path: "dashboard-manager",
|
|
7308
|
-
loadComponent: () => import('./cloud-ide-layout-dashboard-manager.component-
|
|
7333
|
+
loadComponent: () => import('./cloud-ide-layout-dashboard-manager.component-cJaRAYmj.mjs').then(c => c.DashboardManagerComponent),
|
|
7309
7334
|
canActivate: [authGuard],
|
|
7310
7335
|
data: {
|
|
7311
7336
|
sypg_page_code: "cide_lyt_dashboard_manager"
|
|
@@ -7313,7 +7338,7 @@ const layoutControlPannelChildRoutes = [{
|
|
|
7313
7338
|
},
|
|
7314
7339
|
{
|
|
7315
7340
|
path: "api-endpoint-manager",
|
|
7316
|
-
loadComponent: () => import('./cloud-ide-layout-api-endpoint-manager.component-
|
|
7341
|
+
loadComponent: () => import('./cloud-ide-layout-api-endpoint-manager.component-BYs0Pm1S.mjs').then(c => c.ApiEndpointManagerComponent),
|
|
7317
7342
|
canActivate: [authGuard],
|
|
7318
7343
|
data: {
|
|
7319
7344
|
sypg_page_code: "cide_lyt_api_endpoint_manager"
|
|
@@ -9131,4 +9156,4 @@ var floatingEntitySelection_component = /*#__PURE__*/Object.freeze({
|
|
|
9131
9156
|
*/
|
|
9132
9157
|
|
|
9133
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 };
|
|
9134
|
-
//# sourceMappingURL=cloud-ide-layout-cloud-ide-layout-
|
|
9159
|
+
//# sourceMappingURL=cloud-ide-layout-cloud-ide-layout-jM63sEp6.mjs.map
|