@react-fabric/date 1.0.0-beta.0

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 (105) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +10 -0
  3. package/dist/cjs/components/Date.module.css +1 -0
  4. package/dist/cjs/components/DateCell.js +98 -0
  5. package/dist/cjs/components/DateHeader.js +142 -0
  6. package/dist/cjs/components/DatePage.js +59 -0
  7. package/dist/cjs/components/DecadePage.js +34 -0
  8. package/dist/cjs/components/MonthPage.js +33 -0
  9. package/dist/cjs/components/TimeSliders.js +131 -0
  10. package/dist/cjs/components/YearPage.js +34 -0
  11. package/dist/cjs/display/DateDisplay.js +35 -0
  12. package/dist/cjs/hijri/index.js +1029 -0
  13. package/dist/cjs/i18n/ar.json.js +25 -0
  14. package/dist/cjs/i18n/en.json.js +21 -0
  15. package/dist/cjs/i18n/index.js +39 -0
  16. package/dist/cjs/i18n/superdate/ar.json.js +86 -0
  17. package/dist/cjs/i18n/superdate/en.json.js +93 -0
  18. package/dist/cjs/index.js +20 -0
  19. package/dist/cjs/panels/BasePanel.js +73 -0
  20. package/dist/cjs/panels/DatePanel.js +205 -0
  21. package/dist/cjs/panels/RangePanel.js +340 -0
  22. package/dist/cjs/superdate/EventPanel.js +173 -0
  23. package/dist/cjs/superdate/QuickSelect.js +134 -0
  24. package/dist/cjs/superdate/RelativeInput.js +79 -0
  25. package/dist/cjs/superdate/RelativePanel.js +91 -0
  26. package/dist/cjs/superdate/SuperDate.module.css +1 -0
  27. package/dist/cjs/superdate/Superdate.js +169 -0
  28. package/dist/cjs/types/index.js +61 -0
  29. package/dist/cjs/utils/dateUtil.js +436 -0
  30. package/dist/esm/components/Date.module.css +1 -0
  31. package/dist/esm/components/DateCell.js +98 -0
  32. package/dist/esm/components/DateHeader.js +142 -0
  33. package/dist/esm/components/DatePage.js +59 -0
  34. package/dist/esm/components/DecadePage.js +34 -0
  35. package/dist/esm/components/MonthPage.js +33 -0
  36. package/dist/esm/components/TimeSliders.js +131 -0
  37. package/dist/esm/components/YearPage.js +34 -0
  38. package/dist/esm/display/DateDisplay.js +35 -0
  39. package/dist/esm/hijri/index.js +1029 -0
  40. package/dist/esm/i18n/ar.json.js +21 -0
  41. package/dist/esm/i18n/en.json.js +18 -0
  42. package/dist/esm/i18n/index.js +39 -0
  43. package/dist/esm/i18n/superdate/ar.json.js +79 -0
  44. package/dist/esm/i18n/superdate/en.json.js +85 -0
  45. package/dist/esm/index.js +9 -0
  46. package/dist/esm/panels/BasePanel.js +73 -0
  47. package/dist/esm/panels/DatePanel.js +205 -0
  48. package/dist/esm/panels/RangePanel.js +340 -0
  49. package/dist/esm/superdate/EventPanel.js +173 -0
  50. package/dist/esm/superdate/QuickSelect.js +134 -0
  51. package/dist/esm/superdate/RelativeInput.js +79 -0
  52. package/dist/esm/superdate/RelativePanel.js +91 -0
  53. package/dist/esm/superdate/SuperDate.module.css +1 -0
  54. package/dist/esm/superdate/Superdate.js +168 -0
  55. package/dist/esm/types/index.js +60 -0
  56. package/dist/esm/utils/dateUtil.js +438 -0
  57. package/dist/types/components/DateCell.d.ts +15 -0
  58. package/dist/types/components/DateHeader.d.ts +14 -0
  59. package/dist/types/components/DatePage.d.ts +6 -0
  60. package/dist/types/components/DecadePage.d.ts +6 -0
  61. package/dist/types/components/MonthPage.d.ts +6 -0
  62. package/dist/types/components/TimeSliders.d.ts +10 -0
  63. package/dist/types/components/YearPage.d.ts +6 -0
  64. package/dist/types/display/DateDisplay.d.ts +15 -0
  65. package/dist/types/hijri/index.d.ts +2 -0
  66. package/dist/types/i18n/index.d.ts +1 -0
  67. package/dist/types/index.d.ts +7 -0
  68. package/dist/types/panels/BasePanel.d.ts +25 -0
  69. package/dist/types/panels/DatePanel.d.ts +2 -0
  70. package/dist/types/panels/RangePanel.d.ts +2 -0
  71. package/dist/types/superdate/EventPanel.d.ts +4 -0
  72. package/dist/types/superdate/QuickSelect.d.ts +1 -0
  73. package/dist/types/superdate/RelativeInput.d.ts +1 -0
  74. package/dist/types/superdate/RelativePanel.d.ts +1 -0
  75. package/dist/types/superdate/Superdate.d.ts +17 -0
  76. package/dist/types/types/index.d.ts +70 -0
  77. package/dist/types/utils/dateUtil.d.ts +30 -0
  78. package/package.json +58 -0
  79. package/src/components/Date.module.css +75 -0
  80. package/src/components/DateCell.tsx +181 -0
  81. package/src/components/DateHeader.tsx +223 -0
  82. package/src/components/DatePage.tsx +107 -0
  83. package/src/components/DecadePage.tsx +53 -0
  84. package/src/components/MonthPage.tsx +52 -0
  85. package/src/components/TimeSliders.tsx +196 -0
  86. package/src/components/YearPage.tsx +53 -0
  87. package/src/display/DateDisplay.tsx +88 -0
  88. package/src/hijri/index.js +1540 -0
  89. package/src/i18n/ar.json +14 -0
  90. package/src/i18n/en.json +13 -0
  91. package/src/i18n/index.ts +31 -0
  92. package/src/i18n/superdate/ar.json +70 -0
  93. package/src/i18n/superdate/en.json +75 -0
  94. package/src/index.ts +32 -0
  95. package/src/panels/BasePanel.tsx +130 -0
  96. package/src/panels/DatePanel.tsx +235 -0
  97. package/src/panels/RangePanel.tsx +400 -0
  98. package/src/superdate/EventPanel.tsx +200 -0
  99. package/src/superdate/QuickSelect.tsx +121 -0
  100. package/src/superdate/RelativeInput.tsx +64 -0
  101. package/src/superdate/RelativePanel.tsx +103 -0
  102. package/src/superdate/SuperDate.module.css +30 -0
  103. package/src/superdate/Superdate.tsx +186 -0
  104. package/src/types/index.ts +121 -0
  105. package/src/utils/dateUtil.ts +551 -0
@@ -0,0 +1,340 @@
1
+ 'use client';
2
+
3
+ import _defineProperty from '@babel/runtime/helpers/defineProperty';
4
+ import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
5
+ import _objectWithoutProperties from '@babel/runtime/helpers/objectWithoutProperties';
6
+ import { useGlobals, useDebounce, Button } from '@react-fabric/core';
7
+ import { isEmpty, isArray } from '@react-fabric/utilities';
8
+ import classNames from 'classnames';
9
+ import { isAfter, addMonths, isBefore, isSameDay } from 'date-fns';
10
+ import { useState, useEffect, useReducer, useCallback } from 'react';
11
+ import { useTranslation } from 'react-i18next';
12
+ import { PageType } from '../types/index.js';
13
+ import { DateUtil } from '../utils/dateUtil.js';
14
+ import { BasePanel } from './BasePanel.js';
15
+ import { jsxs, jsx } from 'react/jsx-runtime';
16
+
17
+ var _excluded = ["className", "max", "min", "dateDisabled", "onChange", "showHijriToggle", "value", "withTime", "showApply"];
18
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
19
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
20
+ var RangePanel = function RangePanel(_ref) {
21
+ var className = _ref.className,
22
+ max = _ref.max,
23
+ min = _ref.min,
24
+ dateDisabled = _ref.dateDisabled,
25
+ onChange = _ref.onChange,
26
+ showHijriToggle = _ref.showHijriToggle,
27
+ value = _ref.value,
28
+ withTime = _ref.withTime,
29
+ _ref$showApply = _ref.showApply,
30
+ showApply = _ref$showApply === void 0 ? false : _ref$showApply,
31
+ rest = _objectWithoutProperties(_ref, _excluded);
32
+ var _useTranslation = useTranslation("date"),
33
+ t = _useTranslation.t;
34
+ var _useGlobals = useGlobals(),
35
+ currentCalendar = _useGlobals.currentCalendar;
36
+ var _useState = useState(currentCalendar === "hijri"),
37
+ _useState2 = _slicedToArray(_useState, 2),
38
+ isHijri = _useState2[0],
39
+ setHijri = _useState2[1];
40
+ var fireChange = useDebounce(onChange, [onChange]);
41
+ useEffect(function () {
42
+ setHijri(currentCalendar === "hijri");
43
+ }, [currentCalendar]);
44
+ var _useReducer = useReducer(function (state, action) {
45
+ if (action.type === "reset") {
46
+ if (!isEmpty(action.date)) {
47
+ var _action$date = _slicedToArray(action.date, 2),
48
+ start = _action$date[0],
49
+ end = _action$date[1];
50
+ var dateStart = new Date(start);
51
+ var dateEnd = new Date(end);
52
+ state.hilight = undefined;
53
+ state.selected = [dateStart, dateEnd];
54
+ state.start.pageDate = dateStart;
55
+ state.start.hour = dateStart.getHours();
56
+ state.start.minute = dateStart.getMinutes();
57
+ state.end.pageDate = dateEnd;
58
+ state.end.hour = dateEnd.getHours();
59
+ state.end.minute = dateEnd.getMinutes();
60
+ } else {
61
+ state.hilight = undefined;
62
+ state.selected = undefined;
63
+ state.start.pageDate = new Date();
64
+ state.start.hour = 0;
65
+ state.start.minute = 0;
66
+ state.end.pageDate = DateUtil.addMonths(new Date(), 1);
67
+ state.end.hour = 0;
68
+ state.end.minute = 0;
69
+ }
70
+ }
71
+ if (action.type === "changeDate") {
72
+ if (!state.hilight) {
73
+ state.hilight = [action.date, action.date];
74
+ state.start.pageDate = action.date;
75
+ state.end.pageDate = DateUtil.addMonths(action.date, 1, isHijri);
76
+ } else {
77
+ var isStartAfter = isAfter(state.hilight[0], action.date);
78
+ var _start = isStartAfter ? action.date : state.hilight[0];
79
+ var _end = isStartAfter ? state.hilight[0] : action.date;
80
+ state.selected = [_start, _end];
81
+ state.hilight = undefined;
82
+ state.start.pageDate = _start;
83
+ state.end.pageDate = _end;
84
+ }
85
+ }
86
+ if (action.type === "changeHilight") {
87
+ if (state.hilight && action.date) {
88
+ var _state$hilight = _slicedToArray(state.hilight, 1),
89
+ _start2 = _state$hilight[0];
90
+ state.hilight = [_start2, action.date];
91
+ } else {
92
+ state.hilight = undefined;
93
+ }
94
+ }
95
+ if (action.type === "changeTime") {
96
+ if (action.range === "start") {
97
+ state.start.hour = action.hour;
98
+ state.start.minute = action.minute;
99
+ if (state.selected) {
100
+ var _state$selected$, _state$selected$2;
101
+ (_state$selected$ = state.selected[0]) === null || _state$selected$ === void 0 || _state$selected$.setHours(action.hour);
102
+ (_state$selected$2 = state.selected[0]) === null || _state$selected$2 === void 0 || _state$selected$2.setMinutes(action.minute);
103
+ }
104
+ }
105
+ if (action.range === "end") {
106
+ state.end.hour = action.hour;
107
+ state.end.minute = action.minute;
108
+ if (state.selected) {
109
+ var _state$selected$3, _state$selected$4;
110
+ (_state$selected$3 = state.selected[1]) === null || _state$selected$3 === void 0 || _state$selected$3.setHours(action.hour);
111
+ (_state$selected$4 = state.selected[1]) === null || _state$selected$4 === void 0 || _state$selected$4.setMinutes(action.minute);
112
+ }
113
+ }
114
+ }
115
+ if (action.type === "changePage") {
116
+ state[action.range].page = action.page;
117
+ }
118
+ if (action.type === "changePageDate") {
119
+ state[action.range].pageDate = action.date;
120
+ if (action.pageChange) {
121
+ state[action.range].page = Math.max(state[action.range].page - 1, 0);
122
+ action.range === "start" && state.start.page === PageType.DATE && (state.end.pageDate = addMonths(action.date, 1));
123
+ }
124
+ }
125
+ if (action.type === "changeDate" || action.type === "changeTime") {
126
+ if (min && state.selected && isBefore(state.selected[0], new Date(min))) {
127
+ state.selected[0] = new Date(min);
128
+ state.start.hour = state.selected[0].getHours();
129
+ state.start.minute = state.selected[0].getMinutes();
130
+ }
131
+ if (max && state.selected && isAfter(state.selected[1], new Date(max))) {
132
+ state.selected[1] = new Date(max);
133
+ state.end.hour = state.selected[1].getHours();
134
+ state.end.minute = state.selected[1].getMinutes();
135
+ }
136
+ !showApply && state.selected && !state.hilight && (fireChange === null || fireChange === void 0 ? void 0 : fireChange([state.selected[0].toISOString(), state.selected[1].toISOString()]));
137
+ }
138
+ return _objectSpread({}, state);
139
+ }, {
140
+ start: {
141
+ page: PageType.DATE,
142
+ pageDate: new Date(),
143
+ hour: 0,
144
+ minute: 0
145
+ },
146
+ end: {
147
+ page: PageType.DATE,
148
+ pageDate: DateUtil.addMonths(new Date(), 1, isHijri),
149
+ hour: 0,
150
+ minute: 0
151
+ }
152
+ }),
153
+ _useReducer2 = _slicedToArray(_useReducer, 2),
154
+ state = _useReducer2[0],
155
+ dispatch = _useReducer2[1];
156
+ useEffect(function () {
157
+ dispatch({
158
+ type: "reset",
159
+ date: value
160
+ });
161
+ }, [value]);
162
+ var isStartDateDisabled = useCallback(function (dt) {
163
+ if (state.start.page === PageType.DATE) {
164
+ if (isArray(dateDisabled)) {
165
+ return !!dateDisabled.find(function (dd) {
166
+ return isSameDay(new Date(dd), dt);
167
+ });
168
+ }
169
+ }
170
+ return DateUtil.isDisabled(dt, state.start.page, min, max);
171
+ }, [state.start.page, min, max, dateDisabled]);
172
+ var isEndDateDisabled = useCallback(function (dt) {
173
+ if (state.end.page === PageType.DATE) {
174
+ if (isArray(dateDisabled)) {
175
+ return !!dateDisabled.find(function (dd) {
176
+ return isSameDay(new Date(dd), dt);
177
+ });
178
+ }
179
+ }
180
+ return DateUtil.isDisabled(dt, state.end.page, min, max);
181
+ }, [state.end.page, min, max, dateDisabled]);
182
+ var changeStartPageDate = useCallback(function (date) {
183
+ var pageChange = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
184
+ dispatch({
185
+ type: "changePageDate",
186
+ pageChange: pageChange,
187
+ range: "start",
188
+ date: date
189
+ });
190
+ }, []);
191
+ var changeEndPageDate = useCallback(function (date) {
192
+ var pageChange = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
193
+ dispatch({
194
+ type: "changePageDate",
195
+ pageChange: pageChange,
196
+ range: "end",
197
+ date: date
198
+ });
199
+ }, []);
200
+ var selectDate = useCallback(function (date) {
201
+ dispatch({
202
+ type: "changeDate",
203
+ date: date
204
+ });
205
+ }, []);
206
+ return /*#__PURE__*/jsxs("div", _objectSpread(_objectSpread({
207
+ className: classNames("block overflow-hidden bg-base rounded-capped", className)
208
+ }, rest), {}, {
209
+ children: [/*#__PURE__*/jsxs("div", {
210
+ className: "flex flex-nowrap",
211
+ children: [/*#__PURE__*/jsx(BasePanel, _objectSpread(_objectSpread({}, state.start), {}, {
212
+ max: max,
213
+ min: min,
214
+ hideNext: true,
215
+ withTime: withTime,
216
+ isHijri: isHijri,
217
+ hilight: state.hilight,
218
+ selected: state.selected,
219
+ selectDate: selectDate,
220
+ isDateDisabled: isStartDateDisabled,
221
+ changeTime: function changeTime(time) {
222
+ return dispatch(_objectSpread({
223
+ type: "changeTime",
224
+ range: "start"
225
+ }, time));
226
+ },
227
+ changePage: function changePage(page) {
228
+ return dispatch({
229
+ type: "changePage",
230
+ range: "start",
231
+ page: page
232
+ });
233
+ },
234
+ mouseOver: function mouseOver(date) {
235
+ return dispatch({
236
+ type: "changeHilight",
237
+ date: date
238
+ });
239
+ },
240
+ changePageDate: changeStartPageDate
241
+ })), /*#__PURE__*/jsx("div", {
242
+ className: "border-s border-s-dimmed"
243
+ }), /*#__PURE__*/jsx(BasePanel, _objectSpread(_objectSpread({}, state.end), {}, {
244
+ max: max,
245
+ min: min,
246
+ hidePrevious: true,
247
+ withTime: withTime,
248
+ isHijri: isHijri,
249
+ hilight: state.hilight,
250
+ selected: state.selected,
251
+ selectDate: selectDate,
252
+ isDateDisabled: isEndDateDisabled,
253
+ changeTime: function changeTime(time) {
254
+ return dispatch(_objectSpread({
255
+ type: "changeTime",
256
+ range: "end"
257
+ }, time));
258
+ },
259
+ changePage: function changePage(page) {
260
+ return dispatch({
261
+ type: "changePage",
262
+ range: "end",
263
+ page: page
264
+ });
265
+ },
266
+ mouseOver: function mouseOver(date) {
267
+ return dispatch({
268
+ type: "changeHilight",
269
+ date: date
270
+ });
271
+ },
272
+ changePageDate: changeEndPageDate
273
+ }))]
274
+ }), /*#__PURE__*/jsxs("div", {
275
+ className: "border-t flex flex-nowrap justify-between px-2",
276
+ children: [/*#__PURE__*/jsx("span", {
277
+ children: showHijriToggle && /*#__PURE__*/jsx(Button, {
278
+ size: "sm",
279
+ variant: "link",
280
+ color: "primary",
281
+ className: "my-1",
282
+ onClick: function onClick() {
283
+ setHijri(!isHijri);
284
+ },
285
+ children: t(isHijri ? "label.gregorian" : "label.hijri")
286
+ })
287
+ }), state.start.page !== PageType.DATE && /*#__PURE__*/jsx(Button, {
288
+ size: "sm",
289
+ variant: "link",
290
+ color: "primary",
291
+ className: "my-1",
292
+ onClick: function onClick() {
293
+ return dispatch({
294
+ type: "changePage",
295
+ range: "start",
296
+ page: PageType.DATE
297
+ });
298
+ },
299
+ children: t("core:action.cancel")
300
+ }), state.end.page !== PageType.DATE && /*#__PURE__*/jsx(Button, {
301
+ size: "sm",
302
+ variant: "link",
303
+ color: "primary",
304
+ className: "my-1",
305
+ onClick: function onClick() {
306
+ return dispatch({
307
+ type: "changePage",
308
+ range: "end",
309
+ page: PageType.DATE
310
+ });
311
+ },
312
+ children: t("core:action.cancel")
313
+ }), state.hilight && /*#__PURE__*/jsx(Button, {
314
+ size: "sm",
315
+ variant: "link",
316
+ color: "primary",
317
+ className: "my-1",
318
+ onClick: function onClick() {
319
+ return dispatch({
320
+ type: "changeHilight"
321
+ });
322
+ },
323
+ children: t("core:action.cancel")
324
+ }), !state.hilight && showApply && /*#__PURE__*/jsx(Button, {
325
+ size: "sm",
326
+ variant: "solid",
327
+ color: "primary",
328
+ disabled: !state.selected,
329
+ className: "my-1",
330
+ onClick: function onClick() {
331
+ var _state$selected, _state$selected2;
332
+ return fireChange === null || fireChange === void 0 ? void 0 : fireChange([(_state$selected = state.selected) === null || _state$selected === void 0 ? void 0 : _state$selected[0].toISOString(), (_state$selected2 = state.selected) === null || _state$selected2 === void 0 ? void 0 : _state$selected2[1].toISOString()]);
333
+ },
334
+ children: t("core:action.apply")
335
+ })]
336
+ })]
337
+ }));
338
+ };
339
+
340
+ export { RangePanel };
@@ -0,0 +1,173 @@
1
+ 'use client';
2
+
3
+ import _defineProperty from '@babel/runtime/helpers/defineProperty';
4
+ import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
5
+ import _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';
6
+ import { Section, Content } from '@react-fabric/core';
7
+ import { EMPTY_ARRAY } from '@react-fabric/utilities';
8
+ import { startOfDay, endOfDay, isSameMonth } from 'date-fns';
9
+ import i18next from 'i18next';
10
+ import { useState, useReducer, useEffect } from 'react';
11
+ import { useTranslation } from 'react-i18next';
12
+ import { DateHeader } from '../components/DateHeader.js';
13
+ import { DecadePage } from '../components/DecadePage.js';
14
+ import { YearPage } from '../components/YearPage.js';
15
+ import { PageType } from '../types/index.js';
16
+ import { DateUtil } from '../utils/dateUtil.js';
17
+ import { jsxs, jsx } from 'react/jsx-runtime';
18
+
19
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
20
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
21
+ var makeList = function makeList(year) {
22
+ var predefined = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
23
+ var list = _toConsumableArray(predefined);
24
+ list.push({
25
+ label: "superdate:event.newYear",
26
+ start: startOfDay(new Date("".concat(year - 1, "-12-31"))),
27
+ end: endOfDay(new Date("".concat(year, "-01-01")))
28
+ });
29
+ list.push({
30
+ label: "superdate:event.christmas",
31
+ start: startOfDay(new Date("".concat(year, "-12-24"))),
32
+ end: endOfDay(new Date("".concat(year, "-12-26")))
33
+ });
34
+ // calculate ramadan period
35
+ var hijriStart = DateUtil.startOfYear(new Date("".concat(year - 1, "-12-31")), true);
36
+ hijriStart = DateUtil.addMonths(hijriStart, 8, true);
37
+ if (hijriStart.getFullYear() !== year) {
38
+ hijriStart = DateUtil.addYears(hijriStart, hijriStart.getFullYear() > year ? -1 : 1, true);
39
+ }
40
+ var hijriEnd = DateUtil.endOfMonth(hijriStart, true);
41
+ list.push({
42
+ label: "superdate:event.ramadan",
43
+ start: startOfDay(hijriStart),
44
+ end: endOfDay(hijriEnd)
45
+ });
46
+ return list.sort(function (a, b) {
47
+ return a.start.getTime() < b.start.getTime() ? -1 : 1;
48
+ });
49
+ };
50
+ var EventPanel = function EventPanel(_ref) {
51
+ var isHijri = _ref.isHijri,
52
+ onChange = _ref.onChange,
53
+ _ref$events = _ref.events,
54
+ events = _ref$events === void 0 ? EMPTY_ARRAY : _ref$events;
55
+ var _useTranslation = useTranslation(),
56
+ t = _useTranslation.t;
57
+ var _useState = useState({}),
58
+ _useState2 = _slicedToArray(_useState, 2),
59
+ predefined = _useState2[0],
60
+ setPredefined = _useState2[1];
61
+ var _useReducer = useReducer(function (state, action) {
62
+ var resetList = false;
63
+ if (action.type === "init") {
64
+ state.pageDate = new Date();
65
+ resetList = true;
66
+ }
67
+ if (action.type === "changePage") {
68
+ state.page = Math.max(action.page, PageType.MONTH);
69
+ }
70
+ if (action.type === "changePageDate") {
71
+ resetList = true;
72
+ state.pageDate = action.date;
73
+ if (action.changePage !== false) {
74
+ state.page = Math.max(state.page - 1, PageType.MONTH);
75
+ }
76
+ }
77
+ if (resetList) {
78
+ var _predefined$year;
79
+ var year = state.pageDate.getFullYear();
80
+ state.events = makeList(year, (_predefined$year = predefined[year]) !== null && _predefined$year !== void 0 ? _predefined$year : []);
81
+ }
82
+ return _objectSpread({}, state);
83
+ }, {
84
+ pageDate: new Date(),
85
+ page: PageType.MONTH,
86
+ events: []
87
+ }),
88
+ _useReducer2 = _slicedToArray(_useReducer, 2),
89
+ state = _useReducer2[0],
90
+ dispatch = _useReducer2[1];
91
+ useEffect(function () {
92
+ dispatch({
93
+ type: "init"
94
+ });
95
+ }, []);
96
+ useEffect(function () {
97
+ var predefined = {};
98
+ events.forEach(function (evt) {
99
+ var start = startOfDay(new Date(evt.start));
100
+ var end = endOfDay(new Date(evt.end));
101
+ if (!predefined[start.getFullYear()]) predefined[start.getFullYear()] = [];
102
+ predefined[start.getFullYear()].push(evt);
103
+ if (start.getFullYear() !== end.getFullYear()) {
104
+ if (!predefined[end.getFullYear()]) predefined[end.getFullYear()] = [];
105
+ predefined[end.getFullYear()].push(evt);
106
+ }
107
+ });
108
+ setPredefined(predefined);
109
+ }, [events]);
110
+ return /*#__PURE__*/jsxs(Section, {
111
+ children: [/*#__PURE__*/jsx(DateHeader, {
112
+ page: state.page,
113
+ pageDate: state.pageDate,
114
+ changePage: function changePage(page) {
115
+ return dispatch({
116
+ type: "changePage",
117
+ page: page
118
+ });
119
+ },
120
+ changePageDate: function changePageDate(date) {
121
+ return dispatch({
122
+ type: "changePageDate",
123
+ date: date,
124
+ changePage: false
125
+ });
126
+ }
127
+ }), state.page === PageType.MONTH && /*#__PURE__*/jsx(Content, {
128
+ className: "p-2 max-h-48",
129
+ children: state.events.map(function (evt) {
130
+ return /*#__PURE__*/jsxs("div", {
131
+ role: "none",
132
+ onClick: function onClick() {
133
+ onChange === null || onChange === void 0 || onChange("".concat(evt.start.toISOString(), "|").concat(evt.end.toISOString()), [evt.start.toISOString(), evt.end.toISOString()]);
134
+ },
135
+ className: "text-sm my-1 py-1 px-2 flex flex-nowrap items-center cursor-pointer rounded hover:bg-primary-50",
136
+ children: [/*#__PURE__*/jsx("div", {
137
+ className: "flex-1 truncate",
138
+ children: t(evt.label, {
139
+ defaultValue: evt.label
140
+ })
141
+ }), /*#__PURE__*/jsxs("div", {
142
+ className: "text-muted text-xs",
143
+ children: [DateUtil.format(evt.start, isSameMonth(evt.start, evt.end) ? "dd" : "dd/MMM", i18next.language, isHijri), /*#__PURE__*/jsx("span", {
144
+ children: " - "
145
+ }), DateUtil.format(evt.end, "dd/MMM", i18next.language, isHijri)]
146
+ })]
147
+ }, evt.label);
148
+ })
149
+ }), state.page === PageType.YEAR && /*#__PURE__*/jsx(YearPage, {
150
+ isHijri: isHijri,
151
+ page: state.page,
152
+ pageDate: state.pageDate,
153
+ changePageDate: function changePageDate(date) {
154
+ return dispatch({
155
+ type: "changePageDate",
156
+ date: date
157
+ });
158
+ }
159
+ }), state.page === PageType.DECADE && /*#__PURE__*/jsx(DecadePage, {
160
+ isHijri: isHijri,
161
+ page: state.page,
162
+ pageDate: state.pageDate,
163
+ changePageDate: function changePageDate(date) {
164
+ return dispatch({
165
+ type: "changePageDate",
166
+ date: date
167
+ });
168
+ }
169
+ })]
170
+ });
171
+ };
172
+
173
+ export { EventPanel };
@@ -0,0 +1,134 @@
1
+ 'use client';
2
+
3
+ import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
4
+ import { Content, Divider } from '@react-fabric/core';
5
+ import { Form } from '@react-fabric/form';
6
+ import { yup } from '@react-fabric/utilities';
7
+ import { useCallback, useMemo } from 'react';
8
+ import { useTranslation } from 'react-i18next';
9
+ import { DatePart } from '../types/index.js';
10
+ import { RelativeInput } from './RelativeInput.js';
11
+ import { jsxs, jsx } from 'react/jsx-runtime';
12
+
13
+ var DEFAULT_PRESETS = [{
14
+ value: "$day",
15
+ label: "superdate:now.$day"
16
+ }, {
17
+ value: "$day-1",
18
+ label: "superdate:prev.$day"
19
+ }, {
20
+ value: "$day+1",
21
+ label: "superdate:next.$day"
22
+ }, {
23
+ value: "$week",
24
+ label: "superdate:now.$week"
25
+ }, {
26
+ value: "$week-1",
27
+ label: "superdate:prev.$week"
28
+ }, {
29
+ value: "$week+1",
30
+ label: "superdate:next.$week"
31
+ }, {
32
+ value: "$month",
33
+ label: "superdate:now.$month"
34
+ }, {
35
+ value: "$month-1",
36
+ label: "superdate:prev.$month"
37
+ }, {
38
+ value: "$month+1",
39
+ label: "superdate:next.$month"
40
+ }, {
41
+ value: "$quarter",
42
+ label: "superdate:now.$quarter"
43
+ }, {
44
+ value: "$quarter-1",
45
+ label: "superdate:prev.$quarter"
46
+ }, {
47
+ value: "$quarter+1",
48
+ label: "superdate:next.$quarter"
49
+ }, {
50
+ value: "$year",
51
+ label: "superdate:now.$year"
52
+ }, {
53
+ value: "$year-1",
54
+ label: "superdate:prev.$year"
55
+ }, {
56
+ value: "$year+1",
57
+ label: "superdate:next.$year"
58
+ }];
59
+ var schema = yup.object({
60
+ rel: yup.object({
61
+ diff: yup.number().required().label("Difference"),
62
+ op: yup.string().required().oneOf(["+", "-"]).label("Operator"),
63
+ part: yup.string().required().oneOf(Object.values(DatePart)).label("Date part")
64
+ })
65
+ });
66
+ var QuickSelect = function QuickSelect(_ref) {
67
+ var _ref$presets = _ref.presets,
68
+ presets = _ref$presets === void 0 ? DEFAULT_PRESETS : _ref$presets,
69
+ _ref$value = _ref.value,
70
+ value = _ref$value === void 0 ? "" : _ref$value,
71
+ onChange = _ref.onChange;
72
+ var _useTranslation = useTranslation(),
73
+ t = _useTranslation.t;
74
+ var handleChange = useCallback(function (_ref2) {
75
+ var _ref2$rel = _ref2.rel,
76
+ part = _ref2$rel.part,
77
+ diff = _ref2$rel.diff,
78
+ op = _ref2$rel.op;
79
+ onChange("".concat(part).concat(op).concat(diff, "|").concat(DatePart.NOW));
80
+ }, []);
81
+ var defaultValue = useMemo(function () {
82
+ if (value !== null && value !== void 0 && value.endsWith(DatePart.NOW)) {
83
+ var _value$split$shift$ma;
84
+ var _ref3 = (_value$split$shift$ma = value.split("|").shift().match(/^(\$\w+)([+-])(\d+)?$/)) !== null && _value$split$shift$ma !== void 0 ? _value$split$shift$ma : [],
85
+ _ref4 = _slicedToArray(_ref3, 4),
86
+ part = _ref4[1],
87
+ op = _ref4[2],
88
+ _ref4$ = _ref4[3],
89
+ diff = _ref4$ === void 0 ? "0" : _ref4$;
90
+ return {
91
+ rel: {
92
+ part: part,
93
+ op: op,
94
+ diff: diff
95
+ }
96
+ };
97
+ }
98
+ }, [value]);
99
+ return /*#__PURE__*/jsxs(Content, {
100
+ children: [/*#__PURE__*/jsx("div", {
101
+ className: "inline-block origin-left rtl:origin-right",
102
+ style: {
103
+ zoom: 0.85
104
+ },
105
+ children: /*#__PURE__*/jsx(Form, {
106
+ schema: schema,
107
+ onSubmit: handleChange,
108
+ defaultValues: defaultValue,
109
+ children: /*#__PURE__*/jsx(RelativeInput, {
110
+ label: t("superdate:label.relative"),
111
+ prefix: "rel",
112
+ showApply: true
113
+ })
114
+ })
115
+ }), /*#__PURE__*/jsx(Divider, {
116
+ children: t("superdate:label.preset")
117
+ }), /*#__PURE__*/jsx("div", {
118
+ className: "grid grid-cols-3 flex-row text-sm gap-2",
119
+ children: presets.map(function (pr) {
120
+ return /*#__PURE__*/jsx("button", {
121
+ className: "link appearance-none text-start",
122
+ onClick: function onClick() {
123
+ return onChange === null || onChange === void 0 ? void 0 : onChange(pr.value);
124
+ },
125
+ children: t(pr.label, {
126
+ defaultValue: pr.label
127
+ })
128
+ }, pr.value);
129
+ })
130
+ })]
131
+ });
132
+ };
133
+
134
+ export { QuickSelect };