cloud-ide-core 2.0.104 → 2.0.110
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-core-page-form.component-C3xTQLI3.mjs +527 -0
- package/fesm2022/cloud-ide-core-page-form.component-C3xTQLI3.mjs.map +1 -0
- package/fesm2022/cloud-ide-core.mjs +2008 -1852
- package/fesm2022/cloud-ide-core.mjs.map +1 -1
- package/index.d.ts +11 -3
- package/package.json +1 -1
- package/fesm2022/cloud-ide-core-page-form.component-C4jj3p3H.mjs +0 -238
- package/fesm2022/cloud-ide-core-page-form.component-C4jj3p3H.mjs.map +0 -1
package/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Route, Router } from '@angular/router';
|
|
1
|
+
import { Route, Router, ActivatedRoute } from '@angular/router';
|
|
2
2
|
import * as _angular_core from '@angular/core';
|
|
3
3
|
import { OnInit, TemplateRef, AfterViewInit, OnDestroy } from '@angular/core';
|
|
4
4
|
import * as _angular_forms from '@angular/forms';
|
|
@@ -58,7 +58,7 @@ declare class MenuListComponent implements OnInit {
|
|
|
58
58
|
quickAddForm: _angular_forms.FormGroup<{
|
|
59
59
|
syme_title: _angular_forms.FormControl<string>;
|
|
60
60
|
syme_desc: _angular_forms.FormControl<string>;
|
|
61
|
-
syme_type: _angular_forms.FormControl<"
|
|
61
|
+
syme_type: _angular_forms.FormControl<"menu" | "module" | "section" | "title">;
|
|
62
62
|
syme_id_syme: _angular_forms.FormControl<string>;
|
|
63
63
|
syme_path: _angular_forms.FormControl<string>;
|
|
64
64
|
syme_icon: _angular_forms.FormControl<string>;
|
|
@@ -1377,6 +1377,7 @@ declare class CideCorePageThemeComponent implements OnInit {
|
|
|
1377
1377
|
private fb;
|
|
1378
1378
|
private router;
|
|
1379
1379
|
private route;
|
|
1380
|
+
private confirmationService;
|
|
1380
1381
|
themeDetailsRendererTemplate: _angular_core.Signal<TemplateRef<TemplateContext<Record<string, unknown>>>>;
|
|
1381
1382
|
themeStatusRendererTemplate: _angular_core.Signal<TemplateRef<TemplateContext<Record<string, unknown>>>>;
|
|
1382
1383
|
actionsDropdownRendererTemplate: _angular_core.Signal<TemplateRef<TemplateContext<Record<string, unknown>>>>;
|
|
@@ -1599,7 +1600,7 @@ declare class CideCorePageControlsComponent implements OnInit {
|
|
|
1599
1600
|
sype_helper_text_collapse: _angular_forms.FormControl<boolean>;
|
|
1600
1601
|
sype_default: _angular_forms.FormControl<string | number | boolean>;
|
|
1601
1602
|
sype_tooltip: _angular_forms.FormControl<string>;
|
|
1602
|
-
sype_size: _angular_forms.FormControl<"
|
|
1603
|
+
sype_size: _angular_forms.FormControl<"lg" | "xs" | "sm" | "md" | "xl" | "3xs" | "2xs" | "xxl">;
|
|
1603
1604
|
sype_leading_icon: _angular_forms.FormControl<string>;
|
|
1604
1605
|
sype_isactive: _angular_forms.FormControl<boolean>;
|
|
1605
1606
|
sype_entity_id_syen: _angular_forms.FormControl<string>;
|
|
@@ -2563,9 +2564,11 @@ declare class CideCoreUserMasterService {
|
|
|
2563
2564
|
|
|
2564
2565
|
declare class CideCoreUserListComponent implements OnInit, AfterViewInit {
|
|
2565
2566
|
router: Router;
|
|
2567
|
+
route: ActivatedRoute;
|
|
2566
2568
|
userMasterService: CideCoreUserMasterService;
|
|
2567
2569
|
appState: AppStateHelperService;
|
|
2568
2570
|
private rightsService;
|
|
2571
|
+
private destroyRef;
|
|
2569
2572
|
gridComponent: CideEleDataGridComponent<any>;
|
|
2570
2573
|
actionsTemplate: TemplateRef<any>;
|
|
2571
2574
|
userDetailsTemplate: TemplateRef<any>;
|
|
@@ -2583,6 +2586,9 @@ declare class CideCoreUserListComponent implements OnInit, AfterViewInit {
|
|
|
2583
2586
|
searchQuery: _angular_core.WritableSignal<string>;
|
|
2584
2587
|
sortColumn: _angular_core.WritableSignal<string>;
|
|
2585
2588
|
sortDirection: _angular_core.WritableSignal<"asc" | "desc">;
|
|
2589
|
+
userType: _angular_core.WritableSignal<string | null>;
|
|
2590
|
+
userTypeLabel: _angular_core.Signal<"Student" | "Faculty" | "User">;
|
|
2591
|
+
userTypeLabelPlural: _angular_core.Signal<"Faculty" | "Students" | "Users">;
|
|
2586
2592
|
canCreate: _angular_core.Signal<boolean>;
|
|
2587
2593
|
canEdit: _angular_core.Signal<boolean>;
|
|
2588
2594
|
canDelete: _angular_core.Signal<boolean>;
|
|
@@ -2591,6 +2597,7 @@ declare class CideCoreUserListComponent implements OnInit, AfterViewInit {
|
|
|
2591
2597
|
templateRenderers: Record<string, TemplateRef<any>>;
|
|
2592
2598
|
ngOnInit(): void;
|
|
2593
2599
|
ngAfterViewInit(): void;
|
|
2600
|
+
private updateGridConfig;
|
|
2594
2601
|
onGridEvent(event: GridEvent<any>): void;
|
|
2595
2602
|
onUserRowClick(user: any): void;
|
|
2596
2603
|
onUserRefresh(): void;
|
|
@@ -2618,6 +2625,7 @@ declare class CideCoreUserListComponent implements OnInit, AfterViewInit {
|
|
|
2618
2625
|
getValidityEndText(dateString: string | undefined): string;
|
|
2619
2626
|
getUserInitials(firstName: string, lastName: string): string;
|
|
2620
2627
|
getPasswordChangeText(requiresChange: boolean): string;
|
|
2628
|
+
getUserTypeIdLabel(): string;
|
|
2621
2629
|
getDropdownItems(user: AuthUserMst): DropdownItem[];
|
|
2622
2630
|
onDropdownItemClick(item: DropdownItem, user: AuthUserMst): void;
|
|
2623
2631
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<CideCoreUserListComponent, never>;
|
package/package.json
CHANGED
|
@@ -1,238 +0,0 @@
|
|
|
1
|
-
import * as i0 from '@angular/core';
|
|
2
|
-
import { inject, DestroyRef, signal, computed, Component } from '@angular/core';
|
|
3
|
-
import { CommonModule } from '@angular/common';
|
|
4
|
-
import * as i1 from '@angular/forms';
|
|
5
|
-
import { NonNullableFormBuilder, Validators, ReactiveFormsModule, FormsModule } from '@angular/forms';
|
|
6
|
-
import { Router, ActivatedRoute } from '@angular/router';
|
|
7
|
-
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
8
|
-
import { CideCorePageManagementService } from './cloud-ide-core.mjs';
|
|
9
|
-
import { AppStateHelperService, ComponentContextService, RightsService } from 'cloud-ide-layout';
|
|
10
|
-
import { CideEleButtonComponent, CideInputComponent, CideTextareaComponent, CideEleJsonEditorComponent, CideFormFieldErrorComponent } from 'cloud-ide-element';
|
|
11
|
-
import { generateObjectFromString } from 'cloud-ide-lms-model';
|
|
12
|
-
|
|
13
|
-
class CideCorePageFormComponent {
|
|
14
|
-
destroyRef = inject(DestroyRef);
|
|
15
|
-
pageService = inject(CideCorePageManagementService);
|
|
16
|
-
appState = inject(AppStateHelperService);
|
|
17
|
-
fb = inject(NonNullableFormBuilder);
|
|
18
|
-
router = inject(Router);
|
|
19
|
-
route = inject(ActivatedRoute);
|
|
20
|
-
componentContextService = inject(ComponentContextService);
|
|
21
|
-
rightsService = inject(RightsService);
|
|
22
|
-
loading = signal(false, ...(ngDevMode ? [{ debugName: "loading" }] : []));
|
|
23
|
-
error = signal(null, ...(ngDevMode ? [{ debugName: "error" }] : []));
|
|
24
|
-
success = signal(null, ...(ngDevMode ? [{ debugName: "success" }] : []));
|
|
25
|
-
// Page information
|
|
26
|
-
pageId = signal(null, ...(ngDevMode ? [{ debugName: "pageId" }] : []));
|
|
27
|
-
isEditMode = signal(false, ...(ngDevMode ? [{ debugName: "isEditMode" }] : []));
|
|
28
|
-
pageForm = this.fb.group({
|
|
29
|
-
sypg_title: ['', [Validators.required, Validators.maxLength(100)]],
|
|
30
|
-
sypg_desc: ['', [Validators.maxLength(255)]],
|
|
31
|
-
sypg_page_code: ['', [Validators.required, Validators.maxLength(40), Validators.pattern(/^[a-zA-Z0-9_]+$/)]],
|
|
32
|
-
sypg_configuration: ['{}', [Validators.required]],
|
|
33
|
-
sypg_isactive: [true]
|
|
34
|
-
});
|
|
35
|
-
constructor() {
|
|
36
|
-
this.setupFormSubscriptions();
|
|
37
|
-
}
|
|
38
|
-
ngOnInit() {
|
|
39
|
-
// Initialize rights for page management
|
|
40
|
-
this.rightsService.initializeRights('core_page_management');
|
|
41
|
-
// Check for page ID in query parameters
|
|
42
|
-
this.checkForPageId();
|
|
43
|
-
}
|
|
44
|
-
// Check for page ID in query parameters
|
|
45
|
-
checkForPageId() {
|
|
46
|
-
console.log('🔍 Checking for page ID in query parameters', this.route.params);
|
|
47
|
-
this.route.params.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(params => {
|
|
48
|
-
console.log('🔍 Query params:', params);
|
|
49
|
-
// Check for pageId, id, or page parameter
|
|
50
|
-
const queryParams = params['query'];
|
|
51
|
-
const queryData = generateObjectFromString(queryParams);
|
|
52
|
-
// If pageId is an object string (from generateStringFromObject), try to parse it
|
|
53
|
-
const pageId = queryData.sypg_id;
|
|
54
|
-
if (pageId) {
|
|
55
|
-
console.log('🔍 Page ID found in query params:', pageId);
|
|
56
|
-
this.pageId.set(pageId);
|
|
57
|
-
this.isEditMode.set(true);
|
|
58
|
-
this.loadPageData(pageId);
|
|
59
|
-
}
|
|
60
|
-
else {
|
|
61
|
-
console.log('🆕 No page ID found - creating new page');
|
|
62
|
-
this.isEditMode.set(false);
|
|
63
|
-
this.pageId.set(null);
|
|
64
|
-
}
|
|
65
|
-
});
|
|
66
|
-
}
|
|
67
|
-
// Load page data for editing
|
|
68
|
-
loadPageData(pageId) {
|
|
69
|
-
this.loading.set(true);
|
|
70
|
-
this.error.set(null);
|
|
71
|
-
console.log('📥 Loading page data for ID:', pageId);
|
|
72
|
-
this.pageService.getPageById(pageId).pipe(takeUntilDestroyed(this.destroyRef)).subscribe({
|
|
73
|
-
next: (response) => {
|
|
74
|
-
console.log('✅ Page data loaded:', response);
|
|
75
|
-
if (response?.success && response?.data) {
|
|
76
|
-
const pageData = response.data;
|
|
77
|
-
if (pageData) {
|
|
78
|
-
this.populateFormWithPageData(pageData);
|
|
79
|
-
this.success.set('Page data loaded successfully');
|
|
80
|
-
}
|
|
81
|
-
else {
|
|
82
|
-
this.error.set('Page data not found');
|
|
83
|
-
console.error('❌ Page data not found in response:', response);
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
else {
|
|
87
|
-
this.error.set('Failed to load page data');
|
|
88
|
-
console.error('❌ Page data response invalid:', response);
|
|
89
|
-
}
|
|
90
|
-
this.loading.set(false);
|
|
91
|
-
},
|
|
92
|
-
error: (err) => {
|
|
93
|
-
console.error('❌ Failed to load page data:', err);
|
|
94
|
-
let errorMessage = 'Failed to load page data.';
|
|
95
|
-
if (err?.error?.message) {
|
|
96
|
-
errorMessage = err.error.message;
|
|
97
|
-
}
|
|
98
|
-
else if (err?.message) {
|
|
99
|
-
errorMessage = err.message;
|
|
100
|
-
}
|
|
101
|
-
else if (err?.status === 404) {
|
|
102
|
-
errorMessage = 'Page not found.';
|
|
103
|
-
}
|
|
104
|
-
else if (err?.status === 500) {
|
|
105
|
-
errorMessage = 'Server error. Please try again later.';
|
|
106
|
-
}
|
|
107
|
-
this.error.set(errorMessage);
|
|
108
|
-
this.loading.set(false);
|
|
109
|
-
}
|
|
110
|
-
});
|
|
111
|
-
}
|
|
112
|
-
// Populate form with page data
|
|
113
|
-
populateFormWithPageData(pageData) {
|
|
114
|
-
try {
|
|
115
|
-
console.log('📝 Populating form with page data:', pageData);
|
|
116
|
-
const formData = {
|
|
117
|
-
sypg_title: pageData.sypg_title || '',
|
|
118
|
-
sypg_desc: pageData.sypg_desc || '',
|
|
119
|
-
sypg_page_code: pageData.sypg_page_code || '',
|
|
120
|
-
sypg_configuration: pageData.sypg_configuration ? JSON.stringify(pageData.sypg_configuration) : '{}',
|
|
121
|
-
sypg_isactive: pageData.sypg_isactive !== undefined ? pageData.sypg_isactive : true
|
|
122
|
-
};
|
|
123
|
-
// Patch the form with the page data
|
|
124
|
-
this.pageForm.patchValue(formData, { emitEvent: false });
|
|
125
|
-
console.log('✅ Form populated successfully');
|
|
126
|
-
}
|
|
127
|
-
catch (error) {
|
|
128
|
-
console.error('💥 Error populating form with page data:', error);
|
|
129
|
-
this.error.set('Error loading page data into form');
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
setupFormSubscriptions() {
|
|
133
|
-
// Watch for form changes to enable/disable save button
|
|
134
|
-
this.pageForm.valueChanges
|
|
135
|
-
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
136
|
-
.subscribe(() => {
|
|
137
|
-
// Form validation is handled by computed signals
|
|
138
|
-
});
|
|
139
|
-
}
|
|
140
|
-
// Computed values
|
|
141
|
-
isFormDirty = computed(() => this.pageForm.dirty, ...(ngDevMode ? [{ debugName: "isFormDirty" }] : []));
|
|
142
|
-
// Rights computed signals
|
|
143
|
-
canCreate = computed(() => this.rightsService.hasRight('CREATE'), ...(ngDevMode ? [{ debugName: "canCreate" }] : []));
|
|
144
|
-
canEdit = computed(() => this.rightsService.hasRight('EDIT'), ...(ngDevMode ? [{ debugName: "canEdit" }] : []));
|
|
145
|
-
canView = computed(() => this.rightsService.hasRight('VIEW'), ...(ngDevMode ? [{ debugName: "canView" }] : []));
|
|
146
|
-
// Form submission
|
|
147
|
-
savePage() {
|
|
148
|
-
const requiredRight = this.isEditMode() ? 'EDIT' : 'CREATE';
|
|
149
|
-
if (!this.rightsService.hasRight(requiredRight)) {
|
|
150
|
-
this.error.set(`You do not have permission to ${this.isEditMode() ? 'edit' : 'create'} pages`);
|
|
151
|
-
return;
|
|
152
|
-
}
|
|
153
|
-
if (!this.pageForm.valid) {
|
|
154
|
-
this.markFormAsTouched();
|
|
155
|
-
return;
|
|
156
|
-
}
|
|
157
|
-
const formValue = this.pageForm.getRawValue();
|
|
158
|
-
const pageData = {
|
|
159
|
-
_id: this.pageId() || '',
|
|
160
|
-
sypg_title: formValue.sypg_title,
|
|
161
|
-
sypg_desc: formValue.sypg_desc,
|
|
162
|
-
sypg_page_code: formValue.sypg_page_code,
|
|
163
|
-
sypg_configuration: formValue.sypg_configuration,
|
|
164
|
-
sypg_isactive: formValue.sypg_isactive
|
|
165
|
-
};
|
|
166
|
-
this.loading.set(true);
|
|
167
|
-
this.error.set(null);
|
|
168
|
-
this.pageService.createOrUpdatePage(pageData)
|
|
169
|
-
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
170
|
-
.subscribe({
|
|
171
|
-
next: (response) => {
|
|
172
|
-
if (response.success) {
|
|
173
|
-
this.success.set(this.isEditMode() ? 'Page updated successfully' : 'Page created successfully');
|
|
174
|
-
console.log('✅ Page saved successfully');
|
|
175
|
-
// Use ComponentContextService to close tab or floating container
|
|
176
|
-
setTimeout(() => {
|
|
177
|
-
this.componentContextService.close(['/control-panel/page']);
|
|
178
|
-
}, 1500);
|
|
179
|
-
}
|
|
180
|
-
else {
|
|
181
|
-
this.error.set(response.message || 'Failed to save page');
|
|
182
|
-
console.error('❌ Failed to save page:', response.message);
|
|
183
|
-
}
|
|
184
|
-
this.loading.set(false);
|
|
185
|
-
},
|
|
186
|
-
error: (error) => {
|
|
187
|
-
console.error('❌ Error saving page:', error);
|
|
188
|
-
this.error.set('Failed to save page. Please try again.');
|
|
189
|
-
this.loading.set(false);
|
|
190
|
-
}
|
|
191
|
-
});
|
|
192
|
-
}
|
|
193
|
-
// Cancel form
|
|
194
|
-
cancelForm() {
|
|
195
|
-
this.componentContextService.close(['/control-panel/page']);
|
|
196
|
-
}
|
|
197
|
-
// Go back to page list
|
|
198
|
-
goBack() {
|
|
199
|
-
this.componentContextService.close(['/control-panel/page']);
|
|
200
|
-
}
|
|
201
|
-
// Reset form - reload data in edit mode, reset to defaults in create mode
|
|
202
|
-
resetForm() {
|
|
203
|
-
if (this.isEditMode() && this.pageId()) {
|
|
204
|
-
this.loadPageData(this.pageId());
|
|
205
|
-
}
|
|
206
|
-
else {
|
|
207
|
-
this.pageForm.reset({
|
|
208
|
-
sypg_isactive: true,
|
|
209
|
-
sypg_configuration: '{}'
|
|
210
|
-
});
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
// Mark form as touched to trigger validation display
|
|
214
|
-
markFormAsTouched() {
|
|
215
|
-
Object.keys(this.pageForm.controls).forEach(key => {
|
|
216
|
-
const control = this.pageForm.get(key);
|
|
217
|
-
control?.markAsTouched();
|
|
218
|
-
});
|
|
219
|
-
}
|
|
220
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: CideCorePageFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
221
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.7", type: CideCorePageFormComponent, isStandalone: true, selector: "cide-core-page-form", ngImport: i0, template: "<div class=\"page-form-wrapper\">\n <div class=\"page-form-container\">\n <form class=\"page-form\" [formGroup]=\"pageForm\" [class.loading]=\"loading()\" (ngSubmit)=\"savePage()\">\n \n <!-- Header Section -->\n <div class=\"form-header\">\n <h2 class=\"form-title\">{{ isEditMode() ? 'Edit Page' : 'Create Page' }}</h2>\n <p class=\"form-subtitle\">\n {{ isEditMode() ? 'Update page information and configuration' : 'Create a new page with configuration' }}\n </p>\n </div>\n\n <!-- Success and Error Messages -->\n <div class=\"form-messages\">\n @if (success()) {\n <div class=\"alert alert-success\">\n <svg class=\"alert-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M5 13l4 4L19 7\"></path>\n </svg>\n <span>{{ success() }}</span>\n </div>\n }\n @if (error()) {\n <div class=\"alert alert-error\">\n <svg class=\"alert-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M6 18L18 6M6 6l12 12\"></path>\n </svg>\n <span>{{ error() }}</span>\n </div>\n }\n </div>\n\n <!-- Form Content -->\n <div class=\"form-content\">\n <div class=\"form-row form-row-2\">\n <div class=\"form-field\">\n <cide-ele-input \n id=\"sypg_title\"\n label=\"Page Title\" \n formControlName=\"sypg_title\"\n placeholder=\"Enter page title\"\n size=\"md\">\n </cide-ele-input>\n </div>\n \n <div class=\"form-field\">\n <cide-ele-input \n id=\"sypg_page_code\"\n label=\"Page Code\" \n formControlName=\"sypg_page_code\"\n placeholder=\"Enter page code (alphanumeric and underscore only)\"\n size=\"md\">\n </cide-ele-input>\n </div>\n </div>\n\n <div class=\"form-row form-row-1\">\n <div class=\"form-field\">\n <cide-ele-textarea \n id=\"sypg_desc\"\n label=\"Page Description\" \n formControlName=\"sypg_desc\"\n placeholder=\"Enter page description\"\n [rows]=\"3\"\n size=\"md\">\n </cide-ele-textarea>\n </div>\n </div>\n\n <div class=\"form-row form-row-1\">\n <div class=\"form-field\">\n <cide-ele-json-editor\n id=\"sypg_configuration\"\n label=\"Configuration JSON\"\n formControlName=\"sypg_configuration\"\n placeholder='{\"key\": \"value\"}'>\n </cide-ele-json-editor>\n </div>\n </div>\n\n <div class=\"form-row form-row-1\">\n <div class=\"form-field\">\n <cide-ele-input\n id=\"sypg_isactive\"\n type=\"checkbox\"\n formControlName=\"sypg_isactive\"\n label=\"Active Status\"\n size=\"sm\">\n </cide-ele-input>\n </div>\n </div>\n </div>\n\n <!-- Form Actions -->\n <div class=\"form-actions\">\n <div class=\"form-actions-content\">\n <!-- Error Message (Left Side) -->\n <div class=\"form-actions-error\">\n <cide-form-field-error [formGroup]=\"pageForm\"></cide-form-field-error>\n </div>\n \n <!-- Action Buttons (Right Side) -->\n <div class=\"form-actions-buttons\">\n @if (!isEditMode()) {\n <button cideEleButton\n type=\"button\" \n variant=\"secondary\" \n (click)=\"resetForm()\" \n leftIcon=\"refresh\"\n [disabled]=\"loading()\">\n Reset Form\n </button>\n }\n \n <button cideEleButton\n type=\"button\" \n variant=\"secondary\" \n (click)=\"cancelForm()\" \n leftIcon=\"close\"\n [disabled]=\"loading()\">\n Cancel\n </button>\n \n <button cideEleButton\n type=\"submit\" \n variant=\"primary\" \n [disabled]=\"loading() || !pageForm.valid\"\n [loading]=\"loading()\"\n leftIcon=\"save\">\n {{ isEditMode() ? 'Update Page' : 'Create Page' }}\n </button>\n </div>\n </div>\n </div>\n </form>\n </div>\n</div>\n", styles: [".page-form-wrapper{min-height:100vh;background-color:#f9fafb;padding:1.5rem;box-sizing:border-box}:host-context(.dark) .page-form-wrapper,:host-context([data-theme=dark]) .page-form-wrapper{background-color:#111827}@media (max-width: 768px){.page-form-wrapper{padding:1rem}}@media (max-width: 480px){.page-form-wrapper{padding:.75rem}}.page-form-container{max-width:1200px;margin:0 auto;width:100%}.page-form{background-color:#fff;border-radius:.5rem;box-shadow:0 1px 3px #0000001a,0 1px 2px #0000000f;border:1px solid #e5e7eb;overflow:hidden;display:flex;flex-direction:column}:host-context(.dark) .page-form,:host-context([data-theme=dark]) .page-form{background-color:#1f2937;border-color:#374151;box-shadow:0 1px 3px #0000004d,0 1px 2px #0003}.page-form.loading{opacity:.6;pointer-events:none}.form-header{padding:1.5rem 1.5rem 1rem;border-bottom:1px solid #e5e7eb;background-color:#fff}:host-context(.dark) .form-header,:host-context([data-theme=dark]) .form-header{background-color:#1f2937;border-bottom-color:#374151}.form-header .form-title{font-size:1.5rem;font-weight:700;margin:0 0 .5rem;color:#111827;line-height:1.2}:host-context(.dark) .form-header .form-title,:host-context([data-theme=dark]) .form-header .form-title{color:#f9fafb}.form-header .form-subtitle{font-size:.875rem;margin:0;font-weight:400;color:#6b7280;line-height:1.5}:host-context(.dark) .form-header .form-subtitle,:host-context([data-theme=dark]) .form-header .form-subtitle{color:#9ca3af}@media (max-width: 768px){.form-header{padding:1.25rem 1rem .75rem}.form-header .form-title{font-size:1.25rem}.form-header .form-subtitle{font-size:.8125rem}}.form-messages{padding:0 1.5rem;margin-top:1rem}@media (max-width: 768px){.form-messages{padding:0 1rem}}.alert{display:flex;align-items:center;gap:.75rem;padding:.875rem 1rem;margin-bottom:1rem;border-radius:.375rem;font-weight:500;font-size:.875rem;border-left:3px solid}.alert .alert-icon{width:1.25rem;height:1.25rem;flex-shrink:0}.alert.alert-success{background-color:#d1fae5;border-left-color:#10b981;color:#065f46}:host-context(.dark) .alert.alert-success,:host-context([data-theme=dark]) .alert.alert-success{background-color:#10b98133;border-left-color:#10b981;color:#6ee7b7}.alert.alert-error{background-color:#fee2e2;border-left-color:#ef4444;color:#991b1b}:host-context(.dark) .alert.alert-error,:host-context([data-theme=dark]) .alert.alert-error{background-color:#ef444433;border-left-color:#ef4444;color:#fca5a5}.form-content{padding:1.5rem;flex:1}@media (max-width: 768px){.form-content{padding:1rem}}@media (max-width: 480px){.form-content{padding:.75rem}}.form-row{display:grid;gap:1rem;margin-bottom:1rem}.form-row:last-child{margin-bottom:0}.form-row.form-row-1{grid-template-columns:1fr}.form-row.form-row-2{grid-template-columns:repeat(2,1fr)}@media (max-width: 768px){.form-row.form-row-2{grid-template-columns:1fr}}.form-row.form-row-3{grid-template-columns:repeat(3,1fr)}@media (max-width: 1024px){.form-row.form-row-3{grid-template-columns:repeat(2,1fr)}}@media (max-width: 768px){.form-row.form-row-3{grid-template-columns:1fr}}.form-row.form-row-4{grid-template-columns:repeat(4,1fr)}@media (max-width: 1024px){.form-row.form-row-4{grid-template-columns:repeat(2,1fr)}}@media (max-width: 768px){.form-row.form-row-4{grid-template-columns:1fr}}.form-field{display:flex;flex-direction:column}.form-actions{padding:1.25rem 1.5rem;border-top:1px solid #e5e7eb;background-color:#fff;margin-top:auto}:host-context(.dark) .form-actions,:host-context([data-theme=dark]) .form-actions{background-color:#1f2937;border-top-color:#374151}@media (max-width: 768px){.form-actions{padding:1rem}}@media (max-width: 480px){.form-actions{padding:.75rem}}.form-actions-content{display:flex;justify-content:space-between;align-items:center;gap:1rem;width:100%;flex-wrap:wrap}@media (max-width: 768px){.form-actions-content{flex-direction:column;align-items:stretch}}.form-actions-error{flex:1;min-width:0;display:flex;align-items:center}@media (max-width: 768px){.form-actions-error{width:100%;margin-bottom:.75rem}}.form-actions-buttons{display:flex;gap:.75rem;align-items:center;flex-shrink:0}@media (max-width: 768px){.form-actions-buttons{width:100%;justify-content:stretch}.form-actions-buttons button{flex:1;min-width:0}}@media (max-width: 480px){.form-actions-buttons{flex-direction:column}.form-actions-buttons button{width:100%}}cide-ele-input,cide-ele-textarea,cide-ele-json-editor,cide-ele-select{width:100%}cide-ele-input:focus-within,cide-ele-textarea:focus-within,cide-ele-json-editor:focus-within,cide-ele-select:focus-within{outline:none}@media (max-width: 480px){.page-form-wrapper{padding:.5rem}.form-header{padding:1rem .75rem .75rem}.form-content,.form-actions{padding:.75rem}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: FormsModule }, { kind: "component", type: CideEleButtonComponent, selector: "button[cideEleButton], a[cideEleButton], cide-ele-button", inputs: ["label", "variant", "size", "type", "shape", "elevation", "disabled", "id", "loading", "fullWidth", "leftIcon", "rightIcon", "customClass", "tooltip", "ariaLabel", "testId", "routerLink", "routerExtras", "preventDoubleClick", "animated"], outputs: ["btnClick", "doubleClick"] }, { kind: "component", type: CideInputComponent, selector: "cide-ele-input", inputs: ["fill", "label", "labelHide", "disabled", "clearInput", "labelPlacement", "labelDir", "placeholder", "leadingIcon", "trailingIcon", "helperText", "helperTextCollapse", "hideHelperAndErrorText", "errorText", "maxlength", "minlength", "required", "autocapitalize", "autocomplete", "type", "width", "id", "ngModel", "option", "min", "max", "step", "size"], outputs: ["ngModelChange"] }, { kind: "component", type: CideTextareaComponent, selector: "cide-ele-textarea", inputs: ["label", "labelHide", "placeholder", "helperText", "errorText", "required", "disabled", "minlength", "maxlength", "rows", "id", "ngModel", "size", "fill", "labelPlacement", "labelDir", "leadingIcon", "trailingIcon", "clearInput"], outputs: ["ngModelChange"] }, { kind: "component", type: CideEleJsonEditorComponent, selector: "cide-ele-json-editor", inputs: ["label", "helperText", "required", "disabled", "showCharacterCount", "config"], outputs: ["valueChange", "objectChange", "errorsChange", "validChange"] }, { kind: "component", type: CideFormFieldErrorComponent, selector: "cide-form-field-error", inputs: ["control", "formGroup", "fieldName", "customMessages"] }] });
|
|
222
|
-
}
|
|
223
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: CideCorePageFormComponent, decorators: [{
|
|
224
|
-
type: Component,
|
|
225
|
-
args: [{ selector: 'cide-core-page-form', standalone: true, imports: [
|
|
226
|
-
CommonModule,
|
|
227
|
-
ReactiveFormsModule,
|
|
228
|
-
FormsModule,
|
|
229
|
-
CideEleButtonComponent,
|
|
230
|
-
CideInputComponent,
|
|
231
|
-
CideTextareaComponent,
|
|
232
|
-
CideEleJsonEditorComponent,
|
|
233
|
-
CideFormFieldErrorComponent
|
|
234
|
-
], template: "<div class=\"page-form-wrapper\">\n <div class=\"page-form-container\">\n <form class=\"page-form\" [formGroup]=\"pageForm\" [class.loading]=\"loading()\" (ngSubmit)=\"savePage()\">\n \n <!-- Header Section -->\n <div class=\"form-header\">\n <h2 class=\"form-title\">{{ isEditMode() ? 'Edit Page' : 'Create Page' }}</h2>\n <p class=\"form-subtitle\">\n {{ isEditMode() ? 'Update page information and configuration' : 'Create a new page with configuration' }}\n </p>\n </div>\n\n <!-- Success and Error Messages -->\n <div class=\"form-messages\">\n @if (success()) {\n <div class=\"alert alert-success\">\n <svg class=\"alert-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M5 13l4 4L19 7\"></path>\n </svg>\n <span>{{ success() }}</span>\n </div>\n }\n @if (error()) {\n <div class=\"alert alert-error\">\n <svg class=\"alert-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M6 18L18 6M6 6l12 12\"></path>\n </svg>\n <span>{{ error() }}</span>\n </div>\n }\n </div>\n\n <!-- Form Content -->\n <div class=\"form-content\">\n <div class=\"form-row form-row-2\">\n <div class=\"form-field\">\n <cide-ele-input \n id=\"sypg_title\"\n label=\"Page Title\" \n formControlName=\"sypg_title\"\n placeholder=\"Enter page title\"\n size=\"md\">\n </cide-ele-input>\n </div>\n \n <div class=\"form-field\">\n <cide-ele-input \n id=\"sypg_page_code\"\n label=\"Page Code\" \n formControlName=\"sypg_page_code\"\n placeholder=\"Enter page code (alphanumeric and underscore only)\"\n size=\"md\">\n </cide-ele-input>\n </div>\n </div>\n\n <div class=\"form-row form-row-1\">\n <div class=\"form-field\">\n <cide-ele-textarea \n id=\"sypg_desc\"\n label=\"Page Description\" \n formControlName=\"sypg_desc\"\n placeholder=\"Enter page description\"\n [rows]=\"3\"\n size=\"md\">\n </cide-ele-textarea>\n </div>\n </div>\n\n <div class=\"form-row form-row-1\">\n <div class=\"form-field\">\n <cide-ele-json-editor\n id=\"sypg_configuration\"\n label=\"Configuration JSON\"\n formControlName=\"sypg_configuration\"\n placeholder='{\"key\": \"value\"}'>\n </cide-ele-json-editor>\n </div>\n </div>\n\n <div class=\"form-row form-row-1\">\n <div class=\"form-field\">\n <cide-ele-input\n id=\"sypg_isactive\"\n type=\"checkbox\"\n formControlName=\"sypg_isactive\"\n label=\"Active Status\"\n size=\"sm\">\n </cide-ele-input>\n </div>\n </div>\n </div>\n\n <!-- Form Actions -->\n <div class=\"form-actions\">\n <div class=\"form-actions-content\">\n <!-- Error Message (Left Side) -->\n <div class=\"form-actions-error\">\n <cide-form-field-error [formGroup]=\"pageForm\"></cide-form-field-error>\n </div>\n \n <!-- Action Buttons (Right Side) -->\n <div class=\"form-actions-buttons\">\n @if (!isEditMode()) {\n <button cideEleButton\n type=\"button\" \n variant=\"secondary\" \n (click)=\"resetForm()\" \n leftIcon=\"refresh\"\n [disabled]=\"loading()\">\n Reset Form\n </button>\n }\n \n <button cideEleButton\n type=\"button\" \n variant=\"secondary\" \n (click)=\"cancelForm()\" \n leftIcon=\"close\"\n [disabled]=\"loading()\">\n Cancel\n </button>\n \n <button cideEleButton\n type=\"submit\" \n variant=\"primary\" \n [disabled]=\"loading() || !pageForm.valid\"\n [loading]=\"loading()\"\n leftIcon=\"save\">\n {{ isEditMode() ? 'Update Page' : 'Create Page' }}\n </button>\n </div>\n </div>\n </div>\n </form>\n </div>\n</div>\n", styles: [".page-form-wrapper{min-height:100vh;background-color:#f9fafb;padding:1.5rem;box-sizing:border-box}:host-context(.dark) .page-form-wrapper,:host-context([data-theme=dark]) .page-form-wrapper{background-color:#111827}@media (max-width: 768px){.page-form-wrapper{padding:1rem}}@media (max-width: 480px){.page-form-wrapper{padding:.75rem}}.page-form-container{max-width:1200px;margin:0 auto;width:100%}.page-form{background-color:#fff;border-radius:.5rem;box-shadow:0 1px 3px #0000001a,0 1px 2px #0000000f;border:1px solid #e5e7eb;overflow:hidden;display:flex;flex-direction:column}:host-context(.dark) .page-form,:host-context([data-theme=dark]) .page-form{background-color:#1f2937;border-color:#374151;box-shadow:0 1px 3px #0000004d,0 1px 2px #0003}.page-form.loading{opacity:.6;pointer-events:none}.form-header{padding:1.5rem 1.5rem 1rem;border-bottom:1px solid #e5e7eb;background-color:#fff}:host-context(.dark) .form-header,:host-context([data-theme=dark]) .form-header{background-color:#1f2937;border-bottom-color:#374151}.form-header .form-title{font-size:1.5rem;font-weight:700;margin:0 0 .5rem;color:#111827;line-height:1.2}:host-context(.dark) .form-header .form-title,:host-context([data-theme=dark]) .form-header .form-title{color:#f9fafb}.form-header .form-subtitle{font-size:.875rem;margin:0;font-weight:400;color:#6b7280;line-height:1.5}:host-context(.dark) .form-header .form-subtitle,:host-context([data-theme=dark]) .form-header .form-subtitle{color:#9ca3af}@media (max-width: 768px){.form-header{padding:1.25rem 1rem .75rem}.form-header .form-title{font-size:1.25rem}.form-header .form-subtitle{font-size:.8125rem}}.form-messages{padding:0 1.5rem;margin-top:1rem}@media (max-width: 768px){.form-messages{padding:0 1rem}}.alert{display:flex;align-items:center;gap:.75rem;padding:.875rem 1rem;margin-bottom:1rem;border-radius:.375rem;font-weight:500;font-size:.875rem;border-left:3px solid}.alert .alert-icon{width:1.25rem;height:1.25rem;flex-shrink:0}.alert.alert-success{background-color:#d1fae5;border-left-color:#10b981;color:#065f46}:host-context(.dark) .alert.alert-success,:host-context([data-theme=dark]) .alert.alert-success{background-color:#10b98133;border-left-color:#10b981;color:#6ee7b7}.alert.alert-error{background-color:#fee2e2;border-left-color:#ef4444;color:#991b1b}:host-context(.dark) .alert.alert-error,:host-context([data-theme=dark]) .alert.alert-error{background-color:#ef444433;border-left-color:#ef4444;color:#fca5a5}.form-content{padding:1.5rem;flex:1}@media (max-width: 768px){.form-content{padding:1rem}}@media (max-width: 480px){.form-content{padding:.75rem}}.form-row{display:grid;gap:1rem;margin-bottom:1rem}.form-row:last-child{margin-bottom:0}.form-row.form-row-1{grid-template-columns:1fr}.form-row.form-row-2{grid-template-columns:repeat(2,1fr)}@media (max-width: 768px){.form-row.form-row-2{grid-template-columns:1fr}}.form-row.form-row-3{grid-template-columns:repeat(3,1fr)}@media (max-width: 1024px){.form-row.form-row-3{grid-template-columns:repeat(2,1fr)}}@media (max-width: 768px){.form-row.form-row-3{grid-template-columns:1fr}}.form-row.form-row-4{grid-template-columns:repeat(4,1fr)}@media (max-width: 1024px){.form-row.form-row-4{grid-template-columns:repeat(2,1fr)}}@media (max-width: 768px){.form-row.form-row-4{grid-template-columns:1fr}}.form-field{display:flex;flex-direction:column}.form-actions{padding:1.25rem 1.5rem;border-top:1px solid #e5e7eb;background-color:#fff;margin-top:auto}:host-context(.dark) .form-actions,:host-context([data-theme=dark]) .form-actions{background-color:#1f2937;border-top-color:#374151}@media (max-width: 768px){.form-actions{padding:1rem}}@media (max-width: 480px){.form-actions{padding:.75rem}}.form-actions-content{display:flex;justify-content:space-between;align-items:center;gap:1rem;width:100%;flex-wrap:wrap}@media (max-width: 768px){.form-actions-content{flex-direction:column;align-items:stretch}}.form-actions-error{flex:1;min-width:0;display:flex;align-items:center}@media (max-width: 768px){.form-actions-error{width:100%;margin-bottom:.75rem}}.form-actions-buttons{display:flex;gap:.75rem;align-items:center;flex-shrink:0}@media (max-width: 768px){.form-actions-buttons{width:100%;justify-content:stretch}.form-actions-buttons button{flex:1;min-width:0}}@media (max-width: 480px){.form-actions-buttons{flex-direction:column}.form-actions-buttons button{width:100%}}cide-ele-input,cide-ele-textarea,cide-ele-json-editor,cide-ele-select{width:100%}cide-ele-input:focus-within,cide-ele-textarea:focus-within,cide-ele-json-editor:focus-within,cide-ele-select:focus-within{outline:none}@media (max-width: 480px){.page-form-wrapper{padding:.5rem}.form-header{padding:1rem .75rem .75rem}.form-content,.form-actions{padding:.75rem}}\n"] }]
|
|
235
|
-
}], ctorParameters: () => [] });
|
|
236
|
-
|
|
237
|
-
export { CideCorePageFormComponent };
|
|
238
|
-
//# sourceMappingURL=cloud-ide-core-page-form.component-C4jj3p3H.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cloud-ide-core-page-form.component-C4jj3p3H.mjs","sources":["../../../projects/cloud-ide-core/src/lib/core/page-management/components/page-form/page-form.component.ts","../../../projects/cloud-ide-core/src/lib/core/page-management/components/page-form/page-form.component.html"],"sourcesContent":["import { Component, signal, computed, inject, OnInit, DestroyRef } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { Validators, ReactiveFormsModule, NonNullableFormBuilder, FormsModule } from '@angular/forms';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\nimport { CideCorePageManagementService } from '../../services/page-management.service';\nimport { AppStateHelperService, ComponentContextService, RightsService } from 'cloud-ide-layout';\nimport { CideEleButtonComponent, CideInputComponent, CideSelectComponent, CideTextareaComponent, CideIconComponent, CideEleFileInputComponent, CideEleJsonEditorComponent, CideFormFieldErrorComponent } from 'cloud-ide-element';\nimport { ICoreSypg, MSystemPagesInsertUpdatePayload, generateObjectFromString, systemPagesByIdControllerResponse, systemPagesInsertUpdateControllerResponse } from 'cloud-ide-lms-model';\n\n@Component({\n selector: 'cide-core-page-form',\n standalone: true,\n imports: [\n CommonModule,\n ReactiveFormsModule,\n FormsModule,\n CideEleButtonComponent,\n CideInputComponent,\n CideTextareaComponent,\n CideEleJsonEditorComponent,\n CideFormFieldErrorComponent\n ],\n templateUrl: './page-form.component.html',\n styleUrls: ['./page-form.component.scss']\n})\nexport class CideCorePageFormComponent implements OnInit {\n private destroyRef = inject(DestroyRef);\n private pageService = inject(CideCorePageManagementService);\n private appState = inject(AppStateHelperService);\n private fb = inject(NonNullableFormBuilder);\n private router = inject(Router);\n private route = inject(ActivatedRoute);\n private componentContextService = inject(ComponentContextService);\n private rightsService = inject(RightsService);\n\n loading = signal(false);\n error = signal<string | null>(null);\n success = signal<string | null>(null);\n\n // Page information\n pageId = signal<string | null>(null);\n isEditMode = signal(false);\n\n pageForm = this.fb.group({\n sypg_title: ['', [Validators.required, Validators.maxLength(100)]],\n sypg_desc: ['', [Validators.maxLength(255)]],\n sypg_page_code: ['', [Validators.required, Validators.maxLength(40), Validators.pattern(/^[a-zA-Z0-9_]+$/)]],\n sypg_configuration: ['{}', [Validators.required]],\n sypg_isactive: [true]\n });\n\n constructor() {\n this.setupFormSubscriptions();\n }\n\n ngOnInit(): void {\n // Initialize rights for page management\n this.rightsService.initializeRights('core_page_management');\n // Check for page ID in query parameters\n this.checkForPageId();\n }\n\n\n\n // Check for page ID in query parameters\n private checkForPageId() {\n console.log('🔍 Checking for page ID in query parameters', this.route.params);\n this.route.params.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(params => {\n console.log('🔍 Query params:', params);\n // Check for pageId, id, or page parameter\n const queryParams = params['query'];\n const queryData = generateObjectFromString(queryParams);\n\n // If pageId is an object string (from generateStringFromObject), try to parse it\n const pageId = queryData.sypg_id;\n if (pageId) {\n console.log('🔍 Page ID found in query params:', pageId);\n this.pageId.set(pageId);\n this.isEditMode.set(true);\n this.loadPageData(pageId);\n } else {\n console.log('🆕 No page ID found - creating new page');\n this.isEditMode.set(false);\n this.pageId.set(null);\n }\n });\n }\n\n // Load page data for editing\n private loadPageData(pageId: string) {\n this.loading.set(true);\n this.error.set(null);\n\n console.log('📥 Loading page data for ID:', pageId);\n\n this.pageService.getPageById(pageId).pipe(\n takeUntilDestroyed(this.destroyRef)\n ).subscribe({\n next: (response: systemPagesByIdControllerResponse) => {\n console.log('✅ Page data loaded:', response);\n \n if (response?.success && response?.data) {\n const pageData = response.data;\n if (pageData) {\n this.populateFormWithPageData(pageData);\n this.success.set('Page data loaded successfully');\n } else {\n this.error.set('Page data not found');\n console.error('❌ Page data not found in response:', response);\n }\n } else {\n this.error.set('Failed to load page data');\n console.error('❌ Page data response invalid:', response);\n }\n this.loading.set(false);\n },\n error: (err) => {\n console.error('❌ Failed to load page data:', err);\n \n let errorMessage = 'Failed to load page data.';\n \n if (err?.error?.message) {\n errorMessage = err.error.message;\n } else if (err?.message) {\n errorMessage = err.message;\n } else if (err?.status === 404) {\n errorMessage = 'Page not found.';\n } else if (err?.status === 500) {\n errorMessage = 'Server error. Please try again later.';\n }\n \n this.error.set(errorMessage);\n this.loading.set(false);\n }\n });\n }\n\n // Populate form with page data\n private populateFormWithPageData(pageData: ICoreSypg) {\n try {\n console.log('📝 Populating form with page data:', pageData);\n\n const formData = {\n sypg_title: pageData.sypg_title || '',\n sypg_desc: pageData.sypg_desc || '',\n sypg_page_code: pageData.sypg_page_code || '',\n sypg_configuration: pageData.sypg_configuration ? JSON.stringify(pageData.sypg_configuration) : '{}',\n sypg_isactive: pageData.sypg_isactive !== undefined ? pageData.sypg_isactive : true\n };\n\n // Patch the form with the page data\n this.pageForm.patchValue(formData, { emitEvent: false });\n\n console.log('✅ Form populated successfully');\n } catch (error) {\n console.error('💥 Error populating form with page data:', error);\n this.error.set('Error loading page data into form');\n }\n }\n\n private setupFormSubscriptions(): void {\n // Watch for form changes to enable/disable save button\n this.pageForm.valueChanges\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n // Form validation is handled by computed signals\n });\n }\n\n // Computed values\n isFormDirty = computed(() => this.pageForm.dirty);\n \n // Rights computed signals\n canCreate = computed(() => this.rightsService.hasRight('CREATE'));\n canEdit = computed(() => this.rightsService.hasRight('EDIT'));\n canView = computed(() => this.rightsService.hasRight('VIEW'));\n\n // Form submission\n savePage(): void {\n const requiredRight = this.isEditMode() ? 'EDIT' : 'CREATE';\n if (!this.rightsService.hasRight(requiredRight)) {\n this.error.set(`You do not have permission to ${this.isEditMode() ? 'edit' : 'create'} pages`);\n return;\n }\n\n if (!this.pageForm.valid) {\n this.markFormAsTouched();\n return;\n }\n\n const formValue = this.pageForm.getRawValue();\n \n const pageData: MSystemPagesInsertUpdatePayload = {\n _id: this.pageId() || '',\n sypg_title: formValue.sypg_title,\n sypg_desc: formValue.sypg_desc,\n sypg_page_code: formValue.sypg_page_code,\n sypg_configuration: formValue.sypg_configuration,\n sypg_isactive: formValue.sypg_isactive\n };\n\n this.loading.set(true);\n this.error.set(null);\n\n this.pageService.createOrUpdatePage(pageData)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response: systemPagesInsertUpdateControllerResponse) => {\n if (response.success) {\n this.success.set(this.isEditMode() ? 'Page updated successfully' : 'Page created successfully');\n console.log('✅ Page saved successfully');\n // Use ComponentContextService to close tab or floating container\n setTimeout(() => {\n this.componentContextService.close(['/control-panel/page']);\n }, 1500);\n } else {\n this.error.set(response.message || 'Failed to save page');\n console.error('❌ Failed to save page:', response.message);\n }\n this.loading.set(false);\n },\n error: (error) => {\n console.error('❌ Error saving page:', error);\n this.error.set('Failed to save page. Please try again.');\n this.loading.set(false);\n }\n });\n }\n\n // Cancel form\n cancelForm(): void {\n this.componentContextService.close(['/control-panel/page']);\n }\n\n // Go back to page list\n goBack(): void {\n this.componentContextService.close(['/control-panel/page']);\n }\n\n // Reset form - reload data in edit mode, reset to defaults in create mode\n resetForm(): void {\n if (this.isEditMode() && this.pageId()) {\n this.loadPageData(this.pageId()!);\n } else {\n this.pageForm.reset({\n sypg_isactive: true,\n sypg_configuration: '{}'\n });\n }\n }\n\n // Mark form as touched to trigger validation display\n private markFormAsTouched(): void {\n Object.keys(this.pageForm.controls).forEach(key => {\n const control = this.pageForm.get(key);\n control?.markAsTouched();\n });\n }\n}\n","<div class=\"page-form-wrapper\">\n <div class=\"page-form-container\">\n <form class=\"page-form\" [formGroup]=\"pageForm\" [class.loading]=\"loading()\" (ngSubmit)=\"savePage()\">\n \n <!-- Header Section -->\n <div class=\"form-header\">\n <h2 class=\"form-title\">{{ isEditMode() ? 'Edit Page' : 'Create Page' }}</h2>\n <p class=\"form-subtitle\">\n {{ isEditMode() ? 'Update page information and configuration' : 'Create a new page with configuration' }}\n </p>\n </div>\n\n <!-- Success and Error Messages -->\n <div class=\"form-messages\">\n @if (success()) {\n <div class=\"alert alert-success\">\n <svg class=\"alert-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M5 13l4 4L19 7\"></path>\n </svg>\n <span>{{ success() }}</span>\n </div>\n }\n @if (error()) {\n <div class=\"alert alert-error\">\n <svg class=\"alert-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M6 18L18 6M6 6l12 12\"></path>\n </svg>\n <span>{{ error() }}</span>\n </div>\n }\n </div>\n\n <!-- Form Content -->\n <div class=\"form-content\">\n <div class=\"form-row form-row-2\">\n <div class=\"form-field\">\n <cide-ele-input \n id=\"sypg_title\"\n label=\"Page Title\" \n formControlName=\"sypg_title\"\n placeholder=\"Enter page title\"\n size=\"md\">\n </cide-ele-input>\n </div>\n \n <div class=\"form-field\">\n <cide-ele-input \n id=\"sypg_page_code\"\n label=\"Page Code\" \n formControlName=\"sypg_page_code\"\n placeholder=\"Enter page code (alphanumeric and underscore only)\"\n size=\"md\">\n </cide-ele-input>\n </div>\n </div>\n\n <div class=\"form-row form-row-1\">\n <div class=\"form-field\">\n <cide-ele-textarea \n id=\"sypg_desc\"\n label=\"Page Description\" \n formControlName=\"sypg_desc\"\n placeholder=\"Enter page description\"\n [rows]=\"3\"\n size=\"md\">\n </cide-ele-textarea>\n </div>\n </div>\n\n <div class=\"form-row form-row-1\">\n <div class=\"form-field\">\n <cide-ele-json-editor\n id=\"sypg_configuration\"\n label=\"Configuration JSON\"\n formControlName=\"sypg_configuration\"\n placeholder='{\"key\": \"value\"}'>\n </cide-ele-json-editor>\n </div>\n </div>\n\n <div class=\"form-row form-row-1\">\n <div class=\"form-field\">\n <cide-ele-input\n id=\"sypg_isactive\"\n type=\"checkbox\"\n formControlName=\"sypg_isactive\"\n label=\"Active Status\"\n size=\"sm\">\n </cide-ele-input>\n </div>\n </div>\n </div>\n\n <!-- Form Actions -->\n <div class=\"form-actions\">\n <div class=\"form-actions-content\">\n <!-- Error Message (Left Side) -->\n <div class=\"form-actions-error\">\n <cide-form-field-error [formGroup]=\"pageForm\"></cide-form-field-error>\n </div>\n \n <!-- Action Buttons (Right Side) -->\n <div class=\"form-actions-buttons\">\n @if (!isEditMode()) {\n <button cideEleButton\n type=\"button\" \n variant=\"secondary\" \n (click)=\"resetForm()\" \n leftIcon=\"refresh\"\n [disabled]=\"loading()\">\n Reset Form\n </button>\n }\n \n <button cideEleButton\n type=\"button\" \n variant=\"secondary\" \n (click)=\"cancelForm()\" \n leftIcon=\"close\"\n [disabled]=\"loading()\">\n Cancel\n </button>\n \n <button cideEleButton\n type=\"submit\" \n variant=\"primary\" \n [disabled]=\"loading() || !pageForm.valid\"\n [loading]=\"loading()\"\n leftIcon=\"save\">\n {{ isEditMode() ? 'Update Page' : 'Create Page' }}\n </button>\n </div>\n </div>\n </div>\n </form>\n </div>\n</div>\n"],"names":[],"mappings":"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"}
|