DataTable para Quasar

🇺🇸 English | 🇧🇷 Versão em português

npm version license Vue Quasar TypeScript Node

Extensión Quasar con DataTable homologado: shell sobre QTable, paginación client/server unificada y cards en viewports < sm.

Tabla de contenidos

En 30 segundos

  1. Instala la extensión: quasar ext add @benjaminor-dev/datatable.
  2. Importa DataTable en tu componente Vue.
  3. Pasa rows, columns, row-key y v-model:pagination.
  4. Añade client-pagination para paginación integrada en el cliente (o server-pagination + emits si controlas el backend).

La extensión registra CSS y un boot de defaults en el host automáticamente.

Qué es y qué incluye

DataTable es una capa de presentación sobre Quasar QTable: shell con borde opcional, barra de paginación (TablePaginationBar) y layout en cards en móvil.

Requisitos y compatibilidad

Item Valor
Node >= 20.0.0
Quasar ^2.6.0
Vue ^3.4.18
Formato del paquete ES modules
CLI recomendado @quasar/app-vite ^2.x o ^3.x

Instalación en app Quasar

quasar ext add @benjaminor-dev/datatable

Tras quasar ext add, la extensión registra CSS y el boot de defaults automáticamente. No hace falta nada extra en una instalación npm normal.

Remover:

quasar ext remove @benjaminor-dev/datatable

Elimina el boot de defaults generado y su entrada en quasar.config. La inyección de estilos puede permanecer si otro paquete instalado registra la misma ruta CSS.

Qué agrega la extensión al host

Recurso Ruta en el host
Estilos ~@benjaminor-dev/quasar-app-extension-datatable/main.css
Boot defaults del host src/boot/bor/bor-datatable-defaults.ts — creado al instalar; Skip/Overwrite si ya existe

Install (quasar ext add / invoke): crea src/boot/bor/bor-datatable-defaults.ts (o .js) y lo registra en quasar.configboot: [] automáticamente. No hace falta editarlo a mano en una instalación normal. main.css se inyecta en cada dev/build (no aparece como entrada corta en quasar.config).

Remove (quasar ext remove): elimina el boot de defaults y su entrada en quasar.config cuando la extensión lo creó.

Orden de boots (esta extensión):

1. bor/bor-datatable-defaults (host)
2. resto de tus boots

En quasar.config solo verás bor/bor-datatable-defaults; main.css lo inyecta la extensión al compilar.

Defaults globales (boot)

Edita src/boot/bor/bor-datatable-defaults.ts tras instalar para fijar locale u overridear textos de paginación:

import { configureDataTableDefaults } from "@benjaminor-dev/quasar-app-extension-datatable";

configureDataTableDefaults({
  // locale: "es", // fija en | es | pt; omitir = sigue $q.lang
  // messages: { allRows: "Ver todas" },
});

configureDataTable es alias de configureDataTableDefaults. Prioridad: boot locale$q.lang.isoNameen; boot messages hace merge sobre el catálogo builtin.

Uso rápido

<script setup lang="ts">
import { ref } from "vue";
import DataTable from "@benjaminor-dev/quasar-app-extension-datatable";
import type { ClientTablePaginationState } from "@benjaminor-dev/quasar-app-extension-datatable/types";

const rows = [
  { id: 1, name: "Ana", role: "Admin" },
  { id: 2, name: "Luis", role: "Editor" },
];

const columns = [
  { name: "name", label: "Nombre", field: "name", align: "left" as const },
  { name: "role", label: "Rol", field: "role", align: "left" as const },
];

const pagination = ref<ClientTablePaginationState>({
  sortBy: "name",
  descending: false,
  page: 1,
  rowsPerPage: 10,
});
</script>

<template>
  <DataTable
    v-model:pagination="pagination"
    :rows="rows"
    :columns="columns"
    row-key="id"
    :client-pagination="{ defaultPageSize: 10 }"
  />
</template>

Idioma (i18n)

Integrado en, es y pt. Por defecto la barra de paginación sigue el idioma de Quasar ($q.lang.isoName); si Quasar no tiene idioma, el fallback es en.

Resolución de locale: boot locale → prefijo de $q.lang.isoName (es*es, pt*pt) → en.

Opción Cuándo usarla
framework.lang en quasar.config.ts Recomendado — alinea DataTable con el resto de Quasar
locale: 'es' en boot Fijar idioma (en | es | pt); ignora cambios de $q.lang
messages: { allRows: '…' } en boot Cambiar un texto sin fijar locale

Ejemplo en quasar.config.ts (español para toda la app):

framework: {
  lang: "es",
},

Claves i18n: etiquetas aria de navegación, filas por página, indicador de página ({page}, {lastPage}), formato de rango ({start}, {end}, {total}) y allRows.

TypeScript en tu IDE

No memorices la API: deja que el autocompletado te guíe.

Si algo no aparece en autocompletado, revisa el import (/types vs entry principal) antes de buscar en el README.

import DataTable, {
  useDataTableGridLayout,
  buildDynamicRowsPerPageOptions,
} from "@benjaminor-dev/quasar-app-extension-datatable";

import type {
  ClientTablePaginationState,
  DataTableServerPaginationConfig,
  DataTablePaginationPlacement,
} from "@benjaminor-dev/quasar-app-extension-datatable/types";

API del componente DataTable

Prop Tipo Default Descripción
rows readonly Record<string, unknown>[] Filas a mostrar
columns QTableProps['columns'] Columnas Quasar
row-key string | fn Clave de fila
grid boolean auto true = cards; false = tabla en móvil; omitido = cards en < sm
bordered boolean true Borde del shell
flat boolean true QTable flat
dense boolean true QTable dense
client-pagination DataTableClientPaginationConfig Paginación client integrada
server-pagination DataTableServerPaginationConfig Estado server + barra
pagination-placement DataTablePaginationPlacement 'auto' Posición de la barra
selection 'single' | 'multiple' Selección de filas
loading boolean false Estado de carga
hide-pagination boolean true Oculta paginación nativa de QTable

Emits (modo server): pageSizeChange, first, previous, next, last.

Slots: item (card en grid), top, bottom, slots de columna estándar de QTable.

Paginación client-side

<DataTable
  v-model:pagination="pagination"
  :rows="rows"
  :columns="columns"
  row-key="id"
  :client-pagination="{
    defaultPageSize: 10,
    placement: 'auto',
    pageSizeLadder: [5, 10, 25, 50],
  }"
/>

Paginación server-side

El padre controla pagination y escucha emits. Pasa estado derivado en server-pagination:

import type { DataTableServerPaginationConfig } from "@benjaminor-dev/quasar-app-extension-datatable/types";

const serverPagination = computed<DataTableServerPaginationConfig>(() => ({
  totalRows: store.total,
  pageSize: store.pageSize,
  lastPage: store.lastPage,
  pageSizeOptions: store.pageSizeOptions,
  rangeLabel: store.rangeLabel,
  enabled: store.hasSearched,
}));

Los mismos helpers (buildDynamicRowsPerPageOptions, resolveDataTablePaginationPlacement, …) son exportables desde este paquete.

Layout móvil (grid / cards)

Por defecto, viewports ≤ 599px usan layout grid (cards).

<script setup lang="ts">
import { computed } from "vue";
import { useDataTableGridLayout } from "@benjaminor-dev/quasar-app-extension-datatable";

const isMobileGridRef = useDataTableGridLayout();
const isMobileGrid = computed(() => isMobileGridRef.value);
</script>

<template>
  <DataTable :grid="isMobileGrid" ... />
</template>

Slot #item para card custom:

<template #item="props">
  <MyCard :row="props.row" :cols="props.cols" />
</template>

Referencia compacta

Símbolo Entry Nota
DataTable . Componente principal (default export)
TablePaginationBar . Barra standalone
useClientTablePagination . Lógica client + handlers
useDataTableGridLayout . Breakpoint móvil (singleton)
buildDynamicRowsPerPageOptions . / /types Opciones del selector de tamaño
resolveDataTablePaginationPlacement . / /types top / bottom según placement
shouldShowDataTablePaginationBar . / /types ¿Mostrar barra?
ClientTablePaginationState /types v-model:pagination
DataTableClientPaginationConfig /types Prop client-pagination
DataTableServerPaginationConfig /types Prop server-pagination
DataTablePaginationPlacement /types 'auto' | 'top' | 'bottom' | 'both'

Lista completa de tipos y reexports: importa /types y usa autocompletado del IDE.

Entrypoints públicos

Entrypoint Contenido
@benjaminor-dev/quasar-app-extension-datatable DataTable, TablePaginationBar, composables, utils, i18n (configureDataTableDefaults, resolveDataTableMessages)
@benjaminor-dev/quasar-app-extension-datatable/types Tipos + reexports tipados de helpers
@benjaminor-dev/quasar-app-extension-datatable/main.css Estilos (registrado en quasar.config al instalar)

Troubleshooting

Síntoma Causa probable Fix
Tabla sin estilos Extensión no instalada o CSS ausente quasar ext add @benjaminor-dev/datatable; revisar quasar.configcss
Barra de paginación no aparece Pocas filas vs primer escalón Normal si totalRows ≤ minPageSizeStep
Cards estrechas en móvil Slot #item sin ancho 100% width: 100% en root del slot o clases dt-data-table-grid-*
Error TS Ref<boolean> en :grid Ref importado de paquete externo computed(() => layoutRef.value) en el consumidor
Textos de paginación en inglés Idioma de Quasar no configurado framework.lang en quasar.config o configureDataTableDefaults({ locale: 'es' }) en boot
Boot defaults ausente tras remove Desinstalación parcial o borrado manual quasar ext add @benjaminor-dev/datatable de nuevo

MIT © Benjamín Olvera R.