pds-dev-kit-web-test 2.5.490 → 2.5.491

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/dist/index.d.ts +4 -4
  2. package/dist/index.js +4 -5
  3. package/dist/src/common/services/i18n/resources/en.json +42 -1
  4. package/dist/src/common/services/i18n/resources/es.json +41 -1
  5. package/dist/src/common/services/i18n/resources/fil.json +41 -1
  6. package/dist/src/common/services/i18n/resources/index.d.ts +285 -0
  7. package/dist/src/common/services/i18n/resources/ja.json +42 -1
  8. package/dist/src/common/services/i18n/resources/ko.json +42 -1
  9. package/dist/src/common/services/i18n/resources/zh-cn.json +42 -1
  10. package/dist/src/common/services/i18n/resources/zh-tw.json +42 -1
  11. package/dist/src/common/types/components.d.ts +9 -0
  12. package/dist/src/common/types/components.js +8 -0
  13. package/dist/src/common/types/index.d.ts +0 -1
  14. package/dist/src/common/types/index.js +0 -1
  15. package/dist/src/common/utils/dateHelper.d.ts +3 -0
  16. package/dist/src/common/utils/dateHelper.js +37 -0
  17. package/dist/src/desktop/components/BasicFormGroup/BasicFormGroup.d.ts +18 -1
  18. package/dist/src/desktop/components/BasicFormGroup/BasicFormGroup.js +46 -3
  19. package/dist/src/desktop/components/BoxItem/BoxItem.d.ts +1 -5
  20. package/dist/src/desktop/components/BoxItem/BoxItem.js +5 -8
  21. package/dist/src/desktop/components/Calendar/AllDaySchedulesSection.d.ts +13 -0
  22. package/dist/src/desktop/components/Calendar/AllDaySchedulesSection.js +132 -0
  23. package/dist/src/desktop/components/Calendar/Calendar.d.ts +4 -0
  24. package/dist/src/desktop/components/Calendar/Calendar.js +384 -0
  25. package/dist/src/desktop/components/Calendar/CurrentTimeIndicator.d.ts +7 -0
  26. package/dist/src/desktop/components/Calendar/CurrentTimeIndicator.js +48 -0
  27. package/dist/src/desktop/components/Calendar/DailyView.d.ts +17 -0
  28. package/dist/src/desktop/components/Calendar/DailyView.js +64 -0
  29. package/dist/src/desktop/components/Calendar/MonthlyView.d.ts +27 -0
  30. package/dist/src/desktop/components/Calendar/MonthlyView.js +263 -0
  31. package/dist/src/desktop/components/Calendar/MultiWeekSchedulesLayer.d.ts +19 -0
  32. package/dist/src/desktop/components/Calendar/MultiWeekSchedulesLayer.js +73 -0
  33. package/dist/src/desktop/components/Calendar/ScheduleItem.d.ts +16 -0
  34. package/dist/src/desktop/components/Calendar/ScheduleItem.js +50 -0
  35. package/dist/src/desktop/components/Calendar/TimeBasedScheduleItem.d.ts +9 -0
  36. package/dist/src/desktop/components/Calendar/TimeBasedScheduleItem.js +170 -0
  37. package/dist/src/desktop/components/Calendar/WeeklyView.d.ts +21 -0
  38. package/dist/src/desktop/components/Calendar/WeeklyView.js +91 -0
  39. package/dist/src/desktop/components/Calendar/YearlyView.d.ts +12 -0
  40. package/dist/src/desktop/components/Calendar/YearlyView.js +76 -0
  41. package/dist/src/desktop/components/Calendar/calendarUtils.d.ts +24 -0
  42. package/dist/src/desktop/components/Calendar/calendarUtils.js +112 -0
  43. package/dist/src/desktop/components/Calendar/constants.d.ts +1 -0
  44. package/dist/src/desktop/components/Calendar/constants.js +31 -0
  45. package/dist/src/desktop/components/Calendar/index.d.ts +10 -0
  46. package/dist/src/desktop/components/Calendar/index.js +37 -0
  47. package/dist/src/desktop/components/Calendar/timeFormatUtils.d.ts +16 -0
  48. package/dist/src/desktop/components/Calendar/timeFormatUtils.js +45 -0
  49. package/dist/src/desktop/components/Calendar/types.d.ts +60 -0
  50. package/dist/src/desktop/components/Calendar/types.js +2 -0
  51. package/dist/src/desktop/components/index.d.ts +2 -2
  52. package/dist/src/desktop/components/index.js +4 -4
  53. package/dist/src/desktop/index.d.ts +1 -1
  54. package/dist/src/desktop/index.js +2 -2
  55. package/dist/src/desktop/panels/MultilingualModal/MultilingualModal.d.ts +23 -0
  56. package/dist/src/desktop/panels/MultilingualModal/MultilingualModal.js +199 -0
  57. package/dist/src/desktop/panels/MultilingualModal/index.d.ts +1 -0
  58. package/dist/src/desktop/panels/MultilingualModal/index.js +8 -0
  59. package/dist/src/desktop/panels/index.d.ts +2 -1
  60. package/dist/src/desktop/panels/index.js +6 -1
  61. package/dist/src/mobile/components/BoxItem/BoxItem.d.ts +1 -5
  62. package/dist/src/mobile/components/BoxItem/BoxItem.js +5 -7
  63. package/dist/src/mobile/components/index.d.ts +1 -2
  64. package/dist/src/mobile/components/index.js +1 -3
  65. package/dist/src/mobile/index.d.ts +1 -1
  66. package/dist/src/mobile/index.js +2 -3
  67. package/package.json +1 -1
  68. package/release-note.md +2 -2
  69. package/dist/src/common/types/form.d.ts +0 -9
  70. package/dist/src/common/types/form.js +0 -10
  71. package/dist/src/desktop/components/Snackbar/Snackbar.d.ts +0 -16
  72. package/dist/src/desktop/components/Snackbar/Snackbar.js +0 -209
  73. package/dist/src/desktop/components/Snackbar/index.d.ts +0 -1
  74. package/dist/src/desktop/components/Snackbar/index.js +0 -8
  75. package/dist/src/desktop/components/Snackbar/provider.d.ts +0 -11
  76. package/dist/src/desktop/components/Snackbar/provider.js +0 -52
  77. package/dist/src/mobile/components/Snackbar/Snackbar.d.ts +0 -16
  78. package/dist/src/mobile/components/Snackbar/Snackbar.js +0 -209
  79. package/dist/src/mobile/components/Snackbar/index.d.ts +0 -1
  80. package/dist/src/mobile/components/Snackbar/index.js +0 -8
  81. package/dist/src/mobile/components/Snackbar/provider.d.ts +0 -11
  82. package/dist/src/mobile/components/Snackbar/provider.js +0 -52
@@ -0,0 +1,263 @@
1
+ "use strict";
2
+ var __makeTemplateObject = (this && this.__makeTemplateObject) || function (cooked, raw) {
3
+ if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; }
4
+ return cooked;
5
+ };
6
+ var __assign = (this && this.__assign) || function () {
7
+ __assign = Object.assign || function(t) {
8
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
9
+ s = arguments[i];
10
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
11
+ t[p] = s[p];
12
+ }
13
+ return t;
14
+ };
15
+ return __assign.apply(this, arguments);
16
+ };
17
+ var __importDefault = (this && this.__importDefault) || function (mod) {
18
+ return (mod && mod.__esModule) ? mod : { "default": mod };
19
+ };
20
+ Object.defineProperty(exports, "__esModule", { value: true });
21
+ exports.MonthlyView = void 0;
22
+ var jsx_runtime_1 = require("react/jsx-runtime");
23
+ // import { useMemo } from 'react';
24
+ var react_1 = require("react");
25
+ var react_i18next_1 = require("react-i18next");
26
+ var dateHelper_1 = require("../../../common/utils/dateHelper");
27
+ var styled_components_1 = __importDefault(require("styled-components"));
28
+ var TextLabel_1 = require("../TextLabel");
29
+ var calendarUtils_1 = require("./calendarUtils");
30
+ var MultiWeekSchedulesLayer_1 = require("./MultiWeekSchedulesLayer");
31
+ var MonthlyView = function (_a) {
32
+ var getDayTextByDate = _a.getDayTextByDate, startOfWeek = _a.startOfWeek, selectedDate = _a.selectedDate, selectedDates = _a.selectedDates, selectedSchedules = _a.selectedSchedules, dragStartDate = _a.dragStartDate, dragEndDate = _a.dragEndDate, isDragOverDate = _a.isDragOverDate, schedules = _a.schedules, getSchedulesForDate = _a.getSchedulesForDate, isToday = _a.isToday, isPastDate = _a.isPastDate, handleDateClick = _a.handleDateClick, handleScheduleClick = _a.handleScheduleClick, handleMouseUp = _a.handleMouseUp, handleDateDragOver = _a.handleDateDragOver, handleDateDragLeave = _a.handleDateDragLeave, handleDateDrop = _a.handleDateDrop, renderScheduleItem = _a.renderScheduleItem, handleScheduleDragStart = _a.handleScheduleDragStart, handleScheduleDragEnd = _a.handleScheduleDragEnd;
33
+ var t = (0, react_i18next_1.useTranslation)().t;
34
+ var MAX_SCHEDULES_PER_DAY = 3;
35
+ var days = (function () {
36
+ var monthDate = new Date(selectedDate.getFullYear(), selectedDate.getMonth(), 1);
37
+ return dateHelper_1.DateHelper.getCalendarDatesForCalendar(monthDate, startOfWeek);
38
+ })();
39
+ // 다중 이벤트 계산
40
+ var getMultiWeekSchedules = (0, react_1.useMemo)(function () {
41
+ var multiWeekSchedules = [];
42
+ var allSchedules = new Map();
43
+ var processedScheduleIds = new Set();
44
+ // 캘린더에 표시되는 전체 날짜 범위 계산
45
+ var calendarStart = new Date(days[0]);
46
+ var calendarEnd = new Date(days[days.length - 1]);
47
+ calendarStart.setHours(0, 0, 0, 0);
48
+ calendarEnd.setHours(0, 0, 0, 0);
49
+ days.forEach(function (date) {
50
+ var schedulesForDate = getSchedulesForDate(date);
51
+ schedulesForDate.forEach(function (schedule) {
52
+ // 이미 처리된 이벤트는 건너뛰기
53
+ if (processedScheduleIds.has(schedule.id)) {
54
+ return;
55
+ }
56
+ var scheduleStart = new Date(schedule.startDate);
57
+ var scheduleEnd = new Date(schedule.endDate);
58
+ scheduleStart.setHours(0, 0, 0, 0);
59
+ scheduleEnd.setHours(0, 0, 0, 0);
60
+ // All day 이벤트이거나 다중 날짜 이벤트인지 확인
61
+ var isAllDay = (0, calendarUtils_1.calculateIsAllDay)(new Date(schedule.startDate), new Date(schedule.endDate));
62
+ var isMultiDay = scheduleStart.getTime() !== scheduleEnd.getTime();
63
+ if (isAllDay || isMultiDay) {
64
+ // 이벤트가 현재 캘린더 범위와 교차하는지 확인
65
+ var isIntersecting = !(scheduleEnd.getTime() < calendarStart.getTime() ||
66
+ scheduleStart.getTime() > calendarEnd.getTime());
67
+ if (isIntersecting) {
68
+ allSchedules.set(schedule.id, schedule);
69
+ processedScheduleIds.add(schedule.id);
70
+ }
71
+ }
72
+ });
73
+ });
74
+ allSchedules.forEach(function (schedule) {
75
+ var scheduleStart = new Date(schedule.startDate);
76
+ var scheduleEnd = new Date(schedule.endDate);
77
+ scheduleStart.setHours(0, 0, 0, 0);
78
+ scheduleEnd.setHours(0, 0, 0, 0);
79
+ // 여러 날짜에 걸친 이벤트인지 확인
80
+ if (scheduleStart.getTime() !== scheduleEnd.getTime()) {
81
+ // 캘린더 범위 내에서 표시할 실제 시작/끝 날짜 계산
82
+ var displayStart_1 = new Date(Math.max(scheduleStart.getTime(), calendarStart.getTime()));
83
+ var displayEnd_1 = new Date(Math.min(scheduleEnd.getTime(), calendarEnd.getTime()));
84
+ // 캘린더 그리드에서 시작과 끝 위치 찾기
85
+ var startIndex = days.findIndex(function (date) {
86
+ var d = new Date(date);
87
+ d.setHours(0, 0, 0, 0);
88
+ return d.getTime() === displayStart_1.getTime();
89
+ });
90
+ var endIndex = days.findIndex(function (date) {
91
+ var d = new Date(date);
92
+ d.setHours(0, 0, 0, 0);
93
+ return d.getTime() === displayEnd_1.getTime();
94
+ });
95
+ if (startIndex !== -1 && endIndex !== -1) {
96
+ var startRow = Math.floor(startIndex / 7) + 2;
97
+ var endRow = Math.floor(endIndex / 7) + 2;
98
+ var _loop_1 = function (row) {
99
+ var isFirstRow = row === startRow;
100
+ var isLastRow = row === endRow;
101
+ // 각 행에서의 시작/끝 컬럼 계산
102
+ var segmentStartCol = void 0;
103
+ var segmentEndCol = void 0;
104
+ if (isFirstRow && isLastRow) {
105
+ // 같은 행 내의 이벤트
106
+ segmentStartCol = (startIndex % 7) + 1;
107
+ segmentEndCol = (endIndex % 7) + 1;
108
+ }
109
+ else if (isFirstRow) {
110
+ // 첫 번째 행: 시작 컬럼부터 주 끝까지
111
+ segmentStartCol = (startIndex % 7) + 1;
112
+ segmentEndCol = 7;
113
+ }
114
+ else if (isLastRow) {
115
+ // 마지막 행: 주 시작부터 끝 컬럼까지
116
+ segmentStartCol = 1;
117
+ segmentEndCol = (endIndex % 7) + 1;
118
+ }
119
+ else {
120
+ // 중간 행: 주 전체
121
+ segmentStartCol = 1;
122
+ segmentEndCol = 7;
123
+ }
124
+ // 같은 행의 기존 이벤트 개수 계산
125
+ var existingSchedulesInRow = multiWeekSchedules.filter(function (e) { return e.startRow === row; }).length;
126
+ multiWeekSchedules.push({
127
+ schedule: schedule,
128
+ startRow: row,
129
+ endRow: row,
130
+ startCol: segmentStartCol,
131
+ endCol: segmentEndCol,
132
+ scheduleIndex: existingSchedulesInRow
133
+ });
134
+ };
135
+ // 여러 주에 걸친 경우 각 주별로 분할해서 처리
136
+ for (var row = startRow; row <= endRow; row += 1) {
137
+ _loop_1(row);
138
+ }
139
+ }
140
+ }
141
+ });
142
+ return multiWeekSchedules;
143
+ }, [days, getSchedulesForDate, schedules]);
144
+ // 각 날짜별 다중 날짜 이벤트 개수 계산
145
+ var getMultiWeekSchedulesCountForDate = (0, react_1.useMemo)(function () {
146
+ var countMap = new Map();
147
+ days.forEach(function (date, index) {
148
+ var dateKey = date.toDateString();
149
+ var row = Math.floor(index / 7) + 2; // 헤더 고려
150
+ var col = (index % 7) + 1;
151
+ // 해당 날짜에 영향을 주는 다중 주 이벤트 개수 계산
152
+ var affectingSchedules = getMultiWeekSchedules.filter(function (schedule) {
153
+ var startRow = schedule.startRow, endRow = schedule.endRow, startCol = schedule.startCol, endCol = schedule.endCol;
154
+ // 같은 행에 있고, 컬럼 범위에 포함되는 경우
155
+ if (row >= startRow && row <= endRow) {
156
+ if (startRow === endRow) {
157
+ // 같은 행 내에서 컬럼 범위 체크
158
+ return col >= startCol && col <= endCol;
159
+ }
160
+ // 여러 행에 걸친 경우
161
+ if (row === startRow) {
162
+ return col >= startCol;
163
+ }
164
+ if (row === endRow) {
165
+ return col <= endCol;
166
+ }
167
+ return true; // 중간 행
168
+ }
169
+ return false;
170
+ });
171
+ countMap.set(dateKey, affectingSchedules.length);
172
+ });
173
+ return countMap;
174
+ }, [days, getMultiWeekSchedules]);
175
+ // 시작 요일에 따라 정렬된 요일 헤더 생성
176
+ var orderedDayTexts = (function () {
177
+ var weekDates = [];
178
+ var today = new Date();
179
+ var startIndex = startOfWeek === 'monday' ? 1 : 0;
180
+ var firstDayOfWeek = new Date(today);
181
+ firstDayOfWeek.setDate(today.getDate() - ((today.getDay() - startIndex + 7) % 7));
182
+ for (var i = 0; i < 7; i += 1) {
183
+ var date = new Date(firstDayOfWeek);
184
+ date.setDate(firstDayOfWeek.getDate() + i);
185
+ weekDates.push(getDayTextByDate(date));
186
+ }
187
+ return weekDates;
188
+ })();
189
+ return ((0, jsx_runtime_1.jsxs)(S_MonthlyGrid, __assign({ "data-calendar-grid": true }, { children: [orderedDayTexts.map(function (day, index) { return ((0, jsx_runtime_1.jsx)(S_DayHeader, { children: (0, jsx_runtime_1.jsx)(TextLabel_1.TextLabel, { styleTheme: "caption2Bold", textAlign: "center", colorTheme: "sysTextSecondary", text: day }) }, "".concat(day, "-").concat(index))); }), days.map(function (date, index) {
190
+ var daySchedules = getSchedulesForDate(date);
191
+ var multiWeekSchedulesCount = getMultiWeekSchedulesCountForDate.get(date.toDateString()) || 0;
192
+ // 다중 날짜 이벤트를 제외한 이벤트들 (종일 이벤트 + 단일 날짜 시간 이벤트)
193
+ var visibleSchedules = daySchedules.filter(function (schedule) {
194
+ var scheduleStart = new Date(schedule.startDate);
195
+ var scheduleEnd = new Date(schedule.endDate);
196
+ var checkDate = new Date(date);
197
+ // 날짜 비교를 위해 시간을 00:00:00으로 설정
198
+ scheduleStart.setHours(0, 0, 0, 0);
199
+ scheduleEnd.setHours(0, 0, 0, 0);
200
+ checkDate.setHours(0, 0, 0, 0);
201
+ // 다중 날짜 이벤트가 아닌 경우만 포함 (단일 날짜 종일/시간 이벤트)
202
+ if (scheduleStart.getTime() !== scheduleEnd.getTime()) {
203
+ return false; // 다중 날짜 이벤트 제외
204
+ }
205
+ // 해당 날짜의 이벤트인 경우만 포함
206
+ return scheduleStart.getTime() === checkDate.getTime();
207
+ });
208
+ // 이벤트를 시작 시간순으로 정렬
209
+ visibleSchedules.sort(function (a, b) {
210
+ var timeA = new Date(a.startDate).getTime();
211
+ var timeB = new Date(b.startDate).getTime();
212
+ return timeA - timeB;
213
+ });
214
+ // 총 이벤트 개수 (다중 날짜 이벤트 + 단일 날짜 이벤트)
215
+ var totalEventsCount = multiWeekSchedulesCount + visibleSchedules.length;
216
+ // 표시 가능한 최대 이벤트 개수 (다중 날짜 이벤트 공간 고려)
217
+ var maxDisplayableEvents = Math.max(0, MAX_SCHEDULES_PER_DAY - multiWeekSchedulesCount);
218
+ var displayedSchedules = visibleSchedules.slice(0, maxDisplayableEvents);
219
+ var hiddenSchedulesCount = visibleSchedules.length - displayedSchedules.length;
220
+ return ((0, jsx_runtime_1.jsxs)(S_CalendarCell, __assign({ "$isCurrentMonth": date.getMonth() === selectedDate.getMonth(), "$isToday": isToday(date), "$isSelected": selectedDates.some(function (selectedDate) { return selectedDate.toDateString() === date.toDateString(); }) ||
221
+ !!(dragStartDate &&
222
+ dragEndDate &&
223
+ date.getTime() >= Math.min(dragStartDate.getTime(), dragEndDate.getTime()) &&
224
+ date.getTime() <= Math.max(dragStartDate.getTime(), dragEndDate.getTime())), "$isPast": isPastDate(date), "$isDragOver": (isDragOverDate === null || isDragOverDate === void 0 ? void 0 : isDragOverDate.toDateString()) === date.toDateString(), onClick: function (e) { return handleDateClick(date, e); }, onMouseUp: handleMouseUp, onDragOver: function (e) { return handleDateDragOver(date, e); }, onDragLeave: handleDateDragLeave, onDrop: function (e) { return handleDateDrop(date, e); } }, { children: [(0, jsx_runtime_1.jsx)(TextLabel_1.TextLabel, { styleTheme: isToday(date) ? 'caption2Bold' : 'caption2Regular', textAlign: "center", colorTheme: isToday(date) ? 'sysTextBrandPrimary' : 'sysTextSecondary', text: date.getDate().toString() }), (0, jsx_runtime_1.jsxs)(S_SchedulesContainer, __assign({ "$multiWeekSchedulesCount": multiWeekSchedulesCount }, { children: [displayedSchedules.map(function (schedule) {
225
+ return renderScheduleItem(schedule, {
226
+ onDragStart: function (e) { return handleScheduleDragStart === null || handleScheduleDragStart === void 0 ? void 0 : handleScheduleDragStart(schedule, e); },
227
+ onDragEnd: function () { return handleScheduleDragEnd === null || handleScheduleDragEnd === void 0 ? void 0 : handleScheduleDragEnd(); }
228
+ });
229
+ }), totalEventsCount >= 3 && hiddenSchedulesCount > 0 && ((0, jsx_runtime_1.jsx)(TextLabel_1.TextLabel, { text: "".concat(hiddenSchedulesCount, " ").concat(t('calendar_more_schedules')), styleTheme: "caption2Regular" }))] }))] }), index));
230
+ }), (0, jsx_runtime_1.jsx)(MultiWeekSchedulesLayer_1.MultiWeekSchedulesLayer, { multiWeekSchedules: getMultiWeekSchedules, selectedSchedules: selectedSchedules, handleScheduleClick: handleScheduleClick, handleScheduleDragStart: handleScheduleDragStart, handleScheduleDragEnd: handleScheduleDragEnd })] })));
231
+ };
232
+ exports.MonthlyView = MonthlyView;
233
+ var S_MonthlyGrid = styled_components_1.default.div(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n display: grid;\n gap: 0;\n grid-template-columns: repeat(7, 1fr);\n grid-template-rows: auto repeat(6, 1fr); /* \uD5E4\uB354\uB294 auto, \uB098\uBA38\uC9C0 6\uC8FC\uB294 \uB3D9\uC77C\uD55C \uB192\uC774 */\n height: 100%; /* \uC140 \uAC04\uACA9\uC744 \uC81C\uAC70\uD558\uC5EC \uC774\uBCA4\uD2B8\uAC00 \uC5F0\uACB0\uB418\uC5B4 \uBCF4\uC774\uB3C4\uB85D */\n overflow-x: hidden; /* \uADF8\uB9AC\uB4DC \uACBD\uACC4\uB97C \uB118\uB294 \uC694\uC18C\uB97C \uC228\uAE40 */\n position: relative;\n"], ["\n display: grid;\n gap: 0;\n grid-template-columns: repeat(7, 1fr);\n grid-template-rows: auto repeat(6, 1fr); /* \uD5E4\uB354\uB294 auto, \uB098\uBA38\uC9C0 6\uC8FC\uB294 \uB3D9\uC77C\uD55C \uB192\uC774 */\n height: 100%; /* \uC140 \uAC04\uACA9\uC744 \uC81C\uAC70\uD558\uC5EC \uC774\uBCA4\uD2B8\uAC00 \uC5F0\uACB0\uB418\uC5B4 \uBCF4\uC774\uB3C4\uB85D */\n overflow-x: hidden; /* \uADF8\uB9AC\uB4DC \uACBD\uACC4\uB97C \uB118\uB294 \uC694\uC18C\uB97C \uC228\uAE40 */\n position: relative;\n"])));
234
+ var S_DayHeader = styled_components_1.default.div(templateObject_2 || (templateObject_2 = __makeTemplateObject(["\n border-bottom: 1px solid ", ";\n padding: 12px 8px;\n text-align: center;\n"], ["\n border-bottom: 1px solid ", ";\n padding: 12px 8px;\n text-align: center;\n"])), function (_a) {
235
+ var theme = _a.theme;
236
+ return theme.ui_cpnt_divider;
237
+ });
238
+ var S_CalendarCell = styled_components_1.default.div(templateObject_3 || (templateObject_3 = __makeTemplateObject(["\n background-color: ", ";\n border-bottom: 1px solid ", ";\n border-right: 1px solid ", ";\n cursor: pointer;\n min-height: 120px;\n min-width: 0;\n overflow: hidden;\n padding: 4px;\n position: relative;\n transition: background-color 0.2s;\n\n &:hover {\n background-color: ", ";\n }\n\n &:nth-child(7n + 1) {\n border-left: 1px solid ", ";\n }\n\n &:nth-child(-n + 7) {\n border-top: 1px solid ", ";\n }\n"], ["\n background-color: ", ";\n border-bottom: 1px solid ", ";\n border-right: 1px solid ", ";\n cursor: pointer;\n min-height: 120px;\n min-width: 0;\n overflow: hidden;\n padding: 4px;\n position: relative;\n transition: background-color 0.2s;\n\n &:hover {\n background-color: ", ";\n }\n\n &:nth-child(7n + 1) {\n border-left: 1px solid ", ";\n }\n\n &:nth-child(-n + 7) {\n border-top: 1px solid ", ";\n }\n"])), function (_a) {
239
+ var $isSelected = _a.$isSelected, theme = _a.theme;
240
+ if ($isSelected)
241
+ return theme.ui_cpnt_sheet_base;
242
+ return 'transparent';
243
+ }, function (_a) {
244
+ var theme = _a.theme;
245
+ return theme.ui_cpnt_divider;
246
+ }, function (_a) {
247
+ var theme = _a.theme;
248
+ return theme.ui_cpnt_divider;
249
+ }, function (_a) {
250
+ var theme = _a.theme;
251
+ return theme.ui_cpnt_sheet_base;
252
+ }, function (_a) {
253
+ var theme = _a.theme;
254
+ return theme.ui_cpnt_divider;
255
+ }, function (_a) {
256
+ var theme = _a.theme;
257
+ return theme.ui_cpnt_divider;
258
+ });
259
+ var S_SchedulesContainer = styled_components_1.default.div(templateObject_4 || (templateObject_4 = __makeTemplateObject(["\n display: flex;\n flex: 1;\n flex-direction: column;\n margin-top: ", "px;\n max-width: 100%;\n overflow: hidden;\n position: relative;\n"], ["\n display: flex;\n flex: 1;\n flex-direction: column;\n margin-top: ", "px;\n max-width: 100%;\n overflow: hidden;\n position: relative;\n"])), function (_a) {
260
+ var _b = _a.$multiWeekSchedulesCount, $multiWeekSchedulesCount = _b === void 0 ? 0 : _b;
261
+ return $multiWeekSchedulesCount * 28;
262
+ });
263
+ var templateObject_1, templateObject_2, templateObject_3, templateObject_4;
@@ -0,0 +1,19 @@
1
+ import type { Schedule } from './types';
2
+ import type React from 'react';
3
+ interface MultiWeekScheduleInfo {
4
+ schedule: Schedule;
5
+ startRow: number;
6
+ endRow: number;
7
+ startCol: number;
8
+ endCol: number;
9
+ scheduleIndex: number;
10
+ }
11
+ interface MultiWeekSchedulesLayerProps {
12
+ multiWeekSchedules: MultiWeekScheduleInfo[];
13
+ selectedSchedules: Schedule[];
14
+ handleScheduleClick?: (schedule: Schedule, e?: React.MouseEvent) => void;
15
+ handleScheduleDragStart?: (schedule: Schedule, e: React.DragEvent) => void;
16
+ handleScheduleDragEnd?: () => void;
17
+ }
18
+ export declare const MultiWeekSchedulesLayer: React.FC<MultiWeekSchedulesLayerProps>;
19
+ export {};
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ var __makeTemplateObject = (this && this.__makeTemplateObject) || function (cooked, raw) {
3
+ if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; }
4
+ return cooked;
5
+ };
6
+ var __assign = (this && this.__assign) || function () {
7
+ __assign = Object.assign || function(t) {
8
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
9
+ s = arguments[i];
10
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
11
+ t[p] = s[p];
12
+ }
13
+ return t;
14
+ };
15
+ return __assign.apply(this, arguments);
16
+ };
17
+ var __importDefault = (this && this.__importDefault) || function (mod) {
18
+ return (mod && mod.__esModule) ? mod : { "default": mod };
19
+ };
20
+ Object.defineProperty(exports, "__esModule", { value: true });
21
+ exports.MultiWeekSchedulesLayer = void 0;
22
+ var jsx_runtime_1 = require("react/jsx-runtime");
23
+ var styled_components_1 = __importDefault(require("styled-components"));
24
+ var TextLabel_1 = require("../TextLabel");
25
+ var ScheduleItem_1 = require("./ScheduleItem");
26
+ var MultiWeekSchedulesLayer = function (_a) {
27
+ var multiWeekSchedules = _a.multiWeekSchedules, selectedSchedules = _a.selectedSchedules, handleScheduleClick = _a.handleScheduleClick, handleScheduleDragStart = _a.handleScheduleDragStart, handleScheduleDragEnd = _a.handleScheduleDragEnd;
28
+ return ((0, jsx_runtime_1.jsx)(S_Layer, { children: multiWeekSchedules.map(function (_a) {
29
+ var schedule = _a.schedule, startRow = _a.startRow, endRow = _a.endRow, startCol = _a.startCol, endCol = _a.endCol, scheduleIndex = _a.scheduleIndex;
30
+ var isSameRow = startRow === endRow;
31
+ var isSelected = selectedSchedules.some(function (s) { return s.id === schedule.id; });
32
+ var uniqueKey = "multi-".concat(schedule.id, "-").concat(startRow, "-").concat(startCol, "-").concat(endCol);
33
+ if (isSameRow) {
34
+ return ((0, jsx_runtime_1.jsxs)(S_MultiWeekSchedule, __assign({ "$color": schedule.color, "$startRow": startRow, "$endRow": endRow, "$startCol": startCol, "$endCol": endCol, "$scheduleIndex": scheduleIndex, "$isSelected": isSelected, draggable: true, onDragStart: function (e) {
35
+ handleScheduleDragStart === null || handleScheduleDragStart === void 0 ? void 0 : handleScheduleDragStart(schedule, e);
36
+ }, onDragEnd: handleScheduleDragEnd, onClick: function (e) {
37
+ e.stopPropagation();
38
+ handleScheduleClick === null || handleScheduleClick === void 0 ? void 0 : handleScheduleClick(schedule, e);
39
+ } }, { children: [(0, jsx_runtime_1.jsx)(ScheduleItem_1.S_Dot, { "$isSelected": isSelected }), (0, jsx_runtime_1.jsx)(TextLabel_1.TextLabel, { styleTheme: "caption2Regular", text: schedule.title, ellipsisMode: "use", colorTheme: isSelected ? 'sysTextWhite' : undefined })] }), uniqueKey));
40
+ }
41
+ // 여러 행에 걸친 이벤트 처리
42
+ var segments = [];
43
+ for (var row = startRow; row <= endRow; row += 1) {
44
+ var isFirstRow = row === startRow;
45
+ var isLastRow = row === endRow;
46
+ var segmentStartCol = isFirstRow ? startCol : 1;
47
+ var segmentEndCol = isLastRow ? endCol : 7;
48
+ segments.push((0, jsx_runtime_1.jsxs)(S_MultiWeekSchedule, __assign({ "$color": schedule.color, "$startRow": row, "$endRow": row, "$startCol": segmentStartCol, "$endCol": segmentEndCol, "$scheduleIndex": scheduleIndex, "$isSelected": isSelected, draggable: true, onDragStart: function (e) {
49
+ handleScheduleDragStart === null || handleScheduleDragStart === void 0 ? void 0 : handleScheduleDragStart(schedule, e);
50
+ }, onDragEnd: handleScheduleDragEnd, onClick: function (e) {
51
+ e.stopPropagation();
52
+ handleScheduleClick === null || handleScheduleClick === void 0 ? void 0 : handleScheduleClick(schedule, e);
53
+ } }, { children: [(0, jsx_runtime_1.jsx)(ScheduleItem_1.S_Dot, { "$isSelected": isSelected }), (0, jsx_runtime_1.jsx)(TextLabel_1.TextLabel, { styleTheme: "caption2Regular", text: schedule.title, ellipsisMode: "use", colorTheme: isSelected ? 'sysTextWhite' : undefined })] }), "".concat(uniqueKey, "-row-").concat(row)));
54
+ }
55
+ return segments;
56
+ }) }));
57
+ };
58
+ exports.MultiWeekSchedulesLayer = MultiWeekSchedulesLayer;
59
+ var S_Layer = styled_components_1.default.div(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n height: 100%;\n left: 0;\n pointer-events: none;\n position: absolute;\n top: 0;\n width: 100%; /* \uAE30\uBCF8\uC801\uC73C\uB85C \uC774\uBCA4\uD2B8\uB97C \uB9C9\uACE0, \uB0B4\uBD80 \uC2A4\uCF00\uC904\uC5D0\uC11C\uB9CC \uC774\uBCA4\uD2B8 \uD5C8\uC6A9 */\n z-index: 10;\n\n & > * {\n pointer-events: auto;\n }\n"], ["\n height: 100%;\n left: 0;\n pointer-events: none;\n position: absolute;\n top: 0;\n width: 100%; /* \uAE30\uBCF8\uC801\uC73C\uB85C \uC774\uBCA4\uD2B8\uB97C \uB9C9\uACE0, \uB0B4\uBD80 \uC2A4\uCF00\uC904\uC5D0\uC11C\uB9CC \uC774\uBCA4\uD2B8 \uD5C8\uC6A9 */\n z-index: 10;\n\n & > * {\n pointer-events: auto;\n }\n"])));
60
+ var S_MultiWeekSchedule = styled_components_1.default.div(templateObject_2 || (templateObject_2 = __makeTemplateObject(["\n align-items: center;\n background-color: ", ";\n border-radius: 4px;\n color: white;\n cursor: pointer;\n display: flex;\n font-size: 12px;\n height: 20px;\n left: ", ";\n padding: 2px 6px;\n position: absolute;\n top: ", ";\n user-select: none;\n width: ", ";\n z-index: 10;\n\n &:active {\n background: ", ";\n cursor: grabbing;\n }\n"], ["\n align-items: center;\n background-color: ", ";\n border-radius: 4px;\n color: white;\n cursor: pointer;\n display: flex;\n font-size: 12px;\n height: 20px;\n left: ", ";\n padding: 2px 6px;\n position: absolute;\n top: ", ";\n user-select: none;\n width: ", ";\n z-index: 10;\n\n &:active {\n background: ", ";\n cursor: grabbing;\n }\n"])), function (props) {
61
+ return props.$isSelected ? props.theme.ui_cpnt_sheet_base_06 : props.theme.ui_cpnt_sheet_base;
62
+ }, function (props) { return "calc((".concat(props.$startCol - 1, ") * (100% / 7) + 4px)"); }, function (props) {
63
+ var rowNumber = props.$startRow - 2;
64
+ var dateMargin = 35;
65
+ var scheduleSpacing = (props.$scheduleIndex || 0) * 26;
66
+ var weekStartPositions = [36, 164, 294, 422, 550];
67
+ var baseTop = weekStartPositions[rowNumber] || weekStartPositions[0];
68
+ return "calc(".concat(baseTop, "px + ").concat(dateMargin, "px + ").concat(scheduleSpacing, "px)");
69
+ }, function (props) { return "calc((".concat(props.$endCol - props.$startCol + 1, ") * (100% / 7) - 21px)"); }, function (_a) {
70
+ var theme = _a.theme;
71
+ return theme.ui_cpnt_sheet_base_06;
72
+ });
73
+ var templateObject_1, templateObject_2;
@@ -0,0 +1,16 @@
1
+ import type { Schedule } from './types';
2
+ import type React from 'react';
3
+ interface ScheduleItemProps {
4
+ schedule: Schedule;
5
+ extraProps?: any;
6
+ onDragStart: (schedule: Schedule, e: React.DragEvent) => void;
7
+ onDragEnd: () => void;
8
+ onClick?: (schedule: Schedule, e?: React.MouseEvent) => void;
9
+ isSelected?: boolean;
10
+ isAllDay?: boolean;
11
+ }
12
+ export declare const ScheduleItem: React.FC<ScheduleItemProps>;
13
+ export declare const S_Dot: import("styled-components").StyledComponent<"div", import("styled-components").DefaultTheme, {
14
+ $isSelected?: boolean | undefined;
15
+ }, never>;
16
+ export {};
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ var __makeTemplateObject = (this && this.__makeTemplateObject) || function (cooked, raw) {
3
+ if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; }
4
+ return cooked;
5
+ };
6
+ var __assign = (this && this.__assign) || function () {
7
+ __assign = Object.assign || function(t) {
8
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
9
+ s = arguments[i];
10
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
11
+ t[p] = s[p];
12
+ }
13
+ return t;
14
+ };
15
+ return __assign.apply(this, arguments);
16
+ };
17
+ var __importDefault = (this && this.__importDefault) || function (mod) {
18
+ return (mod && mod.__esModule) ? mod : { "default": mod };
19
+ };
20
+ Object.defineProperty(exports, "__esModule", { value: true });
21
+ exports.S_Dot = exports.ScheduleItem = void 0;
22
+ var jsx_runtime_1 = require("react/jsx-runtime");
23
+ var styled_components_1 = __importDefault(require("styled-components"));
24
+ var TextLabel_1 = require("../TextLabel");
25
+ var ScheduleItem = function (_a) {
26
+ var schedule = _a.schedule, _b = _a.extraProps, extraProps = _b === void 0 ? {} : _b, onDragStart = _a.onDragStart, onDragEnd = _a.onDragEnd, onClick = _a.onClick, _c = _a.isSelected, isSelected = _c === void 0 ? false : _c, _d = _a.isAllDay, isAllDay = _d === void 0 ? false : _d;
27
+ return ((0, jsx_runtime_1.jsxs)(S_ScheduleItem, __assign({ "$color": schedule.color, "$position": "single", "$isSelected": isSelected, "$isAllday": isAllDay, draggable: true, onDragStart: function (e) { return onDragStart(schedule, e); }, onDragEnd: onDragEnd, onClick: function (e) {
28
+ e.stopPropagation();
29
+ onClick === null || onClick === void 0 ? void 0 : onClick(schedule, e);
30
+ } }, extraProps, { children: [(0, jsx_runtime_1.jsx)(exports.S_Dot, { "$isSelected": isSelected }), (0, jsx_runtime_1.jsx)(S_TextContainer, { children: (0, jsx_runtime_1.jsx)(TextLabel_1.TextLabel, { styleTheme: "caption2Regular", text: schedule.title, colorTheme: isSelected ? 'sysTextWhite' : undefined, ellipsisMode: "use", singleLineMode: "use" }) })] }), schedule.id));
31
+ };
32
+ exports.ScheduleItem = ScheduleItem;
33
+ var S_ScheduleItem = styled_components_1.default.div(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n align-items: center;\n background: ", ";\n border: ", ";\n border-radius: 4px;\n cursor: grab;\n display: flex;\n flex-shrink: 1;\n max-width: 100%;\n min-width: 0;\n overflow: hidden;\n padding: 2px 6px;\n position: relative;\n transition: opacity 0.2s ease, transform 0.2s ease;\n\n &:active {\n background: ", ";\n cursor: grabbing;\n }\n"], ["\n align-items: center;\n background: ", ";\n border: ", ";\n border-radius: 4px;\n cursor: grab;\n display: flex;\n flex-shrink: 1;\n max-width: 100%;\n min-width: 0;\n overflow: hidden;\n padding: 2px 6px;\n position: relative;\n transition: opacity 0.2s ease, transform 0.2s ease;\n\n &:active {\n background: ", ";\n cursor: grabbing;\n }\n"])), function (props) {
34
+ if (props.$isSelected)
35
+ return props.theme.ui_cpnt_sheet_base_06;
36
+ if (props.$isAllday)
37
+ return props.theme.ui_cpnt_sheet_base;
38
+ return 'transparent';
39
+ }, function (props) {
40
+ return props.$isSelected ? "2px solid ".concat(props.theme.ui_cpnt_sheet_base_06) : '2px solid transparent';
41
+ }, function (_a) {
42
+ var theme = _a.theme;
43
+ return theme.ui_cpnt_sheet_base_06;
44
+ });
45
+ var S_TextContainer = styled_components_1.default.div(templateObject_2 || (templateObject_2 = __makeTemplateObject(["\n flex: 1;\n max-width: 85%;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n /* TextLabel \uB0B4\uBD80 \uC694\uC18C\uC5D0\uB3C4 \uD55C \uC904 \uC81C\uD55C \uC801\uC6A9 */\n * {\n line-height: 1 !important;\n max-height: 1em !important;\n overflow: hidden !important;\n text-overflow: ellipsis !important;\n white-space: nowrap !important;\n }\n"], ["\n flex: 1;\n max-width: 85%;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n /* TextLabel \uB0B4\uBD80 \uC694\uC18C\uC5D0\uB3C4 \uD55C \uC904 \uC81C\uD55C \uC801\uC6A9 */\n * {\n line-height: 1 !important;\n max-height: 1em !important;\n overflow: hidden !important;\n text-overflow: ellipsis !important;\n white-space: nowrap !important;\n }\n"])));
46
+ exports.S_Dot = styled_components_1.default.div(templateObject_3 || (templateObject_3 = __makeTemplateObject(["\n background: ", ";\n border-radius: 50%;\n height: 4px;\n margin-right: 4px;\n width: 4px;\n"], ["\n background: ", ";\n border-radius: 50%;\n height: 4px;\n margin-right: 4px;\n width: 4px;\n"])), function (_a) {
47
+ var $isSelected = _a.$isSelected, theme = _a.theme;
48
+ return $isSelected ? theme.ui_cpnt_icon_sys_white : theme.ui_cpnt_icon_sys_grey_02;
49
+ });
50
+ var templateObject_1, templateObject_2, templateObject_3;
@@ -0,0 +1,9 @@
1
+ import type { Schedule } from './types';
2
+ import type React from 'react';
3
+ interface TimeBasedScheduleItemProps {
4
+ schedules: Schedule[];
5
+ handleScheduleDragStart: (schedule: Schedule, e: React.DragEvent) => void;
6
+ handleScheduleDragEnd: () => void;
7
+ }
8
+ export declare const TimeBasedScheduleItem: React.FC<TimeBasedScheduleItemProps>;
9
+ export {};
@@ -0,0 +1,170 @@
1
+ "use strict";
2
+ var __makeTemplateObject = (this && this.__makeTemplateObject) || function (cooked, raw) {
3
+ if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; }
4
+ return cooked;
5
+ };
6
+ var __assign = (this && this.__assign) || function () {
7
+ __assign = Object.assign || function(t) {
8
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
9
+ s = arguments[i];
10
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
11
+ t[p] = s[p];
12
+ }
13
+ return t;
14
+ };
15
+ return __assign.apply(this, arguments);
16
+ };
17
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
18
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
19
+ if (ar || !(i in from)) {
20
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
21
+ ar[i] = from[i];
22
+ }
23
+ }
24
+ return to.concat(ar || Array.prototype.slice.call(from));
25
+ };
26
+ var __importDefault = (this && this.__importDefault) || function (mod) {
27
+ return (mod && mod.__esModule) ? mod : { "default": mod };
28
+ };
29
+ Object.defineProperty(exports, "__esModule", { value: true });
30
+ exports.TimeBasedScheduleItem = void 0;
31
+ var jsx_runtime_1 = require("react/jsx-runtime");
32
+ var react_1 = require("react");
33
+ var react_i18next_1 = require("react-i18next");
34
+ var styled_components_1 = __importDefault(require("styled-components"));
35
+ var TextLabel_1 = require("../TextLabel");
36
+ var calendarUtils_1 = require("./calendarUtils");
37
+ var timeFormatUtils_1 = require("./timeFormatUtils");
38
+ var TimeBasedScheduleItem = function (_a) {
39
+ var schedules = _a.schedules, handleScheduleDragStart = _a.handleScheduleDragStart, handleScheduleDragEnd = _a.handleScheduleDragEnd;
40
+ var _b = (0, react_i18next_1.useTranslation)(), i18n = _b.i18n, t = _b.t;
41
+ // 시간별 스케줄 계산 및 grid 위치 할당
42
+ var timedSchedulesWithGrid = (0, react_1.useMemo)(function () {
43
+ var filteredSchedules = schedules.filter(function (schedule) { return !(0, calendarUtils_1.calculateIsAllDay)(new Date(schedule.startDate), new Date(schedule.endDate)); });
44
+ // 시간 순으로 정렬 (시작 시간 기준, 시작시간이 같으면 duration이 짧은 순)
45
+ var sortedSchedules = __spreadArray([], filteredSchedules, true).sort(function (a, b) {
46
+ var startTimeA = new Date(a.startDate).getTime();
47
+ var startTimeB = new Date(b.startDate).getTime();
48
+ // 시작시간이 다르면 시작시간 기준으로 정렬
49
+ if (startTimeA !== startTimeB) {
50
+ return startTimeA - startTimeB;
51
+ }
52
+ // 시작시간이 같으면 duration이 짧은 순으로 정렬
53
+ var durationA = new Date(a.endDate).getTime() - startTimeA;
54
+ var durationB = new Date(b.endDate).getTime() - startTimeB;
55
+ return durationA - durationB;
56
+ });
57
+ // 모든 겹치는 스케줄 그룹을 찾기 위한 Union-Find 알고리즘 사용
58
+ var parent = new Map();
59
+ var find = function (x) {
60
+ if (parent.get(x) !== x) {
61
+ parent.set(x, find(parent.get(x)));
62
+ }
63
+ return parent.get(x);
64
+ };
65
+ var union = function (x, y) {
66
+ var rootX = find(x);
67
+ var rootY = find(y);
68
+ if (rootX !== rootY) {
69
+ parent.set(rootX, rootY);
70
+ }
71
+ };
72
+ // 초기화: 각 스케줄을 자기 자신의 parent로 설정
73
+ sortedSchedules.forEach(function (schedule) {
74
+ parent.set(schedule.id, schedule.id);
75
+ });
76
+ // 겹치는 스케줄들을 연결
77
+ for (var i = 0; i < sortedSchedules.length; i += 1) {
78
+ for (var j = i + 1; j < sortedSchedules.length; j += 1) {
79
+ var schedule1 = sortedSchedules[i];
80
+ var schedule2 = sortedSchedules[j];
81
+ var start1 = new Date(schedule1.startDate).getTime();
82
+ var end1 = new Date(schedule1.endDate).getTime();
83
+ var start2 = new Date(schedule2.startDate).getTime();
84
+ var end2 = new Date(schedule2.endDate).getTime();
85
+ // 시간 겹침 확인: (start1 < end2) && (start2 < end1)
86
+ if (start1 < end2 && start2 < end1) {
87
+ union(schedule1.id, schedule2.id);
88
+ }
89
+ }
90
+ }
91
+ // 같은 그룹에 속하는 스케줄들끼리 묶기
92
+ var groups = new Map();
93
+ sortedSchedules.forEach(function (schedule) {
94
+ var root = find(schedule.id);
95
+ if (!groups.has(root)) {
96
+ groups.set(root, []);
97
+ }
98
+ groups.get(root).push(schedule);
99
+ });
100
+ // 각 그룹 내에서 grid 위치 할당
101
+ var schedulesWithGrid = [];
102
+ groups.forEach(function (group) {
103
+ // 그룹 내에서 정렬
104
+ var sortedGroup = group.sort(function (a, b) {
105
+ var startTimeA = new Date(a.startDate).getTime();
106
+ var startTimeB = new Date(b.startDate).getTime();
107
+ if (startTimeA !== startTimeB) {
108
+ return startTimeA - startTimeB;
109
+ }
110
+ var durationA = new Date(a.endDate).getTime() - startTimeA;
111
+ var durationB = new Date(b.endDate).getTime() - startTimeB;
112
+ return durationA - durationB;
113
+ });
114
+ var totalColumns = sortedGroup.length;
115
+ sortedGroup.forEach(function (schedule, index) {
116
+ schedulesWithGrid.push(__assign(__assign({}, schedule), { gridColumn: index, totalColumns: totalColumns }));
117
+ });
118
+ });
119
+ return schedulesWithGrid;
120
+ }, [schedules]);
121
+ return ((0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: timedSchedulesWithGrid.map(function (schedule) {
122
+ var startDate = new Date(schedule.startDate);
123
+ var endDate = new Date(schedule.endDate);
124
+ // 시간을 UTC에서 로컬 시간으로 변환
125
+ var localStartHour = startDate.getUTCHours();
126
+ var localEndHour = endDate.getUTCHours();
127
+ var localStartMinutes = startDate.getUTCMinutes();
128
+ var localEndMinutes = endDate.getUTCMinutes();
129
+ // 시작 시간과 끝 시간 계산 (분 단위)
130
+ var startMinutes = localStartHour * 60 + localStartMinutes;
131
+ var endMinutes = localEndHour * 60 + localEndMinutes;
132
+ var duration = Math.max(endMinutes - startMinutes, 30); // 최소 30분
133
+ // 지속시간 계산 (시간 단위)
134
+ var durationHours = duration / 60;
135
+ var durationText = durationHours === 1
136
+ ? "".concat(durationHours).concat(t('calendar_duration_hour'))
137
+ : "".concat(durationHours).concat(t('calendar_duration_hours'));
138
+ // 픽셀 단위로 변환 (각 시간은 60px)
139
+ var top = (startMinutes / 60) * 60;
140
+ var height = (duration / 60) * 60;
141
+ return ((0, jsx_runtime_1.jsx)(S_ScheduleItem, __assign({ "$top": top, "$height": height, "$gridColumn": schedule.gridColumn, "$totalColumns": schedule.totalColumns, draggable: true, onDragStart: function (e) { return handleScheduleDragStart === null || handleScheduleDragStart === void 0 ? void 0 : handleScheduleDragStart(schedule, e); }, onDragEnd: function () { return handleScheduleDragEnd === null || handleScheduleDragEnd === void 0 ? void 0 : handleScheduleDragEnd(); } }, { children: (0, jsx_runtime_1.jsxs)(S_ScheduleContent, { children: [(0, jsx_runtime_1.jsx)(S_ScheduleTime, { children: (0, jsx_runtime_1.jsx)(TextLabel_1.TextLabel, { styleTheme: "caption2Regular", text: "".concat((0, timeFormatUtils_1.formatTimeWithLocale)(localStartHour, i18n.language, t), " (").concat(durationText, ")"), ellipsisMode: "use", singleLineMode: "use" }) }), (0, jsx_runtime_1.jsx)(S_ScheduleTitle, { children: (0, jsx_runtime_1.jsx)(TextLabel_1.TextLabel, { styleTheme: "caption2Bold", text: schedule.title, ellipsisMode: "use", singleLineMode: "use" }) })] }) }), schedule.id));
142
+ }) }));
143
+ };
144
+ exports.TimeBasedScheduleItem = TimeBasedScheduleItem;
145
+ var S_ScheduleItem = styled_components_1.default.div(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n background: ", ";\n border: 1px solid ", ";\n border-left: 2px solid ", ";\n border-radius: 4px;\n cursor: grab;\n height: ", "px;\n left: ", ";\n overflow: hidden;\n position: absolute;\n top: ", "px;\n width: ", ";\n z-index: 9;\n &:active {\n cursor: grabbing;\n }\n"], ["\n background: ", ";\n border: 1px solid ", ";\n border-left: 2px solid ", ";\n border-radius: 4px;\n cursor: grab;\n height: ", "px;\n left: ", ";\n overflow: hidden;\n position: absolute;\n top: ", "px;\n width: ", ";\n z-index: 9;\n &:active {\n cursor: grabbing;\n }\n"])), function (_a) {
146
+ var theme = _a.theme;
147
+ return theme.ui_cpnt_sheet_base;
148
+ }, function (_a) {
149
+ var theme = _a.theme;
150
+ return theme.ui_temp_white;
151
+ }, function (_a) {
152
+ var theme = _a.theme;
153
+ return theme.ui_temp_grey_02;
154
+ }, function (_a) {
155
+ var $height = _a.$height;
156
+ return $height - 10;
157
+ }, function (_a) {
158
+ var $gridColumn = _a.$gridColumn, $totalColumns = _a.$totalColumns;
159
+ return "calc(".concat($gridColumn, " * (100% / ").concat($totalColumns, "))");
160
+ }, function (_a) {
161
+ var $top = _a.$top;
162
+ return $top;
163
+ }, function (_a) {
164
+ var $totalColumns = _a.$totalColumns;
165
+ return "calc(100% / ".concat($totalColumns, ")");
166
+ });
167
+ var S_ScheduleContent = styled_components_1.default.div(templateObject_2 || (templateObject_2 = __makeTemplateObject(["\n display: flex;\n flex-direction: column;\n justify-content: flex-start;\n padding: 4px 6px;\n"], ["\n display: flex;\n flex-direction: column;\n justify-content: flex-start;\n padding: 4px 6px;\n"])));
168
+ var S_ScheduleTitle = styled_components_1.default.div(templateObject_3 || (templateObject_3 = __makeTemplateObject(["\n margin-bottom: 2px;\n"], ["\n margin-bottom: 2px;\n"])));
169
+ var S_ScheduleTime = styled_components_1.default.div(templateObject_4 || (templateObject_4 = __makeTemplateObject(["\n margin-top: auto;\n"], ["\n margin-top: auto;\n"])));
170
+ var templateObject_1, templateObject_2, templateObject_3, templateObject_4;
@@ -0,0 +1,21 @@
1
+ import React from 'react';
2
+ import type { Schedule, displayAllDayScheduleMode } from './types';
3
+ interface WeeklyViewProps {
4
+ selectedDate: Date;
5
+ startOfWeek: 'sunday' | 'monday';
6
+ getDayTextByDate: (date: Date) => string;
7
+ defaultViewType: string;
8
+ displayAllDayScheduleMode?: displayAllDayScheduleMode;
9
+ getSchedulesForDate: (date: Date) => Schedule[];
10
+ isToday: (date: Date) => boolean;
11
+ isDragOverDate: Date | null;
12
+ handleDateDragOver: (date: Date, e: React.DragEvent) => void;
13
+ handleDateDragLeave: () => void;
14
+ handleDateDrop: (date: Date, e: React.DragEvent) => void;
15
+ handleDateClick: (date: Date) => void;
16
+ renderScheduleItem: (schedule: Schedule, extraProps?: any) => React.ReactNode;
17
+ handleScheduleDragStart: (schedule: Schedule, e: React.DragEvent) => void;
18
+ handleScheduleDragEnd: () => void;
19
+ }
20
+ export declare const WeeklyView: React.FC<WeeklyViewProps>;
21
+ export {};