angular-base-lib 17.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/README.md +36 -0
  2. package/esm2022/angular-base-lib.mjs +5 -0
  3. package/esm2022/index.mjs +2 -0
  4. package/esm2022/lib/forms/form-util.mjs +9 -0
  5. package/esm2022/lib/forms/index.mjs +2 -0
  6. package/esm2022/lib/index.mjs +5 -0
  7. package/esm2022/lib/model-component/action/index.mjs +2 -0
  8. package/esm2022/lib/model-component/action/model-action.mjs +2 -0
  9. package/esm2022/lib/model-component/action/model-action.type.mjs +2 -0
  10. package/esm2022/lib/model-component/base-model-detail.component.mjs +46 -0
  11. package/esm2022/lib/model-component/base-model-edit.component.mjs +8 -0
  12. package/esm2022/lib/model-component/base-model-list.component.mjs +38 -0
  13. package/esm2022/lib/model-component/base-model.component.mjs +22 -0
  14. package/esm2022/lib/model-component/base.component.mjs +15 -0
  15. package/esm2022/lib/model-component/index.mjs +6 -0
  16. package/esm2022/lib/navigation/back-button.directive.mjs +24 -0
  17. package/esm2022/lib/navigation/index.mjs +3 -0
  18. package/esm2022/lib/navigation/navigation.service.mjs +35 -0
  19. package/esm2022/lib/types/index.mjs +2 -0
  20. package/esm2022/lib/types/value-change-callback.type.mjs +2 -0
  21. package/fesm2022/angular-base-lib.mjs +191 -0
  22. package/fesm2022/angular-base-lib.mjs.map +1 -0
  23. package/index.d.ts +1 -0
  24. package/lib/forms/form-util.d.ts +4 -0
  25. package/lib/forms/index.d.ts +1 -0
  26. package/lib/index.d.ts +4 -0
  27. package/lib/model-component/action/index.d.ts +2 -0
  28. package/lib/model-component/action/model-action.d.ts +5 -0
  29. package/lib/model-component/action/model-action.type.d.ts +1 -0
  30. package/lib/model-component/base-model-detail.component.d.ts +17 -0
  31. package/lib/model-component/base-model-edit.component.d.ts +5 -0
  32. package/lib/model-component/base-model-list.component.d.ts +14 -0
  33. package/lib/model-component/base-model.component.d.ts +10 -0
  34. package/lib/model-component/base.component.d.ts +6 -0
  35. package/lib/model-component/index.d.ts +5 -0
  36. package/lib/navigation/back-button.directive.d.ts +7 -0
  37. package/lib/navigation/index.d.ts +2 -0
  38. package/lib/navigation/navigation.service.d.ts +11 -0
  39. package/lib/types/index.d.ts +1 -0
  40. package/lib/types/value-change-callback.type.d.ts +1 -0
  41. package/package.json +30 -0
package/README.md ADDED
@@ -0,0 +1,36 @@
1
+ # angular-base
2
+
3
+ Library with different abstract components and utilities that come in handy for simple angular-applications.
4
+
5
+ # base-auth-service
6
+
7
+ Includes logic to receive the current login-state/user/etc. as observables.
8
+ This abstract auth-service is used for the two included auth-guard-functions that can be used for protecting routes.
9
+
10
+ The reason behind the 'pending' auth-state is to ensure the correct state inside the auth-guard. For example if the frontend used cookies for keeping the auth state, you can check the token and then decide if the user is logged-in or logged-out after the token was validated.
11
+
12
+ ## login-in-guard
13
+
14
+ Waits until the auth state is not pending
15
+
16
+ - If the user is not logged-in, the user is redirected to the route '/auth/login' (will be customizable in the future)
17
+
18
+ ## login-out-guard
19
+
20
+ Waits until the auth state is not pending
21
+
22
+ - If the user is not logged-out, the user is redirected to the route '/' (will be customizable in the future)
23
+
24
+ # form-util
25
+
26
+ Contains static helper functions
27
+
28
+ # model-component
29
+
30
+ A collection of abstract classes(components) that can reflect the different action pages(list/add/edit) for a subject(model).
31
+
32
+ # navigation-service
33
+
34
+ Keeps track of visited pages and navigates back to the previous page if 'back' is called. If back is called on the initial page, the fallback route is used.
35
+ For example if the user is on the route '/users/edit' and clicks on the back button, the router will navigate to '/users'.
36
+ These base paths can be defined in the implementation of the base-model-components.
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './index';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci1iYXNlLWxpYi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYnMvYW5ndWxhci1iYXNlL3NyYy9hbmd1bGFyLWJhc2UtbGliLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxTQUFTLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmVyYXRlZCBidW5kbGUgaW5kZXguIERvIG5vdCBlZGl0LlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vaW5kZXgnO1xuIl19
@@ -0,0 +1,2 @@
1
+ export * from './lib';
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItYmFzZS9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxPQUFPLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2xpYic7XG4iXX0=
@@ -0,0 +1,9 @@
1
+ export class FormUtil {
2
+ static markAllControlsAsTouched(formGroup) {
3
+ Object.values(formGroup.controls).forEach((control) => {
4
+ control.patchValue(control.value);
5
+ control.markAllAsTouched();
6
+ });
7
+ }
8
+ }
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS11dGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyLWJhc2Uvc3JjL2xpYi9mb3Jtcy9mb3JtLXV0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsTUFBTSxPQUFPLFFBQVE7SUFDbkIsTUFBTSxDQUFDLHdCQUF3QixDQUFDLFNBQW9CO1FBQ2xELE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQXdCLEVBQUUsRUFBRTtZQUNyRSxPQUFPLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNsQyxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUM3QixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5leHBvcnQgY2xhc3MgRm9ybVV0aWwge1xuICBzdGF0aWMgbWFya0FsbENvbnRyb2xzQXNUb3VjaGVkKGZvcm1Hcm91cDogRm9ybUdyb3VwKTogdm9pZCB7XG4gICAgT2JqZWN0LnZhbHVlcyhmb3JtR3JvdXAuY29udHJvbHMpLmZvckVhY2goKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkgPT4ge1xuICAgICAgY29udHJvbC5wYXRjaFZhbHVlKGNvbnRyb2wudmFsdWUpO1xuICAgICAgY29udHJvbC5tYXJrQWxsQXNUb3VjaGVkKCk7XG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export { FormUtil } from './form-util';
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItYmFzZS9zcmMvbGliL2Zvcm1zL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxhQUFhLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBGb3JtVXRpbCB9IGZyb20gJy4vZm9ybS11dGlsJztcbiJdfQ==
@@ -0,0 +1,5 @@
1
+ export * from './model-component';
2
+ export * from './navigation';
3
+ export * from './forms';
4
+ export * from './types';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItYmFzZS9zcmMvbGliL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsbUJBQW1CLENBQUM7QUFDbEMsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxTQUFTLENBQUM7QUFDeEIsY0FBYyxTQUFTLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL21vZGVsLWNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL25hdmlnYXRpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9mb3Jtcyc7XG5leHBvcnQgKiBmcm9tICcuL3R5cGVzJztcbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItYmFzZS9zcmMvbGliL21vZGVsLWNvbXBvbmVudC9hY3Rpb24vaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IE1vZGVsQWN0aW9uVHlwZSB9IGZyb20gJy4vbW9kZWwtYWN0aW9uLnR5cGUnO1xuZXhwb3J0IHsgTW9kZWxBY3Rpb24gfSBmcm9tICcuL21vZGVsLWFjdGlvbic7XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwtYWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyLWJhc2Uvc3JjL2xpYi9tb2RlbC1jb21wb25lbnQvYWN0aW9uL21vZGVsLWFjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTW9kZWxBY3Rpb25UeXBlIH0gZnJvbSAnLi9tb2RlbC1hY3Rpb24udHlwZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZWxBY3Rpb248VD4ge1xuICByZWFkb25seSBhY3Rpb246IE1vZGVsQWN0aW9uVHlwZTtcbiAgcmVhZG9ubHkgbW9kZWw6IFQ7XG59XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwtYWN0aW9uLnR5cGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItYmFzZS9zcmMvbGliL21vZGVsLWNvbXBvbmVudC9hY3Rpb24vbW9kZWwtYWN0aW9uLnR5cGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIE1vZGVsQWN0aW9uVHlwZSA9ICdzaG93JyB8ICdkZWxldGUnIHwgJ2VkaXQnIHwgJ2Rvd25sb2FkJyB8ICdiYWNrX3RvLWxpc3QnO1xuIl19
@@ -0,0 +1,46 @@
1
+ import { inject } from '@angular/core';
2
+ import { Router } from '@angular/router';
3
+ import { NavigationService } from '../navigation/navigation.service';
4
+ export class BaseModelDetailComponent {
5
+ constructor(baseRoute) {
6
+ this.baseRoute = baseRoute;
7
+ this.model = null;
8
+ this.router = inject(Router);
9
+ this.navigationService = inject(NavigationService);
10
+ }
11
+ handleModelAction(modelAction) {
12
+ switch (modelAction.action) {
13
+ case 'show':
14
+ this.showList();
15
+ break;
16
+ case 'edit':
17
+ this.editModel();
18
+ break;
19
+ case 'delete':
20
+ this.deleteModel();
21
+ break;
22
+ }
23
+ }
24
+ showList() {
25
+ this.router.navigate([this.baseRoute]);
26
+ }
27
+ async editModel() {
28
+ if (!this.model) {
29
+ return;
30
+ }
31
+ await this.router.navigate([`${this.baseRoute}/edit`, this.model.id]);
32
+ }
33
+ async deleteModel() {
34
+ const model = this.model;
35
+ if (!model) {
36
+ return;
37
+ }
38
+ if (await this.handleDeleteModel(model)) {
39
+ await this.router.navigate([`${this.baseRoute}`]);
40
+ }
41
+ }
42
+ goBack() {
43
+ this.navigationService.back(this.baseRoute);
44
+ }
45
+ }
46
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1tb2RlbC1kZXRhaWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyLWJhc2Uvc3JjL2xpYi9tb2RlbC1jb21wb25lbnQvYmFzZS1tb2RlbC1kZXRhaWwuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBSXJFLE1BQU0sT0FBZ0Isd0JBQXdCO0lBTTVDLFlBQWdDLFNBQWlCO1FBQWpCLGNBQVMsR0FBVCxTQUFTLENBQVE7UUFMakQsVUFBSyxHQUFjLElBQUksQ0FBQztRQUVMLFdBQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDeEIsc0JBQWlCLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFFYixDQUFDO0lBRXJELGlCQUFpQixDQUFDLFdBQTRCO1FBQzVDLFFBQVEsV0FBVyxDQUFDLE1BQU0sRUFBRTtZQUMxQixLQUFLLE1BQU07Z0JBQ1QsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUNoQixNQUFNO1lBRVIsS0FBSyxNQUFNO2dCQUNULElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDakIsTUFBTTtZQUVSLEtBQUssUUFBUTtnQkFDWCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ25CLE1BQU07U0FDVDtJQUNILENBQUM7SUFFRCxRQUFRO1FBQ04sSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQsS0FBSyxDQUFDLFNBQVM7UUFDYixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNmLE9BQU87U0FDUjtRQUVELE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLE9BQU8sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUVELEtBQUssQ0FBQyxXQUFXO1FBQ2YsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUV6QixJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ1YsT0FBTztTQUNSO1FBRUQsSUFBSSxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUN2QyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQ25EO0lBQ0gsQ0FBQztJQUVELE1BQU07UUFDSixJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM5QyxDQUFDO0NBR0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBOYXZpZ2F0aW9uU2VydmljZSB9IGZyb20gJy4uL25hdmlnYXRpb24vbmF2aWdhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IE1vZGVsQWN0aW9uIH0gZnJvbSAnLi9hY3Rpb24nO1xuaW1wb3J0IHsgSWRlbnRpZmlhYmxlIH0gZnJvbSAnYW5ndWxhci1iYXNlLWRhbyc7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlTW9kZWxEZXRhaWxDb21wb25lbnQ8VE0gZXh0ZW5kcyBJZGVudGlmaWFibGU+IHtcbiAgbW9kZWw6IFRNIHwgbnVsbCA9IG51bGw7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJvdXRlciA9IGluamVjdChSb3V0ZXIpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgbmF2aWdhdGlvblNlcnZpY2UgPSBpbmplY3QoTmF2aWdhdGlvblNlcnZpY2UpO1xuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgYmFzZVJvdXRlOiBzdHJpbmcpIHt9XG5cbiAgaGFuZGxlTW9kZWxBY3Rpb24obW9kZWxBY3Rpb246IE1vZGVsQWN0aW9uPFRNPik6IHZvaWQge1xuICAgIHN3aXRjaCAobW9kZWxBY3Rpb24uYWN0aW9uKSB7XG4gICAgICBjYXNlICdzaG93JzpcbiAgICAgICAgdGhpcy5zaG93TGlzdCgpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnZWRpdCc6XG4gICAgICAgIHRoaXMuZWRpdE1vZGVsKCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdkZWxldGUnOlxuICAgICAgICB0aGlzLmRlbGV0ZU1vZGVsKCk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHNob3dMaXN0KCk6IHZvaWQge1xuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFt0aGlzLmJhc2VSb3V0ZV0pO1xuICB9XG5cbiAgYXN5bmMgZWRpdE1vZGVsKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5tb2RlbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMucm91dGVyLm5hdmlnYXRlKFtgJHt0aGlzLmJhc2VSb3V0ZX0vZWRpdGAsIHRoaXMubW9kZWwuaWRdKTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZU1vZGVsKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG1vZGVsID0gdGhpcy5tb2RlbDtcblxuICAgIGlmICghbW9kZWwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoYXdhaXQgdGhpcy5oYW5kbGVEZWxldGVNb2RlbChtb2RlbCkpIHtcbiAgICAgIGF3YWl0IHRoaXMucm91dGVyLm5hdmlnYXRlKFtgJHt0aGlzLmJhc2VSb3V0ZX1gXSk7XG4gICAgfVxuICB9XG5cbiAgZ29CYWNrKCk6IHZvaWQge1xuICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuYmFjayh0aGlzLmJhc2VSb3V0ZSk7XG4gIH1cblxuICBhYnN0cmFjdCBoYW5kbGVEZWxldGVNb2RlbChtb2RlbDogVE0pOiBQcm9taXNlPGJvb2xlYW4+O1xufVxuIl19
@@ -0,0 +1,8 @@
1
+ import { BaseModelComponent } from './base-model.component';
2
+ export class BaseModelEditComponent extends BaseModelComponent {
3
+ constructor() {
4
+ super(...arguments);
5
+ this.model = null;
6
+ }
7
+ }
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1tb2RlbC1lZGl0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYW5ndWxhci1iYXNlL3NyYy9saWIvbW9kZWwtY29tcG9uZW50L2Jhc2UtbW9kZWwtZWRpdC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFHNUQsTUFBTSxPQUFnQixzQkFBZ0QsU0FBUSxrQkFBc0I7SUFBcEc7O1FBQ0UsVUFBSyxHQUFjLElBQUksQ0FBQztJQUMxQixDQUFDO0NBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCYXNlTW9kZWxDb21wb25lbnQgfSBmcm9tICcuL2Jhc2UtbW9kZWwuY29tcG9uZW50JztcbmltcG9ydCB7IElkZW50aWZpYWJsZSB9IGZyb20gJ2FuZ3VsYXItYmFzZS1kYW8nO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZU1vZGVsRWRpdENvbXBvbmVudDxUTSBleHRlbmRzIElkZW50aWZpYWJsZT4gZXh0ZW5kcyBCYXNlTW9kZWxDb21wb25lbnQ8VE0+IHtcbiAgbW9kZWw6IFRNIHwgbnVsbCA9IG51bGw7XG59XG4iXX0=
@@ -0,0 +1,38 @@
1
+ import { BaseModelComponent } from './base-model.component';
2
+ import { MatTableDataSource } from '@angular/material/table';
3
+ export class BaseModelListComponent extends BaseModelComponent {
4
+ constructor(baseRoute) {
5
+ super(baseRoute);
6
+ this.dataSource = new MatTableDataSource([]);
7
+ this.backRoute = '/';
8
+ }
9
+ handleModelAction(modelAction) {
10
+ switch (modelAction.action) {
11
+ case 'show':
12
+ this.showDetail(modelAction.model.id);
13
+ break;
14
+ case 'edit':
15
+ this.editModel(modelAction.model.id);
16
+ break;
17
+ case 'delete':
18
+ this.deleteModel(modelAction.model);
19
+ break;
20
+ }
21
+ }
22
+ showDetail(id) {
23
+ this.router.navigate([this.baseRoute, id]);
24
+ }
25
+ editModel(id) {
26
+ this.router.navigate([`${this.baseRoute}/edit`, id]);
27
+ }
28
+ createModel() {
29
+ this.router.navigate([`${this.baseRoute}/add`]);
30
+ }
31
+ async deleteModel(model) {
32
+ const [deleted, newList] = await this.handleModelDelete(model);
33
+ if (deleted && newList) {
34
+ this.dataSource.data = newList;
35
+ }
36
+ }
37
+ }
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1tb2RlbC1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYW5ndWxhci1iYXNlL3NyYy9saWIvbW9kZWwtY29tcG9uZW50L2Jhc2UtbW9kZWwtbGlzdC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDNUQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFJN0QsTUFBTSxPQUFnQixzQkFBZ0QsU0FBUSxrQkFBc0I7SUFHbEcsWUFBc0IsU0FBaUI7UUFDckMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBSFYsZUFBVSxHQUFHLElBQUksa0JBQWtCLENBQUssRUFBRSxDQUFDLENBQUM7UUFLbkQsSUFBSSxDQUFDLFNBQVMsR0FBRyxHQUFHLENBQUM7SUFDdkIsQ0FBQztJQUVRLGlCQUFpQixDQUFDLFdBQTRCO1FBQ3JELFFBQVEsV0FBVyxDQUFDLE1BQU0sRUFBRTtZQUMxQixLQUFLLE1BQU07Z0JBQ1QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUN0QyxNQUFNO1lBRVIsS0FBSyxNQUFNO2dCQUNULElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDckMsTUFBTTtZQUVSLEtBQUssUUFBUTtnQkFDWCxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDcEMsTUFBTTtTQUNUO0lBQ0gsQ0FBQztJQUVELFVBQVUsQ0FBQyxFQUFTO1FBQ2xCLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRCxTQUFTLENBQUMsRUFBUztRQUNqQixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQsS0FBSyxDQUFDLFdBQVcsQ0FBQyxLQUFTO1FBQ3pCLE1BQU0sQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLEdBQUcsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0QsSUFBSSxPQUFPLElBQUksT0FBTyxFQUFFO1lBQ3RCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQztTQUNoQztJQUNILENBQUM7Q0FHRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJhc2VNb2RlbENvbXBvbmVudCB9IGZyb20gJy4vYmFzZS1tb2RlbC5jb21wb25lbnQnO1xuaW1wb3J0IHsgTWF0VGFibGVEYXRhU291cmNlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFibGUnO1xuaW1wb3J0IHsgTW9kZWxBY3Rpb24gfSBmcm9tICcuL2FjdGlvbic7XG5pbXBvcnQgeyBEYW9JZCwgSWRlbnRpZmlhYmxlIH0gZnJvbSAnYW5ndWxhci1iYXNlLWRhbyc7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlTW9kZWxMaXN0Q29tcG9uZW50PFRNIGV4dGVuZHMgSWRlbnRpZmlhYmxlPiBleHRlbmRzIEJhc2VNb2RlbENvbXBvbmVudDxUTT4ge1xuICByZWFkb25seSBkYXRhU291cmNlID0gbmV3IE1hdFRhYmxlRGF0YVNvdXJjZTxUTT4oW10pO1xuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihiYXNlUm91dGU6IHN0cmluZykge1xuICAgIHN1cGVyKGJhc2VSb3V0ZSk7XG5cbiAgICB0aGlzLmJhY2tSb3V0ZSA9ICcvJztcbiAgfVxuXG4gIG92ZXJyaWRlIGhhbmRsZU1vZGVsQWN0aW9uKG1vZGVsQWN0aW9uOiBNb2RlbEFjdGlvbjxUTT4pOiB2b2lkIHtcbiAgICBzd2l0Y2ggKG1vZGVsQWN0aW9uLmFjdGlvbikge1xuICAgICAgY2FzZSAnc2hvdyc6XG4gICAgICAgIHRoaXMuc2hvd0RldGFpbChtb2RlbEFjdGlvbi5tb2RlbC5pZCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdlZGl0JzpcbiAgICAgICAgdGhpcy5lZGl0TW9kZWwobW9kZWxBY3Rpb24ubW9kZWwuaWQpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnZGVsZXRlJzpcbiAgICAgICAgdGhpcy5kZWxldGVNb2RlbChtb2RlbEFjdGlvbi5tb2RlbCk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHNob3dEZXRhaWwoaWQ6IERhb0lkKTogdm9pZCB7XG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW3RoaXMuYmFzZVJvdXRlLCBpZF0pO1xuICB9XG5cbiAgZWRpdE1vZGVsKGlkOiBEYW9JZCk6IHZvaWQge1xuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtgJHt0aGlzLmJhc2VSb3V0ZX0vZWRpdGAsIGlkXSk7XG4gIH1cblxuICBjcmVhdGVNb2RlbCgpOiB2b2lkIHtcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbYCR7dGhpcy5iYXNlUm91dGV9L2FkZGBdKTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZU1vZGVsKG1vZGVsOiBUTSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IFtkZWxldGVkLCBuZXdMaXN0XSA9IGF3YWl0IHRoaXMuaGFuZGxlTW9kZWxEZWxldGUobW9kZWwpO1xuICAgIGlmIChkZWxldGVkICYmIG5ld0xpc3QpIHtcbiAgICAgIHRoaXMuZGF0YVNvdXJjZS5kYXRhID0gbmV3TGlzdDtcbiAgICB9XG4gIH1cblxuICBhYnN0cmFjdCBoYW5kbGVNb2RlbERlbGV0ZShtb2RlbDogVE0pOiBQcm9taXNlPFtib29sZWFuLCBUTVtdXT47XG59XG4iXX0=
@@ -0,0 +1,22 @@
1
+ import { Router } from '@angular/router';
2
+ import { BaseComponent } from './base.component';
3
+ import { inject } from '@angular/core';
4
+ export class BaseModelComponent extends BaseComponent {
5
+ constructor(baseRoute) {
6
+ super();
7
+ this.baseRoute = baseRoute;
8
+ this.router = inject(Router);
9
+ this.backRoute = this.baseRoute;
10
+ }
11
+ showList() {
12
+ this.router.navigate([this.baseRoute]);
13
+ }
14
+ handleModelAction(modelAction) {
15
+ switch (modelAction.action) {
16
+ case 'back_to-list':
17
+ this.showList();
18
+ break;
19
+ }
20
+ }
21
+ }
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1tb2RlbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItYmFzZS9zcmMvbGliL21vZGVsLWNvbXBvbmVudC9iYXNlLW1vZGVsLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHdkMsTUFBTSxPQUFnQixrQkFBdUIsU0FBUSxhQUFhO0lBR2hFLFlBQWdDLFNBQWlCO1FBQy9DLEtBQUssRUFBRSxDQUFDO1FBRHNCLGNBQVMsR0FBVCxTQUFTLENBQVE7UUFGOUIsV0FBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUl6QyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDbEMsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxXQUE0QjtRQUM1QyxRQUFRLFdBQVcsQ0FBQyxNQUFNLEVBQUU7WUFDMUIsS0FBSyxjQUFjO2dCQUNqQixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ2hCLE1BQU07U0FDVDtJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBCYXNlQ29tcG9uZW50IH0gZnJvbSAnLi9iYXNlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1vZGVsQWN0aW9uIH0gZnJvbSAnLi9hY3Rpb24nO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZU1vZGVsQ29tcG9uZW50PFRNPiBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcm91dGVyID0gaW5qZWN0KFJvdXRlcik7XG5cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBiYXNlUm91dGU6IHN0cmluZykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5iYWNrUm91dGUgPSB0aGlzLmJhc2VSb3V0ZTtcbiAgfVxuXG4gIHNob3dMaXN0KCk6IHZvaWQge1xuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFt0aGlzLmJhc2VSb3V0ZV0pO1xuICB9XG5cbiAgaGFuZGxlTW9kZWxBY3Rpb24obW9kZWxBY3Rpb246IE1vZGVsQWN0aW9uPFRNPik6IHZvaWQge1xuICAgIHN3aXRjaCAobW9kZWxBY3Rpb24uYWN0aW9uKSB7XG4gICAgICBjYXNlICdiYWNrX3RvLWxpc3QnOlxuICAgICAgICB0aGlzLnNob3dMaXN0KCk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxufVxuIl19
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Component used for all pages that can directly navigate back to the home page if no other route was found
3
+ */
4
+ import { inject } from '@angular/core';
5
+ import { NavigationService } from '../navigation/navigation.service';
6
+ export class BaseComponent {
7
+ constructor() {
8
+ this.backRoute = '/';
9
+ this.navigationService = inject(NavigationService);
10
+ }
11
+ goBack() {
12
+ this.navigationService.back(this.backRoute);
13
+ }
14
+ }
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItYmFzZS9zcmMvbGliL21vZGVsLWNvbXBvbmVudC9iYXNlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUNILE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFFckUsTUFBTSxPQUFnQixhQUFhO0lBQW5DO1FBQ0UsY0FBUyxHQUFHLEdBQUcsQ0FBQztRQUVHLHNCQUFpQixHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBS25FLENBQUM7SUFIQyxNQUFNO1FBQ0osSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDOUMsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb21wb25lbnQgdXNlZCBmb3IgYWxsIHBhZ2VzIHRoYXQgY2FuIGRpcmVjdGx5IG5hdmlnYXRlIGJhY2sgdG8gdGhlIGhvbWUgcGFnZSBpZiBubyBvdGhlciByb3V0ZSB3YXMgZm91bmRcbiAqL1xuaW1wb3J0IHsgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOYXZpZ2F0aW9uU2VydmljZSB9IGZyb20gJy4uL25hdmlnYXRpb24vbmF2aWdhdGlvbi5zZXJ2aWNlJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VDb21wb25lbnQge1xuICBiYWNrUm91dGUgPSAnLyc7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG5hdmlnYXRpb25TZXJ2aWNlID0gaW5qZWN0KE5hdmlnYXRpb25TZXJ2aWNlKTtcblxuICBnb0JhY2soKTogdm9pZCB7XG4gICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5iYWNrKHRoaXMuYmFja1JvdXRlKTtcbiAgfVxufVxuIl19
@@ -0,0 +1,6 @@
1
+ export { BaseModelDetailComponent } from './base-model-detail.component';
2
+ export { BaseModelEditComponent } from './base-model-edit.component';
3
+ export { BaseModelComponent } from './base-model.component';
4
+ export { BaseModelListComponent } from './base-model-list.component';
5
+ export { BaseComponent } from './base.component';
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItYmFzZS9zcmMvbGliL21vZGVsLWNvbXBvbmVudC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNyRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM1RCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNyRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0JBQWtCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBCYXNlTW9kZWxEZXRhaWxDb21wb25lbnQgfSBmcm9tICcuL2Jhc2UtbW9kZWwtZGV0YWlsLmNvbXBvbmVudCc7XG5leHBvcnQgeyBCYXNlTW9kZWxFZGl0Q29tcG9uZW50IH0gZnJvbSAnLi9iYXNlLW1vZGVsLWVkaXQuY29tcG9uZW50JztcbmV4cG9ydCB7IEJhc2VNb2RlbENvbXBvbmVudCB9IGZyb20gJy4vYmFzZS1tb2RlbC5jb21wb25lbnQnO1xuZXhwb3J0IHsgQmFzZU1vZGVsTGlzdENvbXBvbmVudCB9IGZyb20gJy4vYmFzZS1tb2RlbC1saXN0LmNvbXBvbmVudCc7XG5leHBvcnQgeyBCYXNlQ29tcG9uZW50IH0gZnJvbSAnLi9iYXNlLmNvbXBvbmVudCc7XG4iXX0=
@@ -0,0 +1,24 @@
1
+ import { Directive, HostListener, inject } from '@angular/core';
2
+ import { NavigationService } from './navigation.service';
3
+ import * as i0 from "@angular/core";
4
+ export class BackButtonDirective {
5
+ constructor() {
6
+ this.navigation = inject(NavigationService);
7
+ }
8
+ onClick() {
9
+ this.navigation.back();
10
+ }
11
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.2", ngImport: i0, type: BackButtonDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
12
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.0.2", type: BackButtonDirective, isStandalone: true, selector: "[backButton]", host: { listeners: { "click": "onClick()" } }, ngImport: i0 }); }
13
+ }
14
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.2", ngImport: i0, type: BackButtonDirective, decorators: [{
15
+ type: Directive,
16
+ args: [{
17
+ selector: '[backButton]',
18
+ standalone: true
19
+ }]
20
+ }], propDecorators: { onClick: [{
21
+ type: HostListener,
22
+ args: ['click']
23
+ }] } });
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFjay1idXR0b24uZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyLWJhc2Uvc3JjL2xpYi9uYXZpZ2F0aW9uL2JhY2stYnV0dG9uLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7O0FBTXpELE1BQU0sT0FBTyxtQkFBbUI7SUFKaEM7UUFLbUIsZUFBVSxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0tBTXpEO0lBSEMsT0FBTztRQUNMLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDekIsQ0FBQzs4R0FOVSxtQkFBbUI7a0dBQW5CLG1CQUFtQjs7MkZBQW5CLG1CQUFtQjtrQkFKL0IsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsY0FBYztvQkFDeEIsVUFBVSxFQUFFLElBQUk7aUJBQ2pCOzhCQUtDLE9BQU87c0JBRE4sWUFBWTt1QkFBQyxPQUFPIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBIb3N0TGlzdGVuZXIsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmF2aWdhdGlvblNlcnZpY2UgfSBmcm9tICcuL25hdmlnYXRpb24uc2VydmljZSc7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tiYWNrQnV0dG9uXScsXG4gIHN0YW5kYWxvbmU6IHRydWVcbn0pXG5leHBvcnQgY2xhc3MgQmFja0J1dHRvbkRpcmVjdGl2ZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgbmF2aWdhdGlvbiA9IGluamVjdChOYXZpZ2F0aW9uU2VydmljZSk7XG5cbiAgQEhvc3RMaXN0ZW5lcignY2xpY2snKVxuICBvbkNsaWNrKCk6IHZvaWQge1xuICAgIHRoaXMubmF2aWdhdGlvbi5iYWNrKCk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,3 @@
1
+ export { NavigationService } from './navigation.service';
2
+ export { BackButtonDirective } from './back-button.directive';
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItYmFzZS9zcmMvbGliL25hdmlnYXRpb24vaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDekQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBOYXZpZ2F0aW9uU2VydmljZSB9IGZyb20gJy4vbmF2aWdhdGlvbi5zZXJ2aWNlJztcbmV4cG9ydCB7IEJhY2tCdXR0b25EaXJlY3RpdmUgfSBmcm9tICcuL2JhY2stYnV0dG9uLmRpcmVjdGl2ZSc7XG4iXX0=
@@ -0,0 +1,35 @@
1
+ import { NavigationEnd, Router } from '@angular/router';
2
+ import { inject, Injectable } from '@angular/core';
3
+ import { Location } from '@angular/common';
4
+ import * as i0 from "@angular/core";
5
+ export class NavigationService {
6
+ constructor() {
7
+ this.history = [];
8
+ this.router = inject(Router);
9
+ this.location = inject(Location);
10
+ this.router.events.subscribe((event) => {
11
+ if (event instanceof NavigationEnd) {
12
+ this.history.push(event.urlAfterRedirects);
13
+ }
14
+ });
15
+ }
16
+ reset() {
17
+ this.history = [];
18
+ }
19
+ back(fallbackRoute = '/') {
20
+ this.history.pop();
21
+ if (this.history.length > 0) {
22
+ this.location.back();
23
+ }
24
+ else {
25
+ this.router.navigate([fallbackRoute]);
26
+ }
27
+ }
28
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.2", ngImport: i0, type: NavigationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
29
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.2", ngImport: i0, type: NavigationService, providedIn: 'root' }); }
30
+ }
31
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.2", ngImport: i0, type: NavigationService, decorators: [{
32
+ type: Injectable,
33
+ args: [{ providedIn: 'root' }]
34
+ }], ctorParameters: () => [] });
35
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF2aWdhdGlvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyLWJhc2Uvc3JjL2xpYi9uYXZpZ2F0aW9uL25hdmlnYXRpb24uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7QUFHM0MsTUFBTSxPQUFPLGlCQUFpQjtJQUs1QjtRQUpRLFlBQU8sR0FBYSxFQUFFLENBQUM7UUFDZCxXQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3hCLGFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7UUFHM0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDckMsSUFBSSxLQUFLLFlBQVksYUFBYSxFQUFFO2dCQUNsQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQzthQUM1QztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELEtBQUs7UUFDSCxJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztJQUNwQixDQUFDO0lBRUQsSUFBSSxDQUFDLGFBQWEsR0FBRyxHQUFHO1FBQ3RCLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDbkIsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDM0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztTQUN0QjthQUFNO1lBQ0wsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO1NBQ3ZDO0lBQ0gsQ0FBQzs4R0F4QlUsaUJBQWlCO2tIQUFqQixpQkFBaUIsY0FESixNQUFNOzsyRkFDbkIsaUJBQWlCO2tCQUQ3QixVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5hdmlnYXRpb25FbmQsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBpbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IExvY2F0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcblxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBOYXZpZ2F0aW9uU2VydmljZSB7XG4gIHByaXZhdGUgaGlzdG9yeTogc3RyaW5nW10gPSBbXTtcbiAgcHJpdmF0ZSByZWFkb25seSByb3V0ZXIgPSBpbmplY3QoUm91dGVyKTtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2NhdGlvbiA9IGluamVjdChMb2NhdGlvbik7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5yb3V0ZXIuZXZlbnRzLnN1YnNjcmliZSgoZXZlbnQpID0+IHtcbiAgICAgIGlmIChldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25FbmQpIHtcbiAgICAgICAgdGhpcy5oaXN0b3J5LnB1c2goZXZlbnQudXJsQWZ0ZXJSZWRpcmVjdHMpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5oaXN0b3J5ID0gW107XG4gIH1cblxuICBiYWNrKGZhbGxiYWNrUm91dGUgPSAnLycpOiB2b2lkIHtcbiAgICB0aGlzLmhpc3RvcnkucG9wKCk7XG4gICAgaWYgKHRoaXMuaGlzdG9yeS5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmxvY2F0aW9uLmJhY2soKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW2ZhbGxiYWNrUm91dGVdKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItYmFzZS9zcmMvbGliL3R5cGVzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBWYWx1ZUNoYW5nZUNhbGxiYWNrIH0gZnJvbSAnLi92YWx1ZS1jaGFuZ2UtY2FsbGJhY2sudHlwZSc7XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsdWUtY2hhbmdlLWNhbGxiYWNrLnR5cGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItYmFzZS9zcmMvbGliL3R5cGVzL3ZhbHVlLWNoYW5nZS1jYWxsYmFjay50eXBlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBWYWx1ZUNoYW5nZUNhbGxiYWNrPFQ+ID0gKHZhbHVlOiBUKSA9PiB2b2lkO1xuIl19
@@ -0,0 +1,191 @@
1
+ import * as i0 from '@angular/core';
2
+ import { inject, Injectable, Directive, HostListener } from '@angular/core';
3
+ import { Router, NavigationEnd } from '@angular/router';
4
+ import { Location } from '@angular/common';
5
+ import { MatTableDataSource } from '@angular/material/table';
6
+
7
+ class NavigationService {
8
+ constructor() {
9
+ this.history = [];
10
+ this.router = inject(Router);
11
+ this.location = inject(Location);
12
+ this.router.events.subscribe((event) => {
13
+ if (event instanceof NavigationEnd) {
14
+ this.history.push(event.urlAfterRedirects);
15
+ }
16
+ });
17
+ }
18
+ reset() {
19
+ this.history = [];
20
+ }
21
+ back(fallbackRoute = '/') {
22
+ this.history.pop();
23
+ if (this.history.length > 0) {
24
+ this.location.back();
25
+ }
26
+ else {
27
+ this.router.navigate([fallbackRoute]);
28
+ }
29
+ }
30
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.2", ngImport: i0, type: NavigationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
31
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.2", ngImport: i0, type: NavigationService, providedIn: 'root' }); }
32
+ }
33
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.2", ngImport: i0, type: NavigationService, decorators: [{
34
+ type: Injectable,
35
+ args: [{ providedIn: 'root' }]
36
+ }], ctorParameters: () => [] });
37
+
38
+ class BaseModelDetailComponent {
39
+ constructor(baseRoute) {
40
+ this.baseRoute = baseRoute;
41
+ this.model = null;
42
+ this.router = inject(Router);
43
+ this.navigationService = inject(NavigationService);
44
+ }
45
+ handleModelAction(modelAction) {
46
+ switch (modelAction.action) {
47
+ case 'show':
48
+ this.showList();
49
+ break;
50
+ case 'edit':
51
+ this.editModel();
52
+ break;
53
+ case 'delete':
54
+ this.deleteModel();
55
+ break;
56
+ }
57
+ }
58
+ showList() {
59
+ this.router.navigate([this.baseRoute]);
60
+ }
61
+ async editModel() {
62
+ if (!this.model) {
63
+ return;
64
+ }
65
+ await this.router.navigate([`${this.baseRoute}/edit`, this.model.id]);
66
+ }
67
+ async deleteModel() {
68
+ const model = this.model;
69
+ if (!model) {
70
+ return;
71
+ }
72
+ if (await this.handleDeleteModel(model)) {
73
+ await this.router.navigate([`${this.baseRoute}`]);
74
+ }
75
+ }
76
+ goBack() {
77
+ this.navigationService.back(this.baseRoute);
78
+ }
79
+ }
80
+
81
+ /**
82
+ * Component used for all pages that can directly navigate back to the home page if no other route was found
83
+ */
84
+ class BaseComponent {
85
+ constructor() {
86
+ this.backRoute = '/';
87
+ this.navigationService = inject(NavigationService);
88
+ }
89
+ goBack() {
90
+ this.navigationService.back(this.backRoute);
91
+ }
92
+ }
93
+
94
+ class BaseModelComponent extends BaseComponent {
95
+ constructor(baseRoute) {
96
+ super();
97
+ this.baseRoute = baseRoute;
98
+ this.router = inject(Router);
99
+ this.backRoute = this.baseRoute;
100
+ }
101
+ showList() {
102
+ this.router.navigate([this.baseRoute]);
103
+ }
104
+ handleModelAction(modelAction) {
105
+ switch (modelAction.action) {
106
+ case 'back_to-list':
107
+ this.showList();
108
+ break;
109
+ }
110
+ }
111
+ }
112
+
113
+ class BaseModelEditComponent extends BaseModelComponent {
114
+ constructor() {
115
+ super(...arguments);
116
+ this.model = null;
117
+ }
118
+ }
119
+
120
+ class BaseModelListComponent extends BaseModelComponent {
121
+ constructor(baseRoute) {
122
+ super(baseRoute);
123
+ this.dataSource = new MatTableDataSource([]);
124
+ this.backRoute = '/';
125
+ }
126
+ handleModelAction(modelAction) {
127
+ switch (modelAction.action) {
128
+ case 'show':
129
+ this.showDetail(modelAction.model.id);
130
+ break;
131
+ case 'edit':
132
+ this.editModel(modelAction.model.id);
133
+ break;
134
+ case 'delete':
135
+ this.deleteModel(modelAction.model);
136
+ break;
137
+ }
138
+ }
139
+ showDetail(id) {
140
+ this.router.navigate([this.baseRoute, id]);
141
+ }
142
+ editModel(id) {
143
+ this.router.navigate([`${this.baseRoute}/edit`, id]);
144
+ }
145
+ createModel() {
146
+ this.router.navigate([`${this.baseRoute}/add`]);
147
+ }
148
+ async deleteModel(model) {
149
+ const [deleted, newList] = await this.handleModelDelete(model);
150
+ if (deleted && newList) {
151
+ this.dataSource.data = newList;
152
+ }
153
+ }
154
+ }
155
+
156
+ class BackButtonDirective {
157
+ constructor() {
158
+ this.navigation = inject(NavigationService);
159
+ }
160
+ onClick() {
161
+ this.navigation.back();
162
+ }
163
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.2", ngImport: i0, type: BackButtonDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
164
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.0.2", type: BackButtonDirective, isStandalone: true, selector: "[backButton]", host: { listeners: { "click": "onClick()" } }, ngImport: i0 }); }
165
+ }
166
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.2", ngImport: i0, type: BackButtonDirective, decorators: [{
167
+ type: Directive,
168
+ args: [{
169
+ selector: '[backButton]',
170
+ standalone: true
171
+ }]
172
+ }], propDecorators: { onClick: [{
173
+ type: HostListener,
174
+ args: ['click']
175
+ }] } });
176
+
177
+ class FormUtil {
178
+ static markAllControlsAsTouched(formGroup) {
179
+ Object.values(formGroup.controls).forEach((control) => {
180
+ control.patchValue(control.value);
181
+ control.markAllAsTouched();
182
+ });
183
+ }
184
+ }
185
+
186
+ /**
187
+ * Generated bundle index. Do not edit.
188
+ */
189
+
190
+ export { BackButtonDirective, BaseComponent, BaseModelComponent, BaseModelDetailComponent, BaseModelEditComponent, BaseModelListComponent, FormUtil, NavigationService };
191
+ //# sourceMappingURL=angular-base-lib.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"angular-base-lib.mjs","sources":["../../../../libs/angular-base/src/lib/navigation/navigation.service.ts","../../../../libs/angular-base/src/lib/model-component/base-model-detail.component.ts","../../../../libs/angular-base/src/lib/model-component/base.component.ts","../../../../libs/angular-base/src/lib/model-component/base-model.component.ts","../../../../libs/angular-base/src/lib/model-component/base-model-edit.component.ts","../../../../libs/angular-base/src/lib/model-component/base-model-list.component.ts","../../../../libs/angular-base/src/lib/navigation/back-button.directive.ts","../../../../libs/angular-base/src/lib/forms/form-util.ts","../../../../libs/angular-base/src/angular-base-lib.ts"],"sourcesContent":["import { NavigationEnd, Router } from '@angular/router';\nimport { inject, Injectable } from '@angular/core';\nimport { Location } from '@angular/common';\n\n@Injectable({ providedIn: 'root' })\nexport class NavigationService {\n private history: string[] = [];\n private readonly router = inject(Router);\n private readonly location = inject(Location);\n\n constructor() {\n this.router.events.subscribe((event) => {\n if (event instanceof NavigationEnd) {\n this.history.push(event.urlAfterRedirects);\n }\n });\n }\n\n reset(): void {\n this.history = [];\n }\n\n back(fallbackRoute = '/'): void {\n this.history.pop();\n if (this.history.length > 0) {\n this.location.back();\n } else {\n this.router.navigate([fallbackRoute]);\n }\n }\n}\n","import { inject } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { NavigationService } from '../navigation/navigation.service';\nimport { ModelAction } from './action';\nimport { Identifiable } from 'angular-base-dao';\n\nexport abstract class BaseModelDetailComponent<TM extends Identifiable> {\n model: TM | null = null;\n\n protected readonly router = inject(Router);\n protected readonly navigationService = inject(NavigationService);\n\n protected constructor(protected baseRoute: string) {}\n\n handleModelAction(modelAction: ModelAction<TM>): void {\n switch (modelAction.action) {\n case 'show':\n this.showList();\n break;\n\n case 'edit':\n this.editModel();\n break;\n\n case 'delete':\n this.deleteModel();\n break;\n }\n }\n\n showList(): void {\n this.router.navigate([this.baseRoute]);\n }\n\n async editModel(): Promise<void> {\n if (!this.model) {\n return;\n }\n\n await this.router.navigate([`${this.baseRoute}/edit`, this.model.id]);\n }\n\n async deleteModel(): Promise<void> {\n const model = this.model;\n\n if (!model) {\n return;\n }\n\n if (await this.handleDeleteModel(model)) {\n await this.router.navigate([`${this.baseRoute}`]);\n }\n }\n\n goBack(): void {\n this.navigationService.back(this.baseRoute);\n }\n\n abstract handleDeleteModel(model: TM): Promise<boolean>;\n}\n","/**\n * Component used for all pages that can directly navigate back to the home page if no other route was found\n */\nimport { inject } from '@angular/core';\nimport { NavigationService } from '../navigation/navigation.service';\n\nexport abstract class BaseComponent {\n backRoute = '/';\n\n protected readonly navigationService = inject(NavigationService);\n\n goBack(): void {\n this.navigationService.back(this.backRoute);\n }\n}\n","import { Router } from '@angular/router';\nimport { BaseComponent } from './base.component';\nimport { inject } from '@angular/core';\nimport { ModelAction } from './action';\n\nexport abstract class BaseModelComponent<TM> extends BaseComponent {\n protected readonly router = inject(Router);\n\n protected constructor(protected baseRoute: string) {\n super();\n this.backRoute = this.baseRoute;\n }\n\n showList(): void {\n this.router.navigate([this.baseRoute]);\n }\n\n handleModelAction(modelAction: ModelAction<TM>): void {\n switch (modelAction.action) {\n case 'back_to-list':\n this.showList();\n break;\n }\n }\n}\n","import { BaseModelComponent } from './base-model.component';\nimport { Identifiable } from 'angular-base-dao';\n\nexport abstract class BaseModelEditComponent<TM extends Identifiable> extends BaseModelComponent<TM> {\n model: TM | null = null;\n}\n","import { BaseModelComponent } from './base-model.component';\nimport { MatTableDataSource } from '@angular/material/table';\nimport { ModelAction } from './action';\nimport { DaoId, Identifiable } from 'angular-base-dao';\n\nexport abstract class BaseModelListComponent<TM extends Identifiable> extends BaseModelComponent<TM> {\n readonly dataSource = new MatTableDataSource<TM>([]);\n\n protected constructor(baseRoute: string) {\n super(baseRoute);\n\n this.backRoute = '/';\n }\n\n override handleModelAction(modelAction: ModelAction<TM>): void {\n switch (modelAction.action) {\n case 'show':\n this.showDetail(modelAction.model.id);\n break;\n\n case 'edit':\n this.editModel(modelAction.model.id);\n break;\n\n case 'delete':\n this.deleteModel(modelAction.model);\n break;\n }\n }\n\n showDetail(id: DaoId): void {\n this.router.navigate([this.baseRoute, id]);\n }\n\n editModel(id: DaoId): void {\n this.router.navigate([`${this.baseRoute}/edit`, id]);\n }\n\n createModel(): void {\n this.router.navigate([`${this.baseRoute}/add`]);\n }\n\n async deleteModel(model: TM): Promise<void> {\n const [deleted, newList] = await this.handleModelDelete(model);\n if (deleted && newList) {\n this.dataSource.data = newList;\n }\n }\n\n abstract handleModelDelete(model: TM): Promise<[boolean, TM[]]>;\n}\n","import { Directive, HostListener, inject } from '@angular/core';\nimport { NavigationService } from './navigation.service';\n\n@Directive({\n selector: '[backButton]',\n standalone: true\n})\nexport class BackButtonDirective {\n private readonly navigation = inject(NavigationService);\n\n @HostListener('click')\n onClick(): void {\n this.navigation.back();\n }\n}\n","import { AbstractControl, FormGroup } from '@angular/forms';\n\nexport class FormUtil {\n static markAllControlsAsTouched(formGroup: FormGroup): void {\n Object.values(formGroup.controls).forEach((control: AbstractControl) => {\n control.patchValue(control.value);\n control.markAllAsTouched();\n });\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
package/index.d.ts ADDED
@@ -0,0 +1 @@
1
+ export * from './lib';
@@ -0,0 +1,4 @@
1
+ import { FormGroup } from '@angular/forms';
2
+ export declare class FormUtil {
3
+ static markAllControlsAsTouched(formGroup: FormGroup): void;
4
+ }
@@ -0,0 +1 @@
1
+ export { FormUtil } from './form-util';
package/lib/index.d.ts ADDED
@@ -0,0 +1,4 @@
1
+ export * from './model-component';
2
+ export * from './navigation';
3
+ export * from './forms';
4
+ export * from './types';
@@ -0,0 +1,2 @@
1
+ export { ModelActionType } from './model-action.type';
2
+ export { ModelAction } from './model-action';
@@ -0,0 +1,5 @@
1
+ import { ModelActionType } from './model-action.type';
2
+ export interface ModelAction<T> {
3
+ readonly action: ModelActionType;
4
+ readonly model: T;
5
+ }
@@ -0,0 +1 @@
1
+ export type ModelActionType = 'show' | 'delete' | 'edit' | 'download' | 'back_to-list';
@@ -0,0 +1,17 @@
1
+ import { Router } from '@angular/router';
2
+ import { NavigationService } from '../navigation/navigation.service';
3
+ import { ModelAction } from './action';
4
+ import { Identifiable } from 'angular-base-dao';
5
+ export declare abstract class BaseModelDetailComponent<TM extends Identifiable> {
6
+ protected baseRoute: string;
7
+ model: TM | null;
8
+ protected readonly router: Router;
9
+ protected readonly navigationService: NavigationService;
10
+ protected constructor(baseRoute: string);
11
+ handleModelAction(modelAction: ModelAction<TM>): void;
12
+ showList(): void;
13
+ editModel(): Promise<void>;
14
+ deleteModel(): Promise<void>;
15
+ goBack(): void;
16
+ abstract handleDeleteModel(model: TM): Promise<boolean>;
17
+ }
@@ -0,0 +1,5 @@
1
+ import { BaseModelComponent } from './base-model.component';
2
+ import { Identifiable } from 'angular-base-dao';
3
+ export declare abstract class BaseModelEditComponent<TM extends Identifiable> extends BaseModelComponent<TM> {
4
+ model: TM | null;
5
+ }
@@ -0,0 +1,14 @@
1
+ import { BaseModelComponent } from './base-model.component';
2
+ import { MatTableDataSource } from '@angular/material/table';
3
+ import { ModelAction } from './action';
4
+ import { DaoId, Identifiable } from 'angular-base-dao';
5
+ export declare abstract class BaseModelListComponent<TM extends Identifiable> extends BaseModelComponent<TM> {
6
+ readonly dataSource: MatTableDataSource<TM, import("@angular/material/paginator").MatPaginator>;
7
+ protected constructor(baseRoute: string);
8
+ handleModelAction(modelAction: ModelAction<TM>): void;
9
+ showDetail(id: DaoId): void;
10
+ editModel(id: DaoId): void;
11
+ createModel(): void;
12
+ deleteModel(model: TM): Promise<void>;
13
+ abstract handleModelDelete(model: TM): Promise<[boolean, TM[]]>;
14
+ }
@@ -0,0 +1,10 @@
1
+ import { Router } from '@angular/router';
2
+ import { BaseComponent } from './base.component';
3
+ import { ModelAction } from './action';
4
+ export declare abstract class BaseModelComponent<TM> extends BaseComponent {
5
+ protected baseRoute: string;
6
+ protected readonly router: Router;
7
+ protected constructor(baseRoute: string);
8
+ showList(): void;
9
+ handleModelAction(modelAction: ModelAction<TM>): void;
10
+ }
@@ -0,0 +1,6 @@
1
+ import { NavigationService } from '../navigation/navigation.service';
2
+ export declare abstract class BaseComponent {
3
+ backRoute: string;
4
+ protected readonly navigationService: NavigationService;
5
+ goBack(): void;
6
+ }
@@ -0,0 +1,5 @@
1
+ export { BaseModelDetailComponent } from './base-model-detail.component';
2
+ export { BaseModelEditComponent } from './base-model-edit.component';
3
+ export { BaseModelComponent } from './base-model.component';
4
+ export { BaseModelListComponent } from './base-model-list.component';
5
+ export { BaseComponent } from './base.component';
@@ -0,0 +1,7 @@
1
+ import * as i0 from "@angular/core";
2
+ export declare class BackButtonDirective {
3
+ private readonly navigation;
4
+ onClick(): void;
5
+ static ɵfac: i0.ɵɵFactoryDeclaration<BackButtonDirective, never>;
6
+ static ɵdir: i0.ɵɵDirectiveDeclaration<BackButtonDirective, "[backButton]", never, {}, {}, never, never, true, never>;
7
+ }
@@ -0,0 +1,2 @@
1
+ export { NavigationService } from './navigation.service';
2
+ export { BackButtonDirective } from './back-button.directive';
@@ -0,0 +1,11 @@
1
+ import * as i0 from "@angular/core";
2
+ export declare class NavigationService {
3
+ private history;
4
+ private readonly router;
5
+ private readonly location;
6
+ constructor();
7
+ reset(): void;
8
+ back(fallbackRoute?: string): void;
9
+ static ɵfac: i0.ɵɵFactoryDeclaration<NavigationService, never>;
10
+ static ɵprov: i0.ɵɵInjectableDeclaration<NavigationService>;
11
+ }
@@ -0,0 +1 @@
1
+ export { ValueChangeCallback } from './value-change-callback.type';
@@ -0,0 +1 @@
1
+ export type ValueChangeCallback<T> = (value: T) => void;
package/package.json ADDED
@@ -0,0 +1,30 @@
1
+ {
2
+ "name": "angular-base-lib",
3
+ "version": "17.0.1",
4
+ "description": "Angular model-components, navigation-service and other abstract helpers",
5
+ "peerDependencies": {
6
+ "@angular/common": "^17.0.0",
7
+ "@angular/core": "^17.0.0",
8
+ "@angular/router": "^17.0.0",
9
+ "@angular/forms": "^17.0.0",
10
+ "@angular/material": "^17.0.0",
11
+ "rxjs": "~7.8.0"
12
+ },
13
+ "sideEffects": false,
14
+ "module": "fesm2022/angular-base-lib.mjs",
15
+ "typings": "index.d.ts",
16
+ "exports": {
17
+ "./package.json": {
18
+ "default": "./package.json"
19
+ },
20
+ ".": {
21
+ "types": "./index.d.ts",
22
+ "esm2022": "./esm2022/angular-base-lib.mjs",
23
+ "esm": "./esm2022/angular-base-lib.mjs",
24
+ "default": "./fesm2022/angular-base-lib.mjs"
25
+ }
26
+ },
27
+ "dependencies": {
28
+ "tslib": "^2.3.0"
29
+ }
30
+ }