Skip to content

Commit 93d9eb4

Browse files
Merge pull request #161 from aquality-automation/ai_resolutions
Ai resolutions
2 parents f9efc5a + 5d9e433 commit 93d9eb4

File tree

9 files changed

+52
-16
lines changed

9 files changed

+52
-16
lines changed

src/app/pages/administration/projects/settings/administration.projectSettings.component.html

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,10 @@
2626
<mat-slide-toggle *ngIf="projectToSave" id="steps-feature" [(ngModel)]="projectToSave.steps">Steps
2727
</mat-slide-toggle>
2828
</div>
29-
29+
<div class="col-sm-4 no-padding">
30+
<mat-slide-toggle *ngIf="projectToSave" id="ai-resolutions-feautre" [(ngModel)]="projectToSave.ai_resolutions">AI-resolutions
31+
</mat-slide-toggle>
32+
</div>
3033
<labeled-input *ngIf="projectToSave" [(ngModel)]="projectToSave.compare_result_pattern"
3134
label="Import Compare Results Pattern" id="compare-result-pattern-feature">
3235
</labeled-input>
@@ -40,4 +43,4 @@
4043
</div>
4144
</div>
4245
</div>
43-
</div>
46+
</div>

src/app/pages/administration/projects/settings/administration.projectSettings.component.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ export class AdministrationProjectSettingsComponent implements OnInit {
5757

5858
async updateProject() {
5959
this.projectToSave.steps = +this.projectToSave.steps;
60+
this.projectToSave.ai_resolutions = +this.projectToSave.ai_resolutions;
6061
this.selectedProject = await this.projectService.createProjects(this.projectToSave);
6162
this.projectService.handleSuccess(`'${this.projectToSave.name}' project was updated!`);
6263
this.projects = await this.projectService.getProjects({});
Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
<div class="panel-heading">
22
<div class="row">
3-
<div class="col-sm-6">
3+
<div class="col-sm-4">
44
<h2 id="issues-list">Issues</h2>
55
</div>
6-
<div *ngIf="canEdit" class="col-sm-6">
7-
<button class="btn btn-primary pull-right" id="create-issue-button" (click)="showCreate()">Create Issue</button>
6+
<div class="col-md-8">
7+
<div class="btn-group pull-right" role="group">
8+
<button *ngIf="canEdit" class="btn btn-primary" id="create-issue-button" (click)="showCreate()">Create Issue</button>
9+
<button *ngIf="isAiOn" class="btn btn-warning" id="generate-ai-issues" (click)="generateAiIssues()">Generate Issues with AI</button>
10+
</div>
811
</div>
912
</div>
1013
</div>
@@ -16,4 +19,4 @@ <h2 id="issues-list">Issues</h2>
1619
[hiddenColumns]="hiddenColumns" [defaultSortBy]="defSort" [queryParams]="true"
1720
(dataChange)="updateIssue($event)" (rowClick)="rowClicked($event)" rowsOnPage="20">
1821
</table-filter>
19-
</div>
22+
</div>

src/app/pages/project/issue/issue-list/issue-list.component.ts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import { ResultResolutionService } from 'src/app/services/result-resolution/resu
1010
import { TFColumn, TFSorting, TFOrder, TFColumnType } from 'src/app/elements/table-filter/tfColumn';
1111
import { ResultResolution } from 'src/app/shared/models/result-resolution';
1212
import { LocalPermissions } from 'src/app/shared/models/local-permissions';
13+
import {ProjectService} from '../../../../services/project/project.service';
1314

1415
@Component({
1516
templateUrl: './issue-list.component.html',
@@ -23,7 +24,8 @@ export class IssueListComponent implements OnInit {
2324
private route: ActivatedRoute,
2425
private issueService: IssueService,
2526
private permissions: PermissionsService,
26-
private resolutionService: ResultResolutionService
27+
private resolutionService: ResultResolutionService,
28+
private projectService: ProjectService
2729
) { }
2830

2931
projectId: number;
@@ -37,16 +39,18 @@ export class IssueListComponent implements OnInit {
3739
statuses: Label[];
3840
defSort: TFSorting = { property: 'created', order: TFOrder.asc };
3941
hideCreateModal = true;
42+
isAiOn: boolean;
4043

4144
async ngOnInit() {
4245
this.projectId = this.route.snapshot.params.projectId;
43-
[this.issues, this.resolutions, this.canEdit, this.projectUsers, this.statuses] = await Promise.all([
46+
[this.issues, this.resolutions, this.canEdit, this.projectUsers, this.statuses, this.isAiOn] = await Promise.all([
4447
this.issueService.getIssues({ project_id: this.projectId }),
4548
this.resolutionService.getResolution(this.projectId),
4649
this.permissions.hasProjectPermissions(this.projectId,
4750
[EGlobalPermissions.manager], [ELocalPermissions.manager, ELocalPermissions.engineer]),
4851
this.userService.getProjectUsers(this.projectId),
49-
this.issueService.getIssueStatuses()
52+
this.issueService.getIssueStatuses(),
53+
((await this.projectService.getProject(this.projectId)).ai_resolutions === 1)
5054
]);
5155
this.projectUsers = this.projectUsers.filter(user => user.admin === 1 || user.manager === 1 || user.engineer === 1);
5256
this.users = this.projectUsers.map(x => x.user);
@@ -79,6 +83,9 @@ export class IssueListComponent implements OnInit {
7983
showCreate() {
8084
this.hideCreateModal = false;
8185
}
86+
generateAiIssues() {
87+
this.issueService.getAiIssues(this.projectId);
88+
}
8289

8390
async execute(result: {executed: boolean, result?: Issue}) {
8491
this.hideCreateModal = true;

src/app/pages/project/issue/issue-view/issue-view.component.html

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@ <h2 id="issue-view">Issue {{issue.id}} <span id="status-badge" class="badge" [ng
1919
(click)="setStatus(4)">Mark as Done</button>
2020
<button *ngIf="+issue.status.id !== 1" id="reopen" type="button" class="btn btn-primary"
2121
(click)="setStatus(1)">Re Open</button>
22+
<button *ngIf="+issue.status.id !== 1" class="btn btn-warning" type="button" id="save-and-unassign"
23+
(click)="saveExpressionAndUnassignIssue()"
24+
title="Save issue. Unassign this issue to all results where Fail Reason fits the Expression and without assigned issue">Save
25+
and Unassign</button>
2226
<button *ngIf="+issue.status.id === 3" id="cannot-reproduce" type="button" class="btn btn-info"
2327
(click)="setStatus(2)">Can Not Reproduce</button>
2428
<button *ngIf="+issue.status.id !== 4" id="save" type="button" class="btn btn-success"
@@ -82,7 +86,7 @@ <h2 id="issue-view">Issue {{issue.id}} <span id="status-badge" class="badge" [ng
8286
<div class="input-group">
8387
<input id="issue-expression" type="text" class="form-control" placeholder="Regular Expression"
8488
name="expression" #expression="ngModel" [ngClass]="{
85-
'is-valid': !isExpressionOverlapped() && !isExpressionInvalid() && expression.touched,
89+
'is-valid': !isExpressionOverlapped() && !isExpressionInvalid() && expression.touched,
8690
'is-invalid': isExpressionOverlapped() || isExpressionInvalid()
8791
}" [(ngModel)]="issue.expression" [disabled]="!canEdit || issue.status_id === 4"
8892
(keyup)="onExpressionUpdate()">
@@ -99,6 +103,9 @@ <h2 id="issue-view">Issue {{issue.id}} <span id="status-badge" class="badge" [ng
99103
title="Save issue. Assign this issue to all results where Fail Reason fits the Expression and without assigned issue">Save
100104
and Assign</button>
101105
</div>
106+
<div *ngIf="!isExpressionOverlapped() && !isExpressionInvalid() && canEdit && issue.status_id !== 4"
107+
class="input-group-append">
108+
</div>
102109
</div>
103110
</div>
104111
<div class="col-sm-12 no-padding">
@@ -143,4 +150,4 @@ <h2 id="issue-view">Issue {{issue.id}} <span id="status-badge" class="badge" [ng
143150
</div>
144151
</div>
145152
</div>
146-
</div>
153+
</div>

src/app/pages/project/issue/issue-view/issue-view.component.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,14 @@ export class IssueViewComponent implements OnInit {
129129
});
130130
}
131131

132+
async saveExpressionAndUnassignIssue() {
133+
this.issue = await this.issueService.createIssue(this.issue, false, true);
134+
this.affectedTests = await this.testService.getTestByIssue({
135+
issueId: this.issue.id,
136+
projectId: this.projectId,
137+
});
138+
}
139+
132140
async saveIssue() {
133141
if (this.issue.title) {
134142
this.issue = await this.issueService.createIssue(this.issue, false);

src/app/pages/project/testrun/testrun-list/testrun-list.component.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
(execute)="execute($event)" (closed)="wasClosed()"></app-modal>
44
<div class="row">
55
<div class="col-sm-12">
6-
<testrun-result-timeline *ngIf="testrunStatsFiltered" [testrunsStat]="testrunStatsFiltered"></testrun-result-timeline>
6+
<testrun-result-timeline [testrunsStat]="testrunStatsFiltered"></testrun-result-timeline>
77
<br>
88
<div class="pull-right btn-group right-actions">
99
<button id="resultAsCSV" class="btn btn-primary" (click)="uploadResults()">Results As CSV</button>
@@ -18,4 +18,4 @@
1818
[queryParams]="true" (rowClick)="rowClicked($event)" (dataChange)="testrunUpdate($event)" (action)="handleAction($event)"></table-filter>
1919
</div>
2020
</div>
21-
</div>
21+
</div>

src/app/services/issue/issue.service.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,15 @@ export class IssueService extends BaseHttpService {
99

1010
endpoints = {
1111
issues: '/issues',
12-
statuses: '/issue/status'
12+
statuses: '/issue/status',
13+
ai_issues: '/issues/ai'
1314
};
1415

1516
getIssues(issue: Issue): Promise<Issue[]> {
1617
return this.http.get<Issue[]>(this.endpoints.issues, { params: this.convertToParams(issue) }).toPromise();
1718
}
1819

19-
async createIssue(issue: Issue, updateResults: boolean = false): Promise<Issue> {
20+
async createIssue(issue: Issue, updateResults: boolean = false, unassignIssue: boolean = false): Promise<Issue> {
2021
if (!issue.expression) {
2122
updateResults = false;
2223
}
@@ -29,7 +30,8 @@ export class IssueService extends BaseHttpService {
2930
issue.external_url = DefaultProperties.blank;
3031
}
3132

32-
const result = await this.http.post<Issue>(this.endpoints.issues, issue, {params: { assign: String(updateResults) }}).toPromise();
33+
const result = await this.http.post<Issue>(this.endpoints.issues, issue, {params: { assign: String(updateResults),
34+
unassign: String(unassignIssue) }}).toPromise();
3335
issue.id
3436
? this.handleSuccess(`The issue '${issue.title}' was updated.`)
3537
: this.handleSuccess(`The issue '${issue.title}' was created.`);
@@ -40,4 +42,8 @@ export class IssueService extends BaseHttpService {
4042
getIssueStatuses(): Promise<Label[]> {
4143
return this.http.get<Label[]>(this.endpoints.statuses).toPromise();
4244
}
45+
46+
getAiIssues(project_id: number): Promise<Label[]> {
47+
return this.http.get<Label[]>(this.endpoints.ai_issues, { params: { project_id: project_id.toString()}}).toPromise();
48+
}
4349
}

src/app/shared/models/project.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ export class Project {
1111
steps?: boolean | number;
1212
compare_result_pattern?: string;
1313
stability_count?: number;
14+
ai_resolutions?: boolean | number;
1415
}
1516

1617
export class ImportBodyPattern {

0 commit comments

Comments
 (0)