├── .eslintrc.json
├── .gitignore
├── app
├── page.tsx
└── layout.tsx
├── next.config.js
├── next-env.d.ts
├── .codesandbox
└── tasks.json
├── tsconfig.json
├── package.json
├── src
├── styles.css
├── App.tsx
├── columnDefs.ts
└── dataGenerator.ts
├── README.md
└── columns.md
/.eslintrc.json:
--------------------------------------------------------------------------------
1 | {
2 | "parser": "@typescript-eslint/parser"
3 | }
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | nul
3 | .claude
4 | .playwright-mcp
5 | .next
--------------------------------------------------------------------------------
/app/page.tsx:
--------------------------------------------------------------------------------
1 | 'use client'
2 |
3 | import App from '../src/App'
4 |
5 | export default function Home() {
6 | return
7 | }
8 |
--------------------------------------------------------------------------------
/next.config.js:
--------------------------------------------------------------------------------
1 | /** @type {import('next').NextConfig} */
2 | const nextConfig = {
3 | reactStrictMode: true,
4 | }
5 |
6 | module.exports = nextConfig
7 |
--------------------------------------------------------------------------------
/next-env.d.ts:
--------------------------------------------------------------------------------
1 | ///
2 | ///
3 | ///
4 |
5 | // NOTE: This file should not be edited
6 | // see https://nextjs.org/docs/app/api-reference/config/typescript for more information.
7 |
--------------------------------------------------------------------------------
/.codesandbox/tasks.json:
--------------------------------------------------------------------------------
1 | {"setupTasks":[{"name":"Install Dependencies","command":"yarn install"}],"tasks":{"start":{"name":"start","command":"yarn start","runAtStart":true,"preview":{"port":3000}},"build":{"name":"build","command":"yarn build","runAtStart":false},"test":{"name":"test","command":"yarn test","runAtStart":false},"eject":{"name":"eject","command":"yarn eject","runAtStart":false}}}
--------------------------------------------------------------------------------
/app/layout.tsx:
--------------------------------------------------------------------------------
1 | import type { Metadata } from 'next'
2 | import '../src/styles.css'
3 |
4 | export const metadata: Metadata = {
5 | title: 'AG Grid Bug Reproduction',
6 | description: 'AG Grid Date Pivot Bug Test',
7 | }
8 |
9 | export default function RootLayout({
10 | children,
11 | }: {
12 | children: React.ReactNode
13 | }) {
14 | return (
15 |
16 |
{children}
17 |
18 | )
19 | }
20 |
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "ES2017",
4 | "lib": ["dom", "dom.iterable", "esnext"],
5 | "allowJs": true,
6 | "skipLibCheck": true,
7 | "strict": true,
8 | "noEmit": true,
9 | "esModuleInterop": true,
10 | "module": "esnext",
11 | "moduleResolution": "bundler",
12 | "resolveJsonModule": true,
13 | "isolatedModules": true,
14 | "jsx": "preserve",
15 | "incremental": true,
16 | "plugins": [
17 | {
18 | "name": "next"
19 | }
20 | ],
21 | "paths": {
22 | "@/*": ["./*"]
23 | }
24 | },
25 | "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
26 | "exclude": ["node_modules"]
27 | }
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "react-typescript",
3 | "version": "1.0.0",
4 | "description": "React and TypeScript example starter project",
5 | "keywords": [
6 | "typescript",
7 | "react",
8 | "starter"
9 | ],
10 | "main": "src/index.tsx",
11 | "dependencies": {
12 | "ag-grid-enterprise": "^34.3.1",
13 | "ag-grid-react": "^34.3.1",
14 | "loader-utils": "3.2.1",
15 | "next": "^15.5.6",
16 | "react": "^19.2.0",
17 | "react-dom": "^19.2.0"
18 | },
19 | "devDependencies": {
20 | "@types/node": "^24.10.0",
21 | "@types/react": "19.2.2",
22 | "@types/react-dom": "19.2.2",
23 | "typescript": "^5.9.3"
24 | },
25 | "scripts": {
26 | "dev": "next dev",
27 | "build": "next build",
28 | "start": "next start",
29 | "lint": "next lint"
30 | },
31 | "browserslist": [
32 | ">0.2%",
33 | "not dead",
34 | "not ie <= 11",
35 | "not op_mini all"
36 | ]
37 | }
38 |
--------------------------------------------------------------------------------
/src/styles.css:
--------------------------------------------------------------------------------
1 | body {
2 | margin: 0;
3 | padding: 0;
4 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
5 | 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
6 | sans-serif;
7 | -webkit-font-smoothing: antialiased;
8 | -moz-osx-font-smoothing: grayscale;
9 | }
10 |
11 | .App {
12 | display: flex;
13 | flex-direction: column;
14 | height: 100vh;
15 | padding: 0;
16 | }
17 |
18 | .header {
19 | padding: 20px;
20 | background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
21 | color: white;
22 | box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
23 | }
24 |
25 | .header h1 {
26 | margin: 0 0 15px 0;
27 | font-size: 28px;
28 | font-weight: 600;
29 | }
30 |
31 | .header .info {
32 | margin: 10px 0 0 0;
33 | font-size: 14px;
34 | opacity: 0.9;
35 | }
36 |
37 | .date-picker-container {
38 | display: flex;
39 | gap: 20px;
40 | justify-content: center;
41 | align-items: center;
42 | margin-top: 15px;
43 | flex-wrap: wrap;
44 | }
45 |
46 | .date-input-group {
47 | display: flex;
48 | align-items: center;
49 | gap: 10px;
50 | }
51 |
52 | .date-input-group label {
53 | font-weight: 500;
54 | font-size: 14px;
55 | }
56 |
57 | .date-input-group input[type="date"] {
58 | padding: 8px 12px;
59 | border: 2px solid rgba(255, 255, 255, 0.3);
60 | border-radius: 6px;
61 | font-size: 14px;
62 | background-color: rgba(255, 255, 255, 0.95);
63 | color: #333;
64 | cursor: pointer;
65 | transition: all 0.2s ease;
66 | }
67 |
68 | .date-input-group input[type="date"]:hover {
69 | border-color: rgba(255, 255, 255, 0.6);
70 | background-color: white;
71 | }
72 |
73 | .date-input-group input[type="date"]:focus {
74 | outline: none;
75 | border-color: white;
76 | box-shadow: 0 0 0 3px rgba(255, 255, 255, 0.2);
77 | }
78 |
79 | .ag-theme-alpine {
80 | --ag-header-background-color: #f8f9fa;
81 | --ag-odd-row-background-color: #ffffff;
82 | --ag-header-foreground-color: #333;
83 | --ag-font-size: 13px;
84 | }
85 |
86 | .ag-theme-alpine .ag-header-cell-label {
87 | font-weight: 600;
88 | }
89 |
90 | .ag-theme-alpine .ag-pivot-off .ag-header-cell-label {
91 | font-size: 12px;
92 | }
93 |
94 | .ag-theme-alpine .pnl-positive {
95 | color: green !important;
96 | font-weight: bold;
97 | }
98 |
99 | .ag-theme-alpine .pnl-negative {
100 | color: red !important;
101 | font-weight: bold;
102 | }
103 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # AG Grid Historical Position P&L Demo
2 |
3 | A React TypeScript demo application showcasing AG Grid's pivot functionality for analyzing historical position P&L data.
4 |
5 | ## Features
6 |
7 | - **Date Pivoting**: Automatically pivots closing prices and P&L by date columns
8 | - **Deterministic Data Generation**: Generates quasi-random but consistent sample data based on date seeds
9 | - **Date Range Filtering**: Interactive date pickers to filter data by date range
10 | - **P&L Visualization**: Color-coded P&L values (green for positive, red for negative)
11 | - **10 Sample Tickers**: Pre-configured with AAPL, GOOGL, MSFT, AMZN, TSLA, META, NVDA, JPM, BAC, WMT
12 |
13 | ## Tech Stack
14 |
15 | - **React** 18.2.0
16 | - **TypeScript** 4.4.4
17 | - **AG Grid Enterprise** 34.2.0
18 | - **AG Grid React** 34.2.0
19 |
20 | ## Data Structure
21 |
22 | Each data point contains:
23 | - `ticker`: Stock ticker symbol
24 | - `price`: Closing price (deterministic based on date)
25 | - `date`: Trading date (ISO format)
26 | - `pnl`: Profit/Loss calculated as the difference from previous day's price
27 |
28 | ## How It Works
29 |
30 | ### Deterministic Data Generation
31 |
32 | The app uses a seeded random number generator (Linear Congruential Generator) to create deterministic prices. The seed is derived from both the ticker name and the date, ensuring:
33 |
34 | 1. Same ticker + same date = same price (always)
35 | 2. Different dates or tickers produce different but reproducible prices
36 | 3. Weekend dates are automatically skipped
37 |
38 | ### Pivot Configuration
39 |
40 | The grid is configured with:
41 | - **Pivot Column**: `date` field
42 | - **Row Group**: `ticker` field
43 | - **Aggregation Functions**:
44 | - `price`: Uses 'last' aggregation (shows closing price)
45 | - `pnl`: Uses 'sum' aggregation (totals P&L)
46 |
47 | ## Running the App
48 |
49 | ```bash
50 | # Install dependencies
51 | npm install
52 |
53 | # Start development server
54 | npm start
55 | ```
56 |
57 | The app will be available at `http://localhost:3000`
58 |
59 | ## File Structure
60 |
61 | ```
62 | src/
63 | ├── App.tsx # Main component with AG Grid configuration
64 | ├── dataGenerator.ts # Deterministic data generation logic
65 | ├── styles.css # Application styles
66 | └── index.tsx # React entry point
67 | ```
68 |
69 | ## Key Components
70 |
71 | ### dataGenerator.ts
72 |
73 | - `SeededRandom`: LCG-based pseudo-random number generator
74 | - `generatePositionData()`: Creates position data for a date range
75 | - `getPriceForTickerAndDate()`: Generates deterministic prices ($50-$500)
76 | - `calculatePnL()`: Computes daily P&L as price difference
77 |
78 | ### App.tsx
79 |
80 | - Date range state management with React hooks
81 | - AG Grid configuration with pivot mode enabled
82 | - Column definitions with aggregation functions
83 | - Value formatters for currency display
84 | - Cell class rules for P&L color coding
85 |
86 | ## License
87 |
88 | Created with CodeSandbox
89 |
--------------------------------------------------------------------------------
/src/App.tsx:
--------------------------------------------------------------------------------
1 | 'use client'
2 |
3 | import { useMemo, useCallback, useRef, useState, useEffect } from 'react';
4 | import { AgGridReact } from 'ag-grid-react';
5 | import { AllEnterpriseModule, ColDef, GridOptions, ModuleRegistry } from 'ag-grid-enterprise';
6 | import 'ag-grid-community/styles/ag-grid.css';
7 | import 'ag-grid-community/styles/ag-theme-alpine.css';
8 | import './styles.css';
9 | import { generateBulkData } from './dataGenerator';
10 | import { columnDefs as importedColumnDefs } from './columnDefs';
11 |
12 | ModuleRegistry.registerModules([
13 | AllEnterpriseModule,
14 | ]);
15 |
16 | export default function App() {
17 | const gridRef1 = useRef(null);
18 | const gridRef2 = useRef(null);
19 | const dataLoadTimeRef = useRef(null);
20 |
21 | // Generate 60k rows of data
22 | const data = useMemo(() => {
23 | console.log('Generating 60,000 rows...');
24 | const records = generateBulkData(60000);
25 | console.log('Data generated:', records.length, 'rows');
26 | console.log('First row sample:', records[0]);
27 | return records;
28 | }, []);
29 |
30 | // State to simulate loading - rowData will be null for 1 second, then becomes { records: [...] }
31 | const [rowData, setRowData] = useState<{ records: any[] | undefined } | null>({ records: undefined });
32 | const [grid1LoadTime, setGrid1LoadTime] = useState(null);
33 | const [grid2LoadTime, setGrid2LoadTime] = useState(null);
34 |
35 | useEffect(() => {
36 | // Simulate 1 second loading delay
37 | const timer = setTimeout(() => {
38 | dataLoadTimeRef.current = Date.now();
39 | setRowData({ records: data });
40 | console.log('Data loaded after 1 second delay at:', dataLoadTimeRef.current);
41 | }, 1000);
42 |
43 | return () => clearTimeout(timer);
44 | }, [data]);
45 |
46 | // Use the column definitions from columnDefs.ts
47 | const columnDefs = useMemo(() => importedColumnDefs, []);
48 |
49 | const defaultColDef = useMemo(() => ({
50 | sortable: true,
51 | filter: true,
52 | enableRowGroup: true,
53 | resizable: true,
54 | minWidth: 100,
55 | }), []);
56 |
57 | const gridOptions = useMemo(() => ({
58 | suppressAggFuncInHeader: true,
59 | groupDefaultExpanded: 0, // Start with all groups collapsed
60 | autoGroupColumnDef: {
61 | headerName: 'Group',
62 | minWidth: 300,
63 | cellRendererParams: {
64 | suppressCount: false,
65 | },
66 | },
67 | }), []);
68 |
69 | const onGrid1FirstDataRendered = useCallback((params: any) => {
70 | if (dataLoadTimeRef.current) {
71 | const loadTime = Date.now() - dataLoadTimeRef.current;
72 | setGrid1LoadTime(loadTime);
73 | console.log('Grid 1 first data rendered with', params.api.getDisplayedRowCount(), 'rows. Load time:', loadTime, 'ms');
74 | }
75 | }, []);
76 |
77 | const onGrid2FirstDataRendered = useCallback((params: any) => {
78 | if (dataLoadTimeRef.current) {
79 | const loadTime = Date.now() - dataLoadTimeRef.current;
80 | setGrid2LoadTime(loadTime);
81 | console.log('Grid 2 first data rendered with', params.api.getDisplayedRowCount(), 'rows. Load time:', loadTime, 'ms');
82 | }
83 | }, []);
84 |
85 | const records = rowData?.records || [];
86 | return (
87 |
88 |
89 |
AG Grid Bug Reproduction - 60k Rows (Side by Side)
90 |
91 | {rowData === null
92 | ? '🔄 Loading data...'
93 | : `✅ Two grids loaded with 60,000 rows and ${columnDefs.length} columns for bug testing.`}
94 |
95 |
105 | {rowData === null ? 'Status: Loading...' : 'Status: Data Loaded Successfully'}
106 |
107 |
108 |
109 |
110 |
119 | Grid 1 {grid1LoadTime !== null ? `- Loaded in ${grid1LoadTime}ms` : '- Waiting...'}
120 |
121 |
134 |
135 |
136 |
145 | Grid 2 {grid2LoadTime !== null ? `- Loaded in ${grid2LoadTime}ms` : '- Waiting...'}
146 |
147 |
160 |
161 |
162 |
163 | );
164 | }
165 |
--------------------------------------------------------------------------------
/src/columnDefs.ts:
--------------------------------------------------------------------------------
1 | import { ColDef } from 'ag-grid-enterprise';
2 |
3 | // Simplified column definitions based on columns.md
4 | // Only including the field and headerName for the main columns (not the nested "Garda", "Risk", etc.)
5 | // Note: Using colId and valueGetter because the data structure uses dot notation in field names
6 | export const columnDefs: ColDef[] = [
7 | { field: 'accrual_effect', headerName: 'Accrual Effect' },
8 | { colId: 'Book.Activity', headerName: 'Activity', valueGetter: (params) => params.data?.['Book.Activity'] },
9 | { colId: 'Product.adjusted_maturity_date', headerName: 'Adjusted Maturity Date', valueGetter: (params) => params.data?.['Product.adjusted_maturity_date'] },
10 | { colId: 'Product.adjusted_premium', headerName: 'Adjusted Premium', valueGetter: (params) => params.data?.['Product.adjusted_premium'] },
11 | { colId: 'Product.bbg_ticker', headerName: 'BBG Ticker', valueGetter: (params) => params.data?.['Product.bbg_ticker'] },
12 | { colId: 'Book.BeginLivePricing', headerName: 'BeginLivePricing', valueGetter: (params) => params.data?.['Book.BeginLivePricing'] },
13 | { colId: 'Product.security_cusip', headerName: 'CUSIP', valueGetter: (params) => params.data?.['Product.security_cusip'] },
14 | { colId: 'Book.Category', headerName: 'Category', valueGetter: (params) => params.data?.['Book.Category'] },
15 | { field: 'change_quote_close', headerName: 'Change in Close Quote' },
16 | { field: 'change_nominal', headerName: 'Change in Nominal' },
17 | { field: 'quote_close', headerName: 'Close Quote' },
18 | { colId: 'Book.Code', headerName: 'Code', valueGetter: (params) => params.data?.['Book.Code'] },
19 | { colId: 'Product.executing_party', headerName: 'Counter Party', valueGetter: (params) => params.data?.['Product.executing_party'] },
20 | { colId: 'Product.currency', headerName: 'Currency', valueGetter: (params) => params.data?.['Product.currency'] },
21 | { colId: 'Book.DeltaHedgeFlag', headerName: 'DeltaHedgeFlag', valueGetter: (params) => params.data?.['Book.DeltaHedgeFlag'] },
22 | { colId: 'Book.DominantCountry', headerName: 'Dominant Country', valueGetter: (params) => params.data?.['Book.DominantCountry'], rowGroup: true },
23 | { field: 'end_nominal', headerName: 'End Nominal' },
24 | { field: 'end_price', headerName: 'End Price' },
25 | { field: 'end_quantity', headerName: 'End Quantity' },
26 | { field: 'end_quote', headerName: 'End Quote' },
27 | { field: 'end_settlement_amount', headerName: 'End Settlement Amount' },
28 | { colId: 'Book.Entity', headerName: 'Entity', valueGetter: (params) => params.data?.['Book.Entity'] },
29 | { colId: 'Book.Fund', headerName: 'Fund', valueGetter: (params) => params.data?.['Book.Fund'] },
30 | { field: 'fx_pl_effect', headerName: 'FxPLEffect' },
31 | { field: 'fx_pl_effect_close', headerName: 'FxPLEffect Close' },
32 | { colId: 'Book.CountryRegion', headerName: 'Geography', valueGetter: (params) => params.data?.['Book.CountryRegion'], rowGroup: true },
33 | { field: 'has_strategy_position_changes', headerName: 'Has Position Changes' },
34 | { colId: 'Product.security_isin', headerName: 'ISIN', valueGetter: (params) => params.data?.['Product.security_isin'] },
35 | { colId: 'Product.index_family', headerName: 'Index Family', valueGetter: (params) => params.data?.['Product.index_family'] },
36 | { colId: 'Product.index_series', headerName: 'Index Series', valueGetter: (params) => params.data?.['Product.index_series'] },
37 | { colId: 'Product.index_tenor', headerName: 'Index Tenor', valueGetter: (params) => params.data?.['Product.index_tenor'] },
38 | { field: 'life_cycle_pl', headerName: 'Life Cycle Effect' },
39 | { colId: 'Product.maturity_date', headerName: 'Maturity Date', valueGetter: (params) => params.data?.['Product.maturity_date'] },
40 | { colId: 'Book.Name', headerName: 'Name', valueGetter: (params) => params.data?.['Book.Name'] },
41 | { colId: 'Book.OTLivePxable', headerName: 'OTLivePxAble', valueGetter: (params) => params.data?.['Book.OTLivePxable'] },
42 | { colId: 'Product.option_strike', headerName: 'Option Strike', valueGetter: (params) => params.data?.['Product.option_strike'] },
43 | { colId: 'Product.option_type', headerName: 'Option Type', valueGetter: (params) => params.data?.['Product.option_type'] },
44 | { field: 'pl_base_after_close', headerName: 'PL Base After Close', aggFunc: 'sum' },
45 | { field: 'pl_base_ccy', headerName: 'PL Base Ccy', aggFunc: 'sum' },
46 | { field: 'pl_base_close', headerName: 'PL Base Close', aggFunc: 'sum' },
47 | { field: 'pl_close', headerName: 'PL Close', aggFunc: 'sum' },
48 | { field: 'pl_base', headerName: 'PL Daily', aggFunc: 'sum' },
49 | { field: 'pl_latest', headerName: 'PL Latest', aggFunc: 'sum' },
50 | { colId: 'Product.premium', headerName: 'Premium', valueGetter: (params) => params.data?.['Product.premium'] },
51 | { colId: 'Product.premium_currency', headerName: 'Premium Currency', valueGetter: (params) => params.data?.['Product.premium_currency'] },
52 | { colId: 'Product.premium_date', headerName: 'Premium Date', valueGetter: (params) => params.data?.['Product.premium_date'] },
53 | { colId: 'Product.processing_type', headerName: 'Processing Type', valueGetter: (params) => params.data?.['Product.processing_type'] },
54 | { field: 'prod_id', headerName: 'Prod Id' },
55 | { colId: 'Product.category', headerName: 'Product Category', valueGetter: (params) => params.data?.['Product.category'] },
56 | { colId: 'Product.product_type', headerName: 'Product Type', valueGetter: (params) => params.data?.['Product.product_type'] },
57 | { colId: 'Book.RecapGroup', headerName: 'Recap Group', valueGetter: (params) => params.data?.['Book.RecapGroup'], rowGroup: true },
58 | { colId: 'Book.ReportingGroup', headerName: 'Reporting Group', valueGetter: (params) => params.data?.['Book.ReportingGroup'] },
59 | { colId: 'Book.RiskPod', headerName: 'Risk Pod', valueGetter: (params) => params.data?.['Book.RiskPod'] },
60 | { colId: 'Product.security_default_ticker', headerName: 'Security Default Ticker', valueGetter: (params) => params.data?.['Product.security_default_ticker'] },
61 | { field: 'start_nominal', headerName: 'Start Nominal' },
62 | { field: 'start_price', headerName: 'Start Price' },
63 | { field: 'start_quantity', headerName: 'Start Quantity' },
64 | { field: 'start_quote', headerName: 'Start Quote' },
65 | { colId: 'Book.Strategy', headerName: 'Strategy', valueGetter: (params) => params.data?.['Book.Strategy'], rowGroup: true },
66 | { colId: 'Book.SubActivity', headerName: 'SubActivity', valueGetter: (params) => params.data?.['Book.SubActivity'] },
67 | { colId: 'Book.SubCategory', headerName: 'SubCategory', valueGetter: (params) => params.data?.['Book.SubCategory'] },
68 | { colId: 'Book.SubTheme', headerName: 'SubTheme', valueGetter: (params) => params.data?.['Book.SubTheme'] },
69 | { colId: 'Book.Theme', headerName: 'Theme', valueGetter: (params) => params.data?.['Book.Theme'] },
70 | { colId: 'Product.trade_date', headerName: 'Trade Date', valueGetter: (params) => params.data?.['Product.trade_date'] },
71 | { field: 'trade_id', headerName: 'Trade Id' },
72 | { colId: 'Product.trade_type', headerName: 'Trade Type', valueGetter: (params) => params.data?.['Product.trade_type'] },
73 | { field: 'trader', headerName: 'Trader' },
74 | { colId: 'Product.underlier_info', headerName: 'Underlier Info', valueGetter: (params) => params.data?.['Product.underlier_info'] },
75 | { colId: 'Book.UnderlyingCommodity', headerName: 'Underlying Commodity', valueGetter: (params) => params.data?.['Book.UnderlyingCommodity'] },
76 | ];
77 |
--------------------------------------------------------------------------------
/src/dataGenerator.ts:
--------------------------------------------------------------------------------
1 | // Deterministic random number generator using seed
2 | class SeededRandom {
3 | private seed: number;
4 |
5 | constructor(seed: number) {
6 | this.seed = seed;
7 | }
8 |
9 | next(): number {
10 | // Linear Congruential Generator
11 | this.seed = (this.seed * 1103515245 + 12345) % 2147483648;
12 | return this.seed / 2147483648;
13 | }
14 | }
15 |
16 | export interface BulkRowData {
17 | [key: string]: any;
18 | }
19 |
20 | const ACTIVITIES = ['Trading', 'Hedging', 'Market Making', 'Investment', 'Arbitrage'];
21 | const CURRENCIES = ['USD', 'EUR', 'GBP', 'JPY', 'CHF', 'CAD', 'AUD'];
22 | const PRODUCT_TYPES = ['Bond', 'Swap', 'Option', 'Future', 'Forward', 'Swaption'];
23 | const STRATEGIES = ['Long', 'Short', 'Spread', 'Butterfly', 'Straddle', 'Strangle'];
24 | const ENTITIES = ['Entity_A', 'Entity_B', 'Entity_C', 'Entity_D', 'Entity_E'];
25 | const FUNDS = ['Fund_Alpha', 'Fund_Beta', 'Fund_Gamma', 'Fund_Delta', 'Fund_Epsilon'];
26 | const CATEGORIES = ['Fixed Income', 'Rates', 'Credit', 'Equity', 'FX', 'Commodity'];
27 |
28 | /**
29 | * Generate a random value based on seed
30 | */
31 | function getRandomValue(seed: number, min: number, max: number): number {
32 | const rng = new SeededRandom(seed);
33 | return min + rng.next() * (max - min);
34 | }
35 |
36 | /**
37 | * Generate a random item from array
38 | */
39 | function getRandomItem(seed: number, array: T[]): T {
40 | const rng = new SeededRandom(seed);
41 | const index = Math.floor(rng.next() * array.length);
42 | return array[index];
43 | }
44 |
45 | /**
46 | * Generate a random date string
47 | */
48 | function getRandomDate(seed: number): string {
49 | const rng = new SeededRandom(seed);
50 | const year = 2020 + Math.floor(rng.next() * 5); // 2020-2024
51 | const month = 1 + Math.floor(rng.next() * 12);
52 | const day = 1 + Math.floor(rng.next() * 28);
53 | return `${year}-${String(month).padStart(2, '0')}-${String(day).padStart(2, '0')}`;
54 | }
55 |
56 | /**
57 | * Generate bulk data with 60k+ rows
58 | */
59 | export function generateBulkData(numRows: number = 60000): BulkRowData[] {
60 | const data: BulkRowData[] = [];
61 |
62 | for (let i = 0; i < numRows; i++) {
63 | const seed = i + 1;
64 |
65 | data.push({
66 | // Core fields
67 | trade_id: `TRADE_${i + 1}`,
68 | prod_id: `PROD_${Math.floor(i / 10) + 1}`,
69 |
70 | // Book fields
71 | 'Book.Activity': getRandomItem(seed * 2, ACTIVITIES),
72 | 'Book.BeginLivePricing': `${String(9 + Math.floor(getRandomValue(seed * 52, 0, 8))).padStart(2, '0')}:${String(Math.floor(getRandomValue(seed * 53, 0, 60))).padStart(2, '0')}:00`,
73 | 'Book.Category': getRandomItem(seed * 3, CATEGORIES),
74 | 'Book.Code': `BOOK_${Math.floor(i / 100) + 1}`,
75 | 'Book.DeltaHedgeFlag': getRandomItem(seed * 4, ['Y', 'N']),
76 | 'Book.DominantCountry': getRandomItem(seed * 5, ['US', 'UK', 'JP', 'DE', 'FR']),
77 | 'Book.Entity': getRandomItem(seed * 6, ENTITIES),
78 | 'Book.Fund': getRandomItem(seed * 7, FUNDS),
79 | 'Book.CountryRegion': getRandomItem(seed * 8, ['North America', 'Europe', 'Asia', 'LATAM']),
80 | 'Book.Name': `Book_${Math.floor(i / 50) + 1}`,
81 | 'Book.OTLivePxable': getRandomItem(seed * 9, ['Y', 'N']),
82 | 'Book.RecapGroup': `RecapGroup_${Math.floor(i / 200) + 1}`,
83 | 'Book.ReportingGroup': `ReportingGroup_${Math.floor(i / 150) + 1}`,
84 | 'Book.RiskPod': `RiskPod_${Math.floor(i / 100) + 1}`,
85 | 'Book.Strategy': getRandomItem(seed * 10, STRATEGIES),
86 | 'Book.SubActivity': `SubActivity_${Math.floor(i / 300) + 1}`,
87 | 'Book.SubCategory': `SubCategory_${Math.floor(i / 250) + 1}`,
88 | 'Book.SubTheme': `SubTheme_${Math.floor(i / 400) + 1}`,
89 | 'Book.Theme': `Theme_${Math.floor(i / 500) + 1}`,
90 | 'Book.UnderlyingCommodity': getRandomItem(seed * 11, ['Gold', 'Oil', 'Gas', 'Corn', 'Wheat', 'N/A']),
91 |
92 | // Product fields
93 | 'Product.adjusted_maturity_date': getRandomDate(seed * 12),
94 | 'Product.adjusted_premium': getRandomValue(seed * 13, -10000, 10000),
95 | 'Product.bbg_ticker': `BBG_${Math.floor(i / 20) + 1}`,
96 | 'Product.security_cusip': `CUSIP${String(Math.floor(i / 30) + 1).padStart(6, '0')}`,
97 | 'Product.executing_party': `Party_${Math.floor(i / 80) + 1}`,
98 | 'Product.currency': getRandomItem(seed * 14, CURRENCIES),
99 | 'Product.security_isin': `ISIN${String(Math.floor(i / 25) + 1).padStart(9, '0')}`,
100 | 'Product.index_family': getRandomItem(seed * 15, ['SOFR', 'LIBOR', 'EURIBOR', 'SONIA', 'N/A']),
101 | 'Product.index_series': getRandomValue(seed * 16, 1, 10),
102 | 'Product.index_tenor': getRandomItem(seed * 17, ['1M', '3M', '6M', '1Y', '2Y', '5Y', '10Y']),
103 | 'Product.maturity_date': getRandomDate(seed * 18),
104 | 'Product.option_strike': getRandomValue(seed * 19, 50, 200),
105 | 'Product.option_type': getRandomItem(seed * 20, ['Call', 'Put', 'N/A']),
106 | 'Product.premium': getRandomValue(seed * 21, -50000, 50000),
107 | 'Product.premium_currency': getRandomItem(seed * 22, CURRENCIES),
108 | 'Product.premium_date': getRandomDate(seed * 23),
109 | 'Product.processing_type': getRandomItem(seed * 24, ['Live', 'End of Day', 'Intraday']),
110 | 'Product.category': getRandomItem(seed * 25, CATEGORIES),
111 | 'Product.product_type': getRandomItem(seed * 26, PRODUCT_TYPES),
112 | 'Product.security_default_ticker': `TICKER_${Math.floor(i / 15) + 1}`,
113 | 'Product.trade_date': getRandomDate(seed * 27),
114 | 'Product.trade_type': getRandomItem(seed * 28, ['Buy', 'Sell', 'Exercise', 'Assign']),
115 | 'Product.underlier_info': `Underlier_${Math.floor(i / 60) + 1}`,
116 |
117 | // Measure fields - PL and amounts
118 | accrual_effect: getRandomValue(seed * 29, -10000, 10000),
119 | change_quote_close: getRandomValue(seed * 30, -5, 5),
120 | change_nominal: getRandomValue(seed * 31, -100000, 100000),
121 | quote_close: getRandomValue(seed * 32, 95, 105),
122 | end_nominal: getRandomValue(seed * 33, 1000000, 10000000),
123 | end_price: getRandomValue(seed * 34, 95, 105),
124 | end_quantity: getRandomValue(seed * 35, 1000, 100000),
125 | end_quote: getRandomValue(seed * 36, 95, 105),
126 | end_settlement_amount: getRandomValue(seed * 37, -100000, 100000),
127 | fx_pl_effect: getRandomValue(seed * 38, -5000, 5000),
128 | fx_pl_effect_close: getRandomValue(seed * 39, -5000, 5000),
129 | life_cycle_pl: getRandomValue(seed * 40, -10000, 10000),
130 | pl_base_after_close: getRandomValue(seed * 41, -20000, 20000),
131 | pl_base_ccy: getRandomValue(seed * 42, -50000, 50000),
132 | pl_base_close: getRandomValue(seed * 43, -30000, 30000),
133 | pl_close: getRandomValue(seed * 44, -25000, 25000),
134 | pl_base: getRandomValue(seed * 45, -40000, 40000),
135 | pl_latest: getRandomValue(seed * 46, -35000, 35000),
136 | start_nominal: getRandomValue(seed * 47, 1000000, 10000000),
137 | start_price: getRandomValue(seed * 48, 95, 105),
138 | start_quantity: getRandomValue(seed * 49, 1000, 100000),
139 | start_quote: getRandomValue(seed * 50, 95, 105),
140 |
141 | // Other fields
142 | has_strategy_position_changes: getRandomItem(seed * 51, ['Y', 'N']),
143 | trader: `Trader_${Math.floor(i / 500) + 1}`,
144 | });
145 | }
146 |
147 | return data;
148 | }
149 |
--------------------------------------------------------------------------------
/columns.md:
--------------------------------------------------------------------------------
1 | # AG Grid Column Defs
2 | [
3 | {
4 | "colId": "accrual_effect",
5 | "headerName": "Accrual Effect",
6 | "field": "accrual_effect",
7 | "type": [
8 | "Measure",
9 | "Round"
10 | ]
11 | },
12 | {
13 | "colId": "Book.Activity",
14 | "field": "Book.Activity",
15 | "headerName": "Activity",
16 | "type": [
17 | "Dimension"
18 | ]
19 | },
20 | {
21 | "colId": "adjusted_maturity_date",
22 | "headerName": "Adjusted Maturity Date",
23 | "field": "Product.adjusted_maturity_date",
24 | "type": [
25 | "Dimension",
26 | "DateColumn"
27 | ]
28 | },
29 | {
30 | "colId": "adjusted_premium",
31 | "headerName": "Adjusted Premium",
32 | "field": "Product.adjusted_premium",
33 | "type": [
34 | "Measure",
35 | "Round"
36 | ]
37 | },
38 | {
39 | "colId": "bbg_ticker",
40 | "headerName": "BBG Ticker",
41 | "field": "Product.bbg_ticker",
42 | "type": [
43 | "Dimension"
44 | ]
45 | },
46 | {
47 | "colId": "Book.BeginLivePricing",
48 | "field": "Book.BeginLivePricing",
49 | "headerName": "BeginLivePricing",
50 | "type": [
51 | "Dimension",
52 | "TimeOnlyColumn"
53 | ]
54 | },
55 | {
56 | "colId": "security_cusip",
57 | "headerName": "CUSIP",
58 | "field": "Product.security_cusip",
59 | "type": [
60 | "Dimension"
61 | ]
62 | },
63 | {
64 | "colId": "Book.Category",
65 | "field": "Book.Category",
66 | "headerName": "Category",
67 | "type": [
68 | "Dimension"
69 | ]
70 | },
71 | {
72 | "colId": "change_quote_close",
73 | "field": "change_quote_close",
74 | "headerName": "Change in Close Quote",
75 | "headerTooltip": "End Quote - Close Quote",
76 | "type": [
77 | "Measure",
78 | "Round"
79 | ],
80 | "valueFormatter": ""
81 | },
82 | {
83 | "colId": "change_nominal",
84 | "field": "change_nominal",
85 | "headerName": "Change in Nominal",
86 | "type": [
87 | "Measure",
88 | "DecimalVariable"
89 | ]
90 | },
91 | {
92 | "colId": "quote_close",
93 | "field": "quote_close",
94 | "headerName": "Close Quote",
95 | "type": [
96 | "Measure",
97 | "Round"
98 | ],
99 | "valueFormatter": ""
100 | },
101 | {
102 | "colId": "Book.Code",
103 | "field": "Book.Code",
104 | "headerName": "Code",
105 | "type": [
106 | "Dimension"
107 | ]
108 | },
109 | {
110 | "colId": "executing_party",
111 | "headerName": "Counter Party",
112 | "field": "Product.executing_party",
113 | "type": [
114 | "Dimension"
115 | ]
116 | },
117 | {
118 | "colId": "currency",
119 | "headerName": "Currency",
120 | "field": "Product.currency",
121 | "type": [
122 | "Dimension"
123 | ]
124 | },
125 | {
126 | "colId": "Book.DeltaHedgeFlag",
127 | "field": "Book.DeltaHedgeFlag",
128 | "headerName": "DeltaHedgeFlag",
129 | "type": [
130 | "Dimension"
131 | ]
132 | },
133 | {
134 | "colId": "book_dominant_country",
135 | "headerName": "Dominant Country",
136 | "field": "Book.DominantCountry",
137 | "type": [
138 | "Dimension"
139 | ]
140 | },
141 | {
142 | "colId": "end_nominal",
143 | "headerName": "End Nominal",
144 | "field": "end_nominal",
145 | "type": [
146 | "Measure",
147 | "DecimalVariable"
148 | ]
149 | },
150 | {
151 | "colId": "end_price",
152 | "headerName": "End Price",
153 | "field": "end_price",
154 | "type": [
155 | "Measure"
156 | ]
157 | },
158 | {
159 | "colId": "end_quantity",
160 | "headerName": "End Quantity",
161 | "field": "end_quantity",
162 | "type": [
163 | "Measure",
164 | "DecimalVariable"
165 | ]
166 | },
167 | {
168 | "colId": "end_quote",
169 | "field": "end_quote",
170 | "headerName": "End Quote",
171 | "type": [
172 | "Measure",
173 | "Round"
174 | ],
175 | "valueFormatter": ""
176 | },
177 | {
178 | "colId": "end_settlement_amount",
179 | "headerName": "End Settlement Amount",
180 | "field": "end_settlement_amount",
181 | "type": [
182 | "Measure",
183 | "Round"
184 | ]
185 | },
186 | {
187 | "colId": "Book.Entity",
188 | "field": "Book.Entity",
189 | "headerName": "Entity",
190 | "type": [
191 | "Dimension"
192 | ]
193 | },
194 | {
195 | "colId": "Book.Fund",
196 | "field": "Book.Fund",
197 | "headerName": "Fund",
198 | "type": [
199 | "Dimension"
200 | ]
201 | },
202 | {
203 | "colId": "fx_pl_effect",
204 | "headerName": "FxPLEffect",
205 | "field": "fx_pl_effect",
206 | "type": [
207 | "Measure",
208 | "Round"
209 | ]
210 | },
211 | {
212 | "colId": "fx_pl_effect_close",
213 | "headerName": "FxPLEffect Close",
214 | "field": "fx_pl_effect_close",
215 | "type": [
216 | "Measure",
217 | "Round"
218 | ]
219 | },
220 | {
221 | "colId": "geo",
222 | "headerName": "Geography",
223 | "field": "Book.CountryRegion",
224 | "type": [
225 | "Dimension"
226 | ]
227 | },
228 | {
229 | "colId": "has_strategy_position_changes",
230 | "headerName": "Has Position Changes",
231 | "field": "has_strategy_position_changes",
232 | "type": [
233 | "Dimension"
234 | ]
235 | },
236 | {
237 | "colId": "security_isin",
238 | "headerName": "ISIN",
239 | "field": "Product.security_isin",
240 | "type": [
241 | "Dimension"
242 | ]
243 | },
244 | {
245 | "colId": "index_family",
246 | "headerName": "Index Family",
247 | "field": "Product.index_family",
248 | "type": [
249 | "Dimension"
250 | ]
251 | },
252 | {
253 | "colId": "index_series",
254 | "headerName": "Index Series",
255 | "field": "Product.index_series",
256 | "type": [
257 | "Measure"
258 | ]
259 | },
260 | {
261 | "colId": "index_tenor",
262 | "headerName": "Index Tenor",
263 | "field": "Product.index_tenor",
264 | "type": [
265 | "Dimension"
266 | ]
267 | },
268 | {
269 | "colId": "life_cycle_pl",
270 | "headerName": "Life Cycle Effect",
271 | "field": "life_cycle_pl",
272 | "type": [
273 | "Measure",
274 | "Round"
275 | ]
276 | },
277 | {
278 | "colId": "maturity_date",
279 | "headerName": "Maturity Date",
280 | "field": "Product.maturity_date",
281 | "type": [
282 | "Dimension",
283 | "DateColumn"
284 | ]
285 | },
286 | {
287 | "colId": "Book.Name",
288 | "field": "Book.Name",
289 | "headerName": "Name",
290 | "type": [
291 | "Dimension"
292 | ]
293 | },
294 | {
295 | "colId": "ot_live_pxable",
296 | "headerName": "OTLivePxAble",
297 | "field": "Book.OTLivePxable",
298 | "type": [
299 | "Dimension"
300 | ]
301 | },
302 | {
303 | "colId": "option_strike",
304 | "headerName": "Option Strike",
305 | "field": "Product.option_strike",
306 | "type": [
307 | "Measure",
308 | "DecimalVariableFourDecimals"
309 | ]
310 | },
311 | {
312 | "colId": "option_type",
313 | "headerName": "Option Type",
314 | "field": "Product.option_type",
315 | "type": [
316 | "Dimension"
317 | ]
318 | },
319 | {
320 | "colId": "pl_base_after_close",
321 | "headerName": "PL Base After Close",
322 | "field": "pl_base_after_close",
323 | "headerTooltip": "PL Base After Close = PL Daily - PL Base Close",
324 | "type": [
325 | "Measure",
326 | "Round",
327 | "InitWidthSmall"
328 | ]
329 | },
330 | {
331 | "colId": "pl_base_ccy",
332 | "headerName": "PL Base Ccy",
333 | "field": "pl_base_ccy",
334 | "type": [
335 | "Measure",
336 | "Round"
337 | ]
338 | },
339 | {
340 | "colId": "pl_base_close",
341 | "headerName": "PL Base Close",
342 | "field": "pl_base_close",
343 | "type": [
344 | "Measure",
345 | "Round",
346 | "InitWidthSmall"
347 | ]
348 | },
349 | {
350 | "colId": "pl_close",
351 | "headerName": "PL Close",
352 | "field": "pl_close",
353 | "type": [
354 | "Measure",
355 | "Round"
356 | ]
357 | },
358 | {
359 | "colId": "pl_base",
360 | "headerName": "PL Daily",
361 | "field": "pl_base",
362 | "type": [
363 | "Measure",
364 | "Round",
365 | "InitWidthSmall"
366 | ]
367 | },
368 | {
369 | "colId": "pl_latest",
370 | "headerName": "PL Latest",
371 | "field": "pl_latest",
372 | "headerTooltip": "PL Latest = PL Base Close || PL Daily || 0",
373 | "type": [
374 | "Measure",
375 | "Round",
376 | "InitWidthSmall"
377 | ]
378 | },
379 | {
380 | "colId": "premium",
381 | "headerName": "Premium",
382 | "field": "Product.premium",
383 | "type": [
384 | "Measure",
385 | "Round"
386 | ]
387 | },
388 | {
389 | "colId": "premium_currency",
390 | "headerName": "Premium Currency",
391 | "field": "Product.premium_currency",
392 | "type": [
393 | "Dimension"
394 | ]
395 | },
396 | {
397 | "colId": "premium_date",
398 | "headerName": "Premium Date",
399 | "field": "Product.premium_date",
400 | "type": [
401 | "Dimension",
402 | "DateColumn"
403 | ]
404 | },
405 | {
406 | "colId": "processing_type",
407 | "headerName": "Processing Type",
408 | "field": "Product.processing_type",
409 | "type": [
410 | "Dimension"
411 | ]
412 | },
413 | {
414 | "colId": "prod_id",
415 | "headerName": "Prod Id",
416 | "field": "prod_id",
417 | "type": [
418 | "Dimension"
419 | ]
420 | },
421 | {
422 | "colId": "product_category",
423 | "headerName": "Product Category",
424 | "field": "Product.category",
425 | "type": [
426 | "Dimension"
427 | ]
428 | },
429 | {
430 | "colId": "product_type",
431 | "headerName": "Product Type",
432 | "field": "Product.product_type",
433 | "type": [
434 | "Dimension"
435 | ]
436 | },
437 | {
438 | "colId": "book_recap_group",
439 | "headerName": "Recap Group",
440 | "field": "Book.RecapGroup",
441 | "type": [
442 | "Dimension"
443 | ]
444 | },
445 | {
446 | "colId": "Book.ReportingGroup",
447 | "field": "Book.ReportingGroup",
448 | "headerName": "Reporting Group",
449 | "type": [
450 | "Dimension"
451 | ]
452 | },
453 | {
454 | "colId": "Book.RiskPod",
455 | "field": "Book.RiskPod",
456 | "headerName": "Risk Pod",
457 | "type": [
458 | "Dimension"
459 | ]
460 | },
461 | {
462 | "colId": "security_default_ticker",
463 | "headerName": "Security Default Ticker",
464 | "field": "Product.security_default_ticker",
465 | "type": [
466 | "Dimension"
467 | ]
468 | },
469 | {
470 | "colId": "start_nominal",
471 | "headerName": "Start Nominal",
472 | "field": "start_nominal",
473 | "type": [
474 | "Measure",
475 | "DecimalVariable"
476 | ]
477 | },
478 | {
479 | "colId": "start_price",
480 | "field": "start_price",
481 | "headerName": "Start Price",
482 | "type": [
483 | "Measure"
484 | ]
485 | },
486 | {
487 | "colId": "start_quantity",
488 | "headerName": "Start Quantity",
489 | "field": "start_quantity",
490 | "type": [
491 | "Measure",
492 | "DecimalVariable"
493 | ]
494 | },
495 | {
496 | "colId": "start_quote",
497 | "field": "start_quote",
498 | "headerName": "Start Quote",
499 | "type": [
500 | "Measure",
501 | "Round"
502 | ],
503 | "valueFormatter": ""
504 | },
505 | {
506 | "colId": "book_strategy",
507 | "headerName": "Strategy",
508 | "filter": {},
509 | "field": "Book.Strategy",
510 | "type": [
511 | "Dimension"
512 | ]
513 | },
514 | {
515 | "colId": "Book.SubActivity",
516 | "field": "Book.SubActivity",
517 | "headerName": "SubActivity",
518 | "type": [
519 | "Dimension"
520 | ]
521 | },
522 | {
523 | "colId": "Book.SubCategory",
524 | "field": "Book.SubCategory",
525 | "headerName": "SubCategory",
526 | "type": [
527 | "Dimension"
528 | ]
529 | },
530 | {
531 | "colId": "Book.SubTheme",
532 | "field": "Book.SubTheme",
533 | "headerName": "SubTheme",
534 | "type": [
535 | "Dimension"
536 | ]
537 | },
538 | {
539 | "colId": "Book.Theme",
540 | "field": "Book.Theme",
541 | "headerName": "Theme",
542 | "type": [
543 | "Dimension"
544 | ]
545 | },
546 | {
547 | "colId": "trade_date",
548 | "headerName": "Trade Date",
549 | "field": "Product.trade_date",
550 | "type": [
551 | "Dimension",
552 | "DateColumn"
553 | ]
554 | },
555 | {
556 | "colId": "trade_id",
557 | "headerName": "Trade Id",
558 | "field": "trade_id",
559 | "type": [
560 | "Dimension"
561 | ]
562 | },
563 | {
564 | "colId": "trade_type",
565 | "headerName": "Trade Type",
566 | "field": "Product.trade_type",
567 | "type": [
568 | "Dimension"
569 | ]
570 | },
571 | {
572 | "colId": "book_trader",
573 | "headerName": "Trader",
574 | "field": "trader",
575 | "type": [
576 | "Dimension"
577 | ]
578 | },
579 | {
580 | "colId": "underlier_info",
581 | "headerName": "Underlier Info",
582 | "field": "Product.underlier_info",
583 | "type": [
584 | "Dimension"
585 | ]
586 | },
587 | {
588 | "colId": "Book.UnderlyingCommodity",
589 | "field": "Book.UnderlyingCommodity",
590 | "headerName": "Underlying Commodity",
591 | "type": [
592 | "Dimension"
593 | ]
594 | },
595 | {
596 | "headerName": "Garda",
597 | "children": [
598 | {
599 | "colId": "change_gcp_base_bpv",
600 | "headerName": "Change GCP Base BPV",
601 | "field": "change_gcp_base_bpv",
602 | "type": [
603 | "Measure",
604 | "Round",
605 | "InitWidthSmall"
606 | ]
607 | },
608 | {
609 | "colId": "gcp_base_bpv",
610 | "headerName": "GCP Base BPV",
611 | "field": "gcp_base_bpv",
612 | "type": [
613 | "Measure",
614 | "Round",
615 | "InitWidthSmall"
616 | ]
617 | },
618 | {
619 | "colId": "gcp_desk_product_ref",
620 | "headerName": "GCP Desk Product Ref",
621 | "field": "Product.gcp_desk_product_ref",
622 | "type": [
623 | "Dimension"
624 | ]
625 | },
626 | {
627 | "colId": "gcp_risk_description",
628 | "headerName": "GCP Risk Desc",
629 | "field": "Product.gcp_risk_description",
630 | "type": [
631 | "Dimension"
632 | ]
633 | },
634 | {
635 | "colId": "gcp_start_yield",
636 | "headerName": "GCP Start Yield",
637 | "field": "gcp_start_yield",
638 | "type": [
639 | "Measure",
640 | "DecimalPercentage"
641 | ]
642 | },
643 | {
644 | "colId": "gcp_tenor",
645 | "headerName": "GCP Tenor",
646 | "field": "Product.gcp_tenor",
647 | "type": [
648 | "Dimension"
649 | ]
650 | },
651 | {
652 | "colId": "gcp_is_externally_priced",
653 | "headerName": "GcpIsExternallyPriced",
654 | "field": "gcp_is_externally_priced",
655 | "type": [
656 | "Dimension"
657 | ]
658 | },
659 | {
660 | "colId": "start_gcp_base_bpv",
661 | "headerName": "Start GCP Base BPV",
662 | "field": "start_gcp_base_bpv",
663 | "type": [
664 | "Measure",
665 | "Round",
666 | "InitWidthSmall"
667 | ]
668 | },
669 | {
670 | "colId": "gcp_base_balance_sheet",
671 | "headerName": "gcpBaseBalanceSheet",
672 | "field": "gcp_base_balance_sheet",
673 | "type": [
674 | "Measure",
675 | "Round",
676 | "InitWidthMedium"
677 | ]
678 | },
679 | {
680 | "colId": "gcp_base_basis_01",
681 | "headerName": "gcpBaseBasis01",
682 | "field": "gcp_base_basis_01",
683 | "type": [
684 | "Measure",
685 | "Round",
686 | "InitWidthMedium"
687 | ]
688 | },
689 | {
690 | "colId": "gcp_base_discount_01",
691 | "headerName": "gcpBaseDiscount01",
692 | "field": "gcp_base_discount_01",
693 | "type": [
694 | "Measure",
695 | "Round",
696 | "InitWidthMedium"
697 | ]
698 | },
699 | {
700 | "colId": "gcp_base_fx_delta",
701 | "headerName": "gcpBaseFXDelta",
702 | "field": "gcp_base_fx_delta",
703 | "type": [
704 | "Measure",
705 | "Round",
706 | "InitWidthMedium"
707 | ]
708 | },
709 | {
710 | "colId": "gcp_base_fixing_01",
711 | "headerName": "gcpBaseFixing01",
712 | "field": "gcp_base_fixing_01",
713 | "type": [
714 | "Measure",
715 | "Round",
716 | "InitWidthMedium"
717 | ]
718 | },
719 | {
720 | "colId": "gcp_base_float_01",
721 | "headerName": "gcpBaseFloat01",
722 | "field": "gcp_base_float_01",
723 | "type": [
724 | "Measure",
725 | "Round",
726 | "InitWidthMedium"
727 | ]
728 | },
729 | {
730 | "colId": "gcp_base_funding_01",
731 | "headerName": "gcpBaseFunding01",
732 | "field": "gcp_base_funding_01",
733 | "type": [
734 | "Measure",
735 | "Round",
736 | "InitWidthMedium"
737 | ]
738 | },
739 | {
740 | "colId": "gcp_base_future_repo_01",
741 | "headerName": "gcpBaseFutureRepo01",
742 | "field": "gcp_base_future_repo_01",
743 | "type": [
744 | "Measure",
745 | "Round",
746 | "InitWidthMedium"
747 | ]
748 | },
749 | {
750 | "colId": "gcp_base_future_spot_01",
751 | "headerName": "gcpBaseFutureSpot01",
752 | "field": "gcp_base_future_spot_01",
753 | "type": [
754 | "Measure",
755 | "Round",
756 | "InitWidthMedium"
757 | ]
758 | },
759 | {
760 | "colId": "gcp_base_future_spot_01_fixed_irr",
761 | "headerName": "gcpBaseFutureSpot01FixedIrr",
762 | "field": "gcp_base_future_spot_01_fixed_irr",
763 | "type": [
764 | "Measure",
765 | "Round"
766 | ]
767 | },
768 | {
769 | "colId": "gcp_base_implied_repo_pnl",
770 | "headerName": "gcpBaseImpliedRepoPnl",
771 | "field": "gcp_base_implied_repo_pnl",
772 | "type": [
773 | "Measure",
774 | "Round",
775 | "InitWidthMedium"
776 | ]
777 | },
778 | {
779 | "colId": "gcp_base_maturity_01",
780 | "headerName": "gcpBaseMaturity01",
781 | "field": "gcp_base_maturity_01",
782 | "type": [
783 | "Measure",
784 | "Round",
785 | "InitWidthMedium"
786 | ]
787 | },
788 | {
789 | "colId": "gcp_base_maturity_01_fixed_irr",
790 | "headerName": "gcpBaseMaturity01FixedIrr",
791 | "field": "gcp_base_maturity_01_fixed_irr",
792 | "type": [
793 | "Measure",
794 | "Round"
795 | ]
796 | },
797 | {
798 | "colId": "gcp_base_maturity_01_fixed_irr_ctd",
799 | "headerName": "gcpBaseMaturity01FixedIrrCtD",
800 | "field": "gcp_base_maturity_01_fixed_irr_ctd",
801 | "type": [
802 | "Measure",
803 | "Round"
804 | ]
805 | },
806 | {
807 | "colId": "gcp_base_par_coupon_01",
808 | "headerName": "gcpBaseParCoupon01",
809 | "field": "gcp_base_par_coupon_01",
810 | "type": [
811 | "Measure",
812 | "Round",
813 | "InitWidthMedium"
814 | ]
815 | },
816 | {
817 | "colId": "gcp_base_repo_01",
818 | "headerName": "gcpBaseRepo01",
819 | "field": "gcp_base_repo_01",
820 | "type": [
821 | "Measure",
822 | "Round",
823 | "InitWidthMedium"
824 | ]
825 | },
826 | {
827 | "colId": "gcp_base_simple_yield_01",
828 | "headerName": "gcpBaseSimpleYield01",
829 | "field": "gcp_base_simple_yield_01",
830 | "type": [
831 | "Measure",
832 | "Round",
833 | "InitWidthMedium"
834 | ]
835 | },
836 | {
837 | "colId": "gcp_base_swap_funding_01",
838 | "headerName": "gcpBaseSwapFunding01",
839 | "field": "gcp_base_swap_funding_01",
840 | "type": [
841 | "Measure",
842 | "Round",
843 | "InitWidthMedium"
844 | ]
845 | },
846 | {
847 | "colId": "change_gcp_base_funding_01",
848 | "headerName": "gcpChangeBaseFunding01",
849 | "field": "change_gcp_base_funding_01",
850 | "type": [
851 | "Measure",
852 | "Round",
853 | "InitWidthMedium"
854 | ]
855 | },
856 | {
857 | "colId": "change_gcp_base_maturity_01",
858 | "headerName": "gcpChangeBaseMaturity01",
859 | "field": "change_gcp_base_maturity_01",
860 | "type": [
861 | "Measure",
862 | "Round",
863 | "InitWidthMedium"
864 | ]
865 | },
866 | {
867 | "colId": "change_gcp_base_maturity_01_fixed_irr",
868 | "headerName": "gcpChangeBaseMaturity01FixedIrr",
869 | "field": "change_gcp_base_maturity_01_fixed_irr",
870 | "type": [
871 | "Measure",
872 | "Round"
873 | ]
874 | },
875 | {
876 | "colId": "change_gcp_funding_01",
877 | "headerName": "gcpChangeFunding01",
878 | "field": "change_gcp_funding_01",
879 | "type": [
880 | "Measure",
881 | "Round",
882 | "InitWidthMedium"
883 | ]
884 | },
885 | {
886 | "colId": "change_gcp_maturity_01",
887 | "headerName": "gcpChangeMaturity01",
888 | "field": "change_gcp_maturity_01",
889 | "type": [
890 | "Measure",
891 | "Round",
892 | "InitWidthMedium"
893 | ]
894 | },
895 | {
896 | "colId": "gcp_cmdty_fut_01",
897 | "headerName": "gcpCmdtyFut01",
898 | "field": "gcp_cmdty_fut_01",
899 | "type": [
900 | "Measure",
901 | "Round"
902 | ]
903 | },
904 | {
905 | "colId": "gcp_convexity_effect",
906 | "headerName": "gcpConvexityEffect",
907 | "field": "gcp_convexity_effect",
908 | "type": [
909 | "Measure",
910 | "Round"
911 | ]
912 | },
913 | {
914 | "colId": "gcp_end_clean_price",
915 | "headerName": "gcpEndCleanPrice",
916 | "field": "gcp_end_clean_price",
917 | "type": [
918 | "Measure",
919 | "Decimal",
920 | "InitWidthMedium"
921 | ]
922 | },
923 | {
924 | "colId": "gcp_end_implied_repo",
925 | "headerName": "gcpEndImpliedRepo",
926 | "field": "gcp_end_implied_repo",
927 | "type": [
928 | "Measure",
929 | "Decimal",
930 | "InitWidthMedium"
931 | ]
932 | },
933 | {
934 | "colId": "gcp_end_inv_spread_bps",
935 | "headerName": "gcpEndInvSpreadBps",
936 | "field": "gcp_end_inv_spread_bps",
937 | "type": [
938 | "Measure",
939 | "Decimal",
940 | "InitWidthMedium"
941 | ]
942 | },
943 | {
944 | "colId": "gcp_end_ois_inv_spread_bps",
945 | "headerName": "gcpEndOisInvSpreadBps",
946 | "field": "gcp_end_ois_inv_spread_bps",
947 | "type": [
948 | "Measure",
949 | "Decimal",
950 | "InitWidthMedium"
951 | ]
952 | },
953 | {
954 | "colId": "gcp_end_ois_par_rate_at_spot",
955 | "headerName": "gcpEndOisParRateAtSpot",
956 | "field": "gcp_end_ois_par_rate_at_spot",
957 | "type": [
958 | "Measure",
959 | "DecimalPercentage",
960 | "InitWidthMedium"
961 | ]
962 | },
963 | {
964 | "colId": "gcp_end_ois_spread_to_par_bps",
965 | "headerName": "gcpEndOisSpreadToParBps",
966 | "field": "gcp_end_ois_spread_to_par_bps",
967 | "type": [
968 | "Measure",
969 | "Decimal",
970 | "InitWidthMedium"
971 | ]
972 | },
973 | {
974 | "colId": "gcp_end_par_rate_at_spot",
975 | "headerName": "gcpEndParRateAtSpot",
976 | "field": "gcp_end_par_rate_at_spot",
977 | "type": [
978 | "Measure",
979 | "DecimalPercentage",
980 | "InitWidthMedium"
981 | ]
982 | },
983 | {
984 | "colId": "gcp_end_quote_ticks",
985 | "headerName": "gcpEndQuoteTicks",
986 | "field": "gcp_end_quote_ticks",
987 | "type": [
988 | "Dimension"
989 | ]
990 | },
991 | {
992 | "colId": "gcp_end_sofr_inv_spread_bps",
993 | "headerName": "gcpEndSofrInvSpreadBps",
994 | "field": "gcp_end_sofr_inv_spread_bps",
995 | "type": [
996 | "Measure",
997 | "Decimal",
998 | "InitWidthMedium"
999 | ]
1000 | },
1001 | {
1002 | "colId": "gcp_end_sofr_par_rate_at_spot",
1003 | "headerName": "gcpEndSofrParRateAtSpot",
1004 | "field": "gcp_end_sofr_par_rate_at_spot",
1005 | "type": [
1006 | "Measure",
1007 | "DecimalPercentage",
1008 | "InitWidthMedium"
1009 | ]
1010 | },
1011 | {
1012 | "colId": "gcp_end_sofr_spread_to_par_bps",
1013 | "headerName": "gcpEndSofrSpreadToParBps",
1014 | "field": "gcp_end_sofr_spread_to_par_bps",
1015 | "type": [
1016 | "Measure",
1017 | "Decimal",
1018 | "InitWidthMedium"
1019 | ]
1020 | },
1021 | {
1022 | "colId": "gcp_end_spread_to_par_bps",
1023 | "headerName": "gcpEndSpreadToParBps",
1024 | "field": "gcp_end_spread_to_par_bps",
1025 | "type": [
1026 | "Measure",
1027 | "Decimal",
1028 | "InitWidthMedium"
1029 | ]
1030 | },
1031 | {
1032 | "colId": "gcp_exercise_settlement_type",
1033 | "headerName": "gcpExerciseSettlementType",
1034 | "field": "Product.gcp_exercise_settlement_type",
1035 | "type": [
1036 | "Dimension"
1037 | ]
1038 | },
1039 | {
1040 | "colId": "gcp_funding_01",
1041 | "headerName": "gcpFunding01",
1042 | "field": "gcp_funding_01",
1043 | "type": [
1044 | "Measure",
1045 | "Round",
1046 | "InitWidthMedium"
1047 | ]
1048 | },
1049 | {
1050 | "colId": "gcp_future_spot_01_fixed_irr",
1051 | "headerName": "gcpFutureSpot01FixedIrr",
1052 | "field": "gcp_future_spot_01_fixed_irr",
1053 | "type": [
1054 | "Measure",
1055 | "Round"
1056 | ]
1057 | },
1058 | {
1059 | "colId": "gcp_fx_delta",
1060 | "headerName": "gcpFxDelta",
1061 | "field": "gcp_fx_delta",
1062 | "type": [
1063 | "Measure",
1064 | "Round",
1065 | "InitWidthMedium"
1066 | ]
1067 | },
1068 | {
1069 | "colId": "gcp_fx_fixing",
1070 | "headerName": "gcpFxFixing",
1071 | "field": "Product.gcp_fx_fixing",
1072 | "type": [
1073 | "Dimension"
1074 | ]
1075 | },
1076 | {
1077 | "colId": "gcp_fx_spot_rate",
1078 | "headerName": "gcpFxSpotRate",
1079 | "field": "gcp_fx_spot_rate",
1080 | "type": [
1081 | "Measure",
1082 | "Decimal"
1083 | ]
1084 | },
1085 | {
1086 | "colId": "gcp_gross_balance_sheet",
1087 | "headerName": "gcpGrossBalanceSheet",
1088 | "field": "gcp_gross_balance_sheet",
1089 | "type": [
1090 | "Measure",
1091 | "Round"
1092 | ]
1093 | },
1094 | {
1095 | "colId": "gcp_implied_repo_change_bps",
1096 | "headerName": "gcpImpliedRepoChangeBps",
1097 | "field": "gcp_implied_repo_change_bps",
1098 | "type": [
1099 | "Measure",
1100 | "Decimal",
1101 | "InitWidthMedium"
1102 | ]
1103 | },
1104 | {
1105 | "colId": "gcp_inv_spread_change_bps",
1106 | "headerName": "gcpInvSpreadChangeBps",
1107 | "field": "gcp_inv_spread_change_bps",
1108 | "type": [
1109 | "Measure",
1110 | "Decimal",
1111 | "InitWidthMedium"
1112 | ]
1113 | },
1114 | {
1115 | "colId": "gcp_maturity_01",
1116 | "headerName": "gcpMaturity01",
1117 | "field": "gcp_maturity_01",
1118 | "type": [
1119 | "Measure",
1120 | "Round",
1121 | "InitWidthMedium"
1122 | ]
1123 | },
1124 | {
1125 | "colId": "gcp_maturity_01_fixed_irr",
1126 | "headerName": "gcpMaturity01FixedIrr",
1127 | "field": "gcp_maturity_01_fixed_irr",
1128 | "type": [
1129 | "Measure",
1130 | "Round"
1131 | ]
1132 | },
1133 | {
1134 | "colId": "gcp_maturity_01_fixed_irr_ctd",
1135 | "headerName": "gcpMaturity01FixedIrrCtD",
1136 | "field": "gcp_maturity_01_fixed_irr_ctd",
1137 | "type": [
1138 | "Measure",
1139 | "Round"
1140 | ]
1141 | },
1142 | {
1143 | "colId": "gcp_new_trade_pl_base",
1144 | "headerName": "gcpNewTradePlBase",
1145 | "field": "gcp_new_trade_pl_base",
1146 | "type": [
1147 | "Measure",
1148 | "Round",
1149 | "InitWidthMedium"
1150 | ]
1151 | },
1152 | {
1153 | "colId": "gcp_new_trade_pl_base_close",
1154 | "headerName": "gcpNewTradePlBaseClose",
1155 | "field": "gcp_new_trade_pl_base_close",
1156 | "type": [
1157 | "Measure",
1158 | "Round",
1159 | "InitWidthMedium"
1160 | ]
1161 | },
1162 | {
1163 | "colId": "gcp_ois_inv_spread_change_bps",
1164 | "headerName": "gcpOisInvSpreadChangeBps",
1165 | "field": "gcp_ois_inv_spread_change_bps",
1166 | "type": [
1167 | "Measure",
1168 | "Decimal",
1169 | "InitWidthMedium"
1170 | ]
1171 | },
1172 | {
1173 | "colId": "gcp_ois_spread_change_bps",
1174 | "headerName": "gcpOisSpreadChangeBps",
1175 | "field": "gcp_ois_spread_change_bps",
1176 | "type": [
1177 | "Measure",
1178 | "Decimal",
1179 | "InitWidthMedium"
1180 | ]
1181 | },
1182 | {
1183 | "colId": "gcp_premium_style",
1184 | "headerName": "gcpPremiumStyle",
1185 | "field": "Product.gcp_premium_style",
1186 | "type": [
1187 | "Dimension"
1188 | ]
1189 | },
1190 | {
1191 | "colId": "gcp_sofr_inv_spread_change_bps",
1192 | "headerName": "gcpSofrInvSpreadChangeBps",
1193 | "field": "gcp_sofr_inv_spread_change_bps",
1194 | "type": [
1195 | "Measure",
1196 | "Decimal",
1197 | "InitWidthMedium"
1198 | ]
1199 | },
1200 | {
1201 | "colId": "gcp_sofr_spread_change_bps",
1202 | "headerName": "gcpSofrSpreadChangeBps",
1203 | "field": "gcp_sofr_spread_change_bps",
1204 | "type": [
1205 | "Measure",
1206 | "Decimal",
1207 | "InitWidthMedium"
1208 | ]
1209 | },
1210 | {
1211 | "colId": "gcp_spread_change_bps",
1212 | "headerName": "gcpSpreadChangeBps",
1213 | "field": "gcp_spread_change_bps",
1214 | "type": [
1215 | "Measure",
1216 | "Decimal",
1217 | "InitWidthMedium"
1218 | ]
1219 | },
1220 | {
1221 | "colId": "start_gcp_base_funding_01",
1222 | "headerName": "gcpStartBaseFunding01",
1223 | "field": "start_gcp_base_funding_01",
1224 | "type": [
1225 | "Measure",
1226 | "Round",
1227 | "InitWidthMedium"
1228 | ]
1229 | },
1230 | {
1231 | "colId": "start_gcp_base_maturity_01",
1232 | "headerName": "gcpStartBaseMaturity01",
1233 | "field": "start_gcp_base_maturity_01",
1234 | "type": [
1235 | "Measure",
1236 | "Round",
1237 | "InitWidthMedium"
1238 | ]
1239 | },
1240 | {
1241 | "colId": "start_gcp_base_maturity_01_fixed_irr",
1242 | "headerName": "gcpStartBaseMaturity01FixedIrr",
1243 | "field": "start_gcp_base_maturity_01_fixed_irr",
1244 | "type": [
1245 | "Measure",
1246 | "Round"
1247 | ]
1248 | },
1249 | {
1250 | "colId": "gcp_start_base_pv",
1251 | "headerName": "gcpStartBasePv",
1252 | "field": "gcp_start_base_pv",
1253 | "type": [
1254 | "Measure",
1255 | "Round",
1256 | "InitWidthMedium"
1257 | ]
1258 | },
1259 | {
1260 | "colId": "gcp_start_clean_price",
1261 | "headerName": "gcpStartCleanPrice",
1262 | "field": "gcp_start_clean_price",
1263 | "type": [
1264 | "Measure",
1265 | "Decimal",
1266 | "InitWidthMedium"
1267 | ]
1268 | },
1269 | {
1270 | "colId": "start_gcp_funding_01",
1271 | "headerName": "gcpStartFunding01",
1272 | "field": "start_gcp_funding_01",
1273 | "type": [
1274 | "Measure",
1275 | "Round",
1276 | "InitWidthMedium"
1277 | ]
1278 | },
1279 | {
1280 | "colId": "gcp_start_implied_repo",
1281 | "headerName": "gcpStartImpliedRepo",
1282 | "field": "gcp_start_implied_repo",
1283 | "type": [
1284 | "Measure",
1285 | "Decimal",
1286 | "InitWidthMedium"
1287 | ]
1288 | },
1289 | {
1290 | "colId": "gcp_start_inv_spread_bps",
1291 | "headerName": "gcpStartInvSpreadBps",
1292 | "field": "gcp_start_inv_spread_bps",
1293 | "type": [
1294 | "Measure",
1295 | "Decimal",
1296 | "InitWidthMedium"
1297 | ]
1298 | },
1299 | {
1300 | "colId": "start_gcp_maturity_01",
1301 | "headerName": "gcpStartMaturity01",
1302 | "field": "start_gcp_maturity_01",
1303 | "type": [
1304 | "Measure",
1305 | "Round",
1306 | "InitWidthMedium"
1307 | ]
1308 | },
1309 | {
1310 | "colId": "gcp_start_ois_inv_spread_bps",
1311 | "headerName": "gcpStartOisInvSpreadBps",
1312 | "field": "gcp_start_ois_inv_spread_bps",
1313 | "type": [
1314 | "Measure",
1315 | "Decimal",
1316 | "InitWidthMedium"
1317 | ]
1318 | },
1319 | {
1320 | "colId": "gcp_start_ois_par_rate_at_spot",
1321 | "headerName": "gcpStartOisParRateAtSpot",
1322 | "field": "gcp_start_ois_par_rate_at_spot",
1323 | "type": [
1324 | "Measure",
1325 | "DecimalPercentage",
1326 | "InitWidthMedium"
1327 | ]
1328 | },
1329 | {
1330 | "colId": "gcp_start_ois_spread_to_par_bps",
1331 | "headerName": "gcpStartOisSpreadToParBps",
1332 | "field": "gcp_start_ois_spread_to_par_bps",
1333 | "type": [
1334 | "Measure",
1335 | "Decimal",
1336 | "InitWidthMedium"
1337 | ]
1338 | },
1339 | {
1340 | "colId": "gcp_start_par_rate_at_spot",
1341 | "headerName": "gcpStartParRateAtSpot",
1342 | "field": "gcp_start_par_rate_at_spot",
1343 | "type": [
1344 | "Measure",
1345 | "DecimalPercentage",
1346 | "InitWidthMedium"
1347 | ]
1348 | },
1349 | {
1350 | "colId": "gcp_start_quote_ticks",
1351 | "headerName": "gcpStartQuoteTicks",
1352 | "field": "gcp_start_quote_ticks",
1353 | "type": [
1354 | "Dimension"
1355 | ]
1356 | },
1357 | {
1358 | "colId": "gcp_start_sofr_inv_spread_bps",
1359 | "headerName": "gcpStartSofrInvSpreadBps",
1360 | "field": "gcp_start_sofr_inv_spread_bps",
1361 | "type": [
1362 | "Measure",
1363 | "Decimal",
1364 | "InitWidthMedium"
1365 | ]
1366 | },
1367 | {
1368 | "colId": "gcp_start_sofr_par_rate_at_spot",
1369 | "headerName": "gcpStartSofrParRateAtSpot",
1370 | "field": "gcp_start_sofr_par_rate_at_spot",
1371 | "type": [
1372 | "Measure",
1373 | "DecimalPercentage",
1374 | "InitWidthMedium"
1375 | ]
1376 | },
1377 | {
1378 | "colId": "gcp_start_sofr_spread_to_par_bps",
1379 | "headerName": "gcpStartSofrSpreadToParBps",
1380 | "field": "gcp_start_sofr_spread_to_par_bps",
1381 | "type": [
1382 | "Measure",
1383 | "Decimal",
1384 | "InitWidthMedium"
1385 | ]
1386 | },
1387 | {
1388 | "colId": "gcp_start_spread_to_par_bps",
1389 | "headerName": "gcpStartSpreadToParBps",
1390 | "field": "gcp_start_spread_to_par_bps",
1391 | "type": [
1392 | "Measure",
1393 | "Decimal",
1394 | "InitWidthMedium"
1395 | ]
1396 | },
1397 | {
1398 | "colId": "gcp_yield_change_bps",
1399 | "headerName": "gcpYieldChangeBps",
1400 | "field": "gcp_yield_change_bps",
1401 | "type": [
1402 | "Measure",
1403 | "DecimalVariableFiveDecimals",
1404 | "InitWidthMedium",
1405 | "NonAggregated"
1406 | ]
1407 | }
1408 | ]
1409 | },
1410 | {
1411 | "headerName": "Risk",
1412 | "children": [
1413 | {
1414 | "colId": "risk_base_atm_vol",
1415 | "headerName": "Atm Vol Base",
1416 | "field": "risk_base_atm_vol",
1417 | "type": [
1418 | "Measure",
1419 | "DecimalPercentage"
1420 | ]
1421 | },
1422 | {
1423 | "colId": "risk_atm_vol",
1424 | "headerName": "Atm Vol Local",
1425 | "field": "risk_atm_vol",
1426 | "type": [
1427 | "Measure",
1428 | "DecimalPercentage"
1429 | ]
1430 | },
1431 | {
1432 | "colId": "risk_base_pv_close",
1433 | "headerName": "Base Close PV",
1434 | "field": "risk_base_pv_close",
1435 | "type": [
1436 | "Measure",
1437 | "Round"
1438 | ]
1439 | },
1440 | {
1441 | "colId": "risk_base_ir_volga",
1442 | "headerName": "Base IR Volga",
1443 | "field": "risk_base_ir_volga",
1444 | "type": [
1445 | "Measure",
1446 | "Round"
1447 | ]
1448 | },
1449 | {
1450 | "colId": "risk_base_pv",
1451 | "headerName": "Base PV",
1452 | "field": "risk_base_pv",
1453 | "type": [
1454 | "Measure",
1455 | "Round"
1456 | ]
1457 | },
1458 | {
1459 | "colId": "risk_base_bp01",
1460 | "headerName": "Bp01",
1461 | "field": "risk_base_bp01",
1462 | "type": [
1463 | "Measure",
1464 | "Round"
1465 | ]
1466 | },
1467 | {
1468 | "colId": "risk_break_even_rate",
1469 | "headerName": "Break Even Rate",
1470 | "field": "risk_break_even_rate",
1471 | "type": [
1472 | "Measure",
1473 | "DecimalPercentage"
1474 | ]
1475 | },
1476 | {
1477 | "colId": "risk_break_even_spread",
1478 | "headerName": "Break Even Spread",
1479 | "field": "risk_break_even_spread",
1480 | "type": [
1481 | "Measure",
1482 | "Decimal"
1483 | ]
1484 | },
1485 | {
1486 | "colId": "risk_base_co_delta",
1487 | "headerName": "CO Delta",
1488 | "field": "risk_base_co_delta",
1489 | "type": [
1490 | "Measure",
1491 | "Round"
1492 | ]
1493 | },
1494 | {
1495 | "colId": "risk_base_co_gamma",
1496 | "headerName": "CO Gamma",
1497 | "field": "risk_base_co_gamma",
1498 | "type": [
1499 | "Measure",
1500 | "Round"
1501 | ]
1502 | },
1503 | {
1504 | "colId": "risk_base_co_vega",
1505 | "headerName": "CO Vega",
1506 | "field": "risk_base_co_vega",
1507 | "type": [
1508 | "Measure",
1509 | "Round"
1510 | ]
1511 | },
1512 | {
1513 | "colId": "risk_base_cr_delta",
1514 | "headerName": "CR Delta Base",
1515 | "field": "risk_base_cr_delta",
1516 | "type": [
1517 | "Measure",
1518 | "Round"
1519 | ]
1520 | },
1521 | {
1522 | "colId": "risk_cr_delta",
1523 | "headerName": "CR Delta Local",
1524 | "field": "risk_cr_delta",
1525 | "type": [
1526 | "Measure",
1527 | "Round"
1528 | ]
1529 | },
1530 | {
1531 | "colId": "risk_base_cr_gamma",
1532 | "headerName": "CR Gamma Base",
1533 | "field": "risk_base_cr_gamma",
1534 | "type": [
1535 | "Measure",
1536 | "Round"
1537 | ]
1538 | },
1539 | {
1540 | "colId": "risk_base_cr_vanna",
1541 | "headerName": "CR Vanna Base",
1542 | "field": "risk_base_cr_vanna",
1543 | "type": [
1544 | "Measure",
1545 | "Round"
1546 | ]
1547 | },
1548 | {
1549 | "colId": "risk_base_cr_vega",
1550 | "headerName": "CR Vega Base",
1551 | "field": "risk_base_cr_vega",
1552 | "type": [
1553 | "Measure",
1554 | "Round"
1555 | ]
1556 | },
1557 | {
1558 | "colId": "risk_base_cr_volga",
1559 | "headerName": "CR Volga Base",
1560 | "field": "risk_base_cr_volga",
1561 | "type": [
1562 | "Measure",
1563 | "Round"
1564 | ]
1565 | },
1566 | {
1567 | "colId": "risk_carry",
1568 | "headerName": "Carry",
1569 | "field": "risk_carry",
1570 | "type": [
1571 | "Measure",
1572 | "Round"
1573 | ]
1574 | },
1575 | {
1576 | "colId": "risk_base_carry",
1577 | "headerName": "Carry Base",
1578 | "field": "risk_base_carry",
1579 | "type": [
1580 | "Measure",
1581 | "Round"
1582 | ]
1583 | },
1584 | {
1585 | "colId": "change_risk_base_cr_delta",
1586 | "headerName": "Change CR Delta Base",
1587 | "field": "change_risk_base_cr_delta",
1588 | "type": [
1589 | "Measure",
1590 | "Round"
1591 | ]
1592 | },
1593 | {
1594 | "colId": "change_risk_base_cr_gamma",
1595 | "headerName": "Change CR Gamma Base",
1596 | "field": "change_risk_base_cr_gamma",
1597 | "type": [
1598 | "Measure",
1599 | "Round"
1600 | ]
1601 | },
1602 | {
1603 | "colId": "change_risk_base_cr_vanna",
1604 | "headerName": "Change CR Vanna Base",
1605 | "field": "change_risk_base_cr_vanna",
1606 | "type": [
1607 | "Measure",
1608 | "Round"
1609 | ]
1610 | },
1611 | {
1612 | "colId": "change_risk_base_cr_vega",
1613 | "headerName": "Change CR Vega Base",
1614 | "field": "change_risk_base_cr_vega",
1615 | "type": [
1616 | "Measure",
1617 | "Round"
1618 | ]
1619 | },
1620 | {
1621 | "colId": "change_risk_base_cr_volga",
1622 | "headerName": "Change CR Volga Base",
1623 | "field": "change_risk_base_cr_volga",
1624 | "type": [
1625 | "Measure",
1626 | "Round"
1627 | ]
1628 | },
1629 | {
1630 | "colId": "change_risk_base_co_delta",
1631 | "headerName": "Change Co Delta",
1632 | "field": "change_risk_base_co_delta",
1633 | "type": [
1634 | "Measure",
1635 | "Round"
1636 | ]
1637 | },
1638 | {
1639 | "colId": "change_risk_base_co_gamma",
1640 | "headerName": "Change Co Gamma",
1641 | "field": "change_risk_base_co_gamma",
1642 | "type": [
1643 | "Measure",
1644 | "Round"
1645 | ]
1646 | },
1647 | {
1648 | "colId": "change_risk_base_co_vega",
1649 | "headerName": "Change Co Vega",
1650 | "field": "change_risk_base_co_vega",
1651 | "type": [
1652 | "Measure",
1653 | "Round"
1654 | ]
1655 | },
1656 | {
1657 | "colId": "change_risk_base_fx_delta",
1658 | "headerName": "Change FX Delta Base",
1659 | "field": "change_risk_base_fx_delta",
1660 | "type": [
1661 | "Measure",
1662 | "Round"
1663 | ]
1664 | },
1665 | {
1666 | "colId": "change_risk_base_fx_delta_skew",
1667 | "headerName": "Change FX Delta Skew Base",
1668 | "field": "change_risk_base_fx_delta_skew",
1669 | "type": [
1670 | "Measure",
1671 | "Round"
1672 | ]
1673 | },
1674 | {
1675 | "colId": "change_risk_base_fx_delta_skew_prem",
1676 | "headerName": "Change FX Delta Skew Prem Base",
1677 | "field": "change_risk_base_fx_delta_skew_prem",
1678 | "type": [
1679 | "Measure",
1680 | "Round"
1681 | ]
1682 | },
1683 | {
1684 | "colId": "change_risk_base_fx_gamma",
1685 | "headerName": "Change FX Gamma",
1686 | "field": "change_risk_base_fx_gamma",
1687 | "type": [
1688 | "Measure",
1689 | "Round"
1690 | ]
1691 | },
1692 | {
1693 | "colId": "change_risk_base_fx_vega",
1694 | "headerName": "Change FX Vega",
1695 | "field": "change_risk_base_fx_vega",
1696 | "type": [
1697 | "Measure",
1698 | "Round"
1699 | ]
1700 | },
1701 | {
1702 | "colId": "change_risk_implied_vol",
1703 | "headerName": "Change Implied Vol",
1704 | "field": "change_risk_implied_vol",
1705 | "type": [
1706 | "Measure",
1707 | "DecimalPercentage"
1708 | ]
1709 | },
1710 | {
1711 | "colId": "change_risk_base_inf_delta",
1712 | "headerName": "Change Inf Delta",
1713 | "field": "change_risk_base_inf_delta",
1714 | "type": [
1715 | "Measure",
1716 | "Round"
1717 | ]
1718 | },
1719 | {
1720 | "colId": "change_risk_base_bp01",
1721 | "headerName": "Change in Bp01",
1722 | "field": "change_risk_base_bp01",
1723 | "type": [
1724 | "Measure",
1725 | "Round"
1726 | ]
1727 | },
1728 | {
1729 | "colId": "change_risk_base_ir_delta",
1730 | "headerName": "Change in IR Delta Base",
1731 | "field": "change_risk_base_ir_delta",
1732 | "type": [
1733 | "Measure",
1734 | "Round"
1735 | ],
1736 | "initialWidth": 120
1737 | },
1738 | {
1739 | "colId": "risk_base_yield_change",
1740 | "headerName": "Change in Yield",
1741 | "field": "risk_base_yield_change",
1742 | "type": [
1743 | "Measure",
1744 | "DecimalPercentage"
1745 | ]
1746 | },
1747 | {
1748 | "colId": "risk_base_clean_market_value",
1749 | "headerName": "Clean Market Value",
1750 | "field": "risk_base_clean_market_value",
1751 | "type": [
1752 | "Measure",
1753 | "Round"
1754 | ]
1755 | },
1756 | {
1757 | "colId": "risk_clean_price",
1758 | "headerName": "Clean Price",
1759 | "field": "risk_clean_price",
1760 | "type": [
1761 | "Measure",
1762 | "Decimal"
1763 | ]
1764 | },
1765 | {
1766 | "colId": "risk_pv_close",
1767 | "headerName": "Close PV",
1768 | "field": "risk_pv_close",
1769 | "type": [
1770 | "Measure",
1771 | "Round"
1772 | ]
1773 | },
1774 | {
1775 | "colId": "risk_base_cor_delta",
1776 | "headerName": "Correlation Delta Base",
1777 | "field": "risk_base_cor_delta",
1778 | "type": [
1779 | "Measure",
1780 | "Round"
1781 | ]
1782 | },
1783 | {
1784 | "colId": "risk_base_delta",
1785 | "headerName": "Delta Base",
1786 | "field": "risk_base_delta",
1787 | "type": [
1788 | "Measure",
1789 | "Round"
1790 | ]
1791 | },
1792 | {
1793 | "colId": "risk_delta",
1794 | "headerName": "Delta Local",
1795 | "field": "risk_delta",
1796 | "type": [
1797 | "Measure",
1798 | "Round"
1799 | ]
1800 | },
1801 | {
1802 | "colId": "risk_base_delta_lot",
1803 | "headerName": "Delta Lot",
1804 | "field": "risk_base_delta_lot",
1805 | "type": [
1806 | "Measure",
1807 | "DecimalVariable",
1808 | "NonAggregated"
1809 | ]
1810 | },
1811 | {
1812 | "colId": "risk_base_delta_ratio",
1813 | "headerName": "Delta Ratio",
1814 | "field": "risk_base_delta_ratio",
1815 | "type": [
1816 | "Measure",
1817 | "DecimalPercentage"
1818 | ]
1819 | },
1820 | {
1821 | "colId": "risk_base_delta_underlier",
1822 | "headerName": "Delta Underlier",
1823 | "field": "risk_base_delta_underlier",
1824 | "type": [
1825 | "Measure",
1826 | "Round"
1827 | ]
1828 | },
1829 | {
1830 | "colId": "risk_base_eq_delta",
1831 | "headerName": "EQ Delta",
1832 | "field": "risk_base_eq_delta",
1833 | "type": [
1834 | "Measure",
1835 | "Round"
1836 | ]
1837 | },
1838 | {
1839 | "colId": "risk_base_eq_gamma",
1840 | "headerName": "EQ Gamma",
1841 | "field": "risk_base_eq_gamma",
1842 | "type": [
1843 | "Measure",
1844 | "Round"
1845 | ]
1846 | },
1847 | {
1848 | "colId": "risk_base_eq_vega",
1849 | "headerName": "EQ Vega",
1850 | "field": "risk_base_eq_vega",
1851 | "type": [
1852 | "Measure",
1853 | "Round"
1854 | ]
1855 | },
1856 | {
1857 | "colId": "risk_base_eq_vol_index_vega",
1858 | "headerName": "EQ Vol Index Vega",
1859 | "field": "risk_base_eq_vol_index_vega",
1860 | "type": [
1861 | "Measure",
1862 | "Round"
1863 | ]
1864 | },
1865 | {
1866 | "colId": "risk_base_eq_vol_index_volga",
1867 | "headerName": "EQ Vol Index Volga",
1868 | "field": "risk_base_eq_vol_index_volga",
1869 | "type": [
1870 | "Measure",
1871 | "Round"
1872 | ]
1873 | },
1874 | {
1875 | "colId": "risk_implied_vol",
1876 | "headerName": "End Implied Vol",
1877 | "field": "risk_implied_vol",
1878 | "type": [
1879 | "Measure",
1880 | "DecimalPercentage"
1881 | ]
1882 | },
1883 | {
1884 | "colId": "risk_fwd_price",
1885 | "headerName": "Fwd Price",
1886 | "field": "risk_fwd_price",
1887 | "type": [
1888 | "Measure",
1889 | "Decimal"
1890 | ]
1891 | },
1892 | {
1893 | "colId": "risk_base_fx_delta",
1894 | "headerName": "Fx Delta Base",
1895 | "field": "risk_base_fx_delta",
1896 | "type": [
1897 | "Measure",
1898 | "Round"
1899 | ]
1900 | },
1901 | {
1902 | "colId": "risk_base_fx_delta_skew",
1903 | "headerName": "Fx Delta Skew Base",
1904 | "field": "risk_base_fx_delta_skew",
1905 | "type": [
1906 | "Measure",
1907 | "Round"
1908 | ]
1909 | },
1910 | {
1911 | "colId": "risk_base_fx_delta_skew_prem",
1912 | "headerName": "Fx Delta Skew Prem Base",
1913 | "field": "risk_base_fx_delta_skew_prem",
1914 | "type": [
1915 | "Measure",
1916 | "Round"
1917 | ]
1918 | },
1919 | {
1920 | "colId": "risk_base_fx_gamma",
1921 | "headerName": "Fx Gamma",
1922 | "field": "risk_base_fx_gamma",
1923 | "type": [
1924 | "Measure",
1925 | "Round"
1926 | ]
1927 | },
1928 | {
1929 | "colId": "risk_base_fx_vega",
1930 | "headerName": "Fx Vega",
1931 | "field": "risk_base_fx_vega",
1932 | "type": [
1933 | "Measure",
1934 | "Round"
1935 | ]
1936 | },
1937 | {
1938 | "colId": "risk_base_ir_delta",
1939 | "headerName": "IR Delta Base",
1940 | "field": "risk_base_ir_delta",
1941 | "type": [
1942 | "Measure",
1943 | "Round"
1944 | ],
1945 | "initialWidth": 120
1946 | },
1947 | {
1948 | "colId": "risk_base_ir_delta_flat_vol",
1949 | "headerName": "IR Delta Flat Vol Base",
1950 | "field": "risk_base_ir_delta_flat_vol",
1951 | "type": [
1952 | "Measure",
1953 | "Round"
1954 | ],
1955 | "initialWidth": 120
1956 | },
1957 | {
1958 | "colId": "risk_ir_delta_flat_vol",
1959 | "headerName": "IR Delta Flat Vol Local",
1960 | "field": "risk_ir_delta_flat_vol",
1961 | "type": [
1962 | "Measure",
1963 | "Round"
1964 | ]
1965 | },
1966 | {
1967 | "colId": "risk_ir_delta",
1968 | "headerName": "IR Delta Local",
1969 | "field": "risk_ir_delta",
1970 | "type": [
1971 | "Measure",
1972 | "Round"
1973 | ]
1974 | },
1975 | {
1976 | "colId": "risk_base_ir_gamma",
1977 | "headerName": "IR Gamma",
1978 | "field": "risk_base_ir_gamma",
1979 | "type": [
1980 | "Measure",
1981 | "Round"
1982 | ]
1983 | },
1984 | {
1985 | "colId": "risk_base_ir_vega",
1986 | "headerName": "IR Vega",
1987 | "field": "risk_base_ir_vega",
1988 | "type": [
1989 | "Measure",
1990 | "Round"
1991 | ]
1992 | },
1993 | {
1994 | "colId": "risk_base_inf_delta",
1995 | "headerName": "Inf Delta",
1996 | "field": "risk_base_inf_delta",
1997 | "type": [
1998 | "Measure",
1999 | "Round"
2000 | ]
2001 | },
2002 | {
2003 | "colId": "change_risk_base_ir_vega",
2004 | "headerName": "Ir Vega Change",
2005 | "field": "change_risk_base_ir_vega",
2006 | "type": [
2007 | "Measure",
2008 | "Round"
2009 | ]
2010 | },
2011 | {
2012 | "colId": "jump_to_rec",
2013 | "headerName": "Jump To Rec",
2014 | "field": "jump_to_rec",
2015 | "type": [
2016 | "Measure",
2017 | "Round"
2018 | ]
2019 | },
2020 | {
2021 | "colId": "jump_to_zero",
2022 | "headerName": "Jump To Zero",
2023 | "field": "jump_to_zero",
2024 | "type": [
2025 | "Measure",
2026 | "Round"
2027 | ]
2028 | },
2029 | {
2030 | "colId": "risk_base_market_value",
2031 | "headerName": "Market Value",
2032 | "field": "risk_base_market_value",
2033 | "type": [
2034 | "Measure",
2035 | "Round"
2036 | ]
2037 | },
2038 | {
2039 | "colId": "risk_pv",
2040 | "headerName": "PV",
2041 | "field": "risk_pv",
2042 | "type": [
2043 | "Measure",
2044 | "Round"
2045 | ]
2046 | },
2047 | {
2048 | "colId": "risk_price",
2049 | "headerName": "Price",
2050 | "field": "risk_price",
2051 | "type": [
2052 | "Measure",
2053 | "Decimal"
2054 | ]
2055 | },
2056 | {
2057 | "colId": "risk_realized_vol",
2058 | "headerName": "Realized Vol",
2059 | "field": "risk_realized_vol",
2060 | "type": [
2061 | "Measure",
2062 | "DecimalPercentage"
2063 | ]
2064 | },
2065 | {
2066 | "colId": "risk_base_cash",
2067 | "headerName": "Risk Base Cash",
2068 | "field": "risk_base_cash",
2069 | "type": [
2070 | "Measure",
2071 | "Round"
2072 | ]
2073 | },
2074 | {
2075 | "colId": "risk_base_smile_vol",
2076 | "headerName": "Smile Vol Base",
2077 | "field": "risk_base_smile_vol",
2078 | "type": [
2079 | "Measure",
2080 | "DecimalPercentage"
2081 | ]
2082 | },
2083 | {
2084 | "colId": "risk_smile_vol",
2085 | "headerName": "Smile Vol Local",
2086 | "field": "risk_smile_vol",
2087 | "type": [
2088 | "Measure",
2089 | "DecimalPercentage"
2090 | ]
2091 | },
2092 | {
2093 | "colId": "start_risk_base_bp01",
2094 | "headerName": "Start Bp01",
2095 | "field": "start_risk_base_bp01",
2096 | "type": [
2097 | "Measure",
2098 | "Round"
2099 | ]
2100 | },
2101 | {
2102 | "colId": "start_risk_base_co_delta",
2103 | "headerName": "Start CO Delta",
2104 | "field": "start_risk_base_co_delta",
2105 | "type": [
2106 | "Measure",
2107 | "Round"
2108 | ]
2109 | },
2110 | {
2111 | "colId": "start_risk_base_co_gamma",
2112 | "headerName": "Start CO Gamma",
2113 | "field": "start_risk_base_co_gamma",
2114 | "type": [
2115 | "Measure",
2116 | "Round"
2117 | ]
2118 | },
2119 | {
2120 | "colId": "start_risk_base_co_vega",
2121 | "headerName": "Start CO Vega",
2122 | "field": "start_risk_base_co_vega",
2123 | "type": [
2124 | "Measure",
2125 | "Round"
2126 | ]
2127 | },
2128 | {
2129 | "colId": "start_risk_base_ir_delta",
2130 | "headerName": "Start IR Delta Base",
2131 | "field": "start_risk_base_ir_delta",
2132 | "type": [
2133 | "Measure",
2134 | "Round"
2135 | ],
2136 | "initialWidth": 120
2137 | },
2138 | {
2139 | "colId": "start_risk_implied_vol",
2140 | "headerName": "Start Implied Vol",
2141 | "field": "start_risk_implied_vol",
2142 | "type": [
2143 | "Measure",
2144 | "DecimalPercentage"
2145 | ]
2146 | },
2147 | {
2148 | "colId": "start_risk_base_inf_delta",
2149 | "headerName": "Start Inf Delta",
2150 | "field": "start_risk_base_inf_delta",
2151 | "type": [
2152 | "Measure",
2153 | "Round"
2154 | ]
2155 | },
2156 | {
2157 | "colId": "start_risk_base_ir_vega",
2158 | "headerName": "Start Ir Vega",
2159 | "field": "start_risk_base_ir_vega",
2160 | "type": [
2161 | "Measure",
2162 | "Round"
2163 | ]
2164 | },
2165 | {
2166 | "colId": "risk_base_theta",
2167 | "headerName": "Theta",
2168 | "field": "risk_base_theta",
2169 | "type": [
2170 | "Measure",
2171 | "Round"
2172 | ]
2173 | },
2174 | {
2175 | "colId": "risk_theta_1_d",
2176 | "headerName": "Theta1D",
2177 | "field": "risk_theta_1_d",
2178 | "type": [
2179 | "Measure",
2180 | "Round"
2181 | ]
2182 | },
2183 | {
2184 | "colId": "risk_base_theta_1_d",
2185 | "headerName": "Theta1D Base",
2186 | "field": "risk_base_theta_1_d",
2187 | "type": [
2188 | "Measure",
2189 | "Round"
2190 | ]
2191 | },
2192 | {
2193 | "colId": "underlier_default_ticker",
2194 | "headerName": "Underlier Default Ticker",
2195 | "field": "Product.underlier_default_ticker",
2196 | "type": [
2197 | "Dimension"
2198 | ]
2199 | },
2200 | {
2201 | "colId": "risk_underlier_price",
2202 | "headerName": "Underlier Price",
2203 | "field": "risk_underlier_price",
2204 | "type": [
2205 | "Measure",
2206 | "Decimal"
2207 | ]
2208 | },
2209 | {
2210 | "colId": "risk_base_yield",
2211 | "headerName": "Yield",
2212 | "field": "risk_base_yield",
2213 | "type": [
2214 | "Measure",
2215 | "DecimalPercentage"
2216 | ]
2217 | },
2218 | {
2219 | "colId": "risk_base_yield_close",
2220 | "headerName": "Yield Close",
2221 | "field": "risk_base_yield_close",
2222 | "type": [
2223 | "Measure",
2224 | "DecimalPercentage"
2225 | ]
2226 | }
2227 | ]
2228 | },
2229 | {
2230 | "headerName": "Structures",
2231 | "children": [
2232 | {
2233 | "colId": "structure_assigned",
2234 | "headerName": "Structure Assigned",
2235 | "type": [
2236 | "Dimension"
2237 | ]
2238 | },
2239 | {
2240 | "colId": "structure_description",
2241 | "headerName": "Structure Description",
2242 | "field": "Structure.Description",
2243 | "type": [
2244 | "Dimension"
2245 | ]
2246 | },
2247 | {
2248 | "colId": "structure_expression",
2249 | "headerName": "Structure Expression",
2250 | "field": "Structure.Expression",
2251 | "type": [
2252 | "Dimension"
2253 | ]
2254 | },
2255 | {
2256 | "colId": "trade_structure",
2257 | "headerName": "Structure Name",
2258 | "field": "Structure.Name",
2259 | "type": [
2260 | "Dimension"
2261 | ]
2262 | },
2263 | {
2264 | "colId": "structure_theme",
2265 | "headerName": "Structure Theme",
2266 | "field": "Structure.Theme",
2267 | "type": [
2268 | "Dimension"
2269 | ]
2270 | }
2271 | ]
2272 | },
2273 | {
2274 | "headerName": "Trader",
2275 | "children": [
2276 | {
2277 | "colId": "trader_is_active",
2278 | "headerName": "Trader Active",
2279 | "field": "Trader.is_active",
2280 | "hide": true
2281 | },
2282 | {
2283 | "colId": "trader_vertical",
2284 | "headerName": "Vertical",
2285 | "field": "Trader.vertical",
2286 | "type": [
2287 | "Dimension"
2288 | ],
2289 | "initialWidth": 120
2290 | }
2291 | ]
2292 | }
2293 | ]
2294 |
2295 | # Column Types
2296 |
2297 | export const columnTypes: TempoColumnTypes = {
2298 | Dimension: {
2299 | // filter: "agSetColumnFilter",default with ag grid enterprise
2300 | cellRenderer: HighlightFilterCell,
2301 | hide: true,
2302 | getQuickFilterText: applyDefaultQuickFilter,
2303 | },
2304 | Measure: {
2305 | headerClass: "ag-right-aligned-header",
2306 | cellClass: "ag-right-aligned-cell",
2307 | cellClassRules: cellCssStylesNumbers,
2308 | enableValue: true,
2309 | hide: true,
2310 | filter: "agNumberColumnFilter",
2311 | allowedAggFuncs: ["avg", "count", "first", "last", "min", "sum", "sum10"],
2312 | getQuickFilterText: () => "",
2313 | },
2314 | MarketData: {
2315 | // enableRowGroup: true,
2316 | cellClassRules: null,
2317 | hide: false,
2318 | },
2319 | Round: {
2320 | valueFormatter: rndsumzero,
2321 | valueGetter: (cell: ValueGetterParams) => {
2322 | // set value to what rndsumzero is displaying
2323 | // This helps with filtering values with integers as they appear in the grid
2324 | const val = getValueUsingField(cell.data, cell.colDef.field, true);
2325 | if (!val && val !== 0) return null;
2326 | return Math.round(val);
2327 | },
2328 | },
2329 | Decimal: {
2330 | valueFormatter: (cell: ValueFormatterParams) => toDecimal(cell.value, 3),
2331 | },
2332 | DecimalVariable: {
2333 | valueFormatter: (cell: ValueFormatterParams) =>
2334 | toDecimalVariable(cell.value, 3),
2335 | },
2336 | DecimalVariableFourDecimals: {
2337 | valueFormatter: (cell: ValueFormatterParams) =>
2338 | toDecimalVariable(cell.value, 4),
2339 | },
2340 | DecimalVariableFiveDecimals: {
2341 | valueFormatter: (cell: ValueFormatterParams) =>
2342 | toDecimalVariable(cell.value, 5),
2343 | },
2344 | DecimalPercentage: {
2345 | valueFormatter: (cell: ValueFormatterParams) => {
2346 | return toDecimalPercentage(cell.value, 3);
2347 | },
2348 | },
2349 | DateColumn: {
2350 | filter: "agDateColumnFilter",
2351 | comparator: dateComparator,
2352 | getQuickFilterText: (cell: GetQuickFilterTextParams) => {
2353 | return cell.value ? toYYYY_MM_DD(cell.value) : null;
2354 | },
2355 | valueFormatter: (cell: ValueFormatterParams) => {
2356 | return cell.value ? toYYYY_MM_DD(cell.value) : "";
2357 | },
2358 | valueGetter: (cell: ValueGetterParams) => {
2359 | //adding this because there is issue with the leaf node displayed as linux date when date is last in grouping.
2360 | const value: Date | number = getValueUsingField(
2361 | cell.data,
2362 | cell.colDef.field,
2363 | true
2364 | );
2365 |
2366 | const dte = getDateValue(value);
2367 |
2368 | if (!dte) {
2369 | return null;
2370 | }
2371 |
2372 | // Convert UTC date at midnight to local date at midnight
2373 | return new Date(
2374 | dte.getUTCFullYear(),
2375 | dte.getUTCMonth(),
2376 | dte.getUTCDate()
2377 | );
2378 | },
2379 | cellRenderer: null,
2380 | },
2381 | TimeOnlyColumn: {
2382 | comparator: dateComparator,
2383 | getQuickFilterText: (cell: GetQuickFilterTextParams) => {
2384 | return cell.value ? cell.value.toTimeString() : "";
2385 | },
2386 | valueFormatter: (cell: ValueFormatterParams) => {
2387 | return cell.value ? cell.value.toTimeString() : "";
2388 | },
2389 | valueGetter: (cell: ValueGetterParams) => {
2390 | //adding this because there is issue with the leaf node displayed as linux date when date is last in grouping.
2391 | const value = getValueUsingField(cell.data, cell.colDef.field, true);
2392 | return getDateValue(value);
2393 | },
2394 | cellRenderer: null,
2395 | },
2396 | ChartTypeCategory: {
2397 | chartDataType: "category",
2398 | },
2399 | ChartTypeSeries: {
2400 | chartDataType: "series",
2401 | },
2402 |
2403 | InitWidthMedium: {
2404 | initialWidth: 160,
2405 | },
2406 | InitWidthSmall: {
2407 | initialWidth: 120,
2408 | },
2409 | NonAggregated: {
2410 | allowedAggFuncs: ["noAgg"],
2411 | defaultAggFunc: "noAgg",
2412 | },
2413 | };
--------------------------------------------------------------------------------