@devtable/dashboard 1.19.0 → 1.22.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, SegmentedControl, NumberInput, Switch, 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, JsonInput, Modal, AppShell, Tabs, Menu, Divider, 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";
@@ -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
  /**
@@ -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 median(data) {
1571
+ return quantile(data, 0.5);
1572
+ }
1573
+ return median;
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,6 +2015,95 @@ const defaultOption$1 = {
714
2015
  containLabel: true
715
2016
  }
716
2017
  };
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
+ {
2060
+ data: data.map((d) => d[conf.x_axis_data_key]),
2061
+ name: (_c = conf.x_axis_name) != null ? _c : "",
2062
+ id: "main-x-axis"
2063
+ },
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;
2093
+ }
2094
+ const yAxisIndex = yAxisIndexMap[seriesName];
2095
+ const formatter = (_a = labelFormatters[yAxisIndex]) != null ? _a : labelFormatters.default;
2096
+ return `${seriesName}: ${formatter({ value })}`;
2097
+ });
2098
+ lines.unshift(`<strong>${arr[0].name}</strong>`);
2099
+ return lines.join("<br />");
2100
+ }
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);
717
2107
  function VizCartesianChart({
718
2108
  conf,
719
2109
  data,
@@ -721,108 +2111,7 @@ function VizCartesianChart({
721
2111
  height
722
2112
  }) {
723
2113
  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: {
779
- data: data.map((d) => d[conf.x_axis_data_key]),
780
- name: (_c = conf.x_axis_name) != null ? _c : ""
781
- },
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
793
- }
794
- });
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
- }
823
- }
824
- };
825
- return _.merge({}, defaultOption$1, customOptions);
2114
+ return getOption(conf, data);
826
2115
  }, [conf, data]);
827
2116
  if (!width || !height) {
828
2117
  return null;
@@ -1610,7 +2899,6 @@ function renderViz(width, height, data, viz) {
1610
2899
  switch (viz.type) {
1611
2900
  case "sunburst":
1612
2901
  return /* @__PURE__ */ jsx(Sunbrust, __spreadValues({}, props));
1613
- case "line-bar":
1614
2902
  case "cartesian":
1615
2903
  return /* @__PURE__ */ jsx(VizCartesianChart, __spreadValues({}, props));
1616
2904
  case "table":
@@ -1913,6 +3201,139 @@ function _MantineColorSelector({
1913
3201
  });
1914
3202
  }
1915
3203
  const MantineColorSelector = React.forwardRef(_MantineColorSelector);
3204
+ function BarFields({
3205
+ control,
3206
+ index: index2
3207
+ }) {
3208
+ return /* @__PURE__ */ jsxs(Group, {
3209
+ direction: "row",
3210
+ grow: true,
3211
+ align: "top",
3212
+ children: [/* @__PURE__ */ jsx(Controller, {
3213
+ name: `series.${index2}.stack`,
3214
+ control,
3215
+ render: ({
3216
+ field
3217
+ }) => /* @__PURE__ */ jsx(TextInput, __spreadValues({
3218
+ label: "Stack",
3219
+ placeholder: "Stack bars by this ID",
3220
+ sx: {
3221
+ flexGrow: 1
3222
+ }
3223
+ }, field))
3224
+ }), /* @__PURE__ */ jsx(Controller, {
3225
+ name: `series.${index2}.barWidth`,
3226
+ control,
3227
+ render: ({
3228
+ field
3229
+ }) => /* @__PURE__ */ jsx(TextInput, __spreadValues({
3230
+ label: "Bar Width",
3231
+ sx: {
3232
+ flexGrow: 1
3233
+ }
3234
+ }, field))
3235
+ })]
3236
+ });
3237
+ }
3238
+ const stepOptions = [{
3239
+ label: "off",
3240
+ value: "false"
3241
+ }, {
3242
+ label: "start",
3243
+ value: "start"
3244
+ }, {
3245
+ label: "middle",
3246
+ value: "middle"
3247
+ }, {
3248
+ label: "end",
3249
+ value: "end"
3250
+ }];
3251
+ function LineFields({
3252
+ control,
3253
+ index: index2
3254
+ }) {
3255
+ return /* @__PURE__ */ jsxs(Group, {
3256
+ direction: "row",
3257
+ grow: true,
3258
+ align: "center",
3259
+ children: [/* @__PURE__ */ jsx(Controller, {
3260
+ name: `series.${index2}.step`,
3261
+ control,
3262
+ render: ({
3263
+ field
3264
+ }) => /* @__PURE__ */ jsx(Select, __spreadProps(__spreadValues({
3265
+ label: "Step",
3266
+ data: stepOptions,
3267
+ sx: {
3268
+ flexGrow: 1,
3269
+ maxWidth: "48%"
3270
+ }
3271
+ }, field), {
3272
+ value: String(field.value),
3273
+ onChange: (v) => {
3274
+ const step = v === "false" ? false : v;
3275
+ field.onChange(step);
3276
+ }
3277
+ }))
3278
+ }), /* @__PURE__ */ jsx(Controller, {
3279
+ name: `series.${index2}.smooth`,
3280
+ control,
3281
+ render: ({
3282
+ field
3283
+ }) => /* @__PURE__ */ jsx(Box, {
3284
+ sx: {
3285
+ flexGrow: 1
3286
+ },
3287
+ children: /* @__PURE__ */ jsx(Switch, {
3288
+ label: "Smooth Line",
3289
+ checked: field.value,
3290
+ onChange: (event) => field.onChange(event.currentTarget.checked)
3291
+ })
3292
+ })
3293
+ })]
3294
+ });
3295
+ }
3296
+ const symbolSizeOptions = Array.from(new Array(9), (_2, i) => ({
3297
+ label: String(i + 1),
3298
+ value: i + 1
3299
+ }));
3300
+ function ScatterFields({
3301
+ control,
3302
+ index: index2
3303
+ }) {
3304
+ return /* @__PURE__ */ jsx(Group, {
3305
+ direction: "row",
3306
+ grow: true,
3307
+ align: "center",
3308
+ children: /* @__PURE__ */ jsx(Controller, {
3309
+ name: `series.${index2}.symbolSize`,
3310
+ control,
3311
+ render: ({
3312
+ field
3313
+ }) => /* @__PURE__ */ jsxs(Group, {
3314
+ direction: "column",
3315
+ noWrap: true,
3316
+ sx: {
3317
+ flexGrow: 1
3318
+ },
3319
+ pb: 16,
3320
+ spacing: 4,
3321
+ children: [/* @__PURE__ */ jsx(Text, {
3322
+ size: "sm",
3323
+ children: "Size"
3324
+ }), /* @__PURE__ */ jsx(Slider, __spreadProps(__spreadValues({
3325
+ min: 1,
3326
+ max: 10,
3327
+ marks: symbolSizeOptions
3328
+ }, field), {
3329
+ sx: {
3330
+ width: "100%"
3331
+ }
3332
+ }))]
3333
+ })
3334
+ })
3335
+ });
3336
+ }
1916
3337
  const labelPositions = [{
1917
3338
  label: "off",
1918
3339
  value: ""
@@ -1993,8 +3414,7 @@ function SeriesItemField({
1993
3414
  value: "bar"
1994
3415
  }, {
1995
3416
  label: "Scatter",
1996
- value: "scatter",
1997
- disabled: true
3417
+ value: "scatter"
1998
3418
  }, {
1999
3419
  label: "Boxplot",
2000
3420
  value: "boxplot",
@@ -2061,37 +3481,18 @@ function SeriesItemField({
2061
3481
  sx: {
2062
3482
  flex: 1
2063
3483
  }
2064
- }));
2065
- }
2066
- })]
2067
- }), type === "bar" && /* @__PURE__ */ jsxs(Group, {
2068
- direction: "row",
2069
- grow: true,
2070
- align: "top",
2071
- children: [/* @__PURE__ */ jsx(Controller, {
2072
- name: `series.${index2}.stack`,
2073
- control,
2074
- render: ({
2075
- field
2076
- }) => /* @__PURE__ */ jsx(TextInput, __spreadValues({
2077
- label: "Stack",
2078
- placeholder: "Stack bars by this ID",
2079
- sx: {
2080
- flexGrow: 1
2081
- }
2082
- }, field))
2083
- }), /* @__PURE__ */ jsx(Controller, {
2084
- name: `series.${index2}.barWidth`,
2085
- control,
2086
- render: ({
2087
- field
2088
- }) => /* @__PURE__ */ jsx(TextInput, __spreadValues({
2089
- label: "Bar Width",
2090
- sx: {
2091
- flexGrow: 1
2092
- }
2093
- }, field))
3484
+ }));
3485
+ }
2094
3486
  })]
3487
+ }), type === "line" && /* @__PURE__ */ jsx(LineFields, {
3488
+ index: index2,
3489
+ control
3490
+ }), type === "bar" && /* @__PURE__ */ jsx(BarFields, {
3491
+ index: index2,
3492
+ control
3493
+ }), type === "scatter" && /* @__PURE__ */ jsx(ScatterFields, {
3494
+ index: index2,
3495
+ control
2095
3496
  }), /* @__PURE__ */ jsx(Controller, {
2096
3497
  name: `series.${index2}.label_position`,
2097
3498
  control,
@@ -2144,7 +3545,7 @@ function SeriesField({
2144
3545
  control,
2145
3546
  name: "series"
2146
3547
  });
2147
- const watchFieldArray = watch("y_axes");
3548
+ const watchFieldArray = watch("series");
2148
3549
  const controlledFields = fields.map((field, index2) => {
2149
3550
  return __spreadValues(__spreadValues({}, field), watchFieldArray[index2]);
2150
3551
  });
@@ -2152,11 +3553,14 @@ function SeriesField({
2152
3553
  type: "bar",
2153
3554
  name: randomId(),
2154
3555
  showSymbol: false,
3556
+ symbolSize: 5,
2155
3557
  y_axis_data_key: "value",
2156
3558
  yAxisIndex: 0,
2157
3559
  label_position: "top",
2158
3560
  stack: "",
2159
- color: "#000"
3561
+ color: "#000",
3562
+ step: false,
3563
+ smooth: false
2160
3564
  });
2161
3565
  const yAxisOptions = React.useMemo(() => {
2162
3566
  return getValues().y_axes.map(({
@@ -2169,11 +3573,7 @@ function SeriesField({
2169
3573
  return /* @__PURE__ */ jsxs(Group, {
2170
3574
  direction: "column",
2171
3575
  grow: true,
2172
- children: [/* @__PURE__ */ jsx(Text, {
2173
- mt: "xl",
2174
- mb: 0,
2175
- children: "Series"
2176
- }), controlledFields.map((seriesItem, index2) => /* @__PURE__ */ jsx(SeriesItemField, {
3576
+ children: [controlledFields.map((seriesItem, index2) => /* @__PURE__ */ jsx(SeriesItemField, {
2177
3577
  control,
2178
3578
  index: index2,
2179
3579
  remove,
@@ -2334,11 +3734,7 @@ function YAxesField({
2334
3734
  return /* @__PURE__ */ jsxs(Group, {
2335
3735
  direction: "column",
2336
3736
  grow: true,
2337
- children: [/* @__PURE__ */ jsx(Text, {
2338
- mt: "xl",
2339
- mb: 0,
2340
- children: "Y Axes"
2341
- }), controlledFields.map((field, index2) => /* @__PURE__ */ jsx(YAxisField, {
3737
+ children: [controlledFields.map((field, index2) => /* @__PURE__ */ jsx(YAxisField, {
2342
3738
  control,
2343
3739
  index: index2,
2344
3740
  remove
@@ -2352,28 +3748,248 @@ function YAxesField({
2352
3748
  })]
2353
3749
  });
2354
3750
  }
3751
+ const regressionOptions = [{
3752
+ label: "Linear",
3753
+ value: "linear"
3754
+ }, {
3755
+ label: "Exponential",
3756
+ value: "exponential"
3757
+ }, {
3758
+ label: "Logarithmic",
3759
+ value: "logarithmic"
3760
+ }, {
3761
+ label: "Polynomial",
3762
+ value: "polynomial"
3763
+ }];
3764
+ function RegressionField({
3765
+ control,
3766
+ regressionItem,
3767
+ index: index2,
3768
+ remove,
3769
+ yAxisOptions,
3770
+ data
3771
+ }) {
3772
+ const method = regressionItem.transform.config.method;
3773
+ return /* @__PURE__ */ jsxs(Group, {
3774
+ direction: "column",
3775
+ grow: true,
3776
+ my: 0,
3777
+ p: "md",
3778
+ pr: 40,
3779
+ sx: {
3780
+ border: "1px solid #eee",
3781
+ position: "relative"
3782
+ },
3783
+ children: [/* @__PURE__ */ jsx(Controller, {
3784
+ name: `regressions.${index2}.name`,
3785
+ control,
3786
+ render: ({
3787
+ field
3788
+ }) => /* @__PURE__ */ jsx(TextInput, __spreadValues({
3789
+ label: "Name",
3790
+ required: true,
3791
+ sx: {
3792
+ flex: 1
3793
+ }
3794
+ }, field))
3795
+ }), /* @__PURE__ */ jsxs(Group, {
3796
+ direction: "row",
3797
+ grow: true,
3798
+ noWrap: true,
3799
+ children: [/* @__PURE__ */ jsx(Controller, {
3800
+ name: `regressions.${index2}.y_axis_data_key`,
3801
+ control,
3802
+ render: ({
3803
+ field
3804
+ }) => /* @__PURE__ */ jsx(DataFieldSelector, __spreadValues({
3805
+ label: "Value Field",
3806
+ required: true,
3807
+ data,
3808
+ sx: {
3809
+ flex: 1
3810
+ }
3811
+ }, field))
3812
+ }), /* @__PURE__ */ jsx(Controller, {
3813
+ name: `regressions.${index2}.plot.yAxisIndex`,
3814
+ control,
3815
+ render: (_a) => {
3816
+ var {
3817
+ field: _b
3818
+ } = _a, _c = _b, {
3819
+ value,
3820
+ onChange
3821
+ } = _c, rest = __objRest(_c, [
3822
+ "value",
3823
+ "onChange"
3824
+ ]);
3825
+ var _a2;
3826
+ return /* @__PURE__ */ jsx(Select, __spreadProps(__spreadValues({
3827
+ label: "Y Axis",
3828
+ data: yAxisOptions,
3829
+ disabled: yAxisOptions.length === 0
3830
+ }, rest), {
3831
+ value: (_a2 = value == null ? void 0 : value.toString()) != null ? _a2 : "",
3832
+ onChange: (value2) => {
3833
+ if (!value2) {
3834
+ onChange(0);
3835
+ return;
3836
+ }
3837
+ onChange(Number(value2));
3838
+ },
3839
+ sx: {
3840
+ flex: 1
3841
+ }
3842
+ }));
3843
+ }
3844
+ })]
3845
+ }), /* @__PURE__ */ jsxs(Group, {
3846
+ direction: "row",
3847
+ grow: true,
3848
+ noWrap: true,
3849
+ children: [/* @__PURE__ */ jsx(Controller, {
3850
+ name: `regressions.${index2}.transform.config.method`,
3851
+ control,
3852
+ render: ({
3853
+ field
3854
+ }) => /* @__PURE__ */ jsx(Select, __spreadValues({
3855
+ label: "Method",
3856
+ data: regressionOptions,
3857
+ sx: {
3858
+ flex: 1
3859
+ }
3860
+ }, field))
3861
+ }), method === "polynomial" && /* @__PURE__ */ jsx(Controller, {
3862
+ name: `regressions.${index2}.transform.config.order`,
3863
+ control,
3864
+ render: ({
3865
+ field
3866
+ }) => /* @__PURE__ */ jsx(NumberInput, __spreadValues({
3867
+ label: "Order",
3868
+ sx: {
3869
+ flex: 1
3870
+ }
3871
+ }, field))
3872
+ })]
3873
+ }), /* @__PURE__ */ jsxs(Group, {
3874
+ direction: "column",
3875
+ grow: true,
3876
+ spacing: 4,
3877
+ children: [/* @__PURE__ */ jsx(Text, {
3878
+ size: "sm",
3879
+ children: "Color"
3880
+ }), /* @__PURE__ */ jsx(Controller, {
3881
+ name: `regressions.${index2}.plot.color`,
3882
+ control,
3883
+ render: ({
3884
+ field
3885
+ }) => /* @__PURE__ */ jsx(MantineColorSelector, __spreadValues({}, field))
3886
+ })]
3887
+ }), /* @__PURE__ */ jsx(ActionIcon, {
3888
+ color: "red",
3889
+ variant: "hover",
3890
+ onClick: () => remove(index2),
3891
+ sx: {
3892
+ position: "absolute",
3893
+ top: 15,
3894
+ right: 5
3895
+ },
3896
+ children: /* @__PURE__ */ jsx(Trash, {
3897
+ size: 16
3898
+ })
3899
+ })]
3900
+ }, index2);
3901
+ }
3902
+ function RegressionsField({
3903
+ control,
3904
+ watch,
3905
+ getValues,
3906
+ data
3907
+ }) {
3908
+ const {
3909
+ fields,
3910
+ append,
3911
+ remove
3912
+ } = useFieldArray({
3913
+ control,
3914
+ name: "regressions"
3915
+ });
3916
+ const watchFieldArray = watch("regressions");
3917
+ const controlledFields = fields.map((field, index2) => {
3918
+ return __spreadValues(__spreadValues({}, field), watchFieldArray[index2]);
3919
+ });
3920
+ const yAxisOptions = React.useMemo(() => {
3921
+ return getValues().y_axes.map(({
3922
+ name
3923
+ }, index2) => ({
3924
+ label: name,
3925
+ value: index2.toString()
3926
+ }));
3927
+ }, [getValues]);
3928
+ const add = () => append({
3929
+ transform: {
3930
+ type: "ecStat:regression",
3931
+ config: {
3932
+ method: "linear",
3933
+ order: 1,
3934
+ formulaOn: "end"
3935
+ }
3936
+ },
3937
+ name: "",
3938
+ y_axis_data_key: "",
3939
+ plot: {
3940
+ type: "line",
3941
+ yAxisIndex: 0,
3942
+ color: "#666666"
3943
+ }
3944
+ });
3945
+ return /* @__PURE__ */ jsxs(Group, {
3946
+ direction: "column",
3947
+ grow: true,
3948
+ children: [controlledFields.map((regressionItem, index2) => /* @__PURE__ */ jsx(RegressionField, {
3949
+ regressionItem,
3950
+ control,
3951
+ index: index2,
3952
+ remove,
3953
+ yAxisOptions,
3954
+ data
3955
+ })), /* @__PURE__ */ jsx(Group, {
3956
+ position: "center",
3957
+ mt: "xs",
3958
+ children: /* @__PURE__ */ jsx(Button, {
3959
+ onClick: add,
3960
+ children: "Add a Regression Line"
3961
+ })
3962
+ })]
3963
+ });
3964
+ }
2355
3965
  function withDefaults(series) {
2356
3966
  function setDefaults({
2357
3967
  type,
2358
3968
  name,
2359
3969
  showSymbol,
3970
+ symbolSize = 5,
2360
3971
  y_axis_data_key = "value",
2361
3972
  yAxisIndex = 0,
2362
3973
  label_position = "top",
2363
3974
  stack = "1",
2364
3975
  color: color2 = "black",
2365
- barWidth = "30"
3976
+ barWidth = "30",
3977
+ smooth = false,
3978
+ step = false
2366
3979
  }) {
2367
3980
  return {
2368
3981
  type,
2369
3982
  name,
2370
3983
  showSymbol,
3984
+ symbolSize,
2371
3985
  y_axis_data_key,
2372
3986
  yAxisIndex,
2373
3987
  label_position,
2374
3988
  stack,
2375
3989
  color: color2,
2376
- barWidth
3990
+ barWidth,
3991
+ smooth,
3992
+ step
2377
3993
  };
2378
3994
  }
2379
3995
  return series.map(setDefaults);
@@ -2415,13 +4031,15 @@ function VizCartesianChartPanel({
2415
4031
  control,
2416
4032
  handleSubmit,
2417
4033
  watch,
2418
- formState: {
2419
- isDirty
2420
- },
2421
4034
  getValues
2422
4035
  } = useForm({
2423
4036
  defaultValues
2424
4037
  });
4038
+ watch(["x_axis_data_key", "x_axis_name"]);
4039
+ const values = getValues();
4040
+ const changed = React.useMemo(() => {
4041
+ return !_.isEqual(values, conf);
4042
+ }, [values, conf]);
2425
4043
  return /* @__PURE__ */ jsx(Group, {
2426
4044
  direction: "column",
2427
4045
  mt: "md",
@@ -2430,10 +4048,12 @@ function VizCartesianChartPanel({
2430
4048
  children: /* @__PURE__ */ jsxs("form", {
2431
4049
  onSubmit: handleSubmit(setConf),
2432
4050
  children: [/* @__PURE__ */ jsxs(Group, {
2433
- position: "apart",
2434
- mb: "lg",
4051
+ position: "left",
4052
+ py: "md",
4053
+ pl: "md",
2435
4054
  sx: {
2436
- position: "relative"
4055
+ borderBottom: "1px solid #eee",
4056
+ background: "#efefef"
2437
4057
  },
2438
4058
  children: [/* @__PURE__ */ jsx(Text, {
2439
4059
  children: "Chart Config"
@@ -2442,46 +4062,73 @@ function VizCartesianChartPanel({
2442
4062
  mr: 5,
2443
4063
  variant: "filled",
2444
4064
  color: "blue",
2445
- disabled: !isDirty,
4065
+ disabled: !changed,
2446
4066
  children: /* @__PURE__ */ jsx(DeviceFloppy, {
2447
4067
  size: 20
2448
4068
  })
2449
4069
  })]
2450
- }), /* @__PURE__ */ jsxs(Group, {
2451
- direction: "column",
2452
- grow: true,
2453
- noWrap: true,
2454
- mb: "lg",
2455
- children: [/* @__PURE__ */ jsx(Controller, {
2456
- name: "x_axis_data_key",
2457
- control,
2458
- render: ({
2459
- field
2460
- }) => /* @__PURE__ */ jsx(DataFieldSelector, __spreadValues({
2461
- label: "X Axis Data Field",
2462
- required: true,
2463
- data,
2464
- sx: {
2465
- flex: 1
2466
- }
2467
- }, field))
2468
- }), /* @__PURE__ */ jsx(Controller, {
2469
- name: "x_axis_name",
2470
- control,
2471
- render: ({
2472
- field
2473
- }) => /* @__PURE__ */ jsx(TextInput, __spreadValues({
2474
- label: "X Axis Name"
2475
- }, field))
4070
+ }), /* @__PURE__ */ jsxs(Accordion, {
4071
+ offsetIcon: false,
4072
+ multiple: true,
4073
+ initialState: {
4074
+ 0: true,
4075
+ 1: true
4076
+ },
4077
+ children: [/* @__PURE__ */ jsx(Accordion.Item, {
4078
+ label: "X Axis",
4079
+ children: /* @__PURE__ */ jsxs(Group, {
4080
+ direction: "row",
4081
+ grow: true,
4082
+ noWrap: true,
4083
+ children: [/* @__PURE__ */ jsx(Controller, {
4084
+ name: "x_axis_data_key",
4085
+ control,
4086
+ render: ({
4087
+ field
4088
+ }) => /* @__PURE__ */ jsx(DataFieldSelector, __spreadValues({
4089
+ label: "X Axis Data Field",
4090
+ required: true,
4091
+ data,
4092
+ sx: {
4093
+ flex: 1
4094
+ }
4095
+ }, field))
4096
+ }), /* @__PURE__ */ jsx(Controller, {
4097
+ name: "x_axis_name",
4098
+ control,
4099
+ render: ({
4100
+ field
4101
+ }) => /* @__PURE__ */ jsx(TextInput, __spreadValues({
4102
+ label: "X Axis Name",
4103
+ sx: {
4104
+ flex: 1
4105
+ }
4106
+ }, field))
4107
+ })]
4108
+ })
4109
+ }), /* @__PURE__ */ jsx(Accordion.Item, {
4110
+ label: "Y Axes",
4111
+ children: /* @__PURE__ */ jsx(YAxesField, {
4112
+ control,
4113
+ watch
4114
+ })
4115
+ }), /* @__PURE__ */ jsx(Accordion.Item, {
4116
+ label: "Series",
4117
+ children: /* @__PURE__ */ jsx(SeriesField, {
4118
+ control,
4119
+ watch,
4120
+ getValues,
4121
+ data
4122
+ })
4123
+ }), /* @__PURE__ */ jsx(Accordion.Item, {
4124
+ label: "Regression Lines",
4125
+ children: /* @__PURE__ */ jsx(RegressionsField, {
4126
+ control,
4127
+ watch,
4128
+ getValues,
4129
+ data
4130
+ })
2476
4131
  })]
2477
- }), /* @__PURE__ */ jsx(YAxesField, {
2478
- control,
2479
- watch
2480
- }), /* @__PURE__ */ jsx(SeriesField, {
2481
- control,
2482
- watch,
2483
- getValues,
2484
- data
2485
4132
  })]
2486
4133
  })
2487
4134
  });