Skip to content

Commit 6a23ade

Browse files
committed
feat: added method to save state
1 parent 5bf59ca commit 6a23ade

File tree

9 files changed

+77
-23
lines changed

9 files changed

+77
-23
lines changed

src/app/app.component.html

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,4 @@
1-
<app-form-filter></app-form-filter>
1+
<app-form-filter
2+
[widgetInput]="filterState()"
3+
(savedState)="updateSavedState($event)"
4+
></app-form-filter>

src/app/app.component.ts

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,24 @@
1-
import { Component } from '@angular/core';
1+
import { Component, signal } from '@angular/core';
2+
import { FILTER_INPUT } from './dummy-data/fund-input-dummy';
23
import { FormFilterModule } from './form-filter/form-filter.module';
4+
import { SavedFilter } from './form-filter/models/saved-filter.model';
5+
import { WidgetInput } from './models/widget-input.model';
36

47
@Component({
58
selector: 'app-root',
69
imports: [FormFilterModule],
710
templateUrl: './app.component.html',
811
styleUrl: './app.component.scss',
912
})
10-
export class AppComponent {}
13+
export class AppComponent {
14+
filterState = signal<WidgetInput>(FILTER_INPUT);
15+
16+
updateSavedState(savedState: SavedFilter) {
17+
this.filterState.update((state) => ({
18+
...state,
19+
state: savedState,
20+
}));
21+
22+
console.log('Saved state:', savedState);
23+
}
24+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { FilterKey } from '../form-filter/constants/filter-key.enum';
2+
import { SavedFilter } from '../form-filter/models/saved-filter.model';
3+
import { WidgetInput } from '../models/widget-input.model';
4+
5+
const SAVED_FILTERS: SavedFilter = {
6+
[FilterKey.Country]: {
7+
filterForm: {
8+
[FilterKey.Country]: ['USA', 'Canada'],
9+
key: FilterKey.Country,
10+
},
11+
filterConfig: {
12+
displayName: 'Country',
13+
},
14+
},
15+
};
16+
17+
export const FILTER_INPUT: WidgetInput = {
18+
id: '1',
19+
state: SAVED_FILTERS,
20+
};

src/app/form-filter/components/industry-filter/industry-filter.component.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ export class IndustryFilterComponent implements OnInit, OnDestroy {
5757
initialiseForm() {
5858
this.parentFormGroup.addControl(
5959
this.controlKey(),
60-
new FormControl([], { nonNullable: true }),
60+
new FormControl('', { nonNullable: true }),
6161
);
6262
}
6363

src/app/form-filter/constants/filter-default-map.constant.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,10 @@ export const FILTER_DEFAULTS: SavedFilter = {
2828
},
2929
},
3030
[FilterKey.Rating]: {
31-
filterForm: { [FilterKey.Rating]: [], key: FilterKey.Rating },
31+
filterForm: {
32+
[FilterKey.Rating]: { a: false, b: false, c: false },
33+
key: FilterKey.Rating,
34+
},
3235
filterConfig: {
3336
displayName: 'Rating',
3437
},

src/app/form-filter/form-filter.component.ts

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
import { Component, OnDestroy, OnInit } from '@angular/core';
1+
import { Component, input, OnDestroy, OnInit, output } from '@angular/core';
22
import { FormControl, FormGroup } from '@angular/forms';
3-
import { distinctUntilChanged, map, Observable, Subscription } from 'rxjs';
3+
import { distinctUntilChanged, map, Observable, Subscription, tap } from 'rxjs';
44
import { FilterBroadcast } from '../models/broadcast-type.model';
5+
import { WidgetInput } from '../models/widget-input.model';
56
import { FILTER_DEFAULTS } from './constants/filter-default-map.constant';
67
import { FilterKey } from './constants/filter-key.enum';
78
import { ActiveFilterConfig } from './models/active-filter-config.model';
@@ -10,25 +11,16 @@ import { SavedFilter } from './models/saved-filter.model';
1011
import { BroadcastFactoryService } from './services/broadcast-factory.service';
1112
import { FormFilterStateService } from './state/form-filter-state.service';
1213

13-
const SAVED_FILTERS: SavedFilter = {
14-
[FilterKey.Country]: {
15-
filterForm: {
16-
[FilterKey.Country]: ['USA', 'Canada'],
17-
key: FilterKey.Country,
18-
},
19-
filterConfig: {
20-
displayName: 'Country',
21-
},
22-
},
23-
};
24-
2514
@Component({
2615
standalone: false,
2716
selector: 'app-form-filter',
2817
templateUrl: './form-filter.component.html',
2918
styleUrl: './form-filter.component.scss',
3019
})
3120
export class FormFilterComponent implements OnInit, OnDestroy {
21+
widgetInput = input.required<WidgetInput>();
22+
savedState = output<SavedFilter>();
23+
3224
activeFilters$: Observable<{ key: FilterKey; value: ActiveFilterConfig }[]>;
3325
filterOptions$: Observable<FilterOption[]>;
3426

@@ -92,6 +84,19 @@ export class FormFilterComponent implements OnInit, OnDestroy {
9284
);
9385
}),
9486
);
87+
88+
this.subs.add(
89+
this.stateService.activeFilters$
90+
.pipe(
91+
distinctUntilChanged((prev, curr) => {
92+
return JSON.stringify(prev) === JSON.stringify(curr);
93+
}),
94+
tap((activeFilters) => {
95+
this.savedState.emit(activeFilters);
96+
}),
97+
)
98+
.subscribe(),
99+
);
95100
}
96101

97102
ngOnInit(): void {
@@ -103,16 +108,18 @@ export class FormFilterComponent implements OnInit, OnDestroy {
103108
}
104109

105110
initialiseFilters() {
111+
const savedFilters = this.widgetInput().state as SavedFilter;
112+
106113
const inactiveFilterOptions: FilterOption[] = Object.entries(
107114
FILTER_DEFAULTS,
108115
)
109-
.filter(([key]) => !SAVED_FILTERS[key as FilterKey])
116+
.filter(([key]) => !savedFilters[key as FilterKey])
110117
.map(([key, { filterConfig }]) => ({
111118
key: key as FilterKey,
112119
displayName: filterConfig.displayName,
113120
}));
114121

115-
const activeFilters: SavedFilter = Object.entries(SAVED_FILTERS).reduce(
122+
const activeFilters: SavedFilter = Object.entries(savedFilters).reduce(
116123
(acc, [key, value]) => {
117124
const defaultConfig = FILTER_DEFAULTS[key as FilterKey];
118125
if (!defaultConfig) {

src/app/form-filter/models/filter-form.model.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,5 +29,5 @@ export interface CompanyFilter {
2929

3030
export interface RatingFilter {
3131
key: FilterKey.Rating;
32-
[FilterKey.Rating]: string[];
32+
[FilterKey.Rating]: { a: boolean; b: boolean; c: boolean };
3333
}

src/app/form-filter/state/form-filter-state.service.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,10 @@ export class FormFilterStateService extends ComponentStore<FormFilterState> {
6666
...state.activeFilters,
6767
[updatedFilter.key]: {
6868
...state.activeFilters[updatedFilter.key],
69-
filterForm: { [updatedFilter.key]: updatedFilter.value },
69+
filterForm: {
70+
[updatedFilter.key]: updatedFilter.value,
71+
key: updatedFilter.key,
72+
},
7073
},
7174
},
7275
}),
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
export interface WidgetInput {
2+
id: string;
3+
state: unknown;
4+
}

0 commit comments

Comments
 (0)