@praxisui/core
Version:
Core library for Praxis UI Workspace: types, tokens, services and utilities shared across @praxisui/* packages.
1,626 lines (1,620 loc) • 235 kB
TypeScript
import * as i0 from '@angular/core';
import { InjectionToken, Provider, Type, EnvironmentProviders, OnInit, OnChanges, OnDestroy, EventEmitter, SimpleChanges, ElementRef, Renderer2 } from '@angular/core';
import { HttpHeaders, HttpClient, HttpParams } from '@angular/common/http';
import * as rxjs from 'rxjs';
import { Observable, BehaviorSubject } from 'rxjs';
import { ValidationErrors, ValidatorFn, AsyncValidatorFn, FormControl, FormGroup } from '@angular/forms';
import { ThemePalette } from '@angular/material/core';
import { MatDialogRef } from '@angular/material/dialog';
declare class PraxisCore {
static ɵfac: i0.ɵɵFactoryDeclaration<PraxisCore, never>;
static ɵcmp: i0.ɵɵComponentDeclaration<PraxisCore, "praxis-praxis-core", never, {}, {}, never, never, true, never>;
}
interface ApiUrlEntry {
baseUrl?: string;
path?: string;
fullUrl?: string;
version?: string;
headers?: HttpHeaders | Record<string, string | string[]>;
}
interface ApiUrlConfig {
[key: string]: ApiUrlEntry;
}
declare const API_URL: InjectionToken<ApiUrlConfig>;
declare function buildApiUrl(entry: ApiUrlEntry): string;
declare function buildHeaders(entry: ApiUrlEntry): HttpHeaders | undefined;
/**
* Nova arquitetura modular do TableConfig v2.0
* Preparada para crescimento exponencial e alinhada com as 5 abas do editor
*/
interface ColumnDefinition {
/** Campo da fonte de dados */
field: string;
/** Cabeçalho da coluna */
header: string;
/** Tipo de dados para formatação */
type?: 'string' | 'number' | 'date' | 'boolean' | 'currency' | 'percentage' | 'custom';
/** Largura da coluna */
width?: string;
/** Visibilidade da coluna */
visible?: boolean;
/** Permitir ordenação */
sortable?: boolean;
/** Permitir filtragem */
filterable?: boolean;
/** Permitir redimensionamento */
resizable?: boolean;
/** Coluna fixa (sticky). true/"start" fixa no início; "end" fixa no fim */
sticky?: boolean | 'start' | 'end';
/** Alinhamento do conteúdo */
align?: 'left' | 'center' | 'right';
/** Ordem de exibição */
order?: number;
/** Campo do backend usado para ordenação (quando diferente de field) */
sortField?: string;
/** Estilo CSS personalizado */
style?: string;
/** Estilo CSS do cabeçalho */
headerStyle?: string;
/** Classe CSS personalizada */
cssClass?: string;
/** Classe CSS do cabeçalho */
headerCssClass?: string;
/** Formato de exibição dos dados */
format?: any;
/** Mapeamento de valores para exibição */
valueMapping?: {
[key: string | number]: string;
};
/**
* Renderizador de célula (Fase 1): opções básicas para ícone, imagem ou badge.
* Fase 2: expandido com tipos interativos/ricos (link, button, chip, progress, avatar, toggle, menu, html).
* Mantém compatibilidade com type/format/valueMapping; quando definido, tem precedência na exibição.
*/
renderer?: {
/** Tipo calculado por expressão (tem precedência sobre o tipo estático) */
typeExpr?: string | {
expr: string;
};
/** Tipo do renderizador */
type: 'icon' | 'image' | 'badge' | 'link' | 'button' | 'chip' | 'progress' | 'avatar' | 'toggle' | 'menu' | 'html' | 'compose';
/** Configuração de ícone (Material/SVG por nome) */
icon?: {
/** Nome fixo do ícone (ex.: 'check_circle') */
name?: string;
/** Campo do row que contém o nome do ícone */
nameField?: string;
/** Cor do ícone (primary/accent/warn ou CSS color) */
color?: string;
/** Tamanho em px (opcional) */
size?: number;
/** Label acessível (fixo) */
ariaLabel?: string;
};
/** Configuração de imagem */
image?: {
/** URL fixa da imagem */
src?: string;
/** Campo do row com a URL da imagem */
srcField?: string;
/** Texto alternativo fixo */
alt?: string;
/** Campo do row com ALT */
altField?: string;
/** Dimensões */
width?: number;
height?: number;
/** Forma de recorte */
shape?: 'square' | 'rounded' | 'circle';
/** Ajuste do objeto */
fit?: 'cover' | 'contain';
/** Lazy loading */
lazy?: boolean;
};
/** Configuração de badge */
badge?: {
/** Texto fixo */
text?: string;
/** Campo do row com texto */
textField?: string;
/** Cor do badge (primary/accent/warn ou CSS) */
color?: string;
/** Variante visual */
variant?: 'filled' | 'outlined' | 'soft';
/** Ícone opcional dentro do badge */
icon?: string;
};
/** Link (sanitizado) */
link?: {
text?: string;
textField?: string;
href?: string;
hrefField?: string;
target?: '_blank' | '_self' | '_parent' | '_top';
rel?: string;
};
/** Botão (ação por linha) */
button?: {
label?: string;
labelField?: string;
icon?: string;
color?: 'primary' | 'accent' | 'warn' | string;
variant?: 'filled' | 'outlined' | 'text';
size?: 'sm' | 'md' | 'lg';
ariaLabel?: string;
disabledCondition?: string;
action?: {
id: string;
payloadExpr?: string;
};
};
/** Chip (etiqueta leve) */
chip?: {
text?: string;
textField?: string;
color?: string;
icon?: string;
variant?: 'filled' | 'outlined' | 'soft';
};
/** Barra de progresso leve */
progress?: {
valueExpr: string;
color?: string;
showLabel?: boolean;
};
/** Avatar (imagem ou iniciais) */
avatar?: {
src?: string;
srcField?: string;
alt?: string;
altField?: string;
initialsExpr?: string;
shape?: 'square' | 'rounded' | 'circle';
size?: number;
};
/** Alternância (toggle) com ação */
toggle?: {
stateExpr: string;
disabledCondition?: string;
action?: {
id: string;
payloadExpr?: string;
};
ariaLabel?: string;
};
/** Menu de ações
* itemsExpr → Array<{ label: string; icon?: string; id: string; payloadExpr?: string; visibleCondition?: string }> */
menu?: {
itemsExpr: string;
ariaLabel?: string;
};
/** HTML (sanitizado) com tokens [[field]] */
html?: {
template: string;
sanitize?: 'strict' | 'basic';
emptyFallback?: string;
};
/** Compose (multi-itens) */
compose?: {
items: Array<{
type: 'icon';
icon?: {
name?: string;
nameField?: string;
color?: string;
size?: number;
ariaLabel?: string;
};
} | {
type: 'image';
image?: {
src?: string;
srcField?: string;
alt?: string;
altField?: string;
width?: number;
height?: number;
shape?: 'square' | 'rounded' | 'circle';
fit?: 'cover' | 'contain';
lazy?: boolean;
};
} | {
type: 'badge';
badge?: {
text?: string;
textField?: string;
color?: string;
variant?: 'filled' | 'outlined' | 'soft';
icon?: string;
};
} | {
type: 'link';
link?: {
text?: string;
textField?: string;
href?: string;
hrefField?: string;
target?: '_blank' | '_self' | '_parent' | '_top';
rel?: string;
};
} | {
type: 'button';
button?: {
label?: string;
labelField?: string;
icon?: string;
color?: string;
variant?: 'filled' | 'outlined' | 'text';
size?: 'sm' | 'md' | 'lg';
disabledCondition?: string;
action?: {
id: string;
payloadExpr?: string;
};
};
} | {
type: 'chip';
chip?: {
text?: string;
textField?: string;
color?: string;
icon?: string;
variant?: 'filled' | 'outlined' | 'soft';
};
} | {
type: 'progress';
progress?: {
valueExpr: string;
color?: string;
showLabel?: boolean;
};
} | {
type: 'avatar';
avatar?: {
src?: string;
srcField?: string;
alt?: string;
altField?: string;
initialsExpr?: string;
shape?: 'square' | 'rounded' | 'circle';
size?: number;
};
} | {
type: 'toggle';
toggle?: {
stateExpr: string;
disabledCondition?: string;
action?: {
id: string;
payloadExpr?: string;
};
};
} | {
type: 'menu';
menu?: {
itemsExpr: string;
ariaLabel?: string;
};
} | {
type: 'html';
html?: {
template: string;
sanitize?: 'strict' | 'basic';
emptyFallback?: string;
};
}>;
layout?: {
direction?: 'row' | 'column';
gap?: number;
align?: 'start' | 'center' | 'end';
wrap?: boolean;
ellipsis?: boolean;
};
};
};
/** Overrides condicionais do renderer por linha (first‑match wins) */
conditionalRenderers?: Array<{
condition: string;
renderer: Partial<ColumnDefinition['renderer']>;
description?: string;
enabled?: boolean;
}>;
/**
* Regras de estilo condicionais por coluna (experimental)
* Cada regra contém uma expressão/DSL em `condition` e o efeito visual a aplicar.
*/
conditionalStyles?: Array<{
condition: string;
cssClass?: string;
style?: {
[key: string]: string;
};
description?: string;
}>;
/** Estado serializado do construtor visual de regras (round‑trip) */
_styleRulesState?: any;
/** Getter personalizado para valor calculado */
_generatedValueGetter?: string;
/** Tipo original da API */
_originalApiType?: string;
/** Flag indicando se veio da API */
_isApiField?: boolean;
}
interface ConfigMetadata {
/** Versão da configuração para migração automática */
version?: string;
/** Identificador único da configuração */
id?: string;
/** Nome amigável da configuração */
name?: string;
/** Descrição da configuração */
description?: string;
/** Tags para categorização e busca */
tags?: string[];
/** Data de criação */
createdAt?: string;
/** Data de última modificação */
updatedAt?: string;
/** Autor da configuração */
author?: string;
/** Se é um template ou configuração específica */
isTemplate?: boolean;
/** Configuração derivada de outra (parent ID) */
derivedFrom?: string;
/** Identidade do schema de origem (path|operation|schemaType|internal:<bool>|tenant|locale) */
schemaId?: string;
/** ETag/hash do schema do servidor usado para a última reconciliação */
serverHash?: string;
/** Campo identificador preferido pelo usuário para o recurso (ex.: 'id', 'codigo') */
idField?: string;
/** Contexto de schema associado (útil para auditoria/telemetria) */
schemaContext?: {
path: string;
operation: string;
schemaType: 'response' | 'request';
internal?: boolean;
tenant?: string;
locale?: string;
};
}
interface TableBehaviorConfig {
/** Configurações de paginação */
pagination?: PaginationConfig;
/** Configurações de ordenação */
sorting?: SortingConfig;
/** Configurações de filtragem */
filtering?: FilteringConfig;
/** Configurações de seleção de linhas */
selection?: SelectionConfig;
/** Configurações de interação do usuário */
interaction?: InteractionConfig;
/** Configurações de carregamento e estados */
loading?: LoadingConfig;
/** Configurações para estado vazio */
emptyState?: EmptyStateConfig;
/** Configurações de virtualização para performance */
virtualization?: VirtualizationConfig;
/** Configurações de redimensionamento */
resizing?: ResizingConfig;
/** Configurações de reorganização por drag & drop */
dragging?: DraggingConfig;
}
interface PaginationConfig {
/** Habilitar paginação */
enabled: boolean;
/** Tamanho inicial da página */
pageSize: number;
/** Opções de tamanho de página disponíveis */
pageSizeOptions: number[];
/** Mostrar botões primeira/última página */
showFirstLastButtons: boolean;
/** Mostrar números das páginas */
showPageNumbers: boolean;
/** Mostrar info de página (ex: "1-10 de 100") */
showPageInfo: boolean;
/** Posição da paginação */
position: 'top' | 'bottom' | 'both';
/** Estilo da paginação */
style: 'default' | 'simple' | 'advanced' | 'compact';
/** Total de itens (para paginação server-side) */
totalItems?: number;
/** Estratégia de paginação */
strategy: 'client' | 'server';
/** Configurações avançadas */
advanced?: {
/** Jump to page input */
showJumpToPage?: boolean;
/** Page size customization */
allowCustomPageSize?: boolean;
/** Maximum page size allowed */
maxPageSize?: number;
};
}
interface SortingConfig {
/** Habilitar ordenação */
enabled: boolean;
/** Ordenação padrão inicial (suporta múltiplas entradas) */
defaultSort?: {
column: string;
direction: 'asc' | 'desc';
} | Array<{
column: string;
direction: 'asc' | 'desc';
}>;
/** Permitir ordenação múltipla */
multiSort: boolean;
/** Estratégia de ordenação */
strategy: 'client' | 'server';
/** Mostrar indicadores visuais de ordenação */
showSortIndicators: boolean;
/** Posição dos indicadores */
indicatorPosition: 'start' | 'end';
/** Permitir remover ordenação (terceiro clique) */
allowClearSort: boolean;
/** Configurações avançadas */
advanced?: {
/** Função de comparação customizada para ordenação client-side */
customComparators?: {
[column: string]: (a: any, b: any) => number;
};
/** Preservar ordenação entre atualizações de dados */
preserveSort?: boolean;
};
}
interface FilteringConfig {
/** Habilitar filtragem */
enabled: boolean;
/** Filtros por coluna */
columnFilters?: {
enabled: boolean;
/** Tipo de filtro padrão */
defaultType: 'text' | 'select' | 'date' | 'number' | 'boolean';
/** Posição dos filtros */
position: 'header' | 'subheader' | 'sidebar';
};
/** Filtros avançados */
advancedFilters?: {
enabled: boolean;
/** Interface de query builder */
queryBuilder?: boolean;
/** Salvar filtros como presets */
savePresets?: boolean;
/** Configurações específicas do componente praxis-filter */
settings?: {
/** Campo de busca rápida */
quickField?: string;
/** Campos sempre visíveis */
alwaysVisibleFields?: string[];
/** Placeholder da busca */
placeholder?: string;
/** Exibir opções avançadas por padrão */
showAdvanced?: boolean;
/** Permitir salvar tags/atalhos de filtro */
allowSaveTags?: boolean;
/** Debounce de alterações para auto-aplicar filtros (ms) */
changeDebounceMs?: number;
/** Modo de exibição do componente de filtro */
mode?: 'auto' | 'filter' | 'card';
};
};
/** Estratégia de filtragem */
strategy: 'client' | 'server';
/** Debounce para filtros em tempo real (ms) */
debounceTime: number;
}
interface SelectionConfig {
/** Habilitar seleção de linhas */
enabled: boolean;
/** Tipo de seleção */
type: 'single' | 'multiple';
/** Modo de seleção */
mode: 'checkbox' | 'row' | 'both';
/** Permitir selecionar todas as linhas */
allowSelectAll: boolean;
/** Posição do checkbox de seleção */
checkboxPosition: 'start' | 'end';
/** Manter seleção entre páginas */
persistSelection: boolean;
/** Manter seleção entre atualizações de dados */
persistOnDataUpdate: boolean;
/** Máximo de itens selecionáveis */
maxSelections?: number;
/** Configurações visuais */
visual?: {
/** Highlight da linha selecionada */
highlightSelected: boolean;
/** Cor do highlight */
highlightColor?: string;
/** Mostrar contador de selecionados */
showSelectionCount: boolean;
};
}
interface InteractionConfig {
/** Ação ao clicar na linha */
rowClick?: {
enabled: boolean;
action: 'select' | 'edit' | 'view' | 'custom';
/** Função customizada para row click */
customAction?: string;
};
/** Ação ao dar duplo clique na linha */
rowDoubleClick?: {
enabled: boolean;
action: 'edit' | 'view' | 'custom';
customAction?: string;
};
/** Hover effects */
hover?: {
enabled: boolean;
/** Highlight na linha */
highlightRow: boolean;
/** Mostrar ações no hover */
showActionsOnHover: boolean;
};
/** Configurações de teclado */
keyboard?: {
enabled: boolean;
/** Navegação com setas */
arrowNavigation: boolean;
/** Seleção com espaço */
spaceSelection: boolean;
/** Atalhos personalizados */
customShortcuts?: {
[key: string]: string;
};
};
}
interface LoadingConfig {
/** Tipo de loading indicator */
type: 'spinner' | 'skeleton' | 'progress' | 'custom';
/** Posição do loading */
position: 'overlay' | 'inline' | 'replace';
/** Texto durante carregamento */
text?: string;
/** Mostrar loading para operações rápidas */
showForQuickOperations: boolean;
/** Delay antes de mostrar loading (ms) */
delay: number;
/** Configurações de skeleton loading */
skeleton?: {
rows: number;
/** Animar skeleton */
animated: boolean;
/** Cor base do skeleton */
baseColor?: string;
/** Cor do highlight */
highlightColor?: string;
};
}
interface EmptyStateConfig {
/** Mensagem para estado vazio */
message: string;
/** Ícone para estado vazio */
icon?: string;
/** Imagem para estado vazio */
image?: string;
/** Ações disponíveis no estado vazio */
actions?: Array<{
label: string;
action: string;
icon?: string;
primary?: boolean;
}>;
/** Template customizado */
customTemplate?: string;
/** Configurações específicas por contexto */
contexts?: {
/** Estado inicial (sem dados carregados) */
initial?: Partial<EmptyStateConfig>;
/** Após filtros aplicados */
filtered?: Partial<EmptyStateConfig>;
/** Após busca sem resultados */
searched?: Partial<EmptyStateConfig>;
};
}
interface VirtualizationConfig {
/** Habilitar virtualização */
enabled?: boolean;
/** Altura de cada linha (px) */
itemHeight?: number;
/** Número de itens para buffer */
bufferSize?: number;
/** Altura mínima do container (px ou CSS) */
minContainerHeight?: number | string;
/** Estratégia de virtualização */
strategy?: 'fixed' | 'dynamic';
}
interface ResizingConfig {
/** Habilitar redimensionamento de colunas */
enabled: boolean;
/** Largura mínima das colunas */
minColumnWidth: number;
/** Largura máxima das colunas */
maxColumnWidth?: number;
/** Auto-fit ao conteúdo */
autoFit: boolean;
/** Preservar larguras entre sessões */
persistWidths: boolean;
}
interface DraggingConfig {
/** Habilitar reorganização de colunas */
columns: boolean;
/** Habilitar reorganização de linhas */
rows: boolean;
/** Indicador visual durante drag */
showDragIndicator: boolean;
/** Zona de drop para colunas */
columnDropZones?: string[];
}
interface TableAppearanceConfig {
/** Densidade da tabela */
density: 'compact' | 'comfortable' | 'spacious';
/** Configurações de bordas */
borders?: BorderConfig;
/** Configurações de cores */
colors?: ColorConfig;
/** Configurações de fonte */
typography?: TypographyConfig;
/** Configurações de espaçamento */
spacing?: SpacingConfig;
/** Configurações de animações */
animations?: AnimationConfig;
/** Configurações de responsividade */
responsive?: ResponsiveConfig;
/** Configurações de elevação/sombra */
elevation?: ElevationConfig;
}
interface BorderConfig {
/** Mostrar bordas entre linhas */
showRowBorders: boolean;
/** Mostrar bordas entre colunas */
showColumnBorders: boolean;
/** Mostrar borda externa */
showOuterBorder: boolean;
/** Estilo da borda */
style: 'solid' | 'dashed' | 'dotted';
/** Largura da borda */
width: number;
/** Cor da borda */
color?: string;
/** Bordas específicas */
specific?: {
header?: Partial<BorderConfig>;
footer?: Partial<BorderConfig>;
sticky?: Partial<BorderConfig>;
};
}
interface ColorConfig {
/** Cor de fundo da tabela */
background?: string;
/** Cor de fundo do cabeçalho */
headerBackground?: string;
/** Cor de fundo de linhas alternadas */
alternateRowBackground?: string;
/** Cor de fundo no hover */
hoverBackground?: string;
/** Cor de fundo para linhas selecionadas */
selectedBackground?: string;
/** Cor do texto */
textColor?: string;
/** Cor do texto do cabeçalho */
headerTextColor?: string;
/** Paleta de cores para estados */
states?: {
error?: string;
warning?: string;
success?: string;
info?: string;
};
}
interface TypographyConfig {
/** Família da fonte */
fontFamily?: string;
/** Tamanho da fonte do conteúdo */
fontSize?: string;
/** Tamanho da fonte do cabeçalho */
headerFontSize?: string;
/** Peso da fonte */
fontWeight?: number | string;
/** Peso da fonte do cabeçalho */
headerFontWeight?: number | string;
/** Altura da linha */
lineHeight?: string;
/** Espaçamento entre letras */
letterSpacing?: string;
/** Transformação do texto do cabeçalho */
headerCase?: 'none' | 'uppercase' | 'lowercase' | 'capitalize';
}
interface SpacingConfig {
/** Padding das células */
cellPadding?: string;
/** Padding do cabeçalho */
headerPadding?: string;
/** Altura das linhas */
rowHeight?: number;
/** Altura do cabeçalho */
headerHeight?: number;
/** Espaçamento entre tabela e container */
containerSpacing?: string;
}
interface AnimationConfig {
/** Habilitar animações */
enabled: boolean;
/** Duração das animações (ms) */
duration: number;
/** Função de easing */
easing: string;
/** Animações específicas */
specific?: {
/** Animação ao carregar */
loading?: boolean;
/** Animação de hover */
hover?: boolean;
/** Animação de seleção */
selection?: boolean;
/** Animação de ordenação */
sorting?: boolean;
};
}
interface ResponsiveConfig {
/** Pontos de quebra */
breakpoints?: {
mobile?: number;
tablet?: number;
desktop?: number;
};
/** Comportamento em dispositivos móveis */
mobile?: {
/** Scroll horizontal */
horizontalScroll?: boolean;
/** Colapsar colunas */
collapseColumns?: boolean;
/** Colunas prioritárias */
priorityColumns?: string[];
/** Modo de cards em mobile */
cardMode?: boolean;
};
/** Ajustes automáticos */
autoAdjust?: {
/** Ocultar colunas automaticamente */
hideColumns?: boolean;
/** Reduzir font size */
scaleFontSize?: boolean;
/** Ajustar padding */
adjustPadding?: boolean;
};
}
interface ElevationConfig {
/** Nível de elevação */
level: number;
/** Cor da sombra */
shadowColor?: string;
/** Elevação no hover */
hoverElevation?: number;
}
interface ToolbarConfig {
/** Visibilidade da toolbar */
visible: boolean;
/** Posição da toolbar */
position: 'top' | 'bottom' | 'both';
/** Configurações de layout */
layout?: ToolbarLayoutConfig;
/** Título da tabela */
title?: string;
/** Subtítulo da tabela */
subtitle?: string;
/** Ações da toolbar */
actions?: ToolbarAction[];
/** Configurações de filtros na toolbar */
filters?: ToolbarFilterConfig;
/** Menu de configurações */
settingsMenu?: ToolbarSettingsConfig;
}
interface ToolbarLayoutConfig {
/** Alinhamento do conteúdo */
alignment: 'start' | 'center' | 'end' | 'space-between';
/** Altura da toolbar */
height?: number;
/** Padding da toolbar */
padding?: string;
/** Cor de fundo */
backgroundColor?: string;
/** Mostrar separador */
showSeparator: boolean;
}
interface ToolbarAction {
/** ID único da ação */
id: string;
/** Label da ação */
label: string;
/** Ícone da ação */
icon?: string;
/** Tipo do botão */
type: 'button' | 'icon' | 'fab' | 'menu';
/** Cor do Material */
color?: 'primary' | 'accent' | 'warn';
/** Aparência do botão Material: filled (flat), outlined (stroked), elevated (raised), text, tonal (custom) */
appearance?: 'filled' | 'outlined' | 'elevated' | 'text' | 'tonal';
/** Ação desabilitada */
disabled?: boolean;
/** Função a executar */
action: string;
/** Tooltip */
tooltip?: string;
/** Tecla de atalho */
shortcut?: string;
/** Posição na toolbar */
position: 'start' | 'end';
/** Ordem de exibição */
order?: number;
/** Visibilidade condicional */
visibleWhen?: string;
/** Sub-ações (para menus) */
children?: ToolbarAction[];
}
interface ToolbarFilterConfig {
/** Habilitar filtros rápidos na toolbar */
enabled: boolean;
/** Filtros rápidos disponíveis */
quickFilters?: Array<{
id: string;
label: string;
filter: any;
icon?: string;
}>;
/** Mostrar botão de filtros avançados */
showAdvancedButton: boolean;
}
interface ToolbarSettingsConfig {
/** Habilitar menu de configurações */
enabled: boolean;
/** Configurações disponíveis */
options?: Array<{
id: string;
label: string;
type: 'toggle' | 'select' | 'action';
value?: any;
options?: any[];
}>;
}
interface TableActionsConfig {
/** Ações por linha */
row?: RowActionsConfig;
/** Ações em lote */
bulk?: BulkActionsConfig;
/** Ações de contexto (menu com botão direito) */
context?: ContextActionsConfig;
/** Configurações de confirmação */
confirmations?: ConfirmationConfig;
}
interface RowActionsConfig {
/** Habilitar ações por linha */
enabled: boolean;
/** Posição das ações */
position: 'start' | 'end';
/** Largura da coluna de ações */
width?: string;
/** Fixar a coluna de ações */
sticky?: boolean | 'start' | 'end';
/** Ações disponíveis */
actions: RowAction[];
/** Formato de exibição */
display: 'menu' | 'buttons' | 'icons';
/** Trigger para mostrar ações */
trigger: 'hover' | 'always' | 'click';
/** Ícone do menu de ações */
menuIcon?: string;
/** Cor do botão do menu de ações (overflow) */
menuButtonColor?: 'basic' | 'primary' | 'accent' | 'warn';
/** Configurações do cabeçalho da coluna de ações */
header?: {
/** Texto exibido no cabeçalho (ex.: "Ações") */
label?: string;
/** Ícone exibido ao lado do texto */
icon?: string;
/** Tooltip do cabeçalho */
tooltip?: string;
/** Alinhamento do conteúdo no cabeçalho */
align?: 'start' | 'center' | 'end';
};
/** Número máximo de ações visíveis */
maxVisibleActions?: number;
/** Comportamento de overflow de ações */
behavior?: {
/** Habilitar comportamento de overflow */
enabled?: boolean;
/** Número máximo de ações inline */
maxInline?: number | 'auto' | {
xs?: number;
sm?: number;
md?: number;
lg?: number;
};
/** Estratégia para auto determinar número de ações inline */
autoStrategy?: 'measure' | 'breakpoints';
};
}
interface RowAction {
/** ID único da ação */
id: string;
/** Label da ação */
label: string;
/** Ícone da ação */
icon?: string;
/** Cor da ação */
color?: string;
/** Ação desabilitada */
disabled?: boolean;
/** Função a executar */
action: string;
/** Tooltip */
tooltip?: string;
/** Requer confirmação */
requiresConfirmation?: boolean;
/** Visibilidade condicional */
visibleWhen?: string;
/** Separador após esta ação */
separator?: boolean;
/** Habilita exclusão automática ao acionar */
autoDelete?: boolean;
/** Endpoint personalizado para exclusão */
deleteEndpoint?: string;
}
interface BulkActionsConfig {
/** Habilitar ações em lote */
enabled: boolean;
/** Posição das ações em lote */
position: 'toolbar' | 'floating' | 'both';
/** Ações disponíveis */
actions: BulkAction[];
/** Configurações do floating action button */
floating?: {
position: 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left';
/** Ocultar quando nada selecionado */
hideWhenEmpty: boolean;
};
}
interface BulkAction {
/** ID único da ação */
id: string;
/** Label da ação */
label: string;
/** Ícone da ação */
icon?: string;
/** Cor da ação */
color?: string;
/** Função a executar */
action: string;
/** Requer confirmação */
requiresConfirmation?: boolean;
/** Mínimo de itens selecionados */
minSelections?: number;
/** Máximo de itens selecionados */
maxSelections?: number;
/** Habilita exclusão automática ao acionar */
autoDelete?: boolean;
/** Endpoint personalizado para exclusão */
deleteEndpoint?: string;
}
interface ContextActionsConfig {
/** Habilitar menu de contexto */
enabled: boolean;
/** Ações do menu de contexto */
actions: ContextAction[];
/** Trigger para menu de contexto */
trigger: 'right-click' | 'long-press' | 'both';
}
interface ContextAction {
/** ID único da ação */
id: string;
/** Label da ação */
label: string;
/** Ícone da ação */
icon?: string;
/** Função a executar */
action: string;
/** Separador após esta ação */
separator?: boolean;
/** Visibilidade condicional */
visibleWhen?: string;
}
interface ConfirmationConfig {
/** Configurações padrão de confirmação */
default?: {
title: string;
message: string;
confirmText: string;
cancelText: string;
};
/** Configurações específicas por ação */
specific?: {
[actionId: string]: Partial<ConfirmationConfig['default']>;
};
}
interface ExportConfig {
/** Habilitar exportação */
enabled: boolean;
/** Formatos disponíveis */
formats: ExportFormat[];
/** Configurações por formato */
excel?: ExcelExportConfig;
pdf?: PdfExportConfig;
csv?: CsvExportConfig;
json?: JsonExportConfig;
/** Configurações gerais */
general?: GeneralExportConfig;
/** Templates personalizados */
templates?: ExportTemplate[];
}
type ExportFormat = 'excel' | 'pdf' | 'csv' | 'json' | 'print';
interface GeneralExportConfig {
/** Incluir cabeçalhos */
includeHeaders: boolean;
/** Incluir filtros aplicados na exportação */
respectFilters: boolean;
/** Incluir apenas linhas selecionadas */
selectedRowsOnly?: boolean;
/** Máximo de linhas para exportar */
maxRows?: number;
/** Nome do arquivo padrão */
defaultFileName?: string;
/** Colunas a incluir na exportação */
includeColumns?: string[] | 'all' | 'visible';
/** Aplicar formatações das colunas */
applyFormatting: boolean;
}
interface ExcelExportConfig {
/** Nome da planilha */
sheetName: string;
/** Incluir fórmulas nas células */
includeFormulas: boolean;
/** Congelar linha de cabeçalho */
freezeHeaders: boolean;
/** Auto-ajustar largura das colunas */
autoFitColumns: boolean;
/** Configurações de estilo */
styling?: ExcelStylingConfig;
/** Múltiplas planilhas */
multipleSheets?: boolean;
}
interface ExcelStylingConfig {
/** Estilo do cabeçalho */
headerStyle?: {
backgroundColor?: string;
fontColor?: string;
fontWeight?: 'bold' | 'normal';
fontSize?: number;
};
/** Estilo das células */
cellStyle?: {
fontSize?: number;
borderStyle?: 'thin' | 'medium' | 'thick';
};
/** Linhas alternadas */
alternateRows?: {
enabled: boolean;
color?: string;
};
}
interface PdfExportConfig {
/** Orientação da página */
orientation: 'portrait' | 'landscape';
/** Tamanho da página */
pageSize: 'A4' | 'A3' | 'Letter' | 'Legal';
/** Margens da página */
margins: MarginConfig;
/** Cabeçalho do documento */
header?: string;
/** Rodapé do documento */
footer?: string;
/** Marca d'água */
watermark?: string;
/** Configurações de fonte */
font?: {
family?: string;
size?: number;
};
/** Quebra de página automática */
autoPageBreak: boolean;
}
interface MarginConfig {
top: number;
right: number;
bottom: number;
left: number;
}
interface CsvExportConfig {
/** Separador de campos */
delimiter: ',' | ';' | '|' | '\t';
/** Caractere de escape */
escapeChar: string;
/** Encoding do arquivo */
encoding: 'utf-8' | 'utf-16' | 'iso-8859-1';
/** Incluir BOM */
includeBOM: boolean;
}
interface JsonExportConfig {
/** Formato do JSON */
format: 'pretty' | 'compact';
/** Incluir metadados */
includeMetadata: boolean;
/** Estrutura dos dados */
structure: 'array' | 'object';
}
interface ExportTemplate {
/** ID único do template */
id: string;
/** Nome do template */
name: string;
/** Descrição */
description?: string;
/** Formato do template */
format: ExportFormat;
/** Configurações específicas */
config: any;
/** Template padrão do sistema */
isDefault?: boolean;
}
interface MessagesConfig {
/** Mensagens de estado */
states?: StateMessagesConfig;
/** Mensagens de ações */
actions?: ActionMessagesConfig;
/** Mensagens de validação */
validation?: ValidationMessagesConfig;
/** Mensagens de exportação */
export?: ExportMessagesConfig;
/** Mensagens customizadas */
custom?: {
[key: string]: string;
};
/** Templates de mensagem com interpolação */
templates?: MessageTemplate[];
}
interface StateMessagesConfig {
/** Carregando dados */
loading: string;
/** Nenhum dado disponível */
empty: string;
/** Erro ao carregar */
error: string;
/** Nenhum resultado encontrado */
noResults: string;
/** Carregando mais dados */
loadingMore: string;
/** Mensagens dinâmicas com contador */
dynamic?: {
/** Função para mensagem de loading com contagem */
loadingWithCount?: (count: number) => string;
/** Função para estado vazio com filtros */
emptyWithFilter?: (filterCount: number) => string;
/** Função para resultado de busca */
searchResults?: (resultCount: number, searchTerm: string) => string;
};
}
interface ActionMessagesConfig {
/** Mensagens de confirmação */
confirmations?: {
delete: string;
deleteMultiple: string;
save: string;
cancel: string;
export: string;
};
/** Mensagens de sucesso */
success?: {
save: string;
delete: string;
export: string;
import: string;
};
/** Mensagens de progresso */
progress?: {
delete: string;
deleteMultiple: string;
};
/** Mensagens de cancelamento */
canceled?: {
delete: string;
deleteMultiple: string;
};
/** Mensagens de erro */
errors?: {
save: string;
delete: string;
export: string;
network: string;
permission: string;
};
}
interface ValidationMessagesConfig {
/** Mensagens de validação de dados */
required: string;
invalid: string;
tooLong: string;
tooShort: string;
/** Mensagens específicas por tipo */
types?: {
email: string;
url: string;
number: string;
date: string;
};
}
interface ExportMessagesConfig {
/** Iniciando exportação */
starting: string;
/** Processando dados */
processing: string;
/** Download pronto */
ready: string;
/** Erro na exportação */
error: string;
/** Mensagens por formato */
formats?: {
excel: string;
pdf: string;
csv: string;
json: string;
};
}
interface MessageTemplate {
/** ID único do template */
id: string;
/** Template da mensagem com placeholders */
template: string;
/** Variáveis disponíveis */
variables?: string[];
/** Função de interpolação customizada */
interpolate?: (template: string, data: any) => string;
}
interface LocalizationConfig {
/** Idioma principal */
locale: string;
/** Idiomas disponíveis */
availableLocales?: string[];
/** Direção do texto */
direction: 'ltr' | 'rtl';
/** Configurações de data/hora */
dateTime?: DateTimeLocaleConfig;
/** Configurações de números */
number?: NumberLocaleConfig;
/** Configurações de moeda */
currency?: CurrencyLocaleConfig;
/** Dicionário de traduções */
translations?: {
[locale: string]: {
[key: string]: string;
};
};
/** Configurações de formatação */
formatting?: FormattingLocaleConfig;
}
interface DateTimeLocaleConfig {
/** Formato de data padrão */
dateFormat: string;
/** Formato de hora padrão */
timeFormat: string;
/** Formato de data e hora */
dateTimeFormat: string;
/** Primeiro dia da semana (0 = domingo) */
firstDayOfWeek: number;
/** Nomes dos meses */
monthNames?: string[];
/** Nomes dos dias da semana */
dayNames?: string[];
/** Formato relativo (há 2 dias) */
relativeTime?: boolean;
}
interface NumberLocaleConfig {
/** Separador decimal */
decimalSeparator: string;
/** Separador de milhares */
thousandsSeparator: string;
/** Número de casas decimais padrão */
defaultPrecision: number;
/** Símbolo de negativo */
negativeSign: string;
/** Posição do símbolo de negativo */
negativeSignPosition: 'before' | 'after';
}
interface CurrencyLocaleConfig {
/** Código da moeda (ISO 4217) */
code: string;
/** Símbolo da moeda */
symbol: string;
/** Posição do símbolo */
position: 'before' | 'after';
/** Espaço entre símbolo e valor */
spacing: boolean;
/** Precisão padrão */
precision: number;
}
interface FormattingLocaleConfig {
/** Formato de porcentagem */
percentageFormat: string;
/** Formato de arquivos/tamanhos */
fileSizeFormat: 'binary' | 'decimal';
/** Unidades de medida */
units?: {
[type: string]: {
[unit: string]: string;
};
};
}
interface DataConfig {
/** Estratégia de carregamento */
loadingStrategy: 'eager' | 'lazy' | 'on-demand';
/** Configurações de cache */
cache?: CacheConfig;
/** Configurações de sincronização */
sync?: SyncConfig;
/** Configurações de validação */
validation?: DataValidationConfig;
/** Transformações de dados */
transformations?: DataTransformation[];
/** Configurações de polling */
polling?: PollingConfig;
}
interface CacheConfig {
/** Habilitar cache */
enabled: boolean;
/** Tempo de vida do cache (ms) */
ttl: number;
/** Tamanho máximo do cache */
maxSize: number;
/** Estratégia de invalidação */
invalidationStrategy: 'ttl' | 'manual' | 'on-update';
}
interface SyncConfig {
/** Sincronização automática */
autoSync: boolean;
/** Intervalo de sincronização (ms) */
interval: number;
/** Sincronizar apenas mudanças */
deltaSync: boolean;
/** Resolver conflitos */
conflictResolution: 'client' | 'server' | 'manual';
}
interface DataValidationConfig {
/** Validação no cliente */
clientSide: boolean;
/** Validação no servidor */
serverSide: boolean;
/** Regras de validação */
rules?: ValidationRule[];
/** Mostrar erros inline */
showInlineErrors: boolean;
}
interface ValidationRule {
/** Campo a validar */
field: string;
/** Tipo de validação */
type: 'required' | 'format' | 'range' | 'custom';
/** Parâmetros da validação */
params?: any;
/** Mensagem de erro */
message: string;
}
interface DataTransformation {
/** ID da transformação */
id: string;
/** Campo a transformar */
field: string;
/** Tipo de transformação */
type: 'format' | 'calculate' | 'aggregate' | 'custom';
/** Função de transformação */
transform: string;
/** Aplicar na exibição ou nos dados */
applyTo: 'display' | 'data' | 'both';
}
interface PollingConfig {
/** Habilitar polling */
enabled: boolean;
/** Intervalo de polling (ms) */
interval: number;
/** Polling apenas quando ativo */
onlyWhenActive: boolean;
/** Backoff exponencial em caso de erro */
exponentialBackoff: boolean;
}
interface ThemeConfig {
/** Tema principal */
primary?: string;
/** Tema secundário */
secondary?: string;
/** Modo escuro */
darkMode?: boolean;
/** Tema customizado */
custom?: {
[property: string]: string;
};
/** Variáveis CSS personalizadas */
cssVariables?: {
[variable: string]: string;
};
}
interface PerformanceConfig {
/** Configurações de virtualização */
virtualization?: VirtualizationConfig;
/** Configurações de debounce */
debounce?: DebounceConfig;
/** Configurações de memória */
memory?: MemoryConfig;
/** Otimizações de renderização */
rendering?: RenderingConfig;
/** Lazy loading de recursos */
lazyLoading?: LazyLoadingConfig;
}
interface DebounceConfig {
/** Debounce para busca (ms) */
search: number;
/** Debounce para filtros (ms) */
filter: number;
/** Debounce para redimensionamento (ms) */
resize: number;
/** Debounce para scroll (ms) */
scroll: number;
}
interface MemoryConfig {
/** Máximo de linhas em memória */
maxRows: number;
/** Limpeza automática */
autoCleanup: boolean;
/** Intervalo de limpeza (ms) */
cleanupInterval: number;
}
interface RenderingConfig {
/** Usar requestAnimationFrame */
useRAF: boolean;
/** Batch de updates */
batchUpdates: boolean;
/** Tamanho do batch */
batchSize: number;
/** Otimizar re-renders */
optimizeReRenders: boolean;
}
interface LazyLoadingConfig {
/** Lazy loading de imagens */
images: boolean;
/** Lazy loading de componentes */
components: boolean;
/** Distância para carregar (px) */
threshold: number;
}
interface PluginConfig {
/** ID único do plugin */
id: string;
/** Nome do plugin */
name: string;
/** Versão do plugin */
version: string;
/** Plugin habilitado */
enabled: boolean;
/** Configurações específicas do plugin */
settings?: any;
/** Hooks do plugin */
hooks?: {
[eventName: string]: string;
};
}
interface AccessibilityConfig {
/** Habilitar recursos de acessibilidade */
enabled: boolean;
/** Anúncios para screen readers */
announcements?: AnnouncementConfig;
/** Navegação por teclado */
keyboard?: KeyboardAccessibilityConfig;
/** Contraste alto */
highContrast?: boolean;
/** Reduzir movimento */
reduceMotion?: boolean;
/** Labels ARIA personalizados */
ariaLabels?: {
[key: string]: string;
};
}
interface AnnouncementConfig {
/** Anunciar mudanças de dados */
dataChanges: boolean;
/** Anunciar ações do usuário */
userActions: boolean;
/** Anunciar estados de carregamento */
loadingStates: boolean;
/** Região live para anúncios */
liveRegion: 'polite' | 'assertive';
}
interface KeyboardAccessibilityConfig {
/** Navegação com Tab */
tabNavigation: boolean;
/** Navegação com setas */
arrowNavigation: boolean;
/** Atalhos de teclado */
shortcuts: boolean;
/** Skip links */
skipLinks: boolean;
/** Focus trap em modais */
focusTrap: boolean;
}
/**
* Configuração principal da tabela - Nova arquitetura v2.0
* Estrutura modular alinhada com as 5 abas do editor
* Preparada para crescimento exponencial
*/
interface TableConfigV2 {
/** Metadados da configuração */
meta?: ConfigMetadata;
/** Definições de colunas */
columns: ColumnDefinition[];
/** Comportamento geral da tabela (Aba: Visão Geral & Comportamento) */
behavior?: TableBehaviorConfig;
/** Configurações de aparência e layout (Aba: Visão Geral & Comportamento) */
appearance?: TableAppearanceConfig;
/** Barra de ferramentas (Aba: Barra de Ferramentas & Ações) */
toolbar?: ToolbarConfig;
/** Ações por linha e em lote (Aba: Barra de Ferramentas & Ações) */
actions?: TableActionsConfig;
/** Configurações de exportação (Aba: Barra de Ferramentas & Ações) */
export?: ExportConfig;
/** Mensagens personalizadas (Aba: Mensagens & Localização) */
messages?: MessagesConfig;
/** Localização e i18n (Aba: Mensagens & Localização) */
localization?: LocalizationConfig;
/** Configurações avançadas de dados */
data?: DataConfig;
/** Temas e customização visual */
theme?: ThemeConfig;
/** Configurações de performance */
performance?: PerformanceConfig;
/** Plugins e extensões */
plugins?: PluginConfig[];
/** Configurações de acessibilidade */
accessibility?: AccessibilityConfig;
/**
* Regras de estilo condicionais aplicadas à linha inteira (escopo global)
*/
rowConditionalStyles?: Array<{
condition: string;
cssClass?: string;
style?: {
[key: string]: string;
};
description?: string;
}>;
/** Estado serializado do construtor para regras de linha (round‑trip) */
_rowStyleRulesState?: any;
}
/**
* Type guard to check if config is V2
*/
declare function isTableConfigV2(config: any): config is TableConfigV2;
type TableConfig = TableConfigV2;
/**
* Cria uma configuração padrão para TableConfig
*/
declare function createDefaultTableConfig(): TableConfig;
/**
* Valida se uma configuração TableConfig é válida
*/
declare function isValidTableConfig(config: any): config is TableConfig;
/**
* Clona profundamente uma configuração TableConfig
*/
declare function cloneTableConfig(config: TableConfig): TableConfig;
/**
* Merge duas configurações TableConfig, priorizando a segunda
*/
declare function mergeTableConfigs(base: TableConfig, override: Partial<TableConfig>): TableConfig;
/**
* Extrai apenas as configurações essenciais para compatibilidade
*/
declare function getEssentialConfig(config: TableConfig): Partial<TableConfig>;
/**
* @deprecated Use TableConfig instead
*/
type LegacyTableConfig = TableConfig;
/**
* @deprecated Use createDefaultTableConfig instead
*/
declare const DEFAULT_TABLE_CONFIG: TableConfigV2;
type GlobalDi