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>;