Add PlaylistUploadEntry

This commit is contained in:
2026-01-05 01:32:55 +05:00
parent 53b326fbad
commit 627c9fda99
4 changed files with 201 additions and 63 deletions

View File

@ -0,0 +1,96 @@
<template>
<Frame margin="none" class="px-3 py-4 flex items-center gap-2">
<div>
<ListMusicIcon :size="40" v-if="hasLoaded" />
<CassetteTape :size="40" v-if="hasProgress" />
<FileQuestionMark :size="40" v-if="hasError" />
</div>
<div class="w-full">
<div class="flex flex-row items-center gap-1">
<p class="font-medium">
{{ title }}
</p>
</div>
<div class="flex flex-row" v-if="hasLoaded">
<p class="text-sm text-muted-foreground">
{{ trackCount }} track(s)
</p>
<Dot />
<p class="text-sm text-muted-foreground">
{{ type }}
</p>
</div>
<div class="flex flex-row items-center gap-2" v-if="hasProgress">
<p class="text-sm text-muted-foreground">
{{ progress }}%
</p>
<UiProgress :modelValue="progress" />
</div>
<div class="flex flex-row" v-if="hasError">
<p class="text-sm text-destructive-foreground">
{{ error }}
</p>
</div>
</div>
<div>
<DropdownMenu>
<DropdownMenuTrigger as-child>
<UiButton variant="ghost">
<EllipsisVertical :size="40" />
</UiButton>
</DropdownMenuTrigger>
<DropdownMenuContent class="w-56" align="start">
<DropdownMenuLabel>My Account</DropdownMenuLabel>
<DropdownMenuGroup>
<DropdownMenuItem>
Profile
</DropdownMenuItem>
<DropdownMenuItem>
Billing
</DropdownMenuItem>
<DropdownMenuItem>
Settings
</DropdownMenuItem>
<DropdownMenuItem>
Keyboard shortcuts
</DropdownMenuItem>
</DropdownMenuGroup>
</DropdownMenuContent>
</DropdownMenu>
</div>
</Frame>
</template>
<script lang="ts">
</script>
<script setup lang="ts">
import {
DropdownMenu,
DropdownMenuContent,
DropdownMenuGroup,
DropdownMenuItem,
DropdownMenuLabel,
DropdownMenuShortcut,
DropdownMenuTrigger
} from '@/components/ui/dropdown-menu';
import Frame from '@/components/ui/frame/Frame.vue';
import { CassetteTape, Dot, EllipsisVertical, FileQuestionMark, ListMusicIcon } from 'lucide-vue-next';
interface Props {
title: string
trackCount?: number
type?: string
progress?: number
error?: string
}
const props = withDefaults(defineProps<Props>(), {
});
const hasLoaded = props.trackCount && props.type;
const hasProgress = props.progress;
const hasError = props.error;
</script>

View File

@ -0,0 +1,97 @@
<template>
<Frame margin="none" class="px-3 py-4 flex items-center gap-2">
<div>
<Disc3 :size="40" v-if="hasLoaded" />
<AudioWaveform :size="40" v-if="hasProgress" />
<FileQuestionMark :size="40" v-if="hasError" />
</div>
<div class="w-full">
<div class="flex flex-row items-center gap-1">
<p class="font-medium">
{{ title }}
</p>
</div>
<div class="flex flex-row" v-if="hasLoaded">
<p class="text-sm text-muted-foreground">
{{ size }}
</p>
<Dot />
<p class="text-sm text-muted-foreground">
{{ format }}
</p>
<Dot />
<p class="text-sm text-muted-foreground">
{{ type }}
</p>
</div>
<div class="flex flex-row items-center gap-2" v-if="hasProgress">
<p class="text-sm text-muted-foreground">
{{ progress }}%
</p>
<UiProgress :modelValue="progress" />
</div>
<div class="flex flex-row" v-if="hasError">
<p class="text-sm text-destructive-foreground">
{{ error }}
</p>
</div>
</div>
<div>
<DropdownMenu>
<DropdownMenuTrigger as-child>
<UiButton variant="ghost">
<EllipsisVertical :size="40" />
</UiButton>
</DropdownMenuTrigger>
<DropdownMenuContent class="w-56" align="start">
<DropdownMenuLabel>My Account</DropdownMenuLabel>
<DropdownMenuGroup>
<DropdownMenuItem>
Profile
</DropdownMenuItem>
<DropdownMenuItem>
Billing
</DropdownMenuItem>
<DropdownMenuItem>
Settings
</DropdownMenuItem>
<DropdownMenuItem>
Keyboard shortcuts
</DropdownMenuItem>
</DropdownMenuGroup>
</DropdownMenuContent>
</DropdownMenu>
</div>
</Frame>
</template>
<script setup lang="ts">
import {
DropdownMenu,
DropdownMenuContent,
DropdownMenuGroup,
DropdownMenuItem,
DropdownMenuLabel,
DropdownMenuShortcut,
DropdownMenuTrigger
} from '@/components/ui/dropdown-menu';
import Frame from '@/components/ui/frame/Frame.vue';
import { AudioWaveform, Disc3, Dot, EllipsisVertical, FileQuestionMark } from 'lucide-vue-next';
interface Props {
title: string
size?: string
format?: string
type?: string
progress?: number
error?: string
}
const props = withDefaults(defineProps<Props>(), {
});
const hasLoaded = props.size && props.format && props.type;
const hasProgress = props.progress;
const hasError = props.error;
</script>

View File

@ -1,58 +0,0 @@
<template>
<Frame margin="none" class="px-3 py-4 flex items-center gap-2">
<div>
<AudioWaveform :size="32" />
</div>
<div class="w-full">
<div class="flex flex-row items-center gap-1">
<p class="font-medium">
{{ title }}
</p>
<UiButton variant="ghost" v-if="size">
<Pen />
</UiButton>
</div>
<div class="flex flex-row" v-if="size && format">
<p class="text-sm text-muted-foreground">
{{ size }}
</p>
<Dot />
<p class="text-sm text-muted-foreground">
{{ format }}
</p>
</div>
<div class="flex flex-row items-center gap-2" v-if="progress">
<p class="text-sm text-muted-foreground">
{{ progress }}%
</p>
<UiProgress :modelValue="progress" />
</div>
<div class="flex flex-row" v-if="error">
<p class="text-sm text-destructive-foreground">
{{ error }}
</p>
</div>
</div>
<div>
<UiButton variant="ghost">
<EllipsisVertical :size="32" />
</UiButton>
</div>
</Frame>
</template>
<script setup lang="ts">
import Frame from '@/components/ui/frame/Frame.vue'
import { AudioWaveform, Dot, EllipsisVertical, Pen } from 'lucide-vue-next'
interface Props {
title: string
size?: string
format?: string
progress?: number
error?: string
}
withDefaults(defineProps<Props>(), {
})
</script>

View File

@ -2,7 +2,8 @@
import { Outline } from '@/components/ui/outline'; import { Outline } from '@/components/ui/outline';
import { SidebarTrigger } from '@/components/ui/sidebar'; import { SidebarTrigger } from '@/components/ui/sidebar';
import { Download, Play } from 'lucide-vue-next'; import { Download, Play } from 'lucide-vue-next';
import UploadEntry from '~/components/internal/import/uploadentry/UploadEntry.vue'; import PlaylistUploadEntry from '~/components/internal/import/uploadentry/PlaylistUploadEntry.vue';
import SingleUploadEntry from '~/components/internal/import/uploadentry/SingleUploadEntry.vue';
</script> </script>
<template> <template>
@ -36,10 +37,12 @@ import UploadEntry from '~/components/internal/import/uploadentry/UploadEntry.vu
<h3 class="scroll-m-20 text-2xl font-semibold tracking-tight"> <h3 class="scroll-m-20 text-2xl font-semibold tracking-tight">
Uploaded files Uploaded files
</h3> </h3>
<div class="flex-row space-y-2"> <div class="space-y-2">
<UploadEntry title="Test" size="3.8 MB" format="mp4" /> <SingleUploadEntry title="Test" size="3.8 MB" format="mp4" type="file" />
<UploadEntry title="Test" :progress="78" /> <SingleUploadEntry title="Test" :progress="78" />
<UploadEntry title="Test" error="Uploading failed, please check your internet" /> <SingleUploadEntry title="Test" error="Uploading failed, please check your internet" />
<PlaylistUploadEntry title="Test" :trackCount="3" type="youtube" />
<PlaylistUploadEntry title="Test" :progress="73" type="youtube" />
</div> </div>
</div> </div>
</div> </div>