Dependence milestone

This commit is contained in:
2026-05-30 08:32:08 +02:00
parent fb0e853122
commit 16a39ca5e7
12 changed files with 217 additions and 9 deletions
@@ -35,6 +35,8 @@ export class MilestoneDetail {
protected issueSearchQuery = '';
protected showIssueSuggestions = false;
protected moreMenuOpen = false;
protected showAddDependency = false;
protected selectedCandidateMilestoneId: number | null = null;
constructor() {
this.milestonesStore.load().then(() => {
@@ -60,6 +62,47 @@ export class MilestoneDetail {
});
}
protected get hasDependencies(): boolean {
return this.milestone.dependsOnIds.length > 0;
}
protected get dependencyIds(): number[] {
return this.milestone.dependsOnIds;
}
protected get availableCandidates(): MilestoneEntity[] {
return this.milestonesStore.milestones().filter(
(m) => m.id !== this.milestone.id && !this.milestone.dependsOnIds.includes(m.id),
);
}
protected resolveDependency(id: number): MilestoneEntity | undefined {
return this.milestonesStore.getById(id);
}
protected openAddDependency(): void {
this.selectedCandidateMilestoneId = null;
this.showAddDependency = true;
}
protected cancelAddDependency(): void {
this.showAddDependency = false;
this.selectedCandidateMilestoneId = null;
}
protected async confirmAddDependency(): Promise<void> {
if (this.selectedCandidateMilestoneId === null) return;
this.milestone.dependsOnIds = [...this.milestone.dependsOnIds, this.selectedCandidateMilestoneId];
this.selectedCandidateMilestoneId = null;
this.showAddDependency = false;
await this.saveMilestone();
}
protected async removeDependency(id: number): Promise<void> {
this.milestone.dependsOnIds = this.milestone.dependsOnIds.filter((depId) => depId !== id);
await this.saveMilestone();
}
protected get linkedIssues(): IssueEntity[] {
return this.issues().filter((i) => this.milestone.issueIds.includes(i.id));
}
@@ -269,9 +312,9 @@ export class MilestoneDetail {
private buildMilestone(): MilestoneEntity {
if (this.route.snapshot.routeConfig?.path === 'milestones/new') {
return { id: 0, name: '', description: '', startDate: '', endDate: '', dueDate: '', issueIds: [] };
return { id: 0, name: '', description: '', startDate: '', endDate: '', dueDate: '', issueIds: [], dependsOnIds: [] };
}
const id = Number(this.route.snapshot.paramMap.get('id') ?? 0);
return this.milestonesStore.getById(id) ?? { id, name: '', description: '', startDate: '', endDate: '', dueDate: '', issueIds: [] };
return this.milestonesStore.getById(id) ?? { id, name: '', description: '', startDate: '', endDate: '', dueDate: '', issueIds: [], dependsOnIds: [] };
}
}