Skip to content

Commit 6810d29

Browse files
authored
Version 3.5.0: Align with backend and add deleted toggle switch (#44)
1 parent 5d06ef4 commit 6810d29

18 files changed

+1507
-927
lines changed

openapi.json

+1,243-721
Large diffs are not rendered by default.

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "resc-frontend",
3-
"version": "3.3.2",
3+
"version": "3.5.0",
44
"author": "ABN AMRO Bank",
55
"description": "Repository Scanner Frontend",
66
"license": "MIT",

src/components/Filters/RepositoriesPageFilter.vue

+18-3
Original file line numberDiff line numberDiff line change
@@ -24,15 +24,25 @@
2424
</div>
2525

2626
<!-- Include zero finding repos -->
27-
<div class="row">
28-
<div class="col-md-2">
27+
<div class="row pt-3">
28+
<div class="col-md-3 text-start">
2929
<b-form-checkbox
3030
v-model="includeZeroFindingRepos"
3131
name="check-button"
3232
switch
3333
@change="toggleIncludeZeroFindingRepos"
3434
>
35-
<small class="text-nowrap">Display repositories with 0 findings</small>
35+
<small class="text-nowrap">Display repositories with 0 findings.</small>
36+
</b-form-checkbox>
37+
</div>
38+
<div class="col-md-4 text-start">
39+
<b-form-checkbox
40+
v-model="includeDeletedRepositories"
41+
name="check-button"
42+
switch
43+
@change="toggleincludeDeletedRepositories"
44+
>
45+
<small class="text-nowrap">Display repositories marked as deleted.</small>
3646
</b-form-checkbox>
3747
</div>
3848
</div>
@@ -62,6 +72,7 @@ const selectedVcsProvider = ref(props.vcsProviderSelected);
6272
const selectedProject = ref(props.projectSelected);
6373
const selectedRepository = ref(props.repositorySelected);
6474
const includeZeroFindingRepos = ref(false);
75+
const includeDeletedRepositories = ref(false);
6576
6677
const emit = defineEmits(['on-filter-change']);
6778
@@ -80,6 +91,9 @@ function onVcsProviderChange(vcsProvider: VCSProviders[]) {
8091
function toggleIncludeZeroFindingRepos() {
8192
handleFilterChange();
8293
}
94+
function toggleincludeDeletedRepositories() {
95+
handleFilterChange();
96+
}
8397
8498
function handleFilterChange() {
8599
// Refresh table data in Repositories page
@@ -89,6 +103,7 @@ function handleFilterChange() {
89103
selectedProject.value,
90104
selectedRepository.value,
91105
includeZeroFindingRepos.value,
106+
includeDeletedRepositories.value,
92107
);
93108
}
94109
</script>

src/components/Filters/RuleAnalysisFilter.vue

+20-2
Original file line numberDiff line numberDiff line change
@@ -89,8 +89,6 @@
8989
@set-rule-pack-versions-on-rule-pack-filter="setRulePackVersionsOnRulePackFilter"
9090
/>
9191
</div>
92-
<!-- </div>
93-
<div class="row"> -->
9492
<!-- Rule Tags Filter -->
9593
<div class="col-md-3">
9694
<RuleTagsFilter
@@ -100,6 +98,21 @@
10098
/>
10199
</div>
102100
</div>
101+
102+
<div class="row pt-3">
103+
<div class="col-md-4 text-start">
104+
<b-form-checkbox
105+
v-model="includeDeletedRepositories"
106+
name="check-button"
107+
switch
108+
@change="handleFilterChange"
109+
>
110+
<small class="text-nowrap"
111+
>Display findings for repositories marked as deleted.</small
112+
>
113+
</b-form-checkbox>
114+
</div>
115+
</div>
103116
</b-collapse>
104117
</div>
105118
</div>
@@ -150,6 +163,7 @@ export type RuleAnalysisFilter = {
150163
rule: string[];
151164
ruleTags: string[];
152165
rulePackVersions: string[];
166+
includeDeletedRepositories: boolean;
153167
};
154168
155169
const optionsRules = ref([] as string[]);
@@ -165,6 +179,7 @@ const selectedRule = ref([] as string[]);
165179
const selectedRuleTags = ref([] as string[]);
166180
const selectedRulePackVersions = ref([] as RulePackRead[]);
167181
const advancedSearchVisible = ref(false);
182+
const includeDeletedRepositories = ref(false);
168183
169184
const emit = defineEmits(['on-filter-change']);
170185
@@ -255,6 +270,7 @@ function handleFilterChange() {
255270
rule: selectedRule.value,
256271
rulePackVersions: rulePackVersionsValues,
257272
ruleTags: selectedRuleTags.value,
273+
includeDeletedRepositories: includeDeletedRepositories.value,
258274
};
259275
emit('on-filter-change', filterObj);
260276
}
@@ -274,6 +290,7 @@ function fetchAllDetectedRules() {
274290
CommonUtils.stringify_date(startDate.value),
275291
CommonUtils.stringify_date(endDate.value),
276292
rulePackVersionsFetched,
293+
includeDeletedRepositories.value,
277294
)
278295
.then((response) => {
279296
optionsRules.value = response.data;
@@ -333,6 +350,7 @@ function applyRuleFilterInRuleAnalysisPage() {
333350
rule: selectedRules,
334351
ruleTags: selectedRuleTags.value,
335352
rulePackVersions: selectedVersions,
353+
includeDeletedRepositories: includeDeletedRepositories.value,
336354
};
337355
338356
//Populate rule analysis list based on rule filter

src/components/Findings/FindingsTable.vue

+1-1
Original file line numberDiff line numberDiff line change
@@ -291,7 +291,7 @@ function closeDetails() {
291291
292292
function openCommitUrl() {
293293
const url = getCurrentFindingSelected()?.commit_url;
294-
if (url !== undefined) {
294+
if (url !== undefined && url !== null) {
295295
window.open(url, '_blank')?.focus();
296296
}
297297
}

src/components/Metrics/RuleMetrics.vue

+19-2
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,18 @@
2424
/>
2525
</div>
2626
</div>
27+
<div class="row pl-3 pt-3">
28+
<div class="col-md-4 text-start">
29+
<BFormCheckbox
30+
v-model="includeDeletedRepositories"
31+
name="check-button"
32+
switch
33+
@change="fetchRulesWithFindingStatusCount"
34+
>
35+
<small class="text-nowrap">Include data from repositories marked as deleted.</small>
36+
</BFormCheckbox>
37+
</div>
38+
</div>
2739

2840
<!--Rule Metrics Table -->
2941
<div v-if="!hasRecords && loadedData" class="text-center cursor-default">
@@ -157,7 +169,7 @@ import type {
157169
} from '@/services/shema-to-types';
158170
import { useRouter } from 'vue-router';
159171
import type { AxiosResponse } from 'axios';
160-
import type { TableItem } from 'bootstrap-vue-next';
172+
import type { TableItem, BFormCheckbox } from 'bootstrap-vue-next';
161173
import CommonUtils from '@/utils/common-utils';
162174
163175
const loadedData = ref(false);
@@ -195,6 +207,7 @@ const selectedRuleTags = ref([] as string[]);
195207
const selectedVersionsList = ref([] as RulePackRead[]);
196208
const selectedVersions = ref([] as string[]);
197209
const ruleTotalRowClass = ref(['text-start', 'fw-bold']);
210+
const includeDeletedRepositories = ref(false);
198211
199212
type FieldType = {
200213
key: string;
@@ -298,7 +311,11 @@ function fetchRuleTags() {
298311
299312
function fetchRulesWithFindingStatusCount() {
300313
loadedData.value = false;
301-
RuleService.getRulesWithFindingStatusCount(selectedVersions.value, selectedRuleTags.value)
314+
RuleService.getRulesWithFindingStatusCount(
315+
selectedVersions.value,
316+
selectedRuleTags.value,
317+
includeDeletedRepositories.value,
318+
)
302319
.then((response: AxiosResponse<RuleFindingCountModel[]>) => {
303320
getTotalCountRowValuesForRuleMetricsTable(response.data);
304321
loadedData.value = true;

src/components/ScanFindings/FindingPanel.vue

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<div class="col-md-5">
66
<b-card-text
77
><span class="fw-bold">Commit ID: </span
8-
><a class="custom-link" v-bind:href="findingRef.commit_url" target="_blank">{{
8+
><a class="custom-link" v-bind:href="findingRef.commit_url ?? ''" target="_blank">{{
99
findingRef.commit_id
1010
}}</a></b-card-text
1111
>

src/services/findings-service.ts

+7
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ export type QueryFilterType = {
1818
endDate?: string | undefined;
1919
rulePackVersions?: string[];
2020
ruleTags?: string[];
21+
includeDeletedRepositories?: boolean;
2122
skip: number;
2223
limit: number;
2324
};
@@ -69,6 +70,12 @@ const FindingsService = {
6970
queryString += QueryUtils.appendIf('end_date_time', filter.endDate, 'T23:59:59');
7071
queryString += QueryUtils.appendArrayIf('rule_pack_versions', filter.rulePackVersions);
7172
queryString += QueryUtils.appendArrayIf('rule_tags', filter.ruleTags);
73+
if (filter.includeDeletedRepositories) {
74+
queryString += QueryUtils.appendBool(
75+
'include_deleted_repositories',
76+
filter.includeDeletedRepositories,
77+
);
78+
}
7279
if (queryString !== '') {
7380
queryString = queryString.substring(1);
7481
} else {

src/services/repository-service.ts

+25-13
Original file line numberDiff line numberDiff line change
@@ -12,19 +12,23 @@ const RepositoryService = {
1212
vcsTypeList: string[],
1313
projectFilter: string | undefined,
1414
repositoryFilter: string | undefined,
15-
includeZeroFindingRepos = true,
15+
includeZeroFindingRepos: boolean,
16+
includeDeletedRepos: boolean,
1617
): Promise<
1718
AxiosResponse<
1819
paths['/resc/v1/repositories/findings-metadata/']['get']['responses']['200']['content']['application/json']
1920
>
2021
> {
2122
let queryParams = '';
22-
queryParams += QueryUtils.appendExplodArrayIf('vcsprovider', vcsTypeList);
23+
queryParams += QueryUtils.appendExplodArrayIf('vcs_provider', vcsTypeList);
2324
queryParams += QueryUtils.appendIf('skip', skipRowCount);
2425
queryParams += QueryUtils.appendIf('limit', perPage);
25-
queryParams += QueryUtils.appendIf('projectfilter', projectFilter);
26-
queryParams += QueryUtils.appendIf('repositoryfilter', repositoryFilter);
27-
queryParams += QueryUtils.appendBool('onlyifhasfindings', includeZeroFindingRepos === false);
26+
queryParams += QueryUtils.appendIf('project_filter', projectFilter);
27+
queryParams += QueryUtils.appendIf('repository_filter', repositoryFilter);
28+
queryParams += QueryUtils.appendBool('only_if_has_findings', includeZeroFindingRepos === false);
29+
if (includeDeletedRepos) {
30+
queryParams += QueryUtils.appendBool('include_deleted_repositories', includeDeletedRepos);
31+
}
2832
if (queryParams) {
2933
queryParams = queryParams.slice(1);
3034
}
@@ -53,16 +57,20 @@ const RepositoryService = {
5357
async getDistinctProjects(
5458
vcsTypeList: string[],
5559
repositoryFilter: string | undefined,
56-
includeZeroFindingRepos = true,
60+
includeZeroFindingRepos: boolean,
61+
includeDeletedRepos: boolean,
5762
): Promise<
5863
AxiosResponse<
5964
paths['/resc/v1/repositories/distinct-projects/']['get']['responses']['200']['content']['application/json']
6065
>
6166
> {
6267
let queryParams = '';
63-
queryParams += QueryUtils.appendExplodArrayIf('vcsprovider', vcsTypeList);
64-
queryParams += QueryUtils.appendIf('repositoryfilter', repositoryFilter);
65-
queryParams += QueryUtils.appendBool('onlyifhasfindings', includeZeroFindingRepos === false);
68+
queryParams += QueryUtils.appendExplodArrayIf('vcs_provider', vcsTypeList);
69+
queryParams += QueryUtils.appendIf('repository_filter', repositoryFilter);
70+
queryParams += QueryUtils.appendBool('only_if_has_findings', includeZeroFindingRepos === false);
71+
if (includeDeletedRepos) {
72+
queryParams += QueryUtils.appendBool('include_deleted_repositories', includeDeletedRepos);
73+
}
6674
if (queryParams) {
6775
queryParams = queryParams.slice(1);
6876
}
@@ -73,16 +81,20 @@ const RepositoryService = {
7381
async getDistinctRepositories(
7482
vcsTypeList: string[],
7583
projectFilter: string | undefined,
76-
includeZeroFindingRepos = true,
84+
includeZeroFindingRepos: boolean,
85+
includeDeletedRepos: boolean,
7786
): Promise<
7887
AxiosResponse<
7988
paths['/resc/v1/repositories/distinct-repositories/']['get']['responses']['200']['content']['application/json']
8089
>
8190
> {
8291
let queryParams = '';
83-
queryParams += QueryUtils.appendExplodArrayIf('vcsprovider', vcsTypeList);
84-
queryParams += QueryUtils.appendIf('projectname', projectFilter);
85-
queryParams += QueryUtils.appendBool('onlyifhasfindings', includeZeroFindingRepos === false);
92+
queryParams += QueryUtils.appendExplodArrayIf('vcs_provider', vcsTypeList);
93+
queryParams += QueryUtils.appendIf('project_name', projectFilter);
94+
queryParams += QueryUtils.appendBool('only_if_has_findings', includeZeroFindingRepos === false);
95+
if (includeDeletedRepos) {
96+
queryParams += QueryUtils.appendBool('include_deleted_repositories', includeDeletedRepos);
97+
}
8698
if (queryParams) {
8799
queryParams = queryParams.slice(1);
88100
}

src/services/rule-service.ts

+17-3
Original file line numberDiff line numberDiff line change
@@ -15,19 +15,26 @@ const RuleService = {
1515
startDate: string | undefined,
1616
endDate: string | undefined,
1717
rulePackVersions: string[] | null,
18+
includeDeletedRepositories: boolean,
1819
): Promise<
1920
AxiosResponse<
2021
paths['/resc/v1/detected-rules']['get']['responses']['200']['content']['application/json']
2122
>
2223
> {
2324
let queryParams = '';
2425
queryParams += QueryUtils.appendExplodArrayIf('findingstatus', findingStatusList);
25-
queryParams += QueryUtils.appendExplodArrayIf('vcsprovider', vcsTypeList);
26-
queryParams += QueryUtils.appendIf('projectname', projectFilter);
27-
queryParams += QueryUtils.appendIf('repositoryname', repositoryFilter);
26+
queryParams += QueryUtils.appendExplodArrayIf('vcs_provider', vcsTypeList);
27+
queryParams += QueryUtils.appendIf('project_name', projectFilter);
28+
queryParams += QueryUtils.appendIf('repository_name', repositoryFilter);
2829
queryParams += QueryUtils.appendIf('start_date_time', startDate, 'T00:00:00');
2930
queryParams += QueryUtils.appendIf('end_date_time', endDate, 'T23:59:59');
3031
queryParams += QueryUtils.appendExplodArrayIf('rule_pack_version', rulePackVersions);
32+
if (includeDeletedRepositories) {
33+
queryParams += QueryUtils.appendBool(
34+
'include_deleted_repositories',
35+
includeDeletedRepositories,
36+
);
37+
}
3138
if (queryParams) {
3239
queryParams = queryParams.slice(1);
3340
}
@@ -38,6 +45,7 @@ const RuleService = {
3845
async getRulesWithFindingStatusCount(
3946
rulePackVersions: string[] | null,
4047
ruleTags: string[] | null,
48+
includeDeletedRepositories: boolean,
4149
): Promise<
4250
AxiosResponse<
4351
paths['/resc/v1/rules/finding-status-count']['get']['responses']['200']['content']['application/json']
@@ -46,6 +54,12 @@ const RuleService = {
4654
let queryParams = '';
4755
queryParams += QueryUtils.appendExplodArrayIf('rule_pack_version', rulePackVersions);
4856
queryParams += QueryUtils.appendExplodArrayIf('rule_tag', ruleTags);
57+
if (includeDeletedRepositories) {
58+
queryParams += QueryUtils.appendBool(
59+
'include_deleted_repositories',
60+
includeDeletedRepositories,
61+
);
62+
}
4963
if (queryParams) {
5064
queryParams = queryParams.slice(1);
5165
}

0 commit comments

Comments
 (0)