@bluemarble/bi 0.6.5 → 0.7.0

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.
@@ -121,209 +121,6 @@ declare function modelMeta(model: ModelDef): ModelMeta;
121
121
  */
122
122
  declare function validateModel(model: ModelDef): string[];
123
123
  //#endregion
124
- //#region src/types.d.ts
125
- type FilterValue = string | number;
126
- /** Filtros por dimensão; lista vazia (ou ausente) = sem filtro ("Todos"). */
127
- type DashboardFilters = Record<string, FilterValue[]>;
128
- /**
129
- * Pedidos do devtools. O servidor só aceita quando o `runQuery` recebe `devtools` (em dev); fora
130
- * disso `debug` é ignorado e o resto é recusado com 400.
131
- */
132
- type DashboardDevtoolsRequest = {
133
- /** Devolve SQL compilado, parâmetros e tempos em `result.devtools.debug`. */
134
- debug?: boolean;
135
- /** Rascunho do modelo editado no devtools: substitui o modelo registrado só nesta consulta. */
136
- model?: ModelDef;
137
- /** Devolve a definição do modelo registrado e o que o servidor permite (`capabilities`). */
138
- describe?: boolean;
139
- /** Esvazia o cache de resultados do processo antes de executar. */
140
- clearCache?: boolean;
141
- /**
142
- * Só compila: devolve o SQL e os parâmetros em `result.devtools.debug`, sem executar (o devtools
143
- * usa para mostrar o SQL de uma consulta que deu erro).
144
- */
145
- compile?: boolean;
146
- /** Devolve o `EXPLAIN` da consulta em vez das linhas. */
147
- explain?: boolean;
148
- /** Mede a agregação de cada fato usada pela consulta, isoladamente. */
149
- profile?: boolean;
150
- /** Tabelas e colunas do banco (`information_schema`), para o autocomplete do editor. */
151
- schema?: boolean;
152
- /** Colunas de cada tabela (uma linha de cada), para o diagrama do modelo. */
153
- columns?: boolean;
154
- /** Executa cada pedaço do modelo (`devtools.model` ou o registrado) contra o banco. */
155
- validate?: boolean;
156
- /** Grava o rascunho no arquivo do modelo (`preview` só devolve o conteúdo novo). */
157
- save?: 'preview' | 'write';
158
- /** Grava o layout de gráficos em `<layoutsDir>/<id>.json` (`preview` só devolve o conteúdo novo). */
159
- saveLayout?: {
160
- layout: ChartsLayout;
161
- mode: 'preview' | 'write';
162
- };
163
- /** Grava o resultado da consulta (modelo registrado) como snapshot de regressão. */
164
- snapshot?: {
165
- name: string;
166
- overwrite?: boolean;
167
- };
168
- /** Lista os snapshots salvos deste modelo. */
169
- snapshots?: boolean;
170
- };
171
- type DashboardQuery = {
172
- model: string;
173
- /** Dimensões agrupadas (viram GROUP BY). */
174
- dimensions?: string[];
175
- /** Medidas calculadas para cada grupo. */
176
- measures?: string[];
177
- filters?: DashboardFilters;
178
- /** Devolve só os metadados do modelo (rótulos, descrições, formatos; sem SQL) em `result.meta`. */
179
- meta?: boolean;
180
- /**
181
- * Várias consultas do mesmo modelo num request (o client manda assim as consultas de um render).
182
- * O servidor junta numa SQL só as que têm as mesmas dimensões e filtros e vêm das mesmas fatos, e
183
- * devolve uma resposta por consulta em `result.results`, na mesma ordem. Do `devtools`, só
184
- * `debug` e `model` (rascunho) valem aqui.
185
- */
186
- queries?: DashboardBatchQuery[];
187
- devtools?: DashboardDevtoolsRequest;
188
- };
189
- /** Uma consulta de um lote (`DashboardQuery.queries`): o modelo e o devtools são os do lote. */
190
- type DashboardBatchQuery = Pick<DashboardQuery, 'dimensions' | 'measures' | 'filters'>;
191
- /** Resposta de uma consulta do lote: as linhas ou o erro (de consulta) dela. */
192
- type DashboardBatchResult = {
193
- rows: DashboardRow[];
194
- error?: string;
195
- /** Quantas consultas do lote saíram da mesma SQL (contando esta); o `debug` é o dessa SQL. */
196
- batched?: number;
197
- devtools?: {
198
- debug?: DashboardQueryDebug;
199
- };
200
- };
201
- type DashboardRow = Record<string, string | number | null>;
202
- type DashboardQueryDebug = {
203
- sql: string;
204
- params: (string | number)[];
205
- /** Tempo da execução no banco (num cache hit, o da execução original). */
206
- durationMs: number;
207
- cached: boolean;
208
- /** A consulta rodou contra o rascunho do devtools, não contra o modelo registrado. */
209
- draft: boolean;
210
- };
211
- type ProfileStep = {
212
- /** `fato:<tabela>` ou `consulta` (a consulta inteira). */
213
- name: string;
214
- durationMs: number;
215
- /** Linhas da agregação da fato (grupos) com os filtros aplicados. */
216
- rows: number | null;
217
- };
218
- type SchemaTable = {
219
- name: string;
220
- type: 'table' | 'view';
221
- columns: {
222
- name: string;
223
- type: string;
224
- }[];
225
- };
226
- /** Colunas devolvidas por cada pedaço do modelo (vazio quando não veio nenhuma linha). */
227
- type ModelColumns = {
228
- /** Colunas de cada tabela. */
229
- tables: Record<string, string[]>;
230
- /** `tabela.coluna` com valor numérico na linha lida. */
231
- numeric: string[];
232
- };
233
- type ModelValidation = {
234
- /**
235
- * Erro do banco por pedaço: `table:<nome>`, `relationship:<índice>`, `dimension:<nome>`,
236
- * `measure:<nome>`.
237
- */
238
- errors: Record<string, string>;
239
- warnings: Record<string, string>;
240
- columns: ModelColumns;
241
- };
242
- type SaveModelResult = {
243
- path: string;
244
- previous: string;
245
- content: string;
246
- written: boolean;
247
- warnings: string[];
248
- };
249
- type DashboardSnapshot = {
250
- name: string;
251
- createdAt: string;
252
- query: Omit<DashboardQuery, 'devtools' | 'meta'>;
253
- rows: DashboardRow[];
254
- };
255
- type DevtoolsCapabilities = {
256
- /** O endpoint sabe onde ficam os arquivos dos modelos (`modelsDir`). */
257
- saveModel: boolean;
258
- /** O endpoint sabe onde gravar snapshots (`snapshotsDir`). */
259
- snapshots: boolean;
260
- /** O endpoint sabe onde ficam os arquivos de layout de gráficos (`layoutsDir`). */
261
- saveLayout: boolean;
262
- /** Tipos de gráfico do app que o endpoint conhece (`chartTypes`): só esses ele aceita salvar. */
263
- chartTypes: string[];
264
- };
265
- type DashboardResult = {
266
- rows: DashboardRow[];
267
- /** Respostas de um lote (`query.queries`), na ordem das consultas. */
268
- results?: DashboardBatchResult[];
269
- /**
270
- * Quantas consultas saíram da mesma SQL que esta (contando ela), quando foi num lote. O
271
- * `devtools.debug` é o dessa SQL.
272
- */
273
- batched?: number;
274
- meta?: ModelMeta;
275
- devtools?: {
276
- model?: ModelDef;
277
- capabilities?: DevtoolsCapabilities;
278
- debug?: DashboardQueryDebug;
279
- explain?: DashboardRow[];
280
- profile?: ProfileStep[];
281
- schema?: SchemaTable[];
282
- validation?: ModelValidation;
283
- columns?: ModelColumns;
284
- /** Pedaços que o banco recusou ao ler as colunas (mesmas chaves da validação). */
285
- columnErrors?: Record<string, string>;
286
- save?: SaveModelResult;
287
- snapshot?: {
288
- path: string;
289
- };
290
- snapshots?: DashboardSnapshot[];
291
- };
292
- };
293
- //#endregion
294
- //#region src/formatRules.d.ts
295
- declare const COLUMN_ALIGNS: readonly ['left', 'center', 'right'];
296
- type ColumnAlign = (typeof COLUMN_ALIGNS)[number];
297
- declare const COLUMN_VERTICAL_ALIGNS: readonly ['top', 'middle', 'bottom'];
298
- type ColumnVerticalAlign = (typeof COLUMN_VERTICAL_ALIGNS)[number];
299
- declare const RULE_OPERATORS: readonly ['>', '>=', '<', '<=', '=', '!=', 'between', 'contains', 'empty', 'notEmpty'];
300
- type RuleOperator = (typeof RULE_OPERATORS)[number];
301
- type FormatRule = {
302
- /**
303
- * Dimensão ou medida avaliada. Pode estar fora da tabela: entra na consulta sem coluna (uma
304
- * dimensão de fora divide as linhas se tiver mais de um valor por linha).
305
- */
306
- field: string;
307
- operator: RuleOperator;
308
- /** Valor comparado com o valor bruto (percentual como fração: 10% = 0.1). */
309
- value?: number | string;
310
- /** Fim do intervalo do `between` (inclusivo, como o `value`). */
311
- to?: number;
312
- /** `cell` (padrão) pinta uma célula; `row`, a linha inteira. */
313
- target?: 'cell' | 'row';
314
- /** Coluna pintada quando `target` é `cell`. Padrão: o próprio `field`. */
315
- column?: string;
316
- /** Cor do texto. */
317
- color?: string;
318
- /** Cor de fundo. */
319
- background?: string;
320
- bold?: boolean;
321
- /** Alinhamento horizontal da célula (ou das células da linha). */
322
- align?: ColumnAlign;
323
- /** Alinhamento vertical da célula (ou das células da linha). */
324
- verticalAlign?: ColumnVerticalAlign;
325
- };
326
- //#endregion
327
124
  //#region src/layout.d.ts
328
125
  declare const CHART_TYPES: readonly ['kpi', 'combo', 'bar', 'donut', 'table'];
329
126
  type ChartType = (typeof CHART_TYPES)[number];
@@ -409,6 +206,13 @@ type BarChartDef = BaseChartDef & ColumnsDisplay & {
409
206
  valueSize?: number;
410
207
  /** Empilhado: total da pilha na ponta. */
411
208
  showTotal?: boolean;
209
+ /** Só mostra o valor (e o total) que atende à regra, ex.: `{ operator: '!=', value: 0 }`. */
210
+ valueRule?: ValueRule;
211
+ /**
212
+ * Com `clickToFilter`, o filtro da própria dimensão (e da série) esconde o resto em vez de só
213
+ * apagá-lo. Padrão: `false` (apaga).
214
+ */
215
+ hideUnselected?: boolean;
412
216
  /**
413
217
  * Cor por série: `{ medida: '#rrggbb' }` ou, com `series`, `{ valor: '#rrggbb' }` (também
414
218
  * "(em branco)" e "Outros"). O que faltar segue a paleta.
@@ -427,7 +231,19 @@ type DonutChartDef = BaseChartDef & ColumnsDisplay & {
427
231
  percentDecimals?: number;
428
232
  formatDimension?: string;
429
233
  clickToFilter?: boolean;
234
+ /** Lado da legenda. Padrão: `right` (com nome, % e valor; em cima/embaixo, só o nome). */
235
+ legendPosition?: DonutLegendPosition;
236
+ /** Valor de cada fatia do lado de fora da rosca. */
237
+ showValues?: boolean;
238
+ /** O que o valor de fora mostra. Padrão: `both` (`44.981 (51%)`). */
239
+ valueContent?: DonutValueContent;
240
+ /** Total no furo da rosca. Padrão: `true`. */
241
+ showTotal?: boolean;
430
242
  };
243
+ declare const DONUT_LEGEND_POSITIONS: readonly ['right', 'left', 'top', 'bottom'];
244
+ type DonutLegendPosition = (typeof DONUT_LEGEND_POSITIONS)[number];
245
+ declare const DONUT_VALUE_CONTENTS: readonly ['both', 'value', 'percent'];
246
+ type DonutValueContent = (typeof DONUT_VALUE_CONTENTS)[number];
431
247
  type TableChartDef = BaseChartDef & ColumnsDisplay & {
432
248
  type: 'table';
433
249
  dimensions?: string[];
@@ -458,6 +274,8 @@ type TableChartDef = BaseChartDef & ColumnsDisplay & {
458
274
  clickToFilter?: boolean;
459
275
  /** Formatação condicional: cor do texto/fundo da célula ou da linha conforme uma regra. */
460
276
  formatRules?: FormatRule[];
277
+ /** Escalas de cor (gradiente): fundo/texto da coluna de `minColor` a `color` conforme o valor. */
278
+ colorScales?: ColorScale[];
461
279
  /** Bordas entre as células (grade). Padrão: só a linha embaixo de cada linha. */
462
280
  cellBorders?: boolean;
463
281
  /** Cor das bordas da grade. */
@@ -524,7 +342,11 @@ type CardStyle = {
524
342
  };
525
343
  /** Cards de todos os gráficos do layout: estilo padrão e espaço entre eles. */
526
344
  type CardsStyle = CardStyle & {
527
- /** Espaço entre os cards, em px. */
345
+ /** Espaço entre as linhas de cards, em px. */
346
+ rowGap?: number;
347
+ /** Espaço entre as colunas de cards, em px. */
348
+ columnGap?: number;
349
+ /** Espaço entre linhas e colunas, em px (formato antigo; `rowGap`/`columnGap` têm prioridade). */
528
350
  gap?: number;
529
351
  };
530
352
  type ChartsLayout = {
@@ -542,7 +364,7 @@ type FieldSpec = {
542
364
  label: string;
543
365
  hint?: string;
544
366
  /** Agrupamento no formulário do devtools. */
545
- section: 'Gráfico' | 'Dados' | 'Aparência' | 'Valores' | 'Rótulos e formatos' | 'Formatação condicional' | 'Filtro' | 'Tela' | 'Card';
367
+ section: 'Gráfico' | 'Dados' | 'Aparência' | 'Valores' | 'Comportamento' | 'Rótulos e formatos' | 'Formatação condicional' | 'Filtro' | 'Tela' | 'Card';
546
368
  required?: boolean;
547
369
  /** Valor que o componente usa quando o campo não está no JSON. */
548
370
  default?: unknown;
@@ -622,6 +444,10 @@ type FieldSpec = {
622
444
  {
623
445
  kind: 'formatRules';
624
446
  } |
447
+ /** Escalas de cor por coluna (`ColorScale[]`). */
448
+ {
449
+ kind: 'colorScales';
450
+ } |
625
451
  /**
626
452
  * `{ série: '#rrggbb' }`: uma cor por medida do gráfico ou, quando o campo `dimension` em
627
453
  * `values` está preenchido, por valor dessa dimensão (o devtools não lista os valores; digita).
@@ -629,6 +455,10 @@ type FieldSpec = {
629
455
  {
630
456
  kind: 'colors';
631
457
  values?: string;
458
+ } |
459
+ /** `ValueRule` (`{ operator, value, to? }`): ausente = sem regra (o devtools mostra uma checkbox). */
460
+ {
461
+ kind: 'valueRule';
632
462
  });
633
463
  /**
634
464
  * Tipo de gráfico: nome no devtools e campos do JSON. Para um tipo do app, `title`, `span` e
@@ -673,5 +503,240 @@ declare function validateLayout(layout: ChartsLayout, types?: ChartTypes): strin
673
503
  */
674
504
  declare function layoutModelWarnings(layout: ChartsLayout, model: Pick<ModelDef, 'dimensions' | 'measures'>, types?: ChartTypes): string[];
675
505
  //#endregion
676
- export { SumMeasure as $, DashboardQuery as A, SaveModelResult as B, ColumnAlign as C, DashboardBatchResult as D, DashboardBatchQuery as E, DevtoolsCapabilities as F, FieldMeta as G, AggregateMeasure as H, FilterValue as I, MeasureMeta as J, FormulaMeasure as K, ModelColumns as L, DashboardResult as M, DashboardRow as N, DashboardDevtoolsRequest as O, DashboardSnapshot as P, RelationshipDef as Q, ModelValidation as R, validateLayout as S, FormatRule as T, Aggregation as U, SchemaTable as V, DimensionDef as W, ModelMeta as X, ModelDef as Y, RatioMeasure as Z, FilterDef as _, CardStyle as a, layoutModelWarnings as b, ChartNumberFormat as c, ChartTypes as d, TableDef as et, ChartsLayout as f, FieldSpec as g, DonutChartDef as h, CanvasDef as i, DashboardQueryDebug as j, DashboardFilters as k, ChartType as l, CustomChartDef as m, BarValuePosition as n, modelMeta as nt, CardsStyle as o, ComboChartDef as p, MeasureDef as q, BuiltinChartDef as r, validateModel as rt, ChartDef as s, BarChartDef as t, ValueFormat as tt, ChartTypeSpec as u, KpiChartDef as v, ColumnVerticalAlign as w, resolveChartTypes as x, TableChartDef as y, ProfileStep as z };
677
- //# sourceMappingURL=layout-DsG-zRIO.d.ts.map
506
+ //#region src/types.d.ts
507
+ type FilterValue = string | number;
508
+ /** Filtros por dimensão; lista vazia (ou ausente) = sem filtro ("Todos"). */
509
+ type DashboardFilters = Record<string, FilterValue[]>;
510
+ /**
511
+ * Pedidos do devtools. O servidor só aceita quando o `runQuery` recebe `devtools` (em dev); fora
512
+ * disso `debug` é ignorado e o resto é recusado com 400.
513
+ */
514
+ type DashboardDevtoolsRequest = {
515
+ /** Devolve SQL compilado, parâmetros e tempos em `result.devtools.debug`. */
516
+ debug?: boolean;
517
+ /** Rascunho do modelo editado no devtools: substitui o modelo registrado só nesta consulta. */
518
+ model?: ModelDef;
519
+ /** Devolve a definição do modelo registrado e o que o servidor permite (`capabilities`). */
520
+ describe?: boolean;
521
+ /** Esvazia o cache de resultados do processo antes de executar. */
522
+ clearCache?: boolean;
523
+ /**
524
+ * Só compila: devolve o SQL e os parâmetros em `result.devtools.debug`, sem executar (o devtools
525
+ * usa para mostrar o SQL de uma consulta que deu erro).
526
+ */
527
+ compile?: boolean;
528
+ /** Devolve o `EXPLAIN` da consulta em vez das linhas. */
529
+ explain?: boolean;
530
+ /** Mede a agregação de cada fato usada pela consulta, isoladamente. */
531
+ profile?: boolean;
532
+ /** Tabelas e colunas do banco (`information_schema`), para o autocomplete do editor. */
533
+ schema?: boolean;
534
+ /** Colunas de cada tabela (uma linha de cada), para o diagrama do modelo. */
535
+ columns?: boolean;
536
+ /** Executa cada pedaço do modelo (`devtools.model` ou o registrado) contra o banco. */
537
+ validate?: boolean;
538
+ /** Grava o rascunho no arquivo do modelo (`preview` só devolve o conteúdo novo). */
539
+ save?: 'preview' | 'write';
540
+ /** Grava o layout de gráficos em `<layoutsDir>/<id>.json` (`preview` só devolve o conteúdo novo). */
541
+ saveLayout?: {
542
+ layout: ChartsLayout;
543
+ mode: 'preview' | 'write';
544
+ };
545
+ /** Grava o resultado da consulta (modelo registrado) como snapshot de regressão. */
546
+ snapshot?: {
547
+ name: string;
548
+ overwrite?: boolean;
549
+ };
550
+ /** Lista os snapshots salvos deste modelo. */
551
+ snapshots?: boolean;
552
+ };
553
+ type DashboardQuery = {
554
+ model: string;
555
+ /** Dimensões agrupadas (viram GROUP BY). */
556
+ dimensions?: string[];
557
+ /** Medidas calculadas para cada grupo. */
558
+ measures?: string[];
559
+ filters?: DashboardFilters;
560
+ /** Devolve só os metadados do modelo (rótulos, descrições, formatos; sem SQL) em `result.meta`. */
561
+ meta?: boolean;
562
+ /**
563
+ * Várias consultas do mesmo modelo num request (o client manda assim as consultas de um render).
564
+ * O servidor junta numa SQL só as que têm as mesmas dimensões e filtros e vêm das mesmas fatos, e
565
+ * devolve uma resposta por consulta em `result.results`, na mesma ordem. Do `devtools`, só
566
+ * `debug` e `model` (rascunho) valem aqui.
567
+ */
568
+ queries?: DashboardBatchQuery[];
569
+ devtools?: DashboardDevtoolsRequest;
570
+ };
571
+ /** Uma consulta de um lote (`DashboardQuery.queries`): o modelo e o devtools são os do lote. */
572
+ type DashboardBatchQuery = Pick<DashboardQuery, 'dimensions' | 'measures' | 'filters'>;
573
+ /** Resposta de uma consulta do lote: as linhas ou o erro (de consulta) dela. */
574
+ type DashboardBatchResult = {
575
+ rows: DashboardRow[];
576
+ error?: string;
577
+ /** Quantas consultas do lote saíram da mesma SQL (contando esta); o `debug` é o dessa SQL. */
578
+ batched?: number;
579
+ devtools?: {
580
+ debug?: DashboardQueryDebug;
581
+ };
582
+ };
583
+ type DashboardRow = Record<string, string | number | null>;
584
+ type DashboardQueryDebug = {
585
+ sql: string;
586
+ params: (string | number)[];
587
+ /** Tempo da execução no banco (num cache hit, o da execução original). */
588
+ durationMs: number;
589
+ cached: boolean;
590
+ /** A consulta rodou contra o rascunho do devtools, não contra o modelo registrado. */
591
+ draft: boolean;
592
+ };
593
+ type ProfileStep = {
594
+ /** `fato:<tabela>` ou `consulta` (a consulta inteira). */
595
+ name: string;
596
+ durationMs: number;
597
+ /** Linhas da agregação da fato (grupos) com os filtros aplicados. */
598
+ rows: number | null;
599
+ };
600
+ type SchemaTable = {
601
+ name: string;
602
+ type: 'table' | 'view';
603
+ columns: {
604
+ name: string;
605
+ type: string;
606
+ }[];
607
+ };
608
+ /** Colunas devolvidas por cada pedaço do modelo (vazio quando não veio nenhuma linha). */
609
+ type ModelColumns = {
610
+ /** Colunas de cada tabela. */
611
+ tables: Record<string, string[]>;
612
+ /** `tabela.coluna` com valor numérico na linha lida. */
613
+ numeric: string[];
614
+ };
615
+ type ModelValidation = {
616
+ /**
617
+ * Erro do banco por pedaço: `table:<nome>`, `relationship:<índice>`, `dimension:<nome>`,
618
+ * `measure:<nome>`.
619
+ */
620
+ errors: Record<string, string>;
621
+ warnings: Record<string, string>;
622
+ columns: ModelColumns;
623
+ };
624
+ type SaveModelResult = {
625
+ path: string;
626
+ previous: string;
627
+ content: string;
628
+ written: boolean;
629
+ warnings: string[];
630
+ };
631
+ type DashboardSnapshot = {
632
+ name: string;
633
+ createdAt: string;
634
+ query: Omit<DashboardQuery, 'devtools' | 'meta'>;
635
+ rows: DashboardRow[];
636
+ };
637
+ type DevtoolsCapabilities = {
638
+ /** O endpoint sabe onde ficam os arquivos dos modelos (`modelsDir`). */
639
+ saveModel: boolean;
640
+ /** O endpoint sabe onde gravar snapshots (`snapshotsDir`). */
641
+ snapshots: boolean;
642
+ /** O endpoint sabe onde ficam os arquivos de layout de gráficos (`layoutsDir`). */
643
+ saveLayout: boolean;
644
+ /** Tipos de gráfico do app que o endpoint conhece (`chartTypes`): só esses ele aceita salvar. */
645
+ chartTypes: string[];
646
+ };
647
+ type DashboardResult = {
648
+ rows: DashboardRow[];
649
+ /** Respostas de um lote (`query.queries`), na ordem das consultas. */
650
+ results?: DashboardBatchResult[];
651
+ /**
652
+ * Quantas consultas saíram da mesma SQL que esta (contando ela), quando foi num lote. O
653
+ * `devtools.debug` é o dessa SQL.
654
+ */
655
+ batched?: number;
656
+ meta?: ModelMeta;
657
+ devtools?: {
658
+ model?: ModelDef;
659
+ capabilities?: DevtoolsCapabilities;
660
+ debug?: DashboardQueryDebug;
661
+ explain?: DashboardRow[];
662
+ profile?: ProfileStep[];
663
+ schema?: SchemaTable[];
664
+ validation?: ModelValidation;
665
+ columns?: ModelColumns;
666
+ /** Pedaços que o banco recusou ao ler as colunas (mesmas chaves da validação). */
667
+ columnErrors?: Record<string, string>;
668
+ save?: SaveModelResult;
669
+ snapshot?: {
670
+ path: string;
671
+ };
672
+ snapshots?: DashboardSnapshot[];
673
+ };
674
+ };
675
+ //#endregion
676
+ //#region src/formatRules.d.ts
677
+ declare const COLUMN_ALIGNS: readonly ['left', 'center', 'right'];
678
+ type ColumnAlign = (typeof COLUMN_ALIGNS)[number];
679
+ declare const COLUMN_VERTICAL_ALIGNS: readonly ['top', 'middle', 'bottom'];
680
+ type ColumnVerticalAlign = (typeof COLUMN_VERTICAL_ALIGNS)[number];
681
+ declare const RULE_OPERATORS: readonly ['>', '>=', '<', '<=', '=', '!=', 'between', 'contains', 'empty', 'notEmpty'];
682
+ type RuleOperator = (typeof RULE_OPERATORS)[number];
683
+ type FormatRule = {
684
+ /**
685
+ * Dimensão ou medida avaliada. Pode estar fora da tabela: entra na consulta sem coluna (uma
686
+ * dimensão de fora divide as linhas se tiver mais de um valor por linha).
687
+ */
688
+ field: string;
689
+ operator: RuleOperator;
690
+ /** Valor comparado com o valor bruto (percentual como fração: 10% = 0.1). */
691
+ value?: number | string;
692
+ /** Fim do intervalo do `between` (inclusivo, como o `value`). */
693
+ to?: number;
694
+ /** `cell` (padrão) pinta uma célula; `row`, a linha inteira. */
695
+ target?: 'cell' | 'row';
696
+ /** Coluna pintada quando `target` é `cell`. Padrão: o próprio `field`. */
697
+ column?: string;
698
+ /** Cor do texto. */
699
+ color?: string;
700
+ /** Cor de fundo. */
701
+ background?: string;
702
+ bold?: boolean;
703
+ /** Alinhamento horizontal da célula (ou das células da linha). */
704
+ align?: ColumnAlign;
705
+ /** Alinhamento vertical da célula (ou das células da linha). */
706
+ verticalAlign?: ColumnVerticalAlign;
707
+ };
708
+ /**
709
+ * Regra de um valor só (sem campo nem estilo), ex.: mostrar o rótulo da barra só quando o valor é
710
+ * diferente de zero: `{ "operator": "!=", "value": 0 }`.
711
+ */
712
+ type ValueRule = {
713
+ operator: ValueRuleOperator;
714
+ value: number;
715
+ to?: number;
716
+ };
717
+ declare const VALUE_RULE_OPERATORS: readonly ['>', '>=', '<', '<=', '=', '!=', 'between'];
718
+ type ValueRuleOperator = (typeof VALUE_RULE_OPERATORS)[number];
719
+ declare const COLOR_SCALE_TARGETS: readonly ['background', 'text'];
720
+ type ColorScaleTarget = (typeof COLOR_SCALE_TARGETS)[number];
721
+ /**
722
+ * Escala de cor de uma coluna numérica (a "escala de cores" do Power BI): a cor da célula vai de
723
+ * `minColor` (no `min`) a `color` (no `max`) conforme o valor. Ex.: uma coluna de 0 a 100 com
724
+ * `{ "column": "nota", "min": 0, "max": 100, "color": "#2e7d32" }` fica branca no 0 e verde no 100.
725
+ */
726
+ type ColorScale = {
727
+ /** Coluna pintada e avaliada: medida, dimensão numérica ou `%:medida`. */
728
+ column: string;
729
+ /** Cor no máximo. */
730
+ color: string;
731
+ /** Cor no mínimo. Padrão: branco. */
732
+ minColor?: string;
733
+ /** Valor da `minColor` (abaixo dele, a mesma cor). Padrão: o menor valor da coluna na tabela. */
734
+ min?: number;
735
+ /** Valor da `color` (acima dele, a mesma cor). Padrão: o maior valor da coluna na tabela. */
736
+ max?: number;
737
+ /** `background` (padrão) pinta o fundo; `text`, o texto. */
738
+ target?: ColorScaleTarget;
739
+ };
740
+ //#endregion
741
+ export { ModelDef as $, ChartType as A, FilterDef as B, BarValuePosition as C, CardsStyle as D, CardStyle as E, CustomChartDef as F, validateLayout as G, TableChartDef as H, DonutChartDef as I, DimensionDef as J, AggregateMeasure as K, DonutLegendPosition as L, ChartTypes as M, ChartsLayout as N, ChartDef as O, ComboChartDef as P, MeasureMeta as Q, DonutValueContent as R, BarChartDef as S, CanvasDef as T, layoutModelWarnings as U, KpiChartDef as V, resolveChartTypes as W, FormulaMeasure as X, FieldMeta as Y, MeasureDef as Z, ModelColumns as _, ValueRule as a, ValueFormat as at, SaveModelResult as b, DashboardDevtoolsRequest as c, DashboardQueryDebug as d, ModelMeta as et, DashboardResult as f, FilterValue as g, DevtoolsCapabilities as h, FormatRule as i, TableDef as it, ChartTypeSpec as j, ChartNumberFormat as k, DashboardFilters as l, DashboardSnapshot as m, ColumnAlign as n, RelationshipDef as nt, DashboardBatchQuery as o, modelMeta as ot, DashboardRow as p, Aggregation as q, ColumnVerticalAlign as r, SumMeasure as rt, DashboardBatchResult as s, validateModel as st, ColorScale as t, RatioMeasure as tt, DashboardQuery as u, ModelValidation as v, BuiltinChartDef as w, SchemaTable as x, ProfileStep as y, FieldSpec as z };
742
+ //# sourceMappingURL=formatRules-DxA9vMvz.d.ts.map