{"version":3,"file":"widget-composer-srmYqUoX.cjs","sources":["../src/analytics-composer/common/utils.ts","../src/analytics-composer/code/code-templates.ts","../src/analytics-composer/code/generate-code.ts","../src/analytics-composer/query/simplify-metadata-item.ts","../src/analytics-composer/common/constants.ts","../src/analytics-composer/code/stringify-props.ts","../src/analytics-composer/code/stringify-filters.ts","../src/analytics-composer/widget/to-widget-code.ts","../src/analytics-composer/widget/chart-options/get-widget-options.tsx","../src/analytics-composer/query/fix-ranking-filter-jaql.ts","../src/analytics-composer/widget/to-widget-props.ts","../src/analytics-composer/widget/widget-composer.ts"],"sourcesContent":["import { TranslatableError } from '@/translation/translatable-error';\r\nimport { ExpandedQueryModel, SimpleQueryModel } from '../types.js';\r\nimport { ChartWidgetProps, PivotTableWidgetProps } from '@/props';\r\nimport { ExecuteQueryParams, ExecutePivotQueryParams } from '@/query-execution';\r\nimport {\r\n  ALL_CHART_TYPES,\r\n  DynamicChartType,\r\n} from '../../chart-options-processor/translations/types.js';\r\n\r\nexport function toKebabCase(str: string): string {\r\n  return str\r\n    .replace(/\\s+/g, '-') // Replace whitespace with hyphens\r\n    .replace(/([a-z])([A-Z])/g, '$1-$2') // Convert camelCase to kebab-case\r\n    .toLowerCase(); // Convert to lowercase\r\n}\r\n\r\nexport function capitalizeFirstLetter(str: string) {\r\n  return str.charAt(0).toUpperCase() + str.slice(1);\r\n}\r\n\r\n/**\r\n * Sanitize ID of a dimension\r\n *\r\n * @param str - input string\r\n * @return sanitized ID\r\n */\r\nexport function sanitizeDimensionId(str: string) {\r\n  // Regular expression pattern to match [table.column (Calendar)]\r\n  const regex = /\\[(.+?)\\s\\(Calendar\\)\\]/;\r\n\r\n  // Replace [table.column (Calendar)] with [table.column]\r\n  return str.replace(regex, '[$1]').trim();\r\n}\r\n\r\nexport function validateQueryModel(model: any): SimpleQueryModel {\r\n  if (!model) {\r\n    throw new TranslatableError('errors.emptyModel');\r\n  } else if (!model.metadata) {\r\n    throw new TranslatableError('errors.missingMetadata');\r\n  } else if (!model.model) {\r\n    throw new TranslatableError('errors.missingModelTitle');\r\n  }\r\n\r\n  return model;\r\n}\r\n\r\nexport function isEmptyQueryModel(queryModel: ExpandedQueryModel | undefined | null): boolean {\r\n  return !queryModel || !queryModel.jaql.datasource.title || !queryModel.jaql.metadata.length;\r\n}\r\n\r\nexport function validateChartType(chartType: DynamicChartType | 'pivot' | 'pivot2') {\r\n  const ALLOWED_TYPES = [...ALL_CHART_TYPES, 'pivot', 'pivot2'] as const;\r\n\r\n  if (!ALLOWED_TYPES.includes(chartType))\r\n    throw new TranslatableError('errors.chartTypeNotSupported', { chartType });\r\n}\r\n\r\nfunction isPivotTableWidgetPropsLocal(props: any): props is PivotTableWidgetProps {\r\n  return 'widgetType' in props && props.widgetType === 'pivot';\r\n}\r\n\r\nfunction hasExpressionWithParentheses(column: any): boolean {\r\n  return 'column' in column && column.column?.expression && /\\(.*\\)/.test(column.column.expression);\r\n}\r\n\r\nexport function checkIfMeasuresExist(\r\n  props: ChartWidgetProps | PivotTableWidgetProps | ExecuteQueryParams | ExecutePivotQueryParams,\r\n): boolean {\r\n  const hasMeasuresOrValues =\r\n    ('measures' in props && isNonEmptyArray(props.measures as [])) ||\r\n    ('values' in props && isNonEmptyArray(props.values as []));\r\n\r\n  // for pivot table widget\r\n  if (isPivotTableWidgetPropsLocal(props)) {\r\n    return 'values' in props.dataOptions && isNonEmptyArray(props.dataOptions.values as []);\r\n  }\r\n\r\n  if ('chartType' in props) {\r\n    if (props.chartType === 'indicator') {\r\n      return (\r\n        ('value' in props.dataOptions && isNonEmptyArray(props.dataOptions.value as [])) ||\r\n        ('secondary' in props.dataOptions && isNonEmptyArray(props.dataOptions.secondary!))\r\n      );\r\n    }\r\n    if (props.chartType === 'table') {\r\n      if (!('columns' in props.dataOptions) || !isNonEmptyArray(props.dataOptions.columns))\r\n        return false;\r\n      const columns = props.dataOptions.columns;\r\n      return columns.some((column) => hasExpressionWithParentheses(column));\r\n    }\r\n    if (props.chartType === 'boxplot') {\r\n      return false;\r\n    }\r\n    if (props.chartType === 'scatter') {\r\n      return (\r\n        ('x' in props.dataOptions &&\r\n          props.dataOptions.x !== undefined &&\r\n          hasExpressionWithParentheses(props.dataOptions.x)) ||\r\n        ('y' in props.dataOptions &&\r\n          props.dataOptions.y !== undefined &&\r\n          hasExpressionWithParentheses(props.dataOptions.y)) ||\r\n        ('size' in props.dataOptions && props.dataOptions.size !== undefined)\r\n      );\r\n    }\r\n    if (props.chartType === 'scattermap')\r\n      return (\r\n        ('colorBy' in props.dataOptions &&\r\n          props.dataOptions.colorBy !== undefined &&\r\n          hasExpressionWithParentheses(props.dataOptions.colorBy)) ||\r\n        ('details' in props.dataOptions &&\r\n          props.dataOptions.details !== undefined &&\r\n          hasExpressionWithParentheses(props.dataOptions.details)) ||\r\n        ('size' in props.dataOptions &&\r\n          props.dataOptions.size !== undefined &&\r\n          hasExpressionWithParentheses(props.dataOptions.size))\r\n      );\r\n    if (props.chartType === 'areamap')\r\n      return (\r\n        'geo' in props.dataOptions &&\r\n        isNonEmptyArray(props.dataOptions.geo) &&\r\n        'color' in props.dataOptions &&\r\n        isNonEmptyArray(props.dataOptions.color!)\r\n      );\r\n    return 'value' in props.dataOptions && isNonEmptyArray(props.dataOptions.value as []);\r\n  }\r\n\r\n  return hasMeasuresOrValues;\r\n}\r\n\r\nexport function isNonEmptyArray<T>(array: T[]): boolean {\r\n  return Array.isArray(array) && array.length > 0;\r\n}\r\n\r\n/**\r\n * Removes the first empty line or string if the next line contains \"import *\" or \"import {\".\r\n *\r\n * The `stringifyExtraImports` function can return an empty string if there are no measures or filters, then\r\n * `filterFactory` or `measureFactory` are not required for import.\r\n * In our code templates, we use the `{{extraImportsString}}` placeholder, and\r\n * if it is replaced with an empty string, our tests may break.\r\n * This function ensures that such invalid empty lines before imports are removed to maintain proper formatting.\r\n *\r\n * @param input - the populated template\r\n * @returns The modified string with the first empty line removed if the next line contains \"import *\" or \"import {\". If no such condition is met, the input remains unchanged.\r\n */\r\nexport function removeEmptyLineBeforeImport(input: string) {\r\n  const lines = input.split('\\n');\r\n\r\n  for (let i = 0; i < lines.length - 1; i++) {\r\n    if (lines[i].trim() === '') {\r\n      // Check if the current line is empty\r\n      const nextLine = lines[i + 1].trim();\r\n      // Check if the next line contains \"import *\" or \"import {\"\r\n      if (nextLine.startsWith('import *') || nextLine.startsWith('import {')) {\r\n        lines.splice(i, 1); // Remove the empty line\r\n        break; // Stop after removing the first match\r\n      }\r\n    }\r\n  }\r\n\r\n  return lines.join('\\n');\r\n}\r\n\r\n/**\r\n * Returns a new object where any \"unsafe\" keys (i.e., keys that contain\r\n * characters not allowed in JavaScript dot notation — such as spaces, slashes, dashes, etc.)\r\n * are wrapped in double quotes.\r\n *\r\n * If the object contains a `composeCode` field, it is returned as-is without modification.\r\n *\r\n * Safe keys (valid JS identifiers) are left unchanged.\r\n *\r\n * @param obj - The input object with arbitrary string keys\r\n * @returns A new object with the same values, but with unsafe keys wrapped in quotes,\r\n *          unless the object has a `composeCode` field\r\n *\r\n * @example\r\n * quoteUnsafeKeys({ \"user-id\": true, normalKey: 42 })\r\n * // => { '\"user-id\"': true, normalKey: 42 }\r\n */\r\nexport function quoteUnsafeKeys<T extends Record<string, any>>(obj: T): Record<string, any> {\r\n  const isSafeKey = (key: string): boolean => /^[$A-Z_][0-9A-Z_$]*$/i.test(key);\r\n\r\n  if ('composeCode' in obj) {\r\n    return obj;\r\n  }\r\n\r\n  const result: Record<string, any> = {};\r\n\r\n  for (const [key, value] of Object.entries(obj)) {\r\n    const newKey = isSafeKey(key) ? key : `\"${key}\"`;\r\n    result[newKey] = value;\r\n  }\r\n\r\n  return result;\r\n}\r\n","import { CodeTemplates } from '../types.js';\n\n/**\n * Code templates for different UI frameworks.\n *\n * A code template is made up of other code templates and placeholders.\n * This allows a code template to be reused in other code templates.\n * For example, a chart widget template can be reused in a dashboard template.\n *\n * @internal\n */\nexport const CODE_TEMPLATES: CodeTemplates = {\n  react: {\n    baseChartTmpl: `import { {{componentString}} } from 'sisense-sdk-ui-next';\n{{extraImportsString}}\nimport * as DM from './{{dataSourceString}}'; // generated with @sisense/sdk-cli\n\nexport default function CodeExample() {\n  return (\n    <{{componentString}}\n      title={'{{titleString}}'}\n      dataSource={DM.DataSource}\n      chartType={'{{chartTypeString}}'}\n      dataOptions={ {{dataOptionsString}} }\n      filters={ {{filtersString}} }\n      styleOptions={ {{styleOptionsString}} }\n      drilldownOptions={ {{drilldownOptionsString}} }\n    />\n  );\n}`,\n    chartTmpl: `{{baseChartTmpl}}`,\n    chartWidgetTmpl: `{{baseChartTmpl}}`,\n    chartWidgetPropsTmpl: `\n    {\n      id: '{{idString}}',\n      widgetType: '{{widgetTypeString}}',\n      title: '{{titleString}}',\n      dataSource: DM.DataSource,\n      chartType: '{{chartTypeString}}',\n      dataOptions: {{dataOptionsString}},\n      filters: {{filtersString}},\n      styleOptions: {{styleOptionsString}},\n      drilldownOptions: {{drilldownOptionsString}},\n    }`,\n    widgetByIdTmpl: `import { WidgetById } from 'sisense-sdk-ui-next';\n\nconst CodeExample = () => {\n    return (\n      <>\n        <WidgetById\n          widgetOid=\"{{widgetOid}}\"\n          dashboardOid=\"{{dashboardOid}}\"\n          includeDashboardFilters={true}\n        />\n      </>\n    );\n};\n\nexport default CodeExample;\n`,\n    executeQueryByWidgetIdTmpl: `import { useExecuteQueryByWidgetId } from 'sisense-sdk-ui-next';\n\nconst CodeExample = () => {\n  const { data, isLoading, isError, error } = useExecuteQueryByWidgetId({\n    widgetOid: \"{{widgetOid}}\",\n    dashboardOid: \"{{dashboardOid}}\"\n  });\n\n  if (isLoading) {\n    return <div>Loading...</div>;\n  }\n  if (isError) {\n    return <div>Error: {error.message}</div>;\n  }\n  if (data) {\n    return <div>Total Rows: {data.rows.length}</div>;\n  }\n\n  return null;\n};\n\nexport default CodeExample;\n`,\n    executeQueryTmpl: `import { useExecuteQuery } from 'sisense-sdk-ui-next';\n{{extraImportsString}}\nimport * as DM from './{{dataSourceString}}'; // generated with @sisense/sdk-cli\n\nconst CodeExample = () => {\n  const queryProps = {\n    dataSource: DM.DataSource,\n    dimensions: {{dimensionsString}},\n    measures: {{measuresString}},\n    filters: {{filtersString}},\n    highlights: {{highlightsString}},\n  }\n\n  const { data, isLoading, isError, error } = useExecuteQuery(queryProps);\n\n  if (isLoading) {\n    return <div>Loading...</div>;\n  }\n  if (isError) {\n    return <div>Error: {error.message}</div>;\n  }\n  if (data) {\n    return <div>Total Rows: {data.rows.length}</div>;\n  }\n\n  return null;\n};\n\nexport default CodeExample;\n`,\n    executePivotQueryTmpl: `import { useExecutePivotQuery, ExecutePivotQueryParams } from 'sisense-sdk-ui-next';\n{{extraImportsString}}\nimport * as DM from './{{dataSourceString}}'; // generated with @sisense/sdk-cli\n\nconst CodeExample = () => {\n    const pivotQueryProps: ExecutePivotQueryParams = {\n      dataSource: DM.DataSource,\n      rows: {{rowsString}},\n      values: {{valuesString}},\n      filters: {{filtersString}},\n    }\n\n    const { data, isLoading, isError, error } = useExecutePivotQuery(pivotQueryProps);\n\n    if (isLoading) {\n      return <div>Loading...</div>;\n    }\n    if (isError) {\n      return <div>Error: {error.message}</div>;\n    }\n    if (data) {\n      return <div>Total Rows: {data.table.rows.length}</div>;\n    }\n\n    return null;\n};\n\nexport default CodeExample;\n`,\n    pivotTableWidgetTmpl: `import { {{componentString}} } from 'sisense-sdk-ui-next';\n{{extraImportsString}}\nimport * as DM from './{{dataSourceString}}'; // generated with @sisense/sdk-cli\n\nexport default function CodeExample() {\n  return (\n    <{{componentString}}\n      title={'{{titleString}}'}\n      dataSource={DM.DataSource}\n      dataOptions={ {{dataOptionsString}} }\n      filters={ {{filtersString}} }\n      styleOptions={ {{styleOptionsString}} }\n    />\n  );\n}`,\n    pivotTableWidgetPropsTmpl: `{\n      id: '{{idString}}',\n      widgetType: '{{widgetTypeString}}',\n      title: '{{titleString}}',\n      dataSource: DM.DataSource,\n      dataOptions: {{dataOptionsString}},\n      filters: {{filtersString}},\n      styleOptions: {{styleOptionsString}},\n    }`,\n    dashboardByIdTmpl: `import { DashboardById } from 'sisense-sdk-ui-next';\n\nconst CodeExample = () => {\n  return (\n    <>\n      <DashboardById dashboardOid=\"{{dashboardOid}}\" />\n    </>\n  );\n};\n\nexport default CodeExample;`,\n    dashboardTmpl: `import { useMemo } from 'react';\nimport { Dashboard, DashboardProps, WidgetProps } from 'sisense-sdk-ui-next';\nimport { Filter, FilterRelations } from '@sisense/sdk-data';\n{{extraImportsString}}\nimport * as DM from './{{defaultDataSourceString}}'; // generated with @sisense/sdk-cli\n\nexport default function CodeExample() {\n  const dashboardProps: DashboardProps = useMemo(() => {\n    const widgets: WidgetProps[] = {{widgetsString}};\n    const filters: Filter[] | FilterRelations = {{filtersString}};\n\n    return {\n      title: '{{titleString}}',\n      widgets,\n      filters,\n      config: {\n        toolbar: { isVisible: true },\n        filtersPanel: { isVisible: true },\n      },\n      widgetsOptions: {{widgetsOptionsString}},\n      layoutOptions: {{layoutOptionsString}},\n      tabbersOptions: {{tabbersOptionsString}},\n      styleOptions: {{styleOptionsString}},\n    };\n  }, []);\n\n  return (\n    <Dashboard {...dashboardProps} />\n  );\n}`,\n  },\n  angular: {\n    baseChartTmpl: `import { Component } from '@angular/core';\nimport { type ChartDataOptions, type ChartStyleOptions } from '@sisense/sdk-ui-angular';\n{{extraImportsString}}\nimport * as DM from './{{dataSourceString}}'; // generated with @sisense/sdk-cli\n\n@Component({\n    selector: 'code-example',\n    template: \\`\n      <csdk-chart-widget\n        [title]=\"'{{titleString}}'\"\n        chartType='{{chartTypeString}}'\n        [dataSource]='DM.DataSource'\n        [dataOptions]='dataOptions'\n        [filters]='filters'\n        [styleOptions]='styleOptions'\n        [drilldownOptions]='drilldownOptions'\n      />\n    \\`\n})\nexport class CodeExample {\n    DM = DM;\n    dataOptions: ChartDataOptions = {{dataOptionsString}};\n    filters = {{filtersString}};\n    styleOptions: ChartStyleOptions = {{styleOptionsString}};\n    drilldownOptions = {{drilldownOptionsString}};\n}`,\n    chartTmpl: `{{baseChartTmpl}}`,\n    chartWidgetTmpl: `{{baseChartTmpl}}`,\n    chartWidgetPropsTmpl: `{\n      id: '{{idString}}',\n      widgetType: '{{widgetTypeString}}',\n      title: '{{titleString}}',\n      dataSource: DM.DataSource,\n      chartType: '{{chartTypeString}}',\n      dataOptions: {{dataOptionsString}},\n      filters: {{filtersString}},\n      styleOptions: {{styleOptionsString}},\n      drilldownOptions: {{drilldownOptionsString}},\n    }`,\n    widgetByIdTmpl: `import { Component } from '@angular/core';\n\n@Component({\n  selector: 'code-example',\n  template: \\`\n    <csdk-widget-by-id\n      [widgetOid]=\"widgetOid\"\n      [dashboardOid]=\"dashboardOid\"\n      [includeDashboardFilters]=\"includeDashboardFilters\"\n    />\n  \\`,\n})\n\nexport class CodeExample {\n  widgetOid = \"{{widgetOid}}\";\n  dashboardOid = \"{{dashboardOid}}\";\n  includeDashboardFilters = true;\n}`,\n    executeQueryByWidgetIdTmpl: `import { Component } from '@angular/core';\nimport { QueryService } from '@sisense/sdk-ui-angular';\nimport { type QueryResultData } from '@sisense/sdk-data';\n\n@Component({\n  selector: 'code-example',\n  template: \\`<div>\n    <div *ngIf=\"errorMessage\">Error: {{ errorMessage }}</div>\n    <div *ngIf=\"!errorMessage\">Total Rows: {{ queryResult.rows.length }}</div>\n  </div>\\`,\n})\n\nexport class CodeExample {\n    queryResult: QueryResultData = { rows: [], columns: [] };\n\n    errorMessage: string | null = null;\n\n    constructor(private queryService: QueryService) {}\n\n    async ngOnInit(): Promise<void> {\n      try {\n        const { data } = await this.queryService.executeQueryByWidgetId({\n          widgetOid: \"{{widgetOid}}\",\n          dashboardOid: \"{{dashboardOid}}\",\n        });\n        this.queryResult = data as QueryResultData;\n      } catch(error: unknown) {\n        if (error instanceof Error) {\n          this.errorMessage = error.message;\n        }\n      }\n    }\n}\n`,\n    executeQueryTmpl: `import { Component } from '@angular/core';\n{{extraImportsString}}\nimport { type QueryResultData } from '@sisense/sdk-data';\nimport * as DM from './{{dataSourceString}}'; // generated with @sisense/sdk-cli\nimport { QueryService } from '@sisense/sdk-ui-angular';\n\n@Component({\n  selector: 'code-example',\n  template: \\`<div>\n    <div *ngIf=\"errorMessage\">Error: {{ errorMessage }}</div>\n    <div *ngIf=\"!errorMessage\">Total Rows: {{ queryResult.rows.length }}</div>\n  </div>\\`,\n})\n\nexport class CodeExample {\n    queryResult: QueryResultData = { rows: [], columns: [] };\n\n    errorMessage: string | null = null;\n\n    constructor(private queryService: QueryService) {}\n\n    async ngOnInit(): Promise<void> {\n      const queryProps = {\n        dataSource: DM.DataSource,\n        dimensions: {{dimensionsString}},\n        measures: {{measuresString}},\n        filters: {{filtersString}},\n        highlights: {{highlightsString}},\n      }\n\n      try {\n        const { data } = await this.queryService.executeQuery(queryProps);\n        this.queryResult = data as QueryResultData;\n      } catch (error: unknown) {\n        if (error instanceof Error) {\n          this.errorMessage = error.message;\n        }\n      }\n    }\n}\n`,\n    executePivotQueryTmpl: `Not implemented yet`,\n    pivotTableWidgetTmpl: `Not implemented yet`,\n    pivotTableWidgetPropsTmpl: `{\n      id: '{{idString}}',\n      widgetType: '{{widgetTypeString}}',\n      title: '{{titleString}}',\n      dataSource: DM.DataSource,\n      dataOptions: {{dataOptionsString}},\n      filters: {{filtersString}},\n      styleOptions: {{styleOptionsString}},\n    }`,\n    dashboardByIdTmpl: `import { Component } from '@angular/core';\n\n@Component({\n  selector: 'code-example',\n  template: \\`\n    <csdk-dashboard-by-id\n      [dashboardOid]=\"dashboardOid\"\n    />\n  \\`,\n})\n\nexport class CodeExample {\n  dashboardOid = \"{{dashboardOid}}\";\n}`,\n    dashboardTmpl: `/** COMING SOON */`,\n  },\n  vue: {\n    baseChartTmpl: `<script setup lang=\"ts\">\n  import { ref } from 'vue';\n  import { {{componentString}}, type ChartStyleOptions } from '@sisense/sdk-ui-vue';\n  {{extraImportsString}}\n  import * as DM from './{{dataSourceString}}'; // generated with @sisense/sdk-cli\n\n  const dataOptions = ref({{dataOptionsString}});\n  const filters = ref({{filtersString}});\n  const styleOptions = ref<ChartStyleOptions>({{styleOptionsString}});\n  const drilldownOptions = ref({{drilldownOptionsString}});\n</script>\n\n<template>\n  <{{componentString}}\n    chartType=\"{{chartTypeString}}\"\n    :dataOptions=\"dataOptions\"\n    :filters=\"filters\"\n    :styleOptions=\"styleOptions\"\n    :drilldownOptions=\"drilldownOptions\"\n    :dataSource=\"DM.DataSource\"\n    title=\"{{titleString}}\" />\n</template>`,\n    chartTmpl: `{{baseChartTmpl}}`,\n    chartWidgetTmpl: `{{baseChartTmpl}}`,\n    chartWidgetPropsTmpl: `{\n      id: '{{idString}}',\n      widgetType: '{{widgetTypeString}}',\n      title: '{{titleString}}',\n      dataSource: DM.DataSource,\n      chartType: '{{chartTypeString}}',\n      dataOptions: {{dataOptionsString}},\n      filters: {{filtersString}},\n      styleOptions: {{styleOptionsString}},\n      drilldownOptions: {{drilldownOptionsString}},\n    }`,\n    widgetByIdTmpl: `<script setup lang=\"ts\">\nimport { WidgetById } from '@sisense/sdk-ui-vue';\n</script>\n<template>\n  <WidgetById\n    :widgetOid=\"'{{widgetOid}}'\"\n    :dashboardOid=\"'{{dashboardOid}}'\"\n  />\n</template>\n`,\n    executeQueryByWidgetIdTmpl: `<script setup lang=\"ts\">\nimport { useExecuteQueryByWidgetId } from '@sisense/sdk-ui-vue';\n\nconst { data, isLoading, isError, error } = useExecuteQueryByWidgetId({\n  widgetOid: \"{{widgetOid}}\",\n  dashboardOid: \"{{dashboardOid}}\"\n});\n</script>\n<template>\n  <div>\n    <div v-if=\"isLoading\">Loading...</div>\n    <div v-else-if=\"isError\">Error: {{error.message}}</div>\n    <div v-else-if=\"data\">Total Rows: {{data.rows.length}}</div>\n  </div>\n</template>\n`,\n    executeQueryTmpl: `<script setup lang=\"ts\">\nimport { useExecuteQuery } from '@sisense/sdk-ui-vue';\n{{extraImportsString}}\nimport * as DM from './{{dataSourceString}}'; // generated with @sisense/sdk-cli\n\nconst queryProps = {\n  dataSource: DM.DataSource,\n  dimensions: {{dimensionsString}},\n  measures: {{measuresString}},\n  filters: {{filtersString}},\n  highlights: {{highlightsString}},\n}\nconst { data, isLoading, isError, error } = useExecuteQuery(queryProps);\n</script>\n<template>\n  <div>\n    <div v-if=\"isLoading\">Loading...</div>\n    <div v-else-if=\"isError\">Error: {{error.message}}</div>\n    <div v-else-if=\"data\">Total Rows: {{data.rows.length}}</div>\n  </div>\n</template>`,\n    executePivotQueryTmpl: 'Not implemented yet',\n    pivotTableWidgetTmpl: `Not implemented yet`,\n    pivotTableWidgetPropsTmpl: `{\n      id: '{{idString}}',\n      widgetType: '{{widgetTypeString}}',\n      title: '{{titleString}}',\n      dataSource: DM.DataSource,\n      dataOptions: {{dataOptionsString}},\n      filters: {{filtersString}},\n      styleOptions: {{styleOptionsString}},\n    }`,\n    dashboardByIdTmpl: `<script setup lang=\"ts\">\nimport { DashboardById } from '@sisense/sdk-ui-vue';\n</script>\n<template>\n  <DashboardById :dashboardOid=\"'{{dashboardOid}}'\" />\n</template>`,\n    dashboardTmpl: `/** COMING SOON */`,\n  },\n};\n","import { CODE_TEMPLATES } from './code-templates.js';\r\nimport { CodePlaceholderMap, CodeTemplateKey, UiFramework } from '../types.js';\r\nimport { removeEmptyLineBeforeImport } from '../common/utils.js';\r\n\r\n/**\r\n * Populates templates recursively.\r\n *\r\n * @param templateKey - the key of the template to use\r\n * @param uiFramework - the UI framework for the generated code\r\n * @returns the populated template with placeholders\r\n */\r\nconst populateTemplates = (templateKey: CodeTemplateKey, uiFramework: UiFramework): string => {\r\n  const template = CODE_TEMPLATES[uiFramework][templateKey];\r\n  return (\r\n    template\r\n      // replace template placeholders with actual templates recursively\r\n      .replace(/{{(.*?)Tmpl}}/g, (match, key) =>\r\n        populateTemplates(`${key}Tmpl` as CodeTemplateKey, uiFramework),\r\n      )\r\n  );\r\n};\r\n\r\n/**\r\n * Populates placeholders in the given template with the given data.\r\n * If a placeholder is not found in the data, a warning is logged.\r\n *\r\n * @param template - the template to populate\r\n * @param data - the data to populate the template with\r\n * @returns the populated template\r\n */\r\nexport const populatePlaceholders = (template: string, data: Record<string, string>): string => {\r\n  // replace other placeholders with actual values defined in data\r\n  return template.replace(/{{(.*?)}}/g, (match, key) => {\r\n    if (key in data) {\r\n      return data[key];\r\n    }\r\n    console.warn(`Placeholder ${key} not found in data`);\r\n    return match;\r\n  });\r\n};\r\n\r\n/**\r\n * Generates code from a template with the given data and UI framework.\r\n *\r\n * @param templateKey - the key of the template to use\r\n * @param placeholderMap - the data to populate the template with\r\n * @param uiFramework - the UI framework for the generated code\r\n */\r\nexport const generateCode = (\r\n  templateKey: CodeTemplateKey,\r\n  placeholderMap: CodePlaceholderMap,\r\n  uiFramework: UiFramework = 'react',\r\n): string => {\r\n  const template = populateTemplates(templateKey, uiFramework);\r\n  return removeEmptyLineBeforeImport(populatePlaceholders(template, placeholderMap));\r\n};\r\n","import {\r\n  AggregationTypes,\r\n  DimensionalBaseMeasure,\r\n  MetadataItem,\r\n  MetadataItemJaql,\r\n} from '@sisense/sdk-data';\r\n\r\n/**\r\n * Concatenates Aggregation Types.\r\n */\r\nconst concatAggTypes = (): string => {\r\n  const values = Object.values(AggregationTypes);\r\n  return values.map((value) => DimensionalBaseMeasure.aggregationToJAQL(value)).join('|');\r\n};\r\n\r\n/**\r\n * Simplifies Aggregation Formula defined in MetadataItemJaql returned from chat response.\r\n *\r\n * @param aggFormula - The Aggregation Formula to simplify\r\n * @returns The equivalent measure\r\n * @privateRemarks\r\n * See unit tests for examples of aggregation formulas and their equivalent measures.\r\n */\r\nconst simplifyAggFormula = (aggFormula: MetadataItemJaql): MetadataItemJaql => {\r\n  const { formula, context, filter } = aggFormula;\r\n\r\n  if (!context || !formula) {\r\n    return aggFormula;\r\n  }\r\n\r\n  const keys = Object.keys(context);\r\n  // if context has multiple entries, return the original formula without simplification\r\n  if (keys.length !== 1) {\r\n    return aggFormula;\r\n  }\r\n  const key = keys[0];\r\n  if (typeof key !== 'string') {\r\n    return aggFormula;\r\n  }\r\n  const contextValue = context[`${key}`];\r\n  const aggTypes = concatAggTypes();\r\n  // eslint-disable-next-line security/detect-non-literal-regexp\r\n  const regex = new RegExp(`^\\\\s*(${aggTypes})\\\\(\\\\[\\\\w+\\\\]\\\\)$`);\r\n  const match = formula.match(regex);\r\n  if (match && formula.includes(key)) {\r\n    // Extracting the aggregation function from the match\r\n    const agg = match[1];\r\n    return {\r\n      dim: contextValue.dim,\r\n      table: contextValue.table,\r\n      column: contextValue.column,\r\n      datatype: contextValue.datatype,\r\n      agg: agg,\r\n      title: aggFormula.title,\r\n      ...(filter ? { filter: { ...filter } } : {}),\r\n    };\r\n  }\r\n  return aggFormula;\r\n};\r\n\r\n/**\r\n * Simplifies MetadataItemJaql.\r\n *\r\n * @param item - The MetadataItemJaql to simplify\r\n * @returns The simplified MetadataItemJaql\r\n */\r\nconst simplifyMetadataItemJaql = (item: MetadataItemJaql): MetadataItemJaql => {\r\n  // if item contains a simple aggregation formula, simplify it\r\n  let simplifiedItem = item;\r\n\r\n  if ('formula' in item) {\r\n    simplifiedItem = simplifyAggFormula(item);\r\n  }\r\n\r\n  if ('context' in simplifiedItem) {\r\n    const context = { ...simplifiedItem.context };\r\n    Object.keys(context).forEach((key) => {\r\n      context[`${key}`] = simplifyMetadataItemJaql(context[`${key}`]);\r\n    });\r\n    simplifiedItem.context = context;\r\n  }\r\n  return simplifiedItem;\r\n};\r\n\r\n/**\r\n * Simplify filter\r\n *\r\n * @param item - the MetadataItem\r\n * @return the MetadataItem with simplified filter\r\n */\r\nconst simplifyMetadataItemFilter = (item: MetadataItem): MetadataItem => {\r\n  const simplifiedItem = item;\r\n  if (simplifiedItem.panel !== 'scope') return simplifiedItem;\r\n\r\n  const { jaql } = simplifiedItem;\r\n  if (jaql.filter?.by) {\r\n    jaql.filter.by = simplifyAggFormula(jaql.filter.by);\r\n  }\r\n\r\n  return { ...simplifiedItem, jaql };\r\n};\r\n\r\n/**\r\n * Simplifies MetadataItem.\r\n *\r\n * @param item - The MetadataItem to simplify\r\n * @returns The simplified MetadataItem\r\n * @internal\r\n */\r\nexport const simplifyMetadataItem = (item: MetadataItem): MetadataItem => {\r\n  let simplifiedItem = item;\r\n\r\n  // simplify filter\r\n  simplifiedItem = simplifyMetadataItemFilter(simplifiedItem);\r\n\r\n  const { jaql, measure, by } = simplifiedItem;\r\n\r\n  return {\r\n    ...simplifiedItem,\r\n    jaql: simplifyMetadataItemJaql(jaql),\r\n    ...(by ? { by: simplifyMetadataItemJaql(by) } : {}),\r\n    ...(measure ? { measure: simplifyMetadataItemJaql(measure) } : {}),\r\n  };\r\n};\r\n","export const CODE_TEMPLATES_INDENT = 6;\r\n","import { ChartDataOptions } from '@/types';\r\nimport { escapeSingleQuotes } from '@sisense/sdk-common';\r\nimport {\r\n  DimensionalBaseMeasure,\r\n  DimensionalElement,\r\n  JaqlElement,\r\n  MetadataItemJaql,\r\n  normalizeAttributeName,\r\n} from '@sisense/sdk-data';\r\n\r\nimport { DataSource, Filter, FilterRelations } from '@sisense/sdk-data';\r\nimport { toKebabCase, isNonEmptyArray, quoteUnsafeKeys } from '../common/utils';\r\nimport { CODE_TEMPLATES_INDENT } from '../common/constants';\r\n\r\nconst NEW_LINE = '\\n';\r\nconst VALUE_UNKNOWN = 'UNKNOWN';\r\n\r\nexport type MembersFilterJaql = {\r\n  members: string[];\r\n};\r\n\r\nexport type FromNotEqualFilterJaql = {\r\n  fromNotEqual: number;\r\n};\r\n\r\nexport type FilterJaql = MembersFilterJaql | FromNotEqualFilterJaql;\r\n\r\nconst stringifyFormula = (jaql: MetadataItemJaql, indent: number): string => {\r\n  let s = '';\r\n  s += 'measureFactory.customFormula(\\n';\r\n  s += ' '.repeat(indent);\r\n  s += `  '${escapeSingleQuotes(jaql.title)}',\\n`;\r\n  s += ' '.repeat(indent);\r\n  s += `  '${jaql.formula}',\\n`;\r\n  s += ' '.repeat(indent);\r\n  s += `  {\\n`;\r\n\r\n  Object.entries(jaql.context!).forEach(([key, value]) => {\r\n    const attributeName = normalizeAttributeName(\r\n      value.table || VALUE_UNKNOWN,\r\n      value.column || VALUE_UNKNOWN,\r\n      undefined,\r\n      'DM',\r\n    );\r\n    s += ' '.repeat(indent);\r\n    s += `    '${key.slice(1, -1)}': ${attributeName},\\n`;\r\n  });\r\n\r\n  s += ' '.repeat(indent);\r\n  s += `  }\\n`;\r\n  s += ' '.repeat(indent);\r\n  s += `)`;\r\n  return s;\r\n};\r\n\r\n// eslint-disable-next-line complexity\r\nconst stringifyDimensionOrMeasure = (jaql: MetadataItemJaql): string => {\r\n  const { level, table, column, agg, title } = jaql;\r\n  let elementDef;\r\n\r\n  // create dimension attribute\r\n  if (table && column) {\r\n    elementDef = normalizeAttributeName(table, column, level, 'DM');\r\n  }\r\n\r\n  // if agg exists, create measure on the attribute\r\n  if (agg && table && column && title) {\r\n    elementDef = `measureFactory.${DimensionalBaseMeasure.aggregationFromJAQL(\r\n      agg,\r\n    )}(${elementDef}, '${escapeSingleQuotes(title)}')`;\r\n  }\r\n\r\n  return elementDef || VALUE_UNKNOWN;\r\n};\r\n\r\nconst stringifyJaqlElement = (jaqlElement: JaqlElement, indent: number): string => {\r\n  const jaql = jaqlElement.jaql(false).jaql;\r\n\r\n  if ('formula' in jaql) {\r\n    return stringifyFormula(jaql, indent);\r\n  } else {\r\n    return stringifyDimensionOrMeasure(jaql);\r\n  }\r\n};\r\n\r\n// eslint-disable-next-line sonarjs/cognitive-complexity\r\nexport const stringifyProps = (\r\n  props: object | string,\r\n  indent = 0,\r\n  wrapInQuotes = false,\r\n  // eslint-disable-next-line sonarjs/cognitive-complexity\r\n): string => {\r\n  if (!props) {\r\n    return '';\r\n  }\r\n\r\n  if (typeof props === 'string') {\r\n    return `'${escapeSingleQuotes(props)}'`;\r\n  }\r\n\r\n  if (props instanceof JaqlElement) {\r\n    return stringifyJaqlElement(props, indent);\r\n  }\r\n\r\n  if (props instanceof DimensionalElement) {\r\n    return props.composeCode || '';\r\n  }\r\n\r\n  let s = '';\r\n\r\n  if (Array.isArray(props)) {\r\n    s += `[${props.map((v) => stringifyProps(v, indent + 2))}${\r\n      props.length ? NEW_LINE + ' '.repeat(indent + 2) : ''\r\n    }]`;\r\n  } else {\r\n    s += `{${NEW_LINE}`;\r\n    Object.entries(props).forEach(([key, value]) => {\r\n      if (wrapInQuotes && typeof key === 'string') {\r\n        key = `'${escapeSingleQuotes(key)}'`;\r\n      }\r\n      s += ' '.repeat(indent + 2);\r\n      if (Array.isArray(value)) {\r\n        s += `${key}: [${value.map((v) => stringifyProps(v, indent + 4, wrapInQuotes))}${\r\n          value.length ? NEW_LINE + ' '.repeat(indent + 2) : ''\r\n        }]`;\r\n      } else if (typeof value === 'object' && value !== null) {\r\n        const processedValue = Array.isArray(value) ? value : quoteUnsafeKeys(value);\r\n        s += `${key}: ${stringifyProps(processedValue, indent + 2, wrapInQuotes)}`;\r\n      } else if (['number', 'boolean', 'undefined'].includes(typeof value) || value === null) {\r\n        s += `${key}: ${value}`;\r\n      } else if (typeof value === 'string') {\r\n        s += `${key}: '${escapeSingleQuotes(value)}'`;\r\n      } else {\r\n        s += `${key}: ${value}`;\r\n      }\r\n      s += `,${NEW_LINE}`;\r\n    });\r\n    s += ' '.repeat(indent);\r\n    s += '}';\r\n  }\r\n\r\n  return s;\r\n};\r\n\r\nexport function stringifyDataOptions(dataOptions: ChartDataOptions): string {\r\n  return stringifyProps(dataOptions, CODE_TEMPLATES_INDENT);\r\n}\r\n\r\nexport function stringifyDataSource(\r\n  dataSource: DataSource | undefined,\r\n  defaultDataSourceString = 'data-source-placeholder',\r\n): string {\r\n  if (!dataSource) {\r\n    return defaultDataSourceString;\r\n  }\r\n\r\n  const dataSourceString =\r\n    typeof dataSource === 'object' && 'title' in dataSource ? dataSource.title : dataSource;\r\n\r\n  return toKebabCase(dataSourceString);\r\n}\r\n\r\nexport function stringifyExtraImports(\r\n  filters: Filter[] | FilterRelations,\r\n  importMeasureFactory = true,\r\n): string {\r\n  const importNames = [];\r\n\r\n  if (importMeasureFactory) {\r\n    importNames.push('measureFactory');\r\n  }\r\n\r\n  if (isNonEmptyArray(filters as Filter[])) {\r\n    importNames.push('filterFactory');\r\n  }\r\n\r\n  return importNames.length > 0\r\n    ? `import { ${importNames.join(', ')} } from '@sisense/sdk-data';`\r\n    : '';\r\n}\r\n","import { Filter, FilterJaql, FilterRelations } from '@sisense/sdk-data';\r\nimport { stringifyProps } from './stringify-props.js';\r\nconst NEW_LINE = '\\n';\r\n\r\ntype FilterJaqlWrapper = { jaql: FilterJaql };\r\n\r\nconst stringifyFilter = (filter: Filter, indent: number): string => {\r\n  if (filter.composeCode) {\r\n    return `${NEW_LINE}${' '.repeat(indent)}${filter.composeCode}`;\r\n  }\r\n\r\n  // no filter code means the filter JAQL is not translated to Filter object\r\n  // fall back to the custom filter\r\n  const filterJaql = (filter.jaql() as FilterJaqlWrapper).jaql;\r\n\r\n  return `${NEW_LINE}${' '.repeat(indent)}filterFactory.customFilter(${stringifyProps(\r\n    filterJaql,\r\n    indent,\r\n    true,\r\n  )})`;\r\n};\r\n\r\nconst stringifyFilterList = (filters: Filter[], indent = 0): string => {\r\n  if (!filters) {\r\n    return '';\r\n  }\r\n\r\n  let s = '';\r\n  s += `[${filters.map((f) => stringifyFilter(f, indent + 2))}${\r\n    filters.length ? '\\n' + ' '.repeat(indent + 2) : ''\r\n  }]`;\r\n\r\n  return s;\r\n};\r\n\r\nexport const stringifyFilters = (filters: Filter[] | FilterRelations | undefined): string => {\r\n  if (!filters) {\r\n    return '[]';\r\n  }\r\n  if (Array.isArray(filters)) {\r\n    return stringifyFilterList(filters, 6);\r\n  }\r\n\r\n  return '/** Filter relations not supported yet */';\r\n};\r\n","import { WidgetProps } from '@/props';\r\nimport {\r\n  ByIdWidgetCodeParams,\r\n  ClientSideWidgetCodeParams,\r\n  UiFramework,\r\n  ChartWidgetCodeProps,\r\n  PivotTableWidgetCodeProps,\r\n  TemplateKeyMapByWidgetType,\r\n} from '../types.js';\r\nimport {\r\n  isChartWidgetProps,\r\n  isPivotTableWidgetProps,\r\n  isCustomWidgetProps,\r\n} from '@/widget-by-id/utils.js';\r\nimport { TranslatableError } from '@/translation/translatable-error';\r\nimport { validateChartType, checkIfMeasuresExist } from '../common/utils.js';\r\nimport {\r\n  stringifyDataSource,\r\n  stringifyExtraImports,\r\n  stringifyDataOptions,\r\n} from '../code/stringify-props.js';\r\nimport { ChartType } from '@/types';\r\nimport { generateCode } from '../code/generate-code.js';\r\nimport { stringifyFilters } from '../code/stringify-filters.js';\r\nimport { CodeTemplateKey } from '../types.js';\r\nimport { stringifyProps } from '../code/stringify-props.js';\r\nimport { CODE_TEMPLATES_INDENT } from '../common/constants.js';\r\n\r\nconst widgetByIdTemplateKeys: CodeTemplateKey[] = ['executeQueryByWidgetIdTmpl', 'widgetByIdTmpl'];\r\nconst widgetTemplateKey: CodeTemplateKey = 'chartWidgetTmpl';\r\nconst pivotTableWidgetTemplateKey: CodeTemplateKey = 'pivotTableWidgetTmpl';\r\n\r\nconst stringifyChartType = (chartType: ChartType): string => {\r\n  return chartType as string;\r\n};\r\n\r\nexport const toWidgetCodeById = ({\r\n  dashboardOid,\r\n  widgetOid,\r\n  uiFramework = 'react',\r\n  chartType = 'table',\r\n  includeChart = true,\r\n}: ByIdWidgetCodeParams): string => {\r\n  validateChartType(chartType);\r\n  const codeProps = { dashboardOid, widgetOid };\r\n  const templateKey = widgetByIdTemplateKeys[Number(includeChart)];\r\n  return generateCode(templateKey, codeProps, uiFramework);\r\n};\r\n\r\nexport const getWidgetCode = (\r\n  widgetProps: WidgetProps,\r\n  uiFramework: UiFramework,\r\n  templateKeyMap: TemplateKeyMapByWidgetType,\r\n): string => {\r\n  if (isChartWidgetProps(widgetProps)) {\r\n    validateChartType(widgetProps.chartType);\r\n    const hasMeasures = checkIfMeasuresExist(widgetProps);\r\n    const codeProps: ChartWidgetCodeProps = {\r\n      idString: widgetProps.id,\r\n      widgetTypeString: 'chart',\r\n      titleString: widgetProps.title,\r\n      dataSourceString: stringifyDataSource(widgetProps.dataSource),\r\n      chartTypeString: stringifyChartType(widgetProps.chartType),\r\n      dataOptionsString: stringifyDataOptions(widgetProps.dataOptions),\r\n      filtersString: stringifyFilters(widgetProps.filters),\r\n      componentString: 'ChartWidget',\r\n      extraImportsString: stringifyExtraImports(widgetProps.filters || [], hasMeasures),\r\n      styleOptionsString: stringifyProps(widgetProps.styleOptions || {}, CODE_TEMPLATES_INDENT),\r\n      drilldownOptionsString: stringifyProps(\r\n        widgetProps.drilldownOptions || {},\r\n        CODE_TEMPLATES_INDENT,\r\n      ),\r\n    };\r\n    return generateCode(templateKeyMap.chart, codeProps, uiFramework);\r\n  }\r\n\r\n  if (isPivotTableWidgetProps(widgetProps)) {\r\n    const hasMeasures = checkIfMeasuresExist(widgetProps);\r\n    const codeProps: PivotTableWidgetCodeProps = {\r\n      idString: widgetProps.id,\r\n      widgetTypeString: 'pivot',\r\n      titleString: widgetProps.title,\r\n      dataSourceString: stringifyDataSource(widgetProps.dataSource),\r\n      dataOptionsString: stringifyProps(widgetProps.dataOptions),\r\n      filtersString: stringifyFilters(widgetProps.filters),\r\n      componentString: 'PivotTableWidget',\r\n      extraImportsString: stringifyExtraImports(widgetProps.filters || [], hasMeasures),\r\n      styleOptionsString: stringifyProps(widgetProps.styleOptions || {}, CODE_TEMPLATES_INDENT),\r\n    };\r\n    return generateCode(templateKeyMap.pivot, codeProps, uiFramework);\r\n  }\r\n\r\n  if (isCustomWidgetProps(widgetProps)) {\r\n    return '/** Custom widget code not supported yet */';\r\n  }\r\n\r\n  throw new TranslatableError('errors.otherWidgetTypesNotSupported');\r\n};\r\n\r\nexport const toWidgetCodeClientSide = ({\r\n  widgetProps,\r\n  uiFramework = 'react',\r\n}: ClientSideWidgetCodeParams): string => {\r\n  const templateKeyMap: TemplateKeyMapByWidgetType = {\r\n    chart: widgetTemplateKey,\r\n    pivot: pivotTableWidgetTemplateKey,\r\n  };\r\n  return getWidgetCode(widgetProps, uiFramework, templateKeyMap);\r\n};\r\n","import merge from 'ts-deepmerge';\r\nimport { ChartSubtype } from '../../../chart-options-processor/subtype-to-design-options';\r\nimport {\r\n  CartesianChartDataOptions,\r\n  CategoricalChartDataOptions,\r\n  ChartDataOptions,\r\n  ChartType,\r\n  ChartStyleOptions,\r\n  ScatterChartDataOptions,\r\n} from '../../../types';\r\nimport { ScattermapChartDataOptions } from '../../../chart-data-options/types';\r\nimport { getDefaultStyleOptions } from '@/chart-options-processor/chart-options-service';\r\nimport {\r\n  DatetimeMask,\r\n  MetadataItem,\r\n  createDimensionalElementFromMetadataItem,\r\n  isDatetime,\r\n} from '@sisense/sdk-data';\r\nimport { AxesMapping, ChartRecommendations, ExpandedQueryModel } from '@/analytics-composer/types';\r\nimport { normalizeAnyColumn } from '@/chart-data-options/utils';\r\n\r\n/**\r\n * @internal\r\n */\r\nexport const getChartRecommendationsOrDefault = (\r\n  response: ExpandedQueryModel,\r\n): ChartRecommendations => {\r\n  if ('chartType' in response.chartRecommendations) {\r\n    return response.chartRecommendations;\r\n  }\r\n\r\n  return {\r\n    chartType: 'table',\r\n    chartFamily: 'table',\r\n    axesMapping: {},\r\n  };\r\n};\r\n\r\nconst getTableDataOptions = (jaql: MetadataItem[]) => {\r\n  const columns = jaql.map(createDimensionalElementFromMetadataItem);\r\n\r\n  return {\r\n    dataOptions: { columns },\r\n  };\r\n};\r\n\r\nconst DEFAULT_STYLE_OPTIONS = Object.freeze<ChartStyleOptions>({\r\n  convolution: {\r\n    enabled: true,\r\n    selectedConvolutionType: 'bySlicesCount',\r\n    independentSlicesCount: 7,\r\n  },\r\n  lineWidth: { width: 'bold' },\r\n  markers: {\r\n    enabled: false,\r\n  },\r\n  legend: {\r\n    enabled: false,\r\n  },\r\n  yAxis: {\r\n    gridLines: false,\r\n  },\r\n  xAxis: {\r\n    gridLines: false,\r\n  },\r\n});\r\n\r\nconst DEFAULT_SUBTYPE_FOR = Object.freeze<Partial<Record<ChartType, ChartSubtype>>>({\r\n  line: 'line/spline',\r\n  pie: 'pie/donut',\r\n  bar: 'bar/stacked',\r\n  column: 'column/stackedcolumn',\r\n});\r\n\r\n/**\r\n * Maps the metadata items to the chart data options.\r\n *\r\n * @param metadataItems - metadata items\r\n * @param chartFamily - chart family\r\n * @param axesMapping - axes mapping\r\n * @returns chart data options\r\n * @internal\r\n */\r\nexport const getChartDataOptions = (\r\n  metadataItems: MetadataItem[],\r\n  chartFamily: string,\r\n  axesMapping: AxesMapping,\r\n): ChartDataOptions => {\r\n  const metadataItemByTitle = metadataItems.reduce((acc, item) => {\r\n    acc[item.jaql.title!] = item;\r\n    return acc;\r\n  }, {} as Record<string, MetadataItem>);\r\n\r\n  const intermediateOptions = Object.entries(axesMapping).reduce((acc, item) => {\r\n    const [key, value] = item;\r\n\r\n    acc[`${key}`] = Array.isArray(value)\r\n      ? value.map((v) => {\r\n          const nColumn = normalizeAnyColumn(v);\r\n          // enabled is an internal property that should not be excluded in the generated widget code\r\n          delete nColumn.enabled;\r\n          const m = metadataItemByTitle[nColumn.column.name];\r\n          // this will generate an error in the chart instead of failing\r\n          // error will contain the name of the problematic item\r\n          // TODO: remove when proper validation is introduced\r\n          if (!m) return { column: { type: '', name: nColumn.column.name } };\r\n          const column = createDimensionalElementFromMetadataItem(m);\r\n\r\n          if (m.panel === 'measures') {\r\n            return {\r\n              ...nColumn,\r\n              column,\r\n            };\r\n          }\r\n\r\n          if (isDatetime(column.type)) {\r\n            const dateFormat: string | undefined = (m.format?.mask as DatetimeMask)?.[\r\n              m.jaql.level!\r\n            ];\r\n            if (dateFormat) {\r\n              return {\r\n                ...nColumn,\r\n                column,\r\n                dateFormat,\r\n              };\r\n            }\r\n          }\r\n\r\n          return { ...nColumn, column };\r\n        })\r\n      : value;\r\n\r\n    return acc;\r\n  }, {});\r\n\r\n  switch (chartFamily) {\r\n    case 'cartesian':\r\n      return {\r\n        category: [],\r\n        value: [],\r\n        breakBy: [],\r\n        ...intermediateOptions,\r\n      } as CartesianChartDataOptions;\r\n    case 'categorical':\r\n      return {\r\n        category: [],\r\n        value: [],\r\n        ...intermediateOptions,\r\n      } as CategoricalChartDataOptions;\r\n    case 'scatter':\r\n      Object.keys(intermediateOptions).forEach((key) => {\r\n        intermediateOptions[`${key}`] = intermediateOptions[`${key}`][0];\r\n      });\r\n      return intermediateOptions as ScatterChartDataOptions;\r\n    case 'scattermap':\r\n      Object.keys(intermediateOptions).forEach((key) => {\r\n        if (key !== 'geo') {\r\n          intermediateOptions[`${key}`] = intermediateOptions[`${key}`][0];\r\n        }\r\n      });\r\n      return intermediateOptions as ScattermapChartDataOptions;\r\n    case 'table':\r\n      if (Object.keys(intermediateOptions).length === 0) {\r\n        return getTableDataOptions(metadataItems).dataOptions;\r\n      }\r\n      return intermediateOptions;\r\n    case 'boxplot':\r\n    case 'areamap':\r\n    case 'indicator':\r\n    default:\r\n      return intermediateOptions;\r\n  }\r\n};\r\n\r\nconst getAxisTitle = (axesMapping: AxesMapping, axis: 'x' | 'y') => {\r\n  if (axis === 'x') {\r\n    return (axesMapping.category ?? axesMapping.x)\r\n      ?.map((item) => normalizeAnyColumn(item).column.name)\r\n      .join(', ');\r\n  }\r\n\r\n  return (axesMapping.value ?? axesMapping.y)\r\n    ?.map((item) => normalizeAnyColumn(item).column.name)\r\n    .join(', ');\r\n};\r\n\r\n/**\r\n * Get chart style options for the chart widget.\r\n *\r\n * @param chartType - chart type\r\n * @param axesMapping - axes mapping\r\n * @param initialStyleOptions - initial style options\r\n * @param useCustomizedStyleOptions - whether to use customized style. Charts as inline response messages use customized style. Charts for Query Composer use default style.\r\n * @returns chart style options\r\n * @internal\r\n */\r\nexport const getChartStyleOptions = (\r\n  chartType: ChartType,\r\n  axesMapping: AxesMapping,\r\n  initialStyleOptions: ChartStyleOptions,\r\n  useCustomizedStyleOptions: boolean,\r\n) => {\r\n  let chartStyleOptions;\r\n\r\n  if (useCustomizedStyleOptions && chartType in DEFAULT_SUBTYPE_FOR) {\r\n    chartStyleOptions = merge(\r\n      merge(DEFAULT_STYLE_OPTIONS, {\r\n        subtype: DEFAULT_SUBTYPE_FOR[`${chartType}`],\r\n      }),\r\n      {\r\n        legend: {\r\n          enabled: true,\r\n          position: 'right',\r\n        },\r\n        yAxis: {\r\n          title: {\r\n            enabled: true,\r\n            text: getAxisTitle(axesMapping, 'y'),\r\n          },\r\n        },\r\n        xAxis: {\r\n          title: {\r\n            enabled: true,\r\n            text: getAxisTitle(axesMapping, 'x'),\r\n          },\r\n        },\r\n      },\r\n      initialStyleOptions,\r\n    ) as ChartStyleOptions;\r\n  } else {\r\n    chartStyleOptions = merge(getDefaultStyleOptions(), initialStyleOptions);\r\n  }\r\n\r\n  return chartStyleOptions;\r\n};\r\n\r\n/**\r\n * Get chart options for the chart widget.\r\n *\r\n * @param jaql - metadata items\r\n * @param chartRecommendations - chart recommendations\r\n * @param useCustomizedStyleOptions - whether to use customized style. Charts as inline response messages use customized style. Charts for Query Composer use default style.\r\n * @internal\r\n */\r\nexport const getChartOptions = (\r\n  jaql: MetadataItem[],\r\n  chartRecommendations: ChartRecommendations,\r\n  useCustomizedStyleOptions = true,\r\n) => {\r\n  const {\r\n    chartFamily,\r\n    chartType,\r\n    axesMapping = {},\r\n    styleOptions: initialStyleOptions = {},\r\n  } = chartRecommendations;\r\n  const dataOptions = getChartDataOptions(jaql, chartFamily, axesMapping);\r\n\r\n  const chartStyleOptions = getChartStyleOptions(\r\n    chartType as ChartType,\r\n    axesMapping,\r\n    initialStyleOptions,\r\n    useCustomizedStyleOptions,\r\n  );\r\n\r\n  return {\r\n    dataOptions,\r\n    chartStyleOptions,\r\n  };\r\n};\r\n","import { AnyObject, MetadataItem } from '@sisense/sdk-data';\r\n\r\n/**\r\n * Type guard to check if a filter is a possible ranking filter with top/bottom properties\r\n */\r\nfunction isPossibleRankingFilterJaql(\r\n  filter: AnyObject | undefined,\r\n): filter is { top?: number; bottom?: number; by?: AnyObject } {\r\n  return Boolean(filter && (filter.top !== undefined || filter.bottom !== undefined));\r\n}\r\n\r\n/**\r\n * Fix problematic jaql for RankingFilter generated by NLQ\r\n *\r\n * @param items - the MetadataItem[]\r\n * @return the MetadataItem[] with fixed RankingFilter Jaql\r\n */\r\nexport const fixRankingFilterJaql = (items: MetadataItem[]): MetadataItem[] => {\r\n  // Find the first rows dimension\r\n  const rowsDimension = items.find((item) => item.panel === 'rows');\r\n\r\n  // If no rows dimension exists, return original items\r\n  if (!rowsDimension) {\r\n    return items;\r\n  }\r\n\r\n  // Transform the items array\r\n  return items.map((item) => {\r\n    // Check if this item is problematic - using type guard for filter properties\r\n    const filter = item.jaql.filter;\r\n    const isProblematic =\r\n      item.panel === 'scope' && isPossibleRankingFilterJaql(filter) && filter.by === undefined;\r\n\r\n    if (!isProblematic) {\r\n      return item;\r\n    }\r\n\r\n    // Transform the problematic item\r\n    const { type, context, formula, filter: originalFilter, ...otherJaqlProps } = item.jaql;\r\n\r\n    return {\r\n      ...item,\r\n      jaql: {\r\n        // Copy dimension properties from rows dimension\r\n        dim: rowsDimension.jaql.dim,\r\n        table: rowsDimension.jaql.table,\r\n        column: rowsDimension.jaql.column,\r\n        datatype: rowsDimension.jaql.datatype,\r\n        // Keep the filter but add the by clause\r\n        filter: {\r\n          ...originalFilter,\r\n          by: {\r\n            type,\r\n            context,\r\n            formula,\r\n          },\r\n        },\r\n        // Keep other properties like title\r\n        ...otherJaqlProps,\r\n      },\r\n    };\r\n  }) as MetadataItem[];\r\n};\r\n","import {\r\n  convertJaqlDataSourceForDto,\r\n  createFilterFromJaql,\r\n  DataSource,\r\n  Filter,\r\n  FilterJaql,\r\n  MetadataItem,\r\n} from '@sisense/sdk-data';\r\nimport { ChartType, WidgetStyleOptions, WidgetProps } from '../../index.js';\r\nimport { ChartRecommendations, ExpandedQueryModel, WidgetPropsConfig } from '../types.js';\r\nimport { isEmptyQueryModel } from '../common/utils.js';\r\nimport cloneDeep from 'lodash-es/cloneDeep.js';\r\nimport { getChartOptions } from './chart-options/get-widget-options.js';\r\nimport { simplifyMetadataItem } from '../query/index.js';\r\nimport { fixRankingFilterJaql } from '../query/fix-ranking-filter-jaql.js';\r\n\r\n/**\r\n * Gets chart recommendations or default to table.\r\n *\r\n * @param chart - chart recommendations\r\n * @returns chart recommendations or default to table\r\n */\r\nconst getChartRecommendationsOrDefault = (\r\n  chart: {} | ChartRecommendations,\r\n): ChartRecommendations => {\r\n  if ('chartType' in chart) {\r\n    return chart;\r\n  }\r\n\r\n  return {\r\n    chartType: 'table',\r\n    chartFamily: 'table',\r\n    axesMapping: {},\r\n  };\r\n};\r\n\r\n/**\r\n * Gets filters from metadata.\r\n *\r\n * @param metadata - metadata items\r\n * @return array of Filter objects\r\n */\r\nconst getFilters = (metadata: MetadataItem[]): Filter[] => {\r\n  return metadata.map((item) => createFilterFromJaql(item.jaql as FilterJaql));\r\n};\r\n\r\n/**\r\n * Splits metadata into columns and filters.\r\n *\r\n * @param metadata - metadata items\r\n */\r\nconst splitMetadata = (\r\n  metadata: MetadataItem[],\r\n): { metadataColumns: MetadataItem[]; metadataFilters: MetadataItem[] } => {\r\n  return metadata.reduce(\r\n    (acc, item) => {\r\n      // filter items may come from panel scope or from columns with inline filter conditions\r\n      if (item.panel === 'scope' || item.jaql.filter) {\r\n        acc.metadataFilters.push(cloneDeep(item));\r\n      }\r\n\r\n      if (item.panel !== 'scope') {\r\n        const columnItem = cloneDeep(item);\r\n        delete columnItem.jaql.filter;\r\n        acc.metadataColumns.push(columnItem);\r\n      }\r\n\r\n      return acc;\r\n    },\r\n    { metadataColumns: [] as MetadataItem[], metadataFilters: [] as MetadataItem[] },\r\n  );\r\n};\r\n\r\nexport const toWidgetPropsFromQuery = (\r\n  queryModel: ExpandedQueryModel,\r\n  config?: WidgetPropsConfig,\r\n): WidgetProps | undefined => {\r\n  if (isEmptyQueryModel(queryModel)) {\r\n    return;\r\n  }\r\n\r\n  try {\r\n    const { useCustomizedStyleOptions = false } = config || {};\r\n    const { jaql, chartRecommendations: chartRecommendationsOriginal, queryTitle } = queryModel;\r\n    const { metadata, datasource } = jaql;\r\n\r\n    const dataSource: DataSource = { ...datasource, type: datasource.type || 'elasticube' };\r\n    const jaqlDataSource = convertJaqlDataSourceForDto(dataSource);\r\n\r\n    // ranking filter jaql generated by NLQ may be problematic, so we need to fix it\r\n    const fixedMetadata = fixRankingFilterJaql(metadata);\r\n\r\n    const simplifiedMetadata = fixedMetadata\r\n      // simplify metadata items\r\n      .map((item) => simplifyMetadataItem(item))\r\n      // attach jaqlDataSource to each metadata item to support dashboard of multi sources\r\n      .map((item) => ({\r\n        ...item,\r\n        jaql: {\r\n          ...item.jaql,\r\n          datasource: jaqlDataSource,\r\n        },\r\n      }));\r\n\r\n    const chartRecommendations = getChartRecommendationsOrDefault(chartRecommendationsOriginal);\r\n    const chartType = chartRecommendations.chartType.toLowerCase() as ChartType;\r\n\r\n    const widgetStyleOptions: WidgetStyleOptions = {\r\n      cornerRadius: 'Small',\r\n      header: {\r\n        // remove info button and render empty toolbar instead\r\n        renderToolbar: () => null,\r\n      },\r\n    };\r\n\r\n    const { metadataColumns, metadataFilters } = splitMetadata(simplifiedMetadata);\r\n    const filters = getFilters(metadataFilters);\r\n    const { dataOptions, chartStyleOptions } = getChartOptions(\r\n      metadataColumns,\r\n      chartRecommendations,\r\n      useCustomizedStyleOptions,\r\n    );\r\n\r\n    const styleOptions = { ...chartStyleOptions, ...widgetStyleOptions };\r\n\r\n    return {\r\n      widgetType: 'chart',\r\n      id: queryTitle,\r\n      title: queryTitle,\r\n      chartType,\r\n      dataSource,\r\n      dataOptions,\r\n      filters,\r\n      styleOptions,\r\n    };\r\n  } catch (error) {\r\n    console.error(error);\r\n    // swallow error\r\n    return;\r\n  }\r\n};\r\n","import { WidgetProps } from '@/props.js';\r\nimport {\r\n  ExpandedQueryModel,\r\n  WidgetCodeParams,\r\n  WidgetPropsConfig,\r\n  isByIdWidgetCodeParams,\r\n} from '../types.js';\r\nimport { toWidgetCodeById, toWidgetCodeClientSide } from './to-widget-code.js';\r\nimport { toWidgetPropsFromQuery } from './to-widget-props.js';\r\n\r\n/**\r\n * Converts query model to widget props.\r\n *\r\n * @param queryModel - Expanded query model\r\n * @returns Widget props\r\n */\r\nexport const toWidgetProps = (\r\n  queryModel: ExpandedQueryModel,\r\n  config?: WidgetPropsConfig,\r\n): WidgetProps | undefined => {\r\n  return toWidgetPropsFromQuery(queryModel, config);\r\n};\r\n\r\n/**\r\n * Converts widget props to CSDK code.\r\n *\r\n * @param widgetCodeParams - Widget code params\r\n * @returns CSDK code string\r\n */\r\nexport const toWidgetCode = (widgetCodeParams: WidgetCodeParams): string => {\r\n  if (isByIdWidgetCodeParams(widgetCodeParams)) {\r\n    return toWidgetCodeById(widgetCodeParams);\r\n  } else {\r\n    return toWidgetCodeClientSide(widgetCodeParams);\r\n  }\r\n};\r\n"],"names":["toKebabCase","str","replace","toLowerCase","capitalizeFirstLetter","charAt","toUpperCase","slice","sanitizeDimensionId","regex","trim","validateQueryModel","model","metadata","TranslatableError","isEmptyQueryModel","queryModel","jaql","datasource","title","length","validateChartType","chartType","ALL_CHART_TYPES","includes","isPivotTableWidgetPropsLocal","props","widgetType","hasExpressionWithParentheses","column","expression","test","checkIfMeasuresExist","hasMeasuresOrValues","isNonEmptyArray","measures","values","dataOptions","value","secondary","columns","some","x","undefined","y","size","colorBy","details","geo","color","array","Array","isArray","removeEmptyLineBeforeImport","input","lines","split","i","nextLine","startsWith","splice","join","quoteUnsafeKeys","obj","isSafeKey","key","result","Object","entries","newKey","CODE_TEMPLATES","react","baseChartTmpl","chartTmpl","chartWidgetTmpl","chartWidgetPropsTmpl","widgetByIdTmpl","executeQueryByWidgetIdTmpl","executeQueryTmpl","executePivotQueryTmpl","pivotTableWidgetTmpl","pivotTableWidgetPropsTmpl","dashboardByIdTmpl","dashboardTmpl","angular","vue","populateTemplates","templateKey","uiFramework","match","populatePlaceholders","template","data","warn","generateCode","placeholderMap","concatAggTypes","AggregationTypes","map","DimensionalBaseMeasure","aggregationToJAQL","simplifyAggFormula","aggFormula","formula","context","filter","keys","contextValue","aggTypes","RegExp","agg","__spreadValues","dim","table","datatype","simplifyMetadataItemJaql","item","simplifiedItem","forEach","simplifyMetadataItemFilter","panel","by","__spreadProps","simplifyMetadataItem","measure","CODE_TEMPLATES_INDENT","NEW_LINE","VALUE_UNKNOWN","stringifyFormula","indent","s","repeat","escapeSingleQuotes","attributeName","normalizeAttributeName","stringifyDimensionOrMeasure","level","elementDef","aggregationFromJAQL","stringifyJaqlElement","jaqlElement","stringifyProps","wrapInQuotes","JaqlElement","DimensionalElement","composeCode","v","processedValue","stringifyDataOptions","stringifyDataSource","dataSource","defaultDataSourceString","dataSourceString","stringifyExtraImports","filters","importMeasureFactory","importNames","push","stringifyFilter","filterJaql","stringifyFilterList","f","stringifyFilters","widgetByIdTemplateKeys","widgetTemplateKey","pivotTableWidgetTemplateKey","stringifyChartType","toWidgetCodeById","dashboardOid","widgetOid","includeChart","codeProps","Number","getWidgetCode","widgetProps","templateKeyMap","isChartWidgetProps","hasMeasures","idString","id","widgetTypeString","titleString","chartTypeString","dataOptionsString","filtersString","componentString","extraImportsString","styleOptionsString","styleOptions","drilldownOptionsString","drilldownOptions","chart","isPivotTableWidgetProps","pivot","isCustomWidgetProps","toWidgetCodeClientSide","getChartRecommendationsOrDefault","response","chartRecommendations","chartFamily","axesMapping","getTableDataOptions","createDimensionalElementFromMetadataItem","DEFAULT_STYLE_OPTIONS","freeze","convolution","enabled","selectedConvolutionType","independentSlicesCount","lineWidth","width","markers","legend","yAxis","gridLines","xAxis","DEFAULT_SUBTYPE_FOR","line","pie","bar","getChartDataOptions","metadataItems","metadataItemByTitle","reduce","acc","intermediateOptions","nColumn","normalizeAnyColumn","m","name","type","isDatetime","dateFormat","format","mask","category","breakBy","getAxisTitle","axis","getChartStyleOptions","initialStyleOptions","useCustomizedStyleOptions","chartStyleOptions","merge","subtype","position","text","getDefaultStyleOptions","getChartOptions","isPossibleRankingFilterJaql","Boolean","top","bottom","fixRankingFilterJaql","items","rowsDimension","find","originalFilter","otherJaqlProps","getFilters","createFilterFromJaql","splitMetadata","metadataFilters","cloneDeep","columnItem","metadataColumns","toWidgetPropsFromQuery","config","chartRecommendationsOriginal","queryTitle","jaqlDataSource","convertJaqlDataSourceForDto","simplifiedMetadata","widgetStyleOptions","cornerRadius","header","renderToolbar","error","console","toWidgetProps","toWidgetCode","widgetCodeParams","isByIdWidgetCodeParams"],"mappings":"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"}