@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.
- package/dist/{DashboardDevtools-CMIuUYpw.js → DashboardDevtools-D0pzwSgn.js} +527 -240
- package/dist/DashboardDevtools-D0pzwSgn.js.map +1 -0
- package/dist/{ModelDictionary-CyeYU6ZJ.js → ModelDictionary-Cw4sa8tW.js} +3 -3
- package/dist/{ModelDictionary-CyeYU6ZJ.js.map → ModelDictionary-Cw4sa8tW.js.map} +1 -1
- package/dist/cli.js +166 -10
- package/dist/cli.js.map +1 -1
- package/dist/client/index.d.ts +49 -7
- package/dist/client/index.js +160 -35
- package/dist/client/index.js.map +1 -1
- package/dist/{layout-DsG-zRIO.d.ts → formatRules-DxA9vMvz.d.ts} +272 -207
- package/dist/{layout-CBzYDoqE.js → layout-BS3nO6OT.js} +225 -13
- package/dist/layout-BS3nO6OT.js.map +1 -0
- package/dist/server/index.d.ts +1 -1
- package/dist/server/index.js +1 -1
- package/dist/types.d.ts +2 -2
- package/package.json +1 -1
- package/dist/DashboardDevtools-CMIuUYpw.js.map +0 -1
- package/dist/layout-CBzYDoqE.js.map +0 -1
|
@@ -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
|
|
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
|
-
|
|
677
|
-
|
|
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
|