Skip to content

Commit fb86385

Browse files
use store for show page
1 parent 3b4e261 commit fb86385

31 files changed

+227
-242
lines changed

src/app/app.config.ts

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,29 @@ import {provideRouter} from '@angular/router';
33
import reducer from "./store/reducer/index";
44
import {routes} from './app.routes';
55
import {provideClientHydration} from '@angular/platform-browser';
6-
import {provideStore} from '@ngrx/store';
6+
import {ActionReducer, MetaReducer, provideStore} from '@ngrx/store';
77
import {provideStoreDevtools} from '@ngrx/store-devtools';
88
import {provideHttpClient, withFetch} from "@angular/common/http";
99
import {listReducer} from "./store/reducer/list.reducer";
1010

11+
function log(reducer: ActionReducer<any>): ActionReducer<any> {
12+
return (state, action) => {
13+
const currentState = reducer(state, action)
14+
console.log('current state', currentState)
15+
console.log('action =>', action)
16+
return currentState
17+
}
18+
}
19+
20+
export const metaReducers: MetaReducer[] = [log]
21+
22+
1123
export const appConfig: ApplicationConfig = {
1224
providers: [
1325
provideRouter(routes),
1426
provideHttpClient(withFetch()),
1527
provideClientHydration(),
16-
provideStore(reducer),
28+
provideStore(reducer,{metaReducers}),
1729
provideStoreDevtools({
1830
maxAge: 25, autoPause: true, // Pauses recording actions and state changes when the extension window is not open
1931
trace: false, // If set to true, will include stack trace for every dispatched action, so you can see it in trace tab jumping directly to that part of code

src/app/components/common/delete/delete.component.ts

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
11
import {Component, EventEmitter, Input, Output} from '@angular/core';
2-
import {HeroService} from "../../../service/hero.service";
3-
import {Location} from "@angular/common";
42

53
@Component({
64
selector: 'app-delete',
@@ -11,11 +9,6 @@ import {Location} from "@angular/common";
119
export class DeleteComponent {
1210
@Input() disabled!: boolean
1311
@Output() delete: EventEmitter<Function> = new EventEmitter<Function>()
14-
constructor(
15-
private heroService: HeroService,
16-
private location: Location
17-
) {
18-
}
1912

2013
deleteAction () {
2114
return this.delete.emit()
Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,22 @@
11
<form [formGroup]="formGroup" (ngSubmit)="handleSubmit()">
22
@for (field of fields; track field.name) {
3-
<div class="mb-3">
4-
<label [for]="field.name">{{ field.name }}</label>
5-
<input [id]="field.name"
6-
[type]="field.type"
7-
[formControlName]="field.name"
8-
class="mt-1 w-full px-3 py-2 border rounded"
9-
>
3+
<div class="bg-white px-6 py-8">
4+
<div class="mb-3">
5+
<label [for]="field.name">{{ field.name }}</label>
6+
<input [id]="field.name"
7+
[type]="field.type"
8+
[formControlName]="field.name"
9+
class="mt-1 w-full px-3 py-2 border rounded"
10+
>
11+
</div>
1012
</div>
1113
}
12-
<button
13-
type="submit"
14-
class="px-6 py-2 bg-green-500 text-white font-medium rounded shadow-md hover:bg-green-600"
15-
>
16-
Submit
17-
</button>
14+
<div class="bg-neutral-100 px-4 py-6 flex justify-between">
15+
<button
16+
type="submit"
17+
class="px-6 py-2 bg-green-500 text-white font-medium rounded shadow-md hover:bg-green-600"
18+
>
19+
Submit
20+
</button>
21+
</div>
1822
</form>

src/app/components/common/form/form.component.ts

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,38 @@
1-
import {Component, EventEmitter, Input, OnInit, Output} from '@angular/core';
1+
import {
2+
Component,
3+
EventEmitter,
4+
Input,
5+
OnInit,
6+
Output
7+
} from '@angular/core';
28
import {FormControl, FormGroup, ReactiveFormsModule} from "@angular/forms";
9+
import {ApiUpdate} from "@interface/api";
10+
import {Observable} from "rxjs";
11+
import {AsyncPipe, NgIf} from "@angular/common";
312

413
@Component({
514
selector: 'app-form',
615
standalone: true,
716
imports: [
8-
ReactiveFormsModule
17+
ReactiveFormsModule,
18+
AsyncPipe,
19+
NgIf
920
],
1021
templateUrl: './form.component.html',
1122
})
1223
export class FormComponent implements OnInit {
1324
@Input() fields: Array<{ name: string; type: string }> = [];
1425
@Output() submit = new EventEmitter
26+
@Input() itemToUpdate$!: Observable<ApiUpdate | undefined>;
1527
public formGroup: FormGroup = new FormGroup<any>({})
1628

29+
1730
ngOnInit() {
1831
this.formGroup = this.createFormGroup()
1932
}
2033

2134
createFormGroup() {
2235
const group: { [key: string]: FormControl<string | null> } = {}
23-
2436
this.fields.forEach(field => {
2537
group[field.name] = new FormControl('')
2638
})

src/app/components/common/header/header.component.spec.ts

Lines changed: 0 additions & 23 deletions
This file was deleted.

src/app/components/common/header/header.component.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { Component } from '@angular/core';
2-
import {MenuComponent} from "../../svg/menu/menu.component";
2+
import {MenuComponent} from "@components/svg/menu/menu.component";
33

44
@Component({
55
selector: 'app-header',

src/app/components/common/sidebar/sidebar.component.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import { Component } from '@angular/core';
2-
import {ListComponent} from "../../foo/list/list.component";
3-
import {ListSvgComponent} from "../../svg/list-svg/list-svg.component";
42
import {RouterLink, RouterLinkActive} from "@angular/router";
3+
import {ListSvgComponent} from "@components/svg/list-svg/list-svg.component";
54

65
@Component({
76
selector: 'app-sidebar',

src/app/components/common/table/table.component.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1+
import {AsyncPipe} from "@angular/common";
12
import {Component, EventEmitter, Input, Output} from '@angular/core';
2-
import {RouterLink} from "@angular/router";
33
import {FormsModule} from "@angular/forms";
4-
import {ShowSvgComponent} from "../../svg/show-svg/show-svg.component";
5-
import {EditSvgComponent} from "../../svg/edit-svg/edit-svg.component";
4+
import {RouterLink} from "@angular/router";
65
import {Observable} from "rxjs";
7-
import {Hero} from "../../../interface/hero.model";
8-
import {AsyncPipe} from "@angular/common";
6+
import {ShowSvgComponent} from "@components/svg/show-svg/show-svg.component";
7+
import {EditSvgComponent} from "@components/svg/edit-svg/edit-svg.component";
8+
import {Hero} from "@interface/hero.model";
99

1010
@Component({
1111
selector: 'app-table',

src/app/components/foo/create/create.component.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<div class="container mx-auto px-4 max-w-2xl mt-4">
1+
<div class=" w-full px-4 mt-4">
22
<div class="flex items-center justify-between">
33
<a [routerLink]="['/heroes']"
44
class="text-blue-600 hover:text-blue-800">
@@ -9,6 +9,6 @@
99
<div class="bg-blue-100 rounded py-4 px-4 text-blue-700 text-sm">Loading ...</div>
1010
} @else {
1111
<h1 class="text-3xl my-4">Create</h1>
12-
<app-form [fields]="formType" (submit)="onSubmit($event)"/>
12+
<app-form [fields]="formType" (submit)="onSubmit($event)"/>
1313
}
1414
</div>

src/app/components/foo/create/create.component.ts

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1+
import {Location} from "@angular/common";
12
import {Component, signal, WritableSignal} from '@angular/core';
2-
import {DeleteComponent} from "../../common/delete/delete.component";
3-
import {RouterLink} from "@angular/router";
4-
import {HeroService} from "../../../service/hero.service";
53
import {FormsModule, ReactiveFormsModule} from "@angular/forms";
6-
import {Location} from "@angular/common";
7-
import {FormComponent} from "../../common/form/form.component";
4+
import {RouterLink} from "@angular/router";
5+
import {DeleteComponent} from "@components/common/delete/delete.component";
6+
import {FormComponent} from "@components/common/form/form.component";
7+
import {ApiService} from "@service/api.service";
88

99
@Component({
1010
selector: 'app-create',
@@ -27,10 +27,11 @@ export class CreateComponent {
2727
}
2828
]
2929

30-
constructor(private heroService: HeroService, private location: Location) {
30+
constructor(private apiService: ApiService, private location: Location) {
3131
}
3232
onSubmit(data: any) {
33-
return this.heroService
33+
console.log('data ==>', data)
34+
return this.apiService
3435
.add('/heroes',
3536
{
3637
...data

src/app/components/foo/edit/edit.component.html

Lines changed: 6 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -5,30 +5,13 @@
55
Back to list
66
</a>
77
</div>
8-
@if (isLoading()) {
8+
@if (isLoading$) {
99
<div class="bg-blue-100 rounded py-4 px-4 text-blue-700 text-sm">Loading ...</div>
1010
} @else {
11-
<h1 class="text-3xl my-4">Edit {{ item()?.name }} {{ item()?.["@id"] }}</h1>
12-
13-
<form (ngSubmit)="onSubmit($event)">
14-
<div class="bg-white px-6 py-8">
15-
<label for="name"> name</label>
16-
<input id="name"
17-
class="mt-1 w-full px-3 py-2 border rounded"
18-
[ngModel]="item()?.name"
19-
(ngModelChange)="getItemId($event)"
20-
[ngModelOptions]="{standalone: true}"
21-
>
22-
</div>
23-
<div class="bg-neutral-100 px-4 py-6 flex justify-between">
24-
<button
25-
type="submit"
26-
class="px-6 py-2 bg-green-500 text-white font-medium rounded shadow-md hover:bg-green-600"
27-
>
28-
Submit
29-
</button>
30-
<app-delete (delete)="delete()"></app-delete>
31-
</div>
32-
</form>
11+
<h1 *ngIf="item$ | async as item" class="text-3xl my-4">Edit {{ item["@id"] }} {{ item['name'] }}</h1>
12+
<app-form [fields]="formType"
13+
[itemToUpdate$]="item$"
14+
(submit)="onSubmit($event)"
15+
/>
3316
}
3417
</div>
Lines changed: 51 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,20 @@
1-
import {Component, computed, OnInit, signal, WritableSignal} from '@angular/core';
2-
import {DeleteComponent} from "../../common/delete/delete.component";
3-
import {Router, RouterLink} from "@angular/router";
4-
import {HeroService} from "../../../service/hero.service";
1+
import {Observable} from "rxjs";
52
import {CommonModule, Location} from "@angular/common";
6-
import {ApiShow} from "../../../interface/api";
3+
import {Component, OnInit} from '@angular/core';
74
import {FormsModule, ReactiveFormsModule} from "@angular/forms";
8-
5+
import {Router, RouterLink} from "@angular/router";
6+
import {select, Store} from "@ngrx/store";
7+
import {DeleteComponent} from "@components/common/delete/delete.component";
8+
import {FormComponent} from "@components/common/form/form.component";
9+
import {ApiUpdate} from "@interface/api";
10+
import {Update} from "@interface/update.model";
11+
import {ApiService} from "@service/api.service";
12+
import {isLoadingAction, UpdateActions} from "@store/action/foo.actions";
13+
import {
14+
selectorUpdateError,
15+
selectorUpdateItem,
16+
selectorUpdateLoading
17+
} from "@store/selector/update.selectors";
918

1019
@Component({
1120
selector: 'app-edit',
@@ -16,35 +25,52 @@ import {FormsModule, ReactiveFormsModule} from "@angular/forms";
1625
RouterLink,
1726
FormsModule,
1827
ReactiveFormsModule,
28+
FormComponent,
1929
],
2030
templateUrl: './edit.component.html',
2131
})
2232
export class EditComponent implements OnInit {
23-
public isLoading: WritableSignal<boolean> = signal(false)
24-
public item: WritableSignal<ApiShow | null> = signal(null)
33+
public isLoading$: Observable<Boolean | undefined> = this.store.pipe(select(selectorUpdateLoading))
34+
public item$ = this.store.pipe(select(selectorUpdateItem));
35+
public error$: Observable<String | undefined> = this.store.pipe(select(selectorUpdateError))
36+
public formType: Array<{ name: string; type: string }> = [
37+
{
38+
name: 'name',
39+
type: 'string',
40+
}
41+
]
2542

2643
constructor(
2744
private router: Router,
28-
private heroService: HeroService,
29-
private location: Location
45+
private apiService: ApiService,
46+
private location: Location,
47+
private store: Store<{ update: Update }>
3048
) {
3149
}
3250

3351
ngOnInit() {
34-
this.loadData()
52+
this.fetchData()
3553
}
3654

37-
loadData() {
38-
this.isLoading.set(true)
55+
fetchData() {
3956
const splitUrl = this.router.url.split('/edit')[0]
40-
this.heroService
57+
this.apiService
4158
.getHero(splitUrl)
4259
.subscribe(item => {
43-
this.item.set(item)
44-
this.isLoading.set(false)
60+
this.store.dispatch(UpdateActions({
61+
isLoading: true,
62+
// @ts-ignore
63+
item
64+
}))
65+
this.store.dispatch(isLoadingAction({
66+
isLoading: false
67+
}))
4568
})
69+
70+
console.log(this.isLoading$.pipe(val => val))
4671
}
47-
getItemId(event: any) {
72+
73+
/*getItemId(event: any) {
4874
this.item.update(update => {
4975
if (update) {
5076
return {
@@ -55,22 +81,15 @@ export class EditComponent implements OnInit {
5581
return update
5682
}
5783
})
58-
}
84+
}*/
5985

60-
onSubmit(event: any) {
61-
return this.heroService.putHero(
62-
this.item()?.["@id"],
63-
this.item()
64-
).subscribe(() => {
65-
this.location.back()
66-
})
86+
onSubmit(data: any) {
87+
console.log('event ==>', data)
6788
}
6889

69-
delete() {
70-
return this.heroService.delete(
71-
this.item()?.["@id"]
72-
).subscribe(
73-
() => this.location.back()
74-
)
75-
}
90+
/* delete() {
91+
return this.apiService.delete(this.item()?.["@id"]).subscribe(
92+
() => this.location.back()
93+
)
94+
}*/
7695
}

src/app/components/foo/list/list.component.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ <h1 class="text-3xl mb-2">Heroes List</h1>
1717
@if (isLoading$ | async) {
1818
<div class="bg-blue-100 rounded py-4 px-4 text-blue-700 text-sm">Loading ...</div>
1919
} @else {
20-
<app-table [items]="list$"
20+
<app-table [items]="items$"
2121
[bulk]="bulk()"
2222
(addToBulkList)="addToBulk($event)"
2323
(selectedAll)="selectedAll()"

0 commit comments

Comments
 (0)