{"version":3,"file":"data-chart.cjs","sources":["../../../packages/components/src/data-chart.ts"],"sourcesContent":["import type { EChartsOption } from 'echarts'\nimport * as echarts from 'echarts'\nimport { LitElement, css, html, nothing } from 'lit'\nimport { property, query, state } from 'lit/decorators.js'\nimport { repeat } from 'lit/directives/repeat.js'\nimport { safeCustomElement } from './base/define'\n\ntype ShowTypeName =\n  | 'bar'\n  | 'line'\n  | 'pie'\n  | 'table'\n  | 'area'\n  | 'funnel'\n  | 'card'\n  | 'radar'\n  | 'scatter'\n  | 'scatter-simple'\n\ntype EChartRow = Record<string, string | number | null | undefined>\n\ntype EChartData = {\n  data: EChartRow[]\n  desc?: {\n    colDesc?: string[]\n    groupByDesc?: Array<{\n      groupByDesc?: string | null\n      groupByValues?: string[] | null\n      colDesc: string | null\n      xAxis: boolean\n    }>\n    showDesc?: {\n      chartOptions?: string | null\n      jsCodeSnippet?: string | null\n      showType?: number | null\n    }\n  }\n}\n\ntype NormalizedData = {\n  rows: EChartRow[]\n  columns: string[]\n  xKey: string\n  categories: string[]\n  measureKeys: string[]\n  seriesGroupKey: string | null\n  seriesGroupValues: string[]\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, any> {\n  return Object.prototype.toString.call(value) === '[object Object]'\n}\n\nfunction deepMerge<T>(target: T, source: unknown): T {\n  if (!isPlainObject(source) || !isPlainObject(target)) {\n    return (source as T) ?? target\n  }\n\n  const output = { ...target } as Record<string, any>\n  Object.entries(source).forEach(([key, value]) => {\n    if (Array.isArray(value)) {\n      output[key] = value.slice()\n      return\n    }\n\n    if (isPlainObject(value) && isPlainObject(output[key])) {\n      output[key] = deepMerge(output[key], value)\n      return\n    }\n\n    output[key] = value\n  })\n\n  return output as T\n}\n\nfunction unique(values: Array<string | number | null | undefined>) {\n  return Array.from(new Set(values.filter(value => value !== null && value !== undefined && value !== '').map(value => String(value))))\n}\n\nexport function mergeChartOptionsPatch<T>(baseOptions: T, patchText: string) {\n  const normalizedPatchText = patchText?.trim()\n\n  if (!normalizedPatchText) {\n    return baseOptions\n  }\n\n  if (!normalizedPatchText.startsWith('{')) {\n    console.error(new Error('qxs-data-chart only accepts JSON object patches in jsCodeSnippet'))\n    return baseOptions\n  }\n\n  try {\n    return deepMerge(baseOptions, JSON.parse(normalizedPatchText))\n  }\n  catch (error) {\n    console.error(error)\n    return baseOptions\n  }\n}\n\nfunction sumValues(rows: EChartRow[], key: string) {\n  return rows.reduce((sum, row) => sum + Number(row[key] ?? 0), 0)\n}\n\n@safeCustomElement('qxs-data-chart')\nexport class QxsDataChart extends LitElement {\n  static styles = css`\n    :host {\n      display: block;\n      width: 100%;\n      max-width: 100%;\n      min-width: 0;\n      min-height: 240px;\n      box-sizing: border-box;\n      color: #0f172a;\n      font-size: 14px;\n    }\n\n    .wrap {\n      display: grid;\n      gap: 12px;\n      width: 100%;\n      min-width: 0;\n      height: 100%;\n    }\n\n    .title {\n      font-size: 16px;\n      font-weight: 700;\n      color: #0f172a;\n    }\n\n    .chart-host,\n    .table-wrap,\n    .card-wrap,\n    .empty {\n      width: 100%;\n      max-width: 100%;\n      min-width: 0;\n      min-height: 240px;\n      box-sizing: border-box;\n      background: #fff;\n      border: 1px solid #e2e8f0;\n      border-radius: 16px;\n    }\n\n    .chart-host {\n      width: 100%;\n      height: 320px;\n    }\n\n    .empty {\n      display: grid;\n      place-items: center;\n      color: #64748b;\n    }\n\n    .table-wrap {\n      overflow-x: auto;\n      overflow-y: auto;\n    }\n\n    table {\n      width: 100%;\n      min-width: 100%;\n      border-collapse: collapse;\n    }\n\n    th,\n    td {\n      padding: 10px 12px;\n      text-align: left;\n      border-bottom: 1px solid #e2e8f0;\n    }\n\n    th {\n      position: sticky;\n      top: 0;\n      background: #f8fafc;\n      color: #334155;\n      font-weight: 700;\n    }\n\n    .card-wrap {\n      display: grid;\n      grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));\n      gap: 12px;\n      padding: 12px;\n    }\n\n    .card-item {\n      display: grid;\n      gap: 8px;\n      padding: 14px;\n      background: linear-gradient(135deg, #eff6ff, #ffffff);\n      border: 1px solid #dbeafe;\n      border-radius: 14px;\n    }\n\n    .card-title {\n      font-size: 14px;\n      font-weight: 700;\n      color: #1d4ed8;\n    }\n\n    .card-metric {\n      font-size: 13px;\n      line-height: 1.6;\n      color: #475569;\n    }\n  `\n\n  static geoJsonCache = new Map<string, any>()\n\n  @property({ type: String, attribute: 'show-type-name' }) showTypeName: ShowTypeName = 'table'\n  @property({ type: String, attribute: 'sub-show-type' }) subShowType = ''\n  @property({ type: String, attribute: 'model-name' }) modelName = ''\n  @property({ attribute: false }) data: EChartData = {\n    data: [],\n    desc: {\n      colDesc: [],\n      groupByDesc: [],\n      showDesc: {\n        chartOptions: '{}',\n        jsCodeSnippet: '',\n        showType: null,\n      },\n    },\n  }\n  @property({ attribute: false }) chartOptions: EChartsOption = {}\n  @property({ type: String, attribute: 'js-code-snippet' }) jsCodeSnippet = ''\n  @property({ type: Boolean, attribute: 'lazy-load' }) lazyLoad = true\n  @property({ type: String, attribute: 'geo-json-url' }) geoJsonUrl = '/geo-data/china.json'\n\n  @state() private _renderError = ''\n\n  @query('.chart-host') private _chartHost?: HTMLDivElement\n\n  private _chart: echarts.ECharts | null = null\n  private _resizeObserver: ResizeObserver | null = null\n  private _intersectionObserver: IntersectionObserver | null = null\n  private _renderToken = 0\n  private _lazyReady = false\n\n  get myChart() {\n    return this._chart\n  }\n\n  connectedCallback() {\n    super.connectedCallback()\n  }\n\n  firstUpdated() {\n    if (typeof ResizeObserver !== 'undefined') {\n      this._resizeObserver = new ResizeObserver(() => {\n        this._chart?.resize()\n      })\n      this._resizeObserver.observe(this)\n    }\n\n    this._syncLazyObserver()\n  }\n\n  disconnectedCallback() {\n    super.disconnectedCallback()\n    this._resizeObserver?.disconnect()\n    this._intersectionObserver?.disconnect()\n    this._chart?.dispose()\n    this._chart = null\n  }\n\n  updated(changed: Map<string, unknown>) {\n    if (changed.has('lazyLoad')) {\n      this._syncLazyObserver()\n    }\n\n    if (\n      changed.has('showTypeName')\n      || changed.has('subShowType')\n      || changed.has('modelName')\n      || changed.has('data')\n      || changed.has('chartOptions')\n      || changed.has('jsCodeSnippet')\n      || changed.has('geoJsonUrl')\n      || changed.has('lazyLoad')\n    ) {\n      this._syncVisualization()\n    }\n  }\n\n  private _syncLazyObserver() {\n    this._intersectionObserver?.disconnect()\n    this._intersectionObserver = null\n\n    if (!this.lazyLoad) {\n      this._lazyReady = true\n      return\n    }\n\n    if (typeof IntersectionObserver === 'undefined') {\n      this._lazyReady = true\n      return\n    }\n\n    this._lazyReady = false\n    this._intersectionObserver = new IntersectionObserver((entries) => {\n      if (!entries.some(entry => entry.isIntersecting)) {\n        return\n      }\n      this._lazyReady = true\n      this._intersectionObserver?.disconnect()\n      this._intersectionObserver = null\n      this._syncVisualization()\n    })\n    this._intersectionObserver.observe(this)\n  }\n\n  exportExal() {\n    const normalized = this._normalizeData()\n    if (!normalized.rows.length) {\n      return\n    }\n\n    const headers = normalized.columns\n    const lines = [\n      headers.join(','),\n      ...normalized.rows.map(row => headers.map((header) => {\n        const value = row[header] ?? ''\n        const text = String(value).replaceAll('\"', '\"\"')\n        return `\"${text}\"`\n      }).join(',')),\n    ]\n\n    const blob = new Blob([`\\uFEFF${lines.join('\\n')}`], { type: 'text/csv;charset=utf-8;' })\n    const href = URL.createObjectURL(blob)\n    const anchor = document.createElement('a')\n    anchor.href = href\n    anchor.download = `${this.modelName || 'data-chart'}.csv`\n    anchor.style.display = 'none'\n    document.body.appendChild(anchor)\n    anchor.click()\n    document.body.removeChild(anchor)\n    URL.revokeObjectURL(href)\n  }\n\n  getMyChart() {\n    return this._chart\n  }\n\n  private _normalizeData(): NormalizedData {\n    const rows = Array.isArray(this.data?.data) ? this.data.data : []\n    const groupByDesc = this.data?.desc?.groupByDesc ?? []\n    const xGroup = groupByDesc.find(item => item.xAxis && item.colDesc) ?? groupByDesc.find(item => item.colDesc) ?? null\n    const columns = rows.reduce<string[]>((result, row) => {\n      Object.keys(row ?? {}).forEach((key) => {\n        if (!result.includes(key)) {\n          result.push(key)\n        }\n      })\n      return result\n    }, [])\n    const xKey = xGroup?.colDesc || columns[0] || ''\n    const measureKeys = (this.data?.desc?.colDesc?.length ? this.data.desc.colDesc : columns.filter(key => key !== xKey)).filter(Boolean)\n    const categories = unique(rows.map(row => row[xKey]))\n    const seriesGroup = groupByDesc.find(item => !item.xAxis && item.colDesc && item.colDesc !== xKey) ?? null\n    const seriesGroupKey = seriesGroup?.colDesc ?? null\n    const seriesGroupValues = seriesGroupKey ? unique(rows.map(row => row[seriesGroupKey])) : []\n\n    return {\n      rows,\n      columns,\n      xKey,\n      categories,\n      measureKeys,\n      seriesGroupKey,\n      seriesGroupValues,\n    }\n  }\n\n  private _buildCartesianSeries(normalized: NormalizedData, type: 'bar' | 'line') {\n    const { rows, categories, measureKeys, seriesGroupKey, seriesGroupValues, xKey } = normalized\n    if (!seriesGroupKey || !seriesGroupValues.length) {\n      return measureKeys.map((measure) => {\n        const data = categories.map(category => sumValues(rows.filter(row => String(row[xKey] ?? '') === category), measure))\n        return {\n          name: measure,\n          type,\n          data,\n          ...(type === 'line' && this.subShowType === 'area-basic' ? { areaStyle: {} } : {}),\n        }\n      })\n    }\n\n    return seriesGroupValues.flatMap((groupValue) => measureKeys.map((measure) => ({\n      name: `${groupValue}-${measure}`,\n      type,\n      data: categories.map((category) => {\n        const scopedRows = rows.filter(row => String(row[xKey] ?? '') === category && String(row[seriesGroupKey] ?? '') === groupValue)\n        return sumValues(scopedRows, measure)\n      }),\n      ...(type === 'line' && this.subShowType === 'area-basic' ? { areaStyle: {} } : {}),\n    })))\n  }\n\n  private _buildChartOptions(normalized: NormalizedData) {\n    const { rows, categories, xKey, measureKeys } = normalized\n    const firstMeasure = measureKeys[0]\n\n    if (!firstMeasure) {\n      return null\n    }\n\n    switch (this.showTypeName) {\n      case 'bar': {\n        const yCategory = this.subShowType === 'bar-y-category'\n        return {\n          title: { text: this.modelName },\n          tooltip: { trigger: 'axis' },\n          legend: { top: 8 },\n          grid: { left: 16, right: 16, bottom: 16, top: 48, containLabel: true },\n          xAxis: yCategory\n            ? { type: 'value' }\n            : { type: 'category', data: categories, name: xKey },\n          yAxis: yCategory\n            ? { type: 'category', data: categories, name: xKey }\n            : { type: 'value' },\n          series: this._buildCartesianSeries(normalized, 'bar'),\n        } satisfies EChartsOption\n      }\n      case 'line': {\n        return {\n          title: { text: this.modelName },\n          tooltip: { trigger: 'axis' },\n          legend: { top: 8 },\n          grid: { left: 16, right: 16, bottom: 16, top: 48, containLabel: true },\n          xAxis: { type: 'category', data: categories, name: xKey },\n          yAxis: { type: 'value' },\n          series: this._buildCartesianSeries(normalized, 'line'),\n        } satisfies EChartsOption\n      }\n      case 'pie':\n      case 'funnel': {\n        const seriesData = categories.map(category => ({\n          name: category,\n          value: sumValues(rows.filter(row => String(row[xKey] ?? '') === category), firstMeasure),\n        }))\n        return {\n          title: { text: this.modelName },\n          tooltip: { trigger: 'item' },\n          legend: { top: 8 },\n          series: [{\n            name: firstMeasure,\n            type: this.showTypeName,\n            radius: this.showTypeName === 'pie' && this.subShowType === 'pie-borderRadius' ? ['45%', '70%'] : '70%',\n            data: seriesData,\n          }],\n        } satisfies EChartsOption\n      }\n      case 'radar': {\n        const values = categories.map(category => sumValues(rows.filter(row => String(row[xKey] ?? '') === category), firstMeasure))\n        const max = Math.max(...values, 0) || 100\n        return {\n          title: { text: this.modelName },\n          tooltip: {},\n          radar: {\n            indicator: categories.map(category => ({ name: category, max })),\n          },\n          series: [{\n            type: 'radar',\n            data: [{ value: values, name: firstMeasure }],\n          }],\n        } satisfies EChartsOption\n      }\n      case 'scatter':\n      case 'scatter-simple': {\n        const xMeasure = measureKeys[0]\n        const yMeasure = measureKeys[1] ?? measureKeys[0]\n        return {\n          title: { text: this.modelName },\n          tooltip: {\n            trigger: 'item',\n          },\n          xAxis: { type: 'value', name: xMeasure },\n          yAxis: { type: 'value', name: yMeasure },\n          series: [{\n            type: 'scatter',\n            data: rows.map((row, index) => [\n              Number(row[xMeasure] ?? index),\n              Number(row[yMeasure] ?? 0),\n              row[xKey] ?? `${index + 1}`,\n            ]),\n          }],\n        } satisfies EChartsOption\n      }\n      default:\n        return null\n    }\n  }\n\n  private async _buildAreaOptions(normalized: NormalizedData) {\n    const firstMeasure = normalized.measureKeys[0]\n    if (!firstMeasure) {\n      return null\n    }\n\n    const mapSourceUrl = this.geoJsonUrl || '/geo-data/china.json'\n    const geoMeta = await this._ensureGeoJson('china', mapSourceUrl)\n    if (!geoMeta) {\n      return null\n    }\n\n    const locationKey = normalized.xKey\n    const seriesData = normalized.categories.map(category => ({\n      name: category,\n      value: sumValues(\n        normalized.rows.filter(row => String(row[locationKey] ?? '') === category),\n        firstMeasure,\n      ),\n    }))\n\n    return {\n      title: { text: this.modelName },\n      tooltip: { trigger: 'item' },\n      visualMap: {\n        min: 0,\n        max: Math.max(...seriesData.map(item => Number(item.value)), 0),\n        text: ['高', '低'],\n        realtime: false,\n        calculable: true,\n        inRange: {\n          color: ['#E8F4FD', '#B8D4F7', '#7BA4F0', '#4A7BE8', '#3562e1'],\n        },\n      },\n      series: [{\n        type: 'map',\n        map: geoMeta.registrationName,\n        roam: true,\n        data: seriesData,\n      }],\n    } satisfies EChartsOption\n  }\n\n  private async _ensureGeoJson(mapName: string, url: string) {\n    const cacheKey = `${mapName}::${url}`\n    const registrationName = cacheKey\n\n    if (echarts.getMap(registrationName)) {\n      return {\n        registrationName,\n        geoJson: QxsDataChart.geoJsonCache.get(cacheKey) ?? {},\n      }\n    }\n\n    if (QxsDataChart.geoJsonCache.has(cacheKey)) {\n      const cached = QxsDataChart.geoJsonCache.get(cacheKey)\n      echarts.registerMap(registrationName, cached)\n      return {\n        registrationName,\n        geoJson: cached,\n      }\n    }\n\n    if (typeof fetch === 'undefined') {\n      this._renderError = '当前环境不支持地图数据加载'\n      return null\n    }\n\n    try {\n      const response = await fetch(url)\n      if (!response.ok) {\n        throw new Error(`Failed to fetch ${url}`)\n      }\n      const geoJson = await response.json()\n      echarts.registerMap(registrationName, geoJson)\n      QxsDataChart.geoJsonCache.set(cacheKey, geoJson)\n      return {\n        registrationName,\n        geoJson,\n      }\n    }\n    catch (error) {\n      this._renderError = '地图数据加载失败'\n      console.error(error)\n      return null\n    }\n  }\n\n  private async _syncVisualization() {\n    this._renderError = ''\n    if (this.lazyLoad && !this._lazyReady) {\n      return\n    }\n    const normalized = this._normalizeData()\n\n    if (!normalized.rows.length) {\n      this._chart?.dispose()\n      this._chart = null\n      return\n    }\n\n    if (this.showTypeName === 'table' || this.showTypeName === 'card') {\n      this._chart?.dispose()\n      this._chart = null\n      return\n    }\n\n    await this.updateComplete\n\n    if (!this._chartHost) {\n      return\n    }\n\n    if (!this._chart) {\n      this._chart = echarts.init(this._chartHost)\n    }\n\n    const token = ++this._renderToken\n\n    let baseOptions: EChartsOption | null = null\n    if (this.showTypeName === 'area') {\n      baseOptions = await this._buildAreaOptions(normalized)\n    }\n    else {\n      baseOptions = this._buildChartOptions(normalized)\n    }\n\n    if (token !== this._renderToken || !baseOptions || !this._chart) {\n      return\n    }\n\n    const finalOptions = mergeChartOptionsPatch(deepMerge(baseOptions, this.chartOptions), this.jsCodeSnippet)\n\n    this._chart.setOption(finalOptions, true)\n    this._chart.resize()\n  }\n\n  private _renderTable(normalized: NormalizedData) {\n    return html`\n      <div class=\"table-wrap\" part=\"table\">\n        <table>\n          <thead>\n            <tr>\n              ${normalized.columns.map(column => html`<th>${column}</th>`)}\n            </tr>\n          </thead>\n          <tbody>\n            ${repeat(normalized.rows, (_, index) => index, (row) => html`\n              <tr>\n                ${normalized.columns.map(column => html`<td>${row[column] ?? '-'}</td>`)}\n              </tr>\n            `)}\n          </tbody>\n        </table>\n      </div>\n    `\n  }\n\n  private _renderCards(normalized: NormalizedData) {\n    return html`\n      <div class=\"card-wrap\" part=\"card-list\">\n        ${repeat(normalized.rows, (_, index) => index, (row) => html`\n          <article class=\"card-item\" part=\"card-item\">\n            <div class=\"card-title\">${normalized.xKey ? row[normalized.xKey] ?? this.modelName : this.modelName}</div>\n            ${normalized.measureKeys.map((key) => html`\n              <div class=\"card-metric\">${key}: <strong>${row[key] ?? '-'}</strong></div>\n            `)}\n          </article>\n        `)}\n      </div>\n    `\n  }\n\n  render() {\n    const normalized = this._normalizeData()\n\n    return html`\n      <div class=\"wrap\">\n        ${this.modelName ? html`<div class=\"title\">${this.modelName}</div>` : nothing}\n\n        ${!normalized.rows.length\n          ? html`<div class=\"empty\">暂无数据</div>`\n          : this.showTypeName === 'table'\n            ? this._renderTable(normalized)\n            : this.showTypeName === 'card'\n              ? this._renderCards(normalized)\n              : html`<div class=\"chart-host\" part=\"chart\"></div>`}\n\n        ${this._renderError ? html`<div class=\"empty\">${this._renderError}</div>` : nothing}\n      </div>\n    `\n  }\n}\n\ndeclare global {\n  interface HTMLElementTagNameMap {\n    'qxs-data-chart': QxsDataChart\n  }\n}\n"],"names":["isPlainObject","value","deepMerge","target","source","output","key","unique","values","mergeChartOptionsPatch","baseOptions","patchText","normalizedPatchText","sumValues","rows","sum","row","QxsDataChart","LitElement","changed","entries","entry","normalized","headers","lines","header","blob","href","anchor","groupByDesc","xGroup","item","columns","result","xKey","measureKeys","categories","seriesGroupKey","seriesGroupValues","type","measure","data","category","groupValue","scopedRows","firstMeasure","yCategory","seriesData","max","xMeasure","yMeasure","index","mapSourceUrl","geoMeta","locationKey","mapName","url","cacheKey","registrationName","echarts","cached","response","geoJson","token","finalOptions","html","column","repeat","_","nothing","css","__decorateClass","property","state","query","safeCustomElement"],"mappings":"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"}