@oanda/labs-order-book-widget 1.0.70 → 1.0.72
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.
- package/CHANGELOG.md +548 -0
- package/dist/main/OrderBookWidget/ChartWithData.js +62 -0
- package/dist/main/OrderBookWidget/ChartWithData.js.map +1 -0
- package/dist/main/OrderBookWidget/Main.js +46 -0
- package/dist/main/OrderBookWidget/Main.js.map +1 -0
- package/dist/main/OrderBookWidget/OrderBookWidget.js +2 -2
- package/dist/main/OrderBookWidget/OrderBookWidget.js.map +1 -1
- package/dist/main/OrderBookWidget/components/Chart/Chart.js +16 -7
- package/dist/main/OrderBookWidget/components/Chart/Chart.js.map +1 -1
- package/dist/main/OrderBookWidget/components/Chart/constants.js +5 -3
- package/dist/main/OrderBookWidget/components/Chart/constants.js.map +1 -1
- package/dist/main/OrderBookWidget/components/Chart/formatters.js +10 -4
- package/dist/main/OrderBookWidget/components/Chart/formatters.js.map +1 -1
- package/dist/main/OrderBookWidget/components/Chart/getOption.js +81 -36
- package/dist/main/OrderBookWidget/components/Chart/getOption.js.map +1 -1
- package/dist/main/OrderBookWidget/components/Chart/types.js.map +1 -1
- package/dist/main/OrderBookWidget/config.js +69 -1
- package/dist/main/OrderBookWidget/config.js.map +1 -1
- package/dist/main/OrderBookWidget/types.js +20 -0
- package/dist/main/OrderBookWidget/types.js.map +1 -1
- package/dist/main/translations/sources/en.json +3 -0
- package/dist/main/translations/sources/zh_TW.json +3 -0
- package/dist/module/OrderBookWidget/ChartWithData.js +55 -0
- package/dist/module/OrderBookWidget/ChartWithData.js.map +1 -0
- package/dist/module/OrderBookWidget/Main.js +38 -0
- package/dist/module/OrderBookWidget/Main.js.map +1 -0
- package/dist/module/OrderBookWidget/OrderBookWidget.js +2 -2
- package/dist/module/OrderBookWidget/OrderBookWidget.js.map +1 -1
- package/dist/module/OrderBookWidget/components/Chart/Chart.js +17 -8
- package/dist/module/OrderBookWidget/components/Chart/Chart.js.map +1 -1
- package/dist/module/OrderBookWidget/components/Chart/constants.js +4 -2
- package/dist/module/OrderBookWidget/components/Chart/constants.js.map +1 -1
- package/dist/module/OrderBookWidget/components/Chart/formatters.js +10 -4
- package/dist/module/OrderBookWidget/components/Chart/formatters.js.map +1 -1
- package/dist/module/OrderBookWidget/components/Chart/getOption.js +80 -35
- package/dist/module/OrderBookWidget/components/Chart/getOption.js.map +1 -1
- package/dist/module/OrderBookWidget/components/Chart/types.js.map +1 -1
- package/dist/module/OrderBookWidget/config.js +69 -1
- package/dist/module/OrderBookWidget/config.js.map +1 -1
- package/dist/module/OrderBookWidget/types.js +19 -1
- package/dist/module/OrderBookWidget/types.js.map +1 -1
- package/dist/module/translations/sources/en.json +3 -0
- package/dist/module/translations/sources/zh_TW.json +3 -0
- package/dist/types/OrderBookWidget/ChartWithData.d.ts +4 -0
- package/dist/types/OrderBookWidget/Main.d.ts +4 -0
- package/dist/types/OrderBookWidget/components/Chart/Chart.d.ts +1 -1
- package/dist/types/OrderBookWidget/components/Chart/constants.d.ts +4 -2
- package/dist/types/OrderBookWidget/components/Chart/getOption.d.ts +16 -1
- package/dist/types/OrderBookWidget/components/Chart/types.d.ts +11 -1
- package/dist/types/OrderBookWidget/config.d.ts +7 -1
- package/dist/types/OrderBookWidget/types.d.ts +26 -3
- package/package.json +3 -3
- package/src/OrderBookWidget/ChartWithData.tsx +78 -0
- package/src/OrderBookWidget/Main.tsx +40 -0
- package/src/OrderBookWidget/OrderBookWidget.tsx +2 -2
- package/src/OrderBookWidget/components/Chart/Chart.tsx +12 -6
- package/src/OrderBookWidget/components/Chart/constants.ts +4 -2
- package/src/OrderBookWidget/components/Chart/formatters.ts +6 -4
- package/src/OrderBookWidget/components/Chart/getOption.ts +93 -39
- package/src/OrderBookWidget/components/Chart/types.ts +11 -3
- package/src/OrderBookWidget/config.ts +70 -1
- package/src/OrderBookWidget/types.ts +28 -3
- package/src/translations/sources/en.json +3 -0
- package/src/translations/sources/zh_TW.json +3 -0
- package/test/Main.test.tsx +129 -0
- package/test/chartOptions.test.ts +20 -0
- package/dist/main/OrderBookWidget/Widget.js +0 -61
- package/dist/main/OrderBookWidget/Widget.js.map +0 -1
- package/dist/module/OrderBookWidget/Widget.js +0 -53
- package/dist/module/OrderBookWidget/Widget.js.map +0 -1
- package/dist/types/OrderBookWidget/Widget.d.ts +0 -4
- package/src/OrderBookWidget/Widget.tsx +0 -62
- package/test/Widget.test.tsx +0 -71
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { BookType } from '../gql/types/graphql';
|
|
2
|
+
import { InstrumentId } from './types';
|
|
2
3
|
const navigationConfig = [{
|
|
3
4
|
id: BookType.Order,
|
|
4
5
|
label: 'order_book'
|
|
@@ -6,5 +7,72 @@ const navigationConfig = [{
|
|
|
6
7
|
id: BookType.Position,
|
|
7
8
|
label: 'position_book'
|
|
8
9
|
}];
|
|
9
|
-
|
|
10
|
+
const instrumentSelectConfig = [{
|
|
11
|
+
id: InstrumentId.EUR_AUD,
|
|
12
|
+
label: 'EUR/AUD'
|
|
13
|
+
}, {
|
|
14
|
+
id: InstrumentId.EUR_GBP,
|
|
15
|
+
label: 'EUR/GBP'
|
|
16
|
+
}, {
|
|
17
|
+
id: InstrumentId.EUR_JPY,
|
|
18
|
+
label: 'EUR/JPY'
|
|
19
|
+
}, {
|
|
20
|
+
id: InstrumentId.EUR_USD,
|
|
21
|
+
label: 'EUR/USD'
|
|
22
|
+
}, {
|
|
23
|
+
id: InstrumentId.EUR_CHF,
|
|
24
|
+
label: 'EUR/CHF'
|
|
25
|
+
}, {
|
|
26
|
+
id: InstrumentId.USD_CHF,
|
|
27
|
+
label: 'USD/CHF'
|
|
28
|
+
}, {
|
|
29
|
+
id: InstrumentId.USD_JPY,
|
|
30
|
+
label: 'USD/JPY'
|
|
31
|
+
}, {
|
|
32
|
+
id: InstrumentId.USD_CAD,
|
|
33
|
+
label: 'USD/CAD'
|
|
34
|
+
}, {
|
|
35
|
+
id: InstrumentId.GBP_USD,
|
|
36
|
+
label: 'GBP/USD'
|
|
37
|
+
}, {
|
|
38
|
+
id: InstrumentId.GBP_JPY,
|
|
39
|
+
label: 'GBP/JPY'
|
|
40
|
+
}, {
|
|
41
|
+
id: InstrumentId.GBP_CHF,
|
|
42
|
+
label: 'GBP/CHF'
|
|
43
|
+
}, {
|
|
44
|
+
id: InstrumentId.AUD_JPY,
|
|
45
|
+
label: 'AUD/JPY'
|
|
46
|
+
}, {
|
|
47
|
+
id: InstrumentId.AUD_USD,
|
|
48
|
+
label: 'AUD/USD'
|
|
49
|
+
}, {
|
|
50
|
+
id: InstrumentId.NZD_USD,
|
|
51
|
+
label: 'NZD/USD'
|
|
52
|
+
}, {
|
|
53
|
+
id: InstrumentId.XAU_USD,
|
|
54
|
+
label: 'XAU/USD'
|
|
55
|
+
}, {
|
|
56
|
+
id: InstrumentId.XAG_USD,
|
|
57
|
+
label: 'XAG/USD'
|
|
58
|
+
}];
|
|
59
|
+
const instrumentPrecisionConfig = {
|
|
60
|
+
[InstrumentId.EUR_AUD]: 5,
|
|
61
|
+
[InstrumentId.EUR_GBP]: 5,
|
|
62
|
+
[InstrumentId.EUR_JPY]: 3,
|
|
63
|
+
[InstrumentId.EUR_USD]: 5,
|
|
64
|
+
[InstrumentId.EUR_CHF]: 5,
|
|
65
|
+
[InstrumentId.USD_CHF]: 5,
|
|
66
|
+
[InstrumentId.USD_JPY]: 3,
|
|
67
|
+
[InstrumentId.USD_CAD]: 5,
|
|
68
|
+
[InstrumentId.GBP_USD]: 5,
|
|
69
|
+
[InstrumentId.GBP_JPY]: 3,
|
|
70
|
+
[InstrumentId.GBP_CHF]: 5,
|
|
71
|
+
[InstrumentId.AUD_JPY]: 3,
|
|
72
|
+
[InstrumentId.AUD_USD]: 5,
|
|
73
|
+
[InstrumentId.NZD_USD]: 5,
|
|
74
|
+
[InstrumentId.XAU_USD]: 3,
|
|
75
|
+
[InstrumentId.XAG_USD]: 5
|
|
76
|
+
};
|
|
77
|
+
export { navigationConfig, instrumentSelectConfig, instrumentPrecisionConfig };
|
|
10
78
|
//# sourceMappingURL=config.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","names":["BookType","navigationConfig","id","Order","label","Position"],"sources":["../../../src/OrderBookWidget/config.ts"],"sourcesContent":["import { BookType } from '../gql/types/graphql';\n\nconst navigationConfig = [{\n id: BookType.Order,\n label: 'order_book',\n}, {\n id: BookType.Position,\n label: 'position_book',\n}];\n\nexport { navigationConfig };\n"],"mappings":"AAAA,SAASA,QAAQ,QAAQ,sBAAsB;
|
|
1
|
+
{"version":3,"file":"config.js","names":["BookType","InstrumentId","navigationConfig","id","Order","label","Position","instrumentSelectConfig","EUR_AUD","EUR_GBP","EUR_JPY","EUR_USD","EUR_CHF","USD_CHF","USD_JPY","USD_CAD","GBP_USD","GBP_JPY","GBP_CHF","AUD_JPY","AUD_USD","NZD_USD","XAU_USD","XAG_USD","instrumentPrecisionConfig"],"sources":["../../../src/OrderBookWidget/config.ts"],"sourcesContent":["import { BookType } from '../gql/types/graphql';\nimport { InstrumentId } from './types';\n\nconst navigationConfig = [{\n id: BookType.Order,\n label: 'order_book',\n}, {\n id: BookType.Position,\n label: 'position_book',\n}];\n\nconst instrumentSelectConfig = [{\n id: InstrumentId.EUR_AUD,\n label: 'EUR/AUD',\n}, {\n id: InstrumentId.EUR_GBP,\n label: 'EUR/GBP',\n}, {\n id: InstrumentId.EUR_JPY,\n label: 'EUR/JPY',\n}, {\n id: InstrumentId.EUR_USD,\n label: 'EUR/USD',\n}, {\n id: InstrumentId.EUR_CHF,\n label: 'EUR/CHF',\n}, {\n id: InstrumentId.USD_CHF,\n label: 'USD/CHF',\n}, {\n id: InstrumentId.USD_JPY,\n label: 'USD/JPY',\n}, {\n id: InstrumentId.USD_CAD,\n label: 'USD/CAD',\n}, {\n id: InstrumentId.GBP_USD,\n label: 'GBP/USD',\n}, {\n id: InstrumentId.GBP_JPY,\n label: 'GBP/JPY',\n}, {\n id: InstrumentId.GBP_CHF,\n label: 'GBP/CHF',\n}, {\n id: InstrumentId.AUD_JPY,\n label: 'AUD/JPY',\n}, {\n id: InstrumentId.AUD_USD,\n label: 'AUD/USD',\n}, {\n id: InstrumentId.NZD_USD,\n label: 'NZD/USD',\n}, {\n id: InstrumentId.XAU_USD,\n label: 'XAU/USD',\n}, {\n id: InstrumentId.XAG_USD,\n label: 'XAG/USD',\n}];\n\nconst instrumentPrecisionConfig: Record<InstrumentId, number> = {\n [InstrumentId.EUR_AUD]: 5,\n [InstrumentId.EUR_GBP]: 5,\n [InstrumentId.EUR_JPY]: 3,\n [InstrumentId.EUR_USD]: 5,\n [InstrumentId.EUR_CHF]: 5,\n [InstrumentId.USD_CHF]: 5,\n [InstrumentId.USD_JPY]: 3,\n [InstrumentId.USD_CAD]: 5,\n [InstrumentId.GBP_USD]: 5,\n [InstrumentId.GBP_JPY]: 3,\n [InstrumentId.GBP_CHF]: 5,\n [InstrumentId.AUD_JPY]: 3,\n [InstrumentId.AUD_USD]: 5,\n [InstrumentId.NZD_USD]: 5,\n [InstrumentId.XAU_USD]: 3,\n [InstrumentId.XAG_USD]: 5,\n};\nexport { navigationConfig, instrumentSelectConfig, instrumentPrecisionConfig };\n"],"mappings":"AAAA,SAASA,QAAQ,QAAQ,sBAAsB;AAC/C,SAASC,YAAY,QAAQ,SAAS;AAEtC,MAAMC,gBAAgB,GAAG,CAAC;EACxBC,EAAE,EAAEH,QAAQ,CAACI,KAAK;EAClBC,KAAK,EAAE;AACT,CAAC,EAAE;EACDF,EAAE,EAAEH,QAAQ,CAACM,QAAQ;EACrBD,KAAK,EAAE;AACT,CAAC,CAAC;AAEF,MAAME,sBAAsB,GAAG,CAAC;EAC9BJ,EAAE,EAAEF,YAAY,CAACO,OAAO;EACxBH,KAAK,EAAE;AACT,CAAC,EAAE;EACDF,EAAE,EAAEF,YAAY,CAACQ,OAAO;EACxBJ,KAAK,EAAE;AACT,CAAC,EAAE;EACDF,EAAE,EAAEF,YAAY,CAACS,OAAO;EACxBL,KAAK,EAAE;AACT,CAAC,EAAE;EACDF,EAAE,EAAEF,YAAY,CAACU,OAAO;EACxBN,KAAK,EAAE;AACT,CAAC,EAAE;EACDF,EAAE,EAAEF,YAAY,CAACW,OAAO;EACxBP,KAAK,EAAE;AACT,CAAC,EAAE;EACDF,EAAE,EAAEF,YAAY,CAACY,OAAO;EACxBR,KAAK,EAAE;AACT,CAAC,EAAE;EACDF,EAAE,EAAEF,YAAY,CAACa,OAAO;EACxBT,KAAK,EAAE;AACT,CAAC,EAAE;EACDF,EAAE,EAAEF,YAAY,CAACc,OAAO;EACxBV,KAAK,EAAE;AACT,CAAC,EAAE;EACDF,EAAE,EAAEF,YAAY,CAACe,OAAO;EACxBX,KAAK,EAAE;AACT,CAAC,EAAE;EACDF,EAAE,EAAEF,YAAY,CAACgB,OAAO;EACxBZ,KAAK,EAAE;AACT,CAAC,EAAE;EACDF,EAAE,EAAEF,YAAY,CAACiB,OAAO;EACxBb,KAAK,EAAE;AACT,CAAC,EAAE;EACDF,EAAE,EAAEF,YAAY,CAACkB,OAAO;EACxBd,KAAK,EAAE;AACT,CAAC,EAAE;EACDF,EAAE,EAAEF,YAAY,CAACmB,OAAO;EACxBf,KAAK,EAAE;AACT,CAAC,EAAE;EACDF,EAAE,EAAEF,YAAY,CAACoB,OAAO;EACxBhB,KAAK,EAAE;AACT,CAAC,EAAE;EACDF,EAAE,EAAEF,YAAY,CAACqB,OAAO;EACxBjB,KAAK,EAAE;AACT,CAAC,EAAE;EACDF,EAAE,EAAEF,YAAY,CAACsB,OAAO;EACxBlB,KAAK,EAAE;AACT,CAAC,CAAC;AAEF,MAAMmB,yBAAuD,GAAG;EAC9D,CAACvB,YAAY,CAACO,OAAO,GAAG,CAAC;EACzB,CAACP,YAAY,CAACQ,OAAO,GAAG,CAAC;EACzB,CAACR,YAAY,CAACS,OAAO,GAAG,CAAC;EACzB,CAACT,YAAY,CAACU,OAAO,GAAG,CAAC;EACzB,CAACV,YAAY,CAACW,OAAO,GAAG,CAAC;EACzB,CAACX,YAAY,CAACY,OAAO,GAAG,CAAC;EACzB,CAACZ,YAAY,CAACa,OAAO,GAAG,CAAC;EACzB,CAACb,YAAY,CAACc,OAAO,GAAG,CAAC;EACzB,CAACd,YAAY,CAACe,OAAO,GAAG,CAAC;EACzB,CAACf,YAAY,CAACgB,OAAO,GAAG,CAAC;EACzB,CAAChB,YAAY,CAACiB,OAAO,GAAG,CAAC;EACzB,CAACjB,YAAY,CAACkB,OAAO,GAAG,CAAC;EACzB,CAAClB,YAAY,CAACmB,OAAO,GAAG,CAAC;EACzB,CAACnB,YAAY,CAACoB,OAAO,GAAG,CAAC;EACzB,CAACpB,YAAY,CAACqB,OAAO,GAAG,CAAC;EACzB,CAACrB,YAAY,CAACsB,OAAO,GAAG;AAC1B,CAAC;AACD,SAASrB,gBAAgB,EAAEK,sBAAsB,EAAEiB,yBAAyB"}
|
|
@@ -1,2 +1,20 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export let InstrumentId = function (InstrumentId) {
|
|
2
|
+
InstrumentId["EUR_AUD"] = "EUR_AUD";
|
|
3
|
+
InstrumentId["EUR_GBP"] = "EUR_GBP";
|
|
4
|
+
InstrumentId["EUR_JPY"] = "EUR_JPY";
|
|
5
|
+
InstrumentId["EUR_USD"] = "EUR_USD";
|
|
6
|
+
InstrumentId["EUR_CHF"] = "EUR_CHF";
|
|
7
|
+
InstrumentId["USD_CHF"] = "USD_CHF";
|
|
8
|
+
InstrumentId["USD_JPY"] = "USD_JPY";
|
|
9
|
+
InstrumentId["USD_CAD"] = "USD_CAD";
|
|
10
|
+
InstrumentId["GBP_USD"] = "GBP_USD";
|
|
11
|
+
InstrumentId["GBP_JPY"] = "GBP_JPY";
|
|
12
|
+
InstrumentId["GBP_CHF"] = "GBP_CHF";
|
|
13
|
+
InstrumentId["AUD_JPY"] = "AUD_JPY";
|
|
14
|
+
InstrumentId["AUD_USD"] = "AUD_USD";
|
|
15
|
+
InstrumentId["NZD_USD"] = "NZD_USD";
|
|
16
|
+
InstrumentId["XAU_USD"] = "XAU_USD";
|
|
17
|
+
InstrumentId["XAG_USD"] = "XAG_USD";
|
|
18
|
+
return InstrumentId;
|
|
19
|
+
}({});
|
|
2
20
|
//# sourceMappingURL=types.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","names":[],"sources":["../../../src/OrderBookWidget/types.ts"],"sourcesContent":["import { Theme } from '@oanda/labs-widget-common';\nimport { Locale } from '@oanda/mono-i18n';\n\nexport interface OrderBookWidgetConfig {\n graphqlUrl: string;\n instrument:
|
|
1
|
+
{"version":3,"file":"types.js","names":["InstrumentId"],"sources":["../../../src/OrderBookWidget/types.ts"],"sourcesContent":["import { Theme } from '@oanda/labs-widget-common';\nimport { Locale } from '@oanda/mono-i18n';\nimport { BookType } from '../gql/types/graphql';\n\nexport interface OrderBookWidgetConfig {\n graphqlUrl: string;\n instrument: InstrumentId;\n locale: Locale;\n theme?: Theme;\n}\n\nexport interface OrderBookWrapperConfig extends OrderBookWidgetConfig {\n renderElementId: string;\n}\n\nexport interface MainProps {\n instrument?: InstrumentId;\n}\n\nexport interface ChartWithDataProps {\n instrument: InstrumentId;\n bookType: BookType;\n}\n\nexport enum InstrumentId {\n EUR_AUD = 'EUR_AUD',\n EUR_GBP = 'EUR_GBP',\n EUR_JPY = 'EUR_JPY',\n EUR_USD = 'EUR_USD',\n EUR_CHF = 'EUR_CHF',\n USD_CHF = 'USD_CHF',\n USD_JPY = 'USD_JPY',\n USD_CAD = 'USD_CAD',\n GBP_USD = 'GBP_USD',\n GBP_JPY = 'GBP_JPY',\n GBP_CHF = 'GBP_CHF',\n AUD_JPY = 'AUD_JPY',\n AUD_USD = 'AUD_USD',\n NZD_USD = 'NZD_USD',\n XAU_USD = 'XAU_USD',\n XAG_USD = 'XAG_USD',\n}\n"],"mappings":"AAwBA,WAAYA,YAAY,aAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAA,OAAZA,YAAY;AAAA"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
+
"buy": "Buy",
|
|
2
3
|
"data_unavailable": "Data unavailable",
|
|
3
4
|
"long": "Long",
|
|
4
5
|
"long_positions": "Long Positions",
|
|
@@ -9,6 +10,8 @@
|
|
|
9
10
|
"position_book": "Position Book",
|
|
10
11
|
"price": "Price",
|
|
11
12
|
"reset_zoom": "Reset Zoom",
|
|
13
|
+
"select_instrument": "Select instrument",
|
|
14
|
+
"sell": "Sell",
|
|
12
15
|
"sell_orders": "Sell Orders",
|
|
13
16
|
"short": "Short",
|
|
14
17
|
"short_positions": "Short Positions",
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
+
"buy": "買進",
|
|
2
3
|
"data_unavailable": "沒有數據",
|
|
3
4
|
"long": "長",
|
|
4
5
|
"long_positions": "長倉",
|
|
@@ -9,6 +10,8 @@
|
|
|
9
10
|
"position_book": "倉位手冊",
|
|
10
11
|
"price": "價格",
|
|
11
12
|
"reset_zoom": "重置比例",
|
|
13
|
+
"select_instrument": "選擇證券",
|
|
14
|
+
"sell": "賣出",
|
|
12
15
|
"sell_orders": "賣單",
|
|
13
16
|
"short": "短",
|
|
14
17
|
"short_positions": "短倉",
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
export declare const INITIAL_BARS = 80;
|
|
2
2
|
export declare const X_LABEL_SIZE = 40;
|
|
3
|
-
export declare const Y_LABEL_SIZE_MOBILE =
|
|
3
|
+
export declare const Y_LABEL_SIZE_MOBILE = 50;
|
|
4
4
|
export declare const Y_LABEL_SIZE_DESKTOP = 120;
|
|
5
5
|
export declare const CHART_WIDTH = 9999;
|
|
6
|
-
export declare const
|
|
6
|
+
export declare const CHART_HEIGHT_DESKTOP = 450;
|
|
7
|
+
export declare const CHART_HEIGHT_MOBILE = 390;
|
|
8
|
+
export declare const ZOOM_CONTROL_HEIGHT = 40;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { GetOptionType, GetResponsiveOptionsProps } from './types';
|
|
2
|
-
export declare const
|
|
2
|
+
export declare const getResponsiveOption: ({ isDark, isOrderBook, isDesktop, lang, }: GetResponsiveOptionsProps) => {
|
|
3
3
|
grid: {
|
|
4
4
|
name: string;
|
|
5
5
|
top: string;
|
|
@@ -7,6 +7,21 @@ export declare const getDesktopOption: ({ isDark, isOrderBook }: GetResponsiveOp
|
|
|
7
7
|
right: string;
|
|
8
8
|
bottom: string;
|
|
9
9
|
}[];
|
|
10
|
+
yAxis: {
|
|
11
|
+
axisLabel: {
|
|
12
|
+
margin: number;
|
|
13
|
+
};
|
|
14
|
+
};
|
|
15
|
+
series: {
|
|
16
|
+
type: string;
|
|
17
|
+
name: string;
|
|
18
|
+
id: string;
|
|
19
|
+
markLine: {
|
|
20
|
+
label: {
|
|
21
|
+
padding: number[];
|
|
22
|
+
};
|
|
23
|
+
};
|
|
24
|
+
}[];
|
|
10
25
|
graphic: ({
|
|
11
26
|
top: number | undefined;
|
|
12
27
|
bottom: number | undefined;
|
|
@@ -3,16 +3,26 @@ import { GetOrderPositionBooksQuery } from '../../../gql/types/graphql';
|
|
|
3
3
|
export interface ChartProps {
|
|
4
4
|
data: GetOrderPositionBooksQuery;
|
|
5
5
|
isOrderBook: boolean;
|
|
6
|
+
precision: number;
|
|
6
7
|
}
|
|
7
8
|
export interface GetResponsiveOptionsProps {
|
|
9
|
+
isDesktop: boolean;
|
|
8
10
|
isDark: boolean;
|
|
9
11
|
isOrderBook: boolean;
|
|
12
|
+
lang: (label: string) => string;
|
|
10
13
|
}
|
|
11
14
|
export interface GetOptionProps {
|
|
12
15
|
data: GetOrderPositionBooksQuery;
|
|
13
16
|
precision: number;
|
|
14
17
|
isDark: boolean;
|
|
15
18
|
isOrderBook: boolean;
|
|
19
|
+
isDesktop: boolean;
|
|
20
|
+
lang: (label: string) => string;
|
|
16
21
|
}
|
|
17
22
|
export type GetOptionType = (props: GetOptionProps) => EChartsOption;
|
|
18
|
-
export type TooltipFormatterType = (
|
|
23
|
+
export type TooltipFormatterType = (props: {
|
|
24
|
+
data: number[];
|
|
25
|
+
precision: number;
|
|
26
|
+
isOrderBook: boolean;
|
|
27
|
+
lang: (label: string) => string;
|
|
28
|
+
}) => string;
|
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
import { BookType } from '../gql/types/graphql';
|
|
2
|
+
import { InstrumentId } from './types';
|
|
2
3
|
declare const navigationConfig: {
|
|
3
4
|
id: BookType;
|
|
4
5
|
label: string;
|
|
5
6
|
}[];
|
|
6
|
-
|
|
7
|
+
declare const instrumentSelectConfig: {
|
|
8
|
+
id: InstrumentId;
|
|
9
|
+
label: string;
|
|
10
|
+
}[];
|
|
11
|
+
declare const instrumentPrecisionConfig: Record<InstrumentId, number>;
|
|
12
|
+
export { navigationConfig, instrumentSelectConfig, instrumentPrecisionConfig };
|
|
@@ -1,14 +1,37 @@
|
|
|
1
1
|
import { Theme } from '@oanda/labs-widget-common';
|
|
2
2
|
import { Locale } from '@oanda/mono-i18n';
|
|
3
|
+
import { BookType } from '../gql/types/graphql';
|
|
3
4
|
export interface OrderBookWidgetConfig {
|
|
4
5
|
graphqlUrl: string;
|
|
5
|
-
instrument:
|
|
6
|
+
instrument: InstrumentId;
|
|
6
7
|
locale: Locale;
|
|
7
8
|
theme?: Theme;
|
|
8
9
|
}
|
|
9
10
|
export interface OrderBookWrapperConfig extends OrderBookWidgetConfig {
|
|
10
11
|
renderElementId: string;
|
|
11
12
|
}
|
|
12
|
-
export interface
|
|
13
|
-
instrument
|
|
13
|
+
export interface MainProps {
|
|
14
|
+
instrument?: InstrumentId;
|
|
15
|
+
}
|
|
16
|
+
export interface ChartWithDataProps {
|
|
17
|
+
instrument: InstrumentId;
|
|
18
|
+
bookType: BookType;
|
|
19
|
+
}
|
|
20
|
+
export declare enum InstrumentId {
|
|
21
|
+
EUR_AUD = "EUR_AUD",
|
|
22
|
+
EUR_GBP = "EUR_GBP",
|
|
23
|
+
EUR_JPY = "EUR_JPY",
|
|
24
|
+
EUR_USD = "EUR_USD",
|
|
25
|
+
EUR_CHF = "EUR_CHF",
|
|
26
|
+
USD_CHF = "USD_CHF",
|
|
27
|
+
USD_JPY = "USD_JPY",
|
|
28
|
+
USD_CAD = "USD_CAD",
|
|
29
|
+
GBP_USD = "GBP_USD",
|
|
30
|
+
GBP_JPY = "GBP_JPY",
|
|
31
|
+
GBP_CHF = "GBP_CHF",
|
|
32
|
+
AUD_JPY = "AUD_JPY",
|
|
33
|
+
AUD_USD = "AUD_USD",
|
|
34
|
+
NZD_USD = "NZD_USD",
|
|
35
|
+
XAU_USD = "XAU_USD",
|
|
36
|
+
XAG_USD = "XAG_USD"
|
|
14
37
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@oanda/labs-order-book-widget",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.72",
|
|
4
4
|
"description": "Labs Order Book Widget",
|
|
5
5
|
"main": "dist/main/index.js",
|
|
6
6
|
"module": "dist/module/index.js",
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"license": "UNLICENSED",
|
|
14
14
|
"dependencies": {
|
|
15
15
|
"@apollo/client": "3.7.17",
|
|
16
|
-
"@oanda/labs-widget-common": "^1.0.
|
|
16
|
+
"@oanda/labs-widget-common": "^1.0.72",
|
|
17
17
|
"@oanda/mono-i18n": "9.0.0",
|
|
18
18
|
"classnames": "2.3.2",
|
|
19
19
|
"echarts": "5.4.3",
|
|
@@ -25,5 +25,5 @@
|
|
|
25
25
|
"@graphql-codegen/client-preset": "4.1.0",
|
|
26
26
|
"@graphql-codegen/typescript": "4.0.1"
|
|
27
27
|
},
|
|
28
|
-
"gitHead": "
|
|
28
|
+
"gitHead": "4a224fac68b6b607825b7ac6802ea0b5c499996e"
|
|
29
29
|
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { useQuery } from '@apollo/client';
|
|
3
|
+
import { useMediaQuery } from 'usehooks-ts';
|
|
4
|
+
import classnames from 'classnames';
|
|
5
|
+
import { ChartError, Spinner, SpinnerSize } from '@oanda/labs-widget-common';
|
|
6
|
+
import { ChartWithDataProps } from './types';
|
|
7
|
+
import { getOrderPositionBooks } from '../gql/getOrderPositionBooks';
|
|
8
|
+
import { GetOrderPositionBooksQuery, GetOrderPositionBooksQueryVariables, BookType } from '../gql/types/graphql';
|
|
9
|
+
import { Chart } from './components/Chart/Chart';
|
|
10
|
+
import { instrumentPrecisionConfig } from './config';
|
|
11
|
+
|
|
12
|
+
const ChartWithData = ({
|
|
13
|
+
instrument,
|
|
14
|
+
bookType,
|
|
15
|
+
}: ChartWithDataProps) => {
|
|
16
|
+
const isDesktop = useMediaQuery('(min-width: 768px)');
|
|
17
|
+
|
|
18
|
+
const { loading, data, error } = useQuery<
|
|
19
|
+
GetOrderPositionBooksQuery,
|
|
20
|
+
GetOrderPositionBooksQueryVariables
|
|
21
|
+
>(getOrderPositionBooks, {
|
|
22
|
+
variables: {
|
|
23
|
+
instrument,
|
|
24
|
+
bookType,
|
|
25
|
+
recentHours: 1,
|
|
26
|
+
},
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
const isError = (!loading && !data?.orderPositionBooks[0]?.price) || !!error;
|
|
30
|
+
|
|
31
|
+
return (
|
|
32
|
+
<div className={classnames('lw-relative lw-w-full', {
|
|
33
|
+
'lw-h-[450px]': isDesktop,
|
|
34
|
+
'lw-h-[390px]': !isDesktop,
|
|
35
|
+
})}
|
|
36
|
+
>
|
|
37
|
+
{isError && (
|
|
38
|
+
<div className={
|
|
39
|
+
classnames(
|
|
40
|
+
'lw-absolute lw-left-0 lw-top-0 lw-flex lw-w-full lw-items-center lw-justify-center lw-border lw-border-solid lw-border-border-primary',
|
|
41
|
+
{
|
|
42
|
+
'lw-h-full': isDesktop,
|
|
43
|
+
'lw-h-[calc(100%-40px)]': !isDesktop,
|
|
44
|
+
},
|
|
45
|
+
)
|
|
46
|
+
}
|
|
47
|
+
>
|
|
48
|
+
<ChartError />
|
|
49
|
+
</div>
|
|
50
|
+
)}
|
|
51
|
+
{loading && (
|
|
52
|
+
<div className={
|
|
53
|
+
classnames(
|
|
54
|
+
'lw-absolute lw-left-0 lw-top-0 lw-flex lw-w-full lw-items-center lw-justify-center lw-border lw-border-solid lw-border-border-primary',
|
|
55
|
+
{
|
|
56
|
+
'lw-h-full': isDesktop,
|
|
57
|
+
'lw-h-[calc(100%-40px)]': !isDesktop,
|
|
58
|
+
},
|
|
59
|
+
)
|
|
60
|
+
}
|
|
61
|
+
>
|
|
62
|
+
<Spinner size={SpinnerSize.lg} />
|
|
63
|
+
</div>
|
|
64
|
+
)}
|
|
65
|
+
{data && (
|
|
66
|
+
<div className="lw-absolute lw-left-0 lw-top-0 lw-flex lw-h-full lw-w-full">
|
|
67
|
+
<Chart
|
|
68
|
+
data={data}
|
|
69
|
+
isOrderBook={bookType === BookType.Order}
|
|
70
|
+
precision={instrumentPrecisionConfig[instrument]}
|
|
71
|
+
/>
|
|
72
|
+
</div>
|
|
73
|
+
)}
|
|
74
|
+
</div>
|
|
75
|
+
);
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
export { ChartWithData };
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import React, { useState } from 'react';
|
|
2
|
+
import { Select, Tabs } from '@oanda/labs-widget-common';
|
|
3
|
+
import { useLocale } from '@oanda/mono-i18n';
|
|
4
|
+
import { InstrumentId, MainProps } from './types';
|
|
5
|
+
import { BookType } from '../gql/types/graphql';
|
|
6
|
+
import { instrumentSelectConfig, navigationConfig } from './config';
|
|
7
|
+
import { ChartWithData } from './ChartWithData';
|
|
8
|
+
|
|
9
|
+
const Main = ({ instrument }: MainProps) => {
|
|
10
|
+
const [bookType, setBookType] = useState(BookType.Order);
|
|
11
|
+
const [toolInstrument, setToolInstrument] = useState(instrumentSelectConfig[0]);
|
|
12
|
+
const { lang } = useLocale();
|
|
13
|
+
|
|
14
|
+
return (
|
|
15
|
+
<div data-testid="order-book-widget" className="lw-p-4 lw-pt-0 lw-text-sm lw-tracking-normal lw-text-black">
|
|
16
|
+
<Tabs
|
|
17
|
+
activeTab={bookType}
|
|
18
|
+
handleClick={(e) => setBookType(e.currentTarget.value as BookType)}
|
|
19
|
+
labelCallback={lang}
|
|
20
|
+
items={navigationConfig}
|
|
21
|
+
mobileFullWidth
|
|
22
|
+
/>
|
|
23
|
+
{!instrument && (
|
|
24
|
+
<div className="lw-mb-6 lw-mt-12">
|
|
25
|
+
<Select
|
|
26
|
+
selectLabel={lang('select_instrument')}
|
|
27
|
+
options={instrumentSelectConfig}
|
|
28
|
+
selectedOption={toolInstrument}
|
|
29
|
+
setSelectedOption={
|
|
30
|
+
(val) => setToolInstrument(val as { id: InstrumentId; label: string })
|
|
31
|
+
}
|
|
32
|
+
/>
|
|
33
|
+
</div>
|
|
34
|
+
)}
|
|
35
|
+
<ChartWithData instrument={instrument || toolInstrument.id} bookType={bookType} />
|
|
36
|
+
</div>
|
|
37
|
+
);
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
export { Main };
|
|
@@ -2,7 +2,7 @@ import React from 'react';
|
|
|
2
2
|
import { ApolloClient, InMemoryCache, ApolloProvider } from '@apollo/client';
|
|
3
3
|
import { LocaleProvider } from '@oanda/mono-i18n';
|
|
4
4
|
import { ThemeProvider, getLocale } from '@oanda/labs-widget-common';
|
|
5
|
-
import {
|
|
5
|
+
import { Main } from './Main';
|
|
6
6
|
import { OrderBookWidgetConfig } from './types';
|
|
7
7
|
import { translations } from '../translations';
|
|
8
8
|
|
|
@@ -21,7 +21,7 @@ const OrderBookWidget = ({
|
|
|
21
21
|
<ThemeProvider theme={theme}>
|
|
22
22
|
<LocaleProvider locale={getLocale(locale)} translations={translations}>
|
|
23
23
|
<ApolloProvider client={client}>
|
|
24
|
-
<
|
|
24
|
+
<Main instrument={instrument} />
|
|
25
25
|
</ApolloProvider>
|
|
26
26
|
</LocaleProvider>
|
|
27
27
|
</ThemeProvider>
|
|
@@ -5,13 +5,15 @@ import {
|
|
|
5
5
|
Theme, ThemeContext, colorPalette, getChartTheme,
|
|
6
6
|
} from '@oanda/labs-widget-common';
|
|
7
7
|
import { useMediaQuery } from 'usehooks-ts';
|
|
8
|
-
import {
|
|
8
|
+
import { useLocale } from '@oanda/mono-i18n';
|
|
9
|
+
import { getResponsiveOption, getOption } from './getOption';
|
|
9
10
|
import { ChartProps } from './types';
|
|
10
11
|
|
|
11
12
|
registerTheme('dark_theme', getChartTheme(Theme.Dark));
|
|
12
13
|
registerTheme('light_theme', getChartTheme(Theme.Light));
|
|
13
14
|
|
|
14
|
-
export const Chart = ({ data, isOrderBook }: ChartProps) => {
|
|
15
|
+
export const Chart = ({ data, isOrderBook, precision }: ChartProps) => {
|
|
16
|
+
const { lang } = useLocale();
|
|
15
17
|
const isDark = useContext(ThemeContext) === Theme.Dark;
|
|
16
18
|
const echartRef = useRef(null);
|
|
17
19
|
const isDesktop = useMediaQuery('(min-width: 768px)');
|
|
@@ -48,9 +50,13 @@ export const Chart = ({ data, isOrderBook }: ChartProps) => {
|
|
|
48
50
|
// @ts-ignore
|
|
49
51
|
const echartInstance = echartRef.current.getEchartsInstance() as EChartsType;
|
|
50
52
|
|
|
51
|
-
echartInstance.setOption(
|
|
53
|
+
echartInstance.setOption(
|
|
54
|
+
getResponsiveOption({
|
|
55
|
+
isDark, isOrderBook, isDesktop, lang,
|
|
56
|
+
}),
|
|
57
|
+
);
|
|
52
58
|
}
|
|
53
|
-
}, [echartRef, isDesktop, isDark, isOrderBook]);
|
|
59
|
+
}, [echartRef, isDesktop, isDark, isOrderBook, lang]);
|
|
54
60
|
|
|
55
61
|
return (
|
|
56
62
|
<div className="lw-relative lw-w-full">
|
|
@@ -60,11 +66,11 @@ export const Chart = ({ data, isOrderBook }: ChartProps) => {
|
|
|
60
66
|
ref={echartRef}
|
|
61
67
|
theme={isDark ? 'dark_theme' : 'light_theme'}
|
|
62
68
|
style={{
|
|
63
|
-
height: '450px',
|
|
69
|
+
height: isDesktop ? '450px' : '390px',
|
|
64
70
|
width: '100%',
|
|
65
71
|
}}
|
|
66
72
|
option={getOption({
|
|
67
|
-
data, precision
|
|
73
|
+
data, precision, isDark, isOrderBook, isDesktop, lang,
|
|
68
74
|
})}
|
|
69
75
|
/>
|
|
70
76
|
)}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
export const INITIAL_BARS = 80;
|
|
2
2
|
|
|
3
3
|
export const X_LABEL_SIZE = 40;
|
|
4
|
-
export const Y_LABEL_SIZE_MOBILE =
|
|
4
|
+
export const Y_LABEL_SIZE_MOBILE = 50;
|
|
5
5
|
export const Y_LABEL_SIZE_DESKTOP = 120;
|
|
6
6
|
export const CHART_WIDTH = 9999;
|
|
7
|
-
export const
|
|
7
|
+
export const CHART_HEIGHT_DESKTOP = 450;
|
|
8
|
+
export const CHART_HEIGHT_MOBILE = 390;
|
|
9
|
+
export const ZOOM_CONTROL_HEIGHT = 40;
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { TooltipFormatterType } from './types';
|
|
2
2
|
|
|
3
|
-
const tooltipFormatter: TooltipFormatterType = (
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
const
|
|
3
|
+
const tooltipFormatter: TooltipFormatterType = ({
|
|
4
|
+
data, precision, isOrderBook, lang,
|
|
5
|
+
}) => {
|
|
6
|
+
const priceText = `${lang('price')}: ${data[0].toFixed(precision)}`;
|
|
7
|
+
const buyText = data[1] ? `<br />${lang(isOrderBook ? 'buy' : 'long_positions')}: ${data[1]}%` : '';
|
|
8
|
+
const sellText = data[2] ? `<br />${lang(isOrderBook ? 'sell' : 'short_positions')}: ${data[2] * -1}%` : '';
|
|
7
9
|
|
|
8
10
|
return priceText + buyText + sellText;
|
|
9
11
|
};
|