@oanda/labs-crowd-view-widget 1.0.51 → 1.0.53

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (153) hide show
  1. package/CHANGELOG.md +428 -0
  2. package/dist/main/CrowdViewWidget/Main.js +1 -5
  3. package/dist/main/CrowdViewWidget/Main.js.map +1 -1
  4. package/dist/main/CrowdViewWidget/components/Chart/Chart.js +73 -24
  5. package/dist/main/CrowdViewWidget/components/Chart/Chart.js.map +1 -1
  6. package/dist/main/CrowdViewWidget/components/Chart/ChartWithData.js +18 -9
  7. package/dist/main/CrowdViewWidget/components/Chart/ChartWithData.js.map +1 -1
  8. package/dist/main/CrowdViewWidget/components/Chart/chartOptions.js +265 -59
  9. package/dist/main/CrowdViewWidget/components/Chart/chartOptions.js.map +1 -1
  10. package/dist/main/CrowdViewWidget/components/Chart/types.js.map +1 -1
  11. package/dist/main/CrowdViewWidget/components/Chart/useCrowdViewData.js +68 -26
  12. package/dist/main/CrowdViewWidget/components/Chart/useCrowdViewData.js.map +1 -1
  13. package/dist/main/CrowdViewWidget/components/Chart/utils/chartUtils.js +20 -19
  14. package/dist/main/CrowdViewWidget/components/Chart/utils/chartUtils.js.map +1 -1
  15. package/dist/main/CrowdViewWidget/components/Chart/utils/getChartStyles.js +27 -0
  16. package/dist/main/CrowdViewWidget/components/Chart/utils/getChartStyles.js.map +1 -0
  17. package/dist/main/CrowdViewWidget/components/Chart/utils/getGridLines.js +123 -0
  18. package/dist/main/CrowdViewWidget/components/Chart/utils/getGridLines.js.map +1 -0
  19. package/dist/main/CrowdViewWidget/components/Chart/utils/index.js +15 -26
  20. package/dist/main/CrowdViewWidget/components/Chart/utils/index.js.map +1 -1
  21. package/dist/main/CrowdViewWidget/components/Chart/utils/processOrderPositionBooks.js +54 -12
  22. package/dist/main/CrowdViewWidget/components/Chart/utils/processOrderPositionBooks.js.map +1 -1
  23. package/dist/main/CrowdViewWidget/components/Chart/utils/processPriceCandles.js +49 -27
  24. package/dist/main/CrowdViewWidget/components/Chart/utils/processPriceCandles.js.map +1 -1
  25. package/dist/main/CrowdViewWidget/components/Chart/utils/processSentiments.js +43 -0
  26. package/dist/main/CrowdViewWidget/components/Chart/utils/processSentiments.js.map +1 -0
  27. package/dist/main/CrowdViewWidget/components/Chart/utils/validateData.js +8 -2
  28. package/dist/main/CrowdViewWidget/components/Chart/utils/validateData.js.map +1 -1
  29. package/dist/main/CrowdViewWidget/components/Legend/Legend.js +3 -4
  30. package/dist/main/CrowdViewWidget/components/Legend/Legend.js.map +1 -1
  31. package/dist/main/CrowdViewWidget/components/Legend/LegendBar.js +2 -2
  32. package/dist/main/CrowdViewWidget/components/Legend/LegendBar.js.map +1 -1
  33. package/dist/main/CrowdViewWidget/constants.js +14 -8
  34. package/dist/main/CrowdViewWidget/constants.js.map +1 -1
  35. package/dist/main/gql/getOrderPositionBooks.js +1 -1
  36. package/dist/main/gql/getOrderPositionBooks.js.map +1 -1
  37. package/dist/main/gql/getPriceCandles.js +1 -1
  38. package/dist/main/gql/getPriceCandles.js.map +1 -1
  39. package/dist/main/gql/getSentiments.js +11 -0
  40. package/dist/main/gql/getSentiments.js.map +1 -0
  41. package/dist/main/gql/types/gql.js +3 -2
  42. package/dist/main/gql/types/gql.js.map +1 -1
  43. package/dist/main/gql/types/graphql.js +273 -19
  44. package/dist/main/gql/types/graphql.js.map +1 -1
  45. package/dist/module/CrowdViewWidget/Main.js +2 -6
  46. package/dist/module/CrowdViewWidget/Main.js.map +1 -1
  47. package/dist/module/CrowdViewWidget/components/Chart/Chart.js +76 -27
  48. package/dist/module/CrowdViewWidget/components/Chart/Chart.js.map +1 -1
  49. package/dist/module/CrowdViewWidget/components/Chart/ChartWithData.js +18 -9
  50. package/dist/module/CrowdViewWidget/components/Chart/ChartWithData.js.map +1 -1
  51. package/dist/module/CrowdViewWidget/components/Chart/chartOptions.js +265 -60
  52. package/dist/module/CrowdViewWidget/components/Chart/chartOptions.js.map +1 -1
  53. package/dist/module/CrowdViewWidget/components/Chart/types.js.map +1 -1
  54. package/dist/module/CrowdViewWidget/components/Chart/useCrowdViewData.js +69 -27
  55. package/dist/module/CrowdViewWidget/components/Chart/useCrowdViewData.js.map +1 -1
  56. package/dist/module/CrowdViewWidget/components/Chart/utils/chartUtils.js +21 -20
  57. package/dist/module/CrowdViewWidget/components/Chart/utils/chartUtils.js.map +1 -1
  58. package/dist/module/CrowdViewWidget/components/Chart/utils/getChartStyles.js +20 -0
  59. package/dist/module/CrowdViewWidget/components/Chart/utils/getChartStyles.js.map +1 -0
  60. package/dist/module/CrowdViewWidget/components/Chart/utils/getGridLines.js +116 -0
  61. package/dist/module/CrowdViewWidget/components/Chart/utils/getGridLines.js.map +1 -0
  62. package/dist/module/CrowdViewWidget/components/Chart/utils/index.js +2 -3
  63. package/dist/module/CrowdViewWidget/components/Chart/utils/index.js.map +1 -1
  64. package/dist/module/CrowdViewWidget/components/Chart/utils/processOrderPositionBooks.js +54 -12
  65. package/dist/module/CrowdViewWidget/components/Chart/utils/processOrderPositionBooks.js.map +1 -1
  66. package/dist/module/CrowdViewWidget/components/Chart/utils/processPriceCandles.js +49 -27
  67. package/dist/module/CrowdViewWidget/components/Chart/utils/processPriceCandles.js.map +1 -1
  68. package/dist/module/CrowdViewWidget/components/Chart/utils/processSentiments.js +36 -0
  69. package/dist/module/CrowdViewWidget/components/Chart/utils/processSentiments.js.map +1 -0
  70. package/dist/module/CrowdViewWidget/components/Chart/utils/validateData.js +8 -2
  71. package/dist/module/CrowdViewWidget/components/Chart/utils/validateData.js.map +1 -1
  72. package/dist/module/CrowdViewWidget/components/Legend/Legend.js +3 -4
  73. package/dist/module/CrowdViewWidget/components/Legend/Legend.js.map +1 -1
  74. package/dist/module/CrowdViewWidget/components/Legend/LegendBar.js +2 -2
  75. package/dist/module/CrowdViewWidget/components/Legend/LegendBar.js.map +1 -1
  76. package/dist/module/CrowdViewWidget/constants.js +13 -7
  77. package/dist/module/CrowdViewWidget/constants.js.map +1 -1
  78. package/dist/module/gql/getOrderPositionBooks.js +1 -1
  79. package/dist/module/gql/getOrderPositionBooks.js.map +1 -1
  80. package/dist/module/gql/getPriceCandles.js +1 -1
  81. package/dist/module/gql/getPriceCandles.js.map +1 -1
  82. package/dist/module/gql/getSentiments.js +6 -0
  83. package/dist/module/gql/getSentiments.js.map +1 -0
  84. package/dist/module/gql/types/gql.js +3 -2
  85. package/dist/module/gql/types/gql.js.map +1 -1
  86. package/dist/module/gql/types/graphql.js +272 -18
  87. package/dist/module/gql/types/graphql.js.map +1 -1
  88. package/dist/types/CrowdViewWidget/components/Chart/Chart.d.ts +1 -1
  89. package/dist/types/CrowdViewWidget/components/Chart/types.d.ts +69 -9
  90. package/dist/types/CrowdViewWidget/components/Chart/utils/chartUtils.d.ts +5 -6
  91. package/dist/types/CrowdViewWidget/components/Chart/utils/getChartStyles.d.ts +10 -0
  92. package/dist/types/CrowdViewWidget/components/Chart/utils/getGridLines.d.ts +97 -0
  93. package/dist/types/CrowdViewWidget/components/Chart/utils/index.d.ts +2 -3
  94. package/dist/types/CrowdViewWidget/components/Chart/utils/processOrderPositionBooks.d.ts +10 -7
  95. package/dist/types/CrowdViewWidget/components/Chart/utils/processPriceCandles.d.ts +6 -21
  96. package/dist/types/CrowdViewWidget/components/Chart/utils/processSentiments.d.ts +6 -0
  97. package/dist/types/CrowdViewWidget/components/Chart/utils/validateData.d.ts +1 -1
  98. package/dist/types/CrowdViewWidget/components/Legend/Legend.d.ts +2 -2
  99. package/dist/types/CrowdViewWidget/components/Legend/LegendBar.d.ts +1 -1
  100. package/dist/types/CrowdViewWidget/constants.d.ts +12 -6
  101. package/dist/types/gql/getSentiments.d.ts +2 -0
  102. package/dist/types/gql/types/gql.d.ts +15 -4
  103. package/dist/types/gql/types/graphql.d.ts +66 -11
  104. package/package.json +3 -3
  105. package/src/CrowdViewWidget/Main.tsx +2 -4
  106. package/src/CrowdViewWidget/components/Chart/Chart.tsx +99 -38
  107. package/src/CrowdViewWidget/components/Chart/ChartWithData.tsx +24 -7
  108. package/src/CrowdViewWidget/components/Chart/chartOptions.ts +305 -87
  109. package/src/CrowdViewWidget/components/Chart/types.ts +82 -16
  110. package/src/CrowdViewWidget/components/Chart/useCrowdViewData.ts +105 -56
  111. package/src/CrowdViewWidget/components/Chart/utils/chartUtils.ts +65 -34
  112. package/src/CrowdViewWidget/components/Chart/utils/getChartStyles.ts +42 -0
  113. package/src/CrowdViewWidget/components/Chart/utils/getGridLines.ts +148 -0
  114. package/src/CrowdViewWidget/components/Chart/utils/index.ts +2 -3
  115. package/src/CrowdViewWidget/components/Chart/utils/processOrderPositionBooks.ts +84 -22
  116. package/src/CrowdViewWidget/components/Chart/utils/processPriceCandles.ts +52 -38
  117. package/src/CrowdViewWidget/components/Chart/utils/processSentiments.ts +55 -0
  118. package/src/CrowdViewWidget/components/Chart/utils/validateData.ts +10 -2
  119. package/src/CrowdViewWidget/components/Legend/Legend.tsx +5 -6
  120. package/src/CrowdViewWidget/components/Legend/LegendBar.tsx +3 -3
  121. package/src/CrowdViewWidget/constants.ts +18 -7
  122. package/src/gql/getOrderPositionBooks.ts +13 -5
  123. package/src/gql/getPriceCandles.ts +1 -0
  124. package/src/gql/getSentiments.ts +25 -0
  125. package/src/gql/types/gql.ts +14 -6
  126. package/src/gql/types/graphql.ts +259 -16
  127. package/test/components/Chart/utils/chartUtils.test.ts +105 -13
  128. package/test/components/Chart/utils/getChartStyles.test.ts +64 -0
  129. package/test/components/Chart/utils/processSentiments.test.ts +238 -0
  130. package/test/utils/processOrderPositionBooks.test.ts +201 -84
  131. package/test/utils/processPriceCandles.test.ts +93 -67
  132. package/test/utils/validateData.test.ts +136 -38
  133. package/dist/main/CrowdViewWidget/components/Chart/utils/aggregateBuckets.js +0 -37
  134. package/dist/main/CrowdViewWidget/components/Chart/utils/aggregateBuckets.js.map +0 -1
  135. package/dist/main/CrowdViewWidget/components/Chart/utils/getTargetBucketWidth.js +0 -14
  136. package/dist/main/CrowdViewWidget/components/Chart/utils/getTargetBucketWidth.js.map +0 -1
  137. package/dist/main/CrowdViewWidget/components/Chart/utils/processBuckets.js +0 -29
  138. package/dist/main/CrowdViewWidget/components/Chart/utils/processBuckets.js.map +0 -1
  139. package/dist/module/CrowdViewWidget/components/Chart/utils/aggregateBuckets.js +0 -29
  140. package/dist/module/CrowdViewWidget/components/Chart/utils/aggregateBuckets.js.map +0 -1
  141. package/dist/module/CrowdViewWidget/components/Chart/utils/getTargetBucketWidth.js +0 -7
  142. package/dist/module/CrowdViewWidget/components/Chart/utils/getTargetBucketWidth.js.map +0 -1
  143. package/dist/module/CrowdViewWidget/components/Chart/utils/processBuckets.js +0 -22
  144. package/dist/module/CrowdViewWidget/components/Chart/utils/processBuckets.js.map +0 -1
  145. package/dist/types/CrowdViewWidget/components/Chart/utils/aggregateBuckets.d.ts +0 -2
  146. package/dist/types/CrowdViewWidget/components/Chart/utils/getTargetBucketWidth.d.ts +0 -3
  147. package/dist/types/CrowdViewWidget/components/Chart/utils/processBuckets.d.ts +0 -3
  148. package/src/CrowdViewWidget/components/Chart/utils/aggregateBuckets.ts +0 -44
  149. package/src/CrowdViewWidget/components/Chart/utils/getTargetBucketWidth.ts +0 -13
  150. package/src/CrowdViewWidget/components/Chart/utils/processBuckets.ts +0 -43
  151. package/test/utils/aggregateBuckets.test.ts +0 -82
  152. package/test/utils/getTargetBucketWidth.test.ts +0 -37
  153. package/test/utils/processBuckets.test.ts +0 -153
@@ -6,26 +6,29 @@ import {
6
6
  } from '@oanda/labs-widget-common';
7
7
  import { useLocale } from '@oanda/mono-i18n';
8
8
  import type { EChartsType } from 'echarts';
9
+ import { CandlestickChart, CustomChart, LineChart } from 'echarts/charts';
9
10
  import {
10
- BarChart,
11
- CandlestickChart,
12
- CustomChart,
13
- ScatterChart,
14
- } from 'echarts/charts';
15
- import {
11
+ DatasetComponent,
16
12
  DataZoomInsideComponent,
17
13
  GraphicComponent,
18
14
  GridSimpleComponent,
15
+ MarkAreaComponent,
19
16
  MarkPointComponent,
20
17
  TooltipComponent,
18
+ VisualMapComponent,
21
19
  } from 'echarts/components';
22
20
  import * as echarts from 'echarts/core';
23
21
  import { CanvasRenderer } from 'echarts/renderers';
24
22
  import React from 'react';
25
23
 
26
- import { CHART_CONFIG } from '../../constants';
24
+ import { CHART_CONFIG_CALCULATED } from '../../constants';
27
25
  import { getOption } from './chartOptions';
28
- import type { ChartProps } from './types';
26
+ import type {
27
+ ChartProps,
28
+ DataZoomArray,
29
+ DataZoomEvent,
30
+ XAxisArray,
31
+ } from './types';
29
32
  import {
30
33
  formatXAxisLabel,
31
34
  getLabelData,
@@ -35,65 +38,123 @@ import {
35
38
  echarts.use([
36
39
  GridSimpleComponent,
37
40
  GraphicComponent,
38
- BarChart,
39
41
  CanvasRenderer,
40
42
  DataZoomInsideComponent,
41
43
  CustomChart,
42
44
  TooltipComponent,
43
45
  CandlestickChart,
44
46
  MarkPointComponent,
45
- ScatterChart,
47
+ MarkAreaComponent,
48
+ LineChart,
49
+ VisualMapComponent,
50
+ DatasetComponent,
46
51
  ]);
47
52
 
48
53
  echarts.registerTheme('dark_theme', getChartTheme(Theme.Dark));
49
54
  echarts.registerTheme('light_theme', getChartTheme(Theme.Light));
50
55
 
51
- const Chart = ({ data, isDesktop }: ChartProps) => {
56
+ const Chart = ({ mainData, additionalData, isDesktop }: ChartProps) => {
52
57
  const { isDark } = useLayoutProvider();
53
58
  const { lang } = useLocale();
54
59
 
55
60
  return (
56
61
  <BaseChart
57
- chartHeight={CHART_CONFIG.HEIGHT}
62
+ chartHeight={CHART_CONFIG_CALCULATED.FULL_HEIGHT}
58
63
  echarts={echarts}
59
64
  isDark={isDark}
60
65
  lazyUpdate={true}
61
- option={getOption(data, isDark, isDesktop, lang)}
66
+ option={getOption({
67
+ mainData,
68
+ additionalData,
69
+ isDark,
70
+ isDesktop,
71
+ labelCallback: lang,
72
+ })}
62
73
  opts={{ renderer: 'canvas' }}
63
74
  onEvents={{
64
- datazoom: (_params: unknown, instance: EChartsType) => {
65
- const { dataZoom } = instance.getOption();
75
+ datazoom: (params: DataZoomEvent, instance: EChartsType) => {
76
+ if (!params.batch?.[0]) {
77
+ return;
78
+ }
79
+
80
+ const { dates } = mainData;
81
+ const batchItem = params.batch[0];
82
+ const { start, end } = batchItem;
83
+
84
+ const { dataZoom, xAxis } = instance.getOption();
85
+ if (
86
+ !Array.isArray(dataZoom) ||
87
+ dataZoom.length === 0 ||
88
+ !dataZoom[0] ||
89
+ typeof dataZoom[0].startValue !== 'number' ||
90
+ typeof dataZoom[0].endValue !== 'number'
91
+ ) {
92
+ return;
93
+ }
94
+
95
+ const { startValue, endValue } = dataZoom[0] as DataZoomArray[0];
66
96
 
67
- const { startValue, endValue } = (
68
- dataZoom as { startValue: number; endValue: number }[]
69
- )[0];
97
+ if (batchItem.dataZoomId === 'main') {
98
+ instance.dispatchAction({
99
+ type: 'dataZoom',
100
+ dataZoomId: 'sentiment',
101
+ start,
102
+ end,
103
+ filterMode: 'none',
104
+ });
105
+ }
106
+
107
+ if (batchItem.dataZoomId === 'sentiment') {
108
+ instance.dispatchAction({
109
+ type: 'dataZoom',
110
+ dataZoomId: 'main',
111
+ start,
112
+ end,
113
+ filterMode: 'filter',
114
+ });
115
+ }
116
+
117
+ if (!dates[startValue] || !dates[endValue]) {
118
+ return;
119
+ }
70
120
 
71
121
  const isGreaterThanTwoWeeks = isDifferenceGreaterThanTwoWeeks(
72
- data.xAxisData[startValue],
73
- data.xAxisData[endValue]
122
+ dates[startValue],
123
+ dates[endValue]
74
124
  );
75
125
 
76
- const labelsData = getLabelData({
77
- xAxisData: data.xAxisData,
78
- isGreaterThanTwoWeeks,
79
- });
126
+ const wasGreaterThanTwoWeeks =
127
+ Array.isArray(xAxis) &&
128
+ xAxis.length > 0 &&
129
+ (xAxis as XAxisArray)[0]?.name === 'xAxis-greater-than-two-weeks';
80
130
 
81
- instance.setOption({
82
- xAxis: {
83
- axisLabel: {
84
- formatter: (value: string) =>
85
- formatXAxisLabel(value, isGreaterThanTwoWeeks),
86
- },
87
- },
88
- series: [
89
- {
90
- id: 'candlestick',
91
- markPoint: {
92
- data: labelsData,
131
+ if (isGreaterThanTwoWeeks !== wasGreaterThanTwoWeeks) {
132
+ const labelsData = getLabelData({
133
+ dates,
134
+ isGreaterThanTwoWeeks,
135
+ });
136
+
137
+ instance.setOption({
138
+ xAxis: {
139
+ id: 'main-xAxis',
140
+ name: isGreaterThanTwoWeeks
141
+ ? 'xAxis-greater-than-two-weeks'
142
+ : 'xAxis-less-than-two-weeks',
143
+ axisLabel: {
144
+ formatter: (value: string) =>
145
+ formatXAxisLabel(value, isGreaterThanTwoWeeks),
93
146
  },
94
147
  },
95
- ],
96
- });
148
+ series: [
149
+ {
150
+ id: 'candlestick',
151
+ markPoint: {
152
+ data: labelsData,
153
+ },
154
+ },
155
+ ],
156
+ });
157
+ }
97
158
  },
98
159
  }}
99
160
  />
@@ -7,6 +7,7 @@ import {
7
7
  } from '@oanda/labs-widget-common';
8
8
  import React from 'react';
9
9
 
10
+ import { Legend } from '../Legend';
10
11
  import { Chart } from './Chart';
11
12
  import type { ChartWithDataProps } from './types';
12
13
  import { useCrowdViewData } from './useCrowdViewData';
@@ -17,10 +18,10 @@ const ChartWithData = ({
17
18
  division,
18
19
  granularity,
19
20
  }: ChartWithDataProps) => {
20
- const { size } = useLayoutProvider();
21
+ const { size, isDark } = useLayoutProvider();
21
22
  const isDesktop = size === Size.DESKTOP;
22
23
 
23
- const { data, loading, error } = useCrowdViewData({
24
+ const { mainData, additionalData, loading, error } = useCrowdViewData({
24
25
  instrument,
25
26
  bookType,
26
27
  division,
@@ -29,23 +30,39 @@ const ChartWithData = ({
29
30
 
30
31
  return (
31
32
  <>
32
- <div className="lw-relative lw-h-[450px] lw-w-full">
33
+ <div className="lw-relative lw-h-[610px] lw-w-full">
33
34
  {error && (
34
- <div className="lw-absolute lw-left-0 lw-top-0 lw-flex lw-h-[calc(100%-30px)] lw-w-full lw-items-center lw-justify-center lw-border lw-border-solid lw-border-border-primary">
35
+ <div className="lw-absolute lw-left-0 lw-top-0 lw-flex lw-h-full lw-w-full lw-items-center lw-justify-center lw-border lw-border-solid lw-border-border-primary">
35
36
  <ChartError />
36
37
  </div>
37
38
  )}
38
39
  {loading && (
39
- <div className="lw-absolute lw-left-0 lw-top-0 lw-flex lw-h-[calc(100%-30px)] lw-w-full lw-items-center lw-justify-center lw-border lw-border-solid lw-border-border-primary">
40
+ <div className="lw-absolute lw-left-0 lw-top-0 lw-flex lw-h-full lw-w-full lw-items-center lw-justify-center lw-border lw-border-solid lw-border-border-primary">
40
41
  <Spinner size={SpinnerSize.lg} />
41
42
  </div>
42
43
  )}
43
- {!loading && !error && !!data && (
44
+ {!loading && !error && !!mainData && !!additionalData && (
44
45
  <div className="lw-absolute lw-left-0 lw-top-0 lw-flex lw-h-full lw-w-full">
45
- <Chart data={data} isDesktop={isDesktop} />
46
+ <Chart
47
+ additionalData={additionalData}
48
+ isDesktop={isDesktop}
49
+ mainData={mainData}
50
+ />
46
51
  </div>
47
52
  )}
48
53
  </div>
54
+ <Legend
55
+ bookType={bookType}
56
+ isDark={isDark}
57
+ longValues={[
58
+ additionalData?.sentimentThresholdMin,
59
+ additionalData?.sentimentThresholdMax,
60
+ ]}
61
+ shortValues={[
62
+ additionalData?.sentimentThresholdMin,
63
+ additionalData?.sentimentThresholdMax,
64
+ ]}
65
+ />
49
66
  </>
50
67
  );
51
68
  };