2023-03-20 03:50:56 +00:00
|
|
|
<template>
|
2024-11-18 14:16:30 +00:00
|
|
|
<Settings :title="$t('admin.settings.queue.queue')" :description="$t('admin.settings.queue.desc')">
|
|
|
|
<template #headerActions>
|
2023-08-21 08:23:16 +00:00
|
|
|
<div v-if="queueInfo">
|
|
|
|
<div class="flex items-center gap-2">
|
|
|
|
<Button
|
|
|
|
v-if="queueInfo.paused"
|
|
|
|
:text="$t('admin.settings.queue.resume')"
|
|
|
|
start-icon="play"
|
|
|
|
@click="resumeQueue"
|
|
|
|
/>
|
|
|
|
<Button v-else :text="$t('admin.settings.queue.pause')" start-icon="pause" @click="pauseQueue" />
|
|
|
|
<Icon
|
|
|
|
:name="queueInfo.paused ? 'pause' : 'play'"
|
|
|
|
:class="{
|
|
|
|
'text-wp-state-error-100': queueInfo.paused,
|
|
|
|
'text-wp-state-ok-100': !queueInfo.paused,
|
|
|
|
}"
|
|
|
|
/>
|
|
|
|
</div>
|
2023-03-20 03:50:56 +00:00
|
|
|
</div>
|
2023-08-21 08:23:16 +00:00
|
|
|
</template>
|
2023-03-20 03:50:56 +00:00
|
|
|
|
|
|
|
<div class="flex flex-col">
|
2023-03-20 17:08:53 +00:00
|
|
|
<AdminQueueStats :stats="queueInfo?.stats" />
|
2023-03-20 03:50:56 +00:00
|
|
|
|
|
|
|
<div v-if="tasks.length > 0" class="flex flex-col">
|
|
|
|
<p class="mt-6 mb-2 text-xl">{{ $t('admin.settings.queue.tasks') }}</p>
|
Use consistent woodpecker color scheme (#2003)
Fixes: https://github.com/woodpecker-ci/woodpecker/issues/1079
What do you think about using a consistent `woodpecker` color scheme?
Right now, the `lime` color scheme from windicss is used that does not
really fit the primary color used for the documentation website. I have
used the primary color `#4CAF50` from the docs and created a color
palette with https://palettte.app/:
<details>
<summary>JSON source</summary>
```Json
[
{
"paletteName": "New Palette",
"swatches": [
{
"name": "New Swatch",
"color": "166E30"
},
{
"name": "New Swatch",
"color": "248438"
},
{
"name": "New Swatch",
"color": "369943"
},
{
"name": "New Swatch",
"color": "4CAF50"
},
{
"name": "New Swatch",
"color": "68C464"
},
{
"name": "New Swatch",
"color": "8AD97F"
}
]
}
]
```
</details>

I have added this color scheme to the windicss config and replaced the
use of `lime` in the UI. While `woodpecker-300` would be the primary
color that is used for the docs, I currently use `woodpecke-400` as
primary color for the UI to fix some contrast issues.


What do you think? If you would like to stay with the current colors,
that's fine for me, I can just use the custom CSS feature in this case.
---------
Co-authored-by: 6543 <6543@obermui.de>
2023-08-02 07:09:12 +00:00
|
|
|
<ListItem
|
|
|
|
v-for="task in tasks"
|
|
|
|
:key="task.id"
|
|
|
|
class="items-center mb-2 !bg-wp-background-200 !dark:bg-wp-background-100"
|
|
|
|
>
|
2023-03-20 03:50:56 +00:00
|
|
|
<div
|
|
|
|
class="flex items-center"
|
|
|
|
:title="
|
|
|
|
task.status === 'pending'
|
|
|
|
? $t('admin.settings.queue.task_pending')
|
|
|
|
: task.status === 'running'
|
2023-11-19 13:28:58 +00:00
|
|
|
? $t('admin.settings.queue.task_running')
|
|
|
|
: $t('admin.settings.queue.task_waiting_on_deps')
|
2023-03-20 03:50:56 +00:00
|
|
|
"
|
|
|
|
>
|
|
|
|
<Icon
|
|
|
|
:name="
|
|
|
|
task.status === 'pending'
|
|
|
|
? 'status-pending'
|
|
|
|
: task.status === 'running'
|
2023-11-19 13:28:58 +00:00
|
|
|
? 'status-running'
|
|
|
|
: 'status-declined'
|
2023-03-20 03:50:56 +00:00
|
|
|
"
|
|
|
|
:class="{
|
Use consistent woodpecker color scheme (#2003)
Fixes: https://github.com/woodpecker-ci/woodpecker/issues/1079
What do you think about using a consistent `woodpecker` color scheme?
Right now, the `lime` color scheme from windicss is used that does not
really fit the primary color used for the documentation website. I have
used the primary color `#4CAF50` from the docs and created a color
palette with https://palettte.app/:
<details>
<summary>JSON source</summary>
```Json
[
{
"paletteName": "New Palette",
"swatches": [
{
"name": "New Swatch",
"color": "166E30"
},
{
"name": "New Swatch",
"color": "248438"
},
{
"name": "New Swatch",
"color": "369943"
},
{
"name": "New Swatch",
"color": "4CAF50"
},
{
"name": "New Swatch",
"color": "68C464"
},
{
"name": "New Swatch",
"color": "8AD97F"
}
]
}
]
```
</details>

I have added this color scheme to the windicss config and replaced the
use of `lime` in the UI. While `woodpecker-300` would be the primary
color that is used for the docs, I currently use `woodpecke-400` as
primary color for the UI to fix some contrast issues.


What do you think? If you would like to stay with the current colors,
that's fine for me, I can just use the custom CSS feature in this case.
---------
Co-authored-by: 6543 <6543@obermui.de>
2023-08-02 07:09:12 +00:00
|
|
|
'text-wp-state-error-100': task.status === 'waiting_on_deps',
|
|
|
|
'text-wp-state-info-100': task.status === 'running',
|
|
|
|
'text-wp-state-neutral-100': task.status === 'pending',
|
2023-03-20 03:50:56 +00:00
|
|
|
}"
|
|
|
|
/>
|
|
|
|
</div>
|
|
|
|
<span class="ml-2">{{ task.id }}</span>
|
|
|
|
<span class="flex ml-auto gap-2">
|
2023-03-21 13:10:43 +00:00
|
|
|
<Badge v-if="task.agent_id !== 0" :label="$t('admin.settings.queue.agent')" :value="task.agent_id" />
|
2023-03-21 16:31:24 +00:00
|
|
|
<template v-for="(value, label) in task.labels">
|
|
|
|
<Badge v-if="value" :key="label" :label="label.toString()" :value="value" />
|
|
|
|
</template>
|
2023-03-21 13:10:43 +00:00
|
|
|
<Badge
|
|
|
|
v-if="task.dependencies"
|
|
|
|
:label="$t('admin.settings.queue.waiting_for')"
|
|
|
|
:value="task.dependencies.join(', ')"
|
|
|
|
/>
|
2023-03-20 03:50:56 +00:00
|
|
|
</span>
|
|
|
|
</ListItem>
|
|
|
|
</div>
|
|
|
|
</div>
|
2023-08-21 08:23:16 +00:00
|
|
|
</Settings>
|
2023-03-20 03:50:56 +00:00
|
|
|
</template>
|
|
|
|
|
|
|
|
<script lang="ts" setup>
|
|
|
|
import { computed, onBeforeUnmount, onMounted, ref } from 'vue';
|
|
|
|
import { useI18n } from 'vue-i18n';
|
|
|
|
|
2024-11-19 13:04:50 +00:00
|
|
|
import AdminQueueStats from '~/components/admin/settings/queue/AdminQueueStats.vue';
|
2023-03-21 13:10:43 +00:00
|
|
|
import Badge from '~/components/atomic/Badge.vue';
|
2023-03-20 03:50:56 +00:00
|
|
|
import Button from '~/components/atomic/Button.vue';
|
|
|
|
import Icon from '~/components/atomic/Icon.vue';
|
|
|
|
import ListItem from '~/components/atomic/ListItem.vue';
|
2023-08-21 08:23:16 +00:00
|
|
|
import Settings from '~/components/layout/Settings.vue';
|
2023-03-20 03:50:56 +00:00
|
|
|
import useApiClient from '~/compositions/useApiClient';
|
|
|
|
import useNotifications from '~/compositions/useNotifications';
|
2024-06-06 13:16:59 +00:00
|
|
|
import type { QueueInfo } from '~/lib/api/types';
|
2023-03-20 03:50:56 +00:00
|
|
|
|
|
|
|
const apiClient = useApiClient();
|
|
|
|
const notifications = useNotifications();
|
|
|
|
const { t } = useI18n();
|
|
|
|
|
|
|
|
const queueInfo = ref<QueueInfo>();
|
|
|
|
|
|
|
|
const tasks = computed(() => {
|
|
|
|
const _tasks = [];
|
|
|
|
|
|
|
|
if (queueInfo.value?.running) {
|
|
|
|
_tasks.push(...queueInfo.value.running.map((task) => ({ ...task, status: 'running' })));
|
|
|
|
}
|
|
|
|
|
|
|
|
if (queueInfo.value?.pending) {
|
|
|
|
_tasks.push(...queueInfo.value.pending.map((task) => ({ ...task, status: 'pending' })));
|
|
|
|
}
|
|
|
|
|
|
|
|
if (queueInfo.value?.waiting_on_deps) {
|
|
|
|
_tasks.push(...queueInfo.value.waiting_on_deps.map((task) => ({ ...task, status: 'waiting_on_deps' })));
|
|
|
|
}
|
|
|
|
|
2024-09-30 11:33:16 +00:00
|
|
|
return _tasks
|
|
|
|
.map((task) => ({
|
|
|
|
...task,
|
|
|
|
labels: Object.fromEntries(Object.entries(task.labels).filter(([key]) => key !== 'org-id')),
|
|
|
|
}))
|
|
|
|
.toSorted((a, b) => a.id - b.id);
|
2023-03-20 03:50:56 +00:00
|
|
|
});
|
|
|
|
|
|
|
|
async function loadQueueInfo() {
|
|
|
|
queueInfo.value = await apiClient.getQueueInfo();
|
|
|
|
}
|
|
|
|
|
|
|
|
async function pauseQueue() {
|
|
|
|
await apiClient.pauseQueue();
|
|
|
|
await loadQueueInfo();
|
|
|
|
notifications.notify({
|
|
|
|
title: t('admin.settings.queue.paused'),
|
|
|
|
type: 'success',
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
async function resumeQueue() {
|
|
|
|
await apiClient.resumeQueue();
|
|
|
|
await loadQueueInfo();
|
|
|
|
notifications.notify({
|
|
|
|
title: t('admin.settings.queue.resumed'),
|
|
|
|
type: 'success',
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
const reloadInterval = ref<number>();
|
|
|
|
onMounted(async () => {
|
|
|
|
await loadQueueInfo();
|
|
|
|
reloadInterval.value = window.setInterval(async () => {
|
|
|
|
await loadQueueInfo();
|
|
|
|
}, 5000);
|
|
|
|
});
|
|
|
|
|
|
|
|
onBeforeUnmount(() => {
|
|
|
|
if (reloadInterval.value) {
|
|
|
|
window.clearInterval(reloadInterval.value);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
</script>
|