@vuu-ui/vuu-chart 2.1.0-alpha.8 → 2.1.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.
@@ -1,6 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  var vuuUtils = require('@vuu-ui/vuu-utils');
4
+ var DataRowMovingWindow = require('./DataRowMovingWindow.js');
4
5
 
5
6
  var __defProp = Object.defineProperty;
6
7
  var __typeError = (msg) => {
@@ -12,7 +13,7 @@ var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot
12
13
  var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
13
14
  var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
14
15
  var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), member.set(obj, value), value);
15
- var _categoryColumn, _columnMap, _itemColorFunction, _dataSource, _categoryCount, _dates, _series, _seriesColumns;
16
+ var _categoryColumn, _columnMap, _itemColorFunction, _dataWindow, _dates, _series, _seriesColumns;
16
17
  const defaultItemColorFunction = ({ color }) => color;
17
18
  const { KEY } = vuuUtils.metadataKeys;
18
19
  function DataSourceValue(key, row, value) {
@@ -52,49 +53,64 @@ function getCategoriesAndSeries(columnMap, data, categoryColumn, seriesColumns,
52
53
  return [categoryValues, Array.from(seriesMap.values())];
53
54
  }
54
55
  class ChartSeries extends vuuUtils.EventEmitter {
55
- constructor({
56
- category,
57
- dataSource,
58
- itemColorFunction,
59
- series
60
- }) {
56
+ constructor({ dataSource, itemColorFunction }) {
61
57
  super();
62
- __privateAdd(this, _categoryColumn);
58
+ __privateAdd(this, _categoryColumn, "");
63
59
  __privateAdd(this, _columnMap, {});
64
60
  __privateAdd(this, _itemColorFunction);
65
- __privateAdd(this, _dataSource);
66
- __privateAdd(this, _categoryCount, 0);
61
+ __privateAdd(this, _dataWindow, new DataRowMovingWindow.MovingDataRowWindow(vuuUtils.Range(0, 1e3)));
67
62
  __privateAdd(this, _dates, []);
68
63
  __privateAdd(this, _series, []);
69
- __privateAdd(this, _seriesColumns);
64
+ __privateAdd(this, _seriesColumns, []);
70
65
  __publicField(this, "handleData", (message) => {
71
66
  if (message.type === "subscribed") {
72
67
  __privateSet(this, _columnMap, vuuUtils.buildColumnMap(message.tableSchema.columns));
73
68
  } else if (message.type === "viewport-update") {
74
- if (message.mode === "size-only") {
75
- __privateSet(this, _categoryCount, message.size ?? 0);
76
- } else if (message.rows) {
77
- const [dates, series] = getCategoriesAndSeries(
78
- __privateGet(this, _columnMap),
79
- message.rows,
80
- __privateGet(this, _categoryColumn),
81
- __privateGet(this, _seriesColumns),
82
- __privateGet(this, _itemColorFunction)
83
- );
84
- __privateSet(this, _dates, dates);
85
- __privateSet(this, _series, series);
86
- this.emit("update");
69
+ if (message.mode === "size-only") ; else if (message.rows) {
70
+ for (const row of message.rows) {
71
+ __privateGet(this, _dataWindow).add(row);
72
+ }
73
+ this.buildCategoriesAndSeries();
87
74
  }
88
75
  } else {
89
76
  console.warn(JSON.stringify(message));
90
77
  }
91
78
  });
92
- __privateSet(this, _categoryColumn, category);
93
- __privateSet(this, _dataSource, dataSource);
94
79
  __privateSet(this, _itemColorFunction, itemColorFunction);
95
- __privateSet(this, _seriesColumns, series);
96
80
  dataSource.subscribe({ range: vuuUtils.Range(0, 1e3) }, this.handleData);
97
81
  }
82
+ buildCategoriesAndSeries() {
83
+ if (__privateGet(this, _categoryColumn) && __privateGet(this, _seriesColumns).length > 0) {
84
+ const [dates, series] = getCategoriesAndSeries(
85
+ __privateGet(this, _columnMap),
86
+ __privateGet(this, _dataWindow).data,
87
+ __privateGet(this, _categoryColumn),
88
+ __privateGet(this, _seriesColumns),
89
+ __privateGet(this, _itemColorFunction)
90
+ );
91
+ __privateSet(this, _dates, dates);
92
+ __privateSet(this, _series, series);
93
+ this.emit("update");
94
+ }
95
+ }
96
+ get categoryColumn() {
97
+ return __privateGet(this, _categoryColumn);
98
+ }
99
+ set categoryColumn(categoryColumn) {
100
+ __privateSet(this, _categoryColumn, categoryColumn);
101
+ if (__privateGet(this, _seriesColumns).length > 0) {
102
+ this.buildCategoriesAndSeries();
103
+ }
104
+ }
105
+ get seriesColumnNames() {
106
+ return __privateGet(this, _seriesColumns);
107
+ }
108
+ set seriesColumnNames(seriesColumnNames) {
109
+ __privateSet(this, _seriesColumns, seriesColumnNames);
110
+ if (__privateGet(this, _categoryColumn)) {
111
+ this.buildCategoriesAndSeries();
112
+ }
113
+ }
98
114
  get categories() {
99
115
  return __privateGet(this, _dates);
100
116
  }
@@ -105,8 +121,7 @@ class ChartSeries extends vuuUtils.EventEmitter {
105
121
  _categoryColumn = new WeakMap();
106
122
  _columnMap = new WeakMap();
107
123
  _itemColorFunction = new WeakMap();
108
- _dataSource = new WeakMap();
109
- _categoryCount = new WeakMap();
124
+ _dataWindow = new WeakMap();
110
125
  _dates = new WeakMap();
111
126
  _series = new WeakMap();
112
127
  _seriesColumns = new WeakMap();
@@ -1 +1 @@
1
- {"version":3,"file":"ChartSeries.js","sources":["../../../packages/vuu-chart/src/ChartSeries.ts"],"sourcesContent":["import {\n DataSource,\n DataSourceRow,\n DataSourceSubscribeCallback,\n} from \"@vuu-ui/vuu-data-types\";\nimport { VuuRowDataItemType } from \"@vuu-ui/vuu-protocol-types\";\nimport {\n buildColumnMap,\n ColumnMap,\n EventEmitter,\n Range,\n metadataKeys,\n} from \"@vuu-ui/vuu-utils\";\n\ntype Series = {\n id: string;\n name: string;\n label: string;\n data: DataSourceValue<number>[];\n lineStyle: {\n width: number;\n };\n itemStyle: {\n color: string | ItemColorFunction;\n };\n symbol: \"emptyCircle\" | \"circle\";\n type: \"line\";\n};\n\nexport type ItemColorFunction = (params: {\n color: string;\n data: DataSourceValue;\n dataIndex: number;\n name: string;\n seriesName: string;\n}) => string;\n\nconst defaultItemColorFunction: ItemColorFunction = ({ color }) => color;\n\nconst { KEY } = metadataKeys;\n\nexport type DataSourceValue<T extends VuuRowDataItemType = number> = {\n key: string;\n readonly row: DataSourceRow;\n value: T;\n};\n\nfunction DataSourceValue<T extends VuuRowDataItemType = number>(\n key: string,\n row: DataSourceRow,\n value: T,\n): DataSourceValue<T> {\n return { key, row, value };\n}\n\nfunction getCategoriesAndSeries(\n columnMap: ColumnMap,\n data: DataSourceRow[],\n categoryColumn: string,\n seriesColumns: string[],\n itemColorFunction = defaultItemColorFunction,\n): [string[], Series[]] {\n const categoryValues: string[] = [];\n const seriesMap = new Map<string, Series>();\n\n data.forEach((row) => {\n const categoryValue = row[columnMap[categoryColumn]] as string;\n categoryValues.push(categoryValue);\n\n for (const seriesColumn of seriesColumns) {\n let series = seriesMap.get(seriesColumn);\n if (!series) {\n series = {\n //any reason we can't simply use col name here ?\n id: seriesColumn,\n name: seriesColumn,\n label: seriesColumn,\n data: [],\n type: \"line\",\n itemStyle: {\n color: itemColorFunction,\n },\n lineStyle: {\n width: 1.5,\n },\n symbol: \"circle\",\n };\n seriesMap.set(seriesColumn, series);\n }\n\n const key = row[KEY] as string;\n const value = row[columnMap[seriesColumn]] as number;\n series.data.push(DataSourceValue(key, row, value));\n }\n });\n\n return [categoryValues, Array.from(seriesMap.values())];\n}\n\nexport type ChartEvents = {\n update: () => void;\n};\nexport interface ChartSeriesConstructorProps {\n dataSource: DataSource;\n /**\n * The column name of the column that defines our category axis.\n * By default, these are the x axis values.\n */\n category: string;\n\n itemColorFunction?: ItemColorFunction;\n /**\n * The column names of the columns that define our data.\n * By default, these are the y axis values.\n */\n series: string[];\n}\n\nexport class ChartSeries extends EventEmitter<ChartEvents> {\n #categoryColumn: string;\n #columnMap: ColumnMap = {};\n #itemColorFunction: ItemColorFunction | undefined;\n #dataSource: DataSource;\n #categoryCount = 0;\n\n #dates: string[] = [];\n #series: Series[] = [];\n #seriesColumns: string[];\n\n handleData: DataSourceSubscribeCallback = (message) => {\n if (message.type === \"subscribed\") {\n this.#columnMap = buildColumnMap(message.tableSchema.columns);\n } else if (message.type === \"viewport-update\") {\n if (message.mode === \"size-only\") {\n this.#categoryCount = message.size ?? 0;\n } else if (message.rows) {\n const [dates, series] = getCategoriesAndSeries(\n this.#columnMap,\n message.rows,\n this.#categoryColumn,\n this.#seriesColumns,\n this.#itemColorFunction,\n );\n this.#dates = dates;\n this.#series = series;\n this.emit(\"update\");\n }\n } else {\n console.warn(JSON.stringify(message));\n }\n };\n\n constructor({\n category,\n dataSource,\n itemColorFunction,\n series,\n }: ChartSeriesConstructorProps) {\n super();\n this.#categoryColumn = category;\n this.#dataSource = dataSource;\n this.#itemColorFunction = itemColorFunction;\n this.#seriesColumns = series;\n\n dataSource.subscribe({ range: Range(0, 1000) }, this.handleData);\n }\n\n get categories() {\n return this.#dates;\n }\n\n get series() {\n return this.#series;\n }\n}\n"],"names":["metadataKeys","EventEmitter","buildColumnMap","Range"],"mappings":";;;;;;;;;;;;;;AAAA,IAAA,eAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,WAAA,EAAA,cAAA,EAAA,MAAA,EAAA,OAAA,EAAA,cAAA;AAqCA,MAAM,wBAA8C,GAAA,CAAC,EAAE,KAAA,EAAY,KAAA,KAAA;AAEnE,MAAM,EAAE,KAAQ,GAAAA,qBAAA;AAQhB,SAAS,eAAA,CACP,GACA,EAAA,GAAA,EACA,KACoB,EAAA;AACpB,EAAO,OAAA,EAAE,GAAK,EAAA,GAAA,EAAK,KAAM,EAAA;AAC3B;AAEA,SAAS,uBACP,SACA,EAAA,IAAA,EACA,cACA,EAAA,aAAA,EACA,oBAAoB,wBACE,EAAA;AACtB,EAAA,MAAM,iBAA2B,EAAC;AAClC,EAAM,MAAA,SAAA,uBAAgB,GAAoB,EAAA;AAE1C,EAAK,IAAA,CAAA,OAAA,CAAQ,CAAC,GAAQ,KAAA;AACpB,IAAA,MAAM,aAAgB,GAAA,GAAA,CAAI,SAAU,CAAA,cAAc,CAAC,CAAA;AACnD,IAAA,cAAA,CAAe,KAAK,aAAa,CAAA;AAEjC,IAAA,KAAA,MAAW,gBAAgB,aAAe,EAAA;AACxC,MAAI,IAAA,MAAA,GAAS,SAAU,CAAA,GAAA,CAAI,YAAY,CAAA;AACvC,MAAA,IAAI,CAAC,MAAQ,EAAA;AACX,QAAS,MAAA,GAAA;AAAA;AAAA,UAEP,EAAI,EAAA,YAAA;AAAA,UACJ,IAAM,EAAA,YAAA;AAAA,UACN,KAAO,EAAA,YAAA;AAAA,UACP,MAAM,EAAC;AAAA,UACP,IAAM,EAAA,MAAA;AAAA,UACN,SAAW,EAAA;AAAA,YACT,KAAO,EAAA;AAAA,WACT;AAAA,UACA,SAAW,EAAA;AAAA,YACT,KAAO,EAAA;AAAA,WACT;AAAA,UACA,MAAQ,EAAA;AAAA,SACV;AACA,QAAU,SAAA,CAAA,GAAA,CAAI,cAAc,MAAM,CAAA;AAAA;AAGpC,MAAM,MAAA,GAAA,GAAM,IAAI,GAAG,CAAA;AACnB,MAAA,MAAM,KAAQ,GAAA,GAAA,CAAI,SAAU,CAAA,YAAY,CAAC,CAAA;AACzC,MAAA,MAAA,CAAO,KAAK,IAAK,CAAA,eAAA,CAAgB,GAAK,EAAA,GAAA,EAAK,KAAK,CAAC,CAAA;AAAA;AACnD,GACD,CAAA;AAED,EAAA,OAAO,CAAC,cAAgB,EAAA,KAAA,CAAM,KAAK,SAAU,CAAA,MAAA,EAAQ,CAAC,CAAA;AACxD;AAqBO,MAAM,oBAAoBC,qBAA0B,CAAA;AAAA,EAkCzD,WAAY,CAAA;AAAA,IACV,QAAA;AAAA,IACA,UAAA;AAAA,IACA,iBAAA;AAAA,IACA;AAAA,GAC8B,EAAA;AAC9B,IAAM,KAAA,EAAA;AAvCR,IAAA,YAAA,CAAA,IAAA,EAAA,eAAA,CAAA;AACA,IAAA,YAAA,CAAA,IAAA,EAAA,UAAA,EAAwB,EAAC,CAAA;AACzB,IAAA,YAAA,CAAA,IAAA,EAAA,kBAAA,CAAA;AACA,IAAA,YAAA,CAAA,IAAA,EAAA,WAAA,CAAA;AACA,IAAiB,YAAA,CAAA,IAAA,EAAA,cAAA,EAAA,CAAA,CAAA;AAEjB,IAAA,YAAA,CAAA,IAAA,EAAA,MAAA,EAAmB,EAAC,CAAA;AACpB,IAAA,YAAA,CAAA,IAAA,EAAA,OAAA,EAAoB,EAAC,CAAA;AACrB,IAAA,YAAA,CAAA,IAAA,EAAA,cAAA,CAAA;AAEA,IAAA,aAAA,CAAA,IAAA,EAAA,YAAA,EAA0C,CAAC,OAAY,KAAA;AACrD,MAAI,IAAA,OAAA,CAAQ,SAAS,YAAc,EAAA;AACjC,QAAA,YAAA,CAAA,IAAA,EAAK,UAAa,EAAAC,uBAAA,CAAe,OAAQ,CAAA,WAAA,CAAY,OAAO,CAAA,CAAA;AAAA,OAC9D,MAAA,IAAW,OAAQ,CAAA,IAAA,KAAS,iBAAmB,EAAA;AAC7C,QAAI,IAAA,OAAA,CAAQ,SAAS,WAAa,EAAA;AAChC,UAAK,YAAA,CAAA,IAAA,EAAA,cAAA,EAAiB,QAAQ,IAAQ,IAAA,CAAA,CAAA;AAAA,SACxC,MAAA,IAAW,QAAQ,IAAM,EAAA;AACvB,UAAM,MAAA,CAAC,KAAO,EAAA,MAAM,CAAI,GAAA,sBAAA;AAAA,YACtB,YAAK,CAAA,IAAA,EAAA,UAAA,CAAA;AAAA,YACL,OAAQ,CAAA,IAAA;AAAA,YACR,YAAK,CAAA,IAAA,EAAA,eAAA,CAAA;AAAA,YACL,YAAK,CAAA,IAAA,EAAA,cAAA,CAAA;AAAA,YACL,YAAK,CAAA,IAAA,EAAA,kBAAA;AAAA,WACP;AACA,UAAA,YAAA,CAAA,IAAA,EAAK,MAAS,EAAA,KAAA,CAAA;AACd,UAAA,YAAA,CAAA,IAAA,EAAK,OAAU,EAAA,MAAA,CAAA;AACf,UAAA,IAAA,CAAK,KAAK,QAAQ,CAAA;AAAA;AACpB,OACK,MAAA;AACL,QAAA,OAAA,CAAQ,IAAK,CAAA,IAAA,CAAK,SAAU,CAAA,OAAO,CAAC,CAAA;AAAA;AACtC,KACF,CAAA;AASE,IAAA,YAAA,CAAA,IAAA,EAAK,eAAkB,EAAA,QAAA,CAAA;AACvB,IAAA,YAAA,CAAA,IAAA,EAAK,WAAc,EAAA,UAAA,CAAA;AACnB,IAAA,YAAA,CAAA,IAAA,EAAK,kBAAqB,EAAA,iBAAA,CAAA;AAC1B,IAAA,YAAA,CAAA,IAAA,EAAK,cAAiB,EAAA,MAAA,CAAA;AAEtB,IAAW,UAAA,CAAA,SAAA,CAAU,EAAE,KAAO,EAAAC,cAAA,CAAM,GAAG,GAAI,CAAA,EAAK,EAAA,IAAA,CAAK,UAAU,CAAA;AAAA;AACjE,EAEA,IAAI,UAAa,GAAA;AACf,IAAA,OAAO,YAAK,CAAA,IAAA,EAAA,MAAA,CAAA;AAAA;AACd,EAEA,IAAI,MAAS,GAAA;AACX,IAAA,OAAO,YAAK,CAAA,IAAA,EAAA,OAAA,CAAA;AAAA;AAEhB;AAvDE,eAAA,GAAA,IAAA,OAAA,EAAA;AACA,UAAA,GAAA,IAAA,OAAA,EAAA;AACA,kBAAA,GAAA,IAAA,OAAA,EAAA;AACA,WAAA,GAAA,IAAA,OAAA,EAAA;AACA,cAAA,GAAA,IAAA,OAAA,EAAA;AAEA,MAAA,GAAA,IAAA,OAAA,EAAA;AACA,OAAA,GAAA,IAAA,OAAA,EAAA;AACA,cAAA,GAAA,IAAA,OAAA,EAAA;;;;"}
1
+ {"version":3,"file":"ChartSeries.js","sources":["../../../packages/vuu-chart/src/ChartSeries.ts"],"sourcesContent":["import {\n DataSource,\n DataSourceRow,\n DataSourceSubscribeCallback,\n} from \"@vuu-ui/vuu-data-types\";\nimport { VuuRowDataItemType } from \"@vuu-ui/vuu-protocol-types\";\nimport {\n buildColumnMap,\n ColumnMap,\n EventEmitter,\n Range,\n metadataKeys,\n} from \"@vuu-ui/vuu-utils\";\nimport { MovingDataRowWindow } from \"./DataRowMovingWindow\";\n\ntype Series = {\n id: string;\n name: string;\n label: string;\n data: DataSourceValue<number>[];\n lineStyle: {\n width: number;\n };\n itemStyle: {\n color: string | ItemColorFunction;\n };\n symbol: \"emptyCircle\" | \"circle\";\n type: \"line\";\n};\n\nexport type ItemColorFunction = (params: {\n color: string;\n data: DataSourceValue;\n dataIndex: number;\n name: string;\n seriesName: string;\n}) => string;\n\nconst defaultItemColorFunction: ItemColorFunction = ({ color }) => color;\n\nconst { KEY } = metadataKeys;\n\nexport type DataSourceValue<T extends VuuRowDataItemType = number> = {\n key: string;\n readonly row: DataSourceRow;\n value: T;\n};\n\nfunction DataSourceValue<T extends VuuRowDataItemType = number>(\n key: string,\n row: DataSourceRow,\n value: T,\n): DataSourceValue<T> {\n return { key, row, value };\n}\n\nfunction getCategoriesAndSeries(\n columnMap: ColumnMap,\n data: DataSourceRow[],\n categoryColumn: string,\n seriesColumns: string[],\n itemColorFunction = defaultItemColorFunction,\n): [string[], Series[]] {\n const categoryValues: string[] = [];\n const seriesMap = new Map<string, Series>();\n\n data.forEach((row) => {\n const categoryValue = row[columnMap[categoryColumn]] as string;\n categoryValues.push(categoryValue);\n\n for (const seriesColumn of seriesColumns) {\n let series = seriesMap.get(seriesColumn);\n if (!series) {\n series = {\n //any reason we can't simply use col name here ?\n id: seriesColumn,\n name: seriesColumn,\n label: seriesColumn,\n data: [],\n type: \"line\",\n itemStyle: {\n color: itemColorFunction,\n },\n lineStyle: {\n width: 1.5,\n },\n symbol: \"circle\",\n };\n seriesMap.set(seriesColumn, series);\n }\n\n const key = row[KEY] as string;\n const value = row[columnMap[seriesColumn]] as number;\n series.data.push(DataSourceValue(key, row, value));\n }\n });\n\n return [categoryValues, Array.from(seriesMap.values())];\n}\n\nexport type ChartEvents = {\n update: () => void;\n};\nexport interface ChartSeriesConstructorProps {\n dataSource: DataSource;\n itemColorFunction?: ItemColorFunction;\n}\n\nexport class ChartSeries extends EventEmitter<ChartEvents> {\n #categoryColumn = \"\";\n #columnMap: ColumnMap = {};\n #itemColorFunction: ItemColorFunction | undefined;\n #dataWindow = new MovingDataRowWindow(Range(0, 1000));\n\n #dates: string[] = [];\n #series: Series[] = [];\n #seriesColumns: string[] = [];\n\n handleData: DataSourceSubscribeCallback = (message) => {\n if (message.type === \"subscribed\") {\n this.#columnMap = buildColumnMap(message.tableSchema.columns);\n } else if (message.type === \"viewport-update\") {\n if (message.mode === \"size-only\") {\n // ???\n } else if (message.rows) {\n for (const row of message.rows) {\n this.#dataWindow.add(row);\n }\n this.buildCategoriesAndSeries();\n }\n } else {\n console.warn(JSON.stringify(message));\n }\n };\n\n buildCategoriesAndSeries() {\n if (this.#categoryColumn && this.#seriesColumns.length > 0) {\n const [dates, series] = getCategoriesAndSeries(\n this.#columnMap,\n this.#dataWindow.data,\n this.#categoryColumn,\n this.#seriesColumns,\n this.#itemColorFunction,\n );\n this.#dates = dates;\n this.#series = series;\n\n this.emit(\"update\");\n }\n }\n\n constructor({ dataSource, itemColorFunction }: ChartSeriesConstructorProps) {\n super();\n this.#itemColorFunction = itemColorFunction;\n dataSource.subscribe({ range: Range(0, 1000) }, this.handleData);\n }\n\n get categoryColumn() {\n return this.#categoryColumn;\n }\n\n set categoryColumn(categoryColumn: string) {\n this.#categoryColumn = categoryColumn;\n if (this.#seriesColumns.length > 0) {\n this.buildCategoriesAndSeries();\n }\n }\n\n get seriesColumnNames() {\n return this.#seriesColumns;\n }\n\n set seriesColumnNames(seriesColumnNames: string[]) {\n this.#seriesColumns = seriesColumnNames;\n if (this.#categoryColumn) {\n this.buildCategoriesAndSeries();\n }\n }\n\n get categories() {\n return this.#dates;\n }\n\n get series() {\n return this.#series;\n }\n}\n"],"names":["metadataKeys","EventEmitter","MovingDataRowWindow","Range","buildColumnMap"],"mappings":"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"}
@@ -0,0 +1,97 @@
1
+ 'use strict';
2
+
3
+ var vuuUtils = require('@vuu-ui/vuu-utils');
4
+
5
+ var __defProp = Object.defineProperty;
6
+ var __typeError = (msg) => {
7
+ throw TypeError(msg);
8
+ };
9
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
10
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
11
+ var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
12
+ var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
13
+ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
14
+ var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), member.set(obj, value), value);
15
+ var _range;
16
+ const { IDX, KEY } = vuuUtils.metadataKeys;
17
+ class MovingDataRowWindow {
18
+ constructor({ from, to }) {
19
+ __publicField(this, "data");
20
+ __publicField(this, "rowCount", 0);
21
+ __privateAdd(this, _range);
22
+ __publicField(this, "setRowCount", (rowCount) => {
23
+ if (rowCount < this.data.length) {
24
+ this.data.length = rowCount;
25
+ }
26
+ this.rowCount = rowCount;
27
+ });
28
+ __privateSet(this, _range, new vuuUtils.WindowRange(from, to));
29
+ this.data = new Array(Math.max(0, to - from));
30
+ this.rowCount = 0;
31
+ }
32
+ add(data) {
33
+ const index = data[IDX];
34
+ if (this.isWithinRange(index)) {
35
+ const internalIndex = index - __privateGet(this, _range).from;
36
+ this.data[internalIndex] = data;
37
+ }
38
+ }
39
+ getAtIndex(index) {
40
+ return __privateGet(this, _range).isWithin(index) && this.data[index - __privateGet(this, _range).from] != null ? this.data[index - __privateGet(this, _range).from] : void 0;
41
+ }
42
+ getByKey(key) {
43
+ return this.data.find((row) => row[KEY] === key);
44
+ }
45
+ isWithinRange(index) {
46
+ return __privateGet(this, _range).isWithin(index);
47
+ }
48
+ setRange({ from, to }) {
49
+ if (from !== __privateGet(this, _range).from || to !== __privateGet(this, _range).to) {
50
+ const [overlapFrom, overlapTo] = __privateGet(this, _range).overlap(from, to);
51
+ const newData = new Array(Math.max(0, to - from));
52
+ for (let i = overlapFrom; i < overlapTo; i++) {
53
+ const data = this.getAtIndex(i);
54
+ if (data) {
55
+ const index = i - from;
56
+ newData[index] = data;
57
+ }
58
+ }
59
+ this.data = newData;
60
+ __privateGet(this, _range).from = from;
61
+ __privateGet(this, _range).to = to;
62
+ }
63
+ }
64
+ get hasData() {
65
+ return this.data.some((d) => d !== void 0);
66
+ }
67
+ /**
68
+ * This will throw if there is no data. Check `hasData` first
69
+ * to guard against this, if not certain.
70
+ */
71
+ get firstRow() {
72
+ for (let i = 0; i < this.data.length; i++) {
73
+ if (this.data[i]) {
74
+ return this.data[i];
75
+ }
76
+ }
77
+ throw Error(`[DataRowMovingWinddow] firstRow, no data`);
78
+ }
79
+ get range() {
80
+ return __privateGet(this, _range);
81
+ }
82
+ // TODO make this more performant, see implementation in
83
+ // array-backed-moving-window - use same implementation
84
+ get hasAllRowsWithinRange() {
85
+ const { from, to } = __privateGet(this, _range);
86
+ for (let i = from; i < to; i++) {
87
+ if (this.getAtIndex(i) === void 0) {
88
+ return false;
89
+ }
90
+ }
91
+ return true;
92
+ }
93
+ }
94
+ _range = new WeakMap();
95
+
96
+ exports.MovingDataRowWindow = MovingDataRowWindow;
97
+ //# sourceMappingURL=DataRowMovingWindow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DataRowMovingWindow.js","sources":["../../../packages/vuu-chart/src/DataRowMovingWindow.ts"],"sourcesContent":["import { DataSourceRow } from \"@vuu-ui/vuu-data-types\";\nimport { VuuRange } from \"@vuu-ui/vuu-protocol-types\";\nimport { WindowRange } from \"@vuu-ui/vuu-utils\";\nimport { metadataKeys } from \"@vuu-ui/vuu-utils\";\n\nconst { IDX, KEY } = metadataKeys;\n\nexport class MovingDataRowWindow {\n public data: DataSourceRow[];\n public rowCount = 0;\n #range: WindowRange;\n\n constructor({ from, to }: VuuRange) {\n this.#range = new WindowRange(from, to);\n //internal data is always 0 based, we add range.from to determine an offset\n this.data = new Array(Math.max(0, to - from));\n this.rowCount = 0;\n }\n\n setRowCount = (rowCount: number) => {\n if (rowCount < this.data.length) {\n this.data.length = rowCount;\n }\n\n this.rowCount = rowCount;\n };\n\n add(data: DataSourceRow) {\n const index = data[IDX];\n if (this.isWithinRange(index)) {\n const internalIndex = index - this.#range.from;\n this.data[internalIndex] = data;\n }\n }\n\n getAtIndex(index: number) {\n return this.#range.isWithin(index) &&\n this.data[index - this.#range.from] != null\n ? this.data[index - this.#range.from]\n : undefined;\n }\n\n getByKey(key: string) {\n return this.data.find((row) => row[KEY] === key);\n }\n\n isWithinRange(index: number) {\n return this.#range.isWithin(index);\n }\n\n setRange({ from, to }: VuuRange) {\n if (from !== this.#range.from || to !== this.#range.to) {\n const [overlapFrom, overlapTo] = this.#range.overlap(from, to);\n const newData = new Array(Math.max(0, to - from));\n for (let i = overlapFrom; i < overlapTo; i++) {\n const data = this.getAtIndex(i);\n if (data) {\n const index = i - from;\n newData[index] = data;\n }\n }\n this.data = newData;\n this.#range.from = from;\n this.#range.to = to;\n }\n }\n\n get hasData() {\n return this.data.some((d) => d !== undefined);\n }\n\n /**\n * This will throw if there is no data. Check `hasData` first\n * to guard against this, if not certain.\n */\n get firstRow() {\n for (let i = 0; i < this.data.length; i++) {\n if (this.data[i]) {\n return this.data[i];\n }\n }\n throw Error(`[DataRowMovingWinddow] firstRow, no data`);\n }\n\n get range() {\n return this.#range;\n }\n\n // TODO make this more performant, see implementation in\n // array-backed-moving-window - use same implementation\n get hasAllRowsWithinRange(): boolean {\n const { from, to } = this.#range;\n\n for (let i = from; i < to; i++) {\n if (this.getAtIndex(i) === undefined) {\n return false;\n }\n }\n return true;\n }\n}\n"],"names":["metadataKeys","WindowRange"],"mappings":"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"}
@@ -2,6 +2,7 @@
2
2
 
3
3
  var react = require('react');
4
4
  var ChartSeries = require('./ChartSeries.js');
5
+ var vuuUtils = require('@vuu-ui/vuu-utils');
5
6
 
6
7
  const defaultPalette = [
7
8
  "#4676bf",
@@ -20,15 +21,22 @@ const useChartOptions = ({
20
21
  }) => {
21
22
  const [, forceRender] = react.useState({});
22
23
  const chartSeries = react.useMemo(() => {
24
+ console.log("new ChartSeries");
23
25
  const cs = new ChartSeries.ChartSeries({
24
- category: categoryColumnName,
25
26
  itemColorFunction,
26
- series: seriesColumnNames,
27
27
  dataSource
28
28
  });
29
29
  cs.on("update", () => forceRender({}));
30
30
  return cs;
31
- }, [categoryColumnName, dataSource, itemColorFunction, seriesColumnNames]);
31
+ }, [dataSource, itemColorFunction]);
32
+ react.useMemo(() => {
33
+ if (categoryColumnName !== chartSeries.categoryColumn) {
34
+ chartSeries.categoryColumn = categoryColumnName;
35
+ }
36
+ if (vuuUtils.itemsChanged(seriesColumnNames, chartSeries.seriesColumnNames)) {
37
+ chartSeries.seriesColumnNames = seriesColumnNames;
38
+ }
39
+ }, [categoryColumnName, chartSeries, seriesColumnNames]);
32
40
  return {
33
41
  animation: false,
34
42
  color: palette,
@@ -45,6 +53,9 @@ const useChartOptions = ({
45
53
  right: 5
46
54
  },
47
55
  series: chartSeries.series,
56
+ tooltip: {
57
+ trigger: "axis"
58
+ },
48
59
  xAxis: {
49
60
  data: chartSeries.categories
50
61
  },
@@ -1 +1 @@
1
- {"version":3,"file":"useChartOptions.js","sources":["../../../packages/vuu-chart/src/useChartOptions.ts"],"sourcesContent":["import { type EChartsCoreOption } from \"echarts\";\nimport { useMemo, useState } from \"react\";\nimport { ChartSeries, ItemColorFunction } from \"./ChartSeries\";\nimport { DataSource } from \"@vuu-ui/vuu-data-types\";\n\nconst defaultPalette = [\n \"#4676bf\",\n \"#ab6528\",\n \"#9f55c2\",\n \"#2a8285\",\n \"#697694\",\n \"#B0549d\",\n];\nexport interface ChartOptionsProps {\n categoryColumnName: string;\n dataSource: DataSource;\n itemColorFunction?: ItemColorFunction;\n palette?: string[];\n seriesColumnNames: string[];\n}\n\nexport const useChartOptions = ({\n categoryColumnName,\n dataSource,\n itemColorFunction,\n palette = defaultPalette,\n seriesColumnNames,\n}: ChartOptionsProps) => {\n const [, forceRender] = useState({});\n\n const chartSeries = useMemo(() => {\n const cs = new ChartSeries({\n category: categoryColumnName,\n itemColorFunction,\n series: seriesColumnNames,\n dataSource,\n });\n cs.on(\"update\", () => forceRender({}));\n return cs;\n }, [categoryColumnName, dataSource, itemColorFunction, seriesColumnNames]);\n\n return {\n animation: false,\n color: palette,\n dataZoom: [\n {\n type: \"slider\",\n start: 0,\n end: 100,\n },\n ],\n grid: {\n left: \"0\",\n bottom: 0,\n right: 5,\n },\n series: chartSeries.series,\n xAxis: {\n data: chartSeries.categories,\n },\n yAxis: {},\n } as EChartsCoreOption;\n};\n"],"names":["useState","useMemo","ChartSeries"],"mappings":";;;;;AAKA,MAAM,cAAiB,GAAA;AAAA,EACrB,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA;AASO,MAAM,kBAAkB,CAAC;AAAA,EAC9B,kBAAA;AAAA,EACA,UAAA;AAAA,EACA,iBAAA;AAAA,EACA,OAAU,GAAA,cAAA;AAAA,EACV;AACF,CAAyB,KAAA;AACvB,EAAA,MAAM,GAAG,WAAW,CAAI,GAAAA,cAAA,CAAS,EAAE,CAAA;AAEnC,EAAM,MAAA,WAAA,GAAcC,cAAQ,MAAM;AAChC,IAAM,MAAA,EAAA,GAAK,IAAIC,uBAAY,CAAA;AAAA,MACzB,QAAU,EAAA,kBAAA;AAAA,MACV,iBAAA;AAAA,MACA,MAAQ,EAAA,iBAAA;AAAA,MACR;AAAA,KACD,CAAA;AACD,IAAA,EAAA,CAAG,GAAG,QAAU,EAAA,MAAM,WAAY,CAAA,EAAE,CAAC,CAAA;AACrC,IAAO,OAAA,EAAA;AAAA,KACN,CAAC,kBAAA,EAAoB,UAAY,EAAA,iBAAA,EAAmB,iBAAiB,CAAC,CAAA;AAEzE,EAAO,OAAA;AAAA,IACL,SAAW,EAAA,KAAA;AAAA,IACX,KAAO,EAAA,OAAA;AAAA,IACP,QAAU,EAAA;AAAA,MACR;AAAA,QACE,IAAM,EAAA,QAAA;AAAA,QACN,KAAO,EAAA,CAAA;AAAA,QACP,GAAK,EAAA;AAAA;AACP,KACF;AAAA,IACA,IAAM,EAAA;AAAA,MACJ,IAAM,EAAA,GAAA;AAAA,MACN,MAAQ,EAAA,CAAA;AAAA,MACR,KAAO,EAAA;AAAA,KACT;AAAA,IACA,QAAQ,WAAY,CAAA,MAAA;AAAA,IACpB,KAAO,EAAA;AAAA,MACL,MAAM,WAAY,CAAA;AAAA,KACpB;AAAA,IACA,OAAO;AAAC,GACV;AACF;;;;"}
1
+ {"version":3,"file":"useChartOptions.js","sources":["../../../packages/vuu-chart/src/useChartOptions.ts"],"sourcesContent":["import { type EChartsCoreOption } from \"echarts\";\nimport { useMemo, useState } from \"react\";\nimport { ChartSeries, ItemColorFunction } from \"./ChartSeries\";\nimport { DataSource } from \"@vuu-ui/vuu-data-types\";\nimport { itemsChanged } from \"@vuu-ui/vuu-utils\";\n\nconst defaultPalette = [\n \"#4676bf\",\n \"#ab6528\",\n \"#9f55c2\",\n \"#2a8285\",\n \"#697694\",\n \"#B0549d\",\n];\nexport interface ChartOptionsProps {\n categoryColumnName: string;\n dataSource: DataSource;\n itemColorFunction?: ItemColorFunction;\n palette?: string[];\n seriesColumnNames: string[];\n}\n\nexport const useChartOptions = ({\n categoryColumnName,\n dataSource,\n itemColorFunction,\n palette = defaultPalette,\n seriesColumnNames,\n}: ChartOptionsProps) => {\n const [, forceRender] = useState({});\n\n const chartSeries = useMemo(() => {\n console.log(\"new ChartSeries\");\n const cs = new ChartSeries({\n itemColorFunction,\n dataSource,\n });\n cs.on(\"update\", () => forceRender({}));\n return cs;\n }, [dataSource, itemColorFunction]);\n\n useMemo(() => {\n if (categoryColumnName !== chartSeries.categoryColumn) {\n chartSeries.categoryColumn = categoryColumnName;\n }\n if (itemsChanged(seriesColumnNames, chartSeries.seriesColumnNames)) {\n chartSeries.seriesColumnNames = seriesColumnNames;\n }\n }, [categoryColumnName, chartSeries, seriesColumnNames]);\n\n return {\n animation: false,\n color: palette,\n dataZoom: [\n {\n type: \"slider\",\n start: 0,\n end: 100,\n },\n ],\n grid: {\n left: \"0\",\n bottom: 0,\n right: 5,\n },\n series: chartSeries.series,\n tooltip: {\n trigger: \"axis\",\n },\n xAxis: {\n data: chartSeries.categories,\n },\n yAxis: {},\n } as EChartsCoreOption;\n};\n"],"names":["useState","useMemo","ChartSeries","itemsChanged"],"mappings":";;;;;;AAMA,MAAM,cAAiB,GAAA;AAAA,EACrB,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA;AASO,MAAM,kBAAkB,CAAC;AAAA,EAC9B,kBAAA;AAAA,EACA,UAAA;AAAA,EACA,iBAAA;AAAA,EACA,OAAU,GAAA,cAAA;AAAA,EACV;AACF,CAAyB,KAAA;AACvB,EAAA,MAAM,GAAG,WAAW,CAAI,GAAAA,cAAA,CAAS,EAAE,CAAA;AAEnC,EAAM,MAAA,WAAA,GAAcC,cAAQ,MAAM;AAChC,IAAA,OAAA,CAAQ,IAAI,iBAAiB,CAAA;AAC7B,IAAM,MAAA,EAAA,GAAK,IAAIC,uBAAY,CAAA;AAAA,MACzB,iBAAA;AAAA,MACA;AAAA,KACD,CAAA;AACD,IAAA,EAAA,CAAG,GAAG,QAAU,EAAA,MAAM,WAAY,CAAA,EAAE,CAAC,CAAA;AACrC,IAAO,OAAA,EAAA;AAAA,GACN,EAAA,CAAC,UAAY,EAAA,iBAAiB,CAAC,CAAA;AAElC,EAAAD,aAAA,CAAQ,MAAM;AACZ,IAAI,IAAA,kBAAA,KAAuB,YAAY,cAAgB,EAAA;AACrD,MAAA,WAAA,CAAY,cAAiB,GAAA,kBAAA;AAAA;AAE/B,IAAA,IAAIE,qBAAa,CAAA,iBAAA,EAAmB,WAAY,CAAA,iBAAiB,CAAG,EAAA;AAClE,MAAA,WAAA,CAAY,iBAAoB,GAAA,iBAAA;AAAA;AAClC,GACC,EAAA,CAAC,kBAAoB,EAAA,WAAA,EAAa,iBAAiB,CAAC,CAAA;AAEvD,EAAO,OAAA;AAAA,IACL,SAAW,EAAA,KAAA;AAAA,IACX,KAAO,EAAA,OAAA;AAAA,IACP,QAAU,EAAA;AAAA,MACR;AAAA,QACE,IAAM,EAAA,QAAA;AAAA,QACN,KAAO,EAAA,CAAA;AAAA,QACP,GAAK,EAAA;AAAA;AACP,KACF;AAAA,IACA,IAAM,EAAA;AAAA,MACJ,IAAM,EAAA,GAAA;AAAA,MACN,MAAQ,EAAA,CAAA;AAAA,MACR,KAAO,EAAA;AAAA,KACT;AAAA,IACA,QAAQ,WAAY,CAAA,MAAA;AAAA,IACpB,OAAS,EAAA;AAAA,MACP,OAAS,EAAA;AAAA,KACX;AAAA,IACA,KAAO,EAAA;AAAA,MACL,MAAM,WAAY,CAAA;AAAA,KACpB;AAAA,IACA,OAAO;AAAC,GACV;AACF;;;;"}
@@ -1,4 +1,5 @@
1
- import { EventEmitter, Range, buildColumnMap, metadataKeys } from '@vuu-ui/vuu-utils';
1
+ import { EventEmitter, Range, metadataKeys, buildColumnMap } from '@vuu-ui/vuu-utils';
2
+ import { MovingDataRowWindow } from './DataRowMovingWindow.js';
2
3
 
3
4
  var __defProp = Object.defineProperty;
4
5
  var __typeError = (msg) => {
@@ -10,7 +11,7 @@ var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot
10
11
  var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
11
12
  var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
12
13
  var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), member.set(obj, value), value);
13
- var _categoryColumn, _columnMap, _itemColorFunction, _dataSource, _categoryCount, _dates, _series, _seriesColumns;
14
+ var _categoryColumn, _columnMap, _itemColorFunction, _dataWindow, _dates, _series, _seriesColumns;
14
15
  const defaultItemColorFunction = ({ color }) => color;
15
16
  const { KEY } = metadataKeys;
16
17
  function DataSourceValue(key, row, value) {
@@ -50,49 +51,64 @@ function getCategoriesAndSeries(columnMap, data, categoryColumn, seriesColumns,
50
51
  return [categoryValues, Array.from(seriesMap.values())];
51
52
  }
52
53
  class ChartSeries extends EventEmitter {
53
- constructor({
54
- category,
55
- dataSource,
56
- itemColorFunction,
57
- series
58
- }) {
54
+ constructor({ dataSource, itemColorFunction }) {
59
55
  super();
60
- __privateAdd(this, _categoryColumn);
56
+ __privateAdd(this, _categoryColumn, "");
61
57
  __privateAdd(this, _columnMap, {});
62
58
  __privateAdd(this, _itemColorFunction);
63
- __privateAdd(this, _dataSource);
64
- __privateAdd(this, _categoryCount, 0);
59
+ __privateAdd(this, _dataWindow, new MovingDataRowWindow(Range(0, 1e3)));
65
60
  __privateAdd(this, _dates, []);
66
61
  __privateAdd(this, _series, []);
67
- __privateAdd(this, _seriesColumns);
62
+ __privateAdd(this, _seriesColumns, []);
68
63
  __publicField(this, "handleData", (message) => {
69
64
  if (message.type === "subscribed") {
70
65
  __privateSet(this, _columnMap, buildColumnMap(message.tableSchema.columns));
71
66
  } else if (message.type === "viewport-update") {
72
- if (message.mode === "size-only") {
73
- __privateSet(this, _categoryCount, message.size ?? 0);
74
- } else if (message.rows) {
75
- const [dates, series] = getCategoriesAndSeries(
76
- __privateGet(this, _columnMap),
77
- message.rows,
78
- __privateGet(this, _categoryColumn),
79
- __privateGet(this, _seriesColumns),
80
- __privateGet(this, _itemColorFunction)
81
- );
82
- __privateSet(this, _dates, dates);
83
- __privateSet(this, _series, series);
84
- this.emit("update");
67
+ if (message.mode === "size-only") ; else if (message.rows) {
68
+ for (const row of message.rows) {
69
+ __privateGet(this, _dataWindow).add(row);
70
+ }
71
+ this.buildCategoriesAndSeries();
85
72
  }
86
73
  } else {
87
74
  console.warn(JSON.stringify(message));
88
75
  }
89
76
  });
90
- __privateSet(this, _categoryColumn, category);
91
- __privateSet(this, _dataSource, dataSource);
92
77
  __privateSet(this, _itemColorFunction, itemColorFunction);
93
- __privateSet(this, _seriesColumns, series);
94
78
  dataSource.subscribe({ range: Range(0, 1e3) }, this.handleData);
95
79
  }
80
+ buildCategoriesAndSeries() {
81
+ if (__privateGet(this, _categoryColumn) && __privateGet(this, _seriesColumns).length > 0) {
82
+ const [dates, series] = getCategoriesAndSeries(
83
+ __privateGet(this, _columnMap),
84
+ __privateGet(this, _dataWindow).data,
85
+ __privateGet(this, _categoryColumn),
86
+ __privateGet(this, _seriesColumns),
87
+ __privateGet(this, _itemColorFunction)
88
+ );
89
+ __privateSet(this, _dates, dates);
90
+ __privateSet(this, _series, series);
91
+ this.emit("update");
92
+ }
93
+ }
94
+ get categoryColumn() {
95
+ return __privateGet(this, _categoryColumn);
96
+ }
97
+ set categoryColumn(categoryColumn) {
98
+ __privateSet(this, _categoryColumn, categoryColumn);
99
+ if (__privateGet(this, _seriesColumns).length > 0) {
100
+ this.buildCategoriesAndSeries();
101
+ }
102
+ }
103
+ get seriesColumnNames() {
104
+ return __privateGet(this, _seriesColumns);
105
+ }
106
+ set seriesColumnNames(seriesColumnNames) {
107
+ __privateSet(this, _seriesColumns, seriesColumnNames);
108
+ if (__privateGet(this, _categoryColumn)) {
109
+ this.buildCategoriesAndSeries();
110
+ }
111
+ }
96
112
  get categories() {
97
113
  return __privateGet(this, _dates);
98
114
  }
@@ -103,8 +119,7 @@ class ChartSeries extends EventEmitter {
103
119
  _categoryColumn = new WeakMap();
104
120
  _columnMap = new WeakMap();
105
121
  _itemColorFunction = new WeakMap();
106
- _dataSource = new WeakMap();
107
- _categoryCount = new WeakMap();
122
+ _dataWindow = new WeakMap();
108
123
  _dates = new WeakMap();
109
124
  _series = new WeakMap();
110
125
  _seriesColumns = new WeakMap();
@@ -1 +1 @@
1
- {"version":3,"file":"ChartSeries.js","sources":["../../../packages/vuu-chart/src/ChartSeries.ts"],"sourcesContent":["import {\n DataSource,\n DataSourceRow,\n DataSourceSubscribeCallback,\n} from \"@vuu-ui/vuu-data-types\";\nimport { VuuRowDataItemType } from \"@vuu-ui/vuu-protocol-types\";\nimport {\n buildColumnMap,\n ColumnMap,\n EventEmitter,\n Range,\n metadataKeys,\n} from \"@vuu-ui/vuu-utils\";\n\ntype Series = {\n id: string;\n name: string;\n label: string;\n data: DataSourceValue<number>[];\n lineStyle: {\n width: number;\n };\n itemStyle: {\n color: string | ItemColorFunction;\n };\n symbol: \"emptyCircle\" | \"circle\";\n type: \"line\";\n};\n\nexport type ItemColorFunction = (params: {\n color: string;\n data: DataSourceValue;\n dataIndex: number;\n name: string;\n seriesName: string;\n}) => string;\n\nconst defaultItemColorFunction: ItemColorFunction = ({ color }) => color;\n\nconst { KEY } = metadataKeys;\n\nexport type DataSourceValue<T extends VuuRowDataItemType = number> = {\n key: string;\n readonly row: DataSourceRow;\n value: T;\n};\n\nfunction DataSourceValue<T extends VuuRowDataItemType = number>(\n key: string,\n row: DataSourceRow,\n value: T,\n): DataSourceValue<T> {\n return { key, row, value };\n}\n\nfunction getCategoriesAndSeries(\n columnMap: ColumnMap,\n data: DataSourceRow[],\n categoryColumn: string,\n seriesColumns: string[],\n itemColorFunction = defaultItemColorFunction,\n): [string[], Series[]] {\n const categoryValues: string[] = [];\n const seriesMap = new Map<string, Series>();\n\n data.forEach((row) => {\n const categoryValue = row[columnMap[categoryColumn]] as string;\n categoryValues.push(categoryValue);\n\n for (const seriesColumn of seriesColumns) {\n let series = seriesMap.get(seriesColumn);\n if (!series) {\n series = {\n //any reason we can't simply use col name here ?\n id: seriesColumn,\n name: seriesColumn,\n label: seriesColumn,\n data: [],\n type: \"line\",\n itemStyle: {\n color: itemColorFunction,\n },\n lineStyle: {\n width: 1.5,\n },\n symbol: \"circle\",\n };\n seriesMap.set(seriesColumn, series);\n }\n\n const key = row[KEY] as string;\n const value = row[columnMap[seriesColumn]] as number;\n series.data.push(DataSourceValue(key, row, value));\n }\n });\n\n return [categoryValues, Array.from(seriesMap.values())];\n}\n\nexport type ChartEvents = {\n update: () => void;\n};\nexport interface ChartSeriesConstructorProps {\n dataSource: DataSource;\n /**\n * The column name of the column that defines our category axis.\n * By default, these are the x axis values.\n */\n category: string;\n\n itemColorFunction?: ItemColorFunction;\n /**\n * The column names of the columns that define our data.\n * By default, these are the y axis values.\n */\n series: string[];\n}\n\nexport class ChartSeries extends EventEmitter<ChartEvents> {\n #categoryColumn: string;\n #columnMap: ColumnMap = {};\n #itemColorFunction: ItemColorFunction | undefined;\n #dataSource: DataSource;\n #categoryCount = 0;\n\n #dates: string[] = [];\n #series: Series[] = [];\n #seriesColumns: string[];\n\n handleData: DataSourceSubscribeCallback = (message) => {\n if (message.type === \"subscribed\") {\n this.#columnMap = buildColumnMap(message.tableSchema.columns);\n } else if (message.type === \"viewport-update\") {\n if (message.mode === \"size-only\") {\n this.#categoryCount = message.size ?? 0;\n } else if (message.rows) {\n const [dates, series] = getCategoriesAndSeries(\n this.#columnMap,\n message.rows,\n this.#categoryColumn,\n this.#seriesColumns,\n this.#itemColorFunction,\n );\n this.#dates = dates;\n this.#series = series;\n this.emit(\"update\");\n }\n } else {\n console.warn(JSON.stringify(message));\n }\n };\n\n constructor({\n category,\n dataSource,\n itemColorFunction,\n series,\n }: ChartSeriesConstructorProps) {\n super();\n this.#categoryColumn = category;\n this.#dataSource = dataSource;\n this.#itemColorFunction = itemColorFunction;\n this.#seriesColumns = series;\n\n dataSource.subscribe({ range: Range(0, 1000) }, this.handleData);\n }\n\n get categories() {\n return this.#dates;\n }\n\n get series() {\n return this.#series;\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ChartSeries.js","sources":["../../../packages/vuu-chart/src/ChartSeries.ts"],"sourcesContent":["import {\n DataSource,\n DataSourceRow,\n DataSourceSubscribeCallback,\n} from \"@vuu-ui/vuu-data-types\";\nimport { VuuRowDataItemType } from \"@vuu-ui/vuu-protocol-types\";\nimport {\n buildColumnMap,\n ColumnMap,\n EventEmitter,\n Range,\n metadataKeys,\n} from \"@vuu-ui/vuu-utils\";\nimport { MovingDataRowWindow } from \"./DataRowMovingWindow\";\n\ntype Series = {\n id: string;\n name: string;\n label: string;\n data: DataSourceValue<number>[];\n lineStyle: {\n width: number;\n };\n itemStyle: {\n color: string | ItemColorFunction;\n };\n symbol: \"emptyCircle\" | \"circle\";\n type: \"line\";\n};\n\nexport type ItemColorFunction = (params: {\n color: string;\n data: DataSourceValue;\n dataIndex: number;\n name: string;\n seriesName: string;\n}) => string;\n\nconst defaultItemColorFunction: ItemColorFunction = ({ color }) => color;\n\nconst { KEY } = metadataKeys;\n\nexport type DataSourceValue<T extends VuuRowDataItemType = number> = {\n key: string;\n readonly row: DataSourceRow;\n value: T;\n};\n\nfunction DataSourceValue<T extends VuuRowDataItemType = number>(\n key: string,\n row: DataSourceRow,\n value: T,\n): DataSourceValue<T> {\n return { key, row, value };\n}\n\nfunction getCategoriesAndSeries(\n columnMap: ColumnMap,\n data: DataSourceRow[],\n categoryColumn: string,\n seriesColumns: string[],\n itemColorFunction = defaultItemColorFunction,\n): [string[], Series[]] {\n const categoryValues: string[] = [];\n const seriesMap = new Map<string, Series>();\n\n data.forEach((row) => {\n const categoryValue = row[columnMap[categoryColumn]] as string;\n categoryValues.push(categoryValue);\n\n for (const seriesColumn of seriesColumns) {\n let series = seriesMap.get(seriesColumn);\n if (!series) {\n series = {\n //any reason we can't simply use col name here ?\n id: seriesColumn,\n name: seriesColumn,\n label: seriesColumn,\n data: [],\n type: \"line\",\n itemStyle: {\n color: itemColorFunction,\n },\n lineStyle: {\n width: 1.5,\n },\n symbol: \"circle\",\n };\n seriesMap.set(seriesColumn, series);\n }\n\n const key = row[KEY] as string;\n const value = row[columnMap[seriesColumn]] as number;\n series.data.push(DataSourceValue(key, row, value));\n }\n });\n\n return [categoryValues, Array.from(seriesMap.values())];\n}\n\nexport type ChartEvents = {\n update: () => void;\n};\nexport interface ChartSeriesConstructorProps {\n dataSource: DataSource;\n itemColorFunction?: ItemColorFunction;\n}\n\nexport class ChartSeries extends EventEmitter<ChartEvents> {\n #categoryColumn = \"\";\n #columnMap: ColumnMap = {};\n #itemColorFunction: ItemColorFunction | undefined;\n #dataWindow = new MovingDataRowWindow(Range(0, 1000));\n\n #dates: string[] = [];\n #series: Series[] = [];\n #seriesColumns: string[] = [];\n\n handleData: DataSourceSubscribeCallback = (message) => {\n if (message.type === \"subscribed\") {\n this.#columnMap = buildColumnMap(message.tableSchema.columns);\n } else if (message.type === \"viewport-update\") {\n if (message.mode === \"size-only\") {\n // ???\n } else if (message.rows) {\n for (const row of message.rows) {\n this.#dataWindow.add(row);\n }\n this.buildCategoriesAndSeries();\n }\n } else {\n console.warn(JSON.stringify(message));\n }\n };\n\n buildCategoriesAndSeries() {\n if (this.#categoryColumn && this.#seriesColumns.length > 0) {\n const [dates, series] = getCategoriesAndSeries(\n this.#columnMap,\n this.#dataWindow.data,\n this.#categoryColumn,\n this.#seriesColumns,\n this.#itemColorFunction,\n );\n this.#dates = dates;\n this.#series = series;\n\n this.emit(\"update\");\n }\n }\n\n constructor({ dataSource, itemColorFunction }: ChartSeriesConstructorProps) {\n super();\n this.#itemColorFunction = itemColorFunction;\n dataSource.subscribe({ range: Range(0, 1000) }, this.handleData);\n }\n\n get categoryColumn() {\n return this.#categoryColumn;\n }\n\n set categoryColumn(categoryColumn: string) {\n this.#categoryColumn = categoryColumn;\n if (this.#seriesColumns.length > 0) {\n this.buildCategoriesAndSeries();\n }\n }\n\n get seriesColumnNames() {\n return this.#seriesColumns;\n }\n\n set seriesColumnNames(seriesColumnNames: string[]) {\n this.#seriesColumns = seriesColumnNames;\n if (this.#categoryColumn) {\n this.buildCategoriesAndSeries();\n }\n }\n\n get categories() {\n return this.#dates;\n }\n\n get series() {\n return this.#series;\n }\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,95 @@
1
+ import { WindowRange, metadataKeys } from '@vuu-ui/vuu-utils';
2
+
3
+ var __defProp = Object.defineProperty;
4
+ var __typeError = (msg) => {
5
+ throw TypeError(msg);
6
+ };
7
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
8
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
9
+ var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
10
+ var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
11
+ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
12
+ var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), member.set(obj, value), value);
13
+ var _range;
14
+ const { IDX, KEY } = metadataKeys;
15
+ class MovingDataRowWindow {
16
+ constructor({ from, to }) {
17
+ __publicField(this, "data");
18
+ __publicField(this, "rowCount", 0);
19
+ __privateAdd(this, _range);
20
+ __publicField(this, "setRowCount", (rowCount) => {
21
+ if (rowCount < this.data.length) {
22
+ this.data.length = rowCount;
23
+ }
24
+ this.rowCount = rowCount;
25
+ });
26
+ __privateSet(this, _range, new WindowRange(from, to));
27
+ this.data = new Array(Math.max(0, to - from));
28
+ this.rowCount = 0;
29
+ }
30
+ add(data) {
31
+ const index = data[IDX];
32
+ if (this.isWithinRange(index)) {
33
+ const internalIndex = index - __privateGet(this, _range).from;
34
+ this.data[internalIndex] = data;
35
+ }
36
+ }
37
+ getAtIndex(index) {
38
+ return __privateGet(this, _range).isWithin(index) && this.data[index - __privateGet(this, _range).from] != null ? this.data[index - __privateGet(this, _range).from] : void 0;
39
+ }
40
+ getByKey(key) {
41
+ return this.data.find((row) => row[KEY] === key);
42
+ }
43
+ isWithinRange(index) {
44
+ return __privateGet(this, _range).isWithin(index);
45
+ }
46
+ setRange({ from, to }) {
47
+ if (from !== __privateGet(this, _range).from || to !== __privateGet(this, _range).to) {
48
+ const [overlapFrom, overlapTo] = __privateGet(this, _range).overlap(from, to);
49
+ const newData = new Array(Math.max(0, to - from));
50
+ for (let i = overlapFrom; i < overlapTo; i++) {
51
+ const data = this.getAtIndex(i);
52
+ if (data) {
53
+ const index = i - from;
54
+ newData[index] = data;
55
+ }
56
+ }
57
+ this.data = newData;
58
+ __privateGet(this, _range).from = from;
59
+ __privateGet(this, _range).to = to;
60
+ }
61
+ }
62
+ get hasData() {
63
+ return this.data.some((d) => d !== void 0);
64
+ }
65
+ /**
66
+ * This will throw if there is no data. Check `hasData` first
67
+ * to guard against this, if not certain.
68
+ */
69
+ get firstRow() {
70
+ for (let i = 0; i < this.data.length; i++) {
71
+ if (this.data[i]) {
72
+ return this.data[i];
73
+ }
74
+ }
75
+ throw Error(`[DataRowMovingWinddow] firstRow, no data`);
76
+ }
77
+ get range() {
78
+ return __privateGet(this, _range);
79
+ }
80
+ // TODO make this more performant, see implementation in
81
+ // array-backed-moving-window - use same implementation
82
+ get hasAllRowsWithinRange() {
83
+ const { from, to } = __privateGet(this, _range);
84
+ for (let i = from; i < to; i++) {
85
+ if (this.getAtIndex(i) === void 0) {
86
+ return false;
87
+ }
88
+ }
89
+ return true;
90
+ }
91
+ }
92
+ _range = new WeakMap();
93
+
94
+ export { MovingDataRowWindow };
95
+ //# sourceMappingURL=DataRowMovingWindow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DataRowMovingWindow.js","sources":["../../../packages/vuu-chart/src/DataRowMovingWindow.ts"],"sourcesContent":["import { DataSourceRow } from \"@vuu-ui/vuu-data-types\";\nimport { VuuRange } from \"@vuu-ui/vuu-protocol-types\";\nimport { WindowRange } from \"@vuu-ui/vuu-utils\";\nimport { metadataKeys } from \"@vuu-ui/vuu-utils\";\n\nconst { IDX, KEY } = metadataKeys;\n\nexport class MovingDataRowWindow {\n public data: DataSourceRow[];\n public rowCount = 0;\n #range: WindowRange;\n\n constructor({ from, to }: VuuRange) {\n this.#range = new WindowRange(from, to);\n //internal data is always 0 based, we add range.from to determine an offset\n this.data = new Array(Math.max(0, to - from));\n this.rowCount = 0;\n }\n\n setRowCount = (rowCount: number) => {\n if (rowCount < this.data.length) {\n this.data.length = rowCount;\n }\n\n this.rowCount = rowCount;\n };\n\n add(data: DataSourceRow) {\n const index = data[IDX];\n if (this.isWithinRange(index)) {\n const internalIndex = index - this.#range.from;\n this.data[internalIndex] = data;\n }\n }\n\n getAtIndex(index: number) {\n return this.#range.isWithin(index) &&\n this.data[index - this.#range.from] != null\n ? this.data[index - this.#range.from]\n : undefined;\n }\n\n getByKey(key: string) {\n return this.data.find((row) => row[KEY] === key);\n }\n\n isWithinRange(index: number) {\n return this.#range.isWithin(index);\n }\n\n setRange({ from, to }: VuuRange) {\n if (from !== this.#range.from || to !== this.#range.to) {\n const [overlapFrom, overlapTo] = this.#range.overlap(from, to);\n const newData = new Array(Math.max(0, to - from));\n for (let i = overlapFrom; i < overlapTo; i++) {\n const data = this.getAtIndex(i);\n if (data) {\n const index = i - from;\n newData[index] = data;\n }\n }\n this.data = newData;\n this.#range.from = from;\n this.#range.to = to;\n }\n }\n\n get hasData() {\n return this.data.some((d) => d !== undefined);\n }\n\n /**\n * This will throw if there is no data. Check `hasData` first\n * to guard against this, if not certain.\n */\n get firstRow() {\n for (let i = 0; i < this.data.length; i++) {\n if (this.data[i]) {\n return this.data[i];\n }\n }\n throw Error(`[DataRowMovingWinddow] firstRow, no data`);\n }\n\n get range() {\n return this.#range;\n }\n\n // TODO make this more performant, see implementation in\n // array-backed-moving-window - use same implementation\n get hasAllRowsWithinRange(): boolean {\n const { from, to } = this.#range;\n\n for (let i = from; i < to; i++) {\n if (this.getAtIndex(i) === undefined) {\n return false;\n }\n }\n return true;\n }\n}\n"],"names":[],"mappings":";;;;;;;;;;;;AAAA,IAAA,MAAA;AAKA,MAAM,EAAE,GAAK,EAAA,GAAA,EAAQ,GAAA,YAAA;AAEd,MAAM,mBAAoB,CAAA;AAAA,EAK/B,WAAY,CAAA,EAAE,IAAM,EAAA,EAAA,EAAgB,EAAA;AAJpC,IAAO,aAAA,CAAA,IAAA,EAAA,MAAA,CAAA;AACP,IAAA,aAAA,CAAA,IAAA,EAAO,UAAW,EAAA,CAAA,CAAA;AAClB,IAAA,YAAA,CAAA,IAAA,EAAA,MAAA,CAAA;AASA,IAAA,aAAA,CAAA,IAAA,EAAA,aAAA,EAAc,CAAC,QAAqB,KAAA;AAClC,MAAI,IAAA,QAAA,GAAW,IAAK,CAAA,IAAA,CAAK,MAAQ,EAAA;AAC/B,QAAA,IAAA,CAAK,KAAK,MAAS,GAAA,QAAA;AAAA;AAGrB,MAAA,IAAA,CAAK,QAAW,GAAA,QAAA;AAAA,KAClB,CAAA;AAZE,IAAA,YAAA,CAAA,IAAA,EAAK,MAAS,EAAA,IAAI,WAAY,CAAA,IAAA,EAAM,EAAE,CAAA,CAAA;AAEtC,IAAK,IAAA,CAAA,IAAA,GAAO,IAAI,KAAM,CAAA,IAAA,CAAK,IAAI,CAAG,EAAA,EAAA,GAAK,IAAI,CAAC,CAAA;AAC5C,IAAA,IAAA,CAAK,QAAW,GAAA,CAAA;AAAA;AAClB,EAUA,IAAI,IAAqB,EAAA;AACvB,IAAM,MAAA,KAAA,GAAQ,KAAK,GAAG,CAAA;AACtB,IAAI,IAAA,IAAA,CAAK,aAAc,CAAA,KAAK,CAAG,EAAA;AAC7B,MAAM,MAAA,aAAA,GAAgB,KAAQ,GAAA,YAAA,CAAA,IAAA,EAAK,MAAO,CAAA,CAAA,IAAA;AAC1C,MAAK,IAAA,CAAA,IAAA,CAAK,aAAa,CAAI,GAAA,IAAA;AAAA;AAC7B;AACF,EAEA,WAAW,KAAe,EAAA;AACxB,IAAA,OAAO,mBAAK,MAAO,CAAA,CAAA,QAAA,CAAS,KAAK,CAC/B,IAAA,IAAA,CAAK,KAAK,KAAQ,GAAA,YAAA,CAAA,IAAA,EAAK,QAAO,IAAI,CAAA,IAAK,OACrC,IAAK,CAAA,IAAA,CAAK,QAAQ,YAAK,CAAA,IAAA,EAAA,MAAA,CAAA,CAAO,IAAI,CAClC,GAAA,KAAA,CAAA;AAAA;AACN,EAEA,SAAS,GAAa,EAAA;AACpB,IAAO,OAAA,IAAA,CAAK,KAAK,IAAK,CAAA,CAAC,QAAQ,GAAI,CAAA,GAAG,MAAM,GAAG,CAAA;AAAA;AACjD,EAEA,cAAc,KAAe,EAAA;AAC3B,IAAO,OAAA,YAAA,CAAA,IAAA,EAAK,MAAO,CAAA,CAAA,QAAA,CAAS,KAAK,CAAA;AAAA;AACnC,EAEA,QAAS,CAAA,EAAE,IAAM,EAAA,EAAA,EAAgB,EAAA;AAC/B,IAAA,IAAI,SAAS,YAAK,CAAA,IAAA,EAAA,MAAA,CAAA,CAAO,QAAQ,EAAO,KAAA,YAAA,CAAA,IAAA,EAAK,QAAO,EAAI,EAAA;AACtD,MAAM,MAAA,CAAC,aAAa,SAAS,CAAA,GAAI,mBAAK,MAAO,CAAA,CAAA,OAAA,CAAQ,MAAM,EAAE,CAAA;AAC7D,MAAM,MAAA,OAAA,GAAU,IAAI,KAAM,CAAA,IAAA,CAAK,IAAI,CAAG,EAAA,EAAA,GAAK,IAAI,CAAC,CAAA;AAChD,MAAA,KAAA,IAAS,CAAI,GAAA,WAAA,EAAa,CAAI,GAAA,SAAA,EAAW,CAAK,EAAA,EAAA;AAC5C,QAAM,MAAA,IAAA,GAAO,IAAK,CAAA,UAAA,CAAW,CAAC,CAAA;AAC9B,QAAA,IAAI,IAAM,EAAA;AACR,UAAA,MAAM,QAAQ,CAAI,GAAA,IAAA;AAClB,UAAA,OAAA,CAAQ,KAAK,CAAI,GAAA,IAAA;AAAA;AACnB;AAEF,MAAA,IAAA,CAAK,IAAO,GAAA,OAAA;AACZ,MAAA,YAAA,CAAA,IAAA,EAAK,QAAO,IAAO,GAAA,IAAA;AACnB,MAAA,YAAA,CAAA,IAAA,EAAK,QAAO,EAAK,GAAA,EAAA;AAAA;AACnB;AACF,EAEA,IAAI,OAAU,GAAA;AACZ,IAAA,OAAO,KAAK,IAAK,CAAA,IAAA,CAAK,CAAC,CAAA,KAAM,MAAM,KAAS,CAAA,CAAA;AAAA;AAC9C;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,QAAW,GAAA;AACb,IAAA,KAAA,IAAS,IAAI,CAAG,EAAA,CAAA,GAAI,IAAK,CAAA,IAAA,CAAK,QAAQ,CAAK,EAAA,EAAA;AACzC,MAAI,IAAA,IAAA,CAAK,IAAK,CAAA,CAAC,CAAG,EAAA;AAChB,QAAO,OAAA,IAAA,CAAK,KAAK,CAAC,CAAA;AAAA;AACpB;AAEF,IAAA,MAAM,MAAM,CAA0C,wCAAA,CAAA,CAAA;AAAA;AACxD,EAEA,IAAI,KAAQ,GAAA;AACV,IAAA,OAAO,YAAK,CAAA,IAAA,EAAA,MAAA,CAAA;AAAA;AACd;AAAA;AAAA,EAIA,IAAI,qBAAiC,GAAA;AACnC,IAAA,MAAM,EAAE,IAAA,EAAM,EAAG,EAAA,GAAI,YAAK,CAAA,IAAA,EAAA,MAAA,CAAA;AAE1B,IAAA,KAAA,IAAS,CAAI,GAAA,IAAA,EAAM,CAAI,GAAA,EAAA,EAAI,CAAK,EAAA,EAAA;AAC9B,MAAA,IAAI,IAAK,CAAA,UAAA,CAAW,CAAC,CAAA,KAAM,KAAW,CAAA,EAAA;AACpC,QAAO,OAAA,KAAA;AAAA;AACT;AAEF,IAAO,OAAA,IAAA;AAAA;AAEX;AA1FE,MAAA,GAAA,IAAA,OAAA,EAAA;;;;"}
@@ -1,5 +1,6 @@
1
1
  import { useState, useMemo } from 'react';
2
2
  import { ChartSeries } from './ChartSeries.js';
3
+ import { itemsChanged } from '@vuu-ui/vuu-utils';
3
4
 
4
5
  const defaultPalette = [
5
6
  "#4676bf",
@@ -18,15 +19,22 @@ const useChartOptions = ({
18
19
  }) => {
19
20
  const [, forceRender] = useState({});
20
21
  const chartSeries = useMemo(() => {
22
+ console.log("new ChartSeries");
21
23
  const cs = new ChartSeries({
22
- category: categoryColumnName,
23
24
  itemColorFunction,
24
- series: seriesColumnNames,
25
25
  dataSource
26
26
  });
27
27
  cs.on("update", () => forceRender({}));
28
28
  return cs;
29
- }, [categoryColumnName, dataSource, itemColorFunction, seriesColumnNames]);
29
+ }, [dataSource, itemColorFunction]);
30
+ useMemo(() => {
31
+ if (categoryColumnName !== chartSeries.categoryColumn) {
32
+ chartSeries.categoryColumn = categoryColumnName;
33
+ }
34
+ if (itemsChanged(seriesColumnNames, chartSeries.seriesColumnNames)) {
35
+ chartSeries.seriesColumnNames = seriesColumnNames;
36
+ }
37
+ }, [categoryColumnName, chartSeries, seriesColumnNames]);
30
38
  return {
31
39
  animation: false,
32
40
  color: palette,
@@ -43,6 +51,9 @@ const useChartOptions = ({
43
51
  right: 5
44
52
  },
45
53
  series: chartSeries.series,
54
+ tooltip: {
55
+ trigger: "axis"
56
+ },
46
57
  xAxis: {
47
58
  data: chartSeries.categories
48
59
  },
@@ -1 +1 @@
1
- {"version":3,"file":"useChartOptions.js","sources":["../../../packages/vuu-chart/src/useChartOptions.ts"],"sourcesContent":["import { type EChartsCoreOption } from \"echarts\";\nimport { useMemo, useState } from \"react\";\nimport { ChartSeries, ItemColorFunction } from \"./ChartSeries\";\nimport { DataSource } from \"@vuu-ui/vuu-data-types\";\n\nconst defaultPalette = [\n \"#4676bf\",\n \"#ab6528\",\n \"#9f55c2\",\n \"#2a8285\",\n \"#697694\",\n \"#B0549d\",\n];\nexport interface ChartOptionsProps {\n categoryColumnName: string;\n dataSource: DataSource;\n itemColorFunction?: ItemColorFunction;\n palette?: string[];\n seriesColumnNames: string[];\n}\n\nexport const useChartOptions = ({\n categoryColumnName,\n dataSource,\n itemColorFunction,\n palette = defaultPalette,\n seriesColumnNames,\n}: ChartOptionsProps) => {\n const [, forceRender] = useState({});\n\n const chartSeries = useMemo(() => {\n const cs = new ChartSeries({\n category: categoryColumnName,\n itemColorFunction,\n series: seriesColumnNames,\n dataSource,\n });\n cs.on(\"update\", () => forceRender({}));\n return cs;\n }, [categoryColumnName, dataSource, itemColorFunction, seriesColumnNames]);\n\n return {\n animation: false,\n color: palette,\n dataZoom: [\n {\n type: \"slider\",\n start: 0,\n end: 100,\n },\n ],\n grid: {\n left: \"0\",\n bottom: 0,\n right: 5,\n },\n series: chartSeries.series,\n xAxis: {\n data: chartSeries.categories,\n },\n yAxis: {},\n } as EChartsCoreOption;\n};\n"],"names":[],"mappings":";;;AAKA,MAAM,cAAiB,GAAA;AAAA,EACrB,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA;AASO,MAAM,kBAAkB,CAAC;AAAA,EAC9B,kBAAA;AAAA,EACA,UAAA;AAAA,EACA,iBAAA;AAAA,EACA,OAAU,GAAA,cAAA;AAAA,EACV;AACF,CAAyB,KAAA;AACvB,EAAA,MAAM,GAAG,WAAW,CAAI,GAAA,QAAA,CAAS,EAAE,CAAA;AAEnC,EAAM,MAAA,WAAA,GAAc,QAAQ,MAAM;AAChC,IAAM,MAAA,EAAA,GAAK,IAAI,WAAY,CAAA;AAAA,MACzB,QAAU,EAAA,kBAAA;AAAA,MACV,iBAAA;AAAA,MACA,MAAQ,EAAA,iBAAA;AAAA,MACR;AAAA,KACD,CAAA;AACD,IAAA,EAAA,CAAG,GAAG,QAAU,EAAA,MAAM,WAAY,CAAA,EAAE,CAAC,CAAA;AACrC,IAAO,OAAA,EAAA;AAAA,KACN,CAAC,kBAAA,EAAoB,UAAY,EAAA,iBAAA,EAAmB,iBAAiB,CAAC,CAAA;AAEzE,EAAO,OAAA;AAAA,IACL,SAAW,EAAA,KAAA;AAAA,IACX,KAAO,EAAA,OAAA;AAAA,IACP,QAAU,EAAA;AAAA,MACR;AAAA,QACE,IAAM,EAAA,QAAA;AAAA,QACN,KAAO,EAAA,CAAA;AAAA,QACP,GAAK,EAAA;AAAA;AACP,KACF;AAAA,IACA,IAAM,EAAA;AAAA,MACJ,IAAM,EAAA,GAAA;AAAA,MACN,MAAQ,EAAA,CAAA;AAAA,MACR,KAAO,EAAA;AAAA,KACT;AAAA,IACA,QAAQ,WAAY,CAAA,MAAA;AAAA,IACpB,KAAO,EAAA;AAAA,MACL,MAAM,WAAY,CAAA;AAAA,KACpB;AAAA,IACA,OAAO;AAAC,GACV;AACF;;;;"}
1
+ {"version":3,"file":"useChartOptions.js","sources":["../../../packages/vuu-chart/src/useChartOptions.ts"],"sourcesContent":["import { type EChartsCoreOption } from \"echarts\";\nimport { useMemo, useState } from \"react\";\nimport { ChartSeries, ItemColorFunction } from \"./ChartSeries\";\nimport { DataSource } from \"@vuu-ui/vuu-data-types\";\nimport { itemsChanged } from \"@vuu-ui/vuu-utils\";\n\nconst defaultPalette = [\n \"#4676bf\",\n \"#ab6528\",\n \"#9f55c2\",\n \"#2a8285\",\n \"#697694\",\n \"#B0549d\",\n];\nexport interface ChartOptionsProps {\n categoryColumnName: string;\n dataSource: DataSource;\n itemColorFunction?: ItemColorFunction;\n palette?: string[];\n seriesColumnNames: string[];\n}\n\nexport const useChartOptions = ({\n categoryColumnName,\n dataSource,\n itemColorFunction,\n palette = defaultPalette,\n seriesColumnNames,\n}: ChartOptionsProps) => {\n const [, forceRender] = useState({});\n\n const chartSeries = useMemo(() => {\n console.log(\"new ChartSeries\");\n const cs = new ChartSeries({\n itemColorFunction,\n dataSource,\n });\n cs.on(\"update\", () => forceRender({}));\n return cs;\n }, [dataSource, itemColorFunction]);\n\n useMemo(() => {\n if (categoryColumnName !== chartSeries.categoryColumn) {\n chartSeries.categoryColumn = categoryColumnName;\n }\n if (itemsChanged(seriesColumnNames, chartSeries.seriesColumnNames)) {\n chartSeries.seriesColumnNames = seriesColumnNames;\n }\n }, [categoryColumnName, chartSeries, seriesColumnNames]);\n\n return {\n animation: false,\n color: palette,\n dataZoom: [\n {\n type: \"slider\",\n start: 0,\n end: 100,\n },\n ],\n grid: {\n left: \"0\",\n bottom: 0,\n right: 5,\n },\n series: chartSeries.series,\n tooltip: {\n trigger: \"axis\",\n },\n xAxis: {\n data: chartSeries.categories,\n },\n yAxis: {},\n } as EChartsCoreOption;\n};\n"],"names":[],"mappings":";;;;AAMA,MAAM,cAAiB,GAAA;AAAA,EACrB,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA;AASO,MAAM,kBAAkB,CAAC;AAAA,EAC9B,kBAAA;AAAA,EACA,UAAA;AAAA,EACA,iBAAA;AAAA,EACA,OAAU,GAAA,cAAA;AAAA,EACV;AACF,CAAyB,KAAA;AACvB,EAAA,MAAM,GAAG,WAAW,CAAI,GAAA,QAAA,CAAS,EAAE,CAAA;AAEnC,EAAM,MAAA,WAAA,GAAc,QAAQ,MAAM;AAChC,IAAA,OAAA,CAAQ,IAAI,iBAAiB,CAAA;AAC7B,IAAM,MAAA,EAAA,GAAK,IAAI,WAAY,CAAA;AAAA,MACzB,iBAAA;AAAA,MACA;AAAA,KACD,CAAA;AACD,IAAA,EAAA,CAAG,GAAG,QAAU,EAAA,MAAM,WAAY,CAAA,EAAE,CAAC,CAAA;AACrC,IAAO,OAAA,EAAA;AAAA,GACN,EAAA,CAAC,UAAY,EAAA,iBAAiB,CAAC,CAAA;AAElC,EAAA,OAAA,CAAQ,MAAM;AACZ,IAAI,IAAA,kBAAA,KAAuB,YAAY,cAAgB,EAAA;AACrD,MAAA,WAAA,CAAY,cAAiB,GAAA,kBAAA;AAAA;AAE/B,IAAA,IAAI,YAAa,CAAA,iBAAA,EAAmB,WAAY,CAAA,iBAAiB,CAAG,EAAA;AAClE,MAAA,WAAA,CAAY,iBAAoB,GAAA,iBAAA;AAAA;AAClC,GACC,EAAA,CAAC,kBAAoB,EAAA,WAAA,EAAa,iBAAiB,CAAC,CAAA;AAEvD,EAAO,OAAA;AAAA,IACL,SAAW,EAAA,KAAA;AAAA,IACX,KAAO,EAAA,OAAA;AAAA,IACP,QAAU,EAAA;AAAA,MACR;AAAA,QACE,IAAM,EAAA,QAAA;AAAA,QACN,KAAO,EAAA,CAAA;AAAA,QACP,GAAK,EAAA;AAAA;AACP,KACF;AAAA,IACA,IAAM,EAAA;AAAA,MACJ,IAAM,EAAA,GAAA;AAAA,MACN,MAAQ,EAAA,CAAA;AAAA,MACR,KAAO,EAAA;AAAA,KACT;AAAA,IACA,QAAQ,WAAY,CAAA,MAAA;AAAA,IACpB,OAAS,EAAA;AAAA,MACP,OAAS,EAAA;AAAA,KACX;AAAA,IACA,KAAO,EAAA;AAAA,MACL,MAAM,WAAY,CAAA;AAAA,KACpB;AAAA,IACA,OAAO;AAAC,GACV;AACF;;;;"}
package/package.json CHANGED
@@ -1,16 +1,16 @@
1
1
  {
2
- "version": "2.1.0-alpha.8",
2
+ "version": "2.1.0",
3
3
  "description": "support for apache echarts using vuu data",
4
4
  "license": "Apache-2.0",
5
5
  "devDependencies": {
6
- "@vuu-ui/vuu-data-types": "2.1.0-alpha.8",
7
- "@vuu-ui/vuu-protocol-types": "2.1.0-alpha.8"
6
+ "@vuu-ui/vuu-data-types": "2.1.0",
7
+ "@vuu-ui/vuu-protocol-types": "2.1.0"
8
8
  },
9
9
  "dependencies": {
10
10
  "@salt-ds/styles": "0.2.1",
11
11
  "@salt-ds/window": "0.1.1",
12
- "@vuu-ui/vuu-context-menu": "2.1.0-alpha.8",
13
- "@vuu-ui/vuu-utils": "2.1.0-alpha.8"
12
+ "@vuu-ui/vuu-context-menu": "2.1.0",
13
+ "@vuu-ui/vuu-utils": "2.1.0"
14
14
  },
15
15
  "peerDependencies": {
16
16
  "echarts": "6.0.0",
@@ -32,22 +32,17 @@ export type ChartEvents = {
32
32
  };
33
33
  export interface ChartSeriesConstructorProps {
34
34
  dataSource: DataSource;
35
- /**
36
- * The column name of the column that defines our category axis.
37
- * By default, these are the x axis values.
38
- */
39
- category: string;
40
35
  itemColorFunction?: ItemColorFunction;
41
- /**
42
- * The column names of the columns that define our data.
43
- * By default, these are the y axis values.
44
- */
45
- series: string[];
46
36
  }
47
37
  export declare class ChartSeries extends EventEmitter<ChartEvents> {
48
38
  #private;
49
39
  handleData: DataSourceSubscribeCallback;
50
- constructor({ category, dataSource, itemColorFunction, series, }: ChartSeriesConstructorProps);
40
+ buildCategoriesAndSeries(): void;
41
+ constructor({ dataSource, itemColorFunction }: ChartSeriesConstructorProps);
42
+ get categoryColumn(): string;
43
+ set categoryColumn(categoryColumn: string);
44
+ get seriesColumnNames(): string[];
45
+ set seriesColumnNames(seriesColumnNames: string[]);
51
46
  get categories(): string[];
52
47
  get series(): Series[];
53
48
  }
@@ -0,0 +1,23 @@
1
+ import { DataSourceRow } from "@vuu-ui/vuu-data-types";
2
+ import { VuuRange } from "@vuu-ui/vuu-protocol-types";
3
+ import { WindowRange } from "@vuu-ui/vuu-utils";
4
+ export declare class MovingDataRowWindow {
5
+ #private;
6
+ data: DataSourceRow[];
7
+ rowCount: number;
8
+ constructor({ from, to }: VuuRange);
9
+ setRowCount: (rowCount: number) => void;
10
+ add(data: DataSourceRow): void;
11
+ getAtIndex(index: number): DataSourceRow | undefined;
12
+ getByKey(key: string): DataSourceRow | undefined;
13
+ isWithinRange(index: number): boolean;
14
+ setRange({ from, to }: VuuRange): void;
15
+ get hasData(): boolean;
16
+ /**
17
+ * This will throw if there is no data. Check `hasData` first
18
+ * to guard against this, if not certain.
19
+ */
20
+ get firstRow(): DataSourceRow;
21
+ get range(): WindowRange;
22
+ get hasAllRowsWithinRange(): boolean;
23
+ }