UNPKG

survey-analytics

Version:

SurveyJS analytics Library.

1 lines 141 kB
{"version":3,"file":"survey.analytics.mjs","sources":["../../src/plotly/setup.ts","../../src/matrixDropdownGrouped.ts","../../src/plotly/legacy.ts","../../src/plotly/chart-adapter.ts"],"sourcesContent":["import { Event, QuestionRatingModel } from \"survey-core\";\nimport { IAnswersData, SelectBase } from \"../selectBase\";\nimport { VisualizerBase } from \"../visualizerBase\";\nimport { localization } from \"../localizationManager\";\nimport { DataHelper } from \"../utils\";\nimport { NumberModel } from \"../number\";\n\nexport interface PlotlyOptions {\n traces: Array<any>;\n layout: any;\n hasSeries: boolean;\n}\n\nexport class PlotlySetup {\n public static imageExportFormat = \"png\";\n /**\n * Fires when end user clicks on the 'save as image' button.\n */\n public static onImageSaving = new Event<\n (sender: VisualizerBase, options: any) => any,\n VisualizerBase,\n any\n >();\n\n /**\n * Fires before plot will be created. User can change traces, layout and config of the plot.\n * Options is an object with the following fields: traces, layout and config of the plot.\n */\n public static onPlotCreating = new Event<\n (sender: VisualizerBase, options: any) => any,\n VisualizerBase,\n any\n >();\n\n static setups: { [type: string]: (model: VisualizerBase, answersData: IAnswersData) => PlotlyOptions } = {\n bar: PlotlySetup.setupBar,\n vbar: PlotlySetup.setupVBar,\n line: PlotlySetup.setupVBar,\n stackedbar: PlotlySetup.setupBar,\n doughnut: PlotlySetup.setupPie,\n pie: PlotlySetup.setupPie,\n scatter: PlotlySetup.setupScatter,\n gauge: PlotlySetup.setupGauge,\n bullet: PlotlySetup.setupGauge,\n radar: PlotlySetup.setupRadar,\n };\n\n static setup(charType: string, model: VisualizerBase, answersData: IAnswersData): PlotlyOptions {\n return this.setups[charType](model, answersData);\n }\n\n static getTruncatedLabel = (label: string, labelTruncateLength: number) => {\n const truncateSymbols = \"...\";\n const truncateSymbolsLength = truncateSymbols.length;\n\n if (!labelTruncateLength) return label;\n if (labelTruncateLength === -1) return label;\n if (label.length <= labelTruncateLength + truncateSymbolsLength)\n return label;\n\n return label.substring(0, labelTruncateLength) + truncateSymbols;\n };\n\n static setupPie(model: SelectBase, answersData: IAnswersData): PlotlyOptions {\n let {\n datasets,\n labels,\n colors,\n texts,\n seriesLabels,\n } = answersData;\n\n const hasSeries = seriesLabels.length > 1 || model.question.getType() === \"matrix\";\n const layoutColumns = 2;\n\n let traces: any = [];\n const traceConfig: any = {\n type: model.chartType,\n labels: labels,\n customdata: labels,\n text: labels.map((label: string) => {\n return PlotlySetup.getTruncatedLabel(\n label,\n model.labelTruncateLength\n );\n }),\n hoverinfo: \"value+text\",\n textposition: \"inside\",\n texttemplate: \"%{text}\"\n };\n\n if (model.chartType === \"doughnut\") {\n traceConfig.type = \"pie\";\n traceConfig.hole = 0.4;\n }\n\n if (!hasSeries) {\n traceConfig.mode = \"markers\",\n traceConfig.marker = { color: colors };\n traceConfig.marker.symbol = \"circle\";\n traceConfig.marker.size = 16;\n }\n\n datasets.forEach((dataset: Array<number>, index: number) => {\n const isNotEmpty = dataset.some((value: number) => value != 0);\n let pieTexts = traceConfig.text;\n if(model.showPercentages) {\n const percentages = model.getPercentages([dataset])[0];\n pieTexts = labels.map((l, li) => (model.showOnlyPercentages ? percentages[li] : PlotlySetup.getTruncatedLabel(l, model.labelTruncateLength) + \"<br>\" + percentages[li]) + \"%\");\n }\n if(isNotEmpty) {\n traces.push(\n Object.assign({}, traceConfig, {\n values: dataset,\n text: pieTexts,\n domain: {\n column: traces.length % layoutColumns,\n row: Math.floor(traces.length / layoutColumns),\n },\n title: { position: \"bottom center\", text: seriesLabels[index] }\n })\n );\n }\n });\n\n const radius = labels.length < 10 ? labels.length * 50 + 100 : 550;\n const height = (radius + 25) * Math.ceil(traces.length / layoutColumns);\n\n const layout: any = {\n font: {\n family: \"Segoe UI, sans-serif\",\n size: 14,\n weight: \"normal\",\n color: \"#404040\",\n },\n height: height,\n margin: {\n l: 0,\n t: 25,\n b: 0,\n r: 10,\n },\n colorway: colors,\n hovermode: \"closest\",\n plot_bgcolor: model.backgroundColor,\n paper_bgcolor: model.backgroundColor,\n showlegend: false,\n };\n\n if (hasSeries) {\n layout.annotations = [];\n layout.grid = { rows: Math.ceil(traces.length / layoutColumns), columns: layoutColumns };\n }\n return { traces, layout, hasSeries };\n }\n\n static setupBar(model: SelectBase, answersData: IAnswersData): PlotlyOptions {\n let lineHeight = 30;\n let topMargin = 30;\n let bottomMargin = 30;\n let {\n datasets,\n labels,\n colors,\n texts,\n seriesLabels,\n } = answersData;\n\n const hasSeries = seriesLabels.length > 1 || model.question.getType() === \"matrix\";\n\n const traces: any = [];\n const traceConfig: any = {\n type: model.chartType === \"line\" ? \"line\" : \"bar\",\n y: labels,\n customdata: labels,\n hoverinfo: \"text\",\n orientation: \"h\",\n textposition: \"none\",\n };\n if (!hasSeries) {\n traceConfig.width = 0.5;\n traceConfig.bargap = 0.5;\n traceConfig.mode = \"markers\",\n traceConfig.marker = { color: colors };\n }\n\n datasets.forEach((dataset: Array<number>, index: number) => {\n const traceName = hasSeries ? seriesLabels[index] : labels[index];\n const percentString = model.showPercentages ? \"%\" : \"\";\n const trace = Object.assign({}, traceConfig, {\n x: dataset,\n name: traceName,\n width: hasSeries && model.chartType !== \"stackedbar\" ? 0.5 / seriesLabels.length : 0.5,\n text: texts[index],\n hovertext: labels.map((label: string, labelIndex: number) => {\n if(model.showOnlyPercentages) {\n return `${texts[index][labelIndex]}${percentString}`;\n } else {\n return hasSeries ? `${traceName} : ${label}, ${texts[index][labelIndex]}${percentString}` : `${texts[index][labelIndex]}${percentString}, ${label}`;\n }\n }),\n });\n if (model.showPercentages) {\n let texttemplate = model.showOnlyPercentages ? \"%{text}%\" : \"%{value} (%{text}%)\";\n trace.textposition = \"inside\";\n trace.texttemplate = texttemplate;\n trace.width = hasSeries && model.chartType !== \"stackedbar\" ? 0.7 / seriesLabels.length : 0.9;\n trace.bargap = hasSeries && model.chartType !== \"stackedbar\" ? 0.3 / seriesLabels.length : 0.1;\n }\n traces.push(trace);\n });\n\n const height = (labels.length + 1) * lineHeight + topMargin + bottomMargin;\n\n const layout: any = {\n font: {\n family: \"Segoe UI, sans-serif\",\n size: 14,\n weight: \"normal\",\n color: \"#404040\",\n },\n height: height,\n margin: {\n t: topMargin,\n b: bottomMargin,\n r: 10,\n },\n colorway: colors,\n hovermode: \"closest\",\n plot_bgcolor: model.backgroundColor,\n paper_bgcolor: model.backgroundColor,\n showlegend: hasSeries,\n barmode: hasSeries && model.chartType == \"stackedbar\" ? \"stack\" : \"group\",\n xaxis: {\n rangemode: \"nonnegative\",\n automargin: true,\n },\n yaxis: {\n automargin: true,\n type: \"category\",\n orientation: \"h\",\n tickmode: \"array\",\n tickvals: labels,\n ticktext: labels.map((label: string) => {\n return PlotlySetup.getTruncatedLabel(\n label,\n model.labelTruncateLength\n ) + \" \";\n }),\n },\n };\n\n if (hasSeries && model.chartType !== \"stackedbar\") {\n layout.height =\n (labels.length * seriesLabels.length + 1) * lineHeight +\n topMargin +\n bottomMargin;\n }\n\n if([\"ar\", \"fa\"].indexOf(localization.currentLocale) !== -1) {\n layout.xaxis.autorange = \"reversed\";\n layout.yaxis.side = \"right\";\n layout.legend = {\n x: 0,\n y: 1,\n xanchor: \"left\",\n yanchor: \"top\"\n };\n }\n\n return { traces, layout, hasSeries };\n }\n\n static setupVBar(model: SelectBase, answersData: IAnswersData): PlotlyOptions {\n let topMargin = 30;\n let bottomMargin = 30;\n let {\n datasets,\n labels,\n colors,\n texts,\n seriesLabels,\n } = answersData;\n\n const hasSeries = seriesLabels.length > 1 || model.question.getType() === \"matrix\";\n\n if (model.type !== \"histogram\" && model.type !== \"pivot\") {\n labels = [].concat(labels).reverse();\n seriesLabels = [].concat(seriesLabels).reverse();\n colors = [].concat(colors.slice(0, hasSeries ? seriesLabels.length : labels.length)).reverse();\n const ts = [];\n texts.forEach(text => {\n ts.push([].concat(text).reverse());\n });\n texts = ts;\n const ds = [];\n datasets.forEach(dataset => {\n ds.push([].concat(dataset).reverse());\n });\n datasets = ds;\n }\n\n const traces: any = [];\n const traceConfig: any = {\n type: model.chartType === \"line\" ? \"line\" : \"bar\",\n x: labels,\n customdata: hasSeries ? seriesLabels : labels,\n hoverinfo: hasSeries ? undefined : \"x+y\",\n orientation: \"v\",\n textposition: \"none\",\n };\n if (model.type === \"histogram\" || !hasSeries) {\n traceConfig.width = 0.5;\n traceConfig.bargap = 0.5;\n traceConfig.mode = \"markers\",\n traceConfig.marker = { color: colors };\n }\n\n datasets.forEach((dataset: Array<number>, index: number) => {\n var trace = Object.assign({}, traceConfig, {\n y: dataset,\n name: hasSeries ? seriesLabels[index] : labels[index],\n text: texts[index],\n });\n if (model.showPercentages) {\n let texttemplate = model.showOnlyPercentages ? \"%{text}%\" : \"%{value} (%{text}%)\";\n trace.textposition = \"inside\";\n trace.texttemplate = texttemplate;\n if (!hasSeries) {\n trace.width = 0.9;\n trace.bargap = 0.1;\n }\n }\n traces.push(trace);\n });\n\n const layout: any = {\n font: {\n family: \"Segoe UI, sans-serif\",\n size: 14,\n weight: \"normal\",\n color: \"#404040\",\n },\n margin: {\n t: topMargin,\n b: bottomMargin,\n r: 10,\n },\n colorway: colors,\n hovermode: \"closest\",\n plot_bgcolor: model.backgroundColor,\n paper_bgcolor: model.backgroundColor,\n showlegend: hasSeries,\n yaxis: {\n rangemode: \"nonnegative\",\n automargin: true,\n },\n xaxis: {\n automargin: true,\n type: \"category\",\n tickmode: \"array\",\n tickvals: labels,\n ticktext: labels.map((label: string) => {\n return PlotlySetup.getTruncatedLabel(\n label,\n model.labelTruncateLength\n ) + \" \";\n }),\n },\n };\n\n if (model.showPercentages && model.showOnlyPercentages) {\n layout.yaxis = {\n automargin: true,\n tickformat: \".0%\",\n range: [0, 1],\n ticklen: model.showOnlyPercentages ? 25 : 5,\n tickcolor: \"transparent\",\n };\n }\n if(!(model as any).getValueType || (model as any).getValueType() != \"date\") {\n layout.xaxis = {\n automargin: true,\n type: \"category\",\n };\n }\n\n return { traces, layout, hasSeries };\n }\n\n static setupScatter(model: SelectBase, answersData: IAnswersData): PlotlyOptions {\n let lineHeight = 30;\n let topMargin = 30;\n let bottomMargin = 30;\n let {\n datasets,\n labels,\n colors,\n texts,\n seriesLabels,\n } = answersData;\n const hasSeries = seriesLabels.length > 1 || model.question.getType() === \"matrix\";\n const traces: any = [];\n\n const traceConfig: any = {\n type: \"scatter\",\n y: (hasSeries ? seriesLabels : labels).map((label: string) => {\n return PlotlySetup.getTruncatedLabel(\n label,\n model.labelTruncateLength\n );\n }),\n customdata: hasSeries ? seriesLabels : labels,\n text: hasSeries ? seriesLabels : labels,\n hoverinfo: \"x+y\",\n orientation: \"h\",\n mode: \"markers\",\n width: 0.5,\n marker: <any>{},\n };\n\n if (!hasSeries) {\n traceConfig.marker.symbol = \"circle\";\n traceConfig.marker.size = 16;\n }\n\n datasets.forEach((dataset: Array<number>) => {\n {\n var trace = Object.assign({}, traceConfig, {\n x: dataset,\n });\n traces.push(trace);\n }\n });\n\n const height = (labels.length + 1) * lineHeight + topMargin + bottomMargin;\n\n const layout: any = {\n font: {\n family: \"Segoe UI, sans-serif\",\n size: 14,\n weight: \"normal\",\n color: \"#404040\",\n },\n height: height,\n margin: {\n t: topMargin,\n b: bottomMargin,\n r: 10,\n },\n colorway: colors,\n hovermode: \"closest\",\n yaxis: {\n automargin: true,\n type: \"category\",\n ticklen: 5,\n tickcolor: \"transparent\",\n },\n xaxis: {\n rangemode: \"nonnegative\",\n automargin: true,\n },\n plot_bgcolor: model.backgroundColor,\n paper_bgcolor: model.backgroundColor,\n showlegend: false,\n };\n\n if (hasSeries) {\n layout.showlegend = true;\n layout.height = undefined;\n\n labels.forEach((label, index) => {\n traces[index].hoverinfo = \"x+name\";\n traces[index].marker.color = undefined;\n traces[index].name = label;\n });\n }\n return { traces, layout, hasSeries };\n }\n\n static setupGauge(model: NumberModel, answersData: IAnswersData): PlotlyOptions {\n let [level, minValue, maxValue] = answersData as any;\n\n if (model.question.getType() === \"rating\") {\n const rateValues = model.question.visibleRateValues;\n maxValue = rateValues[rateValues.length - 1].value;\n minValue = rateValues[0].value;\n }\n\n const colors = model.generateColors(\n maxValue,\n minValue,\n NumberModel.stepsCount\n );\n\n if (NumberModel.showAsPercentage) {\n level = DataHelper.toPercentage(level, maxValue);\n minValue = DataHelper.toPercentage(minValue, maxValue);\n maxValue = DataHelper.toPercentage(maxValue, maxValue);\n }\n\n var traces: any = [\n {\n type: \"indicator\",\n mode: \"gauge+number\",\n gauge: {\n axis: { range: [minValue, maxValue] },\n shape: model.chartType,\n bgcolor: \"white\",\n bar: { color: colors[0] },\n },\n value: level,\n text: model.name,\n domain: { x: [0, 1], y: [0, 1] },\n },\n ];\n\n const chartMargin = model.chartType === \"bullet\" ? 60 : 30;\n var layout: any = {\n height: 250,\n margin: {\n l: chartMargin,\n r: chartMargin,\n b: chartMargin,\n t: chartMargin,\n pad: 5\n },\n plot_bgcolor: model.backgroundColor,\n paper_bgcolor: model.backgroundColor,\n };\n\n return { traces, layout, hasSeries: false };\n }\n\n static setupRadar(model: SelectBase, answersData: IAnswersData): PlotlyOptions {\n let {\n datasets,\n labels,\n colors,\n texts,\n seriesLabels,\n } = answersData;\n const hasSeries = seriesLabels.length > 1 || model.question.getType() === \"matrix\";\n const traces: any = [];\n\n const traceConfig: any = {\n type: \"scatterpolar\",\n mode: \"lines+markers\",\n fill: \"toself\",\n line: {\n width: 2\n },\n marker: {\n size: 6\n }\n };\n\n datasets.forEach((dataset: Array<number>, index: number) => {\n const traceName = hasSeries ? seriesLabels[index] : \"\";\n const trace = Object.assign({}, traceConfig, {\n r: dataset,\n theta: labels,\n name: traceName,\n text: texts[index],\n hoverinfo: \"r+theta+name\",\n customdata: labels,\n hovertemplate: \"%{theta}: %{r}\" +\n \"<extra></extra>\",\n line: {\n ...traceConfig.line,\n color: colors[index % colors.length]\n },\n marker: {\n ...traceConfig.marker,\n color: colors[index % colors.length]\n }\n });\n traces.push(trace);\n });\n\n const layout: any = {\n font: {\n family: \"Segoe UI, sans-serif\",\n size: 14,\n weight: \"normal\",\n color: \"#404040\",\n },\n polar: {\n radialaxis: {\n visible: true,\n range: [0, Math.max(...datasets.map(s => Math.max(...s))) * 1.1],\n tickfont: {\n size: 12\n }\n },\n angularaxis: {\n tickfont: {\n size: 12\n },\n ticktext: labels.map((label: string) => {\n return PlotlySetup.getTruncatedLabel(\n label,\n model.labelTruncateLength\n );\n }),\n tickvals: labels\n }\n },\n showlegend: hasSeries,\n colorway: colors,\n plot_bgcolor: model.backgroundColor,\n paper_bgcolor: model.backgroundColor,\n margin: {\n l: 50,\n r: 50,\n t: 50,\n b: 50\n }\n };\n\n return { traces, layout, hasSeries };\n }\n}\n","import { ItemValue, QuestionMatrixDropdownModel, Question, MatrixDropdownColumn, MatrixDropdownRowModelBase } from \"survey-core\";\nimport { IAnswersData, SelectBase } from \"./selectBase\";\nimport { defaultStatisticsCalculator } from \"./statisticCalculators\";\nimport { VisualizationManager } from \"./visualizationManager\";\n\nexport class MatrixDropdownGrouped extends SelectBase {\n constructor(\n question: Question,\n data: Array<{ [index: string]: any }>,\n options?: Object,\n name?: string\n ) {\n super(question, data, options, name || \"matrixDropdownGrouped\");\n }\n\n protected get matrixQuestion(): QuestionMatrixDropdownModel {\n return <QuestionMatrixDropdownModel>this.question;\n }\n\n get dataNames(): Array<string> {\n return this.matrixQuestion.columns.map(column => column.name);\n }\n\n getSeriesValues(): Array<string> {\n return this.matrixQuestion.columns.map((column: MatrixDropdownColumn) => column.name);\n }\n\n getSeriesLabels(): Array<string> {\n return this.matrixQuestion.columns.map((column: MatrixDropdownColumn) => column.title);\n }\n\n // public getSelectedItemByText(itemText: string) {\n // return this.matrixQuestion.columns.filter(\n // (column: ItemValue) => column.text === itemText\n // )[0];\n // }\n\n valuesSource(): Array<ItemValue> {\n return this.matrixQuestion.choices;\n }\n\n protected isSupportMissingAnswers(): boolean {\n return false;\n }\n\n protected getCalculatedValuesCore(): Array<any> {\n const values = this.getValues();\n const series = this.getSeriesValues();\n const rows = this.matrixQuestion.rows.map(row => row.value);\n\n const statistics = defaultStatisticsCalculator(this.surveyData, {\n name: this.name,\n dataNames: series,\n getValues: () => values,\n getLabels: () => values,\n getSeriesValues: () => rows,\n getSeriesLabels: () => rows,\n });\n\n return statistics.map(s => s[0]);\n }\n}\n\nVisualizationManager.registerVisualizer(\"matrixdropdown-grouped\", MatrixDropdownGrouped);","import { BooleanModel } from \"../boolean\";\nimport { SelectBase } from \"../selectBase\";\nimport { HistogramModel } from \"../histogram\";\nimport { Matrix } from \"../matrix\";\nimport { MatrixDropdownGrouped } from \"../matrixDropdownGrouped\";\nimport { PivotModel } from \"../pivot\";\nimport { NumberModel } from \"../number\";\nimport { RankingModel } from \"../ranking\";\n\nexport class SelectBasePlotly extends SelectBase {\n public static types = [\"bar\", \"vbar\", \"pie\", \"doughnut\"];\n public static displayModeBar: any = undefined;\n}\n\nexport class BooleanPlotly extends BooleanModel {\n public static types = [\"pie\", \"bar\", \"doughnut\"];\n}\n\nexport class HistogramPlotly extends HistogramModel {\n public static types = [\"vbar\", \"bar\"];\n}\n\nexport class MatrixPlotly extends Matrix {\n public static types = [\"bar\", \"stackedbar\", \"pie\", \"doughnut\"];\n}\n\nexport class MatrixDropdownGroupedPlotly extends MatrixDropdownGrouped {\n public static types = [\"stackedbar\", \"bar\", \"pie\", \"doughnut\"];\n}\n\nexport class PivotPlotly extends PivotModel {\n public static types = [\"vbar\", \"bar\", \"line\", \"stackedbar\", \"pie\", \"doughnut\"]; // [\"vbar\", \"bar\"];\n}\n\nexport class GaugePlotly extends NumberModel {\n public static displayModeBar: any = undefined;\n public static types = [\"gauge\", \"bullet\"];\n}\n\nexport class RankingPlotly extends RankingModel {}","import { Question, ItemValue, Event } from \"survey-core\";\nimport { SelectBase } from \"../selectBase\";\nimport { VisualizationManager } from \"../visualizationManager\";\nimport { localization } from \"../localizationManager\";\nimport Plotly from \"plotly.js-dist-min\";\nimport { PlotlySetup } from \"./setup\";\nimport { VisualizerBase, IChartAdapter } from \"../visualizerBase\";\nimport { BooleanModel } from \"../boolean\";\nimport { BooleanPlotly, GaugePlotly, HistogramPlotly, MatrixDropdownGroupedPlotly, MatrixPlotly, PivotPlotly, SelectBasePlotly } from \"./legacy\";\n\nexport const plotlyChartTypes = {\n \"boolean\": BooleanPlotly.types,\n \"number\": GaugePlotly.types,\n \"selectBase\": SelectBasePlotly.types,\n \"histogram\": HistogramPlotly.types,\n \"matrix\": MatrixPlotly.types,\n \"matrixDropdownGrouped\": MatrixDropdownGroupedPlotly.types,\n \"pivot\": PivotPlotly.types,\n \"ranking\": [].concat(SelectBasePlotly.types).concat([\"radar\"]),\n};\n\nexport class PlotlyChartAdapter implements IChartAdapter {\n private _chart: Promise<Plotly.PlotlyHTMLElement> = undefined;\n\n constructor(protected model: SelectBase | VisualizerBase) { }\n\n protected patchConfigParameters(\n chartNode: object,\n traces: Array<object>,\n layout: object,\n config: any\n ) {\n if(this.model.question.getType() === \"boolean\") {\n const colors = this.model.getColors();\n const boolColors = [\n BooleanModel.trueColor || colors[0],\n BooleanModel.falseColor || colors[1],\n ];\n if((this.model as SelectBase).showMissingAnswers) {\n boolColors.push(colors[2]);\n }\n\n const chartType = (this.model as any).chartType;\n if (chartType === \"pie\" || chartType === \"doughnut\") {\n traces.forEach((trace: any) => {\n if (!trace) return;\n if (!trace.marker) trace.marker = {};\n trace.marker.colors = boolColors;\n });\n } else if (chartType === \"bar\") {\n traces.forEach((trace: any) => {\n if (!trace) return;\n if (!trace.marker) trace.marker = {};\n trace.marker.color = boolColors;\n });\n }\n }\n if(this.model.type === \"number\") {\n config.displayModeBar = true;\n }\n }\n\n public get chart() {\n return this._chart;\n }\n\n getChartTypes(): string[] {\n const visualizerType = this.model.type;\n const chartCtypes = plotlyChartTypes[visualizerType];\n return chartCtypes || [];\n }\n\n public async create(chartNode: HTMLElement): Promise<any> {\n const [plot, plotlyOptions] = await this.update(chartNode);\n\n if(this.model instanceof SelectBase && this.model.supportSelection) {\n const _model = this.model as SelectBase;\n (<any>chartNode)[\"on\"](\"plotly_click\", (data: any) => {\n if (data.points.length > 0) {\n let itemText = \"\";\n if (!plotlyOptions.hasSeries) {\n itemText = Array.isArray(data.points[0].customdata)\n ? data.points[0].customdata[0]\n : data.points[0].customdata;\n const item: ItemValue = _model.getSelectedItemByText(itemText);\n _model.setSelection(item);\n } else {\n itemText = data.points[0].data.name;\n const propertyLabel = data.points[0].label;\n const seriesValues = this.model.getSeriesValues();\n const seriesLabels = this.model.getSeriesLabels();\n const propertyValue = seriesValues[seriesLabels.indexOf(propertyLabel)];\n const selectedItem: ItemValue = _model.getSelectedItemByText(itemText);\n const item = new ItemValue({ [propertyValue]: selectedItem.value }, propertyLabel + \": \" + selectedItem.text);\n _model.setSelection(item);\n }\n\n // const itemText = plotlyOptions.hasSeries\n // ? data.points[0].data.name\n // : Array.isArray(data.points[0].customdata)\n // ? data.points[0].customdata[0]\n // : data.points[0].customdata;\n // const item: ItemValue = this.model.getSelectedItemByText(itemText);\n // this.model.setSelection(item);\n }\n });\n }\n\n var getDragLayer = () =>\n <HTMLElement>chartNode.getElementsByClassName(\"nsewdrag\")[0];\n (<any>chartNode)[\"on\"](\"plotly_hover\", () => {\n const dragLayer = getDragLayer();\n dragLayer && (dragLayer.style.cursor = \"pointer\");\n });\n (<any>chartNode)[\"on\"](\"plotly_unhover\", () => {\n const dragLayer = getDragLayer();\n dragLayer && (dragLayer.style.cursor = \"\");\n });\n\n // setTimeout(() => Plotly.Plots.resize(chartNode), 10);\n this._chart = plot;\n return plot;\n }\n\n public async update(chartNode: HTMLElement): Promise<any> {\n const answersData = (this.model instanceof SelectBase) ? await this.model.getAnswersData() : await this.model.getCalculatedValues();\n var plotlyOptions = PlotlySetup.setup((this.model as any).chartType, this.model, answersData as any);\n\n let config: any = {\n displaylogo: false,\n responsive: true,\n locale: localization.currentLocale,\n modeBarButtonsToRemove: [\"toImage\"],\n modeBarButtonsToAdd: [\n {\n name: \"toImageSjs\",\n title: localization.getString(\"saveDiagramAsPNG\"),\n icon: (<any>Plotly).Icons.camera,\n click: (gd: any) => {\n let options = {\n format: PlotlySetup.imageExportFormat,\n // width: 800,\n // height: 600,\n filename: this.model.question.name,\n };\n PlotlySetup.onImageSaving.fire(this.model, options);\n (<any>Plotly).downloadImage(gd, options);\n },\n },\n ],\n };\n if (SelectBasePlotly.displayModeBar !== undefined) {\n config.displayModeBar = SelectBasePlotly.displayModeBar;\n }\n\n this.patchConfigParameters(\n chartNode,\n plotlyOptions.traces,\n plotlyOptions.layout,\n config\n );\n\n let options = {\n traces: plotlyOptions.traces,\n layout: plotlyOptions.layout,\n data: answersData,\n config: config,\n };\n PlotlySetup.onPlotCreating.fire(this.model, options);\n\n const plot = (<any>Plotly).react(\n chartNode,\n options.traces,\n options.layout,\n options.config\n );\n\n return [plot, plotlyOptions];\n }\n\n public destroy(node: HTMLElement) {\n if(!!node) {\n (<any>Plotly).purge(node);\n }\n this._chart = undefined;\n }\n}\n\nVisualizerBase.chartAdapterType = PlotlyChartAdapter;\n"],"names":[],"mappings":"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