diff --git a/apps/trading-e2e/src/integration/market-oracles.cy.ts b/apps/trading-e2e/src/integration/market-oracles.cy.ts new file mode 100644 index 000000000..4024a21d2 --- /dev/null +++ b/apps/trading-e2e/src/integration/market-oracles.cy.ts @@ -0,0 +1,16 @@ +import { MarketState } from '@vegaprotocol/types'; + +describe('market oracle', { tags: '@smoke' }, () => { + it('current fees displayed', () => { + cy.mockTradingPage( + MarketState.STATE_ACTIVE, + undefined, + undefined, + 'COMPROMISED' + ); + cy.visit('/#/markets/market-0'); + cy.wait('@Markets'); + cy.wait('@MarketInfo'); + cy.getByTestId('oracle-status').should('contain.text', 'COMPROMISED'); + }); +}); diff --git a/apps/trading/client-pages/market/trade-grid.tsx b/apps/trading/client-pages/market/trade-grid.tsx index b6f326a8d..d9fa9836a 100644 --- a/apps/trading/client-pages/market/trade-grid.tsx +++ b/apps/trading/client-pages/market/trade-grid.tsx @@ -1,7 +1,7 @@ import { DealTicketContainer } from '@vegaprotocol/deal-ticket'; import { MarketInfoAccordionContainer } from '@vegaprotocol/market-info'; import { OrderbookContainer } from '@vegaprotocol/market-depth'; -import { OrderListContainer } from '@vegaprotocol/orders'; +import { OrderListContainer, Filter } from '@vegaprotocol/orders'; import { FillsContainer } from '@vegaprotocol/fills'; import { PositionsContainer } from '@vegaprotocol/positions'; import { TradesContainer } from '@vegaprotocol/trades'; @@ -153,7 +153,40 @@ const MarketBottomPanel = memo( - + + + + + + + + + + + + + + + + & { }; export type OrderEdge = Edge; +const liveOnlyOrderStatuses = [ + OrderStatus.STATUS_ACTIVE, + OrderStatus.STATUS_PARKED, +]; + const orderMatchFilters = ( order: OrderUpdateFieldsFragment, variables: OrdersQueryVariables @@ -41,6 +46,12 @@ const orderMatchFilters = ( ) { return false; } + if ( + variables?.filter?.liveOnly && + !(order.status && liveOnlyOrderStatuses.includes(order.status)) + ) { + return false; + } if ( variables?.filter?.types && !(order.type && variables.filter.types.includes(order.type)) @@ -204,7 +215,7 @@ export const activeOrdersProvider = makeDerivedDataProvider< ordersProvider(callback, client, { partyId: variables.partyId, filter: { - status: [OrderStatus.STATUS_ACTIVE, OrderStatus.STATUS_PARKED], + liveOnly: true, }, }), ], diff --git a/libs/orders/src/lib/components/order-list-container.tsx b/libs/orders/src/lib/components/order-list-container.tsx index 9620a6924..a3bb14efa 100644 --- a/libs/orders/src/lib/components/order-list-container.tsx +++ b/libs/orders/src/lib/components/order-list-container.tsx @@ -2,17 +2,20 @@ import { t } from '@vegaprotocol/i18n'; import { Splash } from '@vegaprotocol/ui-toolkit'; import { useVegaWallet } from '@vegaprotocol/wallet'; import { OrderListManager } from './order-list-manager'; +import type { Filter } from './order-list-manager/use-order-list-data'; export const OrderListContainer = ({ marketId, onMarketClick, onOrderTypeClick, enforceBottomPlaceholder, + filter, }: { marketId?: string; onMarketClick?: (marketId: string, metaKey?: boolean) => void; onOrderTypeClick?: (marketId: string, metaKey?: boolean) => void; enforceBottomPlaceholder?: boolean; + filter?: Filter; }) => { const { pubKey, isReadOnly } = useVegaWallet(); @@ -24,6 +27,7 @@ export const OrderListContainer = ({ void; isReadOnly: boolean; enforceBottomPlaceholder?: boolean; + filter?: Filter; } const CancelAllOrdersButton = ({ onClick }: { onClick: () => void }) => ( @@ -43,12 +42,6 @@ const CancelAllOrdersButton = ({ onClick }: { onClick: () => void }) => ( ); -const initialFilter: Filter = { - status: { - value: [OrderStatus.STATUS_ACTIVE, OrderStatus.STATUS_PARKED], - }, -}; - export const OrderListManager = ({ partyId, marketId, @@ -56,20 +49,16 @@ export const OrderListManager = ({ onOrderTypeClick, isReadOnly, enforceBottomPlaceholder, + filter, }: OrderListManagerProps) => { const gridRef = useRef(null); const [dataCount, setDataCount] = useState(0); const scrolledToTop = useRef(false); - const [sort, setSort] = useState(); - const [filter, setFilter] = useState(initialFilter); - const filterRef = useRef(initialFilter); const [editOrder, setEditOrder] = useState(null); const create = useVegaTransactionStore((state) => state.create); const hasAmendableOrder = useHasAmendableOrder(marketId); - const { data, error, loading, reload } = useOrderListData({ partyId, - sort, filter, gridRef, scrolledToTop, @@ -84,42 +73,6 @@ export const OrderListManager = ({ disabled: !enforceBottomPlaceholder && !isReadOnly && !hasAmendableOrder, }); - const onFilterChanged = useCallback( - (event: FilterChangedEvent) => { - const updatedFilter = event.api.getFilterModel(); - if (isEqual(updatedFilter, filterRef.current)) { - return; - } - filterRef.current = updatedFilter; - if (Object.keys(updatedFilter).length) { - setFilter(updatedFilter); - } else { - setFilter(undefined); - } - setDataCount(gridRef.current?.api?.getModel().getRowCount() ?? 0); - bottomPlaceholderOnFilterChanged?.(); - }, - [setFilter, bottomPlaceholderOnFilterChanged] - ); - - const onSortChange = useCallback( - (event: SortChangedEvent) => { - const sort = event.columnApi - .getColumnState() - .sort((a, b) => (a.sortIndex || 0) - (b.sortIndex || 0)) - .reduce((acc, col) => { - if (col.sort) { - const { colId, sort } = col; - acc.push({ colId, sort }); - } - return acc; - }, [] as { colId: string; sort: string }[]); - setSort(sort.length > 0 ? sort : undefined); - bottomPlaceholderOnSortChanged?.(); - }, - [setSort, bottomPlaceholderOnSortChanged] - ); - const cancel = useCallback( (order: Order) => { if (!order.market) return; @@ -133,9 +86,18 @@ export const OrderListManager = ({ [create] ); - const onGridReady = useCallback(({ api }: GridReadyEvent) => { - api.setFilterModel(initialFilter); - }, []); + const onGridReady = useCallback( + ({ api }: GridReadyEvent) => { + if (filter) { + api.setFilterModel({ + status: { + value: FilterStatus[filter], + }, + }); + } + }, + [filter] + ); useEffect(() => { setDataCount(gridRef.current?.api?.getModel().getRowCount() ?? 0); @@ -162,8 +124,6 @@ export const OrderListManager = ({ rowData={extractedData} ref={gridRef} onGridReady={onGridReady} - onFilterChanged={onFilterChanged} - onSortChanged={onSortChange} cancel={cancel} setEditOrder={setEditOrder} onMarketClick={onMarketClick} diff --git a/libs/orders/src/lib/components/order-list-manager/use-order-list-data.ts b/libs/orders/src/lib/components/order-list-manager/use-order-list-data.ts index 009aff62f..aeea4a7b4 100644 --- a/libs/orders/src/lib/components/order-list-manager/use-order-list-data.ts +++ b/libs/orders/src/lib/components/order-list-manager/use-order-list-data.ts @@ -3,6 +3,7 @@ import type { RefObject } from 'react'; import type { AgGridReact } from 'ag-grid-react'; import { makeInfiniteScrollGetRows } from '@vegaprotocol/utils'; import { useDataProvider, updateGridData } from '@vegaprotocol/react-helpers'; +import { OrderStatus } from '@vegaprotocol/types'; import { ordersWithMarketProvider } from '../order-data-provider/order-data-provider'; import type { OrderEdge, @@ -12,38 +13,33 @@ import type { OrdersQueryVariables, OrdersUpdateSubscriptionVariables, } from '../order-data-provider/__generated__/Orders'; -import type * as Types from '@vegaprotocol/types'; -export interface Sort { - colId: string; - sort: string; -} -export interface Filter { - updatedAt?: { - value: Types.DateRange; - }; - type?: { - value: Types.OrderType[]; - }; - status?: { - value: Types.OrderStatus[]; - }; - timeInForce?: { - value: Types.OrderTimeInForce[]; - }; + +export enum Filter { + 'Open' = 1, + 'Closed', + 'Rejected', } + +const FilterStatus = { + [Filter.Open]: [OrderStatus.STATUS_ACTIVE, OrderStatus.STATUS_PARKED], + [Filter.Closed]: [ + OrderStatus.STATUS_CANCELLED, + OrderStatus.STATUS_EXPIRED, + OrderStatus.STATUS_FILLED, + OrderStatus.STATUS_PARTIALLY_FILLED, + OrderStatus.STATUS_STOPPED, + ], + [Filter.Rejected]: [OrderStatus.STATUS_REJECTED], +}; interface Props { partyId: string; - marketId?: string; filter?: Filter; - sort?: Sort[]; gridRef: RefObject; scrolledToTop: RefObject; } export const useOrderListData = ({ partyId, - marketId, - sort, filter, gridRef, scrolledToTop, @@ -72,25 +68,10 @@ export const useOrderListData = ({ const allVars: OrdersQueryVariables & OrdersUpdateSubscriptionVariables = { partyId, }; - if ( - filter?.updatedAt?.value || - filter?.status?.value.length || - filter?.timeInForce?.value.length || - filter?.type?.value.length - ) { - allVars.filter = {}; - if (filter?.updatedAt?.value) { - allVars.filter.dateRange = filter?.updatedAt?.value; - } - if (filter?.status?.value.length) { - allVars.filter.status = filter?.status?.value; - } - if (filter?.timeInForce?.value.length) { - allVars.filter.timeInForce = filter?.timeInForce?.value; - } - if (filter?.type?.value.length) { - allVars.filter.types = filter?.type?.value; - } + if (filter === Filter.Open) { + allVars.filter = { + liveOnly: true, + }; } return allVars; }, [partyId, filter]); diff --git a/libs/types/src/__generated__/types.ts b/libs/types/src/__generated__/types.ts index aa926b374..dec5b3fcc 100644 --- a/libs/types/src/__generated__/types.ts +++ b/libs/types/src/__generated__/types.ts @@ -2279,6 +2279,7 @@ export type OrderFilter = { /** Date range to retrieve orders from/to. Start and end time should be expressed as an integer value of nano-seconds past the Unix epoch */ dateRange?: InputMaybe; excludeLiquidity?: InputMaybe; + liveOnly?: InputMaybe; status?: InputMaybe>; timeInForce?: InputMaybe>; types?: InputMaybe>;