{"version":3,"file":"Component-CEhBJFCA.mjs","sources":["../src/components/ConversationMessage/extensions/NodeViews/BarChart/utils.ts","../src/components/ConversationMessage/extensions/NodeViews/BarChart/hooks/useBarChartNodeView.ts","../src/components/ConversationMessage/extensions/NodeViews/BarChart/Component.tsx"],"sourcesContent":["import { isEmpty } from 'es-toolkit/compat';\nimport type { ApiBarChartData, BarChartData, BarChartSettings, Field } from '@/types';\nimport { Utils } from '@/utils';\n\nexport function formatReportPerfData(params: {\n\tdata: ApiBarChartData;\n\tsettings: BarChartSettings;\n}): BarChartData {\n\tconst REGEX_DIMENSION = /D[0-9]+_/;\n\n\tconst getAggregation = (field: Field) => {\n\t\treturn field.aliasAggregation || field.aggregation || '';\n\t};\n\n\tconst state: {\n\t\tsummary: number;\n\t\tsummaryNegative: number;\n\t\tmaxValues: Record<string, { metricKey: string; value: number }>;\n\t\tobjMaxValues: Record<string, Record<string, number>>;\n\t\tobjMinValues: Record<string, Record<string, number>>;\n\t} = {\n\t\tsummary: 0,\n\t\tsummaryNegative: 0,\n\t\tmaxValues: {},\n\t\tobjMaxValues: {},\n\t\tobjMinValues: {},\n\t};\n\n\tconst { data, settings } = params;\n\tconst { style, dimension: dimensions, breakdownDimension } = settings;\n\n\tconst metrics = settings.metric.map((metric, idx) => ({\n\t\t...metric,\n\t\tkey: `${metric.name}_${idx}`,\n\t}));\n\n\tconst { axes, showOtherBars = false, showOtherSeries = false } = style;\n\tconst axesMode = axes.mode || 'double';\n\n\tconst hasBreakdownDimension = breakdownDimension.length;\n\n\tconst MAX_SERIES_DEFAULT = 6;\n\tconst MAX_BAR = 512;\n\n\tlet arrYAxis: {\n\t\tisActive: boolean;\n\t\tkey: string;\n\t\tlabel: string;\n\t\tname: string;\n\t\tyAxisId: string;\n\t}[] = [];\n\n\tlet arrData: {\n\t\tid: string;\n\t\tname: string;\n\t\toriginalId: string;\n\t\t[key: string]: string | number;\n\t}[] = [];\n\n\tconst arrTotalValue: Record<string, number> = {};\n\tconst arrDimensionId: string[] = [];\n\tconst arrDimensions: Record<string, string | number>[] = [];\n\n\tlet number = 0;\n\tlet counter = 0;\n\tlet arrMaxSeriesId: string[] = [];\n\tlet maxBars = style.maxBars;\n\n\tconst maxSeries = style.maxSeries || MAX_SERIES_DEFAULT;\n\n\tconst { rows } = data;\n\n\tif (rows.length <= 0) {\n\t\treturn { arrYAxis: [], data: [] };\n\t}\n\n\t// Check dimension moved metric\n\tconst arrMetricAggregations: string[] = [];\n\n\tfor (const metric of metrics) {\n\t\tif (metric.name) {\n\t\t\tarrMetricAggregations.push(metric.name);\n\t\t}\n\t}\n\n\tconst maxDimensionInRow =\n\t\trows.length > 0 ? Math.max(...data.rows.map((row) => +row.dimension.length)) : 0;\n\n\tlet totalBar = 0;\n\tlet maxBarSeries = 0;\n\tlet maxBarsNumber = 0;\n\n\tfor (let i = 0, length = data.rows.length; i < length; i++) {\n\t\tif (hasBreakdownDimension && metrics[0].name) {\n\t\t\tlet numberBarSeries = data.rows[i].dimension.length;\n\n\t\t\tnumberBarSeries = numberBarSeries < MAX_SERIES_DEFAULT ? numberBarSeries : MAX_SERIES_DEFAULT;\n\t\t\tif (typeof maxSeries === 'number' && maxSeries > 0) {\n\t\t\t\tnumberBarSeries = +maxSeries < numberBarSeries ? maxSeries : numberBarSeries;\n\t\t\t}\n\n\t\t\ttotalBar += numberBarSeries || 0;\n\n\t\t\tmaxBarSeries = +numberBarSeries;\n\t\t\tif (totalBar > MAX_BAR) {\n\t\t\t\tmaxBarsNumber = i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t} else if (typeof data.rows[i].aggregations !== 'undefined') {\n\t\t\tlet numberBarSeries = data.rows[i].aggregations.length;\n\n\t\t\tnumberBarSeries = numberBarSeries < MAX_SERIES_DEFAULT ? numberBarSeries : MAX_SERIES_DEFAULT;\n\t\t\tif (typeof maxSeries === 'number' && maxSeries > 0) {\n\t\t\t\tnumberBarSeries = +maxSeries < numberBarSeries ? maxSeries : numberBarSeries;\n\t\t\t}\n\n\t\t\ttotalBar += numberBarSeries || 0;\n\n\t\t\tmaxBarSeries = +numberBarSeries;\n\t\t\tif (totalBar > MAX_BAR) {\n\t\t\t\tmaxBarsNumber = i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (maxBarsNumber && maxBars) {\n\t\tmaxBars = maxBarsNumber < +maxBars || +maxBars < 0 ? maxBarsNumber : maxBars;\n\t} else if (maxBarsNumber) {\n\t\tmaxBars = maxBarsNumber;\n\t}\n\n\trows.forEach((row, index) => {\n\t\tlet counterSeries = 0;\n\t\tlet summary = 0;\n\t\tlet summaryNegative = 0;\n\t\tconst isPush = typeof maxBars === 'number' && maxBars > 0 ? counter < maxBars : true;\n\n\t\tif (typeof row.segment !== 'undefined' && row.segment && metrics.length > 0) {\n\t\t\tlet item: {\n\t\t\t\tid: string;\n\t\t\t\tname: string;\n\t\t\t\toriginalId: string;\n\t\t\t\t[key: string]: string | number;\n\t\t\t} = {\n\t\t\t\tid: row.segment.id ? row.segment.id : `null_${index}`,\n\t\t\t\toriginalId: row.segment.id || '',\n\t\t\t\tname:\n\t\t\t\t\trow.segment.name !== undefined && row.segment.name !== null ? row.segment.name : 'null',\n\t\t\t};\n\n\t\t\tlet otherSeriesValue = 0;\n\n\t\t\tif (dimensions.length > 0) {\n\t\t\t\titem.name = Utils.helpers\n\t\t\t\t\t.formatValue({\n\t\t\t\t\t\tvalue: item.name,\n\t\t\t\t\t\tfield: dimensions[0],\n\t\t\t\t\t})\n\t\t\t\t\t.toString();\n\t\t\t}\n\n\t\t\tif (dimensions.length > 0 && dimensions[0].dataType && item.name) {\n\t\t\t\tswitch (dimensions[0].dataType) {\n\t\t\t\t\tcase 'IMAGE': {\n\t\t\t\t\t\tconst arrValues = Utils.helpers.formattedHyperlink(item.name.toString(), '—');\n\n\t\t\t\t\t\tif (arrValues.length > 0) {\n\t\t\t\t\t\t\titem.id = arrValues[0];\n\t\t\t\t\t\t\titem.name = arrValues[0];\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase 'HYPERLINK': {\n\t\t\t\t\t\tconst arrValues = Utils.helpers.formattedHyperlink(item.name.toString(), '—');\n\n\t\t\t\t\t\tif (arrValues.length > 0) {\n\t\t\t\t\t\t\titem.id = arrValues[1];\n\t\t\t\t\t\t\titem.name = arrValues[1];\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (hasBreakdownDimension && metrics[0].name) {\n\t\t\t\tif (\n\t\t\t\t\trow.dimension &&\n\t\t\t\t\ttypeof row.dimension !== 'undefined' &&\n\t\t\t\t\ttypeof row.dimension === 'object'\n\t\t\t\t) {\n\t\t\t\t\tlet arrValues: (number | string)[] = [];\n\n\t\t\t\t\tif (row.aggregations?.length > 0) {\n\t\t\t\t\t\tconst metricAggregation = metrics[0].aliasAggregation || metrics[0].aggregation || '';\n\n\t\t\t\t\t\tconst aggregationItem = row.aggregations.find((aggregation) => {\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\taggregation.name === metrics[0].name &&\n\t\t\t\t\t\t\t\taggregation.aggregationType === metricAggregation\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tif (aggregationItem?.value) {\n\t\t\t\t\t\t\tarrValues = [...aggregationItem.value];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t//      else if (typeof row['metrics'] !== 'undefined' && row['metrics'][metrics[0].name]) {\n\t\t\t\t\t// \tarrValues = row['metrics'][metrics[0].name] || [];\n\t\t\t\t\t// }\n\n\t\t\t\t\t// Handle convert value with data type\n\t\t\t\t\tif (arrValues.length > 0) {\n\t\t\t\t\t\tarrValues = arrValues.map((value) => {\n\t\t\t\t\t\t\treturn Utils.helpers.convertValueFromDataType({\n\t\t\t\t\t\t\t\tvalue: value,\n\t\t\t\t\t\t\t\tfield: metrics[0],\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\trow.dimension.forEach((dimension, index) => {\n\t\t\t\t\t\tlet isPushSeries = true;\n\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\ttypeof maxSeries === 'number' &&\n\t\t\t\t\t\t\tmaxDimensionInRow !== maxSeries &&\n\t\t\t\t\t\t\t((maxSeries === 1 && counterSeries >= 1) ||\n\t\t\t\t\t\t\t\t(maxSeries > 1 && counterSeries >= maxSeries - +showOtherSeries) ||\n\t\t\t\t\t\t\t\t(!showOtherSeries && counterSeries >= maxSeries))\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tisPushSeries = false;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlet label = dimension.name.toString() || '';\n\n\t\t\t\t\t\tif (dimensions.length > 0 && dimensions[0].dataType && label) {\n\t\t\t\t\t\t\tswitch (dimensions[0].dataType) {\n\t\t\t\t\t\t\t\tcase 'IMAGE': {\n\t\t\t\t\t\t\t\t\tconst arrValues = Utils.helpers.formattedHyperlink(label, '—');\n\n\t\t\t\t\t\t\t\t\tif (arrValues.length > 0) {\n\t\t\t\t\t\t\t\t\t\tlabel = arrValues[0];\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tcase 'HYPERLINK': {\n\t\t\t\t\t\t\t\t\tconst arrValues = Utils.helpers.formattedHyperlink(label, '—');\n\n\t\t\t\t\t\t\t\t\tif (arrValues.length > 0) {\n\t\t\t\t\t\t\t\t\t\tlabel = arrValues[1];\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlabel = Utils.helpers\n\t\t\t\t\t\t\t.convertValueFromDataType({\n\t\t\t\t\t\t\t\tvalue: label,\n\t\t\t\t\t\t\t\tfield: breakdownDimension[0],\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t.toString();\n\n\t\t\t\t\t\tlabel = Utils.helpers\n\t\t\t\t\t\t\t.formatValue({\n\t\t\t\t\t\t\t\tvalue: label,\n\t\t\t\t\t\t\t\tfield: breakdownDimension[0],\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t.toString();\n\n\t\t\t\t\t\tconst dimensionId =\n\t\t\t\t\t\t\tdimension.id.toString() ||\n\t\t\t\t\t\t\t(dimension.name.toString() &&\n\t\t\t\t\t\t\t\tUtils.helpers.changeSpecialCharacterToSnake(dimension.name.toString())) ||\n\t\t\t\t\t\t\t'';\n\n\t\t\t\t\t\tif (dimensionId) {\n\t\t\t\t\t\t\t// Save dimension info\n\t\t\t\t\t\t\tif (arrDimensionId.indexOf(dimensionId) < 0 && arrDimensionId.length < MAX_BAR) {\n\t\t\t\t\t\t\t\tarrDimensions.push(dimension);\n\t\t\t\t\t\t\t\tif (isPushSeries) {\n\t\t\t\t\t\t\t\t\tarrDimensionId.push(dimensionId);\n\n\t\t\t\t\t\t\t\t\tarrYAxis.push({\n\t\t\t\t\t\t\t\t\t\tyAxisId: '',\n\t\t\t\t\t\t\t\t\t\tname: `D${dimensionId}`,\n\t\t\t\t\t\t\t\t\t\tlabel,\n\t\t\t\t\t\t\t\t\t\tkey: metrics[0].key,\n\t\t\t\t\t\t\t\t\t\tisActive: true,\n\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t\tarrMaxSeriesId = [...arrMaxSeriesId, `D${dimensionId}`];\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t++counterSeries;\n\n\t\t\t\t\t\t\tconst value = arrValues[index] ? +arrValues[index] : 0;\n\n\t\t\t\t\t\t\tif (isPushSeries) {\n\t\t\t\t\t\t\t\titem[`D${dimensionId}`] = value;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// if (showOtherSeries && maxSeries > 1 && arrMaxSeriesId.some(id => id !== 'D' + dimensionId)) {\n\t\t\t\t\t\t\t//     otherSeriesValue += value;\n\t\t\t\t\t\t\t// }\n\t\t\t\t\t\t\tif (!isPushSeries) {\n\t\t\t\t\t\t\t\totherSeriesValue += value;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (isPushSeries || (!isPushSeries && showOtherSeries)) {\n\t\t\t\t\t\t\t\tif (value < 0) {\n\t\t\t\t\t\t\t\t\tsummaryNegative += value;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tsummary += value;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\tif (showOtherSeries) {\n\t\t\t\t\t\tif (otherSeriesValue) {\n\t\t\t\t\t\t\titem['D-1'] = otherSeriesValue;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst { 'D-1': _, ...itemRest } = item;\n\t\t\t\t\t\titem = itemRest;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (typeof row.aggregations !== 'undefined') {\n\t\t\t\tfor (const metric of metrics) {\n\t\t\t\t\tif (metric.name && metric.key) {\n\t\t\t\t\t\tlet value = 0;\n\n\t\t\t\t\t\tif (arrMetricAggregations.indexOf(metric.name) >= 0) {\n\t\t\t\t\t\t\t// Metric is aggregation metric\n\t\t\t\t\t\t\tconst metricName = metric.name;\n\t\t\t\t\t\t\tconst metricAggregation = getAggregation(metric);\n\n\t\t\t\t\t\t\tif (metricName && row.aggregations.length > 0) {\n\t\t\t\t\t\t\t\tconst aggregationItem = row.aggregations.find((aggregation) => {\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\taggregation.name === metricName &&\n\t\t\t\t\t\t\t\t\t\tmetricAggregation === aggregation.aggregationType\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\tif (aggregationItem?.value) {\n\t\t\t\t\t\t\t\t\tvalue = aggregationItem.value[0] ? aggregationItem.value[0] : 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvalue = +Utils.helpers.convertValueFromDataType({\n\t\t\t\t\t\t\tvalue,\n\t\t\t\t\t\t\tfield: metric,\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\titem[metric.key] = value;\n\n\t\t\t\t\t\t// Total value by metric\n\t\t\t\t\t\tconst totalValue = arrTotalValue[metric.key] ? arrTotalValue[metric.key] : 0;\n\n\t\t\t\t\t\tarrTotalValue[metric.key] = totalValue + value;\n\n\t\t\t\t\t\tif (number < 1) {\n\t\t\t\t\t\t\tarrYAxis.push({\n\t\t\t\t\t\t\t\tyAxisId: '',\n\t\t\t\t\t\t\t\tkey: metric.key,\n\t\t\t\t\t\t\t\tname: metric.name,\n\t\t\t\t\t\t\t\tlabel: metric.aliasLabel || metric.label,\n\t\t\t\t\t\t\t\tisActive: true,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor (const key of Object.keys(item)) {\n\t\t\t\tif (key.startsWith('D')) {\n\t\t\t\t\tif (+item[key] < 0) {\n\t\t\t\t\t\titem[`${key}PERCENT`] =\n\t\t\t\t\t\t\tsummaryNegative === 0 ? 0 : (+item[key] / summaryNegative) * -100;\n\t\t\t\t\t} else {\n\t\t\t\t\t\titem[`${key}PERCENT`] = summary === 0 ? 0 : (+item[key] / summary) * 100;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tarrData.push(item);\n\t\t\tif (isPush || showOtherBars) {\n\t\t\t\t// create summary for stack\n\t\t\t\tstate.summary = Math.max(summary, state.summary);\n\t\t\t\tstate.summaryNegative = Math.min(summaryNegative, state.summaryNegative);\n\t\t\t\tcounter++;\n\t\t\t\tnumber++;\n\t\t\t}\n\t\t}\n\t});\n\n\t// -------------Show other\n\n\tif (maxBars) {\n\t\tif (showOtherBars && +maxBars > 1 && +maxBars < arrData.length) {\n\t\t\tconst otherBar: {\n\t\t\t\tid: string;\n\t\t\t\tname: string;\n\t\t\t\toriginalId: string;\n\t\t\t\t[key: string]: string | number;\n\t\t\t} = {\n\t\t\t\tid: '',\n\t\t\t\tname: '',\n\t\t\t\toriginalId: '',\n\t\t\t};\n\n\t\t\tconst objOtherBar: {\n\t\t\t\tid: string;\n\t\t\t\tname: string;\n\t\t\t\toriginalId: string;\n\t\t\t\t[key: string]: string | number;\n\t\t\t} = {\n\t\t\t\tid: '',\n\t\t\t\tname: '',\n\t\t\t\toriginalId: '',\n\t\t\t};\n\n\t\t\tlet summary = 0;\n\t\t\tlet summaryNegative = 0;\n\n\t\t\tarrData = arrData.reduce<\n\t\t\t\t{\n\t\t\t\t\tid: string;\n\t\t\t\t\tname: string;\n\t\t\t\t\toriginalId: string;\n\t\t\t\t\t[key: string]: string | number;\n\t\t\t\t}[]\n\t\t\t>((acc, cur, index) => {\n\t\t\t\tlet arr = acc;\n\n\t\t\t\tif (index + 1 < +maxBars) {\n\t\t\t\t\tarr = [...arr, cur];\n\t\t\t\t} else if (arrDimensions.length > 0) {\n\t\t\t\t\tfor (const dimensionItem of arrDimensions) {\n\t\t\t\t\t\tconst dimensionId =\n\t\t\t\t\t\t\tdimensionItem.id ||\n\t\t\t\t\t\t\t(dimensionItem.name &&\n\t\t\t\t\t\t\t\tUtils.helpers.changeSpecialCharacterToSnake(dimensionItem.name.toString())) ||\n\t\t\t\t\t\t\t'';\n\t\t\t\t\t\tconst keyDimension = `D${dimensionId}`;\n\n\t\t\t\t\t\tobjOtherBar[keyDimension] = objOtherBar[keyDimension]\n\t\t\t\t\t\t\t? (+objOtherBar[keyDimension] || 0) + (+cur[keyDimension] || 0)\n\t\t\t\t\t\t\t: cur[keyDimension] || 0;\n\t\t\t\t\t}\n\t\t\t\t} else if (data.rows[0].aggregations) {\n\t\t\t\t\tfor (const metric of metrics) {\n\t\t\t\t\t\tif (metric.name && metric.key) {\n\t\t\t\t\t\t\tconst keyDimension = metric.key;\n\n\t\t\t\t\t\t\totherBar[keyDimension] = otherBar[keyDimension]\n\t\t\t\t\t\t\t\t? +otherBar[keyDimension] + +cur[keyDimension]\n\t\t\t\t\t\t\t\t: cur[keyDimension];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn arr;\n\t\t\t}, []);\n\n\t\t\tif (Object.keys(objOtherBar).length > 0) {\n\t\t\t\tfor (const value of Object.values(objOtherBar)) {\n\t\t\t\t\tif (+value < 0) {\n\t\t\t\t\t\tsummaryNegative += +value;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsummary += +value;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (summary > state.summary) {\n\t\t\t\t\tstate.summary = summary;\n\t\t\t\t}\n\n\t\t\t\tif (summaryNegative < state.summaryNegative) {\n\t\t\t\t\tstate.summaryNegative = summaryNegative;\n\t\t\t\t}\n\n\t\t\t\tconst sortData = Object.entries(objOtherBar).sort(([, valueA], [, valueB]) => {\n\t\t\t\t\treturn Number.parseFloat(valueA.toString()) - Number.parseFloat(valueB.toString());\n\t\t\t\t});\n\n\t\t\t\tconst seriesNumber = sortData.length - (+maxSeries || maxBarSeries);\n\n\t\t\t\tconst getArr = sortData.slice(seriesNumber < 0 ? 0 : seriesNumber);\n\n\t\t\t\tlet getOtherValue = 0;\n\n\t\t\t\tfor (const [, value] of sortData.slice(0, seriesNumber)) {\n\t\t\t\t\tgetOtherValue += +value;\n\t\t\t\t}\n\n\t\t\t\tfor (const [key, value] of getArr) {\n\t\t\t\t\totherBar[key] = value;\n\n\t\t\t\t\tif (key === 'D-1') {\n\t\t\t\t\t\totherBar[key] = +value + getOtherValue;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (key.startsWith('D')) {\n\t\t\t\t\t\tif (+otherBar[key] < 0) {\n\t\t\t\t\t\t\totherBar[`${key}PERCENT`] =\n\t\t\t\t\t\t\t\tsummaryNegative === 0 ? 0 : (+otherBar[key] / summaryNegative) * -100;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\totherBar[`${key}PERCENT`] = summary === 0 ? 0 : (+otherBar[key] / summary) * 100;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (seriesNumber + +showOtherSeries < 0) {\n\t\t\t\t\totherBar['D-1'] = getOtherValue;\n\t\t\t\t\tif (+otherBar['D-1PERCENT'] < 0) {\n\t\t\t\t\t\totherBar['D-1PERCENT'] =\n\t\t\t\t\t\t\tsummaryNegative === 0 ? 0 : (+otherBar['D-1PERCENT'] / summaryNegative) * -100;\n\t\t\t\t\t} else {\n\t\t\t\t\t\totherBar['D-1PERCENT'] = summary === 0 ? 0 : (+otherBar['D-1PERCENT'] / summary) * 100;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\totherBar.name = 'Other';\n\t\t\totherBar.id = '-1';\n\n\t\t\tarrData = [...arrData, otherBar];\n\t\t} else {\n\t\t\tarrData = arrData.slice(0, +maxBars);\n\t\t}\n\t}\n\n\tif (!showOtherBars) {\n\t\tarrData = arrData.filter((item) => +item.id !== -1);\n\t}\n\n\tif (\n\t\tshowOtherSeries &&\n\t\t((typeof maxSeries === 'number' && maxSeries > 1) || typeof maxSeries !== 'number')\n\t) {\n\t\tif (!arrYAxis.some((yAxis) => yAxis.name === 'D-1')) {\n\t\t\tarrYAxis.push({\n\t\t\t\tyAxisId: '',\n\t\t\t\tname: 'D-1',\n\t\t\t\tlabel: 'Other',\n\t\t\t\tkey: metrics[0].key,\n\t\t\t\tisActive: true,\n\t\t\t});\n\t\t}\n\t} else {\n\t\tarrYAxis = arrYAxis.filter((yAxis) => yAxis.name !== 'D-1');\n\t}\n\n\tconst coordinateAxis: Record<string, string> = {};\n\n\tif (!isEmpty(arrTotalValue)) {\n\t\tif (axesMode === 'single') {\n\t\t\t// Assign all metric to left\n\t\t\tfor (const metric in arrTotalValue) {\n\t\t\t\tif (arrTotalValue[metric]) {\n\t\t\t\t\tcoordinateAxis[metric] = 'left';\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tlet minValue: number | undefined;\n\t\t\tlet maxValue = 0;\n\n\t\t\tfor (const metric in arrTotalValue) {\n\t\t\t\tif (arrTotalValue[metric]) {\n\t\t\t\t\t// Assign min for the first time\n\t\t\t\t\tif (typeof minValue === 'undefined') {\n\t\t\t\t\t\tminValue = arrTotalValue[metric];\n\t\t\t\t\t} else if (minValue > arrTotalValue[metric]) {\n\t\t\t\t\t\tminValue = arrTotalValue[metric];\n\t\t\t\t\t}\n\n\t\t\t\t\tif (maxValue < arrTotalValue[metric]) {\n\t\t\t\t\t\tmaxValue = arrTotalValue[metric];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (minValue && minValue !== maxValue) {\n\t\t\t\tfor (const metric in arrTotalValue) {\n\t\t\t\t\tif (arrTotalValue[metric]) {\n\t\t\t\t\t\t// Min < 1tr and max > 1tr\n\t\t\t\t\t\tif (minValue < 1000000 && maxValue > 1000000) {\n\t\t\t\t\t\t\tif (arrTotalValue[metric] < 1000000) {\n\t\t\t\t\t\t\t\t// Left coordinate axis\n\t\t\t\t\t\t\t\tcoordinateAxis[metric] = 'left';\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// Right coordinate axis\n\t\t\t\t\t\t\t\tcoordinateAxis[metric] = 'right';\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if (arrTotalValue[metric] - minValue > 0) {\n\t\t\t\t\t\t\tif (arrTotalValue[metric] - minValue < arrTotalValue[metric] - maxValue) {\n\t\t\t\t\t\t\t\t// Left\n\t\t\t\t\t\t\t\tcoordinateAxis[metric] = 'left';\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// Right\n\t\t\t\t\t\t\t\tcoordinateAxis[metric] = 'right';\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tlet isLeft = true;\n\n\t\t\t\tfor (const metric in arrTotalValue) {\n\t\t\t\t\tif (arrTotalValue[metric]) {\n\t\t\t\t\t\tcoordinateAxis[metric] = isLeft ? 'left' : 'right';\n\n\t\t\t\t\t\tisLeft = !isLeft;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tif (arrYAxis.length > 0) {\n\t\tarrYAxis.forEach((yAxis, key) => {\n\t\t\t// metric has key, dimension does not\n\t\t\tif (hasBreakdownDimension) {\n\t\t\t\tif (yAxis.name && coordinateAxis[yAxis.name.toString()]) {\n\t\t\t\t\tarrYAxis[key].yAxisId = coordinateAxis[yAxis.name.toString()];\n\t\t\t\t} else {\n\t\t\t\t\tcoordinateAxis[yAxis.name.toString()] = 'left';\n\t\t\t\t\tarrYAxis[key].yAxisId = 'left';\n\t\t\t\t}\n\t\t\t} else if (yAxis.key && coordinateAxis[yAxis.key.toString()]) {\n\t\t\t\tarrYAxis[key].yAxisId = coordinateAxis[yAxis.key.toString()];\n\t\t\t} else {\n\t\t\t\tcoordinateAxis[yAxis.key.toString()] = 'left';\n\t\t\t\tarrYAxis[key].yAxisId = 'left';\n\t\t\t}\n\t\t});\n\t}\n\n\tconst isAllBarOnLeft =\n\t\tObject.keys(coordinateAxis).length > 0\n\t\t\t? Object.keys(coordinateAxis).every((item) => {\n\t\t\t\t\treturn coordinateAxis[item] === 'left';\n\t\t\t\t})\n\t\t\t: true;\n\n\tconst isAllBarOnRight =\n\t\tObject.keys(coordinateAxis).length > 0\n\t\t\t? Object.keys(coordinateAxis).every((item) => {\n\t\t\t\t\treturn coordinateAxis[item] === 'right';\n\t\t\t\t})\n\t\t\t: true;\n\n\tif (arrData.length > 0) {\n\t\tconst otherIndex = arrYAxis.findIndex((item) => item.name === 'D-1');\n\n\t\t// Move other to last\n\t\tif (otherIndex >= 0 && otherIndex < arrYAxis.length) {\n\t\t\tarrYAxis = [\n\t\t\t\t...arrYAxis.slice(0, otherIndex),\n\t\t\t\t...arrYAxis.slice(otherIndex + 1),\n\t\t\t\tarrYAxis[otherIndex],\n\t\t\t];\n\t\t}\n\n\t\tstate.maxValues = {};\n\t\tstate.objMaxValues = {};\n\t\tstate.objMinValues = {};\n\n\t\tfor (const [metricKey, position] of Object.entries(coordinateAxis)) {\n\t\t\tif (!state.maxValues[position]) {\n\t\t\t\tstate.maxValues[position] = { value: 0, metricKey: '' };\n\t\t\t}\n\n\t\t\tif (!state.objMaxValues[position]?.[metricKey]) {\n\t\t\t\tstate.objMaxValues[position] = {\n\t\t\t\t\t...(typeof state.objMaxValues[position] !== 'undefined'\n\t\t\t\t\t\t? state.objMaxValues[position]\n\t\t\t\t\t\t: {}),\n\t\t\t\t\t[metricKey]: 0,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (!state.objMinValues[position]?.[metricKey]) {\n\t\t\t\tstate.objMinValues[position] = {\n\t\t\t\t\t...(typeof state.objMinValues[position] !== 'undefined'\n\t\t\t\t\t\t? state.objMinValues[position]\n\t\t\t\t\t\t: {}),\n\t\t\t\t\t[metricKey]: 0,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// Calculate max data\n\t\t\tfor (const row of arrData) {\n\t\t\t\tif (+row[metricKey] > +state.maxValues[position].value) {\n\t\t\t\t\tstate.maxValues[position] = {\n\t\t\t\t\t\tvalue: +row[metricKey],\n\t\t\t\t\t\tmetricKey: metricKey.replace(REGEX_DIMENSION, ''),\n\t\t\t\t\t};\n\t\t\t\t} else if (+row[metricKey] >= state.maxValues[position].value) {\n\t\t\t\t\tstate.maxValues[position] = {\n\t\t\t\t\t\tvalue: +row[metricKey],\n\t\t\t\t\t\tmetricKey: metricKey.replace(REGEX_DIMENSION, ''),\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (+row[metricKey] > state.objMaxValues[position][metricKey]) {\n\t\t\t\t\tstate.objMaxValues[position][metricKey] = +row[metricKey];\n\t\t\t\t}\n\n\t\t\t\tif (+row[metricKey] < state.objMinValues[position][metricKey]) {\n\t\t\t\t\tstate.objMinValues[position][metricKey] = +row[metricKey];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (hasBreakdownDimension) {\n\t\t\tarrYAxis = arrYAxis.filter(({ name }) => arrData.some((col) => !!col[name.toString()]));\n\t\t}\n\n\t\t// Handle format arrYAxis if has hasBreakdownDimension: Remove YAxis not show on bar chart\n\t\tif (hasBreakdownDimension) {\n\t\t\tarrYAxis = arrYAxis.filter(({ name }) => arrData.some((col) => !!col[name.toString()]));\n\t\t}\n\t}\n\n\treturn {\n\t\tdata: arrData,\n\t\tarrYAxis: arrYAxis,\n\t\tarrDimensions,\n\t\tisAllBarOnLeft,\n\t\tisAllBarOnRight,\n\t\tcoordinateAxis,\n\t\t...state,\n\t};\n}\n","import type { NodeViewProps } from '@tiptap/react';\nimport { useEffect, useState } from 'react';\nimport { useDeepCompareEffect } from 'use-deep-compare';\nimport { useChartNodeView } from '@/hooks/useChartNodeView';\nimport { useAuthContext } from '@/hooks/useGetAuthInfo';\nimport { GetSchemaQuery } from '@/queries';\nimport { BarChartAttrsSchema } from '@/schemas/tiptap';\nimport type { BarChartData, BarChartSettings } from '@/types';\nimport type { BarChartAttrs } from '@/types/tiptap';\nimport { Utils } from '@/utils';\nimport { formatReportPerfData } from '../utils';\n\ntype Params = {\n\tnodeViewProps: NodeViewProps;\n};\n\nexport const useBarChartNodeView = (params: Params) => {\n\tconst { nodeViewProps } = params;\n\tconst {\n\t\textension: { options = {} },\n\t\tnode,\n\t} = nodeViewProps;\n\n\tconst auth = useAuthContext();\n\n\tconst messageId = `${options.messageId}`;\n\tconst dataSourceId = parseInt(options.dataSourceId, 10) || 0;\n\n\tconst [attrs, setAttrs] = useState<BarChartAttrs>();\n\tconst [data, setData] = useState<BarChartData>();\n\tconst [settings, setSettings] = useState<BarChartSettings>();\n\n\tconst { data: dataSourceSchema } = GetSchemaQuery.query({\n\t\tdataSourceId,\n\t\tauth,\n\t});\n\n\tuseDeepCompareEffect(() => {\n\t\tsetAttrs(BarChartAttrsSchema.parse(node.attrs));\n\t}, [node.attrs]);\n\n\tconst {\n\t\tdata: reportPerfData,\n\t\tisLoading,\n\t\terror,\n\t} = useChartNodeView({\n\t\tid: messageId,\n\t\tattrs,\n\t\tdataSourceId,\n\t\tenabled: !!attrs,\n\t});\n\n\tuseEffect(() => {\n\t\tif (!(reportPerfData && attrs && dataSourceSchema)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst settings = Utils.nodeView.report.attrsToCompSetting({\n\t\t\tdataSourceSchema,\n\t\t\tattrs,\n\t\t});\n\n\t\tsetSettings(settings);\n\t\tsetData(formatReportPerfData({ data: reportPerfData, settings }));\n\t}, [reportPerfData, attrs, dataSourceSchema]);\n\n\treturn { data, settings, isLoading, error };\n};\n","import { Report } from '@antscorp/antsomi-charts';\nimport { Spin } from '@antscorp/antsomi-ui';\nimport { COLOR_CHART } from '@/constants/report';\nimport type { ChartNodeViewProps } from '@/types/tiptap';\nimport { useBarChartNodeView } from './hooks';\n\nexport function BarChartNodeView(props: ChartNodeViewProps) {\n\tconst { chartWrapperSize, renderDropdownAction } = props;\n\n\tconst { data, settings, isLoading } = useBarChartNodeView({\n\t\tnodeViewProps: props,\n\t});\n\n\tif (isLoading || !data || !settings || !chartWrapperSize) {\n\t\treturn <Spin indicatorSize={20} />;\n\t}\n\n\treturn (\n\t\t<>\n\t\t\t<Report.BarChart\n\t\t\t\theight={chartWrapperSize.height}\n\t\t\t\twidth={chartWrapperSize.width}\n\t\t\t\tdata={data.data}\n\t\t\t\tarrYAxis={data.arrYAxis}\n\t\t\t\tmetric={settings.metric}\n\t\t\t\tdimension={settings.dimension}\n\t\t\t\tcoordinateAxis={data.coordinateAxis}\n\t\t\t\tcolors={COLOR_CHART}\n\t\t\t/>\n\n\t\t\t{renderDropdownAction(data.data)}\n\t\t</>\n\t);\n}\n"],"names":["formatReportPerfData","params","REGEX_DIMENSION","getAggregation","field","state","data","settings","style","dimensions","breakdownDimension","metrics","metric","idx","axes","showOtherBars","showOtherSeries","axesMode","hasBreakdownDimension","MAX_SERIES_DEFAULT","MAX_BAR","arrYAxis","arrData","arrTotalValue","arrDimensionId","arrDimensions","number","counter","arrMaxSeriesId","maxBars","maxSeries","rows","arrMetricAggregations","maxDimensionInRow","row","totalBar","maxBarSeries","maxBarsNumber","i","length","numberBarSeries","index","counterSeries","summary","summaryNegative","isPush","item","otherSeriesValue","Utils","arrValues","metricAggregation","aggregationItem","aggregation","value","dimension","isPushSeries","label","dimensionId","_","itemRest","metricName","totalValue","key","otherBar","objOtherBar","acc","cur","arr","dimensionItem","keyDimension","sortData","valueA","valueB","seriesNumber","getArr","getOtherValue","yAxis","coordinateAxis","isEmpty","minValue","maxValue","isLeft","isAllBarOnLeft","isAllBarOnRight","otherIndex","metricKey","position","name","col","useBarChartNodeView","nodeViewProps","options","node","auth","useAuthContext","messageId","dataSourceId","attrs","setAttrs","useState","setData","setSettings","dataSourceSchema","GetSchemaQuery","useDeepCompareEffect","BarChartAttrsSchema","reportPerfData","isLoading","error","useChartNodeView","useEffect","BarChartNodeView","props","chartWrapperSize","renderDropdownAction","Spin","Report","COLOR_CHART"],"mappings":"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"}