cyc-base 1.0.5 → 1.1.0

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 CHANGED
@@ -24,3 +24,14 @@ Once the project is built, you can publish your library by following these steps
24
24
  npm publish
25
25
  npm config delete //registry.npmjs.org/:_authToken
26
26
  ```
27
+
28
+ ## Testing
29
+
30
+ To build the library, run:
31
+
32
+ ```bash
33
+ npm run ng -- generate application demo --style=css --routing=false --skip-tests --inline-style=false --inline-template=false
34
+ ```
35
+ ```bash
36
+ npm run ng -- serve demo --port 4201
37
+ ```
@@ -1,19 +1,25 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { Component, Injectable, input } from '@angular/core';
3
- import { getAuth, onAuthStateChanged, signOut } from 'firebase/auth';
3
+ import { getAuth, onAuthStateChanged, signOut, signInWithEmailAndPassword } from 'firebase/auth';
4
4
  import { getDatabase, ref, onValue, get, query, orderByChild, equalTo, push } from 'firebase/database';
5
5
  import { BehaviorSubject, ReplaySubject, Observable } from 'rxjs';
6
6
  import { PERMISSION, compareCG } from 'cyc-type-def';
7
7
  import * as i4 from '@angular/material/button';
8
- import { MatButtonModule, MatIconButton } from '@angular/material/button';
9
- import { MatLabel } from '@angular/material/form-field';
10
- import * as i2 from '@angular/material/icon';
11
- import { MatIconModule } from '@angular/material/icon';
8
+ import { MatButtonModule, MatIconButton, MatButton } from '@angular/material/button';
9
+ import { MatLabel, MatFormField } from '@angular/material/form-field';
10
+ import * as i2$1 from '@angular/material/icon';
11
+ import { MatIconModule, MatIcon } from '@angular/material/icon';
12
12
  import { MatMenuModule } from '@angular/material/menu';
13
13
  import * as i3 from '@angular/material/toolbar';
14
- import { MatToolbarModule } from '@angular/material/toolbar';
15
- import * as i1 from '@angular/router';
14
+ import { MatToolbarModule, MatToolbar } from '@angular/material/toolbar';
15
+ import * as i2 from '@angular/router';
16
16
  import { RouterModule } from '@angular/router';
17
+ import * as i4$1 from '@angular/forms';
18
+ import { FormsModule } from '@angular/forms';
19
+ import { MatCard, MatCardContent } from '@angular/material/card';
20
+ import { MatInput } from '@angular/material/input';
21
+ import * as i1 from '@angular/common';
22
+ import * as i3$1 from 'mat-helper';
17
23
 
18
24
  class CycBase {
19
25
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: CycBase, deps: [], target: i0.ɵɵFactoryTarget.Component });
@@ -746,7 +752,7 @@ class MatNavBar {
746
752
  // this.helper.toggleSideNav();
747
753
  }
748
754
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: MatNavBar, deps: [], target: i0.ɵɵFactoryTarget.Component });
749
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: MatNavBar, isStandalone: true, selector: "lib-mat-nav-bar", inputs: { user: { classPropertyName: "user", publicName: "user", isSignal: true, isRequired: true, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: true, transformFunction: null }, auth: { classPropertyName: "auth", publicName: "auth", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: "<mat-toolbar style=\"padding-left: 8px; padding-right: 8px\">\r\n <button mat-icon-button (click)=\"toggleSideNav()\">\r\n <mat-icon>menu</mat-icon>\r\n </button>\r\n <span style=\"font-size: large\"> {{ title() }} </span>\r\n <span class=\"space\"></span>\r\n @if (user()) {\r\n <mat-label style=\"font-size: x-small; text-wrap: wrap; line-height: 10px\">{{\r\n user().name ? user().name : user().phoneNum\r\n }}</mat-label>\r\n <button mat-icon-button (click)=\"logout()\">\r\n <mat-icon>exit_to_app</mat-icon>\r\n </button>\r\n } @else {\r\n @if (!user()) {\r\n <button mat-stroked-button routerLink=\"/login-email\">Login</button>\r\n }\r\n }\r\n</mat-toolbar>\r\n", styles: [".space{flex:1 1 auto;margin-left:5px;margin-right:5px}\n"], dependencies: [{ kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i1.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatToolbarModule }, { kind: "component", type: i3.MatToolbar, selector: "mat-toolbar", inputs: ["color"], exportAs: ["matToolbar"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i4.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i4.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatMenuModule }] });
755
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: MatNavBar, isStandalone: true, selector: "lib-mat-nav-bar", inputs: { user: { classPropertyName: "user", publicName: "user", isSignal: true, isRequired: true, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: true, transformFunction: null }, auth: { classPropertyName: "auth", publicName: "auth", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: "<mat-toolbar style=\"padding-left: 8px; padding-right: 8px\">\r\n <button mat-icon-button (click)=\"toggleSideNav()\">\r\n <mat-icon>menu</mat-icon>\r\n </button>\r\n <span style=\"font-size: large\"> {{ title() }} </span>\r\n <span class=\"space\"></span>\r\n @if (user()) {\r\n <mat-label style=\"font-size: x-small; text-wrap: wrap; line-height: 10px\">{{\r\n user().name ? user().name : user().phoneNum\r\n }}</mat-label>\r\n <button mat-icon-button (click)=\"logout()\">\r\n <mat-icon>exit_to_app</mat-icon>\r\n </button>\r\n } @else {\r\n @if (!user()) {\r\n <button mat-stroked-button routerLink=\"/login-email\">Login</button>\r\n }\r\n }\r\n</mat-toolbar>\r\n", styles: [".space{flex:1 1 auto;margin-left:5px;margin-right:5px}\n"], dependencies: [{ kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatToolbarModule }, { kind: "component", type: i3.MatToolbar, selector: "mat-toolbar", inputs: ["color"], exportAs: ["matToolbar"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i4.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i4.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatMenuModule }] });
750
756
  }
751
757
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: MatNavBar, decorators: [{
752
758
  type: Component,
@@ -761,6 +767,89 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
761
767
  ], template: "<mat-toolbar style=\"padding-left: 8px; padding-right: 8px\">\r\n <button mat-icon-button (click)=\"toggleSideNav()\">\r\n <mat-icon>menu</mat-icon>\r\n </button>\r\n <span style=\"font-size: large\"> {{ title() }} </span>\r\n <span class=\"space\"></span>\r\n @if (user()) {\r\n <mat-label style=\"font-size: x-small; text-wrap: wrap; line-height: 10px\">{{\r\n user().name ? user().name : user().phoneNum\r\n }}</mat-label>\r\n <button mat-icon-button (click)=\"logout()\">\r\n <mat-icon>exit_to_app</mat-icon>\r\n </button>\r\n } @else {\r\n @if (!user()) {\r\n <button mat-stroked-button routerLink=\"/login-email\">Login</button>\r\n }\r\n }\r\n</mat-toolbar>\r\n", styles: [".space{flex:1 1 auto;margin-left:5px;margin-right:5px}\n"] }]
762
768
  }], ctorParameters: () => [], propDecorators: { user: [{ type: i0.Input, args: [{ isSignal: true, alias: "user", required: true }] }], title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: true }] }], auth: [{ type: i0.Input, args: [{ isSignal: true, alias: "auth", required: true }] }] } });
763
769
 
770
+ /** use 'login-email' path */
771
+ class LoginEmail {
772
+ location;
773
+ router;
774
+ helper;
775
+ auth;
776
+ db;
777
+ confirmationResult;
778
+ email = '';
779
+ password = '';
780
+ constructor(location, router, helper) {
781
+ this.location = location;
782
+ this.router = router;
783
+ this.helper = helper;
784
+ this.auth = getAuth();
785
+ this.auth.useDeviceLanguage();
786
+ this.db = getDatabase();
787
+ }
788
+ close() {
789
+ this.location.back();
790
+ }
791
+ login() {
792
+ signInWithEmailAndPassword(this.auth, this.email, this.password)
793
+ .then(async (res) => {
794
+ var user = res.user;
795
+ console.log(user);
796
+ this.helper.presentAlert('Login successfully.', () => {
797
+ // this.router.navigate(['']);
798
+ this.location.back();
799
+ });
800
+ })
801
+ .catch((error) => {
802
+ console.log(error);
803
+ if (error.code == 'auth/user-not-found') {
804
+ this.helper.presentAlert('Email not found.');
805
+ }
806
+ else if (error.code == 'auth/wrong-password') {
807
+ this.helper.presentAlert('Wrong password.');
808
+ }
809
+ });
810
+ }
811
+ reg() {
812
+ this.router.navigate(['register-email']);
813
+ }
814
+ forgetPs() {
815
+ this.router.navigate(['forget-password']);
816
+ }
817
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: LoginEmail, deps: [{ token: i1.Location }, { token: i2.Router }, { token: i3$1.MatHelper }], target: i0.ɵɵFactoryTarget.Component });
818
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.16", type: LoginEmail, isStandalone: true, selector: "lib-login-email", ngImport: i0, template: "<mat-toolbar>\r\n Login\r\n <span style=\"flex: 1 1 auto\"></span>\r\n <mat-icon (click)=\"close()\" class=\"btn-close\">close</mat-icon>\r\n</mat-toolbar>\r\n\r\n<mat-card>\r\n <mat-card-content>\r\n <div>\r\n <mat-form-field>\r\n <mat-label>Email</mat-label>\r\n <input matInput [(ngModel)]=\"email\" required />\r\n </mat-form-field>\r\n </div>\r\n <div>\r\n <mat-form-field>\r\n <mat-label>Password</mat-label>\r\n <input matInput [(ngModel)]=\"password\" required />\r\n </mat-form-field>\r\n </div>\r\n\r\n <div>\r\n <button mat-raised-button (click)=\"login()\" style=\"margin-top: 20px\">Login</button>\r\n </div>\r\n <div>\r\n <button mat-raised-button (click)=\"reg()\" style=\"margin-top: 20px\">\r\n Don't have an account? Create an account\r\n </button>\r\n </div>\r\n <div>\r\n <button mat-raised-button (click)=\"forgetPs()\" style=\"margin-top: 20px\">\r\n Forget Password\r\n </button>\r\n </div>\r\n </mat-card-content>\r\n</mat-card>\r\n", styles: [""], dependencies: [{ kind: "component", type: MatToolbar, selector: "mat-toolbar", inputs: ["color"], exportAs: ["matToolbar"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: MatLabel, selector: "mat-label" }, { kind: "directive", type: MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "component", type: MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i4$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4$1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i4$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: MatCardContent, selector: "mat-card-content" }] });
819
+ }
820
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: LoginEmail, decorators: [{
821
+ type: Component,
822
+ args: [{ selector: 'lib-login-email', imports: [
823
+ MatToolbar,
824
+ MatIcon,
825
+ MatFormField,
826
+ MatLabel,
827
+ MatInput,
828
+ MatButton,
829
+ FormsModule,
830
+ MatCard,
831
+ MatCardContent,
832
+ ], template: "<mat-toolbar>\r\n Login\r\n <span style=\"flex: 1 1 auto\"></span>\r\n <mat-icon (click)=\"close()\" class=\"btn-close\">close</mat-icon>\r\n</mat-toolbar>\r\n\r\n<mat-card>\r\n <mat-card-content>\r\n <div>\r\n <mat-form-field>\r\n <mat-label>Email</mat-label>\r\n <input matInput [(ngModel)]=\"email\" required />\r\n </mat-form-field>\r\n </div>\r\n <div>\r\n <mat-form-field>\r\n <mat-label>Password</mat-label>\r\n <input matInput [(ngModel)]=\"password\" required />\r\n </mat-form-field>\r\n </div>\r\n\r\n <div>\r\n <button mat-raised-button (click)=\"login()\" style=\"margin-top: 20px\">Login</button>\r\n </div>\r\n <div>\r\n <button mat-raised-button (click)=\"reg()\" style=\"margin-top: 20px\">\r\n Don't have an account? Create an account\r\n </button>\r\n </div>\r\n <div>\r\n <button mat-raised-button (click)=\"forgetPs()\" style=\"margin-top: 20px\">\r\n Forget Password\r\n </button>\r\n </div>\r\n </mat-card-content>\r\n</mat-card>\r\n" }]
833
+ }], ctorParameters: () => [{ type: i1.Location }, { type: i2.Router }, { type: i3$1.MatHelper }] });
834
+
835
+ class RegisterEmail {
836
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: RegisterEmail, deps: [], target: i0.ɵɵFactoryTarget.Component });
837
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.16", type: RegisterEmail, isStandalone: true, selector: "lib-register-email", ngImport: i0, template: "<p>register-email works!</p>\r\n", styles: [""] });
838
+ }
839
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: RegisterEmail, decorators: [{
840
+ type: Component,
841
+ args: [{ selector: 'lib-register-email', imports: [], template: "<p>register-email works!</p>\r\n" }]
842
+ }] });
843
+
844
+ class ForgetPassword {
845
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: ForgetPassword, deps: [], target: i0.ɵɵFactoryTarget.Component });
846
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.16", type: ForgetPassword, isStandalone: true, selector: "lib-forget-password", ngImport: i0, template: "<p>forget-password works!</p>\r\n", styles: [""] });
847
+ }
848
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: ForgetPassword, decorators: [{
849
+ type: Component,
850
+ args: [{ selector: 'lib-forget-password', imports: [], template: "<p>forget-password works!</p>\r\n" }]
851
+ }] });
852
+
764
853
  /*
765
854
  * Public API Surface of cyc-base
766
855
  */
@@ -769,5 +858,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
769
858
  * Generated bundle index. Do not edit.
770
859
  */
771
860
 
772
- export { BasePage, CommonPage, CycBase, ExtendedCommonPage, FirebasePage, MatNavBar, SecurePage, SharedDb };
861
+ export { BasePage, CommonPage, CycBase, ExtendedCommonPage, FirebasePage, ForgetPassword, LoginEmail, MatNavBar, RegisterEmail, SecurePage, SharedDb };
773
862
  //# sourceMappingURL=cyc-base.mjs.map
@@ -1 +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/lib/components/mat-nav-bar/mat-nav-bar.ts","../../../projects/cyc-base/src/lib/components/mat-nav-bar/mat-nav-bar.html","../../../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, ref } 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 get userRef() {\r\n return ref(this.db, 'move_follow_up_2023/users');\r\n }\r\n\r\n get clusterRef() {\r\n return ref(this.db, 'move_follow_up_2023/clusters');\r\n }\r\n\r\n get stRef() {\r\n return ref(this.db, 'move_follow_up_2023/small_teams');\r\n }\r\n\r\n get cgRef() {\r\n return ref(this.db, 'move_follow_up_2023/CGs');\r\n }\r\n\r\n get sheepRef() {\r\n return ref(this.db, 'move_follow_up_2023/sheeps');\r\n }\r\n\r\n get sheepLogRef() {\r\n return ref(this.db, 'move_follow_up_2023/sheeps_log');\r\n }\r\n\r\n get msjClassTypeRef() {\r\n return ref(this.db, 'move_follow_up_2023/msj/msj_class_type');\r\n }\r\n\r\n get msjClassBatchRef() {\r\n return ref(this.db, 'move_follow_up_2023/msj/msj_class_batch');\r\n }\r\n\r\n get msjClassTimeRef() {\r\n return ref(this.db, 'move_follow_up_2023/msj/msj_class_time');\r\n }\r\n\r\n get msjStudBatchRef() {\r\n return ref(this.db, 'move_follow_up_2023/msj/msj_student_batch_record');\r\n }\r\n\r\n get attRef() {\r\n return ref(this.db, 'move_follow_up_2023/attendance/atts');\r\n }\r\n\r\n get titleRef() {\r\n return ref(this.db, 'move_follow_up_2023/attendance/titles');\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","import { Component, input, OnInit } from '@angular/core';\r\nimport { MatButtonModule, MatIconButton } from '@angular/material/button';\r\nimport { MatLabel } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatMenuModule } from '@angular/material/menu';\r\nimport { MatToolbarModule } from '@angular/material/toolbar';\r\nimport { RouterModule } from '@angular/router';\r\nimport { AppUser } from 'cyc-type-def';\r\nimport { Auth, signOut } from 'firebase/auth';\r\n\r\n@Component({\r\n selector: 'lib-mat-nav-bar',\r\n imports: [\r\n RouterModule,\r\n MatLabel,\r\n MatIconModule,\r\n MatToolbarModule,\r\n MatButtonModule,\r\n MatMenuModule,\r\n MatIconButton,\r\n ],\r\n templateUrl: './mat-nav-bar.html',\r\n styleUrl: './mat-nav-bar.css',\r\n})\r\nexport class MatNavBar implements OnInit {\r\n user = input.required<AppUser>();\r\n title = input.required<string>();\r\n auth = input.required<Auth>();\r\n\r\n constructor() {}\r\n\r\n ngOnInit() {}\r\n\r\n logout() {\r\n signOut(this.auth())\r\n .then(() => {\r\n console.log('Signed out.');\r\n window.location.reload();\r\n })\r\n .catch((err) => {});\r\n }\r\n\r\n toggleSideNav() {\r\n // this.helper.toggleSideNav();\r\n }\r\n}\r\n","<mat-toolbar style=\"padding-left: 8px; padding-right: 8px\">\r\n <button mat-icon-button (click)=\"toggleSideNav()\">\r\n <mat-icon>menu</mat-icon>\r\n </button>\r\n <span style=\"font-size: large\"> {{ title() }} </span>\r\n <span class=\"space\"></span>\r\n @if (user()) {\r\n <mat-label style=\"font-size: x-small; text-wrap: wrap; line-height: 10px\">{{\r\n user().name ? user().name : user().phoneNum\r\n }}</mat-label>\r\n <button mat-icon-button (click)=\"logout()\">\r\n <mat-icon>exit_to_app</mat-icon>\r\n </button>\r\n } @else {\r\n @if (!user()) {\r\n <button mat-stroked-button routerLink=\"/login-email\">Login</button>\r\n }\r\n }\r\n</mat-toolbar>\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\r\n// components\r\nexport * from './lib/components/mat-nav-bar/mat-nav-bar';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
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/lib/components/mat-nav-bar/mat-nav-bar.ts","../../../projects/cyc-base/src/lib/components/mat-nav-bar/mat-nav-bar.html","../../../projects/cyc-base/src/lib/auth/login-email/login-email.ts","../../../projects/cyc-base/src/lib/auth/login-email/login-email.html","../../../projects/cyc-base/src/lib/auth/register-email/register-email.ts","../../../projects/cyc-base/src/lib/auth/register-email/register-email.html","../../../projects/cyc-base/src/lib/auth/forget-password/forget-password.ts","../../../projects/cyc-base/src/lib/auth/forget-password/forget-password.html","../../../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, ref } 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 get userRef() {\r\n return ref(this.db, 'move_follow_up_2023/users');\r\n }\r\n\r\n get clusterRef() {\r\n return ref(this.db, 'move_follow_up_2023/clusters');\r\n }\r\n\r\n get stRef() {\r\n return ref(this.db, 'move_follow_up_2023/small_teams');\r\n }\r\n\r\n get cgRef() {\r\n return ref(this.db, 'move_follow_up_2023/CGs');\r\n }\r\n\r\n get sheepRef() {\r\n return ref(this.db, 'move_follow_up_2023/sheeps');\r\n }\r\n\r\n get sheepLogRef() {\r\n return ref(this.db, 'move_follow_up_2023/sheeps_log');\r\n }\r\n\r\n get msjClassTypeRef() {\r\n return ref(this.db, 'move_follow_up_2023/msj/msj_class_type');\r\n }\r\n\r\n get msjClassBatchRef() {\r\n return ref(this.db, 'move_follow_up_2023/msj/msj_class_batch');\r\n }\r\n\r\n get msjClassTimeRef() {\r\n return ref(this.db, 'move_follow_up_2023/msj/msj_class_time');\r\n }\r\n\r\n get msjStudBatchRef() {\r\n return ref(this.db, 'move_follow_up_2023/msj/msj_student_batch_record');\r\n }\r\n\r\n get attRef() {\r\n return ref(this.db, 'move_follow_up_2023/attendance/atts');\r\n }\r\n\r\n get titleRef() {\r\n return ref(this.db, 'move_follow_up_2023/attendance/titles');\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","import { Component, input, OnInit } from '@angular/core';\r\nimport { MatButtonModule, MatIconButton } from '@angular/material/button';\r\nimport { MatLabel } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatMenuModule } from '@angular/material/menu';\r\nimport { MatToolbarModule } from '@angular/material/toolbar';\r\nimport { RouterModule } from '@angular/router';\r\nimport { AppUser } from 'cyc-type-def';\r\nimport { Auth, signOut } from 'firebase/auth';\r\n\r\n@Component({\r\n selector: 'lib-mat-nav-bar',\r\n imports: [\r\n RouterModule,\r\n MatLabel,\r\n MatIconModule,\r\n MatToolbarModule,\r\n MatButtonModule,\r\n MatMenuModule,\r\n MatIconButton,\r\n ],\r\n templateUrl: './mat-nav-bar.html',\r\n styleUrl: './mat-nav-bar.css',\r\n})\r\nexport class MatNavBar implements OnInit {\r\n user = input.required<AppUser>();\r\n title = input.required<string>();\r\n auth = input.required<Auth>();\r\n\r\n constructor() {}\r\n\r\n ngOnInit() {}\r\n\r\n logout() {\r\n signOut(this.auth())\r\n .then(() => {\r\n console.log('Signed out.');\r\n window.location.reload();\r\n })\r\n .catch((err) => {});\r\n }\r\n\r\n toggleSideNav() {\r\n // this.helper.toggleSideNav();\r\n }\r\n}\r\n","<mat-toolbar style=\"padding-left: 8px; padding-right: 8px\">\r\n <button mat-icon-button (click)=\"toggleSideNav()\">\r\n <mat-icon>menu</mat-icon>\r\n </button>\r\n <span style=\"font-size: large\"> {{ title() }} </span>\r\n <span class=\"space\"></span>\r\n @if (user()) {\r\n <mat-label style=\"font-size: x-small; text-wrap: wrap; line-height: 10px\">{{\r\n user().name ? user().name : user().phoneNum\r\n }}</mat-label>\r\n <button mat-icon-button (click)=\"logout()\">\r\n <mat-icon>exit_to_app</mat-icon>\r\n </button>\r\n } @else {\r\n @if (!user()) {\r\n <button mat-stroked-button routerLink=\"/login-email\">Login</button>\r\n }\r\n }\r\n</mat-toolbar>\r\n","import { Location } from '@angular/common';\r\nimport { Component } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { MatButton } from '@angular/material/button';\r\nimport { MatCard, MatCardContent } from '@angular/material/card';\r\nimport { MatFormField, MatLabel } from '@angular/material/form-field';\r\nimport { MatIcon } from '@angular/material/icon';\r\nimport { MatInput } from '@angular/material/input';\r\nimport { MatToolbar } from '@angular/material/toolbar';\r\nimport { Router } from '@angular/router';\r\nimport { Auth, ConfirmationResult, getAuth, signInWithEmailAndPassword } from 'firebase/auth';\r\nimport { Database, getDatabase } from 'firebase/database';\r\nimport { MatHelper } from 'mat-helper';\r\n\r\n/** use 'login-email' path */\r\n@Component({\r\n selector: 'lib-login-email',\r\n imports: [\r\n MatToolbar,\r\n MatIcon,\r\n MatFormField,\r\n MatLabel,\r\n MatInput,\r\n MatButton,\r\n FormsModule,\r\n MatCard,\r\n MatCardContent,\r\n ],\r\n templateUrl: './login-email.html',\r\n styleUrl: './login-email.css',\r\n})\r\nexport class LoginEmail {\r\n auth!: Auth;\r\n db: Database;\r\n confirmationResult!: ConfirmationResult;\r\n email = '';\r\n password = '';\r\n\r\n constructor(\r\n public location: Location,\r\n public router: Router,\r\n public helper: MatHelper,\r\n ) {\r\n this.auth = getAuth();\r\n this.auth.useDeviceLanguage();\r\n this.db = getDatabase();\r\n }\r\n\r\n close() {\r\n this.location.back();\r\n }\r\n\r\n login() {\r\n signInWithEmailAndPassword(this.auth, this.email, this.password)\r\n .then(async (res) => {\r\n var user = res.user;\r\n console.log(user);\r\n\r\n this.helper.presentAlert('Login successfully.', () => {\r\n // this.router.navigate(['']);\r\n this.location.back();\r\n });\r\n })\r\n .catch((error) => {\r\n console.log(error);\r\n\r\n if (error.code == 'auth/user-not-found') {\r\n this.helper.presentAlert('Email not found.');\r\n } else if (error.code == 'auth/wrong-password') {\r\n this.helper.presentAlert('Wrong password.');\r\n }\r\n });\r\n }\r\n\r\n reg() {\r\n this.router.navigate(['register-email']);\r\n }\r\n\r\n forgetPs() {\r\n this.router.navigate(['forget-password']);\r\n }\r\n}\r\n","<mat-toolbar>\r\n Login\r\n <span style=\"flex: 1 1 auto\"></span>\r\n <mat-icon (click)=\"close()\" class=\"btn-close\">close</mat-icon>\r\n</mat-toolbar>\r\n\r\n<mat-card>\r\n <mat-card-content>\r\n <div>\r\n <mat-form-field>\r\n <mat-label>Email</mat-label>\r\n <input matInput [(ngModel)]=\"email\" required />\r\n </mat-form-field>\r\n </div>\r\n <div>\r\n <mat-form-field>\r\n <mat-label>Password</mat-label>\r\n <input matInput [(ngModel)]=\"password\" required />\r\n </mat-form-field>\r\n </div>\r\n\r\n <div>\r\n <button mat-raised-button (click)=\"login()\" style=\"margin-top: 20px\">Login</button>\r\n </div>\r\n <div>\r\n <button mat-raised-button (click)=\"reg()\" style=\"margin-top: 20px\">\r\n Don't have an account? Create an account\r\n </button>\r\n </div>\r\n <div>\r\n <button mat-raised-button (click)=\"forgetPs()\" style=\"margin-top: 20px\">\r\n Forget Password\r\n </button>\r\n </div>\r\n </mat-card-content>\r\n</mat-card>\r\n","import { Component } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'lib-register-email',\r\n imports: [],\r\n templateUrl: './register-email.html',\r\n styleUrl: './register-email.css',\r\n})\r\nexport class RegisterEmail {\r\n\r\n}\r\n","<p>register-email works!</p>\r\n","import { Component } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'lib-forget-password',\r\n imports: [],\r\n templateUrl: './forget-password.html',\r\n styleUrl: './forget-password.css',\r\n})\r\nexport class ForgetPassword {\r\n\r\n}\r\n","<p>forget-password works!</p>\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\r\n// components\r\nexport * from './lib/components/mat-nav-bar/mat-nav-bar';\r\nexport * from './lib/auth/login-email/login-email';\r\nexport * from './lib/auth/register-email/register-email';\r\nexport * from './lib/auth/forget-password/forget-password';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2","i3","i4"],"mappings":"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"}
package/index.d.ts CHANGED
@@ -1,11 +1,13 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { OnInit } from '@angular/core';
3
3
  import { Cluster, SmallTeam, CG, AppUser, Title, Sheep, Attendance, MsjClassType, MsjClassBatch, MsjClassTime, MsjStudBatch, ClickAction } from 'cyc-type-def';
4
- import { User, Auth } from 'firebase/auth';
4
+ import { User, Auth, ConfirmationResult } from 'firebase/auth';
5
5
  import { Database } from 'firebase/database';
6
6
  import { Observable, ReplaySubject, Subscription } from 'rxjs';
7
7
  import * as _firebase_database from '@firebase/database';
8
8
  import { Router } from '@angular/router';
9
+ import { Location } from '@angular/common';
10
+ import { MatHelper } from 'mat-helper';
9
11
 
10
12
  declare class CycBase {
11
13
  static ɵfac: i0.ɵɵFactoryDeclaration<CycBase, never>;
@@ -342,5 +344,34 @@ declare class MatNavBar implements OnInit {
342
344
  static ɵcmp: i0.ɵɵComponentDeclaration<MatNavBar, "lib-mat-nav-bar", never, { "user": { "alias": "user"; "required": true; "isSignal": true; }; "title": { "alias": "title"; "required": true; "isSignal": true; }; "auth": { "alias": "auth"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
343
345
  }
344
346
 
345
- export { BasePage, CommonPage, CycBase, ExtendedCommonPage, FirebasePage, MatNavBar, SecurePage, SharedDb };
347
+ /** use 'login-email' path */
348
+ declare class LoginEmail {
349
+ location: Location;
350
+ router: Router;
351
+ helper: MatHelper;
352
+ auth: Auth;
353
+ db: Database;
354
+ confirmationResult: ConfirmationResult;
355
+ email: string;
356
+ password: string;
357
+ constructor(location: Location, router: Router, helper: MatHelper);
358
+ close(): void;
359
+ login(): void;
360
+ reg(): void;
361
+ forgetPs(): void;
362
+ static ɵfac: i0.ɵɵFactoryDeclaration<LoginEmail, never>;
363
+ static ɵcmp: i0.ɵɵComponentDeclaration<LoginEmail, "lib-login-email", never, {}, {}, never, never, true, never>;
364
+ }
365
+
366
+ declare class RegisterEmail {
367
+ static ɵfac: i0.ɵɵFactoryDeclaration<RegisterEmail, never>;
368
+ static ɵcmp: i0.ɵɵComponentDeclaration<RegisterEmail, "lib-register-email", never, {}, {}, never, never, true, never>;
369
+ }
370
+
371
+ declare class ForgetPassword {
372
+ static ɵfac: i0.ɵɵFactoryDeclaration<ForgetPassword, never>;
373
+ static ɵcmp: i0.ɵɵComponentDeclaration<ForgetPassword, "lib-forget-password", never, {}, {}, never, never, true, never>;
374
+ }
375
+
376
+ export { BasePage, CommonPage, CycBase, ExtendedCommonPage, FirebasePage, ForgetPassword, LoginEmail, MatNavBar, RegisterEmail, SecurePage, SharedDb };
346
377
  export type { AppData };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cyc-base",
3
- "version": "1.0.5",
3
+ "version": "1.1.0",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^20.3.0",
6
6
  "@angular/core": "^20.3.0"