mirror of
https://github.com/tabler/tabler.git
synced 2026-10-20 14:54:31 +04:00
`Render Modal as real markup` (#2742) reformatted ~140 files back to tabs/semicolons, breaking the Prettier config added by the Astro quality gates (#2749). Re-run prettier --write to restore it, and fix the type errors it had been masking: HTMLElement casts and `this` typing in ChangePasswordModalContent/ConfirmDeleteModalContent scripts, plain-JS syntax in the inline-injected progress.astro script, narrowed prop unions in Button/Check/Spinner, nullable icon svg casts in Icons/Rating, and a duplicate firstLetters/invalid `placeholder` attribute in Select.astro. Also fix shared/vitest.config.mts's stale `astro/lib/**/*.test.ts` include glob left over from the shared source restructure, which made `pnpm test` report zero test files.
130 lines
4.9 KiB
Plaintext
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 AvatarList from '@ui/AvatarList.astro'
|
|
import CardTitle from '@ui/CardTitle.astro'
|
|
import tasksData from '@data/tasks.json'
|
|
|
|
interface Column {
|
|
name: string
|
|
tasks: Record<string, any>[]
|
|
}
|
|
|
|
interface Props {
|
|
data?: { columns: Column[] }
|
|
class?: string
|
|
}
|
|
|
|
const { data = tasksData as unknown as { columns: Column[] }, class: className } = Astro.props
|
|
---
|
|
|
|
<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 && <AvatarList 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>
|