DataTable para Quasar
🇺🇸 English | 🇧🇷 Versão em português
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
- Qué es y qué incluye
- Requisitos y compatibilidad
- Instalación en app Quasar
- Qué agrega la extensión al host
- Defaults globales (boot)
- Uso rápido
- Idioma (i18n)
- TypeScript en tu IDE
- API del componente
DataTable - Paginación client-side
- Paginación server-side
- Layout móvil (grid / cards)
- Referencia compacta
- Entrypoints públicos
- Troubleshooting
En 30 segundos
- Instala la extensión:
quasar ext add @benjaminor-dev/datatable. - Importa
DataTableen tu componente Vue. - Pasa
rows,columns,row-keyyv-model:pagination. - Añade
client-paginationpara paginación integrada en el cliente (oserver-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.
- Paginación client (
client-pagination) o server (server-pagination+ emits). - Colocación de barra:
auto|top|bottom|both(enauto, barra superior solo si la página actual muestra ≥ 15 filas). - Escala builtin de filas por página (5…300) y «Todas» cuando aplica.
- Breakpoint móvil compartido (
useDataTableGridLayout) — cards en< 600px. - Slot
#itempara cards custom; tarjeta por defecto incluida. - Helpers exportables para orquestar paginación en capas superiores de tu app.
- i18n integrado
en,es,pt— la barra de paginación sigue$q.lang; overrides opcionales en boot (locale,messages).
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.config → boot: [] 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.isoName → en; 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.
- Importa tipos desde
@benjaminor-dev/quasar-app-extension-datatable/types(o el entry principal para componentes y helpers). - En VS Code / Cursor: Ctrl+Space / Cmd+Space dentro de
client-paginationoserver-paginationpara ver props válidas (DataTableClientPaginationConfig,DataTableServerPaginationConfig). - Pasa el cursor sobre props de
<DataTable>: el tooltip muestra JSDoc y tipos de QuasarQTabledonde aplica. v-model:paginationestá tipado comoClientTablePaginationState— compatible con el modelo de paginación deQTable.useDataTableGridLayout()devuelveRef<boolean>; en plantillas con TS estricto, usacomputed(() => layoutRef.value)si:gridno desenvuelve el ref.
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],
}"
/>
- La barra se oculta si
totalRowsno supera el primer escalón de la escala. - Escala builtin: «Todas» cuando
5 ≤ total ≤ 100. pageSizeLaddercustom: sin opción «Todas».
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.config → css |
| 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.