npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@brios-sorzu/angular

v0.1.7

Published

Componente Angular standalone para Brios Grid

Readme

@brios-sorzu/angular

Adaptador Angular standalone para Brios Grid.

import { BriosGridComponent } from '@brios-sorzu/angular';

@Component({
  standalone: true,
  imports: [BriosGridComponent],
  template: `<brios-grid [items]="items" [columns]="columns" />`
})
export class ClientesPage {}

Las celdas marcadas con editable: true se editan con doble clic. El componente emite rowClick, selectionChange y cellEditCommit.

La validación se ejecuta antes de confirmar una celda o una fila. Además de las reglas de required, longitud, patrón y límites, GridColumn.validate puede devolver una promesa para validación asíncrona o remota:

const columns: GridColumn<Customer>[] = [
  {
    key: 'email',
    header: 'Correo',
    editable: true,
    validate: async (value) => isEmailAvailable(String(value)) ? null : 'El correo ya está registrado'
  }
];

Mientras una validación asíncrona está pendiente se muestra Validando…. Si falla, el mensaje queda asociado a la celda y, durante la edición de fila, también aparece un resumen en la zona de acciones. Los editores reciben aria-invalid="true" cuando su valor no es válido; validation permite integrar mensajes o telemetría propia.

También soporta [groupBy], childrenField, loadChildren, briosGridCellTemplate, briosGridDetailTemplate, [persistKey], selección por rangos, virtualización, filtros por valores únicos, resize/reorder, auto-size, el evento columnResize, exportación CSV/PDF/SpreadsheetML, pegado TSV, prefetch remoto y actualización masiva de la selección.

El layout de columnas puede configurarse con showHeaderTitle y showInColumnChooser dentro de cada GridColumn. El primero controla el título visible del encabezado y el segundo mantiene o excluye la columna del selector; ambos son true por defecto. [showColumnChooser]="true" muestra el selector y columnLayoutChange emite el layout cuando cambia el orden, la visibilidad o la agrupación:

const columns: GridColumn<Customer>[] = [
  { key: 'id', header: 'ID', showHeaderTitle: false, showInColumnChooser: false },
  { key: 'name', header: 'Nombre' },
  { key: 'email', header: 'Correo', showInColumnChooser: false }
];

Las etiquetas labels.columnChooser y labels.autoSizeTooltip permiten localizar los nombres accesibles de mostrar/ocultar columnas y auto-size.

Cuando existen varios rangos disjuntos, copySelection() copia cada bloque rectangular en el orden de selección y los separa con una línea en blanco para conservar sus límites al pegarlo en otra aplicación.

La copia usa navigator.clipboard cuando está disponible y cae automáticamente a un textarea temporal si el navegador rechaza el permiso o la API no existe.

Las columnas aceptan flex para repartir el espacio restante del viewport respetando minWidth y maxWidth. El template briosGridGroupTemplate permite reemplazar la presentación de grupos y subtotales; su contexto expone group, value, count, aggregates y toggle.

El pegado TSV valida la matriz completa antes de aplicarla. Usa [pasteAtomic]="false" para permitir cambios válidos aunque existan celdas rechazadas, y escucha (pasteComplete) para recibir changes, errors y cancelled. [confirmPaste] permite confirmar o cancelar una sobrescritura después de validar y antes de mutar. El pegado usa las columnas visibles por defecto; [pasteColumnScope]="'all'" incluye también columnas ocultas en el mapeo tabular. Las columnas pueden usar editor: { type: 'textarea' } para edición multilinea; Ctrl/Cmd+Enter confirma y Escape cancela. briosGridValidationTemplate permite personalizar el mensaje de error con el contexto de fila, columna y estado pending. Los atajos principales se pueden cambiar con [keyboardShortcuts]; usa mod para Ctrl/Cmd y false para deshabilitar un comando, por ejemplo:

<brios-grid
  [keyboardShortcuts]="{ copy: 'mod+shift+c', undo: false, beginEdit: 'f3' }" />

Los valores largos muestran un tooltip visual al pasar el mouse o al convertirse en la celda activa, y exponen el texto completo mediante un nombre accesible. Se puede desactivar con [showTruncatedCellTooltip]="false" o ajustar el umbral con [truncatedTooltipMinLength]. [editCommitMode]="'explicit'" evita confirmar una celda al perder el foco; Enter o el contexto del editor pueden confirmarla. [confirmRemove] permite confirmar eliminaciones de forma síncrona o asíncrona.

En TreeGrid, [treeSelectionPropagation] puede ser none, descendants, ancestors o both para controlar cómo se propaga la selección entre nodos. Los hijos anidados entran en selectedRows, selectAll() y applySelectionChanges(), incluso cuando fueron cargados de forma lazy; las actualizaciones reconstruyen los padres de forma inmutable.

[showFilterMenu] activa el menú de filtros estilo Excel en los headers, con operador, búsqueda de valores, selección múltiple, limpiar y cierre al hacer click fuera. El límite [maxFilterValues] evita materializar listas enormes. El valor global se puede sobrescribir por columna con showFilterMenu dentro de la definición de GridColumn:

columns = [
  { key: 'id', header: 'ID', showFilterMenu: true },
  { key: 'name', header: 'Nombre', showFilterMenu: false }
];

Si una columna no define la propiedad, hereda [showFilterMenu] del grid. La fila de filtros completa sigue controlándose con [filterable].

Con [showGroupSummaries] la grilla inserta subtotales por grupo. Los editores pueden personalizarse con briosGridEditorTemplate, cuyo contexto expone value, setValue, commit y cancel. [showGroupDropZone]="true" habilita un panel accesible para agregar grupos con teclado o arrastrando columnas desde los headers; cada grupo puede retirarse desde su chip y el orden se conserva en el estado persistido.

El estado persistido puede versionarse con [persistVersion]. Cuando cambia el esquema, [persistMigrate] recibe el snapshot anterior y puede devolver el snapshot adaptado.

La exportación integrada respeta las columnas visibles y [exportSelectionOnly] y descarga XLSX Open XML real. downloadCsv() usa bloques cooperativos; también se puede usar downloadCsvAsync() para esperar la promesa y observar el mismo estado de progreso, cancelación y error que XLSX. PDF emite el estado running/completed/error durante su generación síncrona. Para conservar la estructura visible de grupos y detalles se pueden activar [exportGroups], [exportGroupSummaries] y [exportDetails]; el XLSX usa bloques cooperativos configurables con [exportChunkSize], progreso y cancelación. La API de exportación completa (toCsv, toXlsx, toPdf, hooks y múltiples hojas) se puede importar desde @brios-sorzu/components.

Para fuentes remotas se pueden configurar reintentos cancelables con [remoteRetries], [remoteRetryDelayMs], [remoteRetryBackoff] y [remoteShouldRetry]. La grilla cancela cargas pendientes cuando cambia el datasource o se destruye el componente. El datasource también puede definir resolveConflict para devolver la fila reconciliada cuando una actualización remota es rechazada; si devuelve null se conserva el rollback actual. Cuando la resolución no devuelve una fila, la grilla expone el evento remoteConflict y mantiene remoteConflictState para que la aplicación pueda mostrar una política propia; el banner incorporado permite reabrir la edición o descartar el conflicto. La interfaz BriosGridRemoteConflict incluye la clave, fila, índice, cambios y error original. Para conflictos bulk se emite remoteConflictBulk, que incluye todas las filas rechazadas y expone acciones integradas de reintento o descarte.

En applySelectionChanges, si el datasource usa updateMany y rechaza el batch, GridController intenta resolveConflict por cada fila. El commit bulk continúa solo si todas las filas se reconcilian; una resolución parcial aplica las filas resueltas, revierte solo las rechazadas y publica remoteConflictBulk con las filas pendientes.

Los adaptadores cursor pueden avanzar con loadNextCursor() y consultar el valor actual mediante nextCursor; también es posible iniciar un cursor con setCursor().

Los textos de operadores se pueden traducir con labels.operatorLabels, por ejemplo { between: 'entre', isEmpty: 'sin valor' }. También puedes traducir filterValuesSearch, selectFilterValues y clearFilterValues dentro de labels. Si no pasas labels, [locale]="'es-MX'" usa defaults en español y [locale]="'en-US'" defaults en inglés. labels es parcial: solo reemplaza las claves que necesites y conserva las demás del locale activo.

Para sincronizar filtros, búsqueda, sort, grupos y paginación con el router o un storage propio, usa los métodos públicos:

const state = grid.serializeQueryState();
grid.restoreQueryState(state);

El valor es URL-safe y restoreQueryState devuelve false si recibe datos inválidos.

Las columnas admiten locale, currency, numberFormat y dateFormat cuando no se define un formatter, y la grilla expone [locale] como valor predeterminado para presentar números, moneda y fechas según la región. Para edición localizada se puede usar dataType: 'currency' o editor: { type: 'currency' }; el campo acepta separadores regionales y el valor confirmado siempre es numérico. applySelectionChanges() agrupa los cambios locales en una transacción y hace rollback si la persistencia remota falla.

Las eliminaciones remotas son optimistas por defecto; [optimisticMutations]="false" permite esperar la confirmación del servidor antes de retirar la fila.

Los estados también son personalizables:

<ng-template briosGridStateTemplate="empty">No hay clientes.</ng-template>
<ng-template briosGridStateTemplate="error" let-error="error" let-retry="retry">
  Error: {{ error }} <button type="button" (click)="retry()">Reintentar</button>
</ng-template>

El contexto de error expone error y retry, de modo que un estado personalizado conserva la recuperación remota.