@oanda/labs-instruments-table-widget 1.0.23 → 1.0.24
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 +100 -0
- package/dist/main/InstrumentsTableWidget/Main.js +3 -4
- package/dist/main/InstrumentsTableWidget/Main.js.map +1 -1
- package/dist/main/InstrumentsTableWidget/components/Filters/Filters.js.map +1 -1
- package/dist/main/InstrumentsTableWidget/components/Filters/types.js.map +1 -1
- package/dist/main/InstrumentsTableWidget/config.js +9 -6
- package/dist/main/InstrumentsTableWidget/config.js.map +1 -1
- package/dist/main/InstrumentsTableWidget/types.js.map +1 -1
- package/dist/main/gql/resolveInstrumentsWithFilters.js +1 -1
- package/dist/main/gql/resolveInstrumentsWithFilters.js.map +1 -1
- package/dist/main/gql/types/gql.js +1 -1
- package/dist/main/gql/types/gql.js.map +1 -1
- package/dist/main/gql/types/graphql.js +2 -1
- package/dist/main/gql/types/graphql.js.map +1 -1
- package/dist/main/translations/sources/en.json +2 -1
- package/dist/module/InstrumentsTableWidget/Main.js +3 -4
- package/dist/module/InstrumentsTableWidget/Main.js.map +1 -1
- package/dist/module/InstrumentsTableWidget/components/Filters/Filters.js.map +1 -1
- package/dist/module/InstrumentsTableWidget/components/Filters/types.js.map +1 -1
- package/dist/module/InstrumentsTableWidget/config.js +9 -6
- package/dist/module/InstrumentsTableWidget/config.js.map +1 -1
- package/dist/module/InstrumentsTableWidget/types.js.map +1 -1
- package/dist/module/gql/resolveInstrumentsWithFilters.js +1 -1
- package/dist/module/gql/resolveInstrumentsWithFilters.js.map +1 -1
- package/dist/module/gql/types/gql.js +1 -1
- package/dist/module/gql/types/gql.js.map +1 -1
- package/dist/module/gql/types/graphql.js +2 -1
- package/dist/module/gql/types/graphql.js.map +1 -1
- package/dist/module/translations/sources/en.json +2 -1
- package/dist/types/InstrumentsTableWidget/Main.d.ts +1 -1
- package/dist/types/InstrumentsTableWidget/components/Filters/types.d.ts +3 -1
- package/dist/types/InstrumentsTableWidget/config.d.ts +2 -1
- package/dist/types/InstrumentsTableWidget/types.d.ts +3 -3
- package/dist/types/gql/types/gql.d.ts +3 -3
- package/dist/types/gql/types/graphql.d.ts +3 -2
- package/package.json +3 -3
- package/src/InstrumentsTableWidget/Main.tsx +19 -26
- package/src/InstrumentsTableWidget/components/Filters/Filters.tsx +2 -2
- package/src/InstrumentsTableWidget/components/Filters/types.ts +5 -1
- package/src/InstrumentsTableWidget/config.ts +12 -7
- package/src/InstrumentsTableWidget/types.ts +7 -3
- package/src/gql/resolveInstrumentsWithFilters.ts +1 -1
- package/src/gql/types/gql.ts +3 -3
- package/src/gql/types/graphql.ts +4 -4
- package/src/translations/sources/en.json +2 -1
- package/test/Main.test.tsx +7 -3
|
@@ -9,7 +9,7 @@ import { useLocale } from '@oanda/mono-i18n';
|
|
|
9
9
|
import React, { useState } from 'react';
|
|
10
10
|
import { useDebounceCallback } from 'usehooks-ts';
|
|
11
11
|
|
|
12
|
-
import type { FiltersProps } from './types';
|
|
12
|
+
import type { AssetClassLabels, FiltersProps } from './types';
|
|
13
13
|
|
|
14
14
|
export const Filters = ({
|
|
15
15
|
assetClassOptions,
|
|
@@ -62,7 +62,7 @@ export const Filters = ({
|
|
|
62
62
|
}
|
|
63
63
|
setSelectedOption={(option) => {
|
|
64
64
|
setAssetClass([option.id]);
|
|
65
|
-
onAssetClassChange([option.id]);
|
|
65
|
+
onAssetClassChange([option.id as AssetClassLabels]);
|
|
66
66
|
setSearchInputValue('');
|
|
67
67
|
onSearchChange('');
|
|
68
68
|
}}
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
import type { SelectOption } from '@oanda/labs-widget-common';
|
|
2
2
|
|
|
3
|
+
import type { AssetClassName } from '../../../gql/types/graphql';
|
|
4
|
+
|
|
5
|
+
export type AssetClassLabels = AssetClassName | 'ALL';
|
|
6
|
+
|
|
3
7
|
export interface FiltersProps {
|
|
4
|
-
onAssetClassChange: (assetClass:
|
|
8
|
+
onAssetClassChange: (assetClass: AssetClassLabels[]) => void;
|
|
5
9
|
onSearchChange: (searchPattern: string) => void;
|
|
6
10
|
isAssetClassFilterEnabled?: boolean;
|
|
7
11
|
isInstrumentSearchEnabled?: boolean;
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import type { HeaderColumns } from '@oanda/labs-widget-common';
|
|
2
2
|
import { DataRecordType } from '@oanda/labs-widget-common';
|
|
3
3
|
|
|
4
|
+
import { AssetClassName } from '../gql/types/graphql';
|
|
5
|
+
import type { AssetClassLabels } from './components/Filters/types';
|
|
6
|
+
|
|
4
7
|
type HeaderRecordType =
|
|
5
8
|
| DataRecordType.INSTRUMENT
|
|
6
9
|
| DataRecordType.SELL
|
|
@@ -44,13 +47,15 @@ const headerConfig: Record<
|
|
|
44
47
|
},
|
|
45
48
|
};
|
|
46
49
|
|
|
47
|
-
const assetClassLabels: Record<
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
50
|
+
const assetClassLabels: Record<AssetClassLabels, string> = {
|
|
51
|
+
ALL: 'all',
|
|
52
|
+
[AssetClassName.Currency]: 'currency',
|
|
53
|
+
[AssetClassName.Commodities]: 'commodity',
|
|
54
|
+
[AssetClassName.Rates]: 'bond',
|
|
55
|
+
[AssetClassName.Cryptocurrency]: 'crypto',
|
|
56
|
+
[AssetClassName.EquityShares]: 'share_cfds',
|
|
57
|
+
[AssetClassName.Etfs]: 'etf_cfds',
|
|
58
|
+
[AssetClassName.Indices]: 'index',
|
|
54
59
|
};
|
|
55
60
|
|
|
56
61
|
const getHeaderConfig = (activeColumns: DataRecordType[]): HeaderColumns[] => {
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
import type { DataRecordType, WidgetConfig } from '@oanda/labs-widget-common';
|
|
2
2
|
|
|
3
|
-
import type {
|
|
3
|
+
import type {
|
|
4
|
+
AssetClassName,
|
|
5
|
+
Division,
|
|
6
|
+
InstrumentDataSource,
|
|
7
|
+
} from '../gql/types/graphql';
|
|
4
8
|
|
|
5
9
|
export enum PriceType {
|
|
6
10
|
Raw = 'raw',
|
|
@@ -12,7 +16,7 @@ export interface InstrumentsTableConfig extends WidgetConfig {
|
|
|
12
16
|
instruments?: string[];
|
|
13
17
|
division: Division;
|
|
14
18
|
columns?: DataRecordType[];
|
|
15
|
-
assetClasses?:
|
|
19
|
+
assetClasses?: AssetClassName[];
|
|
16
20
|
isAssetClassFilterEnabled?: boolean;
|
|
17
21
|
isInstrumentSearchEnabled?: boolean;
|
|
18
22
|
recordsPerPage?: number;
|
|
@@ -24,7 +28,7 @@ export interface MainProps {
|
|
|
24
28
|
instruments?: string[];
|
|
25
29
|
division: Division;
|
|
26
30
|
columns?: DataRecordType[];
|
|
27
|
-
assetClasses?:
|
|
31
|
+
assetClasses?: AssetClassName[];
|
|
28
32
|
isAssetClassFilterEnabled?: boolean;
|
|
29
33
|
isInstrumentSearchEnabled?: boolean;
|
|
30
34
|
recordsPerPage?: number;
|
|
@@ -3,7 +3,7 @@ import { gql } from '@apollo/client';
|
|
|
3
3
|
export const resolveInstrumentsWithFilters = gql`
|
|
4
4
|
query resolveInstrumentsWithFilters(
|
|
5
5
|
$division: Division!
|
|
6
|
-
$assetClass: [
|
|
6
|
+
$assetClass: [AssetClassName]
|
|
7
7
|
$dataSource: InstrumentDataSource
|
|
8
8
|
$instruments: [String]
|
|
9
9
|
$searchPattern: String
|
package/src/gql/types/gql.ts
CHANGED
|
@@ -13,7 +13,7 @@ import { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/
|
|
|
13
13
|
* Therefore it is highly recommended to use the babel or swc plugin for production.
|
|
14
14
|
*/
|
|
15
15
|
const documents = {
|
|
16
|
-
'\n query resolveInstrumentsWithFilters(\n $division: Division!\n $assetClass: [
|
|
16
|
+
'\n query resolveInstrumentsWithFilters(\n $division: Division!\n $assetClass: [AssetClassName]\n $dataSource: InstrumentDataSource\n $instruments: [String]\n $searchPattern: String\n $count: Int\n $offset: Int\n ) {\n resolveInstrumentsWithFilters(\n division: $division\n assetClass: $assetClass\n dataSource: $dataSource\n instruments: $instruments\n searchPattern: $searchPattern\n count: $count\n offset: $offset\n ) {\n instruments {\n name\n displayName\n }\n totalCount\n }\n }\n':
|
|
17
17
|
types.ResolveInstrumentsWithFiltersDocument,
|
|
18
18
|
};
|
|
19
19
|
|
|
@@ -35,8 +35,8 @@ export function graphql(source: string): unknown;
|
|
|
35
35
|
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
|
|
36
36
|
*/
|
|
37
37
|
export function graphql(
|
|
38
|
-
source: '\n query resolveInstrumentsWithFilters(\n $division: Division!\n $assetClass: [
|
|
39
|
-
): (typeof documents)['\n query resolveInstrumentsWithFilters(\n $division: Division!\n $assetClass: [
|
|
38
|
+
source: '\n query resolveInstrumentsWithFilters(\n $division: Division!\n $assetClass: [AssetClassName]\n $dataSource: InstrumentDataSource\n $instruments: [String]\n $searchPattern: String\n $count: Int\n $offset: Int\n ) {\n resolveInstrumentsWithFilters(\n division: $division\n assetClass: $assetClass\n dataSource: $dataSource\n instruments: $instruments\n searchPattern: $searchPattern\n count: $count\n offset: $offset\n ) {\n instruments {\n name\n displayName\n }\n totalCount\n }\n }\n'
|
|
39
|
+
): (typeof documents)['\n query resolveInstrumentsWithFilters(\n $division: Division!\n $assetClass: [AssetClassName]\n $dataSource: InstrumentDataSource\n $instruments: [String]\n $searchPattern: String\n $count: Int\n $offset: Int\n ) {\n resolveInstrumentsWithFilters(\n division: $division\n assetClass: $assetClass\n dataSource: $dataSource\n instruments: $instruments\n searchPattern: $searchPattern\n count: $count\n offset: $offset\n ) {\n instruments {\n name\n displayName\n }\n totalCount\n }\n }\n'];
|
|
40
40
|
|
|
41
41
|
export function graphql(source: string) {
|
|
42
42
|
return (documents as any)[source] ?? {};
|
package/src/gql/types/graphql.ts
CHANGED
|
@@ -40,6 +40,7 @@ export enum AssetClassName {
|
|
|
40
40
|
Cryptocurrency = 'CRYPTOCURRENCY',
|
|
41
41
|
Currency = 'CURRENCY',
|
|
42
42
|
EquityShares = 'EQUITY_SHARES',
|
|
43
|
+
Etfs = 'ETFS',
|
|
43
44
|
Indices = 'INDICES',
|
|
44
45
|
Rates = 'RATES',
|
|
45
46
|
}
|
|
@@ -251,7 +252,7 @@ export type QueryResolveInstrumentsByDivisionArgs = {
|
|
|
251
252
|
};
|
|
252
253
|
|
|
253
254
|
export type QueryResolveInstrumentsWithFiltersArgs = {
|
|
254
|
-
assetClass?: InputMaybe<Array<InputMaybe<
|
|
255
|
+
assetClass?: InputMaybe<Array<InputMaybe<AssetClassName>>>;
|
|
255
256
|
count?: InputMaybe<Scalars['Int']['input']>;
|
|
256
257
|
dataSource?: InputMaybe<InstrumentDataSource>;
|
|
257
258
|
division: Division;
|
|
@@ -439,8 +440,7 @@ export enum VolatilityChartTimeUnit {
|
|
|
439
440
|
export type ResolveInstrumentsWithFiltersQueryVariables = Exact<{
|
|
440
441
|
division: Division;
|
|
441
442
|
assetClass?: InputMaybe<
|
|
442
|
-
|
|
443
|
-
| InputMaybe<Scalars['String']['input']>
|
|
443
|
+
Array<InputMaybe<AssetClassName>> | InputMaybe<AssetClassName>
|
|
444
444
|
>;
|
|
445
445
|
dataSource?: InputMaybe<InstrumentDataSource>;
|
|
446
446
|
instruments?: InputMaybe<
|
|
@@ -497,7 +497,7 @@ export const ResolveInstrumentsWithFiltersDocument = {
|
|
|
497
497
|
kind: 'ListType',
|
|
498
498
|
type: {
|
|
499
499
|
kind: 'NamedType',
|
|
500
|
-
name: { kind: 'Name', value: '
|
|
500
|
+
name: { kind: 'Name', value: 'AssetClassName' },
|
|
501
501
|
},
|
|
502
502
|
},
|
|
503
503
|
},
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
"currency": "Currency",
|
|
9
9
|
"daily_percent_change": "Daily % Change",
|
|
10
10
|
"data_unavailable": "Data unavailable",
|
|
11
|
+
"etf_cfds": "ETF CFDs",
|
|
11
12
|
"index": "Index",
|
|
12
13
|
"instrument": "Instrument",
|
|
13
14
|
"instrument_name": "Instrument name",
|
|
@@ -15,7 +16,7 @@
|
|
|
15
16
|
"pagination_entries_range": "{{firstItemOnPage}}-{{lastItemOnPage}} of {{itemCount}} entries",
|
|
16
17
|
"search": "Search",
|
|
17
18
|
"sell": "Sell",
|
|
18
|
-
"
|
|
19
|
+
"share_cfds": "Share CFDs",
|
|
19
20
|
"spread": "Spread",
|
|
20
21
|
"today_high": "Today High",
|
|
21
22
|
"today_low": "Today Low"
|
package/test/Main.test.tsx
CHANGED
|
@@ -9,7 +9,11 @@ import {
|
|
|
9
9
|
import { fireEvent, render, waitFor } from '@testing-library/react';
|
|
10
10
|
import React from 'react';
|
|
11
11
|
|
|
12
|
-
import {
|
|
12
|
+
import {
|
|
13
|
+
AssetClassName,
|
|
14
|
+
Division,
|
|
15
|
+
InstrumentDataSource,
|
|
16
|
+
} from '../src/gql/types/graphql';
|
|
13
17
|
import { Main } from '../src/InstrumentsTableWidget/Main';
|
|
14
18
|
import {
|
|
15
19
|
mockErrorQuery,
|
|
@@ -47,7 +51,7 @@ describe('Main component', () => {
|
|
|
47
51
|
<Main
|
|
48
52
|
isAssetClassFilterEnabled
|
|
49
53
|
isInstrumentSearchEnabled
|
|
50
|
-
assetClasses={[
|
|
54
|
+
assetClasses={[AssetClassName.Etfs, AssetClassName.Currency]}
|
|
51
55
|
dataSource={InstrumentDataSource.V20}
|
|
52
56
|
division={Division.Oc}
|
|
53
57
|
instruments={['EUR_USD', 'GBP_USD']}
|
|
@@ -67,7 +71,7 @@ describe('Main component', () => {
|
|
|
67
71
|
<MockLayoutProvider>
|
|
68
72
|
<Main
|
|
69
73
|
isAssetClassFilterEnabled
|
|
70
|
-
assetClasses={[
|
|
74
|
+
assetClasses={[AssetClassName.Etfs, AssetClassName.Currency]}
|
|
71
75
|
dataSource={InstrumentDataSource.V20}
|
|
72
76
|
division={Division.Oc}
|
|
73
77
|
instruments={['EUR_USD', 'GBP_USD']}
|