Files
cli-e2e-mqo775am/apps/kanban/src/lib/kanban.ts
2026-06-21 21:47:10 +02:00

50 lines
1.5 KiB
TypeScript

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) })
}