Skip to content

Commit 9241255

Browse files
rushk014xingzhang-suse
authored andcommitted
feat: add column based filters UI components
1 parent 049fec2 commit 9241255

File tree

2 files changed

+137
-9
lines changed

2 files changed

+137
-9
lines changed

pkg/sbombastic-image-vulnerability-scanner/l10n/en-us.yaml

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -123,11 +123,6 @@ imageScanner:
123123
cve:
124124
allCves: All identified CVEs
125125
affectingCvesOnly: Affecting CVEs only
126-
imageList:
127-
image: Image
128-
severity: severity
129-
repository: repository
130-
registry: Registry
131126
buttons:
132127
downloadCustomReport: Download custom report
133128
downloadSbom: Download SBOM
@@ -142,6 +137,14 @@ imageScanner:
142137
repository: Repository
143138
registry: Registry
144139
vulnerabilities: vulnerabilities
140+
filters:
141+
placeholder:
142+
image: Search by name
143+
label:
144+
image: Image
145+
severity: Severity
146+
repository: Repository
147+
registry: Registry
145148
imageDetails:
146149
status: Status
147150
vulnerabilities: Vulnerabilities

pkg/sbombastic-image-vulnerability-scanner/pages/c/_cluster/sbombastic-image-vulnerability-scanner/ImageOverview.vue

Lines changed: 129 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,54 @@
4040
<TopRiskyImagesChart v-if="preprocessedDataset.topRiskyImages" :topRiskyImages="preprocessedDataset.topRiskyImages"/>
4141
<ImageRiskAssessment v-if="preprocessedDataset.chartData" :chartData="preprocessedDataset.chartData" :filterFn="filterBySeverity"/>
4242
</div> -->
43+
<div class="search-filters">
44+
<div class="filter-row">
45+
<div class="filter-item">
46+
<label>{{ t('imageScanner.images.listTable.filters.label.image')}}</label>
47+
<div class="filter-input-wrapper">
48+
<input
49+
v-model="filters.imageSearch"
50+
type="text"
51+
:placeholder="t('imageScanner.images.listTable.filters.placeholder.image')"
52+
class="filter-input"
53+
/>
54+
<i class="icon icon-search" style="color: #6C6C76; margin-left: 8px;"></i>
55+
</div>
56+
</div>
57+
<div class="filter-item">
58+
<label>{{ t('imageScanner.images.listTable.filters.label.severity') }}</label>
59+
<LabeledSelect
60+
v-model:value="filters.severitySearch"
61+
:options="severityOptions"
62+
:close-on-select="true"
63+
:multiple="false"
64+
/>
65+
</div>
66+
<div class="filter-item">
67+
<label>{{ t('imageScanner.images.listTable.filters.label.repository') }}</label>
68+
<LabeledSelect
69+
v-model:value="filters.repositorySearch"
70+
:options="repositoryOptions"
71+
:close-on-select="true"
72+
:multiple="false"
73+
/>
74+
</div>
75+
<div class="filter-item">
76+
<label>{{ t('imageScanner.images.listTable.filters.label.registry') }}</label>
77+
<LabeledSelect
78+
v-model:value="filters.registrySearch"
79+
:options="registryOptions"
80+
:close-on-select="true"
81+
:multiple="false"
82+
/>
83+
</div>
84+
</div>
85+
</div>
4386
<SortableTable
4487
:headers="isGrouped ? REPO_BASED_TABLE : IMAGE_LIST_TABLE"
4588
:namespaced="false"
89+
:search="false"
90+
:paging="true"
4691
:row-actions="!isGrouped"
4792
:table-actions="true"
4893
:sub-expandable="isGrouped"
@@ -158,10 +203,12 @@
158203
filterImageOptions,
159204
selectedCveFilter: filterCveOptions[0],
160205
selectedImageFilter: filterImageOptions[0],
161-
selectedImage: "",
162-
selectedSeverity: "",
163-
selectedRepository: "Any",
164-
selectedRegistry: "Any",
206+
filters: {
207+
imageSearch: '',
208+
severitySearch: 'any',
209+
repositorySearch: 'any',
210+
registrySearch: 'any',
211+
},
165212
}
166213
},
167214
computed: {
@@ -399,4 +446,82 @@
399446
}
400447
}
401448
449+
.filter-row {
450+
display: flex;
451+
gap: 24px;
452+
margin-bottom: 20px;
453+
}
454+
455+
.filter-item {
456+
display: flex;
457+
flex-direction: column;
458+
gap: 8px;
459+
flex: 1;
460+
}
461+
462+
.filter-item label {
463+
font-weight: 400;
464+
color: #6C6C76;
465+
font-size: 14px;
466+
}
467+
468+
.filter-input-wrapper {
469+
display: flex;
470+
align-items: center;
471+
border: 1px solid #DCDEE7;
472+
border-radius: 6px;
473+
padding: 0 12px;
474+
background: #FFF;
475+
}
476+
477+
.filter-input {
478+
flex: 1;
479+
padding: 10px 0;
480+
border: none;
481+
outline: none;
482+
font-size: 14px;
483+
line-height: 19px;
484+
background: transparent;
485+
}
486+
487+
.score-input {
488+
color: #BEC1D2;
489+
}
490+
491+
.score-input::placeholder {
492+
color: #BEC1D2;
493+
}
494+
495+
.filter-input:focus {
496+
outline: none;
497+
}
498+
499+
.filter-input-wrapper:focus-within {
500+
border-color: #007cba;
501+
box-shadow: 0 0 0 2px rgba(0, 124, 186, 0.1);
502+
}
503+
504+
.filter-select {
505+
padding: 10px 14px;
506+
border: 1px solid #DCDEE7;
507+
border-radius: 6px;
508+
font-size: 14px;
509+
background: #FFF;
510+
outline: none;
511+
}
512+
513+
.filter-select:focus {
514+
border-color: #007cba;
515+
box-shadow: 0 0 0 2px rgba(0, 124, 186, 0.1);
516+
}
517+
518+
.filter-actions {
519+
display: flex;
520+
justify-content: flex-start;
521+
align-items: center;
522+
gap: 8px;
523+
padding-top: 16px;
524+
border-top: 1px solid #DCDEE7;
525+
}
526+
402527
</style>

0 commit comments

Comments
 (0)