survey-analytics 2.3.0 → 2.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/fesm/shared.mjs +83 -1
  2. package/fesm/shared.mjs.map +1 -1
  3. package/fesm/shared2.mjs +40 -17
  4. package/fesm/shared2.mjs.map +1 -1
  5. package/fesm/survey.analytics.core.mjs +1 -1
  6. package/fesm/survey.analytics.mjs +1 -1
  7. package/fesm/survey.analytics.tabulator.mjs +47 -4
  8. package/fesm/survey.analytics.tabulator.mjs.map +1 -1
  9. package/package.json +3 -3
  10. package/survey-analytics-tabulator.types/analytics-localization/swedish.d.ts +79 -0
  11. package/survey-analytics-tabulator.types/entries/tabulator.d.ts +1 -0
  12. package/survey-analytics-tabulator.types/tables/columnbuilder.d.ts +7 -1
  13. package/survey-analytics-tabulator.types/tables/columns.d.ts +10 -1
  14. package/survey-analytics.types/analytics-localization/swedish.d.ts +79 -0
  15. package/survey-analytics.types/entries/summary.core.d.ts +1 -0
  16. package/survey-analytics.types/visualizerBase.d.ts +11 -4
  17. package/survey.analytics.core.css +1 -1
  18. package/survey.analytics.core.js +193 -70
  19. package/survey.analytics.core.js.map +1 -1
  20. package/survey.analytics.core.min.css +1 -1
  21. package/survey.analytics.core.min.js +1 -1
  22. package/survey.analytics.core.min.js.LICENSE.txt +1 -1
  23. package/survey.analytics.css +1 -1
  24. package/survey.analytics.js +193 -70
  25. package/survey.analytics.js.map +1 -1
  26. package/survey.analytics.min.css +1 -1
  27. package/survey.analytics.min.js +1 -1
  28. package/survey.analytics.min.js.LICENSE.txt +1 -1
  29. package/survey.analytics.tabulator.css +1 -1
  30. package/survey.analytics.tabulator.js +213 -23
  31. package/survey.analytics.tabulator.js.map +1 -1
  32. package/survey.analytics.tabulator.min.css +1 -1
  33. package/survey.analytics.tabulator.min.js +1 -1
  34. package/survey.analytics.tabulator.min.js.LICENSE.txt +1 -1
package/fesm/shared2.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * surveyjs - SurveyJS Dashboard library v2.3.0
2
+ * surveyjs - SurveyJS Dashboard library v2.3.1
3
3
  * Copyright (c) 2015-2025 Devsoft Baltic OÜ - http://surveyjs.io/
4
4
  * License: MIT (http://www.opensource.org/licenses/mit-license.php)
5
5
  */
@@ -317,17 +317,24 @@ function defaultStatisticsCalculator(data, dataInfo) {
317
317
  }
318
318
  statistics.push(dataNameStatistics);
319
319
  }
320
+ const getValueIndex = (val) => {
321
+ if (val !== null && typeof val === "object")
322
+ return valuesIndex[val.value];
323
+ return valuesIndex[val];
324
+ };
320
325
  data.forEach((row) => {
321
326
  dataNames.forEach((dataName, index) => {
322
327
  const rowValue = row[dataName];
323
328
  if (rowValue !== undefined || processMissingAnswers) {
324
329
  const rowValues = Array.isArray(rowValue) ? rowValue : [rowValue];
325
330
  if (series.length > 0) {
326
- if (row[DataProvider.seriesMarkerKey] !== undefined) {
331
+ const rowName = row[DataProvider.seriesMarkerKey];
332
+ if (rowName !== undefined) {
327
333
  // Series are labelled by seriesMarkerKey in row data
328
- const seriesNo = seriesIndex[row[DataProvider.seriesMarkerKey]] || 0;
334
+ const seriesNo = seriesIndex[rowName] || 0;
329
335
  rowValues.forEach((val) => {
330
- statistics[index][seriesNo][valuesIndex[val]]++;
336
+ const valIndex = getValueIndex(val);
337
+ statistics[index][seriesNo][valIndex]++;
331
338
  });
332
339
  }
333
340
  else {
@@ -337,7 +344,11 @@ function defaultStatisticsCalculator(data, dataInfo) {
337
344
  series.forEach((seriesName) => {
338
345
  if (val[seriesName] !== undefined) {
339
346
  const seriesNo = seriesIndex[seriesName] || 0;
340
- statistics[index][seriesNo][valuesIndex[val[seriesName]]]++;
347
+ const values = Array.isArray(val[seriesName]) ? val[seriesName] : [val[seriesName]];
348
+ values.forEach(value => {
349
+ const valIndex = getValueIndex(value);
350
+ statistics[index][seriesNo][valIndex]++;
351
+ });
341
352
  }
342
353
  });
343
354
  });
@@ -345,7 +356,10 @@ function defaultStatisticsCalculator(data, dataInfo) {
345
356
  }
346
357
  else {
347
358
  // No series
348
- rowValues.forEach((val) => statistics[0][0][valuesIndex[val]]++);
359
+ rowValues.forEach((val) => {
360
+ const valIndex = getValueIndex(val);
361
+ statistics[0][0][valIndex]++;
362
+ });
349
363
  }
350
364
  }
351
365
  });
@@ -439,6 +453,9 @@ class VisualizerBase {
439
453
  }
440
454
  this.onStateChanged.fire(this, this.getState());
441
455
  }
456
+ getToolbarItemCreators() {
457
+ return Object.assign({}, this.toolbarItemCreators, this.onGetToolbarItemCreators && this.onGetToolbarItemCreators() || {});
458
+ }
442
459
  constructor(question, data, options = {}, _type) {
443
460
  var _a;
444
461
  this.question = question;
@@ -645,8 +662,8 @@ class VisualizerBase {
645
662
  * @param creator A function that accepts the toolbar and should return an `HTMLElement` with the toolbar item.
646
663
  * @see unregisterToolbarItem
647
664
  */
648
- registerToolbarItem(name, creator) {
649
- this.toolbarItemCreators[name] = creator;
665
+ registerToolbarItem(name, creator, order = 100) {
666
+ this.toolbarItemCreators[name] = { creator, order };
650
667
  }
651
668
  /**
652
669
  *
@@ -657,9 +674,9 @@ class VisualizerBase {
657
674
  */
658
675
  unregisterToolbarItem(name) {
659
676
  if (this.toolbarItemCreators[name] !== undefined) {
660
- const creator = this.toolbarItemCreators[name];
677
+ const item = this.toolbarItemCreators[name];
661
678
  delete this.toolbarItemCreators[name];
662
- return creator;
679
+ return item.creator;
663
680
  }
664
681
  return undefined;
665
682
  }
@@ -741,8 +758,12 @@ class VisualizerBase {
741
758
  }
742
759
  }
743
760
  createToolbarItems(toolbar) {
744
- Object.keys(this.toolbarItemCreators || {}).forEach((toolbarItemName) => {
745
- let toolbarItem = this.toolbarItemCreators[toolbarItemName](toolbar);
761
+ const toolbarItemCreators = this.getToolbarItemCreators();
762
+ const sortedItems = Object.keys(toolbarItemCreators || {})
763
+ .map(name => (Object.assign({ name }, toolbarItemCreators[name])))
764
+ .sort((a, b) => a.order - b.order);
765
+ sortedItems.forEach((item) => {
766
+ let toolbarItem = item.creator(toolbar);
746
767
  if (!!toolbarItem) {
747
768
  toolbar.appendChild(toolbarItem);
748
769
  }
@@ -1377,7 +1398,7 @@ class SelectBase extends VisualizerBase {
1377
1398
  this.updateEmptyAnswersBtn();
1378
1399
  }
1379
1400
  return this.emptyAnswersBtn;
1380
- });
1401
+ }, 1000);
1381
1402
  this.registerToolbarItem("topNAnswers", () => {
1382
1403
  if (this.options.allowTopNAnswers &&
1383
1404
  this.getSeriesValues().length === 0) {
@@ -2552,12 +2573,14 @@ class AlternativeVisualizersWrapper extends VisualizerBase {
2552
2573
  * The event is fired right after AlternativeVisualizersWrapper content type has been changed.
2553
2574
  **/
2554
2575
  this.onVisualizerChanged = new Event();
2576
+ this.showToolbar = false;
2555
2577
  this.loadingData = false;
2556
2578
  if (!visualizers || visualizers.length < 2) {
2557
2579
  throw new Error("VisualizerArrayWrapper works with visualizers collection only.");
2558
2580
  }
2559
2581
  this.visualizers.forEach((visualizer) => {
2560
2582
  visualizer.onUpdate = () => this.invokeOnUpdate();
2583
+ visualizer.onGetToolbarItemCreators = () => this.toolbarItemCreators;
2561
2584
  if (visualizer.supportSelection) {
2562
2585
  this._supportSelection = true;
2563
2586
  this.visualizersWithSelection.push(visualizer);
@@ -2568,7 +2591,7 @@ class AlternativeVisualizersWrapper extends VisualizerBase {
2568
2591
  value: visualizer.type,
2569
2592
  text: localization.getString("visualizer_" + visualizer.type),
2570
2593
  };
2571
- }), (option) => this.visualizer.type === option.value, (e) => this.setVisualizer(e.target.value)));
2594
+ }), (option) => this.visualizer.type === option.value, (e) => this.setVisualizer(e.target.value)), 0);
2572
2595
  this.visualizer = visualizers[0];
2573
2596
  this.visualizer.onAfterRender.add(this.onAfterVisualizerRenderCallback);
2574
2597
  this.visualizer.onStateChanged.add(this.onVisualizerStateChangedCallback);
@@ -9771,7 +9794,7 @@ class VisualizationPanel extends VisualizerBase {
9771
9794
  }
9772
9795
  });
9773
9796
  }, localization.getString("resetFilter"));
9774
- });
9797
+ }, 900);
9775
9798
  this.registerToolbarItem("addElement", (toolbar) => {
9776
9799
  if (this.allowHideQuestions) {
9777
9800
  let addElementSelector = undefined;
@@ -9944,7 +9967,7 @@ class VisualizationPanel extends VisualizerBase {
9944
9967
  return DocumentHelper.createButton(() => {
9945
9968
  setTimeout(() => this.hideElement(question.name), 0);
9946
9969
  }, localization.getString("hideButton"));
9947
- });
9970
+ }, 1000);
9948
9971
  }
9949
9972
  if (this.allowMakeQuestionsPrivate) {
9950
9973
  visualizer.registerToolbarItem("makePrivatePublic", () => {
@@ -9969,7 +9992,7 @@ class VisualizationPanel extends VisualizerBase {
9969
9992
  visualizer.registerToolbarItem("questionFilterInfo", () => {
9970
9993
  filterInfo.update(visualizerWithSelection.selection);
9971
9994
  return filterInfo.htmlElement;
9972
- });
9995
+ }, 900);
9973
9996
  visualizerWithSelection.onDataItemSelected = (selectedValue, selectedText) => {
9974
9997
  filterInfo.update({ value: selectedValue, text: selectedText });
9975
9998
  this.setFilter(question.name, selectedValue);