MeetingCalendarTable.tsx 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. 'use client';
  2. import Link from 'next/link';
  3. import DataTable, { DataTableColumn } from '@/components/table/DataTable';
  4. import { MeetingCalendarRow, MEETING_KIND_LABEL } from '@/types/seibro';
  5. import { codeLabel, dateOrDash, meetingTimeLabel } from '@/lib/utils/market';
  6. function buildColumns(): DataTableColumn<MeetingCalendarRow>[] {
  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.code ? (
  16. <Link href={`/stock/${row.code}`} className='stock-cell'>
  17. <span className='stock-cell__name'>{row.name ?? row.code}</span>
  18. <span className='stock-cell__code'>{row.code}</span>
  19. </Link>
  20. ) : (
  21. <span className='stock-cell'>
  22. <span className='stock-cell__name'>{row.name ?? `발행사 ${row.issucoCustno}`}</span>
  23. </span>
  24. )
  25. )
  26. },
  27. {
  28. key: 'gmetDt',
  29. header: '총회일',
  30. align: 'center',
  31. priority: 'high',
  32. cell: (row) => {
  33. const time = meetingTimeLabel(row.gmetTtm);
  34. return (
  35. <span>
  36. {dateOrDash(row.gmetDt)}{time && <span className='market__disclosure-date'> {time}</span>}
  37. </span>
  38. );
  39. }
  40. },
  41. {
  42. key: 'meetingKind',
  43. header: '종류',
  44. align: 'center',
  45. priority: 'high',
  46. cell: (row) => <span className='market__cls-badge'>{codeLabel(row.meetingKind, MEETING_KIND_LABEL)}</span>
  47. },
  48. {
  49. key: 'evote',
  50. header: '전자투표',
  51. align: 'center',
  52. priority: 'medium',
  53. cell: (row) => (row.evote === null ? '—' : row.evote ? '가능' : '불가')
  54. },
  55. {
  56. key: 'agendaCount',
  57. header: '안건수',
  58. align: 'right',
  59. priority: 'medium',
  60. cell: (row) => row.agendaCount.toLocaleString('ko-KR')
  61. },
  62. {
  63. key: 'place',
  64. header: '장소',
  65. align: 'left',
  66. priority: 'low',
  67. cell: (row) => row.place ?? '—'
  68. }
  69. ];
  70. }
  71. export default function MeetingCalendarTable({ rows }: { rows: MeetingCalendarRow[] })
  72. {
  73. return (
  74. <DataTable<MeetingCalendarRow>
  75. caption='주총 캘린더 — 종목명, 총회일, 종류, 전자투표, 안건수, 장소'
  76. columns={buildColumns()}
  77. rows={rows}
  78. rowKey={(row, index) => `${row.issucoCustno}-${row.rgtStdDt}-${index}`}
  79. emptyMessage='표시할 주총 일정이 없습니다.'
  80. />
  81. );
  82. }