{"version":3,"file":"Component-BzsuO3n8.mjs","sources":["../src/components/ConversationMessage/extensions/NodeViews/PieChart/utils.ts","../src/components/ConversationMessage/extensions/NodeViews/PieChart/hooks/usePieChartNodeView.ts","../src/components/ConversationMessage/extensions/NodeViews/PieChart/Component.tsx"],"sourcesContent":["import { isNull, omit } from 'es-toolkit';\nimport type { ApiPieChartData, Field, PieChartData } from '@/types';\nimport { Utils } from '@/utils';\nimport { convertValueFromDataType } from '@/utils/helpers/convertValueFromDataType';\nimport { formatValue } from '@/utils/helpers/formatValue';\n\nconst MAX_SLICE_IN_PIE = 10;\n\nexport function formatReportPerfData(params: {\n\tapiData: ApiPieChartData;\n\tmetrics: Field[];\n\tdimensions: Field[];\n\tnumberOfSlice?: number;\n}): PieChartData {\n\tconst { apiData, metrics, dimensions, numberOfSlice = MAX_SLICE_IN_PIE } = params;\n\n\ttype Data = {\n\t\tid: string | number;\n\t\tname: string;\n\t\tvalue: number;\n\t\tpercent: number;\n\t};\n\n\tfunction formatApiData() {\n\t\ttype TAggregation = {\n\t\t\tname: string;\n\t\t\ttype: string;\n\t\t\tvalue: number[];\n\t\t};\n\n\t\ttype TDimension = {\n\t\t\tid: string;\n\t\t\tname: string;\n\t\t};\n\n\t\tconst { rows = [] } = apiData;\n\n\t\tconst newRows: { aggregations: TAggregation[]; dimension: TDimension }[] = [];\n\n\t\tfor (const fields of rows) {\n\t\t\tconst [fieldInfo, fieldValue] = fields;\n\n\t\t\tnewRows.push({\n\t\t\t\taggregations: [\n\t\t\t\t\t{\n\t\t\t\t\t\tname: fieldValue.name,\n\t\t\t\t\t\tvalue: fieldValue.value,\n\t\t\t\t\t\ttype: fieldValue.aggregationType,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tdimension: {\n\t\t\t\t\tid: fieldInfo.value,\n\t\t\t\t\tname: fieldInfo.value,\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\n\t\treturn {\n\t\t\t...omit(apiData, ['rows']),\n\t\t\trows: newRows,\n\t\t};\n\t}\n\n\tconst arrData: Data[] = [];\n\n\tconst { rows } = formatApiData();\n\n\tconst summary: Record<string, number> = {};\n\tlet isNegativeData = false;\n\n\tlet metric: Field | undefined;\n\tlet metricName = '';\n\tlet totalValue = 0;\n\tlet countNumber = 0;\n\tlet otherValue = 0;\n\tlet otherPercent = 0;\n\n\tif (metrics.length > 0) {\n\t\tmetric = metrics[0];\n\n\t\tmetricName = metric.name || '';\n\t}\n\n\tconst dimension = dimensions.at(0);\n\n\tif (!(metricName && metric && dimension)) {\n\t\treturn { data: [], totalValue: 0 };\n\t}\n\n\tfor (const row of rows) {\n\t\tlet value = 0;\n\n\t\tif (metricName && row.aggregations && row.aggregations.length > 0) {\n\t\t\t// Handle response aggregations\n\t\t\tconst aggregationItem = row.aggregations.find((aggregation) => {\n\t\t\t\treturn aggregation.name === metricName;\n\t\t\t});\n\n\t\t\tif (aggregationItem?.value) {\n\t\t\t\tvalue = +aggregationItem.value;\n\t\t\t}\n\t\t}\n\n\t\tvalue = +convertValueFromDataType({\n\t\t\tfield: metric,\n\t\t\tvalue,\n\t\t});\n\n\t\tif (typeof summary[metricName] !== 'number') {\n\t\t\tsummary[metricName] = 0;\n\t\t}\n\n\t\tsummary[metricName] += value;\n\t}\n\n\trows.forEach((row, rowIndex) => {\n\t\tlet dimensionName = row.dimension.name;\n\t\tlet value = 0;\n\t\tlet percent = 0;\n\n\t\tif (\n\t\t\tdimensionName &&\n\t\t\tdimensions.length > 0 &&\n\t\t\t['IMAGE', 'HYPERLINK'].includes(dimensions[0].dataType)\n\t\t) {\n\t\t\tconst arrValues = Utils.helpers.formattedHyperlink(dimensionName, '—');\n\n\t\t\tif (arrValues.length <= 0) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (dimension.dataType === 'IMAGE') {\n\t\t\t\tdimensionName = arrValues[0];\n\t\t\t} else if (dimension.dataType === 'HYPERLINK') {\n\t\t\t\tdimensionName = arrValues[1];\n\t\t\t}\n\t\t}\n\n\t\tdimensionName = convertValueFromDataType({\n\t\t\tvalue: dimensionName,\n\t\t\tfield: dimension,\n\t\t}).toString();\n\n\t\tdimensionName = formatValue({\n\t\t\tvalue: dimensionName,\n\t\t\tfield: dimension,\n\t\t}).toString();\n\n\t\tif (metricName && row.aggregations.length > 0) {\n\t\t\t// Handle response aggregations\n\t\t\tconst aggregationItem = row.aggregations.find((aggregation) => {\n\t\t\t\treturn aggregation.name === metricName;\n\t\t\t});\n\n\t\t\tif (aggregationItem?.value) {\n\t\t\t\tvalue = +aggregationItem.value;\n\t\t\t}\n\t\t}\n\t\t//     else if (\n\t\t// \tmetricName &&\n\t\t// \ttypeof row['metrics'] !== 'undefined' &&\n\t\t// \ttypeof row['metrics'][metricName] !== 'undefined'\n\t\t// ) {\n\t\t// \tvalue = +row['metrics'][metricName];\n\t\t// }\n\n\t\tif (+value < 0) {\n\t\t\tisNegativeData = true;\n\t\t}\n\n\t\t// Format value\n\t\tvalue = +convertValueFromDataType({\n\t\t\tvalue,\n\t\t\tfield: metric,\n\t\t});\n\n\t\ttotalValue += value;\n\n\t\tif (typeof summary[metricName] === 'number') {\n\t\t\tpercent = (value / summary[metricName]) * 100;\n\t\t}\n\n\t\tconst isSliceOtherAPI = +row.dimension.id === -1;\n\t\tconst quantityOfRows = rows.length;\n\t\tconst minAcceptedSlice = Math.min(quantityOfRows, numberOfSlice) - 1;\n\t\tconst isShowNormalSlice =\n\t\t\t(countNumber === MAX_SLICE_IN_PIE - 1 && !isSliceOtherAPI) ||\n\t\t\t(quantityOfRows < MAX_SLICE_IN_PIE && numberOfSlice >= quantityOfRows);\n\n\t\tif (countNumber < minAcceptedSlice || isShowNormalSlice) {\n\t\t\tconst id = typeof row.dimension.id === 'undefined' ? '' : row.dimension.id;\n\n\t\t\tarrData.push({\n\t\t\t\tid: isNull(id) ? `null_${rowIndex}` : id,\n\t\t\t\tname: dimensionName,\n\t\t\t\tvalue,\n\t\t\t\tpercent,\n\t\t\t});\n\n\t\t\tcountNumber++;\n\t\t} else {\n\t\t\totherValue += value;\n\n\t\t\tif (rowIndex === rows.length - 1 && typeof summary[metricName] === 'number') {\n\t\t\t\totherPercent = (otherValue / summary[metricName]) * 100;\n\t\t\t}\n\t\t}\n\t});\n\n\tarrData.push({\n\t\tid: -1,\n\t\tname: 'Other',\n\t\tvalue: otherValue,\n\t\tpercent: otherPercent,\n\t});\n\n\treturn {\n\t\tdata: arrData.length > 0 ? arrData : [],\n\t\ttotalValue,\n\t};\n}\n","import { useMemo, useState } from 'react';\nimport { useDeepCompareEffect } from 'use-deep-compare';\nimport { useChartNodeView } from '@/hooks/useChartNodeView';\nimport { PieChartAttrsSchema } from '@/schemas/tiptap';\nimport type { ChartNodeViewProps, PieChartAttrs } from '@/types/tiptap';\nimport { Utils } from '@/utils';\nimport { formatReportPerfData } from '../utils';\n\ntype Params = {\n\tnodeViewProps: ChartNodeViewProps;\n};\n\nexport const usePieChartNodeView = (params: Params) => {\n\tconst { nodeViewProps } = params;\n\tconst {\n\t\textension: { options = {} },\n\t\tnode,\n\t} = nodeViewProps;\n\n\tconst messageId = `${options.messageId}`;\n\tconst dataSourceId = parseInt(options.dataSourceId, 10) || 0;\n\n\tconst [attrs, setAttrs] = useState<PieChartAttrs>();\n\n\tconst { data, dataSourceSchema, isLoading, error } = useChartNodeView({\n\t\tid: messageId,\n\t\tattrs,\n\t\tdataSourceId,\n\t\tenabled: !!attrs,\n\t});\n\n\tuseDeepCompareEffect(() => {\n\t\tsetAttrs(PieChartAttrsSchema.parse(node.attrs));\n\t}, [node.attrs]);\n\n\tconst serializedData = useMemo(() => {\n\t\tif (!(data && attrs && dataSourceSchema)) {\n\t\t\treturn null;\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\treturn {\n\t\t\tdata: formatReportPerfData({\n\t\t\t\tapiData: data,\n\t\t\t\tdimensions: settings.dimension,\n\t\t\t\tmetrics: settings.metric,\n\t\t\t}),\n\t\t\tsettings,\n\t\t};\n\t}, [data, attrs, dataSourceSchema]);\n\n\treturn { data: serializedData?.data, settings: serializedData?.settings, isLoading, error };\n};\n","import { Report } from '@antscorp/antsomi-charts';\nimport { Spin } from '@antscorp/antsomi-ui';\nimport type { ChartNodeViewProps } from '@/types/tiptap';\nimport { usePieChartNodeView } from './hooks';\n\nexport const PieChartNodeView = (props: ChartNodeViewProps) => {\n\tconst { chartWrapperSize, renderDropdownAction } = props;\n\n\tconst { data, settings, isLoading } = usePieChartNodeView({\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.PieChart\n\t\t\t\tdata={data.data}\n\t\t\t\tmetric={settings.metric}\n\t\t\t\tdimension={settings.dimension}\n\t\t\t\tminWidthOfLegend={200}\n\t\t\t\twidth={chartWrapperSize.width}\n\t\t\t\theight={chartWrapperSize.height}\n\t\t\t/>\n\n\t\t\t{renderDropdownAction(data.data)}\n\t\t</>\n\t);\n};\n"],"names":["MAX_SLICE_IN_PIE","formatReportPerfData","params","apiData","metrics","dimensions","numberOfSlice","formatApiData","rows","newRows","fields","fieldInfo","fieldValue","omit","arrData","summary","metric","metricName","totalValue","countNumber","otherValue","otherPercent","dimension","row","value","aggregationItem","aggregation","convertValueFromDataType","rowIndex","dimensionName","percent","arrValues","Utils","formatValue","isSliceOtherAPI","quantityOfRows","minAcceptedSlice","isShowNormalSlice","id","isNull","usePieChartNodeView","nodeViewProps","options","node","messageId","dataSourceId","attrs","setAttrs","useState","data","dataSourceSchema","isLoading","error","useChartNodeView","useDeepCompareEffect","PieChartAttrsSchema","serializedData","useMemo","settings","PieChartNodeView","props","chartWrapperSize","renderDropdownAction","Spin","Report"],"mappings":"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"}