2022-04-06 17:48:05 +00:00
|
|
|
import { forwardRef } from 'react';
|
2022-08-17 14:10:01 +00:00
|
|
|
import type {
|
|
|
|
ColumnApi,
|
|
|
|
GroupCellRendererParams,
|
|
|
|
ValueFormatterParams,
|
|
|
|
} from 'ag-grid-community';
|
2022-04-06 17:48:05 +00:00
|
|
|
import {
|
|
|
|
PriceCell,
|
2022-05-04 15:15:54 +00:00
|
|
|
addDecimalsFormatNumber,
|
2022-04-06 17:48:05 +00:00
|
|
|
t,
|
|
|
|
addSummaryRows,
|
|
|
|
} from '@vegaprotocol/react-helpers';
|
|
|
|
import type { SummaryRow } from '@vegaprotocol/react-helpers';
|
|
|
|
import { AgGridDynamic as AgGrid } from '@vegaprotocol/ui-toolkit';
|
|
|
|
import { AgGridColumn } from 'ag-grid-react';
|
|
|
|
import type { AgGridReact } from 'ag-grid-react';
|
chore: stagnet3 api updates (#1321)
* chore: update account, fills and orders subscriptions in data providers
* chore: update account, fills and orders subscriptions in data providers
* fixing console-lite
* fixing types in general - regen
* chore: update account, fills and orders subscriptions in data providers
* fixed console-lite unit tests, uncommented quote name
* chore: update account, fills and orders subscriptions in data providers
* type aligning of assets and proposals
* fixes liquidity data provider
* fixed accounts build errors and unit tests
* regen types, removed market name
* regen types
* fixed positions
* chore: handle updates in derived market provider, update orders
* removed taker fee mapping (renamed to maker fee)
* chore: update account, fills and orders subscriptions in data providers
* chore: update account, fills and orders subscriptions in data providers
* chore: fix Order type
* chore: fix possible null types
* chore: revert order-list.stories.tsx
* chore: derivedDataProvider fixes
* fills unit tests fixes
* orders unit tests fixes
* added eslint ingore for generated files in liquidity
* added unique key to the list element of simple market toolbar
* changed main-branch-name to develop for pr workflows
* removed redundant waitFor
* increased test timeout to 10s
* removed mocked response
* chore: disable simple market list tests
* chore: fix e2e projects mock types
* feat: [subscription-update] - uncomment some console-lite tests
* cypress: trading-accounts
* chore: replace market candles with candlesConnection
* chore: ignore gql errors, to be reverted after candlesConnectio n will be fixed
* feat: [subscription-update] - improve wrongly renamed hook
* feat: [subscription-update] - improve wrongly renamed hook
* feat: [subscription-update] - improve wrongly renamed hook 3
* chore: add pagination hangdling to derived data provier
* cypress: trading-fills
* feat: [stagnet3 api update] - remove redundant command in tests
* feat: [stagnet3 api update] - remove redundant command in tests
* chore: fix trading orders e2e tests
* chore: fix console lite e2e mocks
* chore: fix market-trade tests
* chore: use markets only in market selector, change Instrument cache policy
* chore: fix market-selector tests
* feat: [subscription-update] - improve ag grid conf for unit tests
* feat: [subscription-update] - improve ag grid conf for unit tests
* chore: fix candle types in console lite market mocks
* chore: revert error policy ignore
* chore: revert jest timeout
* chore: remove unused AccountFields
* chore: revert remove unused AccountFields
* chore: simplify node subscription probe
* chore: remove unused generated types in candles-chart
* chore: improve useMarketsList mock
* feat: [subscription-update] - increase jest timeout
* feat: [subscription-update] - fix jest timeout
* feat: [subscription-update] - fix jest timeout
* feat: [subscription-update] - try to fix failing test again
* chore: fix candles-chart types
* feat: [subscription-update] - temporary skip failing test
* feat: [subscription-update] - temporary skip failing test
* feat: [subscription-update] - temporary skip failing test
* feat: [subscription-update] - fix failling int test
* feat: [subscription-update] - try to restore commented unit tests
* feat: [subscription-update] - try to restore commented unit tests
* feat: [subscription-update] - improve fixed unit tests
Co-authored-by: asiaznik <artur@vegaprotocol.io>
Co-authored-by: maciek <maciek@vegaprotocol.io>
2022-09-20 15:24:28 +00:00
|
|
|
import type { AccountFieldsFragment } from './__generated___/Accounts';
|
2022-04-25 16:33:49 +00:00
|
|
|
import { getId } from './accounts-data-provider';
|
2022-08-26 15:39:40 +00:00
|
|
|
import { useAssetDetailsDialogStore } from '@vegaprotocol/assets';
|
2022-08-23 17:24:33 +00:00
|
|
|
import type { AccountType } from '@vegaprotocol/types';
|
|
|
|
import { AccountTypeMapping } from '@vegaprotocol/types';
|
2022-04-06 17:48:05 +00:00
|
|
|
|
|
|
|
interface AccountsTableProps {
|
2022-09-09 15:14:48 +00:00
|
|
|
data: AccountFieldsFragment[] | null;
|
2022-04-06 17:48:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
interface AccountsTableValueFormatterParams extends ValueFormatterParams {
|
2022-09-09 15:14:48 +00:00
|
|
|
data: AccountFieldsFragment;
|
2022-04-06 17:48:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
export const getGroupId = (
|
2022-09-09 15:14:48 +00:00
|
|
|
data: AccountFieldsFragment & SummaryRow,
|
2022-04-06 17:48:05 +00:00
|
|
|
columnApi: ColumnApi
|
|
|
|
) => {
|
|
|
|
if (data.__summaryRow) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
const sortColumnId = columnApi.getColumnState().find((c) => c.sort)?.colId;
|
|
|
|
switch (sortColumnId) {
|
|
|
|
case 'asset.symbol':
|
|
|
|
return data.asset.id;
|
|
|
|
}
|
|
|
|
return undefined;
|
|
|
|
};
|
|
|
|
|
|
|
|
export const getGroupSummaryRow = (
|
2022-09-09 15:14:48 +00:00
|
|
|
data: AccountFieldsFragment[],
|
2022-04-06 17:48:05 +00:00
|
|
|
columnApi: ColumnApi
|
2022-09-09 15:14:48 +00:00
|
|
|
): Partial<AccountFieldsFragment & SummaryRow> | null => {
|
2022-04-06 17:48:05 +00:00
|
|
|
if (!data.length) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
const sortColumnId = columnApi.getColumnState().find((c) => c.sort)?.colId;
|
|
|
|
switch (sortColumnId) {
|
|
|
|
case 'asset.symbol':
|
|
|
|
return {
|
|
|
|
__summaryRow: true,
|
|
|
|
balance: data
|
|
|
|
.reduce((a, i) => a + (parseFloat(i.balance) || 0), 0)
|
|
|
|
.toString(),
|
|
|
|
asset: data[0].asset,
|
|
|
|
};
|
|
|
|
}
|
|
|
|
return null;
|
|
|
|
};
|
|
|
|
|
|
|
|
const comparator = (
|
|
|
|
valueA: string,
|
|
|
|
valueB: string,
|
2022-09-09 15:14:48 +00:00
|
|
|
nodeA: { data: AccountFieldsFragment & SummaryRow },
|
|
|
|
nodeB: { data: AccountFieldsFragment & SummaryRow },
|
2022-04-06 17:48:05 +00:00
|
|
|
isInverted: boolean
|
|
|
|
) => {
|
|
|
|
if (valueA < valueB) {
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (valueA > valueB) {
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (nodeA.data.__summaryRow) {
|
|
|
|
return isInverted ? -1 : 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (nodeB.data.__summaryRow) {
|
|
|
|
return isInverted ? 1 : -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
};
|
|
|
|
|
|
|
|
export const AccountsTable = forwardRef<AgGridReact, AccountsTableProps>(
|
|
|
|
({ data }, ref) => {
|
2022-08-17 14:10:01 +00:00
|
|
|
const { setAssetDetailsDialogOpen, setAssetDetailsDialogSymbol } =
|
|
|
|
useAssetDetailsDialogStore();
|
2022-04-06 17:48:05 +00:00
|
|
|
return (
|
|
|
|
<AgGrid
|
|
|
|
style={{ width: '100%', height: '100%' }}
|
|
|
|
overlayNoRowsTemplate={t('No accounts')}
|
|
|
|
rowData={data}
|
2022-04-25 16:33:49 +00:00
|
|
|
getRowId={({ data }) => getId(data)}
|
2022-04-06 17:48:05 +00:00
|
|
|
ref={ref}
|
|
|
|
defaultColDef={{
|
|
|
|
flex: 1,
|
|
|
|
resizable: true,
|
|
|
|
}}
|
|
|
|
components={{ PriceCell }}
|
|
|
|
onSortChanged={({ api, columnApi }) => {
|
|
|
|
addSummaryRows(api, columnApi, getGroupId, getGroupSummaryRow);
|
|
|
|
}}
|
|
|
|
onGridReady={(event) => {
|
|
|
|
event.columnApi.applyColumnState({
|
|
|
|
state: [
|
|
|
|
{
|
|
|
|
colId: 'asset.symbol',
|
|
|
|
sort: 'asc',
|
|
|
|
},
|
|
|
|
],
|
|
|
|
});
|
|
|
|
}}
|
|
|
|
>
|
|
|
|
<AgGridColumn
|
|
|
|
headerName={t('Asset')}
|
|
|
|
field="asset.symbol"
|
|
|
|
sortable
|
|
|
|
sortingOrder={['asc', 'desc']}
|
|
|
|
comparator={comparator}
|
2022-08-17 14:10:01 +00:00
|
|
|
cellRenderer={({ value }: GroupCellRendererParams) =>
|
|
|
|
value && value.length > 0 ? (
|
|
|
|
<button
|
|
|
|
className="hover:underline"
|
|
|
|
onClick={() => {
|
|
|
|
setAssetDetailsDialogOpen(true);
|
|
|
|
setAssetDetailsDialogSymbol(value);
|
|
|
|
}}
|
|
|
|
>
|
|
|
|
{value}
|
|
|
|
</button>
|
|
|
|
) : (
|
|
|
|
''
|
|
|
|
)
|
|
|
|
}
|
2022-04-06 17:48:05 +00:00
|
|
|
/>
|
|
|
|
<AgGridColumn
|
|
|
|
headerName={t('Type')}
|
|
|
|
field="type"
|
2022-08-23 17:24:33 +00:00
|
|
|
valueFormatter={({ value }: ValueFormatterParams) =>
|
|
|
|
value ? AccountTypeMapping[value as AccountType] : '-'
|
|
|
|
}
|
2022-04-06 17:48:05 +00:00
|
|
|
/>
|
|
|
|
<AgGridColumn
|
|
|
|
headerName={t('Market')}
|
2022-09-07 18:37:39 +00:00
|
|
|
field="market.tradableInstrument.instrument.name"
|
2022-04-06 17:48:05 +00:00
|
|
|
valueFormatter="value || '—'"
|
|
|
|
/>
|
|
|
|
<AgGridColumn
|
|
|
|
headerName={t('Balance')}
|
|
|
|
field="balance"
|
|
|
|
cellRenderer="PriceCell"
|
2022-08-31 05:59:30 +00:00
|
|
|
type="rightAligned"
|
2022-04-06 17:48:05 +00:00
|
|
|
valueFormatter={({
|
|
|
|
value,
|
|
|
|
data,
|
|
|
|
}: AccountsTableValueFormatterParams) =>
|
2022-05-04 15:15:54 +00:00
|
|
|
addDecimalsFormatNumber(value, data.asset.decimals)
|
2022-04-06 17:48:05 +00:00
|
|
|
}
|
|
|
|
/>
|
|
|
|
</AgGrid>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
);
|
|
|
|
|
|
|
|
export default AccountsTable;
|