1 changed files with 64 additions and 0 deletions
@ -0,0 +1,64 @@ |
|||
<script setup lang="ts"> |
|||
import type { WorkbenchTodoItem } from '@vben/common-ui'; |
|||
|
|||
import { |
|||
Card, |
|||
CardContent, |
|||
CardHeader, |
|||
CardTitle, |
|||
VbenCheckbox, |
|||
} from '@vben-core/shadcn-ui'; |
|||
|
|||
interface Props { |
|||
items?: WorkbenchTodoItem[]; |
|||
title: string; |
|||
} |
|||
|
|||
defineOptions({ |
|||
name: 'WorkbenchTodo', |
|||
}); |
|||
|
|||
withDefaults(defineProps<Props>(), { |
|||
items: () => [], |
|||
}); |
|||
</script> |
|||
|
|||
<template> |
|||
<Card> |
|||
<CardHeader class="py-4"> |
|||
<CardTitle class="text-lg">{{ title }}</CardTitle> |
|||
</CardHeader> |
|||
<slot v-if="items.length === 0" name="empty"></slot> |
|||
<CardContent v-else class="flex flex-wrap p-5 pt-0"> |
|||
<ul class="divide-border w-full divide-y" role="list"> |
|||
<li |
|||
v-for="item in items" |
|||
:key="item.title" |
|||
:class="{ |
|||
'select-none line-through opacity-60': item.completed, |
|||
}" |
|||
class="flex cursor-pointer justify-between gap-x-6 py-5" |
|||
> |
|||
<div class="flex min-w-0 items-center gap-x-4"> |
|||
<VbenCheckbox v-model:checked="item.completed" name="completed" /> |
|||
<div class="min-w-0 flex-auto"> |
|||
<p class="text-foreground text-sm font-semibold leading-6"> |
|||
{{ item.title }} |
|||
</p> |
|||
<!-- eslint-disable vue/no-v-html --> |
|||
<p |
|||
class="text-foreground/80 *:text-primary mt-1 truncate text-xs leading-5" |
|||
v-html="item.content" |
|||
></p> |
|||
</div> |
|||
</div> |
|||
<div class="hidden h-full shrink-0 sm:flex sm:flex-col sm:items-end"> |
|||
<span class="text-foreground/80 mt-6 text-xs leading-6"> |
|||
{{ item.date }} |
|||
</span> |
|||
</div> |
|||
</li> |
|||
</ul> |
|||
</CardContent> |
|||
</Card> |
|||
</template> |
|||
Loading…
Reference in new issue