drizzle-cube 0.1.21 → 0.1.23

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 (28) hide show
  1. package/dist/adapters/{compiler-CPsEzFP2.js → compiler-CSr2Ti96.js} +553 -505
  2. package/dist/adapters/express/index.js +1 -1
  3. package/dist/adapters/fastify/index.js +1 -1
  4. package/dist/adapters/hono/index.js +1 -1
  5. package/dist/adapters/nextjs/index.js +50 -50
  6. package/dist/client/charts.js +1 -1
  7. package/dist/client/chunks/{charts-BadAUMmd.js → charts-8KmxUVvG.js} +2 -2
  8. package/dist/client/chunks/{charts-BadAUMmd.js.map → charts-8KmxUVvG.js.map} +1 -1
  9. package/dist/client/chunks/{icons-B5RVM-7b.js → icons-QczkAx61.js} +46 -41
  10. package/dist/client/chunks/{icons-B5RVM-7b.js.map → icons-QczkAx61.js.map} +1 -1
  11. package/dist/client/chunks/{providers-DI5zeeEU.js → providers-B7MVnAAt.js} +50 -50
  12. package/dist/client/chunks/providers-B7MVnAAt.js.map +1 -0
  13. package/dist/client/components/charts/ActivityGridChart.config.d.ts +5 -0
  14. package/dist/client/components/charts/ActivityGridChart.d.ts +2 -0
  15. package/dist/client/components/charts/index.d.ts +1 -0
  16. package/dist/client/components.js +2875 -2351
  17. package/dist/client/components.js.map +1 -1
  18. package/dist/client/hooks/useCubeMeta.d.ts +1 -0
  19. package/dist/client/hooks.js +62 -60
  20. package/dist/client/hooks.js.map +1 -1
  21. package/dist/client/index.js +2 -2
  22. package/dist/client/providers.js +1 -1
  23. package/dist/client/types.d.ts +6 -2
  24. package/dist/client-bundle-stats.html +1 -1
  25. package/dist/server/index.d.ts +3 -8
  26. package/dist/server/index.js +748 -700
  27. package/package.json +22 -1
  28. package/dist/client/chunks/providers-DI5zeeEU.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"components.js","sources":["../../src/client/components/ChartErrorBoundary.tsx","../../node_modules/d3-array/src/extent.js","../../node_modules/d3-array/src/max.js","../../node_modules/d3-axis/src/identity.js","../../node_modules/d3-axis/src/axis.js","../../node_modules/d3-selection/src/namespaces.js","../../node_modules/d3-selection/src/namespace.js","../../node_modules/d3-selection/src/creator.js","../../node_modules/d3-selection/src/selector.js","../../node_modules/d3-selection/src/selection/select.js","../../node_modules/d3-selection/src/array.js","../../node_modules/d3-selection/src/selectorAll.js","../../node_modules/d3-selection/src/selection/selectAll.js","../../node_modules/d3-selection/src/matcher.js","../../node_modules/d3-selection/src/selection/selectChild.js","../../node_modules/d3-selection/src/selection/selectChildren.js","../../node_modules/d3-selection/src/selection/filter.js","../../node_modules/d3-selection/src/selection/sparse.js","../../node_modules/d3-selection/src/selection/enter.js","../../node_modules/d3-selection/src/constant.js","../../node_modules/d3-selection/src/selection/data.js","../../node_modules/d3-selection/src/selection/exit.js","../../node_modules/d3-selection/src/selection/join.js","../../node_modules/d3-selection/src/selection/merge.js","../../node_modules/d3-selection/src/selection/order.js","../../node_modules/d3-selection/src/selection/sort.js","../../node_modules/d3-selection/src/selection/call.js","../../node_modules/d3-selection/src/selection/nodes.js","../../node_modules/d3-selection/src/selection/node.js","../../node_modules/d3-selection/src/selection/size.js","../../node_modules/d3-selection/src/selection/empty.js","../../node_modules/d3-selection/src/selection/each.js","../../node_modules/d3-selection/src/selection/attr.js","../../node_modules/d3-selection/src/window.js","../../node_modules/d3-selection/src/selection/style.js","../../node_modules/d3-selection/src/selection/property.js","../../node_modules/d3-selection/src/selection/classed.js","../../node_modules/d3-selection/src/selection/text.js","../../node_modules/d3-selection/src/selection/html.js","../../node_modules/d3-selection/src/selection/raise.js","../../node_modules/d3-selection/src/selection/lower.js","../../node_modules/d3-selection/src/selection/append.js","../../node_modules/d3-selection/src/selection/insert.js","../../node_modules/d3-selection/src/selection/remove.js","../../node_modules/d3-selection/src/selection/clone.js","../../node_modules/d3-selection/src/selection/datum.js","../../node_modules/d3-selection/src/selection/on.js","../../node_modules/d3-selection/src/selection/dispatch.js","../../node_modules/d3-selection/src/selection/iterator.js","../../node_modules/d3-selection/src/selection/index.js","../../node_modules/d3-selection/src/select.js","../../node_modules/d3-scale/src/pow.js","../../src/client/components/charts/BubbleChart.tsx","../../src/client/components/AnalyticsPortlet.tsx","../../src/client/components/Modal.tsx","../../src/client/components/QueryBuilder/CubeMetaExplorer.tsx","../../src/client/components/QueryBuilder/types.ts","../../src/client/components/QueryBuilder/FilterValueSelector.tsx","../../src/client/components/QueryBuilder/utils.ts","../../src/client/components/QueryBuilder/FilterItem.tsx","../../src/client/components/QueryBuilder/FilterGroup.tsx","../../src/client/components/QueryBuilder/FilterBuilder.tsx","../../src/client/components/QueryBuilder/DateRangeSelector.tsx","../../src/client/components/QueryBuilder/DateRangeFilter.tsx","../../src/client/components/QueryBuilder/QueryPanel.tsx","../../src/client/components/QueryBuilder/ResultsPanel.tsx","../../src/client/components/QueryBuilder/SetupPanel.tsx","../../src/client/components/AIAssistant/constants.ts","../../src/client/components/AIAssistant/utils.ts","../../src/client/components/AIAssistant/AIAssistantModal.tsx","../../src/client/components/QueryBuilder/index.tsx","../../src/client/components/AxisDropZone.tsx","../../src/client/components/charts/BarChart.config.tsx","../../src/client/components/charts/LineChart.config.tsx","../../src/client/components/charts/AreaChart.config.tsx","../../src/client/components/charts/PieChart.config.tsx","../../src/client/components/charts/ScatterChart.config.tsx","../../src/client/components/charts/BubbleChart.config.tsx","../../src/client/components/charts/RadarChart.config.tsx","../../src/client/components/charts/RadialBarChart.config.tsx","../../src/client/components/charts/TreeMapChart.config.tsx","../../src/client/components/charts/DataTable.config.tsx","../../src/client/charts/chartConfigRegistry.ts","../../src/client/charts/chartConfigs.ts","../../src/client/components/ChartConfigPanel.tsx","../../src/client/components/ChartTypeSelector.tsx","../../src/client/components/PortletEditModal.tsx","../../src/client/components/DebugModal.tsx","../../src/client/components/DashboardGrid.tsx","../../src/client/components/AnalyticsDashboard.tsx","../../src/client/components/PortletContainer.tsx","../../src/client/components/DashboardEditModal.tsx"],"sourcesContent":["import React, { Component, ReactNode } from 'react'\nimport { ArrowPathIcon } from '@heroicons/react/24/outline'\n\ninterface Props {\n children: ReactNode\n fallback?: ReactNode\n portletTitle?: string\n portletConfig?: any\n cubeQuery?: string\n}\n\ninterface State {\n hasError: boolean\n error: Error | null\n errorInfo: string | null\n}\n\nexport default class ChartErrorBoundary extends Component<Props, State> {\n constructor(props: Props) {\n super(props)\n this.state = {\n hasError: false,\n error: null,\n errorInfo: null\n }\n }\n\n static getDerivedStateFromError(error: Error): State {\n // Update state so the next render will show the fallback UI\n return {\n hasError: true,\n error,\n errorInfo: null\n }\n }\n\n componentDidCatch(error: Error, errorInfo: React.ErrorInfo) {\n // Update state with error details\n this.setState({\n error,\n errorInfo: errorInfo.componentStack || null\n })\n\n // Log the error for debugging\n console.error('Chart Error Boundary caught a rendering error:', error, errorInfo)\n }\n\n handleReset = () => {\n this.setState({\n hasError: false,\n error: null,\n errorInfo: null\n })\n }\n\n render() {\n if (this.state.hasError) {\n // Custom fallback UI\n if (this.props.fallback) {\n return this.props.fallback\n }\n\n // Default error display\n return (\n <div className=\"flex flex-col items-center justify-center w-full h-full p-6 text-center border-2 border-dashed border-red-300 rounded-lg bg-red-50\">\n <div className=\"h-12 w-12 text-red-500 mb-4\">⚠️</div>\n <h3 className=\"text-lg font-semibold text-red-600 mb-2\">\n {this.props.portletTitle ? `Rendering Error in ${this.props.portletTitle}` : 'Chart Rendering Error'}\n </h3>\n <p className=\"text-sm text-gray-600 mb-4 max-w-md\">\n There was an error rendering this chart component. This is different from query errors. The error details are shown below.\n </p>\n \n {/* Error details */}\n <div className=\"w-full max-w-2xl mb-4\">\n <div className=\"bg-gray-100 rounded-lg p-3 text-left\">\n <div className=\"text-xs font-mono text-red-600 mb-2\">\n <strong>Error:</strong> {this.state.error?.message}\n </div>\n {this.state.error?.name && (\n <div className=\"text-xs font-mono text-gray-600 mb-2\">\n <strong>Type:</strong> {this.state.error.name}\n </div>\n )}\n \n {/* Portlet Config Debug Info */}\n {this.props.portletConfig && (\n <details className=\"text-xs font-mono text-gray-600 mb-2\">\n <summary className=\"cursor-pointer\">Portlet Configuration</summary>\n <pre className=\"mt-2 whitespace-pre-wrap bg-blue-50 p-2 rounded overflow-auto max-h-32\">\n {JSON.stringify(this.props.portletConfig, null, 2)}\n </pre>\n </details>\n )}\n \n {/* Cube Query Debug Info */}\n {this.props.cubeQuery && (\n <details className=\"text-xs font-mono text-gray-600 mb-2\">\n <summary className=\"cursor-pointer\">Cube Query</summary>\n <pre className=\"mt-2 whitespace-pre-wrap bg-green-50 p-2 rounded overflow-auto max-h-32\">\n {typeof this.props.cubeQuery === 'string' \n ? JSON.stringify(JSON.parse(this.props.cubeQuery), null, 2)\n : JSON.stringify(this.props.cubeQuery, null, 2)\n }\n </pre>\n </details>\n )}\n \n {this.state.errorInfo && (\n <details className=\"text-xs font-mono text-gray-600\">\n <summary className=\"cursor-pointer\">Component Stack</summary>\n <pre className=\"mt-2 whitespace-pre-wrap\">{this.state.errorInfo}</pre>\n </details>\n )}\n </div>\n </div>\n\n {/* Reset button */}\n <button\n onClick={this.handleReset}\n className=\"px-3 py-1 bg-blue-500 text-white rounded text-sm hover:bg-blue-600\"\n >\n <ArrowPathIcon style={{ width: '16px', height: '16px', display: 'inline', marginRight: '4px' }} />Try Again\n </button>\n </div>\n )\n }\n\n return this.props.children\n }\n}","export default function extent(values, valueof) {\n let min;\n let max;\n if (valueof === undefined) {\n for (const value of values) {\n if (value != null) {\n if (min === undefined) {\n if (value >= value) min = max = value;\n } else {\n if (min > value) min = value;\n if (max < value) max = value;\n }\n }\n }\n } else {\n let index = -1;\n for (let value of values) {\n if ((value = valueof(value, ++index, values)) != null) {\n if (min === undefined) {\n if (value >= value) min = max = value;\n } else {\n if (min > value) min = value;\n if (max < value) max = value;\n }\n }\n }\n }\n return [min, max];\n}\n","export default function max(values, valueof) {\n let max;\n if (valueof === undefined) {\n for (const value of values) {\n if (value != null\n && (max < value || (max === undefined && value >= value))) {\n max = value;\n }\n }\n } else {\n let index = -1;\n for (let value of values) {\n if ((value = valueof(value, ++index, values)) != null\n && (max < value || (max === undefined && value >= value))) {\n max = value;\n }\n }\n }\n return max;\n}\n","export default function(x) {\n return x;\n}\n","import identity from \"./identity.js\";\n\nvar top = 1,\n right = 2,\n bottom = 3,\n left = 4,\n epsilon = 1e-6;\n\nfunction translateX(x) {\n return \"translate(\" + x + \",0)\";\n}\n\nfunction translateY(y) {\n return \"translate(0,\" + y + \")\";\n}\n\nfunction number(scale) {\n return d => +scale(d);\n}\n\nfunction center(scale, offset) {\n offset = Math.max(0, scale.bandwidth() - offset * 2) / 2;\n if (scale.round()) offset = Math.round(offset);\n return d => +scale(d) + offset;\n}\n\nfunction entering() {\n return !this.__axis;\n}\n\nfunction axis(orient, scale) {\n var tickArguments = [],\n tickValues = null,\n tickFormat = null,\n tickSizeInner = 6,\n tickSizeOuter = 6,\n tickPadding = 3,\n offset = typeof window !== \"undefined\" && window.devicePixelRatio > 1 ? 0 : 0.5,\n k = orient === top || orient === left ? -1 : 1,\n x = orient === left || orient === right ? \"x\" : \"y\",\n transform = orient === top || orient === bottom ? translateX : translateY;\n\n function axis(context) {\n var values = tickValues == null ? (scale.ticks ? scale.ticks.apply(scale, tickArguments) : scale.domain()) : tickValues,\n format = tickFormat == null ? (scale.tickFormat ? scale.tickFormat.apply(scale, tickArguments) : identity) : tickFormat,\n spacing = Math.max(tickSizeInner, 0) + tickPadding,\n range = scale.range(),\n range0 = +range[0] + offset,\n range1 = +range[range.length - 1] + offset,\n position = (scale.bandwidth ? center : number)(scale.copy(), offset),\n selection = context.selection ? context.selection() : context,\n path = selection.selectAll(\".domain\").data([null]),\n tick = selection.selectAll(\".tick\").data(values, scale).order(),\n tickExit = tick.exit(),\n tickEnter = tick.enter().append(\"g\").attr(\"class\", \"tick\"),\n line = tick.select(\"line\"),\n text = tick.select(\"text\");\n\n path = path.merge(path.enter().insert(\"path\", \".tick\")\n .attr(\"class\", \"domain\")\n .attr(\"stroke\", \"currentColor\"));\n\n tick = tick.merge(tickEnter);\n\n line = line.merge(tickEnter.append(\"line\")\n .attr(\"stroke\", \"currentColor\")\n .attr(x + \"2\", k * tickSizeInner));\n\n text = text.merge(tickEnter.append(\"text\")\n .attr(\"fill\", \"currentColor\")\n .attr(x, k * spacing)\n .attr(\"dy\", orient === top ? \"0em\" : orient === bottom ? \"0.71em\" : \"0.32em\"));\n\n if (context !== selection) {\n path = path.transition(context);\n tick = tick.transition(context);\n line = line.transition(context);\n text = text.transition(context);\n\n tickExit = tickExit.transition(context)\n .attr(\"opacity\", epsilon)\n .attr(\"transform\", function(d) { return isFinite(d = position(d)) ? transform(d + offset) : this.getAttribute(\"transform\"); });\n\n tickEnter\n .attr(\"opacity\", epsilon)\n .attr(\"transform\", function(d) { var p = this.parentNode.__axis; return transform((p && isFinite(p = p(d)) ? p : position(d)) + offset); });\n }\n\n tickExit.remove();\n\n path\n .attr(\"d\", orient === left || orient === right\n ? (tickSizeOuter ? \"M\" + k * tickSizeOuter + \",\" + range0 + \"H\" + offset + \"V\" + range1 + \"H\" + k * tickSizeOuter : \"M\" + offset + \",\" + range0 + \"V\" + range1)\n : (tickSizeOuter ? \"M\" + range0 + \",\" + k * tickSizeOuter + \"V\" + offset + \"H\" + range1 + \"V\" + k * tickSizeOuter : \"M\" + range0 + \",\" + offset + \"H\" + range1));\n\n tick\n .attr(\"opacity\", 1)\n .attr(\"transform\", function(d) { return transform(position(d) + offset); });\n\n line\n .attr(x + \"2\", k * tickSizeInner);\n\n text\n .attr(x, k * spacing)\n .text(format);\n\n selection.filter(entering)\n .attr(\"fill\", \"none\")\n .attr(\"font-size\", 10)\n .attr(\"font-family\", \"sans-serif\")\n .attr(\"text-anchor\", orient === right ? \"start\" : orient === left ? \"end\" : \"middle\");\n\n selection\n .each(function() { this.__axis = position; });\n }\n\n axis.scale = function(_) {\n return arguments.length ? (scale = _, axis) : scale;\n };\n\n axis.ticks = function() {\n return tickArguments = Array.from(arguments), axis;\n };\n\n axis.tickArguments = function(_) {\n return arguments.length ? (tickArguments = _ == null ? [] : Array.from(_), axis) : tickArguments.slice();\n };\n\n axis.tickValues = function(_) {\n return arguments.length ? (tickValues = _ == null ? null : Array.from(_), axis) : tickValues && tickValues.slice();\n };\n\n axis.tickFormat = function(_) {\n return arguments.length ? (tickFormat = _, axis) : tickFormat;\n };\n\n axis.tickSize = function(_) {\n return arguments.length ? (tickSizeInner = tickSizeOuter = +_, axis) : tickSizeInner;\n };\n\n axis.tickSizeInner = function(_) {\n return arguments.length ? (tickSizeInner = +_, axis) : tickSizeInner;\n };\n\n axis.tickSizeOuter = function(_) {\n return arguments.length ? (tickSizeOuter = +_, axis) : tickSizeOuter;\n };\n\n axis.tickPadding = function(_) {\n return arguments.length ? (tickPadding = +_, axis) : tickPadding;\n };\n\n axis.offset = function(_) {\n return arguments.length ? (offset = +_, axis) : offset;\n };\n\n return axis;\n}\n\nexport function axisTop(scale) {\n return axis(top, scale);\n}\n\nexport function axisRight(scale) {\n return axis(right, scale);\n}\n\nexport function axisBottom(scale) {\n return axis(bottom, scale);\n}\n\nexport function axisLeft(scale) {\n return axis(left, scale);\n}\n","export var xhtml = \"http://www.w3.org/1999/xhtml\";\n\nexport default {\n svg: \"http://www.w3.org/2000/svg\",\n xhtml: xhtml,\n xlink: \"http://www.w3.org/1999/xlink\",\n xml: \"http://www.w3.org/XML/1998/namespace\",\n xmlns: \"http://www.w3.org/2000/xmlns/\"\n};\n","import namespaces from \"./namespaces.js\";\n\nexport default function(name) {\n var prefix = name += \"\", i = prefix.indexOf(\":\");\n if (i >= 0 && (prefix = name.slice(0, i)) !== \"xmlns\") name = name.slice(i + 1);\n return namespaces.hasOwnProperty(prefix) ? {space: namespaces[prefix], local: name} : name; // eslint-disable-line no-prototype-builtins\n}\n","import namespace from \"./namespace.js\";\nimport {xhtml} from \"./namespaces.js\";\n\nfunction creatorInherit(name) {\n return function() {\n var document = this.ownerDocument,\n uri = this.namespaceURI;\n return uri === xhtml && document.documentElement.namespaceURI === xhtml\n ? document.createElement(name)\n : document.createElementNS(uri, name);\n };\n}\n\nfunction creatorFixed(fullname) {\n return function() {\n return this.ownerDocument.createElementNS(fullname.space, fullname.local);\n };\n}\n\nexport default function(name) {\n var fullname = namespace(name);\n return (fullname.local\n ? creatorFixed\n : creatorInherit)(fullname);\n}\n","function none() {}\n\nexport default function(selector) {\n return selector == null ? none : function() {\n return this.querySelector(selector);\n };\n}\n","import {Selection} from \"./index.js\";\nimport selector from \"../selector.js\";\n\nexport default function(select) {\n if (typeof select !== \"function\") select = selector(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {\n if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {\n if (\"__data__\" in node) subnode.__data__ = node.__data__;\n subgroup[i] = subnode;\n }\n }\n }\n\n return new Selection(subgroups, this._parents);\n}\n","// Given something array like (or null), returns something that is strictly an\n// array. This is used to ensure that array-like objects passed to d3.selectAll\n// or selection.selectAll are converted into proper arrays when creating a\n// selection; we don’t ever want to create a selection backed by a live\n// HTMLCollection or NodeList. However, note that selection.selectAll will use a\n// static NodeList as a group, since it safely derived from querySelectorAll.\nexport default function array(x) {\n return x == null ? [] : Array.isArray(x) ? x : Array.from(x);\n}\n","function empty() {\n return [];\n}\n\nexport default function(selector) {\n return selector == null ? empty : function() {\n return this.querySelectorAll(selector);\n };\n}\n","import {Selection} from \"./index.js\";\nimport array from \"../array.js\";\nimport selectorAll from \"../selectorAll.js\";\n\nfunction arrayAll(select) {\n return function() {\n return array(select.apply(this, arguments));\n };\n}\n\nexport default function(select) {\n if (typeof select === \"function\") select = arrayAll(select);\n else select = selectorAll(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n subgroups.push(select.call(node, node.__data__, i, group));\n parents.push(node);\n }\n }\n }\n\n return new Selection(subgroups, parents);\n}\n","export default function(selector) {\n return function() {\n return this.matches(selector);\n };\n}\n\nexport function childMatcher(selector) {\n return function(node) {\n return node.matches(selector);\n };\n}\n\n","import {childMatcher} from \"../matcher.js\";\n\nvar find = Array.prototype.find;\n\nfunction childFind(match) {\n return function() {\n return find.call(this.children, match);\n };\n}\n\nfunction childFirst() {\n return this.firstElementChild;\n}\n\nexport default function(match) {\n return this.select(match == null ? childFirst\n : childFind(typeof match === \"function\" ? match : childMatcher(match)));\n}\n","import {childMatcher} from \"../matcher.js\";\n\nvar filter = Array.prototype.filter;\n\nfunction children() {\n return Array.from(this.children);\n}\n\nfunction childrenFilter(match) {\n return function() {\n return filter.call(this.children, match);\n };\n}\n\nexport default function(match) {\n return this.selectAll(match == null ? children\n : childrenFilter(typeof match === \"function\" ? match : childMatcher(match)));\n}\n","import {Selection} from \"./index.js\";\nimport matcher from \"../matcher.js\";\n\nexport default function(match) {\n if (typeof match !== \"function\") match = matcher(match);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {\n if ((node = group[i]) && match.call(node, node.__data__, i, group)) {\n subgroup.push(node);\n }\n }\n }\n\n return new Selection(subgroups, this._parents);\n}\n","export default function(update) {\n return new Array(update.length);\n}\n","import sparse from \"./sparse.js\";\nimport {Selection} from \"./index.js\";\n\nexport default function() {\n return new Selection(this._enter || this._groups.map(sparse), this._parents);\n}\n\nexport function EnterNode(parent, datum) {\n this.ownerDocument = parent.ownerDocument;\n this.namespaceURI = parent.namespaceURI;\n this._next = null;\n this._parent = parent;\n this.__data__ = datum;\n}\n\nEnterNode.prototype = {\n constructor: EnterNode,\n appendChild: function(child) { return this._parent.insertBefore(child, this._next); },\n insertBefore: function(child, next) { return this._parent.insertBefore(child, next); },\n querySelector: function(selector) { return this._parent.querySelector(selector); },\n querySelectorAll: function(selector) { return this._parent.querySelectorAll(selector); }\n};\n","export default function(x) {\n return function() {\n return x;\n };\n}\n","import {Selection} from \"./index.js\";\nimport {EnterNode} from \"./enter.js\";\nimport constant from \"../constant.js\";\n\nfunction bindIndex(parent, group, enter, update, exit, data) {\n var i = 0,\n node,\n groupLength = group.length,\n dataLength = data.length;\n\n // Put any non-null nodes that fit into update.\n // Put any null nodes into enter.\n // Put any remaining data into enter.\n for (; i < dataLength; ++i) {\n if (node = group[i]) {\n node.__data__ = data[i];\n update[i] = node;\n } else {\n enter[i] = new EnterNode(parent, data[i]);\n }\n }\n\n // Put any non-null nodes that don’t fit into exit.\n for (; i < groupLength; ++i) {\n if (node = group[i]) {\n exit[i] = node;\n }\n }\n}\n\nfunction bindKey(parent, group, enter, update, exit, data, key) {\n var i,\n node,\n nodeByKeyValue = new Map,\n groupLength = group.length,\n dataLength = data.length,\n keyValues = new Array(groupLength),\n keyValue;\n\n // Compute the key for each node.\n // If multiple nodes have the same key, the duplicates are added to exit.\n for (i = 0; i < groupLength; ++i) {\n if (node = group[i]) {\n keyValues[i] = keyValue = key.call(node, node.__data__, i, group) + \"\";\n if (nodeByKeyValue.has(keyValue)) {\n exit[i] = node;\n } else {\n nodeByKeyValue.set(keyValue, node);\n }\n }\n }\n\n // Compute the key for each datum.\n // If there a node associated with this key, join and add it to update.\n // If there is not (or the key is a duplicate), add it to enter.\n for (i = 0; i < dataLength; ++i) {\n keyValue = key.call(parent, data[i], i, data) + \"\";\n if (node = nodeByKeyValue.get(keyValue)) {\n update[i] = node;\n node.__data__ = data[i];\n nodeByKeyValue.delete(keyValue);\n } else {\n enter[i] = new EnterNode(parent, data[i]);\n }\n }\n\n // Add any remaining nodes that were not bound to data to exit.\n for (i = 0; i < groupLength; ++i) {\n if ((node = group[i]) && (nodeByKeyValue.get(keyValues[i]) === node)) {\n exit[i] = node;\n }\n }\n}\n\nfunction datum(node) {\n return node.__data__;\n}\n\nexport default function(value, key) {\n if (!arguments.length) return Array.from(this, datum);\n\n var bind = key ? bindKey : bindIndex,\n parents = this._parents,\n groups = this._groups;\n\n if (typeof value !== \"function\") value = constant(value);\n\n for (var m = groups.length, update = new Array(m), enter = new Array(m), exit = new Array(m), j = 0; j < m; ++j) {\n var parent = parents[j],\n group = groups[j],\n groupLength = group.length,\n data = arraylike(value.call(parent, parent && parent.__data__, j, parents)),\n dataLength = data.length,\n enterGroup = enter[j] = new Array(dataLength),\n updateGroup = update[j] = new Array(dataLength),\n exitGroup = exit[j] = new Array(groupLength);\n\n bind(parent, group, enterGroup, updateGroup, exitGroup, data, key);\n\n // Now connect the enter nodes to their following update node, such that\n // appendChild can insert the materialized enter node before this node,\n // rather than at the end of the parent node.\n for (var i0 = 0, i1 = 0, previous, next; i0 < dataLength; ++i0) {\n if (previous = enterGroup[i0]) {\n if (i0 >= i1) i1 = i0 + 1;\n while (!(next = updateGroup[i1]) && ++i1 < dataLength);\n previous._next = next || null;\n }\n }\n }\n\n update = new Selection(update, parents);\n update._enter = enter;\n update._exit = exit;\n return update;\n}\n\n// Given some data, this returns an array-like view of it: an object that\n// exposes a length property and allows numeric indexing. Note that unlike\n// selectAll, this isn’t worried about “live” collections because the resulting\n// array will only be used briefly while data is being bound. (It is possible to\n// cause the data to change while iterating by using a key function, but please\n// don’t; we’d rather avoid a gratuitous copy.)\nfunction arraylike(data) {\n return typeof data === \"object\" && \"length\" in data\n ? data // Array, TypedArray, NodeList, array-like\n : Array.from(data); // Map, Set, iterable, string, or anything else\n}\n","import sparse from \"./sparse.js\";\nimport {Selection} from \"./index.js\";\n\nexport default function() {\n return new Selection(this._exit || this._groups.map(sparse), this._parents);\n}\n","export default function(onenter, onupdate, onexit) {\n var enter = this.enter(), update = this, exit = this.exit();\n if (typeof onenter === \"function\") {\n enter = onenter(enter);\n if (enter) enter = enter.selection();\n } else {\n enter = enter.append(onenter + \"\");\n }\n if (onupdate != null) {\n update = onupdate(update);\n if (update) update = update.selection();\n }\n if (onexit == null) exit.remove(); else onexit(exit);\n return enter && update ? enter.merge(update).order() : update;\n}\n","import {Selection} from \"./index.js\";\n\nexport default function(context) {\n var selection = context.selection ? context.selection() : context;\n\n for (var groups0 = this._groups, groups1 = selection._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {\n for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {\n if (node = group0[i] || group1[i]) {\n merge[i] = node;\n }\n }\n }\n\n for (; j < m0; ++j) {\n merges[j] = groups0[j];\n }\n\n return new Selection(merges, this._parents);\n}\n","export default function() {\n\n for (var groups = this._groups, j = -1, m = groups.length; ++j < m;) {\n for (var group = groups[j], i = group.length - 1, next = group[i], node; --i >= 0;) {\n if (node = group[i]) {\n if (next && node.compareDocumentPosition(next) ^ 4) next.parentNode.insertBefore(node, next);\n next = node;\n }\n }\n }\n\n return this;\n}\n","import {Selection} from \"./index.js\";\n\nexport default function(compare) {\n if (!compare) compare = ascending;\n\n function compareNode(a, b) {\n return a && b ? compare(a.__data__, b.__data__) : !a - !b;\n }\n\n for (var groups = this._groups, m = groups.length, sortgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, sortgroup = sortgroups[j] = new Array(n), node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n sortgroup[i] = node;\n }\n }\n sortgroup.sort(compareNode);\n }\n\n return new Selection(sortgroups, this._parents).order();\n}\n\nfunction ascending(a, b) {\n return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n}\n","export default function() {\n var callback = arguments[0];\n arguments[0] = this;\n callback.apply(null, arguments);\n return this;\n}\n","export default function() {\n return Array.from(this);\n}\n","export default function() {\n\n for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {\n for (var group = groups[j], i = 0, n = group.length; i < n; ++i) {\n var node = group[i];\n if (node) return node;\n }\n }\n\n return null;\n}\n","export default function() {\n let size = 0;\n for (const node of this) ++size; // eslint-disable-line no-unused-vars\n return size;\n}\n","export default function() {\n return !this.node();\n}\n","export default function(callback) {\n\n for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {\n for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) {\n if (node = group[i]) callback.call(node, node.__data__, i, group);\n }\n }\n\n return this;\n}\n","import namespace from \"../namespace.js\";\n\nfunction attrRemove(name) {\n return function() {\n this.removeAttribute(name);\n };\n}\n\nfunction attrRemoveNS(fullname) {\n return function() {\n this.removeAttributeNS(fullname.space, fullname.local);\n };\n}\n\nfunction attrConstant(name, value) {\n return function() {\n this.setAttribute(name, value);\n };\n}\n\nfunction attrConstantNS(fullname, value) {\n return function() {\n this.setAttributeNS(fullname.space, fullname.local, value);\n };\n}\n\nfunction attrFunction(name, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) this.removeAttribute(name);\n else this.setAttribute(name, v);\n };\n}\n\nfunction attrFunctionNS(fullname, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) this.removeAttributeNS(fullname.space, fullname.local);\n else this.setAttributeNS(fullname.space, fullname.local, v);\n };\n}\n\nexport default function(name, value) {\n var fullname = namespace(name);\n\n if (arguments.length < 2) {\n var node = this.node();\n return fullname.local\n ? node.getAttributeNS(fullname.space, fullname.local)\n : node.getAttribute(fullname);\n }\n\n return this.each((value == null\n ? (fullname.local ? attrRemoveNS : attrRemove) : (typeof value === \"function\"\n ? (fullname.local ? attrFunctionNS : attrFunction)\n : (fullname.local ? attrConstantNS : attrConstant)))(fullname, value));\n}\n","export default function(node) {\n return (node.ownerDocument && node.ownerDocument.defaultView) // node is a Node\n || (node.document && node) // node is a Window\n || node.defaultView; // node is a Document\n}\n","import defaultView from \"../window.js\";\n\nfunction styleRemove(name) {\n return function() {\n this.style.removeProperty(name);\n };\n}\n\nfunction styleConstant(name, value, priority) {\n return function() {\n this.style.setProperty(name, value, priority);\n };\n}\n\nfunction styleFunction(name, value, priority) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) this.style.removeProperty(name);\n else this.style.setProperty(name, v, priority);\n };\n}\n\nexport default function(name, value, priority) {\n return arguments.length > 1\n ? this.each((value == null\n ? styleRemove : typeof value === \"function\"\n ? styleFunction\n : styleConstant)(name, value, priority == null ? \"\" : priority))\n : styleValue(this.node(), name);\n}\n\nexport function styleValue(node, name) {\n return node.style.getPropertyValue(name)\n || defaultView(node).getComputedStyle(node, null).getPropertyValue(name);\n}\n","function propertyRemove(name) {\n return function() {\n delete this[name];\n };\n}\n\nfunction propertyConstant(name, value) {\n return function() {\n this[name] = value;\n };\n}\n\nfunction propertyFunction(name, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) delete this[name];\n else this[name] = v;\n };\n}\n\nexport default function(name, value) {\n return arguments.length > 1\n ? this.each((value == null\n ? propertyRemove : typeof value === \"function\"\n ? propertyFunction\n : propertyConstant)(name, value))\n : this.node()[name];\n}\n","function classArray(string) {\n return string.trim().split(/^|\\s+/);\n}\n\nfunction classList(node) {\n return node.classList || new ClassList(node);\n}\n\nfunction ClassList(node) {\n this._node = node;\n this._names = classArray(node.getAttribute(\"class\") || \"\");\n}\n\nClassList.prototype = {\n add: function(name) {\n var i = this._names.indexOf(name);\n if (i < 0) {\n this._names.push(name);\n this._node.setAttribute(\"class\", this._names.join(\" \"));\n }\n },\n remove: function(name) {\n var i = this._names.indexOf(name);\n if (i >= 0) {\n this._names.splice(i, 1);\n this._node.setAttribute(\"class\", this._names.join(\" \"));\n }\n },\n contains: function(name) {\n return this._names.indexOf(name) >= 0;\n }\n};\n\nfunction classedAdd(node, names) {\n var list = classList(node), i = -1, n = names.length;\n while (++i < n) list.add(names[i]);\n}\n\nfunction classedRemove(node, names) {\n var list = classList(node), i = -1, n = names.length;\n while (++i < n) list.remove(names[i]);\n}\n\nfunction classedTrue(names) {\n return function() {\n classedAdd(this, names);\n };\n}\n\nfunction classedFalse(names) {\n return function() {\n classedRemove(this, names);\n };\n}\n\nfunction classedFunction(names, value) {\n return function() {\n (value.apply(this, arguments) ? classedAdd : classedRemove)(this, names);\n };\n}\n\nexport default function(name, value) {\n var names = classArray(name + \"\");\n\n if (arguments.length < 2) {\n var list = classList(this.node()), i = -1, n = names.length;\n while (++i < n) if (!list.contains(names[i])) return false;\n return true;\n }\n\n return this.each((typeof value === \"function\"\n ? classedFunction : value\n ? classedTrue\n : classedFalse)(names, value));\n}\n","function textRemove() {\n this.textContent = \"\";\n}\n\nfunction textConstant(value) {\n return function() {\n this.textContent = value;\n };\n}\n\nfunction textFunction(value) {\n return function() {\n var v = value.apply(this, arguments);\n this.textContent = v == null ? \"\" : v;\n };\n}\n\nexport default function(value) {\n return arguments.length\n ? this.each(value == null\n ? textRemove : (typeof value === \"function\"\n ? textFunction\n : textConstant)(value))\n : this.node().textContent;\n}\n","function htmlRemove() {\n this.innerHTML = \"\";\n}\n\nfunction htmlConstant(value) {\n return function() {\n this.innerHTML = value;\n };\n}\n\nfunction htmlFunction(value) {\n return function() {\n var v = value.apply(this, arguments);\n this.innerHTML = v == null ? \"\" : v;\n };\n}\n\nexport default function(value) {\n return arguments.length\n ? this.each(value == null\n ? htmlRemove : (typeof value === \"function\"\n ? htmlFunction\n : htmlConstant)(value))\n : this.node().innerHTML;\n}\n","function raise() {\n if (this.nextSibling) this.parentNode.appendChild(this);\n}\n\nexport default function() {\n return this.each(raise);\n}\n","function lower() {\n if (this.previousSibling) this.parentNode.insertBefore(this, this.parentNode.firstChild);\n}\n\nexport default function() {\n return this.each(lower);\n}\n","import creator from \"../creator.js\";\n\nexport default function(name) {\n var create = typeof name === \"function\" ? name : creator(name);\n return this.select(function() {\n return this.appendChild(create.apply(this, arguments));\n });\n}\n","import creator from \"../creator.js\";\nimport selector from \"../selector.js\";\n\nfunction constantNull() {\n return null;\n}\n\nexport default function(name, before) {\n var create = typeof name === \"function\" ? name : creator(name),\n select = before == null ? constantNull : typeof before === \"function\" ? before : selector(before);\n return this.select(function() {\n return this.insertBefore(create.apply(this, arguments), select.apply(this, arguments) || null);\n });\n}\n","function remove() {\n var parent = this.parentNode;\n if (parent) parent.removeChild(this);\n}\n\nexport default function() {\n return this.each(remove);\n}\n","function selection_cloneShallow() {\n var clone = this.cloneNode(false), parent = this.parentNode;\n return parent ? parent.insertBefore(clone, this.nextSibling) : clone;\n}\n\nfunction selection_cloneDeep() {\n var clone = this.cloneNode(true), parent = this.parentNode;\n return parent ? parent.insertBefore(clone, this.nextSibling) : clone;\n}\n\nexport default function(deep) {\n return this.select(deep ? selection_cloneDeep : selection_cloneShallow);\n}\n","export default function(value) {\n return arguments.length\n ? this.property(\"__data__\", value)\n : this.node().__data__;\n}\n","function contextListener(listener) {\n return function(event) {\n listener.call(this, event, this.__data__);\n };\n}\n\nfunction parseTypenames(typenames) {\n return typenames.trim().split(/^|\\s+/).map(function(t) {\n var name = \"\", i = t.indexOf(\".\");\n if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);\n return {type: t, name: name};\n });\n}\n\nfunction onRemove(typename) {\n return function() {\n var on = this.__on;\n if (!on) return;\n for (var j = 0, i = -1, m = on.length, o; j < m; ++j) {\n if (o = on[j], (!typename.type || o.type === typename.type) && o.name === typename.name) {\n this.removeEventListener(o.type, o.listener, o.options);\n } else {\n on[++i] = o;\n }\n }\n if (++i) on.length = i;\n else delete this.__on;\n };\n}\n\nfunction onAdd(typename, value, options) {\n return function() {\n var on = this.__on, o, listener = contextListener(value);\n if (on) for (var j = 0, m = on.length; j < m; ++j) {\n if ((o = on[j]).type === typename.type && o.name === typename.name) {\n this.removeEventListener(o.type, o.listener, o.options);\n this.addEventListener(o.type, o.listener = listener, o.options = options);\n o.value = value;\n return;\n }\n }\n this.addEventListener(typename.type, listener, options);\n o = {type: typename.type, name: typename.name, value: value, listener: listener, options: options};\n if (!on) this.__on = [o];\n else on.push(o);\n };\n}\n\nexport default function(typename, value, options) {\n var typenames = parseTypenames(typename + \"\"), i, n = typenames.length, t;\n\n if (arguments.length < 2) {\n var on = this.node().__on;\n if (on) for (var j = 0, m = on.length, o; j < m; ++j) {\n for (i = 0, o = on[j]; i < n; ++i) {\n if ((t = typenames[i]).type === o.type && t.name === o.name) {\n return o.value;\n }\n }\n }\n return;\n }\n\n on = value ? onAdd : onRemove;\n for (i = 0; i < n; ++i) this.each(on(typenames[i], value, options));\n return this;\n}\n","import defaultView from \"../window.js\";\n\nfunction dispatchEvent(node, type, params) {\n var window = defaultView(node),\n event = window.CustomEvent;\n\n if (typeof event === \"function\") {\n event = new event(type, params);\n } else {\n event = window.document.createEvent(\"Event\");\n if (params) event.initEvent(type, params.bubbles, params.cancelable), event.detail = params.detail;\n else event.initEvent(type, false, false);\n }\n\n node.dispatchEvent(event);\n}\n\nfunction dispatchConstant(type, params) {\n return function() {\n return dispatchEvent(this, type, params);\n };\n}\n\nfunction dispatchFunction(type, params) {\n return function() {\n return dispatchEvent(this, type, params.apply(this, arguments));\n };\n}\n\nexport default function(type, params) {\n return this.each((typeof params === \"function\"\n ? dispatchFunction\n : dispatchConstant)(type, params));\n}\n","export default function*() {\n for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {\n for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) {\n if (node = group[i]) yield node;\n }\n }\n}\n","import selection_select from \"./select.js\";\nimport selection_selectAll from \"./selectAll.js\";\nimport selection_selectChild from \"./selectChild.js\";\nimport selection_selectChildren from \"./selectChildren.js\";\nimport selection_filter from \"./filter.js\";\nimport selection_data from \"./data.js\";\nimport selection_enter from \"./enter.js\";\nimport selection_exit from \"./exit.js\";\nimport selection_join from \"./join.js\";\nimport selection_merge from \"./merge.js\";\nimport selection_order from \"./order.js\";\nimport selection_sort from \"./sort.js\";\nimport selection_call from \"./call.js\";\nimport selection_nodes from \"./nodes.js\";\nimport selection_node from \"./node.js\";\nimport selection_size from \"./size.js\";\nimport selection_empty from \"./empty.js\";\nimport selection_each from \"./each.js\";\nimport selection_attr from \"./attr.js\";\nimport selection_style from \"./style.js\";\nimport selection_property from \"./property.js\";\nimport selection_classed from \"./classed.js\";\nimport selection_text from \"./text.js\";\nimport selection_html from \"./html.js\";\nimport selection_raise from \"./raise.js\";\nimport selection_lower from \"./lower.js\";\nimport selection_append from \"./append.js\";\nimport selection_insert from \"./insert.js\";\nimport selection_remove from \"./remove.js\";\nimport selection_clone from \"./clone.js\";\nimport selection_datum from \"./datum.js\";\nimport selection_on from \"./on.js\";\nimport selection_dispatch from \"./dispatch.js\";\nimport selection_iterator from \"./iterator.js\";\n\nexport var root = [null];\n\nexport function Selection(groups, parents) {\n this._groups = groups;\n this._parents = parents;\n}\n\nfunction selection() {\n return new Selection([[document.documentElement]], root);\n}\n\nfunction selection_selection() {\n return this;\n}\n\nSelection.prototype = selection.prototype = {\n constructor: Selection,\n select: selection_select,\n selectAll: selection_selectAll,\n selectChild: selection_selectChild,\n selectChildren: selection_selectChildren,\n filter: selection_filter,\n data: selection_data,\n enter: selection_enter,\n exit: selection_exit,\n join: selection_join,\n merge: selection_merge,\n selection: selection_selection,\n order: selection_order,\n sort: selection_sort,\n call: selection_call,\n nodes: selection_nodes,\n node: selection_node,\n size: selection_size,\n empty: selection_empty,\n each: selection_each,\n attr: selection_attr,\n style: selection_style,\n property: selection_property,\n classed: selection_classed,\n text: selection_text,\n html: selection_html,\n raise: selection_raise,\n lower: selection_lower,\n append: selection_append,\n insert: selection_insert,\n remove: selection_remove,\n clone: selection_clone,\n datum: selection_datum,\n on: selection_on,\n dispatch: selection_dispatch,\n [Symbol.iterator]: selection_iterator\n};\n\nexport default selection;\n","import {Selection, root} from \"./selection/index.js\";\n\nexport default function(selector) {\n return typeof selector === \"string\"\n ? new Selection([[document.querySelector(selector)]], [document.documentElement])\n : new Selection([[selector]], root);\n}\n","import {linearish} from \"./linear.js\";\nimport {copy, identity, transformer} from \"./continuous.js\";\nimport {initRange} from \"./init.js\";\n\nfunction transformPow(exponent) {\n return function(x) {\n return x < 0 ? -Math.pow(-x, exponent) : Math.pow(x, exponent);\n };\n}\n\nfunction transformSqrt(x) {\n return x < 0 ? -Math.sqrt(-x) : Math.sqrt(x);\n}\n\nfunction transformSquare(x) {\n return x < 0 ? -x * x : x * x;\n}\n\nexport function powish(transform) {\n var scale = transform(identity, identity),\n exponent = 1;\n\n function rescale() {\n return exponent === 1 ? transform(identity, identity)\n : exponent === 0.5 ? transform(transformSqrt, transformSquare)\n : transform(transformPow(exponent), transformPow(1 / exponent));\n }\n\n scale.exponent = function(_) {\n return arguments.length ? (exponent = +_, rescale()) : exponent;\n };\n\n return linearish(scale);\n}\n\nexport default function pow() {\n var scale = powish(transformer());\n\n scale.copy = function() {\n return copy(scale, pow()).exponent(scale.exponent());\n };\n\n initRange.apply(scale, arguments);\n\n return scale;\n}\n\nexport function sqrt() {\n return pow.apply(null, arguments).exponent(0.5);\n}\n","import { useEffect, useLayoutEffect, useRef, useState } from 'react'\nimport { select, scaleLinear, scaleSqrt, scaleOrdinal, scaleQuantize, extent, max, axisBottom, axisLeft, type ScaleOrdinal, type ScaleQuantize } from 'd3'\nimport ChartContainer from './ChartContainer'\nimport { CHART_COLORS, CHART_COLORS_GRADIENT, CHART_MARGINS } from '../../utils/chartConstants'\nimport { formatTimeValue, getFieldGranularity } from '../../utils/chartUtils'\nimport { useCubeContext } from '../../providers/CubeProvider'\nimport type { ChartProps } from '../../types'\n\ninterface BubbleData {\n x: number\n y: number\n size: number\n color?: string | number\n label: string\n series?: string\n}\n\nexport default function BubbleChart({\n data,\n chartConfig,\n displayConfig = {},\n queryObject,\n height = \"100%\"\n}: ChartProps) {\n const svgRef = useRef<SVGSVGElement | null>(null)\n const containerRef = useRef<HTMLDivElement | null>(null)\n const [, setHoveredBubble] = useState<string | null>(null)\n const [dimensions, setDimensions] = useState({ width: 0, height: 0 })\n const [dimensionsReady, setDimensionsReady] = useState(false)\n const { getFieldLabel } = useCubeContext()\n\n const safeDisplayConfig = {\n showLegend: displayConfig?.showLegend ?? true,\n showGrid: displayConfig?.showGrid ?? true,\n showTooltip: displayConfig?.showTooltip ?? true,\n minBubbleSize: displayConfig?.minBubbleSize ?? 5,\n maxBubbleSize: displayConfig?.maxBubbleSize ?? 50,\n bubbleOpacity: displayConfig?.bubbleOpacity ?? 0.7\n }\n\n // Enhanced dimension measurement with retry mechanism\n useLayoutEffect(() => {\n let retryCount = 0\n const maxRetries = 10\n let rafId: number\n let timeoutId: NodeJS.Timeout\n \n const updateDimensions = () => {\n if (containerRef.current) {\n const { width, height } = containerRef.current.getBoundingClientRect()\n console.log('BubbleChart: Dimension measurement attempt', retryCount + 1, { width, height })\n \n if (width > 0 && height > 0) {\n setDimensions({ width, height })\n setDimensionsReady(true)\n console.log('BubbleChart: Dimensions successfully measured:', { width, height })\n return true\n }\n }\n return false\n }\n \n // Immediate measurement\n const success = updateDimensions()\n \n if (!success && retryCount < maxRetries) {\n // Retry with requestAnimationFrame\n const retryWithRaf = () => {\n const rafSuccess = updateDimensions()\n \n if (!rafSuccess && retryCount < maxRetries) {\n retryCount++\n // Use setTimeout for additional retries with increasing delays\n timeoutId = setTimeout(() => {\n rafId = requestAnimationFrame(retryWithRaf)\n }, 50 * retryCount) // Increasing delay: 50ms, 100ms, 150ms, etc.\n }\n }\n \n rafId = requestAnimationFrame(retryWithRaf)\n }\n \n return () => {\n if (rafId) cancelAnimationFrame(rafId)\n if (timeoutId) clearTimeout(timeoutId)\n }\n }, [])\n\n // Enhanced ResizeObserver for dynamic resizing with immediate initialization\n useEffect(() => {\n let resizeObserver: ResizeObserver | null = null\n \n const updateDimensions = () => {\n if (containerRef.current) {\n const { width, height } = containerRef.current.getBoundingClientRect()\n if (width > 0 && height > 0) {\n setDimensions({ width, height })\n if (!dimensionsReady) {\n setDimensionsReady(true)\n console.log('BubbleChart: Dimensions ready via ResizeObserver:', { width, height })\n }\n }\n }\n }\n \n // Initialize ResizeObserver immediately\n if (containerRef.current) {\n resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const { width, height } = entry.contentRect\n if (width > 0 && height > 0) {\n setDimensions({ width, height })\n if (!dimensionsReady) {\n setDimensionsReady(true)\n console.log('BubbleChart: Dimensions ready via ResizeObserver:', { width, height })\n }\n }\n }\n })\n \n resizeObserver.observe(containerRef.current)\n \n // Also try immediate measurement as fallback\n updateDimensions()\n }\n\n // Window resize as additional fallback\n window.addEventListener('resize', updateDimensions)\n \n return () => {\n if (resizeObserver) {\n resizeObserver.disconnect()\n }\n window.removeEventListener('resize', updateDimensions)\n }\n }, [dimensionsReady])\n\n useEffect(() => {\n if (!data || data.length === 0 || !svgRef.current || !dimensionsReady || dimensions.width === 0) {\n console.log('BubbleChart: Skipping render - conditions not met:', {\n hasData: data && data.length > 0,\n hasSvgRef: !!svgRef.current,\n dimensionsReady,\n dimensions\n })\n return\n }\n\n // Clear previous chart\n select(svgRef.current).selectAll('*').remove()\n\n // Debug logging\n console.log('BubbleChart: chartConfig:', chartConfig)\n console.log('BubbleChart: data:', data)\n console.log('BubbleChart: dimensions:', dimensions)\n\n // Validate chartConfig - only new format supported\n if (!chartConfig?.xAxis || !chartConfig?.yAxis || !chartConfig?.series) {\n console.log('BubbleChart: Missing xAxis, yAxis, or series in chartConfig')\n return\n }\n\n const xAxisField = Array.isArray(chartConfig.xAxis) ? chartConfig.xAxis[0] : chartConfig.xAxis\n const yAxisField = Array.isArray(chartConfig.yAxis) ? chartConfig.yAxis[0] : chartConfig.yAxis\n const seriesField = Array.isArray(chartConfig.series) ? chartConfig.series[0] : chartConfig.series\n const sizeFieldName = Array.isArray(chartConfig.sizeField) ? chartConfig.sizeField[0] : chartConfig.sizeField || yAxisField\n const colorFieldName = Array.isArray(chartConfig.colorField) ? chartConfig.colorField[0] : chartConfig.colorField\n\n console.log('BubbleChart: fields extracted:', {\n xAxisField,\n yAxisField,\n seriesField,\n sizeFieldName,\n colorFieldName\n })\n\n if (!xAxisField || !yAxisField || !seriesField || !sizeFieldName) {\n console.log('BubbleChart: Missing required fields')\n return\n }\n\n // Transform data for bubble chart\n const xGranularity = getFieldGranularity(queryObject, xAxisField)\n const bubbleData: BubbleData[] = data.map(item => {\n const xValue = formatTimeValue(item[xAxisField], xGranularity) || item[xAxisField]\n const yValue = typeof item[yAxisField] === 'string' \n ? parseFloat(item[yAxisField]) \n : (item[yAxisField] || 0)\n const sizeValue = typeof item[sizeFieldName] === 'string'\n ? parseFloat(item[sizeFieldName])\n : (item[sizeFieldName] || 0)\n \n const seriesValue = item[seriesField]\n \n return {\n x: typeof xValue === 'string' ? parseFloat(xValue) || 0 : xValue,\n y: yValue,\n size: Math.abs(sizeValue), // Ensure positive size\n color: colorFieldName ? item[colorFieldName] : seriesValue,\n series: seriesValue,\n label: `${seriesValue || 'Unknown'}`\n }\n }).filter(d => d.size > 0) // Filter out bubbles with no size\n\n if (bubbleData.length === 0) return\n\n const margin = { \n ...CHART_MARGINS, \n left: CHART_MARGINS.left + 30, // Add extra 30px left margin for Y-axis label\n bottom: (safeDisplayConfig.showLegend && colorFieldName) ? 100 : 40 // Add extra space for legend\n }\n const width = dimensions.width - margin.left - margin.right\n const chartHeight = dimensions.height - margin.top - margin.bottom\n\n const svg = select(svgRef.current)\n .attr('width', dimensions.width)\n .attr('height', dimensions.height)\n\n const g = svg.append('g')\n .attr('transform', `translate(${margin.left},${margin.top})`)\n\n // Set up scales\n const xScale = scaleLinear()\n .domain(extent(bubbleData, d => d.x) as [number, number])\n .range([0, width])\n .nice()\n\n const yScale = scaleLinear()\n .domain(extent(bubbleData, d => d.y) as [number, number])\n .range([chartHeight, 0])\n .nice()\n\n const sizeScale = scaleSqrt()\n .domain([0, max(bubbleData, d => d.size) as number])\n .range([safeDisplayConfig.minBubbleSize, safeDisplayConfig.maxBubbleSize])\n\n // Set up color scale\n let colorScale: ScaleOrdinal<string, string> | ScaleQuantize<string>\n let isNumericColorField = false\n let uniqueColors: string[] = []\n \n if (colorFieldName && bubbleData.length > 0) {\n // Check if color field is numeric for color scaling (same logic as TreeMapChart)\n const colorValues = bubbleData.map(item => {\n const value = item.color\n return typeof value === 'string' ? parseFloat(value) : value\n }).filter((val): val is number => !isNaN(val as number))\n \n isNumericColorField = colorValues.length === bubbleData.length && colorValues.every(val => typeof val === 'number')\n \n if (isNumericColorField) {\n // Use D3 quantize scale for better color distribution with small ranges\n const minValue = Math.min(...colorValues)\n const maxValue = Math.max(...colorValues)\n \n // Create D3 quantize color scale - maps continuous data to discrete color bands\n colorScale = scaleQuantize<string>()\n .domain([minValue, maxValue])\n .range(CHART_COLORS_GRADIENT)\n } else {\n // Categorical color field - use CHART_COLORS\n uniqueColors = [...new Set(bubbleData.map(d => String(d.color)))]\n colorScale = scaleOrdinal<string>()\n .domain(uniqueColors)\n .range(CHART_COLORS)\n }\n } else {\n // Single color for all bubbles\n colorScale = scaleOrdinal<string>()\n .domain(['default'])\n .range([CHART_COLORS[0]])\n }\n\n // Add grid\n if (safeDisplayConfig.showGrid) {\n // X-axis grid\n g.append('g')\n .attr('class', 'grid')\n .attr('transform', `translate(0,${chartHeight})`)\n .call(axisBottom(xScale)\n .tickSize(-chartHeight)\n .tickFormat(() => '')\n )\n .style('stroke-dasharray', '3,3')\n .style('opacity', 0.3)\n\n // Y-axis grid\n g.append('g')\n .attr('class', 'grid')\n .call(axisLeft(yScale)\n .tickSize(-width)\n .tickFormat(() => '')\n )\n .style('stroke-dasharray', '3,3')\n .style('opacity', 0.3)\n }\n\n // Add X axis\n g.append('g')\n .attr('transform', `translate(0,${chartHeight})`)\n .call(axisBottom(xScale))\n .append('text')\n .attr('x', width / 2)\n .attr('y', 35)\n .attr('fill', 'currentColor')\n .style('text-anchor', 'middle')\n .style('font-size', '12px')\n .text(getFieldLabel(xAxisField))\n\n // Add Y axis\n g.append('g')\n .call(axisLeft(yScale))\n .append('text')\n .attr('transform', 'rotate(-90)')\n .attr('y', -35)\n .attr('x', -chartHeight / 2)\n .attr('fill', 'currentColor')\n .style('text-anchor', 'middle')\n .style('font-size', '12px')\n .text(getFieldLabel(yAxisField))\n\n // Create tooltip\n const tooltip = select('body').append('div')\n .attr('class', 'bubble-chart-tooltip')\n .style('position', 'absolute')\n .style('padding', '8px')\n .style('background', 'rgba(0, 0, 0, 0.8)')\n .style('color', 'white')\n .style('border-radius', '4px')\n .style('font-size', '12px')\n .style('pointer-events', 'none')\n .style('opacity', 0)\n .style('z-index', 1000)\n\n // Add bubbles\n const bubbles = g.selectAll('.bubble')\n .data(bubbleData)\n .enter().append('circle')\n .attr('class', 'bubble')\n .attr('cx', d => xScale(d.x))\n .attr('cy', d => yScale(d.y))\n .attr('r', d => sizeScale(d.size))\n .style('fill', d => {\n if (colorFieldName && d.color !== undefined) {\n return isNumericColorField\n ? (colorScale as ScaleQuantize<string>)(d.color as number)\n : (colorScale as ScaleOrdinal<string, string>)(String(d.color))\n }\n return CHART_COLORS[0]\n })\n .style('opacity', safeDisplayConfig.bubbleOpacity)\n .style('stroke', '#fff')\n .style('stroke-width', 1)\n .style('cursor', 'pointer')\n\n // Add hover effects\n if (safeDisplayConfig.showTooltip) {\n bubbles\n .on('mouseover', function(event, d) {\n select(this)\n .transition()\n .duration(200)\n .style('opacity', 1)\n .attr('r', sizeScale(d.size) * 1.1)\n\n const tooltipContent = [\n `<strong>${d.series || 'Unknown'}</strong>`,\n `${getFieldLabel(xAxisField)}: ${d.x}`,\n `${getFieldLabel(yAxisField)}: ${d.y}`,\n `${getFieldLabel(sizeFieldName)}: ${d.size}`,\n colorFieldName && d.color ? `${getFieldLabel(colorFieldName)}: ${d.color}` : ''\n ].filter(Boolean).join('<br>')\n\n tooltip\n .html(tooltipContent)\n .style('left', (event.pageX + 10) + 'px')\n .style('top', (event.pageY - 10) + 'px')\n .transition()\n .duration(200)\n .style('opacity', 1)\n\n setHoveredBubble(d.label)\n })\n .on('mousemove', function(event) {\n tooltip\n .style('left', (event.pageX + 10) + 'px')\n .style('top', (event.pageY - 10) + 'px')\n })\n .on('mouseout', function(_event, d) {\n select(this)\n .transition()\n .duration(200)\n .style('opacity', safeDisplayConfig.bubbleOpacity)\n .attr('r', sizeScale(d.size))\n\n tooltip\n .transition()\n .duration(200)\n .style('opacity', 0)\n\n setHoveredBubble(null)\n })\n }\n\n // Add legend if needed\n if (safeDisplayConfig.showLegend && colorFieldName) {\n if (isNumericColorField) {\n // Create gradient legend for numeric color field\n const legendWidth = 200\n const legendHeight = 20\n const minValue = Math.min(...bubbleData.map(d => d.color as number))\n const maxValue = Math.max(...bubbleData.map(d => d.color as number))\n \n const legend = g.append('g')\n .attr('class', 'color-legend')\n .attr('transform', `translate(${width / 2 - legendWidth / 2}, ${chartHeight + 60})`)\n\n // Create gradient definition\n const defs = svg.append('defs')\n const gradient = defs.append('linearGradient')\n .attr('id', 'color-scale-gradient')\n .attr('x1', '0%')\n .attr('y1', '0%')\n .attr('x2', '100%')\n .attr('y2', '0%')\n\n // Add color stops for the gradient\n CHART_COLORS_GRADIENT.forEach((color, i) => {\n gradient.append('stop')\n .attr('offset', `${(i / (CHART_COLORS_GRADIENT.length - 1)) * 100}%`)\n .attr('stop-color', color)\n })\n\n // Add the gradient rectangle\n legend.append('rect')\n .attr('width', legendWidth)\n .attr('height', legendHeight)\n .style('fill', 'url(#color-scale-gradient)')\n .style('stroke', '#ccc')\n .style('stroke-width', 1)\n\n // Add min value label\n legend.append('text')\n .attr('x', 0)\n .attr('y', legendHeight + 15)\n .attr('text-anchor', 'start')\n .style('font-size', '11px')\n .style('fill', 'currentColor')\n .text(minValue.toFixed(2))\n\n // Add max value label\n legend.append('text')\n .attr('x', legendWidth)\n .attr('y', legendHeight + 15)\n .attr('text-anchor', 'end')\n .style('font-size', '11px')\n .style('fill', 'currentColor')\n .text(maxValue.toFixed(2))\n\n // Add field name label\n legend.append('text')\n .attr('x', legendWidth / 2)\n .attr('y', -5)\n .attr('text-anchor', 'middle')\n .style('font-size', '12px')\n .style('font-weight', 'bold')\n .style('fill', 'currentColor')\n .text(getFieldLabel(colorFieldName))\n\n } else {\n // Original categorical legend\n const legendItems = uniqueColors\n\n if (legendItems.length > 0) {\n const legend = g.append('g')\n .attr('class', 'legend')\n .attr('transform', `translate(${width / 2 - (legendItems.length * 80) / 2}, ${chartHeight + 60})`)\n\n const legendItem = legend.selectAll('.legend-item')\n .data(legendItems)\n .enter().append('g')\n .attr('class', 'legend-item')\n .attr('transform', (_d, i) => `translate(${i * 80}, 0)`)\n .style('cursor', 'pointer')\n\n legendItem.append('circle')\n .attr('cx', 5)\n .attr('cy', 5)\n .attr('r', 5)\n .style('fill', d => (colorScale as ScaleOrdinal<string, string>)(d as string))\n .style('opacity', safeDisplayConfig.bubbleOpacity)\n\n legendItem.append('text')\n .attr('x', 15)\n .attr('y', 5)\n .attr('dy', '.35em')\n .style('font-size', '11px')\n .style('fill', 'currentColor')\n .text(d => String(d))\n\n // Legend hover effects\n legendItem\n .on('mouseover', function(_event, legendKey) {\n // Highlight matching bubbles\n bubbles\n .transition()\n .duration(200)\n .style('opacity', d => {\n const matches = colorFieldName && String(d.color) === legendKey\n return matches ? 1 : 0.2\n })\n })\n .on('mouseout', function() {\n // Reset all bubbles\n bubbles\n .transition()\n .duration(200)\n .style('opacity', safeDisplayConfig.bubbleOpacity)\n })\n }\n }\n }\n\n // Cleanup function\n return () => {\n tooltip.remove()\n }\n }, [data, chartConfig, displayConfig, queryObject, dimensions, dimensionsReady, safeDisplayConfig.showLegend, safeDisplayConfig.showGrid, safeDisplayConfig.showTooltip, safeDisplayConfig.minBubbleSize, safeDisplayConfig.maxBubbleSize, safeDisplayConfig.bubbleOpacity])\n\n if (!data || data.length === 0) {\n return (\n <div className=\"flex items-center justify-center w-full text-gray-500\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">No data available</div>\n <div className=\"text-xs\">No data points to display in bubble chart</div>\n </div>\n </div>\n )\n }\n\n // Validate that we have required fields\n const hasValidConfig = chartConfig?.xAxis && chartConfig?.yAxis && chartConfig?.series\n if (!hasValidConfig) {\n return (\n <div className=\"flex items-center justify-center w-full text-yellow-600\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">Configuration Required</div>\n <div className=\"text-xs\">Bubble chart requires xAxis, yAxis, series, and sizeField dimensions</div>\n <div className=\"text-xs mt-1\">Optional: colorField for bubble coloring</div>\n </div>\n </div>\n )\n }\n\n return (\n <ChartContainer height={height}>\n <div ref={containerRef} className=\"w-full h-full relative\">\n <svg ref={svgRef} className=\"w-full h-full\" />\n {!dimensionsReady && (\n <div className=\"absolute inset-0 flex items-center justify-center\">\n <div className=\"text-gray-400 text-sm\">Measuring chart dimensions...</div>\n </div>\n )}\n </div>\n </ChartContainer>\n )\n}","/**\n * Analytics Portlet Component\n * Simplified version with minimal dependencies\n */\n\nimport { useMemo, useState, forwardRef, useImperativeHandle, useEffect, useRef } from 'react'\nimport { useCubeQuery } from '../hooks/useCubeQuery'\nimport ChartErrorBoundary from './ChartErrorBoundary'\nimport { \n RechartsBarChart, \n RechartsLineChart, \n RechartsAreaChart, \n RechartsPieChart, \n RechartsScatterChart, \n RechartsRadarChart, \n RechartsRadialBarChart, \n RechartsTreeMapChart, \n BubbleChart,\n DataTable \n} from './charts'\nimport type { AnalyticsPortletProps } from '../types'\n\n\ninterface AnalyticsPortletRef {\n refresh: () => void\n}\n\nconst AnalyticsPortlet = forwardRef<AnalyticsPortletRef, AnalyticsPortletProps>(({ \n query, \n chartType, \n chartConfig, \n displayConfig, \n height = 300, \n title: _title,\n onDebugDataReady\n}, ref) => {\n const [refreshCounter, setRefreshCounter] = useState(0)\n const onDebugDataReadyRef = useRef(onDebugDataReady)\n \n // Update ref when callback changes\n useEffect(() => {\n onDebugDataReadyRef.current = onDebugDataReady\n }, [onDebugDataReady])\n\n // Parse query from JSON string and include refresh counter to force re-query\n const queryObject = useMemo(() => {\n try {\n const parsed = JSON.parse(query)\n const result = {\n ...parsed,\n __refresh_counter: refreshCounter\n }\n return result\n } catch (e) {\n console.error('AnalyticsPortlet: Invalid query JSON:', e)\n return null\n }\n }, [query, refreshCounter])\n\n // Use the cube React hook\n const { resultSet, isLoading, error } = useCubeQuery(queryObject, {\n skip: !queryObject,\n resetResultSetOnChange: true\n })\n\n // Expose refresh function through ref\n useImperativeHandle(ref, () => ({\n refresh: () => {\n setRefreshCounter(prev => prev + 1)\n }\n }), [])\n\n // Send debug data to parent when ready (must be before any returns)\n useEffect(() => {\n if (onDebugDataReadyRef.current && chartConfig && queryObject && resultSet && !error) {\n const getData = () => {\n switch (chartType) {\n case 'pie':\n case 'table':\n return resultSet.tablePivot()\n default:\n return resultSet.rawData()\n }\n }\n const data = getData()\n \n if (data) {\n onDebugDataReadyRef.current({\n chartConfig: chartConfig || {},\n displayConfig: displayConfig || {},\n queryObject,\n data,\n chartType\n })\n }\n }\n }, [chartConfig, queryObject, resultSet, chartType, error]) // Use ref for callback to prevent infinite loops\n\n // Validate that chartConfig is provided\n if (!chartConfig) {\n return (\n <div className=\"flex items-center justify-center w-full text-red-500\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">Configuration Error</div>\n <div className=\"text-xs\">chartConfig is required but not provided</div>\n </div>\n </div>\n )\n }\n\n if (isLoading || (queryObject && !resultSet && !error)) {\n return (\n <div className=\"flex items-center justify-center w-full\" style={{ height }}>\n <div className=\"animate-spin rounded-full h-8 w-8 border-b-2 border-blue-500\"></div>\n </div>\n )\n }\n\n if (error) {\n return (\n <div className=\"p-4 border border-red-300 bg-red-50 rounded\" style={{ height }}>\n <div className=\"mb-2\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-red-600 font-medium text-sm\">⚠️ Query Error</span>\n <button\n onClick={() => setRefreshCounter(prev => prev + 1)}\n className=\"px-2 py-1 bg-blue-500 text-white rounded text-xs hover:bg-blue-600\"\n >\n Retry\n </button>\n </div>\n </div>\n \n <div className=\"mb-3\">\n <div className=\"text-xs text-red-700 bg-white p-2 rounded border\">\n {error.message || error.toString()}\n </div>\n </div>\n \n <div className=\"space-y-2 text-xs\">\n <details>\n <summary className=\"cursor-pointer text-gray-700 font-medium\">Original Query</summary>\n <pre className=\"mt-1 bg-blue-50 p-2 rounded text-xs overflow-auto max-h-20\">\n {query}\n </pre>\n </details>\n \n <details>\n <summary className=\"cursor-pointer text-gray-700 font-medium\">Chart Config</summary>\n <pre className=\"mt-1 bg-purple-50 p-2 rounded text-xs overflow-auto max-h-20\">\n {JSON.stringify({\n chartType,\n chartConfig,\n displayConfig\n }, null, 2)}\n </pre>\n </details>\n </div>\n </div>\n )\n }\n\n if (!resultSet || !queryObject) {\n return (\n <div className=\"flex items-center justify-center w-full text-gray-500\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">No data available</div>\n <div className=\"text-xs\">Invalid query or no results</div>\n </div>\n </div>\n )\n }\n\n // Get data based on chart type needs\n const getData = () => {\n switch (chartType) {\n case 'pie':\n case 'table':\n return resultSet.tablePivot()\n default:\n return resultSet.rawData()\n }\n }\n\n const data = getData()\n\n // Render appropriate chart component\n const renderChart = () => {\n try {\n // Pass height directly to charts - let ChartContainer handle it\n const chartHeight = height\n \n switch (chartType) {\n case 'bar':\n return (\n <RechartsBarChart\n data={data}\n chartConfig={chartConfig}\n displayConfig={displayConfig}\n queryObject={queryObject}\n height={chartHeight}\n />\n )\n case 'line':\n return (\n <RechartsLineChart\n data={data}\n chartConfig={chartConfig}\n displayConfig={displayConfig}\n queryObject={queryObject}\n height={chartHeight}\n />\n )\n case 'area':\n return (\n <RechartsAreaChart\n data={data}\n chartConfig={chartConfig}\n displayConfig={displayConfig}\n queryObject={queryObject}\n height={chartHeight}\n />\n )\n case 'pie':\n return (\n <RechartsPieChart\n data={data}\n chartConfig={chartConfig}\n displayConfig={displayConfig}\n queryObject={queryObject}\n height={chartHeight}\n />\n )\n case 'scatter':\n return (\n <RechartsScatterChart\n data={data}\n chartConfig={chartConfig}\n displayConfig={displayConfig}\n queryObject={queryObject}\n height={chartHeight}\n />\n )\n case 'radar':\n return (\n <RechartsRadarChart\n data={data}\n chartConfig={chartConfig}\n displayConfig={displayConfig}\n queryObject={queryObject}\n height={chartHeight}\n />\n )\n case 'radialBar':\n return (\n <RechartsRadialBarChart\n data={data}\n chartConfig={chartConfig}\n displayConfig={displayConfig}\n queryObject={queryObject}\n height={chartHeight}\n />\n )\n case 'treemap':\n return (\n <RechartsTreeMapChart\n data={data}\n chartConfig={chartConfig}\n displayConfig={displayConfig}\n queryObject={queryObject}\n height={chartHeight}\n />\n )\n case 'bubble':\n return (\n <BubbleChart\n data={data}\n chartConfig={chartConfig}\n displayConfig={displayConfig}\n queryObject={queryObject}\n height={chartHeight}\n />\n )\n case 'table':\n return (\n <DataTable\n data={data}\n chartConfig={chartConfig}\n displayConfig={displayConfig}\n queryObject={queryObject}\n height={chartHeight}\n />\n )\n default:\n return (\n <div className=\"flex items-center justify-center w-full\" style={{ height }}>\n <div className=\"text-center text-gray-500\">\n <div className=\"text-sm font-semibold mb-1\">Unsupported chart type</div>\n <div className=\"text-xs\">{chartType}</div>\n </div>\n </div>\n )\n }\n } catch (error) {\n console.error('Chart rendering error:', error)\n return (\n <div className=\"flex items-center justify-center w-full text-red-500 p-4\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">Error rendering chart</div>\n <div className=\"text-xs\">{error instanceof Error ? error.message : 'Unknown error'}</div>\n </div>\n </div>\n )\n }\n }\n\n return (\n <ChartErrorBoundary \n portletTitle={_title}\n portletConfig={{\n chartType,\n chartConfig,\n displayConfig,\n height\n }}\n cubeQuery={query}\n >\n <div className=\"w-full h-full flex flex-col flex-1\" style={{ minHeight: '200px' }}>\n {renderChart()}\n </div>\n </ChartErrorBoundary>\n )\n})\n\nAnalyticsPortlet.displayName = 'AnalyticsPortlet'\n\nexport default AnalyticsPortlet","import React, { useEffect, useCallback } from 'react'\n\nexport interface ModalProps {\n isOpen: boolean\n onClose: () => void\n title?: string\n size?: 'sm' | 'md' | 'lg' | 'xl' | 'full' | 'fullscreen' | 'fullscreen-mobile'\n closeOnBackdropClick?: boolean\n closeOnEscape?: boolean\n showCloseButton?: boolean\n className?: string\n children: React.ReactNode\n footer?: React.ReactNode\n noPadding?: boolean\n}\n\nconst Modal: React.FC<ModalProps> = ({\n isOpen,\n onClose,\n title,\n size = 'md',\n closeOnBackdropClick = true,\n closeOnEscape = true,\n showCloseButton = true,\n children,\n footer,\n noPadding = false\n}) => {\n // Handle ESC key press\n const handleEscapeKey = useCallback((event: KeyboardEvent) => {\n if (event.key === 'Escape' && closeOnEscape) {\n onClose()\n }\n }, [closeOnEscape, onClose])\n\n\n // Manage ESC key listener and body scroll\n useEffect(() => {\n if (isOpen) {\n // Add ESC key listener\n if (closeOnEscape) {\n document.addEventListener('keydown', handleEscapeKey)\n }\n\n // Prevent body scroll when modal is open\n document.body.style.overflow = 'hidden'\n } else {\n // Restore body scroll\n document.body.style.overflow = 'unset'\n }\n\n // Cleanup\n return () => {\n document.removeEventListener('keydown', handleEscapeKey)\n document.body.style.overflow = 'unset'\n }\n }, [isOpen, closeOnEscape, handleEscapeKey])\n\n\n if (!isOpen) return null\n\n const getSizeClasses = () => {\n switch (size) {\n case 'sm':\n return 'max-w-md'\n case 'md':\n return 'max-w-lg'\n case 'lg':\n return 'max-w-2xl'\n case 'xl':\n return 'max-w-6xl'\n case 'full':\n return 'max-w-7xl'\n case 'fullscreen':\n return 'w-[90vw] h-[90vh] max-w-none'\n case 'fullscreen-mobile':\n return 'w-full h-full md:w-[90vw] md:h-[90vh] max-w-none'\n default:\n return 'max-w-lg'\n }\n }\n\n return (\n <div \n className={`fixed inset-0 z-[9999] backdrop-blur-md ${size === 'fullscreen-mobile' ? 'flex md:flex md:items-center md:justify-center' : 'flex items-center justify-center'}`}\n style={{ backgroundColor: 'rgba(0, 0, 0, 0.75)' }}\n onClick={closeOnBackdropClick ? onClose : undefined}\n >\n <div \n className={`relative bg-white border border-gray-300 ${size === 'fullscreen-mobile' ? 'rounded-none md:rounded-lg' : 'rounded-lg'} shadow-2xl ${size === 'fullscreen' || size === 'fullscreen-mobile' ? '' : 'mx-4'} ${getSizeClasses()} ${size === 'fullscreen' || size === 'fullscreen-mobile' ? '' : 'max-h-[90vh]'} flex flex-col`}\n onClick={(e) => e.stopPropagation()}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={title ? 'modal-title' : undefined}\n >\n {/* Header */}\n {(title || showCloseButton) && (\n <div className=\"flex items-center justify-between px-6 py-4 border-b border-gray-200\">\n {title && (\n <h2 id=\"modal-title\" className=\"text-xl font-semibold text-gray-900\">\n {title}\n </h2>\n )}\n {showCloseButton && (\n <button\n type=\"button\"\n onClick={onClose}\n className=\"text-gray-400 hover:text-gray-600 transition-colors p-2 -mr-2\"\n aria-label=\"Close modal\"\n >\n <svg width=\"24\" height=\"24\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n )}\n </div>\n )}\n\n {/* Content */}\n <div className={`flex-1 overflow-y-auto ${noPadding ? '' : 'px-6 py-4'}`}>\n {children}\n </div>\n\n {/* Footer */}\n {footer && (\n <div className=\"flex items-center justify-end space-x-3 px-6 py-4 border-t border-gray-200 bg-gray-50\">\n {footer}\n </div>\n )}\n </div>\n </div>\n )\n}\n\nexport default Modal","/**\n * CubeMetaExplorer Component\n * \n * Displays the cube schema in a collapsible tree view.\n * Users can click on dimensions, measures, and time dimensions to add them to their query.\n */\n\nimport React, { useState } from 'react'\nimport { ChevronDownIcon, ChevronRightIcon, ExclamationTriangleIcon, ArrowPathIcon, CogIcon } from '@heroicons/react/24/outline'\nimport { ChartBarIcon, TagIcon, CalendarIcon } from '@heroicons/react/24/solid'\nimport type { CubeMetaExplorerProps, MetaCube, MetaField } from './types'\n\nconst CubeMetaExplorer: React.FC<CubeMetaExplorerProps> = ({\n schema,\n schemaStatus,\n schemaError,\n selectedFields,\n onFieldSelect,\n onFieldDeselect,\n onRetrySchema,\n onOpenSettings\n}) => {\n const [expandedCubes, setExpandedCubes] = useState<Set<string>>(new Set())\n const [expandedSections, setExpandedSections] = useState<Set<string>>(new Set())\n const [searchTerm, setSearchTerm] = useState('')\n \n // Track the original expansion state before search\n const [preSearchExpandedCubes, setPreSearchExpandedCubes] = useState<Set<string> | null>(null)\n const [preSearchExpandedSections, setPreSearchExpandedSections] = useState<Set<string> | null>(null)\n\n // Auto-expand cubes and sections that contain search matches\n React.useEffect(() => {\n if (!schema) {\n return\n }\n\n const hasSearchTerm = searchTerm.trim().length > 0\n\n if (hasSearchTerm) {\n // Save current state before expanding for search (only if not already saved)\n if (preSearchExpandedCubes === null) {\n setPreSearchExpandedCubes(new Set(expandedCubes))\n setPreSearchExpandedSections(new Set(expandedSections))\n }\n\n const newExpandedCubes = new Set<string>()\n const newExpandedSections = new Set<string>()\n\n schema.cubes.forEach((cube: MetaCube) => {\n let cubeHasMatches = false\n\n // Check measures\n const matchingMeasures = cube.measures.filter(field => \n field.name.toLowerCase().includes(searchTerm.toLowerCase()) ||\n field.title.toLowerCase().includes(searchTerm.toLowerCase())\n )\n if (matchingMeasures.length > 0) {\n cubeHasMatches = true\n newExpandedSections.add(`${cube.name}-measures`)\n }\n\n // Check regular dimensions\n const regularDimensions = cube.dimensions.filter(d => d.type !== 'time')\n const matchingDimensions = regularDimensions.filter(field => \n field.name.toLowerCase().includes(searchTerm.toLowerCase()) ||\n field.title.toLowerCase().includes(searchTerm.toLowerCase())\n )\n if (matchingDimensions.length > 0) {\n cubeHasMatches = true\n newExpandedSections.add(`${cube.name}-dimensions`)\n }\n\n // Check time dimensions\n const timeDimensions = cube.dimensions.filter(d => d.type === 'time')\n const matchingTimeDimensions = timeDimensions.filter(field => \n field.name.toLowerCase().includes(searchTerm.toLowerCase()) ||\n field.title.toLowerCase().includes(searchTerm.toLowerCase())\n )\n if (matchingTimeDimensions.length > 0) {\n cubeHasMatches = true\n newExpandedSections.add(`${cube.name}-timeDimensions`)\n }\n\n // If cube has any matches, expand it\n if (cubeHasMatches) {\n newExpandedCubes.add(cube.name)\n }\n })\n\n // Combine pre-search state with search expansions\n const combinedCubes = new Set([...(preSearchExpandedCubes || []), ...newExpandedCubes])\n const combinedSections = new Set([...(preSearchExpandedSections || []), ...newExpandedSections])\n \n setExpandedCubes(combinedCubes)\n setExpandedSections(combinedSections)\n } else {\n // No search term - restore original state if we have it saved\n if (preSearchExpandedCubes !== null && preSearchExpandedSections !== null) {\n setExpandedCubes(preSearchExpandedCubes)\n setExpandedSections(preSearchExpandedSections)\n setPreSearchExpandedCubes(null)\n setPreSearchExpandedSections(null)\n }\n }\n }, [schema, searchTerm, preSearchExpandedCubes, preSearchExpandedSections])\n\n // Loading state\n if (schemaStatus === 'loading') {\n return (\n <div className=\"h-full flex items-center justify-center text-gray-500\">\n <div className=\"text-center\">\n <div className=\"animate-spin rounded-full h-8 w-8 border-b-2 border-blue-600 mx-auto mb-3\"></div>\n <div className=\"text-sm font-semibold mb-1\">Loading Schema...</div>\n <div className=\"text-xs\">Fetching cube metadata</div>\n </div>\n </div>\n )\n }\n\n // Error state\n if (schemaStatus === 'error') {\n const isCorsError = schemaError?.toLowerCase().includes('cors') || \n schemaError?.toLowerCase().includes('fetch')\n \n return (\n <div className=\"h-full flex items-center justify-center\">\n <div className=\"text-center max-w-sm p-6\">\n <ExclamationTriangleIcon className=\"w-12 h-12 mx-auto text-red-500 mb-4\" />\n <div className=\"text-sm font-semibold text-gray-900 mb-2\">\n Failed to Load Schema\n </div>\n <div className=\"text-xs text-gray-600 mb-4\">\n {isCorsError ? (\n <>\n CORS error detected. The API endpoint may be incorrect or not accessible.\n </>\n ) : (\n <>\n {schemaError || 'Unable to connect to the Cube.js API'}\n </>\n )}\n </div>\n \n <div className=\"space-y-2\">\n {onRetrySchema && (\n <button\n onClick={onRetrySchema}\n className=\"w-full flex items-center justify-center space-x-2 px-3 py-2 text-sm font-medium text-blue-700 bg-blue-100 border border-blue-200 rounded-md hover:bg-blue-200 focus:outline-none focus:ring-2 focus:ring-blue-500\"\n >\n <ArrowPathIcon className=\"w-4 h-4\" />\n <span>Retry</span>\n </button>\n )}\n \n {onOpenSettings && (\n <button\n onClick={onOpenSettings}\n className=\"w-full flex items-center justify-center space-x-2 px-3 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-md hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-blue-500\"\n >\n <CogIcon className=\"w-4 h-4\" />\n <span>Check API Settings</span>\n </button>\n )}\n </div>\n \n {isCorsError && (\n <div className=\"mt-4 p-3 bg-amber-50 border border-amber-200 rounded-md\">\n <div className=\"text-xs text-amber-800\">\n <div className=\"font-medium mb-1\">Common solutions:</div>\n <ul className=\"list-disc list-inside space-y-1\">\n <li>Verify the Base API URL is correct</li>\n <li>Ensure the server supports CORS</li>\n <li>Check if authentication is required</li>\n </ul>\n </div>\n </div>\n )}\n </div>\n </div>\n )\n }\n\n // No schema loaded yet\n if (!schema) {\n return (\n <div className=\"h-full flex items-center justify-center text-gray-500\">\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">No Schema</div>\n <div className=\"text-xs\">Schema not loaded</div>\n </div>\n </div>\n )\n }\n\n const toggleCubeExpansion = (cubeName: string) => {\n const newExpanded = new Set(expandedCubes)\n if (newExpanded.has(cubeName)) {\n newExpanded.delete(cubeName)\n } else {\n newExpanded.add(cubeName)\n }\n setExpandedCubes(newExpanded)\n \n // If we're in search mode, also update the pre-search state\n if (preSearchExpandedCubes !== null) {\n const newPreSearchExpanded = new Set(preSearchExpandedCubes)\n if (newPreSearchExpanded.has(cubeName)) {\n newPreSearchExpanded.delete(cubeName)\n } else {\n newPreSearchExpanded.add(cubeName)\n }\n setPreSearchExpandedCubes(newPreSearchExpanded)\n }\n }\n\n const toggleSectionExpansion = (sectionKey: string) => {\n const newExpanded = new Set(expandedSections)\n if (newExpanded.has(sectionKey)) {\n newExpanded.delete(sectionKey)\n } else {\n newExpanded.add(sectionKey)\n }\n setExpandedSections(newExpanded)\n \n // If we're in search mode, also update the pre-search state\n if (preSearchExpandedSections !== null) {\n const newPreSearchExpanded = new Set(preSearchExpandedSections)\n if (newPreSearchExpanded.has(sectionKey)) {\n newPreSearchExpanded.delete(sectionKey)\n } else {\n newPreSearchExpanded.add(sectionKey)\n }\n setPreSearchExpandedSections(newPreSearchExpanded)\n }\n }\n\n const handleFieldClick = (field: MetaField, fieldType: 'measures' | 'dimensions' | 'timeDimensions') => {\n const isSelected = (() => {\n switch (fieldType) {\n case 'measures':\n return selectedFields.measures.includes(field.name)\n case 'dimensions':\n return selectedFields.dimensions.includes(field.name)\n case 'timeDimensions':\n return selectedFields.timeDimensions.includes(field.name)\n default:\n return false\n }\n })()\n\n if (isSelected) {\n onFieldDeselect(field.name, fieldType)\n } else {\n onFieldSelect(field.name, fieldType)\n }\n }\n\n const filterFields = (fields: MetaField[]): MetaField[] => {\n if (!searchTerm) return fields\n return fields.filter(field => \n field.name.toLowerCase().includes(searchTerm.toLowerCase()) ||\n field.title.toLowerCase().includes(searchTerm.toLowerCase())\n )\n }\n\n const cubeHasMatches = (cube: MetaCube): boolean => {\n if (!searchTerm.trim()) return true\n \n const measureMatches = cube.measures.some(field => \n field.name.toLowerCase().includes(searchTerm.toLowerCase()) ||\n field.title.toLowerCase().includes(searchTerm.toLowerCase())\n )\n \n const dimensionMatches = cube.dimensions.some(field => \n field.name.toLowerCase().includes(searchTerm.toLowerCase()) ||\n field.title.toLowerCase().includes(searchTerm.toLowerCase())\n )\n \n return measureMatches || dimensionMatches\n }\n\n const FieldItem: React.FC<{ \n field: MetaField\n fieldType: 'measures' | 'dimensions' | 'timeDimensions'\n icon: React.ReactNode\n }> = ({ field, fieldType, icon }) => {\n const isSelected = (() => {\n switch (fieldType) {\n case 'measures':\n return selectedFields.measures.includes(field.name)\n case 'dimensions':\n return selectedFields.dimensions.includes(field.name)\n case 'timeDimensions':\n return selectedFields.timeDimensions.includes(field.name)\n default:\n return false\n }\n })()\n\n const getSelectedStyles = () => {\n if (!isSelected) return 'hover:bg-gray-100 text-gray-700'\n \n switch (fieldType) {\n case 'measures':\n return 'bg-amber-100 text-amber-800 border border-amber-200'\n case 'dimensions':\n return 'bg-green-100 text-green-800 border border-green-200'\n case 'timeDimensions':\n return 'bg-blue-100 text-blue-800 border border-blue-200'\n default:\n return 'bg-blue-100 text-blue-800 border border-blue-200'\n }\n }\n\n const getIconColor = () => {\n if (!isSelected) return 'text-gray-400'\n \n switch (fieldType) {\n case 'measures':\n return 'text-amber-600'\n case 'dimensions':\n return 'text-green-600'\n case 'timeDimensions':\n return 'text-blue-600'\n default:\n return 'text-blue-600'\n }\n }\n\n const getCheckmarkColor = () => {\n switch (fieldType) {\n case 'measures':\n return 'text-amber-600'\n case 'dimensions':\n return 'text-green-600'\n case 'timeDimensions':\n return 'text-blue-600'\n default:\n return 'text-blue-600'\n }\n }\n\n return (\n <div\n className={`flex items-center px-2 py-1.5 text-xs cursor-pointer rounded-md transition-colors ${getSelectedStyles()}`}\n onClick={() => handleFieldClick(field, fieldType)}\n title={field.description || field.title}\n >\n <div className={`mr-1.5 ${getIconColor()}`}>\n {React.cloneElement(icon as React.ReactElement, { className: 'w-3 h-3' })}\n </div>\n <div className=\"flex-1 min-w-0\">\n <div className=\"font-medium truncate text-xs\">{field.shortTitle}</div>\n <div className=\"text-xs text-gray-500 truncate\">{field.name}</div>\n </div>\n {isSelected && (\n <div className={`ml-1.5 ${getCheckmarkColor()}`}>\n <svg className=\"w-3 h-3\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fillRule=\"evenodd\" d=\"M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z\" clipRule=\"evenodd\" />\n </svg>\n </div>\n )}\n </div>\n )\n }\n\n const SectionHeader: React.FC<{\n title: string\n count: number\n sectionKey: string\n icon: React.ReactNode\n }> = ({ title, count, sectionKey, icon }) => {\n const isExpanded = expandedSections.has(sectionKey)\n \n // Get section type from sectionKey to apply consistent colors\n const getSectionType = (): 'dimensions' | 'timeDimensions' | 'measures' => {\n if (sectionKey.includes('-dimensions') && !sectionKey.includes('-timeDimensions')) {\n return 'dimensions'\n } else if (sectionKey.includes('-timeDimensions')) {\n return 'timeDimensions'\n } else {\n return 'measures'\n }\n }\n \n const getSectionColorClasses = () => {\n const sectionType = getSectionType()\n switch (sectionType) {\n case 'dimensions':\n return 'text-green-800'\n case 'timeDimensions':\n return 'text-blue-800'\n case 'measures':\n return 'text-amber-800'\n default:\n return 'text-gray-700'\n }\n }\n \n return (\n <div\n className={`flex items-center px-2 py-1 text-sm font-semibold cursor-pointer hover:bg-gray-50 rounded-md ${getSectionColorClasses()}`}\n onClick={() => toggleSectionExpansion(sectionKey)}\n >\n <div className=\"mr-1.5\">\n {isExpanded ? (\n <ChevronDownIcon className=\"w-3 h-3\" />\n ) : (\n <ChevronRightIcon className=\"w-3 h-3\" />\n )}\n </div>\n <div className=\"mr-1.5\">\n {icon}\n </div>\n <span className=\"flex-1\">{title}</span>\n <span className=\"text-xs text-gray-500 bg-gray-200 px-1.5 py-0.5 rounded-full\">\n {count}\n </span>\n </div>\n )\n }\n\n const NoMatchesMessage: React.FC = () => (\n <div className=\"flex items-center justify-center py-8 text-center\">\n <div className=\"max-w-sm\">\n <div className=\"text-gray-400 mb-2\">\n <svg className=\"w-12 h-12 mx-auto\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.5} d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\" />\n </svg>\n </div>\n <div className=\"text-sm font-medium text-gray-900 mb-1\">No matches found</div>\n <div className=\"text-xs text-gray-500 mb-3\">\n No fields match your search term \"{searchTerm}\"\n </div>\n <button\n onClick={() => setSearchTerm('')}\n className=\"inline-flex items-center px-3 py-1.5 text-xs font-medium text-blue-700 bg-blue-100 border border-blue-200 rounded-md hover:bg-blue-200 focus:outline-none focus:ring-2 focus:ring-blue-500\"\n >\n Clear search\n </button>\n </div>\n </div>\n )\n\n return (\n <div className=\"flex-1 flex flex-col bg-white border border-gray-200 rounded-lg min-h-0\">\n {/* Header */}\n <div className=\"p-3 border-b border-gray-200\">\n <h3 className=\"text-base font-semibold text-gray-900 mb-2\">Schema Explorer</h3>\n \n {/* Search */}\n <div className=\"relative\">\n <input\n type=\"text\"\n placeholder=\"Search fields...\"\n value={searchTerm}\n onChange={(e) => setSearchTerm(e.target.value)}\n className=\"w-full px-2 py-1.5 border border-gray-300 rounded-md text-sm focus:ring-2 focus:ring-blue-500 focus:border-blue-500\"\n />\n <div className=\"absolute inset-y-0 right-0 pr-3 flex items-center pointer-events-none\">\n <svg className=\"h-4 w-4 text-gray-400\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\" />\n </svg>\n </div>\n </div>\n </div>\n\n {/* Cubes */}\n <div className=\"flex-1 p-3 space-y-2 min-h-0 overflow-y-auto\">\n {(() => {\n // Filter cubes to only show those with matches (when searching)\n const filteredCubes = schema.cubes.filter(cubeHasMatches)\n \n // Show \"No matches\" message if searching but no cubes have matches\n if (searchTerm.trim() && filteredCubes.length === 0) {\n return <NoMatchesMessage />\n }\n \n return filteredCubes.map((cube: MetaCube) => {\n const isExpanded = expandedCubes.has(cube.name)\n const timeDimensions = cube.dimensions.filter(d => d.type === 'time')\n const regularDimensions = cube.dimensions.filter(d => d.type !== 'time')\n\n return (\n <div key={cube.name} className=\"border border-gray-200 rounded-lg\">\n {/* Cube Header */}\n <div\n className=\"flex items-center px-3 py-2 cursor-pointer hover:bg-gray-50 rounded-t-lg\"\n onClick={() => toggleCubeExpansion(cube.name)}\n >\n <div className=\"mr-2\">\n {isExpanded ? (\n <ChevronDownIcon className=\"w-4 h-4 text-gray-600\" />\n ) : (\n <ChevronRightIcon className=\"w-4 h-4 text-gray-600\" />\n )}\n </div>\n <div className=\"flex-1\">\n <div className=\"font-medium text-sm text-gray-900\">{cube.title}</div>\n <div className=\"text-xs text-gray-500\">{cube.description}</div>\n </div>\n </div>\n\n {/* Cube Content */}\n {isExpanded && (\n <div className=\"border-t border-gray-200 p-2 space-y-1\">\n {/* Dimensions - First (matching QueryPanel order) */}\n {regularDimensions.length > 0 && filterFields(regularDimensions).length > 0 && (\n <div>\n <SectionHeader\n title=\"Dimensions\"\n count={filterFields(regularDimensions).length}\n sectionKey={`${cube.name}-dimensions`}\n icon={<TagIcon className=\"w-4 h-4 text-green-600\" />}\n />\n {expandedSections.has(`${cube.name}-dimensions`) && (\n <div className=\"ml-5 space-y-1 mt-1\">\n {filterFields(regularDimensions).map(dimension => (\n <FieldItem\n key={dimension.name}\n field={dimension}\n fieldType=\"dimensions\"\n icon={<TagIcon className=\"w-4 h-4\" />}\n />\n ))}\n </div>\n )}\n </div>\n )}\n\n {/* Time Dimensions - Second (matching QueryPanel order) */}\n {timeDimensions.length > 0 && filterFields(timeDimensions).length > 0 && (\n <div>\n <SectionHeader\n title=\"Time Dimensions\"\n count={filterFields(timeDimensions).length}\n sectionKey={`${cube.name}-timeDimensions`}\n icon={<CalendarIcon className=\"w-4 h-4 text-blue-600\" />}\n />\n {expandedSections.has(`${cube.name}-timeDimensions`) && (\n <div className=\"ml-5 space-y-1 mt-1\">\n {filterFields(timeDimensions).map(timeDimension => (\n <FieldItem\n key={timeDimension.name}\n field={timeDimension}\n fieldType=\"timeDimensions\"\n icon={<CalendarIcon className=\"w-4 h-4\" />}\n />\n ))}\n </div>\n )}\n </div>\n )}\n\n {/* Measures - Third (matching QueryPanel order) */}\n {cube.measures.length > 0 && filterFields(cube.measures).length > 0 && (\n <div>\n <SectionHeader\n title=\"Measures\"\n count={filterFields(cube.measures).length}\n sectionKey={`${cube.name}-measures`}\n icon={<ChartBarIcon className=\"w-4 h-4 text-amber-600\" />}\n />\n {expandedSections.has(`${cube.name}-measures`) && (\n <div className=\"ml-5 space-y-1 mt-1\">\n {filterFields(cube.measures).map(measure => (\n <FieldItem\n key={measure.name}\n field={measure}\n fieldType=\"measures\"\n icon={<ChartBarIcon className=\"w-4 h-4\" />}\n />\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n )}\n </div>\n )\n })\n })()}\n </div>\n </div>\n )\n}\n\nexport default CubeMetaExplorer","/**\n * Type definitions for QueryBuilder components\n */\n\nimport type { CubeQuery, FilterOperator, Filter, SimpleFilter, GroupFilter } from '../../types'\n\n// Meta endpoint response types\nexport interface MetaField {\n name: string // e.g., \"Employees.count\"\n title: string // e.g., \"Total Employees\"\n shortTitle: string // e.g., \"Total Employees\"\n type: string // e.g., \"count\", \"string\", \"time\", \"number\"\n description?: string // Optional description\n}\n\nexport interface MetaCube {\n name: string // e.g., \"Employees\"\n title: string // e.g., \"Employee Analytics\"\n description: string // e.g., \"Employee data and metrics\"\n measures: MetaField[] // e.g., \"Employees.count\"\n dimensions: MetaField[] // e.g., \"Employees.name\"\n segments: MetaField[] // Currently empty in examples\n}\n\nexport interface MetaResponse {\n cubes: MetaCube[]\n}\n\n// Query builder state types\nexport type ValidationStatus = 'idle' | 'validating' | 'valid' | 'invalid'\nexport type ExecutionStatus = 'idle' | 'loading' | 'success' | 'error'\nexport type SchemaStatus = 'idle' | 'loading' | 'success' | 'error'\n\nexport interface QueryBuilderState {\n query: CubeQuery // Current query being built\n schema: MetaResponse | null // Schema from /meta endpoint\n schemaStatus: SchemaStatus // Status of schema loading\n schemaError: string | null // Error from schema loading\n validationStatus: ValidationStatus\n validationError: string | null\n validationSql: { sql: string[], params: any[] } | null // Generated SQL from validation\n executionStatus: ExecutionStatus\n executionResults: any[] | null\n executionError: string | null\n totalRowCount: number | null // Total rows without limit\n totalRowCountStatus: 'idle' | 'loading' | 'success' | 'error'\n}\n\n// Validation response from /dry-run endpoint\nexport interface ValidationResult {\n valid?: boolean // Our custom property (may not be present in official Cube.js)\n error?: string\n query?: CubeQuery\n sql?: {\n sql: string[]\n params: any[]\n }\n queryType?: string // Always present in successful Cube.js responses\n normalizedQueries?: any[]\n queryOrder?: string[]\n transformedQueries?: any[]\n pivotQuery?: any\n complexity?: string\n cubesUsed?: string[]\n joinType?: string\n // Additional validation metadata can be added here\n}\n\n// API Configuration\nexport interface ApiConfig {\n baseApiUrl: string // Base URL for Cube API (default: '/cubejs-api/v1')\n apiToken: string // API token for authentication (default: empty)\n}\n\n// Component props\nexport interface QueryBuilderProps {\n className?: string // Optional CSS classes\n initialQuery?: CubeQuery // Initial query to load (overrides localStorage)\n disableLocalStorage?: boolean // Disable localStorage persistence\n hideSettings?: boolean // Hide the settings/configuration button\n}\n\nexport interface QueryBuilderRef {\n getCurrentQuery: () => CubeQuery\n getValidationState: () => { status: ValidationStatus, result?: ValidationResult }\n getValidationResult: () => ValidationResult | null\n}\n\nexport interface CubeMetaExplorerProps {\n schema: MetaResponse | null\n schemaStatus: SchemaStatus\n schemaError: string | null\n selectedFields: {\n measures: string[]\n dimensions: string[]\n timeDimensions: string[]\n }\n onFieldSelect: (fieldName: string, fieldType: 'measures' | 'dimensions' | 'timeDimensions') => void\n onFieldDeselect: (fieldName: string, fieldType: 'measures' | 'dimensions' | 'timeDimensions') => void\n onRetrySchema?: () => void\n onOpenSettings?: () => void\n}\n\nexport interface QueryPanelProps {\n query: CubeQuery\n schema: MetaResponse | null\n validationStatus: ValidationStatus\n validationError: string | null\n validationSql: { sql: string[], params: any[] } | null\n onValidate: () => void\n onExecute: () => void\n onRemoveField: (fieldName: string, fieldType: 'measures' | 'dimensions' | 'timeDimensions') => void\n onTimeDimensionGranularityChange: (dimensionName: string, granularity: string) => void\n onFiltersChange: (filters: Filter[]) => void\n onDateRangeChange: (timeDimension: string, dateRange: string | string[]) => void\n onDateRangeRemove: (timeDimension: string) => void\n onOrderChange: (fieldName: string, direction: 'asc' | 'desc' | null) => void\n onClearQuery?: () => void\n showSettings?: boolean // Show the settings/configuration button\n onSettingsClick?: () => void // Handler for settings button click\n onAIAssistantClick?: () => void // Handler for AI Assistant button click\n}\n\nexport interface ResultsPanelProps {\n executionStatus: ExecutionStatus\n executionResults: any[] | null\n executionError: string | null\n query: CubeQuery\n displayLimit?: number\n onDisplayLimitChange?: (limit: number) => void\n totalRowCount?: number | null\n totalRowCountStatus?: 'idle' | 'loading' | 'success' | 'error'\n}\n\n// Time dimension granularity options\nexport const TIME_GRANULARITIES = [\n { value: 'day', label: 'Day' },\n { value: 'week', label: 'Week' },\n { value: 'month', label: 'Month' },\n { value: 'quarter', label: 'Quarter' },\n { value: 'year', label: 'Year' }\n] as const\n\nexport type TimeGranularity = typeof TIME_GRANULARITIES[number]['value']\n\n// Filter operator metadata\nexport interface FilterOperatorMeta {\n label: string\n description: string\n requiresValues: boolean\n supportsMultipleValues: boolean\n valueType: 'string' | 'number' | 'date' | 'boolean' | 'any'\n fieldTypes: string[] // Which field types support this operator\n}\n\nexport const FILTER_OPERATORS: Record<FilterOperator, FilterOperatorMeta> = {\n // String operators\n equals: {\n label: 'equals',\n description: 'Exact match',\n requiresValues: true,\n supportsMultipleValues: true,\n valueType: 'any',\n fieldTypes: ['string', 'number', 'boolean', 'time']\n },\n notEquals: {\n label: 'not equals',\n description: 'Does not match',\n requiresValues: true,\n supportsMultipleValues: true,\n valueType: 'any',\n fieldTypes: ['string', 'number', 'boolean', 'time']\n },\n contains: {\n label: 'contains',\n description: 'Contains text (case insensitive)',\n requiresValues: true,\n supportsMultipleValues: false,\n valueType: 'string',\n fieldTypes: ['string']\n },\n notContains: {\n label: 'not contains',\n description: 'Does not contain text',\n requiresValues: true,\n supportsMultipleValues: false,\n valueType: 'string',\n fieldTypes: ['string']\n },\n startsWith: {\n label: 'starts with',\n description: 'Starts with text',\n requiresValues: true,\n supportsMultipleValues: false,\n valueType: 'string',\n fieldTypes: ['string']\n },\n endsWith: {\n label: 'ends with',\n description: 'Ends with text',\n requiresValues: true,\n supportsMultipleValues: false,\n valueType: 'string',\n fieldTypes: ['string']\n },\n // Numeric operators\n gt: {\n label: 'greater than',\n description: 'Greater than value',\n requiresValues: true,\n supportsMultipleValues: false,\n valueType: 'number',\n fieldTypes: ['number', 'count', 'sum', 'avg', 'min', 'max']\n },\n gte: {\n label: 'greater than or equal',\n description: 'Greater than or equal to value',\n requiresValues: true,\n supportsMultipleValues: false,\n valueType: 'number',\n fieldTypes: ['number', 'count', 'sum', 'avg', 'min', 'max']\n },\n lt: {\n label: 'less than',\n description: 'Less than value',\n requiresValues: true,\n supportsMultipleValues: false,\n valueType: 'number',\n fieldTypes: ['number', 'count', 'sum', 'avg', 'min', 'max']\n },\n lte: {\n label: 'less than or equal',\n description: 'Less than or equal to value',\n requiresValues: true,\n supportsMultipleValues: false,\n valueType: 'number',\n fieldTypes: ['number', 'count', 'sum', 'avg', 'min', 'max']\n },\n // Null operators\n set: {\n label: 'is set',\n description: 'Is not null/empty',\n requiresValues: false,\n supportsMultipleValues: false,\n valueType: 'any',\n fieldTypes: ['string', 'number', 'time', 'boolean']\n },\n notSet: {\n label: 'is not set',\n description: 'Is null/empty',\n requiresValues: false,\n supportsMultipleValues: false,\n valueType: 'any',\n fieldTypes: ['string', 'number', 'time', 'boolean']\n },\n // Date operators\n inDateRange: {\n label: 'in date range',\n description: 'Between two dates',\n requiresValues: true,\n supportsMultipleValues: false,\n valueType: 'date',\n fieldTypes: ['time']\n },\n beforeDate: {\n label: 'before date',\n description: 'Before specified date',\n requiresValues: true,\n supportsMultipleValues: false,\n valueType: 'date',\n fieldTypes: ['time']\n },\n afterDate: {\n label: 'after date',\n description: 'After specified date',\n requiresValues: true,\n supportsMultipleValues: false,\n valueType: 'date',\n fieldTypes: ['time']\n }\n}\n\n// Filter builder component props\nexport interface FilterBuilderProps {\n filters: Filter[]\n schema: MetaResponse | null\n query: CubeQuery\n onFiltersChange: (filters: Filter[]) => void\n}\n\nexport interface FilterItemProps {\n filter: SimpleFilter\n index: number\n onFilterChange: (index: number, filter: SimpleFilter) => void\n onFilterRemove: (index: number) => void\n schema: MetaResponse | null\n query: CubeQuery\n}\n\nexport interface FilterGroupProps {\n group: GroupFilter\n index: number\n onGroupChange: (index: number, group: GroupFilter) => void\n onGroupChangeWithUnwrap?: (index: number, group: GroupFilter) => void\n onGroupRemove: (index: number) => void\n schema: MetaResponse | null\n query: CubeQuery\n depth: number\n}\n\nexport interface FilterValueSelectorProps {\n fieldName: string\n operator: FilterOperator\n values: any[]\n onValuesChange: (values: any[]) => void\n schema: MetaResponse | null\n}\n\n// Date range types\nexport type DateRangeType = \n | 'custom'\n | 'today'\n | 'yesterday' \n | 'this_week'\n | 'this_month'\n | 'this_quarter'\n | 'this_year'\n | 'last_7_days'\n | 'last_30_days'\n | 'last_week'\n | 'last_month'\n | 'last_quarter'\n | 'last_year'\n | 'last_12_months'\n | 'last_n_days'\n | 'last_n_weeks'\n | 'last_n_months'\n | 'last_n_quarters'\n | 'last_n_years'\n\nexport interface DateRangeOption {\n value: DateRangeType\n label: string\n}\n\nexport const DATE_RANGE_OPTIONS: DateRangeOption[] = [\n { value: 'custom', label: 'Custom' },\n { value: 'today', label: 'Today' },\n { value: 'yesterday', label: 'Yesterday' },\n { value: 'this_week', label: 'This week' },\n { value: 'this_month', label: 'This month' },\n { value: 'this_quarter', label: 'This quarter' },\n { value: 'this_year', label: 'This year' },\n { value: 'last_7_days', label: 'Last 7 days' },\n { value: 'last_30_days', label: 'Last 30 days' },\n { value: 'last_n_days', label: 'Last N days' },\n { value: 'last_week', label: 'Last week' },\n { value: 'last_n_weeks', label: 'Last N weeks' },\n { value: 'last_month', label: 'Last month' }, \n { value: 'last_12_months', label: 'Last 12 months' },\n { value: 'last_n_months', label: 'Last N months' },\n { value: 'last_quarter', label: 'Last quarter' },\n { value: 'last_n_quarters', label: 'Last N quarters' },\n { value: 'last_year', label: 'Last year' },\n { value: 'last_n_years', label: 'Last N years' }\n] as const\n\nexport interface DateRangeFilter {\n id: string\n timeDimension: string\n rangeType: DateRangeType\n startDate?: string\n endDate?: string\n}\n\n// Date range component props\nexport interface DateRangeSelectorProps {\n timeDimensions: string[]\n onDateRangeChange: (timeDimension: string, dateRange: string | string[]) => void\n onDateRangeRemove: (timeDimension: string) => void\n currentDateRanges: Record<string, string | string[]>\n}\n\nexport interface DateRangeFilterProps {\n timeDimensions: Array<{ dimension: string; granularity?: string; dateRange?: string | string[] }>\n onDateRangeChange: (timeDimension: string, dateRange: string | string[]) => void\n onDateRangeRemove: (timeDimension: string) => void\n}","/**\n * FilterValueSelector Component\n * \n * Smart input component that adapts to operator type:\n * - Combo box for equals/notEquals with API-fetched values\n * - Number input for numeric operators\n * - Date picker for date operators\n * - No input for set/notSet operators\n */\n\nimport React, { useState, useEffect, useRef, useCallback, useMemo } from 'react'\nimport { ChevronDownIcon, XMarkIcon } from '@heroicons/react/24/outline'\nimport { useFilterValues } from '../../hooks/useFilterValues'\nimport { useDebounce } from '../../hooks/useDebounce'\nimport type { FilterValueSelectorProps } from './types'\nimport { FILTER_OPERATORS } from './types'\n\nconst FilterValueSelector: React.FC<FilterValueSelectorProps> = ({\n fieldName,\n operator,\n values,\n onValuesChange,\n schema\n}) => {\n const operatorMeta = FILTER_OPERATORS[operator]\n const [isOpen, setIsOpen] = useState(false)\n const [searchText, setSearchText] = useState('')\n const [hasLoadedInitial, setHasLoadedInitial] = useState(false)\n const dropdownRef = useRef<HTMLDivElement>(null)\n const lastSearchedTerm = useRef<string>('')\n \n // Debounce the search text\n const debouncedSearchText = useDebounce(searchText, 300)\n \n // Check if the field is a dimension (not a measure)\n const isDimension = useMemo(() => schema ? schema.cubes.some(cube => \n cube.dimensions.some(dim => dim.name === fieldName)\n ) : false, [schema, fieldName])\n \n // Check if the field is a time dimension\n const isTimeDimension = useMemo(() => schema ? schema.cubes.some(cube => \n cube.dimensions.some(dim => dim.name === fieldName && dim.type === 'time')\n ) : false, [schema, fieldName])\n \n // Fetch distinct values for combo box (only for equals/notEquals on non-time dimensions)\n const shouldFetchValues = useMemo(() => \n (operator === 'equals' || operator === 'notEquals') && isDimension && !isTimeDimension,\n [operator, isDimension, isTimeDimension]\n )\n const shouldShowComboBox = shouldFetchValues\n \n const { \n values: distinctValues, \n loading: valuesLoading, \n error: valuesError,\n searchValues\n } = useFilterValues(fieldName, shouldFetchValues)\n \n // Close dropdown when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {\n setIsOpen(false)\n }\n }\n \n document.addEventListener('mousedown', handleClickOutside)\n return () => document.removeEventListener('mousedown', handleClickOutside)\n }, [])\n \n // Load initial values when dropdown opens\n useEffect(() => {\n if (isOpen && shouldFetchValues && searchValues) {\n searchValues('', true) // Force load with empty search\n setHasLoadedInitial(true)\n lastSearchedTerm.current = ''\n }\n }, [isOpen, shouldFetchValues, searchValues])\n \n // Trigger search when debounced search text changes\n useEffect(() => {\n if (hasLoadedInitial && shouldFetchValues && searchValues && debouncedSearchText !== lastSearchedTerm.current) {\n lastSearchedTerm.current = debouncedSearchText\n searchValues(debouncedSearchText)\n }\n }, [debouncedSearchText, hasLoadedInitial, shouldFetchValues, searchValues])\n \n // Handle dropdown toggle\n const handleDropdownToggle = useCallback(() => {\n const newIsOpen = !isOpen\n setIsOpen(newIsOpen)\n \n // Reset search when closing dropdown\n if (!newIsOpen) {\n setSearchText('')\n lastSearchedTerm.current = ''\n }\n }, [isOpen])\n \n // Handle search input change\n const handleSearchChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n const newSearchText = e.target.value\n setSearchText(newSearchText)\n }, [])\n \n // Handle value selection for combo box\n const handleValueSelect = useCallback((value: any) => {\n if (operatorMeta.supportsMultipleValues) {\n // Add to selection if not already selected\n if (!values.includes(value)) {\n onValuesChange([...values, value])\n }\n } else {\n // Replace current value\n onValuesChange([value])\n setIsOpen(false)\n }\n // Clear search after selection\n setSearchText('')\n }, [operatorMeta.supportsMultipleValues, values, onValuesChange])\n \n // Handle value removal for multi-select\n const handleValueRemove = useCallback((valueToRemove: any) => {\n onValuesChange(values.filter(v => v !== valueToRemove))\n }, [values, onValuesChange])\n \n // Handle direct text input for non-combo operators\n const handleDirectInput = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value\n if (operatorMeta.valueType === 'number') {\n const numValue = parseFloat(value)\n // Accept valid numbers including zero\n if (!isNaN(numValue)) {\n onValuesChange([numValue])\n } else if (value === '' || value === '-') {\n // Allow empty string or just a minus sign for negative numbers being typed\n onValuesChange([])\n }\n } else {\n onValuesChange(value ? [value] : [])\n }\n }, [operatorMeta.valueType, onValuesChange])\n \n // Handle date input\n const handleDateInput = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value\n if (operator === 'inDateRange') {\n // For date range, we need two values\n const currentValues = values.length >= 2 ? values : ['', '']\n onValuesChange([value, currentValues[1]])\n } else {\n // Single date value\n onValuesChange(value ? [value] : [])\n }\n }, [operator, values, onValuesChange])\n \n const handleDateRangeEndInput = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value\n const currentValues = values.length >= 2 ? values : ['', '']\n onValuesChange([currentValues[0], value])\n }, [values, onValuesChange])\n \n // Render based on operator type\n if (!operatorMeta.requiresValues) {\n // No input needed for set/notSet\n return (\n <div className=\"text-sm text-gray-500 italic\">\n No value required\n </div>\n )\n }\n \n if (operator === 'inDateRange') {\n // Date range picker\n return (\n <div className=\"flex items-center space-x-2\">\n <input\n type=\"date\"\n value={values[0] || ''}\n onChange={handleDateInput}\n className=\"text-sm border border-gray-300 rounded px-2 py-1 focus:ring-2 focus:ring-blue-500 focus:border-blue-500\"\n />\n <span className=\"text-sm text-gray-500\">to</span>\n <input\n type=\"date\"\n value={values[1] || ''}\n onChange={handleDateRangeEndInput}\n className=\"text-sm border border-gray-300 rounded px-2 py-1 focus:ring-2 focus:ring-blue-500 focus:border-blue-500\"\n />\n </div>\n )\n }\n \n if (operatorMeta.valueType === 'date') {\n // Single date picker\n return (\n <input\n type=\"date\"\n value={values[0] || ''}\n onChange={handleDateInput}\n className=\"text-sm border border-gray-300 rounded px-2 py-1 focus:ring-2 focus:ring-blue-500 focus:border-blue-500\"\n />\n )\n }\n \n if (operatorMeta.valueType === 'number') {\n // Number input\n return (\n <input\n type=\"number\"\n value={values[0] !== undefined && values[0] !== null ? values[0] : ''}\n onChange={handleDirectInput}\n placeholder=\"Enter number\"\n className=\"text-sm border border-gray-300 rounded px-2 py-1 focus:ring-2 focus:ring-blue-500 focus:border-blue-500\"\n />\n )\n }\n \n // Time dimension with equals/notEquals - use date picker\n if (isTimeDimension && (operator === 'equals' || operator === 'notEquals')) {\n if (operatorMeta.supportsMultipleValues) {\n // Multi-select date picker (for notEquals that supports multiple values)\n return (\n <div className=\"space-y-2\">\n {/* Selected dates display */}\n {values.length > 0 && (\n <div className=\"flex flex-wrap gap-1\">\n {values.map((value, index) => (\n <div\n key={index}\n className=\"inline-flex items-center bg-blue-100 text-blue-800 text-xs px-2 py-1 rounded border border-blue-200\"\n >\n <span className=\"mr-1\">{String(value)}</span>\n <button\n onClick={() => handleValueRemove(value)}\n className=\"text-blue-600 hover:text-blue-800 focus:outline-none\"\n >\n <XMarkIcon className=\"w-3 h-3\" />\n </button>\n </div>\n ))}\n </div>\n )}\n \n {/* Add new date */}\n <input\n type=\"date\"\n onChange={(e) => {\n if (e.target.value && !values.includes(e.target.value)) {\n onValuesChange([...values, e.target.value])\n e.target.value = '' // Clear the input\n }\n }}\n className=\"text-sm border border-gray-300 rounded px-2 py-1 focus:ring-2 focus:ring-blue-500 focus:border-blue-500\"\n placeholder=\"Add date...\"\n />\n </div>\n )\n } else {\n // Single date picker\n return (\n <input\n type=\"date\"\n value={values[0] || ''}\n onChange={handleDateInput}\n className=\"text-sm border border-gray-300 rounded px-2 py-1 focus:ring-2 focus:ring-blue-500 focus:border-blue-500\"\n />\n )\n }\n }\n \n if (shouldShowComboBox) {\n // Combo box with API-fetched values\n return (\n <div className=\"relative\" ref={dropdownRef}>\n {/* Selected values display (for multi-select) */}\n {operatorMeta.supportsMultipleValues && values.length > 0 && (\n <div className=\"flex flex-wrap gap-1 mb-2\">\n {values.map((value, index) => (\n <div\n key={index}\n className=\"inline-flex items-center bg-blue-100 text-blue-800 text-xs px-2 py-1 rounded border border-blue-200\"\n >\n <span className=\"mr-1\">{String(value)}</span>\n <button\n onClick={() => handleValueRemove(value)}\n className=\"text-blue-600 hover:text-blue-800 focus:outline-none\"\n >\n <XMarkIcon className=\"w-3 h-3\" />\n </button>\n </div>\n ))}\n </div>\n )}\n \n {/* Single value display (for single-select) */}\n {!operatorMeta.supportsMultipleValues && values.length > 0 && (\n <div className=\"mb-2\">\n <div className=\"inline-flex items-center bg-blue-100 text-blue-800 text-xs px-2 py-1 rounded border border-blue-200\">\n <span className=\"mr-1\">{String(values[0])}</span>\n <button\n onClick={() => onValuesChange([])}\n className=\"text-blue-600 hover:text-blue-800 focus:outline-none\"\n >\n <XMarkIcon className=\"w-3 h-3\" />\n </button>\n </div>\n </div>\n )}\n \n {/* Dropdown trigger */}\n <button\n onClick={handleDropdownToggle}\n className=\"w-full text-left text-sm border border-gray-300 rounded px-2 py-1 bg-white hover:bg-gray-50 focus:ring-2 focus:ring-blue-500 focus:border-blue-500 flex items-center justify-between min-w-0\"\n >\n <span className=\"text-gray-500 truncate\">\n {valuesLoading && !hasLoadedInitial ? 'Loading values...' : 'Select value...'}\n </span>\n <ChevronDownIcon className=\"w-4 h-4 text-gray-400\" />\n </button>\n \n {/* Dropdown menu */}\n {isOpen && (\n <div className=\"absolute z-30 left-0 right-0 mt-1 bg-white border border-gray-300 rounded-md shadow-lg max-h-60 overflow-y-auto\">\n {/* Search input */}\n <div className=\"p-2 border-b border-gray-200\">\n <input\n type=\"text\"\n value={searchText}\n onChange={handleSearchChange}\n placeholder=\"Search values...\"\n className=\"w-full text-sm border border-gray-300 rounded px-2 py-1 focus:ring-2 focus:ring-blue-500 focus:border-blue-500\"\n autoFocus\n />\n </div>\n \n {/* Values list */}\n <div className=\"max-h-48 overflow-y-auto\">\n {valuesLoading ? (\n <div className=\"p-2 text-sm text-gray-500\">\n {searchText ? 'Searching...' : 'Loading values...'}\n </div>\n ) : valuesError ? (\n <div className=\"p-2 text-sm text-red-600\">\n Error loading values: {valuesError}\n </div>\n ) : distinctValues.length === 0 ? (\n <div className=\"p-2 text-sm text-gray-500\">\n {searchText ? 'No matching values' : 'No values available'}\n </div>\n ) : (\n distinctValues.map((value, index) => {\n const isSelected = values.includes(value)\n \n return (\n <button\n key={`${value}-${index}`}\n onClick={() => handleValueSelect(value)}\n className={`w-full text-left px-3 py-2 text-sm hover:bg-gray-100 focus:outline-none focus:bg-gray-100 ${\n isSelected ? 'bg-blue-50 text-blue-700' : 'text-gray-700'\n }`}\n >\n {String(value)}\n {isSelected && (\n <span className=\"float-right text-blue-600\">✓</span>\n )}\n </button>\n )\n })\n )}\n </div>\n </div>\n )}\n </div>\n )\n }\n \n // Fallback to text input\n return (\n <input\n type=\"text\"\n value={values[0] !== undefined && values[0] !== null ? values[0] : ''}\n onChange={handleDirectInput}\n placeholder={`Enter ${operatorMeta.valueType} value`}\n className=\"text-sm border border-gray-300 rounded px-2 py-1 focus:ring-2 focus:ring-blue-500 focus:border-blue-500\"\n />\n )\n}\n\nexport default FilterValueSelector","/**\n * Utility functions for QueryBuilder components\n */\n\nimport type { CubeQuery, Filter, SimpleFilter, GroupFilter } from '../../types'\nimport type { MetaField, MetaResponse } from './types'\nimport { FILTER_OPERATORS } from './types'\n\n/**\n * Check if a field is selected in the current query\n */\nexport function isFieldSelected(\n fieldName: string, \n fieldType: 'measures' | 'dimensions' | 'timeDimensions',\n query: CubeQuery\n): boolean {\n switch (fieldType) {\n case 'measures':\n return query.measures?.includes(fieldName) || false\n case 'dimensions':\n return query.dimensions?.includes(fieldName) || false\n case 'timeDimensions':\n return query.timeDimensions?.some(td => td.dimension === fieldName) || false\n default:\n return false\n }\n}\n\n/**\n * Get all time dimension fields from schema\n */\nexport function getTimeDimensionFields(schema: MetaResponse): MetaField[] {\n const timeDimensions: MetaField[] = []\n \n schema.cubes.forEach(cube => {\n cube.dimensions.forEach(dimension => {\n if (dimension.type === 'time') {\n timeDimensions.push(dimension)\n }\n })\n })\n \n return timeDimensions\n}\n\n/**\n * Get all non-time dimension fields from schema\n */\nexport function getRegularDimensionFields(schema: MetaResponse): MetaField[] {\n const dimensions: MetaField[] = []\n \n schema.cubes.forEach(cube => {\n cube.dimensions.forEach(dimension => {\n if (dimension.type !== 'time') {\n dimensions.push(dimension)\n }\n })\n })\n \n return dimensions\n}\n\n/**\n * Get all measure fields from schema\n */\nexport function getMeasureFields(schema: MetaResponse): MetaField[] {\n const measures: MetaField[] = []\n \n schema.cubes.forEach(cube => {\n cube.measures.forEach(measure => {\n measures.push(measure)\n })\n })\n \n return measures\n}\n\n/**\n * Check if query has any content (measures, dimensions, or timeDimensions)\n */\nexport function hasQueryContent(query: CubeQuery): boolean {\n return Boolean(\n (query.measures && query.measures.length > 0) ||\n (query.dimensions && query.dimensions.length > 0) ||\n (query.timeDimensions && query.timeDimensions.length > 0)\n )\n}\n\n/**\n * Get count of selected fields across all types\n */\nexport function getSelectedFieldsCount(query: CubeQuery): number {\n let count = 0\n if (query.measures) count += query.measures.length\n if (query.dimensions) count += query.dimensions.length\n if (query.timeDimensions) count += query.timeDimensions.length\n return count\n}\n\n/**\n * Get cube name from field name (e.g., \"Employees.count\" -> \"Employees\")\n */\nexport function getCubeNameFromField(fieldName: string): string {\n return fieldName.split('.')[0]\n}\n\n/**\n * Group fields by cube name\n */\nexport function groupFieldsByCube(fields: MetaField[]): Record<string, MetaField[]> {\n return fields.reduce((groups, field) => {\n const cubeName = getCubeNameFromField(field.name)\n if (!groups[cubeName]) {\n groups[cubeName] = []\n }\n groups[cubeName].push(field)\n return groups\n }, {} as Record<string, MetaField[]>)\n}\n\n/**\n * Clean query object by removing empty arrays\n */\nexport function cleanQuery(query: CubeQuery): CubeQuery {\n const cleanedQuery: CubeQuery = {}\n \n if (query.measures && query.measures.length > 0) {\n cleanedQuery.measures = query.measures\n }\n \n if (query.dimensions && query.dimensions.length > 0) {\n cleanedQuery.dimensions = query.dimensions\n }\n \n if (query.timeDimensions && query.timeDimensions.length > 0) {\n cleanedQuery.timeDimensions = query.timeDimensions\n }\n \n if (query.filters && query.filters.length > 0) {\n cleanedQuery.filters = query.filters\n }\n \n if (query.order) {\n cleanedQuery.order = query.order\n }\n \n if (query.limit) {\n cleanedQuery.limit = query.limit\n }\n \n if (query.offset) {\n cleanedQuery.offset = query.offset\n }\n \n if (query.segments && query.segments.length > 0) {\n cleanedQuery.segments = query.segments\n }\n \n return cleanedQuery\n}\n\n/**\n * Clean a query and transform filters for server compatibility\n * This version transforms GroupFilter to legacy and/or format\n */\nexport function cleanQueryForServer(query: CubeQuery): CubeQuery {\n const cleanedQuery = cleanQuery(query)\n \n // Apply server transformation to filters\n if (cleanedQuery.filters && cleanedQuery.filters.length > 0) {\n cleanedQuery.filters = transformFiltersForServer(cleanedQuery.filters) as any\n }\n \n return cleanedQuery\n}\n\n/**\n * Create an empty query object\n */\nexport function createEmptyQuery(): CubeQuery {\n return {}\n}\n\n/**\n * Filter utility functions\n */\n\n/**\n * Check if a filter is a simple filter\n */\nexport function isSimpleFilter(filter: Filter): filter is SimpleFilter {\n return 'member' in filter && 'operator' in filter && 'values' in filter\n}\n\n/**\n * Check if a filter is a group filter\n */\nexport function isGroupFilter(filter: Filter): filter is GroupFilter {\n return 'type' in filter && 'filters' in filter\n}\n\n/**\n * Check if a filter is an AND filter\n */\nexport function isAndFilter(filter: Filter): filter is GroupFilter {\n return isGroupFilter(filter) && filter.type === 'and'\n}\n\n/**\n * Check if a filter is an OR filter\n */\nexport function isOrFilter(filter: Filter): filter is GroupFilter {\n return isGroupFilter(filter) && filter.type === 'or'\n}\n\n/**\n * Flatten all simple filters from a hierarchical filter structure\n */\nexport function flattenFilters(filters: Filter[]): SimpleFilter[] {\n const simple: SimpleFilter[] = []\n \n const flatten = (filter: Filter) => {\n if (isSimpleFilter(filter)) {\n simple.push(filter)\n } else if (isGroupFilter(filter)) {\n filter.filters.forEach(flatten)\n }\n }\n \n filters.forEach(flatten)\n return simple\n}\n\n/**\n * Get all filterable fields from schema (measures, dimensions, and time dimensions)\n * Returns ALL fields if no query provided, or only query fields if query provided\n */\nexport function getFilterableFields(schema: MetaResponse, query?: CubeQuery): MetaField[] {\n const allFields: MetaField[] = []\n \n schema.cubes.forEach(cube => {\n allFields.push(...cube.measures)\n allFields.push(...cube.dimensions)\n })\n \n // If no query provided, return all fields\n if (!query) {\n return allFields.sort((a, b) => a.name.localeCompare(b.name))\n }\n \n // Get currently selected fields from the query\n const selectedFields = new Set<string>()\n \n // Add measures\n if (query.measures) {\n query.measures.forEach(measure => selectedFields.add(measure))\n }\n \n // Add dimensions\n if (query.dimensions) {\n query.dimensions.forEach(dimension => selectedFields.add(dimension))\n }\n \n // Add time dimensions\n if (query.timeDimensions) {\n query.timeDimensions.forEach(td => selectedFields.add(td.dimension))\n }\n \n // Filter to only include selected fields\n const filterableFields = allFields.filter(field => selectedFields.has(field.name))\n \n return filterableFields.sort((a, b) => a.name.localeCompare(b.name))\n}\n\n/**\n * Get ALL filterable fields from schema, regardless of query selection\n */\nexport function getAllFilterableFields(schema: MetaResponse): MetaField[] {\n const allFields: MetaField[] = []\n \n schema.cubes.forEach(cube => {\n allFields.push(...cube.measures)\n allFields.push(...cube.dimensions)\n })\n \n return allFields.sort((a, b) => a.name.localeCompare(b.name))\n}\n\n/**\n * Get organized filter field options with query fields prioritized at top\n */\nexport function getOrganizedFilterFields(schema: MetaResponse, query?: CubeQuery): {\n queryFields: MetaField[]\n allFields: MetaField[]\n} {\n const allFields = getAllFilterableFields(schema)\n \n if (!query) {\n return {\n queryFields: [],\n allFields\n }\n }\n \n // Get currently selected fields from the query\n const selectedFields = new Set<string>()\n \n // Add measures\n if (query.measures) {\n query.measures.forEach(measure => selectedFields.add(measure))\n }\n \n // Add dimensions\n if (query.dimensions) {\n query.dimensions.forEach(dimension => selectedFields.add(dimension))\n }\n \n // Add time dimensions\n if (query.timeDimensions) {\n query.timeDimensions.forEach(td => selectedFields.add(td.dimension))\n }\n \n // Split fields into query fields and other fields\n const queryFields = allFields.filter(field => selectedFields.has(field.name))\n \n return {\n queryFields,\n allFields\n }\n}\n\n/**\n * Get available operators for a field type\n */\nexport function getAvailableOperators(fieldType: string): Array<{operator: string, label: string}> {\n const operators: Array<{operator: string, label: string}> = []\n \n for (const [operator, meta] of Object.entries(FILTER_OPERATORS)) {\n if (meta.fieldTypes.includes(fieldType)) {\n operators.push({\n operator,\n label: meta.label\n })\n }\n }\n \n return operators\n}\n\n/**\n * Get field type from schema\n */\nexport function getFieldType(fieldName: string, schema: MetaResponse): string {\n for (const cube of schema.cubes) {\n // Check measures\n const measure = cube.measures.find(m => m.name === fieldName)\n if (measure) return measure.type\n \n // Check dimensions\n const dimension = cube.dimensions.find(d => d.name === fieldName)\n if (dimension) return dimension.type\n }\n \n return 'string' // Default fallback\n}\n\n/**\n * Validate a filter\n */\nexport function validateFilter(filter: SimpleFilter, schema: MetaResponse): {\n isValid: boolean\n errors: string[]\n} {\n const errors: string[] = []\n \n // Check if field exists\n const fields = getFilterableFields(schema)\n const fieldExists = fields.some(f => f.name === filter.member)\n \n if (!fieldExists) {\n errors.push(`Field \"${filter.member}\" does not exist`)\n }\n \n // Check if operator is valid for field type\n if (fieldExists) {\n const fieldType = getFieldType(filter.member, schema)\n const operatorMeta = FILTER_OPERATORS[filter.operator]\n \n if (!operatorMeta) {\n errors.push(`Invalid operator \"${filter.operator}\"`)\n } else if (!operatorMeta.fieldTypes.includes(fieldType)) {\n errors.push(`Operator \"${filter.operator}\" is not valid for field type \"${fieldType}\"`)\n } else {\n // Check values\n if (operatorMeta.requiresValues && (!filter.values || filter.values.length === 0)) {\n errors.push(`Operator \"${filter.operator}\" requires values`)\n }\n \n if (!operatorMeta.supportsMultipleValues && filter.values && filter.values.length > 1) {\n errors.push(`Operator \"${filter.operator}\" does not support multiple values`)\n }\n }\n }\n \n return {\n isValid: errors.length === 0,\n errors\n }\n}\n\n/**\n * Count total filters in hierarchical structure\n */\nexport function countFilters(filters: Filter[]): number {\n let count = 0\n \n const countFilter = (filter: Filter) => {\n if (isSimpleFilter(filter)) {\n count++\n } else if (isGroupFilter(filter)) {\n filter.filters.forEach(countFilter)\n }\n }\n \n filters.forEach(countFilter)\n return count\n}\n\n/**\n * Create a new simple filter\n */\nexport function createSimpleFilter(member: string, operator: string = 'equals', values: any[] = []): SimpleFilter {\n return {\n member,\n operator: operator as any,\n values\n }\n}\n\n/**\n * Create a new AND filter group\n */\nexport function createAndFilter(filters: Filter[] = []): GroupFilter {\n return {\n type: 'and',\n filters\n }\n}\n\n/**\n * Create a new OR filter group\n */\nexport function createOrFilter(filters: Filter[] = []): GroupFilter {\n return {\n type: 'or',\n filters\n }\n}\n\n/**\n * Clean up filters by removing any that reference fields not in the current query\n * @deprecated This function is no longer used as we now support filtering on any schema field\n */\nexport function cleanupFilters(filters: Filter[], _query?: CubeQuery): Filter[] {\n // Return filters unchanged - we now support filtering on any field\n return filters || []\n}\n\n/**\n * Clean up filters by removing any that reference fields not in the current query (legacy)\n * Only used for backward compatibility - filters on non-query fields are now supported\n */\nexport function cleanupFiltersLegacy(filters: Filter[], query: CubeQuery): Filter[] {\n if (!filters || filters.length === 0) {\n return []\n }\n \n // Get currently selected fields from the query\n const selectedFields = new Set<string>()\n \n // Add measures\n if (query.measures) {\n query.measures.forEach(measure => selectedFields.add(measure))\n }\n \n // Add dimensions\n if (query.dimensions) {\n query.dimensions.forEach(dimension => selectedFields.add(dimension))\n }\n \n // Add time dimensions\n if (query.timeDimensions) {\n query.timeDimensions.forEach(td => selectedFields.add(td.dimension))\n }\n \n // Recursively clean filters\n const cleanFilter = (filter: Filter): Filter | null => {\n if (isSimpleFilter(filter)) {\n // Remove filter if its field is not selected\n return selectedFields.has(filter.member) ? filter : null\n } else if (isGroupFilter(filter)) {\n // Clean group recursively\n const cleanedFilters = filter.filters.map(cleanFilter).filter(f => f !== null) as Filter[]\n return cleanedFilters.length > 0 ? { type: filter.type, filters: cleanedFilters } : null\n }\n return null\n }\n \n // Clean all filters and remove nulls\n const cleanedFilters = filters.map(cleanFilter).filter(f => f !== null) as Filter[]\n \n return cleanedFilters\n}\n\n/**\n * Transform filters from new GroupFilter format to legacy server format\n * Server expects { and: [...] } and { or: [...] } instead of { type: 'and', filters: [...] }\n */\nexport function transformFiltersForServer(filters: Filter[]): any[] {\n const transformFilter = (filter: Filter): any => {\n if (isSimpleFilter(filter)) {\n return filter\n } else if (isGroupFilter(filter)) {\n const transformedSubFilters = filter.filters.map(transformFilter)\n \n if (filter.type === 'and') {\n return { and: transformedSubFilters }\n } else {\n return { or: transformedSubFilters }\n }\n }\n return filter\n }\n \n return filters.map(transformFilter)\n}\n\n/**\n * Date range utility functions\n */\n\n/**\n * Convert DateRangeType to Cube.js compatible date range format\n */\nexport function convertDateRangeTypeToValue(rangeType: string, number?: number): string {\n const typeMap: Record<string, string> = {\n 'today': 'today',\n 'yesterday': 'yesterday',\n 'this_week': 'this week',\n 'this_month': 'this month',\n 'this_quarter': 'this quarter',\n 'this_year': 'this year',\n 'last_7_days': 'last 7 days',\n 'last_30_days': 'last 30 days',\n 'last_week': 'last week',\n 'last_month': 'last month',\n 'last_quarter': 'last quarter',\n 'last_year': 'last year',\n 'last_12_months': 'last 12 months'\n }\n \n // Handle dynamic ranges with number input\n if (rangeType.startsWith('last_n_') && number !== undefined && number > 0) {\n const unit = rangeType.replace('last_n_', '')\n const unitSingular = unit.slice(0, -1) // Remove 's' for singular form\n return number === 1 ? `last ${unitSingular}` : `last ${number} ${unit}`\n }\n \n return typeMap[rangeType] || rangeType\n}\n\n/**\n * Check if a date range type requires a number input\n */\nexport function requiresNumberInput(rangeType: string): boolean {\n return rangeType.startsWith('last_n_')\n}\n\n/**\n * Format date for Cube.js (YYYY-MM-DD)\n */\nexport function formatDateForCube(date: Date): string {\n return date.toISOString().split('T')[0]\n}\n\n/**\n * Get the time dimensions that have date ranges applied\n */\nexport function getTimeDimensionsWithDateRanges(query: CubeQuery): Record<string, string | string[]> {\n const dateRanges: Record<string, string | string[]> = {}\n \n if (query.timeDimensions) {\n query.timeDimensions.forEach(td => {\n if (td.dateRange) {\n dateRanges[td.dimension] = td.dateRange\n }\n })\n }\n \n return dateRanges\n}\n\n/**\n * Check if a query has any time dimensions\n */\nexport function hasTimeDimensions(query: CubeQuery): boolean {\n return Boolean(query.timeDimensions && query.timeDimensions.length > 0)\n}\n\n/**\n * Transform a Cube.js query from external format to UI internal format\n * This handles format differences between server/API queries and QueryBuilder state\n */\nexport function transformQueryForUI(query: any): CubeQuery {\n if (!query || typeof query !== 'object') {\n return {}\n }\n \n const transformed: CubeQuery = {}\n \n // Copy simple fields if they exist\n if (query.measures) transformed.measures = Array.isArray(query.measures) ? query.measures : []\n if (query.dimensions) transformed.dimensions = Array.isArray(query.dimensions) ? query.dimensions : []\n if (query.timeDimensions) transformed.timeDimensions = Array.isArray(query.timeDimensions) ? query.timeDimensions : []\n if (query.order) transformed.order = query.order\n if (query.limit) transformed.limit = query.limit\n if (query.offset) transformed.offset = query.offset\n if (query.segments) transformed.segments = Array.isArray(query.segments) ? query.segments : []\n \n // Transform filters from server format to UI format\n if (query.filters && Array.isArray(query.filters)) {\n transformed.filters = transformFiltersFromServer(query.filters)\n }\n \n return cleanQuery(transformed)\n}\n\n/**\n * Transform filters from server/API format to UI format\n * Converts {and: [...]} and {or: [...]} to {type: 'and', filters: [...]} format\n */\nfunction transformFiltersFromServer(filters: any[]): Filter[] {\n return filters.map(filter => {\n if (!filter || typeof filter !== 'object') {\n return filter\n }\n \n // Handle legacy {and: [...]} format\n if ('and' in filter && Array.isArray(filter.and)) {\n return {\n type: 'and',\n filters: transformFiltersFromServer(filter.and)\n } as GroupFilter\n }\n \n // Handle legacy {or: [...]} format\n if ('or' in filter && Array.isArray(filter.or)) {\n return {\n type: 'or',\n filters: transformFiltersFromServer(filter.or)\n } as GroupFilter\n }\n \n // Handle new format {type: 'and', filters: [...]} - process recursively\n if ('type' in filter && 'filters' in filter && Array.isArray(filter.filters)) {\n return {\n type: filter.type,\n filters: transformFiltersFromServer(filter.filters)\n } as GroupFilter\n }\n \n // Simple filter - pass through\n return filter as SimpleFilter\n }).filter(Boolean) // Remove any null/undefined values\n}\n\n/**\n * Sorting utility functions\n */\n\n/**\n * Get field title from schema metadata, falling back to field name\n */\nexport function getFieldTitle(fieldName: string, schema: MetaResponse | null): string {\n if (!schema) return fieldName\n \n for (const cube of schema.cubes) {\n // Check measures\n const measure = cube.measures.find(m => m.name === fieldName)\n if (measure) return measure.title || measure.shortTitle || fieldName\n \n // Check dimensions\n const dimension = cube.dimensions.find(d => d.name === fieldName)\n if (dimension) return dimension.title || dimension.shortTitle || fieldName\n }\n \n return fieldName // Fallback to field name if not found\n}\n\n/**\n * Clean up order object by removing fields that are no longer in the query\n */\nexport function cleanupOrder(order: Record<string, 'asc' | 'desc'> | undefined, query: CubeQuery): Record<string, 'asc' | 'desc'> | undefined {\n if (!order) return undefined\n \n const allFields = [\n ...(query.measures || []),\n ...(query.dimensions || []),\n ...(query.timeDimensions || []).map(td => td.dimension)\n ]\n \n const cleanedOrder: Record<string, 'asc' | 'desc'> = {}\n for (const [field, direction] of Object.entries(order)) {\n if (allFields.includes(field)) {\n cleanedOrder[field] = direction\n }\n }\n \n return Object.keys(cleanedOrder).length > 0 ? cleanedOrder : undefined\n}\n\n/**\n * Get sort direction for a field from the order object\n */\nexport function getSortDirection(fieldName: string, order: Record<string, 'asc' | 'desc'> | undefined): 'asc' | 'desc' | null {\n return order?.[fieldName] || null\n}\n\n/**\n * Get tooltip text for sort button based on current direction\n */\nexport function getSortTooltip(direction: 'asc' | 'desc' | null): string {\n switch (direction) {\n case 'asc':\n return 'Sorted ascending (click for descending)'\n case 'desc':\n return 'Sorted descending (click to remove)'\n default:\n return 'Click to sort ascending'\n }\n}\n\n/**\n * Get next sort direction in the cycle: null -> asc -> desc -> null\n */\nexport function getNextSortDirection(current: 'asc' | 'desc' | null): 'asc' | 'desc' | null {\n switch (current) {\n case null:\n return 'asc'\n case 'asc':\n return 'desc'\n case 'desc':\n return null\n default:\n return 'asc'\n }\n}","/**\n * FilterItem Component\n * \n * Renders a single filter with field selection, operator selection, and value input.\n * Handles all the logic for individual filter management.\n */\n\nimport React, { useState, useEffect, useRef } from 'react'\nimport { XMarkIcon, FunnelIcon, ChevronDownIcon, MagnifyingGlassIcon } from '@heroicons/react/24/outline'\nimport { ChartBarIcon, TagIcon, CalendarIcon } from '@heroicons/react/24/solid'\nimport FilterValueSelector from './FilterValueSelector'\nimport type { FilterItemProps, MetaField } from './types'\nimport { getAllFilterableFields, getOrganizedFilterFields, getFieldType, getAvailableOperators } from './utils'\n\nconst FilterItem: React.FC<FilterItemProps> = ({\n filter,\n index,\n onFilterChange,\n onFilterRemove,\n schema,\n query\n}) => {\n const [isFieldDropdownOpen, setIsFieldDropdownOpen] = useState(false)\n const [isOperatorDropdownOpen, setIsOperatorDropdownOpen] = useState(false)\n const [fieldSearchTerm, setFieldSearchTerm] = useState('')\n const containerRef = useRef<HTMLDivElement>(null)\n const searchInputRef = useRef<HTMLInputElement>(null)\n \n // Close dropdowns when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(event.target as Node)) {\n setIsFieldDropdownOpen(false)\n setIsOperatorDropdownOpen(false)\n }\n }\n \n document.addEventListener('mousedown', handleClickOutside)\n return () => document.removeEventListener('mousedown', handleClickOutside)\n }, [])\n \n // Close other dropdowns when opening one\n const handleFieldDropdownToggle = () => {\n setIsOperatorDropdownOpen(false)\n const newOpen = !isFieldDropdownOpen\n setIsFieldDropdownOpen(newOpen)\n setFieldSearchTerm('') // Reset search when toggling\n \n // Focus search input when opening\n if (newOpen) {\n setTimeout(() => searchInputRef.current?.focus(), 50)\n }\n }\n \n const handleOperatorDropdownToggle = () => {\n setIsFieldDropdownOpen(false)\n setIsOperatorDropdownOpen(!isOperatorDropdownOpen)\n }\n \n if (!schema) {\n return (\n <div className=\"text-sm text-gray-500\">\n Schema not loaded\n </div>\n )\n }\n \n // Get all available fields and organize them\n const allFields = getAllFilterableFields(schema)\n const { queryFields } = getOrganizedFilterFields(schema, query)\n const selectedField = allFields.find(f => f.name === filter.member)\n const fieldType = selectedField ? selectedField.type : 'string'\n const availableOperators = getAvailableOperators(fieldType)\n \n // Filter fields based on search term\n const filterFieldsBySearch = (fields: MetaField[]) => {\n if (!fieldSearchTerm) return fields\n const searchTerm = fieldSearchTerm.toLowerCase()\n return fields.filter(field => \n field.name.toLowerCase().includes(searchTerm) ||\n field.title.toLowerCase().includes(searchTerm) ||\n field.shortTitle.toLowerCase().includes(searchTerm)\n )\n }\n \n const filteredQueryFields = filterFieldsBySearch(queryFields)\n const filteredAllFields = filterFieldsBySearch(allFields)\n \n // Helper function to get field type icon\n const getFieldTypeIcon = (field: MetaField) => {\n if (field.type === 'time') {\n return <CalendarIcon className=\"w-3 h-3 text-blue-500\" />\n } else if (['count', 'sum', 'avg', 'min', 'max', 'countDistinct', 'number'].includes(field.type)) {\n return <ChartBarIcon className=\"w-3 h-3 text-amber-500\" />\n } else {\n return <TagIcon className=\"w-3 h-3 text-green-500\" />\n }\n }\n\n // Helper function to get field type badge\n const getFieldTypeBadge = (field: MetaField) => {\n if (field.type === 'time') {\n return <span className=\"text-xs bg-blue-100 text-blue-700 px-1.5 py-0.5 rounded\">T</span>\n } else if (['count', 'sum', 'avg', 'min', 'max', 'countDistinct', 'number'].includes(field.type)) {\n return <span className=\"text-xs bg-amber-100 text-amber-700 px-1.5 py-0.5 rounded\">M</span>\n } else {\n return <span className=\"text-xs bg-green-100 text-green-700 px-1.5 py-0.5 rounded\">D</span>\n }\n }\n\n const handleFieldChange = (fieldName: string) => {\n // When field changes, reset operator and values\n const newFieldType = getFieldType(fieldName, schema)\n const newAvailableOperators = getAvailableOperators(newFieldType)\n const defaultOperator = newAvailableOperators[0]?.operator || 'equals'\n \n onFilterChange(index, {\n member: fieldName,\n operator: defaultOperator as any,\n values: []\n })\n setIsFieldDropdownOpen(false)\n }\n \n const handleOperatorChange = (operator: string) => {\n onFilterChange(index, {\n ...filter,\n operator: operator as any,\n values: [] // Reset values when operator changes\n })\n setIsOperatorDropdownOpen(false)\n }\n \n const handleValuesChange = (values: any[]) => {\n onFilterChange(index, {\n ...filter,\n values\n })\n }\n \n return (\n <div ref={containerRef} className=\"bg-white border border-gray-200 rounded-lg p-3\">\n {/* Responsive layout - stacks on mobile, single row on desktop */}\n <div className=\"flex flex-col sm:flex-row sm:items-center gap-3 min-w-0\">\n {/* Row 1 on mobile: Filter icon and field selection */}\n <div className=\"flex items-center gap-2 flex-1 min-w-0\">\n <FunnelIcon className=\"w-4 h-4 text-gray-500 flex-shrink-0\" />\n \n {/* Field selection */}\n <div className=\"relative flex-1 min-w-0\">\n <button\n onClick={handleFieldDropdownToggle}\n className=\"w-full flex items-center justify-between text-left text-sm border border-gray-300 rounded px-2 py-1 bg-white hover:bg-gray-50 focus:ring-2 focus:ring-blue-500 focus:border-blue-500 min-w-0\"\n >\n <span className=\"truncate\">\n {selectedField ? (\n <span className=\"font-medium\">{selectedField.name}</span>\n ) : (\n <span className=\"text-gray-500\">Select field...</span>\n )}\n </span>\n <ChevronDownIcon className={`w-4 h-4 text-gray-400 flex-shrink-0 ml-1 transition-transform ${\n isFieldDropdownOpen ? 'transform rotate-180' : ''\n }`} />\n </button>\n \n {isFieldDropdownOpen && (\n <div className=\"absolute z-20 left-0 right-0 mt-1 bg-white border border-gray-300 rounded-md shadow-lg max-h-80 overflow-hidden\">\n {/* Search input */}\n <div className=\"p-2 border-b border-gray-200\">\n <div className=\"relative\">\n <MagnifyingGlassIcon className=\"w-4 h-4 absolute left-2 top-1/2 transform -translate-y-1/2 text-gray-400\" />\n <input\n ref={searchInputRef}\n type=\"text\"\n placeholder=\"Search fields...\"\n value={fieldSearchTerm}\n onChange={(e) => setFieldSearchTerm(e.target.value)}\n className=\"w-full pl-8 pr-3 py-1.5 text-sm border border-gray-300 rounded focus:ring-1 focus:ring-blue-500 focus:border-blue-500\"\n />\n </div>\n </div>\n \n {/* Fields list */}\n <div className=\"max-h-60 overflow-y-auto\">\n {/* Query fields section */}\n {filteredQueryFields.length > 0 && (\n <div>\n <div className=\"px-3 py-1.5 text-xs font-medium text-gray-500 bg-gray-50 border-b\">\n Fields in Query ({filteredQueryFields.length})\n </div>\n {filteredQueryFields.map((field) => (\n <button\n key={`query-${field.name}`}\n onClick={() => handleFieldChange(field.name)}\n className={`w-full text-left px-3 py-2 text-sm hover:bg-gray-100 focus:outline-none focus:bg-gray-100 ${\n field.name === filter.member ? 'bg-blue-50 text-blue-700' : 'text-gray-700'\n }`}\n >\n <div className=\"flex items-center gap-2\">\n {getFieldTypeIcon(field)}\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2\">\n <span className=\"font-medium truncate\">{field.name}</span>\n {getFieldTypeBadge(field)}\n </div>\n {field.title !== field.name && (\n <div className=\"text-xs text-gray-500 truncate\">{field.title}</div>\n )}\n </div>\n </div>\n </button>\n ))}\n </div>\n )}\n \n {/* All fields section */}\n <div>\n {filteredQueryFields.length > 0 && (\n <div className=\"px-3 py-1.5 text-xs font-medium text-gray-500 bg-gray-50 border-b\">\n All Available Fields ({filteredAllFields.length})\n </div>\n )}\n {filteredAllFields.map((field) => (\n <button\n key={`all-${field.name}`}\n onClick={() => handleFieldChange(field.name)}\n className={`w-full text-left px-3 py-2 text-sm hover:bg-gray-100 focus:outline-none focus:bg-gray-100 ${\n field.name === filter.member ? 'bg-blue-50 text-blue-700' : 'text-gray-700'\n }`}\n >\n <div className=\"flex items-center gap-2\">\n {getFieldTypeIcon(field)}\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2\">\n <span className=\"font-medium truncate\">{field.name}</span>\n {getFieldTypeBadge(field)}\n </div>\n {field.title !== field.name && (\n <div className=\"text-xs text-gray-500 truncate\">{field.title}</div>\n )}\n </div>\n </div>\n </button>\n ))}\n </div>\n \n {/* No results message */}\n {filteredAllFields.length === 0 && (\n <div className=\"px-3 py-4 text-sm text-gray-500 text-center\">\n No fields found matching \"{fieldSearchTerm}\"\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n </div>\n \n {/* Row 2 on mobile: Operator and Value selection */}\n {selectedField && (\n <div className=\"flex items-center gap-2 flex-1 sm:flex-initial min-w-0\">\n {/* Operator selection */}\n <div className=\"relative flex-shrink-0\">\n <button\n onClick={handleOperatorDropdownToggle}\n className=\"w-full sm:w-32 flex items-center justify-between text-left text-sm border border-gray-300 rounded px-2 py-1 bg-white hover:bg-gray-50 focus:ring-2 focus:ring-blue-500 focus:border-blue-500\"\n >\n <span className=\"truncate\">\n {availableOperators.find(op => op.operator === filter.operator)?.label || filter.operator}\n </span>\n <ChevronDownIcon className={`w-4 h-4 text-gray-400 flex-shrink-0 ml-1 transition-transform ${\n isOperatorDropdownOpen ? 'transform rotate-180' : ''\n }`} />\n </button>\n \n {isOperatorDropdownOpen && (\n <div className=\"absolute z-20 left-0 right-0 mt-1 bg-white border border-gray-300 rounded-md shadow-lg max-h-60 overflow-y-auto\">\n {availableOperators.map((operator) => (\n <button\n key={operator.operator}\n onClick={() => handleOperatorChange(operator.operator)}\n className={`w-full text-left px-3 py-2 text-sm hover:bg-gray-100 focus:outline-none focus:bg-gray-100 ${\n operator.operator === filter.operator ? 'bg-blue-50 text-blue-700' : 'text-gray-700'\n }`}\n >\n {operator.label}\n </button>\n ))}\n </div>\n )}\n </div>\n \n {/* Value input */}\n <div className=\"flex-1 min-w-0\">\n <FilterValueSelector\n fieldName={filter.member}\n operator={filter.operator}\n values={filter.values}\n onValuesChange={handleValuesChange}\n schema={schema}\n />\n </div>\n </div>\n )}\n \n {/* Row 3 on mobile: Remove button - positioned at the end */}\n <div className=\"flex justify-end sm:justify-start\">\n <button\n onClick={() => onFilterRemove(index)}\n className=\"text-gray-400 hover:text-red-600 focus:outline-none flex-shrink-0\"\n title=\"Remove filter\"\n >\n <XMarkIcon className=\"w-4 h-4\" />\n </button>\n </div>\n </div>\n </div>\n )\n}\n\nexport default FilterItem","/**\n * FilterGroup Component\n * \n * Handles AND/OR logical groups with support for infinite nesting.\n * Renders child filters with proper indentation and group controls.\n */\n\nimport React, { useState } from 'react'\nimport { XMarkIcon, PlusIcon } from '@heroicons/react/24/outline'\nimport FilterItem from './FilterItem'\nimport type { FilterGroupProps } from './types'\nimport type { SimpleFilter, GroupFilter } from '../../types'\nimport { \n isSimpleFilter, \n isGroupFilter,\n createSimpleFilter, \n createAndFilter, \n createOrFilter,\n getFilterableFields\n} from './utils'\n\nconst FilterGroup: React.FC<FilterGroupProps> = ({\n group,\n index,\n onGroupChange,\n onGroupChangeWithUnwrap,\n onGroupRemove,\n schema,\n query,\n depth = 0\n}) => {\n const [showAddMenu, setShowAddMenu] = useState(false)\n \n const isAndGroup = group.type === 'and'\n const groupType = isAndGroup ? 'AND' : 'OR'\n const filters = group.filters\n \n // Style based on depth for visual nesting\n const indentClass = depth > 0 ? `ml-${Math.min(depth * 4, 16)}` : ''\n const borderColor = 'border-slate-200'\n const bgColor = 'bg-slate-50'\n const textColor = 'text-slate-700'\n \n const handleGroupTypeToggle = () => {\n if (isAndGroup) {\n const newGroup = createOrFilter(filters)\n onGroupChange(index, newGroup)\n } else {\n const newGroup = createAndFilter(filters)\n onGroupChange(index, newGroup)\n }\n }\n \n const handleAddSimpleFilter = () => {\n if (!schema) return\n \n // Get the first available field as default\n const filterableFields = getFilterableFields(schema, query)\n const defaultField = filterableFields[0]?.name || ''\n const newFilter = createSimpleFilter(defaultField, 'equals', [])\n const newFilters = [...filters, newFilter]\n \n if (isAndGroup) {\n onGroupChange(index, createAndFilter(newFilters))\n } else {\n onGroupChange(index, createOrFilter(newFilters))\n }\n setShowAddMenu(false)\n }\n \n const handleAddAndGroup = () => {\n if (!schema) return\n \n // Get the first available field as default\n const filterableFields = getFilterableFields(schema, query)\n const defaultField = filterableFields[0]?.name || ''\n const newGroup = createAndFilter([createSimpleFilter(defaultField, 'equals', [])])\n const newFilters = [...filters, newGroup]\n \n if (isAndGroup) {\n onGroupChange(index, createAndFilter(newFilters))\n } else {\n onGroupChange(index, createOrFilter(newFilters))\n }\n setShowAddMenu(false)\n }\n \n const handleAddOrGroup = () => {\n if (!schema) return\n \n // Get the first available field as default\n const filterableFields = getFilterableFields(schema, query)\n const defaultField = filterableFields[0]?.name || ''\n const newGroup = createOrFilter([createSimpleFilter(defaultField, 'equals', [])])\n const newFilters = [...filters, newGroup]\n \n if (isAndGroup) {\n onGroupChange(index, createAndFilter(newFilters))\n } else {\n onGroupChange(index, createOrFilter(newFilters))\n }\n setShowAddMenu(false)\n }\n \n const handleFilterChange = (filterIndex: number, newFilter: SimpleFilter) => {\n const newFilters = [...filters]\n newFilters[filterIndex] = newFilter\n \n if (isAndGroup) {\n onGroupChange(index, createAndFilter(newFilters))\n } else {\n onGroupChange(index, createOrFilter(newFilters))\n }\n }\n \n const handleFilterRemove = (filterIndex: number) => {\n const newFilters = filters.filter((_, i) => i !== filterIndex)\n \n // If no filters left, remove the entire group\n if (newFilters.length === 0) {\n onGroupRemove(index)\n return\n }\n \n // If only one filter left, use unwrapping handler if available\n if (newFilters.length === 1) {\n const newGroup = group.type === 'and' ? createAndFilter(newFilters) : createOrFilter(newFilters)\n \n if (onGroupChangeWithUnwrap) {\n // Use the unwrapping handler for removal scenarios\n onGroupChangeWithUnwrap(index, newGroup)\n } else {\n // Fallback to regular handler (for nested groups)\n onGroupChange(index, newGroup)\n }\n return\n }\n \n // Otherwise, update the group with remaining filters (preserve the group type)\n const updatedGroup = group.type === 'and' ? createAndFilter(newFilters) : createOrFilter(newFilters)\n onGroupChange(index, updatedGroup)\n }\n \n const handleNestedGroupChange = (filterIndex: number, newGroup: GroupFilter) => {\n const newFilters = [...filters]\n newFilters[filterIndex] = newGroup\n \n if (isAndGroup) {\n onGroupChange(index, createAndFilter(newFilters))\n } else {\n onGroupChange(index, createOrFilter(newFilters))\n }\n }\n \n const handleNestedGroupRemove = (filterIndex: number) => {\n handleFilterRemove(filterIndex)\n }\n \n return (\n <div className={`${indentClass} ${borderColor} border-2 ${bgColor} rounded-lg p-4 space-y-3`}>\n {/* Group header */}\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center space-x-2\">\n <button\n onClick={handleGroupTypeToggle}\n className={`px-3 py-1 rounded text-sm font-semibold ${textColor} border border-current hover:bg-white hover:bg-opacity-20 focus:outline-none focus:ring-2 focus:ring-current focus:ring-opacity-50`}\n >\n {groupType}\n </button>\n <span className=\"text-sm text-gray-600\">\n {filters.length} condition{filters.length !== 1 ? 's' : ''}\n </span>\n </div>\n \n <div className=\"flex items-center space-x-2\">\n {/* Add menu */}\n <div className=\"relative\">\n <button\n onClick={() => setShowAddMenu(!showAddMenu)}\n className=\"text-gray-500 hover:text-gray-700 focus:outline-none\"\n title=\"Add condition\"\n >\n <PlusIcon className=\"w-4 h-4\" />\n </button>\n \n {showAddMenu && (\n <div className=\"absolute right-0 mt-1 w-48 bg-white border border-gray-300 rounded-md shadow-lg z-30\">\n <button\n onClick={handleAddSimpleFilter}\n className=\"w-full text-left px-3 py-2 text-sm hover:bg-gray-100 focus:outline-none focus:bg-gray-100\"\n >\n Add Filter\n </button>\n <button\n onClick={handleAddAndGroup}\n className=\"w-full text-left px-3 py-2 text-sm hover:bg-gray-100 focus:outline-none focus:bg-gray-100\"\n >\n Add AND Group\n </button>\n <button\n onClick={handleAddOrGroup}\n className=\"w-full text-left px-3 py-2 text-sm hover:bg-gray-100 focus:outline-none focus:bg-gray-100\"\n >\n Add OR Group\n </button>\n </div>\n )}\n </div>\n \n {/* Remove group button */}\n <button\n onClick={() => onGroupRemove(index)}\n className=\"text-gray-400 hover:text-red-600 focus:outline-none\"\n title=\"Remove group\"\n >\n <XMarkIcon className=\"w-4 h-4\" />\n </button>\n </div>\n </div>\n \n {/* Group content */}\n <div className=\"space-y-3\">\n {filters.map((filter, filterIndex) => {\n if (isSimpleFilter(filter)) {\n return (\n <FilterItem\n key={filterIndex}\n filter={filter}\n index={filterIndex}\n onFilterChange={handleFilterChange}\n onFilterRemove={handleFilterRemove}\n schema={schema}\n query={query}\n />\n )\n } else if (isGroupFilter(filter)) {\n return (\n <FilterGroup\n key={filterIndex}\n group={filter}\n index={filterIndex}\n onGroupChange={handleNestedGroupChange}\n onGroupRemove={handleNestedGroupRemove}\n schema={schema}\n query={query}\n depth={depth + 1}\n />\n )\n }\n return null\n })}\n \n {/* Empty state */}\n {filters.length === 0 && (\n <div className=\"text-center py-4 text-gray-500 text-sm\">\n No conditions in this group.\n <button\n onClick={handleAddSimpleFilter}\n className=\"ml-2 text-purple-600 hover:text-purple-800 focus:outline-none underline\"\n >\n Add a filter\n </button>\n </div>\n )}\n </div>\n </div>\n )\n}\n\nexport default FilterGroup","/**\n * FilterBuilder Component\n * \n * Main component for managing all filters in the query.\n * Handles the top-level filter state and provides controls for adding new filters and groups.\n */\n\nimport React from 'react'\nimport { PlusIcon, FunnelIcon } from '@heroicons/react/24/outline'\nimport FilterItem from './FilterItem'\nimport FilterGroup from './FilterGroup'\nimport type { FilterBuilderProps } from './types'\nimport type { SimpleFilter, GroupFilter } from '../../types'\nimport { \n isSimpleFilter, \n isGroupFilter,\n isAndFilter, \n isOrFilter, \n createSimpleFilter, \n createAndFilter, \n createOrFilter,\n countFilters,\n getAllFilterableFields\n} from './utils'\n\nconst FilterBuilder: React.FC<FilterBuilderProps> = ({\n filters,\n schema,\n query,\n onFiltersChange\n}) => {\n \n \n const totalFilterCount = countFilters(filters)\n \n // Get all filterable fields from schema\n const allFilterableFields = schema ? getAllFilterableFields(schema) : []\n const hasFilterableFields = allFilterableFields.length > 0\n \n const handleAddSimpleFilter = () => {\n if (!hasFilterableFields) return\n \n // Use the first available field as default\n const defaultField = allFilterableFields[0]?.name || ''\n const newFilter = createSimpleFilter(defaultField, 'equals', [])\n \n // Smart filter grouping logic:\n // - First filter: add as simple filter\n // - Second filter: create AND group with first filter + new filter\n // - Additional filters: add to existing group (AND or OR, respecting current type)\n \n if (filters.length === 0) {\n // First filter - add as simple filter\n onFiltersChange([newFilter])\n } else if (filters.length === 1 && isSimpleFilter(filters[0])) {\n // Second filter - create AND group with existing filter + new filter\n const andGroup = createAndFilter([filters[0], newFilter])\n onFiltersChange([andGroup])\n } else if (filters.length === 1 && isAndFilter(filters[0])) {\n // Additional filter - add to existing AND group\n const existingAndGroup = filters[0]\n const updatedAndGroup = createAndFilter([...existingAndGroup.filters, newFilter])\n onFiltersChange([updatedAndGroup])\n } else if (filters.length === 1 && isOrFilter(filters[0])) {\n // Additional filter - add to existing OR group\n const existingOrGroup = filters[0]\n const updatedOrGroup = createOrFilter([...existingOrGroup.filters, newFilter])\n onFiltersChange([updatedOrGroup])\n } else {\n // Fallback: just add to the end (shouldn't happen with new logic)\n onFiltersChange([...filters, newFilter])\n }\n }\n \n \n const handleFilterChange = (index: number, newFilter: SimpleFilter) => {\n const newFilters = [...filters]\n newFilters[index] = newFilter\n onFiltersChange(newFilters)\n }\n \n const handleFilterRemove = (index: number) => {\n // Simple case: just remove the filter\n // The handleGroupChange method will automatically handle unwrapping if needed\n const newFilters = filters.filter((_, i) => i !== index)\n onFiltersChange(newFilters)\n }\n \n const handleGroupChange = (index: number, newGroup: GroupFilter) => {\n const newFilters = [...filters]\n newFilters[index] = newGroup\n onFiltersChange(newFilters)\n }\n \n const handleGroupChangeWithUnwrap = (index: number, newGroup: GroupFilter) => {\n const newFilters = [...filters]\n \n // Check if the group has been reduced to a single filter and should be unwrapped\n // This is only used during filter removal operations\n if (newGroup.filters.length === 1 && isSimpleFilter(newGroup.filters[0])) {\n // Unwrap the single filter from the group\n newFilters[index] = newGroup.filters[0]\n } else {\n newFilters[index] = newGroup\n }\n \n onFiltersChange(newFilters)\n }\n \n const handleGroupRemove = () => {\n // When removing an AND group, we should remove all filters\n onFiltersChange([])\n }\n \n const handleClearAllFilters = () => {\n onFiltersChange([])\n }\n \n return (\n <div className=\"space-y-4 bg-gray-50 rounded-lg p-4\">\n {/* Header */}\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center\">\n <FunnelIcon className=\"w-4 h-4 text-gray-500 mr-2\" />\n <h4 className=\"text-sm font-semibold text-gray-700\">\n Filters ({totalFilterCount})\n </h4>\n </div>\n \n <div className=\"flex items-center space-x-2\">\n {/* Clear all button */}\n {filters.length > 0 && (\n <button\n onClick={handleClearAllFilters}\n className=\"text-xs text-gray-500 hover:text-red-600 focus:outline-none underline\"\n >\n Clear all\n </button>\n )}\n \n {/* Add Filter button */}\n <button\n onClick={handleAddSimpleFilter}\n disabled={!hasFilterableFields}\n className={`flex items-center space-x-1 px-2 py-1 text-xs font-medium rounded focus:outline-none focus:ring-2 ${\n hasFilterableFields\n ? 'text-purple-700 bg-purple-100 border border-purple-200 hover:bg-purple-200 focus:ring-purple-500'\n : 'text-gray-400 bg-gray-100 border border-gray-200 cursor-not-allowed'\n }`}\n >\n <PlusIcon className=\"w-3 h-3\" />\n <span>Add Filter</span>\n </button>\n </div>\n </div>\n \n {/* Filters list */}\n {filters.length > 0 && (\n <div className=\"space-y-3\">\n {filters.map((filter, index) => {\n \n if (isSimpleFilter(filter)) {\n return (\n <FilterItem\n key={index}\n filter={filter}\n index={index}\n onFilterChange={handleFilterChange}\n onFilterRemove={handleFilterRemove}\n schema={schema}\n query={query}\n />\n )\n } else if (isGroupFilter(filter)) {\n return (\n <FilterGroup\n key={index}\n group={filter}\n index={index}\n onGroupChange={handleGroupChange}\n onGroupChangeWithUnwrap={handleGroupChangeWithUnwrap}\n onGroupRemove={handleGroupRemove}\n schema={schema}\n query={query}\n depth={0}\n />\n )\n }\n return null\n })}\n </div>\n )}\n \n </div>\n )\n}\n\nexport default FilterBuilder","/**\n * DateRangeSelector Component\n * \n * Individual date range selector for a specific time dimension\n * Styled to match FilterItem component exactly\n */\n\nimport React, { useState, useEffect, useRef } from 'react'\nimport { XMarkIcon, CalendarIcon, ChevronDownIcon } from '@heroicons/react/24/outline'\nimport { DATE_RANGE_OPTIONS, type DateRangeType } from './types'\nimport { convertDateRangeTypeToValue, formatDateForCube, requiresNumberInput } from './utils'\n\ninterface DateRangeSelectorProps {\n timeDimension: string\n availableTimeDimensions: string[]\n currentDateRange?: string | string[]\n onDateRangeChange: (timeDimension: string, dateRange: string | string[]) => void\n onTimeDimensionChange: (oldTimeDimension: string, newTimeDimension: string) => void\n onRemove: (timeDimension: string) => void\n}\n\nconst DateRangeSelector: React.FC<DateRangeSelectorProps> = ({\n timeDimension,\n availableTimeDimensions,\n currentDateRange,\n onDateRangeChange,\n onTimeDimensionChange,\n onRemove\n}) => {\n // Parse current date range to determine the type and custom dates\n const getCurrentRangeType = (): DateRangeType => {\n if (!currentDateRange) return 'this_month'\n \n if (Array.isArray(currentDateRange)) {\n return 'custom'\n }\n \n // Check if it's a flexible range with number (e.g., \"last 9 weeks\")\n const flexibleRangeMatch = currentDateRange.match(/^last (\\d+) (days|weeks|months|quarters|years)$/)\n if (flexibleRangeMatch) {\n const [, , unit] = flexibleRangeMatch\n const unitPlural = unit === 'days' ? 'days' : unit === 'weeks' ? 'weeks' : unit === 'months' ? 'months' : unit === 'quarters' ? 'quarters' : 'years'\n return `last_n_${unitPlural}` as DateRangeType\n }\n \n // Find matching predefined range\n for (const option of DATE_RANGE_OPTIONS) {\n if (option.value !== 'custom' && !requiresNumberInput(option.value) && convertDateRangeTypeToValue(option.value) === currentDateRange) {\n return option.value\n }\n }\n \n return 'custom'\n }\n\n const getCurrentDates = (): { startDate: string; endDate: string } => {\n if (Array.isArray(currentDateRange) && currentDateRange.length >= 1) {\n return {\n startDate: currentDateRange[0] || '',\n endDate: currentDateRange[1] || currentDateRange[0] || ''\n }\n }\n \n // Default to today for custom ranges\n const today = formatDateForCube(new Date())\n return { startDate: today, endDate: today }\n }\n\n const getCurrentNumber = (): number => {\n if (!currentDateRange || Array.isArray(currentDateRange)) return 1\n \n // Check if it's a flexible range with number (e.g., \"last 9 weeks\")\n const flexibleRangeMatch = currentDateRange.match(/^last (\\d+) (days|weeks|months|quarters|years)$/)\n if (flexibleRangeMatch) {\n return parseInt(flexibleRangeMatch[1]) || 1\n }\n \n return 1\n }\n\n const [rangeType, setRangeType] = useState<DateRangeType>(getCurrentRangeType())\n const [customDates, setCustomDates] = useState(getCurrentDates())\n const [numberValue, setNumberValue] = useState<number>(getCurrentNumber())\n const [isRangeDropdownOpen, setIsRangeDropdownOpen] = useState(false)\n const [isTimeDimensionDropdownOpen, setIsTimeDimensionDropdownOpen] = useState(false)\n const containerRef = useRef<HTMLDivElement>(null)\n \n // Close dropdowns when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(event.target as Node)) {\n setIsRangeDropdownOpen(false)\n setIsTimeDimensionDropdownOpen(false)\n }\n }\n \n document.addEventListener('mousedown', handleClickOutside)\n return () => document.removeEventListener('mousedown', handleClickOutside)\n }, [])\n\n // Close other dropdowns when opening one\n const handleTimeDimensionDropdownToggle = () => {\n setIsRangeDropdownOpen(false)\n setIsTimeDimensionDropdownOpen(!isTimeDimensionDropdownOpen)\n }\n \n const handleRangeDropdownToggle = () => {\n setIsTimeDimensionDropdownOpen(false)\n setIsRangeDropdownOpen(!isRangeDropdownOpen)\n }\n\n const handleRangeTypeChange = (newRangeType: DateRangeType) => {\n setRangeType(newRangeType)\n setIsRangeDropdownOpen(false)\n \n if (newRangeType === 'custom') {\n // For custom, use current custom dates or default to today\n if (customDates.startDate && customDates.endDate) {\n const dateRange = customDates.startDate === customDates.endDate \n ? customDates.startDate\n : [customDates.startDate, customDates.endDate]\n onDateRangeChange(timeDimension, dateRange)\n }\n } else if (requiresNumberInput(newRangeType)) {\n // For number-based ranges, use the number value\n const cubeRangeValue = convertDateRangeTypeToValue(newRangeType, numberValue)\n onDateRangeChange(timeDimension, cubeRangeValue)\n } else {\n // For predefined ranges, use the converted value\n const cubeRangeValue = convertDateRangeTypeToValue(newRangeType)\n onDateRangeChange(timeDimension, cubeRangeValue)\n }\n }\n\n const handleCustomDateChange = (field: 'startDate' | 'endDate', value: string) => {\n const newCustomDates = { ...customDates, [field]: value }\n setCustomDates(newCustomDates)\n \n if (rangeType === 'custom' && newCustomDates.startDate) {\n const dateRange = !newCustomDates.endDate || newCustomDates.startDate === newCustomDates.endDate\n ? newCustomDates.startDate\n : [newCustomDates.startDate, newCustomDates.endDate]\n onDateRangeChange(timeDimension, dateRange)\n }\n }\n\n const handleNumberChange = (value: number) => {\n setNumberValue(value)\n \n if (requiresNumberInput(rangeType)) {\n const cubeRangeValue = convertDateRangeTypeToValue(rangeType, value)\n onDateRangeChange(timeDimension, cubeRangeValue)\n }\n }\n\n const handleTimeDimensionChange = (newTimeDimension: string) => {\n setIsTimeDimensionDropdownOpen(false)\n onTimeDimensionChange(timeDimension, newTimeDimension)\n }\n\n const selectedRangeLabel = DATE_RANGE_OPTIONS.find(opt => opt.value === rangeType)?.label || 'Custom'\n\n return (\n <div ref={containerRef} className=\"bg-white border border-gray-200 rounded-lg p-3\">\n {/* Responsive layout - stacks on mobile, single row on desktop */}\n <div className=\"flex flex-col sm:flex-row sm:items-center gap-3 min-w-0\">\n {/* Row 1: Filter icon and time dimension field */}\n <div className=\"flex items-center gap-2 flex-1 min-w-0\">\n <CalendarIcon className=\"w-4 h-4 text-gray-500 flex-shrink-0\" />\n \n {/* Time dimension field selector */}\n <div className=\"relative flex-1 min-w-0\">\n <button\n onClick={handleTimeDimensionDropdownToggle}\n className=\"w-full flex items-center justify-between text-left text-sm border border-gray-300 rounded px-2 py-1 bg-white hover:bg-gray-50 focus:ring-2 focus:ring-blue-500 focus:border-blue-500 min-w-0\"\n >\n <span className=\"truncate\">{timeDimension}</span>\n <ChevronDownIcon className={`w-4 h-4 text-gray-400 flex-shrink-0 transition-transform ${\n isTimeDimensionDropdownOpen ? 'transform rotate-180' : ''\n }`} />\n </button>\n \n {isTimeDimensionDropdownOpen && (\n <div className=\"absolute z-20 left-0 right-0 mt-1 bg-white border border-gray-300 rounded-md shadow-lg max-h-60 overflow-y-auto\">\n {availableTimeDimensions.map((td) => (\n <button\n key={td}\n onClick={() => handleTimeDimensionChange(td)}\n className={`w-full text-left px-3 py-2 text-sm hover:bg-gray-100 focus:outline-none focus:bg-gray-100 ${\n td === timeDimension ? 'bg-blue-50 text-blue-700' : 'text-gray-700'\n }`}\n >\n {td}\n </button>\n ))}\n </div>\n )}\n </div>\n </div>\n\n {/* Row 2: Date range selector */}\n <div className=\"flex items-center gap-2 flex-1 sm:flex-initial min-w-0\">\n {/* Range type selector with custom dropdown */}\n <div className=\"relative flex-shrink-0\">\n <button\n onClick={handleRangeDropdownToggle}\n className=\"w-full sm:w-40 flex items-center justify-between text-left text-sm border border-gray-300 rounded px-2 py-1 bg-white hover:bg-gray-50 focus:ring-2 focus:ring-blue-500 focus:border-blue-500\"\n >\n <span className=\"truncate\">{selectedRangeLabel}</span>\n <ChevronDownIcon className={`w-4 h-4 text-gray-400 flex-shrink-0 ml-1 transition-transform ${\n isRangeDropdownOpen ? 'transform rotate-180' : ''\n }`} />\n </button>\n \n {isRangeDropdownOpen && (\n <div className=\"absolute z-20 left-0 right-0 mt-1 bg-white border border-gray-300 rounded-md shadow-lg max-h-60 overflow-y-auto\">\n {DATE_RANGE_OPTIONS.map((option) => (\n <button\n key={option.value}\n onClick={() => handleRangeTypeChange(option.value)}\n className={`w-full text-left px-3 py-2 text-sm hover:bg-gray-100 focus:outline-none focus:bg-gray-100 ${\n option.value === rangeType ? 'bg-blue-50 text-blue-700' : 'text-gray-700'\n }`}\n >\n {option.label}\n </button>\n ))}\n </div>\n )}\n </div>\n </div>\n\n {/* Row 3: Custom date inputs, number input, or remove button */}\n <div className=\"flex items-center gap-2 flex-1 min-w-0\">\n {rangeType === 'custom' ? (\n <>\n {/* Start date */}\n <div className=\"flex-1 min-w-0\">\n <input\n type=\"date\"\n value={customDates.startDate}\n onChange={(e) => handleCustomDateChange('startDate', e.target.value)}\n placeholder=\"dd/mm/yyyy\"\n className=\"w-full text-sm border border-gray-300 rounded px-2 py-1 bg-white hover:bg-gray-50 focus:ring-2 focus:ring-blue-500 focus:border-blue-500\"\n />\n </div>\n \n {/* End date (optional) */}\n <div className=\"flex-1 min-w-0\">\n <input\n type=\"date\"\n value={customDates.endDate}\n onChange={(e) => handleCustomDateChange('endDate', e.target.value)}\n placeholder=\"dd/mm/yyyy\"\n className=\"w-full text-sm border border-gray-300 rounded px-2 py-1 bg-white hover:bg-gray-50 focus:ring-2 focus:ring-blue-500 focus:border-blue-500\"\n />\n </div>\n </>\n ) : requiresNumberInput(rangeType) ? (\n <>\n {/* Number input for flexible ranges */}\n <div className=\"flex-1 min-w-0\">\n <input\n type=\"number\"\n min=\"1\"\n max=\"1000\"\n value={numberValue}\n onChange={(e) => handleNumberChange(Math.max(1, parseInt(e.target.value) || 1))}\n placeholder=\"Number\"\n className=\"w-full text-sm border border-gray-300 rounded px-2 py-1 bg-white hover:bg-gray-50 focus:ring-2 focus:ring-blue-500 focus:border-blue-500\"\n />\n </div>\n \n {/* Unit display */}\n <div className=\"flex-shrink-0 text-sm text-gray-600\">\n {rangeType.replace('last_n_', '').replace('_', ' ')}\n </div>\n </>\n ) : (\n // Empty placeholder to maintain layout consistency\n <div className=\"flex-1\"></div>\n )}\n \n {/* Remove button */}\n <button\n onClick={() => onRemove(timeDimension)}\n className=\"text-gray-400 hover:text-red-600 focus:outline-none flex-shrink-0 p-1\"\n title=\"Remove date range\"\n >\n <XMarkIcon className=\"w-4 h-4\" />\n </button>\n </div>\n </div>\n </div>\n )\n}\n\nexport default DateRangeSelector","/**\n * DateRangeFilter Component\n * \n * Container component for managing date ranges on time dimensions.\n * Shows all time dimensions with date ranges and provides controls for adding new ones.\n */\n\nimport React from 'react'\nimport { PlusIcon } from '@heroicons/react/24/outline'\nimport { CalendarIcon } from '@heroicons/react/24/solid'\nimport DateRangeSelector from './DateRangeSelector'\nimport type { DateRangeFilterProps } from './types'\nimport { getTimeDimensionsWithDateRanges } from './utils'\n\nconst DateRangeFilter: React.FC<DateRangeFilterProps> = ({\n timeDimensions,\n onDateRangeChange,\n onDateRangeRemove\n}) => {\n // Get current date ranges from time dimensions\n const currentDateRanges = getTimeDimensionsWithDateRanges({ timeDimensions })\n \n // Get time dimensions that don't have date ranges yet\n const availableTimeDimensions = timeDimensions.filter(td => !td.dateRange)\n \n // Count of time dimensions with date ranges\n const dateRangeCount = Object.keys(currentDateRanges).length\n\n const handleAddDateRange = () => {\n if (availableTimeDimensions.length === 0) return\n \n // Add date range to the first available time dimension with default \"this month\"\n const firstAvailable = availableTimeDimensions[0]\n onDateRangeChange(firstAvailable.dimension, 'this month')\n }\n\n const handleClearAllDateRanges = () => {\n // Remove all date ranges\n Object.keys(currentDateRanges).forEach(timeDimension => {\n onDateRangeRemove(timeDimension)\n })\n }\n\n // Don't render if there are no time dimensions\n if (!timeDimensions || timeDimensions.length === 0) {\n return null\n }\n\n return (\n <div className=\"space-y-4 bg-gray-50 rounded-lg p-4\">\n {/* Header */}\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center\">\n <CalendarIcon className=\"w-4 h-4 text-gray-500 mr-2\" />\n <h4 className=\"text-sm font-semibold text-gray-700\">\n Date Ranges ({dateRangeCount})\n </h4>\n </div>\n \n <div className=\"flex items-center space-x-2\">\n {/* Clear all button */}\n {dateRangeCount > 0 && (\n <button\n onClick={handleClearAllDateRanges}\n className=\"text-xs text-gray-500 hover:text-red-600 focus:outline-none underline\"\n >\n Clear all\n </button>\n )}\n \n {/* Add Date Range button */}\n <button\n onClick={handleAddDateRange}\n disabled={availableTimeDimensions.length === 0}\n className={`flex items-center space-x-1 px-2 py-1 text-xs font-medium rounded focus:outline-none focus:ring-2 ${\n availableTimeDimensions.length > 0\n ? 'text-purple-700 bg-purple-100 border border-purple-200 hover:bg-purple-200 focus:ring-purple-500'\n : 'text-gray-400 bg-gray-100 border border-gray-200 cursor-not-allowed'\n }`}\n title={availableTimeDimensions.length === 0 ? 'All time dimensions already have date ranges' : 'Add date range'}\n >\n <PlusIcon className=\"w-3 h-3\" />\n <span>Add Date Range</span>\n </button>\n </div>\n </div>\n \n {/* Date Range List */}\n {dateRangeCount > 0 && (\n <div className=\"space-y-3\">\n {timeDimensions.map(td => {\n if (!td.dateRange) return null\n \n const allTimeDimensions = timeDimensions.map(t => t.dimension)\n \n return (\n <DateRangeSelector\n key={td.dimension}\n timeDimension={td.dimension}\n availableTimeDimensions={allTimeDimensions}\n currentDateRange={td.dateRange}\n onDateRangeChange={onDateRangeChange}\n onTimeDimensionChange={(oldTd, newTd) => {\n // Remove date range from old time dimension and add it to new one\n onDateRangeRemove(oldTd)\n onDateRangeChange(newTd, td.dateRange!)\n }}\n onRemove={onDateRangeRemove}\n />\n )\n })}\n </div>\n )}\n \n </div>\n )\n}\n\nexport default DateRangeFilter","/**\n * QueryPanel Component\n * \n * Displays the current query being built, with sections for measures, dimensions, and time dimensions.\n * Includes validation status, JSON preview, and action buttons.\n */\n\nimport React, { useState, useEffect } from 'react'\nimport { XMarkIcon, CheckCircleIcon, ExclamationCircleIcon, TrashIcon, ClipboardDocumentIcon, CogIcon, FunnelIcon, SparklesIcon, ChevronUpIcon, ChevronDownIcon, ChevronUpDownIcon } from '@heroicons/react/24/outline'\nimport { ChartBarIcon, TagIcon, CalendarIcon, PlayIcon, CheckIcon } from '@heroicons/react/24/solid'\nimport FilterBuilder from './FilterBuilder'\nimport DateRangeFilter from './DateRangeFilter'\nimport type { QueryPanelProps } from './types'\nimport { TIME_GRANULARITIES } from './types'\nimport { hasQueryContent, getSelectedFieldsCount, cleanQueryForServer, hasTimeDimensions, getFieldTitle, getSortDirection, getSortTooltip, getNextSortDirection } from './utils'\n\nconst QueryPanel: React.FC<QueryPanelProps> = ({\n query,\n schema,\n validationStatus,\n validationError,\n validationSql,\n onValidate,\n onExecute,\n onRemoveField,\n onTimeDimensionGranularityChange,\n onFiltersChange,\n onDateRangeChange,\n onDateRangeRemove,\n onOrderChange,\n onClearQuery,\n showSettings,\n onSettingsClick,\n onAIAssistantClick\n}) => {\n const [showJsonPreview, setShowJsonPreview] = useState(false)\n const [showSqlPreview, setShowSqlPreview] = useState(false)\n\n // Trigger Prism highlighting when preview content changes\n useEffect(() => {\n if ((showJsonPreview || showSqlPreview) && typeof window !== 'undefined' && (window as any).Prism) {\n // Use setTimeout to ensure DOM is updated before highlighting\n setTimeout(() => {\n try {\n ;(window as any).Prism.highlightAll()\n } catch (error) {\n // Silently fail if Prism is not available or encounters an error\n console.debug('Prism highlighting failed:', error)\n }\n }, 0)\n }\n }, [showJsonPreview, showSqlPreview, query, validationSql])\n\n const hasContent = hasQueryContent(query)\n const selectedCount = getSelectedFieldsCount(query)\n \n const handleCopyQuery = async () => {\n const cleanedQuery = cleanQueryForServer(query)\n try {\n await navigator.clipboard.writeText(JSON.stringify(cleanedQuery, null, 2))\n // You could add a toast notification here if desired\n } catch (error) {\n console.error('Failed to copy query:', error)\n // Fallback for older browsers\n const textArea = document.createElement('textarea')\n textArea.value = JSON.stringify(cleanedQuery, null, 2)\n document.body.appendChild(textArea)\n textArea.select()\n document.execCommand('copy')\n document.body.removeChild(textArea)\n }\n }\n\n // Helper function to check if a field has filters applied\n const hasFiltersApplied = (fieldName: string, fieldType: 'measures' | 'dimensions' | 'timeDimensions'): boolean => {\n if (fieldType === 'timeDimensions') {\n // Check if time dimension has a date range\n return Boolean(query.timeDimensions?.some(td => td.dimension === fieldName && td.dateRange))\n } else {\n // Check if field has regular filters applied\n const currentFilters = query.filters || []\n \n const hasFieldInFilters = (filters: any[]): boolean => {\n return filters.some(filter => {\n if ('member' in filter) {\n // Simple filter\n return filter.member === fieldName\n } else if ('type' in filter && 'filters' in filter) {\n // Group filter - check recursively\n return hasFieldInFilters(filter.filters)\n }\n return false\n })\n }\n \n return hasFieldInFilters(currentFilters)\n }\n }\n\n const handleAddFilterFromField = (fieldName: string, fieldType: 'measures' | 'dimensions' | 'timeDimensions') => {\n if (fieldType === 'timeDimensions') {\n // For time dimensions, add a date range instead of a regular filter\n onDateRangeChange(fieldName, 'this month')\n } else {\n // For measures and dimensions, add a regular filter\n // Get current filters and add a new one\n const currentFilters = query.filters || []\n const newFilter = {\n member: fieldName,\n operator: 'equals' as const,\n values: []\n }\n \n // Use the same smart grouping logic as FilterBuilder\n if (currentFilters.length === 0) {\n onFiltersChange([newFilter])\n } else if (currentFilters.length === 1 && 'member' in currentFilters[0]) {\n // Create AND group with existing filter + new filter\n const andGroup = {\n type: 'and' as const,\n filters: [currentFilters[0], newFilter]\n }\n onFiltersChange([andGroup])\n } else if (currentFilters.length === 1 && 'type' in currentFilters[0] && currentFilters[0].type === 'and') {\n // Add to existing AND group\n const existingAndGroup = currentFilters[0]\n const updatedAndGroup = {\n type: 'and' as const,\n filters: [...existingAndGroup.filters, newFilter]\n }\n onFiltersChange([updatedAndGroup])\n } else if (currentFilters.length === 1 && 'type' in currentFilters[0] && currentFilters[0].type === 'or') {\n // Add to existing OR group\n const existingOrGroup = currentFilters[0]\n const updatedOrGroup = {\n type: 'or' as const,\n filters: [...existingOrGroup.filters, newFilter]\n }\n onFiltersChange([updatedOrGroup])\n } else {\n // Fallback: just add to the end\n onFiltersChange([...currentFilters, newFilter])\n }\n }\n }\n\n // Sorting helper functions\n const getSortIcon = (direction: 'asc' | 'desc' | null) => {\n switch (direction) {\n case 'asc':\n return <ChevronUpIcon className={`w-4 h-4 ${direction ? 'stroke-[3]' : ''}`} />\n case 'desc':\n return <ChevronDownIcon className={`w-4 h-4 ${direction ? 'stroke-[3]' : ''}`} />\n default:\n return <ChevronUpDownIcon className=\"w-4 h-4\" />\n }\n }\n\n const handleToggleSort = (fieldName: string) => {\n const current = getSortDirection(fieldName, query.order)\n const next = getNextSortDirection(current)\n onOrderChange(fieldName, next)\n }\n\n const getSortButtonClasses = (fieldName: string, fieldType: 'measures' | 'dimensions' | 'timeDimensions') => {\n const sortDirection = getSortDirection(fieldName, query.order)\n const baseClasses = 'focus:outline-none flex-shrink-0 p-1 transition-colors'\n \n if (sortDirection) {\n // Active sort - use field type colors\n switch (fieldType) {\n case 'measures':\n return `${baseClasses} text-amber-800 hover:text-amber-900`\n case 'dimensions':\n return `${baseClasses} text-green-800 hover:text-green-900`\n case 'timeDimensions':\n return `${baseClasses} text-blue-800 hover:text-blue-900`\n default:\n return `${baseClasses} text-blue-800 hover:text-blue-900`\n }\n } else {\n // No sort - gray\n return `${baseClasses} text-gray-400 hover:text-gray-600`\n }\n }\n\n const RemovableChip: React.FC<{ \n label: string\n fieldName: string\n fieldType: 'measures' | 'dimensions' | 'timeDimensions'\n icon: React.ReactNode\n }> = ({ fieldName, fieldType, icon }) => {\n const getChipClasses = () => {\n switch (fieldType) {\n case 'measures':\n return 'bg-amber-100 text-amber-800 border-amber-200'\n case 'dimensions':\n return 'bg-green-100 text-green-800 border-green-200'\n case 'timeDimensions':\n return 'bg-blue-100 text-blue-800 border-blue-200'\n default:\n return 'bg-blue-100 text-blue-800 border-blue-200'\n }\n }\n\n return (\n <div className={`inline-flex items-center text-sm px-3 py-2 rounded-lg border w-full ${getChipClasses()}`}>\n <div className=\"mr-2 flex-shrink-0\">\n {icon}\n </div>\n <span className=\"flex-1 flex flex-col min-w-0\">\n <span className=\"text-xs font-medium truncate\">{getFieldTitle(fieldName, schema)}</span>\n <span className=\"text-[10px] text-gray-500 truncate\">{fieldName}</span>\n </span>\n <div className=\"flex items-center gap-2 ml-2\">\n {/* Filter and Sort buttons - stacked vertically */}\n <div className=\"flex flex-col items-center\">\n {/* Filter button */}\n {(() => {\n const hasFilters = hasFiltersApplied(fieldName, fieldType)\n const getActiveColorClasses = () => {\n switch (fieldType) {\n case 'measures':\n return 'text-amber-800 hover:text-amber-900'\n case 'dimensions':\n return 'text-green-800 hover:text-green-900'\n case 'timeDimensions':\n return 'text-blue-800 hover:text-blue-900'\n default:\n return 'text-blue-800 hover:text-blue-900'\n }\n }\n \n return (\n <button\n onClick={() => handleAddFilterFromField(fieldName, fieldType)}\n className={`focus:outline-none flex-shrink-0 p-0.5 transition-colors ${\n hasFilters \n ? getActiveColorClasses()\n : 'text-gray-400 hover:text-gray-600'\n }`}\n title={fieldType === 'timeDimensions' ? 'Add date range' : 'Add filter'}\n >\n <FunnelIcon className={`w-4 h-4 ${hasFilters ? 'stroke-[3]' : ''}`} />\n </button>\n )\n })()}\n \n {/* Sort button */}\n <button\n onClick={() => handleToggleSort(fieldName)}\n className={`focus:outline-none flex-shrink-0 p-0.5 transition-colors ${getSortButtonClasses(fieldName, fieldType).replace('p-1', 'p-0.5')}`}\n title={getSortTooltip(getSortDirection(fieldName, query.order))}\n >\n {getSortIcon(getSortDirection(fieldName, query.order))}\n </button>\n </div>\n \n {/* Remove button */}\n <button\n onClick={() => onRemoveField(fieldName, fieldType)}\n className=\"text-gray-600 hover:text-red-600 focus:outline-none flex-shrink-0\"\n >\n <XMarkIcon className=\"w-4 h-4\" />\n </button>\n </div>\n </div>\n )\n }\n\n const TimeDimensionChip: React.FC<{ \n timeDimension: { dimension: string; granularity?: string }\n label: string\n }> = ({ timeDimension }) => (\n <div className=\"bg-blue-100 text-blue-800 text-sm px-3 py-2 rounded-lg border border-blue-200 w-full\">\n {/* Top row with icon, label, filter button, sort button, and remove button */}\n <div className=\"flex items-center mb-1\">\n <div className=\"mr-2\">\n <CalendarIcon className=\"w-4 h-4\" />\n </div>\n <span className=\"flex-1 flex flex-col min-w-0\">\n <span className=\"text-xs font-medium truncate\">{getFieldTitle(timeDimension.dimension, schema)}</span>\n <span className=\"text-[10px] text-gray-500 truncate\">{timeDimension.dimension}</span>\n </span>\n <div className=\"flex items-center gap-2 ml-2\">\n {/* Filter and Sort buttons - stacked vertically */}\n <div className=\"flex flex-col items-center\">\n {/* Filter button */}\n {(() => {\n const hasDateRange = hasFiltersApplied(timeDimension.dimension, 'timeDimensions')\n return (\n <button\n onClick={() => handleAddFilterFromField(timeDimension.dimension, 'timeDimensions')}\n className={`focus:outline-none flex-shrink-0 p-0.5 transition-colors ${\n hasDateRange \n ? 'text-blue-800 hover:text-blue-900' \n : 'text-gray-400 hover:text-gray-600'\n }`}\n title=\"Add date range\"\n >\n <FunnelIcon className={`w-4 h-4 ${hasDateRange ? 'stroke-[3]' : ''}`} />\n </button>\n )\n })()}\n \n {/* Sort button */}\n <button\n onClick={() => handleToggleSort(timeDimension.dimension)}\n className={`focus:outline-none flex-shrink-0 p-0.5 transition-colors ${getSortButtonClasses(timeDimension.dimension, 'timeDimensions').replace('p-1', 'p-0.5')}`}\n title={getSortTooltip(getSortDirection(timeDimension.dimension, query.order))}\n >\n {getSortIcon(getSortDirection(timeDimension.dimension, query.order))}\n </button>\n </div>\n \n {/* Remove button */}\n <button\n onClick={() => onRemoveField(timeDimension.dimension, 'timeDimensions')}\n className=\"text-gray-600 hover:text-red-600 focus:outline-none\"\n >\n <XMarkIcon className=\"w-4 h-4\" />\n </button>\n </div>\n </div>\n {/* Bottom row with granularity dropdown */}\n <div className=\"ml-6 flex items-center\">\n <span className=\"text-xs text-blue-700 mr-2\">Granularity:</span>\n <select\n value={timeDimension.granularity || 'month'}\n onChange={(e) => onTimeDimensionGranularityChange(timeDimension.dimension, e.target.value)}\n className=\"bg-blue-100 border-none text-blue-800 text-xs rounded focus:ring-2 focus:ring-blue-500 flex-1\"\n onClick={(e) => e.stopPropagation()}\n >\n {TIME_GRANULARITIES.map(granularity => (\n <option key={granularity.value} value={granularity.value}>\n {granularity.label}\n </option>\n ))}\n </select>\n </div>\n </div>\n )\n\n const ValidationStatusIcon = () => {\n switch (validationStatus) {\n case 'validating':\n return (\n <div className=\"animate-spin rounded-full h-5 w-5 border-b-2 border-blue-600\"></div>\n )\n case 'valid':\n return <CheckCircleIcon className=\"w-5 h-5 text-green-600\" />\n case 'invalid':\n return <ExclamationCircleIcon className=\"w-5 h-5 text-red-600\" />\n default:\n return null\n }\n }\n\n return (\n <div className=\"flex flex-col bg-white border border-gray-200 rounded-lg\">\n {/* Header */}\n <div className=\"p-3 sm:p-4 border-b border-gray-200\">\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"flex items-center gap-1 sm:gap-2 min-w-0\">\n <h3 className=\"text-sm sm:text-lg font-semibold text-gray-900 truncate\">Query Builder</h3>\n {onAIAssistantClick && (\n <button\n onClick={onAIAssistantClick}\n className=\"flex items-center gap-1 px-3 py-2 text-xs font-medium text-purple-700 bg-purple-50 border border-purple-200 rounded-lg hover:bg-purple-100 focus:outline-none focus:ring-2 focus:ring-purple-500 transition-all duration-200 flex-shrink-0\"\n title=\"AI Assistant - Generate queries with AI\"\n >\n <SparklesIcon className=\"w-3 h-3 sm:w-4 sm:h-4\" />\n <span>AI Assistant</span>\n </button>\n )}\n </div>\n <div className=\"flex items-center gap-1 flex-shrink-0\">\n {hasContent && (\n <>\n <span className=\"hidden lg:inline text-xs text-gray-500 mr-1\">\n {selectedCount} field{selectedCount !== 1 ? 's' : ''} selected\n </span>\n <button\n onClick={handleCopyQuery}\n className=\"flex items-center gap-1 px-3 py-2 text-xs font-medium text-purple-700 bg-purple-100 border border-purple-200 rounded hover:bg-purple-200 focus:outline-none focus:ring-2 focus:ring-purple-500\"\n title=\"Copy query to clipboard\"\n >\n <ClipboardDocumentIcon className=\"w-3 h-3\" />\n <span className=\"hidden sm:inline\">Copy Query</span>\n </button>\n {onClearQuery && (\n <button\n onClick={onClearQuery}\n className=\"text-gray-400 hover:text-red-600 focus:outline-none p-2\"\n title=\"Clear all fields\"\n >\n <TrashIcon className=\"w-3 h-3 sm:w-4 sm:h-4\" />\n </button>\n )}\n </>\n )}\n {showSettings && onSettingsClick && (\n <button\n onClick={onSettingsClick}\n className=\"text-gray-400 hover:text-gray-600 focus:outline-none p-2\"\n title=\"API Configuration\"\n >\n <CogIcon className=\"w-3 h-3 sm:w-4 sm:h-4\" />\n </button>\n )}\n <ValidationStatusIcon />\n </div>\n </div>\n </div>\n\n {/* Content */}\n <div className=\"p-4\">\n {!hasContent ? (\n <div className=\"py-8 flex items-center justify-center text-gray-500\">\n <div className=\"text-center\">\n <ChartBarIcon className=\"w-12 h-12 mx-auto text-gray-300 mb-3\" />\n <div className=\"text-sm font-semibold mb-1\">No fields selected</div>\n <div className=\"text-xs\">Select measures, dimensions, or time dimensions from the schema explorer</div>\n </div>\n </div>\n ) : (\n <div className=\"space-y-6\">\n {/* Responsive Layout Grid */}\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\n {/* Dimensions Column */}\n <div className=\"min-h-24\">\n <h4 className=\"text-sm font-semibold text-green-800 mb-3 flex items-center\">\n <TagIcon className=\"w-4 h-4 mr-2\" />\n Dimensions ({(query.dimensions || []).length})\n </h4>\n <div className=\"flex flex-col gap-2\">\n {(query.dimensions || []).map(dimension => (\n <RemovableChip\n key={dimension}\n label={dimension}\n fieldName={dimension}\n fieldType=\"dimensions\"\n icon={<TagIcon className=\"w-4 h-4\" />}\n />\n ))}\n </div>\n </div>\n\n {/* Time Dimensions Column */}\n <div className=\"min-h-24\">\n <h4 className=\"text-sm font-semibold text-blue-800 mb-3 flex items-center\">\n <CalendarIcon className=\"w-4 h-4 mr-2\" />\n Time Dimensions ({(query.timeDimensions || []).length})\n </h4>\n <div className=\"flex flex-col gap-2\">\n {(query.timeDimensions || []).map(timeDimension => (\n <TimeDimensionChip\n key={timeDimension.dimension}\n timeDimension={timeDimension}\n label={timeDimension.dimension}\n />\n ))}\n </div>\n </div>\n\n {/* Measures Column */}\n <div className=\"min-h-24\">\n <h4 className=\"text-sm font-semibold text-amber-800 mb-3 flex items-center\">\n <ChartBarIcon className=\"w-4 h-4 mr-2\" />\n Measures ({(query.measures || []).length})\n </h4>\n <div className=\"flex flex-col gap-2\">\n {(query.measures || []).map(measure => (\n <RemovableChip\n key={measure}\n label={measure}\n fieldName={measure}\n fieldType=\"measures\"\n icon={<ChartBarIcon className=\"w-4 h-4\" />}\n />\n ))}\n </div>\n </div>\n </div>\n\n {/* Date Range Section */}\n {hasTimeDimensions(query) && (\n <div className=\"mt-6\">\n <DateRangeFilter\n timeDimensions={query.timeDimensions || []}\n onDateRangeChange={onDateRangeChange}\n onDateRangeRemove={onDateRangeRemove}\n />\n </div>\n )}\n\n {/* Filters Section */}\n <div className=\"mt-6\">\n <FilterBuilder\n filters={query.filters || []}\n schema={schema}\n query={query}\n onFiltersChange={onFiltersChange}\n />\n </div>\n\n {/* Validation Error */}\n {validationError && (\n <div className=\"bg-red-50 border border-red-200 rounded-lg p-4\">\n <div className=\"flex items-start\">\n <ExclamationCircleIcon className=\"w-5 h-5 text-red-600 mr-2 mt-0.5\" />\n <div>\n <h5 className=\"text-sm font-semibold text-red-800\">Validation Error</h5>\n <p className=\"text-sm text-red-700 mt-1\">{validationError}</p>\n </div>\n </div>\n </div>\n )}\n\n {/* Preview Toggles */}\n <div className=\"space-y-3\">\n <div className=\"flex space-x-4\">\n <button\n onClick={() => {\n const newJsonState = !showJsonPreview\n setShowJsonPreview(newJsonState)\n if (newJsonState) setShowSqlPreview(false) // Hide SQL when showing JSON\n }}\n className=\"text-sm text-gray-600 hover:text-gray-800 focus:outline-none focus:underline\"\n >\n {showJsonPreview ? 'Hide' : 'Show'} JSON Query\n </button>\n {validationSql && (\n <button\n onClick={() => {\n const newSqlState = !showSqlPreview\n setShowSqlPreview(newSqlState)\n if (newSqlState) setShowJsonPreview(false) // Hide JSON when showing SQL\n }}\n className=\"text-sm text-gray-600 hover:text-gray-800 focus:outline-none focus:underline\"\n >\n {showSqlPreview ? 'Hide' : 'Show'} SQL Generated\n </button>\n )}\n </div>\n\n {showJsonPreview && (\n <div className=\"bg-gray-50 border border-gray-200 rounded-lg p-4\">\n <div className=\"text-xs font-semibold text-gray-700 mb-2\">JSON Query:</div>\n <pre className=\"text-gray-700 overflow-x-auto font-mono\" style={{ fontSize: '12px', lineHeight: '1.4' }}>\n <code className=\"language-json\">{JSON.stringify(cleanQueryForServer(query), null, 2)}</code>\n </pre>\n </div>\n )}\n\n {showSqlPreview && validationSql && (\n <div className=\"bg-gray-50 border border-gray-200 rounded-lg p-4\">\n <div className=\"text-xs font-semibold text-gray-700 mb-2\">Generated SQL:</div>\n <pre className=\"text-gray-700 overflow-x-auto whitespace-pre-wrap font-mono\" style={{ fontSize: '12px', lineHeight: '1.4' }}>\n <code className=\"language-sql\">{validationSql.sql.join(';\\n\\n')}</code>\n </pre>\n {validationSql.params && validationSql.params.length > 0 && (\n <>\n <div className=\"text-xs font-semibold text-gray-700 mb-2 mt-4\">Parameters:</div>\n <pre className=\"text-gray-700 overflow-x-auto font-mono\" style={{ fontSize: '12px', lineHeight: '1.4' }}>\n <code className=\"language-json\">{JSON.stringify(validationSql.params, null, 2)}</code>\n </pre>\n </>\n )}\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n\n {/* Actions */}\n {(hasContent || validationStatus === 'valid' || validationStatus === 'invalid') && (\n <div className=\"border-t border-gray-200 p-4\">\n <div className=\"flex space-x-3\">\n <button\n onClick={onValidate}\n disabled={validationStatus === 'validating'}\n className={`flex-1 flex items-center justify-center px-4 py-2 text-sm font-medium rounded-md transition-colors ${\n validationStatus === 'validating'\n ? 'bg-gray-100 text-gray-400 cursor-not-allowed'\n : validationStatus === 'valid'\n ? 'bg-green-100 text-green-800 border border-green-200 hover:bg-green-200'\n : validationStatus === 'invalid'\n ? 'bg-red-100 text-red-800 border border-red-200 hover:bg-red-200'\n : 'bg-purple-100 text-purple-800 border border-purple-200 hover:bg-purple-200'\n }`}\n >\n {validationStatus === 'validating' ? (\n <>\n <div className=\"animate-spin rounded-full h-4 w-4 border-b-2 border-current mr-2\"></div>\n Validating...\n </>\n ) : validationStatus === 'valid' ? (\n <>\n <CheckIcon className=\"w-4 h-4 mr-2\" />\n Re-validate Query\n </>\n ) : validationStatus === 'invalid' ? (\n <>\n <ExclamationCircleIcon className=\"w-4 h-4 mr-2\" />\n Validate Again\n </>\n ) : (\n <>\n <CheckIcon className=\"w-4 h-4 mr-2\" />\n Validate Query\n </>\n )}\n </button>\n\n <button\n onClick={onExecute}\n disabled={validationStatus !== 'valid'}\n className={`flex-1 flex items-center justify-center px-4 py-2 text-sm font-medium rounded-md transition-colors ${\n validationStatus !== 'valid'\n ? 'bg-gray-100 text-gray-400 cursor-not-allowed border border-gray-200'\n : 'bg-green-600 text-white hover:bg-green-700 focus:ring-2 focus:ring-green-500 border border-green-700'\n }`}\n >\n <PlayIcon className=\"w-4 h-4 mr-2\" />\n Run Query\n </button>\n </div>\n </div>\n )}\n </div>\n )\n}\n\nexport default QueryPanel","/**\n * ResultsPanel Component\n * \n * Displays query execution results, loading states, and errors.\n * Reuses the existing DataTable component for result display.\n */\n\nimport React from 'react'\nimport { ExclamationCircleIcon, ClockIcon, CheckCircleIcon, ExclamationTriangleIcon } from '@heroicons/react/24/outline'\nimport { DataTable } from '../../components/charts'\nimport type { ResultsPanelProps } from './types'\n\nconst ResultsPanel: React.FC<ResultsPanelProps> = ({\n executionStatus,\n executionResults,\n executionError,\n query: _query,\n displayLimit = 10,\n onDisplayLimitChange,\n totalRowCount,\n totalRowCountStatus\n}) => {\n\n const LoadingState = () => (\n <div className=\"h-full flex items-center justify-center\">\n <div className=\"text-center\">\n <div className=\"animate-spin rounded-full h-12 w-12 border-b-2 border-blue-600 mx-auto mb-4\"></div>\n <div className=\"text-sm font-semibold text-gray-700 mb-1\">Executing Query...</div>\n <div className=\"text-xs text-gray-500\">Running your query against the cube API</div>\n </div>\n </div>\n )\n\n const ErrorState = () => (\n <div className=\"h-full flex items-center justify-center p-4\">\n <div className=\"text-center max-w-md\">\n <ExclamationCircleIcon className=\"w-12 h-12 mx-auto text-red-500 mb-4\" />\n <div className=\"text-sm font-semibold text-gray-900 mb-2\">Query Execution Failed</div>\n <div className=\"text-sm text-gray-600 mb-4\">\n There was an error executing your query. Please check the query and try again.\n </div>\n {executionError && (\n <div className=\"bg-red-50 border border-red-200 rounded-lg p-3 text-left\">\n <div className=\"text-xs font-mono text-red-800 break-words\">\n {executionError}\n </div>\n </div>\n )}\n </div>\n </div>\n )\n\n const EmptyState = () => (\n <div className=\"h-full flex items-center justify-center\">\n <div className=\"text-center mb-16\">\n <ClockIcon className=\"w-12 h-12 mx-auto text-gray-300 mb-3\" />\n <div className=\"text-sm font-semibold text-gray-700 mb-1\">No Results Yet</div>\n <div className=\"text-xs text-gray-500\">Build and run a query to see results here</div>\n </div>\n </div>\n )\n\n const SuccessState = () => {\n if (!executionResults || executionResults.length === 0) {\n return (\n <div className=\"h-full flex items-center justify-center\">\n <div className=\"text-center\">\n <CheckCircleIcon className=\"w-12 h-12 mx-auto text-green-500 mb-3\" />\n <div className=\"text-sm font-semibold text-gray-700 mb-1\">Query Successful</div>\n <div className=\"text-xs text-gray-500\">No data returned from the query</div>\n </div>\n </div>\n )\n }\n\n return (\n <div className=\"h-full flex flex-col\">\n {/* Results Header */}\n <div className=\"p-4 border-b border-gray-200 bg-gray-50\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center\">\n <CheckCircleIcon className=\"w-5 h-5 text-green-500 mr-2\" />\n <div className=\"flex flex-col\">\n <span className=\"text-sm font-semibold text-gray-700\">\n Query Results ({executionResults.length} row{executionResults.length !== 1 ? 's' : ''} shown)\n </span>\n {totalRowCountStatus === 'success' && totalRowCount !== null && totalRowCount !== undefined && (\n <span className=\"text-xs text-gray-500\">\n Total: {totalRowCount.toLocaleString()} row{totalRowCount !== 1 ? 's' : ''}\n </span>\n )}\n {totalRowCountStatus === 'loading' && (\n <span className=\"text-xs text-gray-500\">\n Counting total rows...\n </span>\n )}\n </div>\n </div>\n {onDisplayLimitChange && (\n <div className=\"flex items-center gap-2\">\n <label className=\"text-xs text-gray-600\">Show:</label>\n <select\n value={displayLimit}\n onChange={(e) => onDisplayLimitChange(Number(e.target.value))}\n className=\"text-xs border border-gray-300 rounded px-2 py-1 focus:outline-none focus:ring-1 focus:ring-blue-500\"\n >\n <option value={10}>10 rows</option>\n <option value={50}>50 rows</option>\n <option value={100}>100 rows</option>\n </select>\n </div>\n )}\n </div>\n \n {/* Performance Warning */}\n {totalRowCountStatus === 'success' && totalRowCount !== null && totalRowCount !== undefined && totalRowCount > 500 && (\n <div className=\"mt-3 bg-yellow-50 border border-yellow-200 rounded-lg p-3 flex items-start\">\n <ExclamationTriangleIcon className=\"w-5 h-5 text-yellow-600 mr-2 flex-shrink-0 mt-0.5\" />\n <div className=\"text-sm text-yellow-800\">\n <span className=\"font-semibold\">Performance Warning:</span> This query returns {totalRowCount.toLocaleString()} rows, \n which may impact performance. Consider adding filters to reduce the dataset size.\n </div>\n </div>\n )}\n </div>\n\n {/* Results Table */}\n <div className=\"flex-1 min-h-0\">\n <DataTable \n data={executionResults} \n height=\"100%\" \n />\n </div>\n </div>\n )\n }\n\n return (\n <div className=\"flex-1 flex flex-col bg-white border border-gray-200 rounded-lg min-h-0\">\n {/* Header */}\n <div className=\"px-4 py-3 border-b border-gray-200 bg-gray-50\">\n <h3 className=\"text-sm font-semibold text-gray-900\">Query Results</h3>\n </div>\n\n {/* Content */}\n <div className=\"flex-1 min-h-0\">\n {executionStatus === 'loading' && <LoadingState />}\n {executionStatus === 'error' && <ErrorState />}\n {executionStatus === 'success' && <SuccessState />}\n {executionStatus === 'idle' && <EmptyState />}\n </div>\n </div>\n )\n}\n\nexport default ResultsPanel","/**\n * SetupPanel Component\n * \n * Provides configuration options for API endpoint and authentication.\n * Only shown in standalone QueryBuilder mode, not in modal contexts.\n */\n\nimport React, { useState } from 'react'\nimport { ChevronDownIcon, ChevronUpIcon, CogIcon, ArrowPathIcon } from '@heroicons/react/24/outline'\nimport type { ApiConfig } from './types'\n\ninterface SetupPanelProps {\n isOpen: boolean\n onToggle: () => void\n config: ApiConfig\n onConfigChange: (config: ApiConfig) => void\n onReset: () => void\n}\n\nconst SetupPanel: React.FC<SetupPanelProps> = ({\n isOpen,\n onToggle,\n config,\n onConfigChange,\n onReset\n}) => {\n const [localConfig, setLocalConfig] = useState<ApiConfig>(config)\n\n const handleApply = () => {\n onConfigChange(localConfig)\n }\n\n const handleReset = () => {\n const defaultConfig = {\n baseApiUrl: '/cubejs-api/v1',\n apiToken: ''\n }\n setLocalConfig(defaultConfig)\n onConfigChange(defaultConfig)\n onReset()\n }\n\n const handleInputChange = (field: keyof ApiConfig, value: string) => {\n setLocalConfig(prev => ({\n ...prev,\n [field]: value\n }))\n }\n\n const hasChanges = JSON.stringify(localConfig) !== JSON.stringify(config)\n const isUsingDefaults = config.baseApiUrl === '/cubejs-api/v1' && config.apiToken === ''\n\n return (\n <div className=\"bg-white border border-gray-200 rounded-lg mb-4\">\n {/* Header */}\n <button\n onClick={onToggle}\n className=\"w-full px-4 py-3 flex items-center justify-between text-left bg-gray-50 rounded-t-lg hover:bg-gray-100 focus:outline-none focus:ring-2 focus:ring-blue-500\"\n >\n <div className=\"flex items-center space-x-2\">\n <CogIcon className=\"w-5 h-5 text-gray-600\" />\n <h3 className=\"text-sm font-semibold text-gray-900\">API Configuration</h3>\n {!isUsingDefaults && (\n <span className=\"inline-flex items-center px-2 py-0.5 rounded text-xs font-medium bg-blue-100 text-blue-800\">\n Custom\n </span>\n )}\n </div>\n {isOpen ? (\n <ChevronUpIcon className=\"w-4 h-4 text-gray-500\" />\n ) : (\n <ChevronDownIcon className=\"w-4 h-4 text-gray-500\" />\n )}\n </button>\n\n {/* Expandable Content */}\n {isOpen && (\n <div className=\"p-4 border-t border-gray-200\">\n <div className=\"space-y-4\">\n {/* Base API URL */}\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">\n Base API URL\n </label>\n <input\n type=\"text\"\n value={localConfig.baseApiUrl}\n onChange={(e) => handleInputChange('baseApiUrl', e.target.value)}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 text-sm\"\n placeholder=\"/cubejs-api/v1\"\n />\n <p className=\"text-xs text-gray-500 mt-1\">\n The base URL for the Cube.js API endpoints\n </p>\n </div>\n\n {/* API Token */}\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">\n API Token\n </label>\n <input\n type=\"password\"\n value={localConfig.apiToken}\n onChange={(e) => handleInputChange('apiToken', e.target.value)}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 text-sm\"\n placeholder=\"Leave empty for no authentication\"\n />\n <p className=\"text-xs text-gray-500 mt-1\">\n Optional bearer token for API authentication\n </p>\n </div>\n\n {/* Status Indicator */}\n <div className=\"bg-gray-50 border border-gray-200 rounded-md p-3\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h4 className=\"text-xs font-medium text-gray-700\">Current Configuration</h4>\n <p className=\"text-xs text-gray-600 mt-1\">\n URL: <span className=\"font-mono\">{config.baseApiUrl}</span>\n </p>\n <p className=\"text-xs text-gray-600\">\n Token: {config.apiToken ? (\n <span className=\"text-green-600\">Configured</span>\n ) : (\n <span className=\"text-gray-500\">Not set</span>\n )}\n </p>\n </div>\n {!isUsingDefaults && (\n <button\n onClick={handleReset}\n className=\"flex items-center space-x-1 px-2 py-1 text-xs font-medium text-gray-600 bg-white border border-gray-300 rounded hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-blue-500\"\n title=\"Reset to defaults\"\n >\n <ArrowPathIcon className=\"w-3 h-3\" />\n <span>Reset</span>\n </button>\n )}\n </div>\n </div>\n\n {/* Action Buttons */}\n {hasChanges && (\n <div className=\"flex justify-end space-x-2 pt-2 border-t border-gray-200\">\n <button\n onClick={() => setLocalConfig(config)}\n className=\"px-3 py-1.5 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-md hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-blue-500\"\n >\n Cancel\n </button>\n <button\n onClick={handleApply}\n className=\"px-3 py-1.5 text-sm font-medium text-white bg-blue-600 border border-transparent rounded-md hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-blue-500\"\n >\n Apply Changes\n </button>\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n )\n}\n\nexport default SetupPanel","/**\n * Constants for AI Assistant\n */\n\nexport const AI_PROXY_BASE_URL = '/api/ai'\nexport const GEMINI_MODEL = 'gemini-2.0-flash'\n\nexport const DEFAULT_SYSTEM_PROMPT_TEMPLATE = `You are a SQL query builder assistant for a semantic layer using Cube.js format.\n\nAvailable cube schema (JSON):\n{CUBE_SCHEMA}\n\nA valid Cube schema can contain things such as below (this is only an example of possible options):\n\n{\n \"measures\": [\"stories.count\"],\n \"dimensions\": [\"stories.category\"],\n \"filters\": [\n {\n \"member\": \"stories.isDraft\",\n \"operator\": \"equals\",\n \"values\": [\"No\"]\n }\n ],\n \"timeDimensions\": [\n {\n \"dimension\": \"stories.time\",\n \"dateRange\": [\"2015-01-01\", \"2015-12-31\"],\n \"granularity\": \"month\"\n }\n ],\n \"limit\": 100,\n \"offset\": 50,\n \"order\": {\n \"stories.time\": \"asc\",\n \"stories.count\": \"desc\"\n }\n}\n\nUser request: {USER_PROMPT}\n\nCRITICAL: You MUST only use field names that exist in the schema above. Do NOT create or invent field names.\n\nGenerate a JSON query object with this structure:\n{\n \"measures\": [\"CubeName.measureName\"],\n \"dimensions\": [\"CubeName.dimensionName\"], \n \"timeDimensions\": [{\n \"dimension\": \"CubeName.timeDimensionName\",\n \"granularity\": \"day|week|month|quarter|year\",\n \"dateRange\": \"last 30 days\"\n }],\n \"filters\": [{\n \"member\": \"CubeName.fieldName\",\n \"operator\": \"equals|contains|gt|gte|lt|lte|inDateRange\",\n \"values\": [\"value1\", \"value2\"]\n }]\n}\n\nRules:\n1. Only use cube names, measure names, and dimension names from the schema\n2. All field references must be in \"CubeName.fieldName\" format\n3. Verify every field exists in the provided schema before using it\n\nRespond with only the JSON query object, no explanation, no markdown formatting, no code blocks, no backtick wrapper.`\n\nexport const AI_STORAGE_KEY = 'drizzle-cube-ai-config'\n\nexport const DEFAULT_AI_CONFIG = {\n provider: 'gemini' as const,\n apiKey: ''\n}","/**\n * Utility functions for AI Assistant\n */\n\nimport type { \n AIQueryRequest,\n AIQueryResponse,\n AIConfig\n} from './types'\nimport { \n AI_STORAGE_KEY,\n DEFAULT_AI_CONFIG\n} from './constants'\n\n/**\n * Send a user prompt to AI proxy (server builds system prompt)\n */\nexport async function sendGeminiMessage(\n apiKey: string,\n userPrompt: string,\n endpoint: string = '/api/ai/generate'\n): Promise<AIQueryResponse> {\n const requestBody: AIQueryRequest = {\n text: userPrompt // Send only the user's prompt, server handles system prompt\n }\n\n // Only add API key header if provided (allow empty string for server key)\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json'\n }\n \n if (apiKey && apiKey.trim()) {\n headers['X-API-Key'] = apiKey\n }\n\n console.log('🤖 Client: Sending user prompt to AI proxy')\n console.log(' URL:', endpoint)\n console.log(' Headers:', headers)\n console.log(' User prompt length:', userPrompt.length)\n\n const response = await fetch(endpoint, {\n method: 'POST',\n headers,\n body: JSON.stringify(requestBody)\n })\n\n console.log('📥 Client: Proxy response')\n console.log(' Status:', response.status)\n console.log(' Status Text:', response.statusText)\n\n if (!response.ok) {\n let errorMessage = `Failed to generate content: ${response.status} ${response.statusText}`\n \n try {\n // Try to parse JSON error response first\n const errorData = await response.json()\n console.error('❌ Client: Proxy error:', errorData)\n \n // Handle rate limit errors specially\n if (response.status === 429 && errorData.error === 'Daily quota exceeded') {\n throw new Error(\n `${errorData.message}\\n\\n${errorData.suggestion || 'Add your own Gemini API key for unlimited access.'}`\n )\n }\n \n // Handle other structured errors\n if (errorData.error) {\n errorMessage = errorData.message || errorData.error\n if (errorData.suggestion) {\n errorMessage += `\\n\\n💡 ${errorData.suggestion}`\n }\n }\n } catch (parseError) {\n // Fallback to text if JSON parsing fails\n try {\n const errorText = await response.text()\n console.error('❌ Client: Proxy text error:', errorText)\n errorMessage = errorText || errorMessage\n } catch (textError) {\n console.error('❌ Client: Could not parse error response')\n }\n }\n \n throw new Error(errorMessage)\n }\n\n const data = await response.json()\n console.log('✅ Client: Successfully generated content')\n return data\n}\n\n// Removed: buildSystemPrompt and formatCubeSchemaForPrompt \n// These functions are now handled server-side for better security\n\n/**\n * Save AI configuration to localStorage\n */\nexport function saveAIConfig(config: AIConfig): void {\n try {\n localStorage.setItem(AI_STORAGE_KEY, JSON.stringify(config))\n } catch (error) {\n console.warn('Failed to save AI config to localStorage:', error)\n }\n}\n\n/**\n * Load AI configuration from localStorage\n */\nexport function loadAIConfig(): AIConfig {\n try {\n const saved = localStorage.getItem(AI_STORAGE_KEY)\n if (saved) {\n const parsed = JSON.parse(saved)\n return { ...DEFAULT_AI_CONFIG, ...parsed }\n }\n } catch (error) {\n console.warn('Failed to load AI config from localStorage:', error)\n }\n return { ...DEFAULT_AI_CONFIG }\n}\n\n/**\n * Extract query text from simplified AI response and clean up formatting\n */\nexport function extractTextFromResponse(response: AIQueryResponse): string {\n const rawText = response.query || ''\n\n // Clean up common markdown formatting that might appear\n return rawText\n .replace(/```json\\s*/g, '') // Remove ```json\n .replace(/```\\s*/g, '') // Remove ```\n .replace(/^\\s*```.*\\n/gm, '') // Remove any remaining code block markers\n .trim()\n}","/**\n * AI Assistant Modal Component\n * \n * Multi-step modal for AI-powered query generation\n * Step 1: API Key input\n * Step 2: Model selection \n * Step 3: Query input and response\n */\n\nimport React, { useState } from 'react'\nimport { ExclamationCircleIcon, CheckCircleIcon, SparklesIcon } from '@heroicons/react/24/outline'\nimport Modal from '../Modal'\nimport type { AIAssistantState } from './types'\nimport {\n sendGeminiMessage,\n loadAIConfig,\n extractTextFromResponse\n} from './utils'\nimport { DEFAULT_SYSTEM_PROMPT_TEMPLATE } from './constants'\n\ninterface AIAssistantModalProps {\n isOpen: boolean\n onClose: () => void\n schema?: any\n onQueryLoad?: (query: any) => void\n aiEndpoint?: string\n}\n\nconst AIAssistantModal: React.FC<AIAssistantModalProps> = ({\n isOpen,\n onClose,\n onQueryLoad,\n aiEndpoint = '/api/ai'\n}) => {\n const [state, setState] = useState<AIAssistantState>(() => {\n const savedConfig = loadAIConfig()\n return {\n step: 'query', // Skip API key step and go straight to query\n apiKey: savedConfig.apiKey || '',\n systemPromptTemplate: DEFAULT_SYSTEM_PROMPT_TEMPLATE,\n userPrompt: '',\n isSubmitting: false,\n response: null,\n responseError: null,\n isValidating: false,\n validationResult: null,\n validationError: null\n }\n })\n\n\n const handleQuerySubmit = async (e?: React.FormEvent) => {\n e?.preventDefault()\n if (!state.userPrompt.trim()) return\n\n setState(prev => ({ \n ...prev, \n isSubmitting: true, \n response: null, \n responseError: null,\n validationResult: null,\n validationError: null,\n isValidating: false\n }))\n\n try {\n // Send only the user prompt - server will handle system prompt building\n const response = await sendGeminiMessage(\n state.apiKey,\n state.userPrompt,\n aiEndpoint\n )\n\n const responseText = extractTextFromResponse(response)\n setState(prev => ({ \n ...prev, \n isSubmitting: false, \n response: responseText \n }))\n \n // Automatically validate after successful generation\n setTimeout(() => {\n validateResponse(responseText)\n }, 500)\n } catch (error) {\n setState(prev => ({\n ...prev,\n isSubmitting: false,\n responseError: error instanceof Error ? error.message : 'Failed to process query'\n }))\n }\n }\n\n // Validate a specific response text (used for auto-validation)\n const validateResponse = async (responseText: string) => {\n if (!responseText) {\n console.log('AI Modal: No response text to validate')\n return\n }\n\n console.log('AI Modal: Starting validation with response:', responseText.substring(0, 100) + '...')\n \n setState(prev => ({\n ...prev,\n isValidating: true,\n validationResult: null,\n validationError: null\n }))\n\n try {\n const query = JSON.parse(responseText)\n console.log('AI Modal: Parsed query:', query)\n \n const response = await fetch('/cubejs-api/v1/load', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(query)\n })\n\n console.log('AI Modal: Validation response status:', response.status)\n\n if (response.ok) {\n console.log('AI Modal: Validation SUCCESS')\n setState(prev => ({\n ...prev,\n isValidating: false,\n validationResult: 'valid'\n }))\n } else {\n const errorData = await response.text()\n console.log('AI Modal: Validation FAILED:', errorData)\n setState(prev => ({\n ...prev,\n isValidating: false,\n validationResult: 'invalid',\n validationError: errorData || `HTTP ${response.status}: ${response.statusText}`\n }))\n }\n } catch (error) {\n console.log('AI Modal: Validation ERROR:', error)\n setState(prev => ({\n ...prev,\n isValidating: false,\n validationResult: 'invalid',\n validationError: error instanceof Error ? error.message : 'Failed to validate query'\n }))\n }\n }\n\n const handleValidate = async () => {\n if (!state.response) return\n await validateResponse(state.response)\n }\n\n const handleUseQuery = () => {\n if (!state.response || !onQueryLoad) return\n\n try {\n const query = JSON.parse(state.response)\n onQueryLoad(query)\n handleClose()\n } catch (error) {\n setState(prev => ({\n ...prev,\n validationError: 'Invalid JSON format'\n }))\n }\n }\n\n const handleClose = () => {\n setState(prev => ({\n ...prev,\n response: null,\n responseError: null,\n validationResult: null,\n validationError: null\n }))\n onClose()\n }\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n handleQuerySubmit()\n }\n }\n\n\n\n const renderQueryStep = () => (\n <div className=\"flex flex-col space-y-4\">\n {/* Top: Config Panel - Full Width */}\n <div className=\"flex-shrink-0 p-3 bg-gray-50 border border-gray-200 rounded-md\">\n <div className=\"text-sm text-gray-600\">\n Using: <span className=\"font-medium\">AI Query Generation</span>\n <span className=\"ml-2 px-2 py-1 bg-blue-100 text-blue-700 text-xs rounded\">\n Server-provided AI (Rate Limited)\n </span>\n </div>\n </div>\n \n {/* Middle: Input/Output Row - Takes remaining space */}\n <div className=\"flex flex-col md:flex-row gap-6 flex-1 min-h-0\">\n {/* Left: Query Input */}\n <div className=\"w-full md:w-1/2 flex flex-col\">\n <label htmlFor=\"user-prompt\" className=\"block text-sm font-medium text-gray-700 mb-2\">\n Describe your query in natural language\n </label>\n <textarea\n id=\"user-prompt\"\n value={state.userPrompt}\n onChange={(e) => setState(prev => ({ ...prev, userPrompt: e.target.value }))}\n onKeyDown={handleKeyDown}\n placeholder=\"e.g., Show me the total revenue by month for the last year (Press Enter to generate, Shift+Enter for new line)\"\n className=\"flex-1 w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 resize-none\"\n required\n />\n </div>\n \n {/* Right: Output Query */}\n <div className=\"w-full md:w-1/2 flex flex-col\">\n <div className=\"flex items-center justify-between mb-2\">\n <div className=\"flex items-center space-x-2\">\n {state.response ? (\n <>\n <CheckCircleIcon className=\"w-5 h-5 text-green-500\" />\n <span className=\"text-sm font-medium text-green-700\">AI Generated Query</span>\n </>\n ) : (\n <span className=\"text-sm font-medium text-gray-500\">Generated Query</span>\n )}\n </div>\n {state.response && (\n <button\n onClick={handleValidate}\n disabled={state.isValidating}\n className=\"text-xs text-blue-600 hover:text-blue-800 disabled:opacity-50\"\n title=\"Click to re-validate query\"\n >\n {state.isValidating ? 'Validating...' : 'Re-validate'}\n </button>\n )}\n </div>\n \n {state.response ? (\n <div className=\"flex-1 bg-green-50 border border-green-200 rounded-md p-3\">\n <pre className=\"text-sm text-gray-800 whitespace-pre-wrap overflow-auto bg-white p-3 rounded border h-full\">\n {state.response}\n </pre>\n </div>\n ) : (\n <div className=\"flex-1 flex items-center justify-center text-gray-500 border-2 border-dashed border-gray-300 rounded-md p-8 min-h-64\">\n <div className=\"text-center\">\n <SparklesIcon className=\"w-12 h-12 mx-auto text-gray-400\" />\n </div>\n </div>\n )}\n </div>\n </div>\n \n {/* Status Messages - Fixed height */}\n <div className=\"flex-shrink-0\">\n {state.responseError && (\n <div className=\"flex items-start space-x-2 p-3 bg-red-50 border border-red-200 rounded-md\">\n <ExclamationCircleIcon className=\"w-5 h-5 text-red-500 mt-0.5 flex-shrink-0\" />\n <div className=\"text-sm text-red-700\">{state.responseError}</div>\n </div>\n )}\n \n {state.isValidating && (\n <div className=\"flex items-start space-x-2 p-3 bg-blue-50 border border-blue-200 rounded-md\">\n <div className=\"animate-spin rounded-full h-5 w-5 border-b-2 border-blue-600 mt-0.5 flex-shrink-0\"></div>\n <div className=\"text-sm text-blue-700\">Validating query...</div>\n </div>\n )}\n \n {state.validationResult === 'valid' && !state.isValidating && (\n <div className=\"flex items-start space-x-2 p-3 bg-green-50 border border-green-200 rounded-md\">\n <CheckCircleIcon className=\"w-5 h-5 text-green-500 mt-0.5 flex-shrink-0\" />\n <div className=\"text-sm text-green-700\">Query is valid and ready to use!</div>\n </div>\n )}\n \n {state.validationResult === 'invalid' && !state.isValidating && (\n <div className=\"flex items-start space-x-2 p-3 bg-red-50 border border-red-200 rounded-md\">\n <ExclamationCircleIcon className=\"w-5 h-5 text-red-500 mt-0.5 flex-shrink-0\" />\n <div className=\"text-sm text-red-700\">\n <div className=\"font-medium mb-1\">Query validation failed:</div>\n <div className=\"text-xs\">{state.validationError}</div>\n </div>\n </div>\n )}\n </div>\n \n {/* Bottom: Action Buttons - Right Aligned */}\n <div className=\"flex-shrink-0 flex justify-end space-x-3 pt-3\">\n <button\n type=\"submit\"\n disabled={!state.userPrompt.trim() || state.isSubmitting}\n onClick={handleQuerySubmit}\n className=\"px-4 py-2 bg-blue-600 text-white text-sm rounded-md hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 disabled:bg-gray-300 disabled:cursor-not-allowed flex items-center\"\n >\n {state.isSubmitting ? (\n <>\n <div className=\"animate-spin rounded-full h-4 w-4 border-b-2 border-white mr-2\"></div>\n Generating...\n </>\n ) : (\n <>\n <SparklesIcon className=\"w-4 h-4 mr-2\" />\n Generate\n </>\n )}\n </button>\n \n {/* Validation happens automatically after generation */}\n \n <button\n onClick={handleUseQuery}\n disabled={!state.response || !onQueryLoad}\n className=\"px-4 py-2 bg-green-600 text-white text-sm rounded-md hover:bg-green-700 focus:outline-none focus:ring-2 focus:ring-green-500 focus:ring-offset-2 disabled:bg-gray-300 disabled:cursor-not-allowed flex items-center\"\n >\n <CheckCircleIcon className=\"w-4 h-4 mr-2\" />\n Use Query\n </button>\n </div>\n </div>\n )\n\n const getTitle = () => {\n return 'AI Assistant - Generate Query'\n }\n\n return (\n <Modal\n isOpen={isOpen}\n onClose={handleClose}\n title={getTitle()}\n size=\"fullscreen-mobile\"\n >\n {renderQueryStep()}\n </Modal>\n )\n}\n\nexport default AIAssistantModal","/**\n * QueryBuilder Component\n * \n * Main component that orchestrates the query building experience.\n * Manages state and coordinates between the meta explorer, query panel, and results panel.\n */\n\nimport { useState, useEffect, useCallback, useRef, forwardRef, useImperativeHandle } from 'react'\nimport { Bars3Icon, XMarkIcon } from '@heroicons/react/24/outline'\nimport { useCubeContext } from '../../providers/CubeProvider'\nimport CubeMetaExplorer from './CubeMetaExplorer'\nimport QueryPanel from './QueryPanel'\nimport ResultsPanel from './ResultsPanel'\nimport SetupPanel from './SetupPanel'\nimport AIAssistantModal from '../AIAssistant/AIAssistantModal'\nimport type { \n QueryBuilderProps, \n QueryBuilderRef,\n QueryBuilderState, \n MetaResponse,\n ValidationResult,\n ApiConfig\n} from './types'\nimport type { Filter } from '../../types'\nimport { createEmptyQuery, hasQueryContent, cleanQuery, cleanQueryForServer, cleanupFilters, transformQueryForUI } from './utils'\n\nconst STORAGE_KEY = 'drizzle-cube-query-builder-state'\nconst API_CONFIG_STORAGE_KEY = 'drizzle-cube-api-config'\n\nconst QueryBuilder = forwardRef<QueryBuilderRef, QueryBuilderProps>(({\n className = '',\n initialQuery,\n disableLocalStorage = false,\n hideSettings = false\n}, ref) => {\n // Get cube client, update function, and features from context\n const { cubeApi, updateApiConfig, features } = useCubeContext()\n \n // Load initial API configuration from localStorage\n const getInitialApiConfig = (): ApiConfig => {\n if (!disableLocalStorage) {\n try {\n const saved = localStorage.getItem(API_CONFIG_STORAGE_KEY)\n if (saved) {\n return JSON.parse(saved)\n }\n } catch (error) {\n console.warn('Failed to load API config from localStorage:', error)\n }\n }\n return {\n baseApiUrl: '/cubejs-api/v1',\n apiToken: ''\n }\n }\n\n // Load initial state from localStorage if available, or use provided initialQuery\n const getInitialState = (): QueryBuilderState => {\n // If initialQuery is provided, use it instead of localStorage\n if (initialQuery) {\n return {\n query: transformQueryForUI(initialQuery),\n schema: null,\n schemaStatus: 'idle',\n schemaError: null,\n validationStatus: 'idle',\n validationError: null,\n validationSql: null,\n executionStatus: 'idle',\n executionResults: null,\n executionError: null,\n totalRowCount: null,\n totalRowCountStatus: 'idle'\n }\n }\n\n // Only check localStorage if not disabled\n if (!disableLocalStorage) {\n try {\n const saved = localStorage.getItem(STORAGE_KEY)\n if (saved) {\n const parsedState = JSON.parse(saved)\n return {\n query: transformQueryForUI(parsedState.query) || createEmptyQuery(),\n schema: null, // Schema is always loaded fresh\n schemaStatus: 'idle', // Reset schema status\n schemaError: null,\n validationStatus: 'idle', // Reset validation status\n validationError: null,\n validationSql: null,\n executionStatus: 'idle', // Reset execution status\n executionResults: null,\n executionError: null,\n totalRowCount: null,\n totalRowCountStatus: 'idle'\n }\n }\n } catch (error) {\n console.warn('Failed to load query from localStorage:', error)\n }\n }\n \n return {\n query: createEmptyQuery(),\n schema: null,\n schemaStatus: 'idle',\n schemaError: null,\n validationStatus: 'idle',\n validationError: null,\n validationSql: null,\n executionStatus: 'idle',\n executionResults: null,\n executionError: null,\n totalRowCount: null,\n totalRowCountStatus: 'idle'\n }\n }\n\n const [state, setState] = useState<QueryBuilderState>(getInitialState())\n \n // Separate state for display limit (doesn't affect the actual query object)\n const [displayLimit, setDisplayLimit] = useState<number>(10)\n \n // API configuration state\n const [apiConfig, setApiConfig] = useState<ApiConfig>(getInitialApiConfig())\n const [showSetupPanel, setShowSetupPanel] = useState(false)\n const [showSchemaMobile, setShowSchemaMobile] = useState(false)\n \n // AI Assistant modal state\n const [showAIAssistant, setShowAIAssistant] = useState(false)\n\n // Update query when initialQuery prop changes (for modal usage)\n useEffect(() => {\n if (initialQuery && JSON.stringify(initialQuery) !== JSON.stringify(state.query)) {\n setState(prev => ({\n ...prev,\n query: transformQueryForUI(initialQuery),\n schemaStatus: 'idle',\n schemaError: null,\n validationStatus: 'idle',\n validationError: null,\n validationSql: null,\n executionStatus: 'idle',\n executionResults: null,\n executionError: null,\n totalRowCount: null,\n totalRowCountStatus: 'idle'\n }))\n }\n }, [initialQuery])\n\n // Track the last validated query to avoid resetting validation on unrelated updates\n const lastValidatedQueryRef = useRef<string>('')\n\n // Note: API configuration is kept for backward compatibility but not used \n // since we now use the CubeClient from context\n\n // Store the full validation result for access via ref\n const [fullValidationResult, setFullValidationResult] = useState<ValidationResult | null>(null)\n\n // Expose query and validation state to parent via ref (only called when Apply is clicked)\n useImperativeHandle(ref, () => ({\n getCurrentQuery: () => cleanQueryForServer(state.query),\n getValidationState: () => ({\n status: state.validationStatus,\n result: state.validationStatus === 'valid' ? {\n valid: true,\n sql: state.validationSql || undefined\n } : state.validationStatus === 'invalid' ? {\n valid: false,\n error: state.validationError || undefined\n } : undefined\n }),\n getValidationResult: () => fullValidationResult\n }), [state.query, state.validationStatus, state.validationError, state.validationSql, fullValidationResult])\n\n // Load schema on mount and when API config changes\n useEffect(() => {\n const loadSchema = async () => {\n setState(prev => ({\n ...prev,\n schemaStatus: 'loading',\n schemaError: null\n }))\n\n try {\n const metaResponse: MetaResponse = await cubeApi.meta()\n setState(prev => ({\n ...prev,\n schema: metaResponse,\n schemaStatus: 'success',\n schemaError: null\n }))\n } catch (error) {\n console.error('Failed to load schema:', error)\n const errorMessage = error instanceof Error ? error.message : 'Failed to load schema'\n setState(prev => ({\n ...prev,\n schema: null,\n schemaStatus: 'error',\n schemaError: errorMessage\n }))\n }\n }\n\n loadSchema()\n }, [apiConfig.baseApiUrl, apiConfig.apiToken])\n\n // Save query to localStorage whenever it changes (if not disabled)\n useEffect(() => {\n if (!disableLocalStorage) {\n try {\n localStorage.setItem(STORAGE_KEY, JSON.stringify({ query: state.query }))\n } catch (error) {\n console.warn('Failed to save query to localStorage:', error)\n }\n }\n }, [state.query, disableLocalStorage])\n\n // Save API config to localStorage whenever it changes (if not disabled)\n useEffect(() => {\n if (!disableLocalStorage) {\n try {\n localStorage.setItem(API_CONFIG_STORAGE_KEY, JSON.stringify(apiConfig))\n } catch (error) {\n console.warn('Failed to save API config to localStorage:', error)\n }\n }\n }, [apiConfig, disableLocalStorage])\n\n\n\n\n // Auto re-run query when displayLimit changes\n useEffect(() => {\n if (state.executionStatus === 'success' && hasQueryContent(state.query) && state.validationStatus === 'valid') {\n handleExecuteQuery()\n }\n }, [displayLimit]) // Only trigger on displayLimit change\n\n\n const updateQuery = useCallback((updater: (prev: typeof state.query) => typeof state.query) => {\n setState(prev => {\n const newQuery = updater(prev.query)\n \n // Clean up filters to remove any that reference fields no longer in the query\n const cleanedQuery = {\n ...newQuery,\n filters: newQuery.filters ? cleanupFilters(newQuery.filters, newQuery) : undefined\n }\n \n const queryChanged = JSON.stringify(cleanedQuery) !== JSON.stringify(prev.query)\n \n return {\n ...prev,\n query: cleanedQuery,\n // Only reset validation if query actually changed\n validationStatus: queryChanged ? 'idle' : prev.validationStatus,\n validationError: queryChanged ? null : prev.validationError,\n validationSql: queryChanged ? null : prev.validationSql,\n executionStatus: 'idle',\n executionResults: null,\n executionError: null,\n totalRowCount: null,\n totalRowCountStatus: 'idle'\n }\n })\n }, [])\n\n const handleFieldSelect = useCallback((fieldName: string, fieldType: 'measures' | 'dimensions' | 'timeDimensions') => {\n updateQuery(prev => {\n const newQuery = { ...prev }\n \n switch (fieldType) {\n case 'measures':\n newQuery.measures = [...(prev.measures || []), fieldName]\n break\n case 'dimensions':\n newQuery.dimensions = [...(prev.dimensions || []), fieldName]\n break\n case 'timeDimensions':\n newQuery.timeDimensions = [...(prev.timeDimensions || []), { \n dimension: fieldName, \n granularity: 'month' \n }]\n break\n }\n \n return cleanQuery(newQuery)\n })\n }, [updateQuery])\n\n const handleFieldDeselect = useCallback((fieldName: string, fieldType: 'measures' | 'dimensions' | 'timeDimensions') => {\n updateQuery(prev => {\n const newQuery = { ...prev }\n \n switch (fieldType) {\n case 'measures':\n newQuery.measures = (prev.measures || []).filter(m => m !== fieldName)\n break\n case 'dimensions':\n newQuery.dimensions = (prev.dimensions || []).filter(d => d !== fieldName)\n break\n case 'timeDimensions':\n newQuery.timeDimensions = (prev.timeDimensions || []).filter(td => td.dimension !== fieldName)\n break\n }\n \n // Clean up order if field was sorted\n if (newQuery.order && newQuery.order[fieldName]) {\n const newOrder = { ...newQuery.order }\n delete newOrder[fieldName]\n newQuery.order = Object.keys(newOrder).length > 0 ? newOrder : undefined\n }\n \n return cleanQuery(newQuery)\n })\n }, [updateQuery])\n\n const handleTimeDimensionGranularityChange = useCallback((dimensionName: string, granularity: string) => {\n updateQuery(prev => {\n const newQuery = {\n ...prev,\n timeDimensions: (prev.timeDimensions || []).map(td => \n td.dimension === dimensionName \n ? { ...td, granularity }\n : td\n )\n }\n return cleanQuery(newQuery)\n })\n }, [updateQuery])\n\n const handleFiltersChange = useCallback((filters: Filter[]) => {\n updateQuery(prev => {\n const newQuery = {\n ...prev,\n filters\n }\n return cleanQuery(newQuery)\n })\n }, [updateQuery])\n\n const handleDateRangeChange = useCallback((timeDimension: string, dateRange: string | string[]) => {\n updateQuery(prev => {\n const newQuery = {\n ...prev,\n timeDimensions: (prev.timeDimensions || []).map(td => \n td.dimension === timeDimension \n ? { ...td, dateRange }\n : td\n )\n }\n return cleanQuery(newQuery)\n })\n }, [updateQuery])\n\n const handleDateRangeRemove = useCallback((timeDimension: string) => {\n updateQuery(prev => {\n const newQuery = {\n ...prev,\n timeDimensions: (prev.timeDimensions || []).map(td => \n td.dimension === timeDimension \n ? { ...td, dateRange: undefined }\n : td\n )\n }\n return cleanQuery(newQuery)\n })\n }, [updateQuery])\n\n const handleOrderChange = useCallback((fieldName: string, direction: 'asc' | 'desc' | null) => {\n updateQuery(prev => {\n const newOrder = { ...(prev.order || {}) }\n \n if (direction === null) {\n delete newOrder[fieldName]\n } else {\n newOrder[fieldName] = direction\n }\n \n const newQuery = {\n ...prev,\n order: Object.keys(newOrder).length > 0 ? newOrder : undefined\n }\n \n return cleanQuery(newQuery)\n })\n }, [updateQuery])\n\n const handleValidateQuery = useCallback(async () => {\n if (!hasQueryContent(state.query)) return\n\n // Store the query being validated (cleaned and server-formatted)\n const queryToValidate = cleanQueryForServer(state.query)\n const queryStr = JSON.stringify(queryToValidate)\n \n console.log('Starting validation with query:', queryToValidate)\n\n setState(prev => ({\n ...prev,\n validationStatus: 'validating',\n validationError: null,\n validationSql: null\n }))\n\n try {\n const result: ValidationResult = await cubeApi.dryRun(queryToValidate)\n \n // Store the full validation result for parent access\n setFullValidationResult(result)\n \n // Check if validation is successful:\n // 1. Must have queryType (always present in successful Cube.js responses)\n // 2. Must not have an error\n // 3. For compatibility, also check result.valid if present\n const isValid = !result.error && result.queryType && (result.valid !== false)\n \n // Store the validated query to prevent reset\n if (isValid) {\n lastValidatedQueryRef.current = queryStr\n }\n \n console.log('Validation result:', isValid ? 'VALID' : 'INVALID', 'Query after validation:', state.query)\n \n setState(prev => {\n console.log('Setting validation status to:', isValid ? 'valid' : 'invalid')\n console.log('Query in prev state:', prev.query)\n return {\n ...prev,\n validationStatus: isValid ? 'valid' : 'invalid',\n validationError: result.error || null,\n validationSql: result.sql || null\n }\n })\n } catch (error) {\n console.error('Validation error:', error)\n setFullValidationResult(null)\n setState(prev => ({\n ...prev,\n validationStatus: 'invalid',\n validationError: error instanceof Error ? error.message : 'Network error during validation',\n validationSql: null\n }))\n }\n }, [state.query, cubeApi])\n\n // Auto re-validate query when query changes (with 1s debounce)\n useEffect(() => {\n // Only auto-validate if query has content and validation was previously cleared\n if (!hasQueryContent(state.query) || state.validationStatus !== 'idle') {\n return\n }\n\n const debounceTimer = setTimeout(() => {\n handleValidateQuery()\n }, 200) // 200ms debounce - fast but prevents excessive API calls\n\n return () => clearTimeout(debounceTimer)\n }, [state.query, state.validationStatus, handleValidateQuery]) // Trigger when query changes and validation status is idle\n\n const handleExecuteQuery = useCallback(async () => {\n if (!hasQueryContent(state.query) || state.validationStatus !== 'valid') return\n\n setState(prev => ({\n ...prev,\n executionStatus: 'loading',\n executionResults: null,\n executionError: null,\n totalRowCountStatus: 'loading'\n }))\n\n try {\n // Run both queries in parallel: one with limit and one without for total count\n const cleanedQuery = cleanQueryForServer(state.query)\n const [limitedResultSet, totalResultSet] = await Promise.all([\n cubeApi.load({ ...cleanedQuery, limit: displayLimit }),\n cubeApi.load(cleanedQuery) // No limit for total count\n ])\n \n const limitedData = limitedResultSet.tablePivot()\n const totalData = totalResultSet.tablePivot()\n const totalCount = totalData.length\n \n setState(prev => ({\n ...prev,\n executionStatus: 'success',\n executionResults: limitedData,\n executionError: null,\n totalRowCount: totalCount,\n totalRowCountStatus: 'success'\n }))\n } catch (error) {\n console.error('Query execution error:', error)\n setState(prev => ({\n ...prev,\n executionStatus: 'error',\n executionResults: null,\n executionError: error instanceof Error ? error.message : 'Query execution failed',\n totalRowCount: null,\n totalRowCountStatus: 'error'\n }))\n }\n }, [state.query, state.validationStatus, cubeApi, displayLimit])\n\n const handleClearQuery = useCallback(() => {\n setState(prev => ({\n ...prev,\n query: createEmptyQuery(),\n validationStatus: 'idle',\n validationError: null,\n validationSql: null,\n executionStatus: 'idle',\n executionResults: null,\n executionError: null,\n totalRowCount: null,\n totalRowCountStatus: 'idle'\n }))\n }, [])\n\n const handleApiConfigChange = useCallback((newConfig: ApiConfig) => {\n setApiConfig(newConfig)\n \n // Update the CubeProvider's client with new configuration\n updateApiConfig(\n { apiUrl: newConfig.baseApiUrl },\n newConfig.apiToken || undefined\n )\n \n // Reset all state when API config changes\n setState(prev => ({\n ...prev,\n schema: null,\n schemaStatus: 'idle',\n schemaError: null,\n validationStatus: 'idle',\n validationError: null,\n validationSql: null,\n executionStatus: 'idle',\n executionResults: null,\n executionError: null,\n totalRowCount: null,\n totalRowCountStatus: 'idle'\n }))\n }, [updateApiConfig])\n\n const handleResetApiConfig = useCallback(() => {\n const defaultConfig = {\n baseApiUrl: '/cubejs-api/v1',\n apiToken: ''\n }\n setApiConfig(defaultConfig)\n \n // Update the CubeProvider's client with reset configuration\n updateApiConfig(\n { apiUrl: defaultConfig.baseApiUrl },\n undefined\n )\n }, [updateApiConfig])\n\n const handleRetrySchema = useCallback(async () => {\n setState(prev => ({\n ...prev,\n schemaStatus: 'loading',\n schemaError: null\n }))\n\n try {\n const metaResponse: MetaResponse = await cubeApi.meta()\n setState(prev => ({\n ...prev,\n schema: metaResponse,\n schemaStatus: 'success',\n schemaError: null\n }))\n } catch (error) {\n console.error('Failed to retry schema:', error)\n const errorMessage = error instanceof Error ? error.message : 'Failed to load schema'\n setState(prev => ({\n ...prev,\n schema: null,\n schemaStatus: 'error',\n schemaError: errorMessage\n }))\n }\n }, [cubeApi])\n\n const selectedFields = {\n measures: state.query.measures || [],\n dimensions: state.query.dimensions || [],\n timeDimensions: (state.query.timeDimensions || []).map(td => td.dimension)\n }\n\n return (\n <div className={`h-full flex flex-col ${className}`} style={{ minHeight: '100%' }}>\n {/* Setup Panel - only show when not in modal and not hidden */}\n {!hideSettings && (\n <div className=\"flex-shrink-0 p-4 pb-0\">\n <SetupPanel\n isOpen={showSetupPanel}\n onToggle={() => setShowSetupPanel(!showSetupPanel)}\n config={apiConfig}\n onConfigChange={handleApiConfigChange}\n onReset={handleResetApiConfig}\n />\n </div>\n )}\n \n {/* Mobile Schema Toggle Button */}\n <div className=\"md:hidden flex-shrink-0 px-4 pb-2\">\n <button\n onClick={() => setShowSchemaMobile(!showSchemaMobile)}\n className=\"flex items-center gap-2 px-3 py-2 text-sm font-medium text-gray-700 bg-gray-100 hover:bg-gray-200 rounded-md transition-colors\"\n >\n {showSchemaMobile ? (\n <><XMarkIcon className=\"w-4 h-4\" /> Hide Schema</>\n ) : (\n <><Bars3Icon className=\"w-4 h-4\" /> Show Schema</>\n )}\n </button>\n </div>\n\n {/* Mobile Schema Panel Overlay */}\n {showSchemaMobile && (\n <div className=\"md:hidden fixed inset-0 z-50 bg-black bg-opacity-50 flex\">\n <div className=\"w-full max-w-md sm:max-w-lg bg-white h-full overflow-y-auto\">\n <div className=\"p-4 border-b\">\n <button\n onClick={() => setShowSchemaMobile(false)}\n className=\"flex items-center gap-2 px-3 py-2 text-sm font-medium text-gray-700 bg-gray-100 hover:bg-gray-200 rounded-md transition-colors\"\n >\n <XMarkIcon className=\"w-4 h-4\" /> Close Schema\n </button>\n </div>\n <div className=\"p-4\">\n <CubeMetaExplorer\n schema={state.schema}\n schemaStatus={state.schemaStatus}\n schemaError={state.schemaError}\n selectedFields={selectedFields}\n onFieldSelect={(field, type) => {\n handleFieldSelect(field, type)\n setShowSchemaMobile(false)\n }}\n onFieldDeselect={handleFieldDeselect}\n onRetrySchema={handleRetrySchema}\n onOpenSettings={!hideSettings ? () => setShowSetupPanel(true) : undefined}\n />\n </div>\n </div>\n <div className=\"flex-1\" onClick={() => setShowSchemaMobile(false)}></div>\n </div>\n )}\n\n <div className=\"flex-1 flex flex-col md:flex-row gap-4 p-4 min-h-0\" style={{ paddingTop: hideSettings ? '1rem' : '0rem' }}>\n {/* Schema Explorer - Left Column (Desktop only) */}\n <div className=\"hidden md:flex md:w-1/3 min-w-0 flex-shrink-0 flex-col\">\n <CubeMetaExplorer\n schema={state.schema}\n schemaStatus={state.schemaStatus}\n schemaError={state.schemaError}\n selectedFields={selectedFields}\n onFieldSelect={handleFieldSelect}\n onFieldDeselect={handleFieldDeselect}\n onRetrySchema={handleRetrySchema}\n onOpenSettings={!hideSettings ? () => setShowSetupPanel(true) : undefined}\n />\n </div>\n\n {/* Main Content - Query Builder + Results */}\n <div className=\"flex-1 flex flex-col gap-4 min-w-0 min-h-0\">\n {/* Query Builder */}\n <div className=\"flex-shrink-0\">\n <QueryPanel\n query={state.query}\n schema={state.schema}\n validationStatus={state.validationStatus}\n validationError={state.validationError}\n validationSql={state.validationSql}\n onValidate={handleValidateQuery}\n onExecute={handleExecuteQuery}\n onRemoveField={handleFieldDeselect}\n onTimeDimensionGranularityChange={handleTimeDimensionGranularityChange}\n onFiltersChange={handleFiltersChange}\n onDateRangeChange={handleDateRangeChange}\n onDateRangeRemove={handleDateRangeRemove}\n onOrderChange={handleOrderChange}\n onClearQuery={handleClearQuery}\n showSettings={!hideSettings}\n onSettingsClick={() => setShowSetupPanel(!showSetupPanel)}\n onAIAssistantClick={features?.enableAI !== false ? () => setShowAIAssistant(true) : undefined}\n />\n </div>\n\n {/* Results Panel */}\n <div className={`${state.executionStatus === 'idle' ? 'flex-shrink-0 h-48' : 'flex-1 min-h-0'}`}>\n <ResultsPanel\n executionStatus={state.executionStatus}\n executionResults={state.executionResults}\n executionError={state.executionError}\n query={state.query}\n displayLimit={displayLimit}\n onDisplayLimitChange={setDisplayLimit}\n totalRowCount={state.totalRowCount}\n totalRowCountStatus={state.totalRowCountStatus}\n />\n </div>\n </div>\n </div>\n \n {/* AI Assistant Modal - only render if AI is enabled */}\n {features?.enableAI !== false && (\n <AIAssistantModal\n isOpen={showAIAssistant}\n onClose={() => setShowAIAssistant(false)}\n schema={state.schema}\n aiEndpoint={features?.aiEndpoint}\n onQueryLoad={(query) => {\n // Update the query in the builder\n setState(prev => ({\n ...prev,\n query: transformQueryForUI(query),\n validationStatus: 'idle',\n validationError: null,\n validationSql: null,\n executionStatus: 'idle',\n executionResults: null,\n executionError: null,\n totalRowCount: null,\n totalRowCountStatus: 'idle'\n }))\n \n // Auto-validate the loaded query after a short delay\n setTimeout(async () => {\n // We need to access handleValidateQuery through a ref or recreate the validation logic\n // For now, let's trigger validation by updating the state to force a validation\n const queryToValidate = cleanQueryForServer(transformQueryForUI(query))\n \n try {\n const result = await cubeApi.dryRun(queryToValidate)\n const isValid = !result.error && result.queryType && (result.valid !== false)\n \n setState(prev => ({\n ...prev,\n validationStatus: isValid ? 'valid' : 'invalid',\n validationError: result.error || null,\n validationSql: result.sql || null\n }))\n \n setFullValidationResult(result)\n } catch (error) {\n console.error('Auto-validation error:', error)\n setState(prev => ({\n ...prev,\n validationStatus: 'invalid',\n validationError: error instanceof Error ? error.message : 'Validation failed',\n validationSql: null\n }))\n setFullValidationResult(null)\n }\n }, 200)\n }}\n />\n )}\n </div>\n )\n})\n\nQueryBuilder.displayName = 'QueryBuilder'\n\nexport default QueryBuilder","import React, { useState } from 'react'\nimport { XMarkIcon } from '@heroicons/react/24/outline'\nimport type { AxisDropZoneConfig } from '../charts/chartConfigs'\n\ninterface FieldStyling {\n IconComponent: React.ComponentType<{ className?: string }>\n baseClasses: string\n hoverClasses: string\n}\n\ninterface AxisDropZoneProps {\n config: AxisDropZoneConfig\n fields: string[]\n onDrop: (e: React.DragEvent<HTMLDivElement>, toKey: string) => void\n onRemove: (field: string, fromKey: string) => void\n onDragStart: (e: React.DragEvent<HTMLDivElement>, field: string, fromKey: string) => void\n onDragOver: (e: React.DragEvent<HTMLDivElement>) => void\n getFieldStyling: (field: string) => FieldStyling\n onReorder?: (fromIndex: number, toIndex: number, axisKey: string) => void\n}\n\nexport default function AxisDropZone({\n config,\n fields,\n onDrop,\n onRemove,\n onDragStart,\n onDragOver,\n getFieldStyling,\n onReorder\n}: AxisDropZoneProps) {\n const { key, label, description, mandatory, maxItems, emptyText, icon: IconComponent } = config\n const [dragOverIndex, setDragOverIndex] = useState<number | null>(null)\n const [draggedFromIndex, setDraggedFromIndex] = useState<number | null>(null)\n const [isDraggingFromSameAxis, setIsDraggingFromSameAxis] = useState(false)\n \n // Check if we can accept more items\n const canAcceptMore = !maxItems || fields.length < maxItems\n const isFull = maxItems && fields.length >= maxItems\n\n // Helper to handle reordering within the same axis\n const handleReorderDragStart = (e: React.DragEvent<HTMLDivElement>, field: string, index: number) => {\n setDraggedFromIndex(index)\n setIsDraggingFromSameAxis(true)\n \n // Set both the regular drag data and the reorder data\n e.dataTransfer.setData('text/plain', JSON.stringify({ \n field, \n fromAxis: key,\n fromIndex: index,\n isReorder: true\n }))\n }\n\n const handleReorderDragEnd = () => {\n setDraggedFromIndex(null)\n setIsDraggingFromSameAxis(false)\n setDragOverIndex(null)\n }\n\n const handleReorderDragOver = (e: React.DragEvent<HTMLDivElement>, targetIndex: number) => {\n // Only prevent default and show indicator if we're dragging from the same axis\n if (isDraggingFromSameAxis && draggedFromIndex !== null && draggedFromIndex !== targetIndex) {\n e.preventDefault()\n e.stopPropagation()\n setDragOverIndex(targetIndex)\n }\n }\n\n const handleReorderDragLeave = () => {\n setDragOverIndex(null)\n }\n\n const handleReorderDrop = (e: React.DragEvent<HTMLDivElement>, targetIndex: number) => {\n e.preventDefault()\n e.stopPropagation()\n setDragOverIndex(null)\n \n try {\n const data = JSON.parse(e.dataTransfer.getData('text/plain'))\n if (data.isReorder && data.fromAxis === key && onReorder && draggedFromIndex !== null) {\n // Only reorder if we're actually changing positions\n if (draggedFromIndex !== targetIndex) {\n onReorder(draggedFromIndex, targetIndex, key)\n }\n }\n } catch {\n // If we can't parse the data, try using the stored state\n if (isDraggingFromSameAxis && draggedFromIndex !== null && draggedFromIndex !== targetIndex && onReorder) {\n onReorder(draggedFromIndex, targetIndex, key)\n }\n }\n \n handleReorderDragEnd()\n }\n \n return (\n <div className=\"mb-2\">\n <div className=\"flex items-center gap-2 mb-1\">\n <h4 className=\"text-xs font-semibold flex items-center\">\n {IconComponent && <IconComponent className=\"w-3 h-3 mr-1\" />}\n {label}\n {mandatory && <span className=\"text-red-500 ml-1\">*</span>}\n {maxItems && (\n <span className=\"text-gray-500 ml-1 font-normal\">\n ({fields.length}/{maxItems})\n </span>\n )}\n </h4>\n {description && (\n <span className=\"text-xs text-gray-500\">\n {description}\n </span>\n )}\n </div>\n \n <div\n className={`min-h-[40px] sm:min-h-[32px] border-2 border-dashed rounded-lg p-3 sm:p-1.5 transition-colors flex items-center ${\n isFull \n ? 'border-gray-200 bg-gray-50' \n : 'border-gray-300 bg-gray-50 hover:bg-gray-100'\n }`}\n onDragOver={(e) => {\n // Don't interfere with internal reordering\n if (isDraggingFromSameAxis) {\n return\n }\n \n if (canAcceptMore) {\n onDragOver(e)\n } else {\n e.preventDefault()\n e.dataTransfer.dropEffect = 'none'\n }\n }}\n onDrop={(e) => {\n // Don't interfere with internal reordering\n if (isDraggingFromSameAxis) {\n return\n }\n \n if (canAcceptMore) {\n onDrop(e, key)\n } else {\n e.preventDefault()\n }\n }}\n >\n {fields.length === 0 ? (\n <div className=\"text-xs text-gray-500 text-center w-full\">\n {isFull ? 'Maximum items reached' : (emptyText || `Drop fields here`)}\n </div>\n ) : (\n <div className=\"flex flex-wrap gap-1\">\n {fields.map((field, index) => {\n const { IconComponent: FieldIcon, baseClasses, hoverClasses } = getFieldStyling(field)\n const isDragOver = dragOverIndex === index\n \n return (\n <div\n key={`${field}-${index}`}\n className={`relative ${isDragOver ? 'transform scale-105' : ''}`}\n >\n {/* Drop indicator line for reordering */}\n {isDragOver && (\n <div className=\"absolute -left-1 top-0 bottom-0 w-1 bg-blue-500 rounded-full z-10\" />\n )}\n \n <div\n draggable\n onDragStart={(e) => {\n // Handle both regular drag (to other axes) and reorder drag (within same axis)\n onDragStart(e, field, key)\n handleReorderDragStart(e, field, index)\n }}\n onDragEnd={handleReorderDragEnd}\n onDragOver={(e) => handleReorderDragOver(e, index)}\n onDragLeave={handleReorderDragLeave}\n onDrop={(e) => handleReorderDrop(e, index)}\n className={`rounded text-xs cursor-move px-3 py-0.5 sm:px-2 sm:py-1 flex items-center transition-transform h-[28px] sm:h-auto ${baseClasses} ${hoverClasses} ${\n isDragOver ? 'bg-opacity-75' : ''\n } ${draggedFromIndex === index ? 'opacity-50' : ''}`}\n >\n <FieldIcon className=\"w-3 h-3 mr-1 flex-shrink-0\" />\n <span className=\"leading-none\">{field}</span>\n <button\n type=\"button\"\n onClick={() => onRemove(field, key)}\n className=\"text-gray-600 hover:text-red-600 ml-1.5 leading-none\"\n title={`Remove from ${label}`}\n >\n <XMarkIcon className=\"w-3 h-3\" />\n </button>\n </div>\n </div>\n )\n })}\n </div>\n )}\n </div>\n \n {mandatory && fields.length === 0 && (\n <div className=\"text-xs text-red-500 mt-0.5\">\n This field is required\n </div>\n )}\n </div>\n )\n}","import type { ChartTypeConfig } from '../../charts/chartConfigs'\nimport { Icon } from '@iconify/react'\nimport chartBarIcon from '@iconify-icons/tabler/chart-bar'\n\n/**\n * Configuration for the bar chart type\n */\nexport const barChartConfig: ChartTypeConfig = {\n icon: ({ className }) => <Icon icon={chartBarIcon} className={className} />,\n description: 'Compare values across categories',\n useCase: 'Best for comparing discrete categories, showing rankings, or displaying changes over time',\n dropZones: [\n {\n key: 'xAxis',\n label: 'X-Axis (Categories)',\n description: 'Dimensions and time dimensions for grouping',\n mandatory: false,\n acceptTypes: ['dimension', 'timeDimension'],\n emptyText: 'Drop dimensions & time dimensions here'\n },\n {\n key: 'yAxis',\n label: 'Y-Axis (Values)',\n description: 'Measures for bar heights',\n mandatory: true,\n acceptTypes: ['measure'],\n emptyText: 'Drop measures here'\n },\n {\n key: 'series',\n label: 'Series (Split into Multiple Series)',\n description: 'Dimensions to create separate data series',\n mandatory: false,\n acceptTypes: ['dimension'],\n emptyText: 'Drop dimensions here to split data into series'\n }\n ],\n displayOptions: ['showLegend', 'showGrid', 'showTooltip', 'stacked']\n}","import type { ChartTypeConfig } from '../../charts/chartConfigs'\nimport { Icon } from '@iconify/react'\nimport chartLineIcon from '@iconify-icons/tabler/chart-line'\n\n/**\n * Configuration for the line chart type\n */\nexport const lineChartConfig: ChartTypeConfig = {\n icon: ({ className }) => <Icon icon={chartLineIcon} className={className} />,\n description: 'Show trends and changes over time',\n useCase: 'Best for continuous data, trends, time series, and showing relationships between multiple series',\n dropZones: [\n {\n key: 'xAxis',\n label: 'X-Axis (Time/Categories)',\n description: 'Time dimensions or dimensions for X-axis',\n mandatory: true,\n acceptTypes: ['dimension', 'timeDimension'],\n emptyText: 'Drop time dimensions or dimensions here'\n },\n {\n key: 'yAxis',\n label: 'Y-Axis (Values)',\n description: 'Measures for line values',\n mandatory: true,\n acceptTypes: ['measure'],\n emptyText: 'Drop measures here'\n },\n {\n key: 'series',\n label: 'Series (Multiple Lines)',\n description: 'Dimensions to create separate lines',\n mandatory: false,\n acceptTypes: ['dimension'],\n emptyText: 'Drop dimensions here for multiple lines'\n }\n ],\n displayOptions: ['showLegend', 'showGrid', 'showTooltip']\n}","import type { ChartTypeConfig } from '../../charts/chartConfigs'\nimport { Icon } from '@iconify/react'\nimport chartAreaLineIcon from '@iconify-icons/tabler/chart-area-line'\n\n/**\n * Configuration for the area chart type\n */\nexport const areaChartConfig: ChartTypeConfig = {\n icon: ({ className }) => <Icon icon={chartAreaLineIcon} className={className} />,\n description: 'Emphasize magnitude of change over time',\n useCase: 'Best for showing cumulative totals, volume changes, or stacked comparisons over time',\n dropZones: [\n {\n key: 'xAxis',\n label: 'X-Axis (Time/Categories)',\n description: 'Time dimensions or dimensions for X-axis',\n mandatory: true,\n acceptTypes: ['dimension', 'timeDimension'],\n emptyText: 'Drop time dimensions or dimensions here'\n },\n {\n key: 'yAxis',\n label: 'Y-Axis (Values)',\n description: 'Measures for area values',\n mandatory: true,\n acceptTypes: ['measure'],\n emptyText: 'Drop measures here'\n },\n {\n key: 'series',\n label: 'Series (Stack Areas)',\n description: 'Dimensions to create stacked areas',\n mandatory: false,\n acceptTypes: ['dimension'],\n emptyText: 'Drop dimensions here for stacked areas'\n }\n ],\n displayOptions: ['showLegend', 'showGrid', 'showTooltip', 'stacked']\n}","import type { ChartTypeConfig } from '../../charts/chartConfigs'\nimport { Icon } from '@iconify/react'\nimport chartPieIcon from '@iconify-icons/tabler/chart-pie'\n\n/**\n * Configuration for the pie chart type\n */\nexport const pieChartConfig: ChartTypeConfig = {\n icon: ({ className }) => <Icon icon={chartPieIcon} className={className} />,\n description: 'Show proportions of a whole',\n useCase: 'Best for showing percentage distribution or composition of a total (limit to 5-7 slices)',\n dropZones: [\n {\n key: 'xAxis',\n label: 'Categories',\n description: 'Dimension for pie slices',\n mandatory: true,\n maxItems: 1,\n acceptTypes: ['dimension'],\n emptyText: 'Drop a dimension for categories'\n },\n {\n key: 'yAxis',\n label: 'Values',\n description: 'Measure for slice sizes',\n mandatory: true,\n maxItems: 1,\n acceptTypes: ['measure'],\n emptyText: 'Drop a measure for values'\n }\n ],\n displayOptions: ['showLegend', 'showTooltip']\n}","import type { ChartTypeConfig } from '../../charts/chartConfigs'\nimport { Icon } from '@iconify/react'\nimport chartDots2Icon from '@iconify-icons/tabler/chart-dots-2'\n\n/**\n * Configuration for the scatter chart type\n */\nexport const scatterChartConfig: ChartTypeConfig = {\n icon: ({ className }) => <Icon icon={chartDots2Icon} className={className} />,\n description: 'Reveal correlations between variables',\n useCase: 'Best for identifying patterns, correlations, outliers, and relationships between two measures',\n dropZones: [\n {\n key: 'xAxis',\n label: 'X-Axis',\n description: 'Measure or dimension for X position',\n mandatory: true,\n maxItems: 1,\n acceptTypes: ['dimension', 'timeDimension', 'measure'],\n emptyText: 'Drop a field for X-axis'\n },\n {\n key: 'yAxis',\n label: 'Y-Axis',\n description: 'Measure for Y position',\n mandatory: true,\n maxItems: 1,\n acceptTypes: ['measure'],\n emptyText: 'Drop a measure for Y-axis'\n },\n {\n key: 'series',\n label: 'Series (Color Groups)',\n description: 'Dimension to color points by category',\n mandatory: false,\n maxItems: 1,\n acceptTypes: ['dimension'],\n emptyText: 'Drop a dimension to color points'\n }\n ],\n displayOptions: ['showLegend', 'showGrid', 'showTooltip']\n}","import type { ChartTypeConfig } from '../../charts/chartConfigs'\nimport { Icon } from '@iconify/react'\nimport chartBubbleIcon from '@iconify-icons/tabler/chart-bubble'\n\n/**\n * Configuration for the bubble chart type\n */\nexport const bubbleChartConfig: ChartTypeConfig = {\n icon: ({ className }) => <Icon icon={chartBubbleIcon} className={className} />,\n description: 'Compare three dimensions of data',\n useCase: 'Best for showing relationships between three variables (X, Y, and size), market analysis',\n dropZones: [\n {\n key: 'xAxis',\n label: 'X-Axis',\n description: 'Horizontal axis position',\n mandatory: true,\n maxItems: 1,\n acceptTypes: ['dimension', 'timeDimension', 'measure'],\n emptyText: 'Drop a field for X-axis position'\n },\n {\n key: 'yAxis',\n label: 'Y-Axis', \n description: 'Vertical axis position',\n mandatory: true,\n maxItems: 1,\n acceptTypes: ['measure'],\n emptyText: 'Drop a measure for Y-axis position'\n },\n {\n key: 'sizeField',\n label: 'Bubble Radius',\n description: 'Size of bubbles based on this measure',\n mandatory: true,\n maxItems: 1,\n acceptTypes: ['measure'],\n emptyText: 'Drop a measure for bubble size'\n },\n {\n key: 'series',\n label: 'Bubble Labels',\n description: 'Field to use for bubble labels and identification',\n mandatory: true,\n maxItems: 1,\n acceptTypes: ['dimension'],\n emptyText: 'Drop a dimension for bubble labels'\n },\n {\n key: 'colorField',\n label: 'Bubble Colour',\n description: 'Color bubbles by this field (optional)',\n mandatory: false,\n maxItems: 1,\n acceptTypes: ['dimension', 'measure'],\n emptyText: 'Drop a field for bubble color (optional)'\n }\n ],\n displayOptions: ['showLegend', 'showGrid', 'showTooltip', 'minBubbleSize', 'maxBubbleSize', 'bubbleOpacity']\n}","import type { ChartTypeConfig } from '../../charts/chartConfigs'\nimport { Icon } from '@iconify/react'\nimport chartRadarIcon from '@iconify-icons/tabler/chart-radar'\n\n/**\n * Configuration for the radar chart type\n */\nexport const radarChartConfig: ChartTypeConfig = {\n icon: ({ className }) => <Icon icon={chartRadarIcon} className={className} />,\n description: 'Compare multiple metrics across categories',\n useCase: 'Best for multivariate comparisons, performance metrics, strengths/weaknesses analysis',\n dropZones: [\n {\n key: 'xAxis',\n label: 'Axes (Categories)',\n description: 'Dimensions for radar axes',\n mandatory: true,\n acceptTypes: ['dimension'],\n emptyText: 'Drop dimensions for radar axes'\n },\n {\n key: 'yAxis',\n label: 'Values',\n description: 'Measures for radar values',\n mandatory: true,\n acceptTypes: ['measure'],\n emptyText: 'Drop measures for values'\n },\n {\n key: 'series',\n label: 'Series (Multiple Shapes)',\n description: 'Dimensions to create multiple radar shapes',\n mandatory: false,\n acceptTypes: ['dimension'],\n emptyText: 'Drop dimensions for multiple shapes'\n }\n ],\n displayOptions: ['showLegend', 'showGrid', 'showTooltip']\n}","import type { ChartTypeConfig } from '../../charts/chartConfigs'\nimport { Icon } from '@iconify/react'\nimport chartRadarIcon from '@iconify-icons/tabler/radar-2'\n\n/**\n * Configuration for the radial bar chart type\n */\nexport const radialBarChartConfig: ChartTypeConfig = {\n icon: ({ className }) => <Icon icon={chartRadarIcon} className={className} />,\n description: 'Circular progress and KPI visualization',\n useCase: 'Best for showing progress toward goals, KPIs, or comparing percentages in a compact form',\n dropZones: [\n {\n key: 'xAxis',\n label: 'Categories',\n description: 'Dimensions for radial segments',\n mandatory: true,\n acceptTypes: ['dimension'],\n emptyText: 'Drop dimensions for categories'\n },\n {\n key: 'yAxis',\n label: 'Values',\n description: 'Measures for radial bar lengths',\n mandatory: true,\n maxItems: 1,\n acceptTypes: ['measure'],\n emptyText: 'Drop a measure for values'\n }\n ],\n displayOptions: ['showLegend', 'showTooltip']\n}","import type { ChartTypeConfig } from '../../charts/chartConfigs'\nimport { Icon } from '@iconify/react'\nimport chartTreemapIcon from '@iconify-icons/tabler/chart-treemap'\n\n/**\n * Configuration for the treemap chart type\n */\nexport const treemapChartConfig: ChartTypeConfig = {\n icon: ({ className }) => <Icon icon={chartTreemapIcon} className={className} />,\n description: 'Visualize hierarchical data with nested rectangles',\n useCase: 'Best for showing part-to-whole relationships in hierarchical data, disk usage, budget allocation',\n dropZones: [\n {\n key: 'xAxis',\n label: 'Categories',\n description: 'Dimensions for treemap rectangles',\n mandatory: true,\n acceptTypes: ['dimension'],\n emptyText: 'Drop dimensions for categories'\n },\n {\n key: 'yAxis',\n label: 'Size',\n description: 'Measure for rectangle sizes',\n mandatory: true,\n maxItems: 1,\n acceptTypes: ['measure'],\n emptyText: 'Drop a measure for size'\n },\n {\n key: 'series',\n label: 'Color Groups',\n description: 'Dimension to color rectangles by category',\n mandatory: false,\n maxItems: 1,\n acceptTypes: ['dimension'],\n emptyText: 'Drop a dimension for color grouping'\n }\n ],\n displayOptions: ['showLegend', 'showTooltip']\n}","import type { ChartTypeConfig } from '../../charts/chartConfigs'\nimport { Icon } from '@iconify/react'\nimport tableIcon from '@iconify-icons/tabler/table'\n\n/**\n * Configuration for the data table type\n */\nexport const dataTableConfig: ChartTypeConfig = {\n icon: ({ className }) => <Icon icon={tableIcon} className={className} />,\n description: 'Display detailed tabular data',\n useCase: 'Best for precise values, detailed analysis, sortable/filterable data exploration',\n dropZones: [\n {\n key: 'xAxis',\n label: 'Columns',\n description: 'All fields to display as columns',\n mandatory: false,\n acceptTypes: ['dimension', 'timeDimension', 'measure'],\n emptyText: 'Drop fields to display as columns (or leave empty for all)'\n }\n ],\n displayOptions: []\n}","import { barChartConfig } from '../components/charts/BarChart.config'\nimport { lineChartConfig } from '../components/charts/LineChart.config'\nimport { areaChartConfig } from '../components/charts/AreaChart.config'\nimport { pieChartConfig } from '../components/charts/PieChart.config'\nimport { scatterChartConfig } from '../components/charts/ScatterChart.config'\nimport { bubbleChartConfig } from '../components/charts/BubbleChart.config'\nimport { radarChartConfig } from '../components/charts/RadarChart.config'\nimport { radialBarChartConfig } from '../components/charts/RadialBarChart.config'\nimport { treemapChartConfig } from '../components/charts/TreeMapChart.config'\nimport { dataTableConfig } from '../components/charts/DataTable.config'\nimport type { ChartConfigRegistry } from './chartConfigs'\n\n/**\n * Registry of all chart type configurations\n */\nexport const chartConfigRegistry: ChartConfigRegistry = {\n bar: barChartConfig,\n line: lineChartConfig,\n area: areaChartConfig,\n pie: pieChartConfig,\n scatter: scatterChartConfig,\n bubble: bubbleChartConfig,\n radar: radarChartConfig,\n radialBar: radialBarChartConfig,\n treemap: treemapChartConfig,\n table: dataTableConfig\n}","import { ComponentType } from 'react'\n\n/**\n * Configuration for a single axis drop zone in the chart configuration UI\n */\nexport interface AxisDropZoneConfig {\n /** The key to store this field in chartConfig (e.g., 'xAxis', 'yAxis', 'sizeField') */\n key: string\n \n /** Display label for the drop zone */\n label: string\n \n /** Optional description/help text shown below the label */\n description?: string\n \n /** Whether at least one field is required in this drop zone */\n mandatory?: boolean\n \n /** Maximum number of items allowed in this drop zone */\n maxItems?: number\n \n /** Which field types this drop zone accepts */\n acceptTypes?: ('dimension' | 'timeDimension' | 'measure')[]\n \n /** Optional icon component to display */\n icon?: ComponentType<{ className?: string }>\n \n /** Placeholder text when drop zone is empty */\n emptyText?: string\n}\n\n/**\n * Complete configuration for a chart type\n */\nexport interface ChartTypeConfig {\n /** Configuration for each drop zone */\n dropZones: AxisDropZoneConfig[]\n \n /** Which display options to show for this chart type */\n displayOptions?: string[]\n \n /** Optional custom validation function */\n validate?: (config: any) => { isValid: boolean; message?: string }\n \n /** Icon component for the chart type */\n icon?: ComponentType<{ className?: string }>\n \n /** Brief description of the chart */\n description?: string\n \n /** When to use this chart type */\n useCase?: string\n}\n\n/**\n * Registry of all chart type configurations\n */\nexport interface ChartConfigRegistry {\n [chartType: string]: ChartTypeConfig\n}\n\n/**\n * Default configuration for charts without specific requirements\n */\nexport const defaultChartConfig: ChartTypeConfig = {\n dropZones: [\n {\n key: 'xAxis',\n label: 'X-Axis (Categories)',\n description: 'Dimensions and time dimensions for grouping',\n mandatory: false,\n acceptTypes: ['dimension', 'timeDimension'],\n emptyText: 'Drop dimensions & time dimensions here'\n },\n {\n key: 'yAxis',\n label: 'Y-Axis (Values)',\n description: 'Measures for values or dimensions for series',\n mandatory: false,\n acceptTypes: ['measure', 'dimension'],\n emptyText: 'Drop measures or dimensions here'\n },\n {\n key: 'series',\n label: 'Series (Split into Multiple Series)',\n description: 'Dimensions to create separate data series',\n mandatory: false,\n acceptTypes: ['dimension'],\n emptyText: 'Drop dimensions here to split data into series'\n }\n ],\n displayOptions: ['showLegend', 'showGrid', 'showTooltip']\n}\n\n/**\n * Helper function to get configuration for a chart type\n */\nexport function getChartConfig(chartType: string, registry: ChartConfigRegistry): ChartTypeConfig {\n return registry[chartType] || defaultChartConfig\n}","import React, { useMemo, useEffect } from 'react'\nimport { ChartBarIcon, TagIcon, CalendarIcon } from '@heroicons/react/24/outline'\nimport AxisDropZone from './AxisDropZone'\nimport { chartConfigRegistry } from '../charts/chartConfigRegistry'\nimport { getChartConfig } from '../charts/chartConfigs'\nimport type { ChartType, ChartAxisConfig, ChartDisplayConfig } from '../types'\n\ninterface ChartConfigPanelProps {\n chartType: ChartType\n chartConfig: ChartAxisConfig\n displayConfig: ChartDisplayConfig\n availableFields: {\n dimensions: string[]\n timeDimensions: string[]\n measures: string[]\n } | null\n onChartConfigChange: (config: ChartAxisConfig) => void\n onDisplayConfigChange: (config: ChartDisplayConfig) => void\n}\n\nexport default function ChartConfigPanel({\n chartType,\n chartConfig,\n displayConfig,\n availableFields,\n onChartConfigChange,\n onDisplayConfigChange\n}: ChartConfigPanelProps) {\n \n // Get configuration for current chart type\n const chartTypeConfig = useMemo(() => \n getChartConfig(chartType, chartConfigRegistry),\n [chartType]\n )\n\n // Get fields for each drop zone\n const getFieldsForDropZone = (key: string): string[] => {\n const value = chartConfig[key as keyof ChartAxisConfig]\n if (Array.isArray(value)) return value\n if (typeof value === 'string') return [value]\n return []\n }\n\n // Clean up chart config when available fields change\n useEffect(() => {\n if (!availableFields) return\n\n const allAvailableFields = [\n ...availableFields.dimensions,\n ...availableFields.timeDimensions,\n ...availableFields.measures\n ]\n\n let hasChanges = false\n const newConfig = { ...chartConfig }\n\n // Check each axis and remove fields that are no longer available\n chartTypeConfig.dropZones.forEach(dropZone => {\n const currentFields = getFieldsForDropZone(dropZone.key)\n const validFields = currentFields.filter(field => allAvailableFields.includes(field))\n \n if (validFields.length !== currentFields.length) {\n hasChanges = true\n if (validFields.length === 0) {\n // Remove the axis property entirely if no valid fields remain\n delete newConfig[dropZone.key as keyof ChartAxisConfig]\n } else if (dropZone.maxItems === 1) {\n // Single field axis - always store as string\n newConfig[dropZone.key as keyof ChartAxisConfig] = validFields[0] as any\n } else {\n // Multi-field axis - always store as array\n newConfig[dropZone.key as keyof ChartAxisConfig] = validFields as any\n }\n }\n })\n\n if (hasChanges) {\n onChartConfigChange(newConfig)\n }\n }, [availableFields, chartConfig, chartTypeConfig.dropZones, onChartConfigChange])\n\n // Helper to determine field type and styling\n const getFieldType = (field: string): 'dimension' | 'timeDimension' | 'measure' => {\n if (!availableFields) return 'dimension'\n if (availableFields.measures.includes(field)) return 'measure'\n if (availableFields.timeDimensions.includes(field)) return 'timeDimension'\n return 'dimension'\n }\n\n const getFieldStyling = (field: string) => {\n const fieldType = getFieldType(field)\n \n switch (fieldType) {\n case 'measure':\n return {\n IconComponent: ChartBarIcon,\n baseClasses: 'bg-amber-100 text-amber-800 border border-amber-200',\n hoverClasses: 'hover:bg-amber-200'\n }\n case 'timeDimension':\n return {\n IconComponent: CalendarIcon,\n baseClasses: 'bg-blue-100 text-blue-800 border border-blue-200',\n hoverClasses: 'hover:bg-blue-200'\n }\n default:\n return {\n IconComponent: TagIcon,\n baseClasses: 'bg-green-100 text-green-800 border border-green-200',\n hoverClasses: 'hover:bg-green-200'\n }\n }\n }\n\n // Drag and drop handlers\n const handleDragStart = (e: React.DragEvent<HTMLDivElement>, field: string, fromAxis: string) => {\n e.dataTransfer.setData('text/plain', JSON.stringify({ field, fromAxis }))\n }\n\n const handleDragOver = (e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault()\n }\n\n const handleDrop = (e: React.DragEvent<HTMLDivElement>, toAxis: string) => {\n e.preventDefault()\n const data = JSON.parse(e.dataTransfer.getData('text/plain'))\n const { field, fromAxis, isReorder } = data\n \n // Don't handle reorder drops here - let the AxisDropZone handle them\n if (isReorder && fromAxis === toAxis) {\n return\n }\n \n const newConfig = { ...chartConfig }\n \n // Remove from old location if moving between axes\n if (fromAxis !== 'available' && fromAxis !== toAxis) {\n const fromValue = newConfig[fromAxis as keyof ChartAxisConfig]\n if (Array.isArray(fromValue)) {\n newConfig[fromAxis as keyof ChartAxisConfig] = fromValue.filter(f => f !== field) as any\n } else if (fromValue === field) {\n delete newConfig[fromAxis as keyof ChartAxisConfig]\n }\n }\n \n // Add to new location\n const toValue = newConfig[toAxis as keyof ChartAxisConfig]\n const dropZoneConfig = chartTypeConfig.dropZones.find(dz => dz.key === toAxis)\n \n if (dropZoneConfig?.maxItems === 1) {\n // Single field - always store as string\n newConfig[toAxis as keyof ChartAxisConfig] = field as any\n } else {\n // Multiple fields - always store as array\n if (Array.isArray(toValue)) {\n if (!toValue.includes(field)) {\n newConfig[toAxis as keyof ChartAxisConfig] = [...toValue, field] as any\n }\n } else {\n newConfig[toAxis as keyof ChartAxisConfig] = [field] as any\n }\n }\n \n onChartConfigChange(newConfig)\n }\n\n const handleRemoveFromAxis = (field: string, fromAxis: string) => {\n const newConfig = { ...chartConfig }\n const value = newConfig[fromAxis as keyof ChartAxisConfig]\n \n if (Array.isArray(value)) {\n newConfig[fromAxis as keyof ChartAxisConfig] = value.filter(f => f !== field) as any\n } else if (value === field) {\n delete newConfig[fromAxis as keyof ChartAxisConfig]\n }\n \n onChartConfigChange(newConfig)\n }\n\n const handleReorder = (fromIndex: number, toIndex: number, axisKey: string) => {\n const newConfig = { ...chartConfig }\n const value = newConfig[axisKey as keyof ChartAxisConfig]\n \n // Only reorder if we have an array with multiple items\n if (Array.isArray(value) && value.length > 1 && fromIndex !== toIndex) {\n const newArray = [...value]\n const [movedItem] = newArray.splice(fromIndex, 1)\n newArray.splice(toIndex, 0, movedItem)\n newConfig[axisKey as keyof ChartAxisConfig] = newArray as any\n onChartConfigChange(newConfig)\n }\n }\n\n // Get unassigned fields\n const getUnassignedFields = () => {\n if (!availableFields) return { dimensions: [], timeDimensions: [], measures: [] }\n \n const assignedFields = new Set<string>()\n chartTypeConfig.dropZones.forEach(dz => {\n getFieldsForDropZone(dz.key).forEach(field => assignedFields.add(field))\n })\n \n return {\n dimensions: availableFields.dimensions.filter(f => !assignedFields.has(f)),\n timeDimensions: availableFields.timeDimensions.filter(f => !assignedFields.has(f)),\n measures: availableFields.measures.filter(f => !assignedFields.has(f))\n }\n }\n\n const unassignedFields = getUnassignedFields()\n\n\n return (\n <div>\n {/* Available Fields */}\n {availableFields && (\n <div className=\"mb-4\">\n <h4 className=\"text-xs font-semibold mb-2\">Available Fields</h4>\n <div className=\"border border-gray-200 rounded-lg p-2 bg-gray-50\">\n {(unassignedFields.dimensions.length > 0 || \n unassignedFields.timeDimensions.length > 0 || \n unassignedFields.measures.length > 0) ? (\n <div className=\"grid grid-cols-1 sm:grid-cols-3 gap-2 sm:gap-2 gap-y-4 sm:gap-y-2\">\n {/* Dimensions Column */}\n <div className=\"pb-2 sm:pb-0\">\n <div className=\"text-xs text-gray-600 mb-2 sm:mb-1 flex items-center\">\n <TagIcon className=\"w-3 h-3 mr-1\" />\n Dimensions\n </div>\n <div className=\"space-y-1\">\n {unassignedFields.dimensions.map(dim => (\n <div\n key={dim}\n draggable\n onDragStart={(e) => handleDragStart(e, dim, 'available')}\n className=\"bg-green-100 text-green-800 border border-green-200 hover:bg-green-200 rounded text-xs cursor-move px-3 py-2 sm:px-2 sm:py-1 truncate\"\n title={dim}\n >\n {dim}\n </div>\n ))}\n {unassignedFields.dimensions.length === 0 && (\n <div className=\"text-xs text-gray-400 italic\">None</div>\n )}\n </div>\n </div>\n \n {/* Time Dimensions Column */}\n <div className=\"pb-2 sm:pb-0\">\n <div className=\"text-xs text-gray-600 mb-2 sm:mb-1 flex items-center\">\n <CalendarIcon className=\"w-3 h-3 mr-1\" />\n Time Dimensions\n </div>\n <div className=\"space-y-1\">\n {unassignedFields.timeDimensions.map(dim => (\n <div\n key={dim}\n draggable\n onDragStart={(e) => handleDragStart(e, dim, 'available')}\n className=\"bg-blue-100 text-blue-800 border border-blue-200 hover:bg-blue-200 rounded text-xs cursor-move px-3 py-2 sm:px-2 sm:py-1 truncate\"\n title={dim}\n >\n {dim}\n </div>\n ))}\n {unassignedFields.timeDimensions.length === 0 && (\n <div className=\"text-xs text-gray-400 italic\">None</div>\n )}\n </div>\n </div>\n \n {/* Measures Column */}\n <div className=\"pb-2 sm:pb-0\">\n <div className=\"text-xs text-gray-600 mb-2 sm:mb-1 flex items-center\">\n <ChartBarIcon className=\"w-3 h-3 mr-1\" />\n Measures\n </div>\n <div className=\"space-y-1\">\n {unassignedFields.measures.map(measure => (\n <div\n key={measure}\n draggable\n onDragStart={(e) => handleDragStart(e, measure, 'available')}\n className=\"bg-amber-100 text-amber-800 border border-amber-200 hover:bg-amber-200 rounded text-xs cursor-move px-3 py-2 sm:px-2 sm:py-1 truncate\"\n title={measure}\n >\n {measure}\n </div>\n ))}\n {unassignedFields.measures.length === 0 && (\n <div className=\"text-xs text-gray-400 italic\">None</div>\n )}\n </div>\n </div>\n </div>\n ) : (\n <div className=\"text-xs text-gray-500 text-center py-2\">\n All fields have been assigned\n </div>\n )}\n </div>\n </div>\n )}\n\n {/* Chart Axis Configuration - Dynamic Drop Zones */}\n <div className=\"mb-4\">\n <h4 className=\"text-xs font-semibold mb-2\">Chart Configuration</h4>\n <div className=\"space-y-1\">\n {chartTypeConfig.dropZones.map(dropZone => (\n <AxisDropZone\n key={dropZone.key}\n config={dropZone}\n fields={getFieldsForDropZone(dropZone.key)}\n onDrop={handleDrop}\n onRemove={handleRemoveFromAxis}\n onDragStart={handleDragStart}\n onDragOver={handleDragOver}\n getFieldStyling={getFieldStyling}\n onReorder={handleReorder}\n />\n ))}\n </div>\n </div>\n\n {/* Display Options */}\n {chartTypeConfig.displayOptions && chartTypeConfig.displayOptions.length > 0 && (\n <div className=\"mb-4\">\n <h4 className=\"text-xs font-semibold mb-2\">Display Options</h4>\n <div className=\"space-y-1\">\n {chartTypeConfig.displayOptions.includes('showLegend') && (\n <label className=\"flex items-center space-x-2\">\n <input\n type=\"checkbox\"\n checked={displayConfig.showLegend ?? true}\n onChange={(e) => onDisplayConfigChange({\n ...displayConfig,\n showLegend: e.target.checked\n })}\n className=\"rounded border-gray-300 text-blue-600 focus:ring-blue-500\"\n />\n <span className=\"text-sm\">Show Legend</span>\n </label>\n )}\n \n {chartTypeConfig.displayOptions.includes('showGrid') && (\n <label className=\"flex items-center space-x-2\">\n <input\n type=\"checkbox\"\n checked={displayConfig.showGrid ?? true}\n onChange={(e) => onDisplayConfigChange({\n ...displayConfig,\n showGrid: e.target.checked\n })}\n className=\"rounded border-gray-300 text-blue-600 focus:ring-blue-500\"\n />\n <span className=\"text-sm\">Show Grid</span>\n </label>\n )}\n \n {chartTypeConfig.displayOptions.includes('showTooltip') && (\n <label className=\"flex items-center space-x-2\">\n <input\n type=\"checkbox\"\n checked={displayConfig.showTooltip ?? true}\n onChange={(e) => onDisplayConfigChange({\n ...displayConfig,\n showTooltip: e.target.checked\n })}\n className=\"rounded border-gray-300 text-blue-600 focus:ring-blue-500\"\n />\n <span className=\"text-sm\">Show Tooltip</span>\n </label>\n )}\n \n {chartTypeConfig.displayOptions.includes('stacked') && (\n <label className=\"flex items-center space-x-2\">\n <input\n type=\"checkbox\"\n checked={displayConfig.stacked ?? false}\n onChange={(e) => onDisplayConfigChange({\n ...displayConfig,\n stacked: e.target.checked\n })}\n className=\"rounded border-gray-300 text-blue-600 focus:ring-blue-500\"\n />\n <span className=\"text-sm\">Stacked</span>\n </label>\n )}\n </div>\n </div>\n )}\n </div>\n )\n}","import { useState } from 'react'\nimport { chartConfigRegistry } from '../charts/chartConfigRegistry'\nimport type { ChartType } from '../types'\n\ninterface ChartTypeSelectorProps {\n selectedType: ChartType\n onTypeChange: (type: ChartType) => void\n className?: string\n}\n\nexport default function ChartTypeSelector({ \n selectedType, \n onTypeChange, \n className = '' \n}: ChartTypeSelectorProps) {\n const [isOpen, setIsOpen] = useState(false)\n const chartTypes = Object.entries(chartConfigRegistry) as [ChartType, typeof chartConfigRegistry[keyof typeof chartConfigRegistry]][]\n\n // Chart type display names (fallback if not in config)\n const chartTypeLabels: Record<ChartType, string> = {\n bar: 'Bar Chart',\n line: 'Line Chart', \n area: 'Area Chart',\n pie: 'Pie Chart',\n scatter: 'Scatter Plot',\n bubble: 'Bubble Chart',\n radar: 'Radar Chart',\n radialBar: 'Radial Bar Chart',\n treemap: 'TreeMap',\n table: 'Data Table'\n }\n\n const selectedConfig = chartConfigRegistry[selectedType]\n const SelectedIcon = selectedConfig?.icon\n const selectedLabel = chartTypeLabels[selectedType]\n\n return (\n <div className={`${className}`}>\n {/* Mobile Dropdown (visible on small screens) */}\n <div className=\"sm:hidden relative\">\n <button\n type=\"button\"\n onClick={() => setIsOpen(!isOpen)}\n className=\"w-full flex items-center justify-between px-3 py-2 border border-gray-300 rounded-md bg-white hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500\"\n >\n <div className=\"flex items-center space-x-2\">\n {SelectedIcon && (\n <SelectedIcon className=\"h-5 w-5 text-gray-600\" />\n )}\n <span className=\"text-sm font-medium text-gray-900\">{selectedLabel}</span>\n </div>\n <svg\n className={`h-4 w-4 text-gray-400 transform transition-transform ${isOpen ? 'rotate-180' : ''}`}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n </button>\n\n {/* Dropdown Menu */}\n {isOpen && (\n <div className=\"absolute z-10 mt-1 w-full bg-white border border-gray-300 rounded-md shadow-lg max-h-60 overflow-auto\">\n {chartTypes.map(([type, config]) => {\n const IconComponent = config.icon\n const label = chartTypeLabels[type]\n const isSelected = selectedType === type\n \n return (\n <button\n key={type}\n type=\"button\"\n onClick={() => {\n onTypeChange(type)\n setIsOpen(false)\n }}\n className={`w-full flex items-center space-x-3 px-3 py-2 text-left hover:bg-gray-50 ${\n isSelected ? 'bg-blue-50 text-blue-900' : 'text-gray-900'\n }`}\n >\n {IconComponent && (\n <IconComponent className={`h-5 w-5 ${\n isSelected ? 'text-blue-600' : 'text-gray-600'\n }`} />\n )}\n <span className=\"text-sm font-medium\">{label}</span>\n {isSelected && (\n <svg className=\"h-4 w-4 text-blue-600 ml-auto\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fillRule=\"evenodd\" d=\"M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z\" clipRule=\"evenodd\" />\n </svg>\n )}\n </button>\n )\n })}\n </div>\n )}\n </div>\n\n {/* Desktop Grid (hidden on small screens) */}\n <div className=\"hidden sm:block\">\n <div className=\"grid grid-cols-3 sm:grid-cols-4 lg:grid-cols-5 gap-2\">\n {chartTypes.map(([type, config]) => {\n const isSelected = selectedType === type\n const IconComponent = config.icon\n const label = chartTypeLabels[type]\n const description = config.description\n const useCase = config.useCase\n \n // Combine description and use case for tooltip\n const tooltipText = [description, useCase].filter(Boolean).join('. ')\n\n return (\n <button\n key={type}\n type=\"button\"\n onClick={() => onTypeChange(type)}\n className={`\n relative p-2 rounded-lg border-2 transition-all duration-200 ease-in-out\n text-center hover:shadow-md group min-h-[70px] flex flex-col items-center justify-center\n ${isSelected \n ? 'border-blue-500 bg-blue-50 shadow-md' \n : 'border-gray-200 bg-white hover:border-gray-300 hover:bg-gray-50'\n }\n `}\n title={tooltipText}\n >\n {/* Icon */}\n {IconComponent && (\n <IconComponent \n className={`h-6 w-6 mb-1.5 ${\n isSelected ? 'text-blue-600' : 'text-gray-600 group-hover:text-gray-800'\n }`} \n />\n )}\n \n {/* Chart name */}\n <h3 className={`font-medium text-xs leading-tight text-center ${\n isSelected ? 'text-blue-900' : 'text-gray-900'\n }`}>\n {label}\n </h3>\n\n {/* Selected indicator */}\n {isSelected && (\n <div className=\"absolute top-1.5 right-1.5\">\n <div className=\"w-2.5 h-2.5 bg-blue-500 rounded-full flex items-center justify-center\">\n <svg className=\"w-1.5 h-1.5 text-white\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fillRule=\"evenodd\" d=\"M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z\" clipRule=\"evenodd\" />\n </svg>\n </div>\n </div>\n )}\n </button>\n )\n })}\n </div>\n </div>\n </div>\n )\n}","import React, { useState, useEffect, useRef } from 'react'\nimport Modal from './Modal'\nimport QueryBuilder from './QueryBuilder'\nimport ChartConfigPanel from './ChartConfigPanel'\nimport ChartTypeSelector from './ChartTypeSelector'\nimport { useCubeContext } from '../providers/CubeProvider'\nimport type { PortletConfig, ChartAxisConfig, ChartDisplayConfig, ChartType } from '../types'\n\ninterface PortletEditModalProps {\n isOpen: boolean\n onClose: () => void\n onSave: (portlet: PortletConfig | Omit<PortletConfig, 'id' | 'x' | 'y'>) => void\n portlet?: PortletConfig | null\n title: string\n submitText: string\n}\n\n\nconst SAMPLE_QUERIES = [\n {\n name: 'Employee Count by Department',\n query: JSON.stringify({\n \"measures\": [\"Employees.count\"],\n \"dimensions\": [\"Departments.name\"],\n \"order\": { \"Employees.count\": \"desc\" }\n }, null, 2)\n },\n {\n name: 'Employee Hiring Trends',\n query: JSON.stringify({\n \"measures\": [\"Employees.count\"],\n \"timeDimensions\": [{\n \"dimension\": \"Employees.createdAt\",\n \"granularity\": \"month\"\n }],\n \"order\": { \"Employees.createdAt\": \"asc\" }\n }, null, 2)\n },\n {\n name: 'Department Budget Analysis',\n query: JSON.stringify({\n \"measures\": [\"Departments.totalBudget\", \"Departments.avgBudget\"],\n \"dimensions\": [\"Departments.name\"],\n \"order\": { \"Departments.totalBudget\": \"desc\" }\n }, null, 2)\n },\n {\n name: 'Daily Productivity Trends',\n query: JSON.stringify({\n \"measures\": [\"Productivity.avgLinesOfCode\", \"Productivity.totalPullRequests\"],\n \"timeDimensions\": [{\n \"dimension\": \"Productivity.date\",\n \"granularity\": \"day\"\n }],\n \"order\": { \"Productivity.date\": \"asc\" }\n }, null, 2)\n },\n {\n name: 'Happiness by Department',\n query: JSON.stringify({\n \"measures\": [\"Productivity.avgHappinessIndex\", \"Productivity.workingDaysCount\"],\n \"dimensions\": [\"Departments.name\"],\n \"order\": { \"Productivity.avgHappinessIndex\": \"desc\" }\n }, null, 2)\n },\n {\n name: 'Employee Salary Overview',\n query: JSON.stringify({\n \"measures\": [\"Employees.count\", \"Employees.avgSalary\", \"Employees.totalSalary\"],\n \"dimensions\": [\"Employees.isActive\"],\n \"order\": { \"Employees.avgSalary\": \"desc\" }\n }, null, 2)\n }\n]\n\nexport default function PortletEditModal({\n isOpen,\n onClose,\n onSave,\n portlet,\n title,\n submitText\n}: PortletEditModalProps) {\n // Get cube client from context\n const { cubeApi } = useCubeContext()\n const [formTitle, setFormTitle] = useState('')\n const [query, setQuery] = useState('')\n const [chartType, setChartType] = useState<ChartType>('bar')\n const [isValidating, setIsValidating] = useState(false)\n const [validationResult, setValidationResult] = useState<{ isValid: boolean; message: string } | null>(null)\n const [lastValidatedQuery, setLastValidatedQuery] = useState<string>('')\n const [dryRunData, setDryRunData] = useState<any>(null)\n const [chartConfig, setChartConfig] = useState<ChartAxisConfig>({ xAxis: [], yAxis: [], series: [] })\n const [displayConfig, setDisplayConfig] = useState<ChartDisplayConfig>({ showLegend: true, showGrid: true, showTooltip: true, stacked: false })\n const [showQueryBuilder, setShowQueryBuilder] = useState(false)\n const [queryBuilderInitialQuery, setQueryBuilderInitialQuery] = useState<any>(null)\n const queryBuilderRef = useRef<any>(null)\n\n // Validation only - no automatic chart config changes\n const autoPopulateChartConfig = (_result: any) => {\n // Do nothing - let the chart configuration panel handle all axis assignments manually\n // This preserves any existing user configuration and doesn't auto-assign fields\n }\n \n // Sensible defaults: slightly larger than 1/3 width with good aspect ratio\n const defaultWidth = 5\n const defaultHeight = 4\n\n\n // Initialize form values when modal opens or portlet changes\n useEffect(() => {\n if (isOpen) {\n if (portlet) {\n // Edit mode - populate with existing data\n setFormTitle(portlet.title)\n const formattedQuery = (() => {\n try {\n return JSON.stringify(JSON.parse(portlet.query), null, 2)\n } catch {\n return portlet.query\n }\n })()\n setQuery(formattedQuery)\n setChartType(portlet.chartType)\n setChartConfig(portlet.chartConfig || { xAxis: [], yAxis: [], series: [] })\n setDisplayConfig(portlet.displayConfig || {})\n setLastValidatedQuery(formattedQuery)\n setValidationResult({ isValid: true, message: 'Loaded query (assumed valid)' })\n setDryRunData(null)\n \n // Auto-run dry-run validation for edit mode to enable chart configuration\n setTimeout(() => {\n runDryRunValidation(formattedQuery, true, true)\n }, 100)\n } else {\n // Create mode - clear form\n setFormTitle('')\n setQuery('')\n setChartType('bar')\n setChartConfig({ xAxis: [], yAxis: [], series: [] })\n setDisplayConfig({ showLegend: true, showGrid: true, showTooltip: true, stacked: false })\n setLastValidatedQuery('')\n setValidationResult(null)\n setDryRunData(null)\n }\n setIsValidating(false)\n }\n }, [isOpen, portlet])\n\n const handleSubmit = (e: React.FormEvent) => {\n console.log('handleSubmit called!')\n e.preventDefault()\n \n if (!formTitle.trim() || !query.trim()) {\n console.log('handleSubmit: missing title or query, returning')\n return\n }\n\n // Require validation before saving only if query has changed\n if (hasQueryChanged || (lastValidatedQuery === '' && query.trim() !== '')) {\n alert('Please validate your query before saving.')\n return\n }\n\n // Validate JSON\n try {\n JSON.parse(query)\n } catch (e) {\n alert('Invalid JSON in query. Please check your syntax.')\n return\n }\n\n if (portlet) {\n // Edit mode - return full portlet config\n onSave({\n ...portlet,\n title: formTitle.trim(),\n query: query.trim(),\n chartType,\n chartConfig: (chartConfig.xAxis?.length ?? 0) > 0 || (chartConfig.yAxis?.length ?? 0) > 0 || (chartConfig.series && chartConfig.series.length > 0) ? chartConfig : undefined,\n displayConfig: displayConfig,\n w: portlet.w || defaultWidth,\n h: portlet.h || defaultHeight\n })\n } else {\n // Create mode - return partial config\n onSave({\n title: formTitle.trim(),\n query: query.trim(),\n chartType,\n chartConfig: (chartConfig.xAxis?.length ?? 0) > 0 || (chartConfig.yAxis?.length ?? 0) > 0 || (chartConfig.series && chartConfig.series.length > 0) ? chartConfig : undefined,\n displayConfig: displayConfig,\n w: defaultWidth,\n h: defaultHeight\n })\n }\n }\n\n const handleSampleQuery = (sampleQuery: string) => {\n setQuery(sampleQuery)\n setValidationResult(null)\n setLastValidatedQuery('')\n setDryRunData(null)\n // Sample queries always clear chart config since they're completely different\n setChartConfig({ xAxis: [], yAxis: [], series: [] })\n }\n\n const handleQueryChange = (value: string) => {\n setQuery(value)\n setValidationResult(null)\n setDryRunData(null)\n // Only clear chart config for new portlets, preserve existing config for edits\n if (!portlet) {\n setChartConfig({ xAxis: [], yAxis: [], series: [] })\n }\n }\n\n const runDryRunValidation = async (queryToValidate: string, silent = false, isEditModeLoad = false) => {\n if (!queryToValidate.trim()) {\n if (!silent) {\n setValidationResult({ isValid: false, message: 'Query cannot be empty' })\n }\n return\n }\n\n let parsedQuery\n try {\n parsedQuery = JSON.parse(queryToValidate)\n } catch (e) {\n if (!silent) {\n setValidationResult({ isValid: false, message: 'Invalid JSON syntax' })\n }\n return\n }\n\n if (!silent) {\n setIsValidating(true)\n setValidationResult(null)\n }\n\n try {\n const result = await cubeApi.dryRun(parsedQuery)\n\n // Check if validation is successful:\n // 1. Must have queryType (always present in successful Cube.js responses) \n // 2. Must not have an error\n const isValid = !result.error && result.queryType\n \n if (isValid) {\n setDryRunData(result)\n \n if (!silent) {\n const details = []\n \n if (result.pivotQuery?.query) {\n if (result.pivotQuery.query.measures?.length > 0) {\n details.push(`${result.pivotQuery.query.measures.length} measure${result.pivotQuery.query.measures.length > 1 ? 's' : ''}`)\n }\n if (result.pivotQuery.query.dimensions?.length > 0) {\n details.push(`${result.pivotQuery.query.dimensions.length} dimension${result.pivotQuery.query.dimensions.length > 1 ? 's' : ''}`)\n }\n if (result.pivotQuery.query.filters?.length > 0) {\n details.push(`${result.pivotQuery.query.filters.length} filter${result.pivotQuery.query.filters.length > 1 ? 's' : ''}`)\n }\n if (result.pivotQuery.query.timeDimensions?.length > 0) {\n details.push(`${result.pivotQuery.query.timeDimensions.length} time dimension${result.pivotQuery.query.timeDimensions.length > 1 ? 's' : ''}`)\n }\n }\n\n if (result.complexity) {\n details.push(`${result.complexity} complexity`)\n }\n if (result.sql?.sql) {\n details.push('SQL generated')\n }\n if (result.cubesUsed?.length > 0) {\n details.push(`Cubes: ${result.cubesUsed.join(', ')}`)\n }\n \n const message = details.length > 0 ? `Query validated successfully (${details.join(', ')})` : 'Query validated successfully'\n setValidationResult({ isValid: true, message })\n setLastValidatedQuery(queryToValidate)\n }\n\n // Auto-populate chart config with sensible defaults on successful validation\n if (!isEditModeLoad) {\n autoPopulateChartConfig(result)\n }\n } else {\n if (!silent) {\n const errorMsg = result.error || 'Query validation failed'\n const details = result.details ? ` - ${Array.isArray(result.details) ? result.details.join(', ') : result.details}` : ''\n setValidationResult({ \n isValid: false, \n message: errorMsg + details\n })\n setLastValidatedQuery(queryToValidate)\n }\n }\n } catch (error) {\n if (!silent) {\n setValidationResult({ \n isValid: false, \n message: error instanceof Error ? error.message : 'Network error during validation' \n })\n setLastValidatedQuery(queryToValidate)\n }\n } finally {\n if (!silent) {\n setIsValidating(false)\n }\n }\n }\n\n const handleValidateQuery = async () => {\n await runDryRunValidation(query)\n }\n\n const handleOpenQueryBuilder = () => {\n // Parse the current query and set it as the initial query for QueryBuilder\n const initialQuery = query ? (() => {\n try {\n return JSON.parse(query)\n } catch {\n return {}\n }\n })() : {}\n \n setQueryBuilderInitialQuery(initialQuery)\n setShowQueryBuilder(true)\n }\n\n\n const handleApplyQueryBuilderQuery = (e?: React.MouseEvent) => {\n e?.preventDefault()\n e?.stopPropagation()\n \n if (!queryBuilderRef.current) return\n \n console.log('Apply Query clicked - starting...')\n \n // Get current query and validation state from QueryBuilder\n const currentQuery = queryBuilderRef.current.getCurrentQuery()\n const validationState = queryBuilderRef.current.getValidationState()\n const validationResult = queryBuilderRef.current.getValidationResult()\n \n console.log('Current query:', currentQuery)\n console.log('Validation state:', validationState)\n console.log('Full validation result:', validationResult)\n \n // Apply the query to the form\n const formattedQuery = JSON.stringify(currentQuery, null, 2)\n setQuery(formattedQuery)\n \n // If QueryBuilder had a valid query, transfer the validation state and dry-run data\n if (validationState?.status === 'valid' && validationResult) {\n setValidationResult({ \n isValid: true, \n message: 'Query validated in Query Builder' \n })\n setLastValidatedQuery(formattedQuery)\n \n // Transfer the dry-run data from QueryBuilder validation result\n setDryRunData(validationResult)\n \n // Auto-populate chart config using the same logic as form validation\n autoPopulateChartConfig(validationResult)\n } else {\n // Reset validation state if query wasn't validated in QueryBuilder\n setValidationResult(null)\n setLastValidatedQuery('')\n setDryRunData(null)\n }\n \n console.log('About to switch back to form mode...')\n \n // Return to form view to continue editing\n setShowQueryBuilder(false)\n \n console.log('Switched back to form mode.')\n }\n\n const handleBackToForm = () => {\n setShowQueryBuilder(false)\n setQueryBuilderInitialQuery(null)\n }\n\n const handleClose = () => {\n setFormTitle('')\n setQuery('')\n setChartType('bar')\n setChartConfig({ xAxis: [], yAxis: [], series: [] })\n setDisplayConfig({ showLegend: true, showGrid: true, showTooltip: true, stacked: false })\n setValidationResult(null)\n setIsValidating(false)\n setLastValidatedQuery('')\n setDryRunData(null)\n setShowQueryBuilder(false)\n setQueryBuilderInitialQuery(null)\n onClose()\n }\n\n const isEditMode = !!portlet\n const hasQueryChanged = query.trim() !== lastValidatedQuery.trim() && lastValidatedQuery !== ''\n const isQueryValidAndCurrent = validationResult?.isValid && query.trim() === lastValidatedQuery.trim()\n\n\n const availableFields = dryRunData?.pivotQuery?.query ? {\n dimensions: dryRunData.pivotQuery.query.dimensions || [],\n timeDimensions: dryRunData.pivotQuery.query.timeDimensions?.map((td: any) => td.dimension) || [],\n measures: dryRunData.pivotQuery.query.measures || []\n } : null\n\n\n const footer = showQueryBuilder ? (\n <>\n <button\n type=\"button\"\n onClick={handleBackToForm}\n className=\"px-4 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-md hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-blue-500\"\n >\n Back to Form\n </button>\n <button\n type=\"button\"\n onClick={handleApplyQueryBuilderQuery}\n className=\"px-4 py-2 text-sm font-medium text-white bg-blue-600 border border-transparent rounded-md hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-blue-500\"\n title=\"Apply query to form\"\n >\n Apply Query\n </button>\n </>\n ) : (\n <>\n <button\n type=\"button\"\n onClick={handleClose}\n className=\"px-4 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-md hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-blue-500\"\n >\n Cancel\n </button>\n <button\n type=\"submit\"\n form=\"portlet-form\"\n className=\"px-4 py-2 text-sm font-medium text-white bg-blue-600 border border-transparent rounded-md hover:bg-blue-700 disabled:opacity-50 disabled:cursor-not-allowed focus:outline-none focus:ring-2 focus:ring-blue-500\"\n disabled={!formTitle.trim() || !query.trim() || (hasQueryChanged || (lastValidatedQuery === '' && query.trim() !== ''))}\n title={(hasQueryChanged || (lastValidatedQuery === '' && query.trim() !== '')) ? \"Please validate your query before saving\" : \"\"}\n >\n {submitText}\n </button>\n </>\n )\n\n return (\n <Modal\n isOpen={isOpen}\n onClose={handleClose}\n title={showQueryBuilder ? \"Query Builder\" : title}\n size=\"fullscreen-mobile\"\n footer={footer}\n noPadding={showQueryBuilder}\n >\n {showQueryBuilder ? (\n <QueryBuilder\n ref={queryBuilderRef}\n initialQuery={queryBuilderInitialQuery}\n disableLocalStorage={true}\n hideSettings={true}\n className=\"flex-1 w-full\"\n />\n ) : (\n <form id=\"portlet-form\" onSubmit={handleSubmit} className=\"space-y-4\">\n {/* Main layout - Responsive: single column on mobile, two columns on desktop */}\n <div className=\"flex flex-col lg:flex-row gap-4\">\n {/* Left side - Title, Chart Type, Query */}\n <div className=\"flex-1 flex flex-col gap-4\">\n {/* Title */}\n <div>\n <label className=\"block text-sm font-semibold text-gray-700 mb-1\">\n Title\n </label>\n <input\n type=\"text\"\n value={formTitle}\n onChange={(e) => setFormTitle(e.target.value)}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500\"\n placeholder=\"Enter portlet title...\"\n required \n />\n </div>\n\n {/* Chart Type */}\n <div>\n <label className=\"block text-sm font-semibold text-gray-700 mb-3\">\n Chart Type\n </label>\n <ChartTypeSelector\n selectedType={chartType}\n onTypeChange={setChartType}\n />\n </div>\n\n\n {/* Query Editor */}\n <div className=\"flex-1 flex flex-col\">\n <div className=\"flex justify-between items-center mb-1\">\n <label className=\"block text-sm font-semibold text-gray-700\">\n Cube.js Query (JSON)\n </label>\n <div className=\"flex items-center space-x-2\">\n <button\n type=\"button\"\n onClick={handleOpenQueryBuilder}\n className=\"text-xs px-2 py-1 text-purple-600 bg-white hover:bg-purple-50 rounded border border-purple-600 hover:border-purple-700 focus:outline-none focus:ring-2 focus:ring-purple-500\"\n >\n Edit in Query Builder\n </button>\n </div>\n </div>\n <textarea\n value={query}\n onChange={(e) => handleQueryChange(e.target.value)}\n className=\"flex-1 w-full min-h-64 px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 font-mono text-xs resize-y\"\n placeholder={`{\n \"measures\": [\"People.count\"],\n \"dimensions\": [\"People.active\"]\n}`}\n required\n />\n </div>\n </div>\n\n {/* Right side - Chart Configuration */}\n <div className=\"flex-1 flex flex-col\">\n <label className=\"block text-sm font-semibold text-gray-700 mb-1\">\n Chart Axis Configuration\n </label>\n \n {!dryRunData || !isQueryValidAndCurrent ? (\n <div className=\"flex-1 flex items-center justify-center border-2 border-dashed border-gray-300 rounded-lg bg-gray-50\">\n <div className=\"text-center text-gray-500\">\n <svg className=\"h-8 w-8 mx-auto mb-2\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M7 16V4m0 0L3 8m4-4l4 4m6 0v12m0 0l4-4m-4 4l-4-4\" />\n </svg>\n <p className=\"text-sm\">Validate query first to configure chart axes</p>\n </div>\n </div>\n ) : (\n <div className=\"rounded-lg bg-white p-3 border border-gray-200\">\n <ChartConfigPanel\n chartType={chartType}\n chartConfig={chartConfig}\n displayConfig={displayConfig}\n availableFields={availableFields}\n onChartConfigChange={setChartConfig}\n onDisplayConfigChange={setDisplayConfig}\n />\n </div>\n )}\n </div>\n </div>\n \n {/* Validation section */}\n {(hasQueryChanged || (lastValidatedQuery === '' && query.trim() !== '') || (validationResult && query.trim() === lastValidatedQuery.trim() && validationResult.message !== 'Loaded query (assumed valid)')) && (\n <div className={`rounded-lg p-4 ${\n validationResult?.isValid && query.trim() === lastValidatedQuery.trim()\n ? 'bg-green-50'\n : validationResult && !validationResult.isValid\n ? 'bg-red-50'\n : hasQueryChanged\n ? 'bg-amber-50'\n : 'bg-gray-50'\n }`}>\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center space-x-3\">\n <div className={`w-2 h-2 rounded-full ${\n validationResult?.isValid && query.trim() === lastValidatedQuery.trim()\n ? 'bg-green-500'\n : validationResult && !validationResult.isValid\n ? 'bg-red-500'\n : hasQueryChanged\n ? 'bg-amber-500'\n : 'bg-gray-400'\n }`}></div>\n <div>\n <h3 className={`text-sm font-medium ${\n validationResult?.isValid && query.trim() === lastValidatedQuery.trim()\n ? 'text-green-800'\n : validationResult && !validationResult.isValid\n ? 'text-red-800'\n : hasQueryChanged\n ? 'text-amber-800'\n : 'text-gray-700'\n }`}>\n {validationResult?.isValid && query.trim() === lastValidatedQuery.trim()\n ? 'Query validated successfully'\n : validationResult && !validationResult.isValid\n ? 'Query validation failed'\n : hasQueryChanged\n ? 'Query modified - validation required'\n : 'Query validation required'\n }\n </h3>\n {validationResult && (\n <p className={`text-xs mt-1 ${\n validationResult.isValid ? 'text-green-600' : 'text-red-600'\n }`}>\n {validationResult.message}\n </p>\n )}\n </div>\n </div>\n \n <button\n type=\"button\"\n onClick={handleValidateQuery}\n disabled={isValidating || !query.trim()}\n className={`px-3 py-1.5 text-sm font-medium rounded-md transition-colors flex items-center space-x-1.5 ${\n validationResult?.isValid && query.trim() === lastValidatedQuery.trim()\n ? 'bg-green-600 text-white hover:bg-green-700'\n : validationResult && !validationResult.isValid\n ? 'bg-red-600 text-white hover:bg-red-700'\n : 'bg-blue-600 text-white hover:bg-blue-700'\n } disabled:opacity-50 disabled:cursor-not-allowed focus:outline-none focus:ring-2 focus:ring-blue-500`}\n >\n {isValidating ? (\n <>\n <svg className=\"animate-spin h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"4\"></circle>\n <path className=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n </svg>\n <span>Validating</span>\n </>\n ) : validationResult?.isValid && query.trim() === lastValidatedQuery.trim() ? (\n <>\n <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n <span>Validated</span>\n </>\n ) : (\n <>\n <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n <span>Validate</span>\n </>\n )}\n </button>\n </div>\n </div>\n )}\n\n {/* Sample Queries - only show for create mode */}\n {!isEditMode && (\n <div>\n <label className=\"block text-sm text-gray-600 mb-2\">Sample Queries (click to use)</label>\n <div className=\"flex flex-wrap gap-2 mb-2\">\n {SAMPLE_QUERIES.map((sample, index) => (\n <button\n key={index}\n type=\"button\"\n onClick={() => handleSampleQuery(sample.query)}\n className=\"px-2 py-1 text-xs text-gray-700 bg-gray-100 border border-gray-300 rounded cursor-pointer transition-all duration-200 ease-in-out hover:bg-gray-200 hover:border-gray-400 m-0.5\"\n >\n {sample.name}\n </button>\n ))}\n </div>\n </div>\n )}\n </form>\n )}\n </Modal>\n )\n}","import { useState, useEffect } from 'react'\n\ninterface DebugModalProps {\n chartConfig: any\n displayConfig: any\n queryObject: any\n data: any[]\n chartType: string\n}\n\nexport default function DebugModal({ \n chartConfig, \n displayConfig, \n queryObject, \n data, \n chartType \n}: DebugModalProps) {\n const [isOpen, setIsOpen] = useState(false)\n\n // Handle ESC key to close modal\n useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape' && isOpen) {\n setIsOpen(false)\n }\n }\n\n document.addEventListener('keydown', handleKeyDown)\n return () => document.removeEventListener('keydown', handleKeyDown)\n }, [isOpen])\n\n // Trigger Prism highlighting when modal opens and content is rendered\n useEffect(() => {\n if (isOpen && typeof window !== 'undefined' && (window as any).Prism) {\n // Small delay to ensure DOM is updated\n const timer = setTimeout(() => {\n (window as any).Prism.highlightAll()\n }, 10)\n \n return () => clearTimeout(timer)\n }\n }, [isOpen])\n\n\n if (!isOpen) {\n return (\n <button\n onClick={() => setIsOpen(true)}\n className=\"p-1 text-gray-400 hover:text-gray-600 transition-colors\"\n title=\"Debug chart configuration\"\n >\n <svg \n width=\"16\" \n height=\"16\" \n viewBox=\"0 0 24 24\" \n fill=\"none\" \n stroke=\"currentColor\" \n strokeWidth=\"2\" \n strokeLinecap=\"round\" \n strokeLinejoin=\"round\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\"/>\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"/>\n <line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"/>\n </svg>\n </button>\n )\n }\n\n return (\n <div \n className=\"absolute inset-0 bg-white border border-gray-200 rounded-lg z-[9999] overflow-auto\"\n onClick={(e) => e.stopPropagation()}\n >\n <div className=\"p-4 h-full flex flex-col\">\n <div className=\"flex justify-between items-center mb-4 flex-shrink-0\">\n <h2 className=\"text-lg font-semibold\">Chart Debug Information</h2>\n <button\n onClick={() => setIsOpen(false)}\n className=\"p-2 text-gray-400 hover:text-gray-600 hover:bg-gray-100 rounded\"\n >\n <svg \n width=\"16\" \n height=\"16\" \n viewBox=\"0 0 24 24\" \n fill=\"none\" \n stroke=\"currentColor\" \n strokeWidth=\"2\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/>\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/>\n </svg>\n </button>\n </div>\n\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-4 flex-1 overflow-auto\">\n <div>\n <h3 className=\"text-sm font-medium text-gray-700 mb-2\">Chart Type</h3>\n <div className=\"bg-gray-50 p-2 rounded text-sm font-mono border\">\n {chartType}\n </div>\n </div>\n\n <div>\n <h3 className=\"text-sm font-medium text-gray-700 mb-2\">Field Analysis</h3>\n <div className=\"bg-gray-50 p-2 rounded text-xs space-y-1 border\">\n <div>\n <strong>xAxis:</strong> {Array.isArray(chartConfig?.xAxis) ? `Array: [${chartConfig.xAxis.join(', ')}]` : `String: \"${chartConfig?.xAxis}\"`}\n </div>\n <div>\n <strong>yAxis:</strong> {Array.isArray(chartConfig?.yAxis) ? `Array: [${chartConfig.yAxis.join(', ')}]` : `String: \"${chartConfig?.yAxis}\"`}\n </div>\n <div>\n <strong>series:</strong> {Array.isArray(chartConfig?.series) ? `Array: [${chartConfig.series.join(', ')}]` : `String: \"${chartConfig?.series}\"`}\n </div>\n {chartConfig?.sizeField && (\n <div>\n <strong>sizeField:</strong> {Array.isArray(chartConfig?.sizeField) ? `Array: [${chartConfig.sizeField.join(', ')}]` : `String: \"${chartConfig?.sizeField}\"`}\n </div>\n )}\n {chartConfig?.colorField && (\n <div>\n <strong>colorField:</strong> {Array.isArray(chartConfig?.colorField) ? `Array: [${chartConfig.colorField.join(', ')}]` : `String: \"${chartConfig?.colorField}\"`}\n </div>\n )}\n </div>\n </div>\n\n <div className=\"lg:col-span-2\">\n <h3 className=\"text-sm font-medium text-gray-700 mb-2\">Chart Config</h3>\n <pre className=\"text-gray-700 overflow-x-auto font-mono p-2 rounded border\" style={{ fontSize: '10px', lineHeight: '1.4' }}>\n <code className=\"language-json\">{JSON.stringify(chartConfig, null, 2)}</code>\n </pre>\n </div>\n\n <div className=\"lg:col-span-2\">\n <h3 className=\"text-sm font-medium text-gray-700 mb-2\">Display Config</h3>\n <pre className=\"text-gray-700 overflow-x-auto font-mono p-2 rounded border\" style={{ fontSize: '10px', lineHeight: '1.4' }}>\n <code className=\"language-json\">{JSON.stringify(displayConfig, null, 2)}</code>\n </pre>\n </div>\n\n <div className=\"lg:col-span-2\">\n <h3 className=\"text-sm font-medium text-gray-700 mb-2\">Query Object</h3>\n <pre className=\"text-gray-700 overflow-x-auto font-mono p-2 rounded border\" style={{ fontSize: '10px', lineHeight: '1.4' }}>\n <code className=\"language-json\">{JSON.stringify(queryObject, null, 2)}</code>\n </pre>\n </div>\n\n <div className=\"lg:col-span-2\">\n <h3 className=\"text-sm font-medium text-gray-700 mb-2\">Data Sample (first 3 rows)</h3>\n <pre className=\"text-gray-700 overflow-x-auto font-mono p-2 rounded border\" style={{ fontSize: '10px', lineHeight: '1.4' }}>\n <code className=\"language-json\">{JSON.stringify(data?.slice(0, 3) || [], null, 2)}</code>\n </pre>\n </div>\n </div>\n\n <div className=\"mt-4 pt-2 border-t border-gray-200 text-xs text-gray-500 flex-shrink-0\">\n Press <kbd className=\"px-1 py-0.5 bg-gray-100 rounded text-xs\">ESC</kbd> to close\n </div>\n </div>\n </div>\n )\n}","/**\n * Dashboard Grid Component\n * Uses react-grid-layout for responsive grid layout\n * Simplified version without app-specific dependencies\n */\n\nimport { useCallback, useRef, useState, useEffect } from 'react'\nimport { Responsive, WidthProvider } from 'react-grid-layout'\nimport { ChartBarIcon, ArrowPathIcon, PencilIcon, TrashIcon, PlusIcon } from '@heroicons/react/24/outline'\nimport AnalyticsPortlet from './AnalyticsPortlet'\nimport PortletEditModal from './PortletEditModal'\nimport DebugModal from './DebugModal'\nimport type { DashboardConfig, PortletConfig } from '../types'\n\n// CSS for react-grid-layout should be imported by the consuming app\n// import 'react-grid-layout/css/styles.css'\n\nconst ResponsiveGridLayout = WidthProvider(Responsive)\n\ninterface DashboardGridProps {\n config: DashboardConfig\n editable?: boolean\n onConfigChange?: (config: DashboardConfig) => void\n onPortletRefresh?: (portletId: string) => void\n onSave?: (config: DashboardConfig) => Promise<void> | void\n}\n\nexport default function DashboardGrid({ \n config, \n editable = false, \n onConfigChange,\n onPortletRefresh,\n onSave\n}: DashboardGridProps) {\n // Refs to store portlet refs for refresh functionality\n const portletRefs = useRef<{ [key: string]: HTMLDivElement | null }>({})\n const portletComponentRefs = useRef<{ [key: string]: { refresh: () => void } | null }>({})\n\n // Track if component has been initialized to prevent saves during initial load\n const [isInitialized, setIsInitialized] = useState(false)\n const [lastKnownLayout, setLastKnownLayout] = useState<any[]>([])\n \n // Edit mode state - dashboard is readonly by default\n const [isEditMode, setIsEditMode] = useState(false)\n \n // Track current breakpoint to handle mobile vs desktop saves differently\n const [currentBreakpoint, setCurrentBreakpoint] = useState<string>('lg')\n \n // Track scroll state for sticky header\n const [isScrolled, setIsScrolled] = useState(false)\n\n // Modal states\n const [isPortletModalOpen, setIsPortletModalOpen] = useState(false)\n const [editingPortlet, setEditingPortlet] = useState<PortletConfig | null>(null)\n\n // Debug data state - keyed by portlet ID\n const [debugData, setDebugData] = useState<{ [portletId: string]: {\n chartConfig: any\n displayConfig: any\n queryObject: any\n data: any[]\n chartType: string\n } }>({})\n\n // Set up initialization tracking\n useEffect(() => {\n // Mark as initialized after first render to prevent saves during load/resize\n const timer = setTimeout(() => {\n setIsInitialized(true)\n // Store initial layout for comparison\n const initialLayout = config.portlets.map(portlet => ({\n i: portlet.id,\n x: portlet.x,\n y: portlet.y,\n w: portlet.w,\n h: portlet.h\n }))\n setLastKnownLayout(initialLayout)\n }, 200) // Slightly longer delay to ensure responsive grid is fully settled\n\n return () => clearTimeout(timer)\n }, [config.portlets])\n\n // Set up scroll listener for sticky header\n useEffect(() => {\n const handleScroll = () => {\n const scrollTop = window.pageYOffset || document.documentElement.scrollTop\n setIsScrolled(scrollTop > 20) // Add sticky styling after scrolling 20px\n }\n\n window.addEventListener('scroll', handleScroll, { passive: true })\n \n // Check initial scroll position\n handleScroll()\n\n return () => {\n window.removeEventListener('scroll', handleScroll)\n }\n }, [])\n\n // Helper function to check if layout actually changed (not just reordered due to responsive changes)\n const hasLayoutActuallyChanged = useCallback((newLayout: any[]) => {\n if (!isInitialized || lastKnownLayout.length === 0) return false\n \n // Compare each item's position and size\n for (const newItem of newLayout) {\n const oldItem = lastKnownLayout.find(item => item.i === newItem.i)\n if (!oldItem) continue // New item, this is a change\n \n if (oldItem.x !== newItem.x || oldItem.y !== newItem.y || \n oldItem.w !== newItem.w || oldItem.h !== newItem.h) {\n return true\n }\n }\n return false\n }, [isInitialized, lastKnownLayout])\n\n const handleLayoutChange = useCallback((_currentLayout: any[], _allLayouts: any) => {\n // This function is called for ALL layout changes including responsive breakpoints\n // We should NOT save here - only update internal state if needed\n // Actual saving only happens in handleDragStop and handleResizeStop for explicit user actions\n \n // Note: We don't call onConfigChange here to prevent saving responsive layout changes\n // The layout changes are handled by react-grid-layout internally\n }, []) // No dependencies since we're not doing anything\n\n // Handle drag stop - save when user finishes dragging (only if layout actually changed)\n const handleDragStop = useCallback(async (layout: any[], _oldItem: any, _newItem: any, _placeholder: any, _e: any, _element: any) => {\n if (!editable || !isEditMode || !onSave || !isInitialized) return\n\n // Only save if the layout actually changed from user interaction\n if (!hasLayoutActuallyChanged(layout)) {\n return // No actual change, don't save\n }\n\n // Get the current updated config - on mobile only update position, preserve desktop sizing\n const updatedPortlets = config.portlets.map(portlet => {\n const layoutItem = layout.find(item => item.i === portlet.id)\n if (layoutItem) {\n if (currentBreakpoint === 'lg') {\n // Desktop: update everything (position and size)\n return {\n ...portlet,\n x: layoutItem.x,\n y: layoutItem.y,\n w: layoutItem.w,\n h: layoutItem.h\n }\n } else {\n // Mobile/tablet: only update position, preserve original size\n return {\n ...portlet,\n x: layoutItem.x,\n y: layoutItem.y,\n // Keep original desktop w and h\n w: portlet.w,\n h: portlet.h\n }\n }\n }\n return portlet\n })\n\n // Preserve existing responsive layouts, only update with new lg layout\n const updatedConfig = {\n portlets: updatedPortlets,\n layouts: {\n ...config.layouts,\n lg: layout // Only save the large layout, let RGL handle responsive adjustments\n }\n }\n\n // Update our tracking of the last known layout\n setLastKnownLayout(layout)\n\n // Update config state first\n onConfigChange?.(updatedConfig)\n\n // Auto-save after drag operation\n try {\n await onSave(updatedConfig)\n } catch (error) {\n console.error('Auto-save failed after drag:', error)\n }\n }, [config.portlets, config.layouts, editable, isEditMode, currentBreakpoint, onConfigChange, onSave, isInitialized, hasLayoutActuallyChanged])\n\n // Handle resize stop - update config and save (resize is user interaction)\n const handleResizeStop = useCallback(async (layout: any[], _oldItem: any, _newItem: any, _placeholder: any, _e: any, _element: any) => {\n if (!editable || !isEditMode || !onConfigChange || !isInitialized) return\n\n // Only proceed if the layout actually changed from user interaction\n if (!hasLayoutActuallyChanged(layout)) {\n return // No actual change, don't save\n }\n\n // Get the current updated config - on mobile only update position, preserve desktop sizing\n const updatedPortlets = config.portlets.map(portlet => {\n const layoutItem = layout.find(item => item.i === portlet.id)\n if (layoutItem) {\n if (currentBreakpoint === 'lg') {\n // Desktop: update everything (position and size)\n return {\n ...portlet,\n x: layoutItem.x,\n y: layoutItem.y,\n w: layoutItem.w,\n h: layoutItem.h\n }\n } else {\n // Mobile/tablet: only update position, preserve original size\n return {\n ...portlet,\n x: layoutItem.x,\n y: layoutItem.y,\n // Keep original desktop w and h\n w: portlet.w,\n h: portlet.h\n }\n }\n }\n return portlet\n })\n\n // Preserve existing responsive layouts, only update with new lg layout\n const updatedConfig = {\n portlets: updatedPortlets,\n layouts: {\n ...config.layouts,\n lg: layout // Only save the large layout, let RGL handle responsive adjustments\n }\n }\n\n // Update our tracking of the last known layout\n setLastKnownLayout(layout)\n\n // Update config state\n onConfigChange(updatedConfig)\n\n // Auto-save after resize operation (user deliberately resized)\n if (onSave) {\n try {\n await onSave(updatedConfig)\n } catch (error) {\n console.error('Auto-save failed after resize:', error)\n }\n }\n }, [config.portlets, config.layouts, editable, isEditMode, currentBreakpoint, onConfigChange, onSave, isInitialized, hasLayoutActuallyChanged])\n\n // Handle portlet refresh\n const handlePortletRefresh = useCallback((portletId: string) => {\n const portletComponent = portletComponentRefs.current[portletId]\n if (portletComponent && portletComponent.refresh) {\n portletComponent.refresh()\n }\n if (onPortletRefresh) {\n onPortletRefresh(portletId)\n }\n }, [onPortletRefresh])\n\n // Handle adding new portlet\n const handleAddPortlet = useCallback(() => {\n setEditingPortlet(null)\n setIsPortletModalOpen(true)\n }, [])\n\n // Handle editing existing portlet\n const handleEditPortlet = useCallback((portlet: PortletConfig) => {\n setEditingPortlet(portlet)\n setIsPortletModalOpen(true)\n }, [])\n\n // Handle portlet save\n const handlePortletSave = useCallback(async (portletData: PortletConfig | Omit<PortletConfig, 'id' | 'x' | 'y'>) => {\n if (!onConfigChange) return\n\n let updatedPortlets = [...config.portlets]\n\n if (editingPortlet) {\n // Editing existing portlet\n const index = updatedPortlets.findIndex(p => p.id === editingPortlet.id)\n if (index !== -1) {\n updatedPortlets[index] = portletData as PortletConfig\n }\n } else {\n // Adding new portlet\n const newPortlet: PortletConfig = {\n ...portletData,\n id: `portlet-${Date.now()}`,\n x: 0,\n y: 0\n } as PortletConfig\n\n // Find the best position for the new portlet\n const gridLayout = updatedPortlets.map(p => ({ i: p.id, x: p.x, y: p.y, w: p.w, h: p.h }))\n let maxY = 0\n gridLayout.forEach(item => {\n if (item.y + item.h > maxY) {\n maxY = item.y + item.h\n }\n })\n newPortlet.y = maxY\n\n updatedPortlets.push(newPortlet)\n }\n\n const updatedConfig = {\n ...config,\n portlets: updatedPortlets\n }\n\n onConfigChange(updatedConfig)\n\n // Auto-save if handler is provided\n if (onSave) {\n try {\n await onSave(updatedConfig)\n } catch (error) {\n console.error('Auto-save failed:', error)\n }\n }\n\n setIsPortletModalOpen(false)\n setEditingPortlet(null)\n }, [config, editingPortlet, onConfigChange, onSave])\n\n // Handle deleting portlet\n const handleDeletePortlet = useCallback(async (portletId: string) => {\n if (!onConfigChange) return\n \n if (window.confirm('Are you sure you want to delete this portlet?')) {\n const updatedPortlets = config.portlets.filter(p => p.id !== portletId)\n const updatedConfig = {\n ...config,\n portlets: updatedPortlets\n }\n \n onConfigChange(updatedConfig)\n\n // Auto-save if handler is provided\n if (onSave) {\n try {\n await onSave(updatedConfig)\n } catch (error) {\n console.error('Auto-save failed:', error)\n }\n }\n }\n }, [config, onConfigChange, onSave])\n\n if (!config.portlets || config.portlets.length === 0) {\n return (\n <>\n <div className=\"flex justify-center items-center min-h-[50vh]\">\n <div className=\"text-center\">\n <ChartBarIcon style={{ width: '64px', height: '64px', color: '#9ca3af', margin: '0 auto 16px auto' }} />\n <h3 className=\"text-lg font-semibold mb-2\">No Portlets</h3>\n <p className=\"text-sm text-gray-600 mb-4\">Add your first portlet to start visualizing your data</p>\n {editable && (\n <button\n onClick={handleAddPortlet}\n className=\"inline-flex items-center px-4 py-2 border border-blue-300 text-blue-700 bg-white rounded-md hover:bg-blue-50 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2\"\n >\n <PlusIcon className=\"w-5 h-5 mr-2\" />\n Add Portlet\n </button>\n )}\n </div>\n </div>\n \n {/* Portlet Modal */}\n <PortletEditModal\n isOpen={isPortletModalOpen}\n onClose={() => {\n setIsPortletModalOpen(false)\n setEditingPortlet(null)\n }}\n onSave={handlePortletSave}\n portlet={editingPortlet}\n title={editingPortlet ? 'Edit Portlet' : 'Add New Portlet'}\n submitText={editingPortlet ? 'Update Portlet' : 'Add Portlet'}\n />\n </>\n )\n }\n\n // Generate grid layout from portlets - only use for lg (desktop) breakpoint\n // Let react-grid-layout handle responsive adjustments automatically\n const baseLayout = config.portlets.map(portlet => ({\n i: portlet.id,\n x: portlet.x,\n y: portlet.y,\n w: portlet.w,\n h: portlet.h,\n minW: 3,\n minH: 3\n }))\n\n // Create responsive layouts - use stored layouts if available, otherwise let RGL auto-generate\n // The key insight: only the 'lg' layout should be controlled by our stored portlet positions\n // All other breakpoints should be auto-generated by react-grid-layout for proper responsive behavior\n const responsiveLayouts = {\n lg: baseLayout // Only control the large desktop layout, let RGL handle all responsive adjustments\n }\n\n\n return (\n <>\n {editable && (\n <div className={`mb-4 flex justify-between items-center sticky top-0 z-10 px-4 py-4 bg-blue-100 border border-gray-200 rounded-lg shadow-sm transition-all duration-200 ${\n isScrolled ? 'border-b border-gray-200 shadow-md' : ''\n }`}>\n <div className=\"flex items-center gap-4\">\n <button\n onClick={() => setIsEditMode(!isEditMode)}\n className={`inline-flex items-center px-4 py-2 text-sm font-medium rounded-md transition-colors focus:outline-none focus:ring-2 focus:ring-purple-500 focus:ring-offset-2 ${\n isEditMode\n ? 'bg-purple-50 text-purple-700 border border-purple-200 hover:bg-purple-100'\n : 'bg-white text-purple-700 border border-purple-300 hover:bg-purple-50'\n }`}\n >\n <PencilIcon className=\"w-4 h-4 mr-1.5\" />\n {isEditMode ? 'Finished Editing' : 'Edit'}\n </button>\n {isEditMode && (\n <p className=\"hidden md:block text-sm text-gray-500\">\n Drag to rearrange • Resize from corners • Changes save automatically\n </p>\n )}\n </div>\n \n <button\n onClick={handleAddPortlet}\n disabled={!isEditMode}\n className={`inline-flex items-center px-4 py-2 text-sm font-medium border rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 ${\n isEditMode\n ? 'border-blue-300 text-blue-700 bg-white hover:bg-blue-50'\n : 'border-gray-300 text-gray-400 bg-gray-50 cursor-not-allowed'\n }`}\n >\n <PlusIcon className=\"w-5 h-5 mr-2\" />\n Add Portlet\n </button>\n </div>\n )}\n \n <ResponsiveGridLayout\n className=\"layout\"\n layouts={responsiveLayouts}\n onLayoutChange={handleLayoutChange}\n onDragStop={handleDragStop}\n onResizeStop={handleResizeStop}\n onBreakpointChange={(newBreakpoint) => setCurrentBreakpoint(newBreakpoint)}\n breakpoints={{ lg: 1200, md: 996, sm: 768, xs: 480, xxs: 0 }}\n cols={{ lg: 12, md: 10, sm: 6, xs: 4, xxs: 2 }}\n isDraggable={editable && isEditMode}\n isResizable={editable && isEditMode}\n draggableHandle=\".portlet-drag-handle\"\n margin={{ lg: [16, 16], md: [12, 12], sm: [8, 8], xs: [6, 6], xxs: [4, 4] }}\n containerPadding={[0, 0]}\n rowHeight={80}\n compactType=\"vertical\"\n preventCollision={false}\n >\n {config.portlets.map(portlet => (\n <div \n key={portlet.id}\n data-portlet-id={portlet.id}\n ref={el => { portletRefs.current[portlet.id] = el }}\n className=\"bg-white border border-gray-200 rounded-lg shadow-sm flex flex-col h-full\"\n >\n {/* Portlet Header */}\n <div className={`flex items-center justify-between px-3 py-2 md:px-4 md:py-3 border-b border-gray-200 flex-shrink-0 bg-gray-50 rounded-t-lg portlet-drag-handle ${isEditMode ? 'cursor-move' : 'cursor-default'}`}>\n <div className=\"flex items-center gap-2 flex-1 min-w-0\">\n <h3 className=\"font-semibold text-sm text-gray-900 truncate\">{portlet.title}</h3>\n {/* Debug button - right next to title, outside drag area */}\n {debugData[portlet.id] && (\n <div \n onMouseDown={(e) => e.stopPropagation()} \n onClick={(e) => e.stopPropagation()}\n onTouchStart={(e) => e.stopPropagation()}\n onTouchEnd={(e) => e.stopPropagation()}\n >\n <DebugModal \n chartConfig={debugData[portlet.id].chartConfig}\n displayConfig={debugData[portlet.id].displayConfig}\n queryObject={debugData[portlet.id].queryObject}\n data={debugData[portlet.id].data}\n chartType={debugData[portlet.id].chartType}\n />\n </div>\n )}\n </div>\n <div \n className=\"flex items-center gap-3 flex-shrink-0 ml-4 -mr-2\" \n onMouseDown={(e) => e.stopPropagation()} \n onClick={(e) => e.stopPropagation()}\n onTouchStart={(e) => e.stopPropagation()}\n onTouchEnd={(e) => e.stopPropagation()}\n >\n \n <button\n onClick={(e) => {\n e.stopPropagation()\n handlePortletRefresh(portlet.id)\n }}\n onTouchEnd={(e) => {\n e.stopPropagation()\n e.preventDefault()\n handlePortletRefresh(portlet.id)\n }}\n className=\"p-2 bg-transparent border-none rounded text-gray-600 cursor-pointer hover:bg-gray-200 transition-colors\"\n title=\"Refresh portlet data\"\n >\n <ArrowPathIcon style={{ width: '16px', height: '16px', color: 'currentColor' }} />\n </button>\n {editable && isEditMode && (\n <>\n <button\n onClick={(e) => {\n e.stopPropagation()\n handleEditPortlet(portlet)\n }}\n onTouchEnd={(e) => {\n e.stopPropagation()\n e.preventDefault()\n handleEditPortlet(portlet)\n }}\n className=\"p-2 bg-transparent border-none rounded text-gray-600 cursor-pointer hover:bg-gray-200 transition-colors\"\n title=\"Edit portlet\"\n >\n <PencilIcon style={{ width: '16px', height: '16px', color: 'currentColor' }} />\n </button>\n <button\n onClick={(e) => {\n e.stopPropagation()\n handleDeletePortlet(portlet.id)\n }}\n onTouchEnd={(e) => {\n e.stopPropagation()\n e.preventDefault()\n handleDeletePortlet(portlet.id)\n }}\n className=\"p-2 bg-transparent border-none rounded text-gray-600 cursor-pointer hover:bg-gray-200 transition-colors\"\n title=\"Delete portlet\"\n >\n <TrashIcon style={{ width: '16px', height: '16px', color: 'currentColor' }} />\n </button>\n </>\n )}\n </div>\n </div>\n\n {/* Portlet Content */}\n <div className=\"flex-1 px-2 py-3 md:px-4 md:py-4 min-h-0 overflow-visible flex flex-col\">\n <AnalyticsPortlet\n ref={el => { portletComponentRefs.current[portlet.id] = el }}\n query={portlet.query}\n chartType={portlet.chartType}\n chartConfig={portlet.chartConfig}\n displayConfig={portlet.displayConfig}\n title={portlet.title}\n height=\"100%\"\n onDebugDataReady={(data) => {\n setDebugData(prev => ({\n ...prev,\n [portlet.id]: data\n }))\n }}\n />\n </div>\n </div>\n ))}\n </ResponsiveGridLayout>\n \n {/* Portlet Modal */}\n <PortletEditModal\n isOpen={isPortletModalOpen}\n onClose={() => {\n setIsPortletModalOpen(false)\n setEditingPortlet(null)\n }}\n onSave={handlePortletSave}\n portlet={editingPortlet}\n title={editingPortlet ? 'Edit Portlet' : 'Add New Portlet'}\n submitText={editingPortlet ? 'Update Portlet' : 'Add Portlet'}\n />\n </>\n )\n}","/**\n * Analytics Dashboard Component\n * Main dashboard container that uses CubeProvider context\n * Minimal dependencies, designed to be embedded in existing apps\n */\n\nimport { useCallback, useRef } from 'react'\nimport DashboardGrid from './DashboardGrid'\nimport type { AnalyticsDashboardProps, DashboardConfig } from '../types'\n\nexport default function AnalyticsDashboard({\n config,\n editable = false,\n onConfigChange,\n onSave,\n onDirtyStateChange\n}: AnalyticsDashboardProps) {\n // Track initial config to prevent saves during initial load\n const initialConfigRef = useRef(config)\n const hasConfigChangedFromInitial = useRef(false)\n\n // Enhanced save handler that tracks dirty state and prevents saves during initial load\n const handleSaveWithDirtyTracking = useCallback(async (config: DashboardConfig) => {\n // Don't save if this config hasn't actually changed from the initial load\n if (!hasConfigChangedFromInitial.current) {\n return // Prevent saves during initial load/responsive changes\n }\n \n if (onDirtyStateChange) {\n onDirtyStateChange(true) // Mark as dirty when save starts\n }\n \n try {\n if (onSave) {\n await onSave(config)\n }\n \n // Update our reference point after successful save\n initialConfigRef.current = config\n \n // Mark as clean after successful save\n if (onDirtyStateChange) {\n onDirtyStateChange(false)\n }\n } catch (error) {\n // Keep dirty state if save failed\n console.error('Save failed:', error)\n throw error\n }\n }, [onSave, onDirtyStateChange])\n\n // Enhanced config change handler that marks as dirty (only after initial load)\n const handleConfigChangeWithDirtyTracking = useCallback((config: DashboardConfig) => {\n if (onConfigChange) {\n onConfigChange(config)\n }\n \n // Check if this is a meaningful change from the initial config\n const configString = JSON.stringify(config)\n const initialConfigString = JSON.stringify(initialConfigRef.current)\n \n if (configString !== initialConfigString) {\n hasConfigChangedFromInitial.current = true\n \n if (onDirtyStateChange) {\n onDirtyStateChange(true)\n }\n }\n }, [onConfigChange, onDirtyStateChange])\n\n return (\n <div className=\"w-full\">\n <DashboardGrid \n config={config}\n editable={editable}\n onConfigChange={handleConfigChangeWithDirtyTracking}\n onSave={handleSaveWithDirtyTracking}\n />\n </div>\n )\n}","/**\n * Portlet Container Component\n * Simple wrapper for individual portlets\n */\n\nimport { useState } from 'react'\nimport AnalyticsPortlet from './AnalyticsPortlet'\nimport DebugModal from './DebugModal'\nimport type { PortletConfig } from '../types'\n\ninterface PortletContainerProps {\n portlet: PortletConfig\n editable?: boolean\n onEdit?: (portlet: PortletConfig) => void\n onDelete?: (portletId: string) => void\n onRefresh?: (portletId: string) => void\n}\n\nexport default function PortletContainer({ \n portlet, \n editable = false,\n onEdit,\n onDelete,\n onRefresh\n}: PortletContainerProps) {\n const [debugData, setDebugData] = useState<{\n chartConfig: any\n displayConfig: any\n queryObject: any\n data: any[]\n chartType: string\n } | null>(null)\n\n return (\n <div className=\"bg-white border border-gray-200 rounded-lg shadow-sm flex flex-col h-full\">\n {/* Header */}\n <div className=\"flex items-center justify-between border-b border-gray-200 flex-shrink-0 bg-gray-50 rounded-t-lg px-3 py-2 md:px-6 md:py-3\">\n <div className=\"flex items-center gap-2 flex-1 min-w-0\">\n <h3 className=\"font-semibold text-sm truncate\">{portlet.title}</h3>\n {/* Debug button - right next to title */}\n {debugData && (\n <DebugModal \n chartConfig={debugData.chartConfig}\n displayConfig={debugData.displayConfig}\n queryObject={debugData.queryObject}\n data={debugData.data}\n chartType={debugData.chartType}\n />\n )}\n </div>\n \n <div className=\"flex items-center gap-2 ml-4\">\n \n {editable && (\n <>\n <button\n onClick={() => onRefresh?.(portlet.id)}\n className=\"p-1.5 hover:bg-gray-200 rounded text-gray-600\"\n title=\"Refresh\"\n >\n <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15\" />\n </svg>\n </button>\n <button\n onClick={() => onEdit?.(portlet)}\n className=\"p-1.5 hover:bg-gray-200 rounded text-gray-600\"\n title=\"Edit\"\n >\n <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z\" />\n </svg>\n </button>\n <button\n onClick={() => onDelete?.(portlet.id)}\n className=\"p-1.5 hover:bg-red-100 rounded text-red-600\"\n title=\"Delete\"\n >\n <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\" />\n </svg>\n </button>\n </>\n )}\n </div>\n </div>\n\n {/* Content */}\n <div className=\"px-2 py-3 md:px-4 md:pt-6 md:pb-4 flex-1 min-h-0\">\n <AnalyticsPortlet\n query={portlet.query}\n chartType={portlet.chartType}\n chartConfig={portlet.chartConfig}\n displayConfig={portlet.displayConfig}\n title={portlet.title}\n height=\"100%\"\n onDebugDataReady={(data) => {\n console.log('PortletContainer: onDebugDataReady called with:', data)\n setDebugData(data)\n }}\n />\n </div>\n </div>\n )\n}","import React, { useState, useEffect } from 'react'\nimport Modal from './Modal'\n\ninterface DashboardEditModalProps {\n isOpen: boolean\n onClose: () => void\n onSave: (data: { name: string; description?: string }) => Promise<void> | void\n title: string\n submitText: string\n initialName?: string\n initialDescription?: string\n}\n\nexport default function DashboardEditModal({\n isOpen,\n onClose,\n onSave,\n title,\n submitText,\n initialName = '',\n initialDescription = ''\n}: DashboardEditModalProps) {\n const [name, setName] = useState('')\n const [description, setDescription] = useState('')\n const [isSaving, setIsSaving] = useState(false)\n\n // Initialize form values when modal opens\n useEffect(() => {\n if (isOpen) {\n setName(initialName)\n setDescription(initialDescription)\n }\n }, [isOpen, initialName, initialDescription])\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault()\n \n if (!name.trim()) {\n return\n }\n\n setIsSaving(true)\n \n try {\n await onSave({\n name: name.trim(),\n description: description.trim() || undefined\n })\n handleClose()\n } catch (error) {\n console.error('Failed to save dashboard:', error)\n // Don't close modal on error so user can retry\n } finally {\n setIsSaving(false)\n }\n }\n\n const handleClose = () => {\n setName('')\n setDescription('')\n setIsSaving(false)\n onClose()\n }\n\n const footer = (\n <>\n <button\n type=\"button\"\n onClick={handleClose}\n disabled={isSaving}\n className=\"px-4 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-md hover:bg-gray-50 disabled:opacity-50\"\n >\n Cancel\n </button>\n <button\n type=\"submit\"\n form=\"dashboard-form\"\n disabled={isSaving || !name.trim()}\n className=\"px-4 py-2 text-sm font-medium text-white bg-blue-600 border border-transparent rounded-md hover:bg-blue-700 disabled:opacity-50 disabled:cursor-not-allowed\"\n >\n {isSaving ? 'Saving...' : submitText}\n </button>\n </>\n )\n\n return (\n <Modal\n isOpen={isOpen}\n onClose={handleClose}\n title={title}\n size=\"fullscreen-mobile\"\n footer={footer}\n >\n <form id=\"dashboard-form\" onSubmit={handleSubmit} className=\"space-y-4 w-full\">\n <div>\n <label htmlFor=\"dashboard-name\" className=\"block text-sm font-medium text-gray-700 mb-1\">\n Dashboard Name\n </label>\n <input\n type=\"text\"\n id=\"dashboard-name\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500\"\n placeholder=\"Enter dashboard name...\"\n required\n autoFocus\n />\n </div>\n \n <div>\n <label htmlFor=\"dashboard-description\" className=\"block text-sm font-medium text-gray-700 mb-1\">\n Description (optional)\n </label>\n <textarea\n id=\"dashboard-description\"\n rows={3}\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500\"\n placeholder=\"Enter description...\"\n />\n </div>\n </form>\n </Modal>\n )\n}"],"names":["ChartErrorBoundary","Component","props","__publicField","error","errorInfo","jsxs","jsx","_a","_b","ArrowPathIcon","extent","values","valueof","min","max","value","index","identity","x","top","right","bottom","left","epsilon","translateX","translateY","y","number","scale","d","center","offset","entering","axis","orient","tickArguments","tickValues","tickFormat","tickSizeInner","tickSizeOuter","tickPadding","k","transform","context","format","spacing","range","range0","range1","position","selection","path","tick","tickExit","tickEnter","line","text","p","_","axisBottom","axisLeft","xhtml","namespaces","namespace","name","prefix","i","creatorInherit","document","uri","creatorFixed","fullname","creator","none","selector","selection_select","select","groups","m","subgroups","j","group","n","subgroup","node","subnode","Selection","array","empty","selectorAll","arrayAll","selection_selectAll","parents","matcher","childMatcher","find","childFind","match","childFirst","selection_selectChild","filter","children","childrenFilter","selection_selectChildren","selection_filter","sparse","update","selection_enter","EnterNode","parent","datum","child","next","constant","bindIndex","enter","exit","data","groupLength","dataLength","bindKey","key","nodeByKeyValue","keyValues","keyValue","selection_data","bind","arraylike","enterGroup","updateGroup","exitGroup","i0","i1","previous","selection_exit","selection_join","onenter","onupdate","onexit","selection_merge","groups0","groups1","m0","m1","merges","group0","group1","merge","selection_order","selection_sort","compare","ascending","compareNode","a","b","sortgroups","sortgroup","selection_call","callback","selection_nodes","selection_node","selection_size","size","selection_empty","selection_each","attrRemove","attrRemoveNS","attrConstant","attrConstantNS","attrFunction","v","attrFunctionNS","selection_attr","defaultView","styleRemove","styleConstant","priority","styleFunction","selection_style","styleValue","propertyRemove","propertyConstant","propertyFunction","selection_property","classArray","string","classList","ClassList","classedAdd","names","list","classedRemove","classedTrue","classedFalse","classedFunction","selection_classed","textRemove","textConstant","textFunction","selection_text","htmlRemove","htmlConstant","htmlFunction","selection_html","raise","selection_raise","lower","selection_lower","selection_append","create","constantNull","selection_insert","before","remove","selection_remove","selection_cloneShallow","clone","selection_cloneDeep","selection_clone","deep","selection_datum","contextListener","listener","event","parseTypenames","typenames","t","onRemove","typename","on","o","onAdd","options","selection_on","dispatchEvent","type","params","window","dispatchConstant","dispatchFunction","selection_dispatch","selection_iterator","root","selection_selection","transformPow","exponent","transformSqrt","transformSquare","powish","rescale","linearish","pow","transformer","copy","initRange","sqrt","BubbleChart","chartConfig","displayConfig","queryObject","height","svgRef","useRef","containerRef","setHoveredBubble","useState","dimensions","setDimensions","dimensionsReady","setDimensionsReady","getFieldLabel","useCubeContext","safeDisplayConfig","useLayoutEffect","retryCount","maxRetries","rafId","timeoutId","updateDimensions","width","retryWithRaf","useEffect","resizeObserver","entries","entry","xAxisField","yAxisField","seriesField","sizeFieldName","colorFieldName","xGranularity","getFieldGranularity","bubbleData","item","xValue","formatTimeValue","yValue","sizeValue","seriesValue","margin","CHART_MARGINS","chartHeight","svg","g","xScale","scaleLinear","yScale","sizeScale","scaleSqrt","colorScale","isNumericColorField","uniqueColors","colorValues","val","minValue","maxValue","scaleQuantize","CHART_COLORS_GRADIENT","scaleOrdinal","CHART_COLORS","tooltip","bubbles","tooltipContent","_event","legend","gradient","color","legendItems","legendItem","_d","legendKey","ChartContainer","AnalyticsPortlet","forwardRef","query","chartType","_title","onDebugDataReady","ref","refreshCounter","setRefreshCounter","onDebugDataReadyRef","useMemo","e","resultSet","isLoading","useCubeQuery","useImperativeHandle","prev","getData","RechartsBarChart","RechartsLineChart","RechartsAreaChart","RechartsPieChart","RechartsScatterChart","RechartsRadarChart","RechartsRadialBarChart","RechartsTreeMapChart","DataTable","Modal","isOpen","onClose","title","closeOnBackdropClick","closeOnEscape","showCloseButton","footer","noPadding","handleEscapeKey","useCallback","CubeMetaExplorer","schema","schemaStatus","schemaError","selectedFields","onFieldSelect","onFieldDeselect","onRetrySchema","onOpenSettings","expandedCubes","setExpandedCubes","expandedSections","setExpandedSections","searchTerm","setSearchTerm","preSearchExpandedCubes","setPreSearchExpandedCubes","preSearchExpandedSections","setPreSearchExpandedSections","React","newExpandedCubes","newExpandedSections","cube","cubeHasMatches","field","combinedCubes","combinedSections","isCorsError","ExclamationTriangleIcon","Fragment","CogIcon","toggleCubeExpansion","cubeName","newExpanded","newPreSearchExpanded","toggleSectionExpansion","sectionKey","handleFieldClick","fieldType","filterFields","fields","measureMatches","dimensionMatches","FieldItem","icon","isSelected","getSelectedStyles","getIconColor","getCheckmarkColor","SectionHeader","count","isExpanded","getSectionType","ChevronDownIcon","ChevronRightIcon","NoMatchesMessage","filteredCubes","timeDimensions","regularDimensions","TagIcon","dimension","CalendarIcon","timeDimension","ChartBarIcon","measure","TIME_GRANULARITIES","FILTER_OPERATORS","DATE_RANGE_OPTIONS","FilterValueSelector","fieldName","operator","onValuesChange","operatorMeta","setIsOpen","searchText","setSearchText","hasLoadedInitial","setHasLoadedInitial","dropdownRef","lastSearchedTerm","debouncedSearchText","useDebounce","isDimension","dim","isTimeDimension","shouldFetchValues","shouldShowComboBox","distinctValues","valuesLoading","valuesError","searchValues","useFilterValues","handleClickOutside","handleDropdownToggle","newIsOpen","handleSearchChange","newSearchText","handleValueSelect","handleValueRemove","valueToRemove","handleDirectInput","numValue","handleDateInput","currentValues","handleDateRangeEndInput","XMarkIcon","hasQueryContent","getSelectedFieldsCount","cleanQuery","cleanedQuery","cleanQueryForServer","transformFiltersForServer","createEmptyQuery","isSimpleFilter","isGroupFilter","isAndFilter","isOrFilter","getFilterableFields","allFields","td","getAllFilterableFields","getOrganizedFilterFields","getAvailableOperators","operators","meta","getFieldType","countFilters","filters","countFilter","createSimpleFilter","member","createAndFilter","createOrFilter","cleanupFilters","_query","transformFilter","transformedSubFilters","convertDateRangeTypeToValue","rangeType","typeMap","unit","unitSingular","requiresNumberInput","formatDateForCube","date","getTimeDimensionsWithDateRanges","dateRanges","hasTimeDimensions","transformQueryForUI","transformed","transformFiltersFromServer","getFieldTitle","getSortDirection","order","getSortTooltip","direction","getNextSortDirection","current","FilterItem","onFilterChange","onFilterRemove","isFieldDropdownOpen","setIsFieldDropdownOpen","isOperatorDropdownOpen","setIsOperatorDropdownOpen","fieldSearchTerm","setFieldSearchTerm","searchInputRef","handleFieldDropdownToggle","newOpen","handleOperatorDropdownToggle","queryFields","selectedField","f","availableOperators","filterFieldsBySearch","filteredQueryFields","filteredAllFields","getFieldTypeIcon","getFieldTypeBadge","handleFieldChange","newFieldType","defaultOperator","handleOperatorChange","handleValuesChange","FunnelIcon","MagnifyingGlassIcon","op","FilterGroup","onGroupChange","onGroupChangeWithUnwrap","onGroupRemove","depth","showAddMenu","setShowAddMenu","isAndGroup","groupType","indentClass","borderColor","bgColor","textColor","handleGroupTypeToggle","newGroup","handleAddSimpleFilter","defaultField","newFilter","newFilters","handleAddAndGroup","handleAddOrGroup","handleFilterChange","filterIndex","handleFilterRemove","updatedGroup","handleNestedGroupChange","handleNestedGroupRemove","PlusIcon","FilterBuilder","onFiltersChange","totalFilterCount","allFilterableFields","hasFilterableFields","andGroup","existingAndGroup","updatedAndGroup","existingOrGroup","updatedOrGroup","handleGroupChange","handleGroupChangeWithUnwrap","handleGroupRemove","handleClearAllFilters","DateRangeSelector","availableTimeDimensions","currentDateRange","onDateRangeChange","onTimeDimensionChange","getCurrentRangeType","flexibleRangeMatch","option","getCurrentDates","today","getCurrentNumber","setRangeType","customDates","setCustomDates","numberValue","setNumberValue","isRangeDropdownOpen","setIsRangeDropdownOpen","isTimeDimensionDropdownOpen","setIsTimeDimensionDropdownOpen","handleTimeDimensionDropdownToggle","handleRangeDropdownToggle","handleRangeTypeChange","newRangeType","dateRange","cubeRangeValue","handleCustomDateChange","newCustomDates","handleNumberChange","handleTimeDimensionChange","newTimeDimension","selectedRangeLabel","opt","DateRangeFilter","onDateRangeRemove","currentDateRanges","dateRangeCount","handleAddDateRange","firstAvailable","handleClearAllDateRanges","allTimeDimensions","oldTd","newTd","QueryPanel","validationStatus","validationError","validationSql","onValidate","onExecute","onRemoveField","onTimeDimensionGranularityChange","onOrderChange","onClearQuery","showSettings","onSettingsClick","onAIAssistantClick","showJsonPreview","setShowJsonPreview","showSqlPreview","setShowSqlPreview","hasContent","selectedCount","handleCopyQuery","textArea","hasFiltersApplied","currentFilters","hasFieldInFilters","handleAddFilterFromField","getSortIcon","ChevronUpIcon","ChevronUpDownIcon","handleToggleSort","getSortButtonClasses","sortDirection","baseClasses","RemovableChip","hasFilters","TimeDimensionChip","hasDateRange","granularity","SparklesIcon","ClipboardDocumentIcon","TrashIcon","CheckCircleIcon","ExclamationCircleIcon","newJsonState","newSqlState","CheckIcon","PlayIcon","ResultsPanel","executionStatus","executionResults","executionError","displayLimit","onDisplayLimitChange","totalRowCount","totalRowCountStatus","ClockIcon","SetupPanel","onToggle","config","onConfigChange","onReset","localConfig","setLocalConfig","handleApply","handleReset","defaultConfig","handleInputChange","hasChanges","isUsingDefaults","DEFAULT_SYSTEM_PROMPT_TEMPLATE","AI_STORAGE_KEY","DEFAULT_AI_CONFIG","sendGeminiMessage","apiKey","userPrompt","endpoint","requestBody","headers","response","errorMessage","errorData","errorText","loadAIConfig","saved","parsed","extractTextFromResponse","AIAssistantModal","onQueryLoad","aiEndpoint","state","setState","handleQuerySubmit","responseText","validateResponse","handleValidate","handleUseQuery","handleClose","handleKeyDown","renderQueryStep","STORAGE_KEY","API_CONFIG_STORAGE_KEY","QueryBuilder","className","initialQuery","disableLocalStorage","hideSettings","cubeApi","updateApiConfig","features","getInitialApiConfig","getInitialState","parsedState","setDisplayLimit","apiConfig","setApiConfig","showSetupPanel","setShowSetupPanel","showSchemaMobile","setShowSchemaMobile","showAIAssistant","setShowAIAssistant","lastValidatedQueryRef","fullValidationResult","setFullValidationResult","metaResponse","handleExecuteQuery","updateQuery","updater","newQuery","queryChanged","handleFieldSelect","handleFieldDeselect","newOrder","handleTimeDimensionGranularityChange","dimensionName","handleFiltersChange","handleDateRangeChange","handleDateRangeRemove","handleOrderChange","handleValidateQuery","queryToValidate","queryStr","result","isValid","debounceTimer","limitedResultSet","totalResultSet","limitedData","totalCount","handleClearQuery","handleApiConfigChange","newConfig","handleResetApiConfig","handleRetrySchema","Bars3Icon","AxisDropZone","onDrop","onDragStart","onDragOver","getFieldStyling","onReorder","label","description","mandatory","maxItems","emptyText","IconComponent","dragOverIndex","setDragOverIndex","draggedFromIndex","setDraggedFromIndex","isDraggingFromSameAxis","setIsDraggingFromSameAxis","canAcceptMore","isFull","handleReorderDragStart","handleReorderDragEnd","handleReorderDragOver","targetIndex","handleReorderDragLeave","handleReorderDrop","FieldIcon","hoverClasses","isDragOver","barChartConfig","Icon","chartBarIcon","lineChartConfig","chartLineIcon","areaChartConfig","chartAreaLineIcon","pieChartConfig","chartPieIcon","scatterChartConfig","chartDots2Icon","bubbleChartConfig","chartBubbleIcon","radarChartConfig","chartRadarIcon","radialBarChartConfig","treemapChartConfig","chartTreemapIcon","dataTableConfig","tableIcon","chartConfigRegistry","defaultChartConfig","getChartConfig","registry","ChartConfigPanel","availableFields","onChartConfigChange","onDisplayConfigChange","chartTypeConfig","getFieldsForDropZone","allAvailableFields","dropZone","currentFields","validFields","handleDragStart","fromAxis","handleDragOver","handleDrop","toAxis","isReorder","fromValue","toValue","dropZoneConfig","dz","handleRemoveFromAxis","handleReorder","fromIndex","toIndex","axisKey","newArray","movedItem","unassignedFields","assignedFields","ChartTypeSelector","selectedType","onTypeChange","chartTypes","chartTypeLabels","selectedConfig","SelectedIcon","selectedLabel","useCase","tooltipText","SAMPLE_QUERIES","PortletEditModal","onSave","portlet","submitText","formTitle","setFormTitle","setQuery","setChartType","isValidating","setIsValidating","validationResult","setValidationResult","lastValidatedQuery","setLastValidatedQuery","dryRunData","setDryRunData","setChartConfig","setDisplayConfig","showQueryBuilder","setShowQueryBuilder","queryBuilderInitialQuery","setQueryBuilderInitialQuery","queryBuilderRef","autoPopulateChartConfig","_result","defaultWidth","defaultHeight","formattedQuery","runDryRunValidation","handleSubmit","hasQueryChanged","_c","handleSampleQuery","sampleQuery","handleQueryChange","silent","isEditModeLoad","parsedQuery","details","_e","_f","_g","message","errorMsg","handleOpenQueryBuilder","handleApplyQueryBuilderQuery","currentQuery","validationState","handleBackToForm","isEditMode","isQueryValidAndCurrent","sample","DebugModal","timer","ResponsiveGridLayout","WidthProvider","Responsive","DashboardGrid","editable","onPortletRefresh","portletRefs","portletComponentRefs","isInitialized","setIsInitialized","lastKnownLayout","setLastKnownLayout","setIsEditMode","currentBreakpoint","setCurrentBreakpoint","isScrolled","setIsScrolled","isPortletModalOpen","setIsPortletModalOpen","editingPortlet","setEditingPortlet","debugData","setDebugData","initialLayout","handleScroll","scrollTop","hasLayoutActuallyChanged","newLayout","newItem","oldItem","handleLayoutChange","_currentLayout","_allLayouts","handleDragStop","layout","_oldItem","_newItem","_placeholder","_element","updatedConfig","layoutItem","handleResizeStop","handlePortletRefresh","portletId","portletComponent","handleAddPortlet","handleEditPortlet","handlePortletSave","portletData","updatedPortlets","newPortlet","gridLayout","maxY","handleDeletePortlet","responsiveLayouts","PencilIcon","newBreakpoint","el","AnalyticsDashboard","onDirtyStateChange","initialConfigRef","hasConfigChangedFromInitial","handleSaveWithDirtyTracking","handleConfigChangeWithDirtyTracking","configString","initialConfigString","PortletContainer","onEdit","onDelete","onRefresh","DashboardEditModal","initialName","initialDescription","setName","setDescription","isSaving","setIsSaving"],"mappings":"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","x_google_ignoreList":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51]}
1
+ {"version":3,"file":"components.js","sources":["../../src/client/components/ChartErrorBoundary.tsx","../../node_modules/d3-array/src/extent.js","../../node_modules/d3-array/src/max.js","../../node_modules/d3-array/src/min.js","../../node_modules/d3-axis/src/identity.js","../../node_modules/d3-axis/src/axis.js","../../node_modules/d3-selection/src/namespaces.js","../../node_modules/d3-selection/src/namespace.js","../../node_modules/d3-selection/src/creator.js","../../node_modules/d3-selection/src/selector.js","../../node_modules/d3-selection/src/selection/select.js","../../node_modules/d3-selection/src/array.js","../../node_modules/d3-selection/src/selectorAll.js","../../node_modules/d3-selection/src/selection/selectAll.js","../../node_modules/d3-selection/src/matcher.js","../../node_modules/d3-selection/src/selection/selectChild.js","../../node_modules/d3-selection/src/selection/selectChildren.js","../../node_modules/d3-selection/src/selection/filter.js","../../node_modules/d3-selection/src/selection/sparse.js","../../node_modules/d3-selection/src/selection/enter.js","../../node_modules/d3-selection/src/constant.js","../../node_modules/d3-selection/src/selection/data.js","../../node_modules/d3-selection/src/selection/exit.js","../../node_modules/d3-selection/src/selection/join.js","../../node_modules/d3-selection/src/selection/merge.js","../../node_modules/d3-selection/src/selection/order.js","../../node_modules/d3-selection/src/selection/sort.js","../../node_modules/d3-selection/src/selection/call.js","../../node_modules/d3-selection/src/selection/nodes.js","../../node_modules/d3-selection/src/selection/node.js","../../node_modules/d3-selection/src/selection/size.js","../../node_modules/d3-selection/src/selection/empty.js","../../node_modules/d3-selection/src/selection/each.js","../../node_modules/d3-selection/src/selection/attr.js","../../node_modules/d3-selection/src/window.js","../../node_modules/d3-selection/src/selection/style.js","../../node_modules/d3-selection/src/selection/property.js","../../node_modules/d3-selection/src/selection/classed.js","../../node_modules/d3-selection/src/selection/text.js","../../node_modules/d3-selection/src/selection/html.js","../../node_modules/d3-selection/src/selection/raise.js","../../node_modules/d3-selection/src/selection/lower.js","../../node_modules/d3-selection/src/selection/append.js","../../node_modules/d3-selection/src/selection/insert.js","../../node_modules/d3-selection/src/selection/remove.js","../../node_modules/d3-selection/src/selection/clone.js","../../node_modules/d3-selection/src/selection/datum.js","../../node_modules/d3-selection/src/selection/on.js","../../node_modules/d3-selection/src/selection/dispatch.js","../../node_modules/d3-selection/src/selection/iterator.js","../../node_modules/d3-selection/src/selection/index.js","../../node_modules/d3-selection/src/select.js","../../node_modules/d3-scale/src/pow.js","../../src/client/components/charts/BubbleChart.tsx","../../src/client/components/charts/ActivityGridChart.tsx","../../src/client/components/AnalyticsPortlet.tsx","../../src/client/components/Modal.tsx","../../src/client/components/QueryBuilder/CubeMetaExplorer.tsx","../../src/client/components/QueryBuilder/types.ts","../../src/client/components/QueryBuilder/FilterValueSelector.tsx","../../src/client/components/QueryBuilder/utils.ts","../../src/client/components/QueryBuilder/FilterItem.tsx","../../src/client/components/QueryBuilder/FilterGroup.tsx","../../src/client/components/QueryBuilder/FilterBuilder.tsx","../../src/client/components/QueryBuilder/DateRangeSelector.tsx","../../src/client/components/QueryBuilder/DateRangeFilter.tsx","../../src/client/components/QueryBuilder/QueryPanel.tsx","../../src/client/components/QueryBuilder/ResultsPanel.tsx","../../src/client/components/QueryBuilder/SetupPanel.tsx","../../src/client/components/AIAssistant/constants.ts","../../src/client/components/AIAssistant/utils.ts","../../src/client/components/AIAssistant/AIAssistantModal.tsx","../../src/client/components/QueryBuilder/index.tsx","../../src/client/components/AxisDropZone.tsx","../../src/client/components/charts/BarChart.config.tsx","../../src/client/components/charts/LineChart.config.tsx","../../src/client/components/charts/AreaChart.config.tsx","../../src/client/components/charts/PieChart.config.tsx","../../src/client/components/charts/ScatterChart.config.tsx","../../src/client/components/charts/BubbleChart.config.tsx","../../src/client/components/charts/RadarChart.config.tsx","../../src/client/components/charts/RadialBarChart.config.tsx","../../src/client/components/charts/TreeMapChart.config.tsx","../../src/client/components/charts/DataTable.config.tsx","../../src/client/components/charts/ActivityGridChart.config.tsx","../../src/client/charts/chartConfigRegistry.ts","../../src/client/charts/chartConfigs.ts","../../src/client/components/ChartConfigPanel.tsx","../../src/client/components/ChartTypeSelector.tsx","../../src/client/components/PortletEditModal.tsx","../../src/client/components/DebugModal.tsx","../../src/client/components/DashboardGrid.tsx","../../src/client/components/AnalyticsDashboard.tsx","../../src/client/components/PortletContainer.tsx","../../src/client/components/DashboardEditModal.tsx"],"sourcesContent":["import React, { Component, ReactNode } from 'react'\nimport { ArrowPathIcon } from '@heroicons/react/24/outline'\n\ninterface Props {\n children: ReactNode\n fallback?: ReactNode\n portletTitle?: string\n portletConfig?: any\n cubeQuery?: string\n}\n\ninterface State {\n hasError: boolean\n error: Error | null\n errorInfo: string | null\n}\n\nexport default class ChartErrorBoundary extends Component<Props, State> {\n constructor(props: Props) {\n super(props)\n this.state = {\n hasError: false,\n error: null,\n errorInfo: null\n }\n }\n\n static getDerivedStateFromError(error: Error): State {\n // Update state so the next render will show the fallback UI\n return {\n hasError: true,\n error,\n errorInfo: null\n }\n }\n\n componentDidCatch(error: Error, errorInfo: React.ErrorInfo) {\n // Update state with error details\n this.setState({\n error,\n errorInfo: errorInfo.componentStack || null\n })\n\n // Log the error for debugging\n console.error('Chart Error Boundary caught a rendering error:', error, errorInfo)\n }\n\n handleReset = () => {\n this.setState({\n hasError: false,\n error: null,\n errorInfo: null\n })\n }\n\n render() {\n if (this.state.hasError) {\n // Custom fallback UI\n if (this.props.fallback) {\n return this.props.fallback\n }\n\n // Default error display\n return (\n <div className=\"flex flex-col items-center justify-center w-full h-full p-6 text-center border-2 border-dashed border-red-300 rounded-lg bg-red-50\">\n <div className=\"h-12 w-12 text-red-500 mb-4\">⚠️</div>\n <h3 className=\"text-lg font-semibold text-red-600 mb-2\">\n {this.props.portletTitle ? `Rendering Error in ${this.props.portletTitle}` : 'Chart Rendering Error'}\n </h3>\n <p className=\"text-sm text-gray-600 mb-4 max-w-md\">\n There was an error rendering this chart component. This is different from query errors. The error details are shown below.\n </p>\n \n {/* Error details */}\n <div className=\"w-full max-w-2xl mb-4\">\n <div className=\"bg-gray-100 rounded-lg p-3 text-left\">\n <div className=\"text-xs font-mono text-red-600 mb-2\">\n <strong>Error:</strong> {this.state.error?.message}\n </div>\n {this.state.error?.name && (\n <div className=\"text-xs font-mono text-gray-600 mb-2\">\n <strong>Type:</strong> {this.state.error.name}\n </div>\n )}\n \n {/* Portlet Config Debug Info */}\n {this.props.portletConfig && (\n <details className=\"text-xs font-mono text-gray-600 mb-2\">\n <summary className=\"cursor-pointer\">Portlet Configuration</summary>\n <pre className=\"mt-2 whitespace-pre-wrap bg-blue-50 p-2 rounded overflow-auto max-h-32\">\n {JSON.stringify(this.props.portletConfig, null, 2)}\n </pre>\n </details>\n )}\n \n {/* Cube Query Debug Info */}\n {this.props.cubeQuery && (\n <details className=\"text-xs font-mono text-gray-600 mb-2\">\n <summary className=\"cursor-pointer\">Cube Query</summary>\n <pre className=\"mt-2 whitespace-pre-wrap bg-green-50 p-2 rounded overflow-auto max-h-32\">\n {typeof this.props.cubeQuery === 'string' \n ? JSON.stringify(JSON.parse(this.props.cubeQuery), null, 2)\n : JSON.stringify(this.props.cubeQuery, null, 2)\n }\n </pre>\n </details>\n )}\n \n {this.state.errorInfo && (\n <details className=\"text-xs font-mono text-gray-600\">\n <summary className=\"cursor-pointer\">Component Stack</summary>\n <pre className=\"mt-2 whitespace-pre-wrap\">{this.state.errorInfo}</pre>\n </details>\n )}\n </div>\n </div>\n\n {/* Reset button */}\n <button\n onClick={this.handleReset}\n className=\"px-3 py-1 bg-blue-500 text-white rounded text-sm hover:bg-blue-600\"\n >\n <ArrowPathIcon style={{ width: '16px', height: '16px', display: 'inline', marginRight: '4px' }} />Try Again\n </button>\n </div>\n )\n }\n\n return this.props.children\n }\n}","export default function extent(values, valueof) {\n let min;\n let max;\n if (valueof === undefined) {\n for (const value of values) {\n if (value != null) {\n if (min === undefined) {\n if (value >= value) min = max = value;\n } else {\n if (min > value) min = value;\n if (max < value) max = value;\n }\n }\n }\n } else {\n let index = -1;\n for (let value of values) {\n if ((value = valueof(value, ++index, values)) != null) {\n if (min === undefined) {\n if (value >= value) min = max = value;\n } else {\n if (min > value) min = value;\n if (max < value) max = value;\n }\n }\n }\n }\n return [min, max];\n}\n","export default function max(values, valueof) {\n let max;\n if (valueof === undefined) {\n for (const value of values) {\n if (value != null\n && (max < value || (max === undefined && value >= value))) {\n max = value;\n }\n }\n } else {\n let index = -1;\n for (let value of values) {\n if ((value = valueof(value, ++index, values)) != null\n && (max < value || (max === undefined && value >= value))) {\n max = value;\n }\n }\n }\n return max;\n}\n","export default function min(values, valueof) {\n let min;\n if (valueof === undefined) {\n for (const value of values) {\n if (value != null\n && (min > value || (min === undefined && value >= value))) {\n min = value;\n }\n }\n } else {\n let index = -1;\n for (let value of values) {\n if ((value = valueof(value, ++index, values)) != null\n && (min > value || (min === undefined && value >= value))) {\n min = value;\n }\n }\n }\n return min;\n}\n","export default function(x) {\n return x;\n}\n","import identity from \"./identity.js\";\n\nvar top = 1,\n right = 2,\n bottom = 3,\n left = 4,\n epsilon = 1e-6;\n\nfunction translateX(x) {\n return \"translate(\" + x + \",0)\";\n}\n\nfunction translateY(y) {\n return \"translate(0,\" + y + \")\";\n}\n\nfunction number(scale) {\n return d => +scale(d);\n}\n\nfunction center(scale, offset) {\n offset = Math.max(0, scale.bandwidth() - offset * 2) / 2;\n if (scale.round()) offset = Math.round(offset);\n return d => +scale(d) + offset;\n}\n\nfunction entering() {\n return !this.__axis;\n}\n\nfunction axis(orient, scale) {\n var tickArguments = [],\n tickValues = null,\n tickFormat = null,\n tickSizeInner = 6,\n tickSizeOuter = 6,\n tickPadding = 3,\n offset = typeof window !== \"undefined\" && window.devicePixelRatio > 1 ? 0 : 0.5,\n k = orient === top || orient === left ? -1 : 1,\n x = orient === left || orient === right ? \"x\" : \"y\",\n transform = orient === top || orient === bottom ? translateX : translateY;\n\n function axis(context) {\n var values = tickValues == null ? (scale.ticks ? scale.ticks.apply(scale, tickArguments) : scale.domain()) : tickValues,\n format = tickFormat == null ? (scale.tickFormat ? scale.tickFormat.apply(scale, tickArguments) : identity) : tickFormat,\n spacing = Math.max(tickSizeInner, 0) + tickPadding,\n range = scale.range(),\n range0 = +range[0] + offset,\n range1 = +range[range.length - 1] + offset,\n position = (scale.bandwidth ? center : number)(scale.copy(), offset),\n selection = context.selection ? context.selection() : context,\n path = selection.selectAll(\".domain\").data([null]),\n tick = selection.selectAll(\".tick\").data(values, scale).order(),\n tickExit = tick.exit(),\n tickEnter = tick.enter().append(\"g\").attr(\"class\", \"tick\"),\n line = tick.select(\"line\"),\n text = tick.select(\"text\");\n\n path = path.merge(path.enter().insert(\"path\", \".tick\")\n .attr(\"class\", \"domain\")\n .attr(\"stroke\", \"currentColor\"));\n\n tick = tick.merge(tickEnter);\n\n line = line.merge(tickEnter.append(\"line\")\n .attr(\"stroke\", \"currentColor\")\n .attr(x + \"2\", k * tickSizeInner));\n\n text = text.merge(tickEnter.append(\"text\")\n .attr(\"fill\", \"currentColor\")\n .attr(x, k * spacing)\n .attr(\"dy\", orient === top ? \"0em\" : orient === bottom ? \"0.71em\" : \"0.32em\"));\n\n if (context !== selection) {\n path = path.transition(context);\n tick = tick.transition(context);\n line = line.transition(context);\n text = text.transition(context);\n\n tickExit = tickExit.transition(context)\n .attr(\"opacity\", epsilon)\n .attr(\"transform\", function(d) { return isFinite(d = position(d)) ? transform(d + offset) : this.getAttribute(\"transform\"); });\n\n tickEnter\n .attr(\"opacity\", epsilon)\n .attr(\"transform\", function(d) { var p = this.parentNode.__axis; return transform((p && isFinite(p = p(d)) ? p : position(d)) + offset); });\n }\n\n tickExit.remove();\n\n path\n .attr(\"d\", orient === left || orient === right\n ? (tickSizeOuter ? \"M\" + k * tickSizeOuter + \",\" + range0 + \"H\" + offset + \"V\" + range1 + \"H\" + k * tickSizeOuter : \"M\" + offset + \",\" + range0 + \"V\" + range1)\n : (tickSizeOuter ? \"M\" + range0 + \",\" + k * tickSizeOuter + \"V\" + offset + \"H\" + range1 + \"V\" + k * tickSizeOuter : \"M\" + range0 + \",\" + offset + \"H\" + range1));\n\n tick\n .attr(\"opacity\", 1)\n .attr(\"transform\", function(d) { return transform(position(d) + offset); });\n\n line\n .attr(x + \"2\", k * tickSizeInner);\n\n text\n .attr(x, k * spacing)\n .text(format);\n\n selection.filter(entering)\n .attr(\"fill\", \"none\")\n .attr(\"font-size\", 10)\n .attr(\"font-family\", \"sans-serif\")\n .attr(\"text-anchor\", orient === right ? \"start\" : orient === left ? \"end\" : \"middle\");\n\n selection\n .each(function() { this.__axis = position; });\n }\n\n axis.scale = function(_) {\n return arguments.length ? (scale = _, axis) : scale;\n };\n\n axis.ticks = function() {\n return tickArguments = Array.from(arguments), axis;\n };\n\n axis.tickArguments = function(_) {\n return arguments.length ? (tickArguments = _ == null ? [] : Array.from(_), axis) : tickArguments.slice();\n };\n\n axis.tickValues = function(_) {\n return arguments.length ? (tickValues = _ == null ? null : Array.from(_), axis) : tickValues && tickValues.slice();\n };\n\n axis.tickFormat = function(_) {\n return arguments.length ? (tickFormat = _, axis) : tickFormat;\n };\n\n axis.tickSize = function(_) {\n return arguments.length ? (tickSizeInner = tickSizeOuter = +_, axis) : tickSizeInner;\n };\n\n axis.tickSizeInner = function(_) {\n return arguments.length ? (tickSizeInner = +_, axis) : tickSizeInner;\n };\n\n axis.tickSizeOuter = function(_) {\n return arguments.length ? (tickSizeOuter = +_, axis) : tickSizeOuter;\n };\n\n axis.tickPadding = function(_) {\n return arguments.length ? (tickPadding = +_, axis) : tickPadding;\n };\n\n axis.offset = function(_) {\n return arguments.length ? (offset = +_, axis) : offset;\n };\n\n return axis;\n}\n\nexport function axisTop(scale) {\n return axis(top, scale);\n}\n\nexport function axisRight(scale) {\n return axis(right, scale);\n}\n\nexport function axisBottom(scale) {\n return axis(bottom, scale);\n}\n\nexport function axisLeft(scale) {\n return axis(left, scale);\n}\n","export var xhtml = \"http://www.w3.org/1999/xhtml\";\n\nexport default {\n svg: \"http://www.w3.org/2000/svg\",\n xhtml: xhtml,\n xlink: \"http://www.w3.org/1999/xlink\",\n xml: \"http://www.w3.org/XML/1998/namespace\",\n xmlns: \"http://www.w3.org/2000/xmlns/\"\n};\n","import namespaces from \"./namespaces.js\";\n\nexport default function(name) {\n var prefix = name += \"\", i = prefix.indexOf(\":\");\n if (i >= 0 && (prefix = name.slice(0, i)) !== \"xmlns\") name = name.slice(i + 1);\n return namespaces.hasOwnProperty(prefix) ? {space: namespaces[prefix], local: name} : name; // eslint-disable-line no-prototype-builtins\n}\n","import namespace from \"./namespace.js\";\nimport {xhtml} from \"./namespaces.js\";\n\nfunction creatorInherit(name) {\n return function() {\n var document = this.ownerDocument,\n uri = this.namespaceURI;\n return uri === xhtml && document.documentElement.namespaceURI === xhtml\n ? document.createElement(name)\n : document.createElementNS(uri, name);\n };\n}\n\nfunction creatorFixed(fullname) {\n return function() {\n return this.ownerDocument.createElementNS(fullname.space, fullname.local);\n };\n}\n\nexport default function(name) {\n var fullname = namespace(name);\n return (fullname.local\n ? creatorFixed\n : creatorInherit)(fullname);\n}\n","function none() {}\n\nexport default function(selector) {\n return selector == null ? none : function() {\n return this.querySelector(selector);\n };\n}\n","import {Selection} from \"./index.js\";\nimport selector from \"../selector.js\";\n\nexport default function(select) {\n if (typeof select !== \"function\") select = selector(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {\n if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {\n if (\"__data__\" in node) subnode.__data__ = node.__data__;\n subgroup[i] = subnode;\n }\n }\n }\n\n return new Selection(subgroups, this._parents);\n}\n","// Given something array like (or null), returns something that is strictly an\n// array. This is used to ensure that array-like objects passed to d3.selectAll\n// or selection.selectAll are converted into proper arrays when creating a\n// selection; we don’t ever want to create a selection backed by a live\n// HTMLCollection or NodeList. However, note that selection.selectAll will use a\n// static NodeList as a group, since it safely derived from querySelectorAll.\nexport default function array(x) {\n return x == null ? [] : Array.isArray(x) ? x : Array.from(x);\n}\n","function empty() {\n return [];\n}\n\nexport default function(selector) {\n return selector == null ? empty : function() {\n return this.querySelectorAll(selector);\n };\n}\n","import {Selection} from \"./index.js\";\nimport array from \"../array.js\";\nimport selectorAll from \"../selectorAll.js\";\n\nfunction arrayAll(select) {\n return function() {\n return array(select.apply(this, arguments));\n };\n}\n\nexport default function(select) {\n if (typeof select === \"function\") select = arrayAll(select);\n else select = selectorAll(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n subgroups.push(select.call(node, node.__data__, i, group));\n parents.push(node);\n }\n }\n }\n\n return new Selection(subgroups, parents);\n}\n","export default function(selector) {\n return function() {\n return this.matches(selector);\n };\n}\n\nexport function childMatcher(selector) {\n return function(node) {\n return node.matches(selector);\n };\n}\n\n","import {childMatcher} from \"../matcher.js\";\n\nvar find = Array.prototype.find;\n\nfunction childFind(match) {\n return function() {\n return find.call(this.children, match);\n };\n}\n\nfunction childFirst() {\n return this.firstElementChild;\n}\n\nexport default function(match) {\n return this.select(match == null ? childFirst\n : childFind(typeof match === \"function\" ? match : childMatcher(match)));\n}\n","import {childMatcher} from \"../matcher.js\";\n\nvar filter = Array.prototype.filter;\n\nfunction children() {\n return Array.from(this.children);\n}\n\nfunction childrenFilter(match) {\n return function() {\n return filter.call(this.children, match);\n };\n}\n\nexport default function(match) {\n return this.selectAll(match == null ? children\n : childrenFilter(typeof match === \"function\" ? match : childMatcher(match)));\n}\n","import {Selection} from \"./index.js\";\nimport matcher from \"../matcher.js\";\n\nexport default function(match) {\n if (typeof match !== \"function\") match = matcher(match);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {\n if ((node = group[i]) && match.call(node, node.__data__, i, group)) {\n subgroup.push(node);\n }\n }\n }\n\n return new Selection(subgroups, this._parents);\n}\n","export default function(update) {\n return new Array(update.length);\n}\n","import sparse from \"./sparse.js\";\nimport {Selection} from \"./index.js\";\n\nexport default function() {\n return new Selection(this._enter || this._groups.map(sparse), this._parents);\n}\n\nexport function EnterNode(parent, datum) {\n this.ownerDocument = parent.ownerDocument;\n this.namespaceURI = parent.namespaceURI;\n this._next = null;\n this._parent = parent;\n this.__data__ = datum;\n}\n\nEnterNode.prototype = {\n constructor: EnterNode,\n appendChild: function(child) { return this._parent.insertBefore(child, this._next); },\n insertBefore: function(child, next) { return this._parent.insertBefore(child, next); },\n querySelector: function(selector) { return this._parent.querySelector(selector); },\n querySelectorAll: function(selector) { return this._parent.querySelectorAll(selector); }\n};\n","export default function(x) {\n return function() {\n return x;\n };\n}\n","import {Selection} from \"./index.js\";\nimport {EnterNode} from \"./enter.js\";\nimport constant from \"../constant.js\";\n\nfunction bindIndex(parent, group, enter, update, exit, data) {\n var i = 0,\n node,\n groupLength = group.length,\n dataLength = data.length;\n\n // Put any non-null nodes that fit into update.\n // Put any null nodes into enter.\n // Put any remaining data into enter.\n for (; i < dataLength; ++i) {\n if (node = group[i]) {\n node.__data__ = data[i];\n update[i] = node;\n } else {\n enter[i] = new EnterNode(parent, data[i]);\n }\n }\n\n // Put any non-null nodes that don’t fit into exit.\n for (; i < groupLength; ++i) {\n if (node = group[i]) {\n exit[i] = node;\n }\n }\n}\n\nfunction bindKey(parent, group, enter, update, exit, data, key) {\n var i,\n node,\n nodeByKeyValue = new Map,\n groupLength = group.length,\n dataLength = data.length,\n keyValues = new Array(groupLength),\n keyValue;\n\n // Compute the key for each node.\n // If multiple nodes have the same key, the duplicates are added to exit.\n for (i = 0; i < groupLength; ++i) {\n if (node = group[i]) {\n keyValues[i] = keyValue = key.call(node, node.__data__, i, group) + \"\";\n if (nodeByKeyValue.has(keyValue)) {\n exit[i] = node;\n } else {\n nodeByKeyValue.set(keyValue, node);\n }\n }\n }\n\n // Compute the key for each datum.\n // If there a node associated with this key, join and add it to update.\n // If there is not (or the key is a duplicate), add it to enter.\n for (i = 0; i < dataLength; ++i) {\n keyValue = key.call(parent, data[i], i, data) + \"\";\n if (node = nodeByKeyValue.get(keyValue)) {\n update[i] = node;\n node.__data__ = data[i];\n nodeByKeyValue.delete(keyValue);\n } else {\n enter[i] = new EnterNode(parent, data[i]);\n }\n }\n\n // Add any remaining nodes that were not bound to data to exit.\n for (i = 0; i < groupLength; ++i) {\n if ((node = group[i]) && (nodeByKeyValue.get(keyValues[i]) === node)) {\n exit[i] = node;\n }\n }\n}\n\nfunction datum(node) {\n return node.__data__;\n}\n\nexport default function(value, key) {\n if (!arguments.length) return Array.from(this, datum);\n\n var bind = key ? bindKey : bindIndex,\n parents = this._parents,\n groups = this._groups;\n\n if (typeof value !== \"function\") value = constant(value);\n\n for (var m = groups.length, update = new Array(m), enter = new Array(m), exit = new Array(m), j = 0; j < m; ++j) {\n var parent = parents[j],\n group = groups[j],\n groupLength = group.length,\n data = arraylike(value.call(parent, parent && parent.__data__, j, parents)),\n dataLength = data.length,\n enterGroup = enter[j] = new Array(dataLength),\n updateGroup = update[j] = new Array(dataLength),\n exitGroup = exit[j] = new Array(groupLength);\n\n bind(parent, group, enterGroup, updateGroup, exitGroup, data, key);\n\n // Now connect the enter nodes to their following update node, such that\n // appendChild can insert the materialized enter node before this node,\n // rather than at the end of the parent node.\n for (var i0 = 0, i1 = 0, previous, next; i0 < dataLength; ++i0) {\n if (previous = enterGroup[i0]) {\n if (i0 >= i1) i1 = i0 + 1;\n while (!(next = updateGroup[i1]) && ++i1 < dataLength);\n previous._next = next || null;\n }\n }\n }\n\n update = new Selection(update, parents);\n update._enter = enter;\n update._exit = exit;\n return update;\n}\n\n// Given some data, this returns an array-like view of it: an object that\n// exposes a length property and allows numeric indexing. Note that unlike\n// selectAll, this isn’t worried about “live” collections because the resulting\n// array will only be used briefly while data is being bound. (It is possible to\n// cause the data to change while iterating by using a key function, but please\n// don’t; we’d rather avoid a gratuitous copy.)\nfunction arraylike(data) {\n return typeof data === \"object\" && \"length\" in data\n ? data // Array, TypedArray, NodeList, array-like\n : Array.from(data); // Map, Set, iterable, string, or anything else\n}\n","import sparse from \"./sparse.js\";\nimport {Selection} from \"./index.js\";\n\nexport default function() {\n return new Selection(this._exit || this._groups.map(sparse), this._parents);\n}\n","export default function(onenter, onupdate, onexit) {\n var enter = this.enter(), update = this, exit = this.exit();\n if (typeof onenter === \"function\") {\n enter = onenter(enter);\n if (enter) enter = enter.selection();\n } else {\n enter = enter.append(onenter + \"\");\n }\n if (onupdate != null) {\n update = onupdate(update);\n if (update) update = update.selection();\n }\n if (onexit == null) exit.remove(); else onexit(exit);\n return enter && update ? enter.merge(update).order() : update;\n}\n","import {Selection} from \"./index.js\";\n\nexport default function(context) {\n var selection = context.selection ? context.selection() : context;\n\n for (var groups0 = this._groups, groups1 = selection._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {\n for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {\n if (node = group0[i] || group1[i]) {\n merge[i] = node;\n }\n }\n }\n\n for (; j < m0; ++j) {\n merges[j] = groups0[j];\n }\n\n return new Selection(merges, this._parents);\n}\n","export default function() {\n\n for (var groups = this._groups, j = -1, m = groups.length; ++j < m;) {\n for (var group = groups[j], i = group.length - 1, next = group[i], node; --i >= 0;) {\n if (node = group[i]) {\n if (next && node.compareDocumentPosition(next) ^ 4) next.parentNode.insertBefore(node, next);\n next = node;\n }\n }\n }\n\n return this;\n}\n","import {Selection} from \"./index.js\";\n\nexport default function(compare) {\n if (!compare) compare = ascending;\n\n function compareNode(a, b) {\n return a && b ? compare(a.__data__, b.__data__) : !a - !b;\n }\n\n for (var groups = this._groups, m = groups.length, sortgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, sortgroup = sortgroups[j] = new Array(n), node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n sortgroup[i] = node;\n }\n }\n sortgroup.sort(compareNode);\n }\n\n return new Selection(sortgroups, this._parents).order();\n}\n\nfunction ascending(a, b) {\n return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n}\n","export default function() {\n var callback = arguments[0];\n arguments[0] = this;\n callback.apply(null, arguments);\n return this;\n}\n","export default function() {\n return Array.from(this);\n}\n","export default function() {\n\n for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {\n for (var group = groups[j], i = 0, n = group.length; i < n; ++i) {\n var node = group[i];\n if (node) return node;\n }\n }\n\n return null;\n}\n","export default function() {\n let size = 0;\n for (const node of this) ++size; // eslint-disable-line no-unused-vars\n return size;\n}\n","export default function() {\n return !this.node();\n}\n","export default function(callback) {\n\n for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {\n for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) {\n if (node = group[i]) callback.call(node, node.__data__, i, group);\n }\n }\n\n return this;\n}\n","import namespace from \"../namespace.js\";\n\nfunction attrRemove(name) {\n return function() {\n this.removeAttribute(name);\n };\n}\n\nfunction attrRemoveNS(fullname) {\n return function() {\n this.removeAttributeNS(fullname.space, fullname.local);\n };\n}\n\nfunction attrConstant(name, value) {\n return function() {\n this.setAttribute(name, value);\n };\n}\n\nfunction attrConstantNS(fullname, value) {\n return function() {\n this.setAttributeNS(fullname.space, fullname.local, value);\n };\n}\n\nfunction attrFunction(name, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) this.removeAttribute(name);\n else this.setAttribute(name, v);\n };\n}\n\nfunction attrFunctionNS(fullname, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) this.removeAttributeNS(fullname.space, fullname.local);\n else this.setAttributeNS(fullname.space, fullname.local, v);\n };\n}\n\nexport default function(name, value) {\n var fullname = namespace(name);\n\n if (arguments.length < 2) {\n var node = this.node();\n return fullname.local\n ? node.getAttributeNS(fullname.space, fullname.local)\n : node.getAttribute(fullname);\n }\n\n return this.each((value == null\n ? (fullname.local ? attrRemoveNS : attrRemove) : (typeof value === \"function\"\n ? (fullname.local ? attrFunctionNS : attrFunction)\n : (fullname.local ? attrConstantNS : attrConstant)))(fullname, value));\n}\n","export default function(node) {\n return (node.ownerDocument && node.ownerDocument.defaultView) // node is a Node\n || (node.document && node) // node is a Window\n || node.defaultView; // node is a Document\n}\n","import defaultView from \"../window.js\";\n\nfunction styleRemove(name) {\n return function() {\n this.style.removeProperty(name);\n };\n}\n\nfunction styleConstant(name, value, priority) {\n return function() {\n this.style.setProperty(name, value, priority);\n };\n}\n\nfunction styleFunction(name, value, priority) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) this.style.removeProperty(name);\n else this.style.setProperty(name, v, priority);\n };\n}\n\nexport default function(name, value, priority) {\n return arguments.length > 1\n ? this.each((value == null\n ? styleRemove : typeof value === \"function\"\n ? styleFunction\n : styleConstant)(name, value, priority == null ? \"\" : priority))\n : styleValue(this.node(), name);\n}\n\nexport function styleValue(node, name) {\n return node.style.getPropertyValue(name)\n || defaultView(node).getComputedStyle(node, null).getPropertyValue(name);\n}\n","function propertyRemove(name) {\n return function() {\n delete this[name];\n };\n}\n\nfunction propertyConstant(name, value) {\n return function() {\n this[name] = value;\n };\n}\n\nfunction propertyFunction(name, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) delete this[name];\n else this[name] = v;\n };\n}\n\nexport default function(name, value) {\n return arguments.length > 1\n ? this.each((value == null\n ? propertyRemove : typeof value === \"function\"\n ? propertyFunction\n : propertyConstant)(name, value))\n : this.node()[name];\n}\n","function classArray(string) {\n return string.trim().split(/^|\\s+/);\n}\n\nfunction classList(node) {\n return node.classList || new ClassList(node);\n}\n\nfunction ClassList(node) {\n this._node = node;\n this._names = classArray(node.getAttribute(\"class\") || \"\");\n}\n\nClassList.prototype = {\n add: function(name) {\n var i = this._names.indexOf(name);\n if (i < 0) {\n this._names.push(name);\n this._node.setAttribute(\"class\", this._names.join(\" \"));\n }\n },\n remove: function(name) {\n var i = this._names.indexOf(name);\n if (i >= 0) {\n this._names.splice(i, 1);\n this._node.setAttribute(\"class\", this._names.join(\" \"));\n }\n },\n contains: function(name) {\n return this._names.indexOf(name) >= 0;\n }\n};\n\nfunction classedAdd(node, names) {\n var list = classList(node), i = -1, n = names.length;\n while (++i < n) list.add(names[i]);\n}\n\nfunction classedRemove(node, names) {\n var list = classList(node), i = -1, n = names.length;\n while (++i < n) list.remove(names[i]);\n}\n\nfunction classedTrue(names) {\n return function() {\n classedAdd(this, names);\n };\n}\n\nfunction classedFalse(names) {\n return function() {\n classedRemove(this, names);\n };\n}\n\nfunction classedFunction(names, value) {\n return function() {\n (value.apply(this, arguments) ? classedAdd : classedRemove)(this, names);\n };\n}\n\nexport default function(name, value) {\n var names = classArray(name + \"\");\n\n if (arguments.length < 2) {\n var list = classList(this.node()), i = -1, n = names.length;\n while (++i < n) if (!list.contains(names[i])) return false;\n return true;\n }\n\n return this.each((typeof value === \"function\"\n ? classedFunction : value\n ? classedTrue\n : classedFalse)(names, value));\n}\n","function textRemove() {\n this.textContent = \"\";\n}\n\nfunction textConstant(value) {\n return function() {\n this.textContent = value;\n };\n}\n\nfunction textFunction(value) {\n return function() {\n var v = value.apply(this, arguments);\n this.textContent = v == null ? \"\" : v;\n };\n}\n\nexport default function(value) {\n return arguments.length\n ? this.each(value == null\n ? textRemove : (typeof value === \"function\"\n ? textFunction\n : textConstant)(value))\n : this.node().textContent;\n}\n","function htmlRemove() {\n this.innerHTML = \"\";\n}\n\nfunction htmlConstant(value) {\n return function() {\n this.innerHTML = value;\n };\n}\n\nfunction htmlFunction(value) {\n return function() {\n var v = value.apply(this, arguments);\n this.innerHTML = v == null ? \"\" : v;\n };\n}\n\nexport default function(value) {\n return arguments.length\n ? this.each(value == null\n ? htmlRemove : (typeof value === \"function\"\n ? htmlFunction\n : htmlConstant)(value))\n : this.node().innerHTML;\n}\n","function raise() {\n if (this.nextSibling) this.parentNode.appendChild(this);\n}\n\nexport default function() {\n return this.each(raise);\n}\n","function lower() {\n if (this.previousSibling) this.parentNode.insertBefore(this, this.parentNode.firstChild);\n}\n\nexport default function() {\n return this.each(lower);\n}\n","import creator from \"../creator.js\";\n\nexport default function(name) {\n var create = typeof name === \"function\" ? name : creator(name);\n return this.select(function() {\n return this.appendChild(create.apply(this, arguments));\n });\n}\n","import creator from \"../creator.js\";\nimport selector from \"../selector.js\";\n\nfunction constantNull() {\n return null;\n}\n\nexport default function(name, before) {\n var create = typeof name === \"function\" ? name : creator(name),\n select = before == null ? constantNull : typeof before === \"function\" ? before : selector(before);\n return this.select(function() {\n return this.insertBefore(create.apply(this, arguments), select.apply(this, arguments) || null);\n });\n}\n","function remove() {\n var parent = this.parentNode;\n if (parent) parent.removeChild(this);\n}\n\nexport default function() {\n return this.each(remove);\n}\n","function selection_cloneShallow() {\n var clone = this.cloneNode(false), parent = this.parentNode;\n return parent ? parent.insertBefore(clone, this.nextSibling) : clone;\n}\n\nfunction selection_cloneDeep() {\n var clone = this.cloneNode(true), parent = this.parentNode;\n return parent ? parent.insertBefore(clone, this.nextSibling) : clone;\n}\n\nexport default function(deep) {\n return this.select(deep ? selection_cloneDeep : selection_cloneShallow);\n}\n","export default function(value) {\n return arguments.length\n ? this.property(\"__data__\", value)\n : this.node().__data__;\n}\n","function contextListener(listener) {\n return function(event) {\n listener.call(this, event, this.__data__);\n };\n}\n\nfunction parseTypenames(typenames) {\n return typenames.trim().split(/^|\\s+/).map(function(t) {\n var name = \"\", i = t.indexOf(\".\");\n if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);\n return {type: t, name: name};\n });\n}\n\nfunction onRemove(typename) {\n return function() {\n var on = this.__on;\n if (!on) return;\n for (var j = 0, i = -1, m = on.length, o; j < m; ++j) {\n if (o = on[j], (!typename.type || o.type === typename.type) && o.name === typename.name) {\n this.removeEventListener(o.type, o.listener, o.options);\n } else {\n on[++i] = o;\n }\n }\n if (++i) on.length = i;\n else delete this.__on;\n };\n}\n\nfunction onAdd(typename, value, options) {\n return function() {\n var on = this.__on, o, listener = contextListener(value);\n if (on) for (var j = 0, m = on.length; j < m; ++j) {\n if ((o = on[j]).type === typename.type && o.name === typename.name) {\n this.removeEventListener(o.type, o.listener, o.options);\n this.addEventListener(o.type, o.listener = listener, o.options = options);\n o.value = value;\n return;\n }\n }\n this.addEventListener(typename.type, listener, options);\n o = {type: typename.type, name: typename.name, value: value, listener: listener, options: options};\n if (!on) this.__on = [o];\n else on.push(o);\n };\n}\n\nexport default function(typename, value, options) {\n var typenames = parseTypenames(typename + \"\"), i, n = typenames.length, t;\n\n if (arguments.length < 2) {\n var on = this.node().__on;\n if (on) for (var j = 0, m = on.length, o; j < m; ++j) {\n for (i = 0, o = on[j]; i < n; ++i) {\n if ((t = typenames[i]).type === o.type && t.name === o.name) {\n return o.value;\n }\n }\n }\n return;\n }\n\n on = value ? onAdd : onRemove;\n for (i = 0; i < n; ++i) this.each(on(typenames[i], value, options));\n return this;\n}\n","import defaultView from \"../window.js\";\n\nfunction dispatchEvent(node, type, params) {\n var window = defaultView(node),\n event = window.CustomEvent;\n\n if (typeof event === \"function\") {\n event = new event(type, params);\n } else {\n event = window.document.createEvent(\"Event\");\n if (params) event.initEvent(type, params.bubbles, params.cancelable), event.detail = params.detail;\n else event.initEvent(type, false, false);\n }\n\n node.dispatchEvent(event);\n}\n\nfunction dispatchConstant(type, params) {\n return function() {\n return dispatchEvent(this, type, params);\n };\n}\n\nfunction dispatchFunction(type, params) {\n return function() {\n return dispatchEvent(this, type, params.apply(this, arguments));\n };\n}\n\nexport default function(type, params) {\n return this.each((typeof params === \"function\"\n ? dispatchFunction\n : dispatchConstant)(type, params));\n}\n","export default function*() {\n for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {\n for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) {\n if (node = group[i]) yield node;\n }\n }\n}\n","import selection_select from \"./select.js\";\nimport selection_selectAll from \"./selectAll.js\";\nimport selection_selectChild from \"./selectChild.js\";\nimport selection_selectChildren from \"./selectChildren.js\";\nimport selection_filter from \"./filter.js\";\nimport selection_data from \"./data.js\";\nimport selection_enter from \"./enter.js\";\nimport selection_exit from \"./exit.js\";\nimport selection_join from \"./join.js\";\nimport selection_merge from \"./merge.js\";\nimport selection_order from \"./order.js\";\nimport selection_sort from \"./sort.js\";\nimport selection_call from \"./call.js\";\nimport selection_nodes from \"./nodes.js\";\nimport selection_node from \"./node.js\";\nimport selection_size from \"./size.js\";\nimport selection_empty from \"./empty.js\";\nimport selection_each from \"./each.js\";\nimport selection_attr from \"./attr.js\";\nimport selection_style from \"./style.js\";\nimport selection_property from \"./property.js\";\nimport selection_classed from \"./classed.js\";\nimport selection_text from \"./text.js\";\nimport selection_html from \"./html.js\";\nimport selection_raise from \"./raise.js\";\nimport selection_lower from \"./lower.js\";\nimport selection_append from \"./append.js\";\nimport selection_insert from \"./insert.js\";\nimport selection_remove from \"./remove.js\";\nimport selection_clone from \"./clone.js\";\nimport selection_datum from \"./datum.js\";\nimport selection_on from \"./on.js\";\nimport selection_dispatch from \"./dispatch.js\";\nimport selection_iterator from \"./iterator.js\";\n\nexport var root = [null];\n\nexport function Selection(groups, parents) {\n this._groups = groups;\n this._parents = parents;\n}\n\nfunction selection() {\n return new Selection([[document.documentElement]], root);\n}\n\nfunction selection_selection() {\n return this;\n}\n\nSelection.prototype = selection.prototype = {\n constructor: Selection,\n select: selection_select,\n selectAll: selection_selectAll,\n selectChild: selection_selectChild,\n selectChildren: selection_selectChildren,\n filter: selection_filter,\n data: selection_data,\n enter: selection_enter,\n exit: selection_exit,\n join: selection_join,\n merge: selection_merge,\n selection: selection_selection,\n order: selection_order,\n sort: selection_sort,\n call: selection_call,\n nodes: selection_nodes,\n node: selection_node,\n size: selection_size,\n empty: selection_empty,\n each: selection_each,\n attr: selection_attr,\n style: selection_style,\n property: selection_property,\n classed: selection_classed,\n text: selection_text,\n html: selection_html,\n raise: selection_raise,\n lower: selection_lower,\n append: selection_append,\n insert: selection_insert,\n remove: selection_remove,\n clone: selection_clone,\n datum: selection_datum,\n on: selection_on,\n dispatch: selection_dispatch,\n [Symbol.iterator]: selection_iterator\n};\n\nexport default selection;\n","import {Selection, root} from \"./selection/index.js\";\n\nexport default function(selector) {\n return typeof selector === \"string\"\n ? new Selection([[document.querySelector(selector)]], [document.documentElement])\n : new Selection([[selector]], root);\n}\n","import {linearish} from \"./linear.js\";\nimport {copy, identity, transformer} from \"./continuous.js\";\nimport {initRange} from \"./init.js\";\n\nfunction transformPow(exponent) {\n return function(x) {\n return x < 0 ? -Math.pow(-x, exponent) : Math.pow(x, exponent);\n };\n}\n\nfunction transformSqrt(x) {\n return x < 0 ? -Math.sqrt(-x) : Math.sqrt(x);\n}\n\nfunction transformSquare(x) {\n return x < 0 ? -x * x : x * x;\n}\n\nexport function powish(transform) {\n var scale = transform(identity, identity),\n exponent = 1;\n\n function rescale() {\n return exponent === 1 ? transform(identity, identity)\n : exponent === 0.5 ? transform(transformSqrt, transformSquare)\n : transform(transformPow(exponent), transformPow(1 / exponent));\n }\n\n scale.exponent = function(_) {\n return arguments.length ? (exponent = +_, rescale()) : exponent;\n };\n\n return linearish(scale);\n}\n\nexport default function pow() {\n var scale = powish(transformer());\n\n scale.copy = function() {\n return copy(scale, pow()).exponent(scale.exponent());\n };\n\n initRange.apply(scale, arguments);\n\n return scale;\n}\n\nexport function sqrt() {\n return pow.apply(null, arguments).exponent(0.5);\n}\n","import { useEffect, useLayoutEffect, useRef, useState } from 'react'\nimport { select, scaleLinear, scaleSqrt, scaleOrdinal, scaleQuantize, extent, max, axisBottom, axisLeft, type ScaleOrdinal, type ScaleQuantize } from 'd3'\nimport ChartContainer from './ChartContainer'\nimport { CHART_COLORS, CHART_COLORS_GRADIENT, CHART_MARGINS } from '../../utils/chartConstants'\nimport { formatTimeValue, getFieldGranularity } from '../../utils/chartUtils'\nimport { useCubeContext } from '../../providers/CubeProvider'\nimport type { ChartProps } from '../../types'\n\ninterface BubbleData {\n x: number\n y: number\n size: number\n color?: string | number\n label: string\n series?: string\n}\n\nexport default function BubbleChart({\n data,\n chartConfig,\n displayConfig = {},\n queryObject,\n height = \"100%\"\n}: ChartProps) {\n const svgRef = useRef<SVGSVGElement | null>(null)\n const containerRef = useRef<HTMLDivElement | null>(null)\n const [, setHoveredBubble] = useState<string | null>(null)\n const [dimensions, setDimensions] = useState({ width: 0, height: 0 })\n const [dimensionsReady, setDimensionsReady] = useState(false)\n const { getFieldLabel } = useCubeContext()\n\n const safeDisplayConfig = {\n showLegend: displayConfig?.showLegend ?? true,\n showGrid: displayConfig?.showGrid ?? true,\n showTooltip: displayConfig?.showTooltip ?? true,\n minBubbleSize: displayConfig?.minBubbleSize ?? 5,\n maxBubbleSize: displayConfig?.maxBubbleSize ?? 50,\n bubbleOpacity: displayConfig?.bubbleOpacity ?? 0.7\n }\n\n // Enhanced dimension measurement with retry mechanism\n useLayoutEffect(() => {\n let retryCount = 0\n const maxRetries = 10\n let rafId: number\n let timeoutId: NodeJS.Timeout\n \n const updateDimensions = () => {\n if (containerRef.current) {\n const { width, height } = containerRef.current.getBoundingClientRect()\n console.log('BubbleChart: Dimension measurement attempt', retryCount + 1, { width, height })\n \n if (width > 0 && height > 0) {\n setDimensions({ width, height })\n setDimensionsReady(true)\n console.log('BubbleChart: Dimensions successfully measured:', { width, height })\n return true\n }\n }\n return false\n }\n \n // Immediate measurement\n const success = updateDimensions()\n \n if (!success && retryCount < maxRetries) {\n // Retry with requestAnimationFrame\n const retryWithRaf = () => {\n const rafSuccess = updateDimensions()\n \n if (!rafSuccess && retryCount < maxRetries) {\n retryCount++\n // Use setTimeout for additional retries with increasing delays\n timeoutId = setTimeout(() => {\n rafId = requestAnimationFrame(retryWithRaf)\n }, 50 * retryCount) // Increasing delay: 50ms, 100ms, 150ms, etc.\n }\n }\n \n rafId = requestAnimationFrame(retryWithRaf)\n }\n \n return () => {\n if (rafId) cancelAnimationFrame(rafId)\n if (timeoutId) clearTimeout(timeoutId)\n }\n }, [])\n\n // Enhanced ResizeObserver for dynamic resizing with immediate initialization\n useEffect(() => {\n let resizeObserver: ResizeObserver | null = null\n \n const updateDimensions = () => {\n if (containerRef.current) {\n const { width, height } = containerRef.current.getBoundingClientRect()\n if (width > 0 && height > 0) {\n setDimensions({ width, height })\n if (!dimensionsReady) {\n setDimensionsReady(true)\n console.log('BubbleChart: Dimensions ready via ResizeObserver:', { width, height })\n }\n }\n }\n }\n \n // Initialize ResizeObserver immediately\n if (containerRef.current) {\n resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const { width, height } = entry.contentRect\n if (width > 0 && height > 0) {\n setDimensions({ width, height })\n if (!dimensionsReady) {\n setDimensionsReady(true)\n console.log('BubbleChart: Dimensions ready via ResizeObserver:', { width, height })\n }\n }\n }\n })\n \n resizeObserver.observe(containerRef.current)\n \n // Also try immediate measurement as fallback\n updateDimensions()\n }\n\n // Window resize as additional fallback\n window.addEventListener('resize', updateDimensions)\n \n return () => {\n if (resizeObserver) {\n resizeObserver.disconnect()\n }\n window.removeEventListener('resize', updateDimensions)\n }\n }, [dimensionsReady])\n\n useEffect(() => {\n if (!data || data.length === 0 || !svgRef.current || !dimensionsReady || dimensions.width === 0) {\n console.log('BubbleChart: Skipping render - conditions not met:', {\n hasData: data && data.length > 0,\n hasSvgRef: !!svgRef.current,\n dimensionsReady,\n dimensions\n })\n return\n }\n\n // Clear previous chart\n select(svgRef.current).selectAll('*').remove()\n\n // Debug logging\n console.log('BubbleChart: chartConfig:', chartConfig)\n console.log('BubbleChart: data:', data)\n console.log('BubbleChart: dimensions:', dimensions)\n\n // Validate chartConfig - only new format supported\n if (!chartConfig?.xAxis || !chartConfig?.yAxis || !chartConfig?.series) {\n console.log('BubbleChart: Missing xAxis, yAxis, or series in chartConfig')\n return\n }\n\n const xAxisField = Array.isArray(chartConfig.xAxis) ? chartConfig.xAxis[0] : chartConfig.xAxis\n const yAxisField = Array.isArray(chartConfig.yAxis) ? chartConfig.yAxis[0] : chartConfig.yAxis\n const seriesField = Array.isArray(chartConfig.series) ? chartConfig.series[0] : chartConfig.series\n const sizeFieldName = Array.isArray(chartConfig.sizeField) ? chartConfig.sizeField[0] : chartConfig.sizeField || yAxisField\n const colorFieldName = Array.isArray(chartConfig.colorField) ? chartConfig.colorField[0] : chartConfig.colorField\n\n console.log('BubbleChart: fields extracted:', {\n xAxisField,\n yAxisField,\n seriesField,\n sizeFieldName,\n colorFieldName\n })\n\n if (!xAxisField || !yAxisField || !seriesField || !sizeFieldName) {\n console.log('BubbleChart: Missing required fields')\n return\n }\n\n // Transform data for bubble chart\n const xGranularity = getFieldGranularity(queryObject, xAxisField)\n const bubbleData: BubbleData[] = data.map(item => {\n const xValue = formatTimeValue(item[xAxisField], xGranularity) || item[xAxisField]\n const yValue = typeof item[yAxisField] === 'string' \n ? parseFloat(item[yAxisField]) \n : (item[yAxisField] || 0)\n const sizeValue = typeof item[sizeFieldName] === 'string'\n ? parseFloat(item[sizeFieldName])\n : (item[sizeFieldName] || 0)\n \n const seriesValue = item[seriesField]\n \n return {\n x: typeof xValue === 'string' ? parseFloat(xValue) || 0 : xValue,\n y: yValue,\n size: Math.abs(sizeValue), // Ensure positive size\n color: colorFieldName ? item[colorFieldName] : seriesValue,\n series: seriesValue,\n label: `${seriesValue || 'Unknown'}`\n }\n }).filter(d => d.size > 0) // Filter out bubbles with no size\n\n if (bubbleData.length === 0) return\n\n const margin = { \n ...CHART_MARGINS, \n left: CHART_MARGINS.left + 30, // Add extra 30px left margin for Y-axis label\n bottom: (safeDisplayConfig.showLegend && colorFieldName) ? 100 : 40 // Add extra space for legend\n }\n const width = dimensions.width - margin.left - margin.right\n const chartHeight = dimensions.height - margin.top - margin.bottom\n\n const svg = select(svgRef.current)\n .attr('width', dimensions.width)\n .attr('height', dimensions.height)\n\n const g = svg.append('g')\n .attr('transform', `translate(${margin.left},${margin.top})`)\n\n // Set up scales\n const xScale = scaleLinear()\n .domain(extent(bubbleData, d => d.x) as [number, number])\n .range([0, width])\n .nice()\n\n const yScale = scaleLinear()\n .domain(extent(bubbleData, d => d.y) as [number, number])\n .range([chartHeight, 0])\n .nice()\n\n const sizeScale = scaleSqrt()\n .domain([0, max(bubbleData, d => d.size) as number])\n .range([safeDisplayConfig.minBubbleSize, safeDisplayConfig.maxBubbleSize])\n\n // Set up color scale\n let colorScale: ScaleOrdinal<string, string> | ScaleQuantize<string>\n let isNumericColorField = false\n let uniqueColors: string[] = []\n \n if (colorFieldName && bubbleData.length > 0) {\n // Check if color field is numeric for color scaling (same logic as TreeMapChart)\n const colorValues = bubbleData.map(item => {\n const value = item.color\n return typeof value === 'string' ? parseFloat(value) : value\n }).filter((val): val is number => !isNaN(val as number))\n \n isNumericColorField = colorValues.length === bubbleData.length && colorValues.every(val => typeof val === 'number')\n \n if (isNumericColorField) {\n // Use D3 quantize scale for better color distribution with small ranges\n const minValue = Math.min(...colorValues)\n const maxValue = Math.max(...colorValues)\n \n // Create D3 quantize color scale - maps continuous data to discrete color bands\n colorScale = scaleQuantize<string>()\n .domain([minValue, maxValue])\n .range(CHART_COLORS_GRADIENT)\n } else {\n // Categorical color field - use CHART_COLORS\n uniqueColors = [...new Set(bubbleData.map(d => String(d.color)))]\n colorScale = scaleOrdinal<string>()\n .domain(uniqueColors)\n .range(CHART_COLORS)\n }\n } else {\n // Single color for all bubbles\n colorScale = scaleOrdinal<string>()\n .domain(['default'])\n .range([CHART_COLORS[0]])\n }\n\n // Add grid\n if (safeDisplayConfig.showGrid) {\n // X-axis grid\n g.append('g')\n .attr('class', 'grid')\n .attr('transform', `translate(0,${chartHeight})`)\n .call(axisBottom(xScale)\n .tickSize(-chartHeight)\n .tickFormat(() => '')\n )\n .style('stroke-dasharray', '3,3')\n .style('opacity', 0.3)\n\n // Y-axis grid\n g.append('g')\n .attr('class', 'grid')\n .call(axisLeft(yScale)\n .tickSize(-width)\n .tickFormat(() => '')\n )\n .style('stroke-dasharray', '3,3')\n .style('opacity', 0.3)\n }\n\n // Add X axis\n g.append('g')\n .attr('transform', `translate(0,${chartHeight})`)\n .call(axisBottom(xScale))\n .append('text')\n .attr('x', width / 2)\n .attr('y', 35)\n .attr('fill', 'currentColor')\n .style('text-anchor', 'middle')\n .style('font-size', '12px')\n .text(getFieldLabel(xAxisField))\n\n // Add Y axis\n g.append('g')\n .call(axisLeft(yScale))\n .append('text')\n .attr('transform', 'rotate(-90)')\n .attr('y', -35)\n .attr('x', -chartHeight / 2)\n .attr('fill', 'currentColor')\n .style('text-anchor', 'middle')\n .style('font-size', '12px')\n .text(getFieldLabel(yAxisField))\n\n // Create tooltip\n const tooltip = select('body').append('div')\n .attr('class', 'bubble-chart-tooltip')\n .style('position', 'absolute')\n .style('padding', '8px')\n .style('background', 'rgba(0, 0, 0, 0.8)')\n .style('color', 'white')\n .style('border-radius', '4px')\n .style('font-size', '12px')\n .style('pointer-events', 'none')\n .style('opacity', 0)\n .style('z-index', 1000)\n\n // Add bubbles\n const bubbles = g.selectAll('.bubble')\n .data(bubbleData)\n .enter().append('circle')\n .attr('class', 'bubble')\n .attr('cx', d => xScale(d.x))\n .attr('cy', d => yScale(d.y))\n .attr('r', d => sizeScale(d.size))\n .style('fill', d => {\n if (colorFieldName && d.color !== undefined) {\n return isNumericColorField\n ? (colorScale as ScaleQuantize<string>)(d.color as number)\n : (colorScale as ScaleOrdinal<string, string>)(String(d.color))\n }\n return CHART_COLORS[0]\n })\n .style('opacity', safeDisplayConfig.bubbleOpacity)\n .style('stroke', '#fff')\n .style('stroke-width', 1)\n .style('cursor', 'pointer')\n\n // Add hover effects\n if (safeDisplayConfig.showTooltip) {\n bubbles\n .on('mouseover', function(event, d) {\n select(this)\n .transition()\n .duration(200)\n .style('opacity', 1)\n .attr('r', sizeScale(d.size) * 1.1)\n\n const tooltipContent = [\n `<strong>${d.series || 'Unknown'}</strong>`,\n `${getFieldLabel(xAxisField)}: ${d.x}`,\n `${getFieldLabel(yAxisField)}: ${d.y}`,\n `${getFieldLabel(sizeFieldName)}: ${d.size}`,\n colorFieldName && d.color ? `${getFieldLabel(colorFieldName)}: ${d.color}` : ''\n ].filter(Boolean).join('<br>')\n\n tooltip\n .html(tooltipContent)\n .style('left', (event.pageX + 10) + 'px')\n .style('top', (event.pageY - 10) + 'px')\n .transition()\n .duration(200)\n .style('opacity', 1)\n\n setHoveredBubble(d.label)\n })\n .on('mousemove', function(event) {\n tooltip\n .style('left', (event.pageX + 10) + 'px')\n .style('top', (event.pageY - 10) + 'px')\n })\n .on('mouseout', function(_event, d) {\n select(this)\n .transition()\n .duration(200)\n .style('opacity', safeDisplayConfig.bubbleOpacity)\n .attr('r', sizeScale(d.size))\n\n tooltip\n .transition()\n .duration(200)\n .style('opacity', 0)\n\n setHoveredBubble(null)\n })\n }\n\n // Add legend if needed\n if (safeDisplayConfig.showLegend && colorFieldName) {\n if (isNumericColorField) {\n // Create gradient legend for numeric color field\n const legendWidth = 200\n const legendHeight = 20\n const minValue = Math.min(...bubbleData.map(d => d.color as number))\n const maxValue = Math.max(...bubbleData.map(d => d.color as number))\n \n const legend = g.append('g')\n .attr('class', 'color-legend')\n .attr('transform', `translate(${width / 2 - legendWidth / 2}, ${chartHeight + 60})`)\n\n // Create gradient definition\n const defs = svg.append('defs')\n const gradient = defs.append('linearGradient')\n .attr('id', 'color-scale-gradient')\n .attr('x1', '0%')\n .attr('y1', '0%')\n .attr('x2', '100%')\n .attr('y2', '0%')\n\n // Add color stops for the gradient\n CHART_COLORS_GRADIENT.forEach((color, i) => {\n gradient.append('stop')\n .attr('offset', `${(i / (CHART_COLORS_GRADIENT.length - 1)) * 100}%`)\n .attr('stop-color', color)\n })\n\n // Add the gradient rectangle\n legend.append('rect')\n .attr('width', legendWidth)\n .attr('height', legendHeight)\n .style('fill', 'url(#color-scale-gradient)')\n .style('stroke', '#ccc')\n .style('stroke-width', 1)\n\n // Add min value label\n legend.append('text')\n .attr('x', 0)\n .attr('y', legendHeight + 15)\n .attr('text-anchor', 'start')\n .style('font-size', '11px')\n .style('fill', 'currentColor')\n .text(minValue.toFixed(2))\n\n // Add max value label\n legend.append('text')\n .attr('x', legendWidth)\n .attr('y', legendHeight + 15)\n .attr('text-anchor', 'end')\n .style('font-size', '11px')\n .style('fill', 'currentColor')\n .text(maxValue.toFixed(2))\n\n // Add field name label\n legend.append('text')\n .attr('x', legendWidth / 2)\n .attr('y', -5)\n .attr('text-anchor', 'middle')\n .style('font-size', '12px')\n .style('font-weight', 'bold')\n .style('fill', 'currentColor')\n .text(getFieldLabel(colorFieldName))\n\n } else {\n // Original categorical legend\n const legendItems = uniqueColors\n\n if (legendItems.length > 0) {\n const legend = g.append('g')\n .attr('class', 'legend')\n .attr('transform', `translate(${width / 2 - (legendItems.length * 80) / 2}, ${chartHeight + 60})`)\n\n const legendItem = legend.selectAll('.legend-item')\n .data(legendItems)\n .enter().append('g')\n .attr('class', 'legend-item')\n .attr('transform', (_d, i) => `translate(${i * 80}, 0)`)\n .style('cursor', 'pointer')\n\n legendItem.append('circle')\n .attr('cx', 5)\n .attr('cy', 5)\n .attr('r', 5)\n .style('fill', d => (colorScale as ScaleOrdinal<string, string>)(d as string))\n .style('opacity', safeDisplayConfig.bubbleOpacity)\n\n legendItem.append('text')\n .attr('x', 15)\n .attr('y', 5)\n .attr('dy', '.35em')\n .style('font-size', '11px')\n .style('fill', 'currentColor')\n .text(d => String(d))\n\n // Legend hover effects\n legendItem\n .on('mouseover', function(_event, legendKey) {\n // Highlight matching bubbles\n bubbles\n .transition()\n .duration(200)\n .style('opacity', d => {\n const matches = colorFieldName && String(d.color) === legendKey\n return matches ? 1 : 0.2\n })\n })\n .on('mouseout', function() {\n // Reset all bubbles\n bubbles\n .transition()\n .duration(200)\n .style('opacity', safeDisplayConfig.bubbleOpacity)\n })\n }\n }\n }\n\n // Cleanup function\n return () => {\n tooltip.remove()\n }\n }, [data, chartConfig, displayConfig, queryObject, dimensions, dimensionsReady, safeDisplayConfig.showLegend, safeDisplayConfig.showGrid, safeDisplayConfig.showTooltip, safeDisplayConfig.minBubbleSize, safeDisplayConfig.maxBubbleSize, safeDisplayConfig.bubbleOpacity])\n\n if (!data || data.length === 0) {\n return (\n <div className=\"flex items-center justify-center w-full text-gray-500\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">No data available</div>\n <div className=\"text-xs\">No data points to display in bubble chart</div>\n </div>\n </div>\n )\n }\n\n // Validate that we have required fields\n const hasValidConfig = chartConfig?.xAxis && chartConfig?.yAxis && chartConfig?.series\n if (!hasValidConfig) {\n return (\n <div className=\"flex items-center justify-center w-full text-yellow-600\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">Configuration Required</div>\n <div className=\"text-xs\">Bubble chart requires xAxis, yAxis, series, and sizeField dimensions</div>\n <div className=\"text-xs mt-1\">Optional: colorField for bubble coloring</div>\n </div>\n </div>\n )\n }\n\n return (\n <ChartContainer height={height}>\n <div ref={containerRef} className=\"w-full h-full relative\">\n <svg ref={svgRef} className=\"w-full h-full\" />\n {!dimensionsReady && (\n <div className=\"absolute inset-0 flex items-center justify-center\">\n <div className=\"text-gray-400 text-sm\">Measuring chart dimensions...</div>\n </div>\n )}\n </div>\n </ChartContainer>\n )\n}","import { useEffect, useLayoutEffect, useRef, useState } from 'react'\nimport { select, scaleQuantize, max, min } from 'd3'\nimport ChartContainer from './ChartContainer'\nimport { CHART_COLORS_GRADIENT, CHART_MARGINS } from '../../utils/chartConstants'\nimport { formatTimeValue } from '../../utils/chartUtils'\nimport { useCubeContext } from '../../providers/CubeProvider'\nimport type { ChartProps } from '../../types'\n\ninterface GridCell {\n x: number\n y: number\n value: number\n date: Date\n label: string\n}\n\ninterface GridMapping {\n extractX: (date: Date) => number\n extractY: (date: Date) => number\n xLabels: string[]\n yLabels: string[]\n xFormat: (value: number) => string\n yFormat: (value: number) => string\n cellWidth: number\n cellHeight: number\n hasHierarchicalLabels?: boolean\n getYearFromX?: (value: number) => number\n}\n\nexport default function ActivityGridChart({\n data,\n chartConfig,\n displayConfig = {},\n queryObject,\n height = \"100%\"\n}: ChartProps) {\n const svgRef = useRef<SVGSVGElement | null>(null)\n const containerRef = useRef<HTMLDivElement | null>(null)\n const [dimensions, setDimensions] = useState({ width: 0, height: 0 })\n const [dimensionsReady, setDimensionsReady] = useState(false)\n const { getFieldLabel } = useCubeContext()\n\n const safeDisplayConfig = {\n showTooltip: displayConfig?.showTooltip ?? true,\n showLabels: displayConfig?.showLabels ?? true,\n colorIntensity: displayConfig?.colorIntensity ?? 'medium'\n }\n\n // Enhanced dimension measurement with retry mechanism\n useLayoutEffect(() => {\n let retryCount = 0\n const maxRetries = 10\n let rafId: number\n let timeoutId: NodeJS.Timeout\n \n const updateDimensions = () => {\n if (containerRef.current) {\n const { width, height } = containerRef.current.getBoundingClientRect()\n \n if (width > 0 && height > 0) {\n setDimensions({ width, height })\n setDimensionsReady(true)\n return true\n }\n }\n return false\n }\n \n const success = updateDimensions()\n \n if (!success && retryCount < maxRetries) {\n const retryWithRaf = () => {\n const rafSuccess = updateDimensions()\n \n if (!rafSuccess && retryCount < maxRetries) {\n retryCount++\n timeoutId = setTimeout(() => {\n rafId = requestAnimationFrame(retryWithRaf)\n }, 50 * retryCount)\n }\n }\n \n rafId = requestAnimationFrame(retryWithRaf)\n }\n \n return () => {\n if (rafId) cancelAnimationFrame(rafId)\n if (timeoutId) clearTimeout(timeoutId)\n }\n }, [])\n\n // ResizeObserver for dynamic resizing\n useEffect(() => {\n let resizeObserver: ResizeObserver | null = null\n \n const updateDimensions = () => {\n if (containerRef.current) {\n const { width, height } = containerRef.current.getBoundingClientRect()\n if (width > 0 && height > 0) {\n setDimensions({ width, height })\n if (!dimensionsReady) {\n setDimensionsReady(true)\n }\n }\n }\n }\n \n if (containerRef.current) {\n resizeObserver = new ResizeObserver(() => updateDimensions())\n resizeObserver.observe(containerRef.current)\n updateDimensions()\n }\n\n window.addEventListener('resize', updateDimensions)\n \n return () => {\n if (resizeObserver) {\n resizeObserver.disconnect()\n }\n window.removeEventListener('resize', updateDimensions)\n }\n }, [dimensionsReady])\n\n // Helper functions for grid coordinate extraction\n const getQuarter = (date: Date): number => {\n return Math.floor(date.getMonth() / 3) + 1 // 1-4\n }\n\n const getMonthOfQuarter = (date: Date): number => {\n return (date.getMonth() % 3) + 1 // 1-3\n }\n\n const getWeekOfMonth = (date: Date): number => {\n // Always start from week 1 for the first week of the month, regardless of day offset\n const dayOfMonth = date.getDate()\n return Math.floor((dayOfMonth - 1) / 7) + 1 // 1-5 typically\n }\n\n // Get granularity mapping based on time dimension\n const getGridMapping = (granularity: string): GridMapping | null => {\n switch (granularity?.toLowerCase()) {\n case 'year':\n // Year granularity is not useful for activity grids\n return null\n \n case 'quarter':\n // Quarter granularity: years × quarters\n return {\n extractX: (date: Date) => date.getFullYear(),\n extractY: (date: Date) => getQuarter(date) - 1, // 0-3 for indexing\n xLabels: [], // Will be determined from data\n yLabels: ['Q1', 'Q2', 'Q3', 'Q4'],\n xFormat: (value: number) => `'${value.toString().slice(-2)}`, // '24 instead of 2024\n yFormat: (value: number) => ['Q1', 'Q2', 'Q3', 'Q4'][value] || '',\n cellWidth: 16,\n cellHeight: 16\n }\n \n case 'month':\n // Month granularity: quarters × months of quarter\n // Show years above and quarters (Q1, Q2, Q3, Q4) as columns with hierarchical labels\n return {\n extractX: (date: Date) => {\n const year = date.getFullYear()\n const quarter = getQuarter(date) // 1-4\n return year * 10 + quarter // e.g., 20241, 20242, 20243, 20244 (only 4 per year)\n },\n extractY: (date: Date) => getMonthOfQuarter(date) - 1, // 0-2 for indexing\n xLabels: [], // Will be determined from data\n yLabels: ['Month 1', 'Month 2', 'Month 3'],\n xFormat: (value: number) => {\n const quarter = value % 10\n return `Q${quarter}` // Just show Q1, Q2, Q3, Q4 for individual columns\n },\n yFormat: (value: number) => ['Month 1', 'Month 2', 'Month 3'][value] || '',\n cellWidth: 16,\n cellHeight: 16,\n hasHierarchicalLabels: true, // Flag to indicate we need special handling\n getYearFromX: (value: number) => Math.floor(value / 10) // Helper to get year for grouping\n }\n \n case 'week':\n // Week granularity: months × weeks of month (same structure as quarters but with months as columns)\n return {\n extractX: (date: Date) => {\n const year = date.getFullYear()\n const month = date.getMonth() + 1\n return year * 100 + month // e.g., 202401, 202402, etc.\n },\n extractY: (date: Date) => getWeekOfMonth(date) - 1, // 0-5 for indexing\n xLabels: [], // Will be determined from data\n yLabels: ['Week 1', 'Week 2', 'Week 3', 'Week 4', 'Week 5'],\n xFormat: (value: number) => {\n const month = value % 100\n const monthNames = ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D']\n return monthNames[month - 1] || ''\n },\n yFormat: (value: number) => ['Week 1', 'Week 2', 'Week 3', 'Week 4', 'Week 5'][value] || '',\n cellWidth: 16,\n cellHeight: 16,\n hasHierarchicalLabels: true, // Add hierarchical labels like month view\n getYearFromX: (value: number) => Math.floor(value / 100) // Helper to get year for grouping\n }\n \n case 'day':\n // Day granularity: weeks × days of week with hierarchical year/week labels\n return {\n extractX: (date: Date) => {\n const { year, week } = getWeekOfYear(date)\n return year * 100 + week // e.g., 202401, 202402, etc.\n },\n extractY: (date: Date) => date.getDay(), // 0-6 (Sun-Sat)\n xLabels: [], // Will be determined from data\n yLabels: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n xFormat: (value: number) => {\n const week = value % 100\n return `${week}`\n },\n yFormat: (value: number) => ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'][value] || '',\n cellWidth: 16,\n cellHeight: 16,\n hasHierarchicalLabels: true, // Add hierarchical labels\n getYearFromX: (value: number) => Math.floor(value / 100) // Helper to get year for grouping\n }\n \n default:\n return null\n }\n }\n\n // Helper function to get week of year with correct year (1-53)\n const getWeekOfYear = (date: Date): { year: number, week: number } => {\n const d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()))\n const dayNum = d.getUTCDay() || 7\n d.setUTCDate(d.getUTCDate() + 4 - dayNum)\n const year = d.getUTCFullYear()\n const yearStart = new Date(Date.UTC(year, 0, 1))\n const week = Math.ceil((((d.getTime() - yearStart.getTime()) / 86400000) + 1) / 7)\n return { year, week }\n }\n\n useEffect(() => {\n if (!data || data.length === 0 || !svgRef.current || !dimensionsReady || dimensions.width === 0) {\n console.log('ActivityGridChart: Skipping render - conditions not met:', {\n hasData: data && data.length > 0,\n hasSvgRef: !!svgRef.current,\n dimensionsReady,\n dimensions\n })\n return\n }\n\n // Clear previous chart\n select(svgRef.current).selectAll('*').remove()\n\n // Validate chartConfig\n if (!chartConfig?.dateField || !chartConfig?.valueField) {\n console.log('ActivityGridChart: Missing dateField or valueField in chartConfig')\n return\n }\n\n const dateField = Array.isArray(chartConfig.dateField) ? chartConfig.dateField[0] : chartConfig.dateField\n const valueField = Array.isArray(chartConfig.valueField) ? chartConfig.valueField[0] : chartConfig.valueField\n\n console.log('ActivityGridChart: Configuration:', {\n dateField,\n valueField,\n dataLength: data.length,\n sampleData: data.slice(0, 3)\n })\n\n if (!dateField || !valueField) {\n console.log('ActivityGridChart: Invalid dateField or valueField')\n return\n }\n\n // Get granularity directly from the query's time dimensions\n const getQueryGranularity = () => {\n if (!queryObject?.timeDimensions || queryObject.timeDimensions.length === 0) {\n console.log('ActivityGridChart: No timeDimensions in query, defaulting to day')\n return 'day'\n }\n \n // Find the time dimension that matches our dateField\n const timeDim = queryObject.timeDimensions.find((td: any) => \n td.dimension === dateField || td.dimension.includes(dateField)\n )\n \n if (timeDim && timeDim.granularity) {\n console.log('ActivityGridChart: Found matching time dimension:', timeDim)\n return timeDim.granularity\n }\n \n // Fallback to first time dimension's granularity\n const firstTimeDim = queryObject.timeDimensions[0]\n if (firstTimeDim && firstTimeDim.granularity) {\n console.log('ActivityGridChart: Using first time dimension granularity:', firstTimeDim)\n return firstTimeDim.granularity\n }\n \n console.log('ActivityGridChart: No granularity found, defaulting to day')\n return 'day'\n }\n \n const queryGranularity = getQueryGranularity()\n const gridMapping = getGridMapping(queryGranularity)\n \n // Handle unsupported granularity\n if (!gridMapping) {\n console.log('ActivityGridChart: Unsupported granularity:', queryGranularity)\n return\n }\n \n console.log('ActivityGridChart: Query granularity analysis:', {\n queryObject: queryObject?.timeDimensions,\n dateField,\n detectedGranularity: queryGranularity,\n gridMapping: {\n cellWidth: gridMapping.cellWidth,\n cellHeight: gridMapping.cellHeight,\n yLabels: gridMapping.yLabels\n }\n })\n\n // Transform data for grid\n const gridData: GridCell[] = data.map(item => {\n const dateValue = item[dateField]\n const value = typeof item[valueField] === 'string' \n ? parseFloat(item[valueField]) \n : (item[valueField] || 0)\n \n // Parse the date\n let date: Date\n if (typeof dateValue === 'string') {\n // Handle different date formats\n let isoStr = dateValue\n if (dateValue.includes(' ')) {\n isoStr = dateValue.replace(' ', 'T').replace('+00', 'Z').replace(/\\+\\d{2}:\\d{2}$/, 'Z')\n }\n if (!isoStr.endsWith('Z') && !isoStr.includes('+')) {\n isoStr = isoStr + 'Z'\n }\n date = new Date(isoStr)\n } else {\n date = new Date(dateValue)\n }\n\n // Skip invalid dates\n if (isNaN(date.getTime())) {\n console.log('ActivityGridChart: Invalid date:', dateValue)\n return null\n }\n\n const x = gridMapping.extractX(date)\n const y = gridMapping.extractY(date)\n \n return {\n x,\n y,\n value,\n date,\n label: formatTimeValue(dateValue, queryGranularity)\n }\n }).filter((cell): cell is GridCell => cell !== null)\n\n console.log('ActivityGridChart: Transformed grid data:', {\n totalCells: gridData.length,\n sampleCells: gridData.slice(0, 5).map(cell => ({ x: cell.x, y: cell.y, value: cell.value, date: cell.date.toISOString() })),\n uniqueXValues: [...new Set(gridData.map(cell => cell.x))].sort(),\n xValueMeaning: queryGranularity === 'month' ? 'year*10 + quarter (should be like 20241, 20242, 20243, 20244)' : 'regular x values'\n })\n\n if (gridData.length === 0) return\n\n // Calculate grid dimensions\n const maxX = max(gridData, d => d.x) || 0\n const maxY = max(gridData, d => d.y) || 0\n const minX = min(gridData, d => d.x) || 0\n const minY = min(gridData, d => d.y) || 0\n\n console.log('ActivityGridChart: Grid bounds:', { minX, maxX, minY, maxY })\n\n // Generate complete X range first so we can calculate proper grid width\n const getCompleteXRange = (): number[] => {\n const dataXValues = [...new Set(gridData.map(cell => cell.x))].sort()\n \n if (queryGranularity === 'quarter') {\n // For quarters: only show quarters that have data to avoid gaps\n return dataXValues\n }\n \n if (queryGranularity === 'month') {\n // For months: only show quarters that have data to avoid gaps\n return dataXValues\n }\n \n if (queryGranularity === 'week') {\n // For weeks: only show months that have data to avoid gaps\n return dataXValues\n }\n \n if (queryGranularity === 'day') {\n // For days: only show the actual weeks that have data to avoid discontinuities\n return dataXValues\n }\n \n // For other granularities, use the actual data values\n return dataXValues\n }\n \n const completeXRange = getCompleteXRange()\n \n // Calculate grid dimensions based on complete X range\n const gridWidth = completeXRange.length * gridMapping.cellWidth + (completeXRange.length - 1) * 4\n const gridHeight = (maxY - minY + 1) * gridMapping.cellHeight + (maxY - minY) * 4\n\n const margin = { \n ...CHART_MARGINS, \n left: 60, // Space for Y-axis labels\n bottom: 10, // Reduced since labels are at top\n top: gridMapping.hasHierarchicalLabels ? 40 : 25, // Extra space for hierarchical labels\n right: 10\n }\n \n const availableWidth = dimensions.width - margin.left - margin.right\n const availableHeight = dimensions.height - margin.top - margin.bottom\n\n // Scale the grid to fit the available space, but ensure minimum cell size\n // Same minimum sizes for all granularities for consistency\n const getMinCellSize = () => {\n return { width: 16, height: 16 } // Same size for all views\n }\n \n const minCellSize = getMinCellSize()\n const maxCellSize = 24\n \n const scaleX = availableWidth / gridWidth\n const scaleY = availableHeight / gridHeight\n const scale = Math.min(scaleX, scaleY)\n\n // Calculate final cell size with constraints\n let finalCellWidth = Math.max(minCellSize.width, Math.min(maxCellSize, gridMapping.cellWidth * scale))\n let finalCellHeight = Math.max(minCellSize.height, Math.min(maxCellSize, gridMapping.cellHeight * scale))\n \n // For week view, prefer scrolling over tiny cells\n if (queryGranularity === 'week' && finalCellWidth < minCellSize.width) {\n finalCellWidth = minCellSize.width\n }\n \n // Calculate actual grid dimensions with the final cell sizes\n const actualGridWidth = completeXRange.length * finalCellWidth + (completeXRange.length - 1) * 4\n const actualGridHeight = (maxY - minY + 1) * finalCellHeight + (maxY - minY) * 4\n \n // Determine if we need horizontal scrolling\n const needsHorizontalScroll = actualGridWidth > availableWidth\n const svgWidth = needsHorizontalScroll ? actualGridWidth + margin.left + margin.right : dimensions.width\n \n console.log('ActivityGridChart: Scaling calculations:', {\n availableWidth,\n availableHeight,\n gridWidth,\n gridHeight,\n actualGridWidth,\n actualGridHeight,\n scale,\n needsHorizontalScroll,\n svgWidth,\n originalCellSize: { width: gridMapping.cellWidth, height: gridMapping.cellHeight },\n finalCellSize: { width: finalCellWidth, height: finalCellHeight }\n })\n\n const svg = select(svgRef.current)\n .attr('width', svgWidth)\n .attr('height', dimensions.height)\n\n const g = svg.append('g')\n .attr('transform', `translate(${margin.left},${margin.top})`)\n\n // Set up color scale\n const values = gridData.map(d => d.value)\n const minValue = min(values) || 0\n const maxValue = max(values) || 1\n\n const colorScale = scaleQuantize<string>()\n .domain([minValue, maxValue])\n .range(CHART_COLORS_GRADIENT)\n\n // Create grid data map for quick lookup\n const gridMap = new Map<string, GridCell>()\n gridData.forEach(cell => {\n const key = `${cell.x}-${cell.y}`\n gridMap.set(key, cell)\n })\n\n // Create tooltip\n const tooltip = select('body').append('div')\n .attr('class', 'activity-grid-tooltip')\n .style('position', 'absolute')\n .style('padding', '8px')\n .style('background', 'rgba(0, 0, 0, 0.8)')\n .style('color', 'white')\n .style('border-radius', '4px')\n .style('font-size', '12px')\n .style('pointer-events', 'none')\n .style('opacity', 0)\n .style('z-index', 1000)\n\n // Create a mapping from X values to their position indices for proper spacing\n const xValueToIndex = new Map<number, number>()\n completeXRange.forEach((x, index) => {\n xValueToIndex.set(x, index)\n })\n \n // Render grid cells for the complete X range\n for (const x of completeXRange) {\n for (let y = minY; y <= maxY; y++) {\n const key = `${x}-${y}`\n const cell = gridMap.get(key)\n const xIndex = xValueToIndex.get(x) || 0\n \n const rect = g.append('rect')\n .attr('x', xIndex * (finalCellWidth + 4))\n .attr('y', (y - minY) * (finalCellHeight + 4))\n .attr('width', finalCellWidth)\n .attr('height', finalCellHeight)\n .attr('rx', 2)\n .attr('ry', 2)\n .style('fill', cell ? colorScale(cell.value) : '#ebedf0')\n .style('stroke', '#fff')\n .style('stroke-width', 1)\n\n // Add hover effects and tooltips\n if (safeDisplayConfig.showTooltip) {\n rect\n .style('cursor', 'pointer')\n .on('mouseover', function(event) {\n select(this)\n .style('stroke', '#000')\n .style('stroke-width', 2)\n\n if (cell) {\n const tooltipContent = [\n `<strong>${cell.label}</strong>`,\n `${getFieldLabel(valueField)}: ${cell.value}`\n ].join('<br>')\n\n tooltip\n .html(tooltipContent)\n .style('left', (event.pageX + 10) + 'px')\n .style('top', (event.pageY - 10) + 'px')\n .transition()\n .duration(200)\n .style('opacity', 1)\n }\n })\n .on('mousemove', function(event) {\n tooltip\n .style('left', (event.pageX + 10) + 'px')\n .style('top', (event.pageY - 10) + 'px')\n })\n .on('mouseout', function() {\n select(this)\n .style('stroke', '#fff')\n .style('stroke-width', 1)\n\n tooltip\n .transition()\n .duration(200)\n .style('opacity', 0)\n })\n }\n }\n }\n\n // Add axis labels if enabled\n if (safeDisplayConfig.showLabels) {\n if (gridMapping.hasHierarchicalLabels && gridMapping.getYearFromX) {\n // Special handling for quarter view with hierarchical labels\n // Use the complete X range to show all quarters/months\n \n // Group quarters by year\n const yearGroups = new Map<number, number[]>()\n for (const x of completeXRange) {\n const year = gridMapping.getYearFromX(x)\n if (!yearGroups.has(year)) {\n yearGroups.set(year, [])\n }\n yearGroups.get(year)!.push(x)\n }\n \n console.log('ActivityGridChart: Year groups:', Object.fromEntries(yearGroups))\n \n // Draw column labels (Q1-Q4 for months, Jan-Dec for weeks)\n for (const x of completeXRange) {\n const xIndex = xValueToIndex.get(x) || 0\n g.append('text')\n .attr('x', xIndex * (finalCellWidth + 4) + finalCellWidth / 2)\n .attr('y', -8)\n .attr('text-anchor', 'middle')\n .style('font-size', '10px')\n .style('fill', 'currentColor')\n .text(gridMapping.xFormat(x))\n }\n \n // Draw year group labels above quarters\n for (const [year, xValues] of yearGroups) {\n if (xValues.length > 0) {\n // Get the index positions for proper spacing\n const startIndex = Math.min(...xValues.map(x => xValueToIndex.get(x) || 0))\n const endIndex = Math.max(...xValues.map(x => xValueToIndex.get(x) || 0))\n const centerIndex = (startIndex + endIndex) / 2\n \n // Year label\n g.append('text')\n .attr('x', centerIndex * (finalCellWidth + 4) + finalCellWidth / 2)\n .attr('y', -25)\n .attr('text-anchor', 'middle')\n .style('font-size', '12px')\n .style('font-weight', 'bold')\n .style('fill', 'currentColor')\n .text(`'${year.toString().slice(-2)}`)\n \n // Optional: Add a subtle line to group quarters under the year\n if (xValues.length > 1) {\n g.append('line')\n .attr('x1', startIndex * (finalCellWidth + 4))\n .attr('x2', endIndex * (finalCellWidth + 4) + finalCellWidth)\n .attr('y1', -20)\n .attr('y2', -20)\n .style('stroke', 'currentColor')\n .style('stroke-width', 1)\n .style('opacity', 0.3)\n }\n }\n }\n } else {\n // Regular X-axis labels for other granularities\n const xLabelStep = Math.max(1, Math.floor(completeXRange.length / 10))\n for (let i = 0; i < completeXRange.length; i += xLabelStep) {\n const x = completeXRange[i]\n g.append('text')\n .attr('x', i * (finalCellWidth + 4) + finalCellWidth / 2)\n .attr('y', -8)\n .attr('text-anchor', 'middle')\n .style('font-size', '10px')\n .style('fill', 'currentColor')\n .text(gridMapping.xFormat(x))\n }\n }\n\n // Y-axis labels (left) - same for all granularities\n for (let y = minY; y <= maxY; y++) {\n g.append('text')\n .attr('x', -8)\n .attr('y', (y - minY) * (finalCellHeight + 4) + finalCellHeight / 2)\n .attr('text-anchor', 'end')\n .attr('dy', '.35em')\n .style('font-size', '10px')\n .style('fill', 'currentColor')\n .text(gridMapping.yFormat(y))\n }\n }\n\n // Cleanup function\n return () => {\n tooltip.remove()\n }\n }, [data, chartConfig, displayConfig, queryObject, dimensions, dimensionsReady, safeDisplayConfig.showTooltip, safeDisplayConfig.showLabels])\n\n if (!data || data.length === 0) {\n return (\n <div className=\"flex items-center justify-center w-full text-gray-500\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">No data available</div>\n <div className=\"text-xs\">No data points to display in activity grid</div>\n </div>\n </div>\n )\n }\n\n // Validate that we have required fields\n const hasValidConfig = chartConfig?.dateField && chartConfig?.valueField\n if (!hasValidConfig) {\n return (\n <div className=\"flex items-center justify-center w-full text-yellow-600\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">Configuration Required</div>\n <div className=\"text-xs\">Activity grid requires a time dimension and a measure</div>\n </div>\n </div>\n )\n }\n\n // Check if granularity is supported\n const dateField = Array.isArray(chartConfig.dateField) ? chartConfig.dateField[0] : chartConfig.dateField\n const granularityFromQuery = queryObject?.timeDimensions?.find((td: any) => \n td.dimension === dateField || td.dimension.includes(dateField)\n )?.granularity || 'day'\n \n if (granularityFromQuery?.toLowerCase() === 'year') {\n return (\n <div className=\"flex items-center justify-center w-full text-amber-600\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">Granularity Too High</div>\n <div className=\"text-xs\">Activity grids work best with quarter, month, week, or day granularity</div>\n <div className=\"text-xs mt-1\">Please choose a lower granularity for your time dimension</div>\n </div>\n </div>\n )\n }\n\n return (\n <ChartContainer height={height}>\n <div ref={containerRef} className=\"w-full h-full relative overflow-x-auto\">\n <svg ref={svgRef} className=\"h-full\" />\n {!dimensionsReady && (\n <div className=\"absolute inset-0 flex items-center justify-center\">\n <div className=\"text-gray-400 text-sm\">Measuring chart dimensions...</div>\n </div>\n )}\n </div>\n </ChartContainer>\n )\n}","/**\n * Analytics Portlet Component\n * Simplified version with minimal dependencies\n */\n\nimport { useMemo, useState, forwardRef, useImperativeHandle, useEffect, useRef } from 'react'\nimport { useCubeQuery } from '../hooks/useCubeQuery'\nimport ChartErrorBoundary from './ChartErrorBoundary'\nimport { \n RechartsBarChart, \n RechartsLineChart, \n RechartsAreaChart, \n RechartsPieChart, \n RechartsScatterChart, \n RechartsRadarChart, \n RechartsRadialBarChart, \n RechartsTreeMapChart, \n BubbleChart,\n DataTable,\n ActivityGridChart\n} from './charts'\nimport type { AnalyticsPortletProps } from '../types'\n\n\ninterface AnalyticsPortletRef {\n refresh: () => void\n}\n\nconst AnalyticsPortlet = forwardRef<AnalyticsPortletRef, AnalyticsPortletProps>(({ \n query, \n chartType, \n chartConfig, \n displayConfig, \n height = 300, \n title: _title,\n onDebugDataReady\n}, ref) => {\n const [refreshCounter, setRefreshCounter] = useState(0)\n const onDebugDataReadyRef = useRef(onDebugDataReady)\n \n // Update ref when callback changes\n useEffect(() => {\n onDebugDataReadyRef.current = onDebugDataReady\n }, [onDebugDataReady])\n\n // Parse query from JSON string and include refresh counter to force re-query\n const queryObject = useMemo(() => {\n try {\n const parsed = JSON.parse(query)\n const result = {\n ...parsed,\n __refresh_counter: refreshCounter\n }\n return result\n } catch (e) {\n console.error('AnalyticsPortlet: Invalid query JSON:', e)\n return null\n }\n }, [query, refreshCounter])\n\n // Use the cube React hook\n const { resultSet, isLoading, error } = useCubeQuery(queryObject, {\n skip: !queryObject,\n resetResultSetOnChange: true\n })\n\n // Expose refresh function through ref\n useImperativeHandle(ref, () => ({\n refresh: () => {\n setRefreshCounter(prev => prev + 1)\n }\n }), [])\n\n // Send debug data to parent when ready (must be before any returns)\n useEffect(() => {\n if (onDebugDataReadyRef.current && chartConfig && queryObject && resultSet && !error) {\n const getData = () => {\n switch (chartType) {\n case 'pie':\n case 'table':\n return resultSet.tablePivot()\n default:\n return resultSet.rawData()\n }\n }\n const data = getData()\n \n if (data) {\n onDebugDataReadyRef.current({\n chartConfig: chartConfig || {},\n displayConfig: displayConfig || {},\n queryObject,\n data,\n chartType\n })\n }\n }\n }, [chartConfig, queryObject, resultSet, chartType, error]) // Use ref for callback to prevent infinite loops\n\n // Validate that chartConfig is provided\n if (!chartConfig) {\n return (\n <div className=\"flex items-center justify-center w-full text-red-500\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">Configuration Error</div>\n <div className=\"text-xs\">chartConfig is required but not provided</div>\n </div>\n </div>\n )\n }\n\n if (isLoading || (queryObject && !resultSet && !error)) {\n return (\n <div className=\"flex items-center justify-center w-full\" style={{ height }}>\n <div className=\"animate-spin rounded-full h-8 w-8 border-b-2 border-blue-500\"></div>\n </div>\n )\n }\n\n if (error) {\n return (\n <div className=\"p-4 border border-red-300 bg-red-50 rounded\" style={{ height }}>\n <div className=\"mb-2\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-red-600 font-medium text-sm\">⚠️ Query Error</span>\n <button\n onClick={() => setRefreshCounter(prev => prev + 1)}\n className=\"px-2 py-1 bg-blue-500 text-white rounded text-xs hover:bg-blue-600\"\n >\n Retry\n </button>\n </div>\n </div>\n \n <div className=\"mb-3\">\n <div className=\"text-xs text-red-700 bg-white p-2 rounded border\">\n {error.message || error.toString()}\n </div>\n </div>\n \n <div className=\"space-y-2 text-xs\">\n <details>\n <summary className=\"cursor-pointer text-gray-700 font-medium\">Original Query</summary>\n <pre className=\"mt-1 bg-blue-50 p-2 rounded text-xs overflow-auto max-h-20\">\n {query}\n </pre>\n </details>\n \n <details>\n <summary className=\"cursor-pointer text-gray-700 font-medium\">Chart Config</summary>\n <pre className=\"mt-1 bg-purple-50 p-2 rounded text-xs overflow-auto max-h-20\">\n {JSON.stringify({\n chartType,\n chartConfig,\n displayConfig\n }, null, 2)}\n </pre>\n </details>\n </div>\n </div>\n )\n }\n\n if (!resultSet || !queryObject) {\n return (\n <div className=\"flex items-center justify-center w-full text-gray-500\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">No data available</div>\n <div className=\"text-xs\">Invalid query or no results</div>\n </div>\n </div>\n )\n }\n\n // Get data based on chart type needs\n const getData = () => {\n switch (chartType) {\n case 'pie':\n case 'table':\n return resultSet.tablePivot()\n default:\n return resultSet.rawData()\n }\n }\n\n const data = getData()\n\n // Render appropriate chart component\n const renderChart = () => {\n try {\n // Pass height directly to charts - let ChartContainer handle it\n const chartHeight = height\n \n switch (chartType) {\n case 'bar':\n return (\n <RechartsBarChart\n data={data}\n chartConfig={chartConfig}\n displayConfig={displayConfig}\n queryObject={queryObject}\n height={chartHeight}\n />\n )\n case 'line':\n return (\n <RechartsLineChart\n data={data}\n chartConfig={chartConfig}\n displayConfig={displayConfig}\n queryObject={queryObject}\n height={chartHeight}\n />\n )\n case 'area':\n return (\n <RechartsAreaChart\n data={data}\n chartConfig={chartConfig}\n displayConfig={displayConfig}\n queryObject={queryObject}\n height={chartHeight}\n />\n )\n case 'pie':\n return (\n <RechartsPieChart\n data={data}\n chartConfig={chartConfig}\n displayConfig={displayConfig}\n queryObject={queryObject}\n height={chartHeight}\n />\n )\n case 'scatter':\n return (\n <RechartsScatterChart\n data={data}\n chartConfig={chartConfig}\n displayConfig={displayConfig}\n queryObject={queryObject}\n height={chartHeight}\n />\n )\n case 'radar':\n return (\n <RechartsRadarChart\n data={data}\n chartConfig={chartConfig}\n displayConfig={displayConfig}\n queryObject={queryObject}\n height={chartHeight}\n />\n )\n case 'radialBar':\n return (\n <RechartsRadialBarChart\n data={data}\n chartConfig={chartConfig}\n displayConfig={displayConfig}\n queryObject={queryObject}\n height={chartHeight}\n />\n )\n case 'treemap':\n return (\n <RechartsTreeMapChart\n data={data}\n chartConfig={chartConfig}\n displayConfig={displayConfig}\n queryObject={queryObject}\n height={chartHeight}\n />\n )\n case 'bubble':\n return (\n <BubbleChart\n data={data}\n chartConfig={chartConfig}\n displayConfig={displayConfig}\n queryObject={queryObject}\n height={chartHeight}\n />\n )\n case 'table':\n return (\n <DataTable\n data={data}\n chartConfig={chartConfig}\n displayConfig={displayConfig}\n queryObject={queryObject}\n height={chartHeight}\n />\n )\n case 'activityGrid':\n return (\n <ActivityGridChart\n data={data}\n chartConfig={chartConfig}\n displayConfig={displayConfig}\n queryObject={queryObject}\n height={chartHeight}\n />\n )\n default:\n return (\n <div className=\"flex items-center justify-center w-full\" style={{ height }}>\n <div className=\"text-center text-gray-500\">\n <div className=\"text-sm font-semibold mb-1\">Unsupported chart type</div>\n <div className=\"text-xs\">{chartType}</div>\n </div>\n </div>\n )\n }\n } catch (error) {\n console.error('Chart rendering error:', error)\n return (\n <div className=\"flex items-center justify-center w-full text-red-500 p-4\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">Error rendering chart</div>\n <div className=\"text-xs\">{error instanceof Error ? error.message : 'Unknown error'}</div>\n </div>\n </div>\n )\n }\n }\n\n return (\n <ChartErrorBoundary \n portletTitle={_title}\n portletConfig={{\n chartType,\n chartConfig,\n displayConfig,\n height\n }}\n cubeQuery={query}\n >\n <div className=\"w-full h-full flex flex-col flex-1\" style={{ minHeight: '200px' }}>\n {renderChart()}\n </div>\n </ChartErrorBoundary>\n )\n})\n\nAnalyticsPortlet.displayName = 'AnalyticsPortlet'\n\nexport default AnalyticsPortlet","import React, { useEffect, useCallback } from 'react'\n\nexport interface ModalProps {\n isOpen: boolean\n onClose: () => void\n title?: string\n size?: 'sm' | 'md' | 'lg' | 'xl' | 'full' | 'fullscreen' | 'fullscreen-mobile'\n closeOnBackdropClick?: boolean\n closeOnEscape?: boolean\n showCloseButton?: boolean\n className?: string\n children: React.ReactNode\n footer?: React.ReactNode\n noPadding?: boolean\n}\n\nconst Modal: React.FC<ModalProps> = ({\n isOpen,\n onClose,\n title,\n size = 'md',\n closeOnBackdropClick = true,\n closeOnEscape = true,\n showCloseButton = true,\n children,\n footer,\n noPadding = false\n}) => {\n // Handle ESC key press\n const handleEscapeKey = useCallback((event: KeyboardEvent) => {\n if (event.key === 'Escape' && closeOnEscape) {\n onClose()\n }\n }, [closeOnEscape, onClose])\n\n\n // Manage ESC key listener and body scroll\n useEffect(() => {\n if (isOpen) {\n // Add ESC key listener\n if (closeOnEscape) {\n document.addEventListener('keydown', handleEscapeKey)\n }\n\n // Prevent body scroll when modal is open\n document.body.style.overflow = 'hidden'\n } else {\n // Restore body scroll\n document.body.style.overflow = 'unset'\n }\n\n // Cleanup\n return () => {\n document.removeEventListener('keydown', handleEscapeKey)\n document.body.style.overflow = 'unset'\n }\n }, [isOpen, closeOnEscape, handleEscapeKey])\n\n\n if (!isOpen) return null\n\n const getSizeClasses = () => {\n switch (size) {\n case 'sm':\n return 'max-w-md'\n case 'md':\n return 'max-w-lg'\n case 'lg':\n return 'max-w-2xl'\n case 'xl':\n return 'max-w-6xl'\n case 'full':\n return 'max-w-7xl'\n case 'fullscreen':\n return 'w-[90vw] h-[90vh] max-w-none'\n case 'fullscreen-mobile':\n return 'w-full h-full md:w-[90vw] md:h-[90vh] max-w-none'\n default:\n return 'max-w-lg'\n }\n }\n\n return (\n <div \n className={`fixed inset-0 z-[9999] backdrop-blur-md ${size === 'fullscreen-mobile' ? 'flex md:flex md:items-center md:justify-center' : 'flex items-center justify-center'}`}\n style={{ backgroundColor: 'rgba(0, 0, 0, 0.75)' }}\n onClick={closeOnBackdropClick ? onClose : undefined}\n >\n <div \n className={`relative bg-white border border-gray-300 ${size === 'fullscreen-mobile' ? 'rounded-none md:rounded-lg' : 'rounded-lg'} shadow-2xl ${size === 'fullscreen' || size === 'fullscreen-mobile' ? '' : 'mx-4'} ${getSizeClasses()} ${size === 'fullscreen' || size === 'fullscreen-mobile' ? '' : 'max-h-[90vh]'} flex flex-col`}\n onClick={(e) => e.stopPropagation()}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={title ? 'modal-title' : undefined}\n >\n {/* Header */}\n {(title || showCloseButton) && (\n <div className=\"flex items-center justify-between px-6 py-4 border-b border-gray-200\">\n {title && (\n <h2 id=\"modal-title\" className=\"text-xl font-semibold text-gray-900\">\n {title}\n </h2>\n )}\n {showCloseButton && (\n <button\n type=\"button\"\n onClick={onClose}\n className=\"text-gray-400 hover:text-gray-600 transition-colors p-2 -mr-2\"\n aria-label=\"Close modal\"\n >\n <svg width=\"24\" height=\"24\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n )}\n </div>\n )}\n\n {/* Content */}\n <div className={`flex-1 overflow-y-auto ${noPadding ? '' : 'px-6 py-4'}`}>\n {children}\n </div>\n\n {/* Footer */}\n {footer && (\n <div className=\"flex items-center justify-end space-x-3 px-6 py-4 border-t border-gray-200 bg-gray-50\">\n {footer}\n </div>\n )}\n </div>\n </div>\n )\n}\n\nexport default Modal","/**\n * CubeMetaExplorer Component\n * \n * Displays the cube schema in a collapsible tree view.\n * Users can click on dimensions, measures, and time dimensions to add them to their query.\n */\n\nimport React, { useState } from 'react'\nimport { ChevronDownIcon, ChevronRightIcon, ExclamationTriangleIcon, ArrowPathIcon, CogIcon } from '@heroicons/react/24/outline'\nimport { ChartBarIcon, TagIcon, CalendarIcon } from '@heroicons/react/24/solid'\nimport type { CubeMetaExplorerProps, MetaCube, MetaField } from './types'\n\nconst CubeMetaExplorer: React.FC<CubeMetaExplorerProps> = ({\n schema,\n schemaStatus,\n schemaError,\n selectedFields,\n onFieldSelect,\n onFieldDeselect,\n onRetrySchema,\n onOpenSettings\n}) => {\n const [expandedCubes, setExpandedCubes] = useState<Set<string>>(new Set())\n const [expandedSections, setExpandedSections] = useState<Set<string>>(new Set())\n const [searchTerm, setSearchTerm] = useState('')\n \n // Track the original expansion state before search\n const [preSearchExpandedCubes, setPreSearchExpandedCubes] = useState<Set<string> | null>(null)\n const [preSearchExpandedSections, setPreSearchExpandedSections] = useState<Set<string> | null>(null)\n\n // Auto-expand cubes and sections that contain search matches\n React.useEffect(() => {\n if (!schema) {\n return\n }\n\n const hasSearchTerm = searchTerm.trim().length > 0\n\n if (hasSearchTerm) {\n // Save current state before expanding for search (only if not already saved)\n if (preSearchExpandedCubes === null) {\n setPreSearchExpandedCubes(new Set(expandedCubes))\n setPreSearchExpandedSections(new Set(expandedSections))\n }\n\n const newExpandedCubes = new Set<string>()\n const newExpandedSections = new Set<string>()\n\n schema.cubes.forEach((cube: MetaCube) => {\n let cubeHasMatches = false\n\n // Check measures\n const matchingMeasures = cube.measures.filter(field => \n field.name.toLowerCase().includes(searchTerm.toLowerCase()) ||\n field.title.toLowerCase().includes(searchTerm.toLowerCase())\n )\n if (matchingMeasures.length > 0) {\n cubeHasMatches = true\n newExpandedSections.add(`${cube.name}-measures`)\n }\n\n // Check regular dimensions\n const regularDimensions = cube.dimensions.filter(d => d.type !== 'time')\n const matchingDimensions = regularDimensions.filter(field => \n field.name.toLowerCase().includes(searchTerm.toLowerCase()) ||\n field.title.toLowerCase().includes(searchTerm.toLowerCase())\n )\n if (matchingDimensions.length > 0) {\n cubeHasMatches = true\n newExpandedSections.add(`${cube.name}-dimensions`)\n }\n\n // Check time dimensions\n const timeDimensions = cube.dimensions.filter(d => d.type === 'time')\n const matchingTimeDimensions = timeDimensions.filter(field => \n field.name.toLowerCase().includes(searchTerm.toLowerCase()) ||\n field.title.toLowerCase().includes(searchTerm.toLowerCase())\n )\n if (matchingTimeDimensions.length > 0) {\n cubeHasMatches = true\n newExpandedSections.add(`${cube.name}-timeDimensions`)\n }\n\n // If cube has any matches, expand it\n if (cubeHasMatches) {\n newExpandedCubes.add(cube.name)\n }\n })\n\n // Combine pre-search state with search expansions\n const combinedCubes = new Set([...(preSearchExpandedCubes || []), ...newExpandedCubes])\n const combinedSections = new Set([...(preSearchExpandedSections || []), ...newExpandedSections])\n \n setExpandedCubes(combinedCubes)\n setExpandedSections(combinedSections)\n } else {\n // No search term - restore original state if we have it saved\n if (preSearchExpandedCubes !== null && preSearchExpandedSections !== null) {\n setExpandedCubes(preSearchExpandedCubes)\n setExpandedSections(preSearchExpandedSections)\n setPreSearchExpandedCubes(null)\n setPreSearchExpandedSections(null)\n }\n }\n }, [schema, searchTerm, preSearchExpandedCubes, preSearchExpandedSections])\n\n // Loading state\n if (schemaStatus === 'loading') {\n return (\n <div className=\"h-full flex items-center justify-center text-gray-500\">\n <div className=\"text-center\">\n <div className=\"animate-spin rounded-full h-8 w-8 border-b-2 border-blue-600 mx-auto mb-3\"></div>\n <div className=\"text-sm font-semibold mb-1\">Loading Schema...</div>\n <div className=\"text-xs\">Fetching cube metadata</div>\n </div>\n </div>\n )\n }\n\n // Error state\n if (schemaStatus === 'error') {\n const isCorsError = schemaError?.toLowerCase().includes('cors') || \n schemaError?.toLowerCase().includes('fetch')\n \n return (\n <div className=\"h-full flex items-center justify-center\">\n <div className=\"text-center max-w-sm p-6\">\n <ExclamationTriangleIcon className=\"w-12 h-12 mx-auto text-red-500 mb-4\" />\n <div className=\"text-sm font-semibold text-gray-900 mb-2\">\n Failed to Load Schema\n </div>\n <div className=\"text-xs text-gray-600 mb-4\">\n {isCorsError ? (\n <>\n CORS error detected. The API endpoint may be incorrect or not accessible.\n </>\n ) : (\n <>\n {schemaError || 'Unable to connect to the Cube.js API'}\n </>\n )}\n </div>\n \n <div className=\"space-y-2\">\n {onRetrySchema && (\n <button\n onClick={onRetrySchema}\n className=\"w-full flex items-center justify-center space-x-2 px-3 py-2 text-sm font-medium text-blue-700 bg-blue-100 border border-blue-200 rounded-md hover:bg-blue-200 focus:outline-none focus:ring-2 focus:ring-blue-500\"\n >\n <ArrowPathIcon className=\"w-4 h-4\" />\n <span>Retry</span>\n </button>\n )}\n \n {onOpenSettings && (\n <button\n onClick={onOpenSettings}\n className=\"w-full flex items-center justify-center space-x-2 px-3 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-md hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-blue-500\"\n >\n <CogIcon className=\"w-4 h-4\" />\n <span>Check API Settings</span>\n </button>\n )}\n </div>\n \n {isCorsError && (\n <div className=\"mt-4 p-3 bg-amber-50 border border-amber-200 rounded-md\">\n <div className=\"text-xs text-amber-800\">\n <div className=\"font-medium mb-1\">Common solutions:</div>\n <ul className=\"list-disc list-inside space-y-1\">\n <li>Verify the Base API URL is correct</li>\n <li>Ensure the server supports CORS</li>\n <li>Check if authentication is required</li>\n </ul>\n </div>\n </div>\n )}\n </div>\n </div>\n )\n }\n\n // No schema loaded yet\n if (!schema) {\n return (\n <div className=\"h-full flex items-center justify-center text-gray-500\">\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">No Schema</div>\n <div className=\"text-xs\">Schema not loaded</div>\n </div>\n </div>\n )\n }\n\n const toggleCubeExpansion = (cubeName: string) => {\n const newExpanded = new Set(expandedCubes)\n if (newExpanded.has(cubeName)) {\n newExpanded.delete(cubeName)\n } else {\n newExpanded.add(cubeName)\n }\n setExpandedCubes(newExpanded)\n \n // If we're in search mode, also update the pre-search state\n if (preSearchExpandedCubes !== null) {\n const newPreSearchExpanded = new Set(preSearchExpandedCubes)\n if (newPreSearchExpanded.has(cubeName)) {\n newPreSearchExpanded.delete(cubeName)\n } else {\n newPreSearchExpanded.add(cubeName)\n }\n setPreSearchExpandedCubes(newPreSearchExpanded)\n }\n }\n\n const toggleSectionExpansion = (sectionKey: string) => {\n const newExpanded = new Set(expandedSections)\n if (newExpanded.has(sectionKey)) {\n newExpanded.delete(sectionKey)\n } else {\n newExpanded.add(sectionKey)\n }\n setExpandedSections(newExpanded)\n \n // If we're in search mode, also update the pre-search state\n if (preSearchExpandedSections !== null) {\n const newPreSearchExpanded = new Set(preSearchExpandedSections)\n if (newPreSearchExpanded.has(sectionKey)) {\n newPreSearchExpanded.delete(sectionKey)\n } else {\n newPreSearchExpanded.add(sectionKey)\n }\n setPreSearchExpandedSections(newPreSearchExpanded)\n }\n }\n\n const handleFieldClick = (field: MetaField, fieldType: 'measures' | 'dimensions' | 'timeDimensions') => {\n const isSelected = (() => {\n switch (fieldType) {\n case 'measures':\n return selectedFields.measures.includes(field.name)\n case 'dimensions':\n return selectedFields.dimensions.includes(field.name)\n case 'timeDimensions':\n return selectedFields.timeDimensions.includes(field.name)\n default:\n return false\n }\n })()\n\n if (isSelected) {\n onFieldDeselect(field.name, fieldType)\n } else {\n onFieldSelect(field.name, fieldType)\n }\n }\n\n const filterFields = (fields: MetaField[]): MetaField[] => {\n if (!searchTerm) return fields\n return fields.filter(field => \n field.name.toLowerCase().includes(searchTerm.toLowerCase()) ||\n field.title.toLowerCase().includes(searchTerm.toLowerCase())\n )\n }\n\n const cubeHasMatches = (cube: MetaCube): boolean => {\n if (!searchTerm.trim()) return true\n \n const measureMatches = cube.measures.some(field => \n field.name.toLowerCase().includes(searchTerm.toLowerCase()) ||\n field.title.toLowerCase().includes(searchTerm.toLowerCase())\n )\n \n const dimensionMatches = cube.dimensions.some(field => \n field.name.toLowerCase().includes(searchTerm.toLowerCase()) ||\n field.title.toLowerCase().includes(searchTerm.toLowerCase())\n )\n \n return measureMatches || dimensionMatches\n }\n\n const FieldItem: React.FC<{ \n field: MetaField\n fieldType: 'measures' | 'dimensions' | 'timeDimensions'\n icon: React.ReactNode\n }> = ({ field, fieldType, icon }) => {\n const isSelected = (() => {\n switch (fieldType) {\n case 'measures':\n return selectedFields.measures.includes(field.name)\n case 'dimensions':\n return selectedFields.dimensions.includes(field.name)\n case 'timeDimensions':\n return selectedFields.timeDimensions.includes(field.name)\n default:\n return false\n }\n })()\n\n const getSelectedStyles = () => {\n if (!isSelected) return 'hover:bg-gray-100 text-gray-700'\n \n switch (fieldType) {\n case 'measures':\n return 'bg-amber-100 text-amber-800 border border-amber-200'\n case 'dimensions':\n return 'bg-green-100 text-green-800 border border-green-200'\n case 'timeDimensions':\n return 'bg-blue-100 text-blue-800 border border-blue-200'\n default:\n return 'bg-blue-100 text-blue-800 border border-blue-200'\n }\n }\n\n const getIconColor = () => {\n if (!isSelected) return 'text-gray-400'\n \n switch (fieldType) {\n case 'measures':\n return 'text-amber-600'\n case 'dimensions':\n return 'text-green-600'\n case 'timeDimensions':\n return 'text-blue-600'\n default:\n return 'text-blue-600'\n }\n }\n\n const getCheckmarkColor = () => {\n switch (fieldType) {\n case 'measures':\n return 'text-amber-600'\n case 'dimensions':\n return 'text-green-600'\n case 'timeDimensions':\n return 'text-blue-600'\n default:\n return 'text-blue-600'\n }\n }\n\n return (\n <div\n className={`flex items-center px-2 py-1.5 text-xs cursor-pointer rounded-md transition-colors ${getSelectedStyles()}`}\n onClick={() => handleFieldClick(field, fieldType)}\n title={field.description || field.title}\n >\n <div className={`mr-1.5 ${getIconColor()}`}>\n {React.cloneElement(icon as React.ReactElement, { className: 'w-3 h-3' })}\n </div>\n <div className=\"flex-1 min-w-0\">\n <div className=\"font-medium truncate text-xs\">{field.shortTitle}</div>\n <div className=\"text-xs text-gray-500 truncate\">{field.name}</div>\n </div>\n {isSelected && (\n <div className={`ml-1.5 ${getCheckmarkColor()}`}>\n <svg className=\"w-3 h-3\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fillRule=\"evenodd\" d=\"M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z\" clipRule=\"evenodd\" />\n </svg>\n </div>\n )}\n </div>\n )\n }\n\n const SectionHeader: React.FC<{\n title: string\n count: number\n sectionKey: string\n icon: React.ReactNode\n }> = ({ title, count, sectionKey, icon }) => {\n const isExpanded = expandedSections.has(sectionKey)\n \n // Get section type from sectionKey to apply consistent colors\n const getSectionType = (): 'dimensions' | 'timeDimensions' | 'measures' => {\n if (sectionKey.includes('-dimensions') && !sectionKey.includes('-timeDimensions')) {\n return 'dimensions'\n } else if (sectionKey.includes('-timeDimensions')) {\n return 'timeDimensions'\n } else {\n return 'measures'\n }\n }\n \n const getSectionColorClasses = () => {\n const sectionType = getSectionType()\n switch (sectionType) {\n case 'dimensions':\n return 'text-green-800'\n case 'timeDimensions':\n return 'text-blue-800'\n case 'measures':\n return 'text-amber-800'\n default:\n return 'text-gray-700'\n }\n }\n \n return (\n <div\n className={`flex items-center px-2 py-1 text-sm font-semibold cursor-pointer hover:bg-gray-50 rounded-md ${getSectionColorClasses()}`}\n onClick={() => toggleSectionExpansion(sectionKey)}\n >\n <div className=\"mr-1.5\">\n {isExpanded ? (\n <ChevronDownIcon className=\"w-3 h-3\" />\n ) : (\n <ChevronRightIcon className=\"w-3 h-3\" />\n )}\n </div>\n <div className=\"mr-1.5\">\n {icon}\n </div>\n <span className=\"flex-1\">{title}</span>\n <span className=\"text-xs text-gray-500 bg-gray-200 px-1.5 py-0.5 rounded-full\">\n {count}\n </span>\n </div>\n )\n }\n\n const NoMatchesMessage: React.FC = () => (\n <div className=\"flex items-center justify-center py-8 text-center\">\n <div className=\"max-w-sm\">\n <div className=\"text-gray-400 mb-2\">\n <svg className=\"w-12 h-12 mx-auto\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.5} d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\" />\n </svg>\n </div>\n <div className=\"text-sm font-medium text-gray-900 mb-1\">No matches found</div>\n <div className=\"text-xs text-gray-500 mb-3\">\n No fields match your search term \"{searchTerm}\"\n </div>\n <button\n onClick={() => setSearchTerm('')}\n className=\"inline-flex items-center px-3 py-1.5 text-xs font-medium text-blue-700 bg-blue-100 border border-blue-200 rounded-md hover:bg-blue-200 focus:outline-none focus:ring-2 focus:ring-blue-500\"\n >\n Clear search\n </button>\n </div>\n </div>\n )\n\n return (\n <div className=\"flex-1 flex flex-col bg-white border border-gray-200 rounded-lg min-h-0\">\n {/* Header */}\n <div className=\"p-3 border-b border-gray-200\">\n <h3 className=\"text-base font-semibold text-gray-900 mb-2\">Schema Explorer</h3>\n \n {/* Search */}\n <div className=\"relative\">\n <input\n type=\"text\"\n placeholder=\"Search fields...\"\n value={searchTerm}\n onChange={(e) => setSearchTerm(e.target.value)}\n className=\"w-full px-2 py-1.5 border border-gray-300 rounded-md text-sm focus:ring-2 focus:ring-blue-500 focus:border-blue-500\"\n />\n <div className=\"absolute inset-y-0 right-0 pr-3 flex items-center pointer-events-none\">\n <svg className=\"h-4 w-4 text-gray-400\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\" />\n </svg>\n </div>\n </div>\n </div>\n\n {/* Cubes */}\n <div className=\"flex-1 p-3 space-y-2 min-h-0 overflow-y-auto\">\n {(() => {\n // Filter cubes to only show those with matches (when searching)\n const filteredCubes = schema.cubes.filter(cubeHasMatches)\n \n // Show \"No matches\" message if searching but no cubes have matches\n if (searchTerm.trim() && filteredCubes.length === 0) {\n return <NoMatchesMessage />\n }\n \n return filteredCubes.map((cube: MetaCube) => {\n const isExpanded = expandedCubes.has(cube.name)\n const timeDimensions = cube.dimensions.filter(d => d.type === 'time')\n const regularDimensions = cube.dimensions.filter(d => d.type !== 'time')\n\n return (\n <div key={cube.name} className=\"border border-gray-200 rounded-lg\">\n {/* Cube Header */}\n <div\n className=\"flex items-center px-3 py-2 cursor-pointer hover:bg-gray-50 rounded-t-lg\"\n onClick={() => toggleCubeExpansion(cube.name)}\n >\n <div className=\"mr-2\">\n {isExpanded ? (\n <ChevronDownIcon className=\"w-4 h-4 text-gray-600\" />\n ) : (\n <ChevronRightIcon className=\"w-4 h-4 text-gray-600\" />\n )}\n </div>\n <div className=\"flex-1\">\n <div className=\"font-medium text-sm text-gray-900\">{cube.title}</div>\n <div className=\"text-xs text-gray-500\">{cube.description}</div>\n </div>\n </div>\n\n {/* Cube Content */}\n {isExpanded && (\n <div className=\"border-t border-gray-200 p-2 space-y-1\">\n {/* Dimensions - First (matching QueryPanel order) */}\n {regularDimensions.length > 0 && filterFields(regularDimensions).length > 0 && (\n <div>\n <SectionHeader\n title=\"Dimensions\"\n count={filterFields(regularDimensions).length}\n sectionKey={`${cube.name}-dimensions`}\n icon={<TagIcon className=\"w-4 h-4 text-green-600\" />}\n />\n {expandedSections.has(`${cube.name}-dimensions`) && (\n <div className=\"ml-5 space-y-1 mt-1\">\n {filterFields(regularDimensions).map(dimension => (\n <FieldItem\n key={dimension.name}\n field={dimension}\n fieldType=\"dimensions\"\n icon={<TagIcon className=\"w-4 h-4\" />}\n />\n ))}\n </div>\n )}\n </div>\n )}\n\n {/* Time Dimensions - Second (matching QueryPanel order) */}\n {timeDimensions.length > 0 && filterFields(timeDimensions).length > 0 && (\n <div>\n <SectionHeader\n title=\"Time Dimensions\"\n count={filterFields(timeDimensions).length}\n sectionKey={`${cube.name}-timeDimensions`}\n icon={<CalendarIcon className=\"w-4 h-4 text-blue-600\" />}\n />\n {expandedSections.has(`${cube.name}-timeDimensions`) && (\n <div className=\"ml-5 space-y-1 mt-1\">\n {filterFields(timeDimensions).map(timeDimension => (\n <FieldItem\n key={timeDimension.name}\n field={timeDimension}\n fieldType=\"timeDimensions\"\n icon={<CalendarIcon className=\"w-4 h-4\" />}\n />\n ))}\n </div>\n )}\n </div>\n )}\n\n {/* Measures - Third (matching QueryPanel order) */}\n {cube.measures.length > 0 && filterFields(cube.measures).length > 0 && (\n <div>\n <SectionHeader\n title=\"Measures\"\n count={filterFields(cube.measures).length}\n sectionKey={`${cube.name}-measures`}\n icon={<ChartBarIcon className=\"w-4 h-4 text-amber-600\" />}\n />\n {expandedSections.has(`${cube.name}-measures`) && (\n <div className=\"ml-5 space-y-1 mt-1\">\n {filterFields(cube.measures).map(measure => (\n <FieldItem\n key={measure.name}\n field={measure}\n fieldType=\"measures\"\n icon={<ChartBarIcon className=\"w-4 h-4\" />}\n />\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n )}\n </div>\n )\n })\n })()}\n </div>\n </div>\n )\n}\n\nexport default CubeMetaExplorer","/**\n * Type definitions for QueryBuilder components\n */\n\nimport type { CubeQuery, FilterOperator, Filter, SimpleFilter, GroupFilter } from '../../types'\n\n// Meta endpoint response types\nexport interface MetaField {\n name: string // e.g., \"Employees.count\"\n title: string // e.g., \"Total Employees\"\n shortTitle: string // e.g., \"Total Employees\"\n type: string // e.g., \"count\", \"string\", \"time\", \"number\"\n description?: string // Optional description\n}\n\nexport interface MetaCube {\n name: string // e.g., \"Employees\"\n title: string // e.g., \"Employee Analytics\"\n description: string // e.g., \"Employee data and metrics\"\n measures: MetaField[] // e.g., \"Employees.count\"\n dimensions: MetaField[] // e.g., \"Employees.name\"\n segments: MetaField[] // Currently empty in examples\n}\n\nexport interface MetaResponse {\n cubes: MetaCube[]\n}\n\n// Query builder state types\nexport type ValidationStatus = 'idle' | 'validating' | 'valid' | 'invalid'\nexport type ExecutionStatus = 'idle' | 'loading' | 'success' | 'error'\nexport type SchemaStatus = 'idle' | 'loading' | 'success' | 'error'\n\nexport interface QueryBuilderState {\n query: CubeQuery // Current query being built\n schema: MetaResponse | null // Schema from /meta endpoint\n schemaStatus: SchemaStatus // Status of schema loading\n schemaError: string | null // Error from schema loading\n validationStatus: ValidationStatus\n validationError: string | null\n validationSql: { sql: string[], params: any[] } | null // Generated SQL from validation\n executionStatus: ExecutionStatus\n executionResults: any[] | null\n executionError: string | null\n totalRowCount: number | null // Total rows without limit\n totalRowCountStatus: 'idle' | 'loading' | 'success' | 'error'\n}\n\n// Validation response from /dry-run endpoint\nexport interface ValidationResult {\n valid?: boolean // Our custom property (may not be present in official Cube.js)\n error?: string\n query?: CubeQuery\n sql?: {\n sql: string[]\n params: any[]\n }\n queryType?: string // Always present in successful Cube.js responses\n normalizedQueries?: any[]\n queryOrder?: string[]\n transformedQueries?: any[]\n pivotQuery?: any\n complexity?: string\n cubesUsed?: string[]\n joinType?: string\n // Additional validation metadata can be added here\n}\n\n// API Configuration\nexport interface ApiConfig {\n baseApiUrl: string // Base URL for Cube API (default: '/cubejs-api/v1')\n apiToken: string // API token for authentication (default: empty)\n}\n\n// Component props\nexport interface QueryBuilderProps {\n className?: string // Optional CSS classes\n initialQuery?: CubeQuery // Initial query to load (overrides localStorage)\n disableLocalStorage?: boolean // Disable localStorage persistence\n hideSettings?: boolean // Hide the settings/configuration button\n}\n\nexport interface QueryBuilderRef {\n getCurrentQuery: () => CubeQuery\n getValidationState: () => { status: ValidationStatus, result?: ValidationResult }\n getValidationResult: () => ValidationResult | null\n}\n\nexport interface CubeMetaExplorerProps {\n schema: MetaResponse | null\n schemaStatus: SchemaStatus\n schemaError: string | null\n selectedFields: {\n measures: string[]\n dimensions: string[]\n timeDimensions: string[]\n }\n onFieldSelect: (fieldName: string, fieldType: 'measures' | 'dimensions' | 'timeDimensions') => void\n onFieldDeselect: (fieldName: string, fieldType: 'measures' | 'dimensions' | 'timeDimensions') => void\n onRetrySchema?: () => void\n onOpenSettings?: () => void\n}\n\nexport interface QueryPanelProps {\n query: CubeQuery\n schema: MetaResponse | null\n validationStatus: ValidationStatus\n validationError: string | null\n validationSql: { sql: string[], params: any[] } | null\n onValidate: () => void\n onExecute: () => void\n onRemoveField: (fieldName: string, fieldType: 'measures' | 'dimensions' | 'timeDimensions') => void\n onTimeDimensionGranularityChange: (dimensionName: string, granularity: string) => void\n onFiltersChange: (filters: Filter[]) => void\n onDateRangeChange: (timeDimension: string, dateRange: string | string[]) => void\n onDateRangeRemove: (timeDimension: string) => void\n onOrderChange: (fieldName: string, direction: 'asc' | 'desc' | null) => void\n onClearQuery?: () => void\n showSettings?: boolean // Show the settings/configuration button\n onSettingsClick?: () => void // Handler for settings button click\n onAIAssistantClick?: () => void // Handler for AI Assistant button click\n}\n\nexport interface ResultsPanelProps {\n executionStatus: ExecutionStatus\n executionResults: any[] | null\n executionError: string | null\n query: CubeQuery\n displayLimit?: number\n onDisplayLimitChange?: (limit: number) => void\n totalRowCount?: number | null\n totalRowCountStatus?: 'idle' | 'loading' | 'success' | 'error'\n}\n\n// Time dimension granularity options\nexport const TIME_GRANULARITIES = [\n { value: 'day', label: 'Day' },\n { value: 'week', label: 'Week' },\n { value: 'month', label: 'Month' },\n { value: 'quarter', label: 'Quarter' },\n { value: 'year', label: 'Year' }\n] as const\n\nexport type TimeGranularity = typeof TIME_GRANULARITIES[number]['value']\n\n// Filter operator metadata\nexport interface FilterOperatorMeta {\n label: string\n description: string\n requiresValues: boolean\n supportsMultipleValues: boolean\n valueType: 'string' | 'number' | 'date' | 'boolean' | 'any'\n fieldTypes: string[] // Which field types support this operator\n}\n\nexport const FILTER_OPERATORS: Record<FilterOperator, FilterOperatorMeta> = {\n // String operators\n equals: {\n label: 'equals',\n description: 'Exact match',\n requiresValues: true,\n supportsMultipleValues: true,\n valueType: 'any',\n fieldTypes: ['string', 'number', 'boolean', 'time']\n },\n notEquals: {\n label: 'not equals',\n description: 'Does not match',\n requiresValues: true,\n supportsMultipleValues: true,\n valueType: 'any',\n fieldTypes: ['string', 'number', 'boolean', 'time']\n },\n contains: {\n label: 'contains',\n description: 'Contains text (case insensitive)',\n requiresValues: true,\n supportsMultipleValues: false,\n valueType: 'string',\n fieldTypes: ['string']\n },\n notContains: {\n label: 'not contains',\n description: 'Does not contain text',\n requiresValues: true,\n supportsMultipleValues: false,\n valueType: 'string',\n fieldTypes: ['string']\n },\n startsWith: {\n label: 'starts with',\n description: 'Starts with text',\n requiresValues: true,\n supportsMultipleValues: false,\n valueType: 'string',\n fieldTypes: ['string']\n },\n notStartsWith: {\n label: 'not starts with',\n description: 'Does not start with text',\n requiresValues: true,\n supportsMultipleValues: false,\n valueType: 'string',\n fieldTypes: ['string']\n },\n endsWith: {\n label: 'ends with',\n description: 'Ends with text',\n requiresValues: true,\n supportsMultipleValues: false,\n valueType: 'string',\n fieldTypes: ['string']\n },\n notEndsWith: {\n label: 'not ends with',\n description: 'Does not end with text',\n requiresValues: true,\n supportsMultipleValues: false,\n valueType: 'string',\n fieldTypes: ['string']\n },\n like: {\n label: 'like',\n description: 'SQL LIKE pattern matching (case sensitive)',\n requiresValues: true,\n supportsMultipleValues: false,\n valueType: 'string',\n fieldTypes: ['string']\n },\n notLike: {\n label: 'not like',\n description: 'SQL NOT LIKE pattern matching (case sensitive)',\n requiresValues: true,\n supportsMultipleValues: false,\n valueType: 'string',\n fieldTypes: ['string']\n },\n ilike: {\n label: 'ilike',\n description: 'SQL ILIKE pattern matching (case insensitive)',\n requiresValues: true,\n supportsMultipleValues: false,\n valueType: 'string',\n fieldTypes: ['string']\n },\n // Numeric operators\n gt: {\n label: 'greater than',\n description: 'Greater than value',\n requiresValues: true,\n supportsMultipleValues: false,\n valueType: 'number',\n fieldTypes: ['number', 'count', 'sum', 'avg', 'min', 'max']\n },\n gte: {\n label: 'greater than or equal',\n description: 'Greater than or equal to value',\n requiresValues: true,\n supportsMultipleValues: false,\n valueType: 'number',\n fieldTypes: ['number', 'count', 'sum', 'avg', 'min', 'max']\n },\n lt: {\n label: 'less than',\n description: 'Less than value',\n requiresValues: true,\n supportsMultipleValues: false,\n valueType: 'number',\n fieldTypes: ['number', 'count', 'sum', 'avg', 'min', 'max']\n },\n lte: {\n label: 'less than or equal',\n description: 'Less than or equal to value',\n requiresValues: true,\n supportsMultipleValues: false,\n valueType: 'number',\n fieldTypes: ['number', 'count', 'sum', 'avg', 'min', 'max']\n },\n between: {\n label: 'between',\n description: 'Between two values (inclusive)',\n requiresValues: true,\n supportsMultipleValues: false,\n valueType: 'number',\n fieldTypes: ['number', 'count', 'sum', 'avg', 'min', 'max', 'time']\n },\n notBetween: {\n label: 'not between',\n description: 'Not between two values',\n requiresValues: true,\n supportsMultipleValues: false,\n valueType: 'number',\n fieldTypes: ['number', 'count', 'sum', 'avg', 'min', 'max', 'time']\n },\n // Array operators\n in: {\n label: 'in',\n description: 'Matches any of the provided values',\n requiresValues: true,\n supportsMultipleValues: true,\n valueType: 'any',\n fieldTypes: ['string', 'number', 'boolean']\n },\n notIn: {\n label: 'not in',\n description: 'Does not match any of the provided values',\n requiresValues: true,\n supportsMultipleValues: true,\n valueType: 'any',\n fieldTypes: ['string', 'number', 'boolean']\n },\n // Null/Empty operators\n set: {\n label: 'is set',\n description: 'Is not null/empty',\n requiresValues: false,\n supportsMultipleValues: false,\n valueType: 'any',\n fieldTypes: ['string', 'number', 'time', 'boolean']\n },\n notSet: {\n label: 'is not set',\n description: 'Is null/empty',\n requiresValues: false,\n supportsMultipleValues: false,\n valueType: 'any',\n fieldTypes: ['string', 'number', 'time', 'boolean']\n },\n isEmpty: {\n label: 'is empty',\n description: 'Is empty string or null',\n requiresValues: false,\n supportsMultipleValues: false,\n valueType: 'string',\n fieldTypes: ['string']\n },\n isNotEmpty: {\n label: 'is not empty',\n description: 'Is not empty string and not null',\n requiresValues: false,\n supportsMultipleValues: false,\n valueType: 'string',\n fieldTypes: ['string']\n },\n // Date operators\n inDateRange: {\n label: 'in date range',\n description: 'Between two dates',\n requiresValues: true,\n supportsMultipleValues: false,\n valueType: 'date',\n fieldTypes: ['time']\n },\n beforeDate: {\n label: 'before date',\n description: 'Before specified date',\n requiresValues: true,\n supportsMultipleValues: false,\n valueType: 'date',\n fieldTypes: ['time']\n },\n afterDate: {\n label: 'after date',\n description: 'After specified date',\n requiresValues: true,\n supportsMultipleValues: false,\n valueType: 'date',\n fieldTypes: ['time']\n },\n // Regex operators\n regex: {\n label: 'matches regex',\n description: 'Matches regular expression pattern',\n requiresValues: true,\n supportsMultipleValues: false,\n valueType: 'string',\n fieldTypes: ['string']\n },\n notRegex: {\n label: 'not matches regex',\n description: 'Does not match regular expression pattern',\n requiresValues: true,\n supportsMultipleValues: false,\n valueType: 'string',\n fieldTypes: ['string']\n }\n}\n\n// Filter builder component props\nexport interface FilterBuilderProps {\n filters: Filter[]\n schema: MetaResponse | null\n query: CubeQuery\n onFiltersChange: (filters: Filter[]) => void\n}\n\nexport interface FilterItemProps {\n filter: SimpleFilter\n index: number\n onFilterChange: (index: number, filter: SimpleFilter) => void\n onFilterRemove: (index: number) => void\n schema: MetaResponse | null\n query: CubeQuery\n}\n\nexport interface FilterGroupProps {\n group: GroupFilter\n index: number\n onGroupChange: (index: number, group: GroupFilter) => void\n onGroupChangeWithUnwrap?: (index: number, group: GroupFilter) => void\n onGroupRemove: (index: number) => void\n schema: MetaResponse | null\n query: CubeQuery\n depth: number\n}\n\nexport interface FilterValueSelectorProps {\n fieldName: string\n operator: FilterOperator\n values: any[]\n onValuesChange: (values: any[]) => void\n schema: MetaResponse | null\n}\n\n// Date range types\nexport type DateRangeType = \n | 'custom'\n | 'today'\n | 'yesterday' \n | 'this_week'\n | 'this_month'\n | 'this_quarter'\n | 'this_year'\n | 'last_7_days'\n | 'last_30_days'\n | 'last_week'\n | 'last_month'\n | 'last_quarter'\n | 'last_year'\n | 'last_12_months'\n | 'last_n_days'\n | 'last_n_weeks'\n | 'last_n_months'\n | 'last_n_quarters'\n | 'last_n_years'\n\nexport interface DateRangeOption {\n value: DateRangeType\n label: string\n}\n\nexport const DATE_RANGE_OPTIONS: DateRangeOption[] = [\n { value: 'custom', label: 'Custom' },\n { value: 'today', label: 'Today' },\n { value: 'yesterday', label: 'Yesterday' },\n { value: 'this_week', label: 'This week' },\n { value: 'this_month', label: 'This month' },\n { value: 'this_quarter', label: 'This quarter' },\n { value: 'this_year', label: 'This year' },\n { value: 'last_7_days', label: 'Last 7 days' },\n { value: 'last_30_days', label: 'Last 30 days' },\n { value: 'last_n_days', label: 'Last N days' },\n { value: 'last_week', label: 'Last week' },\n { value: 'last_n_weeks', label: 'Last N weeks' },\n { value: 'last_month', label: 'Last month' }, \n { value: 'last_12_months', label: 'Last 12 months' },\n { value: 'last_n_months', label: 'Last N months' },\n { value: 'last_quarter', label: 'Last quarter' },\n { value: 'last_n_quarters', label: 'Last N quarters' },\n { value: 'last_year', label: 'Last year' },\n { value: 'last_n_years', label: 'Last N years' }\n] as const\n\nexport interface DateRangeFilter {\n id: string\n timeDimension: string\n rangeType: DateRangeType\n startDate?: string\n endDate?: string\n}\n\n// Date range component props\nexport interface DateRangeSelectorProps {\n timeDimensions: string[]\n onDateRangeChange: (timeDimension: string, dateRange: string | string[]) => void\n onDateRangeRemove: (timeDimension: string) => void\n currentDateRanges: Record<string, string | string[]>\n}\n\nexport interface DateRangeFilterProps {\n timeDimensions: Array<{ dimension: string; granularity?: string; dateRange?: string | string[] }>\n onDateRangeChange: (timeDimension: string, dateRange: string | string[]) => void\n onDateRangeRemove: (timeDimension: string) => void\n}","/**\n * FilterValueSelector Component\n * \n * Smart input component that adapts to operator type:\n * - Combo box for equals/notEquals with API-fetched values\n * - Number input for numeric operators\n * - Date picker for date operators\n * - No input for set/notSet operators\n */\n\nimport React, { useState, useEffect, useRef, useCallback, useMemo } from 'react'\nimport { ChevronDownIcon, XMarkIcon } from '@heroicons/react/24/outline'\nimport { useFilterValues } from '../../hooks/useFilterValues'\nimport { useDebounce } from '../../hooks/useDebounce'\nimport type { FilterValueSelectorProps } from './types'\nimport { FILTER_OPERATORS } from './types'\n\nconst FilterValueSelector: React.FC<FilterValueSelectorProps> = ({\n fieldName,\n operator,\n values,\n onValuesChange,\n schema\n}) => {\n const operatorMeta = FILTER_OPERATORS[operator]\n const [isOpen, setIsOpen] = useState(false)\n const [searchText, setSearchText] = useState('')\n const [hasLoadedInitial, setHasLoadedInitial] = useState(false)\n const dropdownRef = useRef<HTMLDivElement>(null)\n const lastSearchedTerm = useRef<string>('')\n \n // Debounce the search text\n const debouncedSearchText = useDebounce(searchText, 300)\n \n // Check if the field is a dimension (not a measure)\n const isDimension = useMemo(() => schema ? schema.cubes.some(cube => \n cube.dimensions.some(dim => dim.name === fieldName)\n ) : false, [schema, fieldName])\n \n // Check if the field is a time dimension\n const isTimeDimension = useMemo(() => schema ? schema.cubes.some(cube => \n cube.dimensions.some(dim => dim.name === fieldName && dim.type === 'time')\n ) : false, [schema, fieldName])\n \n // Fetch distinct values for combo box (only for equals/notEquals/in/notIn on non-time dimensions)\n const shouldFetchValues = useMemo(() => \n (['equals', 'notEquals', 'in', 'notIn'].includes(operator)) && isDimension && !isTimeDimension,\n [operator, isDimension, isTimeDimension]\n )\n const shouldShowComboBox = shouldFetchValues\n \n const { \n values: distinctValues, \n loading: valuesLoading, \n error: valuesError,\n searchValues\n } = useFilterValues(fieldName, shouldFetchValues)\n \n // Close dropdown when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {\n setIsOpen(false)\n }\n }\n \n document.addEventListener('mousedown', handleClickOutside)\n return () => document.removeEventListener('mousedown', handleClickOutside)\n }, [])\n \n // Load initial values when dropdown opens\n useEffect(() => {\n if (isOpen && shouldFetchValues && searchValues) {\n searchValues('', true) // Force load with empty search\n setHasLoadedInitial(true)\n lastSearchedTerm.current = ''\n }\n }, [isOpen, shouldFetchValues, searchValues])\n \n // Trigger search when debounced search text changes\n useEffect(() => {\n if (hasLoadedInitial && shouldFetchValues && searchValues && debouncedSearchText !== lastSearchedTerm.current) {\n lastSearchedTerm.current = debouncedSearchText\n searchValues(debouncedSearchText)\n }\n }, [debouncedSearchText, hasLoadedInitial, shouldFetchValues, searchValues])\n \n // Handle dropdown toggle\n const handleDropdownToggle = useCallback(() => {\n const newIsOpen = !isOpen\n setIsOpen(newIsOpen)\n \n // Reset search when closing dropdown\n if (!newIsOpen) {\n setSearchText('')\n lastSearchedTerm.current = ''\n }\n }, [isOpen])\n \n // Handle search input change\n const handleSearchChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n const newSearchText = e.target.value\n setSearchText(newSearchText)\n }, [])\n \n // Handle value selection for combo box\n const handleValueSelect = useCallback((value: any) => {\n if (operatorMeta.supportsMultipleValues) {\n // Add to selection if not already selected\n if (!values.includes(value)) {\n onValuesChange([...values, value])\n }\n } else {\n // Replace current value\n onValuesChange([value])\n setIsOpen(false)\n }\n // Clear search after selection\n setSearchText('')\n }, [operatorMeta.supportsMultipleValues, values, onValuesChange])\n \n // Handle value removal for multi-select\n const handleValueRemove = useCallback((valueToRemove: any) => {\n onValuesChange(values.filter(v => v !== valueToRemove))\n }, [values, onValuesChange])\n \n // Handle direct text input for non-combo operators\n const handleDirectInput = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value\n if (operatorMeta.valueType === 'number') {\n const numValue = parseFloat(value)\n // Accept valid numbers including zero\n if (!isNaN(numValue)) {\n onValuesChange([numValue])\n } else if (value === '' || value === '-') {\n // Allow empty string or just a minus sign for negative numbers being typed\n onValuesChange([])\n }\n } else {\n onValuesChange(value ? [value] : [])\n }\n }, [operatorMeta.valueType, onValuesChange])\n \n // Handle date input\n const handleDateInput = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value\n if (operator === 'inDateRange') {\n // For date range, we need two values\n const currentValues = values.length >= 2 ? values : ['', '']\n onValuesChange([value, currentValues[1]])\n } else {\n // Single date value\n onValuesChange(value ? [value] : [])\n }\n }, [operator, values, onValuesChange])\n \n const handleDateRangeEndInput = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value\n const currentValues = values.length >= 2 ? values : ['', '']\n onValuesChange([currentValues[0], value])\n }, [values, onValuesChange])\n \n // Render based on operator type\n if (!operatorMeta.requiresValues) {\n // No input needed for set/notSet\n return (\n <div className=\"text-sm text-gray-500 italic\">\n No value required\n </div>\n )\n }\n \n if (operator === 'inDateRange') {\n // Date range picker\n return (\n <div className=\"flex items-center space-x-2\">\n <input\n type=\"date\"\n value={values[0] || ''}\n onChange={handleDateInput}\n className=\"text-sm border border-gray-300 rounded px-2 py-1 focus:ring-2 focus:ring-blue-500 focus:border-blue-500\"\n />\n <span className=\"text-sm text-gray-500\">to</span>\n <input\n type=\"date\"\n value={values[1] || ''}\n onChange={handleDateRangeEndInput}\n className=\"text-sm border border-gray-300 rounded px-2 py-1 focus:ring-2 focus:ring-blue-500 focus:border-blue-500\"\n />\n </div>\n )\n }\n \n if (operator === 'between' || operator === 'notBetween') {\n // Between range picker (for numbers)\n const handleBetweenStartInput = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n const value = parseFloat(e.target.value)\n const currentValues = values.length >= 2 ? values : ['', '']\n const newValues = [!isNaN(value) ? value : e.target.value === '' ? '' : currentValues[0], currentValues[1]]\n onValuesChange(newValues.filter(v => v !== ''))\n }, [values, onValuesChange])\n \n const handleBetweenEndInput = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n const value = parseFloat(e.target.value)\n const currentValues = values.length >= 2 ? values : ['', '']\n const newValues = [currentValues[0], !isNaN(value) ? value : e.target.value === '' ? '' : currentValues[1]]\n onValuesChange(newValues.filter(v => v !== ''))\n }, [values, onValuesChange])\n \n return (\n <div className=\"flex items-center space-x-2\">\n <input\n type=\"number\"\n value={values[0] !== undefined && values[0] !== null ? values[0] : ''}\n onChange={handleBetweenStartInput}\n placeholder=\"Min\"\n className=\"text-sm border border-gray-300 rounded px-2 py-1 focus:ring-2 focus:ring-blue-500 focus:border-blue-500\"\n />\n <span className=\"text-sm text-gray-500\">to</span>\n <input\n type=\"number\"\n value={values[1] !== undefined && values[1] !== null ? values[1] : ''}\n onChange={handleBetweenEndInput}\n placeholder=\"Max\"\n className=\"text-sm border border-gray-300 rounded px-2 py-1 focus:ring-2 focus:ring-blue-500 focus:border-blue-500\"\n />\n </div>\n )\n }\n \n if (operatorMeta.valueType === 'date') {\n // Single date picker\n return (\n <input\n type=\"date\"\n value={values[0] || ''}\n onChange={handleDateInput}\n className=\"text-sm border border-gray-300 rounded px-2 py-1 focus:ring-2 focus:ring-blue-500 focus:border-blue-500\"\n />\n )\n }\n \n if (operatorMeta.valueType === 'number') {\n // Number input\n return (\n <input\n type=\"number\"\n value={values[0] !== undefined && values[0] !== null ? values[0] : ''}\n onChange={handleDirectInput}\n placeholder=\"Enter number\"\n className=\"text-sm border border-gray-300 rounded px-2 py-1 focus:ring-2 focus:ring-blue-500 focus:border-blue-500\"\n />\n )\n }\n \n // Time dimension with equals/notEquals/in/notIn - use date picker\n if (isTimeDimension && (['equals', 'notEquals', 'in', 'notIn'].includes(operator))) {\n if (operatorMeta.supportsMultipleValues) {\n // Multi-select date picker (for notEquals that supports multiple values)\n return (\n <div className=\"space-y-2\">\n {/* Selected dates display */}\n {values.length > 0 && (\n <div className=\"flex flex-wrap gap-1\">\n {values.map((value, index) => (\n <div\n key={index}\n className=\"inline-flex items-center bg-blue-100 text-blue-800 text-xs px-2 py-1 rounded border border-blue-200\"\n >\n <span className=\"mr-1\">{String(value)}</span>\n <button\n onClick={() => handleValueRemove(value)}\n className=\"text-blue-600 hover:text-blue-800 focus:outline-none\"\n >\n <XMarkIcon className=\"w-3 h-3\" />\n </button>\n </div>\n ))}\n </div>\n )}\n \n {/* Add new date */}\n <input\n type=\"date\"\n onChange={(e) => {\n if (e.target.value && !values.includes(e.target.value)) {\n onValuesChange([...values, e.target.value])\n e.target.value = '' // Clear the input\n }\n }}\n className=\"text-sm border border-gray-300 rounded px-2 py-1 focus:ring-2 focus:ring-blue-500 focus:border-blue-500\"\n placeholder=\"Add date...\"\n />\n </div>\n )\n } else {\n // Single date picker\n return (\n <input\n type=\"date\"\n value={values[0] || ''}\n onChange={handleDateInput}\n className=\"text-sm border border-gray-300 rounded px-2 py-1 focus:ring-2 focus:ring-blue-500 focus:border-blue-500\"\n />\n )\n }\n }\n \n if (shouldShowComboBox) {\n // Combo box with API-fetched values\n return (\n <div className=\"relative\" ref={dropdownRef}>\n {/* Selected values display (for multi-select) */}\n {operatorMeta.supportsMultipleValues && values.length > 0 && (\n <div className=\"flex flex-wrap gap-1 mb-2\">\n {values.map((value, index) => (\n <div\n key={index}\n className=\"inline-flex items-center bg-blue-100 text-blue-800 text-xs px-2 py-1 rounded border border-blue-200\"\n >\n <span className=\"mr-1\">{String(value)}</span>\n <button\n onClick={() => handleValueRemove(value)}\n className=\"text-blue-600 hover:text-blue-800 focus:outline-none\"\n >\n <XMarkIcon className=\"w-3 h-3\" />\n </button>\n </div>\n ))}\n </div>\n )}\n \n {/* Single value display (for single-select) */}\n {!operatorMeta.supportsMultipleValues && values.length > 0 && (\n <div className=\"mb-2\">\n <div className=\"inline-flex items-center bg-blue-100 text-blue-800 text-xs px-2 py-1 rounded border border-blue-200\">\n <span className=\"mr-1\">{String(values[0])}</span>\n <button\n onClick={() => onValuesChange([])}\n className=\"text-blue-600 hover:text-blue-800 focus:outline-none\"\n >\n <XMarkIcon className=\"w-3 h-3\" />\n </button>\n </div>\n </div>\n )}\n \n {/* Dropdown trigger */}\n <button\n onClick={handleDropdownToggle}\n className=\"w-full text-left text-sm border border-gray-300 rounded px-2 py-1 bg-white hover:bg-gray-50 focus:ring-2 focus:ring-blue-500 focus:border-blue-500 flex items-center justify-between min-w-0\"\n >\n <span className=\"text-gray-500 truncate\">\n {valuesLoading && !hasLoadedInitial ? 'Loading values...' : 'Select value...'}\n </span>\n <ChevronDownIcon className=\"w-4 h-4 text-gray-400\" />\n </button>\n \n {/* Dropdown menu */}\n {isOpen && (\n <div className=\"absolute z-30 left-0 right-0 mt-1 bg-white border border-gray-300 rounded-md shadow-lg max-h-60 overflow-y-auto\">\n {/* Search input */}\n <div className=\"p-2 border-b border-gray-200\">\n <input\n type=\"text\"\n value={searchText}\n onChange={handleSearchChange}\n placeholder=\"Search values...\"\n className=\"w-full text-sm border border-gray-300 rounded px-2 py-1 focus:ring-2 focus:ring-blue-500 focus:border-blue-500\"\n autoFocus\n />\n </div>\n \n {/* Values list */}\n <div className=\"max-h-48 overflow-y-auto\">\n {valuesLoading ? (\n <div className=\"p-2 text-sm text-gray-500\">\n {searchText ? 'Searching...' : 'Loading values...'}\n </div>\n ) : valuesError ? (\n <div className=\"p-2 text-sm text-red-600\">\n Error loading values: {valuesError}\n </div>\n ) : distinctValues.length === 0 ? (\n <div className=\"p-2 text-sm text-gray-500\">\n {searchText ? 'No matching values' : 'No values available'}\n </div>\n ) : (\n distinctValues.map((value, index) => {\n const isSelected = values.includes(value)\n \n return (\n <button\n key={`${value}-${index}`}\n onClick={() => handleValueSelect(value)}\n className={`w-full text-left px-3 py-2 text-sm hover:bg-gray-100 focus:outline-none focus:bg-gray-100 ${\n isSelected ? 'bg-blue-50 text-blue-700' : 'text-gray-700'\n }`}\n >\n {String(value)}\n {isSelected && (\n <span className=\"float-right text-blue-600\">✓</span>\n )}\n </button>\n )\n })\n )}\n </div>\n </div>\n )}\n </div>\n )\n }\n \n // Fallback to text input\n return (\n <input\n type=\"text\"\n value={values[0] !== undefined && values[0] !== null ? values[0] : ''}\n onChange={handleDirectInput}\n placeholder={`Enter ${operatorMeta.valueType} value`}\n className=\"text-sm border border-gray-300 rounded px-2 py-1 focus:ring-2 focus:ring-blue-500 focus:border-blue-500\"\n />\n )\n}\n\nexport default FilterValueSelector","/**\n * Utility functions for QueryBuilder components\n */\n\nimport type { CubeQuery, Filter, SimpleFilter, GroupFilter } from '../../types'\nimport type { MetaField, MetaResponse } from './types'\nimport { FILTER_OPERATORS } from './types'\n\n/**\n * Check if a field is selected in the current query\n */\nexport function isFieldSelected(\n fieldName: string, \n fieldType: 'measures' | 'dimensions' | 'timeDimensions',\n query: CubeQuery\n): boolean {\n switch (fieldType) {\n case 'measures':\n return query.measures?.includes(fieldName) || false\n case 'dimensions':\n return query.dimensions?.includes(fieldName) || false\n case 'timeDimensions':\n return query.timeDimensions?.some(td => td.dimension === fieldName) || false\n default:\n return false\n }\n}\n\n/**\n * Get all time dimension fields from schema\n */\nexport function getTimeDimensionFields(schema: MetaResponse): MetaField[] {\n const timeDimensions: MetaField[] = []\n \n schema.cubes.forEach(cube => {\n cube.dimensions.forEach(dimension => {\n if (dimension.type === 'time') {\n timeDimensions.push(dimension)\n }\n })\n })\n \n return timeDimensions\n}\n\n/**\n * Get all non-time dimension fields from schema\n */\nexport function getRegularDimensionFields(schema: MetaResponse): MetaField[] {\n const dimensions: MetaField[] = []\n \n schema.cubes.forEach(cube => {\n cube.dimensions.forEach(dimension => {\n if (dimension.type !== 'time') {\n dimensions.push(dimension)\n }\n })\n })\n \n return dimensions\n}\n\n/**\n * Get all measure fields from schema\n */\nexport function getMeasureFields(schema: MetaResponse): MetaField[] {\n const measures: MetaField[] = []\n \n schema.cubes.forEach(cube => {\n cube.measures.forEach(measure => {\n measures.push(measure)\n })\n })\n \n return measures\n}\n\n/**\n * Check if query has any content (measures, dimensions, or timeDimensions)\n */\nexport function hasQueryContent(query: CubeQuery): boolean {\n return Boolean(\n (query.measures && query.measures.length > 0) ||\n (query.dimensions && query.dimensions.length > 0) ||\n (query.timeDimensions && query.timeDimensions.length > 0)\n )\n}\n\n/**\n * Get count of selected fields across all types\n */\nexport function getSelectedFieldsCount(query: CubeQuery): number {\n let count = 0\n if (query.measures) count += query.measures.length\n if (query.dimensions) count += query.dimensions.length\n if (query.timeDimensions) count += query.timeDimensions.length\n return count\n}\n\n/**\n * Get cube name from field name (e.g., \"Employees.count\" -> \"Employees\")\n */\nexport function getCubeNameFromField(fieldName: string): string {\n return fieldName.split('.')[0]\n}\n\n/**\n * Group fields by cube name\n */\nexport function groupFieldsByCube(fields: MetaField[]): Record<string, MetaField[]> {\n return fields.reduce((groups, field) => {\n const cubeName = getCubeNameFromField(field.name)\n if (!groups[cubeName]) {\n groups[cubeName] = []\n }\n groups[cubeName].push(field)\n return groups\n }, {} as Record<string, MetaField[]>)\n}\n\n/**\n * Clean query object by removing empty arrays\n */\nexport function cleanQuery(query: CubeQuery): CubeQuery {\n const cleanedQuery: CubeQuery = {}\n \n if (query.measures && query.measures.length > 0) {\n cleanedQuery.measures = query.measures\n }\n \n if (query.dimensions && query.dimensions.length > 0) {\n cleanedQuery.dimensions = query.dimensions\n }\n \n if (query.timeDimensions && query.timeDimensions.length > 0) {\n cleanedQuery.timeDimensions = query.timeDimensions\n }\n \n if (query.filters && query.filters.length > 0) {\n cleanedQuery.filters = query.filters\n }\n \n if (query.order) {\n cleanedQuery.order = query.order\n }\n \n if (query.limit) {\n cleanedQuery.limit = query.limit\n }\n \n if (query.offset) {\n cleanedQuery.offset = query.offset\n }\n \n if (query.segments && query.segments.length > 0) {\n cleanedQuery.segments = query.segments\n }\n \n return cleanedQuery\n}\n\n/**\n * Clean a query and transform filters for server compatibility\n * This version transforms GroupFilter to legacy and/or format\n */\nexport function cleanQueryForServer(query: CubeQuery): CubeQuery {\n const cleanedQuery = cleanQuery(query)\n \n // Apply server transformation to filters\n if (cleanedQuery.filters && cleanedQuery.filters.length > 0) {\n cleanedQuery.filters = transformFiltersForServer(cleanedQuery.filters) as any\n }\n \n return cleanedQuery\n}\n\n/**\n * Create an empty query object\n */\nexport function createEmptyQuery(): CubeQuery {\n return {}\n}\n\n/**\n * Filter utility functions\n */\n\n/**\n * Check if a filter is a simple filter\n */\nexport function isSimpleFilter(filter: Filter): filter is SimpleFilter {\n return 'member' in filter && 'operator' in filter && 'values' in filter\n}\n\n/**\n * Check if a filter is a group filter\n */\nexport function isGroupFilter(filter: Filter): filter is GroupFilter {\n return 'type' in filter && 'filters' in filter\n}\n\n/**\n * Check if a filter is an AND filter\n */\nexport function isAndFilter(filter: Filter): filter is GroupFilter {\n return isGroupFilter(filter) && filter.type === 'and'\n}\n\n/**\n * Check if a filter is an OR filter\n */\nexport function isOrFilter(filter: Filter): filter is GroupFilter {\n return isGroupFilter(filter) && filter.type === 'or'\n}\n\n/**\n * Flatten all simple filters from a hierarchical filter structure\n */\nexport function flattenFilters(filters: Filter[]): SimpleFilter[] {\n const simple: SimpleFilter[] = []\n \n const flatten = (filter: Filter) => {\n if (isSimpleFilter(filter)) {\n simple.push(filter)\n } else if (isGroupFilter(filter)) {\n filter.filters.forEach(flatten)\n }\n }\n \n filters.forEach(flatten)\n return simple\n}\n\n/**\n * Get all filterable fields from schema (measures, dimensions, and time dimensions)\n * Returns ALL fields if no query provided, or only query fields if query provided\n */\nexport function getFilterableFields(schema: MetaResponse, query?: CubeQuery): MetaField[] {\n const allFields: MetaField[] = []\n \n schema.cubes.forEach(cube => {\n allFields.push(...cube.measures)\n allFields.push(...cube.dimensions)\n })\n \n // If no query provided, return all fields\n if (!query) {\n return allFields.sort((a, b) => a.name.localeCompare(b.name))\n }\n \n // Get currently selected fields from the query\n const selectedFields = new Set<string>()\n \n // Add measures\n if (query.measures) {\n query.measures.forEach(measure => selectedFields.add(measure))\n }\n \n // Add dimensions\n if (query.dimensions) {\n query.dimensions.forEach(dimension => selectedFields.add(dimension))\n }\n \n // Add time dimensions\n if (query.timeDimensions) {\n query.timeDimensions.forEach(td => selectedFields.add(td.dimension))\n }\n \n // Filter to only include selected fields\n const filterableFields = allFields.filter(field => selectedFields.has(field.name))\n \n return filterableFields.sort((a, b) => a.name.localeCompare(b.name))\n}\n\n/**\n * Get ALL filterable fields from schema, regardless of query selection\n */\nexport function getAllFilterableFields(schema: MetaResponse): MetaField[] {\n const allFields: MetaField[] = []\n \n schema.cubes.forEach(cube => {\n allFields.push(...cube.measures)\n allFields.push(...cube.dimensions)\n })\n \n return allFields.sort((a, b) => a.name.localeCompare(b.name))\n}\n\n/**\n * Get organized filter field options with query fields prioritized at top\n */\nexport function getOrganizedFilterFields(schema: MetaResponse, query?: CubeQuery): {\n queryFields: MetaField[]\n allFields: MetaField[]\n} {\n const allFields = getAllFilterableFields(schema)\n \n if (!query) {\n return {\n queryFields: [],\n allFields\n }\n }\n \n // Get currently selected fields from the query\n const selectedFields = new Set<string>()\n \n // Add measures\n if (query.measures) {\n query.measures.forEach(measure => selectedFields.add(measure))\n }\n \n // Add dimensions\n if (query.dimensions) {\n query.dimensions.forEach(dimension => selectedFields.add(dimension))\n }\n \n // Add time dimensions\n if (query.timeDimensions) {\n query.timeDimensions.forEach(td => selectedFields.add(td.dimension))\n }\n \n // Split fields into query fields and other fields\n const queryFields = allFields.filter(field => selectedFields.has(field.name))\n \n return {\n queryFields,\n allFields\n }\n}\n\n/**\n * Get available operators for a field type\n */\nexport function getAvailableOperators(fieldType: string): Array<{operator: string, label: string}> {\n const operators: Array<{operator: string, label: string}> = []\n \n for (const [operator, meta] of Object.entries(FILTER_OPERATORS)) {\n if (meta.fieldTypes.includes(fieldType)) {\n operators.push({\n operator,\n label: meta.label\n })\n }\n }\n \n return operators\n}\n\n/**\n * Get field type from schema\n */\nexport function getFieldType(fieldName: string, schema: MetaResponse): string {\n for (const cube of schema.cubes) {\n // Check measures\n const measure = cube.measures.find(m => m.name === fieldName)\n if (measure) return measure.type\n \n // Check dimensions\n const dimension = cube.dimensions.find(d => d.name === fieldName)\n if (dimension) return dimension.type\n }\n \n return 'string' // Default fallback\n}\n\n/**\n * Validate a filter\n */\nexport function validateFilter(filter: SimpleFilter, schema: MetaResponse): {\n isValid: boolean\n errors: string[]\n} {\n const errors: string[] = []\n \n // Check if field exists\n const fields = getFilterableFields(schema)\n const fieldExists = fields.some(f => f.name === filter.member)\n \n if (!fieldExists) {\n errors.push(`Field \"${filter.member}\" does not exist`)\n }\n \n // Check if operator is valid for field type\n if (fieldExists) {\n const fieldType = getFieldType(filter.member, schema)\n const operatorMeta = FILTER_OPERATORS[filter.operator]\n \n if (!operatorMeta) {\n errors.push(`Invalid operator \"${filter.operator}\"`)\n } else if (!operatorMeta.fieldTypes.includes(fieldType)) {\n errors.push(`Operator \"${filter.operator}\" is not valid for field type \"${fieldType}\"`)\n } else {\n // Check values\n if (operatorMeta.requiresValues && (!filter.values || filter.values.length === 0)) {\n errors.push(`Operator \"${filter.operator}\" requires values`)\n }\n \n if (!operatorMeta.supportsMultipleValues && filter.values && filter.values.length > 1) {\n errors.push(`Operator \"${filter.operator}\" does not support multiple values`)\n }\n }\n }\n \n return {\n isValid: errors.length === 0,\n errors\n }\n}\n\n/**\n * Count total filters in hierarchical structure\n */\nexport function countFilters(filters: Filter[]): number {\n let count = 0\n \n const countFilter = (filter: Filter) => {\n if (isSimpleFilter(filter)) {\n count++\n } else if (isGroupFilter(filter)) {\n filter.filters.forEach(countFilter)\n }\n }\n \n filters.forEach(countFilter)\n return count\n}\n\n/**\n * Create a new simple filter\n */\nexport function createSimpleFilter(member: string, operator: string = 'equals', values: any[] = []): SimpleFilter {\n return {\n member,\n operator: operator as any,\n values\n }\n}\n\n/**\n * Create a new AND filter group\n */\nexport function createAndFilter(filters: Filter[] = []): GroupFilter {\n return {\n type: 'and',\n filters\n }\n}\n\n/**\n * Create a new OR filter group\n */\nexport function createOrFilter(filters: Filter[] = []): GroupFilter {\n return {\n type: 'or',\n filters\n }\n}\n\n/**\n * Clean up filters by removing any that reference fields not in the current query\n * @deprecated This function is no longer used as we now support filtering on any schema field\n */\nexport function cleanupFilters(filters: Filter[], _query?: CubeQuery): Filter[] {\n // Return filters unchanged - we now support filtering on any field\n return filters || []\n}\n\n/**\n * Clean up filters by removing any that reference fields not in the current query (legacy)\n * Only used for backward compatibility - filters on non-query fields are now supported\n */\nexport function cleanupFiltersLegacy(filters: Filter[], query: CubeQuery): Filter[] {\n if (!filters || filters.length === 0) {\n return []\n }\n \n // Get currently selected fields from the query\n const selectedFields = new Set<string>()\n \n // Add measures\n if (query.measures) {\n query.measures.forEach(measure => selectedFields.add(measure))\n }\n \n // Add dimensions\n if (query.dimensions) {\n query.dimensions.forEach(dimension => selectedFields.add(dimension))\n }\n \n // Add time dimensions\n if (query.timeDimensions) {\n query.timeDimensions.forEach(td => selectedFields.add(td.dimension))\n }\n \n // Recursively clean filters\n const cleanFilter = (filter: Filter): Filter | null => {\n if (isSimpleFilter(filter)) {\n // Remove filter if its field is not selected\n return selectedFields.has(filter.member) ? filter : null\n } else if (isGroupFilter(filter)) {\n // Clean group recursively\n const cleanedFilters = filter.filters.map(cleanFilter).filter(f => f !== null) as Filter[]\n return cleanedFilters.length > 0 ? { type: filter.type, filters: cleanedFilters } : null\n }\n return null\n }\n \n // Clean all filters and remove nulls\n const cleanedFilters = filters.map(cleanFilter).filter(f => f !== null) as Filter[]\n \n return cleanedFilters\n}\n\n/**\n * Transform filters from new GroupFilter format to legacy server format\n * Server expects { and: [...] } and { or: [...] } instead of { type: 'and', filters: [...] }\n */\nexport function transformFiltersForServer(filters: Filter[]): any[] {\n const transformFilter = (filter: Filter): any => {\n if (isSimpleFilter(filter)) {\n return filter\n } else if (isGroupFilter(filter)) {\n const transformedSubFilters = filter.filters.map(transformFilter)\n \n if (filter.type === 'and') {\n return { and: transformedSubFilters }\n } else {\n return { or: transformedSubFilters }\n }\n }\n return filter\n }\n \n return filters.map(transformFilter)\n}\n\n/**\n * Date range utility functions\n */\n\n/**\n * Convert DateRangeType to Cube.js compatible date range format\n */\nexport function convertDateRangeTypeToValue(rangeType: string, number?: number): string {\n const typeMap: Record<string, string> = {\n 'today': 'today',\n 'yesterday': 'yesterday',\n 'this_week': 'this week',\n 'this_month': 'this month',\n 'this_quarter': 'this quarter',\n 'this_year': 'this year',\n 'last_7_days': 'last 7 days',\n 'last_30_days': 'last 30 days',\n 'last_week': 'last week',\n 'last_month': 'last month',\n 'last_quarter': 'last quarter',\n 'last_year': 'last year',\n 'last_12_months': 'last 12 months'\n }\n \n // Handle dynamic ranges with number input\n if (rangeType.startsWith('last_n_') && number !== undefined && number > 0) {\n const unit = rangeType.replace('last_n_', '')\n const unitSingular = unit.slice(0, -1) // Remove 's' for singular form\n return number === 1 ? `last ${unitSingular}` : `last ${number} ${unit}`\n }\n \n return typeMap[rangeType] || rangeType\n}\n\n/**\n * Check if a date range type requires a number input\n */\nexport function requiresNumberInput(rangeType: string): boolean {\n return rangeType.startsWith('last_n_')\n}\n\n/**\n * Format date for Cube.js (YYYY-MM-DD)\n */\nexport function formatDateForCube(date: Date): string {\n return date.toISOString().split('T')[0]\n}\n\n/**\n * Get the time dimensions that have date ranges applied\n */\nexport function getTimeDimensionsWithDateRanges(query: CubeQuery): Record<string, string | string[]> {\n const dateRanges: Record<string, string | string[]> = {}\n \n if (query.timeDimensions) {\n query.timeDimensions.forEach(td => {\n if (td.dateRange) {\n dateRanges[td.dimension] = td.dateRange\n }\n })\n }\n \n return dateRanges\n}\n\n/**\n * Check if a query has any time dimensions\n */\nexport function hasTimeDimensions(query: CubeQuery): boolean {\n return Boolean(query.timeDimensions && query.timeDimensions.length > 0)\n}\n\n/**\n * Transform a Cube.js query from external format to UI internal format\n * This handles format differences between server/API queries and QueryBuilder state\n */\nexport function transformQueryForUI(query: any): CubeQuery {\n if (!query || typeof query !== 'object') {\n return {}\n }\n \n const transformed: CubeQuery = {}\n \n // Copy simple fields if they exist\n if (query.measures) transformed.measures = Array.isArray(query.measures) ? query.measures : []\n if (query.dimensions) transformed.dimensions = Array.isArray(query.dimensions) ? query.dimensions : []\n if (query.timeDimensions) transformed.timeDimensions = Array.isArray(query.timeDimensions) ? query.timeDimensions : []\n if (query.order) transformed.order = query.order\n if (query.limit) transformed.limit = query.limit\n if (query.offset) transformed.offset = query.offset\n if (query.segments) transformed.segments = Array.isArray(query.segments) ? query.segments : []\n \n // Transform filters from server format to UI format\n if (query.filters && Array.isArray(query.filters)) {\n transformed.filters = transformFiltersFromServer(query.filters)\n }\n \n return cleanQuery(transformed)\n}\n\n/**\n * Transform filters from server/API format to UI format\n * Converts {and: [...]} and {or: [...]} to {type: 'and', filters: [...]} format\n */\nfunction transformFiltersFromServer(filters: any[]): Filter[] {\n return filters.map(filter => {\n if (!filter || typeof filter !== 'object') {\n return filter\n }\n \n // Handle legacy {and: [...]} format\n if ('and' in filter && Array.isArray(filter.and)) {\n return {\n type: 'and',\n filters: transformFiltersFromServer(filter.and)\n } as GroupFilter\n }\n \n // Handle legacy {or: [...]} format\n if ('or' in filter && Array.isArray(filter.or)) {\n return {\n type: 'or',\n filters: transformFiltersFromServer(filter.or)\n } as GroupFilter\n }\n \n // Handle new format {type: 'and', filters: [...]} - process recursively\n if ('type' in filter && 'filters' in filter && Array.isArray(filter.filters)) {\n return {\n type: filter.type,\n filters: transformFiltersFromServer(filter.filters)\n } as GroupFilter\n }\n \n // Simple filter - pass through\n return filter as SimpleFilter\n }).filter(Boolean) // Remove any null/undefined values\n}\n\n/**\n * Sorting utility functions\n */\n\n/**\n * Get field title from schema metadata, falling back to field name\n */\nexport function getFieldTitle(fieldName: string, schema: MetaResponse | null): string {\n if (!schema) return fieldName\n \n for (const cube of schema.cubes) {\n // Check measures\n const measure = cube.measures.find(m => m.name === fieldName)\n if (measure) return measure.title || measure.shortTitle || fieldName\n \n // Check dimensions\n const dimension = cube.dimensions.find(d => d.name === fieldName)\n if (dimension) return dimension.title || dimension.shortTitle || fieldName\n }\n \n return fieldName // Fallback to field name if not found\n}\n\n/**\n * Clean up order object by removing fields that are no longer in the query\n */\nexport function cleanupOrder(order: Record<string, 'asc' | 'desc'> | undefined, query: CubeQuery): Record<string, 'asc' | 'desc'> | undefined {\n if (!order) return undefined\n \n const allFields = [\n ...(query.measures || []),\n ...(query.dimensions || []),\n ...(query.timeDimensions || []).map(td => td.dimension)\n ]\n \n const cleanedOrder: Record<string, 'asc' | 'desc'> = {}\n for (const [field, direction] of Object.entries(order)) {\n if (allFields.includes(field)) {\n cleanedOrder[field] = direction\n }\n }\n \n return Object.keys(cleanedOrder).length > 0 ? cleanedOrder : undefined\n}\n\n/**\n * Get sort direction for a field from the order object\n */\nexport function getSortDirection(fieldName: string, order: Record<string, 'asc' | 'desc'> | undefined): 'asc' | 'desc' | null {\n return order?.[fieldName] || null\n}\n\n/**\n * Get tooltip text for sort button based on current direction\n */\nexport function getSortTooltip(direction: 'asc' | 'desc' | null): string {\n switch (direction) {\n case 'asc':\n return 'Sorted ascending (click for descending)'\n case 'desc':\n return 'Sorted descending (click to remove)'\n default:\n return 'Click to sort ascending'\n }\n}\n\n/**\n * Get next sort direction in the cycle: null -> asc -> desc -> null\n */\nexport function getNextSortDirection(current: 'asc' | 'desc' | null): 'asc' | 'desc' | null {\n switch (current) {\n case null:\n return 'asc'\n case 'asc':\n return 'desc'\n case 'desc':\n return null\n default:\n return 'asc'\n }\n}","/**\n * FilterItem Component\n * \n * Renders a single filter with field selection, operator selection, and value input.\n * Handles all the logic for individual filter management.\n */\n\nimport React, { useState, useEffect, useRef } from 'react'\nimport { XMarkIcon, FunnelIcon, ChevronDownIcon, MagnifyingGlassIcon } from '@heroicons/react/24/outline'\nimport { ChartBarIcon, TagIcon, CalendarIcon } from '@heroicons/react/24/solid'\nimport FilterValueSelector from './FilterValueSelector'\nimport type { FilterItemProps, MetaField } from './types'\nimport { getAllFilterableFields, getOrganizedFilterFields, getFieldType, getAvailableOperators } from './utils'\n\nconst FilterItem: React.FC<FilterItemProps> = ({\n filter,\n index,\n onFilterChange,\n onFilterRemove,\n schema,\n query\n}) => {\n const [isFieldDropdownOpen, setIsFieldDropdownOpen] = useState(false)\n const [isOperatorDropdownOpen, setIsOperatorDropdownOpen] = useState(false)\n const [fieldSearchTerm, setFieldSearchTerm] = useState('')\n const containerRef = useRef<HTMLDivElement>(null)\n const searchInputRef = useRef<HTMLInputElement>(null)\n \n // Close dropdowns when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(event.target as Node)) {\n setIsFieldDropdownOpen(false)\n setIsOperatorDropdownOpen(false)\n }\n }\n \n document.addEventListener('mousedown', handleClickOutside)\n return () => document.removeEventListener('mousedown', handleClickOutside)\n }, [])\n \n // Close other dropdowns when opening one\n const handleFieldDropdownToggle = () => {\n setIsOperatorDropdownOpen(false)\n const newOpen = !isFieldDropdownOpen\n setIsFieldDropdownOpen(newOpen)\n setFieldSearchTerm('') // Reset search when toggling\n \n // Focus search input when opening\n if (newOpen) {\n setTimeout(() => searchInputRef.current?.focus(), 50)\n }\n }\n \n const handleOperatorDropdownToggle = () => {\n setIsFieldDropdownOpen(false)\n setIsOperatorDropdownOpen(!isOperatorDropdownOpen)\n }\n \n if (!schema) {\n return (\n <div className=\"text-sm text-gray-500\">\n Schema not loaded\n </div>\n )\n }\n \n // Get all available fields and organize them\n const allFields = getAllFilterableFields(schema)\n const { queryFields } = getOrganizedFilterFields(schema, query)\n const selectedField = allFields.find(f => f.name === filter.member)\n const fieldType = selectedField ? selectedField.type : 'string'\n const availableOperators = getAvailableOperators(fieldType)\n \n // Filter fields based on search term\n const filterFieldsBySearch = (fields: MetaField[]) => {\n if (!fieldSearchTerm) return fields\n const searchTerm = fieldSearchTerm.toLowerCase()\n return fields.filter(field => \n field.name.toLowerCase().includes(searchTerm) ||\n field.title.toLowerCase().includes(searchTerm) ||\n field.shortTitle.toLowerCase().includes(searchTerm)\n )\n }\n \n const filteredQueryFields = filterFieldsBySearch(queryFields)\n const filteredAllFields = filterFieldsBySearch(allFields)\n \n // Helper function to get field type icon\n const getFieldTypeIcon = (field: MetaField) => {\n if (field.type === 'time') {\n return <CalendarIcon className=\"w-3 h-3 text-blue-500\" />\n } else if (['count', 'sum', 'avg', 'min', 'max', 'countDistinct', 'number'].includes(field.type)) {\n return <ChartBarIcon className=\"w-3 h-3 text-amber-500\" />\n } else {\n return <TagIcon className=\"w-3 h-3 text-green-500\" />\n }\n }\n\n // Helper function to get field type badge\n const getFieldTypeBadge = (field: MetaField) => {\n if (field.type === 'time') {\n return <span className=\"text-xs bg-blue-100 text-blue-700 px-1.5 py-0.5 rounded\">T</span>\n } else if (['count', 'sum', 'avg', 'min', 'max', 'countDistinct', 'number'].includes(field.type)) {\n return <span className=\"text-xs bg-amber-100 text-amber-700 px-1.5 py-0.5 rounded\">M</span>\n } else {\n return <span className=\"text-xs bg-green-100 text-green-700 px-1.5 py-0.5 rounded\">D</span>\n }\n }\n\n const handleFieldChange = (fieldName: string) => {\n // When field changes, reset operator and values\n const newFieldType = getFieldType(fieldName, schema)\n const newAvailableOperators = getAvailableOperators(newFieldType)\n const defaultOperator = newAvailableOperators[0]?.operator || 'equals'\n \n onFilterChange(index, {\n member: fieldName,\n operator: defaultOperator as any,\n values: []\n })\n setIsFieldDropdownOpen(false)\n }\n \n const handleOperatorChange = (operator: string) => {\n onFilterChange(index, {\n ...filter,\n operator: operator as any,\n values: [] // Reset values when operator changes\n })\n setIsOperatorDropdownOpen(false)\n }\n \n const handleValuesChange = (values: any[]) => {\n onFilterChange(index, {\n ...filter,\n values\n })\n }\n \n return (\n <div ref={containerRef} className=\"bg-white border border-gray-200 rounded-lg p-3\">\n {/* Responsive layout - stacks on mobile, single row on desktop */}\n <div className=\"flex flex-col sm:flex-row sm:items-center gap-3 min-w-0\">\n {/* Row 1 on mobile: Filter icon and field selection */}\n <div className=\"flex items-center gap-2 flex-1 min-w-0\">\n <FunnelIcon className=\"w-4 h-4 text-gray-500 flex-shrink-0\" />\n \n {/* Field selection */}\n <div className=\"relative flex-1 min-w-0\">\n <button\n onClick={handleFieldDropdownToggle}\n className=\"w-full flex items-center justify-between text-left text-sm border border-gray-300 rounded px-2 py-1 bg-white hover:bg-gray-50 focus:ring-2 focus:ring-blue-500 focus:border-blue-500 min-w-0\"\n >\n <span className=\"truncate\">\n {selectedField ? (\n <span className=\"font-medium\">{selectedField.name}</span>\n ) : (\n <span className=\"text-gray-500\">Select field...</span>\n )}\n </span>\n <ChevronDownIcon className={`w-4 h-4 text-gray-400 flex-shrink-0 ml-1 transition-transform ${\n isFieldDropdownOpen ? 'transform rotate-180' : ''\n }`} />\n </button>\n \n {isFieldDropdownOpen && (\n <div className=\"absolute z-20 left-0 right-0 mt-1 bg-white border border-gray-300 rounded-md shadow-lg max-h-80 overflow-hidden\">\n {/* Search input */}\n <div className=\"p-2 border-b border-gray-200\">\n <div className=\"relative\">\n <MagnifyingGlassIcon className=\"w-4 h-4 absolute left-2 top-1/2 transform -translate-y-1/2 text-gray-400\" />\n <input\n ref={searchInputRef}\n type=\"text\"\n placeholder=\"Search fields...\"\n value={fieldSearchTerm}\n onChange={(e) => setFieldSearchTerm(e.target.value)}\n className=\"w-full pl-8 pr-3 py-1.5 text-sm border border-gray-300 rounded focus:ring-1 focus:ring-blue-500 focus:border-blue-500\"\n />\n </div>\n </div>\n \n {/* Fields list */}\n <div className=\"max-h-60 overflow-y-auto\">\n {/* Query fields section */}\n {filteredQueryFields.length > 0 && (\n <div>\n <div className=\"px-3 py-1.5 text-xs font-medium text-gray-500 bg-gray-50 border-b\">\n Fields in Query ({filteredQueryFields.length})\n </div>\n {filteredQueryFields.map((field) => (\n <button\n key={`query-${field.name}`}\n onClick={() => handleFieldChange(field.name)}\n className={`w-full text-left px-3 py-2 text-sm hover:bg-gray-100 focus:outline-none focus:bg-gray-100 ${\n field.name === filter.member ? 'bg-blue-50 text-blue-700' : 'text-gray-700'\n }`}\n >\n <div className=\"flex items-center gap-2\">\n {getFieldTypeIcon(field)}\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2\">\n <span className=\"font-medium truncate\">{field.name}</span>\n {getFieldTypeBadge(field)}\n </div>\n {field.title !== field.name && (\n <div className=\"text-xs text-gray-500 truncate\">{field.title}</div>\n )}\n </div>\n </div>\n </button>\n ))}\n </div>\n )}\n \n {/* All fields section */}\n <div>\n {filteredQueryFields.length > 0 && (\n <div className=\"px-3 py-1.5 text-xs font-medium text-gray-500 bg-gray-50 border-b\">\n All Available Fields ({filteredAllFields.length})\n </div>\n )}\n {filteredAllFields.map((field) => (\n <button\n key={`all-${field.name}`}\n onClick={() => handleFieldChange(field.name)}\n className={`w-full text-left px-3 py-2 text-sm hover:bg-gray-100 focus:outline-none focus:bg-gray-100 ${\n field.name === filter.member ? 'bg-blue-50 text-blue-700' : 'text-gray-700'\n }`}\n >\n <div className=\"flex items-center gap-2\">\n {getFieldTypeIcon(field)}\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2\">\n <span className=\"font-medium truncate\">{field.name}</span>\n {getFieldTypeBadge(field)}\n </div>\n {field.title !== field.name && (\n <div className=\"text-xs text-gray-500 truncate\">{field.title}</div>\n )}\n </div>\n </div>\n </button>\n ))}\n </div>\n \n {/* No results message */}\n {filteredAllFields.length === 0 && (\n <div className=\"px-3 py-4 text-sm text-gray-500 text-center\">\n No fields found matching \"{fieldSearchTerm}\"\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n </div>\n \n {/* Row 2 on mobile: Operator and Value selection */}\n {selectedField && (\n <div className=\"flex items-center gap-2 flex-1 sm:flex-initial min-w-0\">\n {/* Operator selection */}\n <div className=\"relative flex-shrink-0\">\n <button\n onClick={handleOperatorDropdownToggle}\n className=\"w-full sm:w-32 flex items-center justify-between text-left text-sm border border-gray-300 rounded px-2 py-1 bg-white hover:bg-gray-50 focus:ring-2 focus:ring-blue-500 focus:border-blue-500\"\n >\n <span className=\"truncate\">\n {availableOperators.find(op => op.operator === filter.operator)?.label || filter.operator}\n </span>\n <ChevronDownIcon className={`w-4 h-4 text-gray-400 flex-shrink-0 ml-1 transition-transform ${\n isOperatorDropdownOpen ? 'transform rotate-180' : ''\n }`} />\n </button>\n \n {isOperatorDropdownOpen && (\n <div className=\"absolute z-20 left-0 right-0 mt-1 bg-white border border-gray-300 rounded-md shadow-lg max-h-60 overflow-y-auto\">\n {availableOperators.map((operator) => (\n <button\n key={operator.operator}\n onClick={() => handleOperatorChange(operator.operator)}\n className={`w-full text-left px-3 py-2 text-sm hover:bg-gray-100 focus:outline-none focus:bg-gray-100 ${\n operator.operator === filter.operator ? 'bg-blue-50 text-blue-700' : 'text-gray-700'\n }`}\n >\n {operator.label}\n </button>\n ))}\n </div>\n )}\n </div>\n \n {/* Value input */}\n <div className=\"flex-1 min-w-0\">\n <FilterValueSelector\n fieldName={filter.member}\n operator={filter.operator}\n values={filter.values}\n onValuesChange={handleValuesChange}\n schema={schema}\n />\n </div>\n </div>\n )}\n \n {/* Row 3 on mobile: Remove button - positioned at the end */}\n <div className=\"flex justify-end sm:justify-start\">\n <button\n onClick={() => onFilterRemove(index)}\n className=\"text-gray-400 hover:text-red-600 focus:outline-none flex-shrink-0\"\n title=\"Remove filter\"\n >\n <XMarkIcon className=\"w-4 h-4\" />\n </button>\n </div>\n </div>\n </div>\n )\n}\n\nexport default FilterItem","/**\n * FilterGroup Component\n * \n * Handles AND/OR logical groups with support for infinite nesting.\n * Renders child filters with proper indentation and group controls.\n */\n\nimport React, { useState } from 'react'\nimport { XMarkIcon, PlusIcon } from '@heroicons/react/24/outline'\nimport FilterItem from './FilterItem'\nimport type { FilterGroupProps } from './types'\nimport type { SimpleFilter, GroupFilter } from '../../types'\nimport { \n isSimpleFilter, \n isGroupFilter,\n createSimpleFilter, \n createAndFilter, \n createOrFilter,\n getFilterableFields\n} from './utils'\n\nconst FilterGroup: React.FC<FilterGroupProps> = ({\n group,\n index,\n onGroupChange,\n onGroupChangeWithUnwrap,\n onGroupRemove,\n schema,\n query,\n depth = 0\n}) => {\n const [showAddMenu, setShowAddMenu] = useState(false)\n \n const isAndGroup = group.type === 'and'\n const groupType = isAndGroup ? 'AND' : 'OR'\n const filters = group.filters\n \n // Style based on depth for visual nesting\n const indentClass = depth > 0 ? `ml-${Math.min(depth * 4, 16)}` : ''\n const borderColor = 'border-slate-200'\n const bgColor = 'bg-slate-50'\n const textColor = 'text-slate-700'\n \n const handleGroupTypeToggle = () => {\n if (isAndGroup) {\n const newGroup = createOrFilter(filters)\n onGroupChange(index, newGroup)\n } else {\n const newGroup = createAndFilter(filters)\n onGroupChange(index, newGroup)\n }\n }\n \n const handleAddSimpleFilter = () => {\n if (!schema) return\n \n // Get the first available field as default\n const filterableFields = getFilterableFields(schema, query)\n const defaultField = filterableFields[0]?.name || ''\n const newFilter = createSimpleFilter(defaultField, 'equals', [])\n const newFilters = [...filters, newFilter]\n \n if (isAndGroup) {\n onGroupChange(index, createAndFilter(newFilters))\n } else {\n onGroupChange(index, createOrFilter(newFilters))\n }\n setShowAddMenu(false)\n }\n \n const handleAddAndGroup = () => {\n if (!schema) return\n \n // Get the first available field as default\n const filterableFields = getFilterableFields(schema, query)\n const defaultField = filterableFields[0]?.name || ''\n const newGroup = createAndFilter([createSimpleFilter(defaultField, 'equals', [])])\n const newFilters = [...filters, newGroup]\n \n if (isAndGroup) {\n onGroupChange(index, createAndFilter(newFilters))\n } else {\n onGroupChange(index, createOrFilter(newFilters))\n }\n setShowAddMenu(false)\n }\n \n const handleAddOrGroup = () => {\n if (!schema) return\n \n // Get the first available field as default\n const filterableFields = getFilterableFields(schema, query)\n const defaultField = filterableFields[0]?.name || ''\n const newGroup = createOrFilter([createSimpleFilter(defaultField, 'equals', [])])\n const newFilters = [...filters, newGroup]\n \n if (isAndGroup) {\n onGroupChange(index, createAndFilter(newFilters))\n } else {\n onGroupChange(index, createOrFilter(newFilters))\n }\n setShowAddMenu(false)\n }\n \n const handleFilterChange = (filterIndex: number, newFilter: SimpleFilter) => {\n const newFilters = [...filters]\n newFilters[filterIndex] = newFilter\n \n if (isAndGroup) {\n onGroupChange(index, createAndFilter(newFilters))\n } else {\n onGroupChange(index, createOrFilter(newFilters))\n }\n }\n \n const handleFilterRemove = (filterIndex: number) => {\n const newFilters = filters.filter((_, i) => i !== filterIndex)\n \n // If no filters left, remove the entire group\n if (newFilters.length === 0) {\n onGroupRemove(index)\n return\n }\n \n // If only one filter left, use unwrapping handler if available\n if (newFilters.length === 1) {\n const newGroup = group.type === 'and' ? createAndFilter(newFilters) : createOrFilter(newFilters)\n \n if (onGroupChangeWithUnwrap) {\n // Use the unwrapping handler for removal scenarios\n onGroupChangeWithUnwrap(index, newGroup)\n } else {\n // Fallback to regular handler (for nested groups)\n onGroupChange(index, newGroup)\n }\n return\n }\n \n // Otherwise, update the group with remaining filters (preserve the group type)\n const updatedGroup = group.type === 'and' ? createAndFilter(newFilters) : createOrFilter(newFilters)\n onGroupChange(index, updatedGroup)\n }\n \n const handleNestedGroupChange = (filterIndex: number, newGroup: GroupFilter) => {\n const newFilters = [...filters]\n newFilters[filterIndex] = newGroup\n \n if (isAndGroup) {\n onGroupChange(index, createAndFilter(newFilters))\n } else {\n onGroupChange(index, createOrFilter(newFilters))\n }\n }\n \n const handleNestedGroupRemove = (filterIndex: number) => {\n handleFilterRemove(filterIndex)\n }\n \n return (\n <div className={`${indentClass} ${borderColor} border-2 ${bgColor} rounded-lg p-4 space-y-3`}>\n {/* Group header */}\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center space-x-2\">\n <button\n onClick={handleGroupTypeToggle}\n className={`px-3 py-1 rounded text-sm font-semibold ${textColor} border border-current hover:bg-white hover:bg-opacity-20 focus:outline-none focus:ring-2 focus:ring-current focus:ring-opacity-50`}\n >\n {groupType}\n </button>\n <span className=\"text-sm text-gray-600\">\n {filters.length} condition{filters.length !== 1 ? 's' : ''}\n </span>\n </div>\n \n <div className=\"flex items-center space-x-2\">\n {/* Add menu */}\n <div className=\"relative\">\n <button\n onClick={() => setShowAddMenu(!showAddMenu)}\n className=\"text-gray-500 hover:text-gray-700 focus:outline-none\"\n title=\"Add condition\"\n >\n <PlusIcon className=\"w-4 h-4\" />\n </button>\n \n {showAddMenu && (\n <div className=\"absolute right-0 mt-1 w-48 bg-white border border-gray-300 rounded-md shadow-lg z-30\">\n <button\n onClick={handleAddSimpleFilter}\n className=\"w-full text-left px-3 py-2 text-sm hover:bg-gray-100 focus:outline-none focus:bg-gray-100\"\n >\n Add Filter\n </button>\n <button\n onClick={handleAddAndGroup}\n className=\"w-full text-left px-3 py-2 text-sm hover:bg-gray-100 focus:outline-none focus:bg-gray-100\"\n >\n Add AND Group\n </button>\n <button\n onClick={handleAddOrGroup}\n className=\"w-full text-left px-3 py-2 text-sm hover:bg-gray-100 focus:outline-none focus:bg-gray-100\"\n >\n Add OR Group\n </button>\n </div>\n )}\n </div>\n \n {/* Remove group button */}\n <button\n onClick={() => onGroupRemove(index)}\n className=\"text-gray-400 hover:text-red-600 focus:outline-none\"\n title=\"Remove group\"\n >\n <XMarkIcon className=\"w-4 h-4\" />\n </button>\n </div>\n </div>\n \n {/* Group content */}\n <div className=\"space-y-3\">\n {filters.map((filter, filterIndex) => {\n if (isSimpleFilter(filter)) {\n return (\n <FilterItem\n key={filterIndex}\n filter={filter}\n index={filterIndex}\n onFilterChange={handleFilterChange}\n onFilterRemove={handleFilterRemove}\n schema={schema}\n query={query}\n />\n )\n } else if (isGroupFilter(filter)) {\n return (\n <FilterGroup\n key={filterIndex}\n group={filter}\n index={filterIndex}\n onGroupChange={handleNestedGroupChange}\n onGroupRemove={handleNestedGroupRemove}\n schema={schema}\n query={query}\n depth={depth + 1}\n />\n )\n }\n return null\n })}\n \n {/* Empty state */}\n {filters.length === 0 && (\n <div className=\"text-center py-4 text-gray-500 text-sm\">\n No conditions in this group.\n <button\n onClick={handleAddSimpleFilter}\n className=\"ml-2 text-purple-600 hover:text-purple-800 focus:outline-none underline\"\n >\n Add a filter\n </button>\n </div>\n )}\n </div>\n </div>\n )\n}\n\nexport default FilterGroup","/**\n * FilterBuilder Component\n * \n * Main component for managing all filters in the query.\n * Handles the top-level filter state and provides controls for adding new filters and groups.\n */\n\nimport React from 'react'\nimport { PlusIcon, FunnelIcon } from '@heroicons/react/24/outline'\nimport FilterItem from './FilterItem'\nimport FilterGroup from './FilterGroup'\nimport type { FilterBuilderProps } from './types'\nimport type { SimpleFilter, GroupFilter } from '../../types'\nimport { \n isSimpleFilter, \n isGroupFilter,\n isAndFilter, \n isOrFilter, \n createSimpleFilter, \n createAndFilter, \n createOrFilter,\n countFilters,\n getAllFilterableFields\n} from './utils'\n\nconst FilterBuilder: React.FC<FilterBuilderProps> = ({\n filters,\n schema,\n query,\n onFiltersChange\n}) => {\n \n \n const totalFilterCount = countFilters(filters)\n \n // Get all filterable fields from schema\n const allFilterableFields = schema ? getAllFilterableFields(schema) : []\n const hasFilterableFields = allFilterableFields.length > 0\n \n const handleAddSimpleFilter = () => {\n if (!hasFilterableFields) return\n \n // Use the first available field as default\n const defaultField = allFilterableFields[0]?.name || ''\n const newFilter = createSimpleFilter(defaultField, 'equals', [])\n \n // Smart filter grouping logic:\n // - First filter: add as simple filter\n // - Second filter: create AND group with first filter + new filter\n // - Additional filters: add to existing group (AND or OR, respecting current type)\n \n if (filters.length === 0) {\n // First filter - add as simple filter\n onFiltersChange([newFilter])\n } else if (filters.length === 1 && isSimpleFilter(filters[0])) {\n // Second filter - create AND group with existing filter + new filter\n const andGroup = createAndFilter([filters[0], newFilter])\n onFiltersChange([andGroup])\n } else if (filters.length === 1 && isAndFilter(filters[0])) {\n // Additional filter - add to existing AND group\n const existingAndGroup = filters[0]\n const updatedAndGroup = createAndFilter([...existingAndGroup.filters, newFilter])\n onFiltersChange([updatedAndGroup])\n } else if (filters.length === 1 && isOrFilter(filters[0])) {\n // Additional filter - add to existing OR group\n const existingOrGroup = filters[0]\n const updatedOrGroup = createOrFilter([...existingOrGroup.filters, newFilter])\n onFiltersChange([updatedOrGroup])\n } else {\n // Fallback: just add to the end (shouldn't happen with new logic)\n onFiltersChange([...filters, newFilter])\n }\n }\n \n \n const handleFilterChange = (index: number, newFilter: SimpleFilter) => {\n const newFilters = [...filters]\n newFilters[index] = newFilter\n onFiltersChange(newFilters)\n }\n \n const handleFilterRemove = (index: number) => {\n // Simple case: just remove the filter\n // The handleGroupChange method will automatically handle unwrapping if needed\n const newFilters = filters.filter((_, i) => i !== index)\n onFiltersChange(newFilters)\n }\n \n const handleGroupChange = (index: number, newGroup: GroupFilter) => {\n const newFilters = [...filters]\n newFilters[index] = newGroup\n onFiltersChange(newFilters)\n }\n \n const handleGroupChangeWithUnwrap = (index: number, newGroup: GroupFilter) => {\n const newFilters = [...filters]\n \n // Check if the group has been reduced to a single filter and should be unwrapped\n // This is only used during filter removal operations\n if (newGroup.filters.length === 1 && isSimpleFilter(newGroup.filters[0])) {\n // Unwrap the single filter from the group\n newFilters[index] = newGroup.filters[0]\n } else {\n newFilters[index] = newGroup\n }\n \n onFiltersChange(newFilters)\n }\n \n const handleGroupRemove = () => {\n // When removing an AND group, we should remove all filters\n onFiltersChange([])\n }\n \n const handleClearAllFilters = () => {\n onFiltersChange([])\n }\n \n return (\n <div className=\"space-y-4 bg-gray-50 rounded-lg p-4\">\n {/* Header */}\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center\">\n <FunnelIcon className=\"w-4 h-4 text-gray-500 mr-2\" />\n <h4 className=\"text-sm font-semibold text-gray-700\">\n Filters ({totalFilterCount})\n </h4>\n </div>\n \n <div className=\"flex items-center space-x-2\">\n {/* Clear all button */}\n {filters.length > 0 && (\n <button\n onClick={handleClearAllFilters}\n className=\"text-xs text-gray-500 hover:text-red-600 focus:outline-none underline\"\n >\n Clear all\n </button>\n )}\n \n {/* Add Filter button */}\n <button\n onClick={handleAddSimpleFilter}\n disabled={!hasFilterableFields}\n className={`flex items-center space-x-1 px-2 py-1 text-xs font-medium rounded focus:outline-none focus:ring-2 ${\n hasFilterableFields\n ? 'text-purple-700 bg-purple-100 border border-purple-200 hover:bg-purple-200 focus:ring-purple-500'\n : 'text-gray-400 bg-gray-100 border border-gray-200 cursor-not-allowed'\n }`}\n >\n <PlusIcon className=\"w-3 h-3\" />\n <span>Add Filter</span>\n </button>\n </div>\n </div>\n \n {/* Filters list */}\n {filters.length > 0 && (\n <div className=\"space-y-3\">\n {filters.map((filter, index) => {\n \n if (isSimpleFilter(filter)) {\n return (\n <FilterItem\n key={index}\n filter={filter}\n index={index}\n onFilterChange={handleFilterChange}\n onFilterRemove={handleFilterRemove}\n schema={schema}\n query={query}\n />\n )\n } else if (isGroupFilter(filter)) {\n return (\n <FilterGroup\n key={index}\n group={filter}\n index={index}\n onGroupChange={handleGroupChange}\n onGroupChangeWithUnwrap={handleGroupChangeWithUnwrap}\n onGroupRemove={handleGroupRemove}\n schema={schema}\n query={query}\n depth={0}\n />\n )\n }\n return null\n })}\n </div>\n )}\n \n </div>\n )\n}\n\nexport default FilterBuilder","/**\n * DateRangeSelector Component\n * \n * Individual date range selector for a specific time dimension\n * Styled to match FilterItem component exactly\n */\n\nimport React, { useState, useEffect, useRef } from 'react'\nimport { XMarkIcon, CalendarIcon, ChevronDownIcon } from '@heroicons/react/24/outline'\nimport { DATE_RANGE_OPTIONS, type DateRangeType } from './types'\nimport { convertDateRangeTypeToValue, formatDateForCube, requiresNumberInput } from './utils'\n\ninterface DateRangeSelectorProps {\n timeDimension: string\n availableTimeDimensions: string[]\n currentDateRange?: string | string[]\n onDateRangeChange: (timeDimension: string, dateRange: string | string[]) => void\n onTimeDimensionChange: (oldTimeDimension: string, newTimeDimension: string) => void\n onRemove: (timeDimension: string) => void\n}\n\nconst DateRangeSelector: React.FC<DateRangeSelectorProps> = ({\n timeDimension,\n availableTimeDimensions,\n currentDateRange,\n onDateRangeChange,\n onTimeDimensionChange,\n onRemove\n}) => {\n // Parse current date range to determine the type and custom dates\n const getCurrentRangeType = (): DateRangeType => {\n if (!currentDateRange) return 'this_month'\n \n if (Array.isArray(currentDateRange)) {\n return 'custom'\n }\n \n // Check if it's a flexible range with number (e.g., \"last 9 weeks\")\n const flexibleRangeMatch = currentDateRange.match(/^last (\\d+) (days|weeks|months|quarters|years)$/)\n if (flexibleRangeMatch) {\n const [, , unit] = flexibleRangeMatch\n const unitPlural = unit === 'days' ? 'days' : unit === 'weeks' ? 'weeks' : unit === 'months' ? 'months' : unit === 'quarters' ? 'quarters' : 'years'\n return `last_n_${unitPlural}` as DateRangeType\n }\n \n // Find matching predefined range\n for (const option of DATE_RANGE_OPTIONS) {\n if (option.value !== 'custom' && !requiresNumberInput(option.value) && convertDateRangeTypeToValue(option.value) === currentDateRange) {\n return option.value\n }\n }\n \n return 'custom'\n }\n\n const getCurrentDates = (): { startDate: string; endDate: string } => {\n if (Array.isArray(currentDateRange) && currentDateRange.length >= 1) {\n return {\n startDate: currentDateRange[0] || '',\n endDate: currentDateRange[1] || currentDateRange[0] || ''\n }\n }\n \n // Default to today for custom ranges\n const today = formatDateForCube(new Date())\n return { startDate: today, endDate: today }\n }\n\n const getCurrentNumber = (): number => {\n if (!currentDateRange || Array.isArray(currentDateRange)) return 1\n \n // Check if it's a flexible range with number (e.g., \"last 9 weeks\")\n const flexibleRangeMatch = currentDateRange.match(/^last (\\d+) (days|weeks|months|quarters|years)$/)\n if (flexibleRangeMatch) {\n return parseInt(flexibleRangeMatch[1]) || 1\n }\n \n return 1\n }\n\n const [rangeType, setRangeType] = useState<DateRangeType>(getCurrentRangeType())\n const [customDates, setCustomDates] = useState(getCurrentDates())\n const [numberValue, setNumberValue] = useState<number>(getCurrentNumber())\n const [isRangeDropdownOpen, setIsRangeDropdownOpen] = useState(false)\n const [isTimeDimensionDropdownOpen, setIsTimeDimensionDropdownOpen] = useState(false)\n const containerRef = useRef<HTMLDivElement>(null)\n \n // Close dropdowns when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(event.target as Node)) {\n setIsRangeDropdownOpen(false)\n setIsTimeDimensionDropdownOpen(false)\n }\n }\n \n document.addEventListener('mousedown', handleClickOutside)\n return () => document.removeEventListener('mousedown', handleClickOutside)\n }, [])\n\n // Close other dropdowns when opening one\n const handleTimeDimensionDropdownToggle = () => {\n setIsRangeDropdownOpen(false)\n setIsTimeDimensionDropdownOpen(!isTimeDimensionDropdownOpen)\n }\n \n const handleRangeDropdownToggle = () => {\n setIsTimeDimensionDropdownOpen(false)\n setIsRangeDropdownOpen(!isRangeDropdownOpen)\n }\n\n const handleRangeTypeChange = (newRangeType: DateRangeType) => {\n setRangeType(newRangeType)\n setIsRangeDropdownOpen(false)\n \n if (newRangeType === 'custom') {\n // For custom, use current custom dates or default to today\n if (customDates.startDate && customDates.endDate) {\n const dateRange = customDates.startDate === customDates.endDate \n ? customDates.startDate\n : [customDates.startDate, customDates.endDate]\n onDateRangeChange(timeDimension, dateRange)\n }\n } else if (requiresNumberInput(newRangeType)) {\n // For number-based ranges, use the number value\n const cubeRangeValue = convertDateRangeTypeToValue(newRangeType, numberValue)\n onDateRangeChange(timeDimension, cubeRangeValue)\n } else {\n // For predefined ranges, use the converted value\n const cubeRangeValue = convertDateRangeTypeToValue(newRangeType)\n onDateRangeChange(timeDimension, cubeRangeValue)\n }\n }\n\n const handleCustomDateChange = (field: 'startDate' | 'endDate', value: string) => {\n const newCustomDates = { ...customDates, [field]: value }\n setCustomDates(newCustomDates)\n \n if (rangeType === 'custom' && newCustomDates.startDate) {\n const dateRange = !newCustomDates.endDate || newCustomDates.startDate === newCustomDates.endDate\n ? newCustomDates.startDate\n : [newCustomDates.startDate, newCustomDates.endDate]\n onDateRangeChange(timeDimension, dateRange)\n }\n }\n\n const handleNumberChange = (value: number) => {\n setNumberValue(value)\n \n if (requiresNumberInput(rangeType)) {\n const cubeRangeValue = convertDateRangeTypeToValue(rangeType, value)\n onDateRangeChange(timeDimension, cubeRangeValue)\n }\n }\n\n const handleTimeDimensionChange = (newTimeDimension: string) => {\n setIsTimeDimensionDropdownOpen(false)\n onTimeDimensionChange(timeDimension, newTimeDimension)\n }\n\n const selectedRangeLabel = DATE_RANGE_OPTIONS.find(opt => opt.value === rangeType)?.label || 'Custom'\n\n return (\n <div ref={containerRef} className=\"bg-white border border-gray-200 rounded-lg p-3\">\n {/* Responsive layout - stacks on mobile, single row on desktop */}\n <div className=\"flex flex-col sm:flex-row sm:items-center gap-3 min-w-0\">\n {/* Row 1: Filter icon and time dimension field */}\n <div className=\"flex items-center gap-2 flex-1 min-w-0\">\n <CalendarIcon className=\"w-4 h-4 text-gray-500 flex-shrink-0\" />\n \n {/* Time dimension field selector */}\n <div className=\"relative flex-1 min-w-0\">\n <button\n onClick={handleTimeDimensionDropdownToggle}\n className=\"w-full flex items-center justify-between text-left text-sm border border-gray-300 rounded px-2 py-1 bg-white hover:bg-gray-50 focus:ring-2 focus:ring-blue-500 focus:border-blue-500 min-w-0\"\n >\n <span className=\"truncate\">{timeDimension}</span>\n <ChevronDownIcon className={`w-4 h-4 text-gray-400 flex-shrink-0 transition-transform ${\n isTimeDimensionDropdownOpen ? 'transform rotate-180' : ''\n }`} />\n </button>\n \n {isTimeDimensionDropdownOpen && (\n <div className=\"absolute z-20 left-0 right-0 mt-1 bg-white border border-gray-300 rounded-md shadow-lg max-h-60 overflow-y-auto\">\n {availableTimeDimensions.map((td) => (\n <button\n key={td}\n onClick={() => handleTimeDimensionChange(td)}\n className={`w-full text-left px-3 py-2 text-sm hover:bg-gray-100 focus:outline-none focus:bg-gray-100 ${\n td === timeDimension ? 'bg-blue-50 text-blue-700' : 'text-gray-700'\n }`}\n >\n {td}\n </button>\n ))}\n </div>\n )}\n </div>\n </div>\n\n {/* Row 2: Date range selector */}\n <div className=\"flex items-center gap-2 flex-1 sm:flex-initial min-w-0\">\n {/* Range type selector with custom dropdown */}\n <div className=\"relative flex-shrink-0\">\n <button\n onClick={handleRangeDropdownToggle}\n className=\"w-full sm:w-40 flex items-center justify-between text-left text-sm border border-gray-300 rounded px-2 py-1 bg-white hover:bg-gray-50 focus:ring-2 focus:ring-blue-500 focus:border-blue-500\"\n >\n <span className=\"truncate\">{selectedRangeLabel}</span>\n <ChevronDownIcon className={`w-4 h-4 text-gray-400 flex-shrink-0 ml-1 transition-transform ${\n isRangeDropdownOpen ? 'transform rotate-180' : ''\n }`} />\n </button>\n \n {isRangeDropdownOpen && (\n <div className=\"absolute z-20 left-0 right-0 mt-1 bg-white border border-gray-300 rounded-md shadow-lg max-h-60 overflow-y-auto\">\n {DATE_RANGE_OPTIONS.map((option) => (\n <button\n key={option.value}\n onClick={() => handleRangeTypeChange(option.value)}\n className={`w-full text-left px-3 py-2 text-sm hover:bg-gray-100 focus:outline-none focus:bg-gray-100 ${\n option.value === rangeType ? 'bg-blue-50 text-blue-700' : 'text-gray-700'\n }`}\n >\n {option.label}\n </button>\n ))}\n </div>\n )}\n </div>\n </div>\n\n {/* Row 3: Custom date inputs, number input, or remove button */}\n <div className=\"flex items-center gap-2 flex-1 min-w-0\">\n {rangeType === 'custom' ? (\n <>\n {/* Start date */}\n <div className=\"flex-1 min-w-0\">\n <input\n type=\"date\"\n value={customDates.startDate}\n onChange={(e) => handleCustomDateChange('startDate', e.target.value)}\n placeholder=\"dd/mm/yyyy\"\n className=\"w-full text-sm border border-gray-300 rounded px-2 py-1 bg-white hover:bg-gray-50 focus:ring-2 focus:ring-blue-500 focus:border-blue-500\"\n />\n </div>\n \n {/* End date (optional) */}\n <div className=\"flex-1 min-w-0\">\n <input\n type=\"date\"\n value={customDates.endDate}\n onChange={(e) => handleCustomDateChange('endDate', e.target.value)}\n placeholder=\"dd/mm/yyyy\"\n className=\"w-full text-sm border border-gray-300 rounded px-2 py-1 bg-white hover:bg-gray-50 focus:ring-2 focus:ring-blue-500 focus:border-blue-500\"\n />\n </div>\n </>\n ) : requiresNumberInput(rangeType) ? (\n <>\n {/* Number input for flexible ranges */}\n <div className=\"flex-1 min-w-0\">\n <input\n type=\"number\"\n min=\"1\"\n max=\"1000\"\n value={numberValue}\n onChange={(e) => handleNumberChange(Math.max(1, parseInt(e.target.value) || 1))}\n placeholder=\"Number\"\n className=\"w-full text-sm border border-gray-300 rounded px-2 py-1 bg-white hover:bg-gray-50 focus:ring-2 focus:ring-blue-500 focus:border-blue-500\"\n />\n </div>\n \n {/* Unit display */}\n <div className=\"flex-shrink-0 text-sm text-gray-600\">\n {rangeType.replace('last_n_', '').replace('_', ' ')}\n </div>\n </>\n ) : (\n // Empty placeholder to maintain layout consistency\n <div className=\"flex-1\"></div>\n )}\n \n {/* Remove button */}\n <button\n onClick={() => onRemove(timeDimension)}\n className=\"text-gray-400 hover:text-red-600 focus:outline-none flex-shrink-0 p-1\"\n title=\"Remove date range\"\n >\n <XMarkIcon className=\"w-4 h-4\" />\n </button>\n </div>\n </div>\n </div>\n )\n}\n\nexport default DateRangeSelector","/**\n * DateRangeFilter Component\n * \n * Container component for managing date ranges on time dimensions.\n * Shows all time dimensions with date ranges and provides controls for adding new ones.\n */\n\nimport React from 'react'\nimport { PlusIcon } from '@heroicons/react/24/outline'\nimport { CalendarIcon } from '@heroicons/react/24/solid'\nimport DateRangeSelector from './DateRangeSelector'\nimport type { DateRangeFilterProps } from './types'\nimport { getTimeDimensionsWithDateRanges } from './utils'\n\nconst DateRangeFilter: React.FC<DateRangeFilterProps> = ({\n timeDimensions,\n onDateRangeChange,\n onDateRangeRemove\n}) => {\n // Get current date ranges from time dimensions\n const currentDateRanges = getTimeDimensionsWithDateRanges({ timeDimensions })\n \n // Get time dimensions that don't have date ranges yet\n const availableTimeDimensions = timeDimensions.filter(td => !td.dateRange)\n \n // Count of time dimensions with date ranges\n const dateRangeCount = Object.keys(currentDateRanges).length\n\n const handleAddDateRange = () => {\n if (availableTimeDimensions.length === 0) return\n \n // Add date range to the first available time dimension with default \"this month\"\n const firstAvailable = availableTimeDimensions[0]\n onDateRangeChange(firstAvailable.dimension, 'this month')\n }\n\n const handleClearAllDateRanges = () => {\n // Remove all date ranges\n Object.keys(currentDateRanges).forEach(timeDimension => {\n onDateRangeRemove(timeDimension)\n })\n }\n\n // Don't render if there are no time dimensions\n if (!timeDimensions || timeDimensions.length === 0) {\n return null\n }\n\n return (\n <div className=\"space-y-4 bg-gray-50 rounded-lg p-4\">\n {/* Header */}\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center\">\n <CalendarIcon className=\"w-4 h-4 text-gray-500 mr-2\" />\n <h4 className=\"text-sm font-semibold text-gray-700\">\n Date Ranges ({dateRangeCount})\n </h4>\n </div>\n \n <div className=\"flex items-center space-x-2\">\n {/* Clear all button */}\n {dateRangeCount > 0 && (\n <button\n onClick={handleClearAllDateRanges}\n className=\"text-xs text-gray-500 hover:text-red-600 focus:outline-none underline\"\n >\n Clear all\n </button>\n )}\n \n {/* Add Date Range button */}\n <button\n onClick={handleAddDateRange}\n disabled={availableTimeDimensions.length === 0}\n className={`flex items-center space-x-1 px-2 py-1 text-xs font-medium rounded focus:outline-none focus:ring-2 ${\n availableTimeDimensions.length > 0\n ? 'text-purple-700 bg-purple-100 border border-purple-200 hover:bg-purple-200 focus:ring-purple-500'\n : 'text-gray-400 bg-gray-100 border border-gray-200 cursor-not-allowed'\n }`}\n title={availableTimeDimensions.length === 0 ? 'All time dimensions already have date ranges' : 'Add date range'}\n >\n <PlusIcon className=\"w-3 h-3\" />\n <span>Add Date Range</span>\n </button>\n </div>\n </div>\n \n {/* Date Range List */}\n {dateRangeCount > 0 && (\n <div className=\"space-y-3\">\n {timeDimensions.map(td => {\n if (!td.dateRange) return null\n \n const allTimeDimensions = timeDimensions.map(t => t.dimension)\n \n return (\n <DateRangeSelector\n key={td.dimension}\n timeDimension={td.dimension}\n availableTimeDimensions={allTimeDimensions}\n currentDateRange={td.dateRange}\n onDateRangeChange={onDateRangeChange}\n onTimeDimensionChange={(oldTd, newTd) => {\n // Remove date range from old time dimension and add it to new one\n onDateRangeRemove(oldTd)\n onDateRangeChange(newTd, td.dateRange!)\n }}\n onRemove={onDateRangeRemove}\n />\n )\n })}\n </div>\n )}\n \n </div>\n )\n}\n\nexport default DateRangeFilter","/**\n * QueryPanel Component\n * \n * Displays the current query being built, with sections for measures, dimensions, and time dimensions.\n * Includes validation status, JSON preview, and action buttons.\n */\n\nimport React, { useState, useEffect } from 'react'\nimport { XMarkIcon, CheckCircleIcon, ExclamationCircleIcon, TrashIcon, ClipboardDocumentIcon, CogIcon, FunnelIcon, SparklesIcon, ChevronUpIcon, ChevronDownIcon, ChevronUpDownIcon } from '@heroicons/react/24/outline'\nimport { ChartBarIcon, TagIcon, CalendarIcon, PlayIcon, CheckIcon } from '@heroicons/react/24/solid'\nimport FilterBuilder from './FilterBuilder'\nimport DateRangeFilter from './DateRangeFilter'\nimport type { QueryPanelProps } from './types'\nimport { TIME_GRANULARITIES } from './types'\nimport { hasQueryContent, getSelectedFieldsCount, cleanQueryForServer, hasTimeDimensions, getFieldTitle, getSortDirection, getSortTooltip, getNextSortDirection } from './utils'\n\nconst QueryPanel: React.FC<QueryPanelProps> = ({\n query,\n schema,\n validationStatus,\n validationError,\n validationSql,\n onValidate,\n onExecute,\n onRemoveField,\n onTimeDimensionGranularityChange,\n onFiltersChange,\n onDateRangeChange,\n onDateRangeRemove,\n onOrderChange,\n onClearQuery,\n showSettings,\n onSettingsClick,\n onAIAssistantClick\n}) => {\n const [showJsonPreview, setShowJsonPreview] = useState(false)\n const [showSqlPreview, setShowSqlPreview] = useState(false)\n\n // Trigger Prism highlighting when preview content changes\n useEffect(() => {\n if ((showJsonPreview || showSqlPreview) && typeof window !== 'undefined' && (window as any).Prism) {\n // Use setTimeout to ensure DOM is updated before highlighting\n setTimeout(() => {\n try {\n ;(window as any).Prism.highlightAll()\n } catch (error) {\n // Silently fail if Prism is not available or encounters an error\n console.debug('Prism highlighting failed:', error)\n }\n }, 0)\n }\n }, [showJsonPreview, showSqlPreview, query, validationSql])\n\n const hasContent = hasQueryContent(query)\n const selectedCount = getSelectedFieldsCount(query)\n \n const handleCopyQuery = async () => {\n const cleanedQuery = cleanQueryForServer(query)\n try {\n await navigator.clipboard.writeText(JSON.stringify(cleanedQuery, null, 2))\n // You could add a toast notification here if desired\n } catch (error) {\n console.error('Failed to copy query:', error)\n // Fallback for older browsers\n const textArea = document.createElement('textarea')\n textArea.value = JSON.stringify(cleanedQuery, null, 2)\n document.body.appendChild(textArea)\n textArea.select()\n document.execCommand('copy')\n document.body.removeChild(textArea)\n }\n }\n\n // Helper function to check if a field has filters applied\n const hasFiltersApplied = (fieldName: string, fieldType: 'measures' | 'dimensions' | 'timeDimensions'): boolean => {\n if (fieldType === 'timeDimensions') {\n // Check if time dimension has a date range\n return Boolean(query.timeDimensions?.some(td => td.dimension === fieldName && td.dateRange))\n } else {\n // Check if field has regular filters applied\n const currentFilters = query.filters || []\n \n const hasFieldInFilters = (filters: any[]): boolean => {\n return filters.some(filter => {\n if ('member' in filter) {\n // Simple filter\n return filter.member === fieldName\n } else if ('type' in filter && 'filters' in filter) {\n // Group filter - check recursively\n return hasFieldInFilters(filter.filters)\n }\n return false\n })\n }\n \n return hasFieldInFilters(currentFilters)\n }\n }\n\n const handleAddFilterFromField = (fieldName: string, fieldType: 'measures' | 'dimensions' | 'timeDimensions') => {\n if (fieldType === 'timeDimensions') {\n // For time dimensions, add a date range instead of a regular filter\n onDateRangeChange(fieldName, 'this month')\n } else {\n // For measures and dimensions, add a regular filter\n // Get current filters and add a new one\n const currentFilters = query.filters || []\n const newFilter = {\n member: fieldName,\n operator: 'equals' as const,\n values: []\n }\n \n // Use the same smart grouping logic as FilterBuilder\n if (currentFilters.length === 0) {\n onFiltersChange([newFilter])\n } else if (currentFilters.length === 1 && 'member' in currentFilters[0]) {\n // Create AND group with existing filter + new filter\n const andGroup = {\n type: 'and' as const,\n filters: [currentFilters[0], newFilter]\n }\n onFiltersChange([andGroup])\n } else if (currentFilters.length === 1 && 'type' in currentFilters[0] && currentFilters[0].type === 'and') {\n // Add to existing AND group\n const existingAndGroup = currentFilters[0]\n const updatedAndGroup = {\n type: 'and' as const,\n filters: [...existingAndGroup.filters, newFilter]\n }\n onFiltersChange([updatedAndGroup])\n } else if (currentFilters.length === 1 && 'type' in currentFilters[0] && currentFilters[0].type === 'or') {\n // Add to existing OR group\n const existingOrGroup = currentFilters[0]\n const updatedOrGroup = {\n type: 'or' as const,\n filters: [...existingOrGroup.filters, newFilter]\n }\n onFiltersChange([updatedOrGroup])\n } else {\n // Fallback: just add to the end\n onFiltersChange([...currentFilters, newFilter])\n }\n }\n }\n\n // Sorting helper functions\n const getSortIcon = (direction: 'asc' | 'desc' | null) => {\n switch (direction) {\n case 'asc':\n return <ChevronUpIcon className={`w-4 h-4 ${direction ? 'stroke-[3]' : ''}`} />\n case 'desc':\n return <ChevronDownIcon className={`w-4 h-4 ${direction ? 'stroke-[3]' : ''}`} />\n default:\n return <ChevronUpDownIcon className=\"w-4 h-4\" />\n }\n }\n\n const handleToggleSort = (fieldName: string) => {\n const current = getSortDirection(fieldName, query.order)\n const next = getNextSortDirection(current)\n onOrderChange(fieldName, next)\n }\n\n const getSortButtonClasses = (fieldName: string, fieldType: 'measures' | 'dimensions' | 'timeDimensions') => {\n const sortDirection = getSortDirection(fieldName, query.order)\n const baseClasses = 'focus:outline-none flex-shrink-0 p-1 transition-colors'\n \n if (sortDirection) {\n // Active sort - use field type colors\n switch (fieldType) {\n case 'measures':\n return `${baseClasses} text-amber-800 hover:text-amber-900`\n case 'dimensions':\n return `${baseClasses} text-green-800 hover:text-green-900`\n case 'timeDimensions':\n return `${baseClasses} text-blue-800 hover:text-blue-900`\n default:\n return `${baseClasses} text-blue-800 hover:text-blue-900`\n }\n } else {\n // No sort - gray\n return `${baseClasses} text-gray-400 hover:text-gray-600`\n }\n }\n\n const RemovableChip: React.FC<{ \n label: string\n fieldName: string\n fieldType: 'measures' | 'dimensions' | 'timeDimensions'\n icon: React.ReactNode\n }> = ({ fieldName, fieldType, icon }) => {\n const getChipClasses = () => {\n switch (fieldType) {\n case 'measures':\n return 'bg-amber-100 text-amber-800 border-amber-200'\n case 'dimensions':\n return 'bg-green-100 text-green-800 border-green-200'\n case 'timeDimensions':\n return 'bg-blue-100 text-blue-800 border-blue-200'\n default:\n return 'bg-blue-100 text-blue-800 border-blue-200'\n }\n }\n\n return (\n <div className={`inline-flex items-center text-sm px-3 py-2 rounded-lg border w-full ${getChipClasses()}`}>\n <div className=\"mr-2 flex-shrink-0\">\n {icon}\n </div>\n <span className=\"flex-1 flex flex-col min-w-0\">\n <span className=\"text-xs font-medium truncate\">{getFieldTitle(fieldName, schema)}</span>\n <span className=\"text-[10px] text-gray-500 truncate\">{fieldName}</span>\n </span>\n <div className=\"flex items-center gap-2 ml-2\">\n {/* Filter and Sort buttons - stacked vertically */}\n <div className=\"flex flex-col items-center\">\n {/* Filter button */}\n {(() => {\n const hasFilters = hasFiltersApplied(fieldName, fieldType)\n const getActiveColorClasses = () => {\n switch (fieldType) {\n case 'measures':\n return 'text-amber-800 hover:text-amber-900'\n case 'dimensions':\n return 'text-green-800 hover:text-green-900'\n case 'timeDimensions':\n return 'text-blue-800 hover:text-blue-900'\n default:\n return 'text-blue-800 hover:text-blue-900'\n }\n }\n \n return (\n <button\n onClick={() => handleAddFilterFromField(fieldName, fieldType)}\n className={`focus:outline-none flex-shrink-0 p-0.5 transition-colors ${\n hasFilters \n ? getActiveColorClasses()\n : 'text-gray-400 hover:text-gray-600'\n }`}\n title={fieldType === 'timeDimensions' ? 'Add date range' : 'Add filter'}\n >\n <FunnelIcon className={`w-4 h-4 ${hasFilters ? 'stroke-[3]' : ''}`} />\n </button>\n )\n })()}\n \n {/* Sort button */}\n <button\n onClick={() => handleToggleSort(fieldName)}\n className={`focus:outline-none flex-shrink-0 p-0.5 transition-colors ${getSortButtonClasses(fieldName, fieldType).replace('p-1', 'p-0.5')}`}\n title={getSortTooltip(getSortDirection(fieldName, query.order))}\n >\n {getSortIcon(getSortDirection(fieldName, query.order))}\n </button>\n </div>\n \n {/* Remove button */}\n <button\n onClick={() => onRemoveField(fieldName, fieldType)}\n className=\"text-gray-600 hover:text-red-600 focus:outline-none flex-shrink-0\"\n >\n <XMarkIcon className=\"w-4 h-4\" />\n </button>\n </div>\n </div>\n )\n }\n\n const TimeDimensionChip: React.FC<{ \n timeDimension: { dimension: string; granularity?: string }\n label: string\n }> = ({ timeDimension }) => (\n <div className=\"bg-blue-100 text-blue-800 text-sm px-3 py-2 rounded-lg border border-blue-200 w-full\">\n {/* Top row with icon, label, filter button, sort button, and remove button */}\n <div className=\"flex items-center mb-1\">\n <div className=\"mr-2\">\n <CalendarIcon className=\"w-4 h-4\" />\n </div>\n <span className=\"flex-1 flex flex-col min-w-0\">\n <span className=\"text-xs font-medium truncate\">{getFieldTitle(timeDimension.dimension, schema)}</span>\n <span className=\"text-[10px] text-gray-500 truncate\">{timeDimension.dimension}</span>\n </span>\n <div className=\"flex items-center gap-2 ml-2\">\n {/* Filter and Sort buttons - stacked vertically */}\n <div className=\"flex flex-col items-center\">\n {/* Filter button */}\n {(() => {\n const hasDateRange = hasFiltersApplied(timeDimension.dimension, 'timeDimensions')\n return (\n <button\n onClick={() => handleAddFilterFromField(timeDimension.dimension, 'timeDimensions')}\n className={`focus:outline-none flex-shrink-0 p-0.5 transition-colors ${\n hasDateRange \n ? 'text-blue-800 hover:text-blue-900' \n : 'text-gray-400 hover:text-gray-600'\n }`}\n title=\"Add date range\"\n >\n <FunnelIcon className={`w-4 h-4 ${hasDateRange ? 'stroke-[3]' : ''}`} />\n </button>\n )\n })()}\n \n {/* Sort button */}\n <button\n onClick={() => handleToggleSort(timeDimension.dimension)}\n className={`focus:outline-none flex-shrink-0 p-0.5 transition-colors ${getSortButtonClasses(timeDimension.dimension, 'timeDimensions').replace('p-1', 'p-0.5')}`}\n title={getSortTooltip(getSortDirection(timeDimension.dimension, query.order))}\n >\n {getSortIcon(getSortDirection(timeDimension.dimension, query.order))}\n </button>\n </div>\n \n {/* Remove button */}\n <button\n onClick={() => onRemoveField(timeDimension.dimension, 'timeDimensions')}\n className=\"text-gray-600 hover:text-red-600 focus:outline-none\"\n >\n <XMarkIcon className=\"w-4 h-4\" />\n </button>\n </div>\n </div>\n {/* Bottom row with granularity dropdown */}\n <div className=\"ml-6 flex items-center\">\n <span className=\"text-xs text-blue-700 mr-2\">Granularity:</span>\n <select\n value={timeDimension.granularity || 'month'}\n onChange={(e) => onTimeDimensionGranularityChange(timeDimension.dimension, e.target.value)}\n className=\"bg-blue-100 border-none text-blue-800 text-xs rounded focus:ring-2 focus:ring-blue-500 flex-1\"\n onClick={(e) => e.stopPropagation()}\n >\n {TIME_GRANULARITIES.map(granularity => (\n <option key={granularity.value} value={granularity.value}>\n {granularity.label}\n </option>\n ))}\n </select>\n </div>\n </div>\n )\n\n const ValidationStatusIcon = () => {\n switch (validationStatus) {\n case 'validating':\n return (\n <div className=\"animate-spin rounded-full h-5 w-5 border-b-2 border-blue-600\"></div>\n )\n case 'valid':\n return <CheckCircleIcon className=\"w-5 h-5 text-green-600\" />\n case 'invalid':\n return <ExclamationCircleIcon className=\"w-5 h-5 text-red-600\" />\n default:\n return null\n }\n }\n\n return (\n <div className=\"flex flex-col bg-white border border-gray-200 rounded-lg\">\n {/* Header */}\n <div className=\"p-3 sm:p-4 border-b border-gray-200\">\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"flex items-center gap-1 sm:gap-2 min-w-0\">\n <h3 className=\"text-sm sm:text-lg font-semibold text-gray-900 truncate\">Query Builder</h3>\n {onAIAssistantClick && (\n <button\n onClick={onAIAssistantClick}\n className=\"flex items-center gap-1 px-3 py-2 text-xs font-medium text-purple-700 bg-purple-50 border border-purple-200 rounded-lg hover:bg-purple-100 focus:outline-none focus:ring-2 focus:ring-purple-500 transition-all duration-200 flex-shrink-0\"\n title=\"AI Assistant - Generate queries with AI\"\n >\n <SparklesIcon className=\"w-3 h-3 sm:w-4 sm:h-4\" />\n <span>AI Assistant</span>\n </button>\n )}\n </div>\n <div className=\"flex items-center gap-1 flex-shrink-0\">\n {hasContent && (\n <>\n <span className=\"hidden lg:inline text-xs text-gray-500 mr-1\">\n {selectedCount} field{selectedCount !== 1 ? 's' : ''} selected\n </span>\n <button\n onClick={handleCopyQuery}\n className=\"flex items-center gap-1 px-3 py-2 text-xs font-medium text-purple-700 bg-purple-100 border border-purple-200 rounded hover:bg-purple-200 focus:outline-none focus:ring-2 focus:ring-purple-500\"\n title=\"Copy query to clipboard\"\n >\n <ClipboardDocumentIcon className=\"w-3 h-3\" />\n <span className=\"hidden sm:inline\">Copy Query</span>\n </button>\n {onClearQuery && (\n <button\n onClick={onClearQuery}\n className=\"text-gray-400 hover:text-red-600 focus:outline-none p-2\"\n title=\"Clear all fields\"\n >\n <TrashIcon className=\"w-3 h-3 sm:w-4 sm:h-4\" />\n </button>\n )}\n </>\n )}\n {showSettings && onSettingsClick && (\n <button\n onClick={onSettingsClick}\n className=\"text-gray-400 hover:text-gray-600 focus:outline-none p-2\"\n title=\"API Configuration\"\n >\n <CogIcon className=\"w-3 h-3 sm:w-4 sm:h-4\" />\n </button>\n )}\n <ValidationStatusIcon />\n </div>\n </div>\n </div>\n\n {/* Content */}\n <div className=\"p-4\">\n {!hasContent ? (\n <div className=\"py-8 flex items-center justify-center text-gray-500\">\n <div className=\"text-center\">\n <ChartBarIcon className=\"w-12 h-12 mx-auto text-gray-300 mb-3\" />\n <div className=\"text-sm font-semibold mb-1\">No fields selected</div>\n <div className=\"text-xs\">Select measures, dimensions, or time dimensions from the schema explorer</div>\n </div>\n </div>\n ) : (\n <div className=\"space-y-6\">\n {/* Responsive Layout Grid */}\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\n {/* Dimensions Column */}\n <div className=\"min-h-24\">\n <h4 className=\"text-sm font-semibold text-green-800 mb-3 flex items-center\">\n <TagIcon className=\"w-4 h-4 mr-2\" />\n Dimensions ({(query.dimensions || []).length})\n </h4>\n <div className=\"flex flex-col gap-2\">\n {(query.dimensions || []).map(dimension => (\n <RemovableChip\n key={dimension}\n label={dimension}\n fieldName={dimension}\n fieldType=\"dimensions\"\n icon={<TagIcon className=\"w-4 h-4\" />}\n />\n ))}\n </div>\n </div>\n\n {/* Time Dimensions Column */}\n <div className=\"min-h-24\">\n <h4 className=\"text-sm font-semibold text-blue-800 mb-3 flex items-center\">\n <CalendarIcon className=\"w-4 h-4 mr-2\" />\n Time Dimensions ({(query.timeDimensions || []).length})\n </h4>\n <div className=\"flex flex-col gap-2\">\n {(query.timeDimensions || []).map(timeDimension => (\n <TimeDimensionChip\n key={timeDimension.dimension}\n timeDimension={timeDimension}\n label={timeDimension.dimension}\n />\n ))}\n </div>\n </div>\n\n {/* Measures Column */}\n <div className=\"min-h-24\">\n <h4 className=\"text-sm font-semibold text-amber-800 mb-3 flex items-center\">\n <ChartBarIcon className=\"w-4 h-4 mr-2\" />\n Measures ({(query.measures || []).length})\n </h4>\n <div className=\"flex flex-col gap-2\">\n {(query.measures || []).map(measure => (\n <RemovableChip\n key={measure}\n label={measure}\n fieldName={measure}\n fieldType=\"measures\"\n icon={<ChartBarIcon className=\"w-4 h-4\" />}\n />\n ))}\n </div>\n </div>\n </div>\n\n {/* Date Range Section */}\n {hasTimeDimensions(query) && (\n <div className=\"mt-6\">\n <DateRangeFilter\n timeDimensions={query.timeDimensions || []}\n onDateRangeChange={onDateRangeChange}\n onDateRangeRemove={onDateRangeRemove}\n />\n </div>\n )}\n\n {/* Filters Section */}\n <div className=\"mt-6\">\n <FilterBuilder\n filters={query.filters || []}\n schema={schema}\n query={query}\n onFiltersChange={onFiltersChange}\n />\n </div>\n\n {/* Validation Error */}\n {validationError && (\n <div className=\"bg-red-50 border border-red-200 rounded-lg p-4\">\n <div className=\"flex items-start\">\n <ExclamationCircleIcon className=\"w-5 h-5 text-red-600 mr-2 mt-0.5\" />\n <div>\n <h5 className=\"text-sm font-semibold text-red-800\">Validation Error</h5>\n <p className=\"text-sm text-red-700 mt-1\">{validationError}</p>\n </div>\n </div>\n </div>\n )}\n\n {/* Preview Toggles */}\n <div className=\"space-y-3\">\n <div className=\"flex space-x-4\">\n <button\n onClick={() => {\n const newJsonState = !showJsonPreview\n setShowJsonPreview(newJsonState)\n if (newJsonState) setShowSqlPreview(false) // Hide SQL when showing JSON\n }}\n className=\"text-sm text-gray-600 hover:text-gray-800 focus:outline-none focus:underline\"\n >\n {showJsonPreview ? 'Hide' : 'Show'} JSON Query\n </button>\n {validationSql && (\n <button\n onClick={() => {\n const newSqlState = !showSqlPreview\n setShowSqlPreview(newSqlState)\n if (newSqlState) setShowJsonPreview(false) // Hide JSON when showing SQL\n }}\n className=\"text-sm text-gray-600 hover:text-gray-800 focus:outline-none focus:underline\"\n >\n {showSqlPreview ? 'Hide' : 'Show'} SQL Generated\n </button>\n )}\n </div>\n\n {showJsonPreview && (\n <div className=\"bg-gray-50 border border-gray-200 rounded-lg p-4\">\n <div className=\"text-xs font-semibold text-gray-700 mb-2\">JSON Query:</div>\n <pre className=\"text-gray-700 overflow-x-auto font-mono\" style={{ fontSize: '12px', lineHeight: '1.4' }}>\n <code className=\"language-json\">{JSON.stringify(cleanQueryForServer(query), null, 2)}</code>\n </pre>\n </div>\n )}\n\n {showSqlPreview && validationSql && (\n <div className=\"bg-gray-50 border border-gray-200 rounded-lg p-4\">\n <div className=\"text-xs font-semibold text-gray-700 mb-2\">Generated SQL:</div>\n <pre className=\"text-gray-700 overflow-x-auto whitespace-pre-wrap font-mono\" style={{ fontSize: '12px', lineHeight: '1.4' }}>\n <code className=\"language-sql\">{validationSql.sql.join(';\\n\\n')}</code>\n </pre>\n {validationSql.params && validationSql.params.length > 0 && (\n <>\n <div className=\"text-xs font-semibold text-gray-700 mb-2 mt-4\">Parameters:</div>\n <pre className=\"text-gray-700 overflow-x-auto font-mono\" style={{ fontSize: '12px', lineHeight: '1.4' }}>\n <code className=\"language-json\">{JSON.stringify(validationSql.params, null, 2)}</code>\n </pre>\n </>\n )}\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n\n {/* Actions */}\n {(hasContent || validationStatus === 'valid' || validationStatus === 'invalid') && (\n <div className=\"border-t border-gray-200 p-4\">\n <div className=\"flex space-x-3\">\n <button\n onClick={onValidate}\n disabled={validationStatus === 'validating'}\n className={`flex-1 flex items-center justify-center px-4 py-2 text-sm font-medium rounded-md transition-colors ${\n validationStatus === 'validating'\n ? 'bg-gray-100 text-gray-400 cursor-not-allowed'\n : validationStatus === 'valid'\n ? 'bg-green-100 text-green-800 border border-green-200 hover:bg-green-200'\n : validationStatus === 'invalid'\n ? 'bg-red-100 text-red-800 border border-red-200 hover:bg-red-200'\n : 'bg-purple-100 text-purple-800 border border-purple-200 hover:bg-purple-200'\n }`}\n >\n {validationStatus === 'validating' ? (\n <>\n <div className=\"animate-spin rounded-full h-4 w-4 border-b-2 border-current mr-2\"></div>\n Validating...\n </>\n ) : validationStatus === 'valid' ? (\n <>\n <CheckIcon className=\"w-4 h-4 mr-2\" />\n Re-validate Query\n </>\n ) : validationStatus === 'invalid' ? (\n <>\n <ExclamationCircleIcon className=\"w-4 h-4 mr-2\" />\n Validate Again\n </>\n ) : (\n <>\n <CheckIcon className=\"w-4 h-4 mr-2\" />\n Validate Query\n </>\n )}\n </button>\n\n <button\n onClick={onExecute}\n disabled={validationStatus !== 'valid'}\n className={`flex-1 flex items-center justify-center px-4 py-2 text-sm font-medium rounded-md transition-colors ${\n validationStatus !== 'valid'\n ? 'bg-gray-100 text-gray-400 cursor-not-allowed border border-gray-200'\n : 'bg-green-600 text-white hover:bg-green-700 focus:ring-2 focus:ring-green-500 border border-green-700'\n }`}\n >\n <PlayIcon className=\"w-4 h-4 mr-2\" />\n Run Query\n </button>\n </div>\n </div>\n )}\n </div>\n )\n}\n\nexport default QueryPanel","/**\n * ResultsPanel Component\n * \n * Displays query execution results, loading states, and errors.\n * Reuses the existing DataTable component for result display.\n */\n\nimport React from 'react'\nimport { ExclamationCircleIcon, ClockIcon, CheckCircleIcon, ExclamationTriangleIcon } from '@heroicons/react/24/outline'\nimport { DataTable } from '../../components/charts'\nimport type { ResultsPanelProps } from './types'\n\nconst ResultsPanel: React.FC<ResultsPanelProps> = ({\n executionStatus,\n executionResults,\n executionError,\n query: _query,\n displayLimit = 10,\n onDisplayLimitChange,\n totalRowCount,\n totalRowCountStatus\n}) => {\n\n const LoadingState = () => (\n <div className=\"h-full flex items-center justify-center\">\n <div className=\"text-center\">\n <div className=\"animate-spin rounded-full h-12 w-12 border-b-2 border-blue-600 mx-auto mb-4\"></div>\n <div className=\"text-sm font-semibold text-gray-700 mb-1\">Executing Query...</div>\n <div className=\"text-xs text-gray-500\">Running your query against the cube API</div>\n </div>\n </div>\n )\n\n const ErrorState = () => (\n <div className=\"h-full flex items-center justify-center p-4\">\n <div className=\"text-center max-w-md\">\n <ExclamationCircleIcon className=\"w-12 h-12 mx-auto text-red-500 mb-4\" />\n <div className=\"text-sm font-semibold text-gray-900 mb-2\">Query Execution Failed</div>\n <div className=\"text-sm text-gray-600 mb-4\">\n There was an error executing your query. Please check the query and try again.\n </div>\n {executionError && (\n <div className=\"bg-red-50 border border-red-200 rounded-lg p-3 text-left\">\n <div className=\"text-xs font-mono text-red-800 break-words\">\n {executionError}\n </div>\n </div>\n )}\n </div>\n </div>\n )\n\n const EmptyState = () => (\n <div className=\"h-full flex items-center justify-center\">\n <div className=\"text-center mb-16\">\n <ClockIcon className=\"w-12 h-12 mx-auto text-gray-300 mb-3\" />\n <div className=\"text-sm font-semibold text-gray-700 mb-1\">No Results Yet</div>\n <div className=\"text-xs text-gray-500\">Build and run a query to see results here</div>\n </div>\n </div>\n )\n\n const SuccessState = () => {\n if (!executionResults || executionResults.length === 0) {\n return (\n <div className=\"h-full flex items-center justify-center\">\n <div className=\"text-center\">\n <CheckCircleIcon className=\"w-12 h-12 mx-auto text-green-500 mb-3\" />\n <div className=\"text-sm font-semibold text-gray-700 mb-1\">Query Successful</div>\n <div className=\"text-xs text-gray-500\">No data returned from the query</div>\n </div>\n </div>\n )\n }\n\n return (\n <div className=\"h-full flex flex-col\">\n {/* Results Header */}\n <div className=\"p-4 border-b border-gray-200 bg-gray-50\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center\">\n <CheckCircleIcon className=\"w-5 h-5 text-green-500 mr-2\" />\n <div className=\"flex flex-col\">\n <span className=\"text-sm font-semibold text-gray-700\">\n Query Results ({executionResults.length} row{executionResults.length !== 1 ? 's' : ''} shown)\n </span>\n {totalRowCountStatus === 'success' && totalRowCount !== null && totalRowCount !== undefined && (\n <span className=\"text-xs text-gray-500\">\n Total: {totalRowCount.toLocaleString()} row{totalRowCount !== 1 ? 's' : ''}\n </span>\n )}\n {totalRowCountStatus === 'loading' && (\n <span className=\"text-xs text-gray-500\">\n Counting total rows...\n </span>\n )}\n </div>\n </div>\n {onDisplayLimitChange && (\n <div className=\"flex items-center gap-2\">\n <label className=\"text-xs text-gray-600\">Show:</label>\n <select\n value={displayLimit}\n onChange={(e) => onDisplayLimitChange(Number(e.target.value))}\n className=\"text-xs border border-gray-300 rounded px-2 py-1 focus:outline-none focus:ring-1 focus:ring-blue-500\"\n >\n <option value={10}>10 rows</option>\n <option value={50}>50 rows</option>\n <option value={100}>100 rows</option>\n </select>\n </div>\n )}\n </div>\n \n {/* Performance Warning */}\n {totalRowCountStatus === 'success' && totalRowCount !== null && totalRowCount !== undefined && totalRowCount > 500 && (\n <div className=\"mt-3 bg-yellow-50 border border-yellow-200 rounded-lg p-3 flex items-start\">\n <ExclamationTriangleIcon className=\"w-5 h-5 text-yellow-600 mr-2 flex-shrink-0 mt-0.5\" />\n <div className=\"text-sm text-yellow-800\">\n <span className=\"font-semibold\">Performance Warning:</span> This query returns {totalRowCount.toLocaleString()} rows, \n which may impact performance. Consider adding filters to reduce the dataset size.\n </div>\n </div>\n )}\n </div>\n\n {/* Results Table */}\n <div className=\"flex-1 min-h-0\">\n <DataTable \n data={executionResults} \n height=\"100%\" \n />\n </div>\n </div>\n )\n }\n\n return (\n <div className=\"flex-1 flex flex-col bg-white border border-gray-200 rounded-lg min-h-0\">\n {/* Header */}\n <div className=\"px-4 py-3 border-b border-gray-200 bg-gray-50\">\n <h3 className=\"text-sm font-semibold text-gray-900\">Query Results</h3>\n </div>\n\n {/* Content */}\n <div className=\"flex-1 min-h-0\">\n {executionStatus === 'loading' && <LoadingState />}\n {executionStatus === 'error' && <ErrorState />}\n {executionStatus === 'success' && <SuccessState />}\n {executionStatus === 'idle' && <EmptyState />}\n </div>\n </div>\n )\n}\n\nexport default ResultsPanel","/**\n * SetupPanel Component\n * \n * Provides configuration options for API endpoint and authentication.\n * Only shown in standalone QueryBuilder mode, not in modal contexts.\n */\n\nimport React, { useState } from 'react'\nimport { ChevronDownIcon, ChevronUpIcon, CogIcon, ArrowPathIcon } from '@heroicons/react/24/outline'\nimport type { ApiConfig } from './types'\n\ninterface SetupPanelProps {\n isOpen: boolean\n onToggle: () => void\n config: ApiConfig\n onConfigChange: (config: ApiConfig) => void\n onReset: () => void\n}\n\nconst SetupPanel: React.FC<SetupPanelProps> = ({\n isOpen,\n onToggle,\n config,\n onConfigChange,\n onReset\n}) => {\n const [localConfig, setLocalConfig] = useState<ApiConfig>(config)\n\n const handleApply = () => {\n onConfigChange(localConfig)\n }\n\n const handleReset = () => {\n const defaultConfig = {\n baseApiUrl: '/cubejs-api/v1',\n apiToken: ''\n }\n setLocalConfig(defaultConfig)\n onConfigChange(defaultConfig)\n onReset()\n }\n\n const handleInputChange = (field: keyof ApiConfig, value: string) => {\n setLocalConfig(prev => ({\n ...prev,\n [field]: value\n }))\n }\n\n const hasChanges = JSON.stringify(localConfig) !== JSON.stringify(config)\n const isUsingDefaults = config.baseApiUrl === '/cubejs-api/v1' && config.apiToken === ''\n\n return (\n <div className=\"bg-white border border-gray-200 rounded-lg mb-4\">\n {/* Header */}\n <button\n onClick={onToggle}\n className=\"w-full px-4 py-3 flex items-center justify-between text-left bg-gray-50 rounded-t-lg hover:bg-gray-100 focus:outline-none focus:ring-2 focus:ring-blue-500\"\n >\n <div className=\"flex items-center space-x-2\">\n <CogIcon className=\"w-5 h-5 text-gray-600\" />\n <h3 className=\"text-sm font-semibold text-gray-900\">API Configuration</h3>\n {!isUsingDefaults && (\n <span className=\"inline-flex items-center px-2 py-0.5 rounded text-xs font-medium bg-blue-100 text-blue-800\">\n Custom\n </span>\n )}\n </div>\n {isOpen ? (\n <ChevronUpIcon className=\"w-4 h-4 text-gray-500\" />\n ) : (\n <ChevronDownIcon className=\"w-4 h-4 text-gray-500\" />\n )}\n </button>\n\n {/* Expandable Content */}\n {isOpen && (\n <div className=\"p-4 border-t border-gray-200\">\n <div className=\"space-y-4\">\n {/* Base API URL */}\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">\n Base API URL\n </label>\n <input\n type=\"text\"\n value={localConfig.baseApiUrl}\n onChange={(e) => handleInputChange('baseApiUrl', e.target.value)}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 text-sm\"\n placeholder=\"/cubejs-api/v1\"\n />\n <p className=\"text-xs text-gray-500 mt-1\">\n The base URL for the Cube.js API endpoints\n </p>\n </div>\n\n {/* API Token */}\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">\n API Token\n </label>\n <input\n type=\"password\"\n value={localConfig.apiToken}\n onChange={(e) => handleInputChange('apiToken', e.target.value)}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 text-sm\"\n placeholder=\"Leave empty for no authentication\"\n />\n <p className=\"text-xs text-gray-500 mt-1\">\n Optional bearer token for API authentication\n </p>\n </div>\n\n {/* Status Indicator */}\n <div className=\"bg-gray-50 border border-gray-200 rounded-md p-3\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h4 className=\"text-xs font-medium text-gray-700\">Current Configuration</h4>\n <p className=\"text-xs text-gray-600 mt-1\">\n URL: <span className=\"font-mono\">{config.baseApiUrl}</span>\n </p>\n <p className=\"text-xs text-gray-600\">\n Token: {config.apiToken ? (\n <span className=\"text-green-600\">Configured</span>\n ) : (\n <span className=\"text-gray-500\">Not set</span>\n )}\n </p>\n </div>\n {!isUsingDefaults && (\n <button\n onClick={handleReset}\n className=\"flex items-center space-x-1 px-2 py-1 text-xs font-medium text-gray-600 bg-white border border-gray-300 rounded hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-blue-500\"\n title=\"Reset to defaults\"\n >\n <ArrowPathIcon className=\"w-3 h-3\" />\n <span>Reset</span>\n </button>\n )}\n </div>\n </div>\n\n {/* Action Buttons */}\n {hasChanges && (\n <div className=\"flex justify-end space-x-2 pt-2 border-t border-gray-200\">\n <button\n onClick={() => setLocalConfig(config)}\n className=\"px-3 py-1.5 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-md hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-blue-500\"\n >\n Cancel\n </button>\n <button\n onClick={handleApply}\n className=\"px-3 py-1.5 text-sm font-medium text-white bg-blue-600 border border-transparent rounded-md hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-blue-500\"\n >\n Apply Changes\n </button>\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n )\n}\n\nexport default SetupPanel","/**\n * Constants for AI Assistant\n */\n\nexport const AI_PROXY_BASE_URL = '/api/ai'\nexport const GEMINI_MODEL = 'gemini-2.0-flash'\n\nexport const DEFAULT_SYSTEM_PROMPT_TEMPLATE = `You are a SQL query builder assistant for a semantic layer using Cube.js format.\n\nAvailable cube schema (JSON):\n{CUBE_SCHEMA}\n\nA valid Cube schema can contain things such as below (this is only an example of possible options):\n\n{\n \"measures\": [\"stories.count\"],\n \"dimensions\": [\"stories.category\"],\n \"filters\": [\n {\n \"member\": \"stories.isDraft\",\n \"operator\": \"equals\",\n \"values\": [\"No\"]\n }\n ],\n \"timeDimensions\": [\n {\n \"dimension\": \"stories.time\",\n \"dateRange\": [\"2015-01-01\", \"2015-12-31\"],\n \"granularity\": \"month\"\n }\n ],\n \"limit\": 100,\n \"offset\": 50,\n \"order\": {\n \"stories.time\": \"asc\",\n \"stories.count\": \"desc\"\n }\n}\n\nUser request: {USER_PROMPT}\n\nCRITICAL: You MUST only use field names that exist in the schema above. Do NOT create or invent field names.\n\nGenerate a JSON query object with this structure:\n{\n \"measures\": [\"CubeName.measureName\"],\n \"dimensions\": [\"CubeName.dimensionName\"], \n \"timeDimensions\": [{\n \"dimension\": \"CubeName.timeDimensionName\",\n \"granularity\": \"day|week|month|quarter|year\",\n \"dateRange\": \"last 30 days\"\n }],\n \"filters\": [{\n \"member\": \"CubeName.fieldName\",\n \"operator\": \"equals|contains|gt|gte|lt|lte|inDateRange\",\n \"values\": [\"value1\", \"value2\"]\n }]\n}\n\nRules:\n1. Only use cube names, measure names, and dimension names from the schema\n2. All field references must be in \"CubeName.fieldName\" format\n3. Verify every field exists in the provided schema before using it\n\nRespond with only the JSON query object, no explanation, no markdown formatting, no code blocks, no backtick wrapper.`\n\nexport const AI_STORAGE_KEY = 'drizzle-cube-ai-config'\n\nexport const DEFAULT_AI_CONFIG = {\n provider: 'gemini' as const,\n apiKey: ''\n}","/**\n * Utility functions for AI Assistant\n */\n\nimport type { \n AIQueryRequest,\n AIQueryResponse,\n AIConfig\n} from './types'\nimport { \n AI_STORAGE_KEY,\n DEFAULT_AI_CONFIG\n} from './constants'\n\n/**\n * Send a user prompt to AI proxy (server builds system prompt)\n */\nexport async function sendGeminiMessage(\n apiKey: string,\n userPrompt: string,\n endpoint: string = '/api/ai/generate'\n): Promise<AIQueryResponse> {\n const requestBody: AIQueryRequest = {\n text: userPrompt // Send only the user's prompt, server handles system prompt\n }\n\n // Only add API key header if provided (allow empty string for server key)\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json'\n }\n \n if (apiKey && apiKey.trim()) {\n headers['X-API-Key'] = apiKey\n }\n\n console.log('🤖 Client: Sending user prompt to AI proxy')\n console.log(' URL:', endpoint)\n console.log(' Headers:', headers)\n console.log(' User prompt length:', userPrompt.length)\n\n const response = await fetch(endpoint, {\n method: 'POST',\n headers,\n body: JSON.stringify(requestBody)\n })\n\n console.log('📥 Client: Proxy response')\n console.log(' Status:', response.status)\n console.log(' Status Text:', response.statusText)\n\n if (!response.ok) {\n let errorMessage = `Failed to generate content: ${response.status} ${response.statusText}`\n \n try {\n // Try to parse JSON error response first\n const errorData = await response.json()\n console.error('❌ Client: Proxy error:', errorData)\n \n // Handle rate limit errors specially\n if (response.status === 429 && errorData.error === 'Daily quota exceeded') {\n throw new Error(\n `${errorData.message}\\n\\n${errorData.suggestion || 'Add your own Gemini API key for unlimited access.'}`\n )\n }\n \n // Handle other structured errors\n if (errorData.error) {\n errorMessage = errorData.message || errorData.error\n if (errorData.suggestion) {\n errorMessage += `\\n\\n💡 ${errorData.suggestion}`\n }\n }\n } catch (parseError) {\n // Fallback to text if JSON parsing fails\n try {\n const errorText = await response.text()\n console.error('❌ Client: Proxy text error:', errorText)\n errorMessage = errorText || errorMessage\n } catch (textError) {\n console.error('❌ Client: Could not parse error response')\n }\n }\n \n throw new Error(errorMessage)\n }\n\n const data = await response.json()\n console.log('✅ Client: Successfully generated content')\n return data\n}\n\n// Removed: buildSystemPrompt and formatCubeSchemaForPrompt \n// These functions are now handled server-side for better security\n\n/**\n * Save AI configuration to localStorage\n */\nexport function saveAIConfig(config: AIConfig): void {\n try {\n localStorage.setItem(AI_STORAGE_KEY, JSON.stringify(config))\n } catch (error) {\n console.warn('Failed to save AI config to localStorage:', error)\n }\n}\n\n/**\n * Load AI configuration from localStorage\n */\nexport function loadAIConfig(): AIConfig {\n try {\n const saved = localStorage.getItem(AI_STORAGE_KEY)\n if (saved) {\n const parsed = JSON.parse(saved)\n return { ...DEFAULT_AI_CONFIG, ...parsed }\n }\n } catch (error) {\n console.warn('Failed to load AI config from localStorage:', error)\n }\n return { ...DEFAULT_AI_CONFIG }\n}\n\n/**\n * Extract query text from simplified AI response and clean up formatting\n */\nexport function extractTextFromResponse(response: AIQueryResponse): string {\n const rawText = response.query || ''\n\n // Clean up common markdown formatting that might appear\n return rawText\n .replace(/```json\\s*/g, '') // Remove ```json\n .replace(/```\\s*/g, '') // Remove ```\n .replace(/^\\s*```.*\\n/gm, '') // Remove any remaining code block markers\n .trim()\n}","/**\n * AI Assistant Modal Component\n * \n * Multi-step modal for AI-powered query generation\n * Step 1: API Key input\n * Step 2: Model selection \n * Step 3: Query input and response\n */\n\nimport React, { useState } from 'react'\nimport { ExclamationCircleIcon, CheckCircleIcon, SparklesIcon } from '@heroicons/react/24/outline'\nimport Modal from '../Modal'\nimport type { AIAssistantState } from './types'\nimport {\n sendGeminiMessage,\n loadAIConfig,\n extractTextFromResponse\n} from './utils'\nimport { DEFAULT_SYSTEM_PROMPT_TEMPLATE } from './constants'\n\ninterface AIAssistantModalProps {\n isOpen: boolean\n onClose: () => void\n schema?: any\n onQueryLoad?: (query: any) => void\n aiEndpoint?: string\n}\n\nconst AIAssistantModal: React.FC<AIAssistantModalProps> = ({\n isOpen,\n onClose,\n onQueryLoad,\n aiEndpoint = '/api/ai'\n}) => {\n const [state, setState] = useState<AIAssistantState>(() => {\n const savedConfig = loadAIConfig()\n return {\n step: 'query', // Skip API key step and go straight to query\n apiKey: savedConfig.apiKey || '',\n systemPromptTemplate: DEFAULT_SYSTEM_PROMPT_TEMPLATE,\n userPrompt: '',\n isSubmitting: false,\n response: null,\n responseError: null,\n isValidating: false,\n validationResult: null,\n validationError: null\n }\n })\n\n\n const handleQuerySubmit = async (e?: React.FormEvent) => {\n e?.preventDefault()\n if (!state.userPrompt.trim()) return\n\n setState(prev => ({ \n ...prev, \n isSubmitting: true, \n response: null, \n responseError: null,\n validationResult: null,\n validationError: null,\n isValidating: false\n }))\n\n try {\n // Send only the user prompt - server will handle system prompt building\n const response = await sendGeminiMessage(\n state.apiKey,\n state.userPrompt,\n aiEndpoint\n )\n\n const responseText = extractTextFromResponse(response)\n setState(prev => ({ \n ...prev, \n isSubmitting: false, \n response: responseText \n }))\n \n // Automatically validate after successful generation\n setTimeout(() => {\n validateResponse(responseText)\n }, 500)\n } catch (error) {\n setState(prev => ({\n ...prev,\n isSubmitting: false,\n responseError: error instanceof Error ? error.message : 'Failed to process query'\n }))\n }\n }\n\n // Validate a specific response text (used for auto-validation)\n const validateResponse = async (responseText: string) => {\n if (!responseText) {\n console.log('AI Modal: No response text to validate')\n return\n }\n\n console.log('AI Modal: Starting validation with response:', responseText.substring(0, 100) + '...')\n \n setState(prev => ({\n ...prev,\n isValidating: true,\n validationResult: null,\n validationError: null\n }))\n\n try {\n const query = JSON.parse(responseText)\n console.log('AI Modal: Parsed query:', query)\n \n const response = await fetch('/cubejs-api/v1/load', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(query)\n })\n\n console.log('AI Modal: Validation response status:', response.status)\n\n if (response.ok) {\n console.log('AI Modal: Validation SUCCESS')\n setState(prev => ({\n ...prev,\n isValidating: false,\n validationResult: 'valid'\n }))\n } else {\n const errorData = await response.text()\n console.log('AI Modal: Validation FAILED:', errorData)\n setState(prev => ({\n ...prev,\n isValidating: false,\n validationResult: 'invalid',\n validationError: errorData || `HTTP ${response.status}: ${response.statusText}`\n }))\n }\n } catch (error) {\n console.log('AI Modal: Validation ERROR:', error)\n setState(prev => ({\n ...prev,\n isValidating: false,\n validationResult: 'invalid',\n validationError: error instanceof Error ? error.message : 'Failed to validate query'\n }))\n }\n }\n\n const handleValidate = async () => {\n if (!state.response) return\n await validateResponse(state.response)\n }\n\n const handleUseQuery = () => {\n if (!state.response || !onQueryLoad) return\n\n try {\n const query = JSON.parse(state.response)\n onQueryLoad(query)\n handleClose()\n } catch (error) {\n setState(prev => ({\n ...prev,\n validationError: 'Invalid JSON format'\n }))\n }\n }\n\n const handleClose = () => {\n setState(prev => ({\n ...prev,\n response: null,\n responseError: null,\n validationResult: null,\n validationError: null\n }))\n onClose()\n }\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n handleQuerySubmit()\n }\n }\n\n\n\n const renderQueryStep = () => (\n <div className=\"flex flex-col space-y-4\">\n {/* Top: Config Panel - Full Width */}\n <div className=\"flex-shrink-0 p-3 bg-gray-50 border border-gray-200 rounded-md\">\n <div className=\"text-sm text-gray-600\">\n Using: <span className=\"font-medium\">AI Query Generation</span>\n <span className=\"ml-2 px-2 py-1 bg-blue-100 text-blue-700 text-xs rounded\">\n Server-provided AI (Rate Limited)\n </span>\n </div>\n </div>\n \n {/* Middle: Input/Output Row - Takes remaining space */}\n <div className=\"flex flex-col md:flex-row gap-6 flex-1 min-h-0\">\n {/* Left: Query Input */}\n <div className=\"w-full md:w-1/2 flex flex-col\">\n <label htmlFor=\"user-prompt\" className=\"block text-sm font-medium text-gray-700 mb-2\">\n Describe your query in natural language\n </label>\n <textarea\n id=\"user-prompt\"\n value={state.userPrompt}\n onChange={(e) => setState(prev => ({ ...prev, userPrompt: e.target.value }))}\n onKeyDown={handleKeyDown}\n placeholder=\"e.g., Show me the total revenue by month for the last year (Press Enter to generate, Shift+Enter for new line)\"\n className=\"flex-1 w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 resize-none\"\n required\n />\n </div>\n \n {/* Right: Output Query */}\n <div className=\"w-full md:w-1/2 flex flex-col\">\n <div className=\"flex items-center justify-between mb-2\">\n <div className=\"flex items-center space-x-2\">\n {state.response ? (\n <>\n <CheckCircleIcon className=\"w-5 h-5 text-green-500\" />\n <span className=\"text-sm font-medium text-green-700\">AI Generated Query</span>\n </>\n ) : (\n <span className=\"text-sm font-medium text-gray-500\">Generated Query</span>\n )}\n </div>\n {state.response && (\n <button\n onClick={handleValidate}\n disabled={state.isValidating}\n className=\"text-xs text-blue-600 hover:text-blue-800 disabled:opacity-50\"\n title=\"Click to re-validate query\"\n >\n {state.isValidating ? 'Validating...' : 'Re-validate'}\n </button>\n )}\n </div>\n \n {state.response ? (\n <div className=\"flex-1 bg-green-50 border border-green-200 rounded-md p-3\">\n <pre className=\"text-sm text-gray-800 whitespace-pre-wrap overflow-auto bg-white p-3 rounded border h-full\">\n {state.response}\n </pre>\n </div>\n ) : (\n <div className=\"flex-1 flex items-center justify-center text-gray-500 border-2 border-dashed border-gray-300 rounded-md p-8 min-h-64\">\n <div className=\"text-center\">\n <SparklesIcon className=\"w-12 h-12 mx-auto text-gray-400\" />\n </div>\n </div>\n )}\n </div>\n </div>\n \n {/* Status Messages - Fixed height */}\n <div className=\"flex-shrink-0\">\n {state.responseError && (\n <div className=\"flex items-start space-x-2 p-3 bg-red-50 border border-red-200 rounded-md\">\n <ExclamationCircleIcon className=\"w-5 h-5 text-red-500 mt-0.5 flex-shrink-0\" />\n <div className=\"text-sm text-red-700\">{state.responseError}</div>\n </div>\n )}\n \n {state.isValidating && (\n <div className=\"flex items-start space-x-2 p-3 bg-blue-50 border border-blue-200 rounded-md\">\n <div className=\"animate-spin rounded-full h-5 w-5 border-b-2 border-blue-600 mt-0.5 flex-shrink-0\"></div>\n <div className=\"text-sm text-blue-700\">Validating query...</div>\n </div>\n )}\n \n {state.validationResult === 'valid' && !state.isValidating && (\n <div className=\"flex items-start space-x-2 p-3 bg-green-50 border border-green-200 rounded-md\">\n <CheckCircleIcon className=\"w-5 h-5 text-green-500 mt-0.5 flex-shrink-0\" />\n <div className=\"text-sm text-green-700\">Query is valid and ready to use!</div>\n </div>\n )}\n \n {state.validationResult === 'invalid' && !state.isValidating && (\n <div className=\"flex items-start space-x-2 p-3 bg-red-50 border border-red-200 rounded-md\">\n <ExclamationCircleIcon className=\"w-5 h-5 text-red-500 mt-0.5 flex-shrink-0\" />\n <div className=\"text-sm text-red-700\">\n <div className=\"font-medium mb-1\">Query validation failed:</div>\n <div className=\"text-xs\">{state.validationError}</div>\n </div>\n </div>\n )}\n </div>\n \n {/* Bottom: Action Buttons - Right Aligned */}\n <div className=\"flex-shrink-0 flex justify-end space-x-3 pt-3\">\n <button\n type=\"submit\"\n disabled={!state.userPrompt.trim() || state.isSubmitting}\n onClick={handleQuerySubmit}\n className=\"px-4 py-2 bg-blue-600 text-white text-sm rounded-md hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 disabled:bg-gray-300 disabled:cursor-not-allowed flex items-center\"\n >\n {state.isSubmitting ? (\n <>\n <div className=\"animate-spin rounded-full h-4 w-4 border-b-2 border-white mr-2\"></div>\n Generating...\n </>\n ) : (\n <>\n <SparklesIcon className=\"w-4 h-4 mr-2\" />\n Generate\n </>\n )}\n </button>\n \n {/* Validation happens automatically after generation */}\n \n <button\n onClick={handleUseQuery}\n disabled={!state.response || !onQueryLoad}\n className=\"px-4 py-2 bg-green-600 text-white text-sm rounded-md hover:bg-green-700 focus:outline-none focus:ring-2 focus:ring-green-500 focus:ring-offset-2 disabled:bg-gray-300 disabled:cursor-not-allowed flex items-center\"\n >\n <CheckCircleIcon className=\"w-4 h-4 mr-2\" />\n Use Query\n </button>\n </div>\n </div>\n )\n\n const getTitle = () => {\n return 'AI Assistant - Generate Query'\n }\n\n return (\n <Modal\n isOpen={isOpen}\n onClose={handleClose}\n title={getTitle()}\n size=\"fullscreen-mobile\"\n >\n {renderQueryStep()}\n </Modal>\n )\n}\n\nexport default AIAssistantModal","/**\n * QueryBuilder Component\n * \n * Main component that orchestrates the query building experience.\n * Manages state and coordinates between the meta explorer, query panel, and results panel.\n */\n\nimport { useState, useEffect, useCallback, useRef, forwardRef, useImperativeHandle } from 'react'\nimport { Bars3Icon, XMarkIcon } from '@heroicons/react/24/outline'\nimport { useCubeContext } from '../../providers/CubeProvider'\nimport CubeMetaExplorer from './CubeMetaExplorer'\nimport QueryPanel from './QueryPanel'\nimport ResultsPanel from './ResultsPanel'\nimport SetupPanel from './SetupPanel'\nimport AIAssistantModal from '../AIAssistant/AIAssistantModal'\nimport type { \n QueryBuilderProps, \n QueryBuilderRef,\n QueryBuilderState, \n MetaResponse,\n ValidationResult,\n ApiConfig\n} from './types'\nimport type { Filter } from '../../types'\nimport { createEmptyQuery, hasQueryContent, cleanQuery, cleanQueryForServer, cleanupFilters, transformQueryForUI } from './utils'\n\nconst STORAGE_KEY = 'drizzle-cube-query-builder-state'\nconst API_CONFIG_STORAGE_KEY = 'drizzle-cube-api-config'\n\nconst QueryBuilder = forwardRef<QueryBuilderRef, QueryBuilderProps>(({\n className = '',\n initialQuery,\n disableLocalStorage = false,\n hideSettings = false\n}, ref) => {\n // Get cube client, update function, and features from context\n const { cubeApi, updateApiConfig, features } = useCubeContext()\n \n // Load initial API configuration from localStorage\n const getInitialApiConfig = (): ApiConfig => {\n if (!disableLocalStorage) {\n try {\n const saved = localStorage.getItem(API_CONFIG_STORAGE_KEY)\n if (saved) {\n return JSON.parse(saved)\n }\n } catch (error) {\n console.warn('Failed to load API config from localStorage:', error)\n }\n }\n return {\n baseApiUrl: '/cubejs-api/v1',\n apiToken: ''\n }\n }\n\n // Load initial state from localStorage if available, or use provided initialQuery\n const getInitialState = (): QueryBuilderState => {\n // If initialQuery is provided, use it instead of localStorage\n if (initialQuery) {\n return {\n query: transformQueryForUI(initialQuery),\n schema: null,\n schemaStatus: 'idle',\n schemaError: null,\n validationStatus: 'idle',\n validationError: null,\n validationSql: null,\n executionStatus: 'idle',\n executionResults: null,\n executionError: null,\n totalRowCount: null,\n totalRowCountStatus: 'idle'\n }\n }\n\n // Only check localStorage if not disabled\n if (!disableLocalStorage) {\n try {\n const saved = localStorage.getItem(STORAGE_KEY)\n if (saved) {\n const parsedState = JSON.parse(saved)\n return {\n query: transformQueryForUI(parsedState.query) || createEmptyQuery(),\n schema: null, // Schema is always loaded fresh\n schemaStatus: 'idle', // Reset schema status\n schemaError: null,\n validationStatus: 'idle', // Reset validation status\n validationError: null,\n validationSql: null,\n executionStatus: 'idle', // Reset execution status\n executionResults: null,\n executionError: null,\n totalRowCount: null,\n totalRowCountStatus: 'idle'\n }\n }\n } catch (error) {\n console.warn('Failed to load query from localStorage:', error)\n }\n }\n \n return {\n query: createEmptyQuery(),\n schema: null,\n schemaStatus: 'idle',\n schemaError: null,\n validationStatus: 'idle',\n validationError: null,\n validationSql: null,\n executionStatus: 'idle',\n executionResults: null,\n executionError: null,\n totalRowCount: null,\n totalRowCountStatus: 'idle'\n }\n }\n\n const [state, setState] = useState<QueryBuilderState>(getInitialState())\n \n // Separate state for display limit (doesn't affect the actual query object)\n const [displayLimit, setDisplayLimit] = useState<number>(10)\n \n // API configuration state\n const [apiConfig, setApiConfig] = useState<ApiConfig>(getInitialApiConfig())\n const [showSetupPanel, setShowSetupPanel] = useState(false)\n const [showSchemaMobile, setShowSchemaMobile] = useState(false)\n \n // AI Assistant modal state\n const [showAIAssistant, setShowAIAssistant] = useState(false)\n\n // Update query when initialQuery prop changes (for modal usage)\n useEffect(() => {\n if (initialQuery && JSON.stringify(initialQuery) !== JSON.stringify(state.query)) {\n setState(prev => ({\n ...prev,\n query: transformQueryForUI(initialQuery),\n schemaStatus: 'idle',\n schemaError: null,\n validationStatus: 'idle',\n validationError: null,\n validationSql: null,\n executionStatus: 'idle',\n executionResults: null,\n executionError: null,\n totalRowCount: null,\n totalRowCountStatus: 'idle'\n }))\n }\n }, [initialQuery])\n\n // Track the last validated query to avoid resetting validation on unrelated updates\n const lastValidatedQueryRef = useRef<string>('')\n\n // Note: API configuration is kept for backward compatibility but not used \n // since we now use the CubeClient from context\n\n // Store the full validation result for access via ref\n const [fullValidationResult, setFullValidationResult] = useState<ValidationResult | null>(null)\n\n // Expose query and validation state to parent via ref (only called when Apply is clicked)\n useImperativeHandle(ref, () => ({\n getCurrentQuery: () => cleanQueryForServer(state.query),\n getValidationState: () => ({\n status: state.validationStatus,\n result: state.validationStatus === 'valid' ? {\n valid: true,\n sql: state.validationSql || undefined\n } : state.validationStatus === 'invalid' ? {\n valid: false,\n error: state.validationError || undefined\n } : undefined\n }),\n getValidationResult: () => fullValidationResult\n }), [state.query, state.validationStatus, state.validationError, state.validationSql, fullValidationResult])\n\n // Load schema on mount and when API config changes\n useEffect(() => {\n const loadSchema = async () => {\n setState(prev => ({\n ...prev,\n schemaStatus: 'loading',\n schemaError: null\n }))\n\n try {\n const metaResponse: MetaResponse = await cubeApi.meta()\n setState(prev => ({\n ...prev,\n schema: metaResponse,\n schemaStatus: 'success',\n schemaError: null\n }))\n } catch (error) {\n console.error('Failed to load schema:', error)\n const errorMessage = error instanceof Error ? error.message : 'Failed to load schema'\n setState(prev => ({\n ...prev,\n schema: null,\n schemaStatus: 'error',\n schemaError: errorMessage\n }))\n }\n }\n\n loadSchema()\n }, [apiConfig.baseApiUrl, apiConfig.apiToken])\n\n // Save query to localStorage whenever it changes (if not disabled)\n useEffect(() => {\n if (!disableLocalStorage) {\n try {\n localStorage.setItem(STORAGE_KEY, JSON.stringify({ query: state.query }))\n } catch (error) {\n console.warn('Failed to save query to localStorage:', error)\n }\n }\n }, [state.query, disableLocalStorage])\n\n // Save API config to localStorage whenever it changes (if not disabled)\n useEffect(() => {\n if (!disableLocalStorage) {\n try {\n localStorage.setItem(API_CONFIG_STORAGE_KEY, JSON.stringify(apiConfig))\n } catch (error) {\n console.warn('Failed to save API config to localStorage:', error)\n }\n }\n }, [apiConfig, disableLocalStorage])\n\n\n\n\n // Auto re-run query when displayLimit changes\n useEffect(() => {\n if (state.executionStatus === 'success' && hasQueryContent(state.query) && state.validationStatus === 'valid') {\n handleExecuteQuery()\n }\n }, [displayLimit]) // Only trigger on displayLimit change\n\n\n const updateQuery = useCallback((updater: (prev: typeof state.query) => typeof state.query) => {\n setState(prev => {\n const newQuery = updater(prev.query)\n \n // Clean up filters to remove any that reference fields no longer in the query\n const cleanedQuery = {\n ...newQuery,\n filters: newQuery.filters ? cleanupFilters(newQuery.filters, newQuery) : undefined\n }\n \n const queryChanged = JSON.stringify(cleanedQuery) !== JSON.stringify(prev.query)\n \n return {\n ...prev,\n query: cleanedQuery,\n // Only reset validation if query actually changed\n validationStatus: queryChanged ? 'idle' : prev.validationStatus,\n validationError: queryChanged ? null : prev.validationError,\n validationSql: queryChanged ? null : prev.validationSql,\n executionStatus: 'idle',\n executionResults: null,\n executionError: null,\n totalRowCount: null,\n totalRowCountStatus: 'idle'\n }\n })\n }, [])\n\n const handleFieldSelect = useCallback((fieldName: string, fieldType: 'measures' | 'dimensions' | 'timeDimensions') => {\n updateQuery(prev => {\n const newQuery = { ...prev }\n \n switch (fieldType) {\n case 'measures':\n newQuery.measures = [...(prev.measures || []), fieldName]\n break\n case 'dimensions':\n newQuery.dimensions = [...(prev.dimensions || []), fieldName]\n break\n case 'timeDimensions':\n newQuery.timeDimensions = [...(prev.timeDimensions || []), { \n dimension: fieldName, \n granularity: 'month' \n }]\n break\n }\n \n return cleanQuery(newQuery)\n })\n }, [updateQuery])\n\n const handleFieldDeselect = useCallback((fieldName: string, fieldType: 'measures' | 'dimensions' | 'timeDimensions') => {\n updateQuery(prev => {\n const newQuery = { ...prev }\n \n switch (fieldType) {\n case 'measures':\n newQuery.measures = (prev.measures || []).filter(m => m !== fieldName)\n break\n case 'dimensions':\n newQuery.dimensions = (prev.dimensions || []).filter(d => d !== fieldName)\n break\n case 'timeDimensions':\n newQuery.timeDimensions = (prev.timeDimensions || []).filter(td => td.dimension !== fieldName)\n break\n }\n \n // Clean up order if field was sorted\n if (newQuery.order && newQuery.order[fieldName]) {\n const newOrder = { ...newQuery.order }\n delete newOrder[fieldName]\n newQuery.order = Object.keys(newOrder).length > 0 ? newOrder : undefined\n }\n \n return cleanQuery(newQuery)\n })\n }, [updateQuery])\n\n const handleTimeDimensionGranularityChange = useCallback((dimensionName: string, granularity: string) => {\n updateQuery(prev => {\n const newQuery = {\n ...prev,\n timeDimensions: (prev.timeDimensions || []).map(td => \n td.dimension === dimensionName \n ? { ...td, granularity }\n : td\n )\n }\n return cleanQuery(newQuery)\n })\n }, [updateQuery])\n\n const handleFiltersChange = useCallback((filters: Filter[]) => {\n updateQuery(prev => {\n const newQuery = {\n ...prev,\n filters\n }\n return cleanQuery(newQuery)\n })\n }, [updateQuery])\n\n const handleDateRangeChange = useCallback((timeDimension: string, dateRange: string | string[]) => {\n updateQuery(prev => {\n const newQuery = {\n ...prev,\n timeDimensions: (prev.timeDimensions || []).map(td => \n td.dimension === timeDimension \n ? { ...td, dateRange }\n : td\n )\n }\n return cleanQuery(newQuery)\n })\n }, [updateQuery])\n\n const handleDateRangeRemove = useCallback((timeDimension: string) => {\n updateQuery(prev => {\n const newQuery = {\n ...prev,\n timeDimensions: (prev.timeDimensions || []).map(td => \n td.dimension === timeDimension \n ? { ...td, dateRange: undefined }\n : td\n )\n }\n return cleanQuery(newQuery)\n })\n }, [updateQuery])\n\n const handleOrderChange = useCallback((fieldName: string, direction: 'asc' | 'desc' | null) => {\n updateQuery(prev => {\n const newOrder = { ...(prev.order || {}) }\n \n if (direction === null) {\n delete newOrder[fieldName]\n } else {\n newOrder[fieldName] = direction\n }\n \n const newQuery = {\n ...prev,\n order: Object.keys(newOrder).length > 0 ? newOrder : undefined\n }\n \n return cleanQuery(newQuery)\n })\n }, [updateQuery])\n\n const handleValidateQuery = useCallback(async () => {\n if (!hasQueryContent(state.query)) return\n\n // Store the query being validated (cleaned and server-formatted)\n const queryToValidate = cleanQueryForServer(state.query)\n const queryStr = JSON.stringify(queryToValidate)\n \n console.log('Starting validation with query:', queryToValidate)\n\n setState(prev => ({\n ...prev,\n validationStatus: 'validating',\n validationError: null,\n validationSql: null\n }))\n\n try {\n const result: ValidationResult = await cubeApi.dryRun(queryToValidate)\n \n // Store the full validation result for parent access\n setFullValidationResult(result)\n \n // Check if validation is successful:\n // 1. Must have queryType (always present in successful Cube.js responses)\n // 2. Must not have an error\n // 3. For compatibility, also check result.valid if present\n const isValid = !result.error && result.queryType && (result.valid !== false)\n \n // Store the validated query to prevent reset\n if (isValid) {\n lastValidatedQueryRef.current = queryStr\n }\n \n console.log('Validation result:', isValid ? 'VALID' : 'INVALID', 'Query after validation:', state.query)\n \n setState(prev => {\n console.log('Setting validation status to:', isValid ? 'valid' : 'invalid')\n console.log('Query in prev state:', prev.query)\n return {\n ...prev,\n validationStatus: isValid ? 'valid' : 'invalid',\n validationError: result.error || null,\n validationSql: result.sql || null\n }\n })\n } catch (error) {\n console.error('Validation error:', error)\n setFullValidationResult(null)\n setState(prev => ({\n ...prev,\n validationStatus: 'invalid',\n validationError: error instanceof Error ? error.message : 'Network error during validation',\n validationSql: null\n }))\n }\n }, [state.query, cubeApi])\n\n // Auto re-validate query when query changes (with 1s debounce)\n useEffect(() => {\n // Only auto-validate if query has content and validation was previously cleared\n if (!hasQueryContent(state.query) || state.validationStatus !== 'idle') {\n return\n }\n\n const debounceTimer = setTimeout(() => {\n handleValidateQuery()\n }, 200) // 200ms debounce - fast but prevents excessive API calls\n\n return () => clearTimeout(debounceTimer)\n }, [state.query, state.validationStatus, handleValidateQuery]) // Trigger when query changes and validation status is idle\n\n const handleExecuteQuery = useCallback(async () => {\n if (!hasQueryContent(state.query) || state.validationStatus !== 'valid') return\n\n setState(prev => ({\n ...prev,\n executionStatus: 'loading',\n executionResults: null,\n executionError: null,\n totalRowCountStatus: 'loading'\n }))\n\n try {\n // Run both queries in parallel: one with limit and one without for total count\n const cleanedQuery = cleanQueryForServer(state.query)\n const [limitedResultSet, totalResultSet] = await Promise.all([\n cubeApi.load({ ...cleanedQuery, limit: displayLimit }),\n cubeApi.load(cleanedQuery) // No limit for total count\n ])\n \n const limitedData = limitedResultSet.tablePivot()\n const totalData = totalResultSet.tablePivot()\n const totalCount = totalData.length\n \n setState(prev => ({\n ...prev,\n executionStatus: 'success',\n executionResults: limitedData,\n executionError: null,\n totalRowCount: totalCount,\n totalRowCountStatus: 'success'\n }))\n } catch (error) {\n console.error('Query execution error:', error)\n setState(prev => ({\n ...prev,\n executionStatus: 'error',\n executionResults: null,\n executionError: error instanceof Error ? error.message : 'Query execution failed',\n totalRowCount: null,\n totalRowCountStatus: 'error'\n }))\n }\n }, [state.query, state.validationStatus, cubeApi, displayLimit])\n\n const handleClearQuery = useCallback(() => {\n setState(prev => ({\n ...prev,\n query: createEmptyQuery(),\n validationStatus: 'idle',\n validationError: null,\n validationSql: null,\n executionStatus: 'idle',\n executionResults: null,\n executionError: null,\n totalRowCount: null,\n totalRowCountStatus: 'idle'\n }))\n }, [])\n\n const handleApiConfigChange = useCallback((newConfig: ApiConfig) => {\n setApiConfig(newConfig)\n \n // Update the CubeProvider's client with new configuration\n updateApiConfig(\n { apiUrl: newConfig.baseApiUrl },\n newConfig.apiToken || undefined\n )\n \n // Reset all state when API config changes\n setState(prev => ({\n ...prev,\n schema: null,\n schemaStatus: 'idle',\n schemaError: null,\n validationStatus: 'idle',\n validationError: null,\n validationSql: null,\n executionStatus: 'idle',\n executionResults: null,\n executionError: null,\n totalRowCount: null,\n totalRowCountStatus: 'idle'\n }))\n }, [updateApiConfig])\n\n const handleResetApiConfig = useCallback(() => {\n const defaultConfig = {\n baseApiUrl: '/cubejs-api/v1',\n apiToken: ''\n }\n setApiConfig(defaultConfig)\n \n // Update the CubeProvider's client with reset configuration\n updateApiConfig(\n { apiUrl: defaultConfig.baseApiUrl },\n undefined\n )\n }, [updateApiConfig])\n\n const handleRetrySchema = useCallback(async () => {\n setState(prev => ({\n ...prev,\n schemaStatus: 'loading',\n schemaError: null\n }))\n\n try {\n const metaResponse: MetaResponse = await cubeApi.meta()\n setState(prev => ({\n ...prev,\n schema: metaResponse,\n schemaStatus: 'success',\n schemaError: null\n }))\n } catch (error) {\n console.error('Failed to retry schema:', error)\n const errorMessage = error instanceof Error ? error.message : 'Failed to load schema'\n setState(prev => ({\n ...prev,\n schema: null,\n schemaStatus: 'error',\n schemaError: errorMessage\n }))\n }\n }, [cubeApi])\n\n const selectedFields = {\n measures: state.query.measures || [],\n dimensions: state.query.dimensions || [],\n timeDimensions: (state.query.timeDimensions || []).map(td => td.dimension)\n }\n\n return (\n <div className={`h-full flex flex-col ${className}`} style={{ minHeight: '100%' }}>\n {/* Setup Panel - only show when not in modal and not hidden */}\n {!hideSettings && (\n <div className=\"flex-shrink-0 p-4 pb-0\">\n <SetupPanel\n isOpen={showSetupPanel}\n onToggle={() => setShowSetupPanel(!showSetupPanel)}\n config={apiConfig}\n onConfigChange={handleApiConfigChange}\n onReset={handleResetApiConfig}\n />\n </div>\n )}\n \n {/* Mobile Schema Toggle Button */}\n <div className=\"md:hidden flex-shrink-0 px-4 pb-2\">\n <button\n onClick={() => setShowSchemaMobile(!showSchemaMobile)}\n className=\"flex items-center gap-2 px-3 py-2 text-sm font-medium text-gray-700 bg-gray-100 hover:bg-gray-200 rounded-md transition-colors\"\n >\n {showSchemaMobile ? (\n <><XMarkIcon className=\"w-4 h-4\" /> Hide Schema</>\n ) : (\n <><Bars3Icon className=\"w-4 h-4\" /> Show Schema</>\n )}\n </button>\n </div>\n\n {/* Mobile Schema Panel Overlay */}\n {showSchemaMobile && (\n <div className=\"md:hidden fixed inset-0 z-50 bg-black bg-opacity-50 flex\">\n <div className=\"w-full max-w-md sm:max-w-lg bg-white h-full overflow-y-auto\">\n <div className=\"p-4 border-b\">\n <button\n onClick={() => setShowSchemaMobile(false)}\n className=\"flex items-center gap-2 px-3 py-2 text-sm font-medium text-gray-700 bg-gray-100 hover:bg-gray-200 rounded-md transition-colors\"\n >\n <XMarkIcon className=\"w-4 h-4\" /> Close Schema\n </button>\n </div>\n <div className=\"p-4\">\n <CubeMetaExplorer\n schema={state.schema}\n schemaStatus={state.schemaStatus}\n schemaError={state.schemaError}\n selectedFields={selectedFields}\n onFieldSelect={(field, type) => {\n handleFieldSelect(field, type)\n setShowSchemaMobile(false)\n }}\n onFieldDeselect={handleFieldDeselect}\n onRetrySchema={handleRetrySchema}\n onOpenSettings={!hideSettings ? () => setShowSetupPanel(true) : undefined}\n />\n </div>\n </div>\n <div className=\"flex-1\" onClick={() => setShowSchemaMobile(false)}></div>\n </div>\n )}\n\n <div className=\"flex-1 flex flex-col md:flex-row gap-4 p-4 min-h-0\" style={{ paddingTop: hideSettings ? '1rem' : '0rem' }}>\n {/* Schema Explorer - Left Column (Desktop only) */}\n <div className=\"hidden md:flex md:w-1/3 min-w-0 flex-shrink-0 flex-col\">\n <CubeMetaExplorer\n schema={state.schema}\n schemaStatus={state.schemaStatus}\n schemaError={state.schemaError}\n selectedFields={selectedFields}\n onFieldSelect={handleFieldSelect}\n onFieldDeselect={handleFieldDeselect}\n onRetrySchema={handleRetrySchema}\n onOpenSettings={!hideSettings ? () => setShowSetupPanel(true) : undefined}\n />\n </div>\n\n {/* Main Content - Query Builder + Results */}\n <div className=\"flex-1 flex flex-col gap-4 min-w-0 min-h-0\">\n {/* Query Builder */}\n <div className=\"flex-shrink-0\">\n <QueryPanel\n query={state.query}\n schema={state.schema}\n validationStatus={state.validationStatus}\n validationError={state.validationError}\n validationSql={state.validationSql}\n onValidate={handleValidateQuery}\n onExecute={handleExecuteQuery}\n onRemoveField={handleFieldDeselect}\n onTimeDimensionGranularityChange={handleTimeDimensionGranularityChange}\n onFiltersChange={handleFiltersChange}\n onDateRangeChange={handleDateRangeChange}\n onDateRangeRemove={handleDateRangeRemove}\n onOrderChange={handleOrderChange}\n onClearQuery={handleClearQuery}\n showSettings={!hideSettings}\n onSettingsClick={() => setShowSetupPanel(!showSetupPanel)}\n onAIAssistantClick={features?.enableAI !== false ? () => setShowAIAssistant(true) : undefined}\n />\n </div>\n\n {/* Results Panel */}\n <div className={`${state.executionStatus === 'idle' ? 'flex-shrink-0 h-48' : 'flex-1 min-h-0'}`}>\n <ResultsPanel\n executionStatus={state.executionStatus}\n executionResults={state.executionResults}\n executionError={state.executionError}\n query={state.query}\n displayLimit={displayLimit}\n onDisplayLimitChange={setDisplayLimit}\n totalRowCount={state.totalRowCount}\n totalRowCountStatus={state.totalRowCountStatus}\n />\n </div>\n </div>\n </div>\n \n {/* AI Assistant Modal - only render if AI is enabled */}\n {features?.enableAI !== false && (\n <AIAssistantModal\n isOpen={showAIAssistant}\n onClose={() => setShowAIAssistant(false)}\n schema={state.schema}\n aiEndpoint={features?.aiEndpoint}\n onQueryLoad={(query) => {\n // Update the query in the builder\n setState(prev => ({\n ...prev,\n query: transformQueryForUI(query),\n validationStatus: 'idle',\n validationError: null,\n validationSql: null,\n executionStatus: 'idle',\n executionResults: null,\n executionError: null,\n totalRowCount: null,\n totalRowCountStatus: 'idle'\n }))\n \n // Auto-validate the loaded query after a short delay\n setTimeout(async () => {\n // We need to access handleValidateQuery through a ref or recreate the validation logic\n // For now, let's trigger validation by updating the state to force a validation\n const queryToValidate = cleanQueryForServer(transformQueryForUI(query))\n \n try {\n const result = await cubeApi.dryRun(queryToValidate)\n const isValid = !result.error && result.queryType && (result.valid !== false)\n \n setState(prev => ({\n ...prev,\n validationStatus: isValid ? 'valid' : 'invalid',\n validationError: result.error || null,\n validationSql: result.sql || null\n }))\n \n setFullValidationResult(result)\n } catch (error) {\n console.error('Auto-validation error:', error)\n setState(prev => ({\n ...prev,\n validationStatus: 'invalid',\n validationError: error instanceof Error ? error.message : 'Validation failed',\n validationSql: null\n }))\n setFullValidationResult(null)\n }\n }, 200)\n }}\n />\n )}\n </div>\n )\n})\n\nQueryBuilder.displayName = 'QueryBuilder'\n\nexport default QueryBuilder","import React, { useState } from 'react'\nimport { XMarkIcon } from '@heroicons/react/24/outline'\nimport type { AxisDropZoneConfig } from '../charts/chartConfigs'\n\ninterface FieldStyling {\n IconComponent: React.ComponentType<{ className?: string }>\n baseClasses: string\n hoverClasses: string\n}\n\ninterface AxisDropZoneProps {\n config: AxisDropZoneConfig\n fields: string[]\n onDrop: (e: React.DragEvent<HTMLDivElement>, toKey: string) => void\n onRemove: (field: string, fromKey: string) => void\n onDragStart: (e: React.DragEvent<HTMLDivElement>, field: string, fromKey: string) => void\n onDragOver: (e: React.DragEvent<HTMLDivElement>) => void\n getFieldStyling: (field: string) => FieldStyling\n onReorder?: (fromIndex: number, toIndex: number, axisKey: string) => void\n}\n\nexport default function AxisDropZone({\n config,\n fields,\n onDrop,\n onRemove,\n onDragStart,\n onDragOver,\n getFieldStyling,\n onReorder\n}: AxisDropZoneProps) {\n const { key, label, description, mandatory, maxItems, emptyText, icon: IconComponent } = config\n const [dragOverIndex, setDragOverIndex] = useState<number | null>(null)\n const [draggedFromIndex, setDraggedFromIndex] = useState<number | null>(null)\n const [isDraggingFromSameAxis, setIsDraggingFromSameAxis] = useState(false)\n \n // Check if we can accept more items\n const canAcceptMore = !maxItems || fields.length < maxItems\n const isFull = maxItems && fields.length >= maxItems\n\n // Helper to handle reordering within the same axis\n const handleReorderDragStart = (e: React.DragEvent<HTMLDivElement>, field: string, index: number) => {\n setDraggedFromIndex(index)\n setIsDraggingFromSameAxis(true)\n \n // Set both the regular drag data and the reorder data\n e.dataTransfer.setData('text/plain', JSON.stringify({ \n field, \n fromAxis: key,\n fromIndex: index,\n isReorder: true\n }))\n }\n\n const handleReorderDragEnd = () => {\n setDraggedFromIndex(null)\n setIsDraggingFromSameAxis(false)\n setDragOverIndex(null)\n }\n\n const handleReorderDragOver = (e: React.DragEvent<HTMLDivElement>, targetIndex: number) => {\n // Only prevent default and show indicator if we're dragging from the same axis\n if (isDraggingFromSameAxis && draggedFromIndex !== null && draggedFromIndex !== targetIndex) {\n e.preventDefault()\n e.stopPropagation()\n setDragOverIndex(targetIndex)\n }\n }\n\n const handleReorderDragLeave = () => {\n setDragOverIndex(null)\n }\n\n const handleReorderDrop = (e: React.DragEvent<HTMLDivElement>, targetIndex: number) => {\n e.preventDefault()\n e.stopPropagation()\n setDragOverIndex(null)\n \n try {\n const data = JSON.parse(e.dataTransfer.getData('text/plain'))\n if (data.isReorder && data.fromAxis === key && onReorder && draggedFromIndex !== null) {\n // Only reorder if we're actually changing positions\n if (draggedFromIndex !== targetIndex) {\n onReorder(draggedFromIndex, targetIndex, key)\n }\n }\n } catch {\n // If we can't parse the data, try using the stored state\n if (isDraggingFromSameAxis && draggedFromIndex !== null && draggedFromIndex !== targetIndex && onReorder) {\n onReorder(draggedFromIndex, targetIndex, key)\n }\n }\n \n handleReorderDragEnd()\n }\n \n return (\n <div className=\"mb-2\">\n <div className=\"flex items-center gap-2 mb-1\">\n <h4 className=\"text-xs font-semibold flex items-center\">\n {IconComponent && <IconComponent className=\"w-3 h-3 mr-1\" />}\n {label}\n {mandatory && <span className=\"text-red-500 ml-1\">*</span>}\n {maxItems && (\n <span className=\"text-gray-500 ml-1 font-normal\">\n ({fields.length}/{maxItems})\n </span>\n )}\n </h4>\n {description && (\n <span className=\"text-xs text-gray-500\">\n {description}\n </span>\n )}\n </div>\n \n <div\n className={`min-h-[40px] sm:min-h-[32px] border-2 border-dashed rounded-lg p-3 sm:p-1.5 transition-colors flex items-center ${\n isFull \n ? 'border-gray-200 bg-gray-50' \n : 'border-gray-300 bg-gray-50 hover:bg-gray-100'\n }`}\n onDragOver={(e) => {\n // Don't interfere with internal reordering\n if (isDraggingFromSameAxis) {\n return\n }\n \n if (canAcceptMore) {\n onDragOver(e)\n } else {\n e.preventDefault()\n e.dataTransfer.dropEffect = 'none'\n }\n }}\n onDrop={(e) => {\n // Don't interfere with internal reordering\n if (isDraggingFromSameAxis) {\n return\n }\n \n if (canAcceptMore) {\n onDrop(e, key)\n } else {\n e.preventDefault()\n }\n }}\n >\n {fields.length === 0 ? (\n <div className=\"text-xs text-gray-500 text-center w-full\">\n {isFull ? 'Maximum items reached' : (emptyText || `Drop fields here`)}\n </div>\n ) : (\n <div className=\"flex flex-wrap gap-1\">\n {fields.map((field, index) => {\n const { IconComponent: FieldIcon, baseClasses, hoverClasses } = getFieldStyling(field)\n const isDragOver = dragOverIndex === index\n \n return (\n <div\n key={`${field}-${index}`}\n className={`relative ${isDragOver ? 'transform scale-105' : ''}`}\n >\n {/* Drop indicator line for reordering */}\n {isDragOver && (\n <div className=\"absolute -left-1 top-0 bottom-0 w-1 bg-blue-500 rounded-full z-10\" />\n )}\n \n <div\n draggable\n onDragStart={(e) => {\n // Handle both regular drag (to other axes) and reorder drag (within same axis)\n onDragStart(e, field, key)\n handleReorderDragStart(e, field, index)\n }}\n onDragEnd={handleReorderDragEnd}\n onDragOver={(e) => handleReorderDragOver(e, index)}\n onDragLeave={handleReorderDragLeave}\n onDrop={(e) => handleReorderDrop(e, index)}\n className={`rounded text-xs cursor-move px-3 py-0.5 sm:px-2 sm:py-1 flex items-center transition-transform h-[28px] sm:h-auto ${baseClasses} ${hoverClasses} ${\n isDragOver ? 'bg-opacity-75' : ''\n } ${draggedFromIndex === index ? 'opacity-50' : ''}`}\n >\n <FieldIcon className=\"w-3 h-3 mr-1 flex-shrink-0\" />\n <span className=\"leading-none\">{field}</span>\n <button\n type=\"button\"\n onClick={() => onRemove(field, key)}\n className=\"text-gray-600 hover:text-red-600 ml-1.5 leading-none\"\n title={`Remove from ${label}`}\n >\n <XMarkIcon className=\"w-3 h-3\" />\n </button>\n </div>\n </div>\n )\n })}\n </div>\n )}\n </div>\n \n {mandatory && fields.length === 0 && (\n <div className=\"text-xs text-red-500 mt-0.5\">\n This field is required\n </div>\n )}\n </div>\n )\n}","import type { ChartTypeConfig } from '../../charts/chartConfigs'\nimport { Icon } from '@iconify/react'\nimport chartBarIcon from '@iconify-icons/tabler/chart-bar'\n\n/**\n * Configuration for the bar chart type\n */\nexport const barChartConfig: ChartTypeConfig = {\n icon: ({ className }) => <Icon icon={chartBarIcon} className={className} />,\n description: 'Compare values across categories',\n useCase: 'Best for comparing discrete categories, showing rankings, or displaying changes over time',\n dropZones: [\n {\n key: 'xAxis',\n label: 'X-Axis (Categories)',\n description: 'Dimensions and time dimensions for grouping',\n mandatory: false,\n acceptTypes: ['dimension', 'timeDimension'],\n emptyText: 'Drop dimensions & time dimensions here'\n },\n {\n key: 'yAxis',\n label: 'Y-Axis (Values)',\n description: 'Measures for bar heights',\n mandatory: true,\n acceptTypes: ['measure'],\n emptyText: 'Drop measures here'\n },\n {\n key: 'series',\n label: 'Series (Split into Multiple Series)',\n description: 'Dimensions to create separate data series',\n mandatory: false,\n acceptTypes: ['dimension'],\n emptyText: 'Drop dimensions here to split data into series'\n }\n ],\n displayOptions: ['showLegend', 'showGrid', 'showTooltip', 'stacked']\n}","import type { ChartTypeConfig } from '../../charts/chartConfigs'\nimport { Icon } from '@iconify/react'\nimport chartLineIcon from '@iconify-icons/tabler/chart-line'\n\n/**\n * Configuration for the line chart type\n */\nexport const lineChartConfig: ChartTypeConfig = {\n icon: ({ className }) => <Icon icon={chartLineIcon} className={className} />,\n description: 'Show trends and changes over time',\n useCase: 'Best for continuous data, trends, time series, and showing relationships between multiple series',\n dropZones: [\n {\n key: 'xAxis',\n label: 'X-Axis (Time/Categories)',\n description: 'Time dimensions or dimensions for X-axis',\n mandatory: true,\n acceptTypes: ['dimension', 'timeDimension'],\n emptyText: 'Drop time dimensions or dimensions here'\n },\n {\n key: 'yAxis',\n label: 'Y-Axis (Values)',\n description: 'Measures for line values',\n mandatory: true,\n acceptTypes: ['measure'],\n emptyText: 'Drop measures here'\n },\n {\n key: 'series',\n label: 'Series (Multiple Lines)',\n description: 'Dimensions to create separate lines',\n mandatory: false,\n acceptTypes: ['dimension'],\n emptyText: 'Drop dimensions here for multiple lines'\n }\n ],\n displayOptions: ['showLegend', 'showGrid', 'showTooltip']\n}","import type { ChartTypeConfig } from '../../charts/chartConfigs'\nimport { Icon } from '@iconify/react'\nimport chartAreaLineIcon from '@iconify-icons/tabler/chart-area-line'\n\n/**\n * Configuration for the area chart type\n */\nexport const areaChartConfig: ChartTypeConfig = {\n icon: ({ className }) => <Icon icon={chartAreaLineIcon} className={className} />,\n description: 'Emphasize magnitude of change over time',\n useCase: 'Best for showing cumulative totals, volume changes, or stacked comparisons over time',\n dropZones: [\n {\n key: 'xAxis',\n label: 'X-Axis (Time/Categories)',\n description: 'Time dimensions or dimensions for X-axis',\n mandatory: true,\n acceptTypes: ['dimension', 'timeDimension'],\n emptyText: 'Drop time dimensions or dimensions here'\n },\n {\n key: 'yAxis',\n label: 'Y-Axis (Values)',\n description: 'Measures for area values',\n mandatory: true,\n acceptTypes: ['measure'],\n emptyText: 'Drop measures here'\n },\n {\n key: 'series',\n label: 'Series (Stack Areas)',\n description: 'Dimensions to create stacked areas',\n mandatory: false,\n acceptTypes: ['dimension'],\n emptyText: 'Drop dimensions here for stacked areas'\n }\n ],\n displayOptions: ['showLegend', 'showGrid', 'showTooltip', 'stacked']\n}","import type { ChartTypeConfig } from '../../charts/chartConfigs'\nimport { Icon } from '@iconify/react'\nimport chartPieIcon from '@iconify-icons/tabler/chart-pie'\n\n/**\n * Configuration for the pie chart type\n */\nexport const pieChartConfig: ChartTypeConfig = {\n icon: ({ className }) => <Icon icon={chartPieIcon} className={className} />,\n description: 'Show proportions of a whole',\n useCase: 'Best for showing percentage distribution or composition of a total (limit to 5-7 slices)',\n dropZones: [\n {\n key: 'xAxis',\n label: 'Categories',\n description: 'Dimension for pie slices',\n mandatory: true,\n maxItems: 1,\n acceptTypes: ['dimension'],\n emptyText: 'Drop a dimension for categories'\n },\n {\n key: 'yAxis',\n label: 'Values',\n description: 'Measure for slice sizes',\n mandatory: true,\n maxItems: 1,\n acceptTypes: ['measure'],\n emptyText: 'Drop a measure for values'\n }\n ],\n displayOptions: ['showLegend', 'showTooltip']\n}","import type { ChartTypeConfig } from '../../charts/chartConfigs'\nimport { Icon } from '@iconify/react'\nimport chartDots2Icon from '@iconify-icons/tabler/chart-dots-2'\n\n/**\n * Configuration for the scatter chart type\n */\nexport const scatterChartConfig: ChartTypeConfig = {\n icon: ({ className }) => <Icon icon={chartDots2Icon} className={className} />,\n description: 'Reveal correlations between variables',\n useCase: 'Best for identifying patterns, correlations, outliers, and relationships between two measures',\n dropZones: [\n {\n key: 'xAxis',\n label: 'X-Axis',\n description: 'Measure or dimension for X position',\n mandatory: true,\n maxItems: 1,\n acceptTypes: ['dimension', 'timeDimension', 'measure'],\n emptyText: 'Drop a field for X-axis'\n },\n {\n key: 'yAxis',\n label: 'Y-Axis',\n description: 'Measure for Y position',\n mandatory: true,\n maxItems: 1,\n acceptTypes: ['measure'],\n emptyText: 'Drop a measure for Y-axis'\n },\n {\n key: 'series',\n label: 'Series (Color Groups)',\n description: 'Dimension to color points by category',\n mandatory: false,\n maxItems: 1,\n acceptTypes: ['dimension'],\n emptyText: 'Drop a dimension to color points'\n }\n ],\n displayOptions: ['showLegend', 'showGrid', 'showTooltip']\n}","import type { ChartTypeConfig } from '../../charts/chartConfigs'\nimport { Icon } from '@iconify/react'\nimport chartBubbleIcon from '@iconify-icons/tabler/chart-bubble'\n\n/**\n * Configuration for the bubble chart type\n */\nexport const bubbleChartConfig: ChartTypeConfig = {\n icon: ({ className }) => <Icon icon={chartBubbleIcon} className={className} />,\n description: 'Compare three dimensions of data',\n useCase: 'Best for showing relationships between three variables (X, Y, and size), market analysis',\n dropZones: [\n {\n key: 'xAxis',\n label: 'X-Axis',\n description: 'Horizontal axis position',\n mandatory: true,\n maxItems: 1,\n acceptTypes: ['dimension', 'timeDimension', 'measure'],\n emptyText: 'Drop a field for X-axis position'\n },\n {\n key: 'yAxis',\n label: 'Y-Axis', \n description: 'Vertical axis position',\n mandatory: true,\n maxItems: 1,\n acceptTypes: ['measure'],\n emptyText: 'Drop a measure for Y-axis position'\n },\n {\n key: 'sizeField',\n label: 'Bubble Radius',\n description: 'Size of bubbles based on this measure',\n mandatory: true,\n maxItems: 1,\n acceptTypes: ['measure'],\n emptyText: 'Drop a measure for bubble size'\n },\n {\n key: 'series',\n label: 'Bubble Labels',\n description: 'Field to use for bubble labels and identification',\n mandatory: true,\n maxItems: 1,\n acceptTypes: ['dimension'],\n emptyText: 'Drop a dimension for bubble labels'\n },\n {\n key: 'colorField',\n label: 'Bubble Colour',\n description: 'Color bubbles by this field (optional)',\n mandatory: false,\n maxItems: 1,\n acceptTypes: ['dimension', 'measure'],\n emptyText: 'Drop a field for bubble color (optional)'\n }\n ],\n displayOptions: ['showLegend', 'showGrid', 'showTooltip', 'minBubbleSize', 'maxBubbleSize', 'bubbleOpacity']\n}","import type { ChartTypeConfig } from '../../charts/chartConfigs'\nimport { Icon } from '@iconify/react'\nimport chartRadarIcon from '@iconify-icons/tabler/chart-radar'\n\n/**\n * Configuration for the radar chart type\n */\nexport const radarChartConfig: ChartTypeConfig = {\n icon: ({ className }) => <Icon icon={chartRadarIcon} className={className} />,\n description: 'Compare multiple metrics across categories',\n useCase: 'Best for multivariate comparisons, performance metrics, strengths/weaknesses analysis',\n dropZones: [\n {\n key: 'xAxis',\n label: 'Axes (Categories)',\n description: 'Dimensions for radar axes',\n mandatory: true,\n acceptTypes: ['dimension'],\n emptyText: 'Drop dimensions for radar axes'\n },\n {\n key: 'yAxis',\n label: 'Values',\n description: 'Measures for radar values',\n mandatory: true,\n acceptTypes: ['measure'],\n emptyText: 'Drop measures for values'\n },\n {\n key: 'series',\n label: 'Series (Multiple Shapes)',\n description: 'Dimensions to create multiple radar shapes',\n mandatory: false,\n acceptTypes: ['dimension'],\n emptyText: 'Drop dimensions for multiple shapes'\n }\n ],\n displayOptions: ['showLegend', 'showGrid', 'showTooltip']\n}","import type { ChartTypeConfig } from '../../charts/chartConfigs'\nimport { Icon } from '@iconify/react'\nimport chartRadarIcon from '@iconify-icons/tabler/radar-2'\n\n/**\n * Configuration for the radial bar chart type\n */\nexport const radialBarChartConfig: ChartTypeConfig = {\n icon: ({ className }) => <Icon icon={chartRadarIcon} className={className} />,\n description: 'Circular progress and KPI visualization',\n useCase: 'Best for showing progress toward goals, KPIs, or comparing percentages in a compact form',\n dropZones: [\n {\n key: 'xAxis',\n label: 'Categories',\n description: 'Dimensions for radial segments',\n mandatory: true,\n acceptTypes: ['dimension'],\n emptyText: 'Drop dimensions for categories'\n },\n {\n key: 'yAxis',\n label: 'Values',\n description: 'Measures for radial bar lengths',\n mandatory: true,\n maxItems: 1,\n acceptTypes: ['measure'],\n emptyText: 'Drop a measure for values'\n }\n ],\n displayOptions: ['showLegend', 'showTooltip']\n}","import type { ChartTypeConfig } from '../../charts/chartConfigs'\nimport { Icon } from '@iconify/react'\nimport chartTreemapIcon from '@iconify-icons/tabler/chart-treemap'\n\n/**\n * Configuration for the treemap chart type\n */\nexport const treemapChartConfig: ChartTypeConfig = {\n icon: ({ className }) => <Icon icon={chartTreemapIcon} className={className} />,\n description: 'Visualize hierarchical data with nested rectangles',\n useCase: 'Best for showing part-to-whole relationships in hierarchical data, disk usage, budget allocation',\n dropZones: [\n {\n key: 'xAxis',\n label: 'Categories',\n description: 'Dimensions for treemap rectangles',\n mandatory: true,\n acceptTypes: ['dimension'],\n emptyText: 'Drop dimensions for categories'\n },\n {\n key: 'yAxis',\n label: 'Size',\n description: 'Measure for rectangle sizes',\n mandatory: true,\n maxItems: 1,\n acceptTypes: ['measure'],\n emptyText: 'Drop a measure for size'\n },\n {\n key: 'series',\n label: 'Color Groups',\n description: 'Dimension to color rectangles by category',\n mandatory: false,\n maxItems: 1,\n acceptTypes: ['dimension'],\n emptyText: 'Drop a dimension for color grouping'\n }\n ],\n displayOptions: ['showLegend', 'showTooltip']\n}","import type { ChartTypeConfig } from '../../charts/chartConfigs'\nimport { Icon } from '@iconify/react'\nimport tableIcon from '@iconify-icons/tabler/table'\n\n/**\n * Configuration for the data table type\n */\nexport const dataTableConfig: ChartTypeConfig = {\n icon: ({ className }) => <Icon icon={tableIcon} className={className} />,\n description: 'Display detailed tabular data',\n useCase: 'Best for precise values, detailed analysis, sortable/filterable data exploration',\n dropZones: [\n {\n key: 'xAxis',\n label: 'Columns',\n description: 'All fields to display as columns',\n mandatory: false,\n acceptTypes: ['dimension', 'timeDimension', 'measure'],\n emptyText: 'Drop fields to display as columns (or leave empty for all)'\n }\n ],\n displayOptions: []\n}","import type { ChartTypeConfig } from '../../charts/chartConfigs'\nimport { Icon } from '@iconify/react'\nimport calendarIcon from '@iconify-icons/tabler/calendar-stats'\n\n/**\n * Configuration for the activity grid chart type\n */\nexport const activityGridChartConfig: ChartTypeConfig = {\n icon: ({ className }) => <Icon icon={calendarIcon} className={className} />,\n description: 'GitHub-style activity grid showing temporal patterns',\n useCase: 'Best for visualizing activity patterns over time, contribution calendars, and temporal heatmaps',\n dropZones: [\n {\n key: 'dateField',\n label: 'Time Dimension',\n description: 'Time field that determines grid structure (granularity affects layout)',\n mandatory: true,\n maxItems: 1,\n acceptTypes: ['timeDimension'],\n emptyText: 'Drop a time dimension (granularity affects grid structure)'\n },\n {\n key: 'valueField',\n label: 'Activity Measure',\n description: 'Measure used for activity intensity (color coding)',\n mandatory: true,\n maxItems: 1,\n acceptTypes: ['measure'],\n emptyText: 'Drop a measure for activity intensity'\n }\n ],\n displayOptions: ['showLabels', 'showTooltip', 'colorIntensity'],\n validate: (config) => {\n const { dateField, valueField } = config\n \n if (!dateField || (Array.isArray(dateField) && dateField.length === 0)) {\n return {\n isValid: false,\n message: 'Time dimension is required for activity grid'\n }\n }\n \n if (!valueField || (Array.isArray(valueField) && valueField.length === 0)) {\n return {\n isValid: false,\n message: 'Activity measure is required for intensity mapping'\n }\n }\n \n return { isValid: true }\n }\n}","import { barChartConfig } from '../components/charts/BarChart.config'\nimport { lineChartConfig } from '../components/charts/LineChart.config'\nimport { areaChartConfig } from '../components/charts/AreaChart.config'\nimport { pieChartConfig } from '../components/charts/PieChart.config'\nimport { scatterChartConfig } from '../components/charts/ScatterChart.config'\nimport { bubbleChartConfig } from '../components/charts/BubbleChart.config'\nimport { radarChartConfig } from '../components/charts/RadarChart.config'\nimport { radialBarChartConfig } from '../components/charts/RadialBarChart.config'\nimport { treemapChartConfig } from '../components/charts/TreeMapChart.config'\nimport { dataTableConfig } from '../components/charts/DataTable.config'\nimport { activityGridChartConfig } from '../components/charts/ActivityGridChart.config'\nimport type { ChartConfigRegistry } from './chartConfigs'\n\n/**\n * Registry of all chart type configurations\n */\nexport const chartConfigRegistry: ChartConfigRegistry = {\n bar: barChartConfig,\n line: lineChartConfig,\n area: areaChartConfig,\n pie: pieChartConfig,\n scatter: scatterChartConfig,\n bubble: bubbleChartConfig,\n radar: radarChartConfig,\n radialBar: radialBarChartConfig,\n treemap: treemapChartConfig,\n table: dataTableConfig,\n activityGrid: activityGridChartConfig\n}","import { ComponentType } from 'react'\n\n/**\n * Configuration for a single axis drop zone in the chart configuration UI\n */\nexport interface AxisDropZoneConfig {\n /** The key to store this field in chartConfig (e.g., 'xAxis', 'yAxis', 'sizeField') */\n key: string\n \n /** Display label for the drop zone */\n label: string\n \n /** Optional description/help text shown below the label */\n description?: string\n \n /** Whether at least one field is required in this drop zone */\n mandatory?: boolean\n \n /** Maximum number of items allowed in this drop zone */\n maxItems?: number\n \n /** Which field types this drop zone accepts */\n acceptTypes?: ('dimension' | 'timeDimension' | 'measure')[]\n \n /** Optional icon component to display */\n icon?: ComponentType<{ className?: string }>\n \n /** Placeholder text when drop zone is empty */\n emptyText?: string\n}\n\n/**\n * Complete configuration for a chart type\n */\nexport interface ChartTypeConfig {\n /** Configuration for each drop zone */\n dropZones: AxisDropZoneConfig[]\n \n /** Which display options to show for this chart type */\n displayOptions?: string[]\n \n /** Optional custom validation function */\n validate?: (config: any) => { isValid: boolean; message?: string }\n \n /** Icon component for the chart type */\n icon?: ComponentType<{ className?: string }>\n \n /** Brief description of the chart */\n description?: string\n \n /** When to use this chart type */\n useCase?: string\n}\n\n/**\n * Registry of all chart type configurations\n */\nexport interface ChartConfigRegistry {\n [chartType: string]: ChartTypeConfig\n}\n\n/**\n * Default configuration for charts without specific requirements\n */\nexport const defaultChartConfig: ChartTypeConfig = {\n dropZones: [\n {\n key: 'xAxis',\n label: 'X-Axis (Categories)',\n description: 'Dimensions and time dimensions for grouping',\n mandatory: false,\n acceptTypes: ['dimension', 'timeDimension'],\n emptyText: 'Drop dimensions & time dimensions here'\n },\n {\n key: 'yAxis',\n label: 'Y-Axis (Values)',\n description: 'Measures for values or dimensions for series',\n mandatory: false,\n acceptTypes: ['measure', 'dimension'],\n emptyText: 'Drop measures or dimensions here'\n },\n {\n key: 'series',\n label: 'Series (Split into Multiple Series)',\n description: 'Dimensions to create separate data series',\n mandatory: false,\n acceptTypes: ['dimension'],\n emptyText: 'Drop dimensions here to split data into series'\n }\n ],\n displayOptions: ['showLegend', 'showGrid', 'showTooltip']\n}\n\n/**\n * Helper function to get configuration for a chart type\n */\nexport function getChartConfig(chartType: string, registry: ChartConfigRegistry): ChartTypeConfig {\n return registry[chartType] || defaultChartConfig\n}","import React, { useMemo, useEffect } from 'react'\nimport { ChartBarIcon, TagIcon, CalendarIcon } from '@heroicons/react/24/outline'\nimport AxisDropZone from './AxisDropZone'\nimport { chartConfigRegistry } from '../charts/chartConfigRegistry'\nimport { getChartConfig } from '../charts/chartConfigs'\nimport type { ChartType, ChartAxisConfig, ChartDisplayConfig } from '../types'\n\ninterface ChartConfigPanelProps {\n chartType: ChartType\n chartConfig: ChartAxisConfig\n displayConfig: ChartDisplayConfig\n availableFields: {\n dimensions: string[]\n timeDimensions: string[]\n measures: string[]\n } | null\n onChartConfigChange: (config: ChartAxisConfig) => void\n onDisplayConfigChange: (config: ChartDisplayConfig) => void\n}\n\nexport default function ChartConfigPanel({\n chartType,\n chartConfig,\n displayConfig,\n availableFields,\n onChartConfigChange,\n onDisplayConfigChange\n}: ChartConfigPanelProps) {\n \n // Get configuration for current chart type\n const chartTypeConfig = useMemo(() => \n getChartConfig(chartType, chartConfigRegistry),\n [chartType]\n )\n\n // Get fields for each drop zone\n const getFieldsForDropZone = (key: string): string[] => {\n const value = chartConfig[key as keyof ChartAxisConfig]\n if (Array.isArray(value)) return value\n if (typeof value === 'string') return [value]\n return []\n }\n\n // Clean up chart config when available fields change\n useEffect(() => {\n if (!availableFields) return\n\n const allAvailableFields = [\n ...availableFields.dimensions,\n ...availableFields.timeDimensions,\n ...availableFields.measures\n ]\n\n let hasChanges = false\n const newConfig = { ...chartConfig }\n\n // Check each axis and remove fields that are no longer available\n chartTypeConfig.dropZones.forEach(dropZone => {\n const currentFields = getFieldsForDropZone(dropZone.key)\n const validFields = currentFields.filter(field => allAvailableFields.includes(field))\n \n if (validFields.length !== currentFields.length) {\n hasChanges = true\n if (validFields.length === 0) {\n // Remove the axis property entirely if no valid fields remain\n delete newConfig[dropZone.key as keyof ChartAxisConfig]\n } else if (dropZone.maxItems === 1) {\n // Single field axis - always store as string\n newConfig[dropZone.key as keyof ChartAxisConfig] = validFields[0] as any\n } else {\n // Multi-field axis - always store as array\n newConfig[dropZone.key as keyof ChartAxisConfig] = validFields as any\n }\n }\n })\n\n if (hasChanges) {\n onChartConfigChange(newConfig)\n }\n }, [availableFields, chartConfig, chartTypeConfig.dropZones, onChartConfigChange])\n\n // Helper to determine field type and styling\n const getFieldType = (field: string): 'dimension' | 'timeDimension' | 'measure' => {\n if (!availableFields) return 'dimension'\n if (availableFields.measures.includes(field)) return 'measure'\n if (availableFields.timeDimensions.includes(field)) return 'timeDimension'\n return 'dimension'\n }\n\n const getFieldStyling = (field: string) => {\n const fieldType = getFieldType(field)\n \n switch (fieldType) {\n case 'measure':\n return {\n IconComponent: ChartBarIcon,\n baseClasses: 'bg-amber-100 text-amber-800 border border-amber-200',\n hoverClasses: 'hover:bg-amber-200'\n }\n case 'timeDimension':\n return {\n IconComponent: CalendarIcon,\n baseClasses: 'bg-blue-100 text-blue-800 border border-blue-200',\n hoverClasses: 'hover:bg-blue-200'\n }\n default:\n return {\n IconComponent: TagIcon,\n baseClasses: 'bg-green-100 text-green-800 border border-green-200',\n hoverClasses: 'hover:bg-green-200'\n }\n }\n }\n\n // Drag and drop handlers\n const handleDragStart = (e: React.DragEvent<HTMLDivElement>, field: string, fromAxis: string) => {\n e.dataTransfer.setData('text/plain', JSON.stringify({ field, fromAxis }))\n }\n\n const handleDragOver = (e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault()\n }\n\n const handleDrop = (e: React.DragEvent<HTMLDivElement>, toAxis: string) => {\n e.preventDefault()\n const data = JSON.parse(e.dataTransfer.getData('text/plain'))\n const { field, fromAxis, isReorder } = data\n \n // Don't handle reorder drops here - let the AxisDropZone handle them\n if (isReorder && fromAxis === toAxis) {\n return\n }\n \n const newConfig = { ...chartConfig }\n \n // Remove from old location if moving between axes\n if (fromAxis !== 'available' && fromAxis !== toAxis) {\n const fromValue = newConfig[fromAxis as keyof ChartAxisConfig]\n if (Array.isArray(fromValue)) {\n newConfig[fromAxis as keyof ChartAxisConfig] = fromValue.filter(f => f !== field) as any\n } else if (fromValue === field) {\n delete newConfig[fromAxis as keyof ChartAxisConfig]\n }\n }\n \n // Add to new location\n const toValue = newConfig[toAxis as keyof ChartAxisConfig]\n const dropZoneConfig = chartTypeConfig.dropZones.find(dz => dz.key === toAxis)\n \n if (dropZoneConfig?.maxItems === 1) {\n // Single field - always store as string\n newConfig[toAxis as keyof ChartAxisConfig] = field as any\n } else {\n // Multiple fields - always store as array\n if (Array.isArray(toValue)) {\n if (!toValue.includes(field)) {\n newConfig[toAxis as keyof ChartAxisConfig] = [...toValue, field] as any\n }\n } else {\n newConfig[toAxis as keyof ChartAxisConfig] = [field] as any\n }\n }\n \n onChartConfigChange(newConfig)\n }\n\n const handleRemoveFromAxis = (field: string, fromAxis: string) => {\n const newConfig = { ...chartConfig }\n const value = newConfig[fromAxis as keyof ChartAxisConfig]\n \n if (Array.isArray(value)) {\n newConfig[fromAxis as keyof ChartAxisConfig] = value.filter(f => f !== field) as any\n } else if (value === field) {\n delete newConfig[fromAxis as keyof ChartAxisConfig]\n }\n \n onChartConfigChange(newConfig)\n }\n\n const handleReorder = (fromIndex: number, toIndex: number, axisKey: string) => {\n const newConfig = { ...chartConfig }\n const value = newConfig[axisKey as keyof ChartAxisConfig]\n \n // Only reorder if we have an array with multiple items\n if (Array.isArray(value) && value.length > 1 && fromIndex !== toIndex) {\n const newArray = [...value]\n const [movedItem] = newArray.splice(fromIndex, 1)\n newArray.splice(toIndex, 0, movedItem)\n newConfig[axisKey as keyof ChartAxisConfig] = newArray as any\n onChartConfigChange(newConfig)\n }\n }\n\n // Get unassigned fields\n const getUnassignedFields = () => {\n if (!availableFields) return { dimensions: [], timeDimensions: [], measures: [] }\n \n const assignedFields = new Set<string>()\n chartTypeConfig.dropZones.forEach(dz => {\n getFieldsForDropZone(dz.key).forEach(field => assignedFields.add(field))\n })\n \n return {\n dimensions: availableFields.dimensions.filter(f => !assignedFields.has(f)),\n timeDimensions: availableFields.timeDimensions.filter(f => !assignedFields.has(f)),\n measures: availableFields.measures.filter(f => !assignedFields.has(f))\n }\n }\n\n const unassignedFields = getUnassignedFields()\n\n\n return (\n <div>\n {/* Available Fields */}\n {availableFields && (\n <div className=\"mb-4\">\n <h4 className=\"text-xs font-semibold mb-2\">Available Fields</h4>\n <div className=\"border border-gray-200 rounded-lg p-2 bg-gray-50\">\n {(unassignedFields.dimensions.length > 0 || \n unassignedFields.timeDimensions.length > 0 || \n unassignedFields.measures.length > 0) ? (\n <div className=\"grid grid-cols-1 sm:grid-cols-3 gap-2 sm:gap-2 gap-y-4 sm:gap-y-2\">\n {/* Dimensions Column */}\n <div className=\"pb-2 sm:pb-0\">\n <div className=\"text-xs text-gray-600 mb-2 sm:mb-1 flex items-center\">\n <TagIcon className=\"w-3 h-3 mr-1\" />\n Dimensions\n </div>\n <div className=\"space-y-1\">\n {unassignedFields.dimensions.map(dim => (\n <div\n key={dim}\n draggable\n onDragStart={(e) => handleDragStart(e, dim, 'available')}\n className=\"bg-green-100 text-green-800 border border-green-200 hover:bg-green-200 rounded text-xs cursor-move px-3 py-2 sm:px-2 sm:py-1 truncate\"\n title={dim}\n >\n {dim}\n </div>\n ))}\n {unassignedFields.dimensions.length === 0 && (\n <div className=\"text-xs text-gray-400 italic\">None</div>\n )}\n </div>\n </div>\n \n {/* Time Dimensions Column */}\n <div className=\"pb-2 sm:pb-0\">\n <div className=\"text-xs text-gray-600 mb-2 sm:mb-1 flex items-center\">\n <CalendarIcon className=\"w-3 h-3 mr-1\" />\n Time Dimensions\n </div>\n <div className=\"space-y-1\">\n {unassignedFields.timeDimensions.map(dim => (\n <div\n key={dim}\n draggable\n onDragStart={(e) => handleDragStart(e, dim, 'available')}\n className=\"bg-blue-100 text-blue-800 border border-blue-200 hover:bg-blue-200 rounded text-xs cursor-move px-3 py-2 sm:px-2 sm:py-1 truncate\"\n title={dim}\n >\n {dim}\n </div>\n ))}\n {unassignedFields.timeDimensions.length === 0 && (\n <div className=\"text-xs text-gray-400 italic\">None</div>\n )}\n </div>\n </div>\n \n {/* Measures Column */}\n <div className=\"pb-2 sm:pb-0\">\n <div className=\"text-xs text-gray-600 mb-2 sm:mb-1 flex items-center\">\n <ChartBarIcon className=\"w-3 h-3 mr-1\" />\n Measures\n </div>\n <div className=\"space-y-1\">\n {unassignedFields.measures.map(measure => (\n <div\n key={measure}\n draggable\n onDragStart={(e) => handleDragStart(e, measure, 'available')}\n className=\"bg-amber-100 text-amber-800 border border-amber-200 hover:bg-amber-200 rounded text-xs cursor-move px-3 py-2 sm:px-2 sm:py-1 truncate\"\n title={measure}\n >\n {measure}\n </div>\n ))}\n {unassignedFields.measures.length === 0 && (\n <div className=\"text-xs text-gray-400 italic\">None</div>\n )}\n </div>\n </div>\n </div>\n ) : (\n <div className=\"text-xs text-gray-500 text-center py-2\">\n All fields have been assigned\n </div>\n )}\n </div>\n </div>\n )}\n\n {/* Chart Axis Configuration - Dynamic Drop Zones */}\n <div className=\"mb-4\">\n <h4 className=\"text-xs font-semibold mb-2\">Chart Configuration</h4>\n <div className=\"space-y-1\">\n {chartTypeConfig.dropZones.map(dropZone => (\n <AxisDropZone\n key={dropZone.key}\n config={dropZone}\n fields={getFieldsForDropZone(dropZone.key)}\n onDrop={handleDrop}\n onRemove={handleRemoveFromAxis}\n onDragStart={handleDragStart}\n onDragOver={handleDragOver}\n getFieldStyling={getFieldStyling}\n onReorder={handleReorder}\n />\n ))}\n </div>\n </div>\n\n {/* Display Options */}\n {chartTypeConfig.displayOptions && chartTypeConfig.displayOptions.length > 0 && (\n <div className=\"mb-4\">\n <h4 className=\"text-xs font-semibold mb-2\">Display Options</h4>\n <div className=\"space-y-1\">\n {chartTypeConfig.displayOptions.includes('showLegend') && (\n <label className=\"flex items-center space-x-2\">\n <input\n type=\"checkbox\"\n checked={displayConfig.showLegend ?? true}\n onChange={(e) => onDisplayConfigChange({\n ...displayConfig,\n showLegend: e.target.checked\n })}\n className=\"rounded border-gray-300 text-blue-600 focus:ring-blue-500\"\n />\n <span className=\"text-sm\">Show Legend</span>\n </label>\n )}\n \n {chartTypeConfig.displayOptions.includes('showGrid') && (\n <label className=\"flex items-center space-x-2\">\n <input\n type=\"checkbox\"\n checked={displayConfig.showGrid ?? true}\n onChange={(e) => onDisplayConfigChange({\n ...displayConfig,\n showGrid: e.target.checked\n })}\n className=\"rounded border-gray-300 text-blue-600 focus:ring-blue-500\"\n />\n <span className=\"text-sm\">Show Grid</span>\n </label>\n )}\n \n {chartTypeConfig.displayOptions.includes('showTooltip') && (\n <label className=\"flex items-center space-x-2\">\n <input\n type=\"checkbox\"\n checked={displayConfig.showTooltip ?? true}\n onChange={(e) => onDisplayConfigChange({\n ...displayConfig,\n showTooltip: e.target.checked\n })}\n className=\"rounded border-gray-300 text-blue-600 focus:ring-blue-500\"\n />\n <span className=\"text-sm\">Show Tooltip</span>\n </label>\n )}\n \n {chartTypeConfig.displayOptions.includes('stacked') && (\n <label className=\"flex items-center space-x-2\">\n <input\n type=\"checkbox\"\n checked={displayConfig.stacked ?? false}\n onChange={(e) => onDisplayConfigChange({\n ...displayConfig,\n stacked: e.target.checked\n })}\n className=\"rounded border-gray-300 text-blue-600 focus:ring-blue-500\"\n />\n <span className=\"text-sm\">Stacked</span>\n </label>\n )}\n </div>\n </div>\n )}\n </div>\n )\n}","import { useState } from 'react'\nimport { chartConfigRegistry } from '../charts/chartConfigRegistry'\nimport type { ChartType } from '../types'\n\ninterface ChartTypeSelectorProps {\n selectedType: ChartType\n onTypeChange: (type: ChartType) => void\n className?: string\n}\n\nexport default function ChartTypeSelector({ \n selectedType, \n onTypeChange, \n className = '' \n}: ChartTypeSelectorProps) {\n const [isOpen, setIsOpen] = useState(false)\n const chartTypes = Object.entries(chartConfigRegistry) as [ChartType, typeof chartConfigRegistry[keyof typeof chartConfigRegistry]][]\n\n // Chart type display names (fallback if not in config)\n const chartTypeLabels: Record<ChartType, string> = {\n bar: 'Bar Chart',\n line: 'Line Chart', \n area: 'Area Chart',\n pie: 'Pie Chart',\n scatter: 'Scatter Plot',\n bubble: 'Bubble Chart',\n radar: 'Radar Chart',\n radialBar: 'Radial Bar Chart',\n treemap: 'TreeMap',\n table: 'Data Table',\n activityGrid: 'Activity Grid'\n }\n\n const selectedConfig = chartConfigRegistry[selectedType]\n const SelectedIcon = selectedConfig?.icon\n const selectedLabel = chartTypeLabels[selectedType]\n\n return (\n <div className={`${className}`}>\n {/* Mobile Dropdown (visible on small screens) */}\n <div className=\"sm:hidden relative\">\n <button\n type=\"button\"\n onClick={() => setIsOpen(!isOpen)}\n className=\"w-full flex items-center justify-between px-3 py-2 border border-gray-300 rounded-md bg-white hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500\"\n >\n <div className=\"flex items-center space-x-2\">\n {SelectedIcon && (\n <SelectedIcon className=\"h-5 w-5 text-gray-600\" />\n )}\n <span className=\"text-sm font-medium text-gray-900\">{selectedLabel}</span>\n </div>\n <svg\n className={`h-4 w-4 text-gray-400 transform transition-transform ${isOpen ? 'rotate-180' : ''}`}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n </button>\n\n {/* Dropdown Menu */}\n {isOpen && (\n <div className=\"absolute z-10 mt-1 w-full bg-white border border-gray-300 rounded-md shadow-lg max-h-60 overflow-auto\">\n {chartTypes.map(([type, config]) => {\n const IconComponent = config.icon\n const label = chartTypeLabels[type]\n const isSelected = selectedType === type\n \n return (\n <button\n key={type}\n type=\"button\"\n onClick={() => {\n onTypeChange(type)\n setIsOpen(false)\n }}\n className={`w-full flex items-center space-x-3 px-3 py-2 text-left hover:bg-gray-50 ${\n isSelected ? 'bg-blue-50 text-blue-900' : 'text-gray-900'\n }`}\n >\n {IconComponent && (\n <IconComponent className={`h-5 w-5 ${\n isSelected ? 'text-blue-600' : 'text-gray-600'\n }`} />\n )}\n <span className=\"text-sm font-medium\">{label}</span>\n {isSelected && (\n <svg className=\"h-4 w-4 text-blue-600 ml-auto\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fillRule=\"evenodd\" d=\"M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z\" clipRule=\"evenodd\" />\n </svg>\n )}\n </button>\n )\n })}\n </div>\n )}\n </div>\n\n {/* Desktop Grid (hidden on small screens) */}\n <div className=\"hidden sm:block\">\n <div className=\"grid grid-cols-3 sm:grid-cols-4 lg:grid-cols-5 gap-2\">\n {chartTypes.map(([type, config]) => {\n const isSelected = selectedType === type\n const IconComponent = config.icon\n const label = chartTypeLabels[type]\n const description = config.description\n const useCase = config.useCase\n \n // Combine description and use case for tooltip\n const tooltipText = [description, useCase].filter(Boolean).join('. ')\n\n return (\n <button\n key={type}\n type=\"button\"\n onClick={() => onTypeChange(type)}\n className={`\n relative p-2 rounded-lg border-2 transition-all duration-200 ease-in-out\n text-center hover:shadow-md group min-h-[70px] flex flex-col items-center justify-center\n ${isSelected \n ? 'border-blue-500 bg-blue-50 shadow-md' \n : 'border-gray-200 bg-white hover:border-gray-300 hover:bg-gray-50'\n }\n `}\n title={tooltipText}\n >\n {/* Icon */}\n {IconComponent && (\n <IconComponent \n className={`h-6 w-6 mb-1.5 ${\n isSelected ? 'text-blue-600' : 'text-gray-600 group-hover:text-gray-800'\n }`} \n />\n )}\n \n {/* Chart name */}\n <h3 className={`font-medium text-xs leading-tight text-center ${\n isSelected ? 'text-blue-900' : 'text-gray-900'\n }`}>\n {label}\n </h3>\n\n {/* Selected indicator */}\n {isSelected && (\n <div className=\"absolute top-1.5 right-1.5\">\n <div className=\"w-2.5 h-2.5 bg-blue-500 rounded-full flex items-center justify-center\">\n <svg className=\"w-1.5 h-1.5 text-white\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fillRule=\"evenodd\" d=\"M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z\" clipRule=\"evenodd\" />\n </svg>\n </div>\n </div>\n )}\n </button>\n )\n })}\n </div>\n </div>\n </div>\n )\n}","import React, { useState, useEffect, useRef } from 'react'\nimport Modal from './Modal'\nimport QueryBuilder from './QueryBuilder'\nimport ChartConfigPanel from './ChartConfigPanel'\nimport ChartTypeSelector from './ChartTypeSelector'\nimport { useCubeContext } from '../providers/CubeProvider'\nimport type { PortletConfig, ChartAxisConfig, ChartDisplayConfig, ChartType } from '../types'\n\ninterface PortletEditModalProps {\n isOpen: boolean\n onClose: () => void\n onSave: (portlet: PortletConfig | Omit<PortletConfig, 'id' | 'x' | 'y'>) => void\n portlet?: PortletConfig | null\n title: string\n submitText: string\n}\n\n\nconst SAMPLE_QUERIES = [\n {\n name: 'Employee Count by Department',\n query: JSON.stringify({\n \"measures\": [\"Employees.count\"],\n \"dimensions\": [\"Departments.name\"],\n \"order\": { \"Employees.count\": \"desc\" }\n }, null, 2)\n },\n {\n name: 'Employee Hiring Trends',\n query: JSON.stringify({\n \"measures\": [\"Employees.count\"],\n \"timeDimensions\": [{\n \"dimension\": \"Employees.createdAt\",\n \"granularity\": \"month\"\n }],\n \"order\": { \"Employees.createdAt\": \"asc\" }\n }, null, 2)\n },\n {\n name: 'Department Budget Analysis',\n query: JSON.stringify({\n \"measures\": [\"Departments.totalBudget\", \"Departments.avgBudget\"],\n \"dimensions\": [\"Departments.name\"],\n \"order\": { \"Departments.totalBudget\": \"desc\" }\n }, null, 2)\n },\n {\n name: 'Daily Productivity Trends',\n query: JSON.stringify({\n \"measures\": [\"Productivity.avgLinesOfCode\", \"Productivity.totalPullRequests\"],\n \"timeDimensions\": [{\n \"dimension\": \"Productivity.date\",\n \"granularity\": \"day\"\n }],\n \"order\": { \"Productivity.date\": \"asc\" }\n }, null, 2)\n },\n {\n name: 'Happiness by Department',\n query: JSON.stringify({\n \"measures\": [\"Productivity.avgHappinessIndex\", \"Productivity.workingDaysCount\"],\n \"dimensions\": [\"Departments.name\"],\n \"order\": { \"Productivity.avgHappinessIndex\": \"desc\" }\n }, null, 2)\n },\n {\n name: 'Employee Salary Overview',\n query: JSON.stringify({\n \"measures\": [\"Employees.count\", \"Employees.avgSalary\", \"Employees.totalSalary\"],\n \"dimensions\": [\"Employees.isActive\"],\n \"order\": { \"Employees.avgSalary\": \"desc\" }\n }, null, 2)\n }\n]\n\nexport default function PortletEditModal({\n isOpen,\n onClose,\n onSave,\n portlet,\n title,\n submitText\n}: PortletEditModalProps) {\n // Get cube client from context\n const { cubeApi } = useCubeContext()\n const [formTitle, setFormTitle] = useState('')\n const [query, setQuery] = useState('')\n const [chartType, setChartType] = useState<ChartType>('bar')\n const [isValidating, setIsValidating] = useState(false)\n const [validationResult, setValidationResult] = useState<{ isValid: boolean; message: string } | null>(null)\n const [lastValidatedQuery, setLastValidatedQuery] = useState<string>('')\n const [dryRunData, setDryRunData] = useState<any>(null)\n const [chartConfig, setChartConfig] = useState<ChartAxisConfig>({ xAxis: [], yAxis: [], series: [] })\n const [displayConfig, setDisplayConfig] = useState<ChartDisplayConfig>({ showLegend: true, showGrid: true, showTooltip: true, stacked: false })\n const [showQueryBuilder, setShowQueryBuilder] = useState(false)\n const [queryBuilderInitialQuery, setQueryBuilderInitialQuery] = useState<any>(null)\n const queryBuilderRef = useRef<any>(null)\n\n // Validation only - no automatic chart config changes\n const autoPopulateChartConfig = (_result: any) => {\n // Do nothing - let the chart configuration panel handle all axis assignments manually\n // This preserves any existing user configuration and doesn't auto-assign fields\n }\n \n // Sensible defaults: slightly larger than 1/3 width with good aspect ratio\n const defaultWidth = 5\n const defaultHeight = 4\n\n\n // Initialize form values when modal opens or portlet changes\n useEffect(() => {\n if (isOpen) {\n if (portlet) {\n // Edit mode - populate with existing data\n setFormTitle(portlet.title)\n const formattedQuery = (() => {\n try {\n return JSON.stringify(JSON.parse(portlet.query), null, 2)\n } catch {\n return portlet.query\n }\n })()\n setQuery(formattedQuery)\n setChartType(portlet.chartType)\n setChartConfig(portlet.chartConfig || { xAxis: [], yAxis: [], series: [] })\n setDisplayConfig(portlet.displayConfig || {})\n setLastValidatedQuery(formattedQuery)\n setValidationResult({ isValid: true, message: 'Loaded query (assumed valid)' })\n setDryRunData(null)\n \n // Auto-run dry-run validation for edit mode to enable chart configuration\n setTimeout(() => {\n runDryRunValidation(formattedQuery, true, true)\n }, 100)\n } else {\n // Create mode - clear form\n setFormTitle('')\n setQuery('')\n setChartType('bar')\n setChartConfig({ xAxis: [], yAxis: [], series: [] })\n setDisplayConfig({ showLegend: true, showGrid: true, showTooltip: true, stacked: false })\n setLastValidatedQuery('')\n setValidationResult(null)\n setDryRunData(null)\n }\n setIsValidating(false)\n }\n }, [isOpen, portlet])\n\n const handleSubmit = (e: React.FormEvent) => {\n console.log('handleSubmit called!')\n e.preventDefault()\n \n if (!formTitle.trim() || !query.trim()) {\n console.log('handleSubmit: missing title or query, returning')\n return\n }\n\n // Require validation before saving only if query has changed\n if (hasQueryChanged || (lastValidatedQuery === '' && query.trim() !== '')) {\n alert('Please validate your query before saving.')\n return\n }\n\n // Validate JSON\n try {\n JSON.parse(query)\n } catch (e) {\n alert('Invalid JSON in query. Please check your syntax.')\n return\n }\n\n if (portlet) {\n // Edit mode - return full portlet config\n onSave({\n ...portlet,\n title: formTitle.trim(),\n query: query.trim(),\n chartType,\n chartConfig: (chartConfig.xAxis?.length ?? 0) > 0 || (chartConfig.yAxis?.length ?? 0) > 0 || (chartConfig.series && chartConfig.series.length > 0) ? chartConfig : undefined,\n displayConfig: displayConfig,\n w: portlet.w || defaultWidth,\n h: portlet.h || defaultHeight\n })\n } else {\n // Create mode - return partial config\n onSave({\n title: formTitle.trim(),\n query: query.trim(),\n chartType,\n chartConfig: (chartConfig.xAxis?.length ?? 0) > 0 || (chartConfig.yAxis?.length ?? 0) > 0 || (chartConfig.series && chartConfig.series.length > 0) ? chartConfig : undefined,\n displayConfig: displayConfig,\n w: defaultWidth,\n h: defaultHeight\n })\n }\n }\n\n const handleSampleQuery = (sampleQuery: string) => {\n setQuery(sampleQuery)\n setValidationResult(null)\n setLastValidatedQuery('')\n setDryRunData(null)\n // Sample queries always clear chart config since they're completely different\n setChartConfig({ xAxis: [], yAxis: [], series: [] })\n }\n\n const handleQueryChange = (value: string) => {\n setQuery(value)\n setValidationResult(null)\n setDryRunData(null)\n // Only clear chart config for new portlets, preserve existing config for edits\n if (!portlet) {\n setChartConfig({ xAxis: [], yAxis: [], series: [] })\n }\n }\n\n const runDryRunValidation = async (queryToValidate: string, silent = false, isEditModeLoad = false) => {\n if (!queryToValidate.trim()) {\n if (!silent) {\n setValidationResult({ isValid: false, message: 'Query cannot be empty' })\n }\n return\n }\n\n let parsedQuery\n try {\n parsedQuery = JSON.parse(queryToValidate)\n } catch (e) {\n if (!silent) {\n setValidationResult({ isValid: false, message: 'Invalid JSON syntax' })\n }\n return\n }\n\n if (!silent) {\n setIsValidating(true)\n setValidationResult(null)\n }\n\n try {\n const result = await cubeApi.dryRun(parsedQuery)\n\n // Check if validation is successful:\n // 1. Must have queryType (always present in successful Cube.js responses) \n // 2. Must not have an error\n const isValid = !result.error && result.queryType\n \n if (isValid) {\n setDryRunData(result)\n \n if (!silent) {\n const details = []\n \n if (result.pivotQuery?.query) {\n if (result.pivotQuery.query.measures?.length > 0) {\n details.push(`${result.pivotQuery.query.measures.length} measure${result.pivotQuery.query.measures.length > 1 ? 's' : ''}`)\n }\n if (result.pivotQuery.query.dimensions?.length > 0) {\n details.push(`${result.pivotQuery.query.dimensions.length} dimension${result.pivotQuery.query.dimensions.length > 1 ? 's' : ''}`)\n }\n if (result.pivotQuery.query.filters?.length > 0) {\n details.push(`${result.pivotQuery.query.filters.length} filter${result.pivotQuery.query.filters.length > 1 ? 's' : ''}`)\n }\n if (result.pivotQuery.query.timeDimensions?.length > 0) {\n details.push(`${result.pivotQuery.query.timeDimensions.length} time dimension${result.pivotQuery.query.timeDimensions.length > 1 ? 's' : ''}`)\n }\n }\n\n if (result.complexity) {\n details.push(`${result.complexity} complexity`)\n }\n if (result.sql?.sql) {\n details.push('SQL generated')\n }\n if (result.cubesUsed?.length > 0) {\n details.push(`Cubes: ${result.cubesUsed.join(', ')}`)\n }\n \n const message = details.length > 0 ? `Query validated successfully (${details.join(', ')})` : 'Query validated successfully'\n setValidationResult({ isValid: true, message })\n setLastValidatedQuery(queryToValidate)\n }\n\n // Auto-populate chart config with sensible defaults on successful validation\n if (!isEditModeLoad) {\n autoPopulateChartConfig(result)\n }\n } else {\n if (!silent) {\n const errorMsg = result.error || 'Query validation failed'\n const details = result.details ? ` - ${Array.isArray(result.details) ? result.details.join(', ') : result.details}` : ''\n setValidationResult({ \n isValid: false, \n message: errorMsg + details\n })\n setLastValidatedQuery(queryToValidate)\n }\n }\n } catch (error) {\n if (!silent) {\n setValidationResult({ \n isValid: false, \n message: error instanceof Error ? error.message : 'Network error during validation' \n })\n setLastValidatedQuery(queryToValidate)\n }\n } finally {\n if (!silent) {\n setIsValidating(false)\n }\n }\n }\n\n const handleValidateQuery = async () => {\n await runDryRunValidation(query)\n }\n\n const handleOpenQueryBuilder = () => {\n // Parse the current query and set it as the initial query for QueryBuilder\n const initialQuery = query ? (() => {\n try {\n return JSON.parse(query)\n } catch {\n return {}\n }\n })() : {}\n \n setQueryBuilderInitialQuery(initialQuery)\n setShowQueryBuilder(true)\n }\n\n\n const handleApplyQueryBuilderQuery = (e?: React.MouseEvent) => {\n e?.preventDefault()\n e?.stopPropagation()\n \n if (!queryBuilderRef.current) return\n \n console.log('Apply Query clicked - starting...')\n \n // Get current query and validation state from QueryBuilder\n const currentQuery = queryBuilderRef.current.getCurrentQuery()\n const validationState = queryBuilderRef.current.getValidationState()\n const validationResult = queryBuilderRef.current.getValidationResult()\n \n console.log('Current query:', currentQuery)\n console.log('Validation state:', validationState)\n console.log('Full validation result:', validationResult)\n \n // Apply the query to the form\n const formattedQuery = JSON.stringify(currentQuery, null, 2)\n setQuery(formattedQuery)\n \n // If QueryBuilder had a valid query, transfer the validation state and dry-run data\n if (validationState?.status === 'valid' && validationResult) {\n setValidationResult({ \n isValid: true, \n message: 'Query validated in Query Builder' \n })\n setLastValidatedQuery(formattedQuery)\n \n // Transfer the dry-run data from QueryBuilder validation result\n setDryRunData(validationResult)\n \n // Auto-populate chart config using the same logic as form validation\n autoPopulateChartConfig(validationResult)\n } else {\n // Reset validation state if query wasn't validated in QueryBuilder\n setValidationResult(null)\n setLastValidatedQuery('')\n setDryRunData(null)\n }\n \n console.log('About to switch back to form mode...')\n \n // Return to form view to continue editing\n setShowQueryBuilder(false)\n \n console.log('Switched back to form mode.')\n }\n\n const handleBackToForm = () => {\n setShowQueryBuilder(false)\n setQueryBuilderInitialQuery(null)\n }\n\n const handleClose = () => {\n setFormTitle('')\n setQuery('')\n setChartType('bar')\n setChartConfig({ xAxis: [], yAxis: [], series: [] })\n setDisplayConfig({ showLegend: true, showGrid: true, showTooltip: true, stacked: false })\n setValidationResult(null)\n setIsValidating(false)\n setLastValidatedQuery('')\n setDryRunData(null)\n setShowQueryBuilder(false)\n setQueryBuilderInitialQuery(null)\n onClose()\n }\n\n const isEditMode = !!portlet\n const hasQueryChanged = query.trim() !== lastValidatedQuery.trim() && lastValidatedQuery !== ''\n const isQueryValidAndCurrent = validationResult?.isValid && query.trim() === lastValidatedQuery.trim()\n\n\n const availableFields = dryRunData?.pivotQuery?.query ? {\n dimensions: dryRunData.pivotQuery.query.dimensions || [],\n timeDimensions: dryRunData.pivotQuery.query.timeDimensions?.map((td: any) => td.dimension) || [],\n measures: dryRunData.pivotQuery.query.measures || []\n } : null\n\n\n const footer = showQueryBuilder ? (\n <>\n <button\n type=\"button\"\n onClick={handleBackToForm}\n className=\"px-4 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-md hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-blue-500\"\n >\n Back to Form\n </button>\n <button\n type=\"button\"\n onClick={handleApplyQueryBuilderQuery}\n className=\"px-4 py-2 text-sm font-medium text-white bg-blue-600 border border-transparent rounded-md hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-blue-500\"\n title=\"Apply query to form\"\n >\n Apply Query\n </button>\n </>\n ) : (\n <>\n <button\n type=\"button\"\n onClick={handleClose}\n className=\"px-4 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-md hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-blue-500\"\n >\n Cancel\n </button>\n <button\n type=\"submit\"\n form=\"portlet-form\"\n className=\"px-4 py-2 text-sm font-medium text-white bg-blue-600 border border-transparent rounded-md hover:bg-blue-700 disabled:opacity-50 disabled:cursor-not-allowed focus:outline-none focus:ring-2 focus:ring-blue-500\"\n disabled={!formTitle.trim() || !query.trim() || (hasQueryChanged || (lastValidatedQuery === '' && query.trim() !== ''))}\n title={(hasQueryChanged || (lastValidatedQuery === '' && query.trim() !== '')) ? \"Please validate your query before saving\" : \"\"}\n >\n {submitText}\n </button>\n </>\n )\n\n return (\n <Modal\n isOpen={isOpen}\n onClose={handleClose}\n title={showQueryBuilder ? \"Query Builder\" : title}\n size=\"fullscreen-mobile\"\n footer={footer}\n noPadding={showQueryBuilder}\n >\n {showQueryBuilder ? (\n <QueryBuilder\n ref={queryBuilderRef}\n initialQuery={queryBuilderInitialQuery}\n disableLocalStorage={true}\n hideSettings={true}\n className=\"flex-1 w-full\"\n />\n ) : (\n <form id=\"portlet-form\" onSubmit={handleSubmit} className=\"space-y-4\">\n {/* Main layout - Responsive: single column on mobile, two columns on desktop */}\n <div className=\"flex flex-col lg:flex-row gap-4\">\n {/* Left side - Title, Chart Type, Query */}\n <div className=\"flex-1 flex flex-col gap-4\">\n {/* Title */}\n <div>\n <label className=\"block text-sm font-semibold text-gray-700 mb-1\">\n Title\n </label>\n <input\n type=\"text\"\n value={formTitle}\n onChange={(e) => setFormTitle(e.target.value)}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500\"\n placeholder=\"Enter portlet title...\"\n required \n />\n </div>\n\n {/* Chart Type */}\n <div>\n <label className=\"block text-sm font-semibold text-gray-700 mb-3\">\n Chart Type\n </label>\n <ChartTypeSelector\n selectedType={chartType}\n onTypeChange={setChartType}\n />\n </div>\n\n\n {/* Query Editor */}\n <div className=\"flex-1 flex flex-col\">\n <div className=\"flex justify-between items-center mb-1\">\n <label className=\"block text-sm font-semibold text-gray-700\">\n Cube.js Query (JSON)\n </label>\n <div className=\"flex items-center space-x-2\">\n <button\n type=\"button\"\n onClick={handleOpenQueryBuilder}\n className=\"text-xs px-2 py-1 text-purple-600 bg-white hover:bg-purple-50 rounded border border-purple-600 hover:border-purple-700 focus:outline-none focus:ring-2 focus:ring-purple-500\"\n >\n Edit in Query Builder\n </button>\n </div>\n </div>\n <textarea\n value={query}\n onChange={(e) => handleQueryChange(e.target.value)}\n className=\"flex-1 w-full min-h-64 px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 font-mono text-xs resize-y\"\n placeholder={`{\n \"measures\": [\"People.count\"],\n \"dimensions\": [\"People.active\"]\n}`}\n required\n />\n </div>\n </div>\n\n {/* Right side - Chart Configuration */}\n <div className=\"flex-1 flex flex-col\">\n <label className=\"block text-sm font-semibold text-gray-700 mb-1\">\n Chart Axis Configuration\n </label>\n \n {!dryRunData || !isQueryValidAndCurrent ? (\n <div className=\"flex-1 flex items-center justify-center border-2 border-dashed border-gray-300 rounded-lg bg-gray-50\">\n <div className=\"text-center text-gray-500\">\n <svg className=\"h-8 w-8 mx-auto mb-2\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M7 16V4m0 0L3 8m4-4l4 4m6 0v12m0 0l4-4m-4 4l-4-4\" />\n </svg>\n <p className=\"text-sm\">Validate query first to configure chart axes</p>\n </div>\n </div>\n ) : (\n <div className=\"rounded-lg bg-white p-3 border border-gray-200\">\n <ChartConfigPanel\n chartType={chartType}\n chartConfig={chartConfig}\n displayConfig={displayConfig}\n availableFields={availableFields}\n onChartConfigChange={setChartConfig}\n onDisplayConfigChange={setDisplayConfig}\n />\n </div>\n )}\n </div>\n </div>\n \n {/* Validation section */}\n {(hasQueryChanged || (lastValidatedQuery === '' && query.trim() !== '') || (validationResult && query.trim() === lastValidatedQuery.trim() && validationResult.message !== 'Loaded query (assumed valid)')) && (\n <div className={`rounded-lg p-4 ${\n validationResult?.isValid && query.trim() === lastValidatedQuery.trim()\n ? 'bg-green-50'\n : validationResult && !validationResult.isValid\n ? 'bg-red-50'\n : hasQueryChanged\n ? 'bg-amber-50'\n : 'bg-gray-50'\n }`}>\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center space-x-3\">\n <div className={`w-2 h-2 rounded-full ${\n validationResult?.isValid && query.trim() === lastValidatedQuery.trim()\n ? 'bg-green-500'\n : validationResult && !validationResult.isValid\n ? 'bg-red-500'\n : hasQueryChanged\n ? 'bg-amber-500'\n : 'bg-gray-400'\n }`}></div>\n <div>\n <h3 className={`text-sm font-medium ${\n validationResult?.isValid && query.trim() === lastValidatedQuery.trim()\n ? 'text-green-800'\n : validationResult && !validationResult.isValid\n ? 'text-red-800'\n : hasQueryChanged\n ? 'text-amber-800'\n : 'text-gray-700'\n }`}>\n {validationResult?.isValid && query.trim() === lastValidatedQuery.trim()\n ? 'Query validated successfully'\n : validationResult && !validationResult.isValid\n ? 'Query validation failed'\n : hasQueryChanged\n ? 'Query modified - validation required'\n : 'Query validation required'\n }\n </h3>\n {validationResult && (\n <p className={`text-xs mt-1 ${\n validationResult.isValid ? 'text-green-600' : 'text-red-600'\n }`}>\n {validationResult.message}\n </p>\n )}\n </div>\n </div>\n \n <button\n type=\"button\"\n onClick={handleValidateQuery}\n disabled={isValidating || !query.trim()}\n className={`px-3 py-1.5 text-sm font-medium rounded-md transition-colors flex items-center space-x-1.5 ${\n validationResult?.isValid && query.trim() === lastValidatedQuery.trim()\n ? 'bg-green-600 text-white hover:bg-green-700'\n : validationResult && !validationResult.isValid\n ? 'bg-red-600 text-white hover:bg-red-700'\n : 'bg-blue-600 text-white hover:bg-blue-700'\n } disabled:opacity-50 disabled:cursor-not-allowed focus:outline-none focus:ring-2 focus:ring-blue-500`}\n >\n {isValidating ? (\n <>\n <svg className=\"animate-spin h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"4\"></circle>\n <path className=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n </svg>\n <span>Validating</span>\n </>\n ) : validationResult?.isValid && query.trim() === lastValidatedQuery.trim() ? (\n <>\n <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n <span>Validated</span>\n </>\n ) : (\n <>\n <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n <span>Validate</span>\n </>\n )}\n </button>\n </div>\n </div>\n )}\n\n {/* Sample Queries - only show for create mode */}\n {!isEditMode && (\n <div>\n <label className=\"block text-sm text-gray-600 mb-2\">Sample Queries (click to use)</label>\n <div className=\"flex flex-wrap gap-2 mb-2\">\n {SAMPLE_QUERIES.map((sample, index) => (\n <button\n key={index}\n type=\"button\"\n onClick={() => handleSampleQuery(sample.query)}\n className=\"px-2 py-1 text-xs text-gray-700 bg-gray-100 border border-gray-300 rounded cursor-pointer transition-all duration-200 ease-in-out hover:bg-gray-200 hover:border-gray-400 m-0.5\"\n >\n {sample.name}\n </button>\n ))}\n </div>\n </div>\n )}\n </form>\n )}\n </Modal>\n )\n}","import { useState, useEffect } from 'react'\n\ninterface DebugModalProps {\n chartConfig: any\n displayConfig: any\n queryObject: any\n data: any[]\n chartType: string\n}\n\nexport default function DebugModal({ \n chartConfig, \n displayConfig, \n queryObject, \n data, \n chartType \n}: DebugModalProps) {\n const [isOpen, setIsOpen] = useState(false)\n\n // Handle ESC key to close modal\n useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape' && isOpen) {\n setIsOpen(false)\n }\n }\n\n document.addEventListener('keydown', handleKeyDown)\n return () => document.removeEventListener('keydown', handleKeyDown)\n }, [isOpen])\n\n // Trigger Prism highlighting when modal opens and content is rendered\n useEffect(() => {\n if (isOpen && typeof window !== 'undefined' && (window as any).Prism) {\n // Small delay to ensure DOM is updated\n const timer = setTimeout(() => {\n (window as any).Prism.highlightAll()\n }, 10)\n \n return () => clearTimeout(timer)\n }\n }, [isOpen])\n\n\n if (!isOpen) {\n return (\n <button\n onClick={() => setIsOpen(true)}\n className=\"p-1 text-gray-400 hover:text-gray-600 transition-colors\"\n title=\"Debug chart configuration\"\n >\n <svg \n width=\"16\" \n height=\"16\" \n viewBox=\"0 0 24 24\" \n fill=\"none\" \n stroke=\"currentColor\" \n strokeWidth=\"2\" \n strokeLinecap=\"round\" \n strokeLinejoin=\"round\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\"/>\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"/>\n <line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"/>\n </svg>\n </button>\n )\n }\n\n return (\n <div \n className=\"absolute inset-0 bg-white border border-gray-200 rounded-lg z-[9999] overflow-auto\"\n onClick={(e) => e.stopPropagation()}\n >\n <div className=\"p-4 h-full flex flex-col\">\n <div className=\"flex justify-between items-center mb-4 flex-shrink-0\">\n <h2 className=\"text-lg font-semibold\">Chart Debug Information</h2>\n <button\n onClick={() => setIsOpen(false)}\n className=\"p-2 text-gray-400 hover:text-gray-600 hover:bg-gray-100 rounded\"\n >\n <svg \n width=\"16\" \n height=\"16\" \n viewBox=\"0 0 24 24\" \n fill=\"none\" \n stroke=\"currentColor\" \n strokeWidth=\"2\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/>\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/>\n </svg>\n </button>\n </div>\n\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-4 flex-1 overflow-auto\">\n <div>\n <h3 className=\"text-sm font-medium text-gray-700 mb-2\">Chart Type</h3>\n <div className=\"bg-gray-50 p-2 rounded text-sm font-mono border\">\n {chartType}\n </div>\n </div>\n\n <div>\n <h3 className=\"text-sm font-medium text-gray-700 mb-2\">Field Analysis</h3>\n <div className=\"bg-gray-50 p-2 rounded text-xs space-y-1 border\">\n <div>\n <strong>xAxis:</strong> {Array.isArray(chartConfig?.xAxis) ? `Array: [${chartConfig.xAxis.join(', ')}]` : `String: \"${chartConfig?.xAxis}\"`}\n </div>\n <div>\n <strong>yAxis:</strong> {Array.isArray(chartConfig?.yAxis) ? `Array: [${chartConfig.yAxis.join(', ')}]` : `String: \"${chartConfig?.yAxis}\"`}\n </div>\n <div>\n <strong>series:</strong> {Array.isArray(chartConfig?.series) ? `Array: [${chartConfig.series.join(', ')}]` : `String: \"${chartConfig?.series}\"`}\n </div>\n {chartConfig?.sizeField && (\n <div>\n <strong>sizeField:</strong> {Array.isArray(chartConfig?.sizeField) ? `Array: [${chartConfig.sizeField.join(', ')}]` : `String: \"${chartConfig?.sizeField}\"`}\n </div>\n )}\n {chartConfig?.colorField && (\n <div>\n <strong>colorField:</strong> {Array.isArray(chartConfig?.colorField) ? `Array: [${chartConfig.colorField.join(', ')}]` : `String: \"${chartConfig?.colorField}\"`}\n </div>\n )}\n </div>\n </div>\n\n <div className=\"lg:col-span-2\">\n <h3 className=\"text-sm font-medium text-gray-700 mb-2\">Chart Config</h3>\n <pre className=\"text-gray-700 overflow-x-auto font-mono p-2 rounded border\" style={{ fontSize: '10px', lineHeight: '1.4' }}>\n <code className=\"language-json\">{JSON.stringify(chartConfig, null, 2)}</code>\n </pre>\n </div>\n\n <div className=\"lg:col-span-2\">\n <h3 className=\"text-sm font-medium text-gray-700 mb-2\">Display Config</h3>\n <pre className=\"text-gray-700 overflow-x-auto font-mono p-2 rounded border\" style={{ fontSize: '10px', lineHeight: '1.4' }}>\n <code className=\"language-json\">{JSON.stringify(displayConfig, null, 2)}</code>\n </pre>\n </div>\n\n <div className=\"lg:col-span-2\">\n <h3 className=\"text-sm font-medium text-gray-700 mb-2\">Query Object</h3>\n <pre className=\"text-gray-700 overflow-x-auto font-mono p-2 rounded border\" style={{ fontSize: '10px', lineHeight: '1.4' }}>\n <code className=\"language-json\">{JSON.stringify(queryObject, null, 2)}</code>\n </pre>\n </div>\n\n <div className=\"lg:col-span-2\">\n <h3 className=\"text-sm font-medium text-gray-700 mb-2\">Data Sample (first 3 rows)</h3>\n <pre className=\"text-gray-700 overflow-x-auto font-mono p-2 rounded border\" style={{ fontSize: '10px', lineHeight: '1.4' }}>\n <code className=\"language-json\">{JSON.stringify(data?.slice(0, 3) || [], null, 2)}</code>\n </pre>\n </div>\n </div>\n\n <div className=\"mt-4 pt-2 border-t border-gray-200 text-xs text-gray-500 flex-shrink-0\">\n Press <kbd className=\"px-1 py-0.5 bg-gray-100 rounded text-xs\">ESC</kbd> to close\n </div>\n </div>\n </div>\n )\n}","/**\n * Dashboard Grid Component\n * Uses react-grid-layout for responsive grid layout\n * Simplified version without app-specific dependencies\n */\n\nimport { useCallback, useRef, useState, useEffect } from 'react'\nimport { Responsive, WidthProvider } from 'react-grid-layout'\nimport { ChartBarIcon, ArrowPathIcon, PencilIcon, TrashIcon, PlusIcon } from '@heroicons/react/24/outline'\nimport AnalyticsPortlet from './AnalyticsPortlet'\nimport PortletEditModal from './PortletEditModal'\nimport DebugModal from './DebugModal'\nimport type { DashboardConfig, PortletConfig } from '../types'\n\n// CSS for react-grid-layout should be imported by the consuming app\n// import 'react-grid-layout/css/styles.css'\n\nconst ResponsiveGridLayout = WidthProvider(Responsive)\n\ninterface DashboardGridProps {\n config: DashboardConfig\n editable?: boolean\n onConfigChange?: (config: DashboardConfig) => void\n onPortletRefresh?: (portletId: string) => void\n onSave?: (config: DashboardConfig) => Promise<void> | void\n}\n\nexport default function DashboardGrid({ \n config, \n editable = false, \n onConfigChange,\n onPortletRefresh,\n onSave\n}: DashboardGridProps) {\n // Refs to store portlet refs for refresh functionality\n const portletRefs = useRef<{ [key: string]: HTMLDivElement | null }>({})\n const portletComponentRefs = useRef<{ [key: string]: { refresh: () => void } | null }>({})\n\n // Track if component has been initialized to prevent saves during initial load\n const [isInitialized, setIsInitialized] = useState(false)\n const [lastKnownLayout, setLastKnownLayout] = useState<any[]>([])\n \n // Edit mode state - dashboard is readonly by default\n const [isEditMode, setIsEditMode] = useState(false)\n \n // Track current breakpoint to handle mobile vs desktop saves differently\n const [currentBreakpoint, setCurrentBreakpoint] = useState<string>('lg')\n \n // Track scroll state for sticky header\n const [isScrolled, setIsScrolled] = useState(false)\n\n // Modal states\n const [isPortletModalOpen, setIsPortletModalOpen] = useState(false)\n const [editingPortlet, setEditingPortlet] = useState<PortletConfig | null>(null)\n\n // Debug data state - keyed by portlet ID\n const [debugData, setDebugData] = useState<{ [portletId: string]: {\n chartConfig: any\n displayConfig: any\n queryObject: any\n data: any[]\n chartType: string\n } }>({})\n\n // Set up initialization tracking\n useEffect(() => {\n // Mark as initialized after first render to prevent saves during load/resize\n const timer = setTimeout(() => {\n setIsInitialized(true)\n // Store initial layout for comparison\n const initialLayout = config.portlets.map(portlet => ({\n i: portlet.id,\n x: portlet.x,\n y: portlet.y,\n w: portlet.w,\n h: portlet.h\n }))\n setLastKnownLayout(initialLayout)\n }, 200) // Slightly longer delay to ensure responsive grid is fully settled\n\n return () => clearTimeout(timer)\n }, [config.portlets])\n\n // Set up scroll listener for sticky header\n useEffect(() => {\n const handleScroll = () => {\n const scrollTop = window.pageYOffset || document.documentElement.scrollTop\n setIsScrolled(scrollTop > 20) // Add sticky styling after scrolling 20px\n }\n\n window.addEventListener('scroll', handleScroll, { passive: true })\n \n // Check initial scroll position\n handleScroll()\n\n return () => {\n window.removeEventListener('scroll', handleScroll)\n }\n }, [])\n\n // Helper function to check if layout actually changed (not just reordered due to responsive changes)\n const hasLayoutActuallyChanged = useCallback((newLayout: any[]) => {\n if (!isInitialized || lastKnownLayout.length === 0) return false\n \n // Compare each item's position and size\n for (const newItem of newLayout) {\n const oldItem = lastKnownLayout.find(item => item.i === newItem.i)\n if (!oldItem) continue // New item, this is a change\n \n if (oldItem.x !== newItem.x || oldItem.y !== newItem.y || \n oldItem.w !== newItem.w || oldItem.h !== newItem.h) {\n return true\n }\n }\n return false\n }, [isInitialized, lastKnownLayout])\n\n const handleLayoutChange = useCallback((_currentLayout: any[], _allLayouts: any) => {\n // This function is called for ALL layout changes including responsive breakpoints\n // We should NOT save here - only update internal state if needed\n // Actual saving only happens in handleDragStop and handleResizeStop for explicit user actions\n \n // Note: We don't call onConfigChange here to prevent saving responsive layout changes\n // The layout changes are handled by react-grid-layout internally\n }, []) // No dependencies since we're not doing anything\n\n // Handle drag stop - save when user finishes dragging (only if layout actually changed)\n const handleDragStop = useCallback(async (layout: any[], _oldItem: any, _newItem: any, _placeholder: any, _e: any, _element: any) => {\n if (!editable || !isEditMode || !onSave || !isInitialized) return\n\n // Only save if the layout actually changed from user interaction\n if (!hasLayoutActuallyChanged(layout)) {\n return // No actual change, don't save\n }\n\n // Get the current updated config - on mobile only update position, preserve desktop sizing\n const updatedPortlets = config.portlets.map(portlet => {\n const layoutItem = layout.find(item => item.i === portlet.id)\n if (layoutItem) {\n if (currentBreakpoint === 'lg') {\n // Desktop: update everything (position and size)\n return {\n ...portlet,\n x: layoutItem.x,\n y: layoutItem.y,\n w: layoutItem.w,\n h: layoutItem.h\n }\n } else {\n // Mobile/tablet: only update position, preserve original size\n return {\n ...portlet,\n x: layoutItem.x,\n y: layoutItem.y,\n // Keep original desktop w and h\n w: portlet.w,\n h: portlet.h\n }\n }\n }\n return portlet\n })\n\n // Preserve existing responsive layouts, only update with new lg layout\n const updatedConfig = {\n portlets: updatedPortlets,\n layouts: {\n ...config.layouts,\n lg: layout // Only save the large layout, let RGL handle responsive adjustments\n }\n }\n\n // Update our tracking of the last known layout\n setLastKnownLayout(layout)\n\n // Update config state first\n onConfigChange?.(updatedConfig)\n\n // Auto-save after drag operation\n try {\n await onSave(updatedConfig)\n } catch (error) {\n console.error('Auto-save failed after drag:', error)\n }\n }, [config.portlets, config.layouts, editable, isEditMode, currentBreakpoint, onConfigChange, onSave, isInitialized, hasLayoutActuallyChanged])\n\n // Handle resize stop - update config and save (resize is user interaction)\n const handleResizeStop = useCallback(async (layout: any[], _oldItem: any, _newItem: any, _placeholder: any, _e: any, _element: any) => {\n if (!editable || !isEditMode || !onConfigChange || !isInitialized) return\n\n // Only proceed if the layout actually changed from user interaction\n if (!hasLayoutActuallyChanged(layout)) {\n return // No actual change, don't save\n }\n\n // Get the current updated config - on mobile only update position, preserve desktop sizing\n const updatedPortlets = config.portlets.map(portlet => {\n const layoutItem = layout.find(item => item.i === portlet.id)\n if (layoutItem) {\n if (currentBreakpoint === 'lg') {\n // Desktop: update everything (position and size)\n return {\n ...portlet,\n x: layoutItem.x,\n y: layoutItem.y,\n w: layoutItem.w,\n h: layoutItem.h\n }\n } else {\n // Mobile/tablet: only update position, preserve original size\n return {\n ...portlet,\n x: layoutItem.x,\n y: layoutItem.y,\n // Keep original desktop w and h\n w: portlet.w,\n h: portlet.h\n }\n }\n }\n return portlet\n })\n\n // Preserve existing responsive layouts, only update with new lg layout\n const updatedConfig = {\n portlets: updatedPortlets,\n layouts: {\n ...config.layouts,\n lg: layout // Only save the large layout, let RGL handle responsive adjustments\n }\n }\n\n // Update our tracking of the last known layout\n setLastKnownLayout(layout)\n\n // Update config state\n onConfigChange(updatedConfig)\n\n // Auto-save after resize operation (user deliberately resized)\n if (onSave) {\n try {\n await onSave(updatedConfig)\n } catch (error) {\n console.error('Auto-save failed after resize:', error)\n }\n }\n }, [config.portlets, config.layouts, editable, isEditMode, currentBreakpoint, onConfigChange, onSave, isInitialized, hasLayoutActuallyChanged])\n\n // Handle portlet refresh\n const handlePortletRefresh = useCallback((portletId: string) => {\n const portletComponent = portletComponentRefs.current[portletId]\n if (portletComponent && portletComponent.refresh) {\n portletComponent.refresh()\n }\n if (onPortletRefresh) {\n onPortletRefresh(portletId)\n }\n }, [onPortletRefresh])\n\n // Handle adding new portlet\n const handleAddPortlet = useCallback(() => {\n setEditingPortlet(null)\n setIsPortletModalOpen(true)\n }, [])\n\n // Handle editing existing portlet\n const handleEditPortlet = useCallback((portlet: PortletConfig) => {\n setEditingPortlet(portlet)\n setIsPortletModalOpen(true)\n }, [])\n\n // Handle portlet save\n const handlePortletSave = useCallback(async (portletData: PortletConfig | Omit<PortletConfig, 'id' | 'x' | 'y'>) => {\n if (!onConfigChange) return\n\n let updatedPortlets = [...config.portlets]\n\n if (editingPortlet) {\n // Editing existing portlet\n const index = updatedPortlets.findIndex(p => p.id === editingPortlet.id)\n if (index !== -1) {\n updatedPortlets[index] = portletData as PortletConfig\n }\n } else {\n // Adding new portlet\n const newPortlet: PortletConfig = {\n ...portletData,\n id: `portlet-${Date.now()}`,\n x: 0,\n y: 0\n } as PortletConfig\n\n // Find the best position for the new portlet\n const gridLayout = updatedPortlets.map(p => ({ i: p.id, x: p.x, y: p.y, w: p.w, h: p.h }))\n let maxY = 0\n gridLayout.forEach(item => {\n if (item.y + item.h > maxY) {\n maxY = item.y + item.h\n }\n })\n newPortlet.y = maxY\n\n updatedPortlets.push(newPortlet)\n }\n\n const updatedConfig = {\n ...config,\n portlets: updatedPortlets\n }\n\n onConfigChange(updatedConfig)\n\n // Auto-save if handler is provided\n if (onSave) {\n try {\n await onSave(updatedConfig)\n } catch (error) {\n console.error('Auto-save failed:', error)\n }\n }\n\n setIsPortletModalOpen(false)\n setEditingPortlet(null)\n }, [config, editingPortlet, onConfigChange, onSave])\n\n // Handle deleting portlet\n const handleDeletePortlet = useCallback(async (portletId: string) => {\n if (!onConfigChange) return\n \n if (window.confirm('Are you sure you want to delete this portlet?')) {\n const updatedPortlets = config.portlets.filter(p => p.id !== portletId)\n const updatedConfig = {\n ...config,\n portlets: updatedPortlets\n }\n \n onConfigChange(updatedConfig)\n\n // Auto-save if handler is provided\n if (onSave) {\n try {\n await onSave(updatedConfig)\n } catch (error) {\n console.error('Auto-save failed:', error)\n }\n }\n }\n }, [config, onConfigChange, onSave])\n\n if (!config.portlets || config.portlets.length === 0) {\n return (\n <>\n <div className=\"flex justify-center items-center min-h-[50vh]\">\n <div className=\"text-center\">\n <ChartBarIcon style={{ width: '64px', height: '64px', color: '#9ca3af', margin: '0 auto 16px auto' }} />\n <h3 className=\"text-lg font-semibold mb-2\">No Portlets</h3>\n <p className=\"text-sm text-gray-600 mb-4\">Add your first portlet to start visualizing your data</p>\n {editable && (\n <button\n onClick={handleAddPortlet}\n className=\"inline-flex items-center px-4 py-2 border border-blue-300 text-blue-700 bg-white rounded-md hover:bg-blue-50 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2\"\n >\n <PlusIcon className=\"w-5 h-5 mr-2\" />\n Add Portlet\n </button>\n )}\n </div>\n </div>\n \n {/* Portlet Modal */}\n <PortletEditModal\n isOpen={isPortletModalOpen}\n onClose={() => {\n setIsPortletModalOpen(false)\n setEditingPortlet(null)\n }}\n onSave={handlePortletSave}\n portlet={editingPortlet}\n title={editingPortlet ? 'Edit Portlet' : 'Add New Portlet'}\n submitText={editingPortlet ? 'Update Portlet' : 'Add Portlet'}\n />\n </>\n )\n }\n\n // Generate grid layout from portlets - only use for lg (desktop) breakpoint\n // Let react-grid-layout handle responsive adjustments automatically\n const baseLayout = config.portlets.map(portlet => ({\n i: portlet.id,\n x: portlet.x,\n y: portlet.y,\n w: portlet.w,\n h: portlet.h,\n minW: 3,\n minH: 3\n }))\n\n // Create responsive layouts - use stored layouts if available, otherwise let RGL auto-generate\n // The key insight: only the 'lg' layout should be controlled by our stored portlet positions\n // All other breakpoints should be auto-generated by react-grid-layout for proper responsive behavior\n const responsiveLayouts = {\n lg: baseLayout // Only control the large desktop layout, let RGL handle all responsive adjustments\n }\n\n\n return (\n <>\n {editable && (\n <div className={`mb-4 flex justify-between items-center sticky top-0 z-10 px-4 py-4 bg-blue-100 border border-gray-200 rounded-lg shadow-sm transition-all duration-200 ${\n isScrolled ? 'border-b border-gray-200 shadow-md' : ''\n }`}>\n <div className=\"flex items-center gap-4\">\n <button\n onClick={() => setIsEditMode(!isEditMode)}\n className={`inline-flex items-center px-4 py-2 text-sm font-medium rounded-md transition-colors focus:outline-none focus:ring-2 focus:ring-purple-500 focus:ring-offset-2 ${\n isEditMode\n ? 'bg-purple-50 text-purple-700 border border-purple-200 hover:bg-purple-100'\n : 'bg-white text-purple-700 border border-purple-300 hover:bg-purple-50'\n }`}\n >\n <PencilIcon className=\"w-4 h-4 mr-1.5\" />\n {isEditMode ? 'Finished Editing' : 'Edit'}\n </button>\n {isEditMode && (\n <p className=\"hidden md:block text-sm text-gray-500\">\n Drag to rearrange • Resize from corners • Changes save automatically\n </p>\n )}\n </div>\n \n <button\n onClick={handleAddPortlet}\n disabled={!isEditMode}\n className={`inline-flex items-center px-4 py-2 text-sm font-medium border rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 ${\n isEditMode\n ? 'border-blue-300 text-blue-700 bg-white hover:bg-blue-50'\n : 'border-gray-300 text-gray-400 bg-gray-50 cursor-not-allowed'\n }`}\n >\n <PlusIcon className=\"w-5 h-5 mr-2\" />\n Add Portlet\n </button>\n </div>\n )}\n \n <ResponsiveGridLayout\n className=\"layout\"\n layouts={responsiveLayouts}\n onLayoutChange={handleLayoutChange}\n onDragStop={handleDragStop}\n onResizeStop={handleResizeStop}\n onBreakpointChange={(newBreakpoint) => setCurrentBreakpoint(newBreakpoint)}\n breakpoints={{ lg: 1200, md: 996, sm: 768, xs: 480, xxs: 0 }}\n cols={{ lg: 12, md: 10, sm: 6, xs: 4, xxs: 2 }}\n isDraggable={editable && isEditMode}\n isResizable={editable && isEditMode}\n draggableHandle=\".portlet-drag-handle\"\n margin={{ lg: [16, 16], md: [12, 12], sm: [8, 8], xs: [6, 6], xxs: [4, 4] }}\n containerPadding={[0, 0]}\n rowHeight={80}\n compactType=\"vertical\"\n preventCollision={false}\n >\n {config.portlets.map(portlet => (\n <div \n key={portlet.id}\n data-portlet-id={portlet.id}\n ref={el => { portletRefs.current[portlet.id] = el }}\n className=\"bg-white border border-gray-200 rounded-lg shadow-sm flex flex-col h-full\"\n >\n {/* Portlet Header */}\n <div className={`flex items-center justify-between px-3 py-2 md:px-4 md:py-3 border-b border-gray-200 flex-shrink-0 bg-gray-50 rounded-t-lg portlet-drag-handle ${isEditMode ? 'cursor-move' : 'cursor-default'}`}>\n <div className=\"flex items-center gap-2 flex-1 min-w-0\">\n <h3 className=\"font-semibold text-sm text-gray-900 truncate\">{portlet.title}</h3>\n {/* Debug button - right next to title, outside drag area */}\n {debugData[portlet.id] && (\n <div \n onMouseDown={(e) => e.stopPropagation()} \n onClick={(e) => e.stopPropagation()}\n onTouchStart={(e) => e.stopPropagation()}\n onTouchEnd={(e) => e.stopPropagation()}\n >\n <DebugModal \n chartConfig={debugData[portlet.id].chartConfig}\n displayConfig={debugData[portlet.id].displayConfig}\n queryObject={debugData[portlet.id].queryObject}\n data={debugData[portlet.id].data}\n chartType={debugData[portlet.id].chartType}\n />\n </div>\n )}\n </div>\n <div \n className=\"flex items-center gap-3 flex-shrink-0 ml-4 -mr-2\" \n onMouseDown={(e) => e.stopPropagation()} \n onClick={(e) => e.stopPropagation()}\n onTouchStart={(e) => e.stopPropagation()}\n onTouchEnd={(e) => e.stopPropagation()}\n >\n \n <button\n onClick={(e) => {\n e.stopPropagation()\n handlePortletRefresh(portlet.id)\n }}\n onTouchEnd={(e) => {\n e.stopPropagation()\n e.preventDefault()\n handlePortletRefresh(portlet.id)\n }}\n className=\"p-2 bg-transparent border-none rounded text-gray-600 cursor-pointer hover:bg-gray-200 transition-colors\"\n title=\"Refresh portlet data\"\n >\n <ArrowPathIcon style={{ width: '16px', height: '16px', color: 'currentColor' }} />\n </button>\n {editable && isEditMode && (\n <>\n <button\n onClick={(e) => {\n e.stopPropagation()\n handleEditPortlet(portlet)\n }}\n onTouchEnd={(e) => {\n e.stopPropagation()\n e.preventDefault()\n handleEditPortlet(portlet)\n }}\n className=\"p-2 bg-transparent border-none rounded text-gray-600 cursor-pointer hover:bg-gray-200 transition-colors\"\n title=\"Edit portlet\"\n >\n <PencilIcon style={{ width: '16px', height: '16px', color: 'currentColor' }} />\n </button>\n <button\n onClick={(e) => {\n e.stopPropagation()\n handleDeletePortlet(portlet.id)\n }}\n onTouchEnd={(e) => {\n e.stopPropagation()\n e.preventDefault()\n handleDeletePortlet(portlet.id)\n }}\n className=\"p-2 bg-transparent border-none rounded text-gray-600 cursor-pointer hover:bg-gray-200 transition-colors\"\n title=\"Delete portlet\"\n >\n <TrashIcon style={{ width: '16px', height: '16px', color: 'currentColor' }} />\n </button>\n </>\n )}\n </div>\n </div>\n\n {/* Portlet Content */}\n <div className=\"flex-1 px-2 py-3 md:px-4 md:py-4 min-h-0 overflow-visible flex flex-col\">\n <AnalyticsPortlet\n ref={el => { portletComponentRefs.current[portlet.id] = el }}\n query={portlet.query}\n chartType={portlet.chartType}\n chartConfig={portlet.chartConfig}\n displayConfig={portlet.displayConfig}\n title={portlet.title}\n height=\"100%\"\n onDebugDataReady={(data) => {\n setDebugData(prev => ({\n ...prev,\n [portlet.id]: data\n }))\n }}\n />\n </div>\n </div>\n ))}\n </ResponsiveGridLayout>\n \n {/* Portlet Modal */}\n <PortletEditModal\n isOpen={isPortletModalOpen}\n onClose={() => {\n setIsPortletModalOpen(false)\n setEditingPortlet(null)\n }}\n onSave={handlePortletSave}\n portlet={editingPortlet}\n title={editingPortlet ? 'Edit Portlet' : 'Add New Portlet'}\n submitText={editingPortlet ? 'Update Portlet' : 'Add Portlet'}\n />\n </>\n )\n}","/**\n * Analytics Dashboard Component\n * Main dashboard container that uses CubeProvider context\n * Minimal dependencies, designed to be embedded in existing apps\n */\n\nimport { useCallback, useRef } from 'react'\nimport DashboardGrid from './DashboardGrid'\nimport type { AnalyticsDashboardProps, DashboardConfig } from '../types'\n\nexport default function AnalyticsDashboard({\n config,\n editable = false,\n onConfigChange,\n onSave,\n onDirtyStateChange\n}: AnalyticsDashboardProps) {\n // Track initial config to prevent saves during initial load\n const initialConfigRef = useRef(config)\n const hasConfigChangedFromInitial = useRef(false)\n\n // Enhanced save handler that tracks dirty state and prevents saves during initial load\n const handleSaveWithDirtyTracking = useCallback(async (config: DashboardConfig) => {\n // Don't save if this config hasn't actually changed from the initial load\n if (!hasConfigChangedFromInitial.current) {\n return // Prevent saves during initial load/responsive changes\n }\n \n if (onDirtyStateChange) {\n onDirtyStateChange(true) // Mark as dirty when save starts\n }\n \n try {\n if (onSave) {\n await onSave(config)\n }\n \n // Update our reference point after successful save\n initialConfigRef.current = config\n \n // Mark as clean after successful save\n if (onDirtyStateChange) {\n onDirtyStateChange(false)\n }\n } catch (error) {\n // Keep dirty state if save failed\n console.error('Save failed:', error)\n throw error\n }\n }, [onSave, onDirtyStateChange])\n\n // Enhanced config change handler that marks as dirty (only after initial load)\n const handleConfigChangeWithDirtyTracking = useCallback((config: DashboardConfig) => {\n if (onConfigChange) {\n onConfigChange(config)\n }\n \n // Check if this is a meaningful change from the initial config\n const configString = JSON.stringify(config)\n const initialConfigString = JSON.stringify(initialConfigRef.current)\n \n if (configString !== initialConfigString) {\n hasConfigChangedFromInitial.current = true\n \n if (onDirtyStateChange) {\n onDirtyStateChange(true)\n }\n }\n }, [onConfigChange, onDirtyStateChange])\n\n return (\n <div className=\"w-full\">\n <DashboardGrid \n config={config}\n editable={editable}\n onConfigChange={handleConfigChangeWithDirtyTracking}\n onSave={handleSaveWithDirtyTracking}\n />\n </div>\n )\n}","/**\n * Portlet Container Component\n * Simple wrapper for individual portlets\n */\n\nimport { useState } from 'react'\nimport AnalyticsPortlet from './AnalyticsPortlet'\nimport DebugModal from './DebugModal'\nimport type { PortletConfig } from '../types'\n\ninterface PortletContainerProps {\n portlet: PortletConfig\n editable?: boolean\n onEdit?: (portlet: PortletConfig) => void\n onDelete?: (portletId: string) => void\n onRefresh?: (portletId: string) => void\n}\n\nexport default function PortletContainer({ \n portlet, \n editable = false,\n onEdit,\n onDelete,\n onRefresh\n}: PortletContainerProps) {\n const [debugData, setDebugData] = useState<{\n chartConfig: any\n displayConfig: any\n queryObject: any\n data: any[]\n chartType: string\n } | null>(null)\n\n return (\n <div className=\"bg-white border border-gray-200 rounded-lg shadow-sm flex flex-col h-full\">\n {/* Header */}\n <div className=\"flex items-center justify-between border-b border-gray-200 flex-shrink-0 bg-gray-50 rounded-t-lg px-3 py-2 md:px-6 md:py-3\">\n <div className=\"flex items-center gap-2 flex-1 min-w-0\">\n <h3 className=\"font-semibold text-sm truncate\">{portlet.title}</h3>\n {/* Debug button - right next to title */}\n {debugData && (\n <DebugModal \n chartConfig={debugData.chartConfig}\n displayConfig={debugData.displayConfig}\n queryObject={debugData.queryObject}\n data={debugData.data}\n chartType={debugData.chartType}\n />\n )}\n </div>\n \n <div className=\"flex items-center gap-2 ml-4\">\n \n {editable && (\n <>\n <button\n onClick={() => onRefresh?.(portlet.id)}\n className=\"p-1.5 hover:bg-gray-200 rounded text-gray-600\"\n title=\"Refresh\"\n >\n <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15\" />\n </svg>\n </button>\n <button\n onClick={() => onEdit?.(portlet)}\n className=\"p-1.5 hover:bg-gray-200 rounded text-gray-600\"\n title=\"Edit\"\n >\n <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z\" />\n </svg>\n </button>\n <button\n onClick={() => onDelete?.(portlet.id)}\n className=\"p-1.5 hover:bg-red-100 rounded text-red-600\"\n title=\"Delete\"\n >\n <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\" />\n </svg>\n </button>\n </>\n )}\n </div>\n </div>\n\n {/* Content */}\n <div className=\"px-2 py-3 md:px-4 md:pt-6 md:pb-4 flex-1 min-h-0\">\n <AnalyticsPortlet\n query={portlet.query}\n chartType={portlet.chartType}\n chartConfig={portlet.chartConfig}\n displayConfig={portlet.displayConfig}\n title={portlet.title}\n height=\"100%\"\n onDebugDataReady={(data) => {\n console.log('PortletContainer: onDebugDataReady called with:', data)\n setDebugData(data)\n }}\n />\n </div>\n </div>\n )\n}","import React, { useState, useEffect } from 'react'\nimport Modal from './Modal'\n\ninterface DashboardEditModalProps {\n isOpen: boolean\n onClose: () => void\n onSave: (data: { name: string; description?: string }) => Promise<void> | void\n title: string\n submitText: string\n initialName?: string\n initialDescription?: string\n}\n\nexport default function DashboardEditModal({\n isOpen,\n onClose,\n onSave,\n title,\n submitText,\n initialName = '',\n initialDescription = ''\n}: DashboardEditModalProps) {\n const [name, setName] = useState('')\n const [description, setDescription] = useState('')\n const [isSaving, setIsSaving] = useState(false)\n\n // Initialize form values when modal opens\n useEffect(() => {\n if (isOpen) {\n setName(initialName)\n setDescription(initialDescription)\n }\n }, [isOpen, initialName, initialDescription])\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault()\n \n if (!name.trim()) {\n return\n }\n\n setIsSaving(true)\n \n try {\n await onSave({\n name: name.trim(),\n description: description.trim() || undefined\n })\n handleClose()\n } catch (error) {\n console.error('Failed to save dashboard:', error)\n // Don't close modal on error so user can retry\n } finally {\n setIsSaving(false)\n }\n }\n\n const handleClose = () => {\n setName('')\n setDescription('')\n setIsSaving(false)\n onClose()\n }\n\n const footer = (\n <>\n <button\n type=\"button\"\n onClick={handleClose}\n disabled={isSaving}\n className=\"px-4 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-md hover:bg-gray-50 disabled:opacity-50\"\n >\n Cancel\n </button>\n <button\n type=\"submit\"\n form=\"dashboard-form\"\n disabled={isSaving || !name.trim()}\n className=\"px-4 py-2 text-sm font-medium text-white bg-blue-600 border border-transparent rounded-md hover:bg-blue-700 disabled:opacity-50 disabled:cursor-not-allowed\"\n >\n {isSaving ? 'Saving...' : submitText}\n </button>\n </>\n )\n\n return (\n <Modal\n isOpen={isOpen}\n onClose={handleClose}\n title={title}\n size=\"fullscreen-mobile\"\n footer={footer}\n >\n <form id=\"dashboard-form\" onSubmit={handleSubmit} className=\"space-y-4 w-full\">\n <div>\n <label htmlFor=\"dashboard-name\" className=\"block text-sm font-medium text-gray-700 mb-1\">\n Dashboard Name\n </label>\n <input\n type=\"text\"\n id=\"dashboard-name\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500\"\n placeholder=\"Enter dashboard name...\"\n required\n autoFocus\n />\n </div>\n \n <div>\n <label htmlFor=\"dashboard-description\" className=\"block text-sm font-medium text-gray-700 mb-1\">\n Description (optional)\n </label>\n <textarea\n id=\"dashboard-description\"\n rows={3}\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500\"\n placeholder=\"Enter description...\"\n />\n </div>\n </form>\n </Modal>\n )\n}"],"names":["ChartErrorBoundary","Component","props","__publicField","error","errorInfo","jsxs","jsx","_a","_b","ArrowPathIcon","extent","values","valueof","min","max","value","index","identity","x","top","right","bottom","left","epsilon","translateX","translateY","y","number","scale","d","center","offset","entering","axis","orient","tickArguments","tickValues","tickFormat","tickSizeInner","tickSizeOuter","tickPadding","k","transform","context","format","spacing","range","range0","range1","position","selection","path","tick","tickExit","tickEnter","line","text","p","_","axisBottom","axisLeft","xhtml","namespaces","namespace","name","prefix","i","creatorInherit","document","uri","creatorFixed","fullname","creator","none","selector","selection_select","select","groups","m","subgroups","j","group","n","subgroup","node","subnode","Selection","array","empty","selectorAll","arrayAll","selection_selectAll","parents","matcher","childMatcher","find","childFind","match","childFirst","selection_selectChild","filter","children","childrenFilter","selection_selectChildren","selection_filter","sparse","update","selection_enter","EnterNode","parent","datum","child","next","constant","bindIndex","enter","exit","data","groupLength","dataLength","bindKey","key","nodeByKeyValue","keyValues","keyValue","selection_data","bind","arraylike","enterGroup","updateGroup","exitGroup","i0","i1","previous","selection_exit","selection_join","onenter","onupdate","onexit","selection_merge","groups0","groups1","m0","m1","merges","group0","group1","merge","selection_order","selection_sort","compare","ascending","compareNode","a","b","sortgroups","sortgroup","selection_call","callback","selection_nodes","selection_node","selection_size","size","selection_empty","selection_each","attrRemove","attrRemoveNS","attrConstant","attrConstantNS","attrFunction","v","attrFunctionNS","selection_attr","defaultView","styleRemove","styleConstant","priority","styleFunction","selection_style","styleValue","propertyRemove","propertyConstant","propertyFunction","selection_property","classArray","string","classList","ClassList","classedAdd","names","list","classedRemove","classedTrue","classedFalse","classedFunction","selection_classed","textRemove","textConstant","textFunction","selection_text","htmlRemove","htmlConstant","htmlFunction","selection_html","raise","selection_raise","lower","selection_lower","selection_append","create","constantNull","selection_insert","before","remove","selection_remove","selection_cloneShallow","clone","selection_cloneDeep","selection_clone","deep","selection_datum","contextListener","listener","event","parseTypenames","typenames","t","onRemove","typename","on","o","onAdd","options","selection_on","dispatchEvent","type","params","window","dispatchConstant","dispatchFunction","selection_dispatch","selection_iterator","root","selection_selection","transformPow","exponent","transformSqrt","transformSquare","powish","rescale","linearish","pow","transformer","copy","initRange","sqrt","BubbleChart","chartConfig","displayConfig","queryObject","height","svgRef","useRef","containerRef","setHoveredBubble","useState","dimensions","setDimensions","dimensionsReady","setDimensionsReady","getFieldLabel","useCubeContext","safeDisplayConfig","useLayoutEffect","retryCount","maxRetries","rafId","timeoutId","updateDimensions","width","retryWithRaf","useEffect","resizeObserver","entries","entry","xAxisField","yAxisField","seriesField","sizeFieldName","colorFieldName","xGranularity","getFieldGranularity","bubbleData","item","xValue","formatTimeValue","yValue","sizeValue","seriesValue","margin","CHART_MARGINS","chartHeight","svg","g","xScale","scaleLinear","yScale","sizeScale","scaleSqrt","colorScale","isNumericColorField","uniqueColors","colorValues","val","minValue","maxValue","scaleQuantize","CHART_COLORS_GRADIENT","scaleOrdinal","CHART_COLORS","tooltip","bubbles","tooltipContent","_event","legend","gradient","color","legendItems","legendItem","_d","legendKey","ChartContainer","ActivityGridChart","getQuarter","date","getMonthOfQuarter","getWeekOfMonth","dayOfMonth","getGridMapping","granularity","year","quarter","month","week","getWeekOfYear","dayNum","yearStart","dateField","valueField","queryGranularity","timeDim","td","firstTimeDim","gridMapping","gridData","dateValue","isoStr","cell","maxX","maxY","minX","minY","completeXRange","dataXValues","gridWidth","gridHeight","availableWidth","availableHeight","minCellSize","maxCellSize","scaleX","scaleY","finalCellWidth","finalCellHeight","actualGridWidth","actualGridHeight","needsHorizontalScroll","svgWidth","gridMap","xValueToIndex","xIndex","rect","yearGroups","xValues","startIndex","endIndex","centerIndex","xLabelStep","granularityFromQuery","AnalyticsPortlet","forwardRef","query","chartType","_title","onDebugDataReady","ref","refreshCounter","setRefreshCounter","onDebugDataReadyRef","useMemo","e","resultSet","isLoading","useCubeQuery","useImperativeHandle","prev","getData","RechartsBarChart","RechartsLineChart","RechartsAreaChart","RechartsPieChart","RechartsScatterChart","RechartsRadarChart","RechartsRadialBarChart","RechartsTreeMapChart","DataTable","Modal","isOpen","onClose","title","closeOnBackdropClick","closeOnEscape","showCloseButton","footer","noPadding","handleEscapeKey","useCallback","CubeMetaExplorer","schema","schemaStatus","schemaError","selectedFields","onFieldSelect","onFieldDeselect","onRetrySchema","onOpenSettings","expandedCubes","setExpandedCubes","expandedSections","setExpandedSections","searchTerm","setSearchTerm","preSearchExpandedCubes","setPreSearchExpandedCubes","preSearchExpandedSections","setPreSearchExpandedSections","React","newExpandedCubes","newExpandedSections","cube","cubeHasMatches","field","combinedCubes","combinedSections","isCorsError","ExclamationTriangleIcon","Fragment","CogIcon","toggleCubeExpansion","cubeName","newExpanded","newPreSearchExpanded","toggleSectionExpansion","sectionKey","handleFieldClick","fieldType","filterFields","fields","measureMatches","dimensionMatches","FieldItem","icon","isSelected","getSelectedStyles","getIconColor","getCheckmarkColor","SectionHeader","count","isExpanded","getSectionType","ChevronDownIcon","ChevronRightIcon","NoMatchesMessage","filteredCubes","timeDimensions","regularDimensions","TagIcon","dimension","CalendarIcon","timeDimension","ChartBarIcon","measure","TIME_GRANULARITIES","FILTER_OPERATORS","DATE_RANGE_OPTIONS","FilterValueSelector","fieldName","operator","onValuesChange","operatorMeta","setIsOpen","searchText","setSearchText","hasLoadedInitial","setHasLoadedInitial","dropdownRef","lastSearchedTerm","debouncedSearchText","useDebounce","isDimension","dim","isTimeDimension","shouldFetchValues","shouldShowComboBox","distinctValues","valuesLoading","valuesError","searchValues","useFilterValues","handleClickOutside","handleDropdownToggle","newIsOpen","handleSearchChange","newSearchText","handleValueSelect","handleValueRemove","valueToRemove","handleDirectInput","numValue","handleDateInput","currentValues","handleDateRangeEndInput","handleBetweenStartInput","newValues","handleBetweenEndInput","XMarkIcon","hasQueryContent","getSelectedFieldsCount","cleanQuery","cleanedQuery","cleanQueryForServer","transformFiltersForServer","createEmptyQuery","isSimpleFilter","isGroupFilter","isAndFilter","isOrFilter","getFilterableFields","allFields","getAllFilterableFields","getOrganizedFilterFields","getAvailableOperators","operators","meta","getFieldType","countFilters","filters","countFilter","createSimpleFilter","member","createAndFilter","createOrFilter","cleanupFilters","_query","transformFilter","transformedSubFilters","convertDateRangeTypeToValue","rangeType","typeMap","unit","unitSingular","requiresNumberInput","formatDateForCube","getTimeDimensionsWithDateRanges","dateRanges","hasTimeDimensions","transformQueryForUI","transformed","transformFiltersFromServer","getFieldTitle","getSortDirection","order","getSortTooltip","direction","getNextSortDirection","current","FilterItem","onFilterChange","onFilterRemove","isFieldDropdownOpen","setIsFieldDropdownOpen","isOperatorDropdownOpen","setIsOperatorDropdownOpen","fieldSearchTerm","setFieldSearchTerm","searchInputRef","handleFieldDropdownToggle","newOpen","handleOperatorDropdownToggle","queryFields","selectedField","f","availableOperators","filterFieldsBySearch","filteredQueryFields","filteredAllFields","getFieldTypeIcon","getFieldTypeBadge","handleFieldChange","newFieldType","defaultOperator","handleOperatorChange","handleValuesChange","FunnelIcon","MagnifyingGlassIcon","op","FilterGroup","onGroupChange","onGroupChangeWithUnwrap","onGroupRemove","depth","showAddMenu","setShowAddMenu","isAndGroup","groupType","indentClass","borderColor","bgColor","textColor","handleGroupTypeToggle","newGroup","handleAddSimpleFilter","defaultField","newFilter","newFilters","handleAddAndGroup","handleAddOrGroup","handleFilterChange","filterIndex","handleFilterRemove","updatedGroup","handleNestedGroupChange","handleNestedGroupRemove","PlusIcon","FilterBuilder","onFiltersChange","totalFilterCount","allFilterableFields","hasFilterableFields","andGroup","existingAndGroup","updatedAndGroup","existingOrGroup","updatedOrGroup","handleGroupChange","handleGroupChangeWithUnwrap","handleGroupRemove","handleClearAllFilters","DateRangeSelector","availableTimeDimensions","currentDateRange","onDateRangeChange","onTimeDimensionChange","getCurrentRangeType","flexibleRangeMatch","option","getCurrentDates","today","getCurrentNumber","setRangeType","customDates","setCustomDates","numberValue","setNumberValue","isRangeDropdownOpen","setIsRangeDropdownOpen","isTimeDimensionDropdownOpen","setIsTimeDimensionDropdownOpen","handleTimeDimensionDropdownToggle","handleRangeDropdownToggle","handleRangeTypeChange","newRangeType","dateRange","cubeRangeValue","handleCustomDateChange","newCustomDates","handleNumberChange","handleTimeDimensionChange","newTimeDimension","selectedRangeLabel","opt","DateRangeFilter","onDateRangeRemove","currentDateRanges","dateRangeCount","handleAddDateRange","firstAvailable","handleClearAllDateRanges","allTimeDimensions","oldTd","newTd","QueryPanel","validationStatus","validationError","validationSql","onValidate","onExecute","onRemoveField","onTimeDimensionGranularityChange","onOrderChange","onClearQuery","showSettings","onSettingsClick","onAIAssistantClick","showJsonPreview","setShowJsonPreview","showSqlPreview","setShowSqlPreview","hasContent","selectedCount","handleCopyQuery","textArea","hasFiltersApplied","currentFilters","hasFieldInFilters","handleAddFilterFromField","getSortIcon","ChevronUpIcon","ChevronUpDownIcon","handleToggleSort","getSortButtonClasses","sortDirection","baseClasses","RemovableChip","hasFilters","TimeDimensionChip","hasDateRange","SparklesIcon","ClipboardDocumentIcon","TrashIcon","CheckCircleIcon","ExclamationCircleIcon","newJsonState","newSqlState","CheckIcon","PlayIcon","ResultsPanel","executionStatus","executionResults","executionError","displayLimit","onDisplayLimitChange","totalRowCount","totalRowCountStatus","ClockIcon","SetupPanel","onToggle","config","onConfigChange","onReset","localConfig","setLocalConfig","handleApply","handleReset","defaultConfig","handleInputChange","hasChanges","isUsingDefaults","DEFAULT_SYSTEM_PROMPT_TEMPLATE","AI_STORAGE_KEY","DEFAULT_AI_CONFIG","sendGeminiMessage","apiKey","userPrompt","endpoint","requestBody","headers","response","errorMessage","errorData","errorText","loadAIConfig","saved","parsed","extractTextFromResponse","AIAssistantModal","onQueryLoad","aiEndpoint","state","setState","handleQuerySubmit","responseText","validateResponse","handleValidate","handleUseQuery","handleClose","handleKeyDown","renderQueryStep","STORAGE_KEY","API_CONFIG_STORAGE_KEY","QueryBuilder","className","initialQuery","disableLocalStorage","hideSettings","cubeApi","updateApiConfig","features","getInitialApiConfig","getInitialState","parsedState","setDisplayLimit","apiConfig","setApiConfig","showSetupPanel","setShowSetupPanel","showSchemaMobile","setShowSchemaMobile","showAIAssistant","setShowAIAssistant","lastValidatedQueryRef","fullValidationResult","setFullValidationResult","metaResponse","handleExecuteQuery","updateQuery","updater","newQuery","queryChanged","handleFieldSelect","handleFieldDeselect","newOrder","handleTimeDimensionGranularityChange","dimensionName","handleFiltersChange","handleDateRangeChange","handleDateRangeRemove","handleOrderChange","handleValidateQuery","queryToValidate","queryStr","result","isValid","debounceTimer","limitedResultSet","totalResultSet","limitedData","totalCount","handleClearQuery","handleApiConfigChange","newConfig","handleResetApiConfig","handleRetrySchema","Bars3Icon","AxisDropZone","onDrop","onDragStart","onDragOver","getFieldStyling","onReorder","label","description","mandatory","maxItems","emptyText","IconComponent","dragOverIndex","setDragOverIndex","draggedFromIndex","setDraggedFromIndex","isDraggingFromSameAxis","setIsDraggingFromSameAxis","canAcceptMore","isFull","handleReorderDragStart","handleReorderDragEnd","handleReorderDragOver","targetIndex","handleReorderDragLeave","handleReorderDrop","FieldIcon","hoverClasses","isDragOver","barChartConfig","Icon","chartBarIcon","lineChartConfig","chartLineIcon","areaChartConfig","chartAreaLineIcon","pieChartConfig","chartPieIcon","scatterChartConfig","chartDots2Icon","bubbleChartConfig","chartBubbleIcon","radarChartConfig","chartRadarIcon","radialBarChartConfig","treemapChartConfig","chartTreemapIcon","dataTableConfig","tableIcon","activityGridChartConfig","calendarIcon","chartConfigRegistry","defaultChartConfig","getChartConfig","registry","ChartConfigPanel","availableFields","onChartConfigChange","onDisplayConfigChange","chartTypeConfig","getFieldsForDropZone","allAvailableFields","dropZone","currentFields","validFields","handleDragStart","fromAxis","handleDragOver","handleDrop","toAxis","isReorder","fromValue","toValue","dropZoneConfig","dz","handleRemoveFromAxis","handleReorder","fromIndex","toIndex","axisKey","newArray","movedItem","unassignedFields","assignedFields","ChartTypeSelector","selectedType","onTypeChange","chartTypes","chartTypeLabels","selectedConfig","SelectedIcon","selectedLabel","useCase","tooltipText","SAMPLE_QUERIES","PortletEditModal","onSave","portlet","submitText","formTitle","setFormTitle","setQuery","setChartType","isValidating","setIsValidating","validationResult","setValidationResult","lastValidatedQuery","setLastValidatedQuery","dryRunData","setDryRunData","setChartConfig","setDisplayConfig","showQueryBuilder","setShowQueryBuilder","queryBuilderInitialQuery","setQueryBuilderInitialQuery","queryBuilderRef","autoPopulateChartConfig","_result","defaultWidth","defaultHeight","formattedQuery","runDryRunValidation","handleSubmit","hasQueryChanged","_c","handleSampleQuery","sampleQuery","handleQueryChange","silent","isEditModeLoad","parsedQuery","details","_e","_f","_g","message","errorMsg","handleOpenQueryBuilder","handleApplyQueryBuilderQuery","currentQuery","validationState","handleBackToForm","isEditMode","isQueryValidAndCurrent","sample","DebugModal","timer","ResponsiveGridLayout","WidthProvider","Responsive","DashboardGrid","editable","onPortletRefresh","portletRefs","portletComponentRefs","isInitialized","setIsInitialized","lastKnownLayout","setLastKnownLayout","setIsEditMode","currentBreakpoint","setCurrentBreakpoint","isScrolled","setIsScrolled","isPortletModalOpen","setIsPortletModalOpen","editingPortlet","setEditingPortlet","debugData","setDebugData","initialLayout","handleScroll","scrollTop","hasLayoutActuallyChanged","newLayout","newItem","oldItem","handleLayoutChange","_currentLayout","_allLayouts","handleDragStop","layout","_oldItem","_newItem","_placeholder","_element","updatedConfig","layoutItem","handleResizeStop","handlePortletRefresh","portletId","portletComponent","handleAddPortlet","handleEditPortlet","handlePortletSave","portletData","updatedPortlets","newPortlet","gridLayout","handleDeletePortlet","responsiveLayouts","PencilIcon","newBreakpoint","el","AnalyticsDashboard","onDirtyStateChange","initialConfigRef","hasConfigChangedFromInitial","handleSaveWithDirtyTracking","handleConfigChangeWithDirtyTracking","configString","initialConfigString","PortletContainer","onEdit","onDelete","onRefresh","DashboardEditModal","initialName","initialDescription","setName","setDescription","isSaving","setIsSaving"],"mappings":"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","x_google_ignoreList":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52]}