@wibi-global/sdk 0.1.1 → 0.1.3

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.
Files changed (75) hide show
  1. package/README.md +0 -0
  2. package/dist/artifact-schema/src/biCatalog.d.ts +0 -0
  3. package/dist/artifact-schema/src/biCatalog.d.ts.map +0 -0
  4. package/dist/artifact-schema/src/biCatalog.js +0 -0
  5. package/dist/artifact-schema/src/biCatalog.js.map +0 -0
  6. package/dist/artifact-schema/src/hash.d.ts +0 -0
  7. package/dist/artifact-schema/src/hash.d.ts.map +0 -0
  8. package/dist/artifact-schema/src/hash.js +0 -0
  9. package/dist/artifact-schema/src/hash.js.map +0 -0
  10. package/dist/artifact-schema/src/index.d.ts +0 -0
  11. package/dist/artifact-schema/src/index.d.ts.map +0 -0
  12. package/dist/artifact-schema/src/index.js +0 -0
  13. package/dist/artifact-schema/src/index.js.map +0 -0
  14. package/dist/artifact-schema/src/schema.d.ts +0 -0
  15. package/dist/artifact-schema/src/schema.d.ts.map +0 -0
  16. package/dist/artifact-schema/src/schema.js +0 -0
  17. package/dist/artifact-schema/src/schema.js.map +0 -0
  18. package/dist/artifact-schema/src/types.d.ts +0 -0
  19. package/dist/artifact-schema/src/types.d.ts.map +0 -0
  20. package/dist/artifact-schema/src/types.js +0 -0
  21. package/dist/artifact-schema/src/types.js.map +0 -0
  22. package/dist/artifact-schema/src/validate.d.ts +0 -0
  23. package/dist/artifact-schema/src/validate.d.ts.map +0 -0
  24. package/dist/artifact-schema/src/validate.js +0 -0
  25. package/dist/artifact-schema/src/validate.js.map +0 -0
  26. package/dist/instructions/AGENTS.md +47 -0
  27. package/dist/instructions/AGENT_COMMON.md +0 -0
  28. package/dist/instructions/CLAUDE.md +9 -0
  29. package/dist/instructions/CODEX.md +0 -0
  30. package/dist/instructions/GEMINI.md +0 -0
  31. package/dist/prompts/authoring.wbp +0 -0
  32. package/dist/sdk/src/builder.d.ts +0 -0
  33. package/dist/sdk/src/builder.d.ts.map +0 -0
  34. package/dist/sdk/src/builder.js +0 -0
  35. package/dist/sdk/src/builder.js.map +0 -0
  36. package/dist/sdk/src/context.d.ts +0 -0
  37. package/dist/sdk/src/context.d.ts.map +0 -0
  38. package/dist/sdk/src/context.js +0 -0
  39. package/dist/sdk/src/context.js.map +0 -0
  40. package/dist/sdk/src/dashboard-context.d.ts +0 -0
  41. package/dist/sdk/src/dashboard-context.d.ts.map +0 -0
  42. package/dist/sdk/src/dashboard-context.js +0 -0
  43. package/dist/sdk/src/dashboard-context.js.map +0 -0
  44. package/dist/sdk/src/dashboard-spec.d.ts +0 -0
  45. package/dist/sdk/src/dashboard-spec.d.ts.map +1 -1
  46. package/dist/sdk/src/dashboard-spec.js +176 -19
  47. package/dist/sdk/src/dashboard-spec.js.map +1 -1
  48. package/dist/sdk/src/data/ctx.wbx +0 -0
  49. package/dist/sdk/src/data/index.d.ts +0 -0
  50. package/dist/sdk/src/data/index.d.ts.map +1 -1
  51. package/dist/sdk/src/data/index.js +10 -10
  52. package/dist/sdk/src/data/index.js.map +1 -1
  53. package/dist/sdk/src/data/queries.wbx +0 -0
  54. package/dist/sdk/src/data/serialization/dashboard-serialization.types.d.ts +110 -2
  55. package/dist/sdk/src/data/serialization/dashboard-serialization.types.d.ts.map +1 -1
  56. package/dist/sdk/src/data/serialization/dashboard-serialization.types.js +0 -0
  57. package/dist/sdk/src/data/serialization/dashboard-serialization.types.js.map +0 -0
  58. package/dist/sdk/src/data/serialization/dashboard-serialization.types.ts +161 -32
  59. package/dist/sdk/src/data/serialization/index.d.ts +1 -1
  60. package/dist/sdk/src/data/serialization/index.d.ts.map +1 -1
  61. package/dist/sdk/src/data/serialization/index.js +0 -0
  62. package/dist/sdk/src/data/serialization/index.js.map +0 -0
  63. package/dist/sdk/src/data/syntax.wbx +0 -0
  64. package/dist/sdk/src/data/view-categories.wbx +0 -0
  65. package/dist/sdk/src/data/views.wbx +0 -0
  66. package/dist/sdk/src/data/widgets.wbx +79 -16
  67. package/dist/sdk/src/data.d.ts +0 -0
  68. package/dist/sdk/src/data.d.ts.map +0 -0
  69. package/dist/sdk/src/data.js +0 -0
  70. package/dist/sdk/src/data.js.map +0 -0
  71. package/dist/sdk/src/index.d.ts +0 -0
  72. package/dist/sdk/src/index.d.ts.map +0 -0
  73. package/dist/sdk/src/index.js +0 -0
  74. package/dist/sdk/src/index.js.map +0 -0
  75. package/package.json +2 -2
@@ -66,15 +66,17 @@ export interface SerializedLayout {
66
66
  sections: SerializedSection[]
67
67
  }
68
68
 
69
- export type SerializedWidgetType =
70
- | 'kpi'
71
- | 'chart'
72
- | 'grid'
73
- | 'progress-list'
74
- | 'gauge'
75
- | 'funnel'
76
- | 'waterfall'
77
- | 'heatmap'
69
+ export type SerializedWidgetType =
70
+ | 'kpi'
71
+ | 'chart'
72
+ | 'grid'
73
+ | 'pivot'
74
+ | 'pivotgrid'
75
+ | 'progress-list'
76
+ | 'gauge'
77
+ | 'funnel'
78
+ | 'waterfall'
79
+ | 'heatmap'
78
80
  | 'scatter'
79
81
  | 'treemap'
80
82
  | 'sankey'
@@ -154,6 +156,10 @@ export interface SerializedChartProperties {
154
156
  bar_width?: number
155
157
  /** Rotacionar labels do eixo X em 45° */
156
158
  rotate_labels?: boolean
159
+ /** Rotacionar labels do eixo X em graus */
160
+ x_axis_label_rotate?: number
161
+ /** Formato textual de datas no eixo X */
162
+ x_axis_date_format?: string
157
163
  /** Habilitar zoom interativo */
158
164
  enable_zoom?: boolean
159
165
 
@@ -226,11 +232,11 @@ export interface SerializedGridColumnDef {
226
232
  format?: SerializedGridColumnFormat
227
233
  }
228
234
 
229
- export interface SerializedGridProperties {
230
- title: string
231
- page_size: number
232
- columns: string[]
233
- column_labels: Record<string, string>
235
+ export interface SerializedGridProperties {
236
+ title: string
237
+ page_size: number
238
+ columns: string[]
239
+ column_labels: Record<string, string>
234
240
  enable_filters: boolean
235
241
  enable_export: boolean
236
242
  enable_pagination: boolean
@@ -245,41 +251,162 @@ export interface SerializedGridProperties {
245
251
  use_grid_v2?: boolean
246
252
  /** Mensagem quando não há dados */
247
253
  empty_message?: string
248
- /** Mensagem durante carregamento */
249
- loading_message?: string
250
- }
251
-
252
- export interface SerializedPanelAction {
253
- path: string
254
- title: string
255
- description: string
256
- }
254
+ /** Mensagem durante carregamento */
255
+ loading_message?: string
256
+ }
257
+
258
+ export interface SerializedPivotProperties {
259
+ /** Campo das linhas da tabela pivot (snake_case) */
260
+ row_field?: string
261
+ /** Alias em camelCase (compatibilidade) */
262
+ rowField?: string
263
+
264
+ /** Campo das colunas da tabela pivot (snake_case) */
265
+ col_field?: string
266
+ /** Alias alternativo (compatibilidade) */
267
+ column_field?: string
268
+ /** Alias em camelCase (compatibilidade) */
269
+ colField?: string
270
+ /** Alias em camelCase (compatibilidade) */
271
+ columnField?: string
272
+
273
+ /** Campo numerico com o valor a agregar (snake_case) */
274
+ value_field?: string
275
+ /** Alias em camelCase (compatibilidade) */
276
+ valueField?: string
277
+
278
+ /** Agregacao: sum | avg | count | min | max (padrao: sum) */
279
+ aggregation?: 'sum' | 'avg' | 'count' | 'min' | 'max'
280
+
281
+ /** Mostrar linha/coluna de totais */
282
+ show_totals?: boolean
283
+ /** Alias em camelCase (compatibilidade) */
284
+ showTotals?: boolean
285
+
286
+ /** Formato do valor: number | currency | percent */
287
+ format?: 'number' | 'currency' | 'percent'
288
+ /** Alias legado (compatibilidade) */
289
+ value_format?: 'number' | 'currency' | 'percent'
290
+ /** Alias legado em camelCase (compatibilidade) */
291
+ valueFormat?: 'number' | 'currency' | 'percent'
292
+
293
+ /** Numero de casas decimais */
294
+ decimals?: number
295
+
296
+ /** Moeda quando format='currency' */
297
+ currency?: string
298
+
299
+ /** Locale (padrao pt-BR) */
300
+ locale?: string
301
+
302
+ /** Habilita busca no pivotgrid (compatibilidade; pode ser ignorado pelo renderer) */
303
+ searchable?: boolean
304
+ /** Placeholder da busca (compatibilidade) */
305
+ search_placeholder?: string
306
+ /** Placeholder da busca (compatibilidade) */
307
+ searchPlaceholder?: string
308
+
309
+ /** Mensagem durante carregamento (compatibilidade) */
310
+ loading_message?: string
311
+ /** Mensagem durante carregamento (compatibilidade) */
312
+ loadingMessage?: string
313
+
314
+ /** Mensagem quando nao ha dados (compatibilidade) */
315
+ empty_message?: string
316
+ /** Mensagem quando nao ha dados (compatibilidade) */
317
+ emptyMessage?: string
318
+ }
319
+
320
+ export interface SerializedPivotGridProperties extends SerializedPivotProperties {
321
+ /**
322
+ * PivotGrid e um widget serializado separado da pivot tradicional.
323
+ * No contrato atual, herda as mesmas propriedades base da pivot.
324
+ */
325
+ }
326
+
327
+ export interface SerializedPanelAction {
328
+ path: string
329
+ title: string
330
+ description: string
331
+ }
257
332
 
258
333
  export interface SerializedProgressListProperties {
259
334
  /** Campo de label (categoria/nome exibido na linha) */
260
335
  labelField: string
336
+ /** Alias legado em snake_case */
337
+ label_field?: string
261
338
  /** Campo de valor numérico para as barras */
262
339
  valueField: string
340
+ /** Alias legado em snake_case */
341
+ value_field?: string
263
342
  /** Agregação: sum | avg | count | min | max */
264
343
  aggregation?: 'sum' | 'avg' | 'count' | 'min' | 'max'
265
344
  /** Número máximo de itens exibidos */
266
345
  maxItems?: number
346
+ /** Alias legado em snake_case */
347
+ max_items?: number
267
348
  /** Exibir valor numérico ao lado da barra */
268
349
  showValues?: boolean
350
+ /** Alias legado em snake_case */
351
+ show_values?: boolean
269
352
  /** Exibir percentual ao lado da barra */
270
353
  showPercentage?: boolean
354
+ /** Alias legado em snake_case */
355
+ show_percentage?: boolean
271
356
  /** Formato do valor: number | currency | compact | percentage */
272
357
  valueFormat?: 'number' | 'currency' | 'compact' | 'percentage'
358
+ /** Alias legado em snake_case */
359
+ value_format?: 'number' | 'currency' | 'compact' | 'percentage'
273
360
  /** Altura em px das barras de progresso */
274
361
  barHeight?: number
362
+ /** Alias legado em snake_case */
363
+ bar_height?: number
275
364
  /** Esquema de cores: gradient | single | custom */
276
365
  colorScheme?: 'gradient' | 'single' | 'custom'
366
+ /** Alias legado em snake_case */
367
+ color_scheme?: 'gradient' | 'single' | 'custom'
277
368
  /** Cor primária (usada em colorScheme='single') */
278
369
  primaryColor?: string
370
+ /** Alias legado em snake_case */
371
+ primary_color?: string
279
372
  /** Ordenação: value | label | none */
280
373
  sortBy?: 'value' | 'label' | 'none'
374
+ /** Alias legado em snake_case */
375
+ sort_by?: 'value' | 'label' | 'none'
281
376
  /** Direção da ordenação: asc | desc */
282
377
  sortOrder?: 'asc' | 'desc'
378
+ /** Alias legado em snake_case */
379
+ sort_order?: 'asc' | 'desc'
380
+ /** Alguns dashboards antigos incluem um title redundante nas properties */
381
+ title?: string
382
+ /** Exibir os filtros internos do componente (padrão: true quando filter1/filter2 definidos) */
383
+ showInternalFilters?: boolean
384
+ /** Filtro interno 1 — select discreto com query própria para popular as opções */
385
+ filter1?: {
386
+ /** Label do select (ex: "Filial", "Vendedor") */
387
+ label?: string
388
+ /** SQL para popular as opções; suporta ${startDate}, ${endDate}, ${empresaId}, ${companyFilter} */
389
+ sql: string
390
+ /** Campo do resultado SQL que será o valor da opção */
391
+ valueField: string
392
+ /** Campo do resultado SQL que será o label da opção (padrão: valueField) */
393
+ labelField?: string
394
+ /** Campo nos dados principais (rawData) pelo qual o filtro será aplicado */
395
+ filterField: string
396
+ }
397
+ /** Filtro interno 2 — select discreto com query própria para popular as opções */
398
+ filter2?: {
399
+ /** Label do select (ex: "Filial", "Vendedor") */
400
+ label?: string
401
+ /** SQL para popular as opções; suporta ${startDate}, ${endDate}, ${empresaId}, ${companyFilter} */
402
+ sql: string
403
+ /** Campo do resultado SQL que será o valor da opção */
404
+ valueField: string
405
+ /** Campo do resultado SQL que será o label da opção (padrão: valueField) */
406
+ labelField?: string
407
+ /** Campo nos dados principais (rawData) pelo qual o filtro será aplicado */
408
+ filterField: string
409
+ }
283
410
  }
284
411
 
285
412
  export interface SerializedPanelProperties {
@@ -379,15 +506,17 @@ export interface SerializedSpacerProperties {
379
506
  height: number
380
507
  }
381
508
 
382
- export type SerializedWidgetProperties =
383
- | SerializedKpiProperties
384
- | SerializedChartProperties
385
- | SerializedGridProperties
386
- | SerializedProgressListProperties
387
- | SerializedPanelProperties
388
- | SerializedDateWidgetProperties
389
- | SerializedCompaniesWidgetProperties
390
- | SerializedHeadingProperties
509
+ export type SerializedWidgetProperties =
510
+ | SerializedKpiProperties
511
+ | SerializedChartProperties
512
+ | SerializedGridProperties
513
+ | SerializedPivotProperties
514
+ | SerializedPivotGridProperties
515
+ | SerializedProgressListProperties
516
+ | SerializedPanelProperties
517
+ | SerializedDateWidgetProperties
518
+ | SerializedCompaniesWidgetProperties
519
+ | SerializedHeadingProperties
391
520
  | SerializedTextProperties
392
521
  | SerializedImageProperties
393
522
  | SerializedDividerProperties
@@ -1,2 +1,2 @@
1
- export type { SerializedDashboard, SerializedMetadata, SerializedFilter, SerializedDateFilter, SerializedEmpresaFilter, SerializedLayout, SerializedSection, SerializedWidget, SerializedWidgetType, SerializedWidgetProperties, SerializedKpiProperties, SerializedChartProperties, SerializedGridProperties, SerializedProgressListProperties, SerializedPanelProperties, SerializedPanelAction, SerializedDateWidgetProperties, SerializedCompaniesWidgetProperties, SerializedGridColumnDef, SerializedGridColumnFormat, SerializedHeadingProperties, SerializedTextProperties, SerializedImageProperties, SerializedDividerProperties, SerializedSpacerProperties, SerializedQuery, DatePeriodType, } from './dashboard-serialization.types.js';
1
+ export type { SerializedDashboard, SerializedMetadata, SerializedFilter, SerializedDateFilter, SerializedEmpresaFilter, SerializedLayout, SerializedSection, SerializedWidget, SerializedWidgetType, SerializedWidgetProperties, SerializedKpiProperties, SerializedChartProperties, SerializedGridProperties, SerializedPivotProperties, SerializedPivotGridProperties, SerializedProgressListProperties, SerializedPanelProperties, SerializedPanelAction, SerializedDateWidgetProperties, SerializedCompaniesWidgetProperties, SerializedGridColumnDef, SerializedGridColumnFormat, SerializedHeadingProperties, SerializedTextProperties, SerializedImageProperties, SerializedDividerProperties, SerializedSpacerProperties, SerializedQuery, DatePeriodType, } from './dashboard-serialization.types.js';
2
2
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/data/serialization/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,EAChB,oBAAoB,EACpB,uBAAuB,EACvB,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,EAChB,oBAAoB,EACpB,0BAA0B,EAC1B,uBAAuB,EACvB,yBAAyB,EACzB,wBAAwB,EACxB,gCAAgC,EAChC,yBAAyB,EACzB,qBAAqB,EACrB,8BAA8B,EAC9B,mCAAmC,EACnC,uBAAuB,EACvB,0BAA0B,EAC1B,2BAA2B,EAC3B,wBAAwB,EACxB,yBAAyB,EACzB,2BAA2B,EAC3B,0BAA0B,EAC1B,eAAe,EACf,cAAc,GACf,MAAM,oCAAoC,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/data/serialization/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,EAChB,oBAAoB,EACpB,uBAAuB,EACvB,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,EAChB,oBAAoB,EACpB,0BAA0B,EAC1B,uBAAuB,EACvB,yBAAyB,EACzB,wBAAwB,EACxB,yBAAyB,EACzB,6BAA6B,EAC7B,gCAAgC,EAChC,yBAAyB,EACzB,qBAAqB,EACrB,8BAA8B,EAC9B,mCAAmC,EACnC,uBAAuB,EACvB,0BAA0B,EAC1B,2BAA2B,EAC3B,wBAAwB,EACxB,yBAAyB,EACzB,2BAA2B,EAC3B,0BAA0B,EAC1B,eAAe,EACf,cAAc,GACf,MAAM,oCAAoC,CAAA"}
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -102,7 +102,7 @@
102
102
  "donut_proporcao": "widget_type='chart' com chart_type='pie' e inner_radius > 0",
103
103
  "ranking_com_barra": "widget_type='progress-list' — top N itens com barra proporcional",
104
104
  "tabela_de_dados": "widget_type='grid' — tabela paginável com formatação por coluna",
105
- "tabela_cruzada": "widget_type='pivot' — linhas × colunas com valor agregado",
105
+ "tabela_cruzada": "widget_type='pivotgrid' — linhas × colunas com valor agregado",
106
106
  "velocimetro_meta": "widget_type='gauge' — medidor circular com escala",
107
107
  "funil_conversao": "widget_type='funnel' — etapas de pipeline decrescentes",
108
108
  "cascata_contribuicao": "widget_type='waterfall' — parcelas positivas/negativas para um total",
@@ -137,7 +137,8 @@
137
137
  "multi-card": 160,
138
138
  "chart": 400,
139
139
  "grid": 350,
140
- "pivot": 380,
140
+ "pivot": 380,
141
+ "pivotgrid": 380,
141
142
  "progress-list": 350,
142
143
  "gauge": 320,
143
144
  "funnel": 350,
@@ -1101,7 +1102,7 @@
1101
1102
  "fields": {
1102
1103
  "id": { "type": "string", "required": true },
1103
1104
  "type": { "type": "string", "required": true, "values": [
1104
- "chart", "grid", "table", "card", "filter", "text", "image", "line", "pie", "gauge", "pivot", "map",
1105
+ "chart", "grid", "table", "card", "filter", "text", "image", "line", "pie", "gauge", "pivot", "pivotgrid", "map",
1105
1106
  "area", "scatter", "treemap", "multi-card", "kpi", "sparkline", "funnel", "waterfall",
1106
1107
  "filled-map", "dropdown", "timeline", "group",
1107
1108
  "radar", "heatmap", "candlestick", "boxplot", "sankey", "graph", "sunburst", "tree",
@@ -1694,11 +1695,11 @@
1694
1695
  },
1695
1696
  "llm_instruction": "Para grids no dashboard.serialized.json, SEMPRE prefira use_grid_v2: true com column_defs quando souber os campos antecipadamente. O DataGridV2 é mais leve, suporta formatação por coluna (currency, percentage, date, etc.), resize e reorder de colunas nativo. Se não souber os campos, use o modo legado (columns + column_labels) que auto-detecta."
1696
1697
  },
1697
- "pivot": {
1698
- "name": "Pivot",
1699
- "category": "data",
1700
- "description": "Tabela pivot (dinâmica) para análise cruzada — linhas × colunas com valores agregados.",
1701
- "icon": "📋",
1698
+ "pivot": {
1699
+ "name": "Pivot",
1700
+ "category": "data",
1701
+ "description": "Tabela pivot (dinâmica) para análise cruzada — linhas × colunas com valores agregados.",
1702
+ "icon": "📋",
1702
1703
  "render": "PivotComponent",
1703
1704
  "defaultSize": { "width": 980, "height": 400 },
1704
1705
  "llm_instruction": "Use widget_type='pivot' para tabela cruzada (ex: vendas por vendedor × mês). OBRIGATÓRIO: row_field (dimensão das linhas), col_field (dimensão das colunas), value_field (métrica). Aggregation padrão: sum.",
@@ -1707,10 +1708,30 @@
1707
1708
  "col_field": { "type": "string", "required": true, "description": "Campo das colunas da tabela pivot. Ex: 'mes', 'ano', 'categoria'." },
1708
1709
  "value_field": { "type": "string", "required": true, "description": "Campo numérico com o valor a agregar." },
1709
1710
  "aggregation": { "type": "string", "required": false, "default": "sum", "values": ["sum", "avg", "count", "min", "max"] },
1710
- "show_totals": { "type": "boolean", "required": false, "default": true, "description": "Mostrar linha/coluna de totais." },
1711
- "format": { "type": "string", "required": false, "values": ["number", "currency", "percent"], "default": "number" }
1712
- }
1713
- },
1711
+ "show_totals": { "type": "boolean", "required": false, "default": true, "description": "Mostrar linha/coluna de totais." },
1712
+ "format": { "type": "string", "required": false, "values": ["number", "currency", "percent"], "default": "number" }
1713
+ }
1714
+ },
1715
+ "pivotgrid": {
1716
+ "name": "PivotGrid",
1717
+ "category": "data",
1718
+ "description": "Tabela pivot com visual inspirado em DataGridV2, com busca, totais e formatação.",
1719
+ "icon": "📋",
1720
+ "render": "PivotGrid",
1721
+ "defaultSize": { "width": 980, "height": 400 },
1722
+ "llm_instruction": "Use widget_type='pivotgrid' para tabela cruzada moderna (ex: vendas por vendedor × mês) quando quiser uma pivot com visual mais próximo de DataGridV2. OBRIGATÓRIO: row_field, col_field e value_field. Opcional: aggregation, show_totals e format.",
1723
+ "propertiesDetailed": {
1724
+ "row_field": { "type": "string", "required": true, "description": "Campo das linhas da tabela pivot." },
1725
+ "col_field": { "type": "string", "required": true, "description": "Campo das colunas da tabela pivot." },
1726
+ "value_field": { "type": "string", "required": true, "description": "Campo numérico com o valor a agregar." },
1727
+ "aggregation": { "type": "string", "required": false, "default": "sum", "values": ["sum", "avg", "count", "min", "max"] },
1728
+ "show_totals": { "type": "boolean", "required": false, "default": true, "description": "Mostrar linha/coluna de totais." },
1729
+ "format": { "type": "string", "required": false, "values": ["number", "currency", "percent"], "default": "number" },
1730
+ "searchable": { "type": "boolean", "required": false, "default": true },
1731
+ "loading_message": { "type": "string", "required": false, "default": "Carregando..." },
1732
+ "empty_message": { "type": "string", "required": false, "default": "Nenhum dado encontrado." }
1733
+ }
1734
+ },
1714
1735
  "sparkline": {
1715
1736
  "name": "Sparkline",
1716
1737
  "category": "data",
@@ -1825,11 +1846,11 @@
1825
1846
  "progress-list": {
1826
1847
  "name": "Lista de Progresso",
1827
1848
  "category": "data",
1828
- "description": "Lista com barras de progresso, valores e percentuais. Exibe rankings de itens (top clientes, produtos, fornecedores, etc.) com barra proporcional ao valor.",
1849
+ "description": "Lista com barras de progresso, valores e percentuais. Exibe rankings de itens (top clientes, produtos, fornecedores, etc.) com barra proporcional ao valor. Suporta até 2 filtros dropdown internos para segmentação interativa dos dados.",
1829
1850
  "icon": "📊",
1830
1851
  "render": "ProgressListComponent",
1831
1852
  "defaultSize": { "width": 480, "height": 400 },
1832
- "llm_instruction": "Use widget_type='progress-list' para rankings com barra de progresso (ex: top clientes, top produtos, top cidades). OBRIGATÓRIO definir labelField (nome da categoria) e valueField (campo numérico). Os dados vêm da query SQL via query_id. NÃO use widget_type='kpi' ou 'panel' para este caso. Exemplo: { \"widget_type\": \"progress-list\", \"properties\": { \"labelField\": \"nomeFornecedor\", \"valueField\": \"valorTotal\", \"maxItems\": 10, \"valueFormat\": \"currency\", \"colorScheme\": \"gradient\" } }. IMPORTANTE: labelField e valueField devem corresponder EXATAMENTE aos aliases camelCase da query SQL.",
1853
+ "llm_instruction": "Use widget_type='progress-list' para rankings com barra de progresso (ex: top clientes, top produtos, top cidades). OBRIGATÓRIO definir labelField (nome da categoria) e valueField (campo numérico). Os dados vêm da query SQL via query_id. NÃO use widget_type='kpi' ou 'panel' para este caso.\n\nEXEMPLO BÁSICO:\n{ \"widget_type\": \"progress-list\", \"properties\": { \"labelField\": \"nomeFornecedor\", \"valueField\": \"valorTotal\", \"maxItems\": 10, \"valueFormat\": \"currency\", \"colorScheme\": \"gradient\" } }\n\nFILTROS INTERNOS (filter1 / filter2): Use para adicionar selects discretos dentro do widget que filtram os dados localmente (client-side) sem nova query ao banco. Cada filtro tem: sql (query para popular as opções), valueField (campo valor da opção), labelField (campo label da opção, padrão=valueField), filterField (campo nos dados principais a filtrar), label (texto do select).\n\nVARIÁVEIS NAS SQLs DE FILTRO: As mesmas variáveis da query principal estão disponíveis: ${startDate}, ${endDate}, ${empresaId}, ${companyFilter:alias}.\n\nEXEMPLO COM FILTROS:\n{ \"widget_type\": \"progress-list\", \"properties\": { \"labelField\": \"nomeCliente\", \"valueField\": \"valorVendas\", \"maxItems\": 15, \"valueFormat\": \"currency\", \"showInternalFilters\": true, \"filter1\": { \"label\": \"Filial\", \"sql\": \"SELECT filialId AS value, nomeFilial AS label FROM vw_filiais WHERE empresaId = ${empresaId} ORDER BY nomeFilial\", \"valueField\": \"value\", \"labelField\": \"label\", \"filterField\": \"filialId\" }, \"filter2\": { \"label\": \"Vendedor\", \"sql\": \"SELECT vendedorId AS value, nomeVendedor AS label FROM vw_vendedores WHERE empresaId = ${empresaId} ORDER BY nomeVendedor\", \"valueField\": \"value\", \"labelField\": \"label\", \"filterField\": \"vendedorId\" } } }\n\nIMPORTANTE: labelField, valueField e filterField devem corresponder EXATAMENTE aos aliases camelCase da query SQL. Quando filter1 ou filter2 estão definidos, showInternalFilters pode ser omitido (padrão true) ou definido como false para ocultar os filtros.",
1833
1854
  "properties": [
1834
1855
  "labelField",
1835
1856
  "valueField",
@@ -1842,8 +1863,50 @@
1842
1863
  "colorScheme",
1843
1864
  "primaryColor",
1844
1865
  "sortBy",
1845
- "sortOrder"
1846
- ]
1866
+ "sortOrder",
1867
+ "showInternalFilters",
1868
+ "filter1",
1869
+ "filter2"
1870
+ ],
1871
+ "propertiesDetailed": {
1872
+ "labelField": { "type": "string", "required": true, "description": "Campo da categoria/nome exibido em cada linha. Deve ser alias camelCase da query." },
1873
+ "valueField": { "type": "string", "required": true, "description": "Campo numérico para as barras de progresso. Deve ser alias camelCase da query." },
1874
+ "aggregation": { "type": "string", "required": false, "values": ["sum", "avg", "count", "min", "max"], "default": "sum" },
1875
+ "maxItems": { "type": "number", "required": false, "default": 10, "description": "Número máximo de itens exibidos." },
1876
+ "showValues": { "type": "boolean", "required": false, "default": true, "description": "Exibir valor numérico ao lado da barra." },
1877
+ "showPercentage": { "type": "boolean", "required": false, "default": false, "description": "Exibir percentual ao lado da barra." },
1878
+ "valueFormat": { "type": "string", "required": false, "values": ["number", "currency", "compact", "percentage"], "default": "number" },
1879
+ "barHeight": { "type": "number", "required": false, "default": 8, "description": "Altura em px das barras de progresso." },
1880
+ "colorScheme": { "type": "string", "required": false, "values": ["gradient", "single", "custom"], "default": "gradient" },
1881
+ "primaryColor": { "type": "string", "required": false, "description": "Cor primária em hex (usado quando colorScheme='single')." },
1882
+ "sortBy": { "type": "string", "required": false, "values": ["value", "label", "none"], "default": "value" },
1883
+ "sortOrder": { "type": "string", "required": false, "values": ["asc", "desc"], "default": "desc" },
1884
+ "showInternalFilters": { "type": "boolean", "required": false, "default": true, "description": "Exibir os selects de filtro interno. Padrão true quando filter1 ou filter2 estão definidos." },
1885
+ "filter1": {
1886
+ "type": "object",
1887
+ "required": false,
1888
+ "description": "Filtro dropdown interno 1. Popula opções via SQL e filtra dados localmente.",
1889
+ "fields": {
1890
+ "label": { "type": "string", "required": false, "description": "Texto do label do select (ex: 'Filial', 'Vendedor')." },
1891
+ "sql": { "type": "string", "required": true, "description": "SQL para popular as opções. Suporta ${startDate}, ${endDate}, ${empresaId}, ${companyFilter:alias}." },
1892
+ "valueField": { "type": "string", "required": true, "description": "Campo do resultado SQL que será o valor da opção (deve ser alias camelCase)." },
1893
+ "labelField": { "type": "string", "required": false, "description": "Campo do resultado SQL que será o texto da opção (padrão: igual a valueField)." },
1894
+ "filterField": { "type": "string", "required": true, "description": "Campo nos dados principais (rawData) pelo qual o filtro será aplicado (deve ser alias camelCase)." }
1895
+ }
1896
+ },
1897
+ "filter2": {
1898
+ "type": "object",
1899
+ "required": false,
1900
+ "description": "Filtro dropdown interno 2. Popula opções via SQL e filtra dados localmente.",
1901
+ "fields": {
1902
+ "label": { "type": "string", "required": false, "description": "Texto do label do select (ex: 'Filial', 'Vendedor')." },
1903
+ "sql": { "type": "string", "required": true, "description": "SQL para popular as opções. Suporta ${startDate}, ${endDate}, ${empresaId}, ${companyFilter:alias}." },
1904
+ "valueField": { "type": "string", "required": true, "description": "Campo do resultado SQL que será o valor da opção (deve ser alias camelCase)." },
1905
+ "labelField": { "type": "string", "required": false, "description": "Campo do resultado SQL que será o texto da opção (padrão: igual a valueField)." },
1906
+ "filterField": { "type": "string", "required": true, "description": "Campo nos dados principais (rawData) pelo qual o filtro será aplicado (deve ser alias camelCase)." }
1907
+ }
1908
+ }
1909
+ }
1847
1910
  },
1848
1911
  "treemap": {
1849
1912
  "name": "Treemap",
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wibi-global/sdk",
3
- "version": "0.1.1",
3
+ "version": "0.1.3",
4
4
  "type": "module",
5
5
  "main": "dist/sdk/src/index.js",
6
6
  "types": "dist/sdk/src/index.d.ts",
@@ -26,7 +26,7 @@
26
26
  "clean": "node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\""
27
27
  },
28
28
  "dependencies": {
29
- "@wibi-global/artifact-schema": "0.1.1"
29
+ "@wibi-global/artifact-schema": "0.1.3"
30
30
  },
31
31
  "publishConfig": {
32
32
  "access": "public"