@lenne.tech/ng-base 13.6.5 → 13.7.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.
Files changed (193) hide show
  1. package/base-components/base-components.module.d.ts +8 -3
  2. package/base-components/components/breadcrumb/breadcrumb.component.d.ts +10 -0
  3. package/base-components/components/checkbox/checkbox.component.d.ts +1 -1
  4. package/base-components/components/loading-bar/loading-bar.component.d.ts +5 -0
  5. package/base-components/components/select/select.component.d.ts +2 -1
  6. package/base-components/components/skeleton-loader/skeleton-loader.component.d.ts +10 -0
  7. package/base-components/components/tags/tags.component.d.ts +33 -0
  8. package/base-components/components/toast/toast.component.d.ts +18 -0
  9. package/base-components/public-api.d.ts +5 -0
  10. package/base-prototype/base-prototype.module.d.ts +6 -5
  11. package/base-prototype/pages/forgot-password/forgot-password.component.d.ts +7 -2
  12. package/base-prototype/pages/login/login.component.d.ts +8 -2
  13. package/base-prototype/pages/register/register.component.d.ts +8 -2
  14. package/esm2020/base-components/base-components.module.mjs +23 -3
  15. package/esm2020/base-components/components/breadcrumb/breadcrumb.component.mjs +17 -0
  16. package/esm2020/base-components/components/checkbox/checkbox.component.mjs +3 -3
  17. package/esm2020/base-components/components/input/input.component.mjs +3 -3
  18. package/esm2020/base-components/components/loading-bar/loading-bar.component.mjs +11 -0
  19. package/esm2020/base-components/components/select/select.component.mjs +6 -3
  20. package/esm2020/base-components/components/skeleton-loader/skeleton-loader.component.mjs +33 -0
  21. package/esm2020/base-components/components/tags/tags.component.mjs +85 -0
  22. package/esm2020/base-components/components/toast/toast.component.mjs +61 -0
  23. package/esm2020/base-components/public-api.mjs +6 -1
  24. package/esm2020/base-prototype/base-prototype.module.mjs +5 -4
  25. package/esm2020/base-prototype/pages/forgot-password/forgot-password.component.mjs +30 -9
  26. package/esm2020/base-prototype/pages/login/login.component.mjs +46 -9
  27. package/esm2020/base-prototype/pages/register/register.component.mjs +45 -11
  28. package/esm2020/public-api.mjs +1 -42
  29. package/esm2020/shared/classes/auth.class.mjs +16 -0
  30. package/esm2020/shared/classes/basic-user.class.mjs +51 -0
  31. package/esm2020/shared/classes/graphql-enum.class.mjs +9 -0
  32. package/esm2020/shared/classes/graphql-meta.class.mjs +171 -0
  33. package/esm2020/shared/classes/graphql-type.class.mjs +13 -0
  34. package/esm2020/shared/classes/helper.class.mjs +304 -0
  35. package/esm2020/shared/classes/standard.class.mjs +40 -0
  36. package/esm2020/{src → shared}/enums/comparison-operator.enum.mjs +1 -1
  37. package/esm2020/shared/enums/graphql-request-type.enum.mjs +10 -0
  38. package/esm2020/shared/enums/logical-operator.enum.mjs +10 -0
  39. package/esm2020/shared/enums/skeleton-type.enum.mjs +7 -0
  40. package/esm2020/shared/enums/sort-order.enum.mjs +6 -0
  41. package/esm2020/shared/enums/toast-type.enum.mjs +7 -0
  42. package/esm2020/shared/functions/ws-client.function.mjs +39 -0
  43. package/esm2020/shared/interfaces/base-module-config.interface.mjs +3 -0
  44. package/esm2020/shared/interfaces/breadcrumb.interface.mjs +2 -0
  45. package/esm2020/shared/interfaces/can-component-deactivate.interface.mjs +2 -0
  46. package/esm2020/shared/interfaces/combined-filter-input.interface.mjs +2 -0
  47. package/esm2020/shared/interfaces/field-object.interface.mjs +2 -0
  48. package/esm2020/shared/interfaces/field.interface.mjs +2 -0
  49. package/esm2020/shared/interfaces/filter-input.interface.mjs +2 -0
  50. package/esm2020/shared/interfaces/find-args.interface.mjs +2 -0
  51. package/esm2020/shared/interfaces/graphql-fields-object.interface.mjs +2 -0
  52. package/esm2020/shared/interfaces/graphql-options.interface.mjs +2 -0
  53. package/esm2020/shared/interfaces/graphql-plus-options.interfacen.mjs +2 -0
  54. package/esm2020/shared/interfaces/graphql-type-collection.interface.mjs +2 -0
  55. package/esm2020/shared/interfaces/single-filter-input.interface.mjs +2 -0
  56. package/esm2020/shared/interfaces/sort-input.interface.mjs +2 -0
  57. package/esm2020/shared/interfaces/time-components.interface.mjs +2 -0
  58. package/esm2020/shared/interfaces/toast.interface.mjs +2 -0
  59. package/esm2020/shared/lenne.tech-ng-base-shared.mjs +5 -0
  60. package/esm2020/shared/public-api.mjs +57 -0
  61. package/esm2020/shared/services/auth.service.mjs +71 -0
  62. package/esm2020/shared/services/breadcrumb.service.mjs +68 -0
  63. package/esm2020/shared/services/forms.service.mjs +25 -0
  64. package/esm2020/shared/services/graphql-meta.service.mjs +123 -0
  65. package/esm2020/shared/services/graphql-plus.service.mjs +84 -0
  66. package/esm2020/shared/services/graphql.service.mjs +441 -0
  67. package/esm2020/shared/services/image.service.mjs +102 -0
  68. package/esm2020/shared/services/loader.service.mjs +29 -0
  69. package/esm2020/shared/services/scroll.service.mjs +179 -0
  70. package/esm2020/shared/services/storage.service.mjs +132 -0
  71. package/esm2020/shared/services/toast.service.mjs +41 -0
  72. package/esm2020/shared/services/user.service.mjs +82 -0
  73. package/esm2020/shared/services/ws.service.mjs +16 -0
  74. package/esm2020/shared/types/graphql-fields.type.mjs +2 -0
  75. package/esm2020/shared/types/storage.type.mjs +2 -0
  76. package/esm2020/shared/validators/match.validator.mjs +19 -0
  77. package/esm2020/src/base.module.mjs +14 -11
  78. package/esm2020/src/directives/match-height.directive.mjs +2 -2
  79. package/esm2020/src/factories/apollo-options.factory.mjs +14 -12
  80. package/esm2020/src/guards/auth.guard.mjs +3 -3
  81. package/esm2020/src/guards/can-deactivate.guard.mjs +1 -1
  82. package/esm2020/src/guards/logout.guard.mjs +2 -2
  83. package/esm2020/src/services/theme.service.mjs +2 -2
  84. package/fesm2015/lenne.tech-ng-base-base-components.mjs +218 -9
  85. package/fesm2015/lenne.tech-ng-base-base-components.mjs.map +1 -1
  86. package/fesm2015/lenne.tech-ng-base-base-prototype.mjs +113 -22
  87. package/fesm2015/lenne.tech-ng-base-base-prototype.mjs.map +1 -1
  88. package/fesm2015/lenne.tech-ng-base-shared.mjs +1995 -0
  89. package/fesm2015/lenne.tech-ng-base-shared.mjs.map +1 -0
  90. package/fesm2015/lenne.tech-ng-base.mjs +57 -1799
  91. package/fesm2015/lenne.tech-ng-base.mjs.map +1 -1
  92. package/fesm2020/lenne.tech-ng-base-base-components.mjs +218 -9
  93. package/fesm2020/lenne.tech-ng-base-base-components.mjs.map +1 -1
  94. package/fesm2020/lenne.tech-ng-base-base-prototype.mjs +111 -22
  95. package/fesm2020/lenne.tech-ng-base-base-prototype.mjs.map +1 -1
  96. package/fesm2020/lenne.tech-ng-base-shared.mjs +2055 -0
  97. package/fesm2020/lenne.tech-ng-base-shared.mjs.map +1 -0
  98. package/fesm2020/lenne.tech-ng-base.mjs +57 -1854
  99. package/fesm2020/lenne.tech-ng-base.mjs.map +1 -1
  100. package/package.json +10 -2
  101. package/public-api.d.ts +0 -36
  102. package/shared/classes/auth.class.d.ts +9 -0
  103. package/{src → shared}/classes/basic-user.class.d.ts +0 -0
  104. package/{src → shared}/classes/graphql-enum.class.d.ts +0 -0
  105. package/{src → shared}/classes/graphql-meta.class.d.ts +0 -0
  106. package/{src → shared}/classes/graphql-type.class.d.ts +0 -0
  107. package/{src → shared}/classes/helper.class.d.ts +0 -0
  108. package/{src → shared}/classes/standard.class.d.ts +0 -0
  109. package/{src → shared}/enums/comparison-operator.enum.d.ts +0 -0
  110. package/{src → shared}/enums/graphql-request-type.enum.d.ts +0 -0
  111. package/{src → shared}/enums/logical-operator.enum.d.ts +0 -0
  112. package/shared/enums/skeleton-type.enum.d.ts +5 -0
  113. package/{src → shared}/enums/sort-order.enum.d.ts +0 -0
  114. package/shared/enums/toast-type.enum.d.ts +5 -0
  115. package/shared/functions/ws-client.function.d.ts +5 -0
  116. package/{src → shared}/interfaces/base-module-config.interface.d.ts +1 -1
  117. package/shared/interfaces/breadcrumb.interface.d.ts +4 -0
  118. package/{src → shared}/interfaces/can-component-deactivate.interface.d.ts +0 -0
  119. package/{src → shared}/interfaces/combined-filter-input.interface.d.ts +0 -0
  120. package/{src → shared}/interfaces/field-object.interface.d.ts +0 -0
  121. package/{src → shared}/interfaces/field.interface.d.ts +0 -0
  122. package/{src → shared}/interfaces/filter-input.interface.d.ts +0 -0
  123. package/{src → shared}/interfaces/find-args.interface.d.ts +0 -0
  124. package/{src → shared}/interfaces/graphql-fields-object.interface.d.ts +0 -0
  125. package/{src → shared}/interfaces/graphql-options.interface.d.ts +0 -0
  126. package/{src → shared}/interfaces/graphql-plus-options.interfacen.d.ts +0 -0
  127. package/{src → shared}/interfaces/graphql-type-collection.interface.d.ts +0 -0
  128. package/{src → shared}/interfaces/single-filter-input.interface.d.ts +0 -0
  129. package/{src → shared}/interfaces/sort-input.interface.d.ts +0 -0
  130. package/shared/interfaces/time-components.interface.d.ts +6 -0
  131. package/shared/interfaces/toast.interface.d.ts +8 -0
  132. package/shared/lenne.tech-ng-base-shared.d.ts +5 -0
  133. package/shared/package.json +10 -0
  134. package/shared/public-api.d.ts +49 -0
  135. package/{src → shared}/services/auth.service.d.ts +0 -0
  136. package/shared/services/breadcrumb.service.d.ts +32 -0
  137. package/{src → shared}/services/forms.service.d.ts +0 -1
  138. package/{src → shared}/services/graphql-meta.service.d.ts +0 -0
  139. package/{src → shared}/services/graphql-plus.service.d.ts +0 -0
  140. package/{src → shared}/services/graphql.service.d.ts +0 -0
  141. package/{src → shared}/services/image.service.d.ts +0 -0
  142. package/{src → shared}/services/loader.service.d.ts +0 -0
  143. package/{src → shared}/services/scroll.service.d.ts +0 -0
  144. package/{src → shared}/services/storage.service.d.ts +0 -0
  145. package/shared/services/toast.service.d.ts +15 -0
  146. package/shared/services/user.service.d.ts +42 -0
  147. package/{src → shared}/services/ws.service.d.ts +2 -2
  148. package/{src → shared}/types/graphql-fields.type.d.ts +0 -0
  149. package/{src → shared}/types/storage.type.d.ts +0 -0
  150. package/shared/validators/match.validator.d.ts +4 -0
  151. package/src/base.module.d.ts +4 -2
  152. package/src/directives/match-height.directive.d.ts +1 -1
  153. package/src/factories/apollo-options.factory.d.ts +1 -3
  154. package/src/guards/auth.guard.d.ts +1 -2
  155. package/src/guards/can-deactivate.guard.d.ts +1 -1
  156. package/src/guards/logout.guard.d.ts +1 -1
  157. package/src/services/theme.service.d.ts +1 -1
  158. package/esm2020/src/classes/basic-user.class.mjs +0 -51
  159. package/esm2020/src/classes/graphql-enum.class.mjs +0 -9
  160. package/esm2020/src/classes/graphql-meta.class.mjs +0 -171
  161. package/esm2020/src/classes/graphql-type.class.mjs +0 -13
  162. package/esm2020/src/classes/helper.class.mjs +0 -304
  163. package/esm2020/src/classes/standard.class.mjs +0 -40
  164. package/esm2020/src/enums/graphql-request-type.enum.mjs +0 -10
  165. package/esm2020/src/enums/logical-operator.enum.mjs +0 -10
  166. package/esm2020/src/enums/sort-order.enum.mjs +0 -6
  167. package/esm2020/src/interfaces/base-module-config.interface.mjs +0 -3
  168. package/esm2020/src/interfaces/can-component-deactivate.interface.mjs +0 -2
  169. package/esm2020/src/interfaces/combined-filter-input.interface.mjs +0 -2
  170. package/esm2020/src/interfaces/field-object.interface.mjs +0 -2
  171. package/esm2020/src/interfaces/field.interface.mjs +0 -2
  172. package/esm2020/src/interfaces/filter-input.interface.mjs +0 -2
  173. package/esm2020/src/interfaces/find-args.interface.mjs +0 -2
  174. package/esm2020/src/interfaces/graphql-fields-object.interface.mjs +0 -2
  175. package/esm2020/src/interfaces/graphql-options.interface.mjs +0 -2
  176. package/esm2020/src/interfaces/graphql-plus-options.interfacen.mjs +0 -2
  177. package/esm2020/src/interfaces/graphql-type-collection.interface.mjs +0 -2
  178. package/esm2020/src/interfaces/single-filter-input.interface.mjs +0 -2
  179. package/esm2020/src/interfaces/sort-input.interface.mjs +0 -2
  180. package/esm2020/src/services/auth.service.mjs +0 -71
  181. package/esm2020/src/services/forms.service.mjs +0 -26
  182. package/esm2020/src/services/graphql-meta.service.mjs +0 -123
  183. package/esm2020/src/services/graphql-plus.service.mjs +0 -84
  184. package/esm2020/src/services/graphql.service.mjs +0 -441
  185. package/esm2020/src/services/image.service.mjs +0 -102
  186. package/esm2020/src/services/loader.service.mjs +0 -29
  187. package/esm2020/src/services/scroll.service.mjs +0 -179
  188. package/esm2020/src/services/storage.service.mjs +0 -132
  189. package/esm2020/src/services/ws.service.mjs +0 -17
  190. package/esm2020/src/types/graphql-fields.type.mjs +0 -2
  191. package/esm2020/src/types/storage.type.mjs +0 -2
  192. package/esm2020/src/validators/must-match.validator.mjs +0 -22
  193. package/src/validators/must-match.validator.d.ts +0 -6
@@ -1,17 +1,22 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { Component, NgModule } from '@angular/core';
3
+ import * as i4 from '@angular/forms';
3
4
  import { FormGroup, FormControl, Validators, FormsModule, ReactiveFormsModule } from '@angular/forms';
5
+ import * as i5 from '@angular/common';
4
6
  import { CommonModule } from '@angular/common';
5
- import * as i3 from '@angular/router';
7
+ import * as i2 from '@angular/router';
6
8
  import { RouterModule } from '@angular/router';
7
- import * as i1 from '@lenne.tech/ng-base';
8
- import { MustMatch } from '@lenne.tech/ng-base';
9
- import * as i2 from '@lenne.tech/ng-base/base-components';
9
+ import * as i3 from '@lenne.tech/ng-base/base-components';
10
10
  import { BaseComponentsModule } from '@lenne.tech/ng-base/base-components';
11
+ import * as i1 from '@lenne.tech/ng-base/shared';
12
+ import { Validation } from '@lenne.tech/ng-base/shared';
13
+ import { BaseModule } from '@lenne.tech/ng-base';
11
14
 
12
15
  class LoginComponent {
13
- constructor(formsService) {
16
+ constructor(formsService, userService, router) {
14
17
  this.formsService = formsService;
18
+ this.userService = userService;
19
+ this.router = router;
15
20
  }
16
21
  ngOnInit() {
17
22
  this.createForm();
@@ -29,22 +34,57 @@ class LoginComponent {
29
34
  * Submit login form
30
35
  */
31
36
  submit() {
37
+ this.error = '';
38
+ this.loading = true;
32
39
  if (this.form.invalid) {
33
40
  this.formsService.validateAllFormFields(this.form);
41
+ this.scrollToTop();
42
+ this.loading = false;
34
43
  return;
35
44
  }
45
+ this.userService.login(this.form.value).subscribe({
46
+ next: (response) => {
47
+ if (response) {
48
+ this.router.navigate(['/main']);
49
+ this.form.reset();
50
+ }
51
+ else {
52
+ this.error = 'Etwas ist schiefgelaufen. Bitte probiere es später erneut.';
53
+ this.scrollToTop();
54
+ }
55
+ this.loading = false;
56
+ },
57
+ error: (error) => {
58
+ this.error = 'Etwas ist schiefgelaufen. Bitte probiere es später erneut.';
59
+ // Wrong password
60
+ if (error?.message?.includes('Unauthorized')) {
61
+ this.error = 'Dein Passwort ist leider falsch. Bitte überprüfe deine Eingabe!';
62
+ }
63
+ // User not found
64
+ if (error?.message?.includes('Not user found')) {
65
+ this.error = 'Es konnte kein Konto mit der E-Mail gefunden werden. Bitte gib eine gültige E-Mail ein!';
66
+ }
67
+ this.scrollToTop();
68
+ this.loading = false;
69
+ },
70
+ });
71
+ }
72
+ scrollToTop() {
73
+ window.scrollTo({ top: 0, behavior: 'smooth' });
36
74
  }
37
75
  }
38
- LoginComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: LoginComponent, deps: [{ token: i1.FormsService }], target: i0.ɵɵFactoryTarget.Component });
39
- LoginComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.3", type: LoginComponent, selector: "base-login", ngImport: i0, template: "<div class=\"d-flex justify-content-center align-items-center vh-100\">\n <div class=\"d-flex flex-column login-container\">\n <div class=\"container\">\n <base-input [id]=\"'email'\" [label]=\"'E-Mail Adresse'\" [type]=\"'email'\" [control]=\"form.get('email')\"></base-input>\n <base-input\n [id]=\"'password'\"\n [label]=\"'Passwort'\"\n [type]=\"'password'\"\n [control]=\"form.get('password')\"\n ></base-input>\n <div class=\"d-grid gap-2 text-center\">\n <button class=\"btn btn-primary\" (click)=\"submit()\">Einloggen</button>\n <hr />\n <a routerLink=\"../passwort-vergessen\">Passwort vergessen</a>\n <a routerLink=\"../registrieren\">Noch kein Konto? Dann registiere Dich jetzt!</a>\n </div>\n </div>\n </div>\n</div>\n", styles: [".login-container{width:100%;padding:20px 0}@media (min-width: 768px){.login-container{max-width:400px}}\n"], components: [{ type: i2.InputComponent, selector: "base-input", inputs: ["id", "name", "label", "placeholder", "autocomplete", "tabIndex", "control", "type", "required"] }], directives: [{ type: i3.RouterLinkWithHref, selector: "a[routerLink],area[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "preserveFragment", "skipLocationChange", "replaceUrl", "state", "relativeTo", "routerLink"] }] });
76
+ LoginComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: LoginComponent, deps: [{ token: i1.FormsService }, { token: i1.UserService }, { token: i2.Router }], target: i0.ɵɵFactoryTarget.Component });
77
+ LoginComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.3", type: LoginComponent, selector: "base-login", ngImport: i0, template: "<div class=\"d-flex justify-content-center align-items-center h-100 py-5\">\n <div class=\"d-flex flex-column login-container\">\n <div class=\"container\">\n <form [formGroup]=\"form\">\n <div class=\"alert alert-danger\" role=\"alert\" *ngIf=\"error\">\n {{ error }}\n </div>\n <base-input\n [id]=\"'email'\"\n [name]=\"'email'\"\n [label]=\"'E-Mail Adresse'\"\n [type]=\"'email'\"\n [control]=\"form.get('email')\"\n [autocomplete]=\"'email'\"\n ></base-input>\n <base-input\n [id]=\"'password'\"\n [name]=\"'password'\"\n [label]=\"'Passwort'\"\n [type]=\"'password'\"\n [autocomplete]=\"'current-password'\"\n [control]=\"form.get('password')\"\n ></base-input>\n <div class=\"d-grid gap-2 text-center\">\n <button class=\"btn btn-primary\" (click)=\"submit()\" *ngIf=\"!loading\">Einloggen</button>\n <button class=\"btn btn-primary\" type=\"button\" disabled *ngIf=\"loading\">\n <span class=\"spinner-border spinner-border-sm\" role=\"status\" aria-hidden=\"true\"></span>\n Loading...\n </button>\n <hr />\n <a routerLink=\"../passwort-vergessen\">Passwort vergessen</a>\n <a routerLink=\"../registrieren\">Noch kein Konto? Dann registiere Dich jetzt!</a>\n </div>\n </form>\n </div>\n </div>\n</div>\n", styles: [".login-container{width:100%;padding:20px 0}@media (min-width: 768px){.login-container{max-width:400px}}\n"], components: [{ type: i3.InputComponent, selector: "base-input", inputs: ["id", "name", "label", "placeholder", "autocomplete", "tabIndex", "control", "type", "required"] }], directives: [{ type: i4.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i4.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.RouterLinkWithHref, selector: "a[routerLink],area[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "preserveFragment", "skipLocationChange", "replaceUrl", "state", "relativeTo", "routerLink"] }] });
40
78
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: LoginComponent, decorators: [{
41
79
  type: Component,
42
- args: [{ selector: 'base-login', template: "<div class=\"d-flex justify-content-center align-items-center vh-100\">\n <div class=\"d-flex flex-column login-container\">\n <div class=\"container\">\n <base-input [id]=\"'email'\" [label]=\"'E-Mail Adresse'\" [type]=\"'email'\" [control]=\"form.get('email')\"></base-input>\n <base-input\n [id]=\"'password'\"\n [label]=\"'Passwort'\"\n [type]=\"'password'\"\n [control]=\"form.get('password')\"\n ></base-input>\n <div class=\"d-grid gap-2 text-center\">\n <button class=\"btn btn-primary\" (click)=\"submit()\">Einloggen</button>\n <hr />\n <a routerLink=\"../passwort-vergessen\">Passwort vergessen</a>\n <a routerLink=\"../registrieren\">Noch kein Konto? Dann registiere Dich jetzt!</a>\n </div>\n </div>\n </div>\n</div>\n", styles: [".login-container{width:100%;padding:20px 0}@media (min-width: 768px){.login-container{max-width:400px}}\n"] }]
43
- }], ctorParameters: function () { return [{ type: i1.FormsService }]; } });
80
+ args: [{ selector: 'base-login', template: "<div class=\"d-flex justify-content-center align-items-center h-100 py-5\">\n <div class=\"d-flex flex-column login-container\">\n <div class=\"container\">\n <form [formGroup]=\"form\">\n <div class=\"alert alert-danger\" role=\"alert\" *ngIf=\"error\">\n {{ error }}\n </div>\n <base-input\n [id]=\"'email'\"\n [name]=\"'email'\"\n [label]=\"'E-Mail Adresse'\"\n [type]=\"'email'\"\n [control]=\"form.get('email')\"\n [autocomplete]=\"'email'\"\n ></base-input>\n <base-input\n [id]=\"'password'\"\n [name]=\"'password'\"\n [label]=\"'Passwort'\"\n [type]=\"'password'\"\n [autocomplete]=\"'current-password'\"\n [control]=\"form.get('password')\"\n ></base-input>\n <div class=\"d-grid gap-2 text-center\">\n <button class=\"btn btn-primary\" (click)=\"submit()\" *ngIf=\"!loading\">Einloggen</button>\n <button class=\"btn btn-primary\" type=\"button\" disabled *ngIf=\"loading\">\n <span class=\"spinner-border spinner-border-sm\" role=\"status\" aria-hidden=\"true\"></span>\n Loading...\n </button>\n <hr />\n <a routerLink=\"../passwort-vergessen\">Passwort vergessen</a>\n <a routerLink=\"../registrieren\">Noch kein Konto? Dann registiere Dich jetzt!</a>\n </div>\n </form>\n </div>\n </div>\n</div>\n", styles: [".login-container{width:100%;padding:20px 0}@media (min-width: 768px){.login-container{max-width:400px}}\n"] }]
81
+ }], ctorParameters: function () { return [{ type: i1.FormsService }, { type: i1.UserService }, { type: i2.Router }]; } });
44
82
 
45
83
  class RegisterComponent {
46
- constructor(formsService) {
84
+ constructor(formsService, userService, router) {
47
85
  this.formsService = formsService;
86
+ this.userService = userService;
87
+ this.router = router;
48
88
  }
49
89
  ngOnInit() {
50
90
  this.createForm();
@@ -59,30 +99,62 @@ class RegisterComponent {
59
99
  email: new FormControl('', [Validators.required, Validators.email]),
60
100
  password: new FormControl('', Validators.required),
61
101
  passwordConfirm: new FormControl('', Validators.required),
102
+ privacy: new FormControl(false, Validators.requiredTrue),
62
103
  }, {
63
- validators: MustMatch,
104
+ validators: [Validation.match('password', 'passwordConfirm')],
64
105
  });
65
106
  }
66
107
  /**
67
108
  * Submit login form
68
109
  */
69
110
  submit() {
111
+ this.error = '';
112
+ this.loading = true;
70
113
  if (this.form.invalid) {
71
114
  this.formsService.validateAllFormFields(this.form);
115
+ this.scrollToTop();
116
+ this.loading = false;
72
117
  return;
73
118
  }
119
+ const input = this.form.value;
120
+ delete input.privacy;
121
+ this.userService.register(input).subscribe({
122
+ next: (auth) => {
123
+ if (auth) {
124
+ this.router.navigate(['/main']);
125
+ }
126
+ else {
127
+ this.error = 'Etwas ist schiefgelaufen. Bitte probiere es später erneut.';
128
+ this.scrollToTop();
129
+ }
130
+ this.loading = false;
131
+ },
132
+ error: (err) => {
133
+ if (err?.message?.includes('already exists')) {
134
+ this.error =
135
+ 'Mit dieser E-Mail gibt es bereits ein Konto. Bitte wähle eine andere E-Mail Adresse oder logge dich mit deinem Passwort ein.';
136
+ this.scrollToTop();
137
+ }
138
+ this.loading = false;
139
+ },
140
+ });
141
+ }
142
+ scrollToTop() {
143
+ window.scrollTo({ top: 0, behavior: 'smooth' });
74
144
  }
75
145
  }
76
- RegisterComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: RegisterComponent, deps: [{ token: i1.FormsService }], target: i0.ɵɵFactoryTarget.Component });
77
- RegisterComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.3", type: RegisterComponent, selector: "base-register", ngImport: i0, template: "<div class=\"d-flex justify-content-center align-items-center vh-100\">\n <div class=\"d-flex flex-column register-container\">\n <div class=\"container\">\n <base-input [id]=\"'firstName'\" [label]=\"'Vorname'\" [type]=\"'text'\" [control]=\"form.get('firstName')\"></base-input>\n <base-input [id]=\"'lastName'\" [label]=\"'Nachname'\" [type]=\"'text'\" [control]=\"form.get('lastName')\"></base-input>\n <base-input [id]=\"'email'\" [label]=\"'E-Mail Adresse'\" [type]=\"'email'\" [control]=\"form.get('email')\"></base-input>\n <base-input\n [id]=\"'password'\"\n [label]=\"'Passwort'\"\n [type]=\"'password'\"\n [control]=\"form.get('password')\"\n ></base-input>\n <base-input\n [id]=\"'password-confirm'\"\n [label]=\"'Passwort best\u00E4tigen'\"\n [type]=\"'password'\"\n [control]=\"form.get('passwordConfirm')\"\n ></base-input>\n <div class=\"d-grid gap-2 text-center\">\n <button class=\"btn btn-primary\" (click)=\"submit()\">Registrieren</button>\n <hr />\n <a routerLink=\"../login\">Bereits ein Konto? Dann logge Dich hier ein!</a>\n </div>\n </div>\n </div>\n</div>\n", styles: [".register-container{width:100%;padding:20px 0}@media (min-width: 768px){.register-container{max-width:400px}}\n"], components: [{ type: i2.InputComponent, selector: "base-input", inputs: ["id", "name", "label", "placeholder", "autocomplete", "tabIndex", "control", "type", "required"] }], directives: [{ type: i3.RouterLinkWithHref, selector: "a[routerLink],area[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "preserveFragment", "skipLocationChange", "replaceUrl", "state", "relativeTo", "routerLink"] }] });
146
+ RegisterComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: RegisterComponent, deps: [{ token: i1.FormsService }, { token: i1.UserService }, { token: i2.Router }], target: i0.ɵɵFactoryTarget.Component });
147
+ RegisterComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.3", type: RegisterComponent, selector: "base-register", ngImport: i0, template: "<div class=\"d-flex justify-content-center align-items-center h-100 py-5\">\n <div class=\"d-flex flex-column register-container\">\n <div class=\"container\">\n <form [formGroup]=\"form\">\n <div id=\"register-error\" class=\"alert alert-danger\" role=\"alert\" *ngIf=\"error\">\n {{ error }}\n </div>\n <base-input\n [id]=\"'firstName'\"\n [name]=\"'firstName'\"\n [label]=\"'Vorname'\"\n [type]=\"'text'\"\n [control]=\"form.get('firstName')\"\n [autocomplete]=\"'given-name'\"\n ></base-input>\n <base-input\n [id]=\"'lastName'\"\n [name]=\"'lastName'\"\n [label]=\"'Nachname'\"\n [type]=\"'text'\"\n [control]=\"form.get('lastName')\"\n [autocomplete]=\"'family-name'\"\n ></base-input>\n <base-input\n [id]=\"'email'\"\n [name]=\"'email'\"\n [label]=\"'E-Mail Adresse'\"\n [type]=\"'email'\"\n [control]=\"form.get('email')\"\n [autocomplete]=\"'email'\"\n ></base-input>\n <base-input\n [id]=\"'password'\"\n [name]=\"'password'\"\n [label]=\"'Passwort'\"\n [type]=\"'password'\"\n [autocomplete]=\"'new-password'\"\n [control]=\"form.get('password')\"\n ></base-input>\n <base-input\n [id]=\"'password-confirm'\"\n [name]=\"'password-confirm'\"\n [label]=\"'Passwort best\u00E4tigen'\"\n [autocomplete]=\"'new-password'\"\n [type]=\"'password'\"\n [control]=\"form.get('passwordConfirm')\"\n ></base-input>\n <base-checkbox [id]=\"'privacy'\" [control]=\"form.get('privacy')\">\n Hiermit best\u00E4tige ich, dass ich die <a routerLink=\"/datenschutz\">Datenschutzerkl\u00E4rung</a> gelesen habe und\n akzeptiere.\n </base-checkbox>\n <div class=\"d-grid gap-2 text-center\">\n <button class=\"btn btn-primary\" (click)=\"submit()\" *ngIf=\"!loading\">Registrieren</button>\n <button class=\"btn btn-primary\" type=\"button\" disabled *ngIf=\"loading\">\n <span class=\"spinner-border spinner-border-sm\" role=\"status\" aria-hidden=\"true\"></span>\n Loading...\n </button>\n <hr />\n <a routerLink=\"../login\">Bereits ein Konto? Dann logge Dich hier ein!</a>\n </div>\n </form>\n </div>\n </div>\n</div>\n", styles: [".register-container{width:100%;padding:20px 0}@media (min-width: 768px){.register-container{max-width:400px}}\n"], components: [{ type: i3.InputComponent, selector: "base-input", inputs: ["id", "name", "label", "placeholder", "autocomplete", "tabIndex", "control", "type", "required"] }, { type: i3.CheckboxComponent, selector: "base-checkbox", inputs: ["id", "name", "label", "value", "control", "required"] }], directives: [{ type: i4.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i4.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.RouterLinkWithHref, selector: "a[routerLink],area[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "preserveFragment", "skipLocationChange", "replaceUrl", "state", "relativeTo", "routerLink"] }] });
78
148
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: RegisterComponent, decorators: [{
79
149
  type: Component,
80
- args: [{ selector: 'base-register', template: "<div class=\"d-flex justify-content-center align-items-center vh-100\">\n <div class=\"d-flex flex-column register-container\">\n <div class=\"container\">\n <base-input [id]=\"'firstName'\" [label]=\"'Vorname'\" [type]=\"'text'\" [control]=\"form.get('firstName')\"></base-input>\n <base-input [id]=\"'lastName'\" [label]=\"'Nachname'\" [type]=\"'text'\" [control]=\"form.get('lastName')\"></base-input>\n <base-input [id]=\"'email'\" [label]=\"'E-Mail Adresse'\" [type]=\"'email'\" [control]=\"form.get('email')\"></base-input>\n <base-input\n [id]=\"'password'\"\n [label]=\"'Passwort'\"\n [type]=\"'password'\"\n [control]=\"form.get('password')\"\n ></base-input>\n <base-input\n [id]=\"'password-confirm'\"\n [label]=\"'Passwort best\u00E4tigen'\"\n [type]=\"'password'\"\n [control]=\"form.get('passwordConfirm')\"\n ></base-input>\n <div class=\"d-grid gap-2 text-center\">\n <button class=\"btn btn-primary\" (click)=\"submit()\">Registrieren</button>\n <hr />\n <a routerLink=\"../login\">Bereits ein Konto? Dann logge Dich hier ein!</a>\n </div>\n </div>\n </div>\n</div>\n", styles: [".register-container{width:100%;padding:20px 0}@media (min-width: 768px){.register-container{max-width:400px}}\n"] }]
81
- }], ctorParameters: function () { return [{ type: i1.FormsService }]; } });
150
+ args: [{ selector: 'base-register', template: "<div class=\"d-flex justify-content-center align-items-center h-100 py-5\">\n <div class=\"d-flex flex-column register-container\">\n <div class=\"container\">\n <form [formGroup]=\"form\">\n <div id=\"register-error\" class=\"alert alert-danger\" role=\"alert\" *ngIf=\"error\">\n {{ error }}\n </div>\n <base-input\n [id]=\"'firstName'\"\n [name]=\"'firstName'\"\n [label]=\"'Vorname'\"\n [type]=\"'text'\"\n [control]=\"form.get('firstName')\"\n [autocomplete]=\"'given-name'\"\n ></base-input>\n <base-input\n [id]=\"'lastName'\"\n [name]=\"'lastName'\"\n [label]=\"'Nachname'\"\n [type]=\"'text'\"\n [control]=\"form.get('lastName')\"\n [autocomplete]=\"'family-name'\"\n ></base-input>\n <base-input\n [id]=\"'email'\"\n [name]=\"'email'\"\n [label]=\"'E-Mail Adresse'\"\n [type]=\"'email'\"\n [control]=\"form.get('email')\"\n [autocomplete]=\"'email'\"\n ></base-input>\n <base-input\n [id]=\"'password'\"\n [name]=\"'password'\"\n [label]=\"'Passwort'\"\n [type]=\"'password'\"\n [autocomplete]=\"'new-password'\"\n [control]=\"form.get('password')\"\n ></base-input>\n <base-input\n [id]=\"'password-confirm'\"\n [name]=\"'password-confirm'\"\n [label]=\"'Passwort best\u00E4tigen'\"\n [autocomplete]=\"'new-password'\"\n [type]=\"'password'\"\n [control]=\"form.get('passwordConfirm')\"\n ></base-input>\n <base-checkbox [id]=\"'privacy'\" [control]=\"form.get('privacy')\">\n Hiermit best\u00E4tige ich, dass ich die <a routerLink=\"/datenschutz\">Datenschutzerkl\u00E4rung</a> gelesen habe und\n akzeptiere.\n </base-checkbox>\n <div class=\"d-grid gap-2 text-center\">\n <button class=\"btn btn-primary\" (click)=\"submit()\" *ngIf=\"!loading\">Registrieren</button>\n <button class=\"btn btn-primary\" type=\"button\" disabled *ngIf=\"loading\">\n <span class=\"spinner-border spinner-border-sm\" role=\"status\" aria-hidden=\"true\"></span>\n Loading...\n </button>\n <hr />\n <a routerLink=\"../login\">Bereits ein Konto? Dann logge Dich hier ein!</a>\n </div>\n </form>\n </div>\n </div>\n</div>\n", styles: [".register-container{width:100%;padding:20px 0}@media (min-width: 768px){.register-container{max-width:400px}}\n"] }]
151
+ }], ctorParameters: function () { return [{ type: i1.FormsService }, { type: i1.UserService }, { type: i2.Router }]; } });
82
152
 
83
153
  class ForgotPasswordComponent {
84
- constructor(formsService) {
154
+ constructor(formsService, userService, router) {
85
155
  this.formsService = formsService;
156
+ this.userService = userService;
157
+ this.router = router;
86
158
  }
87
159
  ngOnInit() {
88
160
  this.createForm();
@@ -99,21 +171,38 @@ class ForgotPasswordComponent {
99
171
  * Submit form
100
172
  */
101
173
  submit() {
174
+ this.loading = true;
102
175
  if (this.form.invalid) {
103
176
  this.formsService.validateAllFormFields(this.form);
177
+ this.loading = false;
104
178
  return;
105
179
  }
180
+ this.userService.requestPasswordResetMail(this.form.get('email').value).subscribe({
181
+ next: (response) => {
182
+ if (response) {
183
+ this.router.navigate(['/']);
184
+ }
185
+ else {
186
+ this.error = 'Etwas ist schiefgelaufen. Bitte probiere es später erneut.';
187
+ }
188
+ this.loading = false;
189
+ },
190
+ error: () => {
191
+ this.error = 'Etwas ist schiefgelaufen. Bitte probiere es später erneut.';
192
+ this.loading = false;
193
+ },
194
+ });
106
195
  }
107
196
  }
108
- ForgotPasswordComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: ForgotPasswordComponent, deps: [{ token: i1.FormsService }], target: i0.ɵɵFactoryTarget.Component });
109
- ForgotPasswordComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.3", type: ForgotPasswordComponent, selector: "base-forgot-password", ngImport: i0, template: "<div class=\"d-flex justify-content-center align-items-center vh-100\">\n <div class=\"d-flex flex-column login-container\">\n <div class=\"container\">\n <base-input [id]=\"'email'\" [label]=\"'E-Mail Adresse'\" [type]=\"'email'\" [control]=\"form.get('email')\"></base-input>\n <div class=\"d-grid gap-2 text-center\">\n <button class=\"btn btn-primary\" (click)=\"submit()\">E-Mail senden</button>\n <hr />\n <a routerLink=\"../login\">Bereits ein Konto? Dann logge Dich hier ein!</a>\n <a routerLink=\"../registrieren\">Noch kein Konto? Dann registiere Dich jetzt!</a>\n </div>\n </div>\n </div>\n</div>\n", styles: [""], components: [{ type: i2.InputComponent, selector: "base-input", inputs: ["id", "name", "label", "placeholder", "autocomplete", "tabIndex", "control", "type", "required"] }], directives: [{ type: i3.RouterLinkWithHref, selector: "a[routerLink],area[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "preserveFragment", "skipLocationChange", "replaceUrl", "state", "relativeTo", "routerLink"] }] });
197
+ ForgotPasswordComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: ForgotPasswordComponent, deps: [{ token: i1.FormsService }, { token: i1.UserService }, { token: i2.Router }], target: i0.ɵɵFactoryTarget.Component });
198
+ ForgotPasswordComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.3", type: ForgotPasswordComponent, selector: "base-forgot-password", ngImport: i0, template: "<div class=\"d-flex justify-content-center align-items-center h-100 py-5\">\n <div class=\"d-flex flex-column forgot-container\">\n <div class=\"container\">\n <form [formGroup]=\"form\">\n <div class=\"alert alert-danger\" role=\"alert\" *ngIf=\"error\">\n {{ error }}\n </div>\n <base-input\n [id]=\"'email'\"\n [name]=\"'email'\"\n [label]=\"'E-Mail Adresse'\"\n [type]=\"'email'\"\n [autocomplete]=\"'email'\"\n [control]=\"form.get('email')\"\n ></base-input>\n <div class=\"d-grid gap-2 text-center\">\n <button class=\"btn btn-primary\" (click)=\"submit()\" *ngIf=\"!loading\">E-Mail senden</button>\n <button class=\"btn btn-primary\" type=\"button\" disabled *ngIf=\"loading\">\n <span class=\"spinner-border spinner-border-sm\" role=\"status\" aria-hidden=\"true\"></span>\n Loading...\n </button>\n <hr />\n <a routerLink=\"../login\">Bereits ein Konto? Dann logge Dich hier ein!</a>\n <a routerLink=\"../registrieren\">Noch kein Konto? Dann registiere Dich jetzt!</a>\n </div>\n </form>\n </div>\n </div>\n</div>\n", styles: [".forgot-container{width:100%;padding:20px 0}@media (min-width: 768px){.forgot-container{max-width:400px}}\n"], components: [{ type: i3.InputComponent, selector: "base-input", inputs: ["id", "name", "label", "placeholder", "autocomplete", "tabIndex", "control", "type", "required"] }], directives: [{ type: i4.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i4.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.RouterLinkWithHref, selector: "a[routerLink],area[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "preserveFragment", "skipLocationChange", "replaceUrl", "state", "relativeTo", "routerLink"] }] });
110
199
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: ForgotPasswordComponent, decorators: [{
111
200
  type: Component,
112
- args: [{ selector: 'base-forgot-password', template: "<div class=\"d-flex justify-content-center align-items-center vh-100\">\n <div class=\"d-flex flex-column login-container\">\n <div class=\"container\">\n <base-input [id]=\"'email'\" [label]=\"'E-Mail Adresse'\" [type]=\"'email'\" [control]=\"form.get('email')\"></base-input>\n <div class=\"d-grid gap-2 text-center\">\n <button class=\"btn btn-primary\" (click)=\"submit()\">E-Mail senden</button>\n <hr />\n <a routerLink=\"../login\">Bereits ein Konto? Dann logge Dich hier ein!</a>\n <a routerLink=\"../registrieren\">Noch kein Konto? Dann registiere Dich jetzt!</a>\n </div>\n </div>\n </div>\n</div>\n", styles: [""] }]
113
- }], ctorParameters: function () { return [{ type: i1.FormsService }]; } });
201
+ args: [{ selector: 'base-forgot-password', template: "<div class=\"d-flex justify-content-center align-items-center h-100 py-5\">\n <div class=\"d-flex flex-column forgot-container\">\n <div class=\"container\">\n <form [formGroup]=\"form\">\n <div class=\"alert alert-danger\" role=\"alert\" *ngIf=\"error\">\n {{ error }}\n </div>\n <base-input\n [id]=\"'email'\"\n [name]=\"'email'\"\n [label]=\"'E-Mail Adresse'\"\n [type]=\"'email'\"\n [autocomplete]=\"'email'\"\n [control]=\"form.get('email')\"\n ></base-input>\n <div class=\"d-grid gap-2 text-center\">\n <button class=\"btn btn-primary\" (click)=\"submit()\" *ngIf=\"!loading\">E-Mail senden</button>\n <button class=\"btn btn-primary\" type=\"button\" disabled *ngIf=\"loading\">\n <span class=\"spinner-border spinner-border-sm\" role=\"status\" aria-hidden=\"true\"></span>\n Loading...\n </button>\n <hr />\n <a routerLink=\"../login\">Bereits ein Konto? Dann logge Dich hier ein!</a>\n <a routerLink=\"../registrieren\">Noch kein Konto? Dann registiere Dich jetzt!</a>\n </div>\n </form>\n </div>\n </div>\n</div>\n", styles: [".forgot-container{width:100%;padding:20px 0}@media (min-width: 768px){.forgot-container{max-width:400px}}\n"] }]
202
+ }], ctorParameters: function () { return [{ type: i1.FormsService }, { type: i1.UserService }, { type: i2.Router }]; } });
114
203
 
115
204
  // Modules
116
- const imports = [FormsModule, RouterModule, ReactiveFormsModule, CommonModule, BaseComponentsModule];
205
+ const imports = [BaseModule, FormsModule, RouterModule, ReactiveFormsModule, CommonModule, BaseComponentsModule];
117
206
  // Imported and exported elements
118
207
  const elements = [
119
208
  // Components
@@ -128,7 +217,7 @@ BasePrototypeModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", ver
128
217
  // Components
129
218
  LoginComponent,
130
219
  RegisterComponent,
131
- ForgotPasswordComponent], imports: [FormsModule, RouterModule, ReactiveFormsModule, CommonModule, BaseComponentsModule], exports: [
220
+ ForgotPasswordComponent], imports: [BaseModule, FormsModule, RouterModule, ReactiveFormsModule, CommonModule, BaseComponentsModule], exports: [
132
221
  // Components
133
222
  LoginComponent,
134
223
  RegisterComponent,
@@ -1 +1 @@
1
- {"version":3,"file":"lenne.tech-ng-base-base-prototype.mjs","sources":["../../../projects/ng-base/base-prototype/pages/login/login.component.ts","../../../projects/ng-base/base-prototype/pages/login/login.component.html","../../../projects/ng-base/base-prototype/pages/register/register.component.ts","../../../projects/ng-base/base-prototype/pages/register/register.component.html","../../../projects/ng-base/base-prototype/pages/forgot-password/forgot-password.component.ts","../../../projects/ng-base/base-prototype/pages/forgot-password/forgot-password.component.html","../../../projects/ng-base/base-prototype/base-prototype.module.ts","../../../projects/ng-base/base-prototype/public-api.ts","../../../projects/ng-base/base-prototype/lenne.tech-ng-base-base-prototype.ts"],"sourcesContent":["import { Component, OnInit } from '@angular/core';\nimport { FormControl, FormGroup, Validators } from '@angular/forms';\nimport { FormsService } from '@lenne.tech/ng-base';\n\n@Component({\n selector: 'base-login',\n templateUrl: './login.component.html',\n styleUrls: ['./login.component.scss'],\n})\nexport class LoginComponent implements OnInit {\n form: FormGroup;\n\n constructor(private formsService: FormsService) {}\n\n ngOnInit(): void {\n this.createForm();\n }\n\n /**\n * Create login form\n */\n createForm() {\n this.form = new FormGroup({\n email: new FormControl('', [Validators.required, Validators.email]),\n password: new FormControl('', Validators.required),\n });\n }\n\n /**\n * Submit login form\n */\n submit() {\n if (this.form.invalid) {\n this.formsService.validateAllFormFields(this.form);\n return;\n }\n }\n}\n","<div class=\"d-flex justify-content-center align-items-center vh-100\">\n <div class=\"d-flex flex-column login-container\">\n <div class=\"container\">\n <base-input [id]=\"'email'\" [label]=\"'E-Mail Adresse'\" [type]=\"'email'\" [control]=\"form.get('email')\"></base-input>\n <base-input\n [id]=\"'password'\"\n [label]=\"'Passwort'\"\n [type]=\"'password'\"\n [control]=\"form.get('password')\"\n ></base-input>\n <div class=\"d-grid gap-2 text-center\">\n <button class=\"btn btn-primary\" (click)=\"submit()\">Einloggen</button>\n <hr />\n <a routerLink=\"../passwort-vergessen\">Passwort vergessen</a>\n <a routerLink=\"../registrieren\">Noch kein Konto? Dann registiere Dich jetzt!</a>\n </div>\n </div>\n </div>\n</div>\n","import { Component, OnInit } from '@angular/core';\nimport { FormControl, FormGroup, Validators } from '@angular/forms';\nimport { FormsService, MustMatch } from '@lenne.tech/ng-base';\n\n@Component({\n selector: 'base-register',\n templateUrl: './register.component.html',\n styleUrls: ['./register.component.scss'],\n})\nexport class RegisterComponent implements OnInit {\n form: FormGroup;\n\n constructor(private formsService: FormsService) {}\n\n ngOnInit(): void {\n this.createForm();\n }\n\n /**\n * Create login form\n */\n createForm() {\n this.form = new FormGroup(\n {\n firstName: new FormControl('', [Validators.required]),\n lastName: new FormControl('', [Validators.required]),\n email: new FormControl('', [Validators.required, Validators.email]),\n password: new FormControl('', Validators.required),\n passwordConfirm: new FormControl('', Validators.required),\n },\n {\n validators: MustMatch,\n }\n );\n }\n\n /**\n * Submit login form\n */\n submit() {\n if (this.form.invalid) {\n this.formsService.validateAllFormFields(this.form);\n return;\n }\n }\n}\n","<div class=\"d-flex justify-content-center align-items-center vh-100\">\n <div class=\"d-flex flex-column register-container\">\n <div class=\"container\">\n <base-input [id]=\"'firstName'\" [label]=\"'Vorname'\" [type]=\"'text'\" [control]=\"form.get('firstName')\"></base-input>\n <base-input [id]=\"'lastName'\" [label]=\"'Nachname'\" [type]=\"'text'\" [control]=\"form.get('lastName')\"></base-input>\n <base-input [id]=\"'email'\" [label]=\"'E-Mail Adresse'\" [type]=\"'email'\" [control]=\"form.get('email')\"></base-input>\n <base-input\n [id]=\"'password'\"\n [label]=\"'Passwort'\"\n [type]=\"'password'\"\n [control]=\"form.get('password')\"\n ></base-input>\n <base-input\n [id]=\"'password-confirm'\"\n [label]=\"'Passwort bestätigen'\"\n [type]=\"'password'\"\n [control]=\"form.get('passwordConfirm')\"\n ></base-input>\n <div class=\"d-grid gap-2 text-center\">\n <button class=\"btn btn-primary\" (click)=\"submit()\">Registrieren</button>\n <hr />\n <a routerLink=\"../login\">Bereits ein Konto? Dann logge Dich hier ein!</a>\n </div>\n </div>\n </div>\n</div>\n","import { Component, OnInit } from '@angular/core';\nimport { FormControl, FormGroup, Validators } from '@angular/forms';\nimport { FormsService } from '@lenne.tech/ng-base';\n\n@Component({\n selector: 'base-forgot-password',\n templateUrl: './forgot-password.component.html',\n styleUrls: ['./forgot-password.component.scss'],\n})\nexport class ForgotPasswordComponent implements OnInit {\n form: FormGroup;\n\n constructor(private formsService: FormsService) {}\n\n ngOnInit(): void {\n this.createForm();\n }\n\n /**\n * Create login form\n */\n createForm() {\n this.form = new FormGroup({\n email: new FormControl('', [Validators.required, Validators.email]),\n });\n }\n\n /**\n * Submit form\n */\n submit() {\n if (this.form.invalid) {\n this.formsService.validateAllFormFields(this.form);\n return;\n }\n }\n}\n","<div class=\"d-flex justify-content-center align-items-center vh-100\">\n <div class=\"d-flex flex-column login-container\">\n <div class=\"container\">\n <base-input [id]=\"'email'\" [label]=\"'E-Mail Adresse'\" [type]=\"'email'\" [control]=\"form.get('email')\"></base-input>\n <div class=\"d-grid gap-2 text-center\">\n <button class=\"btn btn-primary\" (click)=\"submit()\">E-Mail senden</button>\n <hr />\n <a routerLink=\"../login\">Bereits ein Konto? Dann logge Dich hier ein!</a>\n <a routerLink=\"../registrieren\">Noch kein Konto? Dann registiere Dich jetzt!</a>\n </div>\n </div>\n </div>\n</div>\n","import { NgModule } from '@angular/core';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { RouterModule } from '@angular/router';\n\nimport { LoginComponent } from './pages/login/login.component';\nimport { RegisterComponent } from './pages/register/register.component';\nimport { BaseComponentsModule } from '@lenne.tech/ng-base/base-components';\nimport { ForgotPasswordComponent } from './pages/forgot-password/forgot-password.component';\n\n// Modules\nconst imports = [FormsModule, RouterModule, ReactiveFormsModule, CommonModule, BaseComponentsModule];\n\n// Imported and exported elements\nconst elements = [\n // Components\n LoginComponent,\n RegisterComponent,\n ForgotPasswordComponent,\n];\n\n@NgModule({\n declarations: elements,\n imports,\n exports: elements,\n})\nexport class BasePrototypeModule {}\n","/**\n * Exports for public API\n */\n\n// Module\nexport * from './base-prototype.module';\n\n// Pages\nexport * from './pages/login/login.component';\nexport * from './pages/register/register.component';\nexport * from './pages/forgot-password/forgot-password.component';\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":"lenne.tech-ng-base-base-prototype.mjs","sources":["../../../projects/ng-base/base-prototype/pages/login/login.component.ts","../../../projects/ng-base/base-prototype/pages/login/login.component.html","../../../projects/ng-base/base-prototype/pages/register/register.component.ts","../../../projects/ng-base/base-prototype/pages/register/register.component.html","../../../projects/ng-base/base-prototype/pages/forgot-password/forgot-password.component.ts","../../../projects/ng-base/base-prototype/pages/forgot-password/forgot-password.component.html","../../../projects/ng-base/base-prototype/base-prototype.module.ts","../../../projects/ng-base/base-prototype/public-api.ts","../../../projects/ng-base/base-prototype/lenne.tech-ng-base-base-prototype.ts"],"sourcesContent":["import { Component, OnInit } from '@angular/core';\nimport { FormControl, FormGroup, Validators } from '@angular/forms';\nimport { Router } from '@angular/router';\nimport { FormsService, UserService } from '@lenne.tech/ng-base/shared';\n\n@Component({\n selector: 'base-login',\n templateUrl: './login.component.html',\n styleUrls: ['./login.component.scss'],\n})\nexport class LoginComponent implements OnInit {\n form: FormGroup;\n error: string;\n loading: boolean;\n\n constructor(private formsService: FormsService, private userService: UserService, private router: Router) {}\n\n ngOnInit(): void {\n this.createForm();\n }\n\n /**\n * Create login form\n */\n createForm() {\n this.form = new FormGroup({\n email: new FormControl('', [Validators.required, Validators.email]),\n password: new FormControl('', Validators.required),\n });\n }\n\n /**\n * Submit login form\n */\n submit() {\n this.error = '';\n this.loading = true;\n\n if (this.form.invalid) {\n this.formsService.validateAllFormFields(this.form);\n this.scrollToTop();\n this.loading = false;\n return;\n }\n\n this.userService.login(this.form.value).subscribe({\n next: (response) => {\n if (response) {\n this.router.navigate(['/main']);\n this.form.reset();\n } else {\n this.error = 'Etwas ist schiefgelaufen. Bitte probiere es später erneut.';\n this.scrollToTop();\n }\n this.loading = false;\n },\n error: (error) => {\n this.error = 'Etwas ist schiefgelaufen. Bitte probiere es später erneut.';\n\n // Wrong password\n if (error?.message?.includes('Unauthorized')) {\n this.error = 'Dein Passwort ist leider falsch. Bitte überprüfe deine Eingabe!';\n }\n\n // User not found\n if (error?.message?.includes('Not user found')) {\n this.error = 'Es konnte kein Konto mit der E-Mail gefunden werden. Bitte gib eine gültige E-Mail ein!';\n }\n\n this.scrollToTop();\n this.loading = false;\n },\n });\n }\n\n scrollToTop() {\n window.scrollTo({ top: 0, behavior: 'smooth' });\n }\n}\n","<div class=\"d-flex justify-content-center align-items-center h-100 py-5\">\n <div class=\"d-flex flex-column login-container\">\n <div class=\"container\">\n <form [formGroup]=\"form\">\n <div class=\"alert alert-danger\" role=\"alert\" *ngIf=\"error\">\n {{ error }}\n </div>\n <base-input\n [id]=\"'email'\"\n [name]=\"'email'\"\n [label]=\"'E-Mail Adresse'\"\n [type]=\"'email'\"\n [control]=\"form.get('email')\"\n [autocomplete]=\"'email'\"\n ></base-input>\n <base-input\n [id]=\"'password'\"\n [name]=\"'password'\"\n [label]=\"'Passwort'\"\n [type]=\"'password'\"\n [autocomplete]=\"'current-password'\"\n [control]=\"form.get('password')\"\n ></base-input>\n <div class=\"d-grid gap-2 text-center\">\n <button class=\"btn btn-primary\" (click)=\"submit()\" *ngIf=\"!loading\">Einloggen</button>\n <button class=\"btn btn-primary\" type=\"button\" disabled *ngIf=\"loading\">\n <span class=\"spinner-border spinner-border-sm\" role=\"status\" aria-hidden=\"true\"></span>\n Loading...\n </button>\n <hr />\n <a routerLink=\"../passwort-vergessen\">Passwort vergessen</a>\n <a routerLink=\"../registrieren\">Noch kein Konto? Dann registiere Dich jetzt!</a>\n </div>\n </form>\n </div>\n </div>\n</div>\n","import { Component, OnInit } from '@angular/core';\nimport { FormControl, FormGroup, Validators } from '@angular/forms';\nimport { FormsService, UserService, Validation } from '@lenne.tech/ng-base/shared';\nimport { Router } from '@angular/router';\n\n@Component({\n selector: 'base-register',\n templateUrl: './register.component.html',\n styleUrls: ['./register.component.scss'],\n})\nexport class RegisterComponent implements OnInit {\n form: FormGroup;\n error: string;\n loading: boolean;\n\n constructor(private formsService: FormsService, private userService: UserService, private router: Router) {}\n\n ngOnInit(): void {\n this.createForm();\n }\n\n /**\n * Create login form\n */\n createForm() {\n this.form = new FormGroup(\n {\n firstName: new FormControl('', [Validators.required]),\n lastName: new FormControl('', [Validators.required]),\n email: new FormControl('', [Validators.required, Validators.email]),\n password: new FormControl('', Validators.required),\n passwordConfirm: new FormControl('', Validators.required),\n privacy: new FormControl(false, Validators.requiredTrue),\n },\n {\n validators: [Validation.match('password', 'passwordConfirm')],\n }\n );\n }\n\n /**\n * Submit login form\n */\n submit() {\n this.error = '';\n this.loading = true;\n\n if (this.form.invalid) {\n this.formsService.validateAllFormFields(this.form);\n this.scrollToTop();\n this.loading = false;\n return;\n }\n\n const input = this.form.value;\n delete input.privacy;\n\n this.userService.register(input).subscribe({\n next: (auth) => {\n if (auth) {\n this.router.navigate(['/main']);\n } else {\n this.error = 'Etwas ist schiefgelaufen. Bitte probiere es später erneut.';\n this.scrollToTop();\n }\n this.loading = false;\n },\n error: (err) => {\n if (err?.message?.includes('already exists')) {\n this.error =\n 'Mit dieser E-Mail gibt es bereits ein Konto. Bitte wähle eine andere E-Mail Adresse oder logge dich mit deinem Passwort ein.';\n this.scrollToTop();\n }\n\n this.loading = false;\n },\n });\n }\n\n scrollToTop() {\n window.scrollTo({ top: 0, behavior: 'smooth' });\n }\n}\n","<div class=\"d-flex justify-content-center align-items-center h-100 py-5\">\n <div class=\"d-flex flex-column register-container\">\n <div class=\"container\">\n <form [formGroup]=\"form\">\n <div id=\"register-error\" class=\"alert alert-danger\" role=\"alert\" *ngIf=\"error\">\n {{ error }}\n </div>\n <base-input\n [id]=\"'firstName'\"\n [name]=\"'firstName'\"\n [label]=\"'Vorname'\"\n [type]=\"'text'\"\n [control]=\"form.get('firstName')\"\n [autocomplete]=\"'given-name'\"\n ></base-input>\n <base-input\n [id]=\"'lastName'\"\n [name]=\"'lastName'\"\n [label]=\"'Nachname'\"\n [type]=\"'text'\"\n [control]=\"form.get('lastName')\"\n [autocomplete]=\"'family-name'\"\n ></base-input>\n <base-input\n [id]=\"'email'\"\n [name]=\"'email'\"\n [label]=\"'E-Mail Adresse'\"\n [type]=\"'email'\"\n [control]=\"form.get('email')\"\n [autocomplete]=\"'email'\"\n ></base-input>\n <base-input\n [id]=\"'password'\"\n [name]=\"'password'\"\n [label]=\"'Passwort'\"\n [type]=\"'password'\"\n [autocomplete]=\"'new-password'\"\n [control]=\"form.get('password')\"\n ></base-input>\n <base-input\n [id]=\"'password-confirm'\"\n [name]=\"'password-confirm'\"\n [label]=\"'Passwort bestätigen'\"\n [autocomplete]=\"'new-password'\"\n [type]=\"'password'\"\n [control]=\"form.get('passwordConfirm')\"\n ></base-input>\n <base-checkbox [id]=\"'privacy'\" [control]=\"form.get('privacy')\">\n Hiermit bestätige ich, dass ich die <a routerLink=\"/datenschutz\">Datenschutzerklärung</a> gelesen habe und\n akzeptiere.\n </base-checkbox>\n <div class=\"d-grid gap-2 text-center\">\n <button class=\"btn btn-primary\" (click)=\"submit()\" *ngIf=\"!loading\">Registrieren</button>\n <button class=\"btn btn-primary\" type=\"button\" disabled *ngIf=\"loading\">\n <span class=\"spinner-border spinner-border-sm\" role=\"status\" aria-hidden=\"true\"></span>\n Loading...\n </button>\n <hr />\n <a routerLink=\"../login\">Bereits ein Konto? Dann logge Dich hier ein!</a>\n </div>\n </form>\n </div>\n </div>\n</div>\n","import { Component, OnInit } from '@angular/core';\nimport { FormControl, FormGroup, Validators } from '@angular/forms';\nimport { FormsService, UserService } from '@lenne.tech/ng-base/shared';\nimport { Router } from '@angular/router';\n\n@Component({\n selector: 'base-forgot-password',\n templateUrl: './forgot-password.component.html',\n styleUrls: ['./forgot-password.component.scss'],\n})\nexport class ForgotPasswordComponent implements OnInit {\n form: FormGroup;\n error: string;\n loading: boolean;\n\n constructor(private formsService: FormsService, private userService: UserService, private router: Router) {}\n\n ngOnInit(): void {\n this.createForm();\n }\n\n /**\n * Create login form\n */\n createForm() {\n this.form = new FormGroup({\n email: new FormControl('', [Validators.required, Validators.email]),\n });\n }\n\n /**\n * Submit form\n */\n submit() {\n this.loading = true;\n\n if (this.form.invalid) {\n this.formsService.validateAllFormFields(this.form);\n this.loading = false;\n return;\n }\n\n this.userService.requestPasswordResetMail(this.form.get('email').value).subscribe({\n next: (response) => {\n if (response) {\n this.router.navigate(['/']);\n } else {\n this.error = 'Etwas ist schiefgelaufen. Bitte probiere es später erneut.';\n }\n this.loading = false;\n },\n error: () => {\n this.error = 'Etwas ist schiefgelaufen. Bitte probiere es später erneut.';\n this.loading = false;\n },\n });\n }\n}\n","<div class=\"d-flex justify-content-center align-items-center h-100 py-5\">\n <div class=\"d-flex flex-column forgot-container\">\n <div class=\"container\">\n <form [formGroup]=\"form\">\n <div class=\"alert alert-danger\" role=\"alert\" *ngIf=\"error\">\n {{ error }}\n </div>\n <base-input\n [id]=\"'email'\"\n [name]=\"'email'\"\n [label]=\"'E-Mail Adresse'\"\n [type]=\"'email'\"\n [autocomplete]=\"'email'\"\n [control]=\"form.get('email')\"\n ></base-input>\n <div class=\"d-grid gap-2 text-center\">\n <button class=\"btn btn-primary\" (click)=\"submit()\" *ngIf=\"!loading\">E-Mail senden</button>\n <button class=\"btn btn-primary\" type=\"button\" disabled *ngIf=\"loading\">\n <span class=\"spinner-border spinner-border-sm\" role=\"status\" aria-hidden=\"true\"></span>\n Loading...\n </button>\n <hr />\n <a routerLink=\"../login\">Bereits ein Konto? Dann logge Dich hier ein!</a>\n <a routerLink=\"../registrieren\">Noch kein Konto? Dann registiere Dich jetzt!</a>\n </div>\n </form>\n </div>\n </div>\n</div>\n","import { NgModule } from '@angular/core';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { RouterModule } from '@angular/router';\n\nimport { BaseComponentsModule } from '@lenne.tech/ng-base/base-components';\nimport { LoginComponent } from './pages/login/login.component';\nimport { RegisterComponent } from './pages/register/register.component';\nimport { ForgotPasswordComponent } from './pages/forgot-password/forgot-password.component';\nimport { BaseModule } from '@lenne.tech/ng-base';\n\n// Modules\nconst imports = [BaseModule, FormsModule, RouterModule, ReactiveFormsModule, CommonModule, BaseComponentsModule];\n\n// Imported and exported elements\nconst elements = [\n // Components\n LoginComponent,\n RegisterComponent,\n ForgotPasswordComponent,\n];\n\n@NgModule({\n declarations: elements,\n imports,\n exports: elements,\n})\nexport class BasePrototypeModule {}\n","/**\n * Exports for public API\n */\n\n// Module\nexport * from './base-prototype.module';\n\n// Pages\nexport * from './pages/login/login.component';\nexport * from './pages/register/register.component';\nexport * from './pages/forgot-password/forgot-password.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}