Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
63a261d
Implemented user parameters in the frontend
Feb 18, 2025
cdb9a7a
Pleased the linter in the Vite configuration
Feb 19, 2025
efc0890
Added frontend-development workflow in frontend branch
Feb 19, 2025
5a8002e
Initial frontend testing
Feb 20, 2025
0bb7327
Frontend code linted and prettified
Feb 20, 2025
9dd914f
Fixed missing boolean parameters in execution forms
Feb 21, 2025
45a0910
Only display the user parameters on the frontend
Feb 23, 2025
382300b
Converted nginx config file to a template
Mar 27, 2025
677d79e
Added ability to create user-defined pipelines in the frontend
Mar 27, 2025
27985a2
Retrieve the tags definitions and display as chips in the tools table
Mar 28, 2025
d3fac57
Use pipeline id and name instead of slug, use clone as an init tool f…
Mar 28, 2025
7fa54d2
Created ToolInputsCard to be used to create, edit and execute pipelines
Mar 29, 2025
4e51376
Fixed pipeline deletion using their Id
Mar 31, 2025
9365a99
Use ToolInputsCard in the pipeline creation panel
Apr 1, 2025
2ea263d
Use pipeline default values and user inputs for execution
Apr 1, 2025
a8c6cf6
Updated the pipeline editing panel with default values
Apr 1, 2025
687fcac
Applied prettier on the frontend code
Apr 1, 2025
3915093
Use owner name, fixed pipeline editing, use pipeline store
Apr 7, 2025
826cbe5
Fix pipeline creation form with no default inputs
Apr 7, 2025
175286f
Added settings store and links to Grafana dashboards
Jun 14, 2025
c07cb66
Added links to the user manual, dashboards and source code in the navbar
Jun 14, 2025
c6aca95
Use the report ID in the dashboard URL, changed dashboard icon color
Jun 16, 2025
714efb2
Updated icons and icon sizes
Jun 18, 2025
587c01e
Fixed retrieval of the settings from the backend, added debug flag
Jun 18, 2025
3cb0b38
Fixed horizontal resize of page content
Jul 11, 2025
22d9d45
Fix the Git repo URL before submitting an execution
Jul 11, 2025
9eb3af2
Merge branch 'main' into frontend
bevalentin Jul 11, 2025
a5bfa93
Added user column in pipeline executions table only for admins
Nov 27, 2025
acf3d71
Added instance column in reports table
Nov 27, 2025
13cac28
Updated package lock file
Dec 3, 2025
b8de3ea
Display tools status string and available flag
Dec 29, 2025
f07b4f5
Added visualisation of pipeline execution payload templates
Dec 29, 2025
9a86b68
Display execution payload templates when in debug mode
Dec 29, 2025
0f7e165
Merge branch 'main' into frontend
bevalentin Feb 2, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1,387 changes: 602 additions & 785 deletions frontend/package-lock.json

Large diffs are not rendered by default.

6 changes: 3 additions & 3 deletions frontend/src/App.vue
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
target="appquality_user_manual"
:href="settings.user_manual__url"
>
<v-icon size="24px"> mdi-help-box </v-icon>
<v-icon size="24px" style="min-width: 32px"> mdi-help-box </v-icon>
</v-btn>

<v-btn
Expand All @@ -35,7 +35,7 @@
target="_blank"
:href="settings.getGrafanaDashboardsURL()"
>
<v-icon size="24px"> mdi-chart-box </v-icon>
<v-icon size="24px" style="min-width: 32px"> mdi-chart-box </v-icon>
</v-btn>

<v-btn
Expand All @@ -45,7 +45,7 @@
target="_blank"
:href="settings.source__url"
>
<v-icon size="24px"> mdi-github </v-icon>
<v-icon size="24px" style="min-width: 32px"> mdi-github </v-icon>
</v-btn>

<span
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/assets/tools.js
Original file line number Diff line number Diff line change
Expand Up @@ -45,4 +45,4 @@ export function removeTrailingSlashes(str) {
return str;
}
return str.replace(/\/+$/, '');
}
}
20 changes: 17 additions & 3 deletions frontend/src/components/PipelineExecutionList.vue
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@
<v-data-table
v-model:items-per-page="itemsPerPage"
v-model:sort-by="sortBy"
:headers="headers"
:headers="filteredHeaders"
:items="store.executions"
:filter-keys="['pipeline']"
:custom-filter="filterOnPipelineId"
Expand All @@ -77,6 +77,7 @@
<td>
{{ item.pipeline && store.pipelineById(item.pipeline).version }}
</td>
<td v-if="this.authStore.isAdmin">{{ item.started_by }}</td>
<td>{{ formatDate(item.start_time) }}</td>
<td>{{ formatDate(item.completion_time) }}</td>
<td class="first-letter">{{ item.status || 'Unknown' }}</td>
Expand All @@ -89,7 +90,7 @@
:max="progressMax(item)"
:indeterminate="item.status.toLowerCase() == 'starting'"
>
<strong>{{ progress(item) }} / {{ progressMax(item) }}</strong>
Reports:&nbsp;<strong>{{ progress(item) }}</strong>
</v-progress-linear>
</td>
<td class="text-right nowrap">
Expand All @@ -116,7 +117,6 @@
v-if="settings.isGrafanaEnabled()"
color="secondary"
variant="text"
:disabled="item.job_reports_count == 0"
v-tooltip:bottom-end="'View execution dashboard (new page)'"
@click="viewPipelineExecutionDashboard(item)"
>
Expand Down Expand Up @@ -215,6 +215,13 @@ export default {
key: 'version',
sortable: true,
},
{
// Only shown to admins using computed property, below
title: 'User',
key: 'started_by',
sortable: true,
admins_only: true,
},
{
title: 'Started',
key: 'start_time',
Expand Down Expand Up @@ -266,6 +273,13 @@ export default {
const seconds = Math.floor((Date.now() - this.lastPollTime) / 1000);
return `${seconds}s ago`;
},

filteredHeaders() {
// Filter out columns restricted to admins if necessary
return this.headers.filter(
(x) => !x.admins_only || this.authStore.isAdmin,
);
},
},

mounted() {
Expand Down
97 changes: 89 additions & 8 deletions frontend/src/components/PipelineList.vue
Original file line number Diff line number Diff line change
Expand Up @@ -81,24 +81,33 @@
v-tooltip:bottom-end="'Pipeline information (' + item.name + ')'"
@click="viewPipelineDetails(item)"
>
<v-icon size="26px"> mdi-information </v-icon>
<v-icon> mdi-information </v-icon>
</v-btn>
<v-btn
icon="mdi-monitor-eye"
color="primary"
variant="text"
v-tooltip:bottom-end="'Pipeline executions'"
@click="viewPipelineExecutions(item)"
>
<v-icon size="26px"> mdi-monitor-eye </v-icon>
<v-icon> mdi-monitor-eye </v-icon>
</v-btn>
<v-btn
color="pink"
variant="text"
v-tooltip:bottom-end="'Execute ' + item.name"
@click="showExecutionPanel(item)"
>
<v-icon size="26px"> mdi-flash </v-icon>
<v-icon> mdi-flash </v-icon>
</v-btn>
<v-btn
v-if="settings.isDebugEnabled()"
color="primary"
variant="text"
v-tooltip:bottom-end="'Execution payload template'"
@click="viewPipelinePayload(item)"
:disabled="!canExecuteRemotely(item)"
>
<v-icon> mdi-code-json </v-icon>
</v-btn>
<!-- Dropdown menu with extra actions: edit, delete -->
<v-menu location="bottom end" :disabled="!canEditPipeline(item)">
Expand All @@ -108,7 +117,7 @@
variant="text"
:disabled="!canEditPipeline(item)"
>
<v-icon size="26px"> mdi-dots-vertical </v-icon>
<v-icon> mdi-dots-vertical </v-icon>
</v-btn>
</template>

Expand All @@ -120,7 +129,24 @@
<template v-slot:prepend>
<v-icon color="warning" icon="mdi-pencil" />
</template>
<v-list-item-title>Edit</v-list-item-title>
<v-list-item-title
v-tooltip:bottom-end="'Edit pipeline ' + item.name"
>Edit</v-list-item-title
>
</v-list-item>

<v-list-item
v-if="this.authStore.isAdmin"
@click="changePipelineOwner(item)"
:disabled="true"
>
<template v-slot:prepend>
<v-icon color="warning" icon="mdi-account-edit" />
</template>
<v-list-item-title
v-tooltip:bottom-end="'Change the pipeline owner'"
>Change Owner</v-list-item-title
>
</v-list-item>

<v-list-item
Expand All @@ -130,7 +156,10 @@
<template v-slot:prepend>
<v-icon color="error" icon="mdi-delete" />
</template>
<v-list-item-title>Delete</v-list-item-title>
<v-list-item-title
v-tooltip:bottom-end="'Delete this pipeline'"
>Delete</v-list-item-title
>
</v-list-item>
</v-list>
</v-menu>
Expand Down Expand Up @@ -171,6 +200,32 @@
</v-card>
</v-dialog>

<!-- Pipeline Payload Dialog -->
<v-dialog v-model="showPayloadDialog" max-width="800px">
<v-card v-if="selectedPipeline">
<!-- v-card-title>
{{ selectedPipeline.name || selectedPipeline.id }}
<v-spacer />
<v-btn icon="mdi-close" variant="text" @click="showDetails = false" />
</v-card-title -->
<v-card-text>
<v-alert v-if="selectedPipeline" type="info" class="mb-4"
>Use the template below to execute the pipeline using cloud events
or API calls.<br />
Pipeline name: <b>{{ selectedPipeline.name }}</b
><br />
Pipeline identifier: <b>{{ selectedPipeline.id }}</b
><br />
See the definition of the parameters in the tool information.<br />
Change the parameter values as necessary.</v-alert
>
<pre class="report-json">{{
JSON.stringify(executionPayload, null, 2)
}}</pre>
</v-card-text>
</v-card>
</v-dialog>

<!-- Pipeline creation drawer component -->
<pipeline-creation-panel
v-model="creationParameters"
Expand Down Expand Up @@ -239,6 +294,7 @@
import { useAuthStore } from '@/stores/auth';
import { useToolStore } from '@/stores/tools';
import { usePipelineStore } from '@/stores/pipelines';
import { useSettingsStore } from '@/stores/settings';
import JsonToHtmlTable from '@/components/JsonToHtmlTable.vue';
import PipelineCreationPanel from './PipelineCreationPanel.vue';
import PipelineExecutionPanel from './PipelineExecutionPanel.vue';
Expand All @@ -257,6 +313,7 @@ export default {
return {
search: '',
showDetailsDialog: false,
showPayloadDialog: false,
selectedPipeline: null,
creationPanelVisible: false,
creationParameters: {},
Expand Down Expand Up @@ -309,7 +366,8 @@ export default {
const authStore = useAuthStore();
const pipelineStore = usePipelineStore();
const toolStore = useToolStore();
return { pipelineStore, toolStore, authStore };
const settings = useSettingsStore();
return { pipelineStore, toolStore, authStore, settings };
},

mounted() {
Expand All @@ -334,6 +392,13 @@ export default {
return allText.toLowerCase().includes(searchTerm);
});
},

executionPayload() {
// Generate a pipeline execution payload template
return {
parameters: this.getPipelineUserParams(this.selectedPipeline),
};
},
},

methods: {
Expand Down Expand Up @@ -372,6 +437,12 @@ export default {
);
},

canExecuteRemotely(pipeline) {
// TODO: Use pipeline property / flag
console.debug('Can this pipeline be executed remotely?', pipeline);
return this.authStore.isAdmin;
},

prunePipelineDetails(pipeline) {
const keysToKeep = [
'name',
Expand All @@ -398,6 +469,11 @@ export default {
this.showDetailsDialog = true;
},

viewPipelinePayload(pipeline) {
this.selectedPipeline = pipeline;
this.showPayloadDialog = true;
},

viewPipelineExecutions(pipeline) {
// Store the selected pipeline in the store so it accessible by the executions page
// Navigate to the executions page
Expand Down Expand Up @@ -604,4 +680,9 @@ export default {
padding: 5px;
min-width: 0px;
}

.v-icon {
font-size: 26px;
min-width: 30px;
}
</style>
39 changes: 23 additions & 16 deletions frontend/src/components/ReportList.vue
Original file line number Diff line number Diff line change
Expand Up @@ -101,14 +101,15 @@
'-'
}}
</td>
<td>
<!-- <td>
{{
store.pipelineById(store.executionById(item.run).pipeline)
.version || '-'
}}
</td>
<td>{{ formatDate(store.executionById(item.run).start_time) }}</td>
</td> -->
<!-- <td>{{ formatDate(store.executionById(item.run).start_time) }}</td> -->
<td>{{ item.name || 'No name' }}</td>
<td>{{ item.instance || '' }}</td>
<td>{{ formatDate(item.created_at) }}</td>
<td class="text-right nowrap">
<v-btn
Expand Down Expand Up @@ -196,30 +197,36 @@ export default {
{
title: 'Pipeline',
key: 'pipeline',
sortable: true,
align: 'start',
},
{
title: 'Version',
key: 'version',
sortable: true,
sortable: false,
align: 'start',
},
// {
// title: 'Version',
// key: 'version',
// sortable: true,
// align: 'start',
// },
// {
// title: 'Pipeline Start Time',
// key: 'pipeline_start_time',
// sortable: true,
// align: 'start',
// },
{
title: 'Pipeline Start Time',
key: 'pipeline_start_time',
title: 'Tool',
key: 'name',
sortable: true,
align: 'start',
},
{
title: 'Tool',
key: 'tool_name',
title: 'Instance',
key: 'instance',
sortable: true,
align: 'start',
},
{
title: 'Report Time',
key: 'report_time',
key: 'created_at',
sortable: true,
},
{
Expand Down Expand Up @@ -296,7 +303,7 @@ export default {
this.store.selectedExecutionId,
);
} else {
console.debug('No execution selected for fetching reports');
console.warn('No execution selected for fetching reports');
}
},

Expand Down
Loading