Skip to content

Commit 96a1186

Browse files
authored
Merge pull request #38 from itk-dev/feature/filter-runs-by-failed-in-specific-step
Add filter on failed by
2 parents feef506 + 46ec85a commit 96a1186

File tree

8 files changed

+87
-18
lines changed

8 files changed

+87
-18
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10+
* [PR-38](https://github.com/itk-dev/rpa-process-overview/pull/38)
11+
* Add filter on failed in
1012
* [PR-37](https://github.com/itk-dev/rpa-process-overview/pull/37)
1113
* Add favicon
1214
* [PR-36](https://github.com/itk-dev/rpa-process-overview/pull/36)

src/Controller/ProcessOverviewController.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,9 @@ public function show(ProcessOverviewGroup $group, ProcessOverview $overview): Re
4040
'Go to next page' => t('Go to next page'),
4141
'Missing data' => t('Missing data'),
4242
'Failed processes' => t('Failed processes'),
43+
// We're actually showing “process runs”, but it probably makes more sense to real people to (still) call them “processes”.
44+
'Showing processes failed in' => t('Showing processes failed in'),
45+
'Show all' => t('Show all'),
4346
'The process was restarted' => t('The process was restarted'),
4447
'An error occurred when trying to restart the process' => t('An error occurred when trying to restart the process'),
4548
'Rerun step' => t('Rerun step'),

src/ProcessOverviewHelper.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ public function getData(Request $request, ProcessOverview $overview): array
5050
foreach ($process['steps'] as $step) {
5151
$stepColumns[] = [
5252
'label' => $step['name'],
53+
'id' => $step['id'],
5354
'type' => 'step',
5455
];
5556
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<script lang="ts">
2+
import { t } from './config';
3+
import { type Column } from '$lib/types';
4+
5+
let {
6+
filters,
7+
selectFilter,
8+
selectedFilter
9+
}: {
10+
filters: Column[] | null;
11+
selectFilter: Function;
12+
selectedFilter: number | null;
13+
} = $props();
14+
</script>
15+
16+
{#if filters}
17+
<div>
18+
<label for="filter-select" class="mx-2">{t('Viewing processes failed in')}</label>
19+
<select
20+
value={selectedFilter}
21+
onchange={(e) => selectFilter(e)}
22+
id="filter-select"
23+
class="rounded-md bg-violet-600 text-white py-1 px-2 border-6 border-violet-600"
24+
>
25+
<option value={null}>{t('Show all')}</option>
26+
{#each filters as { label, id }}
27+
<option value={id}>{label}</option>
28+
{/each}
29+
</select>
30+
</div>
31+
{/if}

widgets/src/_standalone/ProcessOverview/Pagination.svelte

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
total: number;
1616
changePage: Function;
1717
} = $props();
18-
const totalAmountOfButtons: number = total / size;
18+
const totalAmountOfButtons: number = Math.ceil(total / size);
1919
const totalAmountOfPagesAsIntegerArray = Array.from(
2020
{ length: totalAmountOfButtons },
2121
(_, i) => i + 1

widgets/src/_standalone/ProcessOverview/index.svelte

Lines changed: 41 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,47 @@
11
<script lang="ts">
22
import Spinner from './Icons/Spinner.svelte';
33
import ExclamationMark from './Icons/ExclamationMark.svelte';
4-
import { type ProgressData } from '$lib/types';
4+
import { type ProgressData, type Column, type RawData } from '$lib/types';
55
import Table from '$lib/Table.svelte';
66
import { t, config } from './config';
77
import ErrorBanner from '$lib/ErrorBanner.svelte';
88
import Pagination from './Pagination.svelte';
9+
import FilterByFailed from './FilterByFailed.svelte';
910
1011
const { page_size, data_url } = config;
1112
1213
let error: boolean = $state(false);
14+
let filters: Column[] | null = $state(null);
15+
let selectedFilter: number | null = $state(getCurrentFilter());
1316
let data: ProgressData | null = $state(null);
1417
let total: number | null = $state(null);
1518
let fetching: boolean = $state(true);
1619
let errorMessage: string = $state('');
1720
let size: number = $state(parseInt(page_size));
1821
let page: number = $state(getCurrentPage());
1922
23+
function parseInteger(int: string | null): number | null {
24+
if (int) {
25+
return Number(int);
26+
}
27+
return null;
28+
}
29+
2030
function getCurrentPage(): number {
2131
const url = new URL(document.location.href);
22-
const page = Number(url.searchParams.get('page')) || null;
32+
const page = parseInteger(url.searchParams.get('page'));
2333
return page ?? 1;
2434
}
35+
function getCurrentFilter(): number | null {
36+
const url = new URL(document.location.href);
37+
const failedAt = parseInteger(url.searchParams.get('failed_at'));
38+
return failedAt;
39+
}
2540
2641
function updateUrl(): void {
2742
const pageUrl = new URL(document.location.href);
2843
pageUrl.searchParams.set('page', String(page));
44+
pageUrl.searchParams.set('failed_at', String(selectedFilter));
2945
history.replaceState({}, '', pageUrl);
3046
}
3147
@@ -38,15 +54,21 @@
3854
fetching = true;
3955
errorMessage = '';
4056
error = false;
57+
4158
const url = new URL(data_url, document.location.href);
4259
url.searchParams.set('page', String(page));
60+
61+
if (selectedFilter) {
62+
url.searchParams.set('failed_at', String(selectedFilter));
63+
}
4364
url.searchParams.set('size', String(size));
4465
fetch(url.toString())
4566
.then((response) => response.json())
46-
.then(({ data: recievedData, meta }) => {
67+
.then(({ data: recievedData, meta }: { data: ProgressData | null; meta: RawData }) => {
4768
if (recievedData) {
4869
total = meta?.total ?? null;
4970
data = recievedData;
71+
filters = recievedData.columns.filter(({ type }) => 'step' === type);
5072
}
5173
fetching = false;
5274
})
@@ -57,6 +79,12 @@
5779
errorMessage = t('An error occurred while fetching the data');
5880
});
5981
});
82+
83+
function selectFilter(event: Event): void {
84+
// Page is reset on filters, so when filtered we start from scratch, and not accidentally end up on a page that has no content
85+
page = 1;
86+
selectedFilter = parseInteger((event.target as HTMLInputElement).value);
87+
}
6088
</script>
6189

6290
{#if error}
@@ -74,13 +102,17 @@
74102
class="flex flex-col border bg-gray-100 dark:bg-gray-900 border-neutral-300 dark:border-neutral-800 rounded-md mb-5"
75103
>
76104
<div
77-
class="p-3 dark:text-white font-medium bg-gray-200 dark:bg-gray-800 flex items-center border-b border-neutral-300 dark:border-neutral-800"
105+
class="p-4 dark:text-white justify-between font-medium bg-gray-200 dark:bg-gray-800 flex items-center border-b border-neutral-300 dark:border-neutral-800"
78106
>
79-
<ExclamationMark />
80-
<h2>{t('Failed processes')}</h2>
81-
<span class="ml-2 px-2 py-0.5 text-xs font-semibold rounded-full bg-rose-700 text-white"
82-
>{total ?? '?'}</span
83-
>
107+
<div class="flex">
108+
<ExclamationMark />
109+
<h2>{t('Failed processes')}</h2>
110+
<span
111+
class="ml-2 px-2 py-0.5 text-xs font-semibold rounded-full self-center bg-rose-700 text-white"
112+
>{total ?? '?'}</span
113+
>
114+
</div>
115+
<FilterByFailed {selectedFilter} {selectFilter} {filters} />
84116
</div>
85117
<div class="p-4 min-h-[450px] flex flex-col justify-between">
86118
<Table columns={data.columns} rows={data.rows}></Table>

widgets/src/lib/TableCell.svelte

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,11 +51,10 @@
5151
</script>
5252

5353
<!-- relative to absolute position the stick -->
54-
<td class="relative">
54+
<td class="relative [width:stretch]">
5555
<button
5656
id={`anchor-${id}`}
57-
class="flex items-center justify-center width-stretch [width:stretch] {status !==
58-
StepStatus.PENDING
57+
class="flex items-center justify-center [width:stretch] {status !== StepStatus.PENDING
5958
? 'cursor-pointer'
6059
: ''}"
6160
popovertarget={`popover-${id}`}

widgets/src/lib/types.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,12 @@ export type Status = 'success' | 'failed' | 'pending';
77
export type Column = {
88
data: MetaType;
99
label: string;
10+
id: number;
1011
type: RowColumnType;
1112
};
1213

1314
type Failure = {
14-
code: Number;
15+
code: number;
1516
message: string;
1617
occurred_at: Date;
1718
retryable: Boolean;
@@ -50,10 +51,10 @@ type Item = {
5051
};
5152

5253
export type RawData = {
53-
page: Number;
54-
pages: Number;
55-
size: Number;
56-
total: Number;
54+
page: number;
55+
pages: number;
56+
size: number;
57+
total: number;
5758
items: Item[];
5859
};
5960

0 commit comments

Comments
 (0)