OptionsTable.tsx 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. 'use client';
  2. import DataTable, { DataTableColumn } from '@/components/table/DataTable';
  3. import { OptionsRow, OPTION_RIGHT_TYPE_LABEL } from '@/types/market';
  4. import { formatNumber } from '@/lib/utils/stock';
  5. import { formatDecimal } from '@/lib/utils/market';
  6. function buildColumns(): DataTableColumn<OptionsRow>[] {
  7. return [
  8. {
  9. key: 'name',
  10. header: '종목명',
  11. align: 'left',
  12. priority: 'high',
  13. cellClassName: 'data-table__cell--name',
  14. cell: (row) => (
  15. <span className='stock-cell'>
  16. <span className='stock-cell__name'>{row.isuName}</span>
  17. <span className='stock-cell__code'>{row.isuCode}</span>
  18. </span>
  19. )
  20. },
  21. {
  22. key: 'right',
  23. header: '권리',
  24. align: 'center',
  25. priority: 'high',
  26. cell: (row) => <span className='market__cls-badge'>{OPTION_RIGHT_TYPE_LABEL[row.rightType] ?? row.rightType}</span>
  27. },
  28. {
  29. key: 'strike',
  30. header: '행사가',
  31. align: 'right',
  32. priority: 'medium',
  33. cell: (row) => formatDecimal(row.strikePrice)
  34. },
  35. {
  36. key: 'close',
  37. header: '현재가',
  38. align: 'right',
  39. priority: 'high',
  40. cell: (row) => formatDecimal(row.close)
  41. },
  42. {
  43. key: 'iv',
  44. header: '내재변동성',
  45. align: 'right',
  46. priority: 'low',
  47. cell: (row) => formatDecimal(row.impliedVolatility)
  48. },
  49. {
  50. key: 'volume',
  51. header: '거래량',
  52. align: 'right',
  53. priority: 'medium',
  54. cell: (row) => formatNumber(row.volume)
  55. },
  56. {
  57. key: 'oi',
  58. header: '미결제약정',
  59. align: 'right',
  60. priority: 'low',
  61. cell: (row) => formatNumber(row.openInterest)
  62. }
  63. ];
  64. }
  65. export default function OptionsTable({ rows }: { rows: OptionsRow[] })
  66. {
  67. return (
  68. <DataTable<OptionsRow>
  69. caption='옵션 목록 — 종목명, 권리유형, 행사가, 현재가, 내재변동성, 거래량, 미결제약정'
  70. columns={buildColumns()}
  71. rows={rows}
  72. rowKey={(row) => row.isuCode}
  73. emptyMessage='표시할 옵션이 없습니다.'
  74. />
  75. );
  76. }