@devtable/dashboard 1.20.0 → 1.24.0

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.
@@ -36,7 +36,7 @@ var __publicField = (obj, key, value) => {
36
36
  import React from "react";
37
37
  import _ from "lodash";
38
38
  import RGL, { WidthProvider } from "react-grid-layout";
39
- import { Popover, Tooltip, Group, Text, ActionIcon, Box, Button, TextInput, LoadingOverlay, Table, Select, useMantineTheme, ColorSwatch, Switch, SegmentedControl, NumberInput, Slider, ColorInput, Accordion, JsonInput, Modal, AppShell, Tabs, Menu, Divider, Container, Textarea } from "@mantine/core";
39
+ import { Popover, Tooltip, Group, Text, ActionIcon, Box, Button, TextInput, LoadingOverlay, Table, Select, useMantineTheme, ColorSwatch, Switch, Slider, SegmentedControl, NumberInput, Accordion, ColorInput, Divider, JsonInput, Modal, AppShell, Tabs, Menu, Container, Textarea } from "@mantine/core";
40
40
  import { useRequest } from "ahooks";
41
41
  import axios from "axios";
42
42
  import { InfoCircle, DeviceFloppy, Refresh, Trash, PlaylistAdd, Settings, Resize, Paint, PlayerPlay, Database, Recycle, Share } from "tabler-icons-react";
@@ -44,7 +44,7 @@ import RichTextEditor, { RichTextEditor as RichTextEditor$1 } from "@mantine/rte
44
44
  import { useInputState, useElementSize, randomId } from "@mantine/hooks";
45
45
  import ReactEChartsCore from "echarts-for-react/lib/core";
46
46
  import * as echarts from "echarts/core";
47
- import { SunburstChart, BarChart, LineChart, PieChart } from "echarts/charts";
47
+ import { SunburstChart, BarChart, LineChart, ScatterChart, PieChart } from "echarts/charts";
48
48
  import { CanvasRenderer } from "echarts/renderers";
49
49
  import { GridComponent, LegendComponent, TooltipComponent, VisualMapComponent } from "echarts/components";
50
50
  import numbro from "numbro";
@@ -109,20 +109,20 @@ function explainSQL(sql, context, definitions) {
109
109
  const APIClient = {
110
110
  baseURL: "http://localhost:31200",
111
111
  getRequest(method) {
112
- return (url, data, options = {}) => {
112
+ return (url, data, options2 = {}) => {
113
113
  const headers = __spreadValues({
114
114
  "X-Requested-With": "XMLHttpRequest",
115
- "Content-Type": options.string ? "application/x-www-form-urlencoded" : "application/json"
116
- }, options.headers);
115
+ "Content-Type": options2.string ? "application/x-www-form-urlencoded" : "application/json"
116
+ }, options2.headers);
117
117
  const conf = {
118
118
  baseURL: this.baseURL,
119
119
  method,
120
120
  url,
121
- params: method === "GET" ? data : options.params,
121
+ params: method === "GET" ? data : options2.params,
122
122
  headers
123
123
  };
124
124
  if (method === "POST") {
125
- conf.data = options.string ? JSON.stringify(data) : data;
125
+ conf.data = options2.string ? JSON.stringify(data) : data;
126
126
  }
127
127
  return axios(conf).then((res) => {
128
128
  return res.data;
@@ -196,6 +196,7 @@ const initialContext = {
196
196
  }
197
197
  };
198
198
  const DefinitionContext = React.createContext(initialContext);
199
+ var commonjsGlobal = typeof globalThis !== "undefined" ? globalThis : typeof window !== "undefined" ? window : typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : {};
199
200
  var jsxRuntime = { exports: {} };
200
201
  var reactJsxRuntime_production_min = {};
201
202
  /**
@@ -590,7 +591,7 @@ function PickQuery({}) {
590
591
  data,
591
592
  loading
592
593
  } = React.useContext(PanelContext);
593
- const options = React.useMemo(() => {
594
+ const options2 = React.useMemo(() => {
594
595
  return queries.map((d) => ({
595
596
  value: d.id,
596
597
  label: d.id
@@ -609,7 +610,7 @@ function PickQuery({}) {
609
610
  children: [/* @__PURE__ */ jsx(Text, {
610
611
  children: "Select a Query"
611
612
  }), /* @__PURE__ */ jsx(Select, {
612
- data: options,
613
+ data: options2,
613
614
  value: queryID,
614
615
  onChange: setQueryID,
615
616
  allowDeselect: false,
@@ -688,7 +689,1307 @@ function Sunbrust({
688
689
  }
689
690
  });
690
691
  }
691
- echarts.use([BarChart, LineChart, GridComponent, LegendComponent, TooltipComponent, CanvasRenderer]);
692
+ var ecStat = { exports: {} };
693
+ (function(module, exports) {
694
+ (function webpackUniversalModuleDefinition(root, factory) {
695
+ module.exports = factory();
696
+ })(commonjsGlobal, function() {
697
+ return function(modules) {
698
+ var installedModules = {};
699
+ function __webpack_require__(moduleId) {
700
+ if (installedModules[moduleId])
701
+ return installedModules[moduleId].exports;
702
+ var module2 = installedModules[moduleId] = {
703
+ exports: {},
704
+ id: moduleId,
705
+ loaded: false
706
+ };
707
+ modules[moduleId].call(module2.exports, module2, module2.exports, __webpack_require__);
708
+ module2.loaded = true;
709
+ return module2.exports;
710
+ }
711
+ __webpack_require__.m = modules;
712
+ __webpack_require__.c = installedModules;
713
+ __webpack_require__.p = "";
714
+ return __webpack_require__(0);
715
+ }([
716
+ function(module2, exports2, __webpack_require__) {
717
+ var __WEBPACK_AMD_DEFINE_RESULT__;
718
+ !(__WEBPACK_AMD_DEFINE_RESULT__ = function(require2) {
719
+ return {
720
+ clustering: __webpack_require__(1),
721
+ regression: __webpack_require__(5),
722
+ statistics: __webpack_require__(6),
723
+ histogram: __webpack_require__(15),
724
+ transform: {
725
+ regression: __webpack_require__(18),
726
+ histogram: __webpack_require__(21),
727
+ clustering: __webpack_require__(22)
728
+ }
729
+ };
730
+ }.call(exports2, __webpack_require__, exports2, module2), __WEBPACK_AMD_DEFINE_RESULT__ !== void 0 && (module2.exports = __WEBPACK_AMD_DEFINE_RESULT__));
731
+ },
732
+ function(module2, exports2, __webpack_require__) {
733
+ var __WEBPACK_AMD_DEFINE_RESULT__;
734
+ !(__WEBPACK_AMD_DEFINE_RESULT__ = function(require2) {
735
+ var dataProcess = __webpack_require__(2);
736
+ var dataPreprocess = dataProcess.dataPreprocess;
737
+ var normalizeDimensions = dataProcess.normalizeDimensions;
738
+ var arrayUtil = __webpack_require__(3);
739
+ var numberUtil = __webpack_require__(4);
740
+ var arraySize = arrayUtil.size;
741
+ var sumOfColumn = arrayUtil.sumOfColumn;
742
+ var arraySum = arrayUtil.sum;
743
+ var zeros = arrayUtil.zeros;
744
+ var numberUtil = __webpack_require__(4);
745
+ var isNumber = numberUtil.isNumber;
746
+ var mathPow = Math.pow;
747
+ var OutputType = {
748
+ SINGLE: "single",
749
+ MULTIPLE: "multiple"
750
+ };
751
+ function kMeans(data, k2, dataMeta) {
752
+ var clusterAssigned = zeros(data.length, 2);
753
+ var centroids = createRandCent(k2, calcExtents(data, dataMeta.dimensions));
754
+ var clusterChanged = true;
755
+ var minDist;
756
+ var minIndex;
757
+ var distIJ;
758
+ var ptsInClust;
759
+ while (clusterChanged) {
760
+ clusterChanged = false;
761
+ for (var i = 0; i < data.length; i++) {
762
+ minDist = Infinity;
763
+ minIndex = -1;
764
+ for (var j = 0; j < k2; j++) {
765
+ distIJ = distEuclid(data[i], centroids[j], dataMeta);
766
+ if (distIJ < minDist) {
767
+ minDist = distIJ;
768
+ minIndex = j;
769
+ }
770
+ }
771
+ if (clusterAssigned[i][0] !== minIndex) {
772
+ clusterChanged = true;
773
+ }
774
+ clusterAssigned[i][0] = minIndex;
775
+ clusterAssigned[i][1] = minDist;
776
+ }
777
+ for (var i = 0; i < k2; i++) {
778
+ ptsInClust = [];
779
+ for (var j = 0; j < clusterAssigned.length; j++) {
780
+ if (clusterAssigned[j][0] === i) {
781
+ ptsInClust.push(data[j]);
782
+ }
783
+ }
784
+ centroids[i] = meanInColumns(ptsInClust, dataMeta);
785
+ }
786
+ }
787
+ var clusterWithKmeans = {
788
+ centroids,
789
+ clusterAssigned
790
+ };
791
+ return clusterWithKmeans;
792
+ }
793
+ function meanInColumns(dataList, dataMeta) {
794
+ var meanArray = [];
795
+ var sum;
796
+ var mean;
797
+ for (var j = 0; j < dataMeta.dimensions.length; j++) {
798
+ var dimIdx = dataMeta.dimensions[j];
799
+ sum = 0;
800
+ for (var i = 0; i < dataList.length; i++) {
801
+ sum += dataList[i][dimIdx];
802
+ }
803
+ mean = sum / dataList.length;
804
+ meanArray.push(mean);
805
+ }
806
+ return meanArray;
807
+ }
808
+ function hierarchicalKMeans(data, clusterCountOrConfig, stepByStep) {
809
+ var config = (isNumber(clusterCountOrConfig) ? { clusterCount: clusterCountOrConfig, stepByStep } : clusterCountOrConfig) || { clusterCount: 2 };
810
+ var k2 = config.clusterCount;
811
+ if (k2 < 2) {
812
+ return;
813
+ }
814
+ var dataMeta = parseDataMeta(data, config);
815
+ var isOutputTypeSingle = dataMeta.outputType === OutputType.SINGLE;
816
+ var dataSet = dataPreprocess(data, { dimensions: dataMeta.dimensions });
817
+ var clusterAssment = zeros(dataSet.length, 2);
818
+ var outputSingleData;
819
+ var setClusterIndex;
820
+ var getClusterIndex;
821
+ function setDistance(dataIndex, dist2) {
822
+ clusterAssment[dataIndex][1] = dist2;
823
+ }
824
+ function getDistance(dataIndex) {
825
+ return clusterAssment[dataIndex][1];
826
+ }
827
+ if (isOutputTypeSingle) {
828
+ outputSingleData = [];
829
+ var outputClusterIndexDimension = dataMeta.outputClusterIndexDimension;
830
+ setClusterIndex = function(dataIndex, clusterIndex) {
831
+ outputSingleData[dataIndex][outputClusterIndexDimension] = clusterIndex;
832
+ };
833
+ getClusterIndex = function(dataIndex) {
834
+ return outputSingleData[dataIndex][outputClusterIndexDimension];
835
+ };
836
+ for (var i = 0; i < dataSet.length; i++) {
837
+ outputSingleData.push(dataSet[i].slice());
838
+ setDistance(i, 0);
839
+ setClusterIndex(i, 0);
840
+ }
841
+ } else {
842
+ setClusterIndex = function(dataIndex, clusterIndex) {
843
+ clusterAssment[dataIndex][0] = clusterIndex;
844
+ };
845
+ getClusterIndex = function(dataIndex) {
846
+ return clusterAssment[dataIndex][0];
847
+ };
848
+ }
849
+ var centroid0 = meanInColumns(dataSet, dataMeta);
850
+ var centList = [centroid0];
851
+ for (var i = 0; i < dataSet.length; i++) {
852
+ var dist = distEuclid(dataSet[i], centroid0, dataMeta);
853
+ setDistance(i, dist);
854
+ }
855
+ var lowestSSE;
856
+ var ptsInClust;
857
+ var ptsNotClust;
858
+ var clusterInfo;
859
+ var sseSplit;
860
+ var sseNotSplit;
861
+ var index2 = 1;
862
+ var result = {
863
+ data: outputSingleData,
864
+ centroids: centList,
865
+ isEnd: false
866
+ };
867
+ if (!isOutputTypeSingle) {
868
+ result.clusterAssment = clusterAssment;
869
+ }
870
+ function oneStep() {
871
+ if (index2 < k2) {
872
+ lowestSSE = Infinity;
873
+ var centSplit;
874
+ var newCentroid;
875
+ var newClusterAss;
876
+ for (var j = 0; j < centList.length; j++) {
877
+ ptsInClust = [];
878
+ ptsNotClust = [];
879
+ for (var i2 = 0; i2 < dataSet.length; i2++) {
880
+ if (getClusterIndex(i2) === j) {
881
+ ptsInClust.push(dataSet[i2]);
882
+ } else {
883
+ ptsNotClust.push(getDistance(i2));
884
+ }
885
+ }
886
+ clusterInfo = kMeans(ptsInClust, 2, dataMeta);
887
+ sseSplit = sumOfColumn(clusterInfo.clusterAssigned, 1);
888
+ sseNotSplit = arraySum(ptsNotClust);
889
+ if (sseSplit + sseNotSplit < lowestSSE) {
890
+ lowestSSE = sseNotSplit + sseSplit;
891
+ centSplit = j;
892
+ newCentroid = clusterInfo.centroids;
893
+ newClusterAss = clusterInfo.clusterAssigned;
894
+ }
895
+ }
896
+ for (var i2 = 0; i2 < newClusterAss.length; i2++) {
897
+ if (newClusterAss[i2][0] === 0) {
898
+ newClusterAss[i2][0] = centSplit;
899
+ } else if (newClusterAss[i2][0] === 1) {
900
+ newClusterAss[i2][0] = centList.length;
901
+ }
902
+ }
903
+ centList[centSplit] = newCentroid[0];
904
+ centList.push(newCentroid[1]);
905
+ for (var i2 = 0, j = 0; i2 < dataSet.length && j < newClusterAss.length; i2++) {
906
+ if (getClusterIndex(i2) === centSplit) {
907
+ setClusterIndex(i2, newClusterAss[j][0]);
908
+ setDistance(i2, newClusterAss[j++][1]);
909
+ }
910
+ }
911
+ var pointInClust = [];
912
+ if (!isOutputTypeSingle) {
913
+ for (var i2 = 0; i2 < centList.length; i2++) {
914
+ pointInClust[i2] = [];
915
+ for (var j = 0; j < dataSet.length; j++) {
916
+ if (getClusterIndex(j) === i2) {
917
+ pointInClust[i2].push(dataSet[j]);
918
+ }
919
+ }
920
+ }
921
+ result.pointsInCluster = pointInClust;
922
+ }
923
+ index2++;
924
+ } else {
925
+ result.isEnd = true;
926
+ }
927
+ }
928
+ if (!config.stepByStep) {
929
+ while (oneStep(), !result.isEnd)
930
+ ;
931
+ } else {
932
+ result.next = function() {
933
+ oneStep();
934
+ setCentroidToResultData(result, dataMeta);
935
+ return result;
936
+ };
937
+ }
938
+ setCentroidToResultData(result, dataMeta);
939
+ return result;
940
+ }
941
+ function setCentroidToResultData(result, dataMeta) {
942
+ var outputCentroidDimensions = dataMeta.outputCentroidDimensions;
943
+ if (dataMeta.outputType !== OutputType.SINGLE || outputCentroidDimensions == null) {
944
+ return;
945
+ }
946
+ var outputSingleData = result.data;
947
+ var centroids = result.centroids;
948
+ for (var i = 0; i < outputSingleData.length; i++) {
949
+ var line = outputSingleData[i];
950
+ var clusterIndex = line[dataMeta.outputClusterIndexDimension];
951
+ var centroid = centroids[clusterIndex];
952
+ var dimLen = Math.min(centroid.length, outputCentroidDimensions.length);
953
+ for (var j = 0; j < dimLen; j++) {
954
+ line[outputCentroidDimensions[j]] = centroid[j];
955
+ }
956
+ }
957
+ }
958
+ function createRandCent(k2, extents) {
959
+ var centroids = zeros(k2, extents.length);
960
+ for (var j = 0; j < extents.length; j++) {
961
+ var extentItem = extents[j];
962
+ for (var i = 0; i < k2; i++) {
963
+ centroids[i][j] = extentItem.min + extentItem.span * Math.random();
964
+ }
965
+ }
966
+ return centroids;
967
+ }
968
+ function distEuclid(dataItem, centroid, dataMeta) {
969
+ var powerSum = 0;
970
+ var dimensions = dataMeta.dimensions;
971
+ var extents = dataMeta.rawExtents;
972
+ for (var i = 0; i < dimensions.length; i++) {
973
+ var span = extents[i].span;
974
+ if (span) {
975
+ var dimIdx = dimensions[i];
976
+ var dist = (dataItem[dimIdx] - centroid[i]) / span;
977
+ powerSum += mathPow(dist, 2);
978
+ }
979
+ }
980
+ return powerSum;
981
+ }
982
+ function parseDataMeta(dataSet, config) {
983
+ var size = arraySize(dataSet);
984
+ if (size.length < 1) {
985
+ throw new Error("The input data of clustering should be two-dimension array.");
986
+ }
987
+ var colCount = size[1];
988
+ var defaultDimensions = [];
989
+ for (var i = 0; i < colCount; i++) {
990
+ defaultDimensions.push(i);
991
+ }
992
+ var dimensions = normalizeDimensions(config.dimensions, defaultDimensions);
993
+ var outputType = config.outputType || OutputType.MULTIPLE;
994
+ var outputClusterIndexDimension = config.outputClusterIndexDimension;
995
+ if (outputType === OutputType.SINGLE && !numberUtil.isNumber(outputClusterIndexDimension)) {
996
+ throw new Error("outputClusterIndexDimension is required as a number.");
997
+ }
998
+ var extents = calcExtents(dataSet, dimensions);
999
+ return {
1000
+ dimensions,
1001
+ rawExtents: extents,
1002
+ outputType,
1003
+ outputClusterIndexDimension,
1004
+ outputCentroidDimensions: config.outputCentroidDimensions
1005
+ };
1006
+ }
1007
+ function calcExtents(dataSet, dimensions) {
1008
+ var extents = [];
1009
+ var dimLen = dimensions.length;
1010
+ for (var i = 0; i < dimLen; i++) {
1011
+ extents.push({ min: Infinity, max: -Infinity });
1012
+ }
1013
+ for (var i = 0; i < dataSet.length; i++) {
1014
+ var line = dataSet[i];
1015
+ for (var j = 0; j < dimLen; j++) {
1016
+ var extentItem = extents[j];
1017
+ var val = line[dimensions[j]];
1018
+ extentItem.min > val && (extentItem.min = val);
1019
+ extentItem.max < val && (extentItem.max = val);
1020
+ }
1021
+ }
1022
+ for (var i = 0; i < dimLen; i++) {
1023
+ extents[i].span = extents[i].max - extents[i].min;
1024
+ }
1025
+ return extents;
1026
+ }
1027
+ return {
1028
+ OutputType,
1029
+ hierarchicalKMeans
1030
+ };
1031
+ }.call(exports2, __webpack_require__, exports2, module2), __WEBPACK_AMD_DEFINE_RESULT__ !== void 0 && (module2.exports = __WEBPACK_AMD_DEFINE_RESULT__));
1032
+ },
1033
+ function(module2, exports2, __webpack_require__) {
1034
+ var __WEBPACK_AMD_DEFINE_RESULT__;
1035
+ !(__WEBPACK_AMD_DEFINE_RESULT__ = function(require2) {
1036
+ var array = __webpack_require__(3);
1037
+ var isArray = array.isArray;
1038
+ var size = array.size;
1039
+ var number2 = __webpack_require__(4);
1040
+ var isNumber = number2.isNumber;
1041
+ function normalizeDimensions(dimensions, defaultDimensions) {
1042
+ return typeof dimensions === "number" ? [dimensions] : dimensions == null ? defaultDimensions : dimensions;
1043
+ }
1044
+ function dataPreprocess(data, opt) {
1045
+ opt = opt || {};
1046
+ var dimensions = opt.dimensions;
1047
+ var numberDimensionMap = {};
1048
+ if (dimensions != null) {
1049
+ for (var i = 0; i < dimensions.length; i++) {
1050
+ numberDimensionMap[dimensions[i]] = true;
1051
+ }
1052
+ }
1053
+ var targetOneDim = opt.toOneDimensionArray ? dimensions ? dimensions[0] : 0 : null;
1054
+ function shouldBeNumberDimension(dimIdx) {
1055
+ return !dimensions || numberDimensionMap.hasOwnProperty(dimIdx);
1056
+ }
1057
+ if (!isArray(data)) {
1058
+ throw new Error("Invalid data type, you should input an array");
1059
+ }
1060
+ var predata = [];
1061
+ var arraySize = size(data);
1062
+ if (arraySize.length === 1) {
1063
+ for (var i = 0; i < arraySize[0]; i++) {
1064
+ var item = data[i];
1065
+ if (isNumber(item)) {
1066
+ predata.push(item);
1067
+ }
1068
+ }
1069
+ } else if (arraySize.length === 2) {
1070
+ for (var i = 0; i < arraySize[0]; i++) {
1071
+ var isCorrect = true;
1072
+ var item = data[i];
1073
+ for (var j = 0; j < arraySize[1]; j++) {
1074
+ if (shouldBeNumberDimension(j) && !isNumber(item[j])) {
1075
+ isCorrect = false;
1076
+ }
1077
+ }
1078
+ if (isCorrect) {
1079
+ predata.push(targetOneDim != null ? item[targetOneDim] : item);
1080
+ }
1081
+ }
1082
+ }
1083
+ return predata;
1084
+ }
1085
+ function getPrecision(val) {
1086
+ var str = val.toString();
1087
+ var dotIndex = str.indexOf(".");
1088
+ return dotIndex < 0 ? 0 : str.length - 1 - dotIndex;
1089
+ }
1090
+ return {
1091
+ normalizeDimensions,
1092
+ dataPreprocess,
1093
+ getPrecision
1094
+ };
1095
+ }.call(exports2, __webpack_require__, exports2, module2), __WEBPACK_AMD_DEFINE_RESULT__ !== void 0 && (module2.exports = __WEBPACK_AMD_DEFINE_RESULT__));
1096
+ },
1097
+ function(module2, exports2, __webpack_require__) {
1098
+ var __WEBPACK_AMD_DEFINE_RESULT__;
1099
+ !(__WEBPACK_AMD_DEFINE_RESULT__ = function(require2) {
1100
+ var objToString = Object.prototype.toString;
1101
+ var arrayProto = Array.prototype;
1102
+ var nativeMap = arrayProto.map;
1103
+ function size(data) {
1104
+ var s = [];
1105
+ while (isArray(data)) {
1106
+ s.push(data.length);
1107
+ data = data[0];
1108
+ }
1109
+ return s;
1110
+ }
1111
+ function isArray(value) {
1112
+ return objToString.call(value) === "[object Array]";
1113
+ }
1114
+ function zeros(m2, n2) {
1115
+ var zeroArray = [];
1116
+ for (var i = 0; i < m2; i++) {
1117
+ zeroArray[i] = [];
1118
+ for (var j = 0; j < n2; j++) {
1119
+ zeroArray[i][j] = 0;
1120
+ }
1121
+ }
1122
+ return zeroArray;
1123
+ }
1124
+ function sum(vector) {
1125
+ var sum2 = 0;
1126
+ for (var i = 0; i < vector.length; i++) {
1127
+ sum2 += vector[i];
1128
+ }
1129
+ return sum2;
1130
+ }
1131
+ function sumOfColumn(dataList, n2) {
1132
+ var sum2 = 0;
1133
+ for (var i = 0; i < dataList.length; i++) {
1134
+ sum2 += dataList[i][n2];
1135
+ }
1136
+ return sum2;
1137
+ }
1138
+ function ascending(a, b) {
1139
+ return a > b ? 1 : a < b ? -1 : a === b ? 0 : NaN;
1140
+ }
1141
+ function bisect(array, value, start, end) {
1142
+ if (start == null) {
1143
+ start = 0;
1144
+ }
1145
+ if (end == null) {
1146
+ end = array.length;
1147
+ }
1148
+ while (start < end) {
1149
+ var mid = Math.floor((start + end) / 2);
1150
+ var compare = ascending(array[mid], value);
1151
+ if (compare > 0) {
1152
+ end = mid;
1153
+ } else if (compare < 0) {
1154
+ start = mid + 1;
1155
+ } else {
1156
+ return mid + 1;
1157
+ }
1158
+ }
1159
+ return start;
1160
+ }
1161
+ function map(obj, cb, context) {
1162
+ if (!(obj && cb)) {
1163
+ return;
1164
+ }
1165
+ if (obj.map && obj.map === nativeMap) {
1166
+ return obj.map(cb, context);
1167
+ } else {
1168
+ var result = [];
1169
+ for (var i = 0, len = obj.length; i < len; i++) {
1170
+ result.push(cb.call(context, obj[i], i, obj));
1171
+ }
1172
+ return result;
1173
+ }
1174
+ }
1175
+ return {
1176
+ size,
1177
+ isArray,
1178
+ zeros,
1179
+ sum,
1180
+ sumOfColumn,
1181
+ ascending,
1182
+ bisect,
1183
+ map
1184
+ };
1185
+ }.call(exports2, __webpack_require__, exports2, module2), __WEBPACK_AMD_DEFINE_RESULT__ !== void 0 && (module2.exports = __WEBPACK_AMD_DEFINE_RESULT__));
1186
+ },
1187
+ function(module2, exports2, __webpack_require__) {
1188
+ var __WEBPACK_AMD_DEFINE_RESULT__;
1189
+ !(__WEBPACK_AMD_DEFINE_RESULT__ = function(require2) {
1190
+ function isNumber(value) {
1191
+ value = value === null ? NaN : +value;
1192
+ return typeof value === "number" && !isNaN(value);
1193
+ }
1194
+ function isInteger(value) {
1195
+ return isFinite(value) && value === Math.round(value);
1196
+ }
1197
+ function quantityExponent(val) {
1198
+ if (val === 0) {
1199
+ return 0;
1200
+ }
1201
+ var exp = Math.floor(Math.log(val) / Math.LN10);
1202
+ if (val / Math.pow(10, exp) >= 10) {
1203
+ exp++;
1204
+ }
1205
+ return exp;
1206
+ }
1207
+ return {
1208
+ isNumber,
1209
+ isInteger,
1210
+ quantityExponent
1211
+ };
1212
+ }.call(exports2, __webpack_require__, exports2, module2), __WEBPACK_AMD_DEFINE_RESULT__ !== void 0 && (module2.exports = __WEBPACK_AMD_DEFINE_RESULT__));
1213
+ },
1214
+ function(module2, exports2, __webpack_require__) {
1215
+ var __WEBPACK_AMD_DEFINE_RESULT__;
1216
+ !(__WEBPACK_AMD_DEFINE_RESULT__ = function(require2) {
1217
+ var dataProcess = __webpack_require__(2);
1218
+ var dataPreprocess = dataProcess.dataPreprocess;
1219
+ var normalizeDimensions = dataProcess.normalizeDimensions;
1220
+ var regreMethods = {
1221
+ linear: function(predata, opt) {
1222
+ var xDimIdx = opt.dimensions[0];
1223
+ var yDimIdx = opt.dimensions[1];
1224
+ var sumX = 0;
1225
+ var sumY = 0;
1226
+ var sumXY = 0;
1227
+ var sumXX = 0;
1228
+ var len = predata.length;
1229
+ for (var i = 0; i < len; i++) {
1230
+ var rawItem = predata[i];
1231
+ sumX += rawItem[xDimIdx];
1232
+ sumY += rawItem[yDimIdx];
1233
+ sumXY += rawItem[xDimIdx] * rawItem[yDimIdx];
1234
+ sumXX += rawItem[xDimIdx] * rawItem[xDimIdx];
1235
+ }
1236
+ var gradient = (len * sumXY - sumX * sumY) / (len * sumXX - sumX * sumX);
1237
+ var intercept = sumY / len - gradient * sumX / len;
1238
+ var result = [];
1239
+ for (var j = 0; j < predata.length; j++) {
1240
+ var rawItem = predata[j];
1241
+ var resultItem = rawItem.slice();
1242
+ resultItem[xDimIdx] = rawItem[xDimIdx];
1243
+ resultItem[yDimIdx] = gradient * rawItem[xDimIdx] + intercept;
1244
+ result.push(resultItem);
1245
+ }
1246
+ var expression = "y = " + Math.round(gradient * 100) / 100 + "x + " + Math.round(intercept * 100) / 100;
1247
+ return {
1248
+ points: result,
1249
+ parameter: {
1250
+ gradient,
1251
+ intercept
1252
+ },
1253
+ expression
1254
+ };
1255
+ },
1256
+ linearThroughOrigin: function(predata, opt) {
1257
+ var xDimIdx = opt.dimensions[0];
1258
+ var yDimIdx = opt.dimensions[1];
1259
+ var sumXX = 0;
1260
+ var sumXY = 0;
1261
+ for (var i = 0; i < predata.length; i++) {
1262
+ var rawItem = predata[i];
1263
+ sumXX += rawItem[xDimIdx] * rawItem[xDimIdx];
1264
+ sumXY += rawItem[xDimIdx] * rawItem[yDimIdx];
1265
+ }
1266
+ var gradient = sumXY / sumXX;
1267
+ var result = [];
1268
+ for (var j = 0; j < predata.length; j++) {
1269
+ var rawItem = predata[j];
1270
+ var resultItem = rawItem.slice();
1271
+ resultItem[xDimIdx] = rawItem[xDimIdx];
1272
+ resultItem[yDimIdx] = rawItem[xDimIdx] * gradient;
1273
+ result.push(resultItem);
1274
+ }
1275
+ var expression = "y = " + Math.round(gradient * 100) / 100 + "x";
1276
+ return {
1277
+ points: result,
1278
+ parameter: {
1279
+ gradient
1280
+ },
1281
+ expression
1282
+ };
1283
+ },
1284
+ exponential: function(predata, opt) {
1285
+ var xDimIdx = opt.dimensions[0];
1286
+ var yDimIdx = opt.dimensions[1];
1287
+ var sumX = 0;
1288
+ var sumY = 0;
1289
+ var sumXXY = 0;
1290
+ var sumYlny = 0;
1291
+ var sumXYlny = 0;
1292
+ var sumXY = 0;
1293
+ for (var i = 0; i < predata.length; i++) {
1294
+ var rawItem = predata[i];
1295
+ sumX += rawItem[xDimIdx];
1296
+ sumY += rawItem[yDimIdx];
1297
+ sumXY += rawItem[xDimIdx] * rawItem[yDimIdx];
1298
+ sumXXY += rawItem[xDimIdx] * rawItem[xDimIdx] * rawItem[yDimIdx];
1299
+ sumYlny += rawItem[yDimIdx] * Math.log(rawItem[yDimIdx]);
1300
+ sumXYlny += rawItem[xDimIdx] * rawItem[yDimIdx] * Math.log(rawItem[yDimIdx]);
1301
+ }
1302
+ var denominator = sumY * sumXXY - sumXY * sumXY;
1303
+ var coefficient = Math.pow(Math.E, (sumXXY * sumYlny - sumXY * sumXYlny) / denominator);
1304
+ var index2 = (sumY * sumXYlny - sumXY * sumYlny) / denominator;
1305
+ var result = [];
1306
+ for (var j = 0; j < predata.length; j++) {
1307
+ var rawItem = predata[j];
1308
+ var resultItem = rawItem.slice();
1309
+ resultItem[xDimIdx] = rawItem[xDimIdx];
1310
+ resultItem[yDimIdx] = coefficient * Math.pow(Math.E, index2 * rawItem[xDimIdx]);
1311
+ result.push(resultItem);
1312
+ }
1313
+ var expression = "y = " + Math.round(coefficient * 100) / 100 + "e^(" + Math.round(index2 * 100) / 100 + "x)";
1314
+ return {
1315
+ points: result,
1316
+ parameter: {
1317
+ coefficient,
1318
+ index: index2
1319
+ },
1320
+ expression
1321
+ };
1322
+ },
1323
+ logarithmic: function(predata, opt) {
1324
+ var xDimIdx = opt.dimensions[0];
1325
+ var yDimIdx = opt.dimensions[1];
1326
+ var sumlnx = 0;
1327
+ var sumYlnx = 0;
1328
+ var sumY = 0;
1329
+ var sumlnxlnx = 0;
1330
+ for (var i = 0; i < predata.length; i++) {
1331
+ var rawItem = predata[i];
1332
+ sumlnx += Math.log(rawItem[xDimIdx]);
1333
+ sumYlnx += rawItem[yDimIdx] * Math.log(rawItem[xDimIdx]);
1334
+ sumY += rawItem[yDimIdx];
1335
+ sumlnxlnx += Math.pow(Math.log(rawItem[xDimIdx]), 2);
1336
+ }
1337
+ var gradient = (i * sumYlnx - sumY * sumlnx) / (i * sumlnxlnx - sumlnx * sumlnx);
1338
+ var intercept = (sumY - gradient * sumlnx) / i;
1339
+ var result = [];
1340
+ for (var j = 0; j < predata.length; j++) {
1341
+ var rawItem = predata[j];
1342
+ var resultItem = rawItem.slice();
1343
+ resultItem[xDimIdx] = rawItem[xDimIdx];
1344
+ resultItem[yDimIdx] = gradient * Math.log(rawItem[xDimIdx]) + intercept;
1345
+ result.push(resultItem);
1346
+ }
1347
+ var expression = "y = " + Math.round(intercept * 100) / 100 + " + " + Math.round(gradient * 100) / 100 + "ln(x)";
1348
+ return {
1349
+ points: result,
1350
+ parameter: {
1351
+ gradient,
1352
+ intercept
1353
+ },
1354
+ expression
1355
+ };
1356
+ },
1357
+ polynomial: function(predata, opt) {
1358
+ var xDimIdx = opt.dimensions[0];
1359
+ var yDimIdx = opt.dimensions[1];
1360
+ var order = opt.order;
1361
+ if (order == null) {
1362
+ order = 2;
1363
+ }
1364
+ var coeMatrix = [];
1365
+ var lhs = [];
1366
+ var k2 = order + 1;
1367
+ for (var i = 0; i < k2; i++) {
1368
+ var sumA = 0;
1369
+ for (var n2 = 0; n2 < predata.length; n2++) {
1370
+ var rawItem = predata[n2];
1371
+ sumA += rawItem[yDimIdx] * Math.pow(rawItem[xDimIdx], i);
1372
+ }
1373
+ lhs.push(sumA);
1374
+ var temp = [];
1375
+ for (var j = 0; j < k2; j++) {
1376
+ var sumB = 0;
1377
+ for (var m2 = 0; m2 < predata.length; m2++) {
1378
+ sumB += Math.pow(predata[m2][xDimIdx], i + j);
1379
+ }
1380
+ temp.push(sumB);
1381
+ }
1382
+ coeMatrix.push(temp);
1383
+ }
1384
+ coeMatrix.push(lhs);
1385
+ var coeArray = gaussianElimination(coeMatrix, k2);
1386
+ var result = [];
1387
+ for (var i = 0; i < predata.length; i++) {
1388
+ var value = 0;
1389
+ var rawItem = predata[i];
1390
+ for (var n2 = 0; n2 < coeArray.length; n2++) {
1391
+ value += coeArray[n2] * Math.pow(rawItem[xDimIdx], n2);
1392
+ }
1393
+ var resultItem = rawItem.slice();
1394
+ resultItem[xDimIdx] = rawItem[xDimIdx];
1395
+ resultItem[yDimIdx] = value;
1396
+ result.push(resultItem);
1397
+ }
1398
+ var expression = "y = ";
1399
+ for (var i = coeArray.length - 1; i >= 0; i--) {
1400
+ if (i > 1) {
1401
+ expression += Math.round(coeArray[i] * Math.pow(10, i + 1)) / Math.pow(10, i + 1) + "x^" + i + " + ";
1402
+ } else if (i === 1) {
1403
+ expression += Math.round(coeArray[i] * 100) / 100 + "x + ";
1404
+ } else {
1405
+ expression += Math.round(coeArray[i] * 100) / 100;
1406
+ }
1407
+ }
1408
+ return {
1409
+ points: result,
1410
+ parameter: coeArray,
1411
+ expression
1412
+ };
1413
+ }
1414
+ };
1415
+ function gaussianElimination(matrix, number2) {
1416
+ for (var i = 0; i < matrix.length - 1; i++) {
1417
+ var maxColumn = i;
1418
+ for (var j = i + 1; j < matrix.length - 1; j++) {
1419
+ if (Math.abs(matrix[i][j]) > Math.abs(matrix[i][maxColumn])) {
1420
+ maxColumn = j;
1421
+ }
1422
+ }
1423
+ for (var k2 = i; k2 < matrix.length; k2++) {
1424
+ var temp = matrix[k2][i];
1425
+ matrix[k2][i] = matrix[k2][maxColumn];
1426
+ matrix[k2][maxColumn] = temp;
1427
+ }
1428
+ for (var n2 = i + 1; n2 < matrix.length - 1; n2++) {
1429
+ for (var m2 = matrix.length - 1; m2 >= i; m2--) {
1430
+ matrix[m2][n2] -= matrix[m2][i] / matrix[i][i] * matrix[i][n2];
1431
+ }
1432
+ }
1433
+ }
1434
+ var data = new Array(number2);
1435
+ var len = matrix.length - 1;
1436
+ for (var j = matrix.length - 2; j >= 0; j--) {
1437
+ var temp = 0;
1438
+ for (var i = j + 1; i < matrix.length - 1; i++) {
1439
+ temp += matrix[i][j] * data[i];
1440
+ }
1441
+ data[j] = (matrix[len][j] - temp) / matrix[j][j];
1442
+ }
1443
+ return data;
1444
+ }
1445
+ var regression = function(regreMethod, data, optOrOrder) {
1446
+ var opt = typeof optOrOrder === "number" ? { order: optOrOrder } : optOrOrder || {};
1447
+ var dimensions = normalizeDimensions(opt.dimensions, [0, 1]);
1448
+ var predata = dataPreprocess(data, { dimensions });
1449
+ var result = regreMethods[regreMethod](predata, {
1450
+ order: opt.order,
1451
+ dimensions
1452
+ });
1453
+ var xDimIdx = dimensions[0];
1454
+ result.points.sort(function(itemA, itemB) {
1455
+ return itemA[xDimIdx] - itemB[xDimIdx];
1456
+ });
1457
+ return result;
1458
+ };
1459
+ return regression;
1460
+ }.call(exports2, __webpack_require__, exports2, module2), __WEBPACK_AMD_DEFINE_RESULT__ !== void 0 && (module2.exports = __WEBPACK_AMD_DEFINE_RESULT__));
1461
+ },
1462
+ function(module2, exports2, __webpack_require__) {
1463
+ var __WEBPACK_AMD_DEFINE_RESULT__;
1464
+ !(__WEBPACK_AMD_DEFINE_RESULT__ = function(require2) {
1465
+ var statistics = {};
1466
+ statistics.max = __webpack_require__(7);
1467
+ statistics.deviation = __webpack_require__(8);
1468
+ statistics.mean = __webpack_require__(10);
1469
+ statistics.median = __webpack_require__(12);
1470
+ statistics.min = __webpack_require__(14);
1471
+ statistics.quantile = __webpack_require__(13);
1472
+ statistics.sampleVariance = __webpack_require__(9);
1473
+ statistics.sum = __webpack_require__(11);
1474
+ return statistics;
1475
+ }.call(exports2, __webpack_require__, exports2, module2), __WEBPACK_AMD_DEFINE_RESULT__ !== void 0 && (module2.exports = __WEBPACK_AMD_DEFINE_RESULT__));
1476
+ },
1477
+ function(module2, exports2, __webpack_require__) {
1478
+ var __WEBPACK_AMD_DEFINE_RESULT__;
1479
+ !(__WEBPACK_AMD_DEFINE_RESULT__ = function(require2) {
1480
+ var number2 = __webpack_require__(4);
1481
+ var isNumber = number2.isNumber;
1482
+ function max(data) {
1483
+ var maxData = -Infinity;
1484
+ for (var i = 0; i < data.length; i++) {
1485
+ if (isNumber(data[i]) && data[i] > maxData) {
1486
+ maxData = data[i];
1487
+ }
1488
+ }
1489
+ return maxData;
1490
+ }
1491
+ return max;
1492
+ }.call(exports2, __webpack_require__, exports2, module2), __WEBPACK_AMD_DEFINE_RESULT__ !== void 0 && (module2.exports = __WEBPACK_AMD_DEFINE_RESULT__));
1493
+ },
1494
+ function(module2, exports2, __webpack_require__) {
1495
+ var __WEBPACK_AMD_DEFINE_RESULT__;
1496
+ !(__WEBPACK_AMD_DEFINE_RESULT__ = function(require2) {
1497
+ var variance = __webpack_require__(9);
1498
+ return function(data) {
1499
+ var squaredDeviation = variance(data);
1500
+ return squaredDeviation ? Math.sqrt(squaredDeviation) : squaredDeviation;
1501
+ };
1502
+ }.call(exports2, __webpack_require__, exports2, module2), __WEBPACK_AMD_DEFINE_RESULT__ !== void 0 && (module2.exports = __WEBPACK_AMD_DEFINE_RESULT__));
1503
+ },
1504
+ function(module2, exports2, __webpack_require__) {
1505
+ var __WEBPACK_AMD_DEFINE_RESULT__;
1506
+ !(__WEBPACK_AMD_DEFINE_RESULT__ = function(require2) {
1507
+ var number2 = __webpack_require__(4);
1508
+ var isNumber = number2.isNumber;
1509
+ var mean = __webpack_require__(10);
1510
+ function sampleVariance(data) {
1511
+ var len = data.length;
1512
+ if (!len || len < 2) {
1513
+ return 0;
1514
+ }
1515
+ if (data.length >= 2) {
1516
+ var meanValue = mean(data);
1517
+ var sum = 0;
1518
+ var temple;
1519
+ for (var i = 0; i < data.length; i++) {
1520
+ if (isNumber(data[i])) {
1521
+ temple = data[i] - meanValue;
1522
+ sum += temple * temple;
1523
+ }
1524
+ }
1525
+ return sum / (data.length - 1);
1526
+ }
1527
+ }
1528
+ return sampleVariance;
1529
+ }.call(exports2, __webpack_require__, exports2, module2), __WEBPACK_AMD_DEFINE_RESULT__ !== void 0 && (module2.exports = __WEBPACK_AMD_DEFINE_RESULT__));
1530
+ },
1531
+ function(module2, exports2, __webpack_require__) {
1532
+ var __WEBPACK_AMD_DEFINE_RESULT__;
1533
+ !(__WEBPACK_AMD_DEFINE_RESULT__ = function(require2) {
1534
+ var sum = __webpack_require__(11);
1535
+ function mean(data) {
1536
+ var len = data.length;
1537
+ if (!len) {
1538
+ return 0;
1539
+ }
1540
+ return sum(data) / data.length;
1541
+ }
1542
+ return mean;
1543
+ }.call(exports2, __webpack_require__, exports2, module2), __WEBPACK_AMD_DEFINE_RESULT__ !== void 0 && (module2.exports = __WEBPACK_AMD_DEFINE_RESULT__));
1544
+ },
1545
+ function(module2, exports2, __webpack_require__) {
1546
+ var __WEBPACK_AMD_DEFINE_RESULT__;
1547
+ !(__WEBPACK_AMD_DEFINE_RESULT__ = function(require2) {
1548
+ var number2 = __webpack_require__(4);
1549
+ var isNumber = number2.isNumber;
1550
+ function sum(data) {
1551
+ var len = data.length;
1552
+ if (!len) {
1553
+ return 0;
1554
+ }
1555
+ var sumData = 0;
1556
+ for (var i = 0; i < len; i++) {
1557
+ if (isNumber(data[i])) {
1558
+ sumData += data[i];
1559
+ }
1560
+ }
1561
+ return sumData;
1562
+ }
1563
+ return sum;
1564
+ }.call(exports2, __webpack_require__, exports2, module2), __WEBPACK_AMD_DEFINE_RESULT__ !== void 0 && (module2.exports = __WEBPACK_AMD_DEFINE_RESULT__));
1565
+ },
1566
+ function(module2, exports2, __webpack_require__) {
1567
+ var __WEBPACK_AMD_DEFINE_RESULT__;
1568
+ !(__WEBPACK_AMD_DEFINE_RESULT__ = function(require2) {
1569
+ var quantile = __webpack_require__(13);
1570
+ function median2(data) {
1571
+ return quantile(data, 0.5);
1572
+ }
1573
+ return median2;
1574
+ }.call(exports2, __webpack_require__, exports2, module2), __WEBPACK_AMD_DEFINE_RESULT__ !== void 0 && (module2.exports = __WEBPACK_AMD_DEFINE_RESULT__));
1575
+ },
1576
+ function(module2, exports2, __webpack_require__) {
1577
+ var __WEBPACK_AMD_DEFINE_RESULT__;
1578
+ !(__WEBPACK_AMD_DEFINE_RESULT__ = function(require2) {
1579
+ return function(data, p2) {
1580
+ var len = data.length;
1581
+ if (!len) {
1582
+ return 0;
1583
+ }
1584
+ if (p2 <= 0 || len < 2) {
1585
+ return data[0];
1586
+ }
1587
+ if (p2 >= 1) {
1588
+ return data[len - 1];
1589
+ }
1590
+ var h = (len - 1) * p2;
1591
+ var i = Math.floor(h);
1592
+ var a = data[i];
1593
+ var b = data[i + 1];
1594
+ return a + (b - a) * (h - i);
1595
+ };
1596
+ }.call(exports2, __webpack_require__, exports2, module2), __WEBPACK_AMD_DEFINE_RESULT__ !== void 0 && (module2.exports = __WEBPACK_AMD_DEFINE_RESULT__));
1597
+ },
1598
+ function(module2, exports2, __webpack_require__) {
1599
+ var __WEBPACK_AMD_DEFINE_RESULT__;
1600
+ !(__WEBPACK_AMD_DEFINE_RESULT__ = function(require2) {
1601
+ var number2 = __webpack_require__(4);
1602
+ var isNumber = number2.isNumber;
1603
+ function min(data) {
1604
+ var minData = Infinity;
1605
+ for (var i = 0; i < data.length; i++) {
1606
+ if (isNumber(data[i]) && data[i] < minData) {
1607
+ minData = data[i];
1608
+ }
1609
+ }
1610
+ return minData;
1611
+ }
1612
+ return min;
1613
+ }.call(exports2, __webpack_require__, exports2, module2), __WEBPACK_AMD_DEFINE_RESULT__ !== void 0 && (module2.exports = __WEBPACK_AMD_DEFINE_RESULT__));
1614
+ },
1615
+ function(module2, exports2, __webpack_require__) {
1616
+ var __WEBPACK_AMD_DEFINE_RESULT__;
1617
+ !(__WEBPACK_AMD_DEFINE_RESULT__ = function(require2) {
1618
+ var max = __webpack_require__(7);
1619
+ var min = __webpack_require__(14);
1620
+ var quantile = __webpack_require__(13);
1621
+ var deviation = __webpack_require__(8);
1622
+ var dataProcess = __webpack_require__(2);
1623
+ var dataPreprocess = dataProcess.dataPreprocess;
1624
+ var normalizeDimensions = dataProcess.normalizeDimensions;
1625
+ var array = __webpack_require__(3);
1626
+ var ascending = array.ascending;
1627
+ var map = array.map;
1628
+ var range = __webpack_require__(16);
1629
+ var bisect = array.bisect;
1630
+ var tickStep = __webpack_require__(17);
1631
+ function computeBins(data, optOrMethod) {
1632
+ var opt = typeof optOrMethod === "string" ? { method: optOrMethod } : optOrMethod || {};
1633
+ var threshold = opt.method == null ? thresholdMethod.squareRoot : thresholdMethod[opt.method];
1634
+ var dimensions = normalizeDimensions(opt.dimensions);
1635
+ var values = dataPreprocess(data, {
1636
+ dimensions,
1637
+ toOneDimensionArray: true
1638
+ });
1639
+ var maxValue = max(values);
1640
+ var minValue = min(values);
1641
+ var binsNumber = threshold(values, minValue, maxValue);
1642
+ var tickStepResult = tickStep(minValue, maxValue, binsNumber);
1643
+ var step = tickStepResult.step;
1644
+ var toFixedPrecision = tickStepResult.toFixedPrecision;
1645
+ var rangeArray = range(+(Math.ceil(minValue / step) * step).toFixed(toFixedPrecision), +(Math.floor(maxValue / step) * step).toFixed(toFixedPrecision), step, toFixedPrecision);
1646
+ var len = rangeArray.length;
1647
+ var bins = new Array(len + 1);
1648
+ for (var i = 0; i <= len; i++) {
1649
+ bins[i] = {};
1650
+ bins[i].sample = [];
1651
+ bins[i].x0 = i > 0 ? rangeArray[i - 1] : rangeArray[i] - minValue === step ? minValue : rangeArray[i] - step;
1652
+ bins[i].x1 = i < len ? rangeArray[i] : maxValue - rangeArray[i - 1] === step ? maxValue : rangeArray[i - 1] + step;
1653
+ }
1654
+ for (var i = 0; i < values.length; i++) {
1655
+ if (minValue <= values[i] && values[i] <= maxValue) {
1656
+ bins[bisect(rangeArray, values[i], 0, len)].sample.push(values[i]);
1657
+ }
1658
+ }
1659
+ var data = map(bins, function(bin) {
1660
+ return [
1661
+ +((bin.x0 + bin.x1) / 2).toFixed(toFixedPrecision),
1662
+ bin.sample.length,
1663
+ bin.x0,
1664
+ bin.x1,
1665
+ bin.x0 + " - " + bin.x1
1666
+ ];
1667
+ });
1668
+ var customData = map(bins, function(bin) {
1669
+ return [bin.x0, bin.x1, bin.sample.length];
1670
+ });
1671
+ return {
1672
+ bins,
1673
+ data,
1674
+ customData
1675
+ };
1676
+ }
1677
+ var thresholdMethod = {
1678
+ squareRoot: function(data) {
1679
+ var bins = Math.ceil(Math.sqrt(data.length));
1680
+ return bins > 50 ? 50 : bins;
1681
+ },
1682
+ scott: function(data, min2, max2) {
1683
+ return Math.ceil((max2 - min2) / (3.5 * deviation(data) * Math.pow(data.length, -1 / 3)));
1684
+ },
1685
+ freedmanDiaconis: function(data, min2, max2) {
1686
+ data.sort(ascending);
1687
+ return Math.ceil((max2 - min2) / (2 * (quantile(data, 0.75) - quantile(data, 0.25)) * Math.pow(data.length, -1 / 3)));
1688
+ },
1689
+ sturges: function(data) {
1690
+ return Math.ceil(Math.log(data.length) / Math.LN2) + 1;
1691
+ }
1692
+ };
1693
+ return computeBins;
1694
+ }.call(exports2, __webpack_require__, exports2, module2), __WEBPACK_AMD_DEFINE_RESULT__ !== void 0 && (module2.exports = __WEBPACK_AMD_DEFINE_RESULT__));
1695
+ },
1696
+ function(module2, exports2, __webpack_require__) {
1697
+ var __WEBPACK_AMD_DEFINE_RESULT__;
1698
+ !(__WEBPACK_AMD_DEFINE_RESULT__ = function(require2) {
1699
+ var dataProcess = __webpack_require__(2);
1700
+ var getPrecision = dataProcess.getPrecision;
1701
+ return function(start, end, step, precision) {
1702
+ var len = arguments.length;
1703
+ if (len < 2) {
1704
+ end = start;
1705
+ start = 0;
1706
+ step = 1;
1707
+ } else if (len < 3) {
1708
+ step = 1;
1709
+ } else if (len < 4) {
1710
+ step = +step;
1711
+ precision = getPrecision(step);
1712
+ } else {
1713
+ precision = +precision;
1714
+ }
1715
+ var n2 = Math.ceil(((end - start) / step).toFixed(precision));
1716
+ var range = new Array(n2 + 1);
1717
+ for (var i = 0; i < n2 + 1; i++) {
1718
+ range[i] = +(start + i * step).toFixed(precision);
1719
+ }
1720
+ return range;
1721
+ };
1722
+ }.call(exports2, __webpack_require__, exports2, module2), __WEBPACK_AMD_DEFINE_RESULT__ !== void 0 && (module2.exports = __WEBPACK_AMD_DEFINE_RESULT__));
1723
+ },
1724
+ function(module2, exports2, __webpack_require__) {
1725
+ var __WEBPACK_AMD_DEFINE_RESULT__;
1726
+ !(__WEBPACK_AMD_DEFINE_RESULT__ = function(require2) {
1727
+ var numberUtil = __webpack_require__(4);
1728
+ return function(start, stop, count) {
1729
+ var step0 = Math.abs(stop - start) / count;
1730
+ var precision = numberUtil.quantityExponent(step0);
1731
+ var step1 = Math.pow(10, precision);
1732
+ var error = step0 / step1;
1733
+ if (error >= Math.sqrt(50)) {
1734
+ step1 *= 10;
1735
+ } else if (error >= Math.sqrt(10)) {
1736
+ step1 *= 5;
1737
+ } else if (error >= Math.sqrt(2)) {
1738
+ step1 *= 2;
1739
+ }
1740
+ var toFixedPrecision = precision < 0 ? -precision : 0;
1741
+ var resultStep = +(stop >= start ? step1 : -step1).toFixed(toFixedPrecision);
1742
+ return {
1743
+ step: resultStep,
1744
+ toFixedPrecision
1745
+ };
1746
+ };
1747
+ }.call(exports2, __webpack_require__, exports2, module2), __WEBPACK_AMD_DEFINE_RESULT__ !== void 0 && (module2.exports = __WEBPACK_AMD_DEFINE_RESULT__));
1748
+ },
1749
+ function(module2, exports2, __webpack_require__) {
1750
+ var __WEBPACK_AMD_DEFINE_RESULT__;
1751
+ !(__WEBPACK_AMD_DEFINE_RESULT__ = function(require2) {
1752
+ var regression = __webpack_require__(5);
1753
+ var transformHelper = __webpack_require__(19);
1754
+ var FORMULA_DIMENSION = 2;
1755
+ return {
1756
+ type: "ecStat:regression",
1757
+ transform: function transform(params) {
1758
+ var upstream = params.upstream;
1759
+ var config = params.config || {};
1760
+ var method = config.method || "linear";
1761
+ var result = regression(method, upstream.cloneRawData(), {
1762
+ order: config.order,
1763
+ dimensions: transformHelper.normalizeExistingDimensions(params, config.dimensions)
1764
+ });
1765
+ var points = result.points;
1766
+ var formulaOn = config.formulaOn;
1767
+ if (formulaOn == null) {
1768
+ formulaOn = "end";
1769
+ }
1770
+ var dimensions;
1771
+ if (formulaOn !== "none") {
1772
+ for (var i = 0; i < points.length; i++) {
1773
+ points[i][FORMULA_DIMENSION] = formulaOn === "start" && i === 0 || formulaOn === "all" || formulaOn === "end" && i === points.length - 1 ? result.expression : "";
1774
+ }
1775
+ dimensions = upstream.cloneAllDimensionInfo();
1776
+ dimensions[FORMULA_DIMENSION] = {};
1777
+ }
1778
+ return [{
1779
+ dimensions,
1780
+ data: points
1781
+ }];
1782
+ }
1783
+ };
1784
+ }.call(exports2, __webpack_require__, exports2, module2), __WEBPACK_AMD_DEFINE_RESULT__ !== void 0 && (module2.exports = __WEBPACK_AMD_DEFINE_RESULT__));
1785
+ },
1786
+ function(module2, exports2, __webpack_require__) {
1787
+ var __WEBPACK_AMD_DEFINE_RESULT__;
1788
+ !(__WEBPACK_AMD_DEFINE_RESULT__ = function(require2) {
1789
+ var arrayUtil = __webpack_require__(3);
1790
+ var numberUtil = __webpack_require__(4);
1791
+ var objectUtil = __webpack_require__(20);
1792
+ function normalizeExistingDimensions(transformParams, dimensionsConfig) {
1793
+ if (dimensionsConfig == null) {
1794
+ return;
1795
+ }
1796
+ var upstream = transformParams.upstream;
1797
+ if (arrayUtil.isArray(dimensionsConfig)) {
1798
+ var result = [];
1799
+ for (var i = 0; i < dimensionsConfig.length; i++) {
1800
+ var dimInfo = upstream.getDimensionInfo(dimensionsConfig[i]);
1801
+ validateDimensionExists(dimInfo, dimensionsConfig[i]);
1802
+ result[i] = dimInfo.index;
1803
+ }
1804
+ return result;
1805
+ } else {
1806
+ var dimInfo = upstream.getDimensionInfo(dimensionsConfig);
1807
+ validateDimensionExists(dimInfo, dimensionsConfig);
1808
+ return dimInfo.index;
1809
+ }
1810
+ function validateDimensionExists(dimInfo2, dimConfig) {
1811
+ if (!dimInfo2) {
1812
+ throw new Error("Can not find dimension by " + dimConfig);
1813
+ }
1814
+ }
1815
+ }
1816
+ function normalizeNewDimensions(dimensionsConfig) {
1817
+ if (arrayUtil.isArray(dimensionsConfig)) {
1818
+ var names = [];
1819
+ var indices = [];
1820
+ for (var i = 0; i < dimensionsConfig.length; i++) {
1821
+ var item = parseDimensionNewItem(dimensionsConfig[i]);
1822
+ names.push(item.name);
1823
+ indices.push(item.index);
1824
+ }
1825
+ return { name: names, index: indices };
1826
+ } else if (dimensionsConfig != null) {
1827
+ return parseDimensionNewItem(dimensionsConfig);
1828
+ }
1829
+ function parseDimensionNewItem(dimConfig) {
1830
+ if (numberUtil.isNumber(dimConfig)) {
1831
+ return { index: dimConfig };
1832
+ } else if (objectUtil.isObject(dimConfig) && numberUtil.isNumber(dimConfig.index)) {
1833
+ return dimConfig;
1834
+ }
1835
+ throw new Error("Illegle new dimensions config. Expect `{ name: string, index: number }`.");
1836
+ }
1837
+ }
1838
+ return {
1839
+ normalizeExistingDimensions,
1840
+ normalizeNewDimensions
1841
+ };
1842
+ }.call(exports2, __webpack_require__, exports2, module2), __WEBPACK_AMD_DEFINE_RESULT__ !== void 0 && (module2.exports = __WEBPACK_AMD_DEFINE_RESULT__));
1843
+ },
1844
+ function(module2, exports2, __webpack_require__) {
1845
+ var __WEBPACK_AMD_DEFINE_RESULT__;
1846
+ !(__WEBPACK_AMD_DEFINE_RESULT__ = function(require2) {
1847
+ function extend(target, source) {
1848
+ if (Object.assign) {
1849
+ Object.assign(target, source);
1850
+ } else {
1851
+ for (var key in source) {
1852
+ if (source.hasOwnProperty(key)) {
1853
+ target[key] = source[key];
1854
+ }
1855
+ }
1856
+ }
1857
+ return target;
1858
+ }
1859
+ function isObject(value) {
1860
+ const type = typeof value;
1861
+ return type === "function" || !!value && type === "object";
1862
+ }
1863
+ return {
1864
+ extend,
1865
+ isObject
1866
+ };
1867
+ }.call(exports2, __webpack_require__, exports2, module2), __WEBPACK_AMD_DEFINE_RESULT__ !== void 0 && (module2.exports = __WEBPACK_AMD_DEFINE_RESULT__));
1868
+ },
1869
+ function(module2, exports2, __webpack_require__) {
1870
+ var __WEBPACK_AMD_DEFINE_RESULT__;
1871
+ !(__WEBPACK_AMD_DEFINE_RESULT__ = function(require2) {
1872
+ var histogram = __webpack_require__(15);
1873
+ var transformHelper = __webpack_require__(19);
1874
+ return {
1875
+ type: "ecStat:histogram",
1876
+ transform: function transform(params) {
1877
+ var upstream = params.upstream;
1878
+ var config = params.config || {};
1879
+ var result = histogram(upstream.cloneRawData(), {
1880
+ method: config.method,
1881
+ dimensions: transformHelper.normalizeExistingDimensions(params, config.dimensions)
1882
+ });
1883
+ return [{
1884
+ dimensions: ["MeanOfV0V1", "VCount", "V0", "V1", "DisplayableName"],
1885
+ data: result.data
1886
+ }, {
1887
+ data: result.customData
1888
+ }];
1889
+ }
1890
+ };
1891
+ }.call(exports2, __webpack_require__, exports2, module2), __WEBPACK_AMD_DEFINE_RESULT__ !== void 0 && (module2.exports = __WEBPACK_AMD_DEFINE_RESULT__));
1892
+ },
1893
+ function(module2, exports2, __webpack_require__) {
1894
+ var __WEBPACK_AMD_DEFINE_RESULT__;
1895
+ !(__WEBPACK_AMD_DEFINE_RESULT__ = function(require2) {
1896
+ var clustering = __webpack_require__(1);
1897
+ var numberUtil = __webpack_require__(4);
1898
+ var transformHelper = __webpack_require__(19);
1899
+ var isNumber = numberUtil.isNumber;
1900
+ return {
1901
+ type: "ecStat:clustering",
1902
+ transform: function transform(params) {
1903
+ var upstream = params.upstream;
1904
+ var config = params.config || {};
1905
+ var clusterCount = config.clusterCount;
1906
+ if (!isNumber(clusterCount) || clusterCount <= 0) {
1907
+ throw new Error('config param "clusterCount" need to be specified as an interger greater than 1.');
1908
+ }
1909
+ if (clusterCount === 1) {
1910
+ return [{}, {
1911
+ data: []
1912
+ }];
1913
+ }
1914
+ var outputClusterIndexDimension = transformHelper.normalizeNewDimensions(config.outputClusterIndexDimension);
1915
+ var outputCentroidDimensions = transformHelper.normalizeNewDimensions(config.outputCentroidDimensions);
1916
+ if (outputClusterIndexDimension == null) {
1917
+ throw new Error("outputClusterIndexDimension is required as a number.");
1918
+ }
1919
+ var result = clustering.hierarchicalKMeans(upstream.cloneRawData(), {
1920
+ clusterCount,
1921
+ stepByStep: false,
1922
+ dimensions: transformHelper.normalizeExistingDimensions(params, config.dimensions),
1923
+ outputType: clustering.OutputType.SINGLE,
1924
+ outputClusterIndexDimension: outputClusterIndexDimension.index,
1925
+ outputCentroidDimensions: (outputCentroidDimensions || {}).index
1926
+ });
1927
+ var sourceDimAll = upstream.cloneAllDimensionInfo();
1928
+ var resultDimsDef = [];
1929
+ for (var i = 0; i < sourceDimAll.length; i++) {
1930
+ var sourceDimItem = sourceDimAll[i];
1931
+ resultDimsDef.push(sourceDimItem.name);
1932
+ }
1933
+ resultDimsDef[outputClusterIndexDimension.index] = outputClusterIndexDimension.name;
1934
+ if (outputCentroidDimensions) {
1935
+ for (var i = 0; i < outputCentroidDimensions.index.length; i++) {
1936
+ if (outputCentroidDimensions.name[i] != null) {
1937
+ resultDimsDef[outputCentroidDimensions.index[i]] = outputCentroidDimensions.name[i];
1938
+ }
1939
+ }
1940
+ }
1941
+ return [{
1942
+ dimensions: resultDimsDef,
1943
+ data: result.data
1944
+ }, {
1945
+ data: result.centroids
1946
+ }];
1947
+ }
1948
+ };
1949
+ }.call(exports2, __webpack_require__, exports2, module2), __WEBPACK_AMD_DEFINE_RESULT__ !== void 0 && (module2.exports = __WEBPACK_AMD_DEFINE_RESULT__));
1950
+ }
1951
+ ]);
1952
+ });
1953
+ })(ecStat);
1954
+ var echartsStat = ecStat.exports;
1955
+ function getRegressionConfs({ regressions = [] }, data) {
1956
+ const regressionDataSets = [];
1957
+ const regressionSeries = [];
1958
+ const regressionXAxes = [];
1959
+ if (data.length === 0) {
1960
+ return { regressionDataSets, regressionSeries, regressionXAxes };
1961
+ }
1962
+ regressions.forEach(({ transform, plot, name, y_axis_data_key }) => {
1963
+ const xAxisId = `x-axis-for-${name}`;
1964
+ const rawDatasetId = `dataset-for-${name}--raw`;
1965
+ const regDatasetId = `dataset-for-${name}--transformed`;
1966
+ regressionDataSets.push({
1967
+ id: rawDatasetId,
1968
+ source: data.map((d, i) => [i, d[y_axis_data_key]])
1969
+ });
1970
+ regressionDataSets.push({
1971
+ transform,
1972
+ id: regDatasetId,
1973
+ fromDatasetId: rawDatasetId
1974
+ });
1975
+ regressionSeries.push(__spreadProps(__spreadValues({}, plot), {
1976
+ name,
1977
+ datasetId: regDatasetId,
1978
+ xAxisId,
1979
+ showSymbol: false,
1980
+ tooltip: {
1981
+ show: false
1982
+ }
1983
+ }));
1984
+ regressionXAxes.push({
1985
+ type: "category",
1986
+ id: xAxisId,
1987
+ datasetId: regDatasetId,
1988
+ show: false
1989
+ });
1990
+ });
1991
+ return { regressionDataSets, regressionSeries, regressionXAxes };
1992
+ }
692
1993
  const defaultOption$1 = {
693
1994
  legend: {
694
1995
  show: true,
@@ -714,115 +2015,103 @@ const defaultOption$1 = {
714
2015
  containLabel: true
715
2016
  }
716
2017
  };
717
- function VizCartesianChart({
718
- conf,
719
- data,
720
- width,
721
- height
722
- }) {
723
- const option = React.useMemo(() => {
724
- var _c;
725
- const labelFormatters = conf.y_axes.reduce((ret, {
726
- label_formatter
727
- }, index2) => {
728
- ret[index2] = function formatter(payload) {
729
- const value = typeof payload === "object" ? payload.value : payload;
730
- if (!label_formatter) {
731
- return value;
732
- }
733
- try {
734
- return numbro(value).format(label_formatter);
735
- } catch (error) {
736
- console.error(error);
737
- return value;
738
- }
739
- };
740
- return ret;
741
- }, {
742
- default: ({
743
- value
744
- }) => value
745
- });
746
- const yAxisIndexMap = conf.series.reduce((ret, {
747
- yAxisIndex,
748
- name
749
- }) => {
750
- ret[name] = yAxisIndex;
751
- return ret;
752
- }, {});
753
- const series = conf.series.map((_a) => {
754
- var _b = _a, {
755
- y_axis_data_key,
756
- yAxisIndex,
757
- label_position,
758
- name
759
- } = _b, rest = __objRest(_b, [
760
- "y_axis_data_key",
761
- "yAxisIndex",
762
- "label_position",
763
- "name"
764
- ]);
765
- const ret = __spreadValues({
766
- data: data.map((d) => d[y_axis_data_key]),
767
- label: {
768
- show: !!label_position,
769
- position: label_position,
770
- formatter: labelFormatters[yAxisIndex != null ? yAxisIndex : "default"]
771
- },
772
- name,
773
- yAxisIndex
774
- }, rest);
775
- return ret;
776
- });
777
- const customOptions = {
778
- xAxis: {
2018
+ function getOption(conf, data) {
2019
+ var _c;
2020
+ const labelFormatters = conf.y_axes.reduce((ret, { label_formatter }, index2) => {
2021
+ ret[index2] = function formatter(payload) {
2022
+ const value = typeof payload === "object" ? payload.value : payload;
2023
+ if (!label_formatter) {
2024
+ return value;
2025
+ }
2026
+ try {
2027
+ return numbro(value).format(label_formatter);
2028
+ } catch (error) {
2029
+ console.error(error);
2030
+ return value;
2031
+ }
2032
+ };
2033
+ return ret;
2034
+ }, {
2035
+ default: ({ value }) => value
2036
+ });
2037
+ const yAxisIndexMap = conf.series.reduce((ret, { yAxisIndex, name }) => {
2038
+ ret[name] = yAxisIndex;
2039
+ return ret;
2040
+ }, {});
2041
+ const series = conf.series.map((_a) => {
2042
+ var _b = _a, { y_axis_data_key, yAxisIndex, label_position, name } = _b, rest = __objRest(_b, ["y_axis_data_key", "yAxisIndex", "label_position", "name"]);
2043
+ const ret = __spreadValues({
2044
+ data: data.map((d) => d[y_axis_data_key]),
2045
+ label: {
2046
+ show: !!label_position,
2047
+ position: label_position,
2048
+ formatter: labelFormatters[yAxisIndex != null ? yAxisIndex : "default"]
2049
+ },
2050
+ name,
2051
+ xAxisId: "main-x-axis",
2052
+ yAxisIndex
2053
+ }, rest);
2054
+ return ret;
2055
+ });
2056
+ const { regressionDataSets, regressionSeries, regressionXAxes } = getRegressionConfs(conf, data);
2057
+ const customOptions = {
2058
+ xAxis: [
2059
+ {
779
2060
  data: data.map((d) => d[conf.x_axis_data_key]),
780
- name: (_c = conf.x_axis_name) != null ? _c : ""
2061
+ name: (_c = conf.x_axis_name) != null ? _c : "",
2062
+ id: "main-x-axis"
781
2063
  },
782
- yAxis: conf.y_axes.map((_d, index2) => {
783
- var _e = _d, {
784
- label_formatter
785
- } = _e, rest = __objRest(_e, [
786
- "label_formatter"
787
- ]);
788
- var _a;
789
- return __spreadProps(__spreadValues({}, rest), {
790
- axisLabel: {
791
- show: true,
792
- formatter: (_a = labelFormatters[index2]) != null ? _a : labelFormatters.default
2064
+ ...regressionXAxes
2065
+ ],
2066
+ yAxis: conf.y_axes.map((_d, index2) => {
2067
+ var _e = _d, { label_formatter } = _e, rest = __objRest(_e, ["label_formatter"]);
2068
+ var _a;
2069
+ return __spreadProps(__spreadValues({}, rest), {
2070
+ axisLabel: {
2071
+ show: true,
2072
+ formatter: (_a = labelFormatters[index2]) != null ? _a : labelFormatters.default
2073
+ }
2074
+ });
2075
+ }),
2076
+ dataset: [
2077
+ ...regressionDataSets
2078
+ ],
2079
+ series: [
2080
+ ...series,
2081
+ ...regressionSeries
2082
+ ],
2083
+ tooltip: {
2084
+ formatter: function(params) {
2085
+ const arr = Array.isArray(params) ? params : [params];
2086
+ if (arr.length === 0) {
2087
+ return "";
2088
+ }
2089
+ const lines = arr.map(({ seriesName, value }) => {
2090
+ var _a;
2091
+ if (!seriesName) {
2092
+ return value;
793
2093
  }
2094
+ const yAxisIndex = yAxisIndexMap[seriesName];
2095
+ const formatter = (_a = labelFormatters[yAxisIndex]) != null ? _a : labelFormatters.default;
2096
+ return `${seriesName}: ${formatter({ value })}`;
794
2097
  });
795
- }),
796
- dataset: {
797
- source: data
798
- },
799
- series,
800
- tooltip: {
801
- formatter: function(params) {
802
- const arr = Array.isArray(params) ? params : [params];
803
- if (arr.length === 0) {
804
- return "";
805
- }
806
- const lines = arr.map(({
807
- seriesName,
808
- value
809
- }) => {
810
- var _a;
811
- if (!seriesName) {
812
- return value;
813
- }
814
- const yAxisIndex = yAxisIndexMap[seriesName];
815
- const formatter = (_a = labelFormatters[yAxisIndex]) != null ? _a : labelFormatters.default;
816
- return `${seriesName}: ${formatter({
817
- value
818
- })}`;
819
- });
820
- lines.unshift(`<strong>${arr[0].name}</strong>`);
821
- return lines.join("<br />");
822
- }
2098
+ lines.unshift(`<strong>${arr[0].name}</strong>`);
2099
+ return lines.join("<br />");
823
2100
  }
824
- };
825
- return _.merge({}, defaultOption$1, customOptions);
2101
+ }
2102
+ };
2103
+ return _.merge({}, defaultOption$1, customOptions);
2104
+ }
2105
+ echarts.use([BarChart, LineChart, ScatterChart, GridComponent, LegendComponent, TooltipComponent, CanvasRenderer]);
2106
+ echarts.registerTransform(echartsStat.transform.regression);
2107
+ function VizCartesianChart({
2108
+ conf,
2109
+ data,
2110
+ width,
2111
+ height
2112
+ }) {
2113
+ const option = React.useMemo(() => {
2114
+ return getOption(conf, data);
826
2115
  }, [conf, data]);
827
2116
  if (!width || !height) {
828
2117
  return null;
@@ -1171,6 +2460,32 @@ function VizPie({
1171
2460
  }
1172
2461
  });
1173
2462
  }
2463
+ function median(numbers) {
2464
+ const sorted = Array.from(numbers).sort((a, b) => a - b);
2465
+ const middle = Math.floor(sorted.length / 2);
2466
+ if (sorted.length % 2 === 0) {
2467
+ return (sorted[middle - 1] + sorted[middle]) / 2;
2468
+ }
2469
+ return sorted[middle];
2470
+ }
2471
+ function aggregateValue(data, data_field, aggregation) {
2472
+ var _a, _b, _c;
2473
+ const numbers = data.map((d) => d[data_field]);
2474
+ switch (aggregation) {
2475
+ case "sum":
2476
+ return _.sum(numbers);
2477
+ case "mean":
2478
+ return _.mean(numbers);
2479
+ case "median":
2480
+ return median(numbers);
2481
+ case "max":
2482
+ return (_a = _.max(numbers)) != null ? _a : 0;
2483
+ case "min":
2484
+ return (_b = _.min(numbers)) != null ? _b : 0;
2485
+ default:
2486
+ return (_c = data[0]) == null ? void 0 : _c[data_field];
2487
+ }
2488
+ }
1174
2489
  var invariant = function() {
1175
2490
  };
1176
2491
  const clamp$1 = (min, max, v) => Math.min(Math.max(v, min), max);
@@ -1537,14 +2852,12 @@ class InterpolateColor {
1537
2852
  return this.mapper(value);
1538
2853
  }
1539
2854
  }
1540
- function getColorByColorConf(conf, dataRow) {
2855
+ function getColorByColorConf(conf, value) {
1541
2856
  if (conf.type === "static") {
1542
2857
  return conf.staticColor;
1543
2858
  }
1544
2859
  if (conf.type === "continuous") {
1545
- const mapper = new InterpolateColor(conf);
1546
- const value = dataRow[conf.valueField];
1547
- return mapper.getColor(value);
2860
+ return new InterpolateColor(conf).getColor(value);
1548
2861
  }
1549
2862
  return "black";
1550
2863
  }
@@ -1560,46 +2873,108 @@ function getNonStatsDataText(data) {
1560
2873
  }
1561
2874
  return data.toString();
1562
2875
  }
1563
- function VizStats(_a) {
1564
- var _b = _a, {
1565
- conf: _c
1566
- } = _b, _d = _c, {
1567
- content,
2876
+ function variablesToElements(variables, data) {
2877
+ const ret = {};
2878
+ variables.forEach(({
2879
+ name,
2880
+ color: color2,
2881
+ data_field,
2882
+ aggregation,
1568
2883
  size,
1569
- color: color2
1570
- } = _d, rest = __objRest(_d, [
1571
- "content",
1572
- "size",
1573
- "color"
1574
- ]), {
1575
- data
1576
- } = _b;
1577
- const finalColor = React.useMemo(() => {
1578
- return getColorByColorConf(color2, data[0]);
1579
- }, [color2, data]);
1580
- const finalContent = React.useMemo(() => {
1581
- var _a2;
1582
- const {
1583
- prefix,
1584
- postfix,
1585
- data_field,
1586
- formatter
1587
- } = content;
1588
- const contentData = (_a2 = data == null ? void 0 : data[0]) == null ? void 0 : _a2[data_field];
1589
- if (!["string", "number"].includes(typeof contentData)) {
1590
- return getNonStatsDataText(contentData);
2884
+ weight,
2885
+ formatter
2886
+ }) => {
2887
+ const value = aggregateValue(data, data_field, aggregation);
2888
+ let valueContent = "";
2889
+ if (!["string", "number"].includes(typeof value)) {
2890
+ valueContent = getNonStatsDataText(value);
2891
+ } else {
2892
+ valueContent = numbro(value).format(formatter);
1591
2893
  }
1592
- const contents = [prefix, numbro(contentData).format(formatter), postfix];
1593
- return contents.join(" ");
1594
- }, [content, data]);
1595
- return /* @__PURE__ */ jsx(Text, __spreadProps(__spreadValues({}, rest), {
1596
- color: finalColor,
1597
- sx: {
1598
- fontSize: size
1599
- },
1600
- children: finalContent
2894
+ ret[name] = /* @__PURE__ */ jsx(Text, {
2895
+ sx: {
2896
+ fontSize: size,
2897
+ display: "inline"
2898
+ },
2899
+ color: getColorByColorConf(color2, value),
2900
+ weight,
2901
+ children: valueContent
2902
+ });
2903
+ });
2904
+ return ret;
2905
+ }
2906
+ function preserveWhiteSpaces(text) {
2907
+ return text.split(" ").map((s) => /* @__PURE__ */ jsxs(Fragment, {
2908
+ children: [s, "\xA0"]
1601
2909
  }));
1602
2910
  }
2911
+ function withLineBreaks(text) {
2912
+ const normalized = text.replaceAll("<br />", "<br/>").replaceAll("\n", "<br/>");
2913
+ const splitted = normalized.split("<br/>");
2914
+ const ret = splitted.map((t, i) => {
2915
+ const arr = [preserveWhiteSpaces(t)];
2916
+ if (i !== splitted.length - 1) {
2917
+ arr.push(/* @__PURE__ */ jsx("br", {}));
2918
+ }
2919
+ return arr;
2920
+ }).flat().filter((t) => t !== void 0);
2921
+ return ret;
2922
+ }
2923
+ function textToJSX(text) {
2924
+ return withLineBreaks(text);
2925
+ }
2926
+ function templateToJSX(template, variables, data) {
2927
+ const variableElements = variablesToElements(variables, data);
2928
+ const regx = /^\{(.+)\}(.*)$/;
2929
+ return template.split("$").map((text) => {
2930
+ var _a;
2931
+ const match = regx.exec(text);
2932
+ if (!match) {
2933
+ return textToJSX(text);
2934
+ }
2935
+ const element = variableElements[match[1]];
2936
+ if (!element) {
2937
+ return textToJSX(text);
2938
+ }
2939
+ const rest = (_a = match[2]) != null ? _a : "";
2940
+ return /* @__PURE__ */ jsxs(Fragment, {
2941
+ children: [element, textToJSX(rest)]
2942
+ });
2943
+ });
2944
+ }
2945
+ function VizStats({
2946
+ conf: {
2947
+ template,
2948
+ variables,
2949
+ align
2950
+ },
2951
+ data
2952
+ }) {
2953
+ const contents = React.useMemo(() => {
2954
+ return templateToJSX(template, variables, data);
2955
+ }, [template, variables, data]);
2956
+ return /* @__PURE__ */ jsx(Text, {
2957
+ align,
2958
+ children: Object.values(contents).map((c) => c)
2959
+ });
2960
+ }
2961
+ function VizRichText({
2962
+ conf,
2963
+ width,
2964
+ height
2965
+ }) {
2966
+ if (!width || !height) {
2967
+ return null;
2968
+ }
2969
+ return /* @__PURE__ */ jsx(RichTextEditor, {
2970
+ readOnly: true,
2971
+ value: conf.content,
2972
+ onChange: _.noop,
2973
+ sx: {
2974
+ border: "none"
2975
+ }
2976
+ });
2977
+ }
1603
2978
  function renderViz(width, height, data, viz) {
1604
2979
  const props = {
1605
2980
  width,
@@ -1610,7 +2985,6 @@ function renderViz(width, height, data, viz) {
1610
2985
  switch (viz.type) {
1611
2986
  case "sunburst":
1612
2987
  return /* @__PURE__ */ jsx(Sunbrust, __spreadValues({}, props));
1613
- case "line-bar":
1614
2988
  case "cartesian":
1615
2989
  return /* @__PURE__ */ jsx(VizCartesianChart, __spreadValues({}, props));
1616
2990
  case "table":
@@ -1619,6 +2993,8 @@ function renderViz(width, height, data, viz) {
1619
2993
  return /* @__PURE__ */ jsx(VizText, __spreadValues({}, props));
1620
2994
  case "stats":
1621
2995
  return /* @__PURE__ */ jsx(VizStats, __spreadValues({}, props));
2996
+ case "rich-text":
2997
+ return /* @__PURE__ */ jsx(VizRichText, __spreadValues({}, props));
1622
2998
  case "bar-3d":
1623
2999
  return /* @__PURE__ */ jsx(VizBar3D, __spreadValues({}, props));
1624
3000
  case "pie":
@@ -1627,6 +3003,7 @@ function renderViz(width, height, data, viz) {
1627
3003
  return null;
1628
3004
  }
1629
3005
  }
3006
+ const typesDontNeedData = ["rich-text"];
1630
3007
  function Viz({
1631
3008
  viz,
1632
3009
  data,
@@ -1637,6 +3014,16 @@ function Viz({
1637
3014
  width,
1638
3015
  height
1639
3016
  } = useElementSize();
3017
+ const needData = !typesDontNeedData.includes(viz.type);
3018
+ if (!needData) {
3019
+ return /* @__PURE__ */ jsx("div", {
3020
+ className: "viz-root",
3021
+ ref,
3022
+ children: /* @__PURE__ */ jsx(ErrorBoundary, {
3023
+ children: renderViz(width, height, data, viz)
3024
+ })
3025
+ });
3026
+ }
1640
3027
  const empty = React.useMemo(() => !Array.isArray(data) || data.length === 0, [data]);
1641
3028
  if (loading) {
1642
3029
  return /* @__PURE__ */ jsx("div", {
@@ -1680,7 +3067,7 @@ function _DataFieldSelector({
1680
3067
  data,
1681
3068
  sx
1682
3069
  }, ref) {
1683
- const options = React.useMemo(() => {
3070
+ const options2 = React.useMemo(() => {
1684
3071
  if (!Array.isArray(data) || data.length === 0) {
1685
3072
  return [];
1686
3073
  }
@@ -1693,7 +3080,7 @@ function _DataFieldSelector({
1693
3080
  return /* @__PURE__ */ jsx(Select, {
1694
3081
  ref,
1695
3082
  label,
1696
- data: options,
3083
+ data: options2,
1697
3084
  value,
1698
3085
  onChange,
1699
3086
  required,
@@ -1876,7 +3263,7 @@ function _MantineColorSelector({
1876
3263
  }, [value, themeColors]);
1877
3264
  return /* @__PURE__ */ jsxs(Group, {
1878
3265
  position: "apart",
1879
- spacing: "xs",
3266
+ spacing: 4,
1880
3267
  children: [/* @__PURE__ */ jsx(TextInput, {
1881
3268
  placeholder: "Set any color",
1882
3269
  value: !isThemeColor ? value : "",
@@ -1887,7 +3274,7 @@ function _MantineColorSelector({
1887
3274
  }),
1888
3275
  variant: !isThemeColor ? "default" : "filled",
1889
3276
  sx: {
1890
- maxWidth: "100%",
3277
+ maxWidth: "46%",
1891
3278
  flexGrow: 1
1892
3279
  }
1893
3280
  }), /* @__PURE__ */ jsx(Text, {
@@ -1906,7 +3293,7 @@ function _MantineColorSelector({
1906
3293
  radius: 4
1907
3294
  }),
1908
3295
  sx: {
1909
- maxWidth: "100%",
3296
+ maxWidth: "46%",
1910
3297
  flexGrow: 1
1911
3298
  }
1912
3299
  })]
@@ -2005,6 +3392,47 @@ function LineFields({
2005
3392
  })]
2006
3393
  });
2007
3394
  }
3395
+ const symbolSizeOptions = Array.from(new Array(9), (_2, i) => ({
3396
+ label: String(i + 1),
3397
+ value: i + 1
3398
+ }));
3399
+ function ScatterFields({
3400
+ control,
3401
+ index: index2
3402
+ }) {
3403
+ return /* @__PURE__ */ jsx(Group, {
3404
+ direction: "row",
3405
+ grow: true,
3406
+ align: "center",
3407
+ children: /* @__PURE__ */ jsx(Controller, {
3408
+ name: `series.${index2}.symbolSize`,
3409
+ control,
3410
+ render: ({
3411
+ field
3412
+ }) => /* @__PURE__ */ jsxs(Group, {
3413
+ direction: "column",
3414
+ noWrap: true,
3415
+ sx: {
3416
+ flexGrow: 1
3417
+ },
3418
+ pb: 16,
3419
+ spacing: 4,
3420
+ children: [/* @__PURE__ */ jsx(Text, {
3421
+ size: "sm",
3422
+ children: "Size"
3423
+ }), /* @__PURE__ */ jsx(Slider, __spreadProps(__spreadValues({
3424
+ min: 1,
3425
+ max: 10,
3426
+ marks: symbolSizeOptions
3427
+ }, field), {
3428
+ sx: {
3429
+ width: "100%"
3430
+ }
3431
+ }))]
3432
+ })
3433
+ })
3434
+ });
3435
+ }
2008
3436
  const labelPositions = [{
2009
3437
  label: "off",
2010
3438
  value: ""
@@ -2085,8 +3513,7 @@ function SeriesItemField({
2085
3513
  value: "bar"
2086
3514
  }, {
2087
3515
  label: "Scatter",
2088
- value: "scatter",
2089
- disabled: true
3516
+ value: "scatter"
2090
3517
  }, {
2091
3518
  label: "Boxplot",
2092
3519
  value: "boxplot",
@@ -2162,6 +3589,9 @@ function SeriesItemField({
2162
3589
  }), type === "bar" && /* @__PURE__ */ jsx(BarFields, {
2163
3590
  index: index2,
2164
3591
  control
3592
+ }), type === "scatter" && /* @__PURE__ */ jsx(ScatterFields, {
3593
+ index: index2,
3594
+ control
2165
3595
  }), /* @__PURE__ */ jsx(Controller, {
2166
3596
  name: `series.${index2}.label_position`,
2167
3597
  control,
@@ -2222,6 +3652,7 @@ function SeriesField({
2222
3652
  type: "bar",
2223
3653
  name: randomId(),
2224
3654
  showSymbol: false,
3655
+ symbolSize: 5,
2225
3656
  y_axis_data_key: "value",
2226
3657
  yAxisIndex: 0,
2227
3658
  label_position: "top",
@@ -2241,11 +3672,7 @@ function SeriesField({
2241
3672
  return /* @__PURE__ */ jsxs(Group, {
2242
3673
  direction: "column",
2243
3674
  grow: true,
2244
- children: [/* @__PURE__ */ jsx(Text, {
2245
- mt: "xl",
2246
- mb: 0,
2247
- children: "Series"
2248
- }), controlledFields.map((seriesItem, index2) => /* @__PURE__ */ jsx(SeriesItemField, {
3675
+ children: [controlledFields.map((seriesItem, index2) => /* @__PURE__ */ jsx(SeriesItemField, {
2249
3676
  control,
2250
3677
  index: index2,
2251
3678
  remove,
@@ -2399,27 +3826,237 @@ function YAxesField({
2399
3826
  const controlledFields = fields.map((field, index2) => {
2400
3827
  return __spreadValues(__spreadValues({}, field), watchFieldArray[index2]);
2401
3828
  });
2402
- const addYAxis = () => append({
3829
+ const addYAxis = () => append({
3830
+ name: "",
3831
+ label_formatter: defaultNumbroFormat
3832
+ });
3833
+ return /* @__PURE__ */ jsxs(Group, {
3834
+ direction: "column",
3835
+ grow: true,
3836
+ children: [controlledFields.map((field, index2) => /* @__PURE__ */ jsx(YAxisField, {
3837
+ control,
3838
+ index: index2,
3839
+ remove
3840
+ })), /* @__PURE__ */ jsx(Group, {
3841
+ position: "center",
3842
+ mt: "xs",
3843
+ children: /* @__PURE__ */ jsx(Button, {
3844
+ onClick: addYAxis,
3845
+ children: "Add a Y Axis"
3846
+ })
3847
+ })]
3848
+ });
3849
+ }
3850
+ const regressionOptions = [{
3851
+ label: "Linear",
3852
+ value: "linear"
3853
+ }, {
3854
+ label: "Exponential",
3855
+ value: "exponential"
3856
+ }, {
3857
+ label: "Logarithmic",
3858
+ value: "logarithmic"
3859
+ }, {
3860
+ label: "Polynomial",
3861
+ value: "polynomial"
3862
+ }];
3863
+ function RegressionField({
3864
+ control,
3865
+ regressionItem,
3866
+ index: index2,
3867
+ remove,
3868
+ yAxisOptions,
3869
+ data
3870
+ }) {
3871
+ const method = regressionItem.transform.config.method;
3872
+ return /* @__PURE__ */ jsxs(Group, {
3873
+ direction: "column",
3874
+ grow: true,
3875
+ my: 0,
3876
+ p: "md",
3877
+ pr: 40,
3878
+ sx: {
3879
+ border: "1px solid #eee",
3880
+ position: "relative"
3881
+ },
3882
+ children: [/* @__PURE__ */ jsx(Controller, {
3883
+ name: `regressions.${index2}.name`,
3884
+ control,
3885
+ render: ({
3886
+ field
3887
+ }) => /* @__PURE__ */ jsx(TextInput, __spreadValues({
3888
+ label: "Name",
3889
+ required: true,
3890
+ sx: {
3891
+ flex: 1
3892
+ }
3893
+ }, field))
3894
+ }), /* @__PURE__ */ jsxs(Group, {
3895
+ direction: "row",
3896
+ grow: true,
3897
+ noWrap: true,
3898
+ children: [/* @__PURE__ */ jsx(Controller, {
3899
+ name: `regressions.${index2}.y_axis_data_key`,
3900
+ control,
3901
+ render: ({
3902
+ field
3903
+ }) => /* @__PURE__ */ jsx(DataFieldSelector, __spreadValues({
3904
+ label: "Value Field",
3905
+ required: true,
3906
+ data,
3907
+ sx: {
3908
+ flex: 1
3909
+ }
3910
+ }, field))
3911
+ }), /* @__PURE__ */ jsx(Controller, {
3912
+ name: `regressions.${index2}.plot.yAxisIndex`,
3913
+ control,
3914
+ render: (_a) => {
3915
+ var {
3916
+ field: _b
3917
+ } = _a, _c = _b, {
3918
+ value,
3919
+ onChange
3920
+ } = _c, rest = __objRest(_c, [
3921
+ "value",
3922
+ "onChange"
3923
+ ]);
3924
+ var _a2;
3925
+ return /* @__PURE__ */ jsx(Select, __spreadProps(__spreadValues({
3926
+ label: "Y Axis",
3927
+ data: yAxisOptions,
3928
+ disabled: yAxisOptions.length === 0
3929
+ }, rest), {
3930
+ value: (_a2 = value == null ? void 0 : value.toString()) != null ? _a2 : "",
3931
+ onChange: (value2) => {
3932
+ if (!value2) {
3933
+ onChange(0);
3934
+ return;
3935
+ }
3936
+ onChange(Number(value2));
3937
+ },
3938
+ sx: {
3939
+ flex: 1
3940
+ }
3941
+ }));
3942
+ }
3943
+ })]
3944
+ }), /* @__PURE__ */ jsxs(Group, {
3945
+ direction: "row",
3946
+ grow: true,
3947
+ noWrap: true,
3948
+ children: [/* @__PURE__ */ jsx(Controller, {
3949
+ name: `regressions.${index2}.transform.config.method`,
3950
+ control,
3951
+ render: ({
3952
+ field
3953
+ }) => /* @__PURE__ */ jsx(Select, __spreadValues({
3954
+ label: "Method",
3955
+ data: regressionOptions,
3956
+ sx: {
3957
+ flex: 1
3958
+ }
3959
+ }, field))
3960
+ }), method === "polynomial" && /* @__PURE__ */ jsx(Controller, {
3961
+ name: `regressions.${index2}.transform.config.order`,
3962
+ control,
3963
+ render: ({
3964
+ field
3965
+ }) => /* @__PURE__ */ jsx(NumberInput, __spreadValues({
3966
+ label: "Order",
3967
+ sx: {
3968
+ flex: 1
3969
+ }
3970
+ }, field))
3971
+ })]
3972
+ }), /* @__PURE__ */ jsxs(Group, {
3973
+ direction: "column",
3974
+ grow: true,
3975
+ spacing: 4,
3976
+ children: [/* @__PURE__ */ jsx(Text, {
3977
+ size: "sm",
3978
+ children: "Color"
3979
+ }), /* @__PURE__ */ jsx(Controller, {
3980
+ name: `regressions.${index2}.plot.color`,
3981
+ control,
3982
+ render: ({
3983
+ field
3984
+ }) => /* @__PURE__ */ jsx(MantineColorSelector, __spreadValues({}, field))
3985
+ })]
3986
+ }), /* @__PURE__ */ jsx(ActionIcon, {
3987
+ color: "red",
3988
+ variant: "hover",
3989
+ onClick: () => remove(index2),
3990
+ sx: {
3991
+ position: "absolute",
3992
+ top: 15,
3993
+ right: 5
3994
+ },
3995
+ children: /* @__PURE__ */ jsx(Trash, {
3996
+ size: 16
3997
+ })
3998
+ })]
3999
+ }, index2);
4000
+ }
4001
+ function RegressionsField({
4002
+ control,
4003
+ watch,
4004
+ getValues,
4005
+ data
4006
+ }) {
4007
+ const {
4008
+ fields,
4009
+ append,
4010
+ remove
4011
+ } = useFieldArray({
4012
+ control,
4013
+ name: "regressions"
4014
+ });
4015
+ const watchFieldArray = watch("regressions");
4016
+ const controlledFields = fields.map((field, index2) => {
4017
+ return __spreadValues(__spreadValues({}, field), watchFieldArray[index2]);
4018
+ });
4019
+ const yAxisOptions = React.useMemo(() => {
4020
+ return getValues().y_axes.map(({
4021
+ name
4022
+ }, index2) => ({
4023
+ label: name,
4024
+ value: index2.toString()
4025
+ }));
4026
+ }, [getValues]);
4027
+ const add = () => append({
4028
+ transform: {
4029
+ type: "ecStat:regression",
4030
+ config: {
4031
+ method: "linear",
4032
+ order: 1,
4033
+ formulaOn: "end"
4034
+ }
4035
+ },
2403
4036
  name: "",
2404
- label_formatter: defaultNumbroFormat
4037
+ y_axis_data_key: "",
4038
+ plot: {
4039
+ type: "line",
4040
+ yAxisIndex: 0,
4041
+ color: "#666666"
4042
+ }
2405
4043
  });
2406
4044
  return /* @__PURE__ */ jsxs(Group, {
2407
4045
  direction: "column",
2408
4046
  grow: true,
2409
- children: [/* @__PURE__ */ jsx(Text, {
2410
- mt: "xl",
2411
- mb: 0,
2412
- children: "Y Axes"
2413
- }), controlledFields.map((field, index2) => /* @__PURE__ */ jsx(YAxisField, {
4047
+ children: [controlledFields.map((regressionItem, index2) => /* @__PURE__ */ jsx(RegressionField, {
4048
+ regressionItem,
2414
4049
  control,
2415
4050
  index: index2,
2416
- remove
4051
+ remove,
4052
+ yAxisOptions,
4053
+ data
2417
4054
  })), /* @__PURE__ */ jsx(Group, {
2418
4055
  position: "center",
2419
4056
  mt: "xs",
2420
4057
  children: /* @__PURE__ */ jsx(Button, {
2421
- onClick: addYAxis,
2422
- children: "Add a Y Axis"
4058
+ onClick: add,
4059
+ children: "Add a Regression Line"
2423
4060
  })
2424
4061
  })]
2425
4062
  });
@@ -2429,6 +4066,7 @@ function withDefaults(series) {
2429
4066
  type,
2430
4067
  name,
2431
4068
  showSymbol,
4069
+ symbolSize = 5,
2432
4070
  y_axis_data_key = "value",
2433
4071
  yAxisIndex = 0,
2434
4072
  label_position = "top",
@@ -2442,6 +4080,7 @@ function withDefaults(series) {
2442
4080
  type,
2443
4081
  name,
2444
4082
  showSymbol,
4083
+ symbolSize,
2445
4084
  y_axis_data_key,
2446
4085
  yAxisIndex,
2447
4086
  label_position,
@@ -2495,6 +4134,7 @@ function VizCartesianChartPanel({
2495
4134
  } = useForm({
2496
4135
  defaultValues
2497
4136
  });
4137
+ watch(["x_axis_data_key", "x_axis_name"]);
2498
4138
  const values = getValues();
2499
4139
  const changed = React.useMemo(() => {
2500
4140
  return !_.isEqual(values, conf);
@@ -2507,10 +4147,12 @@ function VizCartesianChartPanel({
2507
4147
  children: /* @__PURE__ */ jsxs("form", {
2508
4148
  onSubmit: handleSubmit(setConf),
2509
4149
  children: [/* @__PURE__ */ jsxs(Group, {
2510
- position: "apart",
2511
- mb: "lg",
4150
+ position: "left",
4151
+ py: "md",
4152
+ pl: "md",
2512
4153
  sx: {
2513
- position: "relative"
4154
+ borderBottom: "1px solid #eee",
4155
+ background: "#efefef"
2514
4156
  },
2515
4157
  children: [/* @__PURE__ */ jsx(Text, {
2516
4158
  children: "Chart Config"
@@ -2524,41 +4166,68 @@ function VizCartesianChartPanel({
2524
4166
  size: 20
2525
4167
  })
2526
4168
  })]
2527
- }), /* @__PURE__ */ jsxs(Group, {
2528
- direction: "column",
2529
- grow: true,
2530
- noWrap: true,
2531
- mb: "lg",
2532
- children: [/* @__PURE__ */ jsx(Controller, {
2533
- name: "x_axis_data_key",
2534
- control,
2535
- render: ({
2536
- field
2537
- }) => /* @__PURE__ */ jsx(DataFieldSelector, __spreadValues({
2538
- label: "X Axis Data Field",
2539
- required: true,
2540
- data,
2541
- sx: {
2542
- flex: 1
2543
- }
2544
- }, field))
2545
- }), /* @__PURE__ */ jsx(Controller, {
2546
- name: "x_axis_name",
2547
- control,
2548
- render: ({
2549
- field
2550
- }) => /* @__PURE__ */ jsx(TextInput, __spreadValues({
2551
- label: "X Axis Name"
2552
- }, field))
4169
+ }), /* @__PURE__ */ jsxs(Accordion, {
4170
+ offsetIcon: false,
4171
+ multiple: true,
4172
+ initialState: {
4173
+ 0: true,
4174
+ 1: true
4175
+ },
4176
+ children: [/* @__PURE__ */ jsx(Accordion.Item, {
4177
+ label: "X Axis",
4178
+ children: /* @__PURE__ */ jsxs(Group, {
4179
+ direction: "row",
4180
+ grow: true,
4181
+ noWrap: true,
4182
+ children: [/* @__PURE__ */ jsx(Controller, {
4183
+ name: "x_axis_data_key",
4184
+ control,
4185
+ render: ({
4186
+ field
4187
+ }) => /* @__PURE__ */ jsx(DataFieldSelector, __spreadValues({
4188
+ label: "X Axis Data Field",
4189
+ required: true,
4190
+ data,
4191
+ sx: {
4192
+ flex: 1
4193
+ }
4194
+ }, field))
4195
+ }), /* @__PURE__ */ jsx(Controller, {
4196
+ name: "x_axis_name",
4197
+ control,
4198
+ render: ({
4199
+ field
4200
+ }) => /* @__PURE__ */ jsx(TextInput, __spreadValues({
4201
+ label: "X Axis Name",
4202
+ sx: {
4203
+ flex: 1
4204
+ }
4205
+ }, field))
4206
+ })]
4207
+ })
4208
+ }), /* @__PURE__ */ jsx(Accordion.Item, {
4209
+ label: "Y Axes",
4210
+ children: /* @__PURE__ */ jsx(YAxesField, {
4211
+ control,
4212
+ watch
4213
+ })
4214
+ }), /* @__PURE__ */ jsx(Accordion.Item, {
4215
+ label: "Series",
4216
+ children: /* @__PURE__ */ jsx(SeriesField, {
4217
+ control,
4218
+ watch,
4219
+ getValues,
4220
+ data
4221
+ })
4222
+ }), /* @__PURE__ */ jsx(Accordion.Item, {
4223
+ label: "Regression Lines",
4224
+ children: /* @__PURE__ */ jsx(RegressionsField, {
4225
+ control,
4226
+ watch,
4227
+ getValues,
4228
+ data
4229
+ })
2553
4230
  })]
2554
- }), /* @__PURE__ */ jsx(YAxesField, {
2555
- control,
2556
- watch
2557
- }), /* @__PURE__ */ jsx(SeriesField, {
2558
- control,
2559
- watch,
2560
- getValues,
2561
- data
2562
4231
  })]
2563
4232
  })
2564
4233
  });
@@ -2625,55 +4294,147 @@ function VizPiePanel({
2625
4294
  })
2626
4295
  });
2627
4296
  }
2628
- const marks = [{
2629
- label: "initial",
2630
- value: 0
4297
+ function VizRichTextPanel({
4298
+ conf,
4299
+ setConf
4300
+ }) {
4301
+ const defaultValues = React.useMemo(() => {
4302
+ const {
4303
+ content = ""
4304
+ } = conf;
4305
+ return {
4306
+ content
4307
+ };
4308
+ }, [conf]);
4309
+ React.useEffect(() => {
4310
+ const configMalformed = !_.isEqual(conf, defaultValues);
4311
+ if (configMalformed) {
4312
+ setConf(defaultValues);
4313
+ }
4314
+ }, [conf, defaultValues]);
4315
+ const {
4316
+ control,
4317
+ handleSubmit,
4318
+ watch,
4319
+ getValues
4320
+ } = useForm({
4321
+ defaultValues
4322
+ });
4323
+ watch("content");
4324
+ const values = getValues();
4325
+ const changed = React.useMemo(() => {
4326
+ return !_.isEqual(values, conf);
4327
+ }, [values, conf]);
4328
+ return /* @__PURE__ */ jsx(Group, {
4329
+ direction: "column",
4330
+ mt: "md",
4331
+ spacing: "xs",
4332
+ grow: true,
4333
+ children: /* @__PURE__ */ jsxs("form", {
4334
+ onSubmit: handleSubmit(setConf),
4335
+ children: [/* @__PURE__ */ jsxs(Group, {
4336
+ position: "left",
4337
+ py: "md",
4338
+ pl: "md",
4339
+ sx: {
4340
+ borderBottom: "1px solid #eee",
4341
+ background: "#efefef"
4342
+ },
4343
+ children: [/* @__PURE__ */ jsx(Text, {
4344
+ children: "Content"
4345
+ }), /* @__PURE__ */ jsx(ActionIcon, {
4346
+ type: "submit",
4347
+ mr: 5,
4348
+ variant: "filled",
4349
+ color: "blue",
4350
+ disabled: !changed,
4351
+ children: /* @__PURE__ */ jsx(DeviceFloppy, {
4352
+ size: 20
4353
+ })
4354
+ })]
4355
+ }), /* @__PURE__ */ jsx(Controller, {
4356
+ name: "content",
4357
+ control,
4358
+ render: ({
4359
+ field
4360
+ }) => /* @__PURE__ */ jsx(RichTextEditor, __spreadValues({
4361
+ sx: {
4362
+ flex: 1
4363
+ }
4364
+ }, field))
4365
+ })]
4366
+ })
4367
+ });
4368
+ }
4369
+ function updateSchema(legacyConf) {
4370
+ if ("variables" in legacyConf) {
4371
+ return legacyConf;
4372
+ }
4373
+ const {
4374
+ align,
4375
+ size,
4376
+ weight,
4377
+ color: color2,
4378
+ content: {
4379
+ prefix = "",
4380
+ data_field = "value",
4381
+ formatter = {
4382
+ output: "number",
4383
+ mantissa: 0
4384
+ },
4385
+ postfix = ""
4386
+ } = {}
4387
+ } = legacyConf;
4388
+ return {
4389
+ align,
4390
+ template: `${prefix} \${value} ${postfix}`,
4391
+ variables: [
4392
+ {
4393
+ name: "value",
4394
+ data_field,
4395
+ aggregation: "none",
4396
+ formatter,
4397
+ color: color2,
4398
+ weight,
4399
+ size
4400
+ }
4401
+ ]
4402
+ };
4403
+ }
4404
+ const options = [{
4405
+ label: "None",
4406
+ value: "none"
2631
4407
  }, {
2632
- label: "500",
2633
- value: 25
4408
+ label: "Sum",
4409
+ value: "sum"
2634
4410
  }, {
2635
- label: "700",
2636
- value: 50
4411
+ label: "Mean",
4412
+ value: "mean"
2637
4413
  }, {
2638
- label: "semibold",
2639
- value: 75
4414
+ label: "Median",
4415
+ value: "median"
2640
4416
  }, {
2641
- label: "bold",
2642
- value: 100
4417
+ label: "Max",
4418
+ value: "max"
4419
+ }, {
4420
+ label: "Min",
4421
+ value: "min"
2643
4422
  }];
2644
- function _MantineFontWeightSlider({
4423
+ function _AggregationSelector({
2645
4424
  label,
2646
4425
  value,
2647
4426
  onChange
2648
4427
  }, ref) {
2649
- var _a, _b;
2650
- const [mark, setMark] = React.useState((_b = (_a = marks.find((m2) => m2.label === value)) == null ? void 0 : _a.value) != null ? _b : marks[0].value);
2651
- React.useEffect(() => {
2652
- const match = marks.find((s) => s.value === mark);
2653
- if (match) {
2654
- onChange(match.label);
2655
- }
2656
- }, [mark]);
2657
- return /* @__PURE__ */ jsxs(Group, {
2658
- direction: "column",
2659
- grow: true,
2660
- spacing: "xs",
2661
- mb: "lg",
2662
- children: [/* @__PURE__ */ jsx(Text, {
2663
- children: label
2664
- }), /* @__PURE__ */ jsx(Slider, {
2665
- label: null,
2666
- marks,
2667
- value: mark,
2668
- onChange: setMark,
2669
- step: 25,
2670
- placeholder: "Pick a font size",
2671
- ref
2672
- })]
4428
+ return /* @__PURE__ */ jsx(Select, {
4429
+ ref,
4430
+ label,
4431
+ data: options,
4432
+ value,
4433
+ onChange
2673
4434
  });
2674
4435
  }
2675
- const MantineFontWeightSlider = React.forwardRef(_MantineFontWeightSlider);
2676
- function _TextArrayInput({
4436
+ const AggregationSelector = React.forwardRef(_AggregationSelector);
4437
+ function _ColorArrayInput({
2677
4438
  label,
2678
4439
  value,
2679
4440
  onChange
@@ -2694,6 +4455,10 @@ function _TextArrayInput({
2694
4455
  const submit = () => {
2695
4456
  onChange(values.map((s) => s.toString()));
2696
4457
  };
4458
+ const theme = useMantineTheme();
4459
+ const swatches = React.useMemo(() => {
4460
+ return Object.entries(theme.colors).map(([_color, profile]) => profile[6]);
4461
+ }, [theme]);
2697
4462
  return /* @__PURE__ */ jsxs(Fragment, {
2698
4463
  children: [/* @__PURE__ */ jsxs(Group, {
2699
4464
  position: "left",
@@ -2711,15 +4476,15 @@ function _TextArrayInput({
2711
4476
  })
2712
4477
  })]
2713
4478
  }), /* @__PURE__ */ jsxs(Group, {
2714
- children: [values.map((v, i) => /* @__PURE__ */ jsx(TextInput, {
4479
+ children: [values.map((v, i) => /* @__PURE__ */ jsx(ColorInput, {
2715
4480
  value: v,
2716
- onChange: (event) => {
2717
- const newValue = event.currentTarget.value;
4481
+ onChange: (color2) => {
2718
4482
  setValues((s) => {
2719
- s.splice(i, 1, newValue);
4483
+ s.splice(i, 1, color2);
2720
4484
  return [...s];
2721
4485
  });
2722
4486
  },
4487
+ swatches,
2723
4488
  rightSection: /* @__PURE__ */ jsx(ActionIcon, {
2724
4489
  onClick: () => del(i),
2725
4490
  color: "red",
@@ -2741,8 +4506,58 @@ function _TextArrayInput({
2741
4506
  })]
2742
4507
  });
2743
4508
  }
2744
- const TextArrayInput = React.forwardRef(_TextArrayInput);
2745
- function _ColorArrayInput({
4509
+ const ColorArrayInput = React.forwardRef(_ColorArrayInput);
4510
+ const marks = [{
4511
+ label: "initial",
4512
+ value: 0
4513
+ }, {
4514
+ label: "500",
4515
+ value: 25
4516
+ }, {
4517
+ label: "700",
4518
+ value: 50
4519
+ }, {
4520
+ label: "semibold",
4521
+ value: 75
4522
+ }, {
4523
+ label: "bold",
4524
+ value: 100
4525
+ }];
4526
+ function _MantineFontWeightSlider({
4527
+ label,
4528
+ value,
4529
+ onChange
4530
+ }, ref) {
4531
+ var _a, _b;
4532
+ const [mark, setMark] = React.useState((_b = (_a = marks.find((m2) => m2.label === value)) == null ? void 0 : _a.value) != null ? _b : marks[0].value);
4533
+ React.useEffect(() => {
4534
+ const match = marks.find((s) => s.value === mark);
4535
+ if (match) {
4536
+ onChange(match.label);
4537
+ }
4538
+ }, [mark]);
4539
+ return /* @__PURE__ */ jsxs(Group, {
4540
+ direction: "column",
4541
+ grow: true,
4542
+ spacing: 0,
4543
+ mt: "sm",
4544
+ mb: "lg",
4545
+ children: [/* @__PURE__ */ jsx(Text, {
4546
+ size: "sm",
4547
+ children: label
4548
+ }), /* @__PURE__ */ jsx(Slider, {
4549
+ label: null,
4550
+ marks,
4551
+ value: mark,
4552
+ onChange: setMark,
4553
+ step: 25,
4554
+ placeholder: "Pick a font size",
4555
+ ref
4556
+ })]
4557
+ });
4558
+ }
4559
+ const MantineFontWeightSlider = React.forwardRef(_MantineFontWeightSlider);
4560
+ function _TextArrayInput({
2746
4561
  label,
2747
4562
  value,
2748
4563
  onChange
@@ -2763,10 +4578,6 @@ function _ColorArrayInput({
2763
4578
  const submit = () => {
2764
4579
  onChange(values.map((s) => s.toString()));
2765
4580
  };
2766
- const theme = useMantineTheme();
2767
- const swatches = React.useMemo(() => {
2768
- return Object.entries(theme.colors).map(([_color, profile]) => profile[6]);
2769
- }, [theme]);
2770
4581
  return /* @__PURE__ */ jsxs(Fragment, {
2771
4582
  children: [/* @__PURE__ */ jsxs(Group, {
2772
4583
  position: "left",
@@ -2784,15 +4595,15 @@ function _ColorArrayInput({
2784
4595
  })
2785
4596
  })]
2786
4597
  }), /* @__PURE__ */ jsxs(Group, {
2787
- children: [values.map((v, i) => /* @__PURE__ */ jsx(ColorInput, {
4598
+ children: [values.map((v, i) => /* @__PURE__ */ jsx(TextInput, {
2788
4599
  value: v,
2789
- onChange: (color2) => {
4600
+ onChange: (event) => {
4601
+ const newValue = event.currentTarget.value;
2790
4602
  setValues((s) => {
2791
- s.splice(i, 1, color2);
4603
+ s.splice(i, 1, newValue);
2792
4604
  return [...s];
2793
4605
  });
2794
4606
  },
2795
- swatches,
2796
4607
  rightSection: /* @__PURE__ */ jsx(ActionIcon, {
2797
4608
  onClick: () => del(i),
2798
4609
  color: "red",
@@ -2814,42 +4625,281 @@ function _ColorArrayInput({
2814
4625
  })]
2815
4626
  });
2816
4627
  }
2817
- const ColorArrayInput = React.forwardRef(_ColorArrayInput);
2818
- function VizStatsPanel({
2819
- conf,
2820
- setConf,
4628
+ const TextArrayInput = React.forwardRef(_TextArrayInput);
4629
+ const TemplateInput = React.forwardRef(function TemplateInput2(_a, ref) {
4630
+ var _b = _a, {
4631
+ value,
4632
+ onChange
4633
+ } = _b, rest = __objRest(_b, [
4634
+ "value",
4635
+ "onChange"
4636
+ ]);
4637
+ return /* @__PURE__ */ jsx(TextInput, __spreadValues({
4638
+ ref,
4639
+ value,
4640
+ onChange
4641
+ }, rest));
4642
+ });
4643
+ function TemplateVariableField({
4644
+ value,
4645
+ onChange,
2821
4646
  data
2822
4647
  }) {
2823
- const defaultValues = _.merge({}, {
2824
- align: "center",
2825
- size: "100px",
4648
+ const colorType = value.color.type;
4649
+ const handleChange = (path, newValue) => {
4650
+ const v = _.cloneDeep(value);
4651
+ _.set(v, path, newValue);
4652
+ onChange(v);
4653
+ };
4654
+ return /* @__PURE__ */ jsxs(Box, {
4655
+ px: "sm",
4656
+ py: "md",
4657
+ children: [/* @__PURE__ */ jsx(Text, {
4658
+ weight: "bold",
4659
+ pb: 0,
4660
+ children: value.name
4661
+ }), /* @__PURE__ */ jsx(Divider, {
4662
+ my: "xs",
4663
+ label: "Data",
4664
+ labelPosition: "center"
4665
+ }), /* @__PURE__ */ jsxs(Group, {
4666
+ direction: "row",
4667
+ grow: true,
4668
+ noWrap: true,
4669
+ children: [/* @__PURE__ */ jsx(TextInput, {
4670
+ label: "Name",
4671
+ required: true,
4672
+ value: value.name,
4673
+ onChange: (e) => handleChange("name", e.currentTarget.value)
4674
+ }), /* @__PURE__ */ jsx(DataFieldSelector, {
4675
+ label: "Data Field",
4676
+ required: true,
4677
+ data,
4678
+ value: value.data_field,
4679
+ onChange: (v) => handleChange("data_field", v)
4680
+ }), /* @__PURE__ */ jsx(AggregationSelector, {
4681
+ label: "Aggregation",
4682
+ value: value.aggregation,
4683
+ onChange: (v) => handleChange("aggregation", v)
4684
+ })]
4685
+ }), /* @__PURE__ */ jsx(NumbroFormatSelector, {
4686
+ value: value.formatter,
4687
+ onChange: (v) => handleChange("formatter", v)
4688
+ }), /* @__PURE__ */ jsx(Divider, {
4689
+ my: "xs",
4690
+ label: "Typography",
4691
+ labelPosition: "center"
4692
+ }), /* @__PURE__ */ jsx(Group, {
4693
+ direction: "column",
4694
+ grow: true,
4695
+ children: /* @__PURE__ */ jsx(TextInput, {
4696
+ label: "Font Size",
4697
+ placeholder: "10px, 1em, 1rem, 100%...",
4698
+ sx: {
4699
+ flex: 1
4700
+ },
4701
+ value: value.size,
4702
+ onChange: (e) => handleChange("size", e.currentTarget.value)
4703
+ })
4704
+ }), /* @__PURE__ */ jsx(Group, {
4705
+ position: "apart",
4706
+ grow: true,
4707
+ sx: {
4708
+ "> *": {
4709
+ flexGrow: 1,
4710
+ maxWidth: "100%"
4711
+ }
4712
+ },
4713
+ children: /* @__PURE__ */ jsx(MantineFontWeightSlider, {
4714
+ label: "Font Weight",
4715
+ value: value.weight,
4716
+ onChange: (v) => handleChange("weight", v)
4717
+ })
4718
+ }), /* @__PURE__ */ jsx(Divider, {
4719
+ my: "xs",
4720
+ label: "Style",
4721
+ labelPosition: "center"
4722
+ }), /* @__PURE__ */ jsxs(Group, {
4723
+ direction: "column",
4724
+ grow: true,
4725
+ children: [/* @__PURE__ */ jsx(Select, {
4726
+ label: "Color Type",
4727
+ data: [{
4728
+ label: "Static Color",
4729
+ value: "static"
4730
+ }, {
4731
+ label: "Continuous Color",
4732
+ value: "continuous"
4733
+ }],
4734
+ value: value.color.type,
4735
+ onChange: (v) => handleChange("color.type", v)
4736
+ }), colorType === "static" && /* @__PURE__ */ jsx(MantineColorSelector, {
4737
+ value: value.color.staticColor,
4738
+ onChange: (v) => handleChange("color.staticColor", v)
4739
+ }), colorType === "continuous" && /* @__PURE__ */ jsxs(Fragment, {
4740
+ children: [/* @__PURE__ */ jsx(TextArrayInput, {
4741
+ label: "Value Range",
4742
+ value: value.color.valueRange,
4743
+ onChange: (v) => handleChange("color.valueRange", v)
4744
+ }), /* @__PURE__ */ jsx(ColorArrayInput, {
4745
+ label: "Color Range",
4746
+ value: value.color.colorRange,
4747
+ onChange: (v) => handleChange("color.colorRange", v)
4748
+ })]
4749
+ })]
4750
+ })]
4751
+ });
4752
+ }
4753
+ function VariableField({
4754
+ control,
4755
+ index: index2,
4756
+ remove,
4757
+ data
4758
+ }) {
4759
+ return /* @__PURE__ */ jsxs(Group, {
4760
+ direction: "column",
4761
+ grow: true,
4762
+ my: "sm",
4763
+ p: 0,
4764
+ sx: {
4765
+ border: "1px solid #eee",
4766
+ borderTopColor: "#333",
4767
+ borderTopWidth: 2,
4768
+ position: "relative"
4769
+ },
4770
+ children: [/* @__PURE__ */ jsx(Controller, {
4771
+ name: `variables.${index2}`,
4772
+ control,
4773
+ render: ({
4774
+ field
4775
+ }) => /* @__PURE__ */ jsx(TemplateVariableField, __spreadValues({
4776
+ data
4777
+ }, field))
4778
+ }), /* @__PURE__ */ jsx(ActionIcon, {
4779
+ color: "red",
4780
+ variant: "hover",
4781
+ onClick: () => remove(index2),
4782
+ sx: {
4783
+ position: "absolute",
4784
+ top: 15,
4785
+ right: 5
4786
+ },
4787
+ children: /* @__PURE__ */ jsx(Trash, {
4788
+ size: 16
4789
+ })
4790
+ })]
4791
+ }, index2);
4792
+ }
4793
+ function VariablesField({
4794
+ control,
4795
+ watch,
4796
+ data
4797
+ }) {
4798
+ const {
4799
+ fields,
4800
+ append,
4801
+ remove
4802
+ } = useFieldArray({
4803
+ control,
4804
+ name: "variables"
4805
+ });
4806
+ const watchFieldArray = watch("variables");
4807
+ const controlledFields = fields.map((field, index2) => {
4808
+ return __spreadValues(__spreadValues({}, field), watchFieldArray[index2]);
4809
+ });
4810
+ const add = () => append({
4811
+ name: randomId(),
4812
+ size: "20px",
2826
4813
  weight: "bold",
2827
4814
  color: {
2828
4815
  type: "static",
2829
- staticColor: "red"
4816
+ staticColor: "blue"
2830
4817
  },
2831
- content: {
2832
- prefix: "",
4818
+ data_field: "",
4819
+ aggregation: "none",
4820
+ formatter: {
4821
+ output: "number",
4822
+ mantissa: 0
4823
+ }
4824
+ });
4825
+ return /* @__PURE__ */ jsxs(Group, {
4826
+ direction: "column",
4827
+ grow: true,
4828
+ children: [controlledFields.map((_variableItem, index2) => /* @__PURE__ */ jsx(VariableField, {
4829
+ control,
4830
+ index: index2,
4831
+ remove,
4832
+ data
4833
+ })), /* @__PURE__ */ jsx(Group, {
4834
+ position: "center",
4835
+ mt: "xs",
4836
+ children: /* @__PURE__ */ jsx(Button, {
4837
+ onClick: add,
4838
+ children: "Add a Variable"
4839
+ })
4840
+ })]
4841
+ });
4842
+ }
4843
+ function getInitialConf() {
4844
+ return {
4845
+ align: "center",
4846
+ template: "The variable ${value} is defined in Variables section",
4847
+ variables: [{
4848
+ name: "value",
4849
+ size: "20px",
4850
+ weight: "bold",
4851
+ color: {
4852
+ type: "static",
4853
+ staticColor: "blue"
4854
+ },
2833
4855
  data_field: "",
4856
+ aggregation: "none",
2834
4857
  formatter: {
2835
4858
  output: "number",
2836
4859
  mantissa: 0
2837
- },
2838
- postfix: ""
4860
+ }
4861
+ }]
4862
+ };
4863
+ }
4864
+ function VizStatsPanel({
4865
+ conf,
4866
+ setConf,
4867
+ data
4868
+ }) {
4869
+ const defaultValues = React.useMemo(() => {
4870
+ const {
4871
+ align,
4872
+ template = "",
4873
+ variables = []
4874
+ } = updateSchema(conf);
4875
+ if (!align) {
4876
+ return getInitialConf();
2839
4877
  }
2840
- }, conf);
4878
+ return {
4879
+ variables,
4880
+ template,
4881
+ align
4882
+ };
4883
+ }, [conf]);
4884
+ React.useEffect(() => {
4885
+ const configMalformed = !_.isEqual(conf, defaultValues);
4886
+ if (configMalformed) {
4887
+ setConf(defaultValues);
4888
+ }
4889
+ }, [conf, defaultValues]);
2841
4890
  const {
2842
4891
  control,
2843
4892
  handleSubmit,
2844
4893
  watch,
2845
- formState: {
2846
- isDirty
2847
- }
4894
+ getValues
2848
4895
  } = useForm({
2849
4896
  defaultValues
2850
4897
  });
2851
- const colorType = watch("color.type");
2852
- watch("color.valueField");
4898
+ watch(["variables", "template"]);
4899
+ const values = getValues();
4900
+ const changed = React.useMemo(() => {
4901
+ return !_.isEqual(values, conf);
4902
+ }, [values, conf]);
2853
4903
  return /* @__PURE__ */ jsx(Group, {
2854
4904
  direction: "column",
2855
4905
  mt: "md",
@@ -2874,166 +4924,32 @@ function VizStatsPanel({
2874
4924
  mr: 5,
2875
4925
  variant: "filled",
2876
4926
  color: "blue",
2877
- disabled: !isDirty,
4927
+ disabled: !changed,
2878
4928
  children: /* @__PURE__ */ jsx(DeviceFloppy, {
2879
4929
  size: 20
2880
4930
  })
2881
4931
  })]
2882
- }), /* @__PURE__ */ jsxs(Accordion, {
2883
- offsetIcon: false,
2884
- multiple: true,
2885
- initialState: {
2886
- 0: true,
2887
- 2: true
2888
- },
2889
- children: [/* @__PURE__ */ jsx(Accordion.Item, {
2890
- label: "Content",
2891
- children: /* @__PURE__ */ jsxs(Group, {
2892
- direction: "column",
2893
- grow: true,
2894
- children: [/* @__PURE__ */ jsxs(Group, {
2895
- direction: "row",
2896
- grow: true,
2897
- noWrap: true,
2898
- children: [/* @__PURE__ */ jsx(Controller, {
2899
- name: "content.prefix",
2900
- control,
2901
- render: ({
2902
- field
2903
- }) => /* @__PURE__ */ jsx(TextInput, __spreadValues({
2904
- label: "Prefix",
2905
- sx: {
2906
- flexGrow: 1
2907
- }
2908
- }, field))
2909
- }), /* @__PURE__ */ jsx(Controller, {
2910
- name: "content.data_field",
2911
- control,
2912
- render: ({
2913
- field
2914
- }) => /* @__PURE__ */ jsx(DataFieldSelector, __spreadValues({
2915
- label: "Data Field",
2916
- required: true,
2917
- data
2918
- }, field))
2919
- }), /* @__PURE__ */ jsx(Controller, {
2920
- name: "content.postfix",
2921
- control,
2922
- render: ({
2923
- field
2924
- }) => /* @__PURE__ */ jsx(TextInput, __spreadValues({
2925
- label: "Postfix",
2926
- sx: {
2927
- flexGrow: 1
2928
- }
2929
- }, field))
2930
- })]
2931
- }), /* @__PURE__ */ jsx(Controller, {
2932
- name: "content.formatter",
2933
- control,
2934
- render: ({
2935
- field
2936
- }) => /* @__PURE__ */ jsx(NumbroFormatSelector, __spreadValues({}, field))
2937
- })]
2938
- })
2939
- }), /* @__PURE__ */ jsxs(Accordion.Item, {
2940
- label: "Font",
2941
- children: [/* @__PURE__ */ jsx(Group, {
2942
- direction: "column",
2943
- grow: true,
2944
- children: /* @__PURE__ */ jsx(Controller, {
2945
- name: "size",
2946
- control,
2947
- render: ({
2948
- field
2949
- }) => /* @__PURE__ */ jsx(TextInput, __spreadValues({
2950
- label: "Font Size",
2951
- placeholder: "10px, 1em, 1rem, 100%...",
2952
- sx: {
2953
- flex: 1
2954
- }
2955
- }, field))
2956
- })
2957
- }), /* @__PURE__ */ jsx(Group, {
2958
- position: "apart",
2959
- grow: true,
2960
- sx: {
2961
- "> *": {
2962
- flexGrow: 1,
2963
- maxWidth: "100%"
2964
- }
2965
- },
2966
- children: /* @__PURE__ */ jsx(Controller, {
2967
- name: "weight",
2968
- control,
2969
- render: ({
2970
- field
2971
- }) => /* @__PURE__ */ jsx(MantineFontWeightSlider, __spreadValues({
2972
- label: "Font Weight"
2973
- }, field))
2974
- })
2975
- })]
2976
- }), /* @__PURE__ */ jsx(Accordion.Item, {
2977
- label: "Color",
2978
- children: /* @__PURE__ */ jsxs(Group, {
2979
- direction: "column",
2980
- grow: true,
2981
- children: [/* @__PURE__ */ jsx(Controller, {
2982
- name: "color.type",
2983
- control,
2984
- render: ({
2985
- field
2986
- }) => /* @__PURE__ */ jsx(Select, __spreadValues({
2987
- label: "Color Type",
2988
- data: [{
2989
- label: "Static Color",
2990
- value: "static"
2991
- }, {
2992
- label: "Continuous Color",
2993
- value: "continuous"
2994
- }]
2995
- }, field))
2996
- }), colorType === "static" && /* @__PURE__ */ jsx(Controller, {
2997
- name: "color.staticColor",
2998
- control,
2999
- render: ({
3000
- field
3001
- }) => /* @__PURE__ */ jsx(MantineColorSelector, __spreadValues({}, field))
3002
- }), colorType === "continuous" && /* @__PURE__ */ jsxs(Fragment, {
3003
- children: [/* @__PURE__ */ jsx(Controller, {
3004
- name: "color.valueField",
3005
- control,
3006
- defaultValue: "",
3007
- render: ({
3008
- field
3009
- }) => /* @__PURE__ */ jsx(TextInput, __spreadValues({
3010
- placeholder: "Calculate color with this field",
3011
- label: "Value Field",
3012
- required: true,
3013
- sx: {
3014
- flex: 1
3015
- }
3016
- }, field))
3017
- }), /* @__PURE__ */ jsx(Controller, {
3018
- name: "color.valueRange",
3019
- control,
3020
- render: ({
3021
- field
3022
- }) => /* @__PURE__ */ jsx(TextArrayInput, __spreadValues({
3023
- label: "Value Range"
3024
- }, field))
3025
- }), /* @__PURE__ */ jsx(Controller, {
3026
- name: "color.colorRange",
3027
- control,
3028
- render: ({
3029
- field
3030
- }) => /* @__PURE__ */ jsx(ColorArrayInput, __spreadValues({
3031
- label: "Color Range"
3032
- }, field))
3033
- })]
3034
- })]
3035
- })
3036
- })]
4932
+ }), /* @__PURE__ */ jsx(Controller, {
4933
+ name: "template",
4934
+ control,
4935
+ render: ({
4936
+ field
4937
+ }) => /* @__PURE__ */ jsx(TemplateInput, __spreadValues({
4938
+ label: "Template",
4939
+ py: "md",
4940
+ sx: {
4941
+ flexGrow: 1
4942
+ }
4943
+ }, field))
4944
+ }), /* @__PURE__ */ jsx(Text, {
4945
+ pb: "sm",
4946
+ pt: "md",
4947
+ size: "sm",
4948
+ children: "Variables"
4949
+ }), /* @__PURE__ */ jsx(VariablesField, {
4950
+ control,
4951
+ watch,
4952
+ data
3037
4953
  })]
3038
4954
  })
3039
4955
  });
@@ -3118,17 +5034,17 @@ function ValueTypeSelector({
3118
5034
  sx
3119
5035
  });
3120
5036
  }
3121
- function VizTablePanel(_e) {
3122
- var _f = _e, {
3123
- conf: _g
3124
- } = _f, _h = _g, {
5037
+ function VizTablePanel(_c) {
5038
+ var _d = _c, {
5039
+ conf: _e
5040
+ } = _d, _f = _e, {
3125
5041
  columns
3126
- } = _h, restConf = __objRest(_h, [
5042
+ } = _f, restConf = __objRest(_f, [
3127
5043
  "columns"
3128
5044
  ]), {
3129
5045
  setConf,
3130
5046
  data
3131
- } = _f;
5047
+ } = _d;
3132
5048
  const form = useForm$1({
3133
5049
  initialValues: __spreadValues({
3134
5050
  id_field: "id",
@@ -3474,6 +5390,10 @@ const types = [{
3474
5390
  value: "stats",
3475
5391
  label: "Stats",
3476
5392
  Panel: VizStatsPanel
5393
+ }, {
5394
+ value: "rich-text",
5395
+ label: "Rich Text",
5396
+ Panel: VizRichTextPanel
3477
5397
  }, {
3478
5398
  value: "table",
3479
5399
  label: "Table",
@@ -4152,7 +6072,7 @@ function SelectOrAddQuery({
4152
6072
  chooseDefault();
4153
6073
  }
4154
6074
  }, [id, queries, chooseDefault]);
4155
- const options = React.useMemo(() => {
6075
+ const options2 = React.useMemo(() => {
4156
6076
  return queries.map((d) => ({
4157
6077
  value: d.id,
4158
6078
  label: d.id
@@ -4179,7 +6099,7 @@ function SelectOrAddQuery({
4179
6099
  children: [/* @__PURE__ */ jsx(Text, {
4180
6100
  children: "Select a Query"
4181
6101
  }), /* @__PURE__ */ jsx(Select, {
4182
- data: options,
6102
+ data: options2,
4183
6103
  value: id,
4184
6104
  onChange: setID,
4185
6105
  allowDeselect: false,