main
vue 47 lines 1.29 KB
Raw
1 <template>
2 <n-card :title segmented :size>
3 <n-timeline class="mt-2">
4 <n-timeline-item
5 v-for="item in timelineItems"
6 :key="item.title"
7 :title="item.title"
8 :time="`${formatDate(item.date, dFormats[format])}`"
9 />
10 </n-timeline>
11 </n-card>
12 </template>
13
14 <script setup lang="ts">
15 import type { CardProps } from "naive-ui"
16 import { NCard, NTimeline, NTimelineItem } from "naive-ui"
17 import { computed } from "vue"
18 import { useSettingsStore } from "@/stores/settings"
19 import { isDate } from "@/utils"
20 import { formatDate } from "@/utils/format"
21
22 export interface TimelineItem {
23 title: string
24 date?: string | Date | number | null
25 }
26
27 const {
28 title = "Timeline",
29 size = "small",
30 items,
31 format = "datetime"
32 } = defineProps<{
33 title?: string
34 size?: CardProps["size"]
35 items: TimelineItem[]
36 format?: "datetime" | "date" | "time" | "timesec" | "datetimesec"
37 }>()
38
39 const dFormats = useSettingsStore().dateFormat
40
41 const timelineItems = computed(() => {
42 const filteredItems = items.filter(item => item.date && `${item.date}`.trim() && isDate(item.date))
43 const mappedItems = filteredItems.map(item => ({ title: item.title, date: formatDate(`${item.date}`, "x") }))
44 const sortedItems = mappedItems.sort((a, b) => new Date(a.date).getTime() - new Date(b.date).getTime())
45 return sortedItems
46 })
47 </script>