Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
16 changes: 16 additions & 0 deletions ui/app/assets/css/tailwind.css
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,22 @@
}

@layer components {
.feature-meta-grid {
display: grid;
grid-template-columns: minmax(0, 1fr);
gap: 0.5rem;
}

@media (width >= 40rem) {
.feature-meta-grid {
grid-template-columns: repeat(2, minmax(0, 1fr));
}

.feature-meta-grid > :last-child:nth-child(odd) {
grid-column: 1 / -1;
}
}

.shell-surface {
background:
radial-gradient(circle at top left, rgb(99 102 241 / 0.1), transparent 28%),
Expand Down
17 changes: 4 additions & 13 deletions ui/app/components/Simple.vue
Original file line number Diff line number Diff line change
Expand Up @@ -714,6 +714,7 @@ const {
loadHistory,
reloadHistory,
deleteHistoryItems,
historyMoveHandler,
} = useHistoryState();

const embedUrl = ref('');
Expand Down Expand Up @@ -1271,19 +1272,9 @@ const deleteHistoryItem = async (item: StoreItem): Promise<void> => {
toast.info('Removed from history queue.');
};

const handleHistoryItemMoved = (payload: { data: { to: 'queue' | 'history' } }): void => {
if (!simpleMode.value || !historyInitialized.value) {
return;
}

if ('history' !== payload.data.to || 1 !== pagination.value.page) {
return;
}

window.setTimeout(() => {
void reloadHistory({ order: 'DESC', perPage: configStore.app.default_pagination });
}, 1000);
};
const handleHistoryItemMoved = historyMoveHandler(
() => simpleMode.value && historyInitialized.value,
);

const showMessage = (item: StoreItem): boolean => {
if (!item?.msg || item.msg === item?.error) {
Expand Down
41 changes: 41 additions & 0 deletions ui/app/composables/useHistoryState.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { computed, ref } from 'vue';

import { useNotification } from '~/composables/useNotification';
import type { WSEP } from '~/types/sockets';
import { useYtpConfig } from '~/composables/useYtpConfig';
import { parse_api_error, parse_list_response, request } from '~/utils';
import type { Pagination } from '~/types/responses';
Expand Down Expand Up @@ -168,6 +169,44 @@ const resetHistory = (): void => {
lastError.value = null;
};

const addHistoryItem = (item: StoreItem): void => {
const existingIndex = items.value.findIndex((existing) => existing._id === item._id);

if (existingIndex !== -1) {
items.value = [
item,
...items.value.slice(0, existingIndex),
...items.value.slice(existingIndex + 1),
];
return;
}

items.value = [item, ...items.value];
pagination.value.total++;

if (items.value.length > pagination.value.per_page) {
items.value = items.value.slice(0, pagination.value.per_page);
}

pagination.value.total_pages = Math.max(
1,
Math.ceil(pagination.value.total / pagination.value.per_page),
);
pagination.value.has_next = pagination.value.page < pagination.value.total_pages;
};

const historyMoveHandler = (
shouldHandle: () => boolean = () => isLoaded.value,
): ((payload: WSEP['item_moved']) => void) => {
return (payload: WSEP['item_moved']): void => {
if ('history' !== payload.data.to || !shouldHandle()) {
return;
}

addHistoryItem(payload.data.item);
};
};

export const useHistoryState = () => {
return {
items,
Expand All @@ -180,5 +219,7 @@ export const useHistoryState = () => {
reloadHistory,
deleteHistoryItems,
resetHistory,
upsertHistoryItem: addHistoryItem,
historyMoveHandler,
};
};
63 changes: 27 additions & 36 deletions ui/app/pages/conditions.vue
Original file line number Diff line number Diff line change
Expand Up @@ -309,57 +309,48 @@
</span>
</div>

<button
type="button"
class="flex min-w-0 w-full items-start gap-2 rounded-md border border-default bg-muted/20 px-3 py-2 text-left"
@click="toggleExpand(cond.id, 'filter')"
>
<UIcon name="i-lucide-filter" class="mt-0.5 size-4 shrink-0 text-toned" />
<div class="min-w-0 flex-1">
<div class="text-xs font-medium text-toned">Filter</div>
<span :class="['block', expandClass(cond.id, 'filter')]">{{ cond.filter }}</span>
</div>
</button>

<div v-if="cond.cli || cond.description" class="grid grid-cols-1 gap-2 sm:grid-cols-2">
<div class="feature-meta-grid">
<button
v-if="cond.cli"
type="button"
:class="[
'flex min-w-0 w-full items-start gap-2 rounded-md border border-default bg-muted/20 px-3 py-2 text-left',
!cond.description && 'sm:col-span-2',
]"
@click="toggleExpand(cond.id, 'cli')"
class="flex min-w-0 w-full items-start gap-2 rounded-md border border-default bg-muted/20 px-3 py-2 text-left"
@click="toggleExpand(cond.id, 'filter')"
>
<UIcon name="i-lucide-terminal" class="mt-0.5 size-4 shrink-0 text-toned" />
<UIcon name="i-lucide-filter" class="mt-0.5 size-4 shrink-0 text-toned" />
<div class="min-w-0 flex-1">
<div class="text-xs font-medium text-toned">CLI</div>
<span :class="['block', expandClass(cond.id, 'cli')]">{{ cond.cli }}</span>
<div class="text-xs font-medium text-toned">Filter</div>
<span :class="['block', expandClass(cond.id, 'filter')]">{{ cond.filter }}</span>
</div>
</button>

<button
v-if="cond.description"
v-if="cond.cli"
type="button"
:class="[
'flex min-w-0 w-full items-start gap-2 rounded-md border border-default bg-muted/20 px-3 py-2 text-left',
!cond.cli && 'sm:col-span-2',
]"
@click="toggleExpand(cond.id, 'description')"
class="flex min-w-0 w-full items-start gap-2 rounded-md border border-default bg-muted/20 px-3 py-2 text-left"
@click="toggleExpand(cond.id, 'cli')"
>
<UIcon
name="i-lucide-message-square-text"
class="mt-0.5 size-4 shrink-0 text-toned"
/>
<UIcon name="i-lucide-terminal" class="mt-0.5 size-4 shrink-0 text-toned" />
<div class="min-w-0 flex-1">
<div class="text-xs font-medium text-toned">Description</div>
<span :class="['block', expandClass(cond.id, 'description')]">{{
cond.description
}}</span>
<div class="text-xs font-medium text-toned">CLI options</div>
<span :class="['block', expandClass(cond.id, 'cli')]">{{ cond.cli }}</span>
</div>
</button>
</div>

<button
v-if="cond.description"
type="button"
class="flex min-w-0 w-full items-start gap-2 rounded-md border border-default bg-muted/20 px-3 py-2 text-left"
@click="toggleExpand(cond.id, 'description')"
>
<UIcon name="i-lucide-align-left" class="mt-0.5 size-4 shrink-0 text-toned" />
<div class="min-w-0 flex-1">
<div class="text-xs font-medium text-toned">Description</div>
<span :class="['block', expandClass(cond.id, 'description')]">{{
cond.description
}}</span>
</div>
</button>

<div
v-if="extrasEntries(cond.extras).length > 0"
class="rounded-md border border-default bg-muted/20 px-3 py-2"
Expand Down
7 changes: 2 additions & 5 deletions ui/app/pages/dl_fields.vue
Original file line number Diff line number Diff line change
Expand Up @@ -300,13 +300,10 @@
</span>
</div>

<div class="grid grid-cols-1 gap-2 sm:grid-cols-2">
<div class="feature-meta-grid">
<button
type="button"
:class="[
'flex min-w-0 w-full items-start gap-2 rounded-md border border-default bg-muted/20 px-3 py-2 text-left',
!field.description && 'sm:col-span-2',
]"
class="flex min-w-0 w-full items-start gap-2 rounded-md border border-default bg-muted/20 px-3 py-2 text-left"
@click="toggleExpand(field.id, 'field')"
>
<UIcon name="i-lucide-terminal" class="mt-0.5 size-4 shrink-0 text-toned" />
Expand Down
10 changes: 10 additions & 0 deletions ui/app/pages/history.vue
Original file line number Diff line number Diff line change
Expand Up @@ -761,6 +761,7 @@ import moment from 'moment';
import { useStorage } from '@vueuse/core';
import { useConfirm } from '~/composables/useConfirm';
import { useDialog } from '~/composables/useDialog';
import { useAppSocket } from '~/composables/useAppSocket';
import { useExpandableMeta } from '~/composables/useExpandableMeta';
import { useHistoryState } from '~/composables/useHistoryState';
import { useMediaQuery } from '~/composables/useMediaQuery';
Expand All @@ -782,6 +783,7 @@ import { requirePageShell } from '~/utils/topLevelNavigation';

const config = useYtpConfig();
const stateStore = useQueueState();
const socketStore = useAppSocket();
const toast = useNotification();
const box = useConfirm();
const { confirmDialog } = useDialog();
Expand All @@ -798,6 +800,7 @@ const {
loadHistory,
reloadHistory,
deleteHistoryItems,
historyMoveHandler,
} = useHistoryState();

const show_thumbnail = useStorage<boolean>('show_thumbnail', true);
Expand Down Expand Up @@ -834,10 +837,17 @@ const paginationInfo = computed(() => ({
isLoaded: isLoaded.value,
}));

const handleHistoryItemMoved = historyMoveHandler();

onMounted(async () => {
socketStore.on('item_moved', handleHistoryItemMoved);
await loadHistory(1, { order: 'DESC', perPage: config.app.default_pagination });
});

onBeforeUnmount(() => {
socketStore.off('item_moved', handleHistoryItemMoved);
});

watch(showFilter, () => {
if (!showFilter.value) {
query.value = '';
Expand Down
72 changes: 36 additions & 36 deletions ui/app/pages/notifications.vue
Original file line number Diff line number Diff line change
Expand Up @@ -363,29 +363,44 @@
</span>
</div>

<button
type="button"
class="flex min-w-0 w-full items-start gap-2 rounded-md border border-default bg-muted/20 px-3 py-2 text-left"
@click="toggleExpand(item.id, 'url')"
>
<UIcon name="i-lucide-link" class="mt-0.5 size-4 shrink-0 text-toned" />
<div class="min-w-0 flex-1">
<div class="text-xs font-medium text-toned">Target URL</div>
<a
:href="item.request.url"
target="_blank"
rel="noreferrer"
class="block text-highlighted hover:underline"
@click.stop
>
<span :class="['block', expandClass(item.id, 'url')]">
{{ item.request.url }}
<div class="feature-meta-grid">
<button
type="button"
class="flex min-w-0 w-full items-start gap-2 rounded-md border border-default bg-muted/20 px-3 py-2 text-left"
@click="toggleExpand(item.id, 'url')"
>
<UIcon name="i-lucide-link" class="mt-0.5 size-4 shrink-0 text-toned" />
<div class="min-w-0 flex-1">
<div class="text-xs font-medium text-toned">Target URL</div>
<a
:href="item.request.url"
target="_blank"
rel="noreferrer"
class="block text-highlighted hover:underline"
@click.stop
>
<span :class="['block', expandClass(item.id, 'url')]">
{{ item.request.url }}
</span>
</a>
</div>
</button>

<button
v-if="headerKeys(item).length > 0"
type="button"
class="flex min-w-0 w-full items-start gap-2 rounded-md border border-default bg-muted/20 px-3 py-2 text-left"
@click="toggleExpand(item.id, 'headers')"
>
<UIcon name="i-lucide-key" class="mt-0.5 size-4 shrink-0 text-toned" />
<div class="min-w-0 flex-1">
<div class="text-xs font-medium text-toned">Headers</div>
<span :class="['block', expandClass(item.id, 'headers')]">
{{ headerKeys(item).join(', ') }}
</span>
</a>
</div>
</button>
</div>
</button>

<div class="grid grid-cols-1 gap-2 sm:grid-cols-2">
<button
type="button"
class="flex min-w-0 w-full items-start gap-2 rounded-md border border-default bg-muted/20 px-3 py-2 text-left"
Expand Down Expand Up @@ -417,21 +432,6 @@
</div>
</button>
</div>

<button
v-if="headerKeys(item).length > 0"
type="button"
class="flex min-w-0 w-full items-start gap-2 rounded-md border border-default bg-muted/20 px-3 py-2 text-left"
@click="toggleExpand(item.id, 'headers')"
>
<UIcon name="i-lucide-key" class="mt-0.5 size-4 shrink-0 text-toned" />
<div class="min-w-0 flex-1">
<div class="text-xs font-medium text-toned">Headers</div>
<span :class="['block', expandClass(item.id, 'headers')]">
{{ headerKeys(item).join(', ') }}
</span>
</div>
</button>
</div>

<template #footer>
Expand Down
Loading
Loading