Add task list selection system.

This commit is contained in:
Florian THIERRY
2022-03-04 16:53:08 +01:00
parent 8e582c96e3
commit 9173d2220c
7 changed files with 130 additions and 46 deletions

View File

@@ -3,4 +3,7 @@
To Do To Do
</span> </span>
<button mat-raised-button (click)="openNewListForm()">Nouvelle liste</button> <button mat-raised-button (click)="openNewListForm()">Nouvelle liste</button>
<div *ngIf="activeTaskList">
Liste active : {{activeTaskList.name}}
</div>
</nav> </nav>

View File

@@ -1,19 +1,32 @@
import { Component, OnInit } from '@angular/core'; import { Component, OnDestroy, OnInit } from '@angular/core';
import { MatDialog } from '@angular/material/dialog'; import { MatDialog } from '@angular/material/dialog';
import { Subscription } from 'rxjs';
import { AddTaskListComponent } from 'src/app/task-lists/add-task-list/add-task-list.component'; import { AddTaskListComponent } from 'src/app/task-lists/add-task-list/add-task-list.component';
import { TaskList } from '../../entity/task-list';
import { TaskListService } from '../../service/task-list.service';
@Component({ @Component({
selector: 'app-header', selector: 'app-header',
templateUrl: './header.component.html', templateUrl: './header.component.html',
styleUrls: ['./header.component.scss'] styleUrls: ['./header.component.scss']
}) })
export class HeaderComponent implements OnInit { export class HeaderComponent implements OnInit, OnDestroy {
private _storeSubscription?: Subscription;
activeTaskList?: TaskList;
constructor( constructor(
private _dialog: MatDialog, private _dialog: MatDialog,
private _taskListService: TaskListService
) {} ) {}
ngOnInit(): void { ngOnInit(): void {
this._storeSubscription = this._taskListService.store$.subscribe(store => {
this.activeTaskList = store.taskLists.find(taskList => store.activeTaskListId === taskList.id);
});
}
ngOnDestroy(): void {
this._storeSubscription?.unsubscribe();
} }
openNewListForm(): void { openNewListForm(): void {

View File

@@ -3,4 +3,6 @@ import { TaskList } from "./task-list";
export interface Store { export interface Store {
activeTaskListId: string | undefined; activeTaskListId: string | undefined;
taskLists: TaskList[]; taskLists: TaskList[];
selectedTaskLists: TaskList[];
selectionMode: boolean;
} }

View File

@@ -29,7 +29,9 @@ export class StorePersistenceService {
} else { } else {
return { return {
activeTaskListId: undefined, activeTaskListId: undefined,
taskLists: [] taskLists: [],
selectedTaskLists: [],
selectionMode: false
} as Store; } as Store;
} }
} }

View File

@@ -15,55 +15,100 @@ export class TaskListService {
constructor( constructor(
private _storePersistenceService: StorePersistenceService private _storePersistenceService: StorePersistenceService
) { ) {
this.store$.subscribe(store => { this.store$.subscribe(store => {
this._storePersistenceService.save(store); this._storePersistenceService.save(store);
}); });
}
get store$(): Observable<Store> {
return this._store.asObservable()
.pipe(filter(store => !!store));
}
private get store(): Store {
return this._storePersistenceService.load();
}
addTask(task: Task): void {
const store = this.store;
const activeTaskList = store.taskLists.find(taskList => taskList.id === store.activeTaskListId);
if (!activeTaskList) {
throw new Error("No active tasklist");
} }
get store$(): Observable<Store> { if (!activeTaskList.tasks) {
return this._store.asObservable() activeTaskList.tasks = [];
.pipe(filter(store => !!store));
} }
private get store(): Store { activeTaskList?.tasks.push(task);
return this._storePersistenceService.load(); this._store.next(store);
}
createTaskList(taskListName: string): void {
const newTaskList = {
id: uuidv4(),
name: taskListName,
tasks: []
} as TaskList;
const store = this.store;
store.taskLists.push(newTaskList);
this._store.next(store);
}
getAll(): TaskList[] {
return this.store.taskLists ?? [];
}
setActive(taskList: TaskList) {
const store = this.store;
store.activeTaskListId = taskList.id;
this._store.next(store);
}
selectTaskList(taskList: TaskList): void {
this.enableSelectionMode();
const store = this.store;
if (!store.selectedTaskLists) {
store.selectedTaskLists = [];
} }
addTask(task: Task): void { if (store.selectedTaskLists.some(tl => tl.id === taskList.id)) {
const store = this.store; const selectedTaskListIndex = store.selectedTaskLists.findIndex(tl => tl.id === taskList.id);
const activeTaskList = store.taskLists.find(taskList => taskList.id === store.activeTaskListId); store.selectedTaskLists.splice(selectedTaskListIndex, 1);
if (!activeTaskList) {
throw new Error("No active tasklist");
}
if (!activeTaskList.tasks) { if (!store.selectedTaskLists.length) {
activeTaskList.tasks = []; store.selectionMode = false;
} }
activeTaskList?.tasks.push(task); this._store.next(store);
this._store.next(store); } else {
} store.selectedTaskLists.push(taskList);
createTaskList(taskListName: string): void {
const newTaskList = {
id: uuidv4(),
name: taskListName,
tasks: []
} as TaskList;
const store = this.store;
store.taskLists.push(newTaskList);
this._store.next(store);
}
getAll(): TaskList[] {
return this.store.taskLists ?? [];
}
setActive(taskList: TaskList) {
const store = this.store;
store.activeTaskListId = taskList.id;
this._store.next(store); this._store.next(store);
} }
} }
isSelected(taskList: TaskList): boolean {
const store = this.store;
return store.selectedTaskLists && store.selectedTaskLists.some(tl => tl.id === taskList.id);
}
isSelectionModeEnabled(): boolean {
return this.store.selectionMode;
}
enableSelectionMode(): void {
const store = this.store;
store.selectionMode = true;
this._store.next(store);
}
disableSelectionMode(): void {
const store = this.store;
store.selectionMode = true;
this._store.next(store);
}
}

View File

@@ -1,6 +1,6 @@
<div class="task-lists"> <div class="task-lists">
<div *ngFor="let taskList of taskLists" class="task-list-container"> <div *ngFor="let taskList of taskLists" class="task-list-container">
<div class="task-list shadowed" (click)="selectActiveTaskList(taskList)"> <div class="task-list shadowed" (click)="selectActiveTaskList(taskList)" (contextmenu)="$event.preventDefault(); onRightClick(taskList)">
<ng-container [ngPlural]="taskList.tasks?.length ?? 0"> <ng-container [ngPlural]="taskList.tasks?.length ?? 0">
<ng-template ngPluralCase=">1"> <ng-template ngPluralCase=">1">
{{taskList.tasks?.length}} tâches {{taskList.tasks?.length}} tâches
@@ -11,5 +11,8 @@
</ng-container> </ng-container>
</div> </div>
{{taskList.name}} {{taskList.name}}
<ng-container *ngIf="isSelectionModeEnabled() && isSelected(taskList)">
SELECTED
</ng-container>
</div> </div>
</div> </div>

View File

@@ -35,6 +35,22 @@ export class TaskListsComponent implements OnInit, OnDestroy {
} }
selectActiveTaskList(taskList: TaskList): void { selectActiveTaskList(taskList: TaskList): void {
this._taskListService.setActive(taskList); if (this.isSelectionModeEnabled()) {
this._taskListService.selectTaskList(taskList);
} else {
this._taskListService.setActive(taskList);
}
}
onRightClick(taskList: TaskList): void {
this._taskListService.selectTaskList(taskList);
}
isSelected(taskList: TaskList): boolean {
return this._taskListService.isSelected(taskList);
}
isSelectionModeEnabled(): boolean {
return this._taskListService.isSelectionModeEnabled();
} }
} }