cloud-ide-academics 0.0.36 → 0.0.37
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-academics-bonafide-request-form.component-Cf1e9jtg.mjs +112 -0
- package/fesm2022/cloud-ide-academics-bonafide-request-form.component-Cf1e9jtg.mjs.map +1 -0
- package/fesm2022/cloud-ide-academics-bonafide-request-list.component-CsFlYVci.mjs +121 -0
- package/fesm2022/cloud-ide-academics-bonafide-request-list.component-CsFlYVci.mjs.map +1 -0
- package/fesm2022/cloud-ide-academics-bonafide.service-B_HDaTmS.mjs +121 -0
- package/fesm2022/cloud-ide-academics-bonafide.service-B_HDaTmS.mjs.map +1 -0
- package/fesm2022/{cloud-ide-academics-class-program-term-create.component-DJQTpKeq.mjs → cloud-ide-academics-class-program-term-create.component-DJnAsJ1b.mjs} +2 -2
- package/fesm2022/{cloud-ide-academics-class-program-term-create.component-DJQTpKeq.mjs.map → cloud-ide-academics-class-program-term-create.component-DJnAsJ1b.mjs.map} +1 -1
- package/fesm2022/{cloud-ide-academics-class-program-term-list.component-BpjWSltB.mjs → cloud-ide-academics-class-program-term-list.component-C_ahVXJg.mjs} +2 -2
- package/fesm2022/{cloud-ide-academics-class-program-term-list.component-BpjWSltB.mjs.map → cloud-ide-academics-class-program-term-list.component-C_ahVXJg.mjs.map} +1 -1
- package/fesm2022/{cloud-ide-academics-cloud-ide-academics-DTKiLHAW.mjs → cloud-ide-academics-cloud-ide-academics-CI-kRbx-.mjs} +32 -13
- package/fesm2022/cloud-ide-academics-cloud-ide-academics-CI-kRbx-.mjs.map +1 -0
- package/fesm2022/{cloud-ide-academics-program-class-create.component-B6xB_hrJ.mjs → cloud-ide-academics-program-class-create.component-ChwCyeeG.mjs} +2 -2
- package/fesm2022/{cloud-ide-academics-program-class-create.component-B6xB_hrJ.mjs.map → cloud-ide-academics-program-class-create.component-ChwCyeeG.mjs.map} +1 -1
- package/fesm2022/{cloud-ide-academics-program-class-list.component-BLR9XYoZ.mjs → cloud-ide-academics-program-class-list.component-C-bRdT2a.mjs} +2 -2
- package/fesm2022/{cloud-ide-academics-program-class-list.component-BLR9XYoZ.mjs.map → cloud-ide-academics-program-class-list.component-C-bRdT2a.mjs.map} +1 -1
- package/fesm2022/{cloud-ide-academics-student-list.component-DwweQJh-.mjs → cloud-ide-academics-student-list.component-Bjwr-QFa.mjs} +200 -200
- package/fesm2022/cloud-ide-academics-student-list.component-Bjwr-QFa.mjs.map +1 -0
- package/fesm2022/{cloud-ide-academics-teacher-list.component-BaWKpb8C.mjs → cloud-ide-academics-teacher-list.component-1hEG5FBF.mjs} +204 -204
- package/fesm2022/cloud-ide-academics-teacher-list.component-1hEG5FBF.mjs.map +1 -0
- package/fesm2022/cloud-ide-academics.mjs +1 -1
- package/package.json +1 -1
- package/fesm2022/cloud-ide-academics-cloud-ide-academics-DTKiLHAW.mjs.map +0 -1
- package/fesm2022/cloud-ide-academics-student-list.component-DwweQJh-.mjs.map +0 -1
- package/fesm2022/cloud-ide-academics-teacher-list.component-BaWKpb8C.mjs.map +0 -1
|
@@ -104,7 +104,7 @@ class StudentListComponent {
|
|
|
104
104
|
canView = computed(() => this.rightsService.hasRight('VIEW'), ...(ngDevMode ? [{ debugName: "canView" }] : []));
|
|
105
105
|
ngOnInit() {
|
|
106
106
|
// Initialize rights for student management
|
|
107
|
-
this.rightsService.initializeRights('
|
|
107
|
+
this.rightsService.initializeRights('academics_student_list');
|
|
108
108
|
this.loadStudents();
|
|
109
109
|
}
|
|
110
110
|
ngOnDestroy() {
|
|
@@ -228,105 +228,105 @@ class StudentListComponent {
|
|
|
228
228
|
return parts.length > 0 ? parts.join(' ') : 'Unknown';
|
|
229
229
|
}
|
|
230
230
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: StudentListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
231
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.7", type: StudentListComponent, isStandalone: true, selector: "cide-academics-student-list", viewQueries: [{ propertyName: "studentDetailsRendererTemplate", first: true, predicate: ["studentDetailsRendererTemplate"], descendants: true, isSignal: true }, { propertyName: "contactInfoRendererTemplate", first: true, predicate: ["contactInfoRendererTemplate"], descendants: true, isSignal: true }, { propertyName: "statusRendererTemplate", first: true, predicate: ["statusRendererTemplate"], descendants: true, isSignal: true }, { propertyName: "actionsDropdownRendererTemplate", first: true, predicate: ["actionsDropdownRendererTemplate"], descendants: true, isSignal: true }], ngImport: i0, template: `
|
|
232
|
-
<cide-lyt-shared-wrapper [shared_wrapper_setup_param]="shared_wrapper_setup_param">
|
|
233
|
-
<div class="tw-w-full tw-h-full tw-flex tw-flex-col tw-overflow-hidden">
|
|
234
|
-
<!-- Header Section -->
|
|
235
|
-
<div class="tw-flex-shrink-0 tw-w-full tw-px-4 sm:tw-px-6 tw-py-3 tw-bg-gray-50 tw-border-b tw-border-gray-200">
|
|
236
|
-
<div class="tw-flex tw-items-center tw-justify-between">
|
|
237
|
-
<div class="tw-flex tw-items-center tw-gap-3">
|
|
238
|
-
<cide-ele-icon class="tw-text-blue-600 tw-w-5 tw-h-5">school</cide-ele-icon>
|
|
239
|
-
<div>
|
|
240
|
-
<h5 class="tw-text-sm tw-font-semibold tw-text-gray-900">Student Management</h5>
|
|
241
|
-
<p class="tw-text-xs tw-text-gray-600">Manage and view all student profiles</p>
|
|
242
|
-
</div>
|
|
243
|
-
</div>
|
|
244
|
-
<button cideEleButton variant="primary" size="sm" (click)="createNewStudent()" leftIcon="add">
|
|
245
|
-
Add Student
|
|
246
|
-
</button>
|
|
247
|
-
</div>
|
|
248
|
-
</div>
|
|
249
|
-
|
|
250
|
-
<!-- Data Grid Section -->
|
|
251
|
-
<div class="tw-flex-1 tw-h-auto tw-w-full tw-min-h-0 tw-relative tw-z-0 tw-overflow-hidden">
|
|
252
|
-
<cide-ele-data-grid
|
|
253
|
-
[config]="gridConfig()"
|
|
254
|
-
[templateRenderers]="templateRenderers()"
|
|
255
|
-
(gridEvent)="onGridEvent($event)">
|
|
256
|
-
</cide-ele-data-grid>
|
|
257
|
-
</div>
|
|
258
|
-
</div>
|
|
259
|
-
|
|
260
|
-
<!-- Student Details Template -->
|
|
261
|
-
<ng-template #studentDetailsRendererTemplate let-value="value" let-row="row" let-column="column">
|
|
262
|
-
<div class="tw-flex tw-items-start tw-space-x-3 tw-py-3">
|
|
263
|
-
<div class="tw-flex-shrink-0 tw-mt-0.5">
|
|
264
|
-
<div class="tw-w-10 tw-h-10 tw-bg-blue-100 tw-rounded-lg tw-flex tw-items-center tw-justify-center">
|
|
265
|
-
<cide-ele-icon class="tw-text-blue-600 tw-w-5 tw-h-5">person</cide-ele-icon>
|
|
266
|
-
</div>
|
|
267
|
-
</div>
|
|
268
|
-
<div class="tw-min-w-0 tw-flex-1 tw-space-y-1">
|
|
269
|
-
<div class="tw-text-sm tw-font-semibold tw-text-gray-900 tw-leading-5">
|
|
270
|
-
{{ row?.user_fullname || getFullName(row) }}
|
|
271
|
-
</div>
|
|
272
|
-
@if (row?.user_type_mapping?.syutm_type_specific_id) {
|
|
273
|
-
<div class="tw-text-xs tw-text-gray-600 tw-leading-4 tw-font-mono">
|
|
274
|
-
<span class="tw-font-medium">Student ID:</span> {{ row.user_type_mapping.syutm_type_specific_id }}
|
|
275
|
-
</div>
|
|
276
|
-
}
|
|
277
|
-
@if (row?.user_username) {
|
|
278
|
-
<div class="tw-text-xs tw-text-gray-500 tw-leading-4">
|
|
279
|
-
Username: {{ row.user_username }}
|
|
280
|
-
</div>
|
|
281
|
-
}
|
|
282
|
-
</div>
|
|
283
|
-
</div>
|
|
284
|
-
</ng-template>
|
|
285
|
-
|
|
286
|
-
<!-- Contact Info Template -->
|
|
287
|
-
<ng-template #contactInfoRendererTemplate let-value="value" let-row="row" let-column="column">
|
|
288
|
-
<div class="tw-py-3 tw-space-y-1">
|
|
289
|
-
@if (row?.user_emailid) {
|
|
290
|
-
<div class="tw-text-xs tw-text-gray-900 tw-flex tw-items-center">
|
|
291
|
-
<cide-ele-icon class="tw-w-3 tw-h-3 tw-text-gray-400 tw-mr-2">email</cide-ele-icon>
|
|
292
|
-
<span class="tw-truncate">{{ row.user_emailid }}</span>
|
|
293
|
-
</div>
|
|
294
|
-
}
|
|
295
|
-
@if (row?.user_mobileno) {
|
|
296
|
-
<div class="tw-text-xs tw-text-gray-600 tw-flex tw-items-center">
|
|
297
|
-
<cide-ele-icon class="tw-w-3 tw-h-3 tw-text-gray-400 tw-mr-2">phone</cide-ele-icon>
|
|
298
|
-
<span class="tw-truncate">{{ row.user_mobileno }}</span>
|
|
299
|
-
</div>
|
|
300
|
-
}
|
|
301
|
-
</div>
|
|
302
|
-
</ng-template>
|
|
303
|
-
|
|
304
|
-
<!-- Status Template -->
|
|
305
|
-
<ng-template #statusRendererTemplate let-value="value" let-row="row" let-column="column">
|
|
306
|
-
<div class="tw-flex tw-items-center tw-justify-center tw-py-3">
|
|
307
|
-
@if (row?.user_isactive) {
|
|
308
|
-
<span class="tw-inline-flex tw-items-center tw-px-2.5 tw-py-1 tw-rounded-full tw-text-xs tw-font-medium tw-bg-green-100 tw-text-green-800">
|
|
309
|
-
Active
|
|
310
|
-
</span>
|
|
311
|
-
} @else {
|
|
312
|
-
<span class="tw-inline-flex tw-items-center tw-px-2.5 tw-py-1 tw-rounded-full tw-text-xs tw-font-medium tw-bg-red-100 tw-text-red-800">
|
|
313
|
-
Inactive
|
|
314
|
-
</span>
|
|
315
|
-
}
|
|
316
|
-
</div>
|
|
317
|
-
</ng-template>
|
|
318
|
-
|
|
319
|
-
<!-- Actions Template -->
|
|
320
|
-
<ng-template #actionsDropdownRendererTemplate let-row="row" let-value="value" let-column="column">
|
|
321
|
-
<cide-ele-dropdown
|
|
322
|
-
[items]="getActionDropdownItems(row)"
|
|
323
|
-
(itemClick)="onDropdownItemClick($event, row)"
|
|
324
|
-
size="sm"
|
|
325
|
-
variant="ghost"
|
|
326
|
-
icon="more_vert">
|
|
327
|
-
</cide-ele-dropdown>
|
|
328
|
-
</ng-template>
|
|
329
|
-
</cide-lyt-shared-wrapper>
|
|
231
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.7", type: StudentListComponent, isStandalone: true, selector: "cide-academics-student-list", viewQueries: [{ propertyName: "studentDetailsRendererTemplate", first: true, predicate: ["studentDetailsRendererTemplate"], descendants: true, isSignal: true }, { propertyName: "contactInfoRendererTemplate", first: true, predicate: ["contactInfoRendererTemplate"], descendants: true, isSignal: true }, { propertyName: "statusRendererTemplate", first: true, predicate: ["statusRendererTemplate"], descendants: true, isSignal: true }, { propertyName: "actionsDropdownRendererTemplate", first: true, predicate: ["actionsDropdownRendererTemplate"], descendants: true, isSignal: true }], ngImport: i0, template: `
|
|
232
|
+
<cide-lyt-shared-wrapper [shared_wrapper_setup_param]="shared_wrapper_setup_param">
|
|
233
|
+
<div class="tw-w-full tw-h-full tw-flex tw-flex-col tw-overflow-hidden">
|
|
234
|
+
<!-- Header Section -->
|
|
235
|
+
<div class="tw-flex-shrink-0 tw-w-full tw-px-4 sm:tw-px-6 tw-py-3 tw-bg-gray-50 tw-border-b tw-border-gray-200">
|
|
236
|
+
<div class="tw-flex tw-items-center tw-justify-between">
|
|
237
|
+
<div class="tw-flex tw-items-center tw-gap-3">
|
|
238
|
+
<cide-ele-icon class="tw-text-blue-600 tw-w-5 tw-h-5">school</cide-ele-icon>
|
|
239
|
+
<div>
|
|
240
|
+
<h5 class="tw-text-sm tw-font-semibold tw-text-gray-900">Student Management</h5>
|
|
241
|
+
<p class="tw-text-xs tw-text-gray-600">Manage and view all student profiles</p>
|
|
242
|
+
</div>
|
|
243
|
+
</div>
|
|
244
|
+
<button cideEleButton variant="primary" size="sm" (click)="createNewStudent()" leftIcon="add">
|
|
245
|
+
Add Student
|
|
246
|
+
</button>
|
|
247
|
+
</div>
|
|
248
|
+
</div>
|
|
249
|
+
|
|
250
|
+
<!-- Data Grid Section -->
|
|
251
|
+
<div class="tw-flex-1 tw-h-auto tw-w-full tw-min-h-0 tw-relative tw-z-0 tw-overflow-hidden">
|
|
252
|
+
<cide-ele-data-grid
|
|
253
|
+
[config]="gridConfig()"
|
|
254
|
+
[templateRenderers]="templateRenderers()"
|
|
255
|
+
(gridEvent)="onGridEvent($event)">
|
|
256
|
+
</cide-ele-data-grid>
|
|
257
|
+
</div>
|
|
258
|
+
</div>
|
|
259
|
+
|
|
260
|
+
<!-- Student Details Template -->
|
|
261
|
+
<ng-template #studentDetailsRendererTemplate let-value="value" let-row="row" let-column="column">
|
|
262
|
+
<div class="tw-flex tw-items-start tw-space-x-3 tw-py-3">
|
|
263
|
+
<div class="tw-flex-shrink-0 tw-mt-0.5">
|
|
264
|
+
<div class="tw-w-10 tw-h-10 tw-bg-blue-100 tw-rounded-lg tw-flex tw-items-center tw-justify-center">
|
|
265
|
+
<cide-ele-icon class="tw-text-blue-600 tw-w-5 tw-h-5">person</cide-ele-icon>
|
|
266
|
+
</div>
|
|
267
|
+
</div>
|
|
268
|
+
<div class="tw-min-w-0 tw-flex-1 tw-space-y-1">
|
|
269
|
+
<div class="tw-text-sm tw-font-semibold tw-text-gray-900 tw-leading-5">
|
|
270
|
+
{{ row?.user_fullname || getFullName(row) }}
|
|
271
|
+
</div>
|
|
272
|
+
@if (row?.user_type_mapping?.syutm_type_specific_id) {
|
|
273
|
+
<div class="tw-text-xs tw-text-gray-600 tw-leading-4 tw-font-mono">
|
|
274
|
+
<span class="tw-font-medium">Student ID:</span> {{ row.user_type_mapping.syutm_type_specific_id }}
|
|
275
|
+
</div>
|
|
276
|
+
}
|
|
277
|
+
@if (row?.user_username) {
|
|
278
|
+
<div class="tw-text-xs tw-text-gray-500 tw-leading-4">
|
|
279
|
+
Username: {{ row.user_username }}
|
|
280
|
+
</div>
|
|
281
|
+
}
|
|
282
|
+
</div>
|
|
283
|
+
</div>
|
|
284
|
+
</ng-template>
|
|
285
|
+
|
|
286
|
+
<!-- Contact Info Template -->
|
|
287
|
+
<ng-template #contactInfoRendererTemplate let-value="value" let-row="row" let-column="column">
|
|
288
|
+
<div class="tw-py-3 tw-space-y-1">
|
|
289
|
+
@if (row?.user_emailid) {
|
|
290
|
+
<div class="tw-text-xs tw-text-gray-900 tw-flex tw-items-center">
|
|
291
|
+
<cide-ele-icon class="tw-w-3 tw-h-3 tw-text-gray-400 tw-mr-2">email</cide-ele-icon>
|
|
292
|
+
<span class="tw-truncate">{{ row.user_emailid }}</span>
|
|
293
|
+
</div>
|
|
294
|
+
}
|
|
295
|
+
@if (row?.user_mobileno) {
|
|
296
|
+
<div class="tw-text-xs tw-text-gray-600 tw-flex tw-items-center">
|
|
297
|
+
<cide-ele-icon class="tw-w-3 tw-h-3 tw-text-gray-400 tw-mr-2">phone</cide-ele-icon>
|
|
298
|
+
<span class="tw-truncate">{{ row.user_mobileno }}</span>
|
|
299
|
+
</div>
|
|
300
|
+
}
|
|
301
|
+
</div>
|
|
302
|
+
</ng-template>
|
|
303
|
+
|
|
304
|
+
<!-- Status Template -->
|
|
305
|
+
<ng-template #statusRendererTemplate let-value="value" let-row="row" let-column="column">
|
|
306
|
+
<div class="tw-flex tw-items-center tw-justify-center tw-py-3">
|
|
307
|
+
@if (row?.user_isactive) {
|
|
308
|
+
<span class="tw-inline-flex tw-items-center tw-px-2.5 tw-py-1 tw-rounded-full tw-text-xs tw-font-medium tw-bg-green-100 tw-text-green-800">
|
|
309
|
+
Active
|
|
310
|
+
</span>
|
|
311
|
+
} @else {
|
|
312
|
+
<span class="tw-inline-flex tw-items-center tw-px-2.5 tw-py-1 tw-rounded-full tw-text-xs tw-font-medium tw-bg-red-100 tw-text-red-800">
|
|
313
|
+
Inactive
|
|
314
|
+
</span>
|
|
315
|
+
}
|
|
316
|
+
</div>
|
|
317
|
+
</ng-template>
|
|
318
|
+
|
|
319
|
+
<!-- Actions Template -->
|
|
320
|
+
<ng-template #actionsDropdownRendererTemplate let-row="row" let-value="value" let-column="column">
|
|
321
|
+
<cide-ele-dropdown
|
|
322
|
+
[items]="getActionDropdownItems(row)"
|
|
323
|
+
(itemClick)="onDropdownItemClick($event, row)"
|
|
324
|
+
size="sm"
|
|
325
|
+
variant="ghost"
|
|
326
|
+
icon="more_vert">
|
|
327
|
+
</cide-ele-dropdown>
|
|
328
|
+
</ng-template>
|
|
329
|
+
</cide-lyt-shared-wrapper>
|
|
330
330
|
`, isInline: true, styles: [":host{@apply tw-w-full tw-h-full tw-flex tw-flex-col;}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "component", type: CideIconComponent, selector: "cide-ele-icon", inputs: ["size", "type", "toolTip"] }, { kind: "component", type: CideEleDropdownComponent, selector: "cide-ele-dropdown", inputs: ["items", "config", "triggerTemplate", "menuTemplate"], outputs: ["itemClick", "dropdownToggle"] }, { 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: CideEleDataGridComponent, selector: "cide-ele-data-grid", inputs: ["config", "templateRenderers", "customFormatters", "actionHandlers", "serverSidePagination", "totalServerItems", "currentServerPage", "currentServerPageSize", "dragDropEnabled"], outputs: ["gridEvent"] }, { kind: "component", type: CideLytSharedWrapperComponent, selector: "cide-lyt-shared-wrapper", inputs: ["shared_wrapper_setup_param", "breadcrumb_data"] }] });
|
|
331
331
|
}
|
|
332
332
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: StudentListComponent, decorators: [{
|
|
@@ -339,107 +339,107 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImpor
|
|
|
339
339
|
CideEleButtonComponent,
|
|
340
340
|
CideEleDataGridComponent,
|
|
341
341
|
CideLytSharedWrapperComponent
|
|
342
|
-
], template: `
|
|
343
|
-
<cide-lyt-shared-wrapper [shared_wrapper_setup_param]="shared_wrapper_setup_param">
|
|
344
|
-
<div class="tw-w-full tw-h-full tw-flex tw-flex-col tw-overflow-hidden">
|
|
345
|
-
<!-- Header Section -->
|
|
346
|
-
<div class="tw-flex-shrink-0 tw-w-full tw-px-4 sm:tw-px-6 tw-py-3 tw-bg-gray-50 tw-border-b tw-border-gray-200">
|
|
347
|
-
<div class="tw-flex tw-items-center tw-justify-between">
|
|
348
|
-
<div class="tw-flex tw-items-center tw-gap-3">
|
|
349
|
-
<cide-ele-icon class="tw-text-blue-600 tw-w-5 tw-h-5">school</cide-ele-icon>
|
|
350
|
-
<div>
|
|
351
|
-
<h5 class="tw-text-sm tw-font-semibold tw-text-gray-900">Student Management</h5>
|
|
352
|
-
<p class="tw-text-xs tw-text-gray-600">Manage and view all student profiles</p>
|
|
353
|
-
</div>
|
|
354
|
-
</div>
|
|
355
|
-
<button cideEleButton variant="primary" size="sm" (click)="createNewStudent()" leftIcon="add">
|
|
356
|
-
Add Student
|
|
357
|
-
</button>
|
|
358
|
-
</div>
|
|
359
|
-
</div>
|
|
360
|
-
|
|
361
|
-
<!-- Data Grid Section -->
|
|
362
|
-
<div class="tw-flex-1 tw-h-auto tw-w-full tw-min-h-0 tw-relative tw-z-0 tw-overflow-hidden">
|
|
363
|
-
<cide-ele-data-grid
|
|
364
|
-
[config]="gridConfig()"
|
|
365
|
-
[templateRenderers]="templateRenderers()"
|
|
366
|
-
(gridEvent)="onGridEvent($event)">
|
|
367
|
-
</cide-ele-data-grid>
|
|
368
|
-
</div>
|
|
369
|
-
</div>
|
|
370
|
-
|
|
371
|
-
<!-- Student Details Template -->
|
|
372
|
-
<ng-template #studentDetailsRendererTemplate let-value="value" let-row="row" let-column="column">
|
|
373
|
-
<div class="tw-flex tw-items-start tw-space-x-3 tw-py-3">
|
|
374
|
-
<div class="tw-flex-shrink-0 tw-mt-0.5">
|
|
375
|
-
<div class="tw-w-10 tw-h-10 tw-bg-blue-100 tw-rounded-lg tw-flex tw-items-center tw-justify-center">
|
|
376
|
-
<cide-ele-icon class="tw-text-blue-600 tw-w-5 tw-h-5">person</cide-ele-icon>
|
|
377
|
-
</div>
|
|
378
|
-
</div>
|
|
379
|
-
<div class="tw-min-w-0 tw-flex-1 tw-space-y-1">
|
|
380
|
-
<div class="tw-text-sm tw-font-semibold tw-text-gray-900 tw-leading-5">
|
|
381
|
-
{{ row?.user_fullname || getFullName(row) }}
|
|
382
|
-
</div>
|
|
383
|
-
@if (row?.user_type_mapping?.syutm_type_specific_id) {
|
|
384
|
-
<div class="tw-text-xs tw-text-gray-600 tw-leading-4 tw-font-mono">
|
|
385
|
-
<span class="tw-font-medium">Student ID:</span> {{ row.user_type_mapping.syutm_type_specific_id }}
|
|
386
|
-
</div>
|
|
387
|
-
}
|
|
388
|
-
@if (row?.user_username) {
|
|
389
|
-
<div class="tw-text-xs tw-text-gray-500 tw-leading-4">
|
|
390
|
-
Username: {{ row.user_username }}
|
|
391
|
-
</div>
|
|
392
|
-
}
|
|
393
|
-
</div>
|
|
394
|
-
</div>
|
|
395
|
-
</ng-template>
|
|
396
|
-
|
|
397
|
-
<!-- Contact Info Template -->
|
|
398
|
-
<ng-template #contactInfoRendererTemplate let-value="value" let-row="row" let-column="column">
|
|
399
|
-
<div class="tw-py-3 tw-space-y-1">
|
|
400
|
-
@if (row?.user_emailid) {
|
|
401
|
-
<div class="tw-text-xs tw-text-gray-900 tw-flex tw-items-center">
|
|
402
|
-
<cide-ele-icon class="tw-w-3 tw-h-3 tw-text-gray-400 tw-mr-2">email</cide-ele-icon>
|
|
403
|
-
<span class="tw-truncate">{{ row.user_emailid }}</span>
|
|
404
|
-
</div>
|
|
405
|
-
}
|
|
406
|
-
@if (row?.user_mobileno) {
|
|
407
|
-
<div class="tw-text-xs tw-text-gray-600 tw-flex tw-items-center">
|
|
408
|
-
<cide-ele-icon class="tw-w-3 tw-h-3 tw-text-gray-400 tw-mr-2">phone</cide-ele-icon>
|
|
409
|
-
<span class="tw-truncate">{{ row.user_mobileno }}</span>
|
|
410
|
-
</div>
|
|
411
|
-
}
|
|
412
|
-
</div>
|
|
413
|
-
</ng-template>
|
|
414
|
-
|
|
415
|
-
<!-- Status Template -->
|
|
416
|
-
<ng-template #statusRendererTemplate let-value="value" let-row="row" let-column="column">
|
|
417
|
-
<div class="tw-flex tw-items-center tw-justify-center tw-py-3">
|
|
418
|
-
@if (row?.user_isactive) {
|
|
419
|
-
<span class="tw-inline-flex tw-items-center tw-px-2.5 tw-py-1 tw-rounded-full tw-text-xs tw-font-medium tw-bg-green-100 tw-text-green-800">
|
|
420
|
-
Active
|
|
421
|
-
</span>
|
|
422
|
-
} @else {
|
|
423
|
-
<span class="tw-inline-flex tw-items-center tw-px-2.5 tw-py-1 tw-rounded-full tw-text-xs tw-font-medium tw-bg-red-100 tw-text-red-800">
|
|
424
|
-
Inactive
|
|
425
|
-
</span>
|
|
426
|
-
}
|
|
427
|
-
</div>
|
|
428
|
-
</ng-template>
|
|
429
|
-
|
|
430
|
-
<!-- Actions Template -->
|
|
431
|
-
<ng-template #actionsDropdownRendererTemplate let-row="row" let-value="value" let-column="column">
|
|
432
|
-
<cide-ele-dropdown
|
|
433
|
-
[items]="getActionDropdownItems(row)"
|
|
434
|
-
(itemClick)="onDropdownItemClick($event, row)"
|
|
435
|
-
size="sm"
|
|
436
|
-
variant="ghost"
|
|
437
|
-
icon="more_vert">
|
|
438
|
-
</cide-ele-dropdown>
|
|
439
|
-
</ng-template>
|
|
440
|
-
</cide-lyt-shared-wrapper>
|
|
342
|
+
], template: `
|
|
343
|
+
<cide-lyt-shared-wrapper [shared_wrapper_setup_param]="shared_wrapper_setup_param">
|
|
344
|
+
<div class="tw-w-full tw-h-full tw-flex tw-flex-col tw-overflow-hidden">
|
|
345
|
+
<!-- Header Section -->
|
|
346
|
+
<div class="tw-flex-shrink-0 tw-w-full tw-px-4 sm:tw-px-6 tw-py-3 tw-bg-gray-50 tw-border-b tw-border-gray-200">
|
|
347
|
+
<div class="tw-flex tw-items-center tw-justify-between">
|
|
348
|
+
<div class="tw-flex tw-items-center tw-gap-3">
|
|
349
|
+
<cide-ele-icon class="tw-text-blue-600 tw-w-5 tw-h-5">school</cide-ele-icon>
|
|
350
|
+
<div>
|
|
351
|
+
<h5 class="tw-text-sm tw-font-semibold tw-text-gray-900">Student Management</h5>
|
|
352
|
+
<p class="tw-text-xs tw-text-gray-600">Manage and view all student profiles</p>
|
|
353
|
+
</div>
|
|
354
|
+
</div>
|
|
355
|
+
<button cideEleButton variant="primary" size="sm" (click)="createNewStudent()" leftIcon="add">
|
|
356
|
+
Add Student
|
|
357
|
+
</button>
|
|
358
|
+
</div>
|
|
359
|
+
</div>
|
|
360
|
+
|
|
361
|
+
<!-- Data Grid Section -->
|
|
362
|
+
<div class="tw-flex-1 tw-h-auto tw-w-full tw-min-h-0 tw-relative tw-z-0 tw-overflow-hidden">
|
|
363
|
+
<cide-ele-data-grid
|
|
364
|
+
[config]="gridConfig()"
|
|
365
|
+
[templateRenderers]="templateRenderers()"
|
|
366
|
+
(gridEvent)="onGridEvent($event)">
|
|
367
|
+
</cide-ele-data-grid>
|
|
368
|
+
</div>
|
|
369
|
+
</div>
|
|
370
|
+
|
|
371
|
+
<!-- Student Details Template -->
|
|
372
|
+
<ng-template #studentDetailsRendererTemplate let-value="value" let-row="row" let-column="column">
|
|
373
|
+
<div class="tw-flex tw-items-start tw-space-x-3 tw-py-3">
|
|
374
|
+
<div class="tw-flex-shrink-0 tw-mt-0.5">
|
|
375
|
+
<div class="tw-w-10 tw-h-10 tw-bg-blue-100 tw-rounded-lg tw-flex tw-items-center tw-justify-center">
|
|
376
|
+
<cide-ele-icon class="tw-text-blue-600 tw-w-5 tw-h-5">person</cide-ele-icon>
|
|
377
|
+
</div>
|
|
378
|
+
</div>
|
|
379
|
+
<div class="tw-min-w-0 tw-flex-1 tw-space-y-1">
|
|
380
|
+
<div class="tw-text-sm tw-font-semibold tw-text-gray-900 tw-leading-5">
|
|
381
|
+
{{ row?.user_fullname || getFullName(row) }}
|
|
382
|
+
</div>
|
|
383
|
+
@if (row?.user_type_mapping?.syutm_type_specific_id) {
|
|
384
|
+
<div class="tw-text-xs tw-text-gray-600 tw-leading-4 tw-font-mono">
|
|
385
|
+
<span class="tw-font-medium">Student ID:</span> {{ row.user_type_mapping.syutm_type_specific_id }}
|
|
386
|
+
</div>
|
|
387
|
+
}
|
|
388
|
+
@if (row?.user_username) {
|
|
389
|
+
<div class="tw-text-xs tw-text-gray-500 tw-leading-4">
|
|
390
|
+
Username: {{ row.user_username }}
|
|
391
|
+
</div>
|
|
392
|
+
}
|
|
393
|
+
</div>
|
|
394
|
+
</div>
|
|
395
|
+
</ng-template>
|
|
396
|
+
|
|
397
|
+
<!-- Contact Info Template -->
|
|
398
|
+
<ng-template #contactInfoRendererTemplate let-value="value" let-row="row" let-column="column">
|
|
399
|
+
<div class="tw-py-3 tw-space-y-1">
|
|
400
|
+
@if (row?.user_emailid) {
|
|
401
|
+
<div class="tw-text-xs tw-text-gray-900 tw-flex tw-items-center">
|
|
402
|
+
<cide-ele-icon class="tw-w-3 tw-h-3 tw-text-gray-400 tw-mr-2">email</cide-ele-icon>
|
|
403
|
+
<span class="tw-truncate">{{ row.user_emailid }}</span>
|
|
404
|
+
</div>
|
|
405
|
+
}
|
|
406
|
+
@if (row?.user_mobileno) {
|
|
407
|
+
<div class="tw-text-xs tw-text-gray-600 tw-flex tw-items-center">
|
|
408
|
+
<cide-ele-icon class="tw-w-3 tw-h-3 tw-text-gray-400 tw-mr-2">phone</cide-ele-icon>
|
|
409
|
+
<span class="tw-truncate">{{ row.user_mobileno }}</span>
|
|
410
|
+
</div>
|
|
411
|
+
}
|
|
412
|
+
</div>
|
|
413
|
+
</ng-template>
|
|
414
|
+
|
|
415
|
+
<!-- Status Template -->
|
|
416
|
+
<ng-template #statusRendererTemplate let-value="value" let-row="row" let-column="column">
|
|
417
|
+
<div class="tw-flex tw-items-center tw-justify-center tw-py-3">
|
|
418
|
+
@if (row?.user_isactive) {
|
|
419
|
+
<span class="tw-inline-flex tw-items-center tw-px-2.5 tw-py-1 tw-rounded-full tw-text-xs tw-font-medium tw-bg-green-100 tw-text-green-800">
|
|
420
|
+
Active
|
|
421
|
+
</span>
|
|
422
|
+
} @else {
|
|
423
|
+
<span class="tw-inline-flex tw-items-center tw-px-2.5 tw-py-1 tw-rounded-full tw-text-xs tw-font-medium tw-bg-red-100 tw-text-red-800">
|
|
424
|
+
Inactive
|
|
425
|
+
</span>
|
|
426
|
+
}
|
|
427
|
+
</div>
|
|
428
|
+
</ng-template>
|
|
429
|
+
|
|
430
|
+
<!-- Actions Template -->
|
|
431
|
+
<ng-template #actionsDropdownRendererTemplate let-row="row" let-value="value" let-column="column">
|
|
432
|
+
<cide-ele-dropdown
|
|
433
|
+
[items]="getActionDropdownItems(row)"
|
|
434
|
+
(itemClick)="onDropdownItemClick($event, row)"
|
|
435
|
+
size="sm"
|
|
436
|
+
variant="ghost"
|
|
437
|
+
icon="more_vert">
|
|
438
|
+
</cide-ele-dropdown>
|
|
439
|
+
</ng-template>
|
|
440
|
+
</cide-lyt-shared-wrapper>
|
|
441
441
|
`, styles: [":host{@apply tw-w-full tw-h-full tw-flex tw-flex-col;}\n"] }]
|
|
442
442
|
}] });
|
|
443
443
|
|
|
444
444
|
export { StudentListComponent };
|
|
445
|
-
//# sourceMappingURL=cloud-ide-academics-student-list.component-
|
|
445
|
+
//# sourceMappingURL=cloud-ide-academics-student-list.component-Bjwr-QFa.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloud-ide-academics-student-list.component-Bjwr-QFa.mjs","sources":["../../../projects/cloud-ide-academics/src/lib/collection/student-management/components/student-list/student-list.component.ts"],"sourcesContent":["import { Component, OnInit, OnDestroy, inject, signal, computed, viewChild, TemplateRef } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { Router, ActivatedRoute } from '@angular/router';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { DestroyRef } from '@angular/core';\nimport {\n CideIconComponent,\n CideEleDropdownComponent,\n CideEleButtonComponent,\n CideEleDataGridComponent,\n CideSelectComponent,\n TemplateContext,\n DropdownItem,\n NotificationService,\n GridEvent,\n ConfirmationService\n} from 'cloud-ide-element';\nimport { CideLytSharedWrapperComponent, ComponentContextService, RightsService } from 'cloud-ide-layout';\nimport { USER_SERVICE_TOKEN, IUserMasterService } from 'cloud-ide-shared';\nimport {\n AuthUserMst,\n AuthUserMstListPayload,\n authUserMstListControllerResponse,\n generateStringFromObject,\n CoreUserTypeMapping\n} from 'cloud-ide-lms-model';\n\ninterface Student extends AuthUserMst, Record<string, unknown> {\n user_type_mapping?: CoreUserTypeMapping;\n student_id?: string;\n admission_data?: any;\n}\n\n@Component({\n selector: 'cide-academics-student-list',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n CideIconComponent,\n CideEleDropdownComponent,\n CideEleButtonComponent,\n CideEleDataGridComponent,\n CideLytSharedWrapperComponent\n ],\n template: `\n <cide-lyt-shared-wrapper [shared_wrapper_setup_param]=\"shared_wrapper_setup_param\">\n <div class=\"tw-w-full tw-h-full tw-flex tw-flex-col tw-overflow-hidden\">\n <!-- Header Section -->\n <div class=\"tw-flex-shrink-0 tw-w-full tw-px-4 sm:tw-px-6 tw-py-3 tw-bg-gray-50 tw-border-b tw-border-gray-200\">\n <div class=\"tw-flex tw-items-center tw-justify-between\">\n <div class=\"tw-flex tw-items-center tw-gap-3\">\n <cide-ele-icon class=\"tw-text-blue-600 tw-w-5 tw-h-5\">school</cide-ele-icon>\n <div>\n <h5 class=\"tw-text-sm tw-font-semibold tw-text-gray-900\">Student Management</h5>\n <p class=\"tw-text-xs tw-text-gray-600\">Manage and view all student profiles</p>\n </div>\n </div>\n <button cideEleButton variant=\"primary\" size=\"sm\" (click)=\"createNewStudent()\" leftIcon=\"add\">\n Add Student\n </button>\n </div>\n </div>\n\n <!-- Data Grid Section -->\n <div class=\"tw-flex-1 tw-h-auto tw-w-full tw-min-h-0 tw-relative tw-z-0 tw-overflow-hidden\">\n <cide-ele-data-grid\n [config]=\"gridConfig()\"\n [templateRenderers]=\"templateRenderers()\"\n (gridEvent)=\"onGridEvent($event)\">\n </cide-ele-data-grid>\n </div>\n </div>\n\n <!-- Student Details Template -->\n <ng-template #studentDetailsRendererTemplate let-value=\"value\" let-row=\"row\" let-column=\"column\">\n <div class=\"tw-flex tw-items-start tw-space-x-3 tw-py-3\">\n <div class=\"tw-flex-shrink-0 tw-mt-0.5\">\n <div class=\"tw-w-10 tw-h-10 tw-bg-blue-100 tw-rounded-lg tw-flex tw-items-center tw-justify-center\">\n <cide-ele-icon class=\"tw-text-blue-600 tw-w-5 tw-h-5\">person</cide-ele-icon>\n </div>\n </div>\n <div class=\"tw-min-w-0 tw-flex-1 tw-space-y-1\">\n <div class=\"tw-text-sm tw-font-semibold tw-text-gray-900 tw-leading-5\">\n {{ row?.user_fullname || getFullName(row) }}\n </div>\n @if (row?.user_type_mapping?.syutm_type_specific_id) {\n <div class=\"tw-text-xs tw-text-gray-600 tw-leading-4 tw-font-mono\">\n <span class=\"tw-font-medium\">Student ID:</span> {{ row.user_type_mapping.syutm_type_specific_id }}\n </div>\n }\n @if (row?.user_username) {\n <div class=\"tw-text-xs tw-text-gray-500 tw-leading-4\">\n Username: {{ row.user_username }}\n </div>\n }\n </div>\n </div>\n </ng-template>\n\n <!-- Contact Info Template -->\n <ng-template #contactInfoRendererTemplate let-value=\"value\" let-row=\"row\" let-column=\"column\">\n <div class=\"tw-py-3 tw-space-y-1\">\n @if (row?.user_emailid) {\n <div class=\"tw-text-xs tw-text-gray-900 tw-flex tw-items-center\">\n <cide-ele-icon class=\"tw-w-3 tw-h-3 tw-text-gray-400 tw-mr-2\">email</cide-ele-icon>\n <span class=\"tw-truncate\">{{ row.user_emailid }}</span>\n </div>\n }\n @if (row?.user_mobileno) {\n <div class=\"tw-text-xs tw-text-gray-600 tw-flex tw-items-center\">\n <cide-ele-icon class=\"tw-w-3 tw-h-3 tw-text-gray-400 tw-mr-2\">phone</cide-ele-icon>\n <span class=\"tw-truncate\">{{ row.user_mobileno }}</span>\n </div>\n }\n </div>\n </ng-template>\n\n <!-- Status Template -->\n <ng-template #statusRendererTemplate let-value=\"value\" let-row=\"row\" let-column=\"column\">\n <div class=\"tw-flex tw-items-center tw-justify-center tw-py-3\">\n @if (row?.user_isactive) {\n <span class=\"tw-inline-flex tw-items-center tw-px-2.5 tw-py-1 tw-rounded-full tw-text-xs tw-font-medium tw-bg-green-100 tw-text-green-800\">\n Active\n </span>\n } @else {\n <span class=\"tw-inline-flex tw-items-center tw-px-2.5 tw-py-1 tw-rounded-full tw-text-xs tw-font-medium tw-bg-red-100 tw-text-red-800\">\n Inactive\n </span>\n }\n </div>\n </ng-template>\n\n <!-- Actions Template -->\n <ng-template #actionsDropdownRendererTemplate let-row=\"row\" let-value=\"value\" let-column=\"column\">\n <cide-ele-dropdown\n [items]=\"getActionDropdownItems(row)\"\n (itemClick)=\"onDropdownItemClick($event, row)\"\n size=\"sm\"\n variant=\"ghost\"\n icon=\"more_vert\">\n </cide-ele-dropdown>\n </ng-template>\n </cide-lyt-shared-wrapper>\n `,\n styles: [`\n :host {\n @apply tw-w-full tw-h-full tw-flex tw-flex-col;\n }\n `]\n})\nexport class StudentListComponent implements OnInit, OnDestroy {\n shared_wrapper_setup_param = { sypg_page_code: \"academics_student_list\" };\n\n private readonly destroyRef = inject(DestroyRef);\n private readonly userMasterService = inject(USER_SERVICE_TOKEN) as IUserMasterService;\n private readonly router = inject(Router);\n private readonly route = inject(ActivatedRoute);\n private readonly notificationService = inject(NotificationService);\n private readonly confirmationService = inject(ConfirmationService);\n private readonly componentContextService = inject(ComponentContextService);\n private readonly rightsService = inject(RightsService);\n\n // ViewChild for templates\n studentDetailsRendererTemplate = viewChild<TemplateRef<TemplateContext>>('studentDetailsRendererTemplate');\n contactInfoRendererTemplate = viewChild<TemplateRef<TemplateContext>>('contactInfoRendererTemplate');\n statusRendererTemplate = viewChild<TemplateRef<TemplateContext>>('statusRendererTemplate');\n actionsDropdownRendererTemplate = viewChild<TemplateRef<TemplateContext>>('actionsDropdownRendererTemplate');\n\n // State\n students = signal<Student[]>([]);\n loading = signal<boolean>(false);\n pageIndex = signal<number>(1);\n pageSize = signal<number>(10);\n total = signal<number>(0);\n searchQuery = signal<string>('');\n\n // Grid configuration\n gridConfig = computed(() => ({\n id: 'students-grid',\n responsive: true,\n data: this.students(),\n columns: [\n {\n key: 'student_details',\n header: 'Student Details',\n type: 'custom' as any,\n width: '300px',\n sortable: true,\n renderer: 'studentDetailsRendererTemplate'\n },\n {\n key: 'contact_info',\n header: 'Contact Information',\n type: 'custom' as any,\n width: '250px',\n sortable: false,\n renderer: 'contactInfoRendererTemplate'\n },\n {\n key: 'user_isactive',\n header: 'Status',\n type: 'custom' as any,\n width: '120px',\n sortable: true,\n renderer: 'statusRendererTemplate'\n },\n {\n key: 'actions',\n header: 'Actions',\n type: 'actions' as any,\n width: '100px',\n sortable: false,\n renderer: 'actionsDropdownRendererTemplate'\n }\n ],\n pagination: {\n enabled: true,\n pageSize: this.pageSize(),\n pageSizeOptions: [10, 25, 50, 100],\n showQuickJump: true,\n showPageInfo: true,\n showRefresh: true\n },\n search: {\n enabled: true,\n placeholder: 'Search students by name, ID, email...',\n searchableColumns: ['user_fullname', 'user_username', 'user_emailid'],\n debounceMs: 300\n },\n loading: {\n useDefer: true,\n skeletonRows: 5,\n showOverlay: false\n },\n rowHeight: 70\n }));\n\n templateRenderers = computed(() => ({\n studentDetailsRendererTemplate: this.studentDetailsRendererTemplate(),\n contactInfoRendererTemplate: this.contactInfoRendererTemplate(),\n statusRendererTemplate: this.statusRendererTemplate(),\n actionsDropdownRendererTemplate: this.actionsDropdownRendererTemplate()\n }));\n\n // Rights computed signals\n canCreate = computed(() => this.rightsService.hasRight('CREATE'));\n canEdit = computed(() => this.rightsService.hasRight('EDIT'));\n canDelete = computed(() => this.rightsService.hasRight('DELETE'));\n canView = computed(() => this.rightsService.hasRight('VIEW'));\n\n ngOnInit(): void {\n // Initialize rights for student management\n this.rightsService.initializeRights('academics_student_list');\n this.loadStudents();\n }\n\n ngOnDestroy(): void {\n // Cleanup handled by takeUntilDestroyed\n }\n\n loadStudents(): void {\n this.loading.set(true);\n const payload: AuthUserMstListPayload = {\n pageIndex: this.pageIndex(),\n pageSize: this.pageSize(),\n query: this.searchQuery() || undefined,\n pagination: true\n };\n\n this.userMasterService.getUserList(payload)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response: authUserMstListControllerResponse) => {\n if (response.success && response.data) {\n // Filter for students only based on user_type_mapping\n const students = (response.data as Student[]).filter(user => \n user.user_type_mapping?.syutm_user_type === 'STUDENT'\n );\n this.students.set(students);\n this.total.set(students.length);\n } else {\n this.students.set([]);\n this.total.set(0);\n }\n this.loading.set(false);\n },\n error: (error) => {\n console.error('Error loading students:', error);\n this.notificationService.error('Failed to load students. Please try again.');\n this.loading.set(false);\n }\n });\n }\n\n onGridEvent(event: GridEvent): void {\n if (event.type === 'pageChange') {\n if (event.data && typeof event.data === 'object' && 'pageIndex' in event.data) {\n this.pageIndex.set(event.data['pageIndex'] as number);\n this.loadStudents();\n }\n } else if (event.type === 'search') {\n if (event.data && typeof event.data === 'object' && 'query' in event.data) {\n this.searchQuery.set(event.data['query'] as string);\n this.pageIndex.set(1);\n this.loadStudents();\n }\n } else if (event.type === 'refresh') {\n this.loadStudents();\n }\n }\n\n getActionDropdownItems(row: Student): DropdownItem[] {\n return [\n { id: 'view', label: 'View Profile', icon: 'visibility' },\n { id: 'edit', label: 'Edit', icon: 'edit' },\n { id: 'delete', label: 'Delete', icon: 'delete' }\n ];\n }\n\n onDropdownItemClick(item: DropdownItem, row: Student): void {\n switch (item.id) {\n case 'view':\n this.viewStudent(row);\n break;\n case 'edit':\n this.editStudent(row);\n break;\n case 'delete':\n this.deleteStudent(row);\n break;\n }\n }\n\n createNewStudent(): void {\n if (!this.rightsService.hasRight('CREATE')) {\n this.notificationService.error('You do not have permission to create students');\n return;\n }\n this.router.navigate(['/control-panel/academics/student/create']);\n }\n\n viewStudent(student: Student): void {\n if (!this.rightsService.hasRight('VIEW')) {\n this.notificationService.error('You do not have permission to view students');\n return;\n }\n const query = generateStringFromObject({ user_id: student._id });\n this.router.navigate(['/control-panel/academics/student/view', query]);\n }\n\n editStudent(student: Student): void {\n if (!this.rightsService.hasRight('EDIT')) {\n this.notificationService.error('You do not have permission to edit students');\n return;\n }\n const query = generateStringFromObject({ user_id: student._id });\n this.router.navigate(['/control-panel/academics/student/edit', query]);\n }\n\n deleteStudent(student: Student): void {\n this.confirmationService.confirmDelete(student.user_fullname || 'Unknown')\n .then((confirmed) => {\n if (confirmed && student._id) {\n this.userMasterService.deleteUserMaster(student._id)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: () => {\n this.notificationService.success('Student deleted successfully');\n this.loadStudents();\n },\n error: () => {\n this.notificationService.error('Failed to delete student');\n }\n });\n }\n })\n .catch(() => {\n // User cancelled - no action needed\n });\n }\n\n getFullName(user: any): string {\n const parts = [user.user_firstname, user.user_middlename, user.user_lastname].filter(Boolean);\n return parts.length > 0 ? parts.join(' ') : 'Unknown';\n }\n}\n\n"],"names":[],"mappings":"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"}
|