AdaptTable for Naive UI

Rows in Naive UI

A row is more than a record. Pin it to the top or the bottom from its 3-dot menu, and merge a team that runs down consecutive rows so the name is written once.

rowPinning(), cellSpan() and a "menu" row-actions layout are what this page turns on. The table holds the pinned rows and keeps them in the URL, so a reload or a shared link keeps them where they were; pass pinnedRowIds to hold them yourself.

Grouping and trees refuse pinning: a nested list is not a flat pin stack. The pin keeps a team merge together — the person moves, the team stays one cell.

The code

<script setup lang="ts">
import type { ColumnDef } from "@adapttable/vue";
import { DataTable } from "@adapttable/naive-ui";
import { cellSpan } from "@adapttable/naive-ui/cell-span";
import { rowActions } from "@adapttable/naive-ui/row-actions";
import { rowPinning } from "@adapttable/naive-ui/row-pinning";

defineProps<{ rows: readonly Person[] }>();

const columns: ColumnDef<Person>[] = [{ key: "name" }, { key: "team" }];
const rowKey = (row: Person) => row.id;

function spanTeam({
  column,
  sectionRows,
  sectionRowIndex,
}: {
  column: { key: string };
  sectionRows: readonly Person[];
  sectionRowIndex: number;
}) {
  if (column.key !== "team") return undefined;
  const team = sectionRows[sectionRowIndex]?.team;
  if (sectionRows[sectionRowIndex - 1]?.team === team) return undefined;
  let rowSpan = 1;
  while (sectionRows[sectionRowIndex + rowSpan]?.team === team) rowSpan += 1;
  return rowSpan > 1 ? { rowSpan } : undefined;
}

const features = [rowPinning(), cellSpan(spanTeam), rowActions<Person>([])];
</script>

<template>
  <DataTable
    :data="rows"
    :columns="columns"
    :row-key="rowKey"
    row-actions-layout="menu"
    :features="features"
  />
</template>

Install

pnpm add @adapttable/naive-ui @adapttable/vue @adapttable/core naive-ui

The same feature in the other kits

More Naive UI features

Reference: row-pinning, row-reordering, row-spanning. More of this kit: AdaptTable for Naive UI, or the live demo.