chore: kanban template
This commit is contained in:
49
apps/kanban/src/lib/kanban.ts
Normal file
49
apps/kanban/src/lib/kanban.ts
Normal file
@@ -0,0 +1,49 @@
|
||||
import i18n from '../i18n/config'
|
||||
|
||||
export type CardStatus = 'todo' | 'doing' | 'done'
|
||||
|
||||
export interface Card {
|
||||
cardId: string
|
||||
title: string
|
||||
status: CardStatus | string
|
||||
position: number
|
||||
createdAt: string
|
||||
}
|
||||
|
||||
export const STATUSES: CardStatus[] = ['todo', 'doing', 'done']
|
||||
|
||||
export function sortCards(cards: Card[]) {
|
||||
return [...cards].sort((a, b) => {
|
||||
if (a.status !== b.status) return a.status.localeCompare(b.status)
|
||||
return a.position - b.position
|
||||
})
|
||||
}
|
||||
|
||||
export function classifyHealth(cards: Card[]) {
|
||||
const todo = cards.filter((card) => card.status === 'todo').length
|
||||
const doing = cards.filter((card) => card.status === 'doing').length
|
||||
if (doing === 0) return 'idle'
|
||||
if (todo > doing * 2) return 'backlogged'
|
||||
return 'flowing'
|
||||
}
|
||||
|
||||
export function prettyStatus(status: string) {
|
||||
switch (status) {
|
||||
case 'todo':
|
||||
return i18n.t('status.todo')
|
||||
case 'doing':
|
||||
return i18n.t('status.doing')
|
||||
case 'done':
|
||||
return i18n.t('status.done')
|
||||
default:
|
||||
return status
|
||||
}
|
||||
}
|
||||
|
||||
export function relativeTime(timestamp: string) {
|
||||
const delta = Math.max(0, Math.floor((Date.now() - new Date(timestamp).getTime()) / 1000))
|
||||
if (delta < 60) return i18n.t('relativeTime.seconds', { count: delta })
|
||||
if (delta < 3600) return i18n.t('relativeTime.minutes', { count: Math.floor(delta / 60) })
|
||||
if (delta < 86400) return i18n.t('relativeTime.hours', { count: Math.floor(delta / 3600) })
|
||||
return i18n.t('relativeTime.days', { count: Math.floor(delta / 86400) })
|
||||
}
|
||||
Reference in New Issue
Block a user