cloud-ide-academics 0.0.48 → 0.0.51

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (17) hide show
  1. package/fesm2022/{cloud-ide-academics-class-program-term-create.component-DC8ufash.mjs → cloud-ide-academics-class-program-term-create.component-CVatJk3N.mjs} +2 -2
  2. package/fesm2022/{cloud-ide-academics-class-program-term-create.component-DC8ufash.mjs.map → cloud-ide-academics-class-program-term-create.component-CVatJk3N.mjs.map} +1 -1
  3. package/fesm2022/{cloud-ide-academics-class-program-term-list.component-DOSmWF8-.mjs → cloud-ide-academics-class-program-term-list.component-C8HKn3DL.mjs} +2 -2
  4. package/fesm2022/{cloud-ide-academics-class-program-term-list.component-DOSmWF8-.mjs.map → cloud-ide-academics-class-program-term-list.component-C8HKn3DL.mjs.map} +1 -1
  5. package/fesm2022/{cloud-ide-academics-cloud-ide-academics-lJe7ng0S.mjs → cloud-ide-academics-cloud-ide-academics-DbVZGw49.mjs} +17 -15
  6. package/fesm2022/cloud-ide-academics-cloud-ide-academics-DbVZGw49.mjs.map +1 -0
  7. package/fesm2022/{cloud-ide-academics-program-class-create.component-CvZ_LGT_.mjs → cloud-ide-academics-program-class-create.component-BVsXpSzg.mjs} +2 -2
  8. package/fesm2022/{cloud-ide-academics-program-class-create.component-CvZ_LGT_.mjs.map → cloud-ide-academics-program-class-create.component-BVsXpSzg.mjs.map} +1 -1
  9. package/fesm2022/{cloud-ide-academics-program-class-list.component-_P6B5SSA.mjs → cloud-ide-academics-program-class-list.component-DAZeLVtC.mjs} +2 -2
  10. package/fesm2022/{cloud-ide-academics-program-class-list.component-_P6B5SSA.mjs.map → cloud-ide-academics-program-class-list.component-DAZeLVtC.mjs.map} +1 -1
  11. package/fesm2022/cloud-ide-academics.mjs +1 -1
  12. package/package.json +1 -1
  13. package/fesm2022/cloud-ide-academics-cloud-ide-academics-lJe7ng0S.mjs.map +0 -1
  14. package/fesm2022/cloud-ide-academics-student-list.component-Ctctm6yt.mjs +0 -445
  15. package/fesm2022/cloud-ide-academics-student-list.component-Ctctm6yt.mjs.map +0 -1
  16. package/fesm2022/cloud-ide-academics-teacher-list.component-DfK2r__g.mjs +0 -435
  17. package/fesm2022/cloud-ide-academics-teacher-list.component-DfK2r__g.mjs.map +0 -1
@@ -1,445 +0,0 @@
1
- import * as i0 from '@angular/core';
2
- import { inject, DestroyRef, viewChild, signal, computed, Component } from '@angular/core';
3
- import { CommonModule } from '@angular/common';
4
- import { FormsModule } from '@angular/forms';
5
- import { Router, ActivatedRoute } from '@angular/router';
6
- import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
7
- import { NotificationService, ConfirmationService, CideIconComponent, CideEleDropdownComponent, CideEleButtonComponent, CideEleDataGridComponent } from 'cloud-ide-element';
8
- import { ComponentContextService, RightsService, CideLytSharedWrapperComponent } from 'cloud-ide-layout';
9
- import { USER_SERVICE_TOKEN } from 'cloud-ide-shared';
10
- import { generateStringFromObject } from 'cloud-ide-lms-model';
11
-
12
- class StudentListComponent {
13
- shared_wrapper_setup_param = { sypg_page_code: "academics_student_list" };
14
- destroyRef = inject(DestroyRef);
15
- userMasterService = inject(USER_SERVICE_TOKEN);
16
- router = inject(Router);
17
- route = inject(ActivatedRoute);
18
- notificationService = inject(NotificationService);
19
- confirmationService = inject(ConfirmationService);
20
- componentContextService = inject(ComponentContextService);
21
- rightsService = inject(RightsService);
22
- // ViewChild for templates
23
- studentDetailsRendererTemplate = viewChild('studentDetailsRendererTemplate', ...(ngDevMode ? [{ debugName: "studentDetailsRendererTemplate" }] : []));
24
- contactInfoRendererTemplate = viewChild('contactInfoRendererTemplate', ...(ngDevMode ? [{ debugName: "contactInfoRendererTemplate" }] : []));
25
- statusRendererTemplate = viewChild('statusRendererTemplate', ...(ngDevMode ? [{ debugName: "statusRendererTemplate" }] : []));
26
- actionsDropdownRendererTemplate = viewChild('actionsDropdownRendererTemplate', ...(ngDevMode ? [{ debugName: "actionsDropdownRendererTemplate" }] : []));
27
- // State
28
- students = signal([], ...(ngDevMode ? [{ debugName: "students" }] : []));
29
- loading = signal(false, ...(ngDevMode ? [{ debugName: "loading" }] : []));
30
- pageIndex = signal(1, ...(ngDevMode ? [{ debugName: "pageIndex" }] : []));
31
- pageSize = signal(10, ...(ngDevMode ? [{ debugName: "pageSize" }] : []));
32
- total = signal(0, ...(ngDevMode ? [{ debugName: "total" }] : []));
33
- searchQuery = signal('', ...(ngDevMode ? [{ debugName: "searchQuery" }] : []));
34
- // Grid configuration
35
- gridConfig = computed(() => ({
36
- id: 'students-grid',
37
- responsive: true,
38
- data: this.students(),
39
- columns: [
40
- {
41
- key: 'student_details',
42
- header: 'Student Details',
43
- type: 'custom',
44
- width: '300px',
45
- sortable: true,
46
- renderer: 'studentDetailsRendererTemplate'
47
- },
48
- {
49
- key: 'contact_info',
50
- header: 'Contact Information',
51
- type: 'custom',
52
- width: '250px',
53
- sortable: false,
54
- renderer: 'contactInfoRendererTemplate'
55
- },
56
- {
57
- key: 'user_isactive',
58
- header: 'Status',
59
- type: 'custom',
60
- width: '120px',
61
- sortable: true,
62
- renderer: 'statusRendererTemplate'
63
- },
64
- {
65
- key: 'actions',
66
- header: 'Actions',
67
- type: 'actions',
68
- width: '100px',
69
- sortable: false,
70
- renderer: 'actionsDropdownRendererTemplate'
71
- }
72
- ],
73
- pagination: {
74
- enabled: true,
75
- pageSize: this.pageSize(),
76
- pageSizeOptions: [10, 25, 50, 100],
77
- showQuickJump: true,
78
- showPageInfo: true,
79
- showRefresh: true
80
- },
81
- search: {
82
- enabled: true,
83
- placeholder: 'Search students by name, ID, email...',
84
- searchableColumns: ['user_fullname', 'user_username', 'user_emailid'],
85
- debounceMs: 300
86
- },
87
- loading: {
88
- useDefer: true,
89
- skeletonRows: 5,
90
- showOverlay: false
91
- },
92
- rowHeight: 70
93
- }), ...(ngDevMode ? [{ debugName: "gridConfig" }] : []));
94
- templateRenderers = computed(() => ({
95
- studentDetailsRendererTemplate: this.studentDetailsRendererTemplate(),
96
- contactInfoRendererTemplate: this.contactInfoRendererTemplate(),
97
- statusRendererTemplate: this.statusRendererTemplate(),
98
- actionsDropdownRendererTemplate: this.actionsDropdownRendererTemplate()
99
- }), ...(ngDevMode ? [{ debugName: "templateRenderers" }] : []));
100
- // Rights computed signals
101
- canCreate = computed(() => this.rightsService.hasRight('CREATE'), ...(ngDevMode ? [{ debugName: "canCreate" }] : []));
102
- canEdit = computed(() => this.rightsService.hasRight('EDIT'), ...(ngDevMode ? [{ debugName: "canEdit" }] : []));
103
- canDelete = computed(() => this.rightsService.hasRight('DELETE'), ...(ngDevMode ? [{ debugName: "canDelete" }] : []));
104
- canView = computed(() => this.rightsService.hasRight('VIEW'), ...(ngDevMode ? [{ debugName: "canView" }] : []));
105
- ngOnInit() {
106
- // Initialize rights for student management
107
- this.rightsService.initializeRights('academics_student_list');
108
- this.loadStudents();
109
- }
110
- ngOnDestroy() {
111
- // Cleanup handled by takeUntilDestroyed
112
- }
113
- loadStudents() {
114
- this.loading.set(true);
115
- const payload = {
116
- pageIndex: this.pageIndex(),
117
- pageSize: this.pageSize(),
118
- query: this.searchQuery() || undefined,
119
- pagination: true
120
- };
121
- this.userMasterService.getUserList(payload)
122
- .pipe(takeUntilDestroyed(this.destroyRef))
123
- .subscribe({
124
- next: (response) => {
125
- if (response.success && response.data) {
126
- // Filter for students only based on user_type_mapping
127
- const students = response.data.filter(user => user.user_type_mapping?.syutm_user_type === 'STUDENT');
128
- this.students.set(students);
129
- this.total.set(students.length);
130
- }
131
- else {
132
- this.students.set([]);
133
- this.total.set(0);
134
- }
135
- this.loading.set(false);
136
- },
137
- error: (error) => {
138
- console.error('Error loading students:', error);
139
- this.notificationService.error('Failed to load students. Please try again.');
140
- this.loading.set(false);
141
- }
142
- });
143
- }
144
- onGridEvent(event) {
145
- if (event.type === 'pageChange') {
146
- if (event.data && typeof event.data === 'object' && 'pageIndex' in event.data) {
147
- this.pageIndex.set(event.data['pageIndex']);
148
- this.loadStudents();
149
- }
150
- }
151
- else if (event.type === 'search') {
152
- if (event.data && typeof event.data === 'object' && 'query' in event.data) {
153
- this.searchQuery.set(event.data['query']);
154
- this.pageIndex.set(1);
155
- this.loadStudents();
156
- }
157
- }
158
- else if (event.type === 'refresh') {
159
- this.loadStudents();
160
- }
161
- }
162
- getActionDropdownItems(row) {
163
- return [
164
- { id: 'view', label: 'View Profile', icon: 'visibility' },
165
- { id: 'edit', label: 'Edit', icon: 'edit' },
166
- { id: 'delete', label: 'Delete', icon: 'delete' }
167
- ];
168
- }
169
- onDropdownItemClick(item, row) {
170
- switch (item.id) {
171
- case 'view':
172
- this.viewStudent(row);
173
- break;
174
- case 'edit':
175
- this.editStudent(row);
176
- break;
177
- case 'delete':
178
- this.deleteStudent(row);
179
- break;
180
- }
181
- }
182
- createNewStudent() {
183
- if (!this.rightsService.hasRight('CREATE')) {
184
- this.notificationService.error('You do not have permission to create students');
185
- return;
186
- }
187
- this.router.navigate(['/control-panel/student/create']);
188
- }
189
- viewStudent(student) {
190
- if (!this.rightsService.hasRight('VIEW')) {
191
- this.notificationService.error('You do not have permission to view students');
192
- return;
193
- }
194
- const query = generateStringFromObject({ user_id: student._id });
195
- this.router.navigate(['/control-panel/student/view', query]);
196
- }
197
- editStudent(student) {
198
- if (!this.rightsService.hasRight('EDIT')) {
199
- this.notificationService.error('You do not have permission to edit students');
200
- return;
201
- }
202
- const query = generateStringFromObject({ user_id: student._id });
203
- this.router.navigate(['/control-panel/student/edit', query]);
204
- }
205
- deleteStudent(student) {
206
- this.confirmationService.confirmDelete(student.user_fullname || 'Unknown')
207
- .then((confirmed) => {
208
- if (confirmed && student._id) {
209
- this.userMasterService.deleteUserMaster(student._id)
210
- .pipe(takeUntilDestroyed(this.destroyRef))
211
- .subscribe({
212
- next: () => {
213
- this.notificationService.success('Student deleted successfully');
214
- this.loadStudents();
215
- },
216
- error: () => {
217
- this.notificationService.error('Failed to delete student');
218
- }
219
- });
220
- }
221
- })
222
- .catch(() => {
223
- // User cancelled - no action needed
224
- });
225
- }
226
- getFullName(user) {
227
- const parts = [user.user_firstname, user.user_middlename, user.user_lastname].filter(Boolean);
228
- return parts.length > 0 ? parts.join(' ') : 'Unknown';
229
- }
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>
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
- }
332
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: StudentListComponent, decorators: [{
333
- type: Component,
334
- args: [{ selector: 'cide-academics-student-list', standalone: true, imports: [
335
- CommonModule,
336
- FormsModule,
337
- CideIconComponent,
338
- CideEleDropdownComponent,
339
- CideEleButtonComponent,
340
- CideEleDataGridComponent,
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>
441
- `, styles: [":host{@apply tw-w-full tw-h-full tw-flex tw-flex-col;}\n"] }]
442
- }] });
443
-
444
- export { StudentListComponent };
445
- //# sourceMappingURL=cloud-ide-academics-student-list.component-Ctctm6yt.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cloud-ide-academics-student-list.component-Ctctm6yt.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/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/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/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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"}