@oanda/labs-crowd-view-widget 1.0.2 → 1.0.4
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 +36 -0
- package/dist/main/CrowdViewWidget/Main.js +5 -1
- package/dist/main/CrowdViewWidget/Main.js.map +1 -1
- package/dist/main/CrowdViewWidget/components/Legend/Legend.js +32 -0
- package/dist/main/CrowdViewWidget/components/Legend/Legend.js.map +1 -0
- package/dist/main/CrowdViewWidget/components/Legend/LegendBar.js +41 -0
- package/dist/main/CrowdViewWidget/components/Legend/LegendBar.js.map +1 -0
- package/dist/main/CrowdViewWidget/components/Legend/index.js +28 -0
- package/dist/main/CrowdViewWidget/components/Legend/index.js.map +1 -0
- package/dist/main/CrowdViewWidget/components/index.js +17 -0
- package/dist/main/CrowdViewWidget/components/index.js.map +1 -0
- package/dist/module/CrowdViewWidget/Main.js +5 -1
- package/dist/module/CrowdViewWidget/Main.js.map +1 -1
- package/dist/module/CrowdViewWidget/components/Legend/Legend.js +24 -0
- package/dist/module/CrowdViewWidget/components/Legend/Legend.js.map +1 -0
- package/dist/module/CrowdViewWidget/components/Legend/LegendBar.js +33 -0
- package/dist/module/CrowdViewWidget/components/Legend/LegendBar.js.map +1 -0
- package/dist/module/CrowdViewWidget/components/Legend/index.js +3 -0
- package/dist/module/CrowdViewWidget/components/Legend/index.js.map +1 -0
- package/dist/module/CrowdViewWidget/components/index.js +2 -0
- package/dist/module/CrowdViewWidget/components/index.js.map +1 -0
- package/dist/types/CrowdViewWidget/components/Legend/Legend.d.ts +7 -0
- package/dist/types/CrowdViewWidget/components/Legend/LegendBar.d.ts +9 -0
- package/dist/types/CrowdViewWidget/components/Legend/index.d.ts +2 -0
- package/dist/types/CrowdViewWidget/components/index.d.ts +1 -0
- package/package.json +3 -3
- package/src/CrowdViewWidget/Main.tsx +6 -0
- package/src/CrowdViewWidget/components/Legend/Legend.tsx +20 -0
- package/src/CrowdViewWidget/components/Legend/LegendBar.tsx +48 -0
- package/src/CrowdViewWidget/components/Legend/index.ts +2 -0
- package/src/CrowdViewWidget/components/index.ts +1 -0
- package/test/components/Legend.test.tsx +26 -0
- package/test/components/LegendBar.test.tsx +34 -0
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,42 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
## 1.0.4 (2025-04-10)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
## 1.0.185 (2025-04-09)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
## 1.0.184 (2025-04-08)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
## 1.0.183 (2025-04-04)
|
|
19
|
+
|
|
20
|
+
**Note:** Version bump only for package @oanda/labs-crowd-view-widget
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
## 1.0.3 (2025-04-09)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
## 1.0.184 (2025-04-08)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
## 1.0.183 (2025-04-04)
|
|
35
|
+
|
|
36
|
+
**Note:** Version bump only for package @oanda/labs-crowd-view-widget
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
|
|
6
42
|
## 1.0.2 (2025-04-08)
|
|
7
43
|
|
|
8
44
|
|
|
@@ -8,6 +8,7 @@ var _labsWidgetCommon = require("@oanda/labs-widget-common");
|
|
|
8
8
|
var _monoI18n = require("@oanda/mono-i18n");
|
|
9
9
|
var _react = _interopRequireWildcard(require("react"));
|
|
10
10
|
var _graphql = require("../gql/types/graphql");
|
|
11
|
+
var _components = require("./components");
|
|
11
12
|
var _config = require("./config");
|
|
12
13
|
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
13
14
|
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
@@ -59,7 +60,10 @@ const Main = _ref => {
|
|
|
59
60
|
selectLabel: lang('granularity'),
|
|
60
61
|
selectedOption: granularity,
|
|
61
62
|
setSelectedOption: val => setGranularity(val)
|
|
62
|
-
}))), _react.default.createElement(_labsWidgetCommon.WidgetError, null)
|
|
63
|
+
}))), _react.default.createElement(_labsWidgetCommon.WidgetError, null), _react.default.createElement(_components.Legend, {
|
|
64
|
+
longValues: [0.15, 0.25, 0.4, 0.55],
|
|
65
|
+
shortValues: [0.15, 0.25, 0.4, 0.55]
|
|
66
|
+
})));
|
|
63
67
|
};
|
|
64
68
|
exports.Main = Main;
|
|
65
69
|
//# sourceMappingURL=Main.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Main.js","names":["_labsWidgetCommon","require","_monoI18n","_react","_interopRequireWildcard","_graphql","_config","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","Main","_ref","division","instrumentSelectConfigWithDivision","Division","Oc","instrumentSelectConfigOC","instrumentSelectConfig","size","useLayoutProvider","isDesktop","Size","DESKTOP","bookType","setBookType","useState","BookType","Order","instrument","setInstrument","granularity","setGranularity","granularitySelectConfig","lang","useLocale","createElement","Fragment","className","Tabs","mobileFullWidth","activeTab","handleClick","currentTarget","value","items","navigationConfig","labelCallback","cn","Select","options","searchPlaceholder","selectLabel","selectedOption","setSelectedOption","val","WidgetError","exports"],"sources":["../../../src/CrowdViewWidget/Main.tsx"],"sourcesContent":["import {\n cn,\n Select,\n Size,\n Tabs,\n useLayoutProvider,\n WidgetError,\n} from '@oanda/labs-widget-common';\nimport { useLocale } from '@oanda/mono-i18n';\nimport React, { useState } from 'react';\n\nimport { BookType, Division } from '../gql/types/graphql';\nimport {\n granularitySelectConfig,\n instrumentSelectConfig,\n instrumentSelectConfigOC,\n navigationConfig,\n} from './config';\nimport type { GranularityId, InstrumentId, MainProps } from './types';\n\nconst Main = ({ division }: MainProps) => {\n const instrumentSelectConfigWithDivision =\n division === Division.Oc\n ? instrumentSelectConfigOC\n : instrumentSelectConfig;\n\n const { size } = useLayoutProvider();\n const isDesktop = size === Size.DESKTOP;\n const [bookType, setBookType] = useState(BookType.Order);\n const [instrument, setInstrument] = useState(\n instrumentSelectConfigWithDivision[0]\n );\n const [granularity, setGranularity] = useState(granularitySelectConfig[0]);\n const { lang } = useLocale();\n\n return (\n <>\n {size && (\n <div\n className=\"lw-text-sm lw-tracking-normal\"\n data-testid=\"crowd-view-widget\"\n >\n <Tabs\n mobileFullWidth\n activeTab={bookType}\n handleClick={(e) => setBookType(e.currentTarget.value as BookType)}\n items={navigationConfig}\n labelCallback={lang}\n />\n <div className=\"lw-mb-6 lw-mt-12 lw-flex\">\n <div\n className={cn('lw-mr-2', {\n 'lw-w-full': !isDesktop,\n 'lw-w-[280px]': isDesktop,\n })}\n >\n <Select\n options={instrumentSelectConfigWithDivision}\n searchPlaceholder={lang('search')}\n selectLabel={lang('instrument')}\n selectedOption={instrument}\n setSelectedOption={(val) =>\n setInstrument(val as { id: InstrumentId; label: string })\n }\n />\n </div>\n <div\n className={cn({\n 'lw-w-full': !isDesktop,\n 'lw-w-[280px]': isDesktop,\n })}\n >\n <Select\n options={granularitySelectConfig}\n searchPlaceholder={lang('search')}\n selectLabel={lang('granularity')}\n selectedOption={granularity}\n setSelectedOption={(val) =>\n setGranularity(val as { id: GranularityId; label: string })\n }\n />\n </div>\n </div>\n <WidgetError />\n </div>\n )}\n </>\n );\n};\n\nexport { Main };\n"],"mappings":";;;;;;AAAA,IAAAA,iBAAA,GAAAC,OAAA;AAQA,IAAAC,SAAA,GAAAD,OAAA;AACA,IAAAE,MAAA,GAAAC,uBAAA,CAAAH,OAAA;AAEA,IAAAI,QAAA,GAAAJ,OAAA;AACA,IAAAK,
|
|
1
|
+
{"version":3,"file":"Main.js","names":["_labsWidgetCommon","require","_monoI18n","_react","_interopRequireWildcard","_graphql","_components","_config","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","Main","_ref","division","instrumentSelectConfigWithDivision","Division","Oc","instrumentSelectConfigOC","instrumentSelectConfig","size","useLayoutProvider","isDesktop","Size","DESKTOP","bookType","setBookType","useState","BookType","Order","instrument","setInstrument","granularity","setGranularity","granularitySelectConfig","lang","useLocale","createElement","Fragment","className","Tabs","mobileFullWidth","activeTab","handleClick","currentTarget","value","items","navigationConfig","labelCallback","cn","Select","options","searchPlaceholder","selectLabel","selectedOption","setSelectedOption","val","WidgetError","Legend","longValues","shortValues","exports"],"sources":["../../../src/CrowdViewWidget/Main.tsx"],"sourcesContent":["import {\n cn,\n Select,\n Size,\n Tabs,\n useLayoutProvider,\n WidgetError,\n} from '@oanda/labs-widget-common';\nimport { useLocale } from '@oanda/mono-i18n';\nimport React, { useState } from 'react';\n\nimport { BookType, Division } from '../gql/types/graphql';\nimport { Legend } from './components';\nimport {\n granularitySelectConfig,\n instrumentSelectConfig,\n instrumentSelectConfigOC,\n navigationConfig,\n} from './config';\nimport type { GranularityId, InstrumentId, MainProps } from './types';\n\nconst Main = ({ division }: MainProps) => {\n const instrumentSelectConfigWithDivision =\n division === Division.Oc\n ? instrumentSelectConfigOC\n : instrumentSelectConfig;\n\n const { size } = useLayoutProvider();\n const isDesktop = size === Size.DESKTOP;\n const [bookType, setBookType] = useState(BookType.Order);\n const [instrument, setInstrument] = useState(\n instrumentSelectConfigWithDivision[0]\n );\n const [granularity, setGranularity] = useState(granularitySelectConfig[0]);\n const { lang } = useLocale();\n\n return (\n <>\n {size && (\n <div\n className=\"lw-text-sm lw-tracking-normal\"\n data-testid=\"crowd-view-widget\"\n >\n <Tabs\n mobileFullWidth\n activeTab={bookType}\n handleClick={(e) => setBookType(e.currentTarget.value as BookType)}\n items={navigationConfig}\n labelCallback={lang}\n />\n <div className=\"lw-mb-6 lw-mt-12 lw-flex\">\n <div\n className={cn('lw-mr-2', {\n 'lw-w-full': !isDesktop,\n 'lw-w-[280px]': isDesktop,\n })}\n >\n <Select\n options={instrumentSelectConfigWithDivision}\n searchPlaceholder={lang('search')}\n selectLabel={lang('instrument')}\n selectedOption={instrument}\n setSelectedOption={(val) =>\n setInstrument(val as { id: InstrumentId; label: string })\n }\n />\n </div>\n <div\n className={cn({\n 'lw-w-full': !isDesktop,\n 'lw-w-[280px]': isDesktop,\n })}\n >\n <Select\n options={granularitySelectConfig}\n searchPlaceholder={lang('search')}\n selectLabel={lang('granularity')}\n selectedOption={granularity}\n setSelectedOption={(val) =>\n setGranularity(val as { id: GranularityId; label: string })\n }\n />\n </div>\n </div>\n <WidgetError />\n\n <Legend\n longValues={[0.15, 0.25, 0.4, 0.55]}\n shortValues={[0.15, 0.25, 0.4, 0.55]}\n />\n </div>\n )}\n </>\n );\n};\n\nexport { Main };\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.Legend = void 0;
|
|
7
|
+
var _monoI18n = require("@oanda/mono-i18n");
|
|
8
|
+
var _react = _interopRequireDefault(require("react"));
|
|
9
|
+
var _LegendBar = require("./LegendBar");
|
|
10
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
11
|
+
const Legend = _ref => {
|
|
12
|
+
let {
|
|
13
|
+
longValues,
|
|
14
|
+
shortValues
|
|
15
|
+
} = _ref;
|
|
16
|
+
const {
|
|
17
|
+
lang
|
|
18
|
+
} = (0, _monoI18n.useLocale)();
|
|
19
|
+
return _react.default.createElement("div", {
|
|
20
|
+
className: "lw-mx-auto lw-flex lw-w-full lw-flex-col lw-items-center lw-space-y-4 lw-py-6 sm:lw-max-w-md lg:lw-max-w-xl"
|
|
21
|
+
}, _react.default.createElement(_LegendBar.LegendBar, {
|
|
22
|
+
label: lang('long'),
|
|
23
|
+
type: "long",
|
|
24
|
+
values: longValues
|
|
25
|
+
}), _react.default.createElement(_LegendBar.LegendBar, {
|
|
26
|
+
label: lang('short'),
|
|
27
|
+
type: "short",
|
|
28
|
+
values: shortValues
|
|
29
|
+
}));
|
|
30
|
+
};
|
|
31
|
+
exports.Legend = Legend;
|
|
32
|
+
//# sourceMappingURL=Legend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Legend.js","names":["_monoI18n","require","_react","_interopRequireDefault","_LegendBar","e","__esModule","default","Legend","_ref","longValues","shortValues","lang","useLocale","createElement","className","LegendBar","label","type","values","exports"],"sources":["../../../../../src/CrowdViewWidget/components/Legend/Legend.tsx"],"sourcesContent":["import { useLocale } from '@oanda/mono-i18n';\nimport React from 'react';\n\nimport { LegendBar } from './LegendBar';\n\ninterface LegendProps {\n longValues: number[];\n shortValues: number[];\n}\n\nexport const Legend = ({ longValues, shortValues }: LegendProps) => {\n const { lang } = useLocale();\n\n return (\n <div className=\"lw-mx-auto lw-flex lw-w-full lw-flex-col lw-items-center lw-space-y-4 lw-py-6 sm:lw-max-w-md lg:lw-max-w-xl\">\n <LegendBar label={lang('long')} type=\"long\" values={longValues} />\n <LegendBar label={lang('short')} type=\"short\" values={shortValues} />\n </div>\n );\n};\n"],"mappings":";;;;;;AAAA,IAAAA,SAAA,GAAAC,OAAA;AACA,IAAAC,MAAA,GAAAC,sBAAA,CAAAF,OAAA;AAEA,IAAAG,UAAA,GAAAH,OAAA;AAAwC,SAAAE,uBAAAE,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAOjC,MAAMG,MAAM,GAAGC,IAAA,IAA8C;EAAA,IAA7C;IAAEC,UAAU;IAAEC;EAAyB,CAAC,GAAAF,IAAA;EAC7D,MAAM;IAAEG;EAAK,CAAC,GAAG,IAAAC,mBAAS,EAAC,CAAC;EAE5B,OACEX,MAAA,CAAAK,OAAA,CAAAO,aAAA;IAAKC,SAAS,EAAC;EAA6G,GAC1Hb,MAAA,CAAAK,OAAA,CAAAO,aAAA,CAACV,UAAA,CAAAY,SAAS;IAACC,KAAK,EAAEL,IAAI,CAAC,MAAM,CAAE;IAACM,IAAI,EAAC,MAAM;IAACC,MAAM,EAAET;EAAW,CAAE,CAAC,EAClER,MAAA,CAAAK,OAAA,CAAAO,aAAA,CAACV,UAAA,CAAAY,SAAS;IAACC,KAAK,EAAEL,IAAI,CAAC,OAAO,CAAE;IAACM,IAAI,EAAC,OAAO;IAACC,MAAM,EAAER;EAAY,CAAE,CACjE,CAAC;AAEV,CAAC;AAACS,OAAA,CAAAZ,MAAA,GAAAA,MAAA","ignoreList":[]}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.LegendBar = void 0;
|
|
7
|
+
var _react = _interopRequireDefault(require("react"));
|
|
8
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
9
|
+
const colorMap = {
|
|
10
|
+
long: ['#00857333', '#00715F99', '#00857399', '#008573CC'],
|
|
11
|
+
short: ['#DA632566', '#DA632599', '#DA6325CC', '#DA6325']
|
|
12
|
+
};
|
|
13
|
+
const LegendBar = _ref => {
|
|
14
|
+
let {
|
|
15
|
+
values,
|
|
16
|
+
type,
|
|
17
|
+
label
|
|
18
|
+
} = _ref;
|
|
19
|
+
const colors = colorMap[type];
|
|
20
|
+
return _react.default.createElement("div", {
|
|
21
|
+
className: "lw-flex lw-w-full lw-flex-col lw-space-y-1 lw-border-border-primary"
|
|
22
|
+
}, _react.default.createElement("div", {
|
|
23
|
+
className: "lw-flex lw-h-2 lw-w-full lw-overflow-hidden lw-border lw-border-border-primary"
|
|
24
|
+
}, values.map((_, index) => _react.default.createElement("div", {
|
|
25
|
+
key: `${label}_${colors[index]}__color`,
|
|
26
|
+
className: "lw-h-full lw-flex-1",
|
|
27
|
+
"data-testid": "legend-bar-segment",
|
|
28
|
+
style: {
|
|
29
|
+
backgroundColor: colors[index]
|
|
30
|
+
}
|
|
31
|
+
}))), _react.default.createElement("div", {
|
|
32
|
+
className: "lw-flex lw-w-full"
|
|
33
|
+
}, values.map(value => _react.default.createElement("div", {
|
|
34
|
+
key: `${value}_${type}`,
|
|
35
|
+
className: "lw-flex lw-w-1/4 lw-justify-center"
|
|
36
|
+
}, _react.default.createElement("span", {
|
|
37
|
+
className: "lw-whitespace-nowrap lw-font-sans lw-text-xs lw-text-text-primary"
|
|
38
|
+
}, value.toFixed(2), "% ", label)))));
|
|
39
|
+
};
|
|
40
|
+
exports.LegendBar = LegendBar;
|
|
41
|
+
//# sourceMappingURL=LegendBar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LegendBar.js","names":["_react","_interopRequireDefault","require","e","__esModule","default","colorMap","long","short","LegendBar","_ref","values","type","label","colors","createElement","className","map","_","index","key","style","backgroundColor","value","toFixed","exports"],"sources":["../../../../../src/CrowdViewWidget/components/Legend/LegendBar.tsx"],"sourcesContent":["import React from 'react';\n\ntype LegendType = 'long' | 'short';\n\ninterface LegendBarProps {\n values: number[];\n type: LegendType;\n label: string;\n}\n\nconst colorMap: Record<LegendType, string[]> = {\n long: ['#00857333', '#00715F99', '#00857399', '#008573CC'],\n short: ['#DA632566', '#DA632599', '#DA6325CC', '#DA6325'],\n};\n\nexport const LegendBar = ({ values, type, label }: LegendBarProps) => {\n const colors = colorMap[type];\n\n return (\n <div className=\"lw-flex lw-w-full lw-flex-col lw-space-y-1 lw-border-border-primary\">\n <div className=\"lw-flex lw-h-2 lw-w-full lw-overflow-hidden lw-border lw-border-border-primary\">\n {values.map((_, index) => (\n <div\n key={`${label}_${colors[index]}__color`}\n className=\"lw-h-full lw-flex-1\"\n data-testid=\"legend-bar-segment\"\n style={{\n backgroundColor: colors[index],\n }}\n />\n ))}\n </div>\n\n <div className=\"lw-flex lw-w-full\">\n {values.map((value) => (\n <div\n key={`${value}_${type}`}\n className=\"lw-flex lw-w-1/4 lw-justify-center\"\n >\n <span className=\"lw-whitespace-nowrap lw-font-sans lw-text-xs lw-text-text-primary\">\n {value.toFixed(2)}% {label}\n </span>\n </div>\n ))}\n </div>\n </div>\n );\n};\n"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AAA0B,SAAAD,uBAAAE,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAU1B,MAAMG,QAAsC,GAAG;EAC7CC,IAAI,EAAE,CAAC,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,CAAC;EAC1DC,KAAK,EAAE,CAAC,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS;AAC1D,CAAC;AAEM,MAAMC,SAAS,GAAGC,IAAA,IAA6C;EAAA,IAA5C;IAAEC,MAAM;IAAEC,IAAI;IAAEC;EAAsB,CAAC,GAAAH,IAAA;EAC/D,MAAMI,MAAM,GAAGR,QAAQ,CAACM,IAAI,CAAC;EAE7B,OACEZ,MAAA,CAAAK,OAAA,CAAAU,aAAA;IAAKC,SAAS,EAAC;EAAqE,GAClFhB,MAAA,CAAAK,OAAA,CAAAU,aAAA;IAAKC,SAAS,EAAC;EAAgF,GAC5FL,MAAM,CAACM,GAAG,CAAC,CAACC,CAAC,EAAEC,KAAK,KACnBnB,MAAA,CAAAK,OAAA,CAAAU,aAAA;IACEK,GAAG,EAAE,GAAGP,KAAK,IAAIC,MAAM,CAACK,KAAK,CAAC,SAAU;IACxCH,SAAS,EAAC,qBAAqB;IAC/B,eAAY,oBAAoB;IAChCK,KAAK,EAAE;MACLC,eAAe,EAAER,MAAM,CAACK,KAAK;IAC/B;EAAE,CACH,CACF,CACE,CAAC,EAENnB,MAAA,CAAAK,OAAA,CAAAU,aAAA;IAAKC,SAAS,EAAC;EAAmB,GAC/BL,MAAM,CAACM,GAAG,CAAEM,KAAK,IAChBvB,MAAA,CAAAK,OAAA,CAAAU,aAAA;IACEK,GAAG,EAAE,GAAGG,KAAK,IAAIX,IAAI,EAAG;IACxBI,SAAS,EAAC;EAAoC,GAE9ChB,MAAA,CAAAK,OAAA,CAAAU,aAAA;IAAMC,SAAS,EAAC;EAAmE,GAChFO,KAAK,CAACC,OAAO,CAAC,CAAC,CAAC,EAAC,IAAE,EAACX,KACjB,CACH,CACN,CACE,CACF,CAAC;AAEV,CAAC;AAACY,OAAA,CAAAhB,SAAA,GAAAA,SAAA","ignoreList":[]}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
var _Legend = require("./Legend");
|
|
7
|
+
Object.keys(_Legend).forEach(function (key) {
|
|
8
|
+
if (key === "default" || key === "__esModule") return;
|
|
9
|
+
if (key in exports && exports[key] === _Legend[key]) return;
|
|
10
|
+
Object.defineProperty(exports, key, {
|
|
11
|
+
enumerable: true,
|
|
12
|
+
get: function () {
|
|
13
|
+
return _Legend[key];
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
});
|
|
17
|
+
var _LegendBar = require("./LegendBar");
|
|
18
|
+
Object.keys(_LegendBar).forEach(function (key) {
|
|
19
|
+
if (key === "default" || key === "__esModule") return;
|
|
20
|
+
if (key in exports && exports[key] === _LegendBar[key]) return;
|
|
21
|
+
Object.defineProperty(exports, key, {
|
|
22
|
+
enumerable: true,
|
|
23
|
+
get: function () {
|
|
24
|
+
return _LegendBar[key];
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["_Legend","require","Object","keys","forEach","key","exports","defineProperty","enumerable","get","_LegendBar"],"sources":["../../../../../src/CrowdViewWidget/components/Legend/index.ts"],"sourcesContent":["export * from './Legend';\nexport * from './LegendBar';\n"],"mappings":";;;;;AAAA,IAAAA,OAAA,GAAAC,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAH,OAAA,EAAAI,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAL,OAAA,CAAAK,GAAA;EAAAH,MAAA,CAAAK,cAAA,CAAAD,OAAA,EAAAD,GAAA;IAAAG,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAT,OAAA,CAAAK,GAAA;IAAA;EAAA;AAAA;AACA,IAAAK,UAAA,GAAAT,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAO,UAAA,EAAAN,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAK,UAAA,CAAAL,GAAA;EAAAH,MAAA,CAAAK,cAAA,CAAAD,OAAA,EAAAD,GAAA;IAAAG,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAC,UAAA,CAAAL,GAAA;IAAA;EAAA;AAAA","ignoreList":[]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
var _Legend = require("./Legend");
|
|
7
|
+
Object.keys(_Legend).forEach(function (key) {
|
|
8
|
+
if (key === "default" || key === "__esModule") return;
|
|
9
|
+
if (key in exports && exports[key] === _Legend[key]) return;
|
|
10
|
+
Object.defineProperty(exports, key, {
|
|
11
|
+
enumerable: true,
|
|
12
|
+
get: function () {
|
|
13
|
+
return _Legend[key];
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
});
|
|
17
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["_Legend","require","Object","keys","forEach","key","exports","defineProperty","enumerable","get"],"sources":["../../../../src/CrowdViewWidget/components/index.ts"],"sourcesContent":["export * from './Legend';\n"],"mappings":";;;;;AAAA,IAAAA,OAAA,GAAAC,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAH,OAAA,EAAAI,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAL,OAAA,CAAAK,GAAA;EAAAH,MAAA,CAAAK,cAAA,CAAAD,OAAA,EAAAD,GAAA;IAAAG,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAT,OAAA,CAAAK,GAAA;IAAA;EAAA;AAAA","ignoreList":[]}
|
|
@@ -2,6 +2,7 @@ import { cn, Select, Size, Tabs, useLayoutProvider, WidgetError } from '@oanda/l
|
|
|
2
2
|
import { useLocale } from '@oanda/mono-i18n';
|
|
3
3
|
import React, { useState } from 'react';
|
|
4
4
|
import { BookType, Division } from '../gql/types/graphql';
|
|
5
|
+
import { Legend } from './components';
|
|
5
6
|
import { granularitySelectConfig, instrumentSelectConfig, instrumentSelectConfigOC, navigationConfig } from './config';
|
|
6
7
|
const Main = _ref => {
|
|
7
8
|
let {
|
|
@@ -51,7 +52,10 @@ const Main = _ref => {
|
|
|
51
52
|
selectLabel: lang('granularity'),
|
|
52
53
|
selectedOption: granularity,
|
|
53
54
|
setSelectedOption: val => setGranularity(val)
|
|
54
|
-
}))), React.createElement(WidgetError, null)
|
|
55
|
+
}))), React.createElement(WidgetError, null), React.createElement(Legend, {
|
|
56
|
+
longValues: [0.15, 0.25, 0.4, 0.55],
|
|
57
|
+
shortValues: [0.15, 0.25, 0.4, 0.55]
|
|
58
|
+
})));
|
|
55
59
|
};
|
|
56
60
|
export { Main };
|
|
57
61
|
//# sourceMappingURL=Main.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Main.js","names":["cn","Select","Size","Tabs","useLayoutProvider","WidgetError","useLocale","React","useState","BookType","Division","granularitySelectConfig","instrumentSelectConfig","instrumentSelectConfigOC","navigationConfig","Main","_ref","division","instrumentSelectConfigWithDivision","Oc","size","isDesktop","DESKTOP","bookType","setBookType","Order","instrument","setInstrument","granularity","setGranularity","lang","createElement","Fragment","className","mobileFullWidth","activeTab","handleClick","e","currentTarget","value","items","labelCallback","options","searchPlaceholder","selectLabel","selectedOption","setSelectedOption","val"],"sources":["../../../src/CrowdViewWidget/Main.tsx"],"sourcesContent":["import {\n cn,\n Select,\n Size,\n Tabs,\n useLayoutProvider,\n WidgetError,\n} from '@oanda/labs-widget-common';\nimport { useLocale } from '@oanda/mono-i18n';\nimport React, { useState } from 'react';\n\nimport { BookType, Division } from '../gql/types/graphql';\nimport {\n granularitySelectConfig,\n instrumentSelectConfig,\n instrumentSelectConfigOC,\n navigationConfig,\n} from './config';\nimport type { GranularityId, InstrumentId, MainProps } from './types';\n\nconst Main = ({ division }: MainProps) => {\n const instrumentSelectConfigWithDivision =\n division === Division.Oc\n ? instrumentSelectConfigOC\n : instrumentSelectConfig;\n\n const { size } = useLayoutProvider();\n const isDesktop = size === Size.DESKTOP;\n const [bookType, setBookType] = useState(BookType.Order);\n const [instrument, setInstrument] = useState(\n instrumentSelectConfigWithDivision[0]\n );\n const [granularity, setGranularity] = useState(granularitySelectConfig[0]);\n const { lang } = useLocale();\n\n return (\n <>\n {size && (\n <div\n className=\"lw-text-sm lw-tracking-normal\"\n data-testid=\"crowd-view-widget\"\n >\n <Tabs\n mobileFullWidth\n activeTab={bookType}\n handleClick={(e) => setBookType(e.currentTarget.value as BookType)}\n items={navigationConfig}\n labelCallback={lang}\n />\n <div className=\"lw-mb-6 lw-mt-12 lw-flex\">\n <div\n className={cn('lw-mr-2', {\n 'lw-w-full': !isDesktop,\n 'lw-w-[280px]': isDesktop,\n })}\n >\n <Select\n options={instrumentSelectConfigWithDivision}\n searchPlaceholder={lang('search')}\n selectLabel={lang('instrument')}\n selectedOption={instrument}\n setSelectedOption={(val) =>\n setInstrument(val as { id: InstrumentId; label: string })\n }\n />\n </div>\n <div\n className={cn({\n 'lw-w-full': !isDesktop,\n 'lw-w-[280px]': isDesktop,\n })}\n >\n <Select\n options={granularitySelectConfig}\n searchPlaceholder={lang('search')}\n selectLabel={lang('granularity')}\n selectedOption={granularity}\n setSelectedOption={(val) =>\n setGranularity(val as { id: GranularityId; label: string })\n }\n />\n </div>\n </div>\n <WidgetError />\n </div>\n )}\n </>\n );\n};\n\nexport { Main };\n"],"mappings":"AAAA,SACEA,EAAE,EACFC,MAAM,EACNC,IAAI,EACJC,IAAI,EACJC,iBAAiB,EACjBC,WAAW,QACN,2BAA2B;AAClC,SAASC,SAAS,QAAQ,kBAAkB;AAC5C,OAAOC,KAAK,IAAIC,QAAQ,QAAQ,OAAO;AAEvC,SAASC,QAAQ,EAAEC,QAAQ,QAAQ,sBAAsB;AACzD,SACEC,uBAAuB,EACvBC,sBAAsB,EACtBC,wBAAwB,EACxBC,gBAAgB,QACX,UAAU;AAGjB,MAAMC,IAAI,GAAGC,IAAA,IAA6B;EAAA,IAA5B;IAAEC;EAAoB,CAAC,GAAAD,IAAA;EACnC,MAAME,kCAAkC,GACtCD,QAAQ,
|
|
1
|
+
{"version":3,"file":"Main.js","names":["cn","Select","Size","Tabs","useLayoutProvider","WidgetError","useLocale","React","useState","BookType","Division","Legend","granularitySelectConfig","instrumentSelectConfig","instrumentSelectConfigOC","navigationConfig","Main","_ref","division","instrumentSelectConfigWithDivision","Oc","size","isDesktop","DESKTOP","bookType","setBookType","Order","instrument","setInstrument","granularity","setGranularity","lang","createElement","Fragment","className","mobileFullWidth","activeTab","handleClick","e","currentTarget","value","items","labelCallback","options","searchPlaceholder","selectLabel","selectedOption","setSelectedOption","val","longValues","shortValues"],"sources":["../../../src/CrowdViewWidget/Main.tsx"],"sourcesContent":["import {\n cn,\n Select,\n Size,\n Tabs,\n useLayoutProvider,\n WidgetError,\n} from '@oanda/labs-widget-common';\nimport { useLocale } from '@oanda/mono-i18n';\nimport React, { useState } from 'react';\n\nimport { BookType, Division } from '../gql/types/graphql';\nimport { Legend } from './components';\nimport {\n granularitySelectConfig,\n instrumentSelectConfig,\n instrumentSelectConfigOC,\n navigationConfig,\n} from './config';\nimport type { GranularityId, InstrumentId, MainProps } from './types';\n\nconst Main = ({ division }: MainProps) => {\n const instrumentSelectConfigWithDivision =\n division === Division.Oc\n ? instrumentSelectConfigOC\n : instrumentSelectConfig;\n\n const { size } = useLayoutProvider();\n const isDesktop = size === Size.DESKTOP;\n const [bookType, setBookType] = useState(BookType.Order);\n const [instrument, setInstrument] = useState(\n instrumentSelectConfigWithDivision[0]\n );\n const [granularity, setGranularity] = useState(granularitySelectConfig[0]);\n const { lang } = useLocale();\n\n return (\n <>\n {size && (\n <div\n className=\"lw-text-sm lw-tracking-normal\"\n data-testid=\"crowd-view-widget\"\n >\n <Tabs\n mobileFullWidth\n activeTab={bookType}\n handleClick={(e) => setBookType(e.currentTarget.value as BookType)}\n items={navigationConfig}\n labelCallback={lang}\n />\n <div className=\"lw-mb-6 lw-mt-12 lw-flex\">\n <div\n className={cn('lw-mr-2', {\n 'lw-w-full': !isDesktop,\n 'lw-w-[280px]': isDesktop,\n })}\n >\n <Select\n options={instrumentSelectConfigWithDivision}\n searchPlaceholder={lang('search')}\n selectLabel={lang('instrument')}\n selectedOption={instrument}\n setSelectedOption={(val) =>\n setInstrument(val as { id: InstrumentId; label: string })\n }\n />\n </div>\n <div\n className={cn({\n 'lw-w-full': !isDesktop,\n 'lw-w-[280px]': isDesktop,\n })}\n >\n <Select\n options={granularitySelectConfig}\n searchPlaceholder={lang('search')}\n selectLabel={lang('granularity')}\n selectedOption={granularity}\n setSelectedOption={(val) =>\n setGranularity(val as { id: GranularityId; label: string })\n }\n />\n </div>\n </div>\n <WidgetError />\n\n <Legend\n longValues={[0.15, 0.25, 0.4, 0.55]}\n shortValues={[0.15, 0.25, 0.4, 0.55]}\n />\n </div>\n )}\n </>\n );\n};\n\nexport { Main };\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { useLocale } from '@oanda/mono-i18n';
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { LegendBar } from './LegendBar';
|
|
4
|
+
export const Legend = _ref => {
|
|
5
|
+
let {
|
|
6
|
+
longValues,
|
|
7
|
+
shortValues
|
|
8
|
+
} = _ref;
|
|
9
|
+
const {
|
|
10
|
+
lang
|
|
11
|
+
} = useLocale();
|
|
12
|
+
return React.createElement("div", {
|
|
13
|
+
className: "lw-mx-auto lw-flex lw-w-full lw-flex-col lw-items-center lw-space-y-4 lw-py-6 sm:lw-max-w-md lg:lw-max-w-xl"
|
|
14
|
+
}, React.createElement(LegendBar, {
|
|
15
|
+
label: lang('long'),
|
|
16
|
+
type: "long",
|
|
17
|
+
values: longValues
|
|
18
|
+
}), React.createElement(LegendBar, {
|
|
19
|
+
label: lang('short'),
|
|
20
|
+
type: "short",
|
|
21
|
+
values: shortValues
|
|
22
|
+
}));
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=Legend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Legend.js","names":["useLocale","React","LegendBar","Legend","_ref","longValues","shortValues","lang","createElement","className","label","type","values"],"sources":["../../../../../src/CrowdViewWidget/components/Legend/Legend.tsx"],"sourcesContent":["import { useLocale } from '@oanda/mono-i18n';\nimport React from 'react';\n\nimport { LegendBar } from './LegendBar';\n\ninterface LegendProps {\n longValues: number[];\n shortValues: number[];\n}\n\nexport const Legend = ({ longValues, shortValues }: LegendProps) => {\n const { lang } = useLocale();\n\n return (\n <div className=\"lw-mx-auto lw-flex lw-w-full lw-flex-col lw-items-center lw-space-y-4 lw-py-6 sm:lw-max-w-md lg:lw-max-w-xl\">\n <LegendBar label={lang('long')} type=\"long\" values={longValues} />\n <LegendBar label={lang('short')} type=\"short\" values={shortValues} />\n </div>\n );\n};\n"],"mappings":"AAAA,SAASA,SAAS,QAAQ,kBAAkB;AAC5C,OAAOC,KAAK,MAAM,OAAO;AAEzB,SAASC,SAAS,QAAQ,aAAa;AAOvC,OAAO,MAAMC,MAAM,GAAGC,IAAA,IAA8C;EAAA,IAA7C;IAAEC,UAAU;IAAEC;EAAyB,CAAC,GAAAF,IAAA;EAC7D,MAAM;IAAEG;EAAK,CAAC,GAAGP,SAAS,CAAC,CAAC;EAE5B,OACEC,KAAA,CAAAO,aAAA;IAAKC,SAAS,EAAC;EAA6G,GAC1HR,KAAA,CAAAO,aAAA,CAACN,SAAS;IAACQ,KAAK,EAAEH,IAAI,CAAC,MAAM,CAAE;IAACI,IAAI,EAAC,MAAM;IAACC,MAAM,EAAEP;EAAW,CAAE,CAAC,EAClEJ,KAAA,CAAAO,aAAA,CAACN,SAAS;IAACQ,KAAK,EAAEH,IAAI,CAAC,OAAO,CAAE;IAACI,IAAI,EAAC,OAAO;IAACC,MAAM,EAAEN;EAAY,CAAE,CACjE,CAAC;AAEV,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
const colorMap = {
|
|
3
|
+
long: ['#00857333', '#00715F99', '#00857399', '#008573CC'],
|
|
4
|
+
short: ['#DA632566', '#DA632599', '#DA6325CC', '#DA6325']
|
|
5
|
+
};
|
|
6
|
+
export const LegendBar = _ref => {
|
|
7
|
+
let {
|
|
8
|
+
values,
|
|
9
|
+
type,
|
|
10
|
+
label
|
|
11
|
+
} = _ref;
|
|
12
|
+
const colors = colorMap[type];
|
|
13
|
+
return React.createElement("div", {
|
|
14
|
+
className: "lw-flex lw-w-full lw-flex-col lw-space-y-1 lw-border-border-primary"
|
|
15
|
+
}, React.createElement("div", {
|
|
16
|
+
className: "lw-flex lw-h-2 lw-w-full lw-overflow-hidden lw-border lw-border-border-primary"
|
|
17
|
+
}, values.map((_, index) => React.createElement("div", {
|
|
18
|
+
key: `${label}_${colors[index]}__color`,
|
|
19
|
+
className: "lw-h-full lw-flex-1",
|
|
20
|
+
"data-testid": "legend-bar-segment",
|
|
21
|
+
style: {
|
|
22
|
+
backgroundColor: colors[index]
|
|
23
|
+
}
|
|
24
|
+
}))), React.createElement("div", {
|
|
25
|
+
className: "lw-flex lw-w-full"
|
|
26
|
+
}, values.map(value => React.createElement("div", {
|
|
27
|
+
key: `${value}_${type}`,
|
|
28
|
+
className: "lw-flex lw-w-1/4 lw-justify-center"
|
|
29
|
+
}, React.createElement("span", {
|
|
30
|
+
className: "lw-whitespace-nowrap lw-font-sans lw-text-xs lw-text-text-primary"
|
|
31
|
+
}, value.toFixed(2), "% ", label)))));
|
|
32
|
+
};
|
|
33
|
+
//# sourceMappingURL=LegendBar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LegendBar.js","names":["React","colorMap","long","short","LegendBar","_ref","values","type","label","colors","createElement","className","map","_","index","key","style","backgroundColor","value","toFixed"],"sources":["../../../../../src/CrowdViewWidget/components/Legend/LegendBar.tsx"],"sourcesContent":["import React from 'react';\n\ntype LegendType = 'long' | 'short';\n\ninterface LegendBarProps {\n values: number[];\n type: LegendType;\n label: string;\n}\n\nconst colorMap: Record<LegendType, string[]> = {\n long: ['#00857333', '#00715F99', '#00857399', '#008573CC'],\n short: ['#DA632566', '#DA632599', '#DA6325CC', '#DA6325'],\n};\n\nexport const LegendBar = ({ values, type, label }: LegendBarProps) => {\n const colors = colorMap[type];\n\n return (\n <div className=\"lw-flex lw-w-full lw-flex-col lw-space-y-1 lw-border-border-primary\">\n <div className=\"lw-flex lw-h-2 lw-w-full lw-overflow-hidden lw-border lw-border-border-primary\">\n {values.map((_, index) => (\n <div\n key={`${label}_${colors[index]}__color`}\n className=\"lw-h-full lw-flex-1\"\n data-testid=\"legend-bar-segment\"\n style={{\n backgroundColor: colors[index],\n }}\n />\n ))}\n </div>\n\n <div className=\"lw-flex lw-w-full\">\n {values.map((value) => (\n <div\n key={`${value}_${type}`}\n className=\"lw-flex lw-w-1/4 lw-justify-center\"\n >\n <span className=\"lw-whitespace-nowrap lw-font-sans lw-text-xs lw-text-text-primary\">\n {value.toFixed(2)}% {label}\n </span>\n </div>\n ))}\n </div>\n </div>\n );\n};\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AAUzB,MAAMC,QAAsC,GAAG;EAC7CC,IAAI,EAAE,CAAC,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,CAAC;EAC1DC,KAAK,EAAE,CAAC,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS;AAC1D,CAAC;AAED,OAAO,MAAMC,SAAS,GAAGC,IAAA,IAA6C;EAAA,IAA5C;IAAEC,MAAM;IAAEC,IAAI;IAAEC;EAAsB,CAAC,GAAAH,IAAA;EAC/D,MAAMI,MAAM,GAAGR,QAAQ,CAACM,IAAI,CAAC;EAE7B,OACEP,KAAA,CAAAU,aAAA;IAAKC,SAAS,EAAC;EAAqE,GAClFX,KAAA,CAAAU,aAAA;IAAKC,SAAS,EAAC;EAAgF,GAC5FL,MAAM,CAACM,GAAG,CAAC,CAACC,CAAC,EAAEC,KAAK,KACnBd,KAAA,CAAAU,aAAA;IACEK,GAAG,EAAE,GAAGP,KAAK,IAAIC,MAAM,CAACK,KAAK,CAAC,SAAU;IACxCH,SAAS,EAAC,qBAAqB;IAC/B,eAAY,oBAAoB;IAChCK,KAAK,EAAE;MACLC,eAAe,EAAER,MAAM,CAACK,KAAK;IAC/B;EAAE,CACH,CACF,CACE,CAAC,EAENd,KAAA,CAAAU,aAAA;IAAKC,SAAS,EAAC;EAAmB,GAC/BL,MAAM,CAACM,GAAG,CAAEM,KAAK,IAChBlB,KAAA,CAAAU,aAAA;IACEK,GAAG,EAAE,GAAGG,KAAK,IAAIX,IAAI,EAAG;IACxBI,SAAS,EAAC;EAAoC,GAE9CX,KAAA,CAAAU,aAAA;IAAMC,SAAS,EAAC;EAAmE,GAChFO,KAAK,CAACC,OAAO,CAAC,CAAC,CAAC,EAAC,IAAE,EAACX,KACjB,CACH,CACN,CACE,CACF,CAAC;AAEV,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../../../src/CrowdViewWidget/components/Legend/index.ts"],"sourcesContent":["export * from './Legend';\nexport * from './LegendBar';\n"],"mappings":"AAAA,cAAc,UAAU;AACxB,cAAc,aAAa","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../../src/CrowdViewWidget/components/index.ts"],"sourcesContent":["export * from './Legend';\n"],"mappings":"AAAA,cAAc,UAAU","ignoreList":[]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
type LegendType = 'long' | 'short';
|
|
3
|
+
interface LegendBarProps {
|
|
4
|
+
values: number[];
|
|
5
|
+
type: LegendType;
|
|
6
|
+
label: string;
|
|
7
|
+
}
|
|
8
|
+
export declare const LegendBar: ({ values, type, label }: LegendBarProps) => React.JSX.Element;
|
|
9
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './Legend';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@oanda/labs-crowd-view-widget",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.4",
|
|
4
4
|
"description": "Labs Crowd View Widget",
|
|
5
5
|
"main": "dist/main/index.js",
|
|
6
6
|
"module": "dist/module/index.js",
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
"author": "OANDA",
|
|
13
13
|
"license": "UNLICENSED",
|
|
14
14
|
"dependencies": {
|
|
15
|
-
"@oanda/labs-widget-common": "^1.0.
|
|
15
|
+
"@oanda/labs-widget-common": "^1.0.186",
|
|
16
16
|
"@oanda/mono-i18n": "10.0.1",
|
|
17
17
|
"graphql": "16.8.1"
|
|
18
18
|
},
|
|
@@ -20,5 +20,5 @@
|
|
|
20
20
|
"@graphql-codegen/cli": "5.0.0",
|
|
21
21
|
"@graphql-codegen/client-preset": "4.1.0"
|
|
22
22
|
},
|
|
23
|
-
"gitHead": "
|
|
23
|
+
"gitHead": "62a1f7b8fc3926956c1cad4d38b365ad4a42c40a"
|
|
24
24
|
}
|
|
@@ -10,6 +10,7 @@ import { useLocale } from '@oanda/mono-i18n';
|
|
|
10
10
|
import React, { useState } from 'react';
|
|
11
11
|
|
|
12
12
|
import { BookType, Division } from '../gql/types/graphql';
|
|
13
|
+
import { Legend } from './components';
|
|
13
14
|
import {
|
|
14
15
|
granularitySelectConfig,
|
|
15
16
|
instrumentSelectConfig,
|
|
@@ -82,6 +83,11 @@ const Main = ({ division }: MainProps) => {
|
|
|
82
83
|
</div>
|
|
83
84
|
</div>
|
|
84
85
|
<WidgetError />
|
|
86
|
+
|
|
87
|
+
<Legend
|
|
88
|
+
longValues={[0.15, 0.25, 0.4, 0.55]}
|
|
89
|
+
shortValues={[0.15, 0.25, 0.4, 0.55]}
|
|
90
|
+
/>
|
|
85
91
|
</div>
|
|
86
92
|
)}
|
|
87
93
|
</>
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { useLocale } from '@oanda/mono-i18n';
|
|
2
|
+
import React from 'react';
|
|
3
|
+
|
|
4
|
+
import { LegendBar } from './LegendBar';
|
|
5
|
+
|
|
6
|
+
interface LegendProps {
|
|
7
|
+
longValues: number[];
|
|
8
|
+
shortValues: number[];
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export const Legend = ({ longValues, shortValues }: LegendProps) => {
|
|
12
|
+
const { lang } = useLocale();
|
|
13
|
+
|
|
14
|
+
return (
|
|
15
|
+
<div className="lw-mx-auto lw-flex lw-w-full lw-flex-col lw-items-center lw-space-y-4 lw-py-6 sm:lw-max-w-md lg:lw-max-w-xl">
|
|
16
|
+
<LegendBar label={lang('long')} type="long" values={longValues} />
|
|
17
|
+
<LegendBar label={lang('short')} type="short" values={shortValues} />
|
|
18
|
+
</div>
|
|
19
|
+
);
|
|
20
|
+
};
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
|
|
3
|
+
type LegendType = 'long' | 'short';
|
|
4
|
+
|
|
5
|
+
interface LegendBarProps {
|
|
6
|
+
values: number[];
|
|
7
|
+
type: LegendType;
|
|
8
|
+
label: string;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
const colorMap: Record<LegendType, string[]> = {
|
|
12
|
+
long: ['#00857333', '#00715F99', '#00857399', '#008573CC'],
|
|
13
|
+
short: ['#DA632566', '#DA632599', '#DA6325CC', '#DA6325'],
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export const LegendBar = ({ values, type, label }: LegendBarProps) => {
|
|
17
|
+
const colors = colorMap[type];
|
|
18
|
+
|
|
19
|
+
return (
|
|
20
|
+
<div className="lw-flex lw-w-full lw-flex-col lw-space-y-1 lw-border-border-primary">
|
|
21
|
+
<div className="lw-flex lw-h-2 lw-w-full lw-overflow-hidden lw-border lw-border-border-primary">
|
|
22
|
+
{values.map((_, index) => (
|
|
23
|
+
<div
|
|
24
|
+
key={`${label}_${colors[index]}__color`}
|
|
25
|
+
className="lw-h-full lw-flex-1"
|
|
26
|
+
data-testid="legend-bar-segment"
|
|
27
|
+
style={{
|
|
28
|
+
backgroundColor: colors[index],
|
|
29
|
+
}}
|
|
30
|
+
/>
|
|
31
|
+
))}
|
|
32
|
+
</div>
|
|
33
|
+
|
|
34
|
+
<div className="lw-flex lw-w-full">
|
|
35
|
+
{values.map((value) => (
|
|
36
|
+
<div
|
|
37
|
+
key={`${value}_${type}`}
|
|
38
|
+
className="lw-flex lw-w-1/4 lw-justify-center"
|
|
39
|
+
>
|
|
40
|
+
<span className="lw-whitespace-nowrap lw-font-sans lw-text-xs lw-text-text-primary">
|
|
41
|
+
{value.toFixed(2)}% {label}
|
|
42
|
+
</span>
|
|
43
|
+
</div>
|
|
44
|
+
))}
|
|
45
|
+
</div>
|
|
46
|
+
</div>
|
|
47
|
+
);
|
|
48
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './Legend';
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @jest-environment jsdom
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { render } from '@testing-library/react';
|
|
6
|
+
import React from 'react';
|
|
7
|
+
|
|
8
|
+
import { Legend } from '../../src/CrowdViewWidget/components';
|
|
9
|
+
|
|
10
|
+
describe('Crowd View Widget', () => {
|
|
11
|
+
describe('components', () => {
|
|
12
|
+
describe('<Legend />', () => {
|
|
13
|
+
it('renders two LegendBar components', () => {
|
|
14
|
+
const { getAllByText } = render(
|
|
15
|
+
<Legend
|
|
16
|
+
longValues={[0.15, 0.25, 0.4, 0.55]}
|
|
17
|
+
shortValues={[0.15, 0.25, 0.4, 0.55]}
|
|
18
|
+
/>
|
|
19
|
+
);
|
|
20
|
+
|
|
21
|
+
expect(getAllByText(/long/)).toHaveLength(4);
|
|
22
|
+
expect(getAllByText(/short/)).toHaveLength(4);
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
});
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @jest-environment jsdom
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { render } from '@testing-library/react';
|
|
6
|
+
import React from 'react';
|
|
7
|
+
|
|
8
|
+
import { LegendBar } from '../../src/CrowdViewWidget/components';
|
|
9
|
+
|
|
10
|
+
describe('Crowd View Widget', () => {
|
|
11
|
+
describe('components', () => {
|
|
12
|
+
describe('<LegendBar />', () => {
|
|
13
|
+
const mockValues = [0.15, 0.25, 0.4, 0.55];
|
|
14
|
+
|
|
15
|
+
it('renders two LegendBar components', () => {
|
|
16
|
+
const { getByText } = render(
|
|
17
|
+
<LegendBar label="long" type="long" values={mockValues} />
|
|
18
|
+
);
|
|
19
|
+
mockValues.forEach((value) => {
|
|
20
|
+
const label = `${value.toFixed(2)}% long`;
|
|
21
|
+
expect(getByText(label)).toBeInTheDocument();
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
it('renders exactly 4 segments', () => {
|
|
26
|
+
const { getAllByTestId } = render(
|
|
27
|
+
<LegendBar label="short" type="short" values={mockValues} />
|
|
28
|
+
);
|
|
29
|
+
const segments = getAllByTestId('legend-bar-segment');
|
|
30
|
+
expect(segments.length).toBe(4);
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
});
|