fix: seller fills should be red (#1597)
This commit is contained in:
parent
ae4960f700
commit
faa1d51acb
@ -53,8 +53,7 @@ describe('FillsTable', () => {
|
||||
|
||||
await screen.findByText('Market');
|
||||
const headers = screen.getAllByRole('columnheader');
|
||||
expect(headers).toHaveLength(7);
|
||||
expect(headers.map((h) => h.textContent?.trim())).toEqual([
|
||||
const expectedHeaders = [
|
||||
'Market',
|
||||
'Size',
|
||||
'Value',
|
||||
@ -62,7 +61,9 @@ describe('FillsTable', () => {
|
||||
'Role',
|
||||
'Fee',
|
||||
'Date',
|
||||
]);
|
||||
];
|
||||
expect(headers).toHaveLength(expectedHeaders.length);
|
||||
expect(headers.map((h) => h.textContent?.trim())).toEqual(expectedHeaders);
|
||||
});
|
||||
|
||||
it('formats cells correctly for buyer fill', async () => {
|
||||
@ -80,44 +81,6 @@ describe('FillsTable', () => {
|
||||
},
|
||||
});
|
||||
|
||||
render(<FillsTable partyId={partyId} rowData={[buyerFill]} />);
|
||||
|
||||
await waitForGridToBeInTheDOM();
|
||||
await waitForDataToHaveLoaded();
|
||||
|
||||
const cells = screen.getAllByRole('gridcell');
|
||||
const expectedValues = [
|
||||
buyerFill.market?.tradableInstrument.instrument.name || '',
|
||||
'+3.00000',
|
||||
'1.00 BTC',
|
||||
'3.00 BTC',
|
||||
'Maker',
|
||||
'0.06 BTC',
|
||||
getDateTimeFormat().format(new Date(buyerFill.createdAt)),
|
||||
];
|
||||
cells.forEach((cell, i) => {
|
||||
expect(cell).toHaveTextContent(expectedValues[i]);
|
||||
});
|
||||
|
||||
const amountCell = cells.find((c) => c.getAttribute('col-id') === 'size');
|
||||
expect(amountCell).toHaveClass('text-vega-green-dark');
|
||||
});
|
||||
|
||||
it('should format cells correctly for buyer fill', async () => {
|
||||
const partyId = 'party-id';
|
||||
const buyerFill = generateFill({
|
||||
...defaultFill,
|
||||
buyer: {
|
||||
id: partyId,
|
||||
},
|
||||
aggressor: Side.SIDE_SELL,
|
||||
buyerFee: {
|
||||
makerFee: '2',
|
||||
infrastructureFee: '2',
|
||||
liquidityFee: '2',
|
||||
},
|
||||
});
|
||||
|
||||
render(<FillsTable partyId={partyId} rowData={[buyerFill]} />);
|
||||
await waitForGridToBeInTheDOM();
|
||||
await waitForDataToHaveLoaded();
|
||||
@ -175,6 +138,7 @@ describe('FillsTable', () => {
|
||||
|
||||
const amountCell = cells.find((c) => c.getAttribute('col-id') === 'size');
|
||||
expect(amountCell).toHaveClass('text-vega-red-dark');
|
||||
screen.debug();
|
||||
});
|
||||
|
||||
it('should render correct maker or taker role', async () => {
|
||||
|
@ -11,9 +11,29 @@ export default {
|
||||
const Template: Story<Props> = (args) => <FillsTable {...args} />;
|
||||
export const Default = Template.bind({});
|
||||
|
||||
const partyId = 'party-id';
|
||||
Default.args = {
|
||||
partyId: 'party-id',
|
||||
rowData: Array(5)
|
||||
.fill(null)
|
||||
.map(() => generateFill()),
|
||||
partyId,
|
||||
rowData: [
|
||||
generateFill({
|
||||
seller: {
|
||||
id: partyId,
|
||||
},
|
||||
}),
|
||||
generateFill({
|
||||
buyer: {
|
||||
id: partyId,
|
||||
},
|
||||
}),
|
||||
generateFill({
|
||||
seller: {
|
||||
id: partyId,
|
||||
},
|
||||
}),
|
||||
generateFill({
|
||||
buyer: {
|
||||
id: partyId,
|
||||
},
|
||||
}),
|
||||
],
|
||||
};
|
||||
|
@ -10,26 +10,17 @@ import {
|
||||
} from '@vegaprotocol/react-helpers';
|
||||
import { Side } from '@vegaprotocol/types';
|
||||
import { AgGridColumn } from 'ag-grid-react';
|
||||
import type { VegaValueFormatterParams } from '@vegaprotocol/ui-toolkit';
|
||||
import { AgGridDynamic as AgGrid } from '@vegaprotocol/ui-toolkit';
|
||||
import { forwardRef } from 'react';
|
||||
import type { ValueFormatterParams } from 'ag-grid-community';
|
||||
import BigNumber from 'bignumber.js';
|
||||
import type { AgGridReactProps, AgReactUiProps } from 'ag-grid-react';
|
||||
import type { Trade } from './fills-data-provider';
|
||||
import type { Market } from '@vegaprotocol/market-list';
|
||||
import classNames from 'classnames';
|
||||
|
||||
export type Props = (AgGridReactProps | AgReactUiProps) & {
|
||||
partyId: string;
|
||||
};
|
||||
|
||||
type AccountsTableValueFormatterParams = Omit<
|
||||
ValueFormatterParams,
|
||||
'data' | 'value'
|
||||
> & {
|
||||
data: Trade | null;
|
||||
};
|
||||
|
||||
export const FillsTable = forwardRef<AgGridReact, Props>(
|
||||
({ partyId, ...props }, ref) => {
|
||||
return (
|
||||
@ -49,11 +40,15 @@ export const FillsTable = forwardRef<AgGridReact, Props>(
|
||||
headerName={t('Size')}
|
||||
type="rightAligned"
|
||||
field="size"
|
||||
cellClass={({ data }: { data: Trade }) => {
|
||||
return classNames('text-right', {
|
||||
[positiveClassNames]: data?.buyer.id === partyId,
|
||||
[negativeClassNames]: data?.seller.id,
|
||||
});
|
||||
cellClassRules={{
|
||||
[positiveClassNames]: ({ data }: { data: Trade }) => {
|
||||
const partySide = getPartySide(data, partyId);
|
||||
return partySide === 'buyer';
|
||||
},
|
||||
[negativeClassNames]: ({ data }: { data: Trade }) => {
|
||||
const partySide = getPartySide(data, partyId);
|
||||
return partySide === 'seller';
|
||||
},
|
||||
}}
|
||||
valueFormatter={formatSize(partyId)}
|
||||
/>
|
||||
@ -85,12 +80,7 @@ export const FillsTable = forwardRef<AgGridReact, Props>(
|
||||
field="createdAt"
|
||||
valueFormatter={({
|
||||
value,
|
||||
}: AccountsTableValueFormatterParams & {
|
||||
value: Trade['createdAt'];
|
||||
}) => {
|
||||
if (value === undefined) {
|
||||
return value;
|
||||
}
|
||||
}: VegaValueFormatterParams<Trade, 'createdAt'>) => {
|
||||
return getDateTimeFormat().format(new Date(value));
|
||||
}}
|
||||
/>
|
||||
@ -102,11 +92,9 @@ export const FillsTable = forwardRef<AgGridReact, Props>(
|
||||
const formatPrice = ({
|
||||
value,
|
||||
data,
|
||||
}: AccountsTableValueFormatterParams & {
|
||||
value?: Trade['price'];
|
||||
}) => {
|
||||
if (value === undefined || !data || !data?.market) {
|
||||
return undefined;
|
||||
}: VegaValueFormatterParams<Trade, 'price'>) => {
|
||||
if (!data.market) {
|
||||
return '-';
|
||||
}
|
||||
const asset =
|
||||
data?.market.tradableInstrument.instrument.product.settlementAsset.symbol;
|
||||
@ -118,19 +106,16 @@ const formatPrice = ({
|
||||
};
|
||||
|
||||
const formatSize = (partyId: string) => {
|
||||
return ({
|
||||
value,
|
||||
data,
|
||||
}: AccountsTableValueFormatterParams & {
|
||||
value?: Trade['size'];
|
||||
}) => {
|
||||
if (value === undefined || !data || !data?.market) {
|
||||
return undefined;
|
||||
return ({ value, data }: VegaValueFormatterParams<Trade, 'size'>) => {
|
||||
if (!data.market) {
|
||||
return '-';
|
||||
}
|
||||
let prefix;
|
||||
if (data?.buyer.id === partyId) {
|
||||
let prefix = '';
|
||||
const partySide = getPartySide(data, partyId);
|
||||
|
||||
if (partySide === 'buyer') {
|
||||
prefix = '+';
|
||||
} else if (data?.seller.id) {
|
||||
} else if (partySide === 'seller') {
|
||||
prefix = '-';
|
||||
}
|
||||
|
||||
@ -142,14 +127,25 @@ const formatSize = (partyId: string) => {
|
||||
};
|
||||
};
|
||||
|
||||
const getPartySide = (
|
||||
data: Trade,
|
||||
partyId: string
|
||||
): 'buyer' | 'seller' | undefined => {
|
||||
let result = undefined;
|
||||
if (data?.buyer.id === partyId) {
|
||||
result = 'buyer' as const;
|
||||
} else if (data?.seller.id === partyId) {
|
||||
result = 'seller' as const;
|
||||
}
|
||||
return result;
|
||||
};
|
||||
|
||||
const formatTotal = ({
|
||||
value,
|
||||
data,
|
||||
}: AccountsTableValueFormatterParams & {
|
||||
value?: Trade['price'];
|
||||
}) => {
|
||||
if (value === undefined || !data || !data?.market) {
|
||||
return undefined;
|
||||
}: VegaValueFormatterParams<Trade, 'price'>) => {
|
||||
if (!data?.market) {
|
||||
return '-';
|
||||
}
|
||||
const asset =
|
||||
data?.market.tradableInstrument.instrument.product.settlementAsset.symbol;
|
||||
@ -164,15 +160,7 @@ const formatTotal = ({
|
||||
};
|
||||
|
||||
const formatRole = (partyId: string) => {
|
||||
return ({
|
||||
value,
|
||||
data,
|
||||
}: AccountsTableValueFormatterParams & {
|
||||
value?: Trade['aggressor'];
|
||||
}) => {
|
||||
if (value === undefined) {
|
||||
return value;
|
||||
}
|
||||
return ({ value, data }: VegaValueFormatterParams<Trade, 'aggressor'>) => {
|
||||
const taker = t('Taker');
|
||||
const maker = t('Maker');
|
||||
if (data?.buyer.id === partyId) {
|
||||
@ -197,11 +185,12 @@ const formatFee = (partyId: string) => {
|
||||
return ({
|
||||
value,
|
||||
data,
|
||||
}: AccountsTableValueFormatterParams & {
|
||||
value?: Market['tradableInstrument']['instrument']['product'];
|
||||
}) => {
|
||||
if (value === undefined) {
|
||||
return value;
|
||||
}: VegaValueFormatterParams<
|
||||
Trade,
|
||||
'market.tradableInstrument.instrument.product'
|
||||
>) => {
|
||||
if (!value?.settlementAsset) {
|
||||
return '-';
|
||||
}
|
||||
const asset = value.settlementAsset;
|
||||
let feesObj;
|
||||
|
@ -17,10 +17,11 @@ type RowHelper<TObj, TRow, TField extends Field> = Omit<
|
||||
value: Get<TRow, TField>;
|
||||
};
|
||||
|
||||
export type VegaValueFormatterParams<
|
||||
export type VegaValueFormatterParams<TRow, TField extends Field> = RowHelper<
|
||||
ValueFormatterParams,
|
||||
TRow,
|
||||
TField extends Field = string
|
||||
> = RowHelper<ValueFormatterParams, TRow, TField>;
|
||||
TField
|
||||
>;
|
||||
|
||||
export type VegaICellRendererParams<
|
||||
TRow,
|
||||
|
Loading…
Reference in New Issue
Block a user