├── .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 |
122 | 133 |
134 |
135 |
136 |
145 | Grid 2 {grid2LoadTime !== null ? `- Loaded in ${grid2LoadTime}ms` : '- Waiting...'} 146 |
147 |
148 | 159 |
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 | }; --------------------------------------------------------------------------------