Suppression d'une issue
This commit is contained in:
@@ -12,6 +12,8 @@ export type IssueEntity = {
|
||||
name: string;
|
||||
dueDate: string;
|
||||
description: string;
|
||||
estimatedTime: number | null;
|
||||
dependsOnIds: number[];
|
||||
priority: IssuePriority;
|
||||
status: IssueStatus;
|
||||
progress: number;
|
||||
@@ -25,6 +27,8 @@ const DEFAULT_ISSUES: IssueEntity[] = [
|
||||
name: 'Bug affichage menu mobile',
|
||||
dueDate: '2026-06-10',
|
||||
description: 'Corriger le comportement du menu sur petits ecrans.',
|
||||
estimatedTime: 8,
|
||||
dependsOnIds: [],
|
||||
priority: 'Haute',
|
||||
status: 'in-progress',
|
||||
progress: 35,
|
||||
@@ -36,6 +40,8 @@ const DEFAULT_ISSUES: IssueEntity[] = [
|
||||
name: 'Erreur validation formulaire projet',
|
||||
dueDate: '2026-06-12',
|
||||
description: 'Fiabiliser les regles de validation du formulaire projet.',
|
||||
estimatedTime: 16,
|
||||
dependsOnIds: [],
|
||||
priority: 'Moyenne',
|
||||
status: 'todo',
|
||||
progress: 20,
|
||||
@@ -47,6 +53,8 @@ const DEFAULT_ISSUES: IssueEntity[] = [
|
||||
name: 'Mise a jour message de bienvenue',
|
||||
dueDate: '2026-06-18',
|
||||
description: 'Mettre a jour le wording d accueil selon la charte produit.',
|
||||
estimatedTime: 4,
|
||||
dependsOnIds: [],
|
||||
priority: 'Basse',
|
||||
status: 'done',
|
||||
progress: 100,
|
||||
@@ -60,7 +68,7 @@ export class IssuesStore {
|
||||
constructor() {
|
||||
const cachedIssues = this.readFromStorage();
|
||||
if (cachedIssues) {
|
||||
this.data.set(cachedIssues);
|
||||
this.data.set(cachedIssues.map((issue) => this.normalizeIssue(issue)));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -75,23 +83,73 @@ export class IssuesStore {
|
||||
return ids.length > 0 ? Math.max(...ids) + 1 : 1;
|
||||
}
|
||||
|
||||
createDraftIssue(): IssueEntity {
|
||||
const draftIssue: IssueEntity = this.normalizeIssue({
|
||||
id: this.getNextId(),
|
||||
assignee: '',
|
||||
epic: '',
|
||||
name: '',
|
||||
dueDate: '',
|
||||
description: '',
|
||||
estimatedTime: null,
|
||||
dependsOnIds: [],
|
||||
priority: 'Moyenne',
|
||||
status: 'draft',
|
||||
progress: 0,
|
||||
});
|
||||
|
||||
this.upsert(draftIssue);
|
||||
return draftIssue;
|
||||
}
|
||||
|
||||
upsert(issue: IssueEntity): void {
|
||||
const normalizedIssue = this.normalizeIssue(issue);
|
||||
|
||||
this.data.update((issues) => {
|
||||
const existingIndex = issues.findIndex((current) => current.id === issue.id);
|
||||
|
||||
if (existingIndex === -1) {
|
||||
const created = [...issues, issue];
|
||||
const created = [...issues, normalizedIssue];
|
||||
this.persistToStorage(created);
|
||||
return created;
|
||||
}
|
||||
|
||||
const updated = [...issues];
|
||||
updated[existingIndex] = issue;
|
||||
updated[existingIndex] = normalizedIssue;
|
||||
this.persistToStorage(updated);
|
||||
return updated;
|
||||
});
|
||||
}
|
||||
|
||||
deleteById(id: number): void {
|
||||
this.data.update((issues) => {
|
||||
const updated = issues
|
||||
.filter((issue) => issue.id !== id)
|
||||
.map((issue) => ({
|
||||
...issue,
|
||||
dependsOnIds: issue.dependsOnIds.filter((dependencyId) => dependencyId !== id),
|
||||
}));
|
||||
|
||||
this.persistToStorage(updated);
|
||||
return updated;
|
||||
});
|
||||
}
|
||||
|
||||
private normalizeIssue(
|
||||
issue: Partial<IssueEntity> & { dependsOnId?: number | null },
|
||||
): IssueEntity {
|
||||
const legacyDependency = typeof issue.dependsOnId === 'number' ? [issue.dependsOnId] : [];
|
||||
const normalizedDependencies = Array.isArray(issue.dependsOnIds)
|
||||
? issue.dependsOnIds.filter((value): value is number => typeof value === 'number')
|
||||
: legacyDependency;
|
||||
|
||||
return {
|
||||
...issue,
|
||||
estimatedTime: issue.estimatedTime ?? null,
|
||||
dependsOnIds: normalizedDependencies,
|
||||
} as IssueEntity;
|
||||
}
|
||||
|
||||
private readFromStorage(): IssueEntity[] | null {
|
||||
if (typeof window === 'undefined') {
|
||||
return null;
|
||||
|
||||
Reference in New Issue
Block a user