EtpTable.tsx 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. 'use client';
  2. import DataTable, { DataTableColumn } from '@/components/table/DataTable';
  3. import PriceChange from '@/components/table/PriceChange';
  4. import { EtpRow, ETP_TYPE_LABEL } from '@/types/market';
  5. import { formatNumber } from '@/lib/utils/stock';
  6. import { formatDecimal } from '@/lib/utils/market';
  7. function buildColumns(): DataTableColumn<EtpRow>[] {
  8. return [
  9. {
  10. key: 'name',
  11. header: '종목명',
  12. align: 'left',
  13. priority: 'high',
  14. cellClassName: 'data-table__cell--name',
  15. cell: (row) => (
  16. <span className='stock-cell'>
  17. <span className='stock-cell__name'>{row.name}</span>
  18. <span className='stock-cell__code'>{row.code}</span>
  19. </span>
  20. )
  21. },
  22. {
  23. key: 'type',
  24. header: '종류',
  25. align: 'center',
  26. priority: 'medium',
  27. cell: (row) => <span className='market__cls-badge'>{ETP_TYPE_LABEL[row.type] ?? row.type}</span>
  28. },
  29. {
  30. key: 'close',
  31. header: '현재가',
  32. align: 'right',
  33. priority: 'high',
  34. cell: (row) => formatNumber(row.close)
  35. },
  36. {
  37. key: 'change',
  38. header: '등락률',
  39. align: 'right',
  40. priority: 'high',
  41. cell: (row) => <PriceChange rate={row.changeRate} />
  42. },
  43. {
  44. key: 'nav',
  45. header: 'NAV/IV',
  46. align: 'right',
  47. priority: 'low',
  48. cell: (row) => formatDecimal(row.nav)
  49. },
  50. {
  51. key: 'volume',
  52. header: '거래량',
  53. align: 'right',
  54. priority: 'medium',
  55. cell: (row) => formatNumber(row.volume)
  56. },
  57. {
  58. key: 'base',
  59. header: '기초지수/기초자산',
  60. align: 'left',
  61. priority: 'low',
  62. cell: (row) => row.baseIndexName || row.underlying || '—'
  63. }
  64. ];
  65. }
  66. export default function EtpTable({ rows }: { rows: EtpRow[] })
  67. {
  68. return (
  69. <DataTable<EtpRow>
  70. caption='ETP 목록 — 종목명, 종류, 현재가, 등락률, NAV, 거래량, 기초지수'
  71. columns={buildColumns()}
  72. rows={rows}
  73. rowKey={(row) => row.code}
  74. emptyMessage='표시할 종목이 없습니다.'
  75. />
  76. );
  77. }