Skip to content

Commit c7c084e

Browse files
committed
feat(table): allow rendering custom header via dynamic header slot
closes #84
1 parent ba48a69 commit c7c084e

File tree

3 files changed

+27
-23
lines changed

3 files changed

+27
-23
lines changed

docs/demos/table/DemoTableColumnSlot.vue renamed to docs/demos/table/DemoTableSlots.vue

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -31,19 +31,17 @@ const rows = [
3131
<template>
3232
<div class="cards-demo-container">
3333
<ATable :rows="rows">
34-
<!-- Name -->
35-
<template #col-name="{ row }">
36-
<span class="text-primary">
37-
{{ row.name }}
38-
</span>
34+
<!-- Header: Name -->
35+
<template #header-name="{ col }">
36+
<i class="i-bx-user me-1" /> {{ col.name }}
3937
</template>
4038

41-
<!-- Website -->
42-
<template #col-website="{ row }">
43-
<div class="flex gap-1 items-center">
44-
<div class="i-bx-globe" />
45-
{{ row.website }}
46-
</div>
39+
<!-- Column: Name -->
40+
<template #col-name="{ row }">
41+
<a
42+
:href="row.website"
43+
class="text-primary hover:underline"
44+
>{{ row.name }}</a>
4745
</template>
4846
</ATable>
4947
</div>

docs/guide/components/table.md

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,15 @@ Use `formatter` property while defining column to format the column text.
3737

3838
::::
3939

40-
<!-- 👉 Column Slot -->
41-
::::card Column Slot
40+
<!-- 👉 Slots -->
41+
::::card Slots
4242

43-
`ATable` generates scoped slot based on your column name. If your column name is `website` then you can use `col-website` scoped slot to render custom content in your column.
43+
`ATable` provides scoped slot for rendering customer header for your column instead of just text via `header-<colName>` slot.
4444

45-
:::code DemoTableColumnSlot
46-
<<< @/demos/table/DemoTableColumnSlot.vue{35-39,42-47}
45+
It also generates scoped slot based on your column name for rendering custom column. If your column name is `website` then you can use `col-website` scoped slot to render custom content in your column.
46+
47+
:::code DemoTableSlots
48+
<<< @/demos/table/DemoTableSlots.vue{35-39,42-47}
4749
:::
4850

4951
::::

packages/anu-vue/src/components/table/ATable.tsx

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -376,25 +376,29 @@ export const ATable = defineComponent({
376376
{/* 👉 thead */}
377377
<thead>
378378
<tr>
379-
{_columns.value.map(column =>
379+
{_columns.value.map(col =>
380380
<th
381381
class={[
382382
'a-table-table-th whitespace-nowrap',
383383
props.isSortable && 'cursor-pointer select-none',
384384
]}
385-
onClick={() => handleHeaderClick(column)}
385+
onClick={() => handleHeaderClick(col)}
386386
>
387387
<div class="inline-flex items-center">
388-
<span>
389-
{column.name}
390-
</span>
388+
{
389+
slots[`header-${col.name}`]
390+
? slots[`header-${col.name}`]?.({ col })
391+
: <span>
392+
{col.name}
393+
</span>
394+
}
391395
<div
392396
class="i-bx-up-arrow-alt"
393-
v-show={getShallSortByAsc.value(column) === true}
397+
v-show={getShallSortByAsc.value(col) === true}
394398
/>
395399
<div
396400
class="i-bx-down-arrow-alt"
397-
v-show={getShallSortByAsc.value(column) === false}
401+
v-show={getShallSortByAsc.value(col) === false}
398402
/>
399403
</div>
400404
</th>,

0 commit comments

Comments
 (0)