Refactor calendar settings service to use a definitions map for settings and update related components to access settings via a getter method
This commit is contained in:
1 parent
2a60fef8ff
commit
22993a02c5
6 files changed
+70
-33
No files matched your search
@@ -2,7 +2,7 @@
|
||||
<h3>{{ getMonthName() }} {{ year }}</h3>
|
||||
<div>
|
||||
<div class="row header">
|
||||
@if (calendarSettingsService.showWeekNumbers()) {
|
||||
@if (calendarSettingsService.get('showWeekNumbers')()) {
|
||||
<p class="day empty week-number"></p>
|
||||
}
|
||||
<p class="day">L</p>
|
||||
@@ -16,7 +16,7 @@
|
||||
<div class="cols">
|
||||
@for (week of weeksInAMonth; track $index) {
|
||||
<div class="row week">
|
||||
@if (calendarSettingsService.showWeekNumbers()) {
|
||||
@if (calendarSettingsService.get('showWeekNumbers')()) {
|
||||
<p
|
||||
class="day week-number"
|
||||
[class.start]="$index === 0"
|
||||
|
||||
@@ -35,7 +35,7 @@ export class CalendarYear {
|
||||
effect(() => {
|
||||
this.selectedDates = this.calendarService.getSelectedDatesForYear();
|
||||
const vacationData = this.userInput.vacationNumberSignal();
|
||||
const c = this.calendarSettingsService.samediMalin();
|
||||
const c = this.calendarSettingsService.get('samediMalin')();
|
||||
console.log('Samedi Malin setting:', c);
|
||||
console.log('Optimizing vacations with data:', vacationData);
|
||||
this.isLoading.set(true);
|
||||
|
||||
@@ -4,15 +4,15 @@
|
||||
<p>Configure your calendar settings here.</p>
|
||||
</div>
|
||||
<div style="display: flex; flex-direction: column; gap: 1rem">
|
||||
@for (signal of calendarSettingsService.settings; track signal.id) {
|
||||
@for (setting of calendarSettingsService.settingsArray; track setting.id) {
|
||||
<div style="align-self: flex-start">
|
||||
<mat-slide-toggle
|
||||
[id]="signal.id"
|
||||
[name]="signal.id"
|
||||
[checked]="signal.signal()"
|
||||
(change)="signal.signal.set($event.checked)"
|
||||
[id]="setting.id"
|
||||
[name]="setting.id"
|
||||
[checked]="setting.signal()"
|
||||
(change)="setting.signal.set($event.checked)"
|
||||
>
|
||||
{{ signal.description }}
|
||||
{{ setting.description }}
|
||||
</mat-slide-toggle>
|
||||
</div>
|
||||
}
|
||||
|
||||
@@ -540,7 +540,7 @@ export class SelectedDates implements SelectedDateInterface {
|
||||
calendarSettingsService: CalendarSettingsService,
|
||||
calendarService: CalendarService,
|
||||
): void {
|
||||
if (calendarSettingsService.samediMalin()) this.samediMalin(vacationsNumber);
|
||||
if (calendarSettingsService.get('samediMalin')()) this.samediMalin(vacationsNumber);
|
||||
while (vacationsNumber.cp > 0) {
|
||||
const result = this.lookForVacation(DayType.CP, calendarService);
|
||||
if (result.heuristic === SelectedDates.NO_VALID_STRATEGY_HEURISTIC) {
|
||||
|
||||
@@ -17,17 +17,29 @@ describe('CalendarSettingsService', () => {
|
||||
});
|
||||
|
||||
it('should initialize with default values', () => {
|
||||
expect(service.showWeekNumbers()).toBe(false);
|
||||
expect(service.samediMalin()).toBe(true);
|
||||
expect(service.get('showWeekNumbers')()).toBe(false);
|
||||
expect(service.get('samediMalin')()).toBe(true);
|
||||
});
|
||||
|
||||
it('should allow updating showWeekNumbers', () => {
|
||||
service.showWeekNumbers.set(true);
|
||||
expect(service.showWeekNumbers()).toBe(true);
|
||||
service.get('showWeekNumbers').set(true);
|
||||
expect(service.get('showWeekNumbers')()).toBe(true);
|
||||
});
|
||||
|
||||
it('should allow updating samediMalin', () => {
|
||||
service.samediMalin.set(false);
|
||||
expect(service.samediMalin()).toBe(false);
|
||||
service.get('samediMalin').set(false);
|
||||
expect(service.get('samediMalin')()).toBe(false);
|
||||
});
|
||||
|
||||
it('should provide settings array for UI iteration', () => {
|
||||
const settingsArray = service.settingsArray;
|
||||
expect(settingsArray.length).toBe(2);
|
||||
expect(settingsArray[0].id).toBe('showWeekNumbers');
|
||||
expect(settingsArray[1].id).toBe('samediMalin');
|
||||
});
|
||||
|
||||
it('should return correct descriptions', () => {
|
||||
expect(service.getDescription('showWeekNumbers')).toBe('Afficher les numéros de semaine');
|
||||
expect(service.getDescription('samediMalin')).toBe('Activer le Samedi Malin');
|
||||
});
|
||||
});
|
||||
@@ -1,9 +1,8 @@
|
||||
import { storedSignal } from '../shared/utils/stored-signal.';
|
||||
import { Injectable, WritableSignal } from '@angular/core';
|
||||
|
||||
interface CalendarSetting {
|
||||
signal: WritableSignal<boolean>;
|
||||
id: string;
|
||||
interface SettingDefinition {
|
||||
defaultValue: boolean;
|
||||
description: string;
|
||||
}
|
||||
|
||||
@@ -11,19 +10,45 @@ interface CalendarSetting {
|
||||
providedIn: 'root',
|
||||
})
|
||||
export class CalendarSettingsService {
|
||||
readonly showWeekNumbers = storedSignal('calendarSettings.showWeekNumbers', false);
|
||||
readonly samediMalin = storedSignal('calendarSettings.samediMalin', true);
|
||||
private readonly definitions = new Map<string, SettingDefinition>([
|
||||
[
|
||||
'showWeekNumbers',
|
||||
{
|
||||
defaultValue: false,
|
||||
description: 'Afficher les numéros de semaine',
|
||||
},
|
||||
],
|
||||
[
|
||||
'samediMalin',
|
||||
{
|
||||
defaultValue: true,
|
||||
description: 'Activer le Samedi Malin',
|
||||
},
|
||||
],
|
||||
]);
|
||||
|
||||
readonly settings: readonly CalendarSetting[] = [
|
||||
{
|
||||
signal: this.showWeekNumbers,
|
||||
id: 'showWeekNumbers',
|
||||
description: 'Afficher les numéros de semaine',
|
||||
},
|
||||
{
|
||||
signal: this.samediMalin,
|
||||
id: 'samediMalin',
|
||||
description: 'Activer le Samedi Malin',
|
||||
},
|
||||
];
|
||||
private readonly signals = new Map<string, WritableSignal<boolean>>();
|
||||
|
||||
constructor() {
|
||||
for (const [id, def] of this.definitions) {
|
||||
const storageKey = `calendarSettings.${id}`;
|
||||
this.signals.set(id, storedSignal(storageKey, def.defaultValue));
|
||||
}
|
||||
}
|
||||
|
||||
get(id: string): WritableSignal<boolean> {
|
||||
return this.signals.get(id)!;
|
||||
}
|
||||
|
||||
get settingsArray() {
|
||||
return Array.from(this.definitions.entries()).map(([id, def]) => ({
|
||||
id,
|
||||
signal: this.signals.get(id)!,
|
||||
description: def.description,
|
||||
}));
|
||||
}
|
||||
|
||||
getDescription(id: string): string {
|
||||
return this.definitions.get(id)?.description ?? '';
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user