LockupCalendarTable.tsx 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. 'use client';
  2. import Link from 'next/link';
  3. import DataTable, { DataTableColumn } from '@/components/table/DataTable';
  4. import { LockupCalendarRow, LOCKUP_OCCR_LABEL, LOCKUP_REASON_LABEL } from '@/types/seibro';
  5. import { codeLabel, formatShares, dateOrDash } from '@/lib/utils/market';
  6. function buildColumns(): DataTableColumn<LockupCalendarRow>[] {
  7. return [
  8. {
  9. key: 'name',
  10. header: '종목명',
  11. align: 'left',
  12. priority: 'high',
  13. cellClassName: 'data-table__cell--name',
  14. cell: (row) => (
  15. row.shortCode ? (
  16. <Link href={`/stock/${row.shortCode}`} className='stock-cell'>
  17. <span className='stock-cell__name'>{row.name}</span>
  18. <span className='stock-cell__code'>{row.shortCode}</span>
  19. </Link>
  20. ) : (
  21. <span className='stock-cell'>
  22. <span className='stock-cell__name'>{row.name}</span>
  23. </span>
  24. )
  25. )
  26. },
  27. {
  28. key: 'occrSeq',
  29. header: '구분',
  30. align: 'center',
  31. priority: 'high',
  32. cell: (row) => <span className='market__cls-badge'>{codeLabel(row.occrSeq, LOCKUP_OCCR_LABEL)}</span>
  33. },
  34. {
  35. key: 'safedpDt',
  36. header: '예수일',
  37. align: 'center',
  38. priority: 'medium',
  39. cell: (row) => row.safedpDt
  40. },
  41. {
  42. key: 'returnDt',
  43. header: '해제일',
  44. align: 'center',
  45. priority: 'high',
  46. cell: (row) => dateOrDash(row.returnDt)
  47. },
  48. {
  49. key: 'qty',
  50. header: '수량',
  51. align: 'right',
  52. priority: 'high',
  53. cell: (row) => formatShares(row.returnQty ?? row.safedpQty)
  54. },
  55. {
  56. key: 'reason',
  57. header: '사유',
  58. align: 'center',
  59. priority: 'low',
  60. cell: (row) => codeLabel(row.reasonCode, LOCKUP_REASON_LABEL)
  61. }
  62. ];
  63. }
  64. export default function LockupCalendarTable({ rows }: { rows: LockupCalendarRow[] })
  65. {
  66. return (
  67. <DataTable<LockupCalendarRow>
  68. caption='락업(보호예수) 캘린더 — 종목명, 구분, 예수일, 해제일, 수량, 사유'
  69. columns={buildColumns()}
  70. rows={rows}
  71. rowKey={(row, index) => `${row.shortCode}-${row.safedpDt}-${row.occrSeq}-${index}`}
  72. emptyMessage='표시할 락업 일정이 없습니다.'
  73. />
  74. );
  75. }