cyc-base 0.0.1

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/README.md ADDED
@@ -0,0 +1,24 @@
1
+ ## Building
2
+
3
+ To build the library, run:
4
+
5
+ ```bash
6
+ ng build cyc-base
7
+ ```
8
+
9
+ This command will compile your project, and the build artifacts will be placed in the `dist/` directory.
10
+
11
+ ### Publishing the Library
12
+
13
+ Once the project is built, you can publish your library by following these steps:
14
+
15
+ 1. Navigate to the `dist` directory:
16
+
17
+ ```bash
18
+ cd dist/cyc-base
19
+ ```
20
+
21
+ 2. Run the `npm publish` command to publish your library to the npm registry:
22
+ ```bash
23
+ npm publish
24
+ ```
@@ -0,0 +1,694 @@
1
+ import * as i0 from '@angular/core';
2
+ import { Component, Injectable } from '@angular/core';
3
+ import { getAuth, onAuthStateChanged } from 'firebase/auth';
4
+ import { getDatabase, ref, onValue, get, query, orderByChild, equalTo, push } from 'firebase/database';
5
+ import { BehaviorSubject, ReplaySubject, Observable } from 'rxjs';
6
+ import { PERMISSION, compareCG } from 'cyc-type-def';
7
+
8
+ class CycBase {
9
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: CycBase, deps: [], target: i0.ɵɵFactoryTarget.Component });
10
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.16", type: CycBase, isStandalone: true, selector: "lib-cyc-base", ngImport: i0, template: `
11
+ <p>
12
+ cyc-base works!
13
+ </p>
14
+ `, isInline: true, styles: [""] });
15
+ }
16
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: CycBase, decorators: [{
17
+ type: Component,
18
+ args: [{ selector: 'lib-cyc-base', imports: [], template: `
19
+ <p>
20
+ cyc-base works!
21
+ </p>
22
+ ` }]
23
+ }] });
24
+
25
+ class SharedDb {
26
+ _db;
27
+ firebaseAuth;
28
+ dataSubject = new BehaviorSubject({});
29
+ listeners = {};
30
+ isInitialized = false;
31
+ // Public observable for components to subscribe to
32
+ data$ = this.dataSubject.asObservable();
33
+ auth$ = new ReplaySubject(1);
34
+ constructor() {
35
+ this._db = getDatabase();
36
+ this.firebaseAuth = getAuth();
37
+ }
38
+ async initializeData() {
39
+ if (this.isInitialized) {
40
+ return;
41
+ }
42
+ this.isInitialized = true;
43
+ this.listenToCluster();
44
+ this.listenToSmallTeam();
45
+ this.listenToCG();
46
+ this.listenToUser();
47
+ }
48
+ listenToCluster() {
49
+ const dataRef = ref(this.db, 'move_follow_up_2023/clusters');
50
+ this.listeners['clusters'] = onValue(dataRef, (snapshot) => {
51
+ // console.log('listenToCluster');
52
+ const obj = snapshot.val();
53
+ this.updateData({ arrClusterForRef: obj });
54
+ });
55
+ }
56
+ listenToSmallTeam() {
57
+ const dataRef = ref(this.db, 'move_follow_up_2023/small_teams');
58
+ this.listeners['small_teams'] = onValue(dataRef, (snapshot) => {
59
+ // console.log('listenToSmallTeam');
60
+ const obj = snapshot.val();
61
+ this.updateData({ arrStForRef: obj });
62
+ });
63
+ }
64
+ listenToCG() {
65
+ const dataRef = ref(this.db, 'move_follow_up_2023/CGs');
66
+ this.listeners['CGs'] = onValue(dataRef, (snapshot) => {
67
+ // console.log('listenToCG');
68
+ const obj = snapshot.val();
69
+ this.updateData({ arrCgForRef: obj });
70
+ });
71
+ }
72
+ listenToUser() {
73
+ this.listeners['firebaseUser'] = onAuthStateChanged(this.firebaseAuth, (user) => {
74
+ console.log('auth change');
75
+ this.fetchUser(user);
76
+ });
77
+ }
78
+ fetchUser(user) {
79
+ if (!user) {
80
+ this.auth$.next(undefined);
81
+ return;
82
+ }
83
+ const dataRef = ref(this.db, 'move_follow_up_2023/users/' + user.uid);
84
+ onValue(dataRef, (snapshot) => {
85
+ console.log('userRef onValue');
86
+ if (snapshot.exists()) {
87
+ let _user = snapshot.val();
88
+ this.auth$.next({ user: _user, firebaseUser: user });
89
+ }
90
+ else {
91
+ this.auth$.next(undefined);
92
+ }
93
+ });
94
+ }
95
+ updateData(newData) {
96
+ const currentData = this.dataSubject.value;
97
+ const updatedData = { ...currentData, ...newData };
98
+ this.dataSubject.next(updatedData);
99
+ }
100
+ get auth() {
101
+ return new Observable((observer) => {
102
+ this.auth$.subscribe((data) => {
103
+ // console.log(data);
104
+ console.log('auth$');
105
+ if (!data) {
106
+ observer.next(undefined);
107
+ }
108
+ else {
109
+ observer.next({
110
+ firebaseUser: data.firebaseUser,
111
+ user: data.user,
112
+ });
113
+ }
114
+ });
115
+ });
116
+ }
117
+ get pastoralTeam() {
118
+ return new Observable((observer) => {
119
+ this.data$.subscribe((data) => {
120
+ // console.log(data);
121
+ observer.next({
122
+ arrClusterForRef: data.arrClusterForRef,
123
+ arrStForRef: data.arrStForRef,
124
+ arrCgForRef: data.arrCgForRef,
125
+ // firebaseUser: data.firebaseUser,
126
+ // user: data.user,
127
+ });
128
+ });
129
+ });
130
+ }
131
+ get cluster() {
132
+ return new Observable((observer) => {
133
+ this.data$.subscribe((data) => {
134
+ observer.next(data.arrClusterForRef || {});
135
+ });
136
+ });
137
+ }
138
+ get smallTeam() {
139
+ return new Observable((observer) => {
140
+ this.data$.subscribe((data) => {
141
+ observer.next(data.arrStForRef || {});
142
+ });
143
+ });
144
+ }
145
+ get CG() {
146
+ return new Observable((observer) => {
147
+ this.data$.subscribe((data) => {
148
+ observer.next(data.arrCgForRef || {});
149
+ });
150
+ });
151
+ }
152
+ get db() {
153
+ return this._db;
154
+ }
155
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: SharedDb, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
156
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: SharedDb, providedIn: 'root' });
157
+ }
158
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: SharedDb, decorators: [{
159
+ type: Injectable,
160
+ args: [{
161
+ providedIn: 'root',
162
+ }]
163
+ }], ctorParameters: () => [] });
164
+
165
+ // import { SettingDefaults, Settings } from '../constants/settings.constant';
166
+ // import { environment } from '../../environments/environment';
167
+ /**
168
+ * Holds only the common data stored in `SharedDbService`,
169
+ * - Pastoral team
170
+ * - User
171
+ *
172
+ * ---
173
+ * For other frequently used variables (not stored in `SharedDbService`), see `ExtendedCommonPage`.
174
+ *
175
+ * **Provides:**
176
+ * `Cluster`, `SmallTeam`, `CG`, `AppUser`, `User`
177
+ */
178
+ class CommonPage {
179
+ subscription;
180
+ subscriptionAuth;
181
+ user;
182
+ firebaseUser;
183
+ /** deleted record included */
184
+ arrClusterForRef;
185
+ /** deleted record included */
186
+ arrStForRef;
187
+ /** deleted record included */
188
+ arrCgForRef;
189
+ /** array of clusters, excluding deleted records */
190
+ arrCluster;
191
+ /** array of small teams, excluding deleted records */
192
+ arrSt;
193
+ /** array of CGs, excluding deleted records */
194
+ arrCg;
195
+ constructor() {
196
+ this.arrClusterForRef = {};
197
+ this.arrStForRef = {};
198
+ this.arrCgForRef = {};
199
+ this.arrCluster = [];
200
+ this.arrSt = [];
201
+ this.arrCg = [];
202
+ }
203
+ /**
204
+ * subscribe to clusters, small teams, CGs observable
205
+ * @param observerble
206
+ */
207
+ subscribeObserverble(observerble) {
208
+ this.subscription = observerble.subscribe((snapshot) => {
209
+ this.arrClusterForRef = snapshot.arrClusterForRef || {};
210
+ this.arrCluster = Object.values(this.arrClusterForRef).filter((x) => !x.deleted);
211
+ this.arrStForRef = snapshot.arrStForRef || {};
212
+ this.arrSt = Object.values(this.arrStForRef).filter((x) => !x.deleted);
213
+ this.arrCgForRef = snapshot.arrCgForRef || {};
214
+ this.arrCg = Object.values(this.arrCgForRef).filter((x) => !x.deleted);
215
+ // this.firebaseUser = snapshot.firebaseUser || null;
216
+ // if (snapshot.user) this.user = snapshot.user;
217
+ // this.checkAccessAndLoadData();
218
+ });
219
+ }
220
+ subscribeAuthObserverble(observerble) {
221
+ this.subscriptionAuth = observerble.subscribe((v) => {
222
+ // console.log(v);
223
+ // console.log('subscriptionAuth');
224
+ if (v) {
225
+ this.firebaseUser = v.firebaseUser;
226
+ this.user = v.user;
227
+ // if (!environment.production) {
228
+ // console.log(this.user.id);
229
+ // }
230
+ // init setting if not exist
231
+ this.initSettings(this.user);
232
+ }
233
+ else {
234
+ }
235
+ this.checkAccessAndLoadData();
236
+ });
237
+ }
238
+ /**
239
+ * unsubscribe all observables
240
+ */
241
+ unSubscribeObserverble() {
242
+ this.subscription?.unsubscribe();
243
+ this.subscriptionAuth?.unsubscribe();
244
+ }
245
+ /** get array of clusters, including deleted records */
246
+ get arrClusterWithDel() {
247
+ return Object.values(this.arrClusterForRef);
248
+ }
249
+ /** get array of small team, including deleted records */
250
+ get arrStWithDel() {
251
+ return Object.values(this.arrStForRef);
252
+ }
253
+ /** get array of CGs, including deleted records */
254
+ get arrCgWithDel() {
255
+ return Object.values(this.arrCgForRef);
256
+ }
257
+ /**
258
+ * Returns small teams under a specified cluster.
259
+ *
260
+ * Optionally filters based on user access permissions.
261
+ *
262
+ * By default, not including deleted small teams.
263
+ *
264
+ * @param idCluster - The cluster ID to filter small teams by.
265
+ * @param byUserAccess - If true, applies user permission-based filtering. Defaults to false.
266
+ * @returns An array of filtered small teams.
267
+ */
268
+ filteredSmallTeam(idCluster, byUserAccess = false) {
269
+ if (!byUserAccess) {
270
+ return this.arrSt.filter((x) => x.cluster == idCluster);
271
+ }
272
+ else {
273
+ if (this.user.permissions) {
274
+ if (this.user.permissions.includes(PERMISSION.SUPER_USER) ||
275
+ this.user.permissions.includes(PERMISSION.PASTORAL_ADMIN)) {
276
+ return this.arrSt.filter((x) => x.cluster == idCluster);
277
+ }
278
+ else if (this.user.permissions.includes(PERMISSION.TL) ||
279
+ this.user.permissions.includes(PERMISSION.SCGL) ||
280
+ this.user.permissions.includes(PERMISSION.CGL)) {
281
+ return (this.arrSt = this.arrSt.filter((x) => x.id == this.user.pastoral_team?.st));
282
+ }
283
+ }
284
+ return [];
285
+ }
286
+ }
287
+ filteredSmallTeamWithDel(idCluster) {
288
+ return this.arrStWithDel.filter((x) => x.cluster == idCluster);
289
+ }
290
+ /**
291
+ * by default, not including deleted CG
292
+ * @param idCluster
293
+ * @returns array of CG under selected cluster and small team
294
+ */
295
+ filteredCg(idSt) {
296
+ return this.arrCg.filter((x) => x.st == idSt).sort(compareCG);
297
+ }
298
+ filteredCgWithDel(idSt) {
299
+ return this.arrCgWithDel.filter((x) => x.st == idSt);
300
+ }
301
+ /**
302
+ * Returns the list of clusters accessible to the current user based on their permissions.
303
+ *
304
+ * @returns {Cluster[]} Filtered cluster list according to user role.
305
+ */
306
+ get arrClusterByUserAccess() {
307
+ if (this.user.permissions) {
308
+ if (this.user.permissions.includes(PERMISSION.SUPER_USER) ||
309
+ this.user.permissions.includes(PERMISSION.PASTORAL_ADMIN)) {
310
+ return this.arrCluster;
311
+ }
312
+ else if (this.user.permissions.includes(PERMISSION.TL) ||
313
+ this.user.permissions.includes(PERMISSION.SCGL) ||
314
+ this.user.permissions.includes(PERMISSION.CGL)) {
315
+ return this.arrCluster.filter((x) => x.id == this.user.pastoral_team?.cluster);
316
+ }
317
+ }
318
+ return [];
319
+ }
320
+ /**
321
+ * init setting if not exist
322
+ * @param user
323
+ */
324
+ initSettings(user) { }
325
+ // initSettings(user: AppUser) {
326
+ // if (!user.settings) user.settings = {};
327
+ // for (let s of Object.values(Settings)) {
328
+ // if (user.settings?.[s] === undefined) {
329
+ // user.settings[s] = SettingDefaults[s];
330
+ // }
331
+ // }
332
+ // }
333
+ checkAccessAndLoadData() { }
334
+ }
335
+
336
+ /**
337
+ * Holds additional frequently used variables **not** stored in `SharedDbService`,
338
+ * such as:
339
+ * - `Sheep`
340
+ * - `Title`
341
+ *
342
+ * ---
343
+ * **For data stored in `SharedDbService`**
344
+ * (pastoral team and user), see `CommonPage`.
345
+ *
346
+ * ---
347
+ * @extends ExtendedCommonPage
348
+ */
349
+ class ExtendedCommonPage extends CommonPage {
350
+ // title
351
+ arrTitleForRef = {};
352
+ arrTitle = [];
353
+ // sheep
354
+ arrSheepForRef = {};
355
+ arrSheep = [];
356
+ // user
357
+ arrUserForRef = {};
358
+ arrUser = [];
359
+ // attendance
360
+ arrAttendance = [];
361
+ // msj
362
+ arrMsjClassTypeForRef = {};
363
+ arrMsjClassBatchForRef = {};
364
+ arrMsjClassTimeForRef = {};
365
+ arrMsjStudBatch = [];
366
+ // selection
367
+ cluster;
368
+ st;
369
+ cg;
370
+ sheep;
371
+ title;
372
+ msjClassType;
373
+ msjClassBatch;
374
+ msjClassTime;
375
+ loading = false;
376
+ constructor() {
377
+ super();
378
+ }
379
+ get arrTitleReserve() {
380
+ return this.arrTitle.slice().reverse();
381
+ }
382
+ get arrMsjClassType() {
383
+ return Object.values(this.arrMsjClassTypeForRef).filter((x) => !x.deleted);
384
+ }
385
+ get arrMsjClassBatch() {
386
+ return Object.values(this.arrMsjClassBatchForRef).filter((x) => !x.deleted);
387
+ }
388
+ get arrMsjClassTime() {
389
+ return Object.values(this.arrMsjClassTimeForRef).filter((x) => !x.deleted);
390
+ }
391
+ filteredMsjClassBatch(idMsjClassType) {
392
+ return this.arrMsjClassBatch
393
+ .filter((x) => x.idMsjClassType == idMsjClassType)
394
+ .sort((b, a) => {
395
+ a.dt = new Date(new Date(a.yearTimestamp).getFullYear(), new Date(a.monthTimestamp).getMonth());
396
+ b.dt = new Date(new Date(b.yearTimestamp).getFullYear(), new Date(b.monthTimestamp).getMonth());
397
+ if (a.dt.getFullYear() == b.dt.getFullYear()) {
398
+ return a.dt.getMonth() - b.dt.getMonth();
399
+ }
400
+ else {
401
+ return a.dt.getFullYear() - b.dt.getFullYear();
402
+ }
403
+ });
404
+ }
405
+ filteredMsjClassTime(idMsjClassBatch) {
406
+ return this.arrMsjClassTime.filter((x) => x.idMsjClassBatch == idMsjClassBatch);
407
+ }
408
+ get isSuperUser() {
409
+ if (this.user && this.user.permissions) {
410
+ return this.user.permissions.includes(PERMISSION.SUPER_USER);
411
+ }
412
+ else {
413
+ return false;
414
+ }
415
+ }
416
+ get isPastoralAdmin() {
417
+ if (this.user && this.user.permissions) {
418
+ return this.user.permissions.includes(PERMISSION.PASTORAL_ADMIN);
419
+ }
420
+ else {
421
+ return false;
422
+ }
423
+ }
424
+ }
425
+
426
+ /**
427
+ * @extends CommonPage
428
+ * @extends ExtendedCommonPage
429
+ */
430
+ class FirebasePage extends ExtendedCommonPage {
431
+ db;
432
+ auth;
433
+ constructor() {
434
+ super();
435
+ this.auth = getAuth();
436
+ this.db = getDatabase();
437
+ }
438
+ }
439
+
440
+ /**
441
+ * using observable to read user
442
+ * replace BasePage
443
+ *
444
+ * ---
445
+ * @extends CommonPage
446
+ * @extends ExtendedCommonPage
447
+ * @extends FirebasePage
448
+ */
449
+ class SecurePage extends FirebasePage {
450
+ isSecure;
451
+ router;
452
+ constructor(router, isSecure) {
453
+ super();
454
+ this.isSecure = isSecure;
455
+ this.router = router;
456
+ }
457
+ checkAccessAndLoadData() {
458
+ if (this.firebaseUser) {
459
+ if (this.user) {
460
+ if (this.user.permission == PERMISSION.NOT_VERIFIED && this.isSecure) {
461
+ // not verified user
462
+ // redirect to home page
463
+ this.navigateHome();
464
+ }
465
+ // if (this.user.permissions) {
466
+ // this.isSuperUser = this.user.permissions.includes(
467
+ // PERMISSION.SUPER_USER
468
+ // );
469
+ // }
470
+ this.checkPermission(this.user);
471
+ this.readData();
472
+ }
473
+ else {
474
+ // user logged in but no data
475
+ // redirect to home page (how he came to here?)
476
+ if (this.isSecure)
477
+ this.navigateHome();
478
+ // this.readData(); // navigated home, no need read data
479
+ }
480
+ }
481
+ else {
482
+ // user not logged in
483
+ // redirect to home page
484
+ if (this.isSecure)
485
+ this.navigateHome();
486
+ // this.readData(); // navigated home, no need read data
487
+ }
488
+ }
489
+ navigateHome() {
490
+ this.router.navigate(['']);
491
+ }
492
+ loadTitle() {
493
+ const titleRef = ref(this.db, 'move_follow_up_2023/attendance/titles');
494
+ onValue(titleRef, (v) => {
495
+ if (v.exists()) {
496
+ this.arrTitle = Object.values(v.val());
497
+ this.arrTitleForRef = v.val();
498
+ }
499
+ });
500
+ }
501
+ loadSheep() {
502
+ const sheepRef = ref(this.db, 'move_follow_up_2023/sheeps');
503
+ onValue(sheepRef, (v) => {
504
+ if (v.exists()) {
505
+ this.arrSheep = Object.values(v.val());
506
+ this.arrSheepForRef = v.val();
507
+ }
508
+ });
509
+ }
510
+ loadAttendance() { }
511
+ loadUsers() { }
512
+ loadUsersAsync() {
513
+ const userRef = ref(this.db, 'move_follow_up_2023/users');
514
+ return get(userRef);
515
+ }
516
+ handleTitleSelected() { }
517
+ handleClusterSelected() { }
518
+ handleSmallTeamSelected() { }
519
+ handleCGSelected() { }
520
+ loadMsjClassType() {
521
+ const msjClassTypeRef = ref(this.db, 'move_follow_up_2023/msj/msj_class_type');
522
+ return get(msjClassTypeRef);
523
+ }
524
+ loadMsjClassBatch() {
525
+ const msjClassBatchRef = ref(this.db, 'move_follow_up_2023/msj/msj_class_batch');
526
+ return get(msjClassBatchRef);
527
+ }
528
+ loadMsjClassTime(msjClassBatch) {
529
+ const msjClassTimeRef = ref(this.db, 'move_follow_up_2023/msj/msj_class_time');
530
+ let q = query(msjClassTimeRef);
531
+ if (msjClassBatch)
532
+ q = query(msjClassTimeRef, orderByChild('idMsjClassBatch'), equalTo(msjClassBatch.id));
533
+ return get(q);
534
+ }
535
+ recordClick(action) {
536
+ const testAccId = '5FUtbbtMe4RNPys6QSUzri5UXFN2';
537
+ const testAcc2Id = 'q1GEMXkzbWOOEg2wreNuPsTgCw52';
538
+ const testAcc3Id = 'XZUlKaa5aUhwJ2KlEa5oJfImwZA3';
539
+ const testAcc4Id = '9O3bSHbL2pfWBC9BOJiwMbkHQdr2';
540
+ const developerAccId = 'ZqdQyuc1uuTbAfmhkjw5HgLFnc82';
541
+ let userId = this.user?.id;
542
+ if (userId == testAccId ||
543
+ userId == testAcc2Id ||
544
+ userId == testAcc3Id ||
545
+ userId == testAcc4Id ||
546
+ userId == developerAccId) {
547
+ return;
548
+ }
549
+ const obj = { action, timeStamp: new Date().getTime() };
550
+ if (userId) {
551
+ obj['userId'] = userId;
552
+ }
553
+ push(ref(this.db, 'move_follow_up_2023/attendance/clicks'), obj);
554
+ }
555
+ // FUNCTIONS INTERFACE
556
+ /**
557
+ * Execute after reading user data from database
558
+ *
559
+ * @Override
560
+ *
561
+ * @example
562
+ this.firebaseUser = user;
563
+ if (user) {
564
+ const userRef = ref(this.db, 'move_follow_up_2023/users/' + user.uid);
565
+ onValue(userRef, (v) => {
566
+ if (v.exists()) {
567
+ this.user = v.val();
568
+
569
+ if (this.user.permission == PERMISSION.NOT_VERIFIED) {
570
+ // not verified user
571
+ // redirect to home page
572
+ router.navigate(['']);
573
+ // this.router.navigate(['']);
574
+ }
575
+
576
+ this.checkPermission(this.user);
577
+ this.loadDataClone();
578
+ }
579
+ })
580
+ }
581
+
582
+ *
583
+ * @param user
584
+ */
585
+ checkPermission(user) {
586
+ // console.log('checkPermission');
587
+ }
588
+ /**
589
+ * Execute after reading user data from database
590
+ *
591
+ * @Override
592
+ *
593
+ * @example
594
+ this.firebaseUser = user;
595
+ if (user) {
596
+ const userRef = ref(this.db, 'move_follow_up_2023/users/' + user.uid);
597
+ onValue(userRef, (v) => {
598
+ if (v.exists()) {
599
+ this.user = v.val();
600
+
601
+ if (this.user.permission == PERMISSION.NOT_VERIFIED) {
602
+ // not verified user
603
+ // redirect to home page
604
+ router.navigate(['']);
605
+ // this.router.navigate(['']);
606
+ }
607
+
608
+ this.checkPermission(this.user);
609
+ this.loadDataClone();
610
+ }
611
+ })
612
+ }
613
+ */
614
+ readData() { }
615
+ }
616
+
617
+ class BasePage extends SecurePage {
618
+ t1;
619
+ t2;
620
+ constructor(router, isSecure) {
621
+ super(router, isSecure);
622
+ this.isSecure = isSecure;
623
+ this.router = router;
624
+ this.load();
625
+ }
626
+ load() {
627
+ onAuthStateChanged(this.auth, (user) => {
628
+ this.readUser(user);
629
+ // this.loadUser(user);
630
+ });
631
+ }
632
+ readUser(user) {
633
+ this.firebaseUser = user;
634
+ if (user) {
635
+ // console.log(user.email);
636
+ const userRef = ref(this.db, 'move_follow_up_2023/users/' + user.uid);
637
+ onValue(userRef, (v) => {
638
+ if (v.exists()) {
639
+ this.user = v.val();
640
+ // console.log(this.user.name);
641
+ if (this.user.permission == PERMISSION.NOT_VERIFIED &&
642
+ this.isSecure) {
643
+ // not verified user
644
+ // redirect to home page
645
+ this.router.navigate(['']);
646
+ // this.router.navigate(['']);
647
+ }
648
+ // if (this.user.permissions) {
649
+ // this.isSuperUser = this.user.permissions.includes(
650
+ // PERMISSION.SUPER_USER
651
+ // );
652
+ // }
653
+ this.checkPermission(this.user);
654
+ this.readData();
655
+ this.initSettings(this.user);
656
+ }
657
+ else {
658
+ // user logged in but no data
659
+ // redirect to home page (how he came to here?)
660
+ if (this.isSecure)
661
+ this.router.navigate(['']);
662
+ // this.router.navigate(['']);
663
+ this.readData();
664
+ }
665
+ });
666
+ }
667
+ else {
668
+ // user not logged in
669
+ // redirect to home page
670
+ if (this.isSecure)
671
+ this.router.navigate(['']);
672
+ // this.router.navigate(['']);
673
+ this.readData();
674
+ }
675
+ }
676
+ timerStart() {
677
+ this.t1 = new Date();
678
+ }
679
+ timerEnd() {
680
+ this.t2 = new Date();
681
+ console.log(this.t2.getTime() - this.t1.getTime());
682
+ }
683
+ }
684
+
685
+ /*
686
+ * Public API Surface of cyc-base
687
+ */
688
+
689
+ /**
690
+ * Generated bundle index. Do not edit.
691
+ */
692
+
693
+ export { BasePage, CommonPage, CycBase, ExtendedCommonPage, FirebasePage, SecurePage, SharedDb };
694
+ //# sourceMappingURL=cyc-base.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cyc-base.mjs","sources":["../../../projects/cyc-base/src/lib/cyc-base.ts","../../../projects/cyc-base/src/lib/shared-db.ts","../../../projects/cyc-base/src/classes/CommonPage.ts","../../../projects/cyc-base/src/classes/ExtendedCommonPage.ts","../../../projects/cyc-base/src/classes/FirebasePage.ts","../../../projects/cyc-base/src/classes/SecurePage.ts","../../../projects/cyc-base/src/classes/BasePage.ts","../../../projects/cyc-base/src/public-api.ts","../../../projects/cyc-base/src/cyc-base.ts"],"sourcesContent":["import { Component } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'lib-cyc-base',\r\n imports: [],\r\n template: `\r\n <p>\r\n cyc-base works!\r\n </p>\r\n `,\r\n styles: ``,\r\n})\r\nexport class CycBase {\r\n\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { AppUser, CG, Cluster, SmallTeam } from 'cyc-type-def';\r\nimport { Auth, getAuth, onAuthStateChanged, User } from 'firebase/auth';\r\nimport { Database, getDatabase, onValue, ref } from 'firebase/database';\r\nimport { BehaviorSubject, Observable, ReplaySubject } from 'rxjs';\r\n\r\nexport interface AppData {\r\n arrCluster?: Cluster[];\r\n arrClusterForRef?: { [key: string]: Cluster };\r\n\r\n arrSt?: SmallTeam[];\r\n arrStForRef?: { [key: string]: SmallTeam };\r\n\r\n arrCg?: CG[];\r\n arrCgForRef?: { [key: string]: CG };\r\n\r\n firebaseUser?: User | null;\r\n user?: AppUser;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class SharedDb {\r\n private _db: Database;\r\n private firebaseAuth: Auth;\r\n\r\n private dataSubject = new BehaviorSubject<AppData>({});\r\n private listeners: { [key: string]: any } = {};\r\n private isInitialized = false;\r\n\r\n // Public observable for components to subscribe to\r\n public data$ = this.dataSubject.asObservable();\r\n\r\n public auth$ = new ReplaySubject<{ user: AppUser; firebaseUser: User } | undefined>(1);\r\n\r\n constructor() {\r\n this._db = getDatabase();\r\n this.firebaseAuth = getAuth();\r\n }\r\n\r\n async initializeData(): Promise<void> {\r\n if (this.isInitialized) {\r\n return;\r\n }\r\n\r\n this.isInitialized = true;\r\n\r\n this.listenToCluster();\r\n this.listenToSmallTeam();\r\n this.listenToCG();\r\n this.listenToUser();\r\n }\r\n\r\n private listenToCluster(): void {\r\n const dataRef = ref(this.db, 'move_follow_up_2023/clusters');\r\n\r\n this.listeners['clusters'] = onValue(dataRef, (snapshot) => {\r\n // console.log('listenToCluster');\r\n\r\n const obj: { [key: string]: Cluster } = snapshot.val();\r\n this.updateData({ arrClusterForRef: obj });\r\n });\r\n }\r\n\r\n private listenToSmallTeam(): void {\r\n const dataRef = ref(this.db, 'move_follow_up_2023/small_teams');\r\n\r\n this.listeners['small_teams'] = onValue(dataRef, (snapshot) => {\r\n // console.log('listenToSmallTeam');\r\n\r\n const obj: { [key: string]: SmallTeam } = snapshot.val();\r\n this.updateData({ arrStForRef: obj });\r\n });\r\n }\r\n\r\n private listenToCG(): void {\r\n const dataRef = ref(this.db, 'move_follow_up_2023/CGs');\r\n\r\n this.listeners['CGs'] = onValue(dataRef, (snapshot) => {\r\n // console.log('listenToCG');\r\n\r\n const obj: { [key: string]: CG } = snapshot.val();\r\n this.updateData({ arrCgForRef: obj });\r\n });\r\n }\r\n\r\n private listenToUser(): void {\r\n this.listeners['firebaseUser'] = onAuthStateChanged(this.firebaseAuth, (user) => {\r\n console.log('auth change');\r\n\r\n this.fetchUser(user);\r\n });\r\n }\r\n\r\n private fetchUser(user: User | null) {\r\n if (!user) {\r\n this.auth$.next(undefined);\r\n return;\r\n }\r\n\r\n const dataRef = ref(this.db, 'move_follow_up_2023/users/' + user.uid);\r\n onValue(dataRef, (snapshot) => {\r\n console.log('userRef onValue');\r\n\r\n if (snapshot.exists()) {\r\n let _user: AppUser = snapshot.val();\r\n this.auth$.next({ user: _user, firebaseUser: user });\r\n } else {\r\n this.auth$.next(undefined);\r\n }\r\n });\r\n }\r\n\r\n private updateData(newData: Partial<AppData>): void {\r\n const currentData = this.dataSubject.value;\r\n const updatedData = { ...currentData, ...newData };\r\n this.dataSubject.next(updatedData);\r\n }\r\n\r\n get auth(): Observable<{ user: AppUser; firebaseUser: User } | undefined> {\r\n return new Observable((observer) => {\r\n this.auth$.subscribe((data) => {\r\n // console.log(data);\r\n console.log('auth$');\r\n\r\n if (!data) {\r\n observer.next(undefined);\r\n } else {\r\n observer.next({\r\n firebaseUser: data.firebaseUser,\r\n user: data.user,\r\n });\r\n }\r\n });\r\n });\r\n }\r\n\r\n get pastoralTeam(): Observable<AppData> {\r\n return new Observable((observer) => {\r\n this.data$.subscribe((data) => {\r\n // console.log(data);\r\n\r\n observer.next({\r\n arrClusterForRef: data.arrClusterForRef,\r\n arrStForRef: data.arrStForRef,\r\n arrCgForRef: data.arrCgForRef,\r\n // firebaseUser: data.firebaseUser,\r\n // user: data.user,\r\n });\r\n });\r\n });\r\n }\r\n\r\n get cluster(): Observable<{ [key: string]: Cluster }> {\r\n return new Observable((observer) => {\r\n this.data$.subscribe((data) => {\r\n observer.next(data.arrClusterForRef || {});\r\n });\r\n });\r\n }\r\n\r\n get smallTeam(): Observable<{ [key: string]: SmallTeam }> {\r\n return new Observable((observer) => {\r\n this.data$.subscribe((data) => {\r\n observer.next(data.arrStForRef || {});\r\n });\r\n });\r\n }\r\n\r\n get CG(): Observable<{ [key: string]: CG }> {\r\n return new Observable((observer) => {\r\n this.data$.subscribe((data) => {\r\n observer.next(data.arrCgForRef || {});\r\n });\r\n });\r\n }\r\n\r\n get db() {\r\n return this._db;\r\n }\r\n}\r\n","import { Cluster, SmallTeam, CG, AppUser, PERMISSION, compareCG } from 'cyc-type-def';\r\nimport { Observable, Subscription } from 'rxjs';\r\n// import { AppData } from '../../app/services/shared-db.service';\r\n// import { compareCG } from '../util/sort.util';\r\nimport { User } from 'firebase/auth';\r\nimport { AppData } from '../lib/shared-db';\r\n// import { SettingDefaults, Settings } from '../constants/settings.constant';\r\n// import { environment } from '../../environments/environment';\r\n\r\n/**\r\n * Holds only the common data stored in `SharedDbService`,\r\n * - Pastoral team\r\n * - User\r\n *\r\n * ---\r\n * For other frequently used variables (not stored in `SharedDbService`), see `ExtendedCommonPage`.\r\n *\r\n * **Provides:**\r\n * `Cluster`, `SmallTeam`, `CG`, `AppUser`, `User`\r\n */\r\nexport class CommonPage {\r\n protected subscription?: Subscription;\r\n protected subscriptionAuth?: Subscription;\r\n\r\n user!: AppUser;\r\n firebaseUser!: User | null;\r\n\r\n /** deleted record included */\r\n arrClusterForRef: { [key: string]: Cluster };\r\n /** deleted record included */\r\n arrStForRef: { [key: string]: SmallTeam };\r\n /** deleted record included */\r\n arrCgForRef: { [key: string]: CG };\r\n\r\n /** array of clusters, excluding deleted records */\r\n arrCluster: Cluster[];\r\n /** array of small teams, excluding deleted records */\r\n arrSt: SmallTeam[];\r\n /** array of CGs, excluding deleted records */\r\n arrCg: CG[];\r\n\r\n constructor() {\r\n this.arrClusterForRef = {};\r\n this.arrStForRef = {};\r\n this.arrCgForRef = {};\r\n\r\n this.arrCluster = [];\r\n this.arrSt = [];\r\n this.arrCg = [];\r\n }\r\n\r\n /**\r\n * subscribe to clusters, small teams, CGs observable\r\n * @param observerble\r\n */\r\n subscribeObserverble(observerble: Observable<AppData>) {\r\n this.subscription = observerble.subscribe((snapshot) => {\r\n this.arrClusterForRef = snapshot.arrClusterForRef || {};\r\n this.arrCluster = Object.values(this.arrClusterForRef).filter((x) => !x.deleted);\r\n\r\n this.arrStForRef = snapshot.arrStForRef || {};\r\n this.arrSt = Object.values(this.arrStForRef).filter((x) => !x.deleted);\r\n\r\n this.arrCgForRef = snapshot.arrCgForRef || {};\r\n this.arrCg = Object.values(this.arrCgForRef).filter((x) => !x.deleted);\r\n\r\n // this.firebaseUser = snapshot.firebaseUser || null;\r\n // if (snapshot.user) this.user = snapshot.user;\r\n\r\n // this.checkAccessAndLoadData();\r\n });\r\n }\r\n\r\n subscribeAuthObserverble(\r\n observerble: Observable<{ user: AppUser; firebaseUser: User } | undefined>\r\n ) {\r\n this.subscriptionAuth = observerble.subscribe((v) => {\r\n // console.log(v);\r\n // console.log('subscriptionAuth');\r\n\r\n if (v) {\r\n this.firebaseUser = v.firebaseUser;\r\n this.user = v.user;\r\n\r\n // if (!environment.production) {\r\n // console.log(this.user.id);\r\n // }\r\n\r\n // init setting if not exist\r\n this.initSettings(this.user);\r\n } else {\r\n }\r\n\r\n this.checkAccessAndLoadData();\r\n });\r\n }\r\n\r\n /**\r\n * unsubscribe all observables\r\n */\r\n unSubscribeObserverble(): void {\r\n this.subscription?.unsubscribe();\r\n this.subscriptionAuth?.unsubscribe();\r\n }\r\n\r\n /** get array of clusters, including deleted records */\r\n get arrClusterWithDel() {\r\n return Object.values(this.arrClusterForRef);\r\n }\r\n\r\n /** get array of small team, including deleted records */\r\n get arrStWithDel() {\r\n return Object.values(this.arrStForRef);\r\n }\r\n\r\n /** get array of CGs, including deleted records */\r\n get arrCgWithDel() {\r\n return Object.values(this.arrCgForRef);\r\n }\r\n\r\n /**\r\n * Returns small teams under a specified cluster.\r\n *\r\n * Optionally filters based on user access permissions.\r\n *\r\n * By default, not including deleted small teams.\r\n *\r\n * @param idCluster - The cluster ID to filter small teams by.\r\n * @param byUserAccess - If true, applies user permission-based filtering. Defaults to false.\r\n * @returns An array of filtered small teams.\r\n */\r\n filteredSmallTeam(idCluster: string | undefined, byUserAccess: boolean = false) {\r\n if (!byUserAccess) {\r\n return this.arrSt.filter((x) => x.cluster == idCluster);\r\n } else {\r\n if (this.user.permissions) {\r\n if (\r\n this.user.permissions.includes(PERMISSION.SUPER_USER) ||\r\n this.user.permissions.includes(PERMISSION.PASTORAL_ADMIN)\r\n ) {\r\n return this.arrSt.filter((x) => x.cluster == idCluster);\r\n } else if (\r\n this.user.permissions.includes(PERMISSION.TL) ||\r\n this.user.permissions.includes(PERMISSION.SCGL) ||\r\n this.user.permissions.includes(PERMISSION.CGL)\r\n ) {\r\n return (this.arrSt = this.arrSt.filter((x) => x.id == this.user.pastoral_team?.st));\r\n }\r\n }\r\n\r\n return [];\r\n }\r\n }\r\n\r\n filteredSmallTeamWithDel(idCluster: string) {\r\n return this.arrStWithDel.filter((x) => x.cluster == idCluster);\r\n }\r\n\r\n /**\r\n * by default, not including deleted CG\r\n * @param idCluster\r\n * @returns array of CG under selected cluster and small team\r\n */\r\n filteredCg(idSt: string | undefined) {\r\n return this.arrCg.filter((x) => x.st == idSt).sort(compareCG);\r\n }\r\n\r\n filteredCgWithDel(idSt: string) {\r\n return this.arrCgWithDel.filter((x) => x.st == idSt);\r\n }\r\n\r\n /**\r\n * Returns the list of clusters accessible to the current user based on their permissions.\r\n *\r\n * @returns {Cluster[]} Filtered cluster list according to user role.\r\n */\r\n get arrClusterByUserAccess() {\r\n if (this.user.permissions) {\r\n if (\r\n this.user.permissions.includes(PERMISSION.SUPER_USER) ||\r\n this.user.permissions.includes(PERMISSION.PASTORAL_ADMIN)\r\n ) {\r\n return this.arrCluster;\r\n } else if (\r\n this.user.permissions.includes(PERMISSION.TL) ||\r\n this.user.permissions.includes(PERMISSION.SCGL) ||\r\n this.user.permissions.includes(PERMISSION.CGL)\r\n ) {\r\n return this.arrCluster.filter((x) => x.id == this.user.pastoral_team?.cluster);\r\n }\r\n }\r\n\r\n return [];\r\n }\r\n\r\n /**\r\n * init setting if not exist\r\n * @param user\r\n */\r\n initSettings(user: AppUser) {}\r\n // initSettings(user: AppUser) {\r\n // if (!user.settings) user.settings = {};\r\n // for (let s of Object.values(Settings)) {\r\n // if (user.settings?.[s] === undefined) {\r\n // user.settings[s] = SettingDefaults[s];\r\n // }\r\n // }\r\n // }\r\n\r\n checkAccessAndLoadData() {}\r\n}\r\n","import {\r\n AppUser,\r\n Attendance,\r\n CG,\r\n Cluster,\r\n MsjClassBatch,\r\n MsjClassTime,\r\n MsjClassType,\r\n MsjStudBatch,\r\n PERMISSION,\r\n Sheep,\r\n SmallTeam,\r\n Title,\r\n} from 'cyc-type-def';\r\nimport { CommonPage } from './CommonPage';\r\n\r\n/**\r\n * Holds additional frequently used variables **not** stored in `SharedDbService`,\r\n * such as:\r\n * - `Sheep`\r\n * - `Title`\r\n *\r\n * ---\r\n * **For data stored in `SharedDbService`**\r\n * (pastoral team and user), see `CommonPage`.\r\n *\r\n * ---\r\n * @extends ExtendedCommonPage\r\n */\r\nexport class ExtendedCommonPage extends CommonPage {\r\n // title\r\n arrTitleForRef: { [key: string]: Title } = {};\r\n arrTitle: Title[] = [];\r\n\r\n // sheep\r\n arrSheepForRef: { [key: string]: Sheep } = {};\r\n arrSheep: Sheep[] = [];\r\n\r\n // user\r\n arrUserForRef: { [key: string]: AppUser } = {};\r\n arrUser: AppUser[] = [];\r\n\r\n // attendance\r\n arrAttendance: Attendance[] = [];\r\n\r\n // msj\r\n arrMsjClassTypeForRef: { [key: string]: MsjClassType } = {};\r\n arrMsjClassBatchForRef: { [key: string]: MsjClassBatch } = {};\r\n arrMsjClassTimeForRef: { [key: string]: MsjClassTime } = {};\r\n arrMsjStudBatch: MsjStudBatch[] = [];\r\n\r\n // selection\r\n cluster: Cluster | undefined;\r\n st: SmallTeam | undefined;\r\n cg: CG | undefined;\r\n sheep: Sheep | undefined;\r\n title: Title | undefined;\r\n msjClassType: MsjClassType | undefined;\r\n msjClassBatch: MsjClassBatch | undefined;\r\n msjClassTime: MsjClassTime | undefined;\r\n\r\n loading = false;\r\n\r\n constructor() {\r\n super();\r\n }\r\n\r\n get arrTitleReserve() {\r\n return this.arrTitle.slice().reverse();\r\n }\r\n\r\n get arrMsjClassType() {\r\n return Object.values(this.arrMsjClassTypeForRef).filter((x) => !x.deleted);\r\n }\r\n\r\n get arrMsjClassBatch() {\r\n return Object.values(this.arrMsjClassBatchForRef).filter((x) => !x.deleted);\r\n }\r\n\r\n get arrMsjClassTime() {\r\n return Object.values(this.arrMsjClassTimeForRef).filter((x) => !x.deleted);\r\n }\r\n\r\n filteredMsjClassBatch(idMsjClassType: string) {\r\n return this.arrMsjClassBatch\r\n .filter((x) => x.idMsjClassType == idMsjClassType)\r\n .sort((b: MsjClassBatch, a: MsjClassBatch) => {\r\n a.dt = new Date(\r\n new Date(a.yearTimestamp).getFullYear(),\r\n new Date(a.monthTimestamp).getMonth()\r\n );\r\n b.dt = new Date(\r\n new Date(b.yearTimestamp).getFullYear(),\r\n new Date(b.monthTimestamp).getMonth()\r\n );\r\n if (a.dt.getFullYear() == b.dt.getFullYear()) {\r\n return a.dt.getMonth() - b.dt.getMonth();\r\n } else {\r\n return a.dt.getFullYear() - b.dt.getFullYear();\r\n }\r\n });\r\n }\r\n\r\n filteredMsjClassTime(idMsjClassBatch: string) {\r\n return this.arrMsjClassTime.filter(\r\n (x) => x.idMsjClassBatch == idMsjClassBatch\r\n );\r\n }\r\n\r\n get isSuperUser() {\r\n if (this.user && this.user.permissions) {\r\n return this.user.permissions.includes(PERMISSION.SUPER_USER);\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n get isPastoralAdmin() {\r\n if (this.user && this.user.permissions) {\r\n return this.user.permissions.includes(PERMISSION.PASTORAL_ADMIN);\r\n } else {\r\n return false;\r\n }\r\n }\r\n}\r\n","import { Auth, getAuth } from 'firebase/auth';\r\nimport { Database, getDatabase } from 'firebase/database';\r\nimport { ExtendedCommonPage } from './ExtendedCommonPage';\r\n\r\n/**\r\n * @extends CommonPage\r\n * @extends ExtendedCommonPage\r\n */\r\nexport class FirebasePage extends ExtendedCommonPage {\r\n db!: Database;\r\n auth!: Auth;\r\n constructor() {\r\n super();\r\n\r\n this.auth = getAuth();\r\n this.db = getDatabase();\r\n }\r\n}\r\n","import { Router } from '@angular/router';\r\nimport {\r\n PERMISSION,\r\n AppUser,\r\n ClickAction,\r\n Click,\r\n MsjClassBatch,\r\n} from 'cyc-type-def';\r\nimport { FirebasePage } from './FirebasePage';\r\nimport {\r\n ref,\r\n onValue,\r\n push,\r\n get,\r\n equalTo,\r\n orderByChild,\r\n query,\r\n} from 'firebase/database';\r\n\r\n/**\r\n * using observable to read user\r\n * replace BasePage\r\n *\r\n * ---\r\n * @extends CommonPage\r\n * @extends ExtendedCommonPage\r\n * @extends FirebasePage\r\n */\r\nexport class SecurePage extends FirebasePage {\r\n protected isSecure: boolean;\r\n protected router: Router;\r\n\r\n constructor(router: Router, isSecure: boolean) {\r\n super();\r\n\r\n this.isSecure = isSecure;\r\n this.router = router;\r\n }\r\n\r\n override checkAccessAndLoadData() {\r\n if (this.firebaseUser) {\r\n if (this.user) {\r\n if (this.user.permission == PERMISSION.NOT_VERIFIED && this.isSecure) {\r\n // not verified user\r\n // redirect to home page\r\n this.navigateHome();\r\n }\r\n\r\n // if (this.user.permissions) {\r\n // this.isSuperUser = this.user.permissions.includes(\r\n // PERMISSION.SUPER_USER\r\n // );\r\n // }\r\n\r\n this.checkPermission(this.user);\r\n this.readData();\r\n } else {\r\n // user logged in but no data\r\n // redirect to home page (how he came to here?)\r\n if (this.isSecure) this.navigateHome();\r\n // this.readData(); // navigated home, no need read data\r\n }\r\n } else {\r\n // user not logged in\r\n // redirect to home page\r\n if (this.isSecure) this.navigateHome();\r\n // this.readData(); // navigated home, no need read data\r\n }\r\n }\r\n\r\n navigateHome(): void {\r\n this.router.navigate(['']);\r\n }\r\n\r\n loadTitle() {\r\n const titleRef = ref(this.db, 'move_follow_up_2023/attendance/titles');\r\n onValue(titleRef, (v) => {\r\n if (v.exists()) {\r\n this.arrTitle = Object.values(v.val());\r\n this.arrTitleForRef = v.val();\r\n }\r\n });\r\n }\r\n\r\n loadSheep() {\r\n const sheepRef = ref(this.db, 'move_follow_up_2023/sheeps');\r\n onValue(sheepRef, (v) => {\r\n if (v.exists()) {\r\n this.arrSheep = Object.values(v.val());\r\n this.arrSheepForRef = v.val();\r\n }\r\n });\r\n }\r\n\r\n loadAttendance() {}\r\n loadUsers() {}\r\n loadUsersAsync() {\r\n const userRef = ref(this.db, 'move_follow_up_2023/users');\r\n return get(userRef);\r\n }\r\n\r\n handleTitleSelected() {}\r\n handleClusterSelected() {}\r\n handleSmallTeamSelected() {}\r\n handleCGSelected() {}\r\n\r\n loadMsjClassType() {\r\n const msjClassTypeRef = ref(\r\n this.db,\r\n 'move_follow_up_2023/msj/msj_class_type'\r\n );\r\n\r\n return get(msjClassTypeRef);\r\n }\r\n\r\n loadMsjClassBatch() {\r\n const msjClassBatchRef = ref(\r\n this.db,\r\n 'move_follow_up_2023/msj/msj_class_batch'\r\n );\r\n\r\n return get(msjClassBatchRef);\r\n }\r\n\r\n loadMsjClassTime(msjClassBatch?: MsjClassBatch) {\r\n const msjClassTimeRef = ref(\r\n this.db,\r\n 'move_follow_up_2023/msj/msj_class_time'\r\n );\r\n\r\n let q = query(msjClassTimeRef);\r\n if (msjClassBatch)\r\n q = query(\r\n msjClassTimeRef,\r\n orderByChild('idMsjClassBatch'),\r\n equalTo(msjClassBatch.id)\r\n );\r\n\r\n return get(q);\r\n }\r\n\r\n recordClick(action: ClickAction) {\r\n const testAccId = '5FUtbbtMe4RNPys6QSUzri5UXFN2';\r\n const testAcc2Id = 'q1GEMXkzbWOOEg2wreNuPsTgCw52';\r\n const testAcc3Id = 'XZUlKaa5aUhwJ2KlEa5oJfImwZA3';\r\n const testAcc4Id = '9O3bSHbL2pfWBC9BOJiwMbkHQdr2';\r\n const developerAccId = 'ZqdQyuc1uuTbAfmhkjw5HgLFnc82';\r\n\r\n let userId = this.user?.id;\r\n if (\r\n userId == testAccId ||\r\n userId == testAcc2Id ||\r\n userId == testAcc3Id ||\r\n userId == testAcc4Id ||\r\n userId == developerAccId\r\n ) {\r\n return;\r\n }\r\n\r\n const obj: Click = { action, timeStamp: new Date().getTime() };\r\n if (userId) {\r\n obj['userId'] = userId;\r\n }\r\n push(ref(this.db, 'move_follow_up_2023/attendance/clicks'), obj);\r\n }\r\n\r\n // FUNCTIONS INTERFACE\r\n\r\n /**\r\n * Execute after reading user data from database\r\n * \r\n * @Override\r\n * \r\n * @example\r\n this.firebaseUser = user;\r\n if (user) {\r\n const userRef = ref(this.db, 'move_follow_up_2023/users/' + user.uid);\r\n onValue(userRef, (v) => {\r\n if (v.exists()) {\r\n this.user = v.val();\r\n\r\n if (this.user.permission == PERMISSION.NOT_VERIFIED) {\r\n // not verified user\r\n // redirect to home page\r\n router.navigate(['']);\r\n // this.router.navigate(['']);\r\n }\r\n\r\n this.checkPermission(this.user);\r\n this.loadDataClone();\r\n }\r\n })\r\n }\r\n \r\n * \r\n * @param user \r\n */\r\n checkPermission(user: AppUser): void {\r\n // console.log('checkPermission');\r\n }\r\n\r\n /**\r\n * Execute after reading user data from database\r\n * \r\n * @Override\r\n * \r\n * @example\r\n this.firebaseUser = user;\r\n if (user) {\r\n const userRef = ref(this.db, 'move_follow_up_2023/users/' + user.uid);\r\n onValue(userRef, (v) => {\r\n if (v.exists()) {\r\n this.user = v.val();\r\n\r\n if (this.user.permission == PERMISSION.NOT_VERIFIED) {\r\n // not verified user\r\n // redirect to home page\r\n router.navigate(['']);\r\n // this.router.navigate(['']);\r\n }\r\n\r\n this.checkPermission(this.user);\r\n this.loadDataClone();\r\n }\r\n })\r\n }\r\n */\r\n readData(): void {}\r\n}\r\n","import { onValue, ref } from 'firebase/database';\r\nimport { onAuthStateChanged, User } from 'firebase/auth';\r\nimport { Router } from '@angular/router';\r\nimport { PERMISSION } from 'cyc-type-def';\r\nimport { SecurePage } from './SecurePage';\r\n\r\nexport class BasePage extends SecurePage {\r\n t1!: Date;\r\n t2!: Date;\r\n\r\n constructor(router: Router, isSecure: boolean) {\r\n super(router, isSecure);\r\n\r\n this.isSecure = isSecure;\r\n this.router = router;\r\n\r\n this.load();\r\n }\r\n\r\n load() {\r\n onAuthStateChanged(this.auth, (user) => {\r\n this.readUser(user);\r\n // this.loadUser(user);\r\n });\r\n }\r\n\r\n readUser(user: User | null) {\r\n this.firebaseUser = user;\r\n if (user) {\r\n // console.log(user.email);\r\n const userRef = ref(this.db, 'move_follow_up_2023/users/' + user.uid);\r\n onValue(userRef, (v) => {\r\n if (v.exists()) {\r\n this.user = v.val();\r\n // console.log(this.user.name);\r\n\r\n if (\r\n this.user.permission == PERMISSION.NOT_VERIFIED &&\r\n this.isSecure\r\n ) {\r\n // not verified user\r\n // redirect to home page\r\n this.router.navigate(['']);\r\n // this.router.navigate(['']);\r\n }\r\n\r\n // if (this.user.permissions) {\r\n // this.isSuperUser = this.user.permissions.includes(\r\n // PERMISSION.SUPER_USER\r\n // );\r\n // }\r\n\r\n this.checkPermission(this.user);\r\n this.readData();\r\n\r\n this.initSettings(this.user);\r\n } else {\r\n // user logged in but no data\r\n // redirect to home page (how he came to here?)\r\n if (this.isSecure) this.router.navigate(['']);\r\n // this.router.navigate(['']);\r\n this.readData();\r\n }\r\n });\r\n } else {\r\n // user not logged in\r\n // redirect to home page\r\n if (this.isSecure) this.router.navigate(['']);\r\n // this.router.navigate(['']);\r\n this.readData();\r\n }\r\n }\r\n\r\n timerStart() {\r\n this.t1 = new Date();\r\n }\r\n\r\n timerEnd() {\r\n this.t2 = new Date();\r\n console.log(this.t2.getTime() - this.t1.getTime());\r\n }\r\n}\r\n","/*\r\n * Public API Surface of cyc-base\r\n */\r\n\r\nexport * from './lib/cyc-base';\r\n\r\n// service\r\nexport * from './lib/shared-db';\r\n\r\n// base class\r\nexport * from './classes/CommonPage';\r\nexport * from './classes/ExtendedCommonPage';\r\nexport * from './classes/FirebasePage';\r\nexport * from './classes/SecurePage';\r\nexport * from './classes/BasePage';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
package/index.d.ts ADDED
@@ -0,0 +1,321 @@
1
+ import * as i0 from '@angular/core';
2
+ import { Cluster, SmallTeam, CG, AppUser, Title, Sheep, Attendance, MsjClassType, MsjClassBatch, MsjClassTime, MsjStudBatch, ClickAction } from 'cyc-type-def';
3
+ import { User, Auth } from 'firebase/auth';
4
+ import { Database } from 'firebase/database';
5
+ import { Observable, ReplaySubject, Subscription } from 'rxjs';
6
+ import * as _firebase_database from '@firebase/database';
7
+ import { Router } from '@angular/router';
8
+
9
+ declare class CycBase {
10
+ static ɵfac: i0.ɵɵFactoryDeclaration<CycBase, never>;
11
+ static ɵcmp: i0.ɵɵComponentDeclaration<CycBase, "lib-cyc-base", never, {}, {}, never, never, true, never>;
12
+ }
13
+
14
+ interface AppData {
15
+ arrCluster?: Cluster[];
16
+ arrClusterForRef?: {
17
+ [key: string]: Cluster;
18
+ };
19
+ arrSt?: SmallTeam[];
20
+ arrStForRef?: {
21
+ [key: string]: SmallTeam;
22
+ };
23
+ arrCg?: CG[];
24
+ arrCgForRef?: {
25
+ [key: string]: CG;
26
+ };
27
+ firebaseUser?: User | null;
28
+ user?: AppUser;
29
+ }
30
+ declare class SharedDb {
31
+ private _db;
32
+ private firebaseAuth;
33
+ private dataSubject;
34
+ private listeners;
35
+ private isInitialized;
36
+ data$: Observable<AppData>;
37
+ auth$: ReplaySubject<{
38
+ user: AppUser;
39
+ firebaseUser: User;
40
+ } | undefined>;
41
+ constructor();
42
+ initializeData(): Promise<void>;
43
+ private listenToCluster;
44
+ private listenToSmallTeam;
45
+ private listenToCG;
46
+ private listenToUser;
47
+ private fetchUser;
48
+ private updateData;
49
+ get auth(): Observable<{
50
+ user: AppUser;
51
+ firebaseUser: User;
52
+ } | undefined>;
53
+ get pastoralTeam(): Observable<AppData>;
54
+ get cluster(): Observable<{
55
+ [key: string]: Cluster;
56
+ }>;
57
+ get smallTeam(): Observable<{
58
+ [key: string]: SmallTeam;
59
+ }>;
60
+ get CG(): Observable<{
61
+ [key: string]: CG;
62
+ }>;
63
+ get db(): Database;
64
+ static ɵfac: i0.ɵɵFactoryDeclaration<SharedDb, never>;
65
+ static ɵprov: i0.ɵɵInjectableDeclaration<SharedDb>;
66
+ }
67
+
68
+ /**
69
+ * Holds only the common data stored in `SharedDbService`,
70
+ * - Pastoral team
71
+ * - User
72
+ *
73
+ * ---
74
+ * For other frequently used variables (not stored in `SharedDbService`), see `ExtendedCommonPage`.
75
+ *
76
+ * **Provides:**
77
+ * `Cluster`, `SmallTeam`, `CG`, `AppUser`, `User`
78
+ */
79
+ declare class CommonPage {
80
+ protected subscription?: Subscription;
81
+ protected subscriptionAuth?: Subscription;
82
+ user: AppUser;
83
+ firebaseUser: User | null;
84
+ /** deleted record included */
85
+ arrClusterForRef: {
86
+ [key: string]: Cluster;
87
+ };
88
+ /** deleted record included */
89
+ arrStForRef: {
90
+ [key: string]: SmallTeam;
91
+ };
92
+ /** deleted record included */
93
+ arrCgForRef: {
94
+ [key: string]: CG;
95
+ };
96
+ /** array of clusters, excluding deleted records */
97
+ arrCluster: Cluster[];
98
+ /** array of small teams, excluding deleted records */
99
+ arrSt: SmallTeam[];
100
+ /** array of CGs, excluding deleted records */
101
+ arrCg: CG[];
102
+ constructor();
103
+ /**
104
+ * subscribe to clusters, small teams, CGs observable
105
+ * @param observerble
106
+ */
107
+ subscribeObserverble(observerble: Observable<AppData>): void;
108
+ subscribeAuthObserverble(observerble: Observable<{
109
+ user: AppUser;
110
+ firebaseUser: User;
111
+ } | undefined>): void;
112
+ /**
113
+ * unsubscribe all observables
114
+ */
115
+ unSubscribeObserverble(): void;
116
+ /** get array of clusters, including deleted records */
117
+ get arrClusterWithDel(): Cluster[];
118
+ /** get array of small team, including deleted records */
119
+ get arrStWithDel(): SmallTeam[];
120
+ /** get array of CGs, including deleted records */
121
+ get arrCgWithDel(): CG[];
122
+ /**
123
+ * Returns small teams under a specified cluster.
124
+ *
125
+ * Optionally filters based on user access permissions.
126
+ *
127
+ * By default, not including deleted small teams.
128
+ *
129
+ * @param idCluster - The cluster ID to filter small teams by.
130
+ * @param byUserAccess - If true, applies user permission-based filtering. Defaults to false.
131
+ * @returns An array of filtered small teams.
132
+ */
133
+ filteredSmallTeam(idCluster: string | undefined, byUserAccess?: boolean): SmallTeam[];
134
+ filteredSmallTeamWithDel(idCluster: string): SmallTeam[];
135
+ /**
136
+ * by default, not including deleted CG
137
+ * @param idCluster
138
+ * @returns array of CG under selected cluster and small team
139
+ */
140
+ filteredCg(idSt: string | undefined): CG[];
141
+ filteredCgWithDel(idSt: string): CG[];
142
+ /**
143
+ * Returns the list of clusters accessible to the current user based on their permissions.
144
+ *
145
+ * @returns {Cluster[]} Filtered cluster list according to user role.
146
+ */
147
+ get arrClusterByUserAccess(): Cluster[];
148
+ /**
149
+ * init setting if not exist
150
+ * @param user
151
+ */
152
+ initSettings(user: AppUser): void;
153
+ checkAccessAndLoadData(): void;
154
+ }
155
+
156
+ /**
157
+ * Holds additional frequently used variables **not** stored in `SharedDbService`,
158
+ * such as:
159
+ * - `Sheep`
160
+ * - `Title`
161
+ *
162
+ * ---
163
+ * **For data stored in `SharedDbService`**
164
+ * (pastoral team and user), see `CommonPage`.
165
+ *
166
+ * ---
167
+ * @extends ExtendedCommonPage
168
+ */
169
+ declare class ExtendedCommonPage extends CommonPage {
170
+ arrTitleForRef: {
171
+ [key: string]: Title;
172
+ };
173
+ arrTitle: Title[];
174
+ arrSheepForRef: {
175
+ [key: string]: Sheep;
176
+ };
177
+ arrSheep: Sheep[];
178
+ arrUserForRef: {
179
+ [key: string]: AppUser;
180
+ };
181
+ arrUser: AppUser[];
182
+ arrAttendance: Attendance[];
183
+ arrMsjClassTypeForRef: {
184
+ [key: string]: MsjClassType;
185
+ };
186
+ arrMsjClassBatchForRef: {
187
+ [key: string]: MsjClassBatch;
188
+ };
189
+ arrMsjClassTimeForRef: {
190
+ [key: string]: MsjClassTime;
191
+ };
192
+ arrMsjStudBatch: MsjStudBatch[];
193
+ cluster: Cluster | undefined;
194
+ st: SmallTeam | undefined;
195
+ cg: CG | undefined;
196
+ sheep: Sheep | undefined;
197
+ title: Title | undefined;
198
+ msjClassType: MsjClassType | undefined;
199
+ msjClassBatch: MsjClassBatch | undefined;
200
+ msjClassTime: MsjClassTime | undefined;
201
+ loading: boolean;
202
+ constructor();
203
+ get arrTitleReserve(): Title[];
204
+ get arrMsjClassType(): MsjClassType[];
205
+ get arrMsjClassBatch(): MsjClassBatch[];
206
+ get arrMsjClassTime(): MsjClassTime[];
207
+ filteredMsjClassBatch(idMsjClassType: string): MsjClassBatch[];
208
+ filteredMsjClassTime(idMsjClassBatch: string): MsjClassTime[];
209
+ get isSuperUser(): boolean;
210
+ get isPastoralAdmin(): boolean;
211
+ }
212
+
213
+ /**
214
+ * @extends CommonPage
215
+ * @extends ExtendedCommonPage
216
+ */
217
+ declare class FirebasePage extends ExtendedCommonPage {
218
+ db: Database;
219
+ auth: Auth;
220
+ constructor();
221
+ }
222
+
223
+ /**
224
+ * using observable to read user
225
+ * replace BasePage
226
+ *
227
+ * ---
228
+ * @extends CommonPage
229
+ * @extends ExtendedCommonPage
230
+ * @extends FirebasePage
231
+ */
232
+ declare class SecurePage extends FirebasePage {
233
+ protected isSecure: boolean;
234
+ protected router: Router;
235
+ constructor(router: Router, isSecure: boolean);
236
+ checkAccessAndLoadData(): void;
237
+ navigateHome(): void;
238
+ loadTitle(): void;
239
+ loadSheep(): void;
240
+ loadAttendance(): void;
241
+ loadUsers(): void;
242
+ loadUsersAsync(): Promise<_firebase_database.DataSnapshot>;
243
+ handleTitleSelected(): void;
244
+ handleClusterSelected(): void;
245
+ handleSmallTeamSelected(): void;
246
+ handleCGSelected(): void;
247
+ loadMsjClassType(): Promise<_firebase_database.DataSnapshot>;
248
+ loadMsjClassBatch(): Promise<_firebase_database.DataSnapshot>;
249
+ loadMsjClassTime(msjClassBatch?: MsjClassBatch): Promise<_firebase_database.DataSnapshot>;
250
+ recordClick(action: ClickAction): void;
251
+ /**
252
+ * Execute after reading user data from database
253
+ *
254
+ * @Override
255
+ *
256
+ * @example
257
+ this.firebaseUser = user;
258
+ if (user) {
259
+ const userRef = ref(this.db, 'move_follow_up_2023/users/' + user.uid);
260
+ onValue(userRef, (v) => {
261
+ if (v.exists()) {
262
+ this.user = v.val();
263
+
264
+ if (this.user.permission == PERMISSION.NOT_VERIFIED) {
265
+ // not verified user
266
+ // redirect to home page
267
+ router.navigate(['']);
268
+ // this.router.navigate(['']);
269
+ }
270
+
271
+ this.checkPermission(this.user);
272
+ this.loadDataClone();
273
+ }
274
+ })
275
+ }
276
+
277
+ *
278
+ * @param user
279
+ */
280
+ checkPermission(user: AppUser): void;
281
+ /**
282
+ * Execute after reading user data from database
283
+ *
284
+ * @Override
285
+ *
286
+ * @example
287
+ this.firebaseUser = user;
288
+ if (user) {
289
+ const userRef = ref(this.db, 'move_follow_up_2023/users/' + user.uid);
290
+ onValue(userRef, (v) => {
291
+ if (v.exists()) {
292
+ this.user = v.val();
293
+
294
+ if (this.user.permission == PERMISSION.NOT_VERIFIED) {
295
+ // not verified user
296
+ // redirect to home page
297
+ router.navigate(['']);
298
+ // this.router.navigate(['']);
299
+ }
300
+
301
+ this.checkPermission(this.user);
302
+ this.loadDataClone();
303
+ }
304
+ })
305
+ }
306
+ */
307
+ readData(): void;
308
+ }
309
+
310
+ declare class BasePage extends SecurePage {
311
+ t1: Date;
312
+ t2: Date;
313
+ constructor(router: Router, isSecure: boolean);
314
+ load(): void;
315
+ readUser(user: User | null): void;
316
+ timerStart(): void;
317
+ timerEnd(): void;
318
+ }
319
+
320
+ export { BasePage, CommonPage, CycBase, ExtendedCommonPage, FirebasePage, SecurePage, SharedDb };
321
+ export type { AppData };
package/package.json ADDED
@@ -0,0 +1,23 @@
1
+ {
2
+ "name": "cyc-base",
3
+ "version": "0.0.1",
4
+ "peerDependencies": {
5
+ "@angular/common": "^20.3.0",
6
+ "@angular/core": "^20.3.0"
7
+ },
8
+ "dependencies": {
9
+ "tslib": "^2.3.0"
10
+ },
11
+ "sideEffects": false,
12
+ "module": "fesm2022/cyc-base.mjs",
13
+ "typings": "index.d.ts",
14
+ "exports": {
15
+ "./package.json": {
16
+ "default": "./package.json"
17
+ },
18
+ ".": {
19
+ "types": "./index.d.ts",
20
+ "default": "./fesm2022/cyc-base.mjs"
21
+ }
22
+ }
23
+ }