cloud-ide-academics 0.0.44 → 0.0.46
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.service-B_HDaTmS.mjs.map +1 -1
- package/fesm2022/{cloud-ide-academics-class-program-term-create.component-kSWzK2lk.mjs → cloud-ide-academics-class-program-term-create.component-CtDYfTvI.mjs} +4 -4
- package/fesm2022/{cloud-ide-academics-class-program-term-create.component-kSWzK2lk.mjs.map → cloud-ide-academics-class-program-term-create.component-CtDYfTvI.mjs.map} +1 -1
- package/fesm2022/{cloud-ide-academics-class-program-term-list.component-z2Lz6cg9.mjs → cloud-ide-academics-class-program-term-list.component-DTL-sqWv.mjs} +2 -2
- package/fesm2022/{cloud-ide-academics-class-program-term-list.component-z2Lz6cg9.mjs.map → cloud-ide-academics-class-program-term-list.component-DTL-sqWv.mjs.map} +1 -1
- package/fesm2022/{cloud-ide-academics-cloud-ide-academics-0drYFjQW.mjs → cloud-ide-academics-cloud-ide-academics-YP2xqO5a.mjs} +19 -17
- package/fesm2022/cloud-ide-academics-cloud-ide-academics-YP2xqO5a.mjs.map +1 -0
- package/fesm2022/{cloud-ide-academics-program-class-create.component-DSPV-iAg.mjs → cloud-ide-academics-program-class-create.component-qP5KtKeS.mjs} +2 -2
- package/fesm2022/{cloud-ide-academics-program-class-create.component-DSPV-iAg.mjs.map → cloud-ide-academics-program-class-create.component-qP5KtKeS.mjs.map} +1 -1
- package/fesm2022/{cloud-ide-academics-program-class-list.component-B97WqYt7.mjs → cloud-ide-academics-program-class-list.component-DA3JxxAU.mjs} +2 -2
- package/fesm2022/{cloud-ide-academics-program-class-list.component-B97WqYt7.mjs.map → cloud-ide-academics-program-class-list.component-DA3JxxAU.mjs.map} +1 -1
- package/fesm2022/cloud-ide-academics.mjs +1 -1
- package/package.json +1 -1
- package/fesm2022/cloud-ide-academics-cloud-ide-academics-0drYFjQW.mjs.map +0 -1
- package/fesm2022/cloud-ide-academics-student-list.component-Bjwr-QFa.mjs +0 -445
- package/fesm2022/cloud-ide-academics-student-list.component-Bjwr-QFa.mjs.map +0 -1
- package/fesm2022/cloud-ide-academics-teacher-list.component-DfK2r__g.mjs +0 -435
- package/fesm2022/cloud-ide-academics-teacher-list.component-DfK2r__g.mjs.map +0 -1
|
@@ -1,435 +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 TeacherListComponent {
|
|
13
|
-
shared_wrapper_setup_param = { sypg_page_code: "academics_teacher_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
|
-
teacherDetailsRendererTemplate = viewChild('teacherDetailsRendererTemplate', ...(ngDevMode ? [{ debugName: "teacherDetailsRendererTemplate" }] : []));
|
|
24
|
-
contactInfoRendererTemplate = viewChild('contactInfoRendererTemplate', ...(ngDevMode ? [{ debugName: "contactInfoRendererTemplate" }] : []));
|
|
25
|
-
statusRendererTemplate = viewChild('statusRendererTemplate', ...(ngDevMode ? [{ debugName: "statusRendererTemplate" }] : []));
|
|
26
|
-
actionsDropdownRendererTemplate = viewChild('actionsDropdownRendererTemplate', ...(ngDevMode ? [{ debugName: "actionsDropdownRendererTemplate" }] : []));
|
|
27
|
-
// State
|
|
28
|
-
teachers = signal([], ...(ngDevMode ? [{ debugName: "teachers" }] : []));
|
|
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
|
-
// Rights computed signals
|
|
35
|
-
canCreate = computed(() => this.rightsService.hasRight('CREATE'), ...(ngDevMode ? [{ debugName: "canCreate" }] : []));
|
|
36
|
-
canEdit = computed(() => this.rightsService.hasRight('EDIT'), ...(ngDevMode ? [{ debugName: "canEdit" }] : []));
|
|
37
|
-
canDelete = computed(() => this.rightsService.hasRight('DELETE'), ...(ngDevMode ? [{ debugName: "canDelete" }] : []));
|
|
38
|
-
canView = computed(() => this.rightsService.hasRight('VIEW'), ...(ngDevMode ? [{ debugName: "canView" }] : []));
|
|
39
|
-
// Grid configuration
|
|
40
|
-
gridConfig = computed(() => ({
|
|
41
|
-
id: 'teachers-grid',
|
|
42
|
-
responsive: true,
|
|
43
|
-
data: this.teachers(),
|
|
44
|
-
columns: [
|
|
45
|
-
{
|
|
46
|
-
key: 'teacher_details',
|
|
47
|
-
header: 'Faculty Details',
|
|
48
|
-
type: 'custom',
|
|
49
|
-
width: '300px',
|
|
50
|
-
sortable: true,
|
|
51
|
-
renderer: 'teacherDetailsRendererTemplate'
|
|
52
|
-
},
|
|
53
|
-
{
|
|
54
|
-
key: 'contact_info',
|
|
55
|
-
header: 'Contact Information',
|
|
56
|
-
type: 'custom',
|
|
57
|
-
width: '250px',
|
|
58
|
-
sortable: false,
|
|
59
|
-
renderer: 'contactInfoRendererTemplate'
|
|
60
|
-
},
|
|
61
|
-
{
|
|
62
|
-
key: 'user_isactive',
|
|
63
|
-
header: 'Status',
|
|
64
|
-
type: 'custom',
|
|
65
|
-
width: '120px',
|
|
66
|
-
sortable: true,
|
|
67
|
-
renderer: 'statusRendererTemplate'
|
|
68
|
-
},
|
|
69
|
-
{
|
|
70
|
-
key: 'actions',
|
|
71
|
-
header: 'Actions',
|
|
72
|
-
type: 'actions',
|
|
73
|
-
width: '100px',
|
|
74
|
-
sortable: false,
|
|
75
|
-
renderer: 'actionsDropdownRendererTemplate'
|
|
76
|
-
}
|
|
77
|
-
],
|
|
78
|
-
pagination: {
|
|
79
|
-
enabled: true,
|
|
80
|
-
pageSize: this.pageSize(),
|
|
81
|
-
pageSizeOptions: [10, 25, 50, 100],
|
|
82
|
-
showQuickJump: true,
|
|
83
|
-
showPageInfo: true,
|
|
84
|
-
showRefresh: true
|
|
85
|
-
},
|
|
86
|
-
search: {
|
|
87
|
-
enabled: true,
|
|
88
|
-
placeholder: 'Search faculty by name, ID, email...',
|
|
89
|
-
searchableColumns: ['user_fullname', 'user_username', 'user_emailid'],
|
|
90
|
-
debounceMs: 300
|
|
91
|
-
},
|
|
92
|
-
loading: {
|
|
93
|
-
useDefer: true,
|
|
94
|
-
skeletonRows: 5,
|
|
95
|
-
showOverlay: false
|
|
96
|
-
},
|
|
97
|
-
rowHeight: 70
|
|
98
|
-
}), ...(ngDevMode ? [{ debugName: "gridConfig" }] : []));
|
|
99
|
-
templateRenderers = computed(() => ({
|
|
100
|
-
teacherDetailsRendererTemplate: this.teacherDetailsRendererTemplate(),
|
|
101
|
-
contactInfoRendererTemplate: this.contactInfoRendererTemplate(),
|
|
102
|
-
statusRendererTemplate: this.statusRendererTemplate(),
|
|
103
|
-
actionsDropdownRendererTemplate: this.actionsDropdownRendererTemplate()
|
|
104
|
-
}), ...(ngDevMode ? [{ debugName: "templateRenderers" }] : []));
|
|
105
|
-
ngOnInit() {
|
|
106
|
-
// Initialize rights for teacher management
|
|
107
|
-
this.rightsService.initializeRights('academics_teacher_list');
|
|
108
|
-
this.loadTeachers();
|
|
109
|
-
}
|
|
110
|
-
ngOnDestroy() {
|
|
111
|
-
// Cleanup handled by takeUntilDestroyed
|
|
112
|
-
}
|
|
113
|
-
loadTeachers() {
|
|
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 teachers only based on user_type_mapping
|
|
127
|
-
const teachers = response.data.filter(user => user.user_type_mapping?.syutm_user_type === 'TEACHER');
|
|
128
|
-
this.teachers.set(teachers);
|
|
129
|
-
this.total.set(teachers.length);
|
|
130
|
-
}
|
|
131
|
-
else {
|
|
132
|
-
this.teachers.set([]);
|
|
133
|
-
this.total.set(0);
|
|
134
|
-
}
|
|
135
|
-
this.loading.set(false);
|
|
136
|
-
},
|
|
137
|
-
error: (error) => {
|
|
138
|
-
console.error('Error loading faculty:', error);
|
|
139
|
-
this.notificationService.error('Failed to load faculty. 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.loadTeachers();
|
|
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.loadTeachers();
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
else if (event.type === 'refresh') {
|
|
159
|
-
this.loadTeachers();
|
|
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.viewTeacher(row);
|
|
173
|
-
break;
|
|
174
|
-
case 'edit':
|
|
175
|
-
this.editTeacher(row);
|
|
176
|
-
break;
|
|
177
|
-
case 'delete':
|
|
178
|
-
this.deleteTeacher(row);
|
|
179
|
-
break;
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
createNewTeacher() {
|
|
183
|
-
if (!this.rightsService.hasRight('CREATE')) {
|
|
184
|
-
this.notificationService.error('You do not have permission to create faculty');
|
|
185
|
-
return;
|
|
186
|
-
}
|
|
187
|
-
this.router.navigate(['/control-panel/teacher/create']);
|
|
188
|
-
}
|
|
189
|
-
viewTeacher(teacher) {
|
|
190
|
-
if (!this.rightsService.hasRight('VIEW')) {
|
|
191
|
-
this.notificationService.error('You do not have permission to view faculty');
|
|
192
|
-
return;
|
|
193
|
-
}
|
|
194
|
-
const query = generateStringFromObject({ user_id: teacher._id });
|
|
195
|
-
this.router.navigate(['/control-panel/teacher/view', query]);
|
|
196
|
-
}
|
|
197
|
-
editTeacher(teacher) {
|
|
198
|
-
if (!this.rightsService.hasRight('EDIT')) {
|
|
199
|
-
this.notificationService.error('You do not have permission to edit faculty');
|
|
200
|
-
return;
|
|
201
|
-
}
|
|
202
|
-
const query = generateStringFromObject({ user_id: teacher._id });
|
|
203
|
-
this.router.navigate(['/control-panel/teacher/edit', query]);
|
|
204
|
-
}
|
|
205
|
-
deleteTeacher(teacher) {
|
|
206
|
-
if (!this.rightsService.hasRight('DELETE')) {
|
|
207
|
-
this.notificationService.error('You do not have permission to delete faculty');
|
|
208
|
-
return;
|
|
209
|
-
}
|
|
210
|
-
this.confirmationService.confirmDelete(teacher.user_fullname || 'Unknown')
|
|
211
|
-
.then((confirmed) => {
|
|
212
|
-
if (confirmed && teacher._id) {
|
|
213
|
-
this.userMasterService.deleteUserMaster(teacher._id)
|
|
214
|
-
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
215
|
-
.subscribe({
|
|
216
|
-
next: () => {
|
|
217
|
-
this.notificationService.success('Faculty deleted successfully');
|
|
218
|
-
this.loadTeachers();
|
|
219
|
-
},
|
|
220
|
-
error: () => {
|
|
221
|
-
this.notificationService.error('Failed to delete faculty');
|
|
222
|
-
}
|
|
223
|
-
});
|
|
224
|
-
}
|
|
225
|
-
})
|
|
226
|
-
.catch(() => {
|
|
227
|
-
// User cancelled - no action needed
|
|
228
|
-
});
|
|
229
|
-
}
|
|
230
|
-
getFullName(user) {
|
|
231
|
-
const parts = [user.user_firstname, user.user_middlename, user.user_lastname].filter(Boolean);
|
|
232
|
-
return parts.length > 0 ? parts.join(' ') : 'Unknown';
|
|
233
|
-
}
|
|
234
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: TeacherListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
235
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.7", type: TeacherListComponent, isStandalone: true, selector: "cide-academics-teacher-list", viewQueries: [{ propertyName: "teacherDetailsRendererTemplate", first: true, predicate: ["teacherDetailsRendererTemplate"], 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: `
|
|
236
|
-
<cide-lyt-shared-wrapper [shared_wrapper_setup_param]="shared_wrapper_setup_param">
|
|
237
|
-
<!-- Breadcrumb Actions -->
|
|
238
|
-
<div breadcrumb-actions>
|
|
239
|
-
@if (canCreate()) {
|
|
240
|
-
<button cideEleButton variant="primary" size="sm" (click)="createNewTeacher()" leftIcon="add">
|
|
241
|
-
Add Faculty
|
|
242
|
-
</button>
|
|
243
|
-
}
|
|
244
|
-
</div>
|
|
245
|
-
|
|
246
|
-
<div class="tw-w-full tw-h-full tw-flex tw-flex-col tw-overflow-hidden">
|
|
247
|
-
<!-- Data Grid Section -->
|
|
248
|
-
<div class="tw-flex-1 tw-h-auto tw-w-full tw-min-h-0 tw-relative tw-z-0 tw-overflow-hidden">
|
|
249
|
-
<cide-ele-data-grid
|
|
250
|
-
[config]="gridConfig()"
|
|
251
|
-
[templateRenderers]="templateRenderers()"
|
|
252
|
-
(gridEvent)="onGridEvent($event)">
|
|
253
|
-
</cide-ele-data-grid>
|
|
254
|
-
</div>
|
|
255
|
-
</div>
|
|
256
|
-
|
|
257
|
-
<!-- Teacher Details Template -->
|
|
258
|
-
<ng-template #teacherDetailsRendererTemplate let-value="value" let-row="row" let-column="column">
|
|
259
|
-
<div class="tw-flex tw-items-start tw-space-x-3 tw-py-3">
|
|
260
|
-
<div class="tw-flex-shrink-0 tw-mt-0.5">
|
|
261
|
-
<div class="tw-w-10 tw-h-10 tw-bg-purple-100 tw-rounded-lg tw-flex tw-items-center tw-justify-center">
|
|
262
|
-
<cide-ele-icon class="tw-text-purple-600 tw-w-5 tw-h-5">person</cide-ele-icon>
|
|
263
|
-
</div>
|
|
264
|
-
</div>
|
|
265
|
-
<div class="tw-min-w-0 tw-flex-1 tw-space-y-1">
|
|
266
|
-
<div class="tw-text-sm tw-font-semibold tw-text-gray-900 tw-leading-5">
|
|
267
|
-
{{ row?.user_fullname || getFullName(row) }}
|
|
268
|
-
</div>
|
|
269
|
-
@if (row?.user_type_mapping?.syutm_type_specific_id) {
|
|
270
|
-
<div class="tw-text-xs tw-text-gray-600 tw-leading-4 tw-font-mono">
|
|
271
|
-
<span class="tw-font-medium">Faculty ID:</span> {{ row.user_type_mapping.syutm_type_specific_id }}
|
|
272
|
-
</div>
|
|
273
|
-
}
|
|
274
|
-
@if (row?.user_username) {
|
|
275
|
-
<div class="tw-text-xs tw-text-gray-500 tw-leading-4">
|
|
276
|
-
Username: {{ row.user_username }}
|
|
277
|
-
</div>
|
|
278
|
-
}
|
|
279
|
-
</div>
|
|
280
|
-
</div>
|
|
281
|
-
</ng-template>
|
|
282
|
-
|
|
283
|
-
<!-- Contact Info Template -->
|
|
284
|
-
<ng-template #contactInfoRendererTemplate let-value="value" let-row="row" let-column="column">
|
|
285
|
-
<div class="tw-py-3 tw-space-y-1">
|
|
286
|
-
@if (row?.user_emailid) {
|
|
287
|
-
<div class="tw-text-xs tw-text-gray-900 tw-flex tw-items-center">
|
|
288
|
-
<cide-ele-icon class="tw-w-3 tw-h-3 tw-text-gray-400 tw-mr-2">email</cide-ele-icon>
|
|
289
|
-
<span class="tw-truncate">{{ row.user_emailid }}</span>
|
|
290
|
-
</div>
|
|
291
|
-
}
|
|
292
|
-
@if (row?.user_mobileno) {
|
|
293
|
-
<div class="tw-text-xs tw-text-gray-600 tw-flex tw-items-center">
|
|
294
|
-
<cide-ele-icon class="tw-w-3 tw-h-3 tw-text-gray-400 tw-mr-2">phone</cide-ele-icon>
|
|
295
|
-
<span class="tw-truncate">{{ row.user_mobileno }}</span>
|
|
296
|
-
</div>
|
|
297
|
-
}
|
|
298
|
-
</div>
|
|
299
|
-
</ng-template>
|
|
300
|
-
|
|
301
|
-
<!-- Status Template -->
|
|
302
|
-
<ng-template #statusRendererTemplate let-value="value" let-row="row" let-column="column">
|
|
303
|
-
<div class="tw-flex tw-items-center tw-justify-center tw-py-3">
|
|
304
|
-
@if (row?.user_isactive) {
|
|
305
|
-
<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">
|
|
306
|
-
Active
|
|
307
|
-
</span>
|
|
308
|
-
} @else {
|
|
309
|
-
<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">
|
|
310
|
-
Inactive
|
|
311
|
-
</span>
|
|
312
|
-
}
|
|
313
|
-
</div>
|
|
314
|
-
</ng-template>
|
|
315
|
-
|
|
316
|
-
<!-- Actions Template -->
|
|
317
|
-
<ng-template #actionsDropdownRendererTemplate let-row="row" let-value="value" let-column="column">
|
|
318
|
-
<cide-ele-dropdown
|
|
319
|
-
[items]="getActionDropdownItems(row)"
|
|
320
|
-
(itemClick)="onDropdownItemClick($event, row)"
|
|
321
|
-
size="sm"
|
|
322
|
-
variant="ghost"
|
|
323
|
-
icon="more_vert">
|
|
324
|
-
</cide-ele-dropdown>
|
|
325
|
-
</ng-template>
|
|
326
|
-
</cide-lyt-shared-wrapper>
|
|
327
|
-
`, 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"] }] });
|
|
328
|
-
}
|
|
329
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: TeacherListComponent, decorators: [{
|
|
330
|
-
type: Component,
|
|
331
|
-
args: [{ selector: 'cide-academics-teacher-list', standalone: true, imports: [
|
|
332
|
-
CommonModule,
|
|
333
|
-
FormsModule,
|
|
334
|
-
CideIconComponent,
|
|
335
|
-
CideEleDropdownComponent,
|
|
336
|
-
CideEleButtonComponent,
|
|
337
|
-
CideEleDataGridComponent,
|
|
338
|
-
CideLytSharedWrapperComponent
|
|
339
|
-
], template: `
|
|
340
|
-
<cide-lyt-shared-wrapper [shared_wrapper_setup_param]="shared_wrapper_setup_param">
|
|
341
|
-
<!-- Breadcrumb Actions -->
|
|
342
|
-
<div breadcrumb-actions>
|
|
343
|
-
@if (canCreate()) {
|
|
344
|
-
<button cideEleButton variant="primary" size="sm" (click)="createNewTeacher()" leftIcon="add">
|
|
345
|
-
Add Faculty
|
|
346
|
-
</button>
|
|
347
|
-
}
|
|
348
|
-
</div>
|
|
349
|
-
|
|
350
|
-
<div class="tw-w-full tw-h-full tw-flex tw-flex-col tw-overflow-hidden">
|
|
351
|
-
<!-- Data Grid Section -->
|
|
352
|
-
<div class="tw-flex-1 tw-h-auto tw-w-full tw-min-h-0 tw-relative tw-z-0 tw-overflow-hidden">
|
|
353
|
-
<cide-ele-data-grid
|
|
354
|
-
[config]="gridConfig()"
|
|
355
|
-
[templateRenderers]="templateRenderers()"
|
|
356
|
-
(gridEvent)="onGridEvent($event)">
|
|
357
|
-
</cide-ele-data-grid>
|
|
358
|
-
</div>
|
|
359
|
-
</div>
|
|
360
|
-
|
|
361
|
-
<!-- Teacher Details Template -->
|
|
362
|
-
<ng-template #teacherDetailsRendererTemplate let-value="value" let-row="row" let-column="column">
|
|
363
|
-
<div class="tw-flex tw-items-start tw-space-x-3 tw-py-3">
|
|
364
|
-
<div class="tw-flex-shrink-0 tw-mt-0.5">
|
|
365
|
-
<div class="tw-w-10 tw-h-10 tw-bg-purple-100 tw-rounded-lg tw-flex tw-items-center tw-justify-center">
|
|
366
|
-
<cide-ele-icon class="tw-text-purple-600 tw-w-5 tw-h-5">person</cide-ele-icon>
|
|
367
|
-
</div>
|
|
368
|
-
</div>
|
|
369
|
-
<div class="tw-min-w-0 tw-flex-1 tw-space-y-1">
|
|
370
|
-
<div class="tw-text-sm tw-font-semibold tw-text-gray-900 tw-leading-5">
|
|
371
|
-
{{ row?.user_fullname || getFullName(row) }}
|
|
372
|
-
</div>
|
|
373
|
-
@if (row?.user_type_mapping?.syutm_type_specific_id) {
|
|
374
|
-
<div class="tw-text-xs tw-text-gray-600 tw-leading-4 tw-font-mono">
|
|
375
|
-
<span class="tw-font-medium">Faculty ID:</span> {{ row.user_type_mapping.syutm_type_specific_id }}
|
|
376
|
-
</div>
|
|
377
|
-
}
|
|
378
|
-
@if (row?.user_username) {
|
|
379
|
-
<div class="tw-text-xs tw-text-gray-500 tw-leading-4">
|
|
380
|
-
Username: {{ row.user_username }}
|
|
381
|
-
</div>
|
|
382
|
-
}
|
|
383
|
-
</div>
|
|
384
|
-
</div>
|
|
385
|
-
</ng-template>
|
|
386
|
-
|
|
387
|
-
<!-- Contact Info Template -->
|
|
388
|
-
<ng-template #contactInfoRendererTemplate let-value="value" let-row="row" let-column="column">
|
|
389
|
-
<div class="tw-py-3 tw-space-y-1">
|
|
390
|
-
@if (row?.user_emailid) {
|
|
391
|
-
<div class="tw-text-xs tw-text-gray-900 tw-flex tw-items-center">
|
|
392
|
-
<cide-ele-icon class="tw-w-3 tw-h-3 tw-text-gray-400 tw-mr-2">email</cide-ele-icon>
|
|
393
|
-
<span class="tw-truncate">{{ row.user_emailid }}</span>
|
|
394
|
-
</div>
|
|
395
|
-
}
|
|
396
|
-
@if (row?.user_mobileno) {
|
|
397
|
-
<div class="tw-text-xs tw-text-gray-600 tw-flex tw-items-center">
|
|
398
|
-
<cide-ele-icon class="tw-w-3 tw-h-3 tw-text-gray-400 tw-mr-2">phone</cide-ele-icon>
|
|
399
|
-
<span class="tw-truncate">{{ row.user_mobileno }}</span>
|
|
400
|
-
</div>
|
|
401
|
-
}
|
|
402
|
-
</div>
|
|
403
|
-
</ng-template>
|
|
404
|
-
|
|
405
|
-
<!-- Status Template -->
|
|
406
|
-
<ng-template #statusRendererTemplate let-value="value" let-row="row" let-column="column">
|
|
407
|
-
<div class="tw-flex tw-items-center tw-justify-center tw-py-3">
|
|
408
|
-
@if (row?.user_isactive) {
|
|
409
|
-
<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">
|
|
410
|
-
Active
|
|
411
|
-
</span>
|
|
412
|
-
} @else {
|
|
413
|
-
<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">
|
|
414
|
-
Inactive
|
|
415
|
-
</span>
|
|
416
|
-
}
|
|
417
|
-
</div>
|
|
418
|
-
</ng-template>
|
|
419
|
-
|
|
420
|
-
<!-- Actions Template -->
|
|
421
|
-
<ng-template #actionsDropdownRendererTemplate let-row="row" let-value="value" let-column="column">
|
|
422
|
-
<cide-ele-dropdown
|
|
423
|
-
[items]="getActionDropdownItems(row)"
|
|
424
|
-
(itemClick)="onDropdownItemClick($event, row)"
|
|
425
|
-
size="sm"
|
|
426
|
-
variant="ghost"
|
|
427
|
-
icon="more_vert">
|
|
428
|
-
</cide-ele-dropdown>
|
|
429
|
-
</ng-template>
|
|
430
|
-
</cide-lyt-shared-wrapper>
|
|
431
|
-
`, styles: [":host{@apply tw-w-full tw-h-full tw-flex tw-flex-col;}\n"] }]
|
|
432
|
-
}] });
|
|
433
|
-
|
|
434
|
-
export { TeacherListComponent };
|
|
435
|
-
//# sourceMappingURL=cloud-ide-academics-teacher-list.component-DfK2r__g.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cloud-ide-academics-teacher-list.component-DfK2r__g.mjs","sources":["../../../projects/cloud-ide-academics/src/lib/collection/teacher-management/components/teacher-list/teacher-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 Teacher extends AuthUserMst, Record<string, unknown> {\n user_type_mapping?: CoreUserTypeMapping;\n teacher_id?: string;\n department?: string;\n subject?: string;\n specialization?: string;\n}\n\n@Component({\n selector: 'cide-academics-teacher-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 <!-- Breadcrumb Actions -->\n <div breadcrumb-actions>\n @if (canCreate()) {\n <button cideEleButton variant=\"primary\" size=\"sm\" (click)=\"createNewTeacher()\" leftIcon=\"add\">\n Add Faculty\n </button>\n }\n </div>\n\n <div class=\"tw-w-full tw-h-full tw-flex tw-flex-col tw-overflow-hidden\">\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 <!-- Teacher Details Template -->\n <ng-template #teacherDetailsRendererTemplate 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-purple-100 tw-rounded-lg tw-flex tw-items-center tw-justify-center\">\n <cide-ele-icon class=\"tw-text-purple-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\">Faculty 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 TeacherListComponent implements OnInit, OnDestroy {\n shared_wrapper_setup_param = { sypg_page_code: \"academics_teacher_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 teacherDetailsRendererTemplate = viewChild<TemplateRef<TemplateContext>>('teacherDetailsRendererTemplate');\n contactInfoRendererTemplate = viewChild<TemplateRef<TemplateContext>>('contactInfoRendererTemplate');\n statusRendererTemplate = viewChild<TemplateRef<TemplateContext>>('statusRendererTemplate');\n actionsDropdownRendererTemplate = viewChild<TemplateRef<TemplateContext>>('actionsDropdownRendererTemplate');\n\n // State\n teachers = signal<Teacher[]>([]);\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 // 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 // Grid configuration\n gridConfig = computed(() => ({\n id: 'teachers-grid',\n responsive: true,\n data: this.teachers(),\n columns: [\n {\n key: 'teacher_details',\n header: 'Faculty Details',\n type: 'custom' as any,\n width: '300px',\n sortable: true,\n renderer: 'teacherDetailsRendererTemplate'\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 faculty 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 teacherDetailsRendererTemplate: this.teacherDetailsRendererTemplate(),\n contactInfoRendererTemplate: this.contactInfoRendererTemplate(),\n statusRendererTemplate: this.statusRendererTemplate(),\n actionsDropdownRendererTemplate: this.actionsDropdownRendererTemplate()\n }));\n\n ngOnInit(): void {\n // Initialize rights for teacher management\n this.rightsService.initializeRights('academics_teacher_list');\n this.loadTeachers();\n }\n\n ngOnDestroy(): void {\n // Cleanup handled by takeUntilDestroyed\n }\n\n loadTeachers(): 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 teachers only based on user_type_mapping\n const teachers = (response.data as Teacher[]).filter(user => \n user.user_type_mapping?.syutm_user_type === 'TEACHER'\n );\n this.teachers.set(teachers);\n this.total.set(teachers.length);\n } else {\n this.teachers.set([]);\n this.total.set(0);\n }\n this.loading.set(false);\n },\n error: (error) => {\n console.error('Error loading faculty:', error);\n this.notificationService.error('Failed to load faculty. 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.loadTeachers();\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.loadTeachers();\n }\n } else if (event.type === 'refresh') {\n this.loadTeachers();\n }\n }\n\n getActionDropdownItems(row: Teacher): 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: Teacher): void {\n switch (item.id) {\n case 'view':\n this.viewTeacher(row);\n break;\n case 'edit':\n this.editTeacher(row);\n break;\n case 'delete':\n this.deleteTeacher(row);\n break;\n }\n }\n\n createNewTeacher(): void {\n if (!this.rightsService.hasRight('CREATE')) {\n this.notificationService.error('You do not have permission to create faculty');\n return;\n }\n this.router.navigate(['/control-panel/teacher/create']);\n }\n\n viewTeacher(teacher: Teacher): void {\n if (!this.rightsService.hasRight('VIEW')) {\n this.notificationService.error('You do not have permission to view faculty');\n return;\n }\n const query = generateStringFromObject({ user_id: teacher._id });\n this.router.navigate(['/control-panel/teacher/view', query]);\n }\n\n editTeacher(teacher: Teacher): void {\n if (!this.rightsService.hasRight('EDIT')) {\n this.notificationService.error('You do not have permission to edit faculty');\n return;\n }\n const query = generateStringFromObject({ user_id: teacher._id });\n this.router.navigate(['/control-panel/teacher/edit', query]);\n }\n\n deleteTeacher(teacher: Teacher): void {\n if (!this.rightsService.hasRight('DELETE')) {\n this.notificationService.error('You do not have permission to delete faculty');\n return;\n }\n this.confirmationService.confirmDelete(teacher.user_fullname || 'Unknown')\n .then((confirmed) => {\n if (confirmed && teacher._id) {\n this.userMasterService.deleteUserMaster(teacher._id)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: () => {\n this.notificationService.success('Faculty deleted successfully');\n this.loadTeachers();\n },\n error: () => {\n this.notificationService.error('Failed to delete faculty');\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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"}
|