Ajout du type d'issue dans les détails et la liste des issues

This commit is contained in:
Cédric OLIVIER
2026-05-22 18:40:19 +02:00
parent 26dfbae927
commit ecf55392fd
4 changed files with 42 additions and 16 deletions
+15 -16
View File
@@ -22,7 +22,6 @@
<div class="header-actions"> <div class="header-actions">
@if (!isEditing) { @if (!isEditing) {
<button type="button" class="edit-button" (click)="startEdit()">Editer l'issue</button> <button type="button" class="edit-button" (click)="startEdit()">Editer l'issue</button>
}
<div class="more-wrapper"> <div class="more-wrapper">
<button type="button" class="more-button" (click)="toggleMoreMenu()">More ▾</button> <button type="button" class="more-button" (click)="toggleMoreMenu()">More ▾</button>
@@ -34,6 +33,7 @@
</div> </div>
} }
</div> </div>
}
</div> </div>
</div> </div>
</header> </header>
@@ -55,6 +55,20 @@
} }
</td> </td>
</tr> </tr>
<tr>
<th>Type</th>
<td>
@if (isEditing) {
<select [(ngModel)]="issueTypeValue">
@for (type of typeOptions; track type) {
<option [value]="type">{{ type }}</option>
}
</select>
} @else {
{{ issueTypeValue }}
}
</td>
</tr>
<tr> <tr>
<th>Epic</th> <th>Epic</th>
<td> <td>
@@ -135,21 +149,6 @@
} }
</td> </td>
</tr> </tr>
<tr>
<th>Status</th>
<td>
@if (isEditing) {
<select [(ngModel)]="issue.status">
<option value="draft">draft</option>
<option value="todo">todo</option>
<option value="done">done</option>
<option value="in-progress">in-progress</option>
</select>
} @else {
{{ issue.status }}
}
</td>
</tr>
<tr> <tr>
<th>Progression</th> <th>Progression</th>
<td> <td>
@@ -27,6 +27,13 @@ export class IssueDetail {
'done', 'done',
]; ];
protected readonly typeOptions: IssueEntity['type'][] = [
'Bug',
'Study',
'Story',
'Technical Story',
];
protected get dependencyIds(): number[] { protected get dependencyIds(): number[] {
return this.issue.dependsOnIds; return this.issue.dependsOnIds;
} }
@@ -45,6 +52,14 @@ export class IssueDetail {
this.issue.estimatedTime = value === null || value === undefined ? null : Number(value); this.issue.estimatedTime = value === null || value === undefined ? null : Number(value);
} }
protected get issueTypeValue(): IssueEntity['type'] {
return this.issue.type;
}
protected set issueTypeValue(value: IssueEntity['type']) {
this.issue.type = value;
}
constructor() { constructor() {
if (this.isEditing) { if (this.isEditing) {
this.issueBeforeEdit = this.cloneIssue(this.issue); this.issueBeforeEdit = this.cloneIssue(this.issue);
@@ -54,6 +69,7 @@ export class IssueDetail {
protected startEdit(): void { protected startEdit(): void {
this.issueBeforeEdit = this.cloneIssue(this.issue); this.issueBeforeEdit = this.cloneIssue(this.issue);
this.isEditing = true; this.isEditing = true;
this.closeMoreMenu();
} }
protected cancelEdit(): void { protected cancelEdit(): void {
@@ -119,6 +135,7 @@ export class IssueDetail {
if (isNewIssueRoute) { if (isNewIssueRoute) {
return { return {
id: safeId, id: safeId,
type: 'Story',
assignee: '', assignee: '',
epic: '', epic: '',
name: '', name: '',
@@ -137,6 +154,7 @@ export class IssueDetail {
return ( return (
existingIssue ?? { existingIssue ?? {
id: safeId, id: safeId,
type: 'Story',
assignee: '', assignee: '',
epic: '', epic: '',
name: '', name: '',
+2
View File
@@ -13,6 +13,7 @@
<thead> <thead>
<tr> <tr>
<th>Titre</th> <th>Titre</th>
<th>Type</th>
<th>Priorite</th> <th>Priorite</th>
<th>Statut</th> <th>Statut</th>
<th>Assignee</th> <th>Assignee</th>
@@ -27,6 +28,7 @@
(keydown.enter)="openIssue(issue.id)" (keydown.enter)="openIssue(issue.id)"
> >
<td>{{ issue.name }}</td> <td>{{ issue.name }}</td>
<td>{{ issue.type }}</td>
<td>{{ issue.priority }}</td> <td>{{ issue.priority }}</td>
<td>{{ issue.status }}</td> <td>{{ issue.status }}</td>
<td>{{ issue.assignee }}</td> <td>{{ issue.assignee }}</td>
+7
View File
@@ -4,9 +4,11 @@ const ISSUES_STORAGE_KEY = 'bonsai.issues';
export type IssueStatus = 'draft' | 'todo' | 'done' | 'in-progress'; export type IssueStatus = 'draft' | 'todo' | 'done' | 'in-progress';
export type IssuePriority = 'Basse' | 'Moyenne' | 'Haute'; export type IssuePriority = 'Basse' | 'Moyenne' | 'Haute';
export type IssueType = 'Bug' | 'Study' | 'Story' | 'Technical Story';
export type IssueEntity = { export type IssueEntity = {
id: number; id: number;
type: IssueType;
assignee: string; assignee: string;
epic: string; epic: string;
name: string; name: string;
@@ -22,6 +24,7 @@ export type IssueEntity = {
const DEFAULT_ISSUES: IssueEntity[] = [ const DEFAULT_ISSUES: IssueEntity[] = [
{ {
id: 1, id: 1,
type: 'Bug',
assignee: 'Marie', assignee: 'Marie',
epic: 'EPIC-UI', epic: 'EPIC-UI',
name: 'Bug affichage menu mobile', name: 'Bug affichage menu mobile',
@@ -35,6 +38,7 @@ const DEFAULT_ISSUES: IssueEntity[] = [
}, },
{ {
id: 2, id: 2,
type: 'Study',
assignee: 'Nabil', assignee: 'Nabil',
epic: 'EPIC-FORM', epic: 'EPIC-FORM',
name: 'Erreur validation formulaire projet', name: 'Erreur validation formulaire projet',
@@ -48,6 +52,7 @@ const DEFAULT_ISSUES: IssueEntity[] = [
}, },
{ {
id: 3, id: 3,
type: 'Story',
assignee: 'Sonia', assignee: 'Sonia',
epic: 'EPIC-CONTENT', epic: 'EPIC-CONTENT',
name: 'Mise a jour message de bienvenue', name: 'Mise a jour message de bienvenue',
@@ -86,6 +91,7 @@ export class IssuesStore {
createDraftIssue(): IssueEntity { createDraftIssue(): IssueEntity {
const draftIssue: IssueEntity = this.normalizeIssue({ const draftIssue: IssueEntity = this.normalizeIssue({
id: this.getNextId(), id: this.getNextId(),
type: 'Story',
assignee: '', assignee: '',
epic: '', epic: '',
name: '', name: '',
@@ -145,6 +151,7 @@ export class IssuesStore {
return { return {
...issue, ...issue,
type: issue.type ?? 'Story',
estimatedTime: issue.estimatedTime ?? null, estimatedTime: issue.estimatedTime ?? null,
dependsOnIds: normalizedDependencies, dependsOnIds: normalizedDependencies,
} as IssueEntity; } as IssueEntity;