rl-core-front 0.18.3 → 0.18.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json
CHANGED
|
@@ -324,11 +324,18 @@ export function Combobox({
|
|
|
324
324
|
* fecha em seguida. No modo múltiplo o campo é onde ficam os itens já
|
|
325
325
|
* escolhidos: cobri-lo esconderia justamente o que se acabou de marcar,
|
|
326
326
|
* e o painel continua aberto para marcar o próximo.
|
|
327
|
+
*
|
|
328
|
+
* Só quando abre para **baixo**: ali o que fica sobre o campo é a
|
|
329
|
+
* busca, e soltar o clique nela não faz nada. Virado para cima — campo
|
|
330
|
+
* no fim da tela, lista longa — cobrir o campo punha a **última opção**
|
|
331
|
+
* sob o cursor, e o `pointerup` do mesmo clique que abriu a escolhia:
|
|
332
|
+
* o painel fechava na hora com um valor que ninguém pediu, e a tela
|
|
333
|
+
* parecia um select que "não abre". Para cima, o painel encosta no
|
|
334
|
+
* campo sem cobri-lo.
|
|
327
335
|
*/
|
|
328
336
|
className={cn(
|
|
329
337
|
"max-h-[min(18rem,var(--radix-dropdown-menu-content-available-height))] w-(--radix-dropdown-menu-trigger-width) overflow-y-auto p-1",
|
|
330
|
-
!multiple &&
|
|
331
|
-
"data-[side=bottom]:-mt-(--radix-dropdown-menu-trigger-height) data-[side=top]:-mb-(--radix-dropdown-menu-trigger-height)",
|
|
338
|
+
!multiple && "data-[side=bottom]:-mt-(--radix-dropdown-menu-trigger-height)",
|
|
332
339
|
)}
|
|
333
340
|
align="start"
|
|
334
341
|
sideOffset={multiple ? 4 : 0}
|
|
@@ -31,7 +31,11 @@ import {
|
|
|
31
31
|
GripVertical,
|
|
32
32
|
SlidersHorizontal,
|
|
33
33
|
} from "lucide-react";
|
|
34
|
-
import type {
|
|
34
|
+
import type {
|
|
35
|
+
CSSProperties,
|
|
36
|
+
JSX,
|
|
37
|
+
PointerEvent as ReactPointerEvent,
|
|
38
|
+
} from "react";
|
|
35
39
|
import { Fragment, useEffect, useMemo, useRef, useState } from "react";
|
|
36
40
|
|
|
37
41
|
import { countConditions } from "#core/_utils/advanced-filter";
|
|
@@ -257,6 +261,15 @@ interface DataTableProps<T extends RowData> {
|
|
|
257
261
|
* enquanto a listagem estiver na tela; não é gravada.
|
|
258
262
|
*/
|
|
259
263
|
collapsibleGroups?: boolean;
|
|
264
|
+
/**
|
|
265
|
+
* As seções que nascem fechadas — por chave.
|
|
266
|
+
*
|
|
267
|
+
* Para a listagem longa em que só uma seção interessa de saída: o ano
|
|
268
|
+
* agrupado por mês abre com o mês corrente à vista e os outros na faixa.
|
|
269
|
+
* Lida uma vez, na montagem; quem quiser reaplicar quando os dados trocam
|
|
270
|
+
* remonta a tabela (`key`). Sem `collapsibleGroups` não tem efeito.
|
|
271
|
+
*/
|
|
272
|
+
defaultCollapsedGroups?: string[];
|
|
260
273
|
/**
|
|
261
274
|
* A ordem das seções.
|
|
262
275
|
*
|
|
@@ -286,6 +299,26 @@ export interface DataTableColumnMeta {
|
|
|
286
299
|
* É o caso da coluna de ações: sem isso o `<table>` a esticava.
|
|
287
300
|
*/
|
|
288
301
|
shrink?: boolean;
|
|
302
|
+
/**
|
|
303
|
+
* A célula quebra em várias linhas em vez de cortar com reticências.
|
|
304
|
+
*
|
|
305
|
+
* O padrão é cortar: numa tabela, a linha que cresce para caber um texto
|
|
306
|
+
* desloca todas as vizinhas, e correr o olho por uma coluna deixa de ser
|
|
307
|
+
* possível. Quem precisa do texto inteiro tem o detalhe da linha.
|
|
308
|
+
*
|
|
309
|
+
* Liga-se onde a célula não é texto corrido e sim um conjunto que empilha —
|
|
310
|
+
* marcadores, chips, uma lista de badges: ali a quebra é o desenho, e cortar
|
|
311
|
+
* esconderia item, não fim de frase.
|
|
312
|
+
*/
|
|
313
|
+
wrap?: boolean;
|
|
314
|
+
/**
|
|
315
|
+
* O teto de largura da célula, quando o padrão não serve.
|
|
316
|
+
*
|
|
317
|
+
* Aceita qualquer largura CSS (`"12rem"`, `"320px"`). Existe porque a coluna
|
|
318
|
+
* que carrega o nome principal da linha merece mais espaço que a de apoio, e
|
|
319
|
+
* sem isso as duas cortariam no mesmo ponto.
|
|
320
|
+
*/
|
|
321
|
+
maxWidth?: string;
|
|
289
322
|
/**
|
|
290
323
|
* A coluna existe, mas não aparece até alguém ligá-la em "Colunas".
|
|
291
324
|
*
|
|
@@ -418,6 +451,47 @@ function shrinkClass(columnDef: { meta?: unknown }): string | undefined {
|
|
|
418
451
|
return meta?.shrink ? "w-px whitespace-nowrap" : undefined;
|
|
419
452
|
}
|
|
420
453
|
|
|
454
|
+
/**
|
|
455
|
+
* O teto padrão de uma célula — 24rem, a largura em que uma frase ainda se lê
|
|
456
|
+
* inteira e duas colunas de apoio ainda cabem ao lado.
|
|
457
|
+
*/
|
|
458
|
+
const CELL_MAX_WIDTH = "24rem";
|
|
459
|
+
|
|
460
|
+
/**
|
|
461
|
+
* Como a célula se comporta quando o conteúdo não cabe: corta com reticências.
|
|
462
|
+
*
|
|
463
|
+
* É o padrão, e não um ajuste por tela: sem ele, cada tabela nova volta a
|
|
464
|
+
* crescer em altura no primeiro texto longo, e quem monta a coluna precisa
|
|
465
|
+
* lembrar de podá-la — lembrar é o que ninguém faz.
|
|
466
|
+
*
|
|
467
|
+
* A coluna que encolhe (`shrink`) fica fora: ela já não cresce, e um teto ali
|
|
468
|
+
* cortaria botão de ação. A que declara `wrap` também: nela a quebra é o
|
|
469
|
+
* desenho.
|
|
470
|
+
*/
|
|
471
|
+
function cellStyle(columnDef: {
|
|
472
|
+
meta?: unknown;
|
|
473
|
+
}): { className?: string; style?: CSSProperties } {
|
|
474
|
+
const meta = columnDef.meta as DataTableColumnMeta | undefined;
|
|
475
|
+
|
|
476
|
+
if (meta?.shrink || meta?.wrap) {
|
|
477
|
+
return { className: shrinkClass(columnDef) };
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
/*
|
|
481
|
+
O corte vale para a célula **e** para o que ela tem dentro.
|
|
482
|
+
|
|
483
|
+
`truncate` na `<td>` sozinho só clipa quando o conteúdo é um bloco — um
|
|
484
|
+
`<div>` que envolve o texto, que é como metade das colunas é escrita: o
|
|
485
|
+
texto some no meio da palavra, sem as reticências, porque quem transborda é
|
|
486
|
+
o filho e não a célula. Repetindo o corte no filho direto, as reticências
|
|
487
|
+
aparecem nos dois casos.
|
|
488
|
+
*/
|
|
489
|
+
return {
|
|
490
|
+
className: "truncate [&>*]:truncate",
|
|
491
|
+
style: { maxWidth: meta?.maxWidth ?? CELL_MAX_WIDTH },
|
|
492
|
+
};
|
|
493
|
+
}
|
|
494
|
+
|
|
421
495
|
export function DataTable<T extends RowData>({
|
|
422
496
|
columns,
|
|
423
497
|
data,
|
|
@@ -448,11 +522,14 @@ export function DataTable<T extends RowData>({
|
|
|
448
522
|
renderGroupHeader,
|
|
449
523
|
groupOrder,
|
|
450
524
|
collapsibleGroups = false,
|
|
525
|
+
defaultCollapsedGroups,
|
|
451
526
|
}: DataTableProps<T>): JSX.Element {
|
|
452
527
|
const { t } = useI18n();
|
|
453
528
|
const [colsOpen, setColsOpen] = useState(false);
|
|
454
529
|
/** As seções fechadas, por chave. */
|
|
455
|
-
const [collapsedGroups, setCollapsedGroups] = useState<string[]>(
|
|
530
|
+
const [collapsedGroups, setCollapsedGroups] = useState<string[]>(
|
|
531
|
+
() => defaultCollapsedGroups ?? [],
|
|
532
|
+
);
|
|
456
533
|
const [filtersOpen, setFiltersOpen] = useState(false);
|
|
457
534
|
/** A linha na mão e a linha embaixo do dedo, enquanto o arrasto dura. */
|
|
458
535
|
const [draggedRow, setDraggedRow] = useState<string | null>(null);
|
|
@@ -1114,7 +1191,7 @@ export function DataTable<T extends RowData>({
|
|
|
1114
1191
|
{row.getVisibleCells().map((cell) => (
|
|
1115
1192
|
<TableCell
|
|
1116
1193
|
key={cell.id}
|
|
1117
|
-
|
|
1194
|
+
{...cellStyle(cell.column.columnDef)}
|
|
1118
1195
|
>
|
|
1119
1196
|
{flexRender(
|
|
1120
1197
|
cell.column.columnDef.cell,
|
|
@@ -1139,7 +1216,7 @@ export function DataTable<T extends RowData>({
|
|
|
1139
1216
|
{grupo.headers.map((header) => (
|
|
1140
1217
|
<TableCell
|
|
1141
1218
|
key={header.id}
|
|
1142
|
-
|
|
1219
|
+
{...cellStyle(header.column.columnDef)}
|
|
1143
1220
|
>
|
|
1144
1221
|
{header.isPlaceholder
|
|
1145
1222
|
? null
|