|
9 | 9 | } from '$houdini';
|
10 | 10 | import Pagination from '$lib/Pagination.svelte';
|
11 | 11 | import { changeParams } from '$lib/utils/searchparams.svelte';
|
12 |
| - import { severityToColor } from '$lib/utils/vulnerabilities'; |
13 | 12 | import {
|
14 | 13 | BodyShort,
|
15 | 14 | Skeleton,
|
|
21 | 20 | Tooltip,
|
22 | 21 | Tr
|
23 | 22 | } from '@nais/ds-svelte-community';
|
24 |
| - import { CheckmarkIcon, LinkIcon } from '@nais/ds-svelte-community/icons'; |
| 23 | + import { CheckmarkIcon } from '@nais/ds-svelte-community/icons'; |
25 | 24 | import type { WorkloadsWithSbomVariables } from './$houdini';
|
26 | 25 | import WorkloadLink from './WorkloadLink.svelte';
|
27 | 26 |
|
|
155 | 154 | }) => {
|
156 | 155 | return `/team/${workload.team.slug}/${workload.environment.name}/${workload.__typename === 'Application' ? 'app' : 'job'}/${workload.name}/image`;
|
157 | 156 | };
|
| 157 | +
|
| 158 | + export function severityToColorWithHover(severity: string): string { |
| 159 | + switch (severity) { |
| 160 | + case 'critical': |
| 161 | + return 'var(--a-red-200)'; |
| 162 | + case 'high': |
| 163 | + return 'var(--a-orange-200)'; |
| 164 | + case 'medium': |
| 165 | + return 'var(--a-orange-200)'; |
| 166 | + case 'low': |
| 167 | + return 'var(--a-green-200)'; |
| 168 | + case 'unassigned': |
| 169 | + return 'var(--a-gray-200)'; |
| 170 | + default: |
| 171 | + return 'var(--a-gray-200)'; |
| 172 | + } |
| 173 | + } |
158 | 174 | </script>
|
159 | 175 |
|
160 | 176 | {#if $query.data?.team}
|
|
170 | 186 | <Thead>
|
171 | 187 | <Tr>
|
172 | 188 | <Th sortable={true} sortKey={WorkloadOrderField.NAME}>Workload</Th>
|
173 |
| - <Th>Details</Th> |
| 189 | + |
174 | 190 | <Th sortable={true} sortKey={WorkloadOrderField.ENVIRONMENT} style="width: 142px;"
|
175 | 191 | >Environment</Th
|
176 | 192 | >
|
|
220 | 236 | <Td>
|
221 | 237 | <WorkloadLink {workload} />
|
222 | 238 | </Td>
|
223 |
| - <Td><div class="image-url"><a href={imageUrl(workload)}><LinkIcon /></a></div></Td> |
224 | 239 | <Td>
|
225 | 240 | {workload.environment.name}
|
226 | 241 | </Td>
|
|
230 | 245 | <Tooltip content={'critical'}>
|
231 | 246 | {#if workload.image.vulnerabilitySummary}
|
232 | 247 | {#if workload.image.vulnerabilitySummary.critical > 0}
|
233 |
| - <BodyShort |
234 |
| - class="vulnerability-count" |
235 |
| - style="background-color: {severityToColor('critical')}" |
236 |
| - > |
| 248 | + <a href={imageUrl(workload)} class="vulnerability-count CRITICAL"> |
237 | 249 | {workload.image.vulnerabilitySummary
|
238 | 250 | ? workload.image.vulnerabilitySummary.critical
|
239 | 251 | : '-'}
|
240 |
| - </BodyShort> |
| 252 | + </a> |
241 | 253 | {:else}
|
242 | 254 | <CheckmarkIcon style="color: var(--a-icon-success); font-size: 1.75rem;" />
|
243 | 255 | {/if}
|
|
254 | 266 | <Tooltip content={'high'}>
|
255 | 267 | {#if workload.image.vulnerabilitySummary}
|
256 | 268 | {#if workload.image.vulnerabilitySummary.high > 0}
|
257 |
| - <BodyShort |
258 |
| - class="vulnerability-count" |
259 |
| - style="background-color: {severityToColor('high')}" |
260 |
| - > |
| 269 | + <a href={imageUrl(workload)} class="vulnerability-count HIGH"> |
261 | 270 | {workload.image.vulnerabilitySummary
|
262 | 271 | ? workload.image.vulnerabilitySummary.high
|
263 | 272 | : '-'}
|
264 |
| - </BodyShort> |
| 273 | + </a> |
265 | 274 | {:else}
|
266 | 275 | <CheckmarkIcon style="color: var(--a-icon-success); font-size: 1.75rem;" />
|
267 | 276 | {/if}
|
|
278 | 287 | <Tooltip content={'medium'}>
|
279 | 288 | {#if workload.image.vulnerabilitySummary}
|
280 | 289 | {#if workload.image.vulnerabilitySummary.medium > 0}
|
281 |
| - <BodyShort |
282 |
| - class="vulnerability-count" |
283 |
| - style="background-color: {severityToColor('medium')}" |
284 |
| - > |
| 290 | + <a href={imageUrl(workload)} class="vulnerability-count MEDIUM"> |
285 | 291 | {workload.image.vulnerabilitySummary
|
286 | 292 | ? workload.image.vulnerabilitySummary.medium
|
287 | 293 | : '-'}
|
288 |
| - </BodyShort> |
| 294 | + </a> |
289 | 295 | {:else}
|
290 | 296 | <CheckmarkIcon style="color: var(--a-icon-success); font-size: 1.75rem;" />
|
291 | 297 | {/if}
|
|
302 | 308 | <Tooltip content={'low'}>
|
303 | 309 | {#if workload.image.vulnerabilitySummary}
|
304 | 310 | {#if workload.image.vulnerabilitySummary.low > 0}
|
305 |
| - <BodyShort |
306 |
| - class="vulnerability-count" |
307 |
| - style="background-color: {severityToColor('low')}" |
308 |
| - > |
| 311 | + <a href={imageUrl(workload)} class="vulnerability-count LOW"> |
309 | 312 | {workload.image.vulnerabilitySummary
|
310 | 313 | ? workload.image.vulnerabilitySummary.low
|
311 | 314 | : '-'}
|
312 |
| - </BodyShort> |
| 315 | + </a> |
313 | 316 | {:else}
|
314 | 317 | <CheckmarkIcon style="color: var(--a-icon-success); font-size: 1.75rem;" />
|
315 | 318 | {/if}
|
|
326 | 329 | <Tooltip content={'unassigned'}>
|
327 | 330 | {#if workload.image.vulnerabilitySummary}
|
328 | 331 | {#if workload.image.vulnerabilitySummary.unassigned > 0}
|
329 |
| - <BodyShort |
330 |
| - class="vulnerability-count" |
331 |
| - style="background-color: {severityToColor('unassigned')}" |
332 |
| - > |
| 332 | + <a href={imageUrl(workload)} class="vulnerability-count UNASSIGNED"> |
333 | 333 | {workload.image.vulnerabilitySummary.unassigned}
|
334 |
| - </BodyShort> |
| 334 | + </a> |
335 | 335 | {:else}
|
336 | 336 | <CheckmarkIcon style="color: var(--a-icon-success); font-size: 1.75rem;" />
|
337 | 337 | {/if}
|
|
347 | 347 | <div class="vulnerability-summary">
|
348 | 348 | <Tooltip content={'risk score'}>
|
349 | 349 | <BodyShort class="vulnerability-count">
|
350 |
| - {workload.image.vulnerabilitySummary |
351 |
| - ? workload.image.vulnerabilitySummary.riskScore |
352 |
| - : '-'} |
| 350 | + <a href={imageUrl(workload)} class="vulnerability-count RISK_SCORE"> |
| 351 | + {workload.image.vulnerabilitySummary |
| 352 | + ? workload.image.vulnerabilitySummary.riskScore |
| 353 | + : '-'} |
| 354 | + </a> |
353 | 355 | </BodyShort>
|
354 | 356 | </Tooltip>
|
355 | 357 | </div>
|
|
386 | 388 | display: flex;
|
387 | 389 | gap: 1px;
|
388 | 390 |
|
389 |
| - :global(.vulnerability-count) { |
| 391 | + .vulnerability-count { |
390 | 392 | border-top-left-radius: 4px;
|
391 | 393 | border-bottom-left-radius: 4px;
|
392 | 394 |
|
393 | 395 | border-top-right-radius: 4px;
|
394 | 396 | border-bottom-right-radius: 4px;
|
395 |
| - } |
396 | 397 |
|
397 |
| - :global(.vulnerability-count) { |
398 | 398 | padding: 4px 10px;
|
399 |
| - } |
400 | 399 |
|
401 |
| - :global(.vulnerability-count) { |
402 |
| - padding: 4px 10px; |
| 400 | + color: inherit; |
| 401 | + text-decoration: none; |
| 402 | +
|
| 403 | + &.CRITICAL { |
| 404 | + background-color: var(--a-red-200); |
| 405 | + &:hover { |
| 406 | + background-color: var(--a-red-300); |
| 407 | + } |
| 408 | + } |
| 409 | + &.HIGH { |
| 410 | + background-color: var(--a-orange-200); |
| 411 | + &:hover { |
| 412 | + background-color: var(--a-orange-300); |
| 413 | + } |
| 414 | + } |
| 415 | + &.MEDIUM { |
| 416 | + background-color: var(--a-orange-200); |
| 417 | + &:hover { |
| 418 | + background-color: var(--a-orange-300); |
| 419 | + } |
| 420 | + } |
| 421 | + &.LOW { |
| 422 | + background-color: var(--a-green-200); |
| 423 | + &:hover { |
| 424 | + background-color: var(--a-green-300); |
| 425 | + } |
| 426 | + } |
| 427 | + &.UNASSIGNED { |
| 428 | + background-color: var(--a-gray-200); |
| 429 | + &:hover { |
| 430 | + background-color: var(--a-gray-300); |
| 431 | + } |
| 432 | + } |
| 433 | +
|
| 434 | + &.RISK_SCORE { |
| 435 | + &:hover { |
| 436 | + background-color: var(--a-gray-300); |
| 437 | + } |
| 438 | + } |
403 | 439 | }
|
404 | 440 | }
|
405 | 441 | .vulnerability {
|
406 | 442 | display: flex;
|
407 | 443 | align-items: center;
|
408 | 444 | justify-content: center;
|
409 | 445 | }
|
| 446 | +
|
410 | 447 | .image-url {
|
411 | 448 | display: flex;
|
412 | 449 | align-items: center;
|
|
0 commit comments