Files

130 lines
4.9 KiB
Plaintext

---
// task['due-date'] is undefined (field is due_date) — due-date branch never renders.
// Avatar offset uses task['users-offset'] (hyphenated key).
import Icon from '@ui/Icon.astro'
import PeopleAvatarList from '@shared/components/demo/PeopleAvatarList.astro'
import CardTitle from '@ui/CardTitle.astro'
import tasksData from '@data/tasks.json'
interface Column {
name: string
tasks: Record<string, any>[]
}
interface Props {
class?: string
}
const { class: className } = Astro.props
const data = tasksData as unknown as { columns: Column[] }
---
<div class={`row${className ? ` ${className}` : ''}`}>
{
data.columns.map((column) => (
<div class="col-12 col-md-6 col-lg">
<h2 class="mb-3">{column.name}</h2>
<div class="mb-4">
<div class="row row-cards">
{column.tasks.map((task) => (
<div class="col-12">
<div class="card card-sm">
{task.color && <div class={`card-status-top bg-${task.color}`} />}
{task.starred && (
<div class="ribbon ribbon-top ribbon-bookmark bg-yellow">
<Icon name="star" />
</div>
)}
<div class="card-body">
<CardTitle>{task.name}</CardTitle>
{/* Description may contain markup (e.g. <a>#tag</a>) — rendered with set:html */}
{task.description && <div class="text-secondary" set:html={task.description} />}
{task.image && (
<div class="ratio ratio-16x9">
<img src={`./${task.image}`} class="rounded object-cover" alt={task.name} />
</div>
)}
<div class="mt-4">
<div class="row">
<div class="col">{task.users && <PeopleAvatarList stacked={true} size="xs" offset={task['users-offset'] ?? 0} limit={task.users} />}</div>
{task['due-date'] && (
<div class="col-auto">
<a href="#" class="link-warning">
<Icon name="calendar" />
{task['due-date']}
</a>
</div>
)}
<div class="col-auto text-secondary">
<button class={`switch-icon switch-icon-scale${task.favorite ? ' active' : ''}`} data-bs-toggle="switch-icon">
<span class="switch-icon-a text-muted">
<Icon name="heart" />
</span>
<span class="switch-icon-b text-red">
<Icon name="heart" class="icon-filled" />
</span>
</button>
{task.likes ? task.likes : ''}
</div>
{task.subtasks && (
<div class="col-auto">
<a href="#" class="link-secondary">
<Icon name="activity" />
1/{task.subtasks.length}
</a>
</div>
)}
{task.comments && (
<div class="col-auto">
<a href="#" class="link-secondary">
<Icon name="message" /> {task.comments}
</a>
</div>
)}
<div class="col-auto">
<a href="#" class="link-secondary">
<Icon name="share" />
</a>
</div>
</div>
</div>
{task.subtasks && (
<div class="divide-y-2 mt-4">
{task.subtasks.map((subtask: { name: string; done?: boolean }) => (
<div>
{subtask.done ? (
<Fragment>
<Icon name="check" color="muted" />
<span class="text-secondary text-decoration-line-through">{subtask.name}</span>
</Fragment>
) : (
<Fragment>
<Icon name="check" color="green" />
{subtask.name}
</Fragment>
)}
</div>
))}
</div>
)}
</div>
</div>
</div>
))}
</div>
</div>
</div>
))
}
</div>