drizzle-cube 0.10.0 → 0.11.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.
Files changed (334) hide show
  1. package/dist/adapters/ActivityGridChart.config-XMtoteb6.js +2 -0
  2. package/dist/adapters/ActivityGridChart.config-h1AXPvn0.cjs +1 -0
  3. package/dist/adapters/AreaChart.config-DYf9wufo.cjs +1 -0
  4. package/dist/adapters/AreaChart.config-We6b53aT.js +2 -0
  5. package/dist/adapters/BarChart.config-4SX44IYv.cjs +1 -0
  6. package/dist/adapters/BarChart.config-CwBnyptL.js +2 -0
  7. package/dist/adapters/BoxPlotChart.config-BzNe-FlW.cjs +1 -0
  8. package/dist/adapters/BoxPlotChart.config-mfAHqmcp.js +2 -0
  9. package/dist/adapters/BubbleChart.config-CBT5jMdc.cjs +1 -0
  10. package/dist/adapters/BubbleChart.config-DxG_Umal.js +2 -0
  11. package/dist/adapters/CandlestickChart.config-Cqw3XP1h.js +2 -0
  12. package/dist/adapters/CandlestickChart.config-DPSSlzUD.cjs +1 -0
  13. package/dist/adapters/DataTable.config-DS1bvaDu.js +2 -0
  14. package/dist/adapters/DataTable.config-D_NsMeyz.cjs +1 -0
  15. package/dist/adapters/DotStripChart.config-BApWn6QV.cjs +1 -0
  16. package/dist/adapters/DotStripChart.config-Bdk5-YfB.js +2 -0
  17. package/dist/adapters/FunnelChart.config-BT5up_Bg.cjs +1 -0
  18. package/dist/adapters/FunnelChart.config-ISZiz9fn.js +2 -0
  19. package/dist/adapters/GaugeChart.config-Biaq1cKc.cjs +1 -0
  20. package/dist/adapters/GaugeChart.config-BjGfB84t.js +2 -0
  21. package/dist/adapters/HeatMapChart.config-Bmca8KiH.cjs +1 -0
  22. package/dist/adapters/HeatMapChart.config-uWvR0B-N.js +2 -0
  23. package/dist/adapters/KpiDelta.config-CJeDdj_1.js +2 -0
  24. package/dist/adapters/KpiDelta.config-CKr9pAxL.cjs +1 -0
  25. package/dist/adapters/KpiNumber.config-6YLEF2fy.cjs +1 -0
  26. package/dist/adapters/KpiNumber.config-C00M46GA.js +2 -0
  27. package/dist/adapters/KpiText.config-C8Av_D2W.cjs +1 -0
  28. package/dist/adapters/KpiText.config-bKTHob0C.js +2 -0
  29. package/dist/adapters/LineChart.config-DH68HT_B.js +2 -0
  30. package/dist/adapters/LineChart.config-DPq7GvL9.cjs +1 -0
  31. package/dist/adapters/MarkdownChart.config-CaaJPO3c.js +2 -0
  32. package/dist/adapters/MarkdownChart.config-ca_UyhWJ.cjs +1 -0
  33. package/dist/adapters/MeasureProfileChart.config-C1Il0IqL.cjs +1 -0
  34. package/dist/adapters/MeasureProfileChart.config-DMOnkmb6.js +2 -0
  35. package/dist/adapters/PieChart.config-Bg-8cxWK.js +2 -0
  36. package/dist/adapters/PieChart.config-joJcF--K.cjs +1 -0
  37. package/dist/adapters/ProportionBarChart.config-B2sltKsI.cjs +1 -0
  38. package/dist/adapters/ProportionBarChart.config-BlCedy1v.js +2 -0
  39. package/dist/adapters/RadarChart.config-DD1pX6FZ.js +2 -0
  40. package/dist/adapters/RadarChart.config-DVCCLSVw.cjs +1 -0
  41. package/dist/adapters/RadialBarChart.config--VIE2jMM.js +2 -0
  42. package/dist/adapters/RadialBarChart.config-BZwyWhTg.cjs +1 -0
  43. package/dist/adapters/RecordsTable.config-CTBQc-2r.js +2 -0
  44. package/dist/adapters/RecordsTable.config-DPdO0DL5.cjs +1 -0
  45. package/dist/adapters/RetentionCombinedChart.config-PGVxnkRL.js +2 -0
  46. package/dist/adapters/RetentionCombinedChart.config-mX5PMh82.cjs +1 -0
  47. package/dist/adapters/RetentionHeatmap.config-Co-JMzBm.js +2 -0
  48. package/dist/adapters/RetentionHeatmap.config-Cub3-ksy.cjs +1 -0
  49. package/dist/adapters/SankeyChart.config-BkIyUcAE.cjs +1 -0
  50. package/dist/adapters/SankeyChart.config-DGTnRmYg.js +2 -0
  51. package/dist/adapters/ScatterChart.config-CdZrBorg.js +2 -0
  52. package/dist/adapters/ScatterChart.config-CwN9niUL.cjs +1 -0
  53. package/dist/adapters/SunburstChart.config-D0ZkRSJv.cjs +1 -0
  54. package/dist/adapters/SunburstChart.config-RF3uu5Sa.js +2 -0
  55. package/dist/adapters/TreeMapChart.config-B2Yn_V7p.cjs +1 -0
  56. package/dist/adapters/TreeMapChart.config-diJtcs4D.js +2 -0
  57. package/dist/adapters/WaterfallChart.config-B10PxftT.cjs +1 -0
  58. package/dist/adapters/WaterfallChart.config-BImlkLmR.js +2 -0
  59. package/dist/adapters/chartConfigHelpers-BhME7ow_.cjs +1 -0
  60. package/dist/adapters/{chartConfigHelpers-BsnbxA2c.js → chartConfigHelpers-BsviVhEw.js} +27 -7
  61. package/dist/adapters/compiler-B-yljK02.cjs +166 -0
  62. package/dist/adapters/{compiler-BKg3j2mm.js → compiler-BhityGUO.js} +1146 -1108
  63. package/dist/adapters/core/index.cjs +1 -1
  64. package/dist/adapters/core/index.js +1 -1
  65. package/dist/adapters/{core-JgUTMhxl.cjs → core-CQOrzBNh.cjs} +1 -1
  66. package/dist/adapters/{core-Bmb7XMBz.js → core-xZE0miIu.js} +2 -2
  67. package/dist/adapters/express/index.cjs +1 -1
  68. package/dist/adapters/express/index.js +5 -5
  69. package/dist/adapters/fastify/index.cjs +1 -1
  70. package/dist/adapters/fastify/index.js +23 -23
  71. package/dist/adapters/{handler-B1_zd-qo.js → handler-ByeQ0-1r.js} +238 -234
  72. package/dist/adapters/handler-DSNmfv1R.cjs +16 -0
  73. package/dist/adapters/hono/index.cjs +1 -1
  74. package/dist/adapters/hono/index.js +4 -4
  75. package/dist/adapters/mcp-app-html-CNp0VqS_.cjs +1 -0
  76. package/dist/adapters/mcp-app-html-CvWoYMO3.js +5 -0
  77. package/dist/adapters/mcp-app-html.cjs +1 -1
  78. package/dist/adapters/mcp-app-html.js +1 -1
  79. package/dist/adapters/mcp-tools.cjs +1 -1
  80. package/dist/adapters/mcp-tools.js +3 -3
  81. package/dist/adapters/{mcp-transport-BTmAXLo8.js → mcp-transport-Cy6n4uj1.js} +1 -1
  82. package/dist/adapters/{mcp-transport-DzxluRyH.cjs → mcp-transport-DnLP5FPL.cjs} +1 -1
  83. package/dist/adapters/nextjs/index.cjs +1 -1
  84. package/dist/adapters/nextjs/index.js +5 -5
  85. package/dist/adapters/{openai-Br__Bn2t.cjs → openai-BQl0yJCS.cjs} +2 -2
  86. package/dist/adapters/{openai-BpcMIv4e.js → openai-C4HrjyJj.js} +1 -1
  87. package/dist/adapters/{openai-yfJF-3Rv.js → openai-D3Nt6Bj7.js} +3 -3
  88. package/dist/adapters/{openai-C32tey5N.cjs → openai-z1ai-G4Q.cjs} +1 -1
  89. package/dist/adapters/{utils-i2h5cwI3.js → utils-BaxFceDq.js} +1070 -937
  90. package/dist/adapters/utils-a2p2B6x8.cjs +141 -0
  91. package/dist/adapters/utils.cjs +1 -1
  92. package/dist/adapters/utils.js +1 -1
  93. package/dist/cjs/client/charts/chartConfigHelpers.d.ts +5 -0
  94. package/dist/cjs/client/components/DashboardFilters/useCompactFilterBar.d.ts +5 -0
  95. package/dist/cjs/client/components/analyticsPortlet/usePortletQueryResults.d.ts +3 -1
  96. package/dist/cjs/client/components/dashboardPortletCard/PortletCardHeader.d.ts +2 -0
  97. package/dist/cjs/client/hooks/queries/useCubeLoadQuery.d.ts +7 -0
  98. package/dist/cjs/client/hooks/queries/useMultiCubeLoadQuery.d.ts +7 -0
  99. package/dist/cjs/client/hooks/useAnalysisQuery.d.ts +6 -1
  100. package/dist/cjs/client/index.d.ts +2 -0
  101. package/dist/cjs/client/types.d.ts +3 -0
  102. package/dist/cjs/client/utils/filterUtils.d.ts +30 -0
  103. package/dist/cjs/client/utils/gapFilling.d.ts +52 -0
  104. package/dist/cjs/client/utils/index.d.ts +1 -0
  105. package/dist/cjs/client/utils/joinReachability.d.ts +1 -0
  106. package/dist/cjs/server/ai/query-schema.d.ts +8 -3
  107. package/dist/cjs/server/builders/date-time-builder.d.ts +1 -1
  108. package/dist/cjs/server/builders/date-time-helpers.d.ts +2 -0
  109. package/dist/cjs/server/builders/filter-builder.d.ts +1 -1
  110. package/dist/cjs/server/builders/in-date-range-validation.d.ts +25 -0
  111. package/dist/cjs/server/execution/result-post-processor.d.ts +4 -2
  112. package/dist/cjs/server/executor.d.ts +2 -0
  113. package/dist/cjs/server/gap-filler.d.ts +8 -43
  114. package/dist/cjs/server/types/core.d.ts +2 -0
  115. package/dist/cjs/server/types/cube.d.ts +12 -0
  116. package/dist/cjs/server/types/metadata.d.ts +5 -0
  117. package/dist/cjs/server/types/query.d.ts +2 -1
  118. package/dist/client/charts/chartConfigHelpers.d.ts +5 -0
  119. package/dist/client/charts.js +12 -12
  120. package/dist/client/chunks/{DashboardEditModal-P-HUNrcp.js → DashboardEditModal-CIR4aqr7.js} +2424 -2559
  121. package/dist/client/chunks/DashboardEditModal-CIR4aqr7.js.map +1 -0
  122. package/dist/client/chunks/{DotStripChart-in6QHc0b.js → DotStripChart-B9IVCFPO.js} +3 -3
  123. package/dist/client/chunks/{DotStripChart-in6QHc0b.js.map → DotStripChart-B9IVCFPO.js.map} +1 -1
  124. package/dist/client/chunks/{ProportionBarChart-CjuOm7NT.js → ProportionBarChart-DieF9AzP.js} +3 -3
  125. package/dist/client/chunks/{ProportionBarChart-CjuOm7NT.js.map → ProportionBarChart-DieF9AzP.js.map} +1 -1
  126. package/dist/client/chunks/{RecordsTable-CXXsiaV1.js → RecordsTable-Mo3ai5_M.js} +4 -4
  127. package/dist/client/chunks/{RecordsTable-CXXsiaV1.js.map → RecordsTable-Mo3ai5_M.js.map} +1 -1
  128. package/dist/client/chunks/{RetentionCombinedChart-DFCeEFkx.js → RetentionCombinedChart-Bie4ADyA.js} +3 -3
  129. package/dist/client/chunks/{RetentionCombinedChart-DFCeEFkx.js.map → RetentionCombinedChart-Bie4ADyA.js.map} +1 -1
  130. package/dist/client/chunks/{RetentionHeatmap-jpshJ2Af.js → RetentionHeatmap-qstIAx5B.js} +2 -2
  131. package/dist/client/chunks/{RetentionHeatmap-jpshJ2Af.js.map → RetentionHeatmap-qstIAx5B.js.map} +1 -1
  132. package/dist/client/chunks/{af-ZA-C0dGb_53.js → af-ZA-BglLInx4.js} +13 -1
  133. package/dist/client/chunks/{af-ZA-C0dGb_53.js.map → af-ZA-BglLInx4.js.map} +1 -1
  134. package/dist/client/chunks/{analysis-builder-CRghdHVl.js → analysis-builder-DJNYt7CF.js} +41 -41
  135. package/dist/client/chunks/{analysis-builder-CRghdHVl.js.map → analysis-builder-DJNYt7CF.js.map} +1 -1
  136. package/dist/client/chunks/{analysis-builder-shared-DBSxWIj8.js → analysis-builder-shared-DPLR8upd.js} +487 -483
  137. package/dist/client/chunks/analysis-builder-shared-DPLR8upd.js.map +1 -0
  138. package/dist/client/chunks/{chart-activity-grid-DGazwi4C.js → chart-activity-grid-Ly_-2B-f.js} +22 -4
  139. package/dist/client/chunks/chart-activity-grid-Ly_-2B-f.js.map +1 -0
  140. package/dist/client/chunks/{chart-area-zyLGD-ym.js → chart-area-D3l-71Wy.js} +2 -2
  141. package/dist/client/chunks/{chart-area-zyLGD-ym.js.map → chart-area-D3l-71Wy.js.map} +1 -1
  142. package/dist/client/chunks/{chart-bar-DMCBq8qJ.js → chart-bar-BaTyQOqs.js} +3 -3
  143. package/dist/client/chunks/{chart-bar-DMCBq8qJ.js.map → chart-bar-BaTyQOqs.js.map} +1 -1
  144. package/dist/client/chunks/{chart-box-plot-5Z55A-it.js → chart-box-plot-Cem6PHjz.js} +2 -2
  145. package/dist/client/chunks/{chart-box-plot-5Z55A-it.js.map → chart-box-plot-Cem6PHjz.js.map} +1 -1
  146. package/dist/client/chunks/{chart-bubble-YD28dX8w.js → chart-bubble-DFlfqCDG.js} +2 -2
  147. package/dist/client/chunks/{chart-bubble-YD28dX8w.js.map → chart-bubble-DFlfqCDG.js.map} +1 -1
  148. package/dist/client/chunks/{chart-candlestick-BUMpBI08.js → chart-candlestick-BkAFBXtZ.js} +2 -2
  149. package/dist/client/chunks/{chart-candlestick-BUMpBI08.js.map → chart-candlestick-BkAFBXtZ.js.map} +1 -1
  150. package/dist/client/chunks/{chart-config-area-DsrZCIwF.js → chart-config-area-BnsRQ-MY.js} +35 -14
  151. package/dist/client/chunks/chart-config-area-BnsRQ-MY.js.map +1 -0
  152. package/dist/client/chunks/{chart-config-bar-BixSs43E.js → chart-config-bar-G2HJJBVV.js} +8 -7
  153. package/dist/client/chunks/chart-config-bar-G2HJJBVV.js.map +1 -0
  154. package/dist/client/chunks/{chart-config-kpi-delta-Cl7k6jTj.js → chart-config-kpi-delta-BIAq1Ftg.js} +2 -2
  155. package/dist/client/chunks/{chart-config-kpi-delta-Cl7k6jTj.js.map → chart-config-kpi-delta-BIAq1Ftg.js.map} +1 -1
  156. package/dist/client/chunks/{chart-config-kpi-number-DCcnANWC.js → chart-config-kpi-number-Dgc4gIYu.js} +2 -2
  157. package/dist/client/chunks/{chart-config-kpi-number-DCcnANWC.js.map → chart-config-kpi-number-Dgc4gIYu.js.map} +1 -1
  158. package/dist/client/chunks/{chart-config-line-CBF9Px9b.js → chart-config-line-DLkRs1Zr.js} +9 -8
  159. package/dist/client/chunks/chart-config-line-DLkRs1Zr.js.map +1 -0
  160. package/dist/client/chunks/{chart-config-pie-DZLa6Eqm.js → chart-config-pie-XrHim0C8.js} +2 -2
  161. package/dist/client/chunks/{chart-config-pie-DZLa6Eqm.js.map → chart-config-pie-XrHim0C8.js.map} +1 -1
  162. package/dist/client/chunks/{chart-config-radar-DR6vHHyd.js → chart-config-radar-xNS6Juqc.js} +2 -2
  163. package/dist/client/chunks/{chart-config-radar-DR6vHHyd.js.map → chart-config-radar-xNS6Juqc.js.map} +1 -1
  164. package/dist/client/chunks/{chart-config-radial-bar-DVFou4fB.js → chart-config-radial-bar-ChUChsEe.js} +2 -2
  165. package/dist/client/chunks/{chart-config-radial-bar-DVFou4fB.js.map → chart-config-radial-bar-ChUChsEe.js.map} +1 -1
  166. package/dist/client/chunks/{chart-config-tree-map-Uhise6Bx.js → chart-config-tree-map-CnrJ7OC1.js} +2 -2
  167. package/dist/client/chunks/{chart-config-tree-map-Uhise6Bx.js.map → chart-config-tree-map-CnrJ7OC1.js.map} +1 -1
  168. package/dist/client/chunks/{chart-data-table-BdMo3zVh.js → chart-data-table-Cxd0cdAl.js} +36 -36
  169. package/dist/client/chunks/{chart-data-table-BdMo3zVh.js.map → chart-data-table-Cxd0cdAl.js.map} +1 -1
  170. package/dist/client/chunks/{chart-funnel-BRyZS6ie.js → chart-funnel-71Kn4eeF.js} +2 -2
  171. package/dist/client/chunks/{chart-funnel-BRyZS6ie.js.map → chart-funnel-71Kn4eeF.js.map} +1 -1
  172. package/dist/client/chunks/{chart-gauge-DxgHlZKp.js → chart-gauge-BddS_9oS.js} +3 -3
  173. package/dist/client/chunks/{chart-gauge-DxgHlZKp.js.map → chart-gauge-BddS_9oS.js.map} +1 -1
  174. package/dist/client/chunks/{chart-heat-map-5jHm3f-V.js → chart-heat-map-BQIsrn8m.js} +3 -3
  175. package/dist/client/chunks/{chart-heat-map-5jHm3f-V.js.map → chart-heat-map-BQIsrn8m.js.map} +1 -1
  176. package/dist/client/chunks/{chart-kpi-delta-C84P-mwu.js → chart-kpi-delta-DndbqdZT.js} +3 -3
  177. package/dist/client/chunks/{chart-kpi-delta-C84P-mwu.js.map → chart-kpi-delta-DndbqdZT.js.map} +1 -1
  178. package/dist/client/chunks/{chart-kpi-number-D9GqtBWw.js → chart-kpi-number-DAbfoHMt.js} +5 -5
  179. package/dist/client/chunks/{chart-kpi-number-D9GqtBWw.js.map → chart-kpi-number-DAbfoHMt.js.map} +1 -1
  180. package/dist/client/chunks/{chart-kpi-text-D3HqxXzU.js → chart-kpi-text-D8oQgpxL.js} +3 -3
  181. package/dist/client/chunks/{chart-kpi-text-D3HqxXzU.js.map → chart-kpi-text-D8oQgpxL.js.map} +1 -1
  182. package/dist/client/chunks/{chart-line-IEgiF8Nv.js → chart-line-BNqjUowg.js} +3 -3
  183. package/dist/client/chunks/{chart-line-IEgiF8Nv.js.map → chart-line-BNqjUowg.js.map} +1 -1
  184. package/dist/client/chunks/{chart-markdown-B_2Ed7FJ.js → chart-markdown-DtgpU3xd.js} +2 -2
  185. package/dist/client/chunks/{chart-markdown-B_2Ed7FJ.js.map → chart-markdown-DtgpU3xd.js.map} +1 -1
  186. package/dist/client/chunks/{chart-measure-profile-CWsPrQhH.js → chart-measure-profile-D5nZMWlI.js} +3 -3
  187. package/dist/client/chunks/{chart-measure-profile-CWsPrQhH.js.map → chart-measure-profile-D5nZMWlI.js.map} +1 -1
  188. package/dist/client/chunks/{chart-pie-BEB2sCXF.js → chart-pie-D8r9HCZ4.js} +3 -3
  189. package/dist/client/chunks/{chart-pie-BEB2sCXF.js.map → chart-pie-D8r9HCZ4.js.map} +1 -1
  190. package/dist/client/chunks/{chart-radar-BbSbXKbP.js → chart-radar-R4PuCIWp.js} +3 -3
  191. package/dist/client/chunks/{chart-radar-BbSbXKbP.js.map → chart-radar-R4PuCIWp.js.map} +1 -1
  192. package/dist/client/chunks/{chart-radial-bar-CNYD7tkM.js → chart-radial-bar-hmrSFa6O.js} +3 -3
  193. package/dist/client/chunks/{chart-radial-bar-CNYD7tkM.js.map → chart-radial-bar-hmrSFa6O.js.map} +1 -1
  194. package/dist/client/chunks/{chart-sankey-DKnTIvSr.js → chart-sankey-CFXPybny.js} +2 -2
  195. package/dist/client/chunks/{chart-sankey-DKnTIvSr.js.map → chart-sankey-CFXPybny.js.map} +1 -1
  196. package/dist/client/chunks/{chart-scatter-CSWF6-lx.js → chart-scatter-CH82md0L.js} +3 -3
  197. package/dist/client/chunks/{chart-scatter-CSWF6-lx.js.map → chart-scatter-CH82md0L.js.map} +1 -1
  198. package/dist/client/chunks/{chart-sunburst-CdGzCq7q.js → chart-sunburst-CTj95eEC.js} +3 -3
  199. package/dist/client/chunks/{chart-sunburst-CdGzCq7q.js.map → chart-sunburst-CTj95eEC.js.map} +1 -1
  200. package/dist/client/chunks/{chart-tree-map-BiXB7EiM.js → chart-tree-map-CmysE4bF.js} +3 -3
  201. package/dist/client/chunks/{chart-tree-map-BiXB7EiM.js.map → chart-tree-map-CmysE4bF.js.map} +1 -1
  202. package/dist/client/chunks/{chart-waterfall-5rSDeLEZ.js → chart-waterfall-Bv1mPvlB.js} +3 -3
  203. package/dist/client/chunks/{chart-waterfall-5rSDeLEZ.js.map → chart-waterfall-Bv1mPvlB.js.map} +1 -1
  204. package/dist/client/chunks/{charts-core-CKpkoMCa.js → charts-core-BdEQgbqN.js} +2 -2
  205. package/dist/client/chunks/{charts-core-CKpkoMCa.js.map → charts-core-BdEQgbqN.js.map} +1 -1
  206. package/dist/client/chunks/charts-loader-DoLQqFXg.js +87 -0
  207. package/dist/client/chunks/{charts-loader-BTI0UPK4.js.map → charts-loader-DoLQqFXg.js.map} +1 -1
  208. package/dist/client/chunks/gapFilling-DKBRHcQL.js +391 -0
  209. package/dist/client/chunks/gapFilling-DKBRHcQL.js.map +1 -0
  210. package/dist/client/chunks/{nl-NL-kRjxedTf.js → nl-NL-DVZXf8U7.js} +20 -2
  211. package/dist/client/chunks/nl-NL-DVZXf8U7.js.map +1 -0
  212. package/dist/client/chunks/{schema-visualization-BbvL74Sf.js → schema-visualization-MlRrcJQH.js} +3 -3
  213. package/dist/client/chunks/{schema-visualization-BbvL74Sf.js.map → schema-visualization-MlRrcJQH.js.map} +1 -1
  214. package/dist/client/chunks/{useDirtyStateTracking-BfG1lX_3.js → useDirtyStateTracking-DSkxAJ29.js} +317 -292
  215. package/dist/client/chunks/useDirtyStateTracking-DSkxAJ29.js.map +1 -0
  216. package/dist/client/chunks/{useExplainAI-CDFhgmpE.js → useExplainAI-DRCIVcbu.js} +4 -4
  217. package/dist/client/chunks/{useExplainAI-CDFhgmpE.js.map → useExplainAI-DRCIVcbu.js.map} +1 -1
  218. package/dist/client/chunks/utils-CToHkuhU.js.map +1 -1
  219. package/dist/client/chunks/{vendor-DeckzF1j.js → vendor-BfBpNmMa.js} +2 -2
  220. package/dist/client/chunks/{vendor-DeckzF1j.js.map → vendor-BfBpNmMa.js.map} +1 -1
  221. package/dist/client/components/DashboardFilters/useCompactFilterBar.d.ts +5 -0
  222. package/dist/client/components/analyticsPortlet/usePortletQueryResults.d.ts +3 -1
  223. package/dist/client/components/dashboardPortletCard/PortletCardHeader.d.ts +2 -0
  224. package/dist/client/components.js +2 -2
  225. package/dist/client/hooks/queries/useCubeLoadQuery.d.ts +7 -0
  226. package/dist/client/hooks/queries/useMultiCubeLoadQuery.d.ts +7 -0
  227. package/dist/client/hooks/useAnalysisQuery.d.ts +6 -1
  228. package/dist/client/hooks.js +3 -3
  229. package/dist/client/icons.js +1 -1
  230. package/dist/client/index.d.ts +2 -0
  231. package/dist/client/index.js +193 -192
  232. package/dist/client/index.js.map +1 -1
  233. package/dist/client/providers.js +1 -1
  234. package/dist/client/schema.js +1 -1
  235. package/dist/client/types.d.ts +3 -0
  236. package/dist/client/utils/filterUtils.d.ts +30 -0
  237. package/dist/client/utils/gapFilling.d.ts +52 -0
  238. package/dist/client/utils/index.d.ts +1 -0
  239. package/dist/client/utils/joinReachability.d.ts +1 -0
  240. package/dist/client/utils.js +9 -8
  241. package/dist/client/utils.js.map +1 -1
  242. package/dist/client-bundle-stats.html +1 -1
  243. package/dist/mcp-app/mcp-app.html +103 -103
  244. package/dist/server/ai/query-schema.d.ts +8 -3
  245. package/dist/server/builders/date-time-builder.d.ts +1 -1
  246. package/dist/server/builders/date-time-helpers.d.ts +2 -0
  247. package/dist/server/builders/filter-builder.d.ts +1 -1
  248. package/dist/server/builders/in-date-range-validation.d.ts +25 -0
  249. package/dist/server/chartConfigHelpers-BhME7ow_.cjs +1 -0
  250. package/dist/server/{chartConfigHelpers-BsnbxA2c.js → chartConfigHelpers-BsviVhEw.js} +27 -7
  251. package/dist/server/execution/result-post-processor.d.ts +4 -2
  252. package/dist/server/executor.d.ts +2 -0
  253. package/dist/server/gap-filler.d.ts +8 -43
  254. package/dist/server/index.cjs +49 -47
  255. package/dist/server/index.js +2114 -1955
  256. package/dist/server/types/core.d.ts +2 -0
  257. package/dist/server/types/cube.d.ts +12 -0
  258. package/dist/server/types/metadata.d.ts +5 -0
  259. package/dist/server/types/query.d.ts +2 -1
  260. package/package.json +2 -1
  261. package/dist/adapters/ActivityGridChart.config-BW77mjsu.cjs +0 -1
  262. package/dist/adapters/ActivityGridChart.config-DQRnTU6e.js +0 -2
  263. package/dist/adapters/AreaChart.config-DbvLVr-Y.cjs +0 -1
  264. package/dist/adapters/AreaChart.config-JbVNmary.js +0 -2
  265. package/dist/adapters/BarChart.config-Bkpwgqbk.js +0 -2
  266. package/dist/adapters/BarChart.config-jgDE3NUv.cjs +0 -1
  267. package/dist/adapters/BoxPlotChart.config-9wKKOZfN.cjs +0 -1
  268. package/dist/adapters/BoxPlotChart.config-Di99sPNJ.js +0 -2
  269. package/dist/adapters/BubbleChart.config-Cdg9nPFz.js +0 -2
  270. package/dist/adapters/BubbleChart.config-CwDXzdxC.cjs +0 -1
  271. package/dist/adapters/CandlestickChart.config-B45GmJYV.js +0 -2
  272. package/dist/adapters/CandlestickChart.config-C8BXzmbD.cjs +0 -1
  273. package/dist/adapters/DataTable.config-c-24M_qU.cjs +0 -1
  274. package/dist/adapters/DataTable.config-fic2OroS.js +0 -2
  275. package/dist/adapters/DotStripChart.config-BcNT3Les.cjs +0 -1
  276. package/dist/adapters/DotStripChart.config-Cqmgw5_z.js +0 -2
  277. package/dist/adapters/FunnelChart.config-D1E5zSay.cjs +0 -1
  278. package/dist/adapters/FunnelChart.config-DPjSoYex.js +0 -2
  279. package/dist/adapters/GaugeChart.config-BDcvnYln.js +0 -2
  280. package/dist/adapters/GaugeChart.config-DQnx37Jf.cjs +0 -1
  281. package/dist/adapters/HeatMapChart.config-BWd863ik.js +0 -2
  282. package/dist/adapters/HeatMapChart.config-HEbSm_Zt.cjs +0 -1
  283. package/dist/adapters/KpiDelta.config-Bj3kfmWv.js +0 -2
  284. package/dist/adapters/KpiDelta.config-CaLnl2w_.cjs +0 -1
  285. package/dist/adapters/KpiNumber.config-Da9HxGT8.cjs +0 -1
  286. package/dist/adapters/KpiNumber.config-n4SwHHlD.js +0 -2
  287. package/dist/adapters/KpiText.config-8VzcnlPF.cjs +0 -1
  288. package/dist/adapters/KpiText.config-CItv_gG6.js +0 -2
  289. package/dist/adapters/LineChart.config-DQ7nHYrr.js +0 -2
  290. package/dist/adapters/LineChart.config-_98RmRA_.cjs +0 -1
  291. package/dist/adapters/MarkdownChart.config-BpbqJDoz.cjs +0 -1
  292. package/dist/adapters/MarkdownChart.config-Dz7KZ621.js +0 -2
  293. package/dist/adapters/MeasureProfileChart.config-BTCTP7L0.js +0 -2
  294. package/dist/adapters/MeasureProfileChart.config-DzPxIxB5.cjs +0 -1
  295. package/dist/adapters/PieChart.config-BhjlnVFv.js +0 -2
  296. package/dist/adapters/PieChart.config-DJlGNsBY.cjs +0 -1
  297. package/dist/adapters/ProportionBarChart.config-Byp_8diR.cjs +0 -1
  298. package/dist/adapters/ProportionBarChart.config-RyjNhw3T.js +0 -2
  299. package/dist/adapters/RadarChart.config-BWdv4uyp.js +0 -2
  300. package/dist/adapters/RadarChart.config-kW4oIVi4.cjs +0 -1
  301. package/dist/adapters/RadialBarChart.config-CFYPoRQY.cjs +0 -1
  302. package/dist/adapters/RadialBarChart.config-D2-_-Z64.js +0 -2
  303. package/dist/adapters/RecordsTable.config-B7KFt3kd.cjs +0 -1
  304. package/dist/adapters/RecordsTable.config-S_aiXGKe.js +0 -2
  305. package/dist/adapters/RetentionCombinedChart.config-CVGWozL3.js +0 -2
  306. package/dist/adapters/RetentionCombinedChart.config-Cd0pTdHY.cjs +0 -1
  307. package/dist/adapters/RetentionHeatmap.config-BNqtWFjQ.js +0 -2
  308. package/dist/adapters/RetentionHeatmap.config-CMi1h_5M.cjs +0 -1
  309. package/dist/adapters/SankeyChart.config-COIfx3Ua.cjs +0 -1
  310. package/dist/adapters/SankeyChart.config-DIh4nEk2.js +0 -2
  311. package/dist/adapters/ScatterChart.config-CrSQhlT4.js +0 -2
  312. package/dist/adapters/ScatterChart.config-DRgg-HAm.cjs +0 -1
  313. package/dist/adapters/SunburstChart.config-08-ufQaK.cjs +0 -1
  314. package/dist/adapters/SunburstChart.config-DmNgAJrO.js +0 -2
  315. package/dist/adapters/TreeMapChart.config-7k2repRB.cjs +0 -1
  316. package/dist/adapters/TreeMapChart.config-C3vzB2dD.js +0 -2
  317. package/dist/adapters/WaterfallChart.config-AV2pHgrb.js +0 -2
  318. package/dist/adapters/WaterfallChart.config-USpcvapo.cjs +0 -1
  319. package/dist/adapters/chartConfigHelpers-BZMu_1EP.cjs +0 -1
  320. package/dist/adapters/compiler-BX6Ug_Uq.cjs +0 -166
  321. package/dist/adapters/handler-CfZt5W8b.cjs +0 -16
  322. package/dist/adapters/mcp-app-html-BNg78ecJ.js +0 -5
  323. package/dist/adapters/mcp-app-html-N18EJEvv.cjs +0 -1
  324. package/dist/adapters/utils-Du_UZbn5.cjs +0 -139
  325. package/dist/client/chunks/DashboardEditModal-P-HUNrcp.js.map +0 -1
  326. package/dist/client/chunks/analysis-builder-shared-DBSxWIj8.js.map +0 -1
  327. package/dist/client/chunks/chart-activity-grid-DGazwi4C.js.map +0 -1
  328. package/dist/client/chunks/chart-config-area-DsrZCIwF.js.map +0 -1
  329. package/dist/client/chunks/chart-config-bar-BixSs43E.js.map +0 -1
  330. package/dist/client/chunks/chart-config-line-CBF9Px9b.js.map +0 -1
  331. package/dist/client/chunks/charts-loader-BTI0UPK4.js +0 -87
  332. package/dist/client/chunks/nl-NL-kRjxedTf.js.map +0 -1
  333. package/dist/client/chunks/useDirtyStateTracking-BfG1lX_3.js.map +0 -1
  334. package/dist/server/chartConfigHelpers-BZMu_1EP.cjs +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gapFilling-DKBRHcQL.js","names":["parseDateRange","startOfNow","start","now","endOfNow","end","FIXED_RANGES","utcDate","mondayOffset","utcDay","utcYear","utcMonth","quarter","lastMondayOffset","currentQuarter","lastQuarter","year","PATTERN_RANGES","days","weeks","months","quarters","years","startOfWeek","FORWARD_RANGES","ctx","nextQuarterStartMonth","parseRelativeDateRange","lowerRange","dateRange","fixed","match","re","build","parseDateRange$1","formatDateForCube","date","calculatePriorPeriod","periodLengthMs","currentEnd","currentStart","periodLengthDays","priorEnd","priorStart","MAX_GAP_FILL_BUCKETS","generateTimeBuckets","buckets","current","alignToGranularity","startDate","granularity","endDate","incrementByGranularity","aligned","dayOfWeek","daysToMonday","quarterMonth","next","normalizeDateKey","value","parsed","createDimensionGroupKey","dimensions","row","dim","fillTimeSeriesGaps","config","timeBuckets","data","timeDimensionKey","dimensionGroups","groupRowsForGapFill","result","_groupKey","timeMap","sampleRow","bucket","bucketKey","existingRow","buildFilledRow","groupKey","timeKey","filledRow","measure","measures","fillValue","parseDateRange","relative","applyGapFilling","query","timeDimensionsToFill","hasGranularity","td","hasDateRange","findDateRangeFilter","shouldFill","timeDimensionKeys","regularDimensions","d","timeDim","resolveDateRangeFromFilter","filters","filter","dimensionKey","found","fromDateRange","values","resultQuery","response","resultSet","fillChartRows","rows","chartSetting","options","annotation","withChartGapFilling","fill","raw","table","series"],"sources":["../../../src/shared/date-utils.ts","../../../src/shared/gap-filler.ts","../../../src/client/utils/gapFilling.ts"],"sourcesContent":["/**\n * Shared date range parsing utilities\n * Used by both server (DateTimeBuilder) and client (comparison feature)\n *\n * These utilities handle:\n * - Relative date range parsing (today, yesterday, last 7 days, this month, etc.)\n * - Prior period calculation for comparison features\n * - Date formatting for cube queries\n */\n\ntype DateRange = { start: Date; end: Date }\ntype RelativeRangeHandler = (ctx: RelativeRangeContext) => DateRange\n\ninterface RelativeRangeContext {\n now: Date\n utcYear: number\n utcMonth: number\n utcDate: number\n utcDay: number\n}\n\nconst startOfNow = (now: Date): Date => {\n const start = new Date(now)\n start.setUTCHours(0, 0, 0, 0)\n return start\n}\n\nconst endOfNow = (now: Date): Date => {\n const end = new Date(now)\n end.setUTCHours(23, 59, 59, 999)\n return end\n}\n\n/** Fixed (non-parameterised) relative-range expressions. */\nconst FIXED_RANGES: Record<string, RelativeRangeHandler> = {\n today: ({ now }) => ({ start: startOfNow(now), end: endOfNow(now) }),\n\n yesterday: ({ now, utcDate }) => {\n const start = new Date(now)\n start.setUTCDate(utcDate - 1)\n start.setUTCHours(0, 0, 0, 0)\n const end = new Date(now)\n end.setUTCDate(utcDate - 1)\n end.setUTCHours(23, 59, 59, 999)\n return { start, end }\n },\n\n 'this week': ({ now, utcDate, utcDay }) => {\n const mondayOffset = utcDay === 0 ? -6 : 1 - utcDay // If Sunday, go back 6 days, otherwise go to Monday\n const start = new Date(now)\n start.setUTCDate(utcDate + mondayOffset)\n start.setUTCHours(0, 0, 0, 0)\n const end = new Date(start)\n end.setUTCDate(start.getUTCDate() + 6) // Sunday\n end.setUTCHours(23, 59, 59, 999)\n return { start, end }\n },\n\n 'this month': ({ utcYear, utcMonth }) => ({\n start: new Date(Date.UTC(utcYear, utcMonth, 1, 0, 0, 0, 0)),\n end: new Date(Date.UTC(utcYear, utcMonth + 1, 0, 23, 59, 59, 999))\n }),\n\n 'this quarter': ({ utcYear, utcMonth }) => {\n const quarter = Math.floor(utcMonth / 3)\n return {\n start: new Date(Date.UTC(utcYear, quarter * 3, 1, 0, 0, 0, 0)),\n end: new Date(Date.UTC(utcYear, quarter * 3 + 3, 0, 23, 59, 59, 999))\n }\n },\n\n 'this year': ({ utcYear }) => ({\n start: new Date(Date.UTC(utcYear, 0, 1, 0, 0, 0, 0)),\n end: new Date(Date.UTC(utcYear, 11, 31, 23, 59, 59, 999))\n }),\n\n 'last week': ({ now, utcDate, utcDay }) => {\n const lastMondayOffset = utcDay === 0 ? -13 : -6 - utcDay // Go to previous Monday\n const start = new Date(now)\n start.setUTCDate(utcDate + lastMondayOffset)\n start.setUTCHours(0, 0, 0, 0)\n const end = new Date(start)\n end.setUTCDate(start.getUTCDate() + 6) // Previous Sunday\n end.setUTCHours(23, 59, 59, 999)\n return { start, end }\n },\n\n 'last month': ({ utcYear, utcMonth }) => ({\n start: new Date(Date.UTC(utcYear, utcMonth - 1, 1, 0, 0, 0, 0)),\n end: new Date(Date.UTC(utcYear, utcMonth, 0, 23, 59, 59, 999))\n }),\n\n 'last quarter': ({ utcYear, utcMonth }) => {\n const currentQuarter = Math.floor(utcMonth / 3)\n const lastQuarter = currentQuarter === 0 ? 3 : currentQuarter - 1\n const year = currentQuarter === 0 ? utcYear - 1 : utcYear\n return {\n start: new Date(Date.UTC(year, lastQuarter * 3, 1, 0, 0, 0, 0)),\n end: new Date(Date.UTC(year, lastQuarter * 3 + 3, 0, 23, 59, 59, 999))\n }\n },\n\n 'last year': ({ utcYear }) => ({\n start: new Date(Date.UTC(utcYear - 1, 0, 1, 0, 0, 0, 0)),\n end: new Date(Date.UTC(utcYear - 1, 11, 31, 23, 59, 59, 999))\n }),\n\n 'last 12 months': ({ now, utcYear, utcMonth }) => ({\n start: new Date(Date.UTC(utcYear, utcMonth - 11, 1, 0, 0, 0, 0)),\n end: endOfNow(now)\n })\n}\n\n/** Parameterised (regex-matched) relative-range expressions. */\nconst PATTERN_RANGES: Array<{\n re: RegExp\n build: (n: number, ctx: RelativeRangeContext) => DateRange\n}> = [\n {\n re: /^last\\s+(\\d+)\\s+days?$/,\n build: (days, { now, utcDate }) => {\n const start = new Date(now)\n start.setUTCDate(utcDate - days + 1) // Include today in the count\n start.setUTCHours(0, 0, 0, 0)\n return { start, end: endOfNow(now) }\n }\n },\n {\n re: /^last\\s+(\\d+)\\s+weeks?$/,\n build: (weeks, { now, utcDate }) => {\n const start = new Date(now)\n start.setUTCDate(utcDate - weeks * 7 + 1) // Include today in the count\n start.setUTCHours(0, 0, 0, 0)\n return { start, end: endOfNow(now) }\n }\n },\n {\n re: /^last\\s+(\\d+)\\s+months?$/,\n build: (months, { now, utcYear, utcMonth }) => ({\n start: new Date(Date.UTC(utcYear, utcMonth - months + 1, 1, 0, 0, 0, 0)),\n end: endOfNow(now)\n })\n },\n {\n // Like \"last N months\": includes the current quarter\n re: /^last\\s+(\\d+)\\s+quarters?$/,\n build: (quarters, { now, utcYear, utcMonth }) => ({\n start: new Date(Date.UTC(utcYear, (Math.floor(utcMonth / 3) - quarters + 1) * 3, 1, 0, 0, 0, 0)),\n end: endOfNow(now)\n })\n },\n {\n re: /^last\\s+(\\d+)\\s+years?$/,\n build: (years, { now, utcYear }) => ({\n start: new Date(Date.UTC(utcYear - years, 0, 1, 0, 0, 0, 0)),\n end: endOfNow(now)\n })\n }\n]\n\n/** First Monday of the week containing `now` (UTC), at midnight. */\nconst startOfWeek = ({ now, utcDate, utcDay }: RelativeRangeContext): Date => {\n const start = new Date(now)\n start.setUTCDate(utcDate + (utcDay === 0 ? -6 : 1 - utcDay))\n start.setUTCHours(0, 0, 0, 0)\n return start\n}\n\n/** Forward-looking ranges (Cube.js-compatible 'next ...' expressions). */\nconst FORWARD_RANGES: Record<string, RelativeRangeHandler> = {\n tomorrow: ({ now, utcDate }) => {\n const start = new Date(now)\n start.setUTCDate(utcDate + 1)\n start.setUTCHours(0, 0, 0, 0)\n const end = new Date(start)\n end.setUTCHours(23, 59, 59, 999)\n return { start, end }\n },\n\n 'next week': (ctx) => {\n const start = startOfWeek(ctx)\n start.setUTCDate(start.getUTCDate() + 7)\n const end = new Date(start)\n end.setUTCDate(start.getUTCDate() + 6)\n end.setUTCHours(23, 59, 59, 999)\n return { start, end }\n },\n\n 'next month': ({ utcYear, utcMonth }) => ({\n start: new Date(Date.UTC(utcYear, utcMonth + 1, 1, 0, 0, 0, 0)),\n end: new Date(Date.UTC(utcYear, utcMonth + 2, 0, 23, 59, 59, 999))\n }),\n\n 'next quarter': ({ utcYear, utcMonth }) => {\n const nextQuarterStartMonth = (Math.floor(utcMonth / 3) + 1) * 3\n return {\n start: new Date(Date.UTC(utcYear, nextQuarterStartMonth, 1, 0, 0, 0, 0)),\n end: new Date(Date.UTC(utcYear, nextQuarterStartMonth + 3, 0, 23, 59, 59, 999))\n }\n },\n\n 'next year': ({ utcYear }) => ({\n start: new Date(Date.UTC(utcYear + 1, 0, 1, 0, 0, 0, 0)),\n end: new Date(Date.UTC(utcYear + 1, 11, 31, 23, 59, 59, 999))\n })\n}\n\n/**\n * Parse relative date range expressions like \"today\", \"yesterday\", \"last 7 days\",\n * \"this month\", \"next week\", etc. Returns start/end dates in UTC, or null when\n * the string is not a recognised relative expression.\n *\n * Supported:\n * - today, yesterday, tomorrow\n * - this week/month/quarter/year\n * - last week/month/quarter/year, last 12 months\n * - next week/month/quarter/year\n * - last N days/weeks/months/quarters/years\n */\nexport function parseRelativeDateRange(dateRange: string): DateRange | null {\n const now = new Date()\n const lowerRange = dateRange.toLowerCase().trim()\n\n const ctx: RelativeRangeContext = {\n now,\n utcYear: now.getUTCFullYear(),\n utcMonth: now.getUTCMonth(),\n utcDate: now.getUTCDate(),\n utcDay: now.getUTCDay()\n }\n\n const fixed = Object.prototype.hasOwnProperty.call(FIXED_RANGES, lowerRange)\n ? FIXED_RANGES[lowerRange]\n : Object.prototype.hasOwnProperty.call(FORWARD_RANGES, lowerRange)\n ? FORWARD_RANGES[lowerRange]\n : undefined\n if (fixed) return fixed(ctx)\n\n for (const { re, build } of PATTERN_RANGES) {\n const match = lowerRange.match(re)\n if (match) return build(parseInt(match[1], 10), ctx)\n }\n\n return null\n}\n\n/**\n * Parse a date range (string or array) to start/end dates\n * Handles both relative date expressions and explicit date arrays\n */\nexport function parseDateRange(dateRange: string | string[]): { start: Date; end: Date } | null {\n if (Array.isArray(dateRange)) {\n if (dateRange.length < 2) return null\n const start = new Date(dateRange[0])\n const end = new Date(dateRange[1])\n if (isNaN(start.getTime()) || isNaN(end.getTime())) return null\n // Normalize end to end of day\n end.setUTCHours(23, 59, 59, 999)\n return { start, end }\n }\n return parseRelativeDateRange(dateRange)\n}\n\n/**\n * Format date as YYYY-MM-DD for cube queries\n */\nexport function formatDateForCube(date: Date): string {\n return date.toISOString().split('T')[0]\n}\n\n/**\n * Calculate the prior period (same length, immediately before the current period)\n *\n * Example:\n * Current: Jan 1-7 (7 days)\n * Prior: Dec 25-31 (7 days)\n */\nexport function calculatePriorPeriod(currentStart: Date, currentEnd: Date): { start: Date; end: Date } {\n // Calculate period length in days (inclusive of both start and end dates)\n const periodLengthMs = currentEnd.getTime() - currentStart.getTime()\n const periodLengthDays = Math.ceil(periodLengthMs / (1000 * 60 * 60 * 24))\n\n // Prior period ends the day before current period starts\n const priorEnd = new Date(currentStart)\n priorEnd.setUTCDate(priorEnd.getUTCDate() - 1)\n priorEnd.setUTCHours(23, 59, 59, 999)\n\n // Prior period starts (periodLengthDays - 1) days before priorEnd\n const priorStart = new Date(priorEnd)\n priorStart.setUTCDate(priorStart.getUTCDate() - periodLengthDays + 1)\n priorStart.setUTCHours(0, 0, 0, 0)\n\n return { start: priorStart, end: priorEnd }\n}\n","/**\n * Gap Filler Utility\n * Fills missing time series gaps in query results to ensure continuous data for charts.\n * Follows Cube.js naming conventions (fillMissingDates).\n *\n * Shared by the server (explicit `fillMissingDates: true` queries, comparison\n * periods) and the client (chart-side filling, the Cube.js default), so both\n * produce identical buckets. Whether a time dimension is filled is decided by\n * the caller through `shouldFill` — see issue #1368.\n */\n\nimport { parseRelativeDateRange } from './date-utils.js'\n\nexport type TimeGranularity = 'second' | 'minute' | 'hour' | 'day' | 'week' | 'month' | 'quarter' | 'year'\n\n/** The filter shapes gap filling reads to find an `inDateRange` range. */\nexport interface GapFillFilter {\n member?: string\n operator?: string\n values?: readonly unknown[]\n dateRange?: string | string[]\n and?: readonly GapFillFilter[]\n or?: readonly GapFillFilter[]\n}\n\n/** A query time dimension, as gap filling sees it. */\nexport interface GapFillTimeDimension {\n dimension: string\n granularity?: string\n dateRange?: string | string[]\n fillMissingDates?: boolean\n compareDateRange?: readonly unknown[]\n}\n\n/** The parts of a query gap filling reads. */\nexport interface GapFillQuery {\n measures?: readonly string[]\n dimensions?: readonly string[]\n timeDimensions?: readonly GapFillTimeDimension[]\n filters?: readonly GapFillFilter[]\n fillMissingDatesValue?: number | null\n}\n\n/**\n * Maximum number of time buckets gap filling will generate. Beyond this, gap\n * filling is skipped entirely (data is returned unmodified) to avoid both\n * runaway memory use and silent truncation of real rows.\n */\nexport const MAX_GAP_FILL_BUCKETS = 10000\n\nexport interface GapFillerConfig {\n /** The time dimension key (e.g., 'Sales.date') */\n timeDimensionKey: string\n /** Time granularity for bucket generation */\n granularity: TimeGranularity\n /** Date range [start, end] */\n dateRange: [Date, Date]\n /** Value to fill for missing measures (default: 0) */\n fillValue: number | null\n /** List of measure keys in the data */\n measures: readonly string[]\n /** List of dimension keys in the data (excluding time dimensions) */\n dimensions: readonly string[]\n}\n\n/**\n * Generate all time buckets for a given date range and granularity\n */\nexport function generateTimeBuckets(\n startDate: Date,\n endDate: Date,\n granularity: TimeGranularity\n): Date[] {\n const buckets: Date[] = []\n let current = alignToGranularity(new Date(startDate), granularity)\n const end = alignToGranularity(new Date(endDate), granularity)\n\n // Safety: limit to prevent runaway allocation/infinite loops.\n // Callers MUST treat hitting this cap as \"do not gap fill\" rather than\n // truncating data — see fillTimeSeriesGaps.\n while (current <= end && buckets.length < MAX_GAP_FILL_BUCKETS) {\n buckets.push(new Date(current))\n current = incrementByGranularity(current, granularity)\n }\n\n return buckets\n}\n\n/**\n * Align a date to the start of its granularity bucket\n */\nfunction alignToGranularity(date: Date, granularity: TimeGranularity): Date {\n const aligned = new Date(date)\n\n switch (granularity) {\n case 'second':\n aligned.setUTCMilliseconds(0)\n break\n case 'minute':\n aligned.setUTCSeconds(0, 0)\n break\n case 'hour':\n aligned.setUTCMinutes(0, 0, 0)\n break\n case 'day':\n aligned.setUTCHours(0, 0, 0, 0)\n break\n case 'week': {\n // Align to Monday (ISO week start)\n const dayOfWeek = aligned.getUTCDay()\n const daysToMonday = dayOfWeek === 0 ? 6 : dayOfWeek - 1\n aligned.setUTCDate(aligned.getUTCDate() - daysToMonday)\n aligned.setUTCHours(0, 0, 0, 0)\n break\n }\n case 'month':\n aligned.setUTCDate(1)\n aligned.setUTCHours(0, 0, 0, 0)\n break\n case 'quarter': {\n const quarterMonth = Math.floor(aligned.getUTCMonth() / 3) * 3\n aligned.setUTCMonth(quarterMonth, 1)\n aligned.setUTCHours(0, 0, 0, 0)\n break\n }\n case 'year':\n aligned.setUTCMonth(0, 1)\n aligned.setUTCHours(0, 0, 0, 0)\n break\n }\n\n return aligned\n}\n\n/**\n * Increment a date by one granularity unit\n */\nfunction incrementByGranularity(date: Date, granularity: TimeGranularity): Date {\n const next = new Date(date)\n\n switch (granularity) {\n case 'second':\n next.setUTCSeconds(next.getUTCSeconds() + 1)\n break\n case 'minute':\n next.setUTCMinutes(next.getUTCMinutes() + 1)\n break\n case 'hour':\n next.setUTCHours(next.getUTCHours() + 1)\n break\n case 'day':\n next.setUTCDate(next.getUTCDate() + 1)\n break\n case 'week':\n next.setUTCDate(next.getUTCDate() + 7)\n break\n case 'month':\n next.setUTCMonth(next.getUTCMonth() + 1)\n break\n case 'quarter':\n next.setUTCMonth(next.getUTCMonth() + 3)\n break\n case 'year':\n next.setUTCFullYear(next.getUTCFullYear() + 1)\n break\n }\n\n return next\n}\n\n/**\n * Normalize a date value to an aligned ISO bucket key for consistent comparison.\n *\n * Real rows carry the time value as produced by the database's time-bucketing\n * expression, which may not exactly equal the JS-generated bucket boundary\n * (e.g. a week expression that retains the time-of-day). Aligning the row's date\n * to the same granularity boundary used to generate buckets ensures real rows\n * match their bucket instead of being discarded and replaced with fill values.\n *\n * Returns null when the value cannot be parsed as a date.\n */\nfunction normalizeDateKey(value: unknown, granularity: TimeGranularity): string | null {\n let date: Date | null = null\n if (value instanceof Date) {\n date = value\n } else if (typeof value === 'string') {\n const parsed = new Date(value)\n if (!isNaN(parsed.getTime())) {\n date = parsed\n }\n }\n\n if (!date || isNaN(date.getTime())) {\n return null\n }\n\n return alignToGranularity(date, granularity).toISOString()\n}\n\n/**\n * Create a dimension group key for grouping rows by dimension values\n */\nfunction createDimensionGroupKey(\n row: Record<string, unknown>,\n dimensions: readonly string[]\n): string {\n if (dimensions.length === 0) {\n return '__all__'\n }\n\n return dimensions.map(dim => {\n return String((row as Record<string, unknown>)[dim] ?? '')\n }).join('|||')\n}\n\n/**\n * Fill time series gaps in query result data\n *\n * @param data - Original query result data\n * @param config - Gap filling configuration\n * @returns Data with gaps filled\n */\nexport function fillTimeSeriesGaps(\n data: Record<string, unknown>[],\n config: GapFillerConfig\n): Record<string, unknown>[] {\n const { timeDimensionKey, granularity, dateRange, dimensions } = config\n\n // Generate all expected time buckets\n const timeBuckets = generateTimeBuckets(dateRange[0], dateRange[1], granularity)\n\n if (timeBuckets.length === 0) {\n return data\n }\n\n // If the requested range would exceed the bucket cap, skip gap filling rather\n // than truncating: filling only the first N buckets would silently drop every\n // real row that falls after them. Return the data unmodified.\n if (timeBuckets.length >= MAX_GAP_FILL_BUCKETS) {\n console.warn(\n `[drizzle-cube] Skipping gap filling for \"${timeDimensionKey}\": the ${granularity} ` +\n `range exceeds the ${MAX_GAP_FILL_BUCKETS}-bucket limit. Returning unfilled data.`\n )\n return data\n }\n\n // Group data by dimension values, keying each row by its time value aligned to\n // the same granularity boundary used to generate buckets. Aligning the row key\n // is what lets real rows match their bucket even when the database's bucketing\n // expression keeps a time-of-day component (e.g. the MySQL/SingleStore week\n // expression). Without alignment those rows were discarded and replaced with\n // fill values (issue #849).\n const dimensionGroups = groupRowsForGapFill(data, timeDimensionKey, granularity, dimensions)\n\n // Build filled result\n const result: Record<string, unknown>[] = []\n\n for (const [_groupKey, timeMap] of dimensionGroups) {\n // Get a sample row from this group to extract dimension values\n const sampleRow = timeMap.size > 0\n ? timeMap.values().next().value\n : null\n\n for (const bucket of timeBuckets) {\n const bucketKey = bucket.toISOString()\n const existingRow = timeMap.get(bucketKey)\n\n result.push(\n existingRow ?? buildFilledRow(bucketKey, sampleRow ?? null, config)\n )\n }\n }\n\n return result\n}\n\n/**\n * Group rows by their dimension-value key, mapping each to an inner map keyed by\n * the row's granularity-aligned time value. Extracted from fillTimeSeriesGaps.\n */\nfunction groupRowsForGapFill(\n data: Record<string, unknown>[],\n timeDimensionKey: string,\n granularity: TimeGranularity,\n dimensions: readonly string[]\n): Map<string, Map<string, Record<string, unknown>>> {\n const dimensionGroups = new Map<string, Map<string, Record<string, unknown>>>()\n\n for (const row of data) {\n const groupKey = createDimensionGroupKey(row, dimensions)\n // Fall back to a stable string for unparseable values so they simply don't\n // match any bucket (prior behaviour) rather than throwing.\n const timeKey = normalizeDateKey(row[timeDimensionKey], granularity)\n ?? String(row[timeDimensionKey])\n\n let timeMap = dimensionGroups.get(groupKey)\n if (!timeMap) {\n timeMap = new Map()\n dimensionGroups.set(groupKey, timeMap)\n }\n timeMap.set(timeKey, row)\n }\n\n // If no data at all, create one group with no dimensions\n if (dimensionGroups.size === 0 && dimensions.length === 0) {\n dimensionGroups.set('__all__', new Map())\n }\n\n return dimensionGroups\n}\n\n/**\n * Build a single filled row for a missing bucket: the time key, dimension values\n * copied from a sample row, and the fill value for every measure. Extracted from\n * fillTimeSeriesGaps.\n */\nfunction buildFilledRow(\n bucketKey: string,\n sampleRow: Record<string, unknown> | null,\n config: GapFillerConfig\n): Record<string, unknown> {\n const { timeDimensionKey, fillValue, measures, dimensions } = config\n const filledRow: Record<string, unknown> = {\n [timeDimensionKey]: bucketKey\n }\n\n // Copy dimension values from sample row\n if (sampleRow) {\n for (const dim of dimensions) {\n filledRow[dim] = sampleRow[dim]\n }\n }\n\n // Fill measures with fill value\n for (const measure of measures) {\n filledRow[measure] = fillValue\n }\n\n return filledRow\n}\n\n/**\n * Parse date range from query time dimension\n * Handles both array format ['2024-01-01', '2024-01-31'] and string format\n */\nexport function parseDateRange(dateRange: string | readonly unknown[] | undefined): [Date, Date] | null {\n if (!dateRange) {\n return null\n }\n\n if (typeof dateRange !== 'string') {\n if (dateRange.length < 2) {\n return null\n }\n const start = new Date(String(dateRange[0]))\n const end = new Date(String(dateRange[1]))\n\n if (isNaN(start.getTime()) || isNaN(end.getTime())) {\n return null\n }\n\n return [start, end]\n }\n\n // Try as a relative date range (e.g., 'last 7 days', 'this month', 'this year')\n const relative = parseRelativeDateRange(dateRange)\n if (relative) {\n return [relative.start, relative.end]\n }\n\n // Try to parse as a single absolute date string\n const date = new Date(dateRange)\n if (!isNaN(date.getTime())) {\n // Single date - return same day range\n return [date, date]\n }\n\n return null\n}\n\n/**\n * Apply gap filling to query result data based on query configuration\n *\n * @param data - Original query result data\n * @param query - The query that produced the data\n * @param measures - List of measure names in the result\n * @param shouldFill - Whether a time dimension is filled. The caller resolves\n * the precedence (query option, chart setting, cube definition, default).\n * @returns Data with gaps filled (if applicable)\n */\nexport function applyGapFilling(\n data: Record<string, unknown>[],\n query: GapFillQuery,\n measures: readonly string[],\n shouldFill: (timeDimension: GapFillTimeDimension) => boolean\n): Record<string, unknown>[] {\n // Check if we have time dimensions to fill\n if (!query.timeDimensions || query.timeDimensions.length === 0) {\n return data\n }\n\n // Find time dimensions that need gap filling\n const timeDimensionsToFill = query.timeDimensions.filter(td => {\n // Must have granularity to fill gaps\n // dateRange can come from the timeDimension itself OR from a matching inDateRange filter\n const hasGranularity = !!td.granularity\n const hasDateRange = td.dateRange || findDateRangeFilter(td.dimension, query.filters)\n\n return hasGranularity && !!hasDateRange && shouldFill(td)\n })\n\n if (timeDimensionsToFill.length === 0) {\n return data\n }\n\n // Get fill value (default: 0, but allow explicit null)\n const fillValue = query.fillMissingDatesValue === undefined ? 0 : query.fillMissingDatesValue\n\n // Get regular dimensions (exclude time dimensions)\n const timeDimensionKeys = new Set(query.timeDimensions.map(td => td.dimension))\n const regularDimensions = (query.dimensions || []).filter(d => !timeDimensionKeys.has(d))\n\n // Apply gap filling for each time dimension\n // Note: Currently only supports single time dimension gap filling\n // Multiple time dimensions would require more complex logic\n let result = data\n\n for (const timeDim of timeDimensionsToFill) {\n // Try dateRange from timeDimension first, then fall back to matching filter\n const dateRange = parseDateRange(timeDim.dateRange)\n || resolveDateRangeFromFilter(timeDim.dimension, query.filters)\n\n if (!dateRange) {\n continue\n }\n\n const config: GapFillerConfig = {\n timeDimensionKey: timeDim.dimension,\n granularity: timeDim.granularity as TimeGranularity,\n dateRange,\n fillValue,\n measures,\n dimensions: regularDimensions\n }\n\n result = fillTimeSeriesGaps(result, config)\n }\n\n return result\n}\n\n/**\n * Find an inDateRange filter matching a time dimension in the query filters.\n * Searches through top-level filters and logical groups (and/or).\n */\nfunction findDateRangeFilter(\n dimensionKey: string,\n filters: readonly GapFillFilter[] | undefined\n): GapFillFilter | null {\n if (!filters) return null\n\n for (const filter of filters) {\n // Direct filter condition\n if ('member' in filter && 'operator' in filter) {\n if (filter.member === dimensionKey && filter.operator === 'inDateRange') {\n return filter\n }\n }\n // Logical groups\n if ('and' in filter && filter.and) {\n const found = findDateRangeFilter(dimensionKey, filter.and)\n if (found) return found\n }\n if ('or' in filter && filter.or) {\n const found = findDateRangeFilter(dimensionKey, filter.or)\n if (found) return found\n }\n }\n\n return null\n}\n\n/**\n * Resolve a date range from a matching inDateRange filter for the given dimension.\n * Handles both absolute date pairs and relative date strings (e.g., \"this month\").\n */\nfunction resolveDateRangeFromFilter(\n dimensionKey: string,\n filters: readonly GapFillFilter[] | undefined\n): [Date, Date] | null {\n const filter = findDateRangeFilter(dimensionKey, filters)\n if (!filter) return null\n\n // Check filter.dateRange first (e.g., { dateRange: \"this year\" })\n if (filter.dateRange) {\n const fromDateRange = parseDateRange(filter.dateRange)\n if (fromDateRange) return fromDateRange\n }\n\n // Check filter.values (e.g., values: [\"2024-01-01\", \"2024-03-31\"] or values: [\"this month\"])\n const values = filter.values\n if (!values || values.length === 0) return null\n\n // Single relative string (e.g., [\"this month\"])\n if (values.length === 1 && typeof values[0] === 'string') {\n const relative = parseRelativeDateRange(values[0])\n if (relative) return [relative.start, relative.end]\n // Try as absolute date\n return parseDateRange(values)\n }\n\n // Two absolute dates (e.g., [\"2024-01-01\", \"2024-03-31\"])\n if (values.length >= 2) {\n return parseDateRange(values)\n }\n\n return null\n}\n","/**\n * Chart-side gap filling (issue #1368).\n *\n * The server returns observed rows only, as Cube.js does; charts fill missing\n * time buckets, as Cube.js's client does. Per time dimension, the first of\n * these that is set decides:\n *\n * 1. the query's `fillMissingDates` (e.g. a drill-down turning it off)\n * 2. the chart's `fillMissingDates` display option\n * 3. the cube time dimension's `fillMissingDates`, from the result annotation\n * 4. `true` — the Cube.js chart default\n *\n * Filling reuses the server's bucket logic from `src/shared/gap-filler.ts`, so\n * a filled chart looks exactly as it did when the server filled by default.\n */\n\nimport { applyGapFilling } from '../../shared/gap-filler.js'\nimport type { CubeResultSet } from '../types.js'\n\n/** A chart's gap-filling preference. */\nexport interface ChartGapFillOptions {\n /** `true`/`false` force filling on/off; `'auto'` or unset defers to the query and cube. */\n fillMissingDates?: boolean | 'auto'\n}\n\n// Declared here rather than imported from `src/shared` so the published client\n// typings stay self-contained (shared code is bundled, its types are not).\n\n/** A time dimension of the query a result came from. */\nexport interface ChartGapFillTimeDimension {\n dimension: string\n granularity?: string\n dateRange?: string | string[]\n fillMissingDates?: boolean\n compareDateRange?: readonly unknown[]\n}\n\n/** The parts of a query chart gap filling reads. */\nexport interface ChartGapFillQuery {\n measures?: readonly string[]\n dimensions?: readonly string[]\n timeDimensions?: readonly ChartGapFillTimeDimension[]\n filters?: readonly ChartGapFillFilter[]\n fillMissingDatesValue?: number | null\n ungrouped?: boolean\n}\n\ninterface ChartGapFillFilter {\n member?: string\n operator?: string\n values?: readonly unknown[]\n dateRange?: string | string[]\n and?: readonly ChartGapFillFilter[]\n or?: readonly ChartGapFillFilter[]\n}\n\ninterface TimeDimensionAnnotation {\n fillMissingDates?: boolean\n}\n\n/** The query a result set was produced from, as echoed back by the server. */\nfunction resultQuery(resultSet: CubeResultSet): ChartGapFillQuery | null {\n const response = resultSet.loadResponse\n return response?.results?.[0]?.query ?? response?.query ?? null\n}\n\n/**\n * Fill missing time buckets in result rows for a chart.\n *\n * Comparison (`compareDateRange`) dimensions are left alone — the server fills\n * each period already and the rows carry period metadata. Ungrouped queries are\n * never filled.\n */\nexport function fillChartRows(\n rows: Record<string, unknown>[],\n query: ChartGapFillQuery,\n annotation: { timeDimensions?: Record<string, TimeDimensionAnnotation> } | undefined,\n options: ChartGapFillOptions = {}\n): Record<string, unknown>[] {\n if (query.ungrouped) return rows\n\n const chartSetting = options.fillMissingDates === 'auto' ? undefined : options.fillMissingDates\n const shouldFill = (td: ChartGapFillTimeDimension): boolean => {\n if (td.compareDateRange?.length) return false\n return td.fillMissingDates\n ?? chartSetting\n ?? annotation?.timeDimensions?.[td.dimension]?.fillMissingDates\n ?? true\n }\n\n return applyGapFilling(rows, query, query.measures ?? [], shouldFill)\n}\n\n/**\n * Wrap a result set so its rows are gap-filled for a chart. The underlying\n * result set (and the query cache holding it) stays raw, so changing the chart\n * setting never refetches. Returns the result set unchanged when it does not\n * carry the query it came from.\n */\nexport function withChartGapFilling(\n resultSet: CubeResultSet,\n options: ChartGapFillOptions = {}\n): CubeResultSet {\n const query = resultQuery(resultSet)\n if (!query?.timeDimensions?.length) return resultSet\n\n const fill = (rows: Record<string, unknown>[]) =>\n fillChartRows(rows, query, resultSet.annotation(), options)\n\n let raw: Record<string, unknown>[] | undefined\n let table: Record<string, unknown>[] | undefined\n let series: Record<string, unknown>[] | undefined\n\n return {\n rawData: () => (raw ??= fill(resultSet.rawData())),\n tablePivot: () => (table ??= fill(resultSet.tablePivot())),\n series: () => (series ??= fill(resultSet.series())),\n annotation: () => resultSet.annotation(),\n loadResponse: resultSet.loadResponse,\n cacheInfo: resultSet.cacheInfo ? () => resultSet.cacheInfo?.() : undefined,\n totalCount: resultSet.totalCount ? () => resultSet.totalCount?.() : undefined\n }\n}\n"],"mappings":"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"}
@@ -449,6 +449,11 @@ var e = {
449
449
  "chart.option.target.description": "Enkele waarde of door komma's gescheiden waarden om over de X-as te spreiden",
450
450
  "chart.option.connectNulls.label": "Verbind null-waarden",
451
451
  "chart.option.connectNulls.description": "Tekenen doorlopende regel through ontbrekend gegevens punten",
452
+ "chart.option.fillMissingDates.label": "Ontbrekende datums aanvullen",
453
+ "chart.option.fillMissingDates.description": "Toon ontbrekende tijdsperioden met de opvulwaarde (standaard 0). Automatisch volgt de cube-definitie.",
454
+ "chart.option.fillMissingDates.auto": "Automatisch",
455
+ "chart.option.fillMissingDates.on": "Aan",
456
+ "chart.option.fillMissingDates.off": "Uit",
452
457
  "chart.option.showAllXLabels.label": "Toon alle X-labels",
453
458
  "chart.option.showAllXLabels.description": "Toon elk label op de X-as in plaats van overlappende labels automatisch te verbergen",
454
459
  "chart.option.leftYAxisFormat.label": "Left Y-As Format",
@@ -915,7 +920,18 @@ var e = {
915
920
  "server.validation.query.cubeNotFoundForFilter": "Cube '{cubeName}' niet gevonden (referenced in filter '{member}')",
916
921
  "server.validation.query.filterFieldNotFound": "Filter veld '{fieldName}' niet gevonden op cube '{cubeName}' (moet zijn een dimensie van meting){hint}",
917
922
  "server.validation.query.unknownFilterOperator": "Onbekende filteroperator '{operator}' op '{member}'. Geldige operatoren: {operators}",
918
- "server.validation.query.inDateRangeMissingRange": "Filter op '{member}' gebruikt 'inDateRange' zonder datumbereik. Geef values: ['last 30 days'], values: ['2024-01-01', '2024-03-31'] of dateRange op.",
923
+ "server.validation.query.invalidInDateRangeValues": "Ongeldige inDateRange-waarden voor '{member}': {reason}",
924
+ "server.validation.query.invalidInDateRangeDateRange": "Ongeldig inDateRange-datumbereik voor '{member}': {reason}",
925
+ "server.validation.query.inDateRangeConflictingInputs": "Ongeldig inDateRange-filter voor '{member}': {reason}",
926
+ "server.validation.query.inDateRangeReason.missing": "geef een datumbereik op",
927
+ "server.validation.query.inDateRangeReason.shape": "gebruik een vlak [begin, eind] paar datums, of één relatief bereik of datum",
928
+ "server.validation.query.inDateRangeReason.invalidDate": "de datum is ongeldig",
929
+ "server.validation.query.inDateRangeReason.invalidRelative": "het relatieve datumbereik '{value}' wordt niet ondersteund",
930
+ "server.validation.query.inDateRangeReason.reverseOrder": "de begindatum mag niet na de einddatum liggen",
931
+ "server.validation.query.inDateRangeReason.conflict": "gebruik values of dateRange, niet beide",
932
+ "server.validation.ai.dryRunFailed": "Kan SQL niet genereren: {error}",
933
+ "server.validation.query.invalidDateRangeInput": "Ongeldig datumbereik: {reason}",
934
+ "server.validation.query.invalidTimeDimensionDateRange": "Ongeldig dateRange voor tijddimensie '{member}': {reason}",
919
935
  "server.validation.query.invalidDateRange": "Kan datumbereik {dateRange} voor '{member}' niet verwerken. Gebruik een relatief bereik ({examples}), één datum ('2024-01-15') of een ['start', 'eind'] paar datums.",
920
936
  "server.validation.query.invalidDateValue": "Filter op '{member}' gebruikt '{operator}' maar {value} is geen geldige datum.",
921
937
  "server.validation.query.orMixesMeasuresAndDimensions": "Een 'or' filtergroep kan geen metingfilters ({measures}) combineren met dimensiefilters ({dimensions}): metingen worden na aggregatie gefilterd en dimensies ervoor. Splits ze op in afzonderlijke filters op het hoogste niveau.",
@@ -1581,6 +1597,8 @@ var e = {
1581
1597
  "portlet.filterConfig.applyToFieldDefault": "Standaard ({field})",
1582
1598
  "portlet.filterConfig.mappedTo": "Gekoppeld aan {field}",
1583
1599
  "portlet.filterConfig.mappedFieldMissing": "Het gekoppelde veld \"{field}\" is niet meer beschikbaar in het schema",
1600
+ "portlet.filterConfig.applyToTimeDimensionsDefault": "Standaard (de tijdsdimensies van de portlet)",
1601
+ "portlet.dateFilterNotApplied": "Het dashboard-datumfilter \"{label}\" beperkt deze portlet niet omdat deze geen tijdsdimensie heeft. Koppel het filter aan een datumveld in de filterinstellingen van de portlet.",
1584
1602
  "textPortlet.editText": "Bewerken Tekst",
1585
1603
  "textPortlet.addText": "Voeg Tekst",
1586
1604
  "textPortlet.markdownContent": "Markdown Content",
@@ -1697,4 +1715,4 @@ var e = {
1697
1715
  //#endregion
1698
1716
  export { e as default };
1699
1717
 
1700
- //# sourceMappingURL=nl-NL-kRjxedTf.js.map
1718
+ //# sourceMappingURL=nl-NL-DVZXf8U7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nl-NL-DVZXf8U7.js","names":["nl_NL_default"],"sources":["../../../src/i18n/locales/nl-NL.json"],"sourcesContent":["{\n \"analysis.modes.query.label\": \"Zoekopdracht\",\n \"analysis.modes.query.description\": \"Standard analyse (enkele of meerdere-query)\",\n \"analysis.modes.funnel.label\": \"Trechter\",\n \"analysis.modes.funnel.description\": \"Sequential conversion analyse\",\n \"analysis.modes.flow.label\": \"Stroom\",\n \"analysis.modes.flow.description\": \"Bidirectional pad analyse met Sankey visualisatie\",\n \"analysis.modes.retention.label\": \"Retentie\",\n \"analysis.modes.retention.description\": \"Cohortgebaseerde retentieanalyse over tijdsperioden\",\n \"analysis.ai.title\": \"AI-querygenerator\",\n \"analysis.ai.generating\": \"Genereren...\",\n \"analysis.ai.placeholder\": \"Beschrijf je query in natuurlijke taal... (bijv. 'Toon totale verkoop per maand voor het afgelopen jaar')\",\n \"analysis.ai.shortcutHint\": \"Druk op Enter om te genereren, Shift+Enter voor een nieuwe regel\",\n \"analysis.ai.successMessage\": \"Query gegenereerd en geladen! Controleer de resultaten hieronder en klik op Accepteren om te behouden of Annuleren om terug te draaien.\",\n \"analysis.ai.button.accept\": \"Accepteren\",\n \"analysis.ai.button.cancel\": \"Annuleren\",\n \"analysis.ai.button.close\": \"Sluiten\",\n \"analysis.ai.button.generate\": \"Genereren\",\n \"analysis.ai.button.generating\": \"Genereren...\",\n \"analysis.sections.metrics\": \"Metrieken\",\n \"analysis.sections.breakdown\": \"Opsplitsing\",\n \"analysis.sections.dimensions\": \"Dimensies\",\n \"analysis.sections.filters\": \"Filter\",\n \"analysis.sections.limit\": \"Limiet\",\n \"analysis.tabs.query\": \"Zoekopdracht\",\n \"analysis.tabs.chart\": \"Grafiek\",\n \"analysis.tabs.chartTitle\": \"Grafiek configuratie\",\n \"analysis.tabs.display\": \"Weergave\",\n \"analysis.tabs.displayTitle\": \"Weergave options\",\n \"analysis.multiQuery.removeQuery\": \"Verwijderen query\",\n \"analysis.multiQuery.addQuery\": \"Voeg new query\",\n \"analysis.multiQuery.addAnother\": \"Voeg another query\",\n \"analysis.multiQuery.mergeExplanation\": \"In samenvoegen modus, dimensies zijn shared van Q1.\",\n \"analysis.multiQuery.switchToSeparate\": \"Schakel naar aparte reeksen\",\n \"analysis.mergeStrategy.concat\": \"Apart reeksen\",\n \"analysis.mergeStrategy.merge\": \"Samenvoegen op dimensie\",\n \"analysis.mergeStrategy.funnel\": \"Trechter\",\n \"analysis.placeholders.addMetrics\": \"Voeg metingen toe om SQL te genereren\",\n \"analysis.placeholders.hoverField\": \"Beweeg over een veld om details te zien\",\n \"analysis.placeholders.noData\": \"Geen gegevens beschikbaar\",\n \"common.actions.accept\": \"Accepteren\",\n \"common.actions.cancel\": \"Annuleren\",\n \"common.actions.delete\": \"Verwijderen\",\n \"common.actions.close\": \"Sluiten\",\n \"common.actions.edit\": \"Bewerken\",\n \"common.actions.save\": \"Opslaan\",\n \"common.actions.copy\": \"Kopiëren\",\n \"common.actions.duplicate\": \"Dupliceren\",\n \"common.actions.refresh\": \"Vernieuwen\",\n \"common.actions.confirm\": \"Bevestigen\",\n \"common.actions.add\": \"Voeg\",\n \"common.actions.clear\": \"Wissen\",\n \"common.actions.select\": \"Selecteer\",\n \"common.actions.navigate\": \"Navigeer\",\n \"common.actions.share\": \"Delen\",\n \"common.loading\": \"Laden...\",\n \"common.modal.processing\": \"Verwerken...\",\n \"common.modal.dashboardName\": \"Dashboard Naam\",\n \"common.modal.deleteConfirmation\": \"Weet je het zeker? Deze actie kan niet ongedaan worden gemaakt.\",\n \"common.sorting.ascending\": \"Oplopend gesorteerd (klik voor aflopend)\",\n \"common.sorting.descending\": \"Aflopend gesorteerd (klik om te verwijderen)\",\n \"common.sorting.none\": \"Klik om oplopend te sorteren\",\n \"fieldTypes.count\": \"Aantal\",\n \"fieldTypes.countDistinct\": \"Aantal Distinct\",\n \"fieldTypes.countDistinctApprox\": \"Aantal Distinct (Approx)\",\n \"fieldTypes.sum\": \"Som\",\n \"fieldTypes.avg\": \"Gemiddelde\",\n \"fieldTypes.min\": \"Minimum\",\n \"fieldTypes.max\": \"Maximum\",\n \"fieldTypes.runningTotal\": \"Uitvoeren Totaal\",\n \"fieldTypes.number\": \"Nummer\",\n \"fieldTypes.string\": \"Tekst\",\n \"fieldTypes.boolean\": \"Boolean\",\n \"fieldTypes.time\": \"Tijd Dimensie\",\n \"fieldTypes.geo\": \"Geografisch\",\n \"fieldTypes.dimension\": \"Dimensie\",\n \"fieldPanel.emptyState\": \"Beweeg over een veld om details te zien\",\n \"fieldPanel.usageHint\": \"Druk op Enter of klik om dit veld aan je query toe te voegen.\",\n \"fieldPanel.labels.type\": \"Type\",\n \"fieldPanel.labels.cube\": \"Cube\",\n \"fieldPanel.labels.category\": \"Categorie\",\n \"fieldCategory.measure\": \"Meting\",\n \"fieldCategory.timeDimension\": \"Tijd Dimensie\",\n \"fieldCategory.dimension\": \"Dimensie\",\n \"fieldSearch.placeholder.metrics\": \"Zoeken metingen...\",\n \"fieldSearch.placeholder.filter\": \"Zoeken velden naar filter...\",\n \"fieldSearch.placeholder.dimensions\": \"Zoeken dimensies...\",\n \"fieldSearch.modal.title.metrics\": \"Selecteer a Metric\",\n \"fieldSearch.modal.title.filter\": \"Selecteer a Veld naar Filter\",\n \"fieldSearch.modal.title.dimensions\": \"Selecteer a Dimensie\",\n \"fieldSearch.filter.allCubes\": \"Alle Cubes\",\n \"fieldSearch.categories.all\": \"Alle\",\n \"fieldSearch.empty.heading\": \"Geen velden gevonden\",\n \"fieldSearch.empty.noMatchMetrics\": \"Geen metingen match \\\"{searchTerm}\\\"\",\n \"fieldSearch.empty.noMatchDimensions\": \"Geen dimensies match \\\"{searchTerm}\\\"\",\n \"fieldSearch.empty.noMetrics\": \"Geen metingen beschikbaar\",\n \"fieldSearch.empty.noDimensions\": \"Geen dimensies beschikbaar\",\n \"fieldSearch.section.recents\": \"Recent\",\n \"fieldSearch.footer.metricsAvailable\": \"metrieken beschikbaar\",\n \"fieldSearch.footer.fieldsAvailable\": \"velden beschikbaar\",\n \"fieldSearch.footer.dimensionsAvailable\": \"dimensies beschikbaar\",\n \"fieldSearch.shortcut.navigate\": \"Navigeer\",\n \"fieldSearch.shortcut.keyEnter\": \"Enter\",\n \"fieldSearch.shortcut.keyShift\": \"Shift\",\n \"fieldSearch.shortcut.keyEsc\": \"Esc\",\n \"fieldSearch.shortcut.plusClick\": \"+Klik\",\n \"fieldSearch.shortcut.select\": \"Selecteer\",\n \"fieldSearch.shortcut.multiSelect\": \"Meerdere-selecteer\",\n \"fieldSearch.shortcut.close\": \"Sluiten\",\n \"filter.group.condition\": \"voorwaarde\",\n \"filter.group.conditions\": \"voorwaarden\",\n \"filter.group.addFilter\": \"Voeg Filter\",\n \"filter.group.addAndGroup\": \"Voeg EN Groep\",\n \"filter.group.addOrGroup\": \"Voeg OF Groep\",\n \"filter.group.removeGroup\": \"Verwijderen groep\",\n \"filter.group.empty\": \"Geen conditions in deze groep\",\n \"filter.group.addFilterLink\": \"Voeg a filter\",\n \"filter.modal.title\": \"Bewerken Filter\",\n \"filter.modal.fieldLabel\": \"Veld\",\n \"filter.modal.operatorLabel\": \"Operator\",\n \"filter.modal.valueLabel\": \"Waarde\",\n \"filter.modal.selectRange\": \"Selecteer range\",\n \"filter.modal.noValueRequired\": \"Geen waarde vereist\",\n \"filter.modal.dateTo\": \"naar\",\n \"filter.modal.min\": \"Min\",\n \"filter.modal.to\": \"naar\",\n \"filter.modal.max\": \"Max\",\n \"filter.modal.enterNumber\": \"Enter nummer\",\n \"filter.modal.loading\": \"Laden...\",\n \"filter.modal.selectValue\": \"Selecteer waarde...\",\n \"filter.modal.search\": \"Zoeken...\",\n \"filter.modal.errorPrefix\": \"Fout:\",\n \"filter.modal.noValues\": \"Geen waarden gevonden\",\n \"filter.modal.multiSelectHint\": \"Houd Shift ingedrukt om meerdere waarden te selecteren\",\n \"filter.modal.enterValue\": \"Enter waarde...\",\n \"filter.removeButton.title\": \"Verwijderen filter\",\n \"filter.section.clearAll\": \"Wissen alle\",\n \"filter.section.dropHint\": \"Sleep hierheen om filter toe te voegen\",\n \"filter.section.empty\": \"Geen filters toegepast\",\n \"filter.valueDisplay.empty\": \"(leeg)\",\n \"filter.valueDisplay.more\": \"meer\",\n \"filter.operator.equals.label\": \"gelijk aan\",\n \"filter.operator.equals.description\": \"Exacte overeenkomst\",\n \"filter.operator.notEquals.label\": \"niet gelijk aan\",\n \"filter.operator.notEquals.description\": \"Komt niet overeen\",\n \"filter.operator.contains.label\": \"bevat\",\n \"filter.operator.contains.description\": \"Bevat tekst (hoofdletterongevoelig)\",\n \"filter.operator.notContains.label\": \"niet bevat\",\n \"filter.operator.notContains.description\": \"Bevat geen tekst\",\n \"filter.operator.startsWith.label\": \"begint met\",\n \"filter.operator.startsWith.description\": \"Begint met tekst\",\n \"filter.operator.notStartsWith.label\": \"niet begint met\",\n \"filter.operator.notStartsWith.description\": \"Begint niet met tekst\",\n \"filter.operator.endsWith.label\": \"eindigt met\",\n \"filter.operator.endsWith.description\": \"Eindigt met tekst\",\n \"filter.operator.notEndsWith.label\": \"niet eindigt met\",\n \"filter.operator.notEndsWith.description\": \"Eindigt niet met tekst\",\n \"filter.operator.like.label\": \"like\",\n \"filter.operator.like.description\": \"SQL LIKE pattern overeenkomstige (hoofdletter gevoelig)\",\n \"filter.operator.notLike.label\": \"niet like\",\n \"filter.operator.notLike.description\": \"SQL NIET LIKE pattern overeenkomstige (hoofdletter gevoelig)\",\n \"filter.operator.ilike.label\": \"ilike\",\n \"filter.operator.ilike.description\": \"SQL ILIKE pattern overeenkomstige (hoofdletter ongevoelig)\",\n \"filter.operator.gt.label\": \"groter dan\",\n \"filter.operator.gt.description\": \"Groter dan waarde\",\n \"filter.operator.gte.label\": \"groter dan van gelijk\",\n \"filter.operator.gte.description\": \"Groter dan van gelijk naar waarde\",\n \"filter.operator.lt.label\": \"kleiner dan\",\n \"filter.operator.lt.description\": \"Kleiner dan waarde\",\n \"filter.operator.lte.label\": \"kleiner dan van gelijk\",\n \"filter.operator.lte.description\": \"Kleiner dan van gelijk naar waarde\",\n \"filter.operator.between.label\": \"tussen\",\n \"filter.operator.between.description\": \"Tussen twee waarden (inclusive)\",\n \"filter.operator.notBetween.label\": \"niet tussen\",\n \"filter.operator.notBetween.description\": \"Niet tussen twee waarden\",\n \"filter.operator.in.label\": \"in\",\n \"filter.operator.in.description\": \"Komt overeen elke van de opgegeven waarden\",\n \"filter.operator.notIn.label\": \"niet in\",\n \"filter.operator.notIn.description\": \"Komt niet overeen elke van de opgegeven waarden\",\n \"filter.operator.set.label\": \"is set\",\n \"filter.operator.set.description\": \"Is niet nul/leeg\",\n \"filter.operator.notSet.label\": \"is niet set\",\n \"filter.operator.notSet.description\": \"Is nul/leeg\",\n \"filter.operator.isEmpty.label\": \"is leeg\",\n \"filter.operator.isEmpty.description\": \"Is leeg tekenreeks van nul\",\n \"filter.operator.isNotEmpty.label\": \"is niet leeg\",\n \"filter.operator.isNotEmpty.description\": \"Is niet leeg tekenreeks en niet nul\",\n \"filter.operator.inDateRange.label\": \"in datum bereik\",\n \"filter.operator.inDateRange.description\": \"Tussen twee dates\",\n \"filter.operator.beforeDate.label\": \"voor datum\",\n \"filter.operator.beforeDate.description\": \"Voor opgegeven datum\",\n \"filter.operator.afterDate.label\": \"na datum\",\n \"filter.operator.afterDate.description\": \"Na opgegeven datum\",\n \"filter.operator.regex.label\": \"komt overeen regex\",\n \"filter.operator.regex.description\": \"Komt overeen reguliere expressie pattern\",\n \"filter.operator.notRegex.label\": \"niet komt overeen regex\",\n \"filter.operator.notRegex.description\": \"Komt niet overeen reguliere expressie pattern\",\n \"filter.operator.arrayContains.label\": \"array bevat alle\",\n \"filter.operator.arrayContains.description\": \"Array veld bevat alle opgegeven waarden (PostgreSQL alleen)\",\n \"filter.operator.arrayOverlaps.label\": \"array bevat elke\",\n \"filter.operator.arrayOverlaps.description\": \"Array veld bevat elke van de opgegeven waarden (PostgreSQL alleen)\",\n \"filter.operator.arrayContained.label\": \"array waarden in\",\n \"filter.operator.arrayContained.description\": \"Alle array veld waarden vallen binnen specified waarden (PostgreSQL only)\",\n \"dateRange.custom\": \"Aangepast\",\n \"dateRange.today\": \"Vandaag\",\n \"dateRange.yesterday\": \"Gisteren\",\n \"dateRange.thisWeek\": \"Deze week\",\n \"dateRange.thisMonth\": \"Deze maand\",\n \"dateRange.thisQuarter\": \"Deze quarter\",\n \"dateRange.thisYear\": \"Deze jaar\",\n \"dateRange.last7Days\": \"Laatste 7 days\",\n \"dateRange.last30Days\": \"Laatste 30 days\",\n \"dateRange.lastNDays\": \"Laatste N days\",\n \"dateRange.lastWeek\": \"Laatste week\",\n \"dateRange.lastNWeeks\": \"Laatste N weeks\",\n \"dateRange.lastMonth\": \"Laatste month\",\n \"dateRange.last12Months\": \"Laatste 12 months\",\n \"dateRange.lastNMonths\": \"Laatste N months\",\n \"dateRange.lastQuarter\": \"Laatste quarter\",\n \"dateRange.lastNQuarters\": \"Laatste N quarters\",\n \"dateRange.lastYear\": \"Laatste jaar\",\n \"dateRange.lastNYears\": \"Laatste N years\",\n \"timeGranularity.hour\": \"Uur\",\n \"timeGranularity.day\": \"Dag\",\n \"timeGranularity.week\": \"Week\",\n \"timeGranularity.month\": \"Maand\",\n \"timeGranularity.quarter\": \"Kwartaal\",\n \"timeGranularity.year\": \"Jaar\",\n \"query.limit.label\": \"Limiet\",\n \"query.limit.clear\": \"Wissen\",\n \"chart.bar.label\": \"Staaf Grafiek\",\n \"chart.bar.description\": \"Vergelijk waarden over categorieën\",\n \"chart.bar.useCase\": \"Beste voor het vergelijken van discrete categorieën, het tonen van ranglijsten of het weergeven van wijzigingen in de tijd\",\n \"chart.line.label\": \"Lijn Grafiek\",\n \"chart.line.description\": \"Toon trends en wijzigingen in de tijd\",\n \"chart.line.useCase\": \"Beste voor doorlopende gegevens, trends, time reeksen, en toont relationships tussen multiple reeksen\",\n \"chart.area.label\": \"Area Grafiek\",\n \"chart.area.description\": \"Benadruk de omvang van veranderingen in de tijd\",\n \"chart.area.useCase\": \"Beste voor het tonen van cumulatieve totalen, volumewijzigingen of gestapelde vergelijkingen in de tijd\",\n \"chart.pie.label\": \"Taart Grafiek\",\n \"chart.pie.description\": \"Toon proportions of a whole\",\n \"chart.pie.useCase\": \"Beste voor toont percentage distribution of composition of a totaal (limit naar 5-7 slices)\",\n \"chart.scatter.label\": \"Spreiding Plot\",\n \"chart.scatter.description\": \"Reveal correlations tussen variables\",\n \"chart.scatter.useCase\": \"Beste voor identifying patterns, correlations, outliers, en relationships tussen two metingen\",\n \"chart.bubble.label\": \"Bubble Grafiek\",\n \"chart.bubble.description\": \"Vergelijk three dimensies of gegevens\",\n \"chart.bubble.useCase\": \"Beste voor toont relationships tussen three variables (X, Y, en size), market analyse\",\n \"chart.radar.label\": \"Radar Grafiek\",\n \"chart.radar.description\": \"Vergelijk meerdere metingen over categorieën\",\n \"chart.radar.useCase\": \"Beste voor multivariate comparisons, prestatie metingen, strengths/weaknesses analyse\",\n \"chart.radialBar.label\": \"Radial Staaf Grafiek\",\n \"chart.radialBar.description\": \"Circular voortgang en KPI visualisatie\",\n \"chart.radialBar.useCase\": \"Beste voor toont voortgang toward doelen, KPIs, of comparing percentages in a compact form\",\n \"chart.treemap.label\": \"Boomkaart\",\n \"chart.treemap.description\": \"Visualise hierarchical gegevens met nested rectangles\",\n \"chart.treemap.useCase\": \"Beste voor toont part-naar-whole relationships in hierarchical gegevens, disk usage, budget allocation\",\n \"chart.table.label\": \"Gegevens Tabel\",\n \"chart.table.description\": \"Weergave gedetailleerde tabular gegevens\",\n \"chart.table.useCase\": \"Beste voor precise waarden, gedetailleerde analyse, sortable/filterable gegevens exploration\",\n \"chart.recordsTable.label\": \"Recordstabel\",\n \"chart.recordsTable.description\": \"Toon losse records met opmaak per kolom\",\n \"chart.recordsTable.useCase\": \"Het beste voor het doorbladeren van detailrecords — badges, voortgangsbalken en links per kolom\",\n \"chart.activityGrid.label\": \"Activiteit Raster\",\n \"chart.activityGrid.description\": \"GitHub-stijl activiteitenraster dat temporele patronen over verschillende tijdschalen toont\",\n \"chart.activityGrid.useCase\": \"Beste voor het visualiseren van activiteitspatronen in de tijd. Ondersteunt uur (3-uursblokken × dagen), dag (dagen × weken), week (weken × maanden), maand (maanden × kwartalen) en kwartaal (kwartalen × jaren) granulariteit\",\n \"chart.kpiNumber.label\": \"KPI Nummer\",\n \"chart.kpiNumber.description\": \"Weergave key prestatie indicators as large numbers\",\n \"chart.kpiNumber.useCase\": \"Perfect voor toont belangrijk metrieken like omzet, gebruiker aantal, van andere sleutel business metrieken in een prominent, easy-naar-read format\",\n \"chart.kpiDelta.label\": \"KPI-delta\",\n \"chart.kpiDelta.description\": \"Weergave change tussen latest en previous waarden met trend indicators\",\n \"chart.kpiDelta.useCase\": \"Ideaal voor het tonen van prestatieveranderingen in de tijd, zoals omzetgroei, wijzigingen in gebruikersacquisitie en andere metrieken waarbij trend en delta belangrijker zijn dan de absolute waarde\",\n \"chart.kpiText.label\": \"KPI Tekst\",\n \"chart.kpiText.description\": \"Weergave key prestatie indicators as customisable text\",\n \"chart.kpiText.useCase\": \"Perfect voor toont metrieken met custom formatting, combining meerdere waarden, van displaying contextual KPI information met templates\",\n \"chart.markdown.label\": \"Markdown\",\n \"chart.markdown.description\": \"Weergave custom markdown content met formatting\",\n \"chart.markdown.useCase\": \"Perfect voor adding documentation, notes, section kopteksten, instructions, van formatted tekst naar dashboards\",\n \"chart.markdown.contentHint\": \"Markdown, of een datasjabloon wanneer er een query is gekoppeld\",\n \"chart.markdown.contentDescription\": \"Markdown. Met een gekoppelde query wordt dit een sjabloon. Variabelen: rows, labelled, data, rowCount, first, last.\",\n \"chart.markdown.contentDocsLabel\": \"Naslagwerk sjabloonsyntaxis\",\n \"chart.config.learnMore\": \"Meer informatie\",\n \"chart.markdown.contentPlaceholder\": \"## Personeelsbestand\\n\\nWe hebben **{{ rows | map:\\\"employees_count\\\" | sum }}** medewerkers verdeeld over {{ rowCount }} teams.\\n\\n{{ labelled | table }}\",\n \"chart.funnel.label\": \"Funnel Grafiek\",\n \"chart.funnel.description\": \"Toon conversion through sequential stappen\",\n \"chart.funnel.useCase\": \"Beste voor visualiseren user journey funnels, verkoop pipelines, of meerdere-stap processes\",\n \"chart.sankey.label\": \"Sankey Grafiek\",\n \"chart.sankey.description\": \"Toon flow tussen states of stappen\",\n \"chart.sankey.useCase\": \"Beste voor visualiseren user journey flows, pad analyse, of state transitions\",\n \"chart.sunburst.label\": \"Sunburst Grafiek\",\n \"chart.sunburst.description\": \"Toon hierarchical flow as radial rings\",\n \"chart.sunburst.useCase\": \"Beste voor visualiseren forward paden van a startende gebeurtenis in a compact radial layout\",\n \"chart.heatmap.label\": \"Heatmap\",\n \"chart.heatmap.description\": \"Visualiseer intensiteit over twee dimensies\",\n \"chart.heatmap.useCase\": \"Beste voor toont patterns in matrix gegevens like correlations, schedules, of categorie comparisons\",\n \"chart.retentionHeatmap.label\": \"Retentie Matrix\",\n \"chart.retentionHeatmap.description\": \"Cohort retentie matrix visualisatie\",\n \"chart.retentionHeatmap.useCase\": \"Visualiseer gebruikersretentie in de tijd per cohort\",\n \"chart.retentionCombined.label\": \"Retentie Grafiek\",\n \"chart.retentionCombined.description\": \"Combined retentie visualisatie met lijngrafiek en heatmap modes\",\n \"chart.retentionCombined.useCase\": \"Visualiseer gebruikersretentie in de tijd met optionele segmentatie naar uitsplitsing\",\n \"chart.boxPlot.label\": \"Boxplot\",\n \"chart.boxPlot.description\": \"Toon statistische verdeling (mediaan, IQR, whiskers) over categorieën\",\n \"chart.boxPlot.useCase\": \"Beste voor P&L-spreiding per symbool, verdeling van handelsgrootte en latentieverdeling over platforms\",\n \"chart.dotStrip.label\": \"Puntenstrookdiagram\",\n \"chart.dotStrip.description\": \"Toon elke individuele waarde als een punt, gegroepeerd in categoriebanden\",\n \"chart.dotStrip.useCase\": \"Beste voor het vergelijken van individuen binnen een groep — spreiding van output per team, salaris per schaal, latentie per endpoint\",\n \"chart.waterfall.label\": \"Waterfall Grafiek\",\n \"chart.waterfall.description\": \"Toon cumulative effect of sequential positive en negative waarden\",\n \"chart.waterfall.useCase\": \"Beste voor P&L decomposition, cash flow analyse, budget variance, of elke sequential contribution breakdown\",\n \"chart.candlestick.label\": \"Candlestick Grafiek\",\n \"chart.candlestick.description\": \"Financial candlestick grafiek toont openen/sluiten body en hoog/laag wicks\",\n \"chart.candlestick.useCase\": \"Beste voor EOD quotes (bid/ask spread per date/symbol), markout distribution bands, of OHLC price gegevens\",\n \"chart.measureProfile.label\": \"Meting Profile\",\n \"chart.measureProfile.description\": \"Plot N metingen als opeenvolgende X-aspunten om een profiel of vorm over intervallen te visualiseren\",\n \"chart.measureProfile.useCase\": \"Beste voor markout-intervalanalyse (bijv. avgMinus2m → avgAtEvent → avgPlus2h), metricprofielen of elk patroon over geordende metingen\",\n \"chart.gauge.label\": \"Gauge Grafiek\",\n \"chart.gauge.description\": \"Half-circle arc meter voor een enkele KPI waarde versus een maximum target\",\n \"chart.gauge.useCase\": \"Beste voor hoogwatermerken vs equity, margin utilisation, of elke enkele waarde voortgang toward a doel\",\n \"chart.config.chartType\": \"Grafiek Type\",\n \"chart.config.loading\": \"Laden grafiek configuratie...\",\n \"chart.config.axisConfig\": \"Grafiek Configuration\",\n \"chart.config.unassigned\": \"Unassigned Velden\",\n \"chart.config.unassignedHint\": \"Drag velden naar grafiek axes above\",\n \"chart.config.noFields\": \"Voeg metingen en uitsplitsingen toe in het tabblad Query om grafiekassen te configureren\",\n \"chart.dropZone.xAxis.label\": \"X-As (Categorieën)\",\n \"chart.dropZone.xAxis.description\": \"Dimensies en time dimensies voor grouping\",\n \"chart.dropZone.xAxis.empty\": \"Sleep dimensies & tijd dimensies hier\",\n \"chart.dropZone.yAxis.label\": \"Y-As (Waarden)\",\n \"chart.dropZone.yAxis.description\": \"Metingen voor waarden of dimensies voor reeksen\",\n \"chart.dropZone.yAxis.empty\": \"Sleep metingen van dimensies hier\",\n \"chart.dropZone.series.label\": \"Reeks (Splits naar Multiple Reeks)\",\n \"chart.dropZone.series.description\": \"Dimensies naar create separate gegevens reeksen\",\n \"chart.dropZone.series.empty\": \"Sleep dimensies hier naar splits gegevens naar reeksen\",\n \"chart.dropZone.maxReached\": \"Maximaal aantal items bereikt\",\n \"chart.dropZone.default.empty\": \"Sleep velden hierheen\",\n \"chart.bar.dropZone.xAxis.empty\": \"Sleep dimensies & tijdsdimensies hierheen\",\n \"chart.bar.dropZone.yAxis.empty\": \"Sleep metingen hierheen\",\n \"chart.bar.dropZone.series.empty\": \"Sleep dimensies hierheen om gegevens in reeksen te splitsen\",\n \"chart.line.dropZone.xAxis.empty\": \"Sleep tijdsdimensies of dimensies hierheen\",\n \"chart.line.dropZone.yAxis.empty\": \"Sleep metingen hierheen\",\n \"chart.line.dropZone.series.empty\": \"Sleep dimensies hierheen voor meerdere lijnen\",\n \"chart.area.dropZone.xAxis.empty\": \"Sleep tijdsdimensies of dimensies hierheen\",\n \"chart.area.dropZone.yAxis.empty\": \"Sleep metingen hierheen\",\n \"chart.area.dropZone.series.empty\": \"Sleep dimensies hierheen voor gestapelde gebieden\",\n \"chart.pie.dropZone.xAxis.empty\": \"Sleep een dimensie voor categorieën\",\n \"chart.pie.dropZone.yAxis.empty\": \"Sleep een meting voor waarden\",\n \"chart.scatter.dropZone.xAxis.empty\": \"Sleep een veld voor X-as\",\n \"chart.scatter.dropZone.yAxis.empty\": \"Sleep een meting voor Y-as\",\n \"chart.scatter.dropZone.series.empty\": \"Sleep een dimensie om punten te kleuren\",\n \"chart.bubble.dropZone.xAxis.empty\": \"Sleep een veld voor X-aspositie\",\n \"chart.bubble.dropZone.yAxis.empty\": \"Sleep een meting voor Y-aspositie\",\n \"chart.bubble.dropZone.sizeField.empty\": \"Sleep een meting voor bellengrootte\",\n \"chart.bubble.dropZone.series.empty\": \"Sleep een dimensie voor bellenlabels\",\n \"chart.bubble.dropZone.colorField.empty\": \"Sleep een veld voor bellenkleur (optioneel)\",\n \"chart.radar.dropZone.xAxis.empty\": \"Sleep dimensies voor radarassen\",\n \"chart.radar.dropZone.yAxis.empty\": \"Sleep metingen voor waarden\",\n \"chart.radar.dropZone.series.empty\": \"Sleep dimensies voor meerdere vormen\",\n \"chart.radialBar.dropZone.xAxis.empty\": \"Sleep dimensies voor categorieën\",\n \"chart.radialBar.dropZone.yAxis.empty\": \"Sleep een meting voor waarden\",\n \"chart.treemap.dropZone.xAxis.empty\": \"Sleep dimensies voor categorieën\",\n \"chart.treemap.dropZone.yAxis.empty\": \"Sleep een meting voor grootte\",\n \"chart.treemap.dropZone.series.empty\": \"Sleep een dimensie voor kleurgroepering\",\n \"chart.table.dropZone.xAxis.empty\": \"Sleep velden om als kolommen weer te geven (of laat leeg voor alles)\",\n \"chart.recordsTable.dropZone.columns.label\": \"Kolommen\",\n \"chart.recordsTable.dropZone.columns.description\": \"Velden die als kolommen worden getoond, in deze volgorde\",\n \"chart.recordsTable.dropZone.columns.empty\": \"Sleep velden hierheen om als kolom te tonen (of laat leeg voor alle)\",\n \"chart.recordsTable.dropZone.hiddenColumns.label\": \"Verborgen velden\",\n \"chart.recordsTable.dropZone.hiddenColumns.description\": \"Opgehaald voor rijcontext en links, maar nooit getoond\",\n \"chart.recordsTable.dropZone.hiddenColumns.empty\": \"Sleep velden hierheen om ze op te halen zonder ze te tonen\",\n \"chart.recordsTable.option.columnFormats.label\": \"Kolomopmaak\",\n \"chart.recordsTable.option.columnFormats.description\": \"Kies hoe elke kolom zijn waarde weergeeft\",\n \"chart.recordsTable.option.pageSize.label\": \"Rijen per pagina\",\n \"chart.recordsTable.option.pageSize.description\": \"Hoeveel records tegelijk worden getoond\",\n \"chart.recordsTable.option.pageSize.option.25\": \"25\",\n \"chart.recordsTable.option.pageSize.option.50\": \"50\",\n \"chart.recordsTable.option.pageSize.option.100\": \"100\",\n \"chart.recordsTable.option.rowLink.label\": \"Rijlink\",\n \"chart.recordsTable.option.rowLink.description\": \"Maak van elke rij een link. Gebruik {Cube.field}-tokens — verborgen velden werken ook. Alleen relatieve paden en http(s)-URL's.\",\n \"chart.recordsTable.rowLink.urlTemplate\": \"URL-sjabloon\",\n \"chart.recordsTable.rowLink.placeholder\": \"/employees/{Employees.id}\",\n \"chart.recordsTable.rowLink.target.self\": \"Zelfde tabblad\",\n \"chart.recordsTable.rowLink.target.blank\": \"Nieuw tabblad\",\n \"chart.recordsTable.columnFormats.noColumns\": \"Wijs eerst kolommen toe — elke kolom kan hier daarna worden opgemaakt\",\n \"chart.recordsTable.columnFormats.kind.text\": \"Tekst\",\n \"chart.recordsTable.columnFormats.kind.number\": \"Getal\",\n \"chart.recordsTable.columnFormats.kind.date\": \"Datum\",\n \"chart.recordsTable.columnFormats.kind.badge\": \"Label\",\n \"chart.recordsTable.columnFormats.kind.progress\": \"Voortgang\",\n \"chart.recordsTable.columnFormats.numberFormat\": \"Getalopmaak\",\n \"chart.recordsTable.columnFormats.granularity\": \"Granulariteit\",\n \"chart.recordsTable.columnFormats.badgeColours\": \"Waardekleuren\",\n \"chart.recordsTable.columnFormats.badgeColour\": \"Kleur\",\n \"chart.recordsTable.columnFormats.badgeValue\": \"Waarde\",\n \"chart.recordsTable.columnFormats.badgeAdd\": \"Waarde toevoegen\",\n \"chart.recordsTable.columnFormats.badgeRemove\": \"Waarde verwijderen\",\n \"chart.recordsTable.columnFormats.progressMin\": \"Minimum\",\n \"chart.recordsTable.columnFormats.progressMax\": \"Maximum\",\n \"chart.recordsTable.columnFormats.progressStyle\": \"Stijl\",\n \"chart.recordsTable.columnFormats.progressStyle.bar\": \"Balk\",\n \"chart.recordsTable.columnFormats.progressStyle.circle\": \"Cirkel\",\n \"chart.recordsTable.columnFormats.header\": \"Kopregel\",\n \"chart.activityGrid.dropZone.dateField.empty\": \"Sleep een tijdsdimensie (granulariteit beïnvloedt rasterstructuur)\",\n \"chart.activityGrid.dropZone.valueField.empty\": \"Sleep een meting voor activiteitsintensiteit\",\n \"chart.kpiNumber.dropZone.yAxis.empty\": \"Sleep een meting hierheen\",\n \"chart.kpiDelta.dropZone.yAxis.empty\": \"Sleep een meting hierheen\",\n \"chart.kpiDelta.dropZone.xAxis.empty\": \"Sleep een dimensie voor ordening\",\n \"chart.kpiText.dropZone.yAxis.empty\": \"Sleep een meting hierheen\",\n \"chart.funnel.dropZone.xAxis.empty\": \"Stappen gedefinieerd in trechterconfig\",\n \"chart.funnel.dropZone.yAxis.empty\": \"Tellingen berekend uit trechteruitvoering\",\n \"chart.sankey.dropZone.xAxis.empty\": \"Automatisch ingevuld vanuit stroomconfig\",\n \"chart.sankey.dropZone.yAxis.empty\": \"Berekend vanuit stroomuitvoering\",\n \"chart.sunburst.dropZone.xAxis.empty\": \"Automatisch ingevuld vanuit stroomconfig\",\n \"chart.sunburst.dropZone.yAxis.empty\": \"Berekend vanuit stroomuitvoering\",\n \"chart.heatmap.dropZone.xAxis.empty\": \"Sleep één dimensie hierheen\",\n \"chart.heatmap.dropZone.yAxis.empty\": \"Sleep één dimensie hierheen\",\n \"chart.heatmap.dropZone.valueField.empty\": \"Sleep één meting hierheen\",\n \"chart.boxPlot.dropZone.xAxis.empty\": \"Sleep een dimensie hierheen\",\n \"chart.boxPlot.dropZone.yAxis.empty\": \"Sleep 1, 3 of 5 metingen hierheen\",\n \"chart.dotStrip.dropZone.xAxis.label\": \"Banden (rijen)\",\n \"chart.dotStrip.dropZone.xAxis.description\": \"Dimensie die punten in rijen groepeert, bijv. team, schaal, regio\",\n \"chart.dotStrip.dropZone.xAxis.empty\": \"Sleep een dimensie om op te groeperen\",\n \"chart.dotStrip.dropZone.yAxis.label\": \"Waarde (horizontale positie)\",\n \"chart.dotStrip.dropZone.yAxis.description\": \"Meting die elk punt langs de horizontale as positioneert\",\n \"chart.dotStrip.dropZone.yAxis.empty\": \"Sleep een meting hierheen\",\n \"chart.dotStrip.dropZone.series.label\": \"Puntidentiteit\",\n \"chart.dotStrip.dropZone.series.description\": \"Dimensie die elk punt een eigen rij geeft — één punt per waarde, benoemd in de tooltip\",\n \"chart.dotStrip.dropZone.series.empty\": \"Sleep een dimensie om in losse punten te splitsen\",\n \"chart.waterfall.dropZone.xAxis.empty\": \"Sleep een dimensie hierheen\",\n \"chart.waterfall.dropZone.yAxis.empty\": \"Sleep een meting hierheen\",\n \"chart.candlestick.dropZone.xAxis.empty\": \"Sleep een tijd- of dimensie hierheen\",\n \"chart.candlestick.dropZone.yAxis.empty\": \"Sleep 2+ metingen hierheen\",\n \"chart.measureProfile.dropZone.yAxis.empty\": \"Sleep 2+ metingen hierheen (weergegeven links → rechts)\",\n \"chart.measureProfile.dropZone.series.empty\": \"Sleep een dimensie hierheen om meerdere lijnen te maken\",\n \"chart.gauge.dropZone.yAxis.empty\": \"Sleep 1 meting hierheen (optioneel 2e voor dynamisch max)\",\n \"chart.activityGrid.validation.timeDimensionRequired\": \"Tijdsdimensie is vereist voor activiteitsraster\",\n \"chart.activityGrid.validation.measureRequired\": \"Activiteitsmeting is vereist voor intensiteitstoewijzing\",\n \"chart.kpiDelta.validation.measureRequired\": \"Een meting is vereist voor KPI Delta-grafieken\",\n \"chart.heatmap.validation.xAxisRequired\": \"X-as dimensie vereist\",\n \"chart.heatmap.validation.yAxisRequired\": \"Y-as dimensie vereist\",\n \"chart.heatmap.validation.valueRequired\": \"Waardemeting vereist\",\n \"chart.option.stacking.label\": \"Stapeling\",\n \"chart.option.stacking.none\": \"Geen\",\n \"chart.option.stacking.stacked\": \"Gestapeld\",\n \"chart.option.stacking.percent\": \"Gestapeld 100%\",\n \"chart.option.stacking.description\": \"Hoe naar stack meerdere reeksen\",\n \"chart.option.target.label\": \"Doelwaardes\",\n \"chart.option.target.description\": \"Enkele waarde of door komma's gescheiden waarden om over de X-as te spreiden\",\n \"chart.option.connectNulls.label\": \"Verbind null-waarden\",\n \"chart.option.connectNulls.description\": \"Tekenen doorlopende regel through ontbrekend gegevens punten\",\n \"chart.option.fillMissingDates.label\": \"Ontbrekende datums aanvullen\",\n \"chart.option.fillMissingDates.description\": \"Toon ontbrekende tijdsperioden met de opvulwaarde (standaard 0). Automatisch volgt de cube-definitie.\",\n \"chart.option.fillMissingDates.auto\": \"Automatisch\",\n \"chart.option.fillMissingDates.on\": \"Aan\",\n \"chart.option.fillMissingDates.off\": \"Uit\",\n \"chart.option.showAllXLabels.label\": \"Toon alle X-labels\",\n \"chart.option.showAllXLabels.description\": \"Toon elk label op de X-as in plaats van overlappende labels automatisch te verbergen\",\n \"chart.option.leftYAxisFormat.label\": \"Left Y-As Format\",\n \"chart.option.leftYAxisFormat.description\": \"Nummer formatting voor left Y-axis\",\n \"chart.option.rightYAxisFormat.label\": \"Right Y-As Format\",\n \"chart.option.rightYAxisFormat.description\": \"Nummer formatting voor right Y-axis\",\n \"chart.option.xAxisFormat.label\": \"X-As Format\",\n \"chart.option.xAxisFormat.description\": \"Nummer formatting voor X-axis\",\n \"chart.option.yAxisFormat.label\": \"Y-As Format\",\n \"chart.option.yAxisFormat.description\": \"Nummer formatting voor Y-axis\",\n \"chart.option.valueFormat.label\": \"Waarde Format\",\n \"chart.option.valueFormat.description\": \"Nummer formatting voor waarden\",\n \"chart.option.innerRadius.label\": \"Binnenradius\",\n \"chart.option.innerRadius.description\": \"Hollow centre grootte (0% = solid pie, higher = donut style)\",\n \"chart.option.showLabels.label\": \"Toon Cell Waarden\",\n \"chart.option.showLabels.description\": \"Weergave waarden inside each cell\",\n \"chart.option.cellShape.label\": \"Celvorm\",\n \"chart.option.cellShape.rectangle\": \"Rechthoek\",\n \"chart.option.cellShape.circle\": \"Cirkel\",\n \"chart.option.funnelStyle.label\": \"Trechterstijl\",\n \"chart.option.funnelStyle.bars\": \"Balken\",\n \"chart.option.funnelStyle.funnel\": \"Trechter\",\n \"chart.option.funnelOrientation.label\": \"Oriëntatie\",\n \"chart.option.funnelOrientation.horizontal\": \"Horizontaal\",\n \"chart.option.funnelOrientation.vertical\": \"Verticaal\",\n \"chart.option.hideSummaryFooter.label\": \"Verbergen Samenvatting Footer\",\n \"chart.option.hideSummaryFooter.description\": \"Verberg de samenvattingsfooter die het aantal stappen en de totale conversie toont\",\n \"chart.option.showConversion.label\": \"Toon Conversion Rate\",\n \"chart.option.showConversion.description\": \"Weergave stap-naar-stap conversion percentage\",\n \"chart.option.showAvgTime.label\": \"Toon Avg Tijd\",\n \"chart.option.showAvgTime.description\": \"Weergave average time naar convert\",\n \"chart.option.showMedianTime.label\": \"Toon Median Tijd\",\n \"chart.option.showMedianTime.description\": \"Weergave median time naar convert\",\n \"chart.option.showP90Time.label\": \"Toon P90 Tijd\",\n \"chart.option.showP90Time.description\": \"Weergave 90th percentile time naar convert\",\n \"chart.option.linkOpacity.label\": \"Link-opaciteit\",\n \"chart.option.linkOpacity.light\": \"Licht\",\n \"chart.option.linkOpacity.medium\": \"Gemiddeld\",\n \"chart.option.linkOpacity.dark\": \"Donker\",\n \"chart.option.showNodeLabels.label\": \"Toon Node Labels\",\n \"chart.option.showNodeLabels.description\": \"Weergave labels on flow nodes\",\n \"chart.option.prefix.label\": \"Voorvoegsel\",\n \"chart.option.prefix.description\": \"Tekst om vóór het getal weer te geven\",\n \"chart.option.suffix.label\": \"Achtervoegsel\",\n \"chart.option.suffix.description\": \"Tekst om na het getal weer te geven\",\n \"chart.option.decimals.label\": \"Aantal decimalen\",\n \"chart.option.decimals.description\": \"Nummer of decimal places naar weergeven\",\n \"chart.option.showHistogram.label\": \"Toon Variance Histogram\",\n \"chart.option.showHistogram.description\": \"Toon historische variantiegrafiek onder de delta\",\n \"chart.option.useLastCompletePeriod.label\": \"Gebruik Laatste Voltooid Periode\",\n \"chart.option.useLastCompletePeriod.description\": \"Exclude current incomplete periode van calculation (e.g., partial week/maand)\",\n \"chart.option.skipLastPeriod.label\": \"Skip Laatste Periode\",\n \"chart.option.skipLastPeriod.description\": \"Always exclude de laatste periode regardless van completeness\",\n \"chart.option.retentionDisplayMode.label\": \"Weergave Mode\",\n \"chart.option.retentionDisplayMode.lineChart\": \"Lijn Grafiek\",\n \"chart.option.retentionDisplayMode.heatmapTable\": \"Heatmap Tabel\",\n \"chart.option.retentionDisplayMode.combined\": \"Gecombineerd\",\n \"chart.option.showLegend.label\": \"Toon Legenda\",\n \"chart.option.showLegend.description\": \"Toon de legenda\",\n \"chart.option.showGrid.label\": \"Toon Grid\",\n \"chart.option.showGrid.description\": \"Toon rasterlijnen op de grafiek\",\n \"chart.option.showTooltip.label\": \"Toon Tooltip\",\n \"chart.option.showTooltip.description\": \"Toon tooltip on zweef met gedetailleerde stats\",\n \"chart.option.priorPeriodStyle.label\": \"Prior Periode Lijn Style\",\n \"chart.option.priorPeriodStyle.dashed\": \"Gestreept\",\n \"chart.option.priorPeriodStyle.dotted\": \"Gestippeld\",\n \"chart.option.priorPeriodStyle.solid\": \"Vol\",\n \"chart.option.priorPeriodStyle.description\": \"Lijn style voor prior period in comparison mode\",\n \"chart.option.priorPeriodOpacity.label\": \"Prior Periode Opacity\",\n \"chart.option.priorPeriodOpacity.description\": \"Opacity voor prior periode lines (0.1 naar 1)\",\n \"chart.option.showTotal.label\": \"Toon Totaal Staaf\",\n \"chart.option.showTotal.description\": \"Append een final staaf toont de draaiend totaal\",\n \"chart.option.showConnectorLine.label\": \"Toon Connector Lijn\",\n \"chart.option.showConnectorLine.description\": \"Tekenen een dashed stap-regel connecting staaf tops\",\n \"chart.option.showDataLabels.label\": \"Toon Gegevens Labels\",\n \"chart.option.showDataLabels.description\": \"Toon de waarde bij elk datapunt\",\n \"chart.option.showReferenceLineAtZero.label\": \"Toon Zero Reference Lijn\",\n \"chart.option.showReferenceLineAtZero.description\": \"Tekenen een dashed regel bij Y = 0\",\n \"chart.option.showMedianMarker.label\": \"Mediaanmarkering tonen\",\n \"chart.option.showMedianMarker.description\": \"Teken een streepje bij de mediaan van elke band\",\n \"chart.option.showBandStats.label\": \"Bandstatistieken tonen\",\n \"chart.option.showBandStats.description\": \"Toon het aantal punten en de spreiding naast elke bandnaam\",\n \"chart.option.showExtremeLabels.label\": \"Uitersten labelen\",\n \"chart.option.showExtremeLabels.description\": \"Benoem het laagste en hoogste punt in elke band\",\n \"chart.option.dotSize.label\": \"Puntgrootte\",\n \"chart.option.dotSize.description\": \"Grotere punten zijn beter zichtbaar maar spreiden de zwerm verder uit\",\n \"chart.option.dotSize.small\": \"Klein\",\n \"chart.option.dotSize.medium\": \"Middel\",\n \"chart.option.dotSize.large\": \"Groot\",\n \"chart.option.bandSort.label\": \"Bandvolgorde\",\n \"chart.option.bandSort.description\": \"Hoe de banden van boven naar beneden worden geordend\",\n \"chart.option.bandSort.none\": \"Queryvolgorde\",\n \"chart.option.bandSort.valueDesc\": \"Hoogste mediaan eerst\",\n \"chart.option.bandSort.valueAsc\": \"Laagste mediaan eerst\",\n \"chart.option.bandSort.count\": \"Meeste punten eerst\",\n \"chart.option.lineType.label\": \"Lijn Interpolation\",\n \"chart.option.lineType.smooth\": \"Vloeiend (monotoon)\",\n \"chart.option.lineType.linear\": \"Lineair\",\n \"chart.option.lineType.step\": \"Stap\",\n \"chart.option.lineType.description\": \"Hoe gegevens punten zijn connected\",\n \"chart.option.rangeMode.label\": \"Grafiek Mode\",\n \"chart.option.rangeMode.ohlc\": \"OHLC (openen, sluiten, hoog, laag)\",\n \"chart.option.rangeMode.range\": \"Bereik (hoog, laag / bid, ask)\",\n \"chart.option.rangeMode.description\": \"OHLC: 4 metingen. Bereik: 2 metingen (hoog + laag).\",\n \"chart.option.bullColor.label\": \"Bullish Kleur\",\n \"chart.option.bullColor.description\": \"Candle kleur when sluiten ≥ openen\",\n \"chart.option.bearColor.label\": \"Bearish Kleur\",\n \"chart.option.bearColor.description\": \"Candle kleur when sluiten < openen\",\n \"chart.option.showWicks.label\": \"Toon Wicks\",\n \"chart.option.showWicks.description\": \"Tekenen hoog/laag wicks above en onder de body\",\n \"chart.option.minValue.label\": \"Minimum Waarde\",\n \"chart.option.minValue.description\": \"Lower bound van de meter arc (standaard 0)\",\n \"chart.option.maxValue.label\": \"Maximum Waarde (static)\",\n \"chart.option.maxValue.description\": \"Upper bound van de meter. Leave leeg naar use yAxis[1] van standaard 100\",\n \"chart.option.showCentreLabel.label\": \"Toon Centre Label\",\n \"chart.option.showCentreLabel.description\": \"Toon huidige waarde en veldnaam in het midden van de gauge\",\n \"chart.option.showPercentage.label\": \"Toon as Percentage\",\n \"chart.option.showPercentage.description\": \"Weergave waarde as % of max instead of raw number\",\n \"chart.option.fitToWidth.label\": \"Fit naar Width\",\n \"chart.option.fitToWidth.description\": \"Automatically grootte blocks naar fill portlet width en hoogte while maintaining aspect ratio\",\n \"chart.option.fontSize.label\": \"Font Grootte\",\n \"chart.option.fontSize.small\": \"Klein\",\n \"chart.option.fontSize.medium\": \"Gemiddeld\",\n \"chart.option.fontSize.large\": \"Groot\",\n \"chart.option.alignment.label\": \"Tekst Alignment\",\n \"chart.option.alignment.left\": \"Links\",\n \"chart.option.alignment.center\": \"Midden\",\n \"chart.option.alignment.right\": \"Rechts\",\n \"chart.option.hideHeader.label\": \"Verbergen Header\",\n \"chart.option.hideHeader.description\": \"Verberg de portlet-headerbalk (titel en actieknoppen)\",\n \"chart.option.transparentBackground.label\": \"Transparante achtergrond\",\n \"chart.option.transparentBackground.description\": \"Verwijderen card background, border, en shadow voor seamless integration as section headers\",\n \"chart.option.autoHeight.label\": \"Automatisch Hoogte\",\n \"chart.option.autoHeight.description\": \"In rij en mobile layouts, grootte naar markdown content instead van fixed rij hoogte\",\n \"chart.option.accentBorder.label\": \"Accentrand\",\n \"chart.option.accentBorder.none\": \"Geen\",\n \"chart.option.accentBorder.left\": \"Links\",\n \"chart.option.accentBorder.top\": \"Boven\",\n \"chart.option.accentBorder.bottom\": \"Onderkant\",\n \"chart.option.accentBorder.description\": \"Voeg een accentkleurige rand toe aan één zijde van de inhoud\",\n \"chart.configText.20_percent\": \"20%\",\n \"chart.configText.40_percent\": \"40%\",\n \"chart.configText.60_percent\": \"60%\",\n \"chart.configText.80_percent\": \"80%\",\n \"chart.configText.accent_color\": \"Accentkleur\",\n \"chart.configText.activity_measure\": \"Activiteitsmeetwaarde\",\n \"chart.configText.add_2_or_more_measures_they_become_the_x_axis_categories_in_the_order_li\": \"Voeg 2 of meer meetwaarden toe — ze worden de X-as-categorieen in de opgegeven volgorde\",\n \"chart.configText.add_an_accent_colored_border_on_one_side_of_the_content\": \"Voeg een accentgekleurde rand toe aan een zijde van de inhoud\",\n \"chart.configText.all_fields_to_display_as_columns\": \"Alle velden om als kolommen weer te geven\",\n \"chart.gauge.thresholds.description\": \"Elke band loopt van zijn waarde tot de volgende. Waarden staan op de schaal van de meter.\",\n \"chart.configText.axes_categories\": \"Assen (Categorieen)\",\n \"chart.configText.bubble_colour\": \"Bubbelkleur\",\n \"chart.configText.bubble_labels\": \"Bubbellabels\",\n \"chart.configText.bubble_radius\": \"Bubbelstraal\",\n \"chart.configText.categories\": \"Categorieen\",\n \"chart.configText.choose_how_to_visualize_retention_data\": \"Kies hoe retentiedata wordt gevisualiseerd\",\n \"chart.configText.color_bubbles_by_this_field_optional\": \"Kleur bubbels op basis van dit veld (optioneel)\",\n \"chart.configText.color_for_negative_changes_decreases\": \"Kleur voor negatieve veranderingen (dalingen)\",\n \"chart.configText.color_for_positive_changes_increases\": \"Kleur voor positieve veranderingen (stijgingen)\",\n \"chart.configText.color_from_the_dashboard_palette_for_headers_bullets_and_links\": \"Kleur uit het dashboardpalet voor koppen, opsommingstekens en links\",\n \"chart.configText.color_from_the_dashboard_palette_for_the_kpi_value_text\": \"Kleur uit het dashboardpalet voor de KPI-waardetekst\",\n \"chart.configText.color_groups\": \"Kleurgroepen\",\n \"chart.configText.columns\": \"Kolommen\",\n \"chart.configText.columns_x_axis\": \"Kolommen (X-as)\",\n \"chart.configText.count_at_each_step_auto_calculated\": \"Aantal per stap (automatisch berekend)\",\n \"chart.configText.count_of_entities_following_each_path\": \"Aantal entiteiten dat elk pad volgt\",\n \"chart.configText.current_value_to_display_on_the_gauge_e_g_current_equity_margin_used\": \"Huidige waarde om op de meter te tonen (bijv. huidige equity, gebruikte marge)\",\n \"chart.configText.dimension_for_column_categories\": \"Dimensie voor kolomcategorieen\",\n \"chart.configText.dimension_for_ordering_data_typically_time\": \"Dimensie voor het ordenen van data (meestal tijd)\",\n \"chart.configText.dimension_for_pie_slices\": \"Dimensie voor taartsegmenten\",\n \"chart.configText.dimension_for_row_categories\": \"Dimensie voor rijcategorieen\",\n \"chart.configText.dimension_labels_for_each_bar_segment_e_g_symbol_transaction_type\": \"Dimensielabels voor elk staafsegment (bijv. symbool, transactietype)\",\n \"chart.configText.dimension_optional\": \"Dimensie (optioneel)\",\n \"chart.configText.dimension_to_color_points_by_category\": \"Dimensie om punten per categorie te kleuren\",\n \"chart.configText.dimension_to_color_rectangles_by_category\": \"Dimensie om rechthoeken per categorie te kleuren\",\n \"chart.configText.dimension_to_group_boxes_by_e_g_symbol_platform\": \"Dimensie om boxen op te groeperen (bijv. symbool, platform)\",\n \"chart.configText.dimension_to_split_data_into_separate_profile_lines_e_g_symbol_platform\": \"Dimensie om data op te splitsen in aparte profiellijnen (bijv. symbool, platform)\",\n \"chart.configText.dimensions_for_radar_axes\": \"Dimensies voor radarassen\",\n \"chart.configText.dimensions_for_radial_segments\": \"Dimensies voor radiale segmenten\",\n \"chart.configText.dimensions_for_treemap_rectangles\": \"Dimensies voor treemap-rechthoeken\",\n \"chart.configText.dimensions_to_create_multiple_radar_shapes\": \"Dimensies om meerdere radarvormen te maken\",\n \"chart.configText.dimensions_to_create_separate_lines\": \"Dimensies om afzonderlijke lijnen te maken\",\n \"chart.configText.dimensions_to_create_stacked_areas\": \"Dimensies om gestapelde gebieden te maken\",\n \"chart.configText.display_the_value_above_each_bar_segment\": \"Toon de waarde boven elk staafsegment\",\n \"chart.configText.display_value_at_each_data_point\": \"Toon de waarde bij elk datapunt\",\n \"chart.configText.drop_1_measure_for_auto_mode_3_for_avg_stddev_median_mode_or_5_for_min_q\": \"Sleep 1 meetwaarde voor automatische modus, 3 voor avg/stddev/mediaanmodus, of 5 voor min/q1/mediaan/q3/max-modus\",\n \"chart.configText.drop_2_4_measures_in_order_open_close_high_low_ohlc_mode_for_range_mode_\": \"Sleep 2-4 meetwaarden in deze volgorde: open, close, high, low (OHLC-modus). Sleep voor bereikmodus 2: high, low.\",\n \"chart.configText.enter_markdown_text_supports_headers_bold_text_italic_text_links_text_ur\": \"Voer markdowntekst in. Ondersteunt koppen (#), vet (**tekst**), cursief (*tekst*), links ([tekst](url)), lijsten (- item) en horizontale lijnen (---).\",\n \"chart.configText.event_dimension_that_categorizes_flow_nodes\": \"Eventdimensie die flowknooppunten categoriseert\",\n \"chart.configText.event_type\": \"Eventtype\",\n \"chart.configText.exclude_current_incomplete_period_from_aggregation_e_g_partial_week_mont\": \"Sluit de huidige onvolledige periode uit van aggregatie (bijv. gedeeltelijke week/maand)\",\n \"chart.configText.exclude_current_incomplete_period_from_delta_calculation_e_g_partial_wee\": \"Sluit de huidige onvolledige periode uit van deltaberekening (bijv. gedeeltelijke week/maand)\",\n \"chart.configText.field_to_use_for_bubble_labels_and_identification\": \"Veld voor bubbellabels en identificatie\",\n \"chart.configText.flow_count\": \"Flowaantal\",\n \"chart.configText.hide_the_statistics_footer_below_the_chart\": \"Verberg de statistiekfooter onder de grafiek\",\n \"chart.configText.hollow_center_size_0_percent_solid_pie_higher_donut_style\": \"Grootte van het holle midden (0% = volle taart, hoger = donutstijl)\",\n \"chart.configText.horizontal_alignment_of_the_markdown_content\": \"Horizontale uitlijning van de markdowninhoud\",\n \"chart.configText.horizontal_axis_position\": \"Horizontale aspositie\",\n \"chart.configText.how_to_stack_multiple_area_series\": \"Hoe meerdere gebiedsreeksen te stapelen\",\n \"chart.configText.how_to_stack_multiple_bar_series\": \"Hoe meerdere staafreeksen te stapelen\",\n \"chart.configText.markdown_content\": \"Markdowninhoud\",\n \"chart.configText.measure_for_rectangle_sizes\": \"Meetwaarde voor rechthoekgroottes\",\n \"chart.configText.measure_for_slice_sizes\": \"Meetwaarde voor segmentgroottes\",\n \"chart.configText.measure_for_y_position\": \"Meetwaarde voor Y-positie\",\n \"chart.configText.measure_or_dimension_for_x_position\": \"Meetwaarde of dimensie voor X-positie\",\n \"chart.configText.measure_that_determines_cell_color\": \"Meetwaarde die de celkleur bepaalt\",\n \"chart.configText.measure_to_display_as_kpi_number\": \"Meetwaarde om als KPI-getal te tonen\",\n \"chart.configText.measure_to_display_in_the_kpi_text_template\": \"Meetwaarde om in de KPI-tekstsjabloon te tonen\",\n \"chart.configText.measure_to_track_changes_for\": \"Meetwaarde om veranderingen voor te volgen\",\n \"chart.configText.measure_used_for_activity_intensity_color_coding\": \"Meetwaarde voor activiteitsintensiteit (kleurcodering)\",\n \"chart.configText.measures_for_area_values\": \"Meetwaarden voor gebiedswaarden\",\n \"chart.configText.measures_for_bar_heights\": \"Meetwaarden voor staafhoogtes\",\n \"chart.configText.measures_for_line_values\": \"Meetwaarden voor lijnwaarden\",\n \"chart.configText.measures_for_radar_values\": \"Meetwaarden voor radarwaarden\",\n \"chart.configText.measures_for_radial_bar_lengths\": \"Meetwaarden voor lengtes van radiale staven\",\n \"chart.configText.measures_x_axis_order\": \"Meetwaarden (X-asvolgorde)\",\n \"chart.configText.negative_change_color\": \"Kleur bij negatieve verandering\",\n \"chart.configText.none_pie\": \"Geen (Taart)\",\n \"chart.configText.number_formatting_for_cell_values_and_legend\": \"Getalopmaak voor celwaarden en legenda\",\n \"chart.configText.number_formatting_for_numeric_values\": \"Getalopmaak voor numerieke waarden\",\n \"chart.configText.number_formatting_for_size_values\": \"Getalopmaak voor groottewaarden\",\n \"chart.configText.number_formatting_for_the_displayed_value_and_axis_labels\": \"Getalopmaak voor de getoonde waarde en aslabels\",\n \"chart.configText.number_formatting_for_the_price_axis\": \"Getalopmaak voor de prijsas\",\n \"chart.configText.number_formatting_for_the_value_axis\": \"Getalopmaak voor de waarde-as\",\n \"chart.configText.number_formatting_for_the_y_axis\": \"Getalopmaak voor de Y-as\",\n \"chart.configText.number_formatting_for_x_axis_labels\": \"Getalopmaak voor X-aslabels\",\n \"chart.configText.number_formatting_for_y_axis_and_values\": \"Getalopmaak voor Y-as en waarden\",\n \"chart.configText.number_formatting_for_y_axis_labels\": \"Getalopmaak voor Y-aslabels\",\n \"chart.configText.number_of_decimal_places_to_display_for_numeric_values\": \"Aantal decimalen om te tonen voor numerieke waarden\",\n \"chart.configText.ohlc_measures_open_close_high_low\": \"OHLC-meetwaarden (open, close, high, low)\",\n \"chart.configText.opacity_of_flow_links\": \"Dekking van flowlinks\",\n \"chart.configText.overall_text_size_for_the_markdown_content\": \"Algemene tekstgrootte voor de markdowninhoud\",\n \"chart.configText.positive_change_color\": \"Kleur bij positieve verandering\",\n \"chart.configText.rows_y_axis\": \"Rijen (Y-as)\",\n \"chart.configText.series_color_groups\": \"Reeksen (Kleurgroepen)\",\n \"chart.configText.series_multiple_lines\": \"Reeksen (Meerdere lijnen)\",\n \"chart.configText.series_multiple_shapes\": \"Reeksen (Meerdere vormen)\",\n \"chart.configText.series_split_into_multiple_lines\": \"Reeksen (Opgesplitst in meerdere lijnen)\",\n \"chart.configText.series_stack_areas\": \"Reeksen (Gebieden stapelen)\",\n \"chart.configText.show_series_legend_only_visible_with_a_series_dimension\": \"Toon reekslegenda (alleen zichtbaar met een reeksdimensie)\",\n \"chart.configText.show_the_color_intensity_legend\": \"Toon de legenda voor kleurintensiteit\",\n \"chart.configText.show_the_legend_for_breakdown_segments\": \"Toon de legenda voor segmenten in uitsplitsing\",\n \"chart.configText.single_measure_whose_values_are_summed_cumulatively\": \"Enkele meetwaarde waarvan de waarden cumulatief worden opgeteld\",\n \"chart.configText.size\": \"Grootte\",\n \"chart.configText.size_of_bubbles_based_on_this_measure\": \"Grootte van bubbels op basis van deze meetwaarde\",\n \"chart.configText.size_of_the_center_hole_0_for_full_circle\": \"Grootte van het middengat (0 voor volledige cirkel)\",\n \"chart.configText.step_count\": \"Stapaantal\",\n \"chart.configText.step_name\": \"Stapnaam\",\n \"chart.configText.step_names_auto_populated_from_funnel_steps\": \"Stapnamen (automatisch ingevuld vanuit funnelstappen)\",\n \"chart.configText.target_value_to_compare_against_first_value_used_if_multiple_provided\": \"Doelwaarde om mee te vergelijken (eerste waarde wordt gebruikt als er meerdere zijn opgegeven)\",\n \"chart.configText.template_for_displaying_the_text_use_value_to_insert_the_measure_value\": \"Sjabloon voor het tonen van tekst. Gebruik ${value} om de meetwaarde in te voegen.\",\n \"chart.configText.text_template\": \"Tekstsjabloon\",\n \"chart.configText.threshold_bands\": \"Drempelbanden\",\n \"chart.configText.time_dimension\": \"Tijddimensie\",\n \"chart.configText.time_dimension_or_category_for_each_candle_e_g_date_symbol\": \"Tijddimensie of categorie voor elke candle (bijv. datum, symbool)\",\n \"chart.configText.time_dimensions_or_dimensions_for_x_axis\": \"Tijddimensies of dimensies voor de X-as\",\n \"chart.configText.time_field_that_determines_grid_structure_granularity_affects_layout\": \"Tijdveld dat de roosterstructuur bepaalt (granulariteit beinvloedt de layout)\",\n \"chart.configText.value\": \"Waarde\",\n \"chart.configText.value_color\": \"Waardekleur\",\n \"chart.configText.value_color_intensity\": \"Waarde (Kleurintensiteit)\",\n \"chart.configText.value_measure\": \"Waardemeetwaarde\",\n \"chart.configText.values\": \"Waarden\",\n \"chart.configText.vertical_axis_position\": \"Verticale aspositie\",\n \"chart.configText.visualization_style\": \"Visualisatiestijl\",\n \"chart.configText.x_axis_groups\": \"X-as (Groepen)\",\n \"chart.configText.x_axis_time_categories\": \"X-as (Tijd/Categorieen)\",\n \"chart.configText.x_axis_time_category\": \"X-as (Tijd / Categorie)\",\n \"chart.configText.y_axis\": \"Y-as\",\n \"chart.configText.y_axis_measures\": \"Y-as (Meetwaarden)\",\n \"chart.configText.y_axis_value\": \"Y-as (Waarde)\",\n \"display.loading\": \"Laden weergeven options...\",\n \"display.noOptions\": \"Geen weergeven options beschikbaar voor deze grafiek type.\",\n \"display.heading\": \"Weergave Opties\",\n \"results.loading.title\": \"Query uitvoeren...\",\n \"results.loading.subtitle\": \"Je query wordt uitgevoerd tegen de Cube API\",\n \"results.error.title\": \"Query Uitvoering Mislukt\",\n \"results.error.subtitle\": \"Er is een fout opgetreden bij het uitvoeren van je query. Controleer de query en probeer het opnieuw.\",\n \"results.waiting.title\": \"Query voorbereiden...\",\n \"results.waiting.subtitle\": \"Je query wordt zo uitgevoerd\",\n \"results.needsRefresh.title\": \"Ready naar Execute\",\n \"results.needsRefresh.subtitle\": \"Klik op vernieuwen om je query uit te voeren\",\n \"results.needsRefresh.runButton\": \"Uitvoeren Query\",\n \"results.empty.query\": \"Voeg metingen of uitsplitsingen toe vanuit het paneel rechts om resultaten te zien\",\n \"results.empty.retention\": \"Selecteer een cube en configureer retentie-instellingen om resultaten te zien\",\n \"results.empty.funnel\": \"Voeg funnelstappen toe om conversieanalyse te zien\",\n \"results.empty.flow\": \"Configureer flowanalyse om gebruikerspaden te zien\",\n \"results.empty.title\": \"Geen Resultaten Yet\",\n \"results.ai.button\": \"Analyse met AI\",\n \"results.noData.title\": \"Query geslaagd\",\n \"results.noData.subtitle\": \"Geen gegevens geretourneerd door de query\",\n \"results.chart.noData\": \"Geen gegevens om weer te geven\",\n \"results.chart.noDataHint\": \"Voer een query uit om grafiekvisualisatie te zien\",\n \"results.chart.unsupported\": \"Unsupported grafiek type\",\n \"results.refreshing\": \"Vernieuwen resultaten...\",\n \"results.header.rows\": \"rijen\",\n \"results.header.row\": \"rij\",\n \"results.header.stale\": \"Resultaten may be outdated\",\n \"results.header.failed\": \"Query mislukt\",\n \"results.header.executing\": \"Uitvoeren...\",\n \"results.header.noResults\": \"Geen results\",\n \"results.view.chart\": \"Grafiek\",\n \"results.view.merged\": \"Samengevoegd\",\n \"results.warning.largeDataset\": \"Groot dataset:\",\n \"results.warning.configChanged\": \"Query configuratie changed. Resultaten may be outdated.\",\n \"results.warning.refreshNow\": \"Vernieuwen Now\",\n \"results.share.copied\": \"Gekopieerd!\",\n \"results.share.noChart\": \"(geen grafiek)\",\n \"server.errors.dbNotConfigured\": \"Database-executor is niet geconfigureerd\",\n \"server.errors.cubeNotFound\": \"Cube '{cubeName}' niet gevonden\",\n \"server.errors.noCubesInQuery\": \"Geen cubes gevonden in query\",\n \"server.errors.dbAdapterRequired\": \"DatabaseExecutor moet hebben een databaseAdapter property\",\n \"server.errors.rlsRequiresTransactions\": \"rlsSetup vereist een database driver dat ondersteunt transactions (db.transaction)\",\n \"server.errors.queryExecutionFailed\": \"Query uitvoering mislukt: {message}\",\n \"server.errors.queryExecutionUnknown\": \"Query-uitvoering mislukt: onbekende fout\",\n \"server.errors.noCompareDateRange\": \"Geen compareDateRange gevonden in query\",\n \"server.errors.compareDateRangeInvalid\": \"compareDateRange vereist bij minimaal 2 periodes\",\n \"server.errors.funnelValidationFailed\": \"Funnel validatie mislukt: {errors}\",\n \"server.errors.flowValidationFailed\": \"Flow validatie mislukt: {errors}\",\n \"server.errors.retentionValidationFailed\": \"Retentie validatie mislukt: {errors}\",\n \"server.errors.cubeRefUnresolved\": \"{cubeName}.joins.{joinName}: target cube '{targetCube}' is niet registered\",\n \"server.errors.unresolvedCubeRefs\": \"Unresolved cube verwijzingen:\\n{details}\",\n \"server.errors.cubeSetIdEmpty\": \"Cube set id mag niet leeg zijn — de lege id is gereserveerd voor de basis cube set\",\n \"server.errors.cubeSetNotFound\": \"Geen cube set geregistreerd voor '{setId}'\",\n \"server.errors.attributeIdRequired\": \"Attribuutdefinities moeten een niet-lege id hebben\",\n \"server.errors.calculatedMeasureValidation\": \"Berekend meting validatie mislukt voor cube '{cubeName}':\\n{details}\",\n \"server.errors.queryValidationFailed\": \"Query validatie mislukt: {errors}\",\n \"server.errors.queryContainsMultipleModes\": \"Query bevat meerdere query modes: {modes}\",\n \"server.errors.primaryCubeNotFound\": \"Primary cube '{cubeName}' niet gevonden\",\n \"server.errors.noJoinPath\": \"Geen join pad gevonden van '{fromCube}' naar '{toCube}'\",\n \"server.errors.cubeNotFoundForMeasure\": \"Cube '{cubeName}' niet gevonden voor meting '{measure}'\",\n \"server.errors.cubeNotFoundForDimension\": \"Cube '{cubeName}' niet gevonden voor dimensie '{dimension}'\",\n \"server.errors.cubeNotFoundForTimeDimension\": \"Cube '{cubeName}' niet gevonden voor tijd dimensie '{timeDimension}'\",\n \"server.errors.invalidFunnelConfig\": \"Query is niet contain a valid funnel configuratie\",\n \"server.errors.invalidFlowConfig\": \"Query is niet contain a valid flow configuratie\",\n \"server.errors.invalidRetentionConfig\": \"Query is niet contain a valid retentie configuratie\",\n \"server.errors.agentResponseTruncated\": \"De assistent had geen ruimte meer voor zijn antwoord en is halverwege gestopt. Vraag hem door te gaan, of verhoog maxTokens in de agentconfiguratie.\",\n \"server.errors.llmInitFailed\": \"Mislukt naar initialize LLM provider\",\n \"server.validation.ai.bindingKeyRequired.flow\": \"flow.bindingKey is vereist\",\n \"server.validation.ai.bindingKeyRequired.funnel\": \"funnel.bindingKey is vereist\",\n \"server.validation.ai.bindingKeyRequired.retention\": \"retentie.bindingKey is vereist\",\n \"server.validation.ai.cubeNotFoundInFilter\": \"Cube '{cubeName}' niet gevonden in filter\",\n \"server.validation.ai.cubeNotFoundWithAvailable\": \"Cube '{cubeName}' niet gevonden\",\n \"server.validation.ai.cubeNotFoundWithSuggestion\": \"Cube '{cubeName}' niet gevonden\",\n \"server.validation.ai.dimensionNotFoundWithAvailable\": \"Dimensie '{dimensionName}' not gevonden on cube '{cubeName}'\",\n \"server.validation.ai.dimensionNotFoundWithSuggestion\": \"Dimensie '{dimensionName}' not gevonden on cube '{cubeName}'\",\n \"server.validation.ai.dimensionNotTimeType\": \"Dimensie '{dimension}' is not a time type (it's '{type}')\",\n \"server.validation.ai.emptyQuery\": \"Query moet hebben bij minimaal één meting van dimensie\",\n \"server.validation.ai.eventDimensionRequired\": \"flow.eventDimension is vereist\",\n \"server.validation.ai.filterFieldNotFound\": \"Filter veld '{fieldName}' niet gevonden op cube '{cubeName}'\",\n \"server.validation.ai.filterFieldNotFoundWithSuggestion\": \"Filter veld '{fieldName}' niet gevonden op cube '{cubeName}'\",\n \"server.validation.ai.funnelRequiresSteps\": \"funnel vereist bij minimaal 2 stappen\",\n \"server.validation.ai.funnelStepsRequired\": \"funnel.stappen array is vereist\",\n \"server.validation.ai.granularityNotSpecified\": \"retentie.granularity not specified\",\n \"server.validation.ai.invalidDimensionFormat\": \"Ongeldig dimensie format: '{dimension}'. Expected 'CubeName.dimensionName'\",\n \"server.validation.ai.invalidFilterMemberFormat\": \"Ongeldig filter member format: '{member}'\",\n \"server.validation.ai.invalidMeasureFormat\": \"Ongeldig meting format: '{measure}'. Expected 'CubeName.measureName'\",\n \"server.validation.ai.measureNotFoundWithAvailable\": \"Meting '{measureName}' not gevonden on cube '{cubeName}'\",\n \"server.validation.ai.measureNotFoundWithSuggestion\": \"Meting '{measureName}' not gevonden on cube '{cubeName}'\",\n \"server.validation.ai.performanceManyDimensions\": \"Query heeft {count} dimensies, welke kan produce veel rijen\",\n \"server.validation.ai.performanceManyMeasures\": \"Query heeft {count} metingen, welke kan impact prestatie\",\n \"server.validation.ai.periodsNotSpecified\": \"retentie.periods not specified\",\n \"server.validation.ai.retentionTimeDimensionRequired\": \"retentie.timeDimension is vereist\",\n \"server.validation.ai.stepMissingName\": \"Stap {step} is ontbrekend a name\",\n \"server.validation.ai.stepsBothMissing\": \"Neither stepsBefore nor stepsAfter opgegeven\",\n \"server.validation.ai.suggestAddDimensionFilters\": \"Overweeg adding filters van reducing dimensies\",\n \"server.validation.ai.suggestAddStepNames\": \"Voeg descriptive names naar funnel stappen\",\n \"server.validation.ai.suggestSetSteps\": \"Set stepsBefore en/van stepsAfter naar zien gebeurtenis sequences\",\n \"server.validation.ai.suggestSpecifyGranularity\": \"Specify granularity: \\\"day\\\", \\\"week\\\", van \\\"maand\\\"\",\n \"server.validation.ai.suggestSpecifyPeriods\": \"Specify nummer van periodes naar analyze\",\n \"server.validation.ai.suggestSplitQueries\": \"Overweeg splitting naar meerdere queries\",\n \"server.validation.ai.suggestUseTimeDimension\": \"Gebruik a dimensie met type \\\"time\\\" voor timeDimensions\",\n \"server.validation.ai.timeDimensionRequired.flow\": \"flow.timeDimension is vereist\",\n \"server.validation.ai.timeDimensionRequired.funnel\": \"funnel.timeDimension is vereist\",\n \"server.validation.chart.barNeedsDimension\": \"Staafgrafieken hebben een xAxis-dimensie nodig voor categorielabels. Voeg een dimensie toe aan de query of gebruik in plaats daarvan het grafiektype \\\"table\\\".\",\n \"server.validation.chart.barXAxisRequired\": \"chartConfig.xAxis is vereist voor staaf grafieken. Put een dimensie in xAxis so bars hebben categorie labels.\",\n \"server.validation.chart.dropZoneRequired\": \"chartConfig.{key} is vereist voor {chartType} grafiek ({label}). Accepts: {acceptDesc}.\",\n \"server.validation.chart.recordGrainNeedsUngrouped\": \"{chartType} toont één rij per record, dus de query moet \\\"ungrouped\\\": true instellen. Voeg dit toe aan de query en verwijder count/countDistinct metingen — die kunnen niet ongegroepeerd worden. Een ongegroepeerde query kan ook niet twee cubes omvatten die via hasMany verbonden zijn, dus beperk deze tot één cube plus zijn to-one joins.\",\n \"server.validation.chart.seriesDuplicatesXAxis\": \"chartConfig.series mag niet hetzelfde veld bevatten als xAxis (gevonden: {duplicates}). Het series-veld is alleen bedoeld om te splitsen in gegroepeerde/gestapelde subseries met een ANDERE dimensie. Verwijder het duplicaat uit series.\",\n \"server.validation.flow.bindingKeyCubeNotFound\": \"Koppeling sleutel cube niet gevonden: {cubeName}\",\n \"server.validation.flow.bindingKeyDimNotFound\": \"Koppeling sleutel dimensie niet gevonden: {dimName} in cube {cubeName}\",\n \"server.validation.flow.bindingKeyMappingCubeNotFound\": \"Koppeling sleutel mapping cube niet gevonden: {cubeName}\",\n \"server.validation.flow.eventDimCubeNotFound\": \"Gebeurtenis dimensie cube not gevonden: {cubeName}\",\n \"server.validation.flow.eventDimNotFound\": \"Gebeurtenis dimensie not gevonden: {dimName} in cube {cubeName}\",\n \"server.validation.flow.eventDimRequired\": \"Gebeurtenis dimensie is vereist voor flow analyse\",\n \"server.validation.flow.highStepDepthWarning\": \"Hoog stap depth (4-5) kan impact query prestatie op groot datasets\",\n \"server.validation.flow.invalidBindingKeyFormat\": \"Ongeldig binding key format: {bindingKey}. Expected 'CubeName.dimensionName'\",\n \"server.validation.flow.invalidEventDimFormat\": \"Ongeldig gebeurtenis dimensie format: {eventDimension}. Expected 'CubeName.dimensionName'\",\n \"server.validation.flow.invalidJoinStrategy\": \"Ongeldig joinStrategy: {joinStrategy}\",\n \"server.validation.flow.invalidTimeDimFormat\": \"Ongeldig time dimensie format: {timeDimension}. Expected 'CubeName.dimensionName'\",\n \"server.validation.flow.lateralNotSupported\": \"Lateral joins zijn niet supported op deze database\",\n \"server.validation.flow.lateralNotSupportedExec\": \"Lateral joins met CTE verwijzingen zijn niet supported op deze database\",\n \"server.validation.flow.sqliteNotSupported\": \"Flow queries zijn niet supported on SQLite. Gebruik PostgreSQL of MySQL voor flow analyse.\",\n \"server.validation.flow.startingStepFilterRequired\": \"Startende stap moet hebben bij minimaal één filter\",\n \"server.validation.flow.startingStepNameMissing\": \"Startende stap heeft geen naam - met standaard\",\n \"server.validation.flow.startingStepRequired\": \"Startende stap is vereist voor flow analyse\",\n \"server.validation.flow.stepsBeforeRange\": \"stepsBefore moet zijn tussen 0 en 5, got: {value}\",\n \"server.validation.flow.stepsAfterRange\": \"stepsAfter moet zijn tussen 0 en 5, got: {value}\",\n \"server.validation.flow.timeDimCubeNotFound\": \"Tijd dimensie cube not gevonden: {cubeName}\",\n \"server.validation.flow.timeDimNotFound\": \"Tijd dimensie not gevonden: {dimName} in cube {cubeName}\",\n \"server.validation.funnel.bindingKeyCubeNotFound\": \"Koppeling sleutel cube niet gevonden: {cubeName}\",\n \"server.validation.funnel.bindingKeyDimNotFound\": \"Koppeling sleutel dimensie niet gevonden: {dimName} in cube {cubeName}\",\n \"server.validation.funnel.bindingKeyMappingCubeNotFound\": \"Koppeling sleutel mapping cube niet gevonden: {cubeName}\",\n \"server.validation.funnel.invalidBindingKeyFormat\": \"Ongeldig binding key format: {bindingKey}. Expected 'CubeName.dimensionName'\",\n \"server.validation.funnel.invalidTimeDimFormat\": \"Ongeldig time dimensie format: {timeDimension}. Expected 'CubeName.dimensionName'\",\n \"server.validation.funnel.minSteps\": \"Funnel moet hebben bij minimaal 2 stappen\",\n \"server.validation.funnel.stepCubeNotFound\": \"Stap {step} cube not gevonden: {cube}\",\n \"server.validation.funnel.stepFilterCubeNotFound\": \"Stap {step} filter cube not gevonden: {cubeName}\",\n \"server.validation.funnel.stepFilterIsMeasure\": \"Stap {step} filter '{member}' is a meting. Funnel stap filters only support dimensies, not metingen.\",\n \"server.validation.funnel.stepFilterMemberNotFound\": \"Stap {step} filter member not gevonden: {field} in cube {cubeName}\",\n \"server.validation.funnel.stepFilterNoJoinPath\": \"Stap {step} filter '{member}' requires a join van '{stepCube}' but no join pad was gevonden. Define a join relationship tussen these cubes.\",\n \"server.validation.funnel.stepMustHaveName\": \"Stap {step} moet have a name\",\n \"server.validation.funnel.stepTimeToConvertFormat\": \"Stap {step} timeToConvert moet be ISO 8601 duration format: {value}\",\n \"server.validation.funnel.timeDimCubeNotFound\": \"Tijd dimensie cube not gevonden: {cubeName}\",\n \"server.validation.funnel.timeDimNotFound\": \"Tijd dimensie not gevonden: {dimName} in cube {cubeName}\",\n \"server.validation.retention.bindingKeyCubeNotFound\": \"Koppeling sleutel cube niet gevonden: {cubeName}\",\n \"server.validation.retention.bindingKeyDimNotFound\": \"Koppeling sleutel dimensie niet gevonden: {dimName} in cube {cubeName}\",\n \"server.validation.retention.bindingKeyMappingCubeNotFound\": \"Koppeling sleutel mapping cube niet gevonden: {cubeName}\",\n \"server.validation.retention.breakdownDimCubeNotFound\": \"Opsplitsing dimensie cube niet gevonden: {cubeName}\",\n \"server.validation.retention.breakdownDimNotFound\": \"Opsplitsing dimensie niet gevonden: {dimName} in cube {cubeName}\",\n \"server.validation.retention.cubeNotFound\": \"Cube niet gevonden: {cubeName}\",\n \"server.validation.retention.dateRangeEndRequired\": \"Datum range end is vereist\",\n \"server.validation.retention.dateRangeInvalidEnd\": \"Ongeldig date range end format\",\n \"server.validation.retention.dateRangeInvalidStart\": \"Ongeldig date range start format\",\n \"server.validation.retention.dateRangeRequired\": \"Datum range is vereist\",\n \"server.validation.retention.dateRangeStartBeforeEnd\": \"Datum range start moet be voor of equal naar end\",\n \"server.validation.retention.dateRangeStartRequired\": \"Datum range start is vereist\",\n \"server.validation.retention.engineNotSupported\": \"Retentie queries worden niet ondersteund op {engine}. Gebruik PostgreSQL of DuckDB voor retentie analyse.\",\n \"server.validation.retention.invalidBindingKeyFormat\": \"Ongeldig binding key format: {bindingKey}. Expected 'CubeName.dimensionName'\",\n \"server.validation.retention.invalidBreakdownDimFormat\": \"Ongeldig breakdown dimensie format: {dimension}. Expected 'CubeName.dimensionName'\",\n \"server.validation.retention.invalidGranularity\": \"Ongeldig granularity: {granularity}\",\n \"server.validation.retention.invalidRetentionType\": \"Ongeldig retentie type: {retentionType}\",\n \"server.validation.retention.invalidTimeDimFormat\": \"Ongeldig time dimensie format: {timeDimension}\",\n \"server.validation.retention.noBindingKeyMapping\": \"Geen binding key mapping gevonden voor cube: {cubeName}\",\n \"server.validation.retention.periodsMax\": \"Periodes kan niet exceed 52 (prestatie limiet)\",\n \"server.validation.retention.periodsMin\": \"Periodes moet zijn bij minimaal 1\",\n \"server.validation.retention.timeDimNotFound\": \"Tijd dimensie not gevonden: {dimName}\",\n \"server.validation.calculatedMeasure.mustHaveCalculatedSql\": \"Berekend meting '{cubeName}.{fieldName}' moet hebben calculatedSql property\",\n \"server.validation.calculatedMeasure.invalidSyntax\": \"Ongeldig calculatedSql syntax in '{cubeName}.{fieldName}': {errors}\",\n \"server.validation.calculatedMeasure.circularDependency\": \"Circular dependency detected in berekend metingen: {cycle}\",\n \"server.validation.query.multipleQueryModes\": \"Query bevat meerdere query modes: {modes}\",\n \"server.validation.query.funnelBindingKeyCubeNotFound\": \"Funnel koppeling sleutel cube niet gevonden: {cubeName}\",\n \"server.validation.query.flowBindingKeyCubeNotFound\": \"Flow koppeling sleutel cube niet gevonden: {cubeName}\",\n \"server.validation.query.retentionCubeNotFound\": \"Retentie cube niet gevonden: {cubeName}\",\n \"server.validation.query.retentionBindingKeyCubeNotFound\": \"Retentie koppeling sleutel cube niet gevonden: {cubeName}\",\n \"server.validation.query.retentionBreakdownCubeNotFound\": \"Retentie opsplitsing cube niet gevonden: {cubeName}\",\n \"server.validation.query.invalidMeasureFormat\": \"Ongeldig meting format: {measure}. Expected format: 'CubeName.fieldName'\",\n \"server.validation.query.cubeNotFoundForMeasure\": \"Cube '{cubeName}' niet gevonden (referenced in meting '{measure}')\",\n \"server.validation.query.measureNotFound\": \"Meting '{fieldName}' not gevonden on cube '{cubeName}'{hint}\",\n \"server.validation.query.invalidDimensionFormat\": \"Ongeldig dimensie format: {dimension}. Expected format: 'CubeName.fieldName'\",\n \"server.validation.query.cubeNotFoundForDimension\": \"Cube '{cubeName}' niet gevonden (referenced in dimensie '{dimension}')\",\n \"server.validation.query.dimensionNotFound\": \"Dimensie '{fieldName}' not gevonden on cube '{cubeName}'{hint}\",\n \"server.validation.query.invalidTimeDimensionFormat\": \"Ongeldig timeDimension format: {dimension}. Expected format: 'CubeName.fieldName'\",\n \"server.validation.query.cubeNotFoundForTimeDimension\": \"Cube '{cubeName}' niet gevonden (referenced in timeDimension '{dimension}')\",\n \"server.validation.query.timeDimensionNotFound\": \"TimeDimension '{fieldName}' niet gevonden op cube '{cubeName}' (moet zijn een dimensie met tijd type)\",\n \"server.validation.query.mustReferenceAtLeastOneCube\": \"Query moet reference bij minimaal één cube through metingen, dimensies, van filters\",\n \"server.validation.query.ungroupedRequiresDimension\": \"Ongegroepeerd queries require bij minimaal één dimensie van tijd dimensie\",\n \"server.validation.query.ungroupedIncompatibleFunnel\": \"Ungrouped queries are incompatible met funnel analyse\",\n \"server.validation.query.ungroupedIncompatibleFlow\": \"Ungrouped queries are incompatible met flow analyse\",\n \"server.validation.query.ungroupedIncompatibleRetention\": \"Ungrouped queries are incompatible met retentie analyse\",\n \"server.validation.query.ungroupedIncompatibleCompareDateRange\": \"Ongegroepeerd queries zijn incompatible met compareDateRange\",\n \"server.validation.query.ungroupedIncompatibleFillMissingDates\": \"Ongroepeerde queries zijn niet compatibel met fillMissingDates\",\n \"server.validation.query.filterMustHaveMember\": \"Filter moet hebben een lid veld\",\n \"server.validation.query.invalidFilterMemberFormat\": \"Ongeldig filter member format: {member}. Expected format: 'CubeName.fieldName'\",\n \"server.validation.query.cubeNotFoundForFilter\": \"Cube '{cubeName}' niet gevonden (referenced in filter '{member}')\",\n \"server.validation.query.filterFieldNotFound\": \"Filter veld '{fieldName}' niet gevonden op cube '{cubeName}' (moet zijn een dimensie van meting){hint}\",\n \"server.validation.query.unknownFilterOperator\": \"Onbekende filteroperator '{operator}' op '{member}'. Geldige operatoren: {operators}\",\n \"server.validation.query.invalidInDateRangeValues\": \"Ongeldige inDateRange-waarden voor '{member}': {reason}\",\n \"server.validation.query.invalidInDateRangeDateRange\": \"Ongeldig inDateRange-datumbereik voor '{member}': {reason}\",\n \"server.validation.query.inDateRangeConflictingInputs\": \"Ongeldig inDateRange-filter voor '{member}': {reason}\",\n \"server.validation.query.inDateRangeReason.missing\": \"geef een datumbereik op\",\n \"server.validation.query.inDateRangeReason.shape\": \"gebruik een vlak [begin, eind] paar datums, of één relatief bereik of datum\",\n \"server.validation.query.inDateRangeReason.invalidDate\": \"de datum is ongeldig\",\n \"server.validation.query.inDateRangeReason.invalidRelative\": \"het relatieve datumbereik '{value}' wordt niet ondersteund\",\n \"server.validation.query.inDateRangeReason.reverseOrder\": \"de begindatum mag niet na de einddatum liggen\",\n \"server.validation.query.inDateRangeReason.conflict\": \"gebruik values of dateRange, niet beide\",\n \"server.validation.ai.dryRunFailed\": \"Kan SQL niet genereren: {error}\",\n \"server.validation.query.invalidDateRangeInput\": \"Ongeldig datumbereik: {reason}\",\n \"server.validation.query.invalidTimeDimensionDateRange\": \"Ongeldig dateRange voor tijddimensie '{member}': {reason}\",\n \"server.validation.query.invalidDateRange\": \"Kan datumbereik {dateRange} voor '{member}' niet verwerken. Gebruik een relatief bereik ({examples}), één datum ('2024-01-15') of een ['start', 'eind'] paar datums.\",\n \"server.validation.query.invalidDateValue\": \"Filter op '{member}' gebruikt '{operator}' maar {value} is geen geldige datum.\",\n \"server.validation.query.orMixesMeasuresAndDimensions\": \"Een 'or' filtergroep kan geen metingfilters ({measures}) combineren met dimensiefilters ({dimensions}): metingen worden na aggregatie gefilterd en dimensies ervoor. Splits ze op in afzonderlijke filters op het hoogste niveau.\",\n \"server.validation.query.granularityLessTimeDimensionOnly\": \"Een tijddimensie zonder granulariteit filtert alleen op het dateRange en wordt niet als kolom teruggegeven. Voeg een granulariteit (bijv. 'month') toe aan '{dimension}', of voeg een meting of dimensie toe aan de query.\",\n \"server.errors.crossCubeOrFilterUnsupported\": \"Kan het 'or' filter op '{member}' niet toepassen: cube '{cubeName}' heeft geen directe join naar '{contextCube}', dus de voorwaarde kan niet worden geëvalueerd waar dat nodig is. Herstructureer het filter zodat elke 'or' groep alleen direct gekoppelde cubes gebruikt.\",\n \"server.errors.funnel.cubeNotFoundForStep\": \"Cube niet gevonden voor stap: {cube}\",\n \"server.errors.funnel.cubeNotFoundForBindingKey\": \"Cube niet gevonden voor koppeling sleutel: {bindingKey}\",\n \"server.errors.funnel.cannotResolveCubeForStep\": \"Kan niet resolve cube voor stap - meerdere-cube funnel vereist cube specification in each stap\",\n \"server.errors.funnel.bindingKeyDimNotFound\": \"Koppeling sleutel dimensie niet gevonden: {bindingKey}\",\n \"server.errors.funnel.noBindingKeyMapping\": \"Geen binding key mapping gevonden voor cube: {cubeName}\",\n \"server.errors.funnel.bindingKeyMappingDimNotFound\": \"Koppeling sleutel dimensie niet gevonden: {dimension}\",\n \"server.errors.funnel.timeDimNotFound\": \"Tijd dimensie not gevonden: {timeDimension}\",\n \"server.errors.funnel.noTimeDimMapping\": \"Geen time dimensie mapping gevonden voor cube: {cubeName}\",\n \"server.errors.funnel.timeDimMappingNotFound\": \"Tijd dimensie not gevonden: {dimension}\",\n \"server.errors.flow.cannotResolveCube\": \"Kan niet resolve cube voor flow query\",\n \"server.errors.flow.cubeNotFound\": \"Cube niet gevonden: {cubeName}\",\n \"server.errors.flow.bindingKeyDimNotFound\": \"Koppeling sleutel dimensie niet gevonden: {bindingKey}\",\n \"server.errors.flow.noBindingKeyMapping\": \"Geen binding key mapping gevonden voor cube: {cubeName}\",\n \"server.errors.flow.bindingKeyMappingDimNotFound\": \"Koppeling sleutel dimensie niet gevonden: {dimension}\",\n \"server.errors.flow.timeDimNotFound\": \"Tijd dimensie not gevonden: {timeDimension}\",\n \"server.errors.flow.noTimeDimMapping\": \"Geen time dimensie mapping gevonden voor cube: {cubeName}\",\n \"server.errors.flow.timeDimMappingNotFound\": \"Tijd dimensie not gevonden: {dimension}\",\n \"server.errors.flow.eventDimNotFound\": \"Gebeurtenis dimensie not gevonden: {eventDimension}\",\n \"server.validation.template.emptyReference\": \"Leeg lid reference {} gevonden in template\",\n \"server.validation.template.invalidMemberReference\": \"Ongeldig member reference {ref}: moet start met letter of underscore, en contain only letters, numbers, underscores, en dots\",\n \"server.validation.template.multipleDots\": \"Ongeldig member reference {ref}: only one dot allowed (Cube.meting format)\",\n \"server.validation.template.nestedBraces\": \"Nested braces zijn niet allowed in lid verwijzingen\",\n \"server.validation.template.substituteTargetCubeNotFound\": \"Kan niet substitute {ref}: cube '{cubeName}' niet gevonden\",\n \"server.validation.template.substituteMeasureNotResolved\": \"Kan niet substitute {ref}: meting '{measureName}' niet resolved yet. Ensure metingen zijn resolved in dependency order.\",\n \"server.validation.template.unmatchedClosingBrace\": \"Unmatched closing brace bij position {position}\",\n \"server.validation.template.unmatchedOpeningBrace\": \"Ongepaarde openingsaccolade in sjabloon\",\n \"notebook.aiAssistant\": \"AI-assistent\",\n \"notebook.saveAsDashboard\": \"Opslaan as Dashboard\",\n \"notebook.saveAsDashboardTitle\": \"Opslaan notebook as a dashboard\",\n \"notebook.clearTitle\": \"Wissen notebook en chat\",\n \"notebook.feedbackThanks\": \"Thanks voor je feedback!\",\n \"notebook.feedbackQuestion\": \"Was deze helpful?\",\n \"notebook.feedbackYes\": \"Ja\",\n \"notebook.feedbackNo\": \"Nee\",\n \"notebook.thinking\": \"Denken...\",\n \"notebook.emptyState.title\": \"Gegevens Analyse Assistant\",\n \"notebook.emptyState.description\": \"Ask me about je gegevens en I'll create visualisaties en insights.\",\n \"notebook.emptyState.example1\": \"\\\"Toon me employee productivity trends\\\"\",\n \"notebook.emptyState.example2\": \"\\\"What zijn de boven departments op headcount?\\\"\",\n \"notebook.emptyState.example3\": \"\\\"Vergelijk omzet per productcategorie\\\"\",\n \"notebook.saveAsDashboardPrompt\": \"Sla het huidige notebook op als dashboard met een professionele lay-out, sectiekoppen en passende filters.\",\n \"notebook.chatInput.placeholder\": \"Ask about je gegevens...\",\n \"notebook.chatInput.stop\": \"Stoppen\",\n \"notebook.chatInput.continue\": \"Doorgaan\",\n \"notebook.chatInput.send\": \"Verzenden\",\n \"notebook.canvas.emptyTitle\": \"Je notebook is leeg\",\n \"notebook.canvas.emptyDescription\": \"Stel de AI-assistent een vraag over je gegevens. Grafieken en inzichten verschijnen hier terwijl de assistent je gegevens analyseert.\",\n \"notebook.canvas.editVisualization\": \"Bewerken Visualization\",\n \"notebook.canvas.update\": \"Bijwerken\",\n \"notebook.collapsed.noBlocks\": \"Geen blocks\",\n \"notebook.collapsed.expandNotebook\": \"Notitieblok uitklappen\",\n \"notebook.collapsed.expandChat\": \"AI-chat uitklappen\",\n \"notebook.collapsed.aiChat\": \"AI-chat\",\n \"notebook.collapsed.markdown\": \"Markdown\",\n \"schema.loading\": \"Laden cube schema...\",\n \"schema.error\": \"Mislukt naar load cube schema\",\n \"schema.noCubes\": \"Geen cubes gevonden\",\n \"schema.noCubesHint\": \"Register some kubussen naar zien de relationship diagram\",\n \"schema.computingLayout\": \"Layout berekenen...\",\n \"schema.searchPlaceholder\": \"Zoeken cubes en velden...\",\n \"schema.autoLayout\": \"Automatisch Layout\",\n \"schema.missingDeps.title\": \"Schema Visualization vereist additional packages\",\n \"schema.missingDeps.description\": \"Install de vereist dependencies naar enable de interactive schema diagram:\",\n \"schema.loadingVisualization\": \"Laden schema visualisatie...\",\n \"schema.measures\": \"Metingen ({count})\",\n \"schema.timeDimensions\": \"Tijd Dimensies ({count})\",\n \"schema.dimensions\": \"Dimensies ({count})\",\n \"schema.cubeInfo\": \"Cube-info\",\n \"dataBrowser.selectCube\": \"Selecteer a cube\",\n \"dataBrowser.selectCubeHint\": \"Kies een cube uit de zijbalk om de gegevens te bekijken\",\n \"dataBrowser.loadingData\": \"Laden gegevens...\",\n \"dataBrowser.noData\": \"Geen gegevens\",\n \"dataBrowser.noRows\": \"Geen rijen geretourneerd voor deze query\",\n \"dataBrowser.toolbar.filters\": \"Filters\",\n \"dataBrowser.toolbar.columns\": \"Kolommen\",\n \"dataBrowser.toolbar.rows\": \"{count} rijen\",\n \"dataBrowser.sidebar.cubes\": \"Kubussen\",\n \"dataBrowser.sidebar.searchPlaceholder\": \"Zoeken...\",\n \"dataBrowser.sidebar.noCubes\": \"Geen cubes gevonden\",\n \"queryAnalysis.summary\": \"Query Samenvatting\",\n \"queryAnalysis.summary.type\": \"Type\",\n \"queryAnalysis.summary.cubes\": \"Kubussen\",\n \"queryAnalysis.summary.joins\": \"Joins\",\n \"queryAnalysis.summary.ctes\": \"CTE's\",\n \"queryAnalysis.summary.strategy\": \"Strategie\",\n \"queryAnalysis.primaryCube\": \"Primary Cube (VAN tabel)\",\n \"queryAnalysis.primaryCube.showCandidates\": \"Toon candidates ({count})\",\n \"queryAnalysis.primaryCube.reachable\": \"bereikbaar\",\n \"queryAnalysis.primaryCube.cannotReachAll\": \"kan niet reach alle\",\n \"queryAnalysis.joinPaths\": \"Join Paden\",\n \"queryAnalysis.joinPaths.steps\": \"{count} stap\",\n \"queryAnalysis.joinPaths.stepsPlural\": \"{count} stappen\",\n \"queryAnalysis.joinPaths.noPath\": \"Geen pad\",\n \"queryAnalysis.joinPaths.selection\": \"Selectie:\",\n \"queryAnalysis.joinPaths.pathCandidates\": \"Pad scoring candidates ({count})\",\n \"queryAnalysis.joinPaths.visitedCubes\": \"Kubussen visited during search ({count})\",\n \"queryAnalysis.preAggregations\": \"Pre-aggregatie-CTE's\",\n \"queryAnalysis.preAggregations.measures\": \"Metingen:\",\n \"queryAnalysis.preAggregations.joinKeys\": \"Join-sleutels:\",\n \"queryAnalysis.warnings\": \"Waarschuwingen\",\n \"queryAnalysis.cubesInvolved\": \"Kubussen involved:\",\n \"common.actions.copied\": \"Gekopieerd\",\n \"common.actions.copyToClipboard\": \"Kopiëren naar clipboard\",\n \"chart.availability.requiresMeasure\": \"Vereist ten minste 1 meting\",\n \"chart.availability.requiresTwoMeasures\": \"Vereist ten minste 2 metingen\",\n \"chart.availability.requiresDimension\": \"Vereist ten minste 1 dimensie\",\n \"chart.availability.requiresTwoDimensions\": \"Vereist ten minste 2 dimensies\",\n \"chart.availability.requiresTimeDimension\": \"Vereist een tijdsdimensie\",\n \"chart.availability.scatter\": \"Vereist 2 metingen, of 1 meting plus 1 dimensie\",\n \"chart.availability.bubble\": \"Vereist ten minste 2 metingen en 1 dimensie\",\n \"chart.runtime.noData\": \"Geen gegevens beschikbaar\",\n \"chart.runtime.noDataHint.bar\": \"Geen datapunten om weer te geven in staafgrafiek\",\n \"chart.runtime.noDataHint.line\": \"Geen datapunten om weer te geven in lijngrafiek\",\n \"chart.runtime.noDataHint.area\": \"Geen datapunten om weer te geven in vlakgrafiek\",\n \"chart.runtime.noDataHint.pie\": \"Geen datapunten om weer te geven in cirkeldiagram\",\n \"chart.runtime.noDataHint.scatter\": \"Geen datapunten om weer te geven in spreidingsdiagram\",\n \"chart.runtime.noDataHint.radar\": \"Geen datapunten om weer te geven in radardiagram\",\n \"chart.runtime.noDataHint.radialBar\": \"Geen datapunten om weer te geven in radial staafgrafiek\",\n \"chart.runtime.noDataHint.treemap\": \"Geen datapunten om weer te geven in boomkaart\",\n \"chart.runtime.noDataHint.bubble\": \"Geen datapunten om weer te geven in bellendiagram\",\n \"chart.runtime.noDataHint.boxPlot\": \"Geen datapunten om weer te geven in boxplot\",\n \"chart.runtime.noDataHint.dotStrip\": \"Geen gegevenspunten om te tonen in het puntenstrookdiagram\",\n \"chart.runtime.noDataHint.waterfall\": \"Geen datapunten om weer te geven in watervalgrafiek\",\n \"chart.runtime.noDataHint.candlestick\": \"Geen datapunten om weer te geven in candlestickgrafiek\",\n \"chart.runtime.noDataHint.gauge\": \"Geen datapunten om weer te geven in meterdiagram\",\n \"chart.runtime.noDataHint.measureProfile\": \"Geen datapunten om weer te geven in meetprofielgrafiek\",\n \"chart.runtime.noDataHint.activityGrid\": \"Geen datapunten om weer te geven in activiteitenraster\",\n \"chart.runtime.noDataHint.heatmap\": \"Voer een query uit om de heatmap-visualisatie te zien\",\n \"chart.runtime.noDataHint.table\": \"Geen gegevens naar weergeven in tabel\",\n \"chart.runtime.noDataHint.kpi\": \"Geen gegevens points naar weergeven\",\n \"chart.runtime.noDataHint.funnel\": \"Configureer een funnel met minimaal 2 stappen en een koppelingssleutel\",\n \"chart.runtime.noDataHint.flow\": \"Configureer een flowanalyse met een startstap en eventdimensie\",\n \"chart.runtime.noDataHint.retention\": \"Configureer retentieanalyse om resultaten te zien\",\n \"chart.runtime.noValidData\": \"Geen geldige gegevens\",\n \"chart.runtime.noValidDataHint.bar\": \"Geen geldige datapunten voor staafgrafiek na transformatie\",\n \"chart.runtime.noValidDataHint.line\": \"Geen geldige datapunten voor lijngrafiek na transformatie\",\n \"chart.runtime.noValidDataHint.area\": \"Geen geldige datapunten voor vlakgrafiek na transformatie\",\n \"chart.runtime.noValidDataHint.scatter\": \"Geen geldige datapunten voor spreidingsdiagram na transformatie\",\n \"chart.runtime.noValidDataHint.radar\": \"Geen geldige datapunten voor radardiagram na transformatie\",\n \"chart.runtime.noValidDataHint.radialBar\": \"Geen geldige datapunten voor radial staafgrafiek na transformatie\",\n \"chart.runtime.noValidDataHint.treemap\": \"Geen geldige datapunten voor boomkaart na transformatie\",\n \"chart.runtime.noValidDataHint.pie\": \"Geen datapunten om weer te geven in cirkeldiagram\",\n \"chart.runtime.noValidDataHint.pieFiltered\": \"Uitgefilterd {count} gegevens punten (zero van ongeldig waarden)\",\n \"chart.runtime.noValidDataHint.boxPlot\": \"Kon boxplotstatistieken niet berekenen uit de opgegeven gegevens\",\n \"chart.runtime.noValidDataHint.dotStrip\": \"Geen geldige numerieke waarden voor het puntenstrookdiagram\",\n \"chart.runtime.configErrorHint.dotStrip\": \"Een puntenstrookdiagram heeft een dimensie om op te groeperen en één meting nodig\",\n \"chart.runtime.dotStrip.unlabelledBand\": \"(geen waarde)\",\n \"chart.runtime.dotStrip.count\": \"n={count}\",\n \"chart.runtime.dotStrip.countTruncated\": \"n={count}+\",\n \"chart.runtime.dotStrip.noDataRecorded\": \"geen gegevens vastgelegd\",\n \"chart.runtime.dotStrip.spread\": \"spreiding {spread}×\",\n \"chart.runtime.dotStrip.truncated\": \"De eerste {max} banden worden getoond\",\n \"chart.runtime.noValidDataHint.gauge\": \"Gauge-waarde is geen geldig getal\",\n \"chart.runtime.noValidDataHint.kpiText\": \"Alle waarden are null of ongeldig\",\n \"chart.runtime.configError\": \"Configuratiefout\",\n \"chart.runtime.configErrorHint.axisInvalid\": \"Ongeldige of ontbrekende grafiek-asconfiguratie\",\n \"chart.runtime.configErrorHint.axisFields\": \"Vereiste velden voor X-as of Y-as ontbreken\",\n \"chart.runtime.configErrorHint.pieAxis\": \"chartConfig.x/y of chartConfig.xAxis/yAxis is vereist voor cirkeldiagram\",\n \"chart.runtime.configErrorHint.radarNumeric\": \"Geen numerieke velden gevonden voor radardiagramwaarden\",\n \"chart.runtime.configErrorHint.radialBarNumeric\": \"Geen numeriek veld gevonden voor radial-bar-grafiekwaarden\",\n \"chart.runtime.configErrorHint.treemapNumeric\": \"Geen numeriek veld gevonden voor treemapgrootte\",\n \"chart.runtime.configErrorHint.noMeasure\": \"Geen metingveld geconfigureerd\",\n \"chart.runtime.configErrorHint.noMeasures\": \"Geen metingvelden geconfigureerd\",\n \"chart.runtime.configErrorHint.bubbleRequired\": \"Bellendiagram vereist xAxis-, yAxis-, reeksen- en sizeField-dimensies\",\n \"chart.runtime.configErrorHint.bubbleOptional\": \"Optioneel: colorField voor bubble-kleuring\",\n \"chart.runtime.configErrorHint.activityGridRequired\": \"Activiteitsraster vereist een tijdsdimensie en een meting\",\n \"chart.runtime.chartError\": \"{chartType} Fout\",\n \"chart.runtime.unknownError\": \"Onbekende renderfout\",\n \"chart.runtime.checkConfig\": \"Controleer de gegevens en configuratie\",\n \"chart.runtime.unableToRender\": \"Kan retentiegegevens niet renderen\",\n \"chart.runtime.dataFormatIncorrect\": \"Gegevensindeling kan onjuist zijn\",\n \"chart.runtime.measuringDimensions\": \"Grafiekafmetingen worden gemeten...\",\n \"chart.runtime.unableToDisplay\": \"Kan grafiek niet weergeven\",\n \"chart.runtime.responsiveContainerError\": \"Maken van responsieve container mislukt\",\n \"chart.runtime.noDataToDisplay\": \"Geen gegevens om weer te geven\",\n \"chart.runtime.table.invalidStructure\": \"Gegevens structure is ongeldig\",\n \"chart.runtime.recordsTable.noColumns\": \"Geen kolommen beschikbaar\",\n \"chart.runtime.recordsTable.rowRange\": \"{from}–{to} van {total}\",\n \"chart.runtime.recordsTable.pageOf\": \"Pagina {page} van {pages}\",\n \"chart.runtime.recordsTable.previousPage\": \"Vorige pagina\",\n \"chart.runtime.recordsTable.nextPage\": \"Volgende pagina\",\n \"chart.runtime.heatmapNoResults\": \"De query retourneerde geen resultaten voor de heatmap\",\n \"chart.runtime.heatmapConfigRequired\": \"Configuratie vereist\",\n \"chart.runtime.heatmapXRequired\": \"X-asdimensie vereist.\",\n \"chart.runtime.heatmapYRequired\": \"Y-asdimensie vereist.\",\n \"chart.runtime.heatmapValueRequired\": \"Waarde-meting vereist.\",\n \"chart.runtime.heatmapTruncated\": \"Gegevens ingekort tot {maxRows}x{maxCols} cellen (origineel: {originalRows}x{originalCols}). Voeg filters toe om dimensies te verkleinen.\",\n \"chart.runtime.activityGridGranularityTooHigh\": \"Granulariteit te hoog\",\n \"chart.runtime.activityGridGranularityHint\": \"Activiteitsrasters werken het best met uur-, dag-, week-, maand- of kwartaalgranulariteit\",\n \"chart.runtime.activityGridGranularityAction\": \"Kies een lagere granulariteit voor je tijdsdimensie\",\n \"chart.runtime.activityGridConfigRequired\": \"Configuratie vereist\",\n \"chart.runtime.retention.cohort\": \"Cohort\",\n \"chart.runtime.retention.segment\": \"Segment\",\n \"chart.runtime.retention.users\": \"Gebruikers\",\n \"chart.runtime.retention.cohortSize\": \"Cohortgrootte: {count}\",\n \"chart.runtime.retention.retained\": \"Behouden: {count}\",\n \"chart.runtime.retention.rate\": \"Percentage: {rate}\",\n \"chart.runtime.retention.retentionPercent\": \"Retentie %\",\n \"chart.runtime.retention.periodLabel\": \"{cohort} - Periode {period}\",\n \"chart.runtime.retention.noData\": \"Geen gegevens\",\n \"chart.runtime.retention.total\": \"Totaal\",\n \"chart.runtime.retention.retention\": \"Retentie\",\n \"chart.runtime.funnel.noData\": \"Geen funnelgegevens\",\n \"chart.runtime.funnel.steps\": \"stappen\",\n \"chart.runtime.funnel.overall\": \"Totaal:\",\n \"chart.runtime.funnel.completed\": \"{completed} / {total} voltooid\",\n \"chart.runtime.flow.noData\": \"Geen flowgegevens\",\n \"chart.runtime.flow.events\": \"gebeurtenissen\",\n \"chart.runtime.flow.eventsAfter\": \"gebeurtenissen (na)\",\n \"chart.runtime.flow.paths\": \"Paden:\",\n \"chart.runtime.flow.startingEntities\": \"startende entiteiten\",\n \"chart.runtime.flow.entities\": \"entiteiten\",\n \"chart.runtime.kpiDelta.insufficientData\": \"Onvoldoende gegevens\",\n \"chart.runtime.kpiDelta.requiresTwoPoints\": \"Delta calculation vereist bij minimaal 2 gegevens punten\",\n \"chart.runtime.kpiDelta.currentPoints\": \"Huidige gegevens points: {count}\",\n \"chart.runtime.kpiDelta.noVariance\": \"Geen variance gegevens\",\n \"chart.runtime.kpiNumber.noData\": \"Geen gegevens\",\n \"chart.runtime.markdown.noContent\": \"Geen inhoud\",\n \"chart.runtime.markdown.addContent\": \"Voeg markdown-inhoud toe in de grafiekconfiguratie\",\n \"chart.runtime.markdown.templateError\": \"Sjabloonfout\",\n \"chart.runtime.markdown.templateWarning\": \"Onopgeloste verwijzingen\",\n \"chart.runtime.axisFormat.label\": \"Label\",\n \"chart.runtime.axisFormat.autoLabel\": \"Automatisch-gegenereerd label\",\n \"chart.runtime.axisFormat.unit\": \"Eenheid\",\n \"chart.runtime.axisFormat.custom\": \"Aangepast\",\n \"chart.runtime.axisFormat.prefix\": \"Voorvoegsel\",\n \"chart.runtime.axisFormat.prefixExample\": \"bijv., $\",\n \"chart.runtime.axisFormat.suffix\": \"Achtervoegsel\",\n \"chart.runtime.axisFormat.suffixExample\": \"bijv., eenheden\",\n \"chart.runtime.axisFormat.currencyCode\": \"Valutacode\",\n \"chart.runtime.axisFormat.currencyCodeHint\": \"Laat leeg om de landinstelling van de kijker te volgen\",\n \"chart.runtime.axisFormat.abbreviation\": \"Afkorting\",\n \"chart.runtime.axisFormat.yes\": \"Ja\",\n \"chart.runtime.axisFormat.no\": \"Nee\",\n \"chart.runtime.axisFormat.decimals\": \"Decimalen\",\n \"chart.runtime.axisFormat.preview\": \"Voorbeeld\",\n \"chart.runtime.axisFormat.leftYAxis\": \"Left Y-As\",\n \"chart.runtime.axisFormat.rightYAxis\": \"Right Y-As\",\n \"chart.runtime.axisFormat.xAxis\": \"X-As\",\n \"chart.runtime.missingDep.title\": \"Ontbrekende afhankelijkheid\",\n \"chart.runtime.missingDep.description\": \"De {chartType} grafiek vereist de {packageName} package.\",\n \"chart.runtime.missingDep.restartHint\": \"Start na installatie je ontwikkelserver opnieuw.\",\n \"chart.runtime.unknownChartType\": \"Onbekend grafiektype\",\n \"chart.runtime.unknownChartTypeHint\": \"\\\"{chartType}\\\" is niet registered\",\n \"chart.runtime.boxPlot.truncated\": \"Gegevens ingekort tot {max} groepen (origineel: {total})\",\n \"chart.runtime.candlestick.truncated\": \"Toont de eerste {max} candles (totaal: {total})\",\n \"chart.runtime.bar.hiddenPoints\": \"{count} gegevens punt(en) met geen waarden hidden\",\n \"chart.runtime.waterfall.increase\": \"Toename\",\n \"chart.runtime.waterfall.decrease\": \"Afname\",\n \"chart.runtime.waterfall.total\": \"Totaal\",\n \"chart.runtime.tooltip.noData\": \"Geen gegevens\",\n \"chart.runtime.tooltip.targetValue\": \"Doelwaarde\",\n \"results.toolbar.refreshing\": \"Vernieuwen\",\n \"results.toolbar.refresh\": \"Vernieuwen\",\n \"results.toolbar.refreshTitle\": \"Vernieuwen gegevens (Shift+klik naar bypass cache)\",\n \"results.toolbar.refreshingTitle\": \"Vernieuwen...\",\n \"results.toolbar.cacheBustTitle\": \"Klik naar vernieuw en bypass cache\",\n \"results.toolbar.clear\": \"Wissen\",\n \"results.toolbar.clearFunnel\": \"Wissen funnel\",\n \"results.toolbar.clearQuery\": \"Wissen alle query gegevens\",\n \"results.toolbar.aiClose\": \"Sluiten AI assistant\",\n \"results.toolbar.aiOpen\": \"Analyse met AI\",\n \"results.toolbar.shareTitle\": \"Share deze analyse\",\n \"results.toolbar.shareCopied\": \"Link gekopieerd!\",\n \"results.toolbar.schemaHide\": \"Verbergen schema diagram\",\n \"results.toolbar.schemaShow\": \"Toon schema diagram\",\n \"results.toolbar.debugHide\": \"Verbergen debug info\",\n \"results.toolbar.debugShow\": \"Toon debug info\",\n \"results.toolbar.chartView\": \"Grafiek view\",\n \"results.toolbar.chartDisabled\": \"Voeg metingen naar enable grafiek view\",\n \"results.toolbar.tableView\": \"Tabel view\",\n \"results.toolbar.mergedTableView\": \"Merged tabel view\",\n \"results.view.table\": \"Tabel\",\n \"results.warning.filterHint\": \"Overweeg adding filters naar improve prestatie.\",\n \"results.debug.query\": \"Query:\",\n \"results.debug.queryAnalysis\": \"Query Analyse\",\n \"results.debug.copyMarkdownTitle\": \"Kopieer query, analyse, en SQL as markdown\",\n \"results.debug.copyAsMarkdown\": \"Kopiëren as Markdown\",\n \"results.debug.analysisError\": \"Analyse unavailable due naar fout\",\n \"results.debug.analysisEmpty\": \"Voeg metingen toe om analyse te zien\",\n \"results.debug.cubeQuery\": \"Cube-query\",\n \"results.debug.cubeQueryExecuted\": \"Executed Query (met funnel filters)\",\n \"results.debug.funnelFilterHint\": \"Deze query includes an IN filter met koppeling sleutel waarden van de previous stap\",\n \"results.debug.noQuery\": \"Geen query\",\n \"results.debug.serverResponse\": \"Serverantwoord\",\n \"results.debug.noResults\": \"Geen results yet\",\n \"results.debug.chartConfig\": \"Grafiek Configuratie\",\n \"results.debug.displayConfig\": \"Weergave Configuratie\",\n \"results.debug.generatedSql\": \"Gegenereerd SQL\",\n \"results.debug.loadingSql\": \"Laden SQL...\",\n \"results.debug.executionError\": \"Execution Fout\",\n \"results.confirm.clearFunnel\": \"Wissen Funnel\",\n \"results.confirm.clearQuery\": \"Wissen Query\",\n \"results.confirm.clearFunnelMessage\": \"Zijn je sure je want naar clear deze funnel? Deze action kan niet be undone.\",\n \"results.confirm.clearQueryMessage\": \"Zijn je sure je want naar clear deze query? Deze action kan niet be undone.\",\n \"results.table.noData\": \"Geen gegevens om weer te geven\",\n \"results.table.noDataHint\": \"Voer een query uit om tabelgegevens te zien\",\n \"results.flow.noData\": \"Geen flow gegevens naar weergeven\",\n \"results.flow.noDataHint\": \"Configureer flowanalyse om resultaten te zien\",\n \"results.flow.nodes\": \"Knooppunten ({count})\",\n \"results.flow.transitions\": \"Overgangen ({count})\",\n \"results.flow.layer\": \"Laag\",\n \"results.flow.name\": \"Naam\",\n \"results.flow.count\": \"Aantal\",\n \"results.flow.from\": \"Van\",\n \"results.flow.to\": \"Naar\",\n \"results.debug.funnel.label\": \"Trechter-query\",\n \"results.debug.funnel.steps\": \"{count} stappen\",\n \"results.debug.funnel.serverQuery\": \"Trechter-serverquery\",\n \"results.debug.funnel.noQuery\": \"Geen funnelquery geconfigureerd\",\n \"results.debug.funnel.sqlPlaceholder\": \"Configureer funnel-koppelingssleutel om SQL te genereren\",\n \"results.debug.funnel.stepsTitle\": \"Funnel Stappen\",\n \"results.debug.flow.label\": \"Flow-query\",\n \"results.debug.flow.badge\": \"{before} voor, {after} na\",\n \"results.debug.flow.serverQuery\": \"Flow-serverquery\",\n \"results.debug.flow.noQuery\": \"Geen flowquery geconfigureerd\",\n \"results.debug.flow.sqlPlaceholder\": \"Configureer flow om SQL te genereren\",\n \"results.debug.flow.configTitle\": \"Flow Configuratie\",\n \"results.debug.flow.startingStep\": \"Startende Stap:\",\n \"results.debug.flow.eventDimension\": \"Gebeurtenis Dimensie:\",\n \"results.debug.flow.stepsBefore\": \"Stappen Voor:\",\n \"results.debug.flow.stepsAfter\": \"Stappen Na:\",\n \"results.debug.flow.notSet\": \"Niet set\",\n \"results.debug.flow.responseTitle\": \"Server Response (Sankey Gegevens)\",\n \"results.debug.retention.label\": \"Retentie Query\",\n \"results.debug.retention.badge\": \"{segments} segment(en), {users} gebruikers\",\n \"results.debug.retention.serverQuery\": \"Retentie Server Query\",\n \"results.debug.retention.configIncomplete\": \"Configuratie Incomplete\",\n \"results.debug.retention.configHint\": \"Configureer de retentieanalyse-instellingen om een query te genereren.\",\n \"results.debug.retention.sqlPlaceholder\": \"Configureer retentie om SQL te genereren\",\n \"results.debug.retention.configTitle\": \"Retentie Configuratie\",\n \"results.debug.retention.summaryTitle\": \"Retentie Samenvatting\",\n \"results.debug.retention.retentionType\": \"Retentie Type:\",\n \"results.debug.retention.periods\": \"Periodes:\",\n \"results.debug.retention.granularity\": \"Granulariteit:\",\n \"results.debug.retention.segments\": \"Segmenten:\",\n \"results.debug.retention.avgPeriod1\": \"Avg Periode 1:\",\n \"results.debug.retention.maxPeriod1\": \"Max Periode 1:\",\n \"results.debug.retention.minPeriod1\": \"Min Periode 1:\",\n \"results.debug.standard.sqlPlaceholder\": \"Voeg metingen toe om SQL te genereren\",\n \"flow.tabs.flow\": \"Stroom\",\n \"flow.tabs.display\": \"Weergave\",\n \"flow.tabs.displayUnavailable\": \"Weergave options not beschikbaar\",\n \"flow.tabs.displayTitle\": \"Weergave options\",\n \"flow.visualization.title\": \"Visualisatie\",\n \"flow.visualization.description\": \"Kies hoe je de flowgegevens wilt visualiseren. Dit bepaalt hoe gegevens worden geaggregeerd.\",\n \"flow.visualization.sankey\": \"Sankey\",\n \"flow.visualization.sankeyHint\": \"Paden can converge\",\n \"flow.visualization.sunburst\": \"Sunburst\",\n \"flow.visualization.sunburstHint\": \"Unique paden alleen\",\n \"flow.startingStep.title\": \"Startende Stap\",\n \"flow.startingStep.description\": \"Define de anchor gebeurtenis van welke paden will zijn explored in both directions.\",\n \"flow.startingStep.filterLabel\": \"Filter Voorwaarden\",\n \"flow.depth.title\": \"Verkenningsdiepte\",\n \"flow.depth.descriptionSankey\": \"Hoe veel stappen naar explore voor en na de startende stap.\",\n \"flow.depth.descriptionSunburst\": \"Hoe veel stappen naar explore na de startende stap.\",\n \"flow.depth.stepsBefore\": \"Stappen Voor\",\n \"flow.depth.stepsBeforeNA\": \"(N/EEN)\",\n \"flow.depth.stepsAfter\": \"Stappen Na\",\n \"flow.depth.performanceWarning\": \"Hoog stap depth (4-5) kan impact query prestatie op groot datasets.\",\n \"flow.joinStrategy.title\": \"Join-strategie\",\n \"flow.joinStrategy.description\": \"Control hoe voor/na stappen zijn fetched. Schakel naar window if lateral is slower op je DB.\",\n \"flow.joinStrategy.auto\": \"Automatisch (prefer lateral if beschikbaar)\",\n \"flow.joinStrategy.lateral\": \"Lateraal (index-zoekacties)\",\n \"flow.joinStrategy.window\": \"Venster (ROW_NUMBER)\",\n \"retention.tabs.retention\": \"Retentie\",\n \"retention.tabs.display\": \"Weergave\",\n \"retention.tabs.displayUnavailable\": \"Weergave options not beschikbaar\",\n \"retention.tabs.displayTitle\": \"Weergave options\",\n \"retention.dateRange.title\": \"Datum Range\",\n \"retention.dateRange.description\": \"Selecteer het datumbereik voor cohort-instroom. Gebruikers die voor het eerst binnen dit bereik verschijnen worden geanalyseerd.\",\n \"retention.dateRange.label\": \"Datum Range\",\n \"retention.dateRange.selectRange\": \"Selecteer date range\",\n \"retention.dateRange.customRange\": \"Aangepast Range\",\n \"retention.dateRange.applyCustom\": \"Toepassen Aangepast Range\",\n \"retention.cohortFilter.title\": \"Cohortfilter\",\n \"retention.cohortFilter.description\": \"Bepaal wie tot het cohort behoort. Gebruikers waarvan de eerste gebeurtenis binnen het datumbereik aan deze filters voldoet, worden opgenomen.\",\n \"retention.returnFilter.title\": \"Terugkeerfilter\",\n \"retention.returnFilter.description\": \"Define what counts as a return. Gebeurtenissen matching these filters in subsequent periods count as retentie.\",\n \"retention.breakdown.title\": \"Opsplitsing\",\n \"retention.breakdown.description\": \"Optionally segment retentie by dimensies (e.g., country, plan type).\",\n \"retention.settings.title\": \"Instellingen\",\n \"retention.settings.description\": \"Configureer hoe retentie wordt berekend en weergegeven.\",\n \"retention.settings.granularityLabel\": \"Periode Granularity\",\n \"retention.settings.periodsLabel\": \"Nummer of Periods ({min}-{max})\",\n \"retention.settings.periodsWarning\": \"Hoog periode aantal kan impact query prestatie.\",\n \"retention.settings.retentionTypeLabel\": \"Retentie Type\",\n \"debug.explainPlan\": \"Uitleggen Plan\",\n \"debug.explainRunning\": \"Draaiend...\",\n \"debug.explainIncludeTiming\": \"Inclusief timing\",\n \"debug.explainRunningAnalyze\": \"Draaiend UITLEGGEN ANALYZE...\",\n \"debug.explainRunningBasic\": \"Draaiend UITLEGGEN...\",\n \"debug.explainError\": \"Explain Fout:\",\n \"debug.sequentialScans\": \"Sequentiële scans gedetecteerd\",\n \"debug.indexesUsed\": \"{count} index gebruikt\",\n \"debug.indexesUsedPlural\": \"{count} indexen gebruikt\",\n \"debug.executionTime\": \"Uitvoering: {time}ms\",\n \"debug.planningTime\": \"Planning: {time} ms\",\n \"debug.cost\": \"Kosten: {cost}\",\n \"debug.indexes\": \"Indexen:\",\n \"debug.executionPlanTitle\": \"Uitvoering Plan ({database})\",\n \"debug.aiAnalyzing\": \"Analyseren...\",\n \"debug.aiAnalysis\": \"AI Analyse\",\n \"debug.aiAnalysisError\": \"AI Analyse Fout:\",\n \"explainAI.title\": \"AI Performance Analyse\",\n \"explainAI.assessment.good\": \"Goed\",\n \"explainAI.assessment.warning\": \"Waarschuwing\",\n \"explainAI.assessment.critical\": \"Kritiek\",\n \"explainAI.summary\": \"Samenvatting\",\n \"explainAI.queryAnalysis\": \"Query Analyse\",\n \"explainAI.issuesFound\": \"Issues Gevonden ({count})\",\n \"explainAI.recommendations\": \"Aanbevelingen ({count})\",\n \"explainAI.noRecommendations\": \"Geen specifieke aanbevelingen. De query lijkt goed geoptimaliseerd.\",\n \"explainAI.expectedImpact\": \"Verwachte impact:\",\n \"explainAI.addToCube\": \"Voeg naar {cubeName} cube:\",\n \"explainAI.modelLabel\": \"Model:\",\n \"explainAI.usingUserKey\": \"(met je API sleutel)\",\n \"explainAI.copied\": \"Gekopieerd!\",\n \"explainAI.copy\": \"Kopiëren\",\n \"explainAI.type.index\": \"INDEX\",\n \"explainAI.type.table\": \"TABEL\",\n \"explainAI.type.cube\": \"CUBE\",\n \"explainAI.type.general\": \"TIP\",\n \"errorBoundary.modeError\": \"Mode Fout\",\n \"errorBoundary.modeErrorDescription\": \"Er is een probleem opgetreden met de modus {mode}. Dit kan komen door ongeldige configuratiegegevens.\",\n \"errorBoundary.showDetails\": \"Toon fout details\",\n \"errorBoundary.unknownError\": \"Onbekend fout\",\n \"errorBoundary.tryAgain\": \"Opnieuw proberen\",\n \"errorBoundary.switchToQuery\": \"Schakel naar Query Modus\",\n \"funnel.tabs.steps\": \"Stappen\",\n \"funnel.tabs.display\": \"Weergave\",\n \"funnel.tabs.displayUnavailable\": \"Weergave options not beschikbaar\",\n \"funnel.tabs.displayTitle\": \"Weergave options\",\n \"funnel.steps.title\": \"Funnel Stappen\",\n \"funnel.steps.emptyMessage\": \"Geen stappen defined. Voeg at least 2 stappen naar create a funnel.\",\n \"funnel.steps.addFirst\": \"Voeg First Stap\",\n \"funnel.steps.addStep\": \"Voeg Stap\",\n \"funnel.steps.validationHint\": \"Voeg at least one more stap naar create a valid funnel\",\n \"funnel.step.removeTitle\": \"Verwijderen stap\",\n \"funnel.step.editNameTitle\": \"Klik naar edit naam\",\n \"funnel.step.placeholder\": \"Stap name\",\n \"funnel.step.timeWindow\": \"Tijd Window\",\n \"funnel.step.timeWindowHelp\": \"Max tijd van previous stap naar qualify\",\n \"funnel.step.filters\": \"{count} filter\",\n \"funnel.step.filtersPlural\": \"{count} filters\",\n \"funnel.step.within\": \"binnen {time}\",\n \"funnel.step.noFilters\": \"Geen filters geconfigureerd\",\n \"funnel.config.configuration\": \"Configuratie\",\n \"funnel.config.cube\": \"Cube\",\n \"funnel.config.cubeHelp\": \"Selecteer een cube die is geconfigureerd voor funnelanalyse\",\n \"funnel.config.cubePlaceholder\": \"Selecteer gebeurtenis stream cube\",\n \"funnel.config.bindingKey\": \"Koppeling Sleutel\",\n \"funnel.config.bindingKeyHelp\": \"Entity dat connects stappen (e.g., gebruiker ID, order ID)\",\n \"funnel.config.bindingKeyPlaceholder\": \"Selecteer binding key\",\n \"funnel.config.selectCubeFirst\": \"Selecteer cube first\",\n \"funnel.config.timeDimension\": \"Tijd Dimensie\",\n \"funnel.config.timeDimensionHelp\": \"Tijdstempel veld voor stap ordering\",\n \"funnel.config.timeDimensionPlaceholder\": \"Selecteer time dimensie\",\n \"funnel.config.noMatchingFields\": \"Geen matching velden gevonden\",\n \"funnel.bindingKey.searchPlaceholder\": \"Zoeken dimensies...\",\n \"funnel.bindingKey.noMatching\": \"Geen matching dimensies gevonden\",\n \"funnel.bindingKey.helpText\": \"Selecteer een dimensie die entiteiten over funnelstappen identificeert (bijv. gebruikers-ID, order-ID)\",\n \"funnel.bindingKey.clearTitle\": \"Wissen binding key\",\n \"flow.config.configuration\": \"Configuratie\",\n \"flow.config.cube\": \"Cube\",\n \"flow.config.cubeHelp\": \"Selecteer een cube die is geconfigureerd voor flowanalyse\",\n \"flow.config.cubePlaceholder\": \"Selecteer gebeurtenis stream cube\",\n \"flow.config.bindingKey\": \"Koppeling Sleutel\",\n \"flow.config.bindingKeyHelp\": \"Entity dat links gebeurtenissen together (e.g., gebruiker ID)\",\n \"flow.config.bindingKeyPlaceholder\": \"Selecteer binding key\",\n \"flow.config.selectCubeFirst\": \"Selecteer cube first\",\n \"flow.config.timeDimension\": \"Tijd Dimensie\",\n \"flow.config.timeDimensionHelp\": \"Tijdstempel veld voor gebeurtenis ordering\",\n \"flow.config.timeDimensionPlaceholder\": \"Selecteer time dimensie\",\n \"flow.config.eventDimension\": \"Gebeurtenis Dimensie\",\n \"flow.config.eventDimensionHelp\": \"Dimensie dat categorizes gebeurtenissen (node labels in Sankey)\",\n \"flow.config.eventDimensionPlaceholder\": \"Selecteer gebeurtenis dimensie\",\n \"flow.config.noMatchingFields\": \"Geen matching velden gevonden\",\n \"retention.config.configuration\": \"Configuratie\",\n \"retention.config.cube\": \"Cube\",\n \"retention.config.cubeHelp\": \"Selecteer de cube met je gebruikersgebeurtenissen\",\n \"retention.config.cubePlaceholder\": \"Selecteer cube\",\n \"retention.config.bindingKey\": \"Koppeling Sleutel\",\n \"retention.config.bindingKeyHelp\": \"Dimensie die entiteiten over gebeurtenissen identificeert (bijv. gebruikers-ID, klant-ID)\",\n \"retention.config.bindingKeyPlaceholder\": \"Selecteer user identifier\",\n \"retention.config.selectCubeFirst\": \"Selecteer cube first\",\n \"retention.config.timestamp\": \"Tijdstempel\",\n \"retention.config.timestampHelp\": \"Tijdstempel veld voor cohort entry en activiteit\",\n \"retention.config.timestampPlaceholder\": \"Selecteer timestamp\",\n \"retention.config.noMatchingFields\": \"Geen matching velden gevonden\",\n \"retention.config.searchPlaceholder\": \"Zoeken...\",\n \"display.showLegend\": \"Toon Legenda\",\n \"display.showGrid\": \"Toon Grid\",\n \"display.showTooltip\": \"Toon Tooltip\",\n \"display.stacked\": \"Gestapeld\",\n \"display.hideHeader\": \"Verbergen Header\",\n \"fieldSearch.aria.closeDialog\": \"Sluiten dialog\",\n \"fieldSearch.aria.filterByCube\": \"Filter op cube\",\n \"fieldSearch.aria.cubeCategories\": \"Cube-categorieën\",\n \"fieldSearch.aria.availableFields\": \"Beschikbaar velden\",\n \"chart.dropZone.required\": \"Deze veld is vereist\",\n \"common.actions.apply\": \"Toepassen\",\n \"common.actions.done\": \"Klaar\",\n \"common.actions.update\": \"Bijwerken\",\n \"common.actions.retry\": \"Opnieuw proberen\",\n \"common.actions.exit\": \"Afsluiten\",\n \"common.actions.selectAll\": \"Selecteer Alle\",\n \"common.saving\": \"Opslaan...\",\n \"common.labels.title\": \"Titel\",\n \"dashboardFilter.editFilter\": \"Bewerken Filter\",\n \"dashboardFilter.filterLabel\": \"Filterlabel\",\n \"dashboardFilter.enterFilterLabel\": \"Enter filter label\",\n \"dashboardFilter.universalTimeFilter\": \"Universal Tijd Filter\",\n \"dashboardFilter.universalTimeDescription\": \"Dit filter wordt toegepast op alle tijdsdimensies in gekoppelde portlets. Gebruikers kunnen het datumbereik kiezen bij het bekijken van het dashboard.\",\n \"dashboardFilter.field\": \"Veld\",\n \"dashboardFilter.showDashboardFields\": \"Toon dashboard velden only\",\n \"dashboardFilter.showAllFields\": \"Toon alle velden\",\n \"dashboardFilter.dashboard\": \"Dashboard\",\n \"dashboardFilter.all\": \"Alle\",\n \"dashboardFilter.clickToSelectField\": \"Klik naar selecteer een veld\",\n \"dashboardFilter.operator\": \"Operator\",\n \"dashboardFilter.defaultValue\": \"Standaard Waarde\",\n \"dashboardFilter.deleteFilter\": \"Verwijderen Filter\",\n \"dashboardFilter.noValueRequired\": \"Geen waarde vereist\",\n \"dashboardFilter.to\": \"naar\",\n \"dashboardFilter.selectValue\": \"Selecteer waarde...\",\n \"dashboardFilter.search\": \"Zoeken...\",\n \"dashboardFilter.errorPrefix\": \"Fout:\",\n \"dashboardFilter.noValuesFound\": \"Geen waarden gevonden\",\n \"dashboardFilter.enterValue\": \"Enter waarde...\",\n \"dashboardFilter.enterNumber\": \"Enter nummer\",\n \"dashboardFilter.min\": \"Min\",\n \"dashboardFilter.max\": \"Max\",\n \"dashboardFilter.filterLabelRequired\": \"Filter label is vereist\",\n \"dashboardFilter.selectFieldRequired\": \"Selecteer een veld voor het filter\",\n \"dashboardFilter.notSet\": \"(niet set)\",\n \"dashboardFilter.clickToConfigure\": \"Klik om te configureren\",\n \"dashboardFilter.customDate.startDate\": \"Start Datum\",\n \"dashboardFilter.customDate.endDate\": \"End Datum\",\n \"dashboardFilter.customDate.sinceDate\": \"Since Datum\",\n \"dashboardFilter.customDate.fromSelectedToToday\": \"Van selected date naar today\",\n \"dashboardFilter.customDate.number\": \"Nummer\",\n \"dashboardFilter.customDate.unit\": \"Eenheid\",\n \"dashboardFilter.customDate.lastNPreview\": \"Laatste {number} {unit}\",\n \"dashboardFilter.editMode.filters\": \"Filters\",\n \"dashboardFilter.editMode.noFilters\": \"Geen filters geconfigureerd. Klik op \\\"Voeg toe\\\" om er één te maken.\",\n \"dashboardFilter.editMode.dateRange\": \"Datum Range\",\n \"dashboardFilter.editMode.filter\": \"Filter\",\n \"dashboardFilter.editMode.editFilter\": \"Bewerken filter\",\n \"dashboardFilter.editMode.removeFilter\": \"Verwijderen filter\",\n \"dashboardFilter.filterValue.editValue\": \"Bewerken waarde\",\n \"dashboardFilter.readOnly.filters\": \"Filters\",\n \"filter.shared.fieldsInQuery\": \"Velden in Query ({count})\",\n \"filter.shared.allAvailableFields\": \"Alle Beschikbaar Velden ({count})\",\n \"filter.shared.noFieldsMatch\": \"Geen velden gevonden matching \\\"{searchTerm}\\\"\",\n \"filter.shared.searchFields\": \"Zoeken velden...\",\n \"filter.shared.selectField\": \"Selecteer veld...\",\n \"filter.shared.schemaNotLoaded\": \"Schema niet geladen\",\n \"filter.shared.group.addFilter\": \"Voeg Filter\",\n \"filter.shared.group.addAndGroup\": \"Voeg EN Groep\",\n \"filter.shared.group.addOrGroup\": \"Voeg OF Groep\",\n \"filter.shared.group.addCondition\": \"Voeg condition\",\n \"filter.shared.group.noConditions\": \"Geen conditions in deze groep.\",\n \"filter.shared.group.addFilterLink\": \"Voeg a filter\",\n \"filter.shared.builder.filters\": \"Filters ({count})\",\n \"filter.shared.builder.clearAll\": \"Wissen alle\",\n \"filter.shared.builder.addFilter\": \"Voeg Filter\",\n \"filter.shared.dateRange.title\": \"Datum Ranges ({count})\",\n \"filter.shared.dateRange.clearAll\": \"Wissen alle\",\n \"filter.shared.dateRange.addDateRange\": \"Voeg Datum Range\",\n \"filter.shared.dateRange.allHaveDateRanges\": \"Alle time dimensies already have date ranges\",\n \"filter.shared.valueSelector.noValueRequired\": \"Geen waarde vereist\",\n \"filter.shared.valueSelector.to\": \"naar\",\n \"filter.shared.valueSelector.min\": \"Min\",\n \"filter.shared.valueSelector.max\": \"Max\",\n \"filter.shared.valueSelector.enterNumber\": \"Enter nummer\",\n \"filter.shared.valueSelector.loadingValues\": \"Laden waarden...\",\n \"filter.shared.valueSelector.selectValue\": \"Selecteer waarde...\",\n \"filter.shared.valueSelector.searchValues\": \"Zoeken waarden...\",\n \"filter.shared.valueSelector.searching\": \"Searching...\",\n \"filter.shared.valueSelector.errorLoading\": \"Fout laden waarden: {error}\",\n \"filter.shared.valueSelector.noMatchingValues\": \"Geen matching waarden\",\n \"filter.shared.valueSelector.noValuesAvailable\": \"Geen waarden beschikbaar\",\n \"filter.shared.valueSelector.enterValue\": \"Enter {type} waarde\",\n \"dashboard.noPortlets\": \"Geen Portlets\",\n \"dashboard.noPortletsDescription\": \"Voeg je first portlet naar start visualizing je gegevens\",\n \"dashboard.addText\": \"Voeg Tekst\",\n \"dashboard.addPortlet\": \"Voeg Portlet\",\n \"dashboard.finishEditing\": \"Finish Editing\",\n \"dashboard.edit\": \"Bewerken\",\n \"dashboard.grid\": \"Raster\",\n \"dashboard.rows\": \"Rijen\",\n \"dashboard.desktopRequired\": \"Desktop view vereist voor editing\",\n \"dashboard.editModeHint\": \"Drag • Resize • Automatisch-save\",\n \"dashboard.filterSelectionMode\": \"Filter Selection Modus - Klik portlets naar toggle '{filterLabel}'\",\n \"dashboard.filterSelectionEscHint\": \"• Druk op Enter of Esc om op te slaan\",\n \"dashboard.filterFieldChipHint\": \"Klik om te wijzigen op welk veld dit filter wordt toegepast voor deze portlet\",\n \"dashboard.editPortlet\": \"Bewerken Portlet\",\n \"dashboard.addNewPortlet\": \"Voeg Nieuw Portlet\",\n \"dashboard.updatePortlet\": \"Bijwerken Portlet\",\n \"dashboard.deletePortlet\": \"Verwijderen Portlet\",\n \"dashboard.deletePortletConfirm\": \"Zijn je sure je want naar verwijder\",\n \"dashboard.deletePortletSuffix\": \"? Deze action kan niet zijn undone.\",\n \"dashboard.thisPortlet\": \"deze portlet\",\n \"dashboard.portlet.action.edit\": \"Portlet bewerken\",\n \"dashboard.portlet.action.duplicate\": \"Portlet dupliceren\",\n \"dashboard.portlet.action.delete\": \"Portlet verwijderen\",\n \"dashboard.portlet.action.refresh\": \"Portlet vernieuwen\",\n \"dashboard.portlet.action.drag\": \"Portlet slepen\",\n \"dashboard.portlet.action.filterConfig\": \"Dashboardfilters configureren\",\n \"dashboard.portlet.action.filterConfigActive\": \"Dashboardfilters configureren ({count} actief)\",\n \"dashboard.group.rename\": \"Groep hernoemen\",\n \"dashboard.group.drag\": \"Groep slepen\",\n \"dashboard.group.titlePlaceholder\": \"Groepstitel\",\n \"dashboard.group.ungroup\": \"Groep opheffen\",\n \"dashboard.group.delete\": \"Groep verwijderen\",\n \"dashboard.group.deleteTitle\": \"Groep verwijderen\",\n \"dashboard.group.deleteConfirm\": \"Weet je zeker dat je deze groep en alle {count} portlets erin wilt verwijderen? Deze actie kan niet ongedaan worden gemaakt.\",\n \"dashboard.editModal.dashboardName\": \"Dashboard Naam\",\n \"dashboard.editModal.enterDashboardName\": \"Enter dashboard naam...\",\n \"dashboard.editModal.descriptionOptional\": \"Beschrijving (optional)\",\n \"dashboard.editModal.enterDescription\": \"Enter description...\",\n \"portlet.configRequired\": \"Configuratie vereist\",\n \"portlet.copyToClipboard\": \"Grafiek naar klembord kopiëren\",\n \"portlet.copied\": \"Gekopieerd!\",\n \"portlet.downloadXlsx\": \"Gegevens downloaden als XLSX\",\n \"portlet.exporting\": \"Exporteren...\",\n \"portlet.configRequiredHint\": \"Configureer deze grafiek\",\n \"portlet.queryError\": \"Query Fout\",\n \"portlet.queryWithFilters\": \"Query (met filters toegepast)\",\n \"portlet.chartConfig\": \"Grafiek Configuratie\",\n \"portlet.noDataAvailable\": \"Geen gegevens beschikbaar\",\n \"portlet.noDataDrilled\": \"Geen datapunten om weer te geven voor het huidige filter\",\n \"portlet.invalidQuery\": \"Ongeldig query of no results\",\n \"portlet.unsupportedChartType\": \"Unsupported grafiek type\",\n \"portlet.unableToRender\": \"Kan niet renderen grafiek\",\n \"portlet.droppedMembers\": \"Verborgen — niet meer in het model: {members}\",\n \"portlet.enterTitle\": \"Enter portlet title...\",\n \"portlet.enterPortletTitle\": \"Voer een titel in voor de portlet.\",\n \"portlet.configureQuery\": \"Configureer een query voordat je opslaat.\",\n \"portlet.configureFlow\": \"Configureer de flowanalyse (binding key, tijdsdimensie, gebeurtenisdimensie en startstapfilter).\",\n \"portlet.configureRetention\": \"Configureer de retentieanalyse (binding key, tijdsdimensie en datumbereik).\",\n \"portlet.configureFunnel\": \"Alstublieft add at least two funnel stappen.\",\n \"portlet.addMetricOrBreakdown\": \"Alstublieft add at least one metric of breakdown naar je query.\",\n \"portlet.filterConfig.title\": \"Configureer dashboardfilters\",\n \"portlet.filterConfig.subtitle\": \"Kies which dashboard filters apply naar \\\"{portletTitle}\\\"\",\n \"portlet.filterConfig.noFilters\": \"Geen dashboard filters beschikbaar\",\n \"portlet.filterConfig.noFiltersHint\": \"Voeg eerst filters toe op dashboardniveau\",\n \"portlet.filterConfig.availableFilters\": \"Beschikbaar Filters\",\n \"portlet.filterConfig.selectedCount\": \"{selected} van {total} selected\",\n \"portlet.filterConfig.applied\": \"Toegepast\",\n \"portlet.filterConfig.noValue\": \"geen waarde\",\n \"portlet.filterConfig.complexFilter\": \"Complex filter\",\n \"portlet.filterConfig.groupFilter\": \"{type} groep met {count} filter\",\n \"portlet.filterConfig.groupFilterPlural\": \"{type} groep met {count} filters\",\n \"portlet.filterConfig.applyFilters\": \"Toepassen Filters\",\n \"portlet.filterConfig.applyToField\": \"Toepassen op veld\",\n \"portlet.filterConfig.applyToFieldDefault\": \"Standaard ({field})\",\n \"portlet.filterConfig.mappedTo\": \"Gekoppeld aan {field}\",\n \"portlet.filterConfig.mappedFieldMissing\": \"Het gekoppelde veld \\\"{field}\\\" is niet meer beschikbaar in het schema\",\n \"portlet.filterConfig.applyToTimeDimensionsDefault\": \"Standaard (de tijdsdimensies van de portlet)\",\n \"portlet.dateFilterNotApplied\": \"Het dashboard-datumfilter \\\"{label}\\\" beperkt deze portlet niet omdat deze geen tijdsdimensie heeft. Koppel het filter aan een datumveld in de filterinstellingen van de portlet.\",\n \"textPortlet.editText\": \"Bewerken Tekst\",\n \"textPortlet.addText\": \"Voeg Tekst\",\n \"textPortlet.markdownContent\": \"Markdown Content\",\n \"textPortlet.markdownHint\": \"Ondersteunt kopteksten (#), bold (**tekst**), italic (*tekst*), links ([tekst](url)), lists (- item), en horizontal rules (---).\",\n \"textPortlet.preview\": \"Voorbeeld\",\n \"debug.title\": \"Grafiek Debug Information\",\n \"debug.chartType\": \"Grafiek Type\",\n \"debug.fieldAnalysis\": \"Veld Analyse\",\n \"debug.chartConfig\": \"Grafiek Configuratie\",\n \"debug.displayConfig\": \"Weergave Configuratie\",\n \"debug.queryObject\": \"Query-object\",\n \"debug.dataSample\": \"Gegevens Sample (first 3 rijen)\",\n \"debug.cacheStatus\": \"Cachestatus\",\n \"debug.cacheHit\": \"Cache-hit\",\n \"debug.cachedAt\": \"Cached Bij:\",\n \"debug.ttl\": \"TTL:\",\n \"debug.ttlRemaining\": \"Resterende TTL:\",\n \"debug.freshQuery\": \"Nieuwe query\",\n \"debug.notFromCache\": \"Resultaat not served van cache\",\n \"debug.escToClose\": \"Druk\",\n \"debug.escKey\": \"ESC\",\n \"debug.toClose\": \"naar sluiten\",\n \"debug.tooltip\": \"Debug grafiek configuratie\",\n \"error.unableToRender\": \"Kan niet renderen grafiek\",\n \"error.unableToRenderNamed\": \"Kan niet renderen {title}\",\n \"error.renderDescription\": \"There was an fout rendering deze grafiek component. De fout details zijn shown onder.\",\n \"error.errorLabel\": \"Fout:\",\n \"error.typeLabel\": \"Type:\",\n \"error.portletConfig\": \"Portlet Configuratie\",\n \"error.cubeQuery\": \"Cube-query\",\n \"error.componentStack\": \"Componentstack\",\n \"error.tryAgain\": \"Opnieuw proberen\",\n \"drill.back\": \"Terug\",\n \"drill.goBackOneLevel\": \"Go back één level\",\n \"drill.returnToTop\": \"Return naar boven level\",\n \"drill.navigateTo\": \"Navigeer naar {label}\",\n \"drill.empty\": \"(leeg)\",\n \"analyticsPage.title\": \"Analysepagina - Komt in fase 4\",\n \"dataHistogram.average\": \"Gemiddelde van {count} waarden\",\n \"dataHistogram.valuesInRange\": \"{count} waarden in deze bereik\",\n \"mcp.status.connecting\": \"Verbinden...\",\n \"mcp.status.loading\": \"Laden...\",\n \"mcp.status.waiting\": \"Wachten op queryresultaten...\",\n \"mcp.error.connectionLabel\": \"Verbindingsfout:\",\n \"mcp.error.errorLabel\": \"Fout:\",\n \"mcp.error.noTextContent\": \"Geen tekstinhoud in resultaat\",\n \"mcp.error.invalidResultFormat\": \"Ongeldig resultaatformaat: data-array ontbreekt\",\n \"mcp.error.parseFailed\": \"Kon resultaat niet verwerken: {message}\",\n \"mcp.error.queryFailed\": \"Query mislukt: {message}\",\n \"mcp.footer.rows\": \"{count} rij\",\n \"mcp.footer.rowsPlural\": \"{count} rijen\",\n \"mcp.footer.measures\": \"{count} metriek\",\n \"mcp.footer.measuresPlural\": \"{count} metrieken\",\n \"mcp.footer.dimensions\": \"{count} dimensie\",\n \"mcp.footer.dimensionsPlural\": \"{count} dimensies\",\n \"chart.option.kpiLayout.label\": \"Lay-out\",\n \"chart.option.kpiLayout.description\": \"Compact gebruikt een vaste tekstgrootte zodat meerdere KPI's uitlijnen als een metriekstrook; auto schaalt de waarde naar de portlet\",\n \"chart.option.kpiLayout.auto\": \"Automatisch\",\n \"chart.option.kpiLayout.compact\": \"Compact\",\n \"chart.option.showBaseline.label\": \"Basislijn tonen\",\n \"chart.option.showBaseline.description\": \"Toon de vorige en huidige waarden als een voor-en-na-paar\",\n \"chart.runtime.kpiVsTarget\": \"t.o.v. {target}\",\n \"chart.runtime.kpiExcludesLastPeriod\": \"Exclusief laatste {period}\",\n \"chart.runtime.kpiExcludesIncompletePeriod\": \"Exclusief huidige onvolledige {period}\",\n \"chart.runtime.kpiPeriodFallback\": \"periode\",\n \"chart.runtime.noDataShort\": \"Geen gegevens\",\n \"chart.option.showSummary.label\": \"Samenvattingskop\",\n \"chart.option.showSummary.description\": \"Toon boven de grafiek de laatste waarde per reeks, met de verandering sinds het begin van de periode bij tijdgebaseerde grafieken\",\n \"chart.runtime.summarySincePeriodStart\": \"sinds begin van de periode\",\n \"chart.proportionBar.label\": \"Verhoudingsbalk\",\n \"chart.proportionBar.description\": \"Toon een verdeling van het geheel als één gestapelde horizontale balk\",\n \"chart.proportionBar.useCase\": \"Ideaal voor werkverdeling, budgetverdelingen of elke aandeelverdeling waarbij het vergelijken van verhoudingen belangrijker is dan exacte waarden — vlakker en beter leesbaar dan een taartdiagram\",\n \"chart.proportionBar.dropZone.xAxis.empty\": \"Zet hier een dimensie neer\",\n \"chart.proportionBar.dropZone.yAxis.empty\": \"Zet hier een metriek neer\",\n \"chart.proportionBar.validation.dimensionRequired\": \"Een dimensie is vereist voor verhoudingsbalkdiagrammen\",\n \"chart.proportionBar.validation.measureRequired\": \"Een metriek is vereist voor verhoudingsbalkdiagrammen\",\n \"chart.configText.category\": \"Categorie\",\n \"chart.configText.dimension_to_split_the_bar_into_segments\": \"Dimensie om de balk in segmenten te splitsen\",\n \"chart.configText.measure_that_determines_each_segments_share\": \"Metriek die het aandeel van elk segment bepaalt\",\n \"chart.option.showPercentages.label\": \"Percentages tonen\",\n \"chart.option.showPercentages.description\": \"Toon het aandeel van elk segment als percentage onder de balk\",\n \"chart.option.sortSegments.label\": \"Segmenten sorteren\",\n \"chart.option.sortSegments.description\": \"Sorteer segmenten van groot naar klein in plaats van de queryvolgorde aan te houden\",\n \"chart.option.proportionBarLabels.description\": \"Toon de categorienaam boven het aandeel van elk segment\",\n \"chart.option.proportionBarDecimals.description\": \"Aantal decimalen dat op elk percentage wordt getoond\",\n \"chart.runtime.noDataHint.proportionBar\": \"Geen gegevenspunten om te verdelen\",\n \"chart.runtime.configErrorHint.proportionBar\": \"Voeg één dimensie en één metriek toe om een verdeling te tonen\",\n \"chart.runtime.noValidDataHint.proportionBar\": \"Alle waarden zijn nul, negatief of ongeldig\",\n \"chart.option.proportionBarLabels.label\": \"Labels tonen\",\n \"chart.runtime.summarySince\": \"sinds {period}\",\n \"chart.option.showPoints.label\": \"Datapunten tonen\",\n \"chart.option.showPoints.description\": \"Teken een markering bij elk datapunt. Schakel dit uit bij dichte reeksen, waar de markeringen de lijn verbergen\",\n \"chart.gauge.thresholds.from\": \"Band begint bij\",\n \"chart.gauge.thresholds.colour\": \"Bandkleur\",\n \"chart.gauge.thresholds.add\": \"Band toevoegen\",\n \"chart.gauge.thresholds.remove\": \"Band verwijderen\",\n \"dashboard.export.button\": \"Exporteren\",\n \"dashboard.export.tooltip\": \"Dit dashboard downloaden als JSON-bestand\",\n \"dashboard.import.button\": \"Importeren\",\n \"dashboard.import.tooltip\": \"Dit dashboard vervangen door een JSON-export\",\n \"dashboard.import.confirmTitle\": \"Dashboard importeren\",\n \"dashboard.import.confirmMessage\": \"Alles op dit dashboard vervangen door de {count} portlets uit \\\"{fileName}\\\"? Dit kan niet ongedaan worden gemaakt.\",\n \"dashboard.import.confirmRename\": \"Het dashboard wordt ook hernoemd naar \\\"{name}\\\".\",\n \"dashboard.import.confirmAction\": \"Dashboard vervangen\",\n \"dashboard.import.warningsTitle\": \"Waarschuwingen\",\n \"dashboard.import.warning.unknownFilterMapping\": \"Portlet \\\"{portlet}\\\" is gekoppeld aan een dashboardfilter dat niet in het bestand staat ({filterId}).\",\n \"dashboard.import.errorTitle\": \"Dashboard kon niet worden geïmporteerd\",\n \"dashboard.import.errorIntro\": \"\\\"{fileName}\\\" kon niet worden geïmporteerd:\",\n \"dashboard.import.error.invalidJson\": \"Het bestand is geen geldige JSON.\",\n \"dashboard.import.error.unknownFormat\": \"Het bestand is geen drizzle-cube dashboardexport.\",\n \"dashboard.import.error.invalidConfig\": \"De dashboardconfiguratie is ongeldig ({path}).\",\n \"dashboard.import.error.invalidPortlet\": \"Portlet {index} is ongeldig ({path}).\"\n}\n"],"mappings":""}
@@ -1,6 +1,6 @@
1
1
  import { n as e } from "./rolldown-runtime-DArdT4gl.js";
2
- import { c as t, y as n } from "./chart-data-table-BdMo3zVh.js";
3
- import { F as r } from "./chart-activity-grid-DGazwi4C.js";
2
+ import { c as t, y as n } from "./chart-data-table-Cxd0cdAl.js";
3
+ import { F as r } from "./chart-activity-grid-Ly_-2B-f.js";
4
4
  import { Suspense as i, createContext as a, lazy as o, useCallback as s, useContext as c, useEffect as l, useMemo as u, useRef as d, useState as f } from "react";
5
5
  import { Fragment as p, jsx as m, jsxs as h } from "react/jsx-runtime";
6
6
  //#region src/client/components/SchemaVisualization/xyflowContext.tsx
@@ -1060,4 +1060,4 @@ function V({ className: e = "", onFieldClick: i, highlightedCubes: a, highlighte
1060
1060
  //#endregion
1061
1061
  export { y as n, w as t };
1062
1062
 
1063
- //# sourceMappingURL=schema-visualization-BbvL74Sf.js.map
1063
+ //# sourceMappingURL=schema-visualization-MlRrcJQH.js.map