cyc-base 1.0.4 → 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: [""], 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,
@@ -758,9 +764,92 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
758
764
  MatButtonModule,
759
765
  MatMenuModule,
760
766
  MatIconButton,
761
- ], 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" }]
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.4",
3
+ "version": "1.1.0",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^20.3.0",
6
6
  "@angular/core": "^20.3.0"