@react-fabric/date 1.0.0-beta.9 → 1.0.2
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.
- package/README.md +2 -9
- package/{src/components/Date.module.css → css/_date.css} +5 -5
- package/{src/superdate/SuperDate.module.css → css/styles.css} +2 -8
- package/dist/cjs/components/DateCell.js +5 -7
- package/dist/cjs/components/DateHeader.js +27 -20
- package/dist/cjs/components/DatePage.js +10 -12
- package/dist/cjs/components/DecadePage.js +3 -3
- package/dist/cjs/components/MonthPage.js +3 -3
- package/dist/cjs/components/TimeSliders.js +36 -35
- package/dist/cjs/components/YearPage.js +3 -3
- package/dist/cjs/display/DateDisplay.js +25 -8
- package/dist/cjs/display/DateDuration.js +155 -0
- package/dist/cjs/hijri/DateConverter.js +154 -0
- package/dist/cjs/hijri/FormatDate.js +116 -0
- package/dist/cjs/hijri/HijriDate.js +531 -0
- package/dist/cjs/hijri/StringDateParser.js +74 -0
- package/dist/cjs/hijri/index.js +15 -1025
- package/dist/cjs/hijri/initializer.js +113 -0
- package/dist/cjs/hijri/locales.js +19 -0
- package/dist/cjs/hijri/safe.js +17 -0
- package/dist/cjs/i18n/ar/date.json.js +213 -0
- package/dist/cjs/i18n/en/date.json.js +83 -0
- package/dist/cjs/i18n/index.js +4 -10
- package/dist/cjs/index.js +41 -2
- package/dist/cjs/panels/BasePanel.js +6 -5
- package/dist/cjs/panels/DatePanel.js +45 -21
- package/dist/cjs/{superdate → panels}/EventPanel.js +28 -12
- package/dist/cjs/panels/RangePanel.js +49 -19
- package/dist/cjs/utils/dateUtil.js +3 -5
- package/dist/esm/components/DateCell.js +6 -8
- package/dist/esm/components/DateHeader.js +28 -21
- package/dist/esm/components/DatePage.js +11 -13
- package/dist/esm/components/DecadePage.js +3 -3
- package/dist/esm/components/MonthPage.js +3 -3
- package/dist/esm/components/TimeSliders.js +38 -37
- package/dist/esm/components/YearPage.js +3 -3
- package/dist/esm/display/DateDisplay.js +26 -9
- package/dist/esm/display/DateDuration.js +155 -0
- package/dist/esm/hijri/DateConverter.js +152 -0
- package/dist/esm/hijri/FormatDate.js +113 -0
- package/dist/esm/hijri/HijriDate.js +528 -0
- package/dist/esm/hijri/StringDateParser.js +74 -0
- package/dist/esm/hijri/index.js +15 -1025
- package/dist/esm/hijri/initializer.js +113 -0
- package/dist/esm/hijri/locales.js +18 -0
- package/dist/esm/hijri/safe.js +14 -0
- package/dist/esm/i18n/ar/date.json.js +209 -0
- package/dist/esm/i18n/en/date.json.js +79 -0
- package/dist/esm/i18n/index.js +2 -8
- package/dist/esm/index.js +36 -1
- package/dist/esm/panels/BasePanel.js +6 -5
- package/dist/esm/panels/DatePanel.js +48 -24
- package/dist/esm/{superdate → panels}/EventPanel.js +29 -13
- package/dist/esm/panels/RangePanel.js +52 -22
- package/dist/esm/utils/dateUtil.js +4 -6
- package/dist/types/components/DateCell.d.ts +1 -1
- package/dist/types/components/DateHeader.d.ts +1 -1
- package/dist/types/components/DatePage.d.ts +1 -1
- package/dist/types/components/DecadePage.d.ts +1 -1
- package/dist/types/components/MonthPage.d.ts +1 -1
- package/dist/types/components/TimeSliders.d.ts +1 -1
- package/dist/types/components/YearPage.d.ts +1 -1
- package/dist/types/display/DateDisplay.d.ts +17 -4
- package/dist/types/display/DateDuration.d.ts +25 -0
- package/dist/types/hijri/DateConverter.d.ts +13 -0
- package/dist/types/hijri/FormatDate.d.ts +19 -0
- package/dist/types/hijri/HijriDate.d.ts +214 -0
- package/dist/types/hijri/StringDateParser.d.ts +11 -0
- package/dist/types/hijri/index.d.ts +2 -2
- package/dist/types/hijri/initializer.d.ts +129 -0
- package/dist/types/hijri/locales.d.ts +19 -0
- package/dist/types/hijri/safe.d.ts +3 -0
- package/dist/types/index.d.ts +32 -1
- package/dist/types/panels/BasePanel.d.ts +1 -1
- package/dist/types/panels/DatePanel.d.ts +22 -1
- package/dist/types/panels/EventPanel.d.ts +17 -0
- package/dist/types/panels/RangePanel.d.ts +19 -1
- package/dist/types/types/index.d.ts +8 -40
- package/package.json +14 -21
- package/src/components/DateCell.tsx +20 -75
- package/src/components/DateHeader.tsx +27 -78
- package/src/components/DatePage.tsx +11 -36
- package/src/components/DecadePage.tsx +2 -2
- package/src/components/MonthPage.tsx +2 -2
- package/src/components/TimeSliders.tsx +20 -60
- package/src/components/YearPage.tsx +2 -2
- package/src/display/DateDisplay.tsx +26 -38
- package/src/display/DateDuration.tsx +170 -0
- package/src/hijri/DateConverter.js +175 -0
- package/src/hijri/FormatDate.js +134 -0
- package/src/hijri/HijriDate.js +477 -0
- package/src/hijri/StringDateParser.js +68 -0
- package/src/hijri/index.js +16 -1535
- package/src/hijri/initializer.js +96 -0
- package/src/hijri/locales.js +109 -0
- package/src/hijri/safe.js +16 -0
- package/src/i18n/ar/date.json +203 -0
- package/src/i18n/en/date.json +73 -0
- package/src/i18n/index.ts +2 -5
- package/src/index.ts +29 -18
- package/src/panels/BasePanel.tsx +7 -10
- package/src/panels/DatePanel.tsx +41 -33
- package/src/{superdate → panels}/EventPanel.tsx +52 -53
- package/src/panels/RangePanel.tsx +54 -60
- package/src/types/index.ts +8 -43
- package/src/utils/dateUtil.ts +26 -82
- package/dist/cjs/components/Date.module.css +0 -1
- package/dist/cjs/i18n/ar.json.js +0 -25
- package/dist/cjs/i18n/en.json.js +0 -21
- package/dist/cjs/i18n/superdate/ar.json.js +0 -86
- package/dist/cjs/i18n/superdate/en.json.js +0 -93
- package/dist/cjs/superdate/QuickSelect.js +0 -134
- package/dist/cjs/superdate/RelativeInput.js +0 -79
- package/dist/cjs/superdate/RelativePanel.js +0 -91
- package/dist/cjs/superdate/SuperDate.module.css +0 -1
- package/dist/cjs/superdate/Superdate.js +0 -177
- package/dist/esm/components/Date.module.css +0 -1
- package/dist/esm/i18n/ar.json.js +0 -21
- package/dist/esm/i18n/en.json.js +0 -18
- package/dist/esm/i18n/superdate/ar.json.js +0 -79
- package/dist/esm/i18n/superdate/en.json.js +0 -85
- package/dist/esm/superdate/QuickSelect.js +0 -134
- package/dist/esm/superdate/RelativeInput.js +0 -79
- package/dist/esm/superdate/RelativePanel.js +0 -91
- package/dist/esm/superdate/SuperDate.module.css +0 -1
- package/dist/esm/superdate/Superdate.js +0 -176
- package/dist/types/superdate/EventPanel.d.ts +0 -4
- package/dist/types/superdate/QuickSelect.d.ts +0 -1
- package/dist/types/superdate/RelativeInput.d.ts +0 -1
- package/dist/types/superdate/RelativePanel.d.ts +0 -1
- package/dist/types/superdate/Superdate.d.ts +0 -17
- package/src/i18n/ar.json +0 -14
- package/src/i18n/en.json +0 -13
- package/src/i18n/superdate/ar.json +0 -70
- package/src/i18n/superdate/en.json +0 -75
- package/src/superdate/QuickSelect.tsx +0 -121
- package/src/superdate/RelativeInput.tsx +0 -64
- package/src/superdate/RelativePanel.tsx +0 -103
- package/src/superdate/Superdate.tsx +0 -198
|
@@ -21,16 +21,8 @@
|
|
|
21
21
|
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
22
22
|
*/
|
|
23
23
|
|
|
24
|
-
import { isArray } from "@react-fabric/utilities";
|
|
25
|
-
import
|
|
26
|
-
import {
|
|
27
|
-
isAfter,
|
|
28
|
-
isBefore,
|
|
29
|
-
isSameDay,
|
|
30
|
-
isSameMonth,
|
|
31
|
-
isSameYear,
|
|
32
|
-
startOfDecade,
|
|
33
|
-
} from "date-fns";
|
|
24
|
+
import { cn, isArray } from "@react-fabric/utilities";
|
|
25
|
+
import { isAfter, isBefore, isSameDay, isSameMonth, isSameYear, startOfDecade } from "date-fns";
|
|
34
26
|
import i18next from "i18next";
|
|
35
27
|
import { useMemo } from "react";
|
|
36
28
|
import { PageType } from "../types";
|
|
@@ -50,28 +42,11 @@ export interface DateCellProps {
|
|
|
50
42
|
dateDisabled?: (date: Date) => boolean;
|
|
51
43
|
}
|
|
52
44
|
|
|
53
|
-
export
|
|
54
|
-
|
|
55
|
-
isMuted = false,
|
|
56
|
-
...props
|
|
57
|
-
}: DateCellProps) => {
|
|
58
|
-
const {
|
|
59
|
-
page,
|
|
60
|
-
selected,
|
|
61
|
-
hilight,
|
|
62
|
-
isHijri,
|
|
63
|
-
className,
|
|
64
|
-
selectDate,
|
|
65
|
-
changePageDate,
|
|
66
|
-
mouseOver,
|
|
67
|
-
dateDisabled,
|
|
68
|
-
} = props;
|
|
45
|
+
export function DateCell({ date, isMuted = false, ...props }: DateCellProps) {
|
|
46
|
+
const { page, selected, hilight, isHijri, className, selectDate, changePageDate, mouseOver, dateDisabled } = props;
|
|
69
47
|
|
|
70
48
|
const isToday = useMemo(() => isSameDay(date, new Date()), [date]);
|
|
71
|
-
const isSelected = useMemo(
|
|
72
|
-
() => selected && !isArray(selected) && isSameDay(date, selected),
|
|
73
|
-
[date, page, selected],
|
|
74
|
-
);
|
|
49
|
+
const isSelected = useMemo(() => selected && !isArray(selected) && isSameDay(date, selected), [date, selected]);
|
|
75
50
|
|
|
76
51
|
const isMarked = useMemo(() => {
|
|
77
52
|
switch (page) {
|
|
@@ -80,11 +55,7 @@ export const DateCell = ({
|
|
|
80
55
|
case PageType.YEAR:
|
|
81
56
|
return selected && !isArray(selected) && isSameYear(date, selected);
|
|
82
57
|
case PageType.DECADE:
|
|
83
|
-
return (
|
|
84
|
-
selected &&
|
|
85
|
-
!isArray(selected) &&
|
|
86
|
-
isSameYear(startOfDecade(date), startOfDecade(selected))
|
|
87
|
-
);
|
|
58
|
+
return selected && !isArray(selected) && isSameYear(startOfDecade(date), startOfDecade(selected));
|
|
88
59
|
}
|
|
89
60
|
}, [date, page, selected]);
|
|
90
61
|
|
|
@@ -95,8 +66,7 @@ export const DateCell = ({
|
|
|
95
66
|
} else if (Array.isArray(selected)) {
|
|
96
67
|
const [start, end] = selected;
|
|
97
68
|
let hilight: string | false = false;
|
|
98
|
-
if (isSameDay(date, start) && isSameDay(date, end))
|
|
99
|
-
hilight = "startend";
|
|
69
|
+
if (isSameDay(date, start) && isSameDay(date, end)) hilight = "startend";
|
|
100
70
|
else if (isSameDay(date, start)) hilight = "start";
|
|
101
71
|
else if (isSameDay(date, end)) hilight = "end";
|
|
102
72
|
return hilight;
|
|
@@ -109,68 +79,43 @@ export const DateCell = ({
|
|
|
109
79
|
if (hilight) {
|
|
110
80
|
const [start, end] = hilight;
|
|
111
81
|
if (isBefore(start, end)) {
|
|
112
|
-
return (
|
|
113
|
-
isAfter(date, start) &&
|
|
114
|
-
isBefore(date, DateUtil.addDays(end, 1, isHijri))
|
|
115
|
-
);
|
|
82
|
+
return isAfter(date, start) && isBefore(date, DateUtil.addDays(end, 1, isHijri));
|
|
116
83
|
} else {
|
|
117
|
-
return (
|
|
118
|
-
isBefore(date, start) &&
|
|
119
|
-
isAfter(date, DateUtil.addDays(end, -1, isHijri))
|
|
120
|
-
);
|
|
84
|
+
return isBefore(date, start) && isAfter(date, DateUtil.addDays(end, -1, isHijri));
|
|
121
85
|
}
|
|
122
86
|
} else if (Array.isArray(selected)) {
|
|
123
87
|
const [start, end] = selected;
|
|
124
|
-
return (
|
|
125
|
-
isAfter(date, DateUtil.startOfDay(start, isHijri)) &&
|
|
126
|
-
isBefore(date, DateUtil.startOfDay(end, isHijri))
|
|
127
|
-
);
|
|
88
|
+
return isAfter(date, DateUtil.startOfDay(start, isHijri)) && isBefore(date, DateUtil.startOfDay(end, isHijri));
|
|
128
89
|
}
|
|
129
90
|
}
|
|
130
91
|
}, [isMuted, hilight, selected, date, isHijri]);
|
|
131
92
|
|
|
132
|
-
const isDisabled = useMemo(
|
|
133
|
-
() => !!isSelected || dateDisabled?.(date),
|
|
134
|
-
[date, dateDisabled, isSelected],
|
|
135
|
-
);
|
|
93
|
+
const isDisabled = useMemo(() => !!isSelected || dateDisabled?.(date), [date, dateDisabled, isSelected]);
|
|
136
94
|
|
|
137
95
|
return (
|
|
138
96
|
<div
|
|
139
97
|
role="none"
|
|
140
|
-
className={
|
|
98
|
+
className={cn(
|
|
141
99
|
"p-1 m-px text-sm text-center rounded",
|
|
142
100
|
className,
|
|
143
101
|
!isDisabled && isMuted && "text-tint-500",
|
|
144
|
-
(isToday || isMarked) &&
|
|
145
|
-
"underline underline-offset-4 text-primary-700",
|
|
102
|
+
(isToday || isMarked) && "underline underline-offset-4 text-primary-700",
|
|
146
103
|
(!!isSelected || isHilightEdge) && "bg-primary-400 text-white",
|
|
147
104
|
isHilightEdge === "start" && "rounded-e-none",
|
|
148
105
|
isHilightEdge === "end" && "rounded-s-none",
|
|
149
106
|
isHilight && "bg-primary-50 rounded-none",
|
|
150
|
-
!isDisabled &&
|
|
151
|
-
"cursor-pointer hover:bg-primary-100 hover:text-primary-700",
|
|
107
|
+
!isDisabled && "cursor-pointer hover:bg-primary-100 hover:text-primary-700",
|
|
152
108
|
isDisabled && "text-tint-100 cursor-not-allowed",
|
|
153
109
|
)}
|
|
154
110
|
onFocus={() => hilight && page === PageType.DATE && mouseOver?.(date)}
|
|
155
111
|
onMouseOver={() => hilight && page === PageType.DATE && mouseOver?.(date)}
|
|
156
|
-
onClick={() =>
|
|
157
|
-
!isDisabled &&
|
|
158
|
-
(page === PageType.DATE ? selectDate?.(date) : changePageDate?.(date))
|
|
159
|
-
}
|
|
112
|
+
onClick={() => !isDisabled && (page === PageType.DATE ? selectDate?.(date) : changePageDate?.(date))}
|
|
160
113
|
>
|
|
161
|
-
{page === PageType.DATE &&
|
|
162
|
-
|
|
163
|
-
{page === PageType.
|
|
164
|
-
DateUtil.format(date, "MMM", i18next.language, isHijri)}
|
|
165
|
-
{page === PageType.YEAR &&
|
|
166
|
-
DateUtil.format(date, "yyyy", i18next.language, isHijri)}
|
|
114
|
+
{page === PageType.DATE && DateUtil.format(date, "d", i18next.language, isHijri)}
|
|
115
|
+
{page === PageType.MONTH && DateUtil.format(date, "MMM", i18next.language, isHijri)}
|
|
116
|
+
{page === PageType.YEAR && DateUtil.format(date, "yyyy", i18next.language, isHijri)}
|
|
167
117
|
{page === PageType.DECADE &&
|
|
168
|
-
`${DateUtil.format(
|
|
169
|
-
DateUtil.startOfDecade(date, isHijri),
|
|
170
|
-
"yyyy",
|
|
171
|
-
i18next.language,
|
|
172
|
-
isHijri,
|
|
173
|
-
)}-${DateUtil.format(
|
|
118
|
+
`${DateUtil.format(DateUtil.startOfDecade(date, isHijri), "yyyy", i18next.language, isHijri)}-${DateUtil.format(
|
|
174
119
|
DateUtil.endOfDecade(date, isHijri),
|
|
175
120
|
"yy",
|
|
176
121
|
i18next.language,
|
|
@@ -178,4 +123,4 @@ export const DateCell = ({
|
|
|
178
123
|
)}`}
|
|
179
124
|
</div>
|
|
180
125
|
);
|
|
181
|
-
}
|
|
126
|
+
}
|
|
@@ -21,8 +21,8 @@
|
|
|
21
21
|
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
22
22
|
*/
|
|
23
23
|
|
|
24
|
-
import { Button
|
|
25
|
-
import
|
|
24
|
+
import { Button } from "@react-fabric/core";
|
|
25
|
+
import { cn } from "@react-fabric/utilities";
|
|
26
26
|
import { addDays, isAfter, isBefore } from "date-fns";
|
|
27
27
|
import i18next from "i18next";
|
|
28
28
|
import { useMemo } from "react";
|
|
@@ -41,18 +41,8 @@ interface Props {
|
|
|
41
41
|
changePageDate: (date: Date) => void;
|
|
42
42
|
}
|
|
43
43
|
|
|
44
|
-
export
|
|
45
|
-
const {
|
|
46
|
-
page,
|
|
47
|
-
pageDate = new Date(),
|
|
48
|
-
changePage,
|
|
49
|
-
changePageDate,
|
|
50
|
-
hideNext,
|
|
51
|
-
hidePrevious,
|
|
52
|
-
min,
|
|
53
|
-
max,
|
|
54
|
-
isHijri = false,
|
|
55
|
-
} = props;
|
|
44
|
+
export function DateHeader(props: Props) {
|
|
45
|
+
const { page, pageDate, changePage, changePageDate, hideNext, hidePrevious, min, max, isHijri = false } = props;
|
|
56
46
|
|
|
57
47
|
const headLabel = useMemo(() => {
|
|
58
48
|
switch (page) {
|
|
@@ -66,57 +56,35 @@ export const DateHeader = (props: Props) => {
|
|
|
66
56
|
"yyyy",
|
|
67
57
|
i18next.language,
|
|
68
58
|
isHijri,
|
|
69
|
-
)} - ${DateUtil.format(
|
|
70
|
-
DateUtil.endOfDecade(pageDate, isHijri),
|
|
71
|
-
"yyyy",
|
|
72
|
-
i18next.language,
|
|
73
|
-
isHijri,
|
|
74
|
-
)}`;
|
|
59
|
+
)} - ${DateUtil.format(DateUtil.endOfDecade(pageDate, isHijri), "yyyy", i18next.language, isHijri)}`;
|
|
75
60
|
case PageType.DECADE:
|
|
76
61
|
return `${DateUtil.format(
|
|
77
62
|
DateUtil.startOfCentury(pageDate, isHijri),
|
|
78
63
|
"yyyy",
|
|
79
64
|
i18next.language,
|
|
80
65
|
isHijri,
|
|
81
|
-
)} - ${DateUtil.format(
|
|
82
|
-
DateUtil.endOfCentury(pageDate, isHijri),
|
|
83
|
-
"yyyy",
|
|
84
|
-
i18next.language,
|
|
85
|
-
isHijri,
|
|
86
|
-
)}`;
|
|
66
|
+
)} - ${DateUtil.format(DateUtil.endOfCentury(pageDate, isHijri), "yyyy", i18next.language, isHijri)}`;
|
|
87
67
|
}
|
|
88
|
-
}, [
|
|
68
|
+
}, [isHijri, page, pageDate]);
|
|
89
69
|
|
|
90
70
|
const [startPage, endPage] = useMemo(() => {
|
|
91
71
|
if (page === PageType.DATE) {
|
|
92
72
|
const dateBefore = addDays(DateUtil.startOfYear(pageDate, isHijri), -1);
|
|
93
73
|
const dateAfter = addDays(DateUtil.endOfYear(pageDate, isHijri), 1);
|
|
94
74
|
|
|
95
|
-
return [
|
|
96
|
-
min && isBefore(dateBefore, min) ? null : dateBefore,
|
|
97
|
-
max && isAfter(dateAfter, max) ? null : dateAfter,
|
|
98
|
-
];
|
|
75
|
+
return [min && isBefore(dateBefore, min) ? null : dateBefore, max && isAfter(dateAfter, max) ? null : dateAfter];
|
|
99
76
|
}
|
|
100
77
|
if (page === PageType.MONTH) {
|
|
101
78
|
const dateBefore = addDays(DateUtil.startOfDecade(pageDate, isHijri), -1);
|
|
102
79
|
const dateAfter = addDays(DateUtil.endOfDecade(pageDate, isHijri), 1);
|
|
103
80
|
|
|
104
|
-
return [
|
|
105
|
-
min && isBefore(dateBefore, min) ? null : dateBefore,
|
|
106
|
-
max && isAfter(dateAfter, max) ? null : dateAfter,
|
|
107
|
-
];
|
|
81
|
+
return [min && isBefore(dateBefore, min) ? null : dateBefore, max && isAfter(dateAfter, max) ? null : dateAfter];
|
|
108
82
|
}
|
|
109
83
|
if (page === PageType.YEAR) {
|
|
110
|
-
const dateBefore = addDays(
|
|
111
|
-
DateUtil.startOfCentury(pageDate, isHijri),
|
|
112
|
-
-1,
|
|
113
|
-
);
|
|
84
|
+
const dateBefore = addDays(DateUtil.startOfCentury(pageDate, isHijri), -1);
|
|
114
85
|
const dateAfter = addDays(DateUtil.endOfCentury(pageDate, isHijri), 1);
|
|
115
86
|
|
|
116
|
-
return [
|
|
117
|
-
min && isBefore(dateBefore, min) ? null : dateBefore,
|
|
118
|
-
max && isAfter(dateAfter, max) ? null : dateAfter,
|
|
119
|
-
];
|
|
87
|
+
return [min && isBefore(dateBefore, min) ? null : dateBefore, max && isAfter(dateAfter, max) ? null : dateAfter];
|
|
120
88
|
}
|
|
121
89
|
return [];
|
|
122
90
|
}, [page, min, max, pageDate, isHijri]);
|
|
@@ -125,71 +93,54 @@ export const DateHeader = (props: Props) => {
|
|
|
125
93
|
if (page === PageType.DATE) {
|
|
126
94
|
const dateBefore = addDays(DateUtil.startOfMonth(pageDate, isHijri), -1);
|
|
127
95
|
const dateAfter = addDays(DateUtil.endOfMonth(pageDate, isHijri), 1);
|
|
128
|
-
return [
|
|
129
|
-
min && isBefore(dateBefore, min) ? null : dateBefore,
|
|
130
|
-
max && isAfter(dateAfter, max) ? null : dateAfter,
|
|
131
|
-
];
|
|
96
|
+
return [min && isBefore(dateBefore, min) ? null : dateBefore, max && isAfter(dateAfter, max) ? null : dateAfter];
|
|
132
97
|
}
|
|
133
98
|
if (page === PageType.MONTH) {
|
|
134
99
|
const dateBefore = addDays(DateUtil.startOfYear(pageDate, isHijri), -1);
|
|
135
100
|
const dateAfter = addDays(DateUtil.endOfYear(pageDate, isHijri), 1);
|
|
136
|
-
return [
|
|
137
|
-
min && isBefore(dateBefore, min) ? null : dateBefore,
|
|
138
|
-
max && isAfter(dateAfter, max) ? null : dateAfter,
|
|
139
|
-
];
|
|
101
|
+
return [min && isBefore(dateBefore, min) ? null : dateBefore, max && isAfter(dateAfter, max) ? null : dateAfter];
|
|
140
102
|
}
|
|
141
103
|
if (page === PageType.YEAR) {
|
|
142
104
|
const dateBefore = addDays(DateUtil.startOfDecade(pageDate, isHijri), -1);
|
|
143
105
|
const dateAfter = addDays(DateUtil.endOfDecade(pageDate, isHijri), 1);
|
|
144
106
|
|
|
145
|
-
return [
|
|
146
|
-
min && isBefore(dateBefore, min) ? null : dateBefore,
|
|
147
|
-
max && isAfter(dateAfter, max) ? null : dateAfter,
|
|
148
|
-
];
|
|
107
|
+
return [min && isBefore(dateBefore, min) ? null : dateBefore, max && isAfter(dateAfter, max) ? null : dateAfter];
|
|
149
108
|
}
|
|
150
109
|
if (page === PageType.DECADE) {
|
|
151
|
-
const dateBefore = addDays(
|
|
152
|
-
DateUtil.startOfCentury(pageDate, isHijri),
|
|
153
|
-
-1,
|
|
154
|
-
);
|
|
110
|
+
const dateBefore = addDays(DateUtil.startOfCentury(pageDate, isHijri), -1);
|
|
155
111
|
const dateAfter = addDays(DateUtil.endOfCentury(pageDate, isHijri), 1);
|
|
156
112
|
|
|
157
|
-
return [
|
|
158
|
-
min && isBefore(dateBefore, min) ? null : dateBefore,
|
|
159
|
-
max && isAfter(dateAfter, max) ? null : dateAfter,
|
|
160
|
-
];
|
|
113
|
+
return [min && isBefore(dateBefore, min) ? null : dateBefore, max && isAfter(dateAfter, max) ? null : dateAfter];
|
|
161
114
|
}
|
|
162
115
|
return [];
|
|
163
116
|
}, [page, min, max, pageDate, isHijri]);
|
|
164
117
|
|
|
165
118
|
return (
|
|
166
|
-
<div className="flex flex-nowrap items-center area-
|
|
119
|
+
<div className="flex flex-nowrap items-center area-header" data-page={page}>
|
|
167
120
|
{startPage !== undefined && (
|
|
168
121
|
<Button
|
|
169
|
-
icon={
|
|
170
|
-
rtlFlip
|
|
122
|
+
icon={{ icon: "icon-[mdi--chevron-double-left]", rtlFlip: true }}
|
|
171
123
|
size="sm"
|
|
172
124
|
variant="link"
|
|
173
125
|
aria-label="start"
|
|
174
126
|
disabled={!startPage}
|
|
175
|
-
className={
|
|
127
|
+
className={cn(hidePrevious && "invisible")}
|
|
176
128
|
onClick={() => startPage && changePageDate?.(startPage)}
|
|
177
129
|
/>
|
|
178
130
|
)}
|
|
179
131
|
<Button
|
|
180
|
-
icon={
|
|
181
|
-
rtlFlip
|
|
132
|
+
icon={{ icon: "icon-[mdi--chevron-left]", rtlFlip: true }}
|
|
182
133
|
size="sm"
|
|
183
134
|
variant="link"
|
|
184
135
|
aria-label="prev"
|
|
185
136
|
disabled={!previousPage}
|
|
186
|
-
className={
|
|
137
|
+
className={cn(hidePrevious && "invisible")}
|
|
187
138
|
onClick={() => previousPage && changePageDate?.(previousPage)}
|
|
188
139
|
/>
|
|
189
140
|
<div
|
|
190
141
|
role="none"
|
|
191
142
|
onClick={() => changePage(page + 1)}
|
|
192
|
-
className={
|
|
143
|
+
className={cn(
|
|
193
144
|
"flex-1 px-2 py-1 text-primary-600 text-center text-sm font-medium truncate",
|
|
194
145
|
page === PageType.DECADE ? "pointer-events-none" : "cursor-pointer",
|
|
195
146
|
)}
|
|
@@ -197,27 +148,25 @@ export const DateHeader = (props: Props) => {
|
|
|
197
148
|
{headLabel}
|
|
198
149
|
</div>
|
|
199
150
|
<Button
|
|
200
|
-
icon={
|
|
201
|
-
rtlFlip
|
|
151
|
+
icon={{ icon: "icon-[mdi--chevron-right]", rtlFlip: true }}
|
|
202
152
|
size="sm"
|
|
203
153
|
variant="link"
|
|
204
154
|
aria-label="next"
|
|
205
155
|
disabled={!nextPage}
|
|
206
|
-
className={
|
|
156
|
+
className={cn(hideNext && "invisible")}
|
|
207
157
|
onClick={() => nextPage && changePageDate?.(nextPage)}
|
|
208
158
|
/>
|
|
209
159
|
{endPage !== undefined && (
|
|
210
160
|
<Button
|
|
211
|
-
icon={
|
|
212
|
-
rtlFlip
|
|
161
|
+
icon={{ icon: "icon-[mdi--chevron-double-right]", rtlFlip: true }}
|
|
213
162
|
size="sm"
|
|
214
163
|
variant="link"
|
|
215
164
|
aria-label="end"
|
|
216
165
|
disabled={!endPage}
|
|
217
|
-
className={
|
|
166
|
+
className={cn(hideNext && "invisible")}
|
|
218
167
|
onClick={() => endPage && changePageDate?.(endPage)}
|
|
219
168
|
/>
|
|
220
169
|
)}
|
|
221
170
|
</div>
|
|
222
171
|
);
|
|
223
|
-
}
|
|
172
|
+
}
|
|
@@ -21,14 +21,13 @@
|
|
|
21
21
|
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
22
22
|
*/
|
|
23
23
|
|
|
24
|
+
import { cn } from "@react-fabric/utilities";
|
|
24
25
|
import { getDay } from "date-fns";
|
|
25
26
|
import i18next from "i18next";
|
|
26
27
|
import { Fragment, useMemo } from "react";
|
|
28
|
+
import { PageType } from "../types";
|
|
27
29
|
import { DateUtil } from "../utils/dateUtil";
|
|
28
30
|
import { DateCell, type DateCellProps } from "./DateCell";
|
|
29
|
-
import classNames from "classnames";
|
|
30
|
-
import { PageType } from "../types";
|
|
31
|
-
import classes from "./Date.module.css";
|
|
32
31
|
|
|
33
32
|
const rows = [0, 1, 2, 3, 4, 5];
|
|
34
33
|
const cols = [0, 1, 2, 3, 4, 5, 6];
|
|
@@ -37,39 +36,22 @@ interface Props extends Omit<DateCellProps, "date"> {
|
|
|
37
36
|
pageDate: Date;
|
|
38
37
|
}
|
|
39
38
|
|
|
40
|
-
export
|
|
39
|
+
export function DatePage({ pageDate, isHijri, ...props }: Props) {
|
|
41
40
|
const startDate = useMemo(() => {
|
|
42
41
|
const first = DateUtil.startOfMonth(pageDate, isHijri);
|
|
43
42
|
const current = getDay(first);
|
|
44
|
-
return DateUtil.addDays(
|
|
45
|
-
first,
|
|
46
|
-
(current < 3 ? -7 : 0) + current * -1,
|
|
47
|
-
isHijri,
|
|
48
|
-
);
|
|
43
|
+
return DateUtil.addDays(first, (current < 3 ? -7 : 0) + current * -1, isHijri);
|
|
49
44
|
}, [isHijri, pageDate]);
|
|
50
45
|
|
|
51
46
|
return (
|
|
52
|
-
<div
|
|
53
|
-
className={
|
|
54
|
-
"grid grid-cols-8 area-content",
|
|
55
|
-
props.page !== PageType.DATE && "invisible",
|
|
56
|
-
)}
|
|
57
|
-
>
|
|
58
|
-
<div
|
|
59
|
-
className={classNames(
|
|
60
|
-
classes.dateHeader,
|
|
61
|
-
"px-1 text-center bg-tint-50 h-7",
|
|
62
|
-
)}
|
|
63
|
-
></div>
|
|
47
|
+
<div className={cn("grid grid-cols-8 area-content", props.page !== PageType.DATE && "invisible")}>
|
|
48
|
+
<div className={cn("fabric-dateHeader", "px-1 text-center bg-tint-50 h-7")}></div>
|
|
64
49
|
{cols.map((col) => {
|
|
65
50
|
const dt = DateUtil.addDays(startDate, col, isHijri);
|
|
66
51
|
return (
|
|
67
52
|
<div
|
|
68
53
|
key={dt.toISOString()}
|
|
69
|
-
className={
|
|
70
|
-
classes.dateHeader,
|
|
71
|
-
"font-medium text-sm p-1 mx-px text-center text-muted bg-tint-50 h-7",
|
|
72
|
-
)}
|
|
54
|
+
className={cn("fabric-dateHeader", "font-medium text-sm p-1 mx-px text-center text-muted bg-tint-50 h-7")}
|
|
73
55
|
>
|
|
74
56
|
{DateUtil.format(dt, "eeeeee", i18next.language, isHijri)}
|
|
75
57
|
</div>
|
|
@@ -77,25 +59,18 @@ export const DatePage = ({ pageDate, isHijri, ...props }: Props) => {
|
|
|
77
59
|
})}
|
|
78
60
|
{rows.map((row) => (
|
|
79
61
|
<Fragment key={row}>
|
|
80
|
-
<div
|
|
81
|
-
|
|
82
|
-
className="px-1 py-1.5 m-px text-xs text-center text-tint-300"
|
|
83
|
-
>
|
|
84
|
-
{DateUtil.getWeek(
|
|
85
|
-
DateUtil.addDays(startDate, row * 7, isHijri),
|
|
86
|
-
i18next.language,
|
|
87
|
-
isHijri,
|
|
88
|
-
)}
|
|
62
|
+
<div key={row} className="px-1 py-1.5 m-px text-xs text-center text-tint-300">
|
|
63
|
+
{DateUtil.getWeek(DateUtil.addDays(startDate, row * 7, isHijri), i18next.language, isHijri)}
|
|
89
64
|
</div>
|
|
90
65
|
{cols.map((col) => {
|
|
91
66
|
const dt = DateUtil.addDays(startDate, row * 7 + col, isHijri);
|
|
92
67
|
return (
|
|
93
68
|
<DateCell
|
|
69
|
+
key={dt.toISOString()}
|
|
94
70
|
{...props}
|
|
95
71
|
date={dt}
|
|
96
72
|
page={PageType.DATE}
|
|
97
73
|
isHijri={isHijri}
|
|
98
|
-
key={dt.toISOString()}
|
|
99
74
|
isMuted={!DateUtil.isSameMonth(dt, pageDate, isHijri)}
|
|
100
75
|
/>
|
|
101
76
|
);
|
|
@@ -104,4 +79,4 @@ export const DatePage = ({ pageDate, isHijri, ...props }: Props) => {
|
|
|
104
79
|
))}
|
|
105
80
|
</div>
|
|
106
81
|
);
|
|
107
|
-
}
|
|
82
|
+
}
|
|
@@ -31,7 +31,7 @@ interface Props extends Omit<DateCellProps, "date"> {
|
|
|
31
31
|
pageDate: Date;
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
-
export
|
|
34
|
+
export function DecadePage({ pageDate, isHijri, ...props }: Props) {
|
|
35
35
|
const startDate = useMemo(() => {
|
|
36
36
|
return DateUtil.startOfCentury(pageDate, isHijri);
|
|
37
37
|
}, [isHijri, pageDate]);
|
|
@@ -50,4 +50,4 @@ export const DecadePage = ({ pageDate, isHijri, ...props }: Props) => {
|
|
|
50
50
|
))}
|
|
51
51
|
</div>
|
|
52
52
|
);
|
|
53
|
-
}
|
|
53
|
+
}
|
|
@@ -31,7 +31,7 @@ interface Props extends Omit<DateCellProps, "date"> {
|
|
|
31
31
|
pageDate: Date;
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
-
export
|
|
34
|
+
export function MonthPage({ pageDate, isHijri, ...props }: Props) {
|
|
35
35
|
const startDate = useMemo(() => {
|
|
36
36
|
return DateUtil.startOfYear(pageDate, isHijri);
|
|
37
37
|
}, [isHijri, pageDate]);
|
|
@@ -49,4 +49,4 @@ export const MonthPage = ({ pageDate, isHijri, ...props }: Props) => {
|
|
|
49
49
|
))}
|
|
50
50
|
</div>
|
|
51
51
|
);
|
|
52
|
-
}
|
|
52
|
+
}
|
|
@@ -21,10 +21,9 @@
|
|
|
21
21
|
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
22
22
|
*/
|
|
23
23
|
|
|
24
|
-
import { useDebounce } from "@react-fabric/core";
|
|
25
|
-
import
|
|
26
|
-
import { useCallback,
|
|
27
|
-
import classes from "./Date.module.css";
|
|
24
|
+
import { useDebounce, usePropState } from "@react-fabric/core";
|
|
25
|
+
import { cn } from "@react-fabric/utilities";
|
|
26
|
+
import { useCallback, useRef } from "react";
|
|
28
27
|
|
|
29
28
|
interface Props {
|
|
30
29
|
hour: number;
|
|
@@ -32,35 +31,20 @@ interface Props {
|
|
|
32
31
|
onTimeChange: (time: { hour: number; minute: number }) => void;
|
|
33
32
|
}
|
|
34
33
|
|
|
35
|
-
export
|
|
34
|
+
export function TimeSlider({ hour = 0, minute = 0, onTimeChange }: Props) {
|
|
36
35
|
const hourRef = useRef<HTMLDivElement>(null);
|
|
37
36
|
const minuteRef = useRef<HTMLDivElement>(null);
|
|
38
37
|
|
|
39
|
-
const [h, setH] =
|
|
40
|
-
const [m, setM] =
|
|
41
|
-
|
|
42
|
-
useEffect(() => {
|
|
43
|
-
setH(hour);
|
|
44
|
-
hourRef.current?.children
|
|
45
|
-
.item(hour + 1)
|
|
46
|
-
?.scrollIntoView({ block: "center" });
|
|
47
|
-
}, [hour]);
|
|
48
|
-
useEffect(() => {
|
|
49
|
-
setM(minute);
|
|
50
|
-
minuteRef.current?.children
|
|
51
|
-
.item(minute + 1)
|
|
52
|
-
?.scrollIntoView({ block: "center" });
|
|
53
|
-
}, [minute]);
|
|
38
|
+
const [h, setH] = usePropState(hour, (hr) => hourRef.current?.children.item(hr + 1)?.scrollIntoView({ block: "center" }));
|
|
39
|
+
const [m, setM] = usePropState(minute, (mn) => minuteRef.current?.children.item(mn + 1)?.scrollIntoView({ block: "center" }));
|
|
54
40
|
|
|
55
41
|
const fireChange = useDebounce(onTimeChange, [onTimeChange]);
|
|
56
42
|
|
|
57
43
|
const calculateTime = useCallback(() => {
|
|
58
44
|
const hourTop = hourRef.current?.scrollTop ?? 0;
|
|
59
|
-
const hourHeight =
|
|
60
|
-
(hourRef.current?.children.item(1) as HTMLElement)?.offsetHeight ?? 0;
|
|
45
|
+
const hourHeight = (hourRef.current?.children.item(1) as HTMLElement)?.offsetHeight ?? 0;
|
|
61
46
|
const minuteTop = minuteRef.current?.scrollTop ?? 0;
|
|
62
|
-
const minuteHeight =
|
|
63
|
-
(minuteRef.current?.children.item(1) as HTMLElement)?.offsetHeight ?? 0;
|
|
47
|
+
const minuteHeight = (minuteRef.current?.children.item(1) as HTMLElement)?.offsetHeight ?? 0;
|
|
64
48
|
|
|
65
49
|
const hour = Math.round(hourTop / hourHeight);
|
|
66
50
|
const minute = Math.round(minuteTop / minuteHeight);
|
|
@@ -69,38 +53,21 @@ export const TimeSlider = ({ hour = 0, minute = 0, onTimeChange }: Props) => {
|
|
|
69
53
|
setM(minute);
|
|
70
54
|
|
|
71
55
|
fireChange({ hour, minute });
|
|
72
|
-
}, [
|
|
56
|
+
}, [fireChange, setH, setM]);
|
|
73
57
|
|
|
74
58
|
return (
|
|
75
|
-
<div
|
|
76
|
-
className={classNames(
|
|
77
|
-
"area-[time] flex flex-col flex-nowrap border-s border-s-tint-50 overflow-hidden bg-base",
|
|
78
|
-
)}
|
|
79
|
-
>
|
|
59
|
+
<div className={cn("area-[time] flex flex-col flex-nowrap border-s border-s-tint-50 overflow-hidden bg-default")}>
|
|
80
60
|
<div className="flex">
|
|
81
|
-
<div
|
|
82
|
-
className={classNames(
|
|
83
|
-
classes.dateHeader,
|
|
84
|
-
"flex-1 font-medium text-muted text-sm p-1 mx-px text-center bg-tint-50",
|
|
85
|
-
)}
|
|
86
|
-
>
|
|
61
|
+
<div className={cn("fabric-dateHeader", "flex-1 font-medium text-muted text-sm p-1 mx-px text-center bg-tint-50")}>
|
|
87
62
|
H
|
|
88
63
|
</div>
|
|
89
|
-
<div
|
|
90
|
-
className={classNames(
|
|
91
|
-
classes.dateHeader,
|
|
92
|
-
"flex-1 font-medium text-muted text-sm p-1 mx-px text-center bg-tint-50",
|
|
93
|
-
)}
|
|
94
|
-
>
|
|
64
|
+
<div className={cn("fabric-dateHeader", "flex-1 font-medium text-muted text-sm p-1 mx-px text-center bg-tint-50")}>
|
|
95
65
|
M
|
|
96
66
|
</div>
|
|
97
67
|
</div>
|
|
98
|
-
<div className="flex flex-1 flex-nowrap overflow-hidden relative">
|
|
68
|
+
<div className="flex flex-1 flex-nowrap items-stretch overflow-hidden relative">
|
|
99
69
|
<div
|
|
100
|
-
className={
|
|
101
|
-
"flex-1 overflow-auto scroll-hide snap-y snap-mandatory",
|
|
102
|
-
classes.timeSlider,
|
|
103
|
-
)}
|
|
70
|
+
className={cn("flex-1 overflow-auto scroll-hide snap-y snap-mandatory", "fabric-date-timeSlider")}
|
|
104
71
|
onScroll={calculateTime}
|
|
105
72
|
ref={hourRef}
|
|
106
73
|
>
|
|
@@ -110,10 +77,8 @@ export const TimeSlider = ({ hour = 0, minute = 0, onTimeChange }: Props) => {
|
|
|
110
77
|
.map((_, i) => (
|
|
111
78
|
<div
|
|
112
79
|
role="none"
|
|
113
|
-
className={
|
|
114
|
-
|
|
115
|
-
i === h && "font-medium text-primary-600",
|
|
116
|
-
)}
|
|
80
|
+
className={cn("ps-2 pe-1 snap-center outline outline-muted", i === h && "font-medium text-primary-600")}
|
|
81
|
+
// eslint-disable-next-line @eslint-react/no-array-index-key
|
|
117
82
|
key={i}
|
|
118
83
|
data-skew={
|
|
119
84
|
i === h - 5 || i === h + 5
|
|
@@ -142,10 +107,7 @@ export const TimeSlider = ({ hour = 0, minute = 0, onTimeChange }: Props) => {
|
|
|
142
107
|
<div className="w-full" />
|
|
143
108
|
</div>
|
|
144
109
|
<div
|
|
145
|
-
className={
|
|
146
|
-
"flex-1 overflow-auto scroll-hide snap-y snap-mandatory",
|
|
147
|
-
classes.timeSlider,
|
|
148
|
-
)}
|
|
110
|
+
className={cn("flex-1 overflow-auto scroll-hide snap-y snap-mandatory", "fabric-date-timeSlider")}
|
|
149
111
|
onScroll={calculateTime}
|
|
150
112
|
ref={minuteRef}
|
|
151
113
|
>
|
|
@@ -155,10 +117,8 @@ export const TimeSlider = ({ hour = 0, minute = 0, onTimeChange }: Props) => {
|
|
|
155
117
|
.map((_, i) => (
|
|
156
118
|
<div
|
|
157
119
|
role="none"
|
|
158
|
-
className={
|
|
159
|
-
|
|
160
|
-
i === m && "font-medium text-primary-600",
|
|
161
|
-
)}
|
|
120
|
+
className={cn("ps-1 pe-2 snap-center outline outline-muted", i === m && "font-medium text-primary-600")}
|
|
121
|
+
// eslint-disable-next-line @eslint-react/no-array-index-key
|
|
162
122
|
key={i}
|
|
163
123
|
data-skew={
|
|
164
124
|
i === m - 5 || i === m + 5
|
|
@@ -193,4 +153,4 @@ export const TimeSlider = ({ hour = 0, minute = 0, onTimeChange }: Props) => {
|
|
|
193
153
|
</div>
|
|
194
154
|
</div>
|
|
195
155
|
);
|
|
196
|
-
}
|
|
156
|
+
}
|
|
@@ -31,7 +31,7 @@ interface Props extends Omit<DateCellProps, "date"> {
|
|
|
31
31
|
pageDate: Date;
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
-
export
|
|
34
|
+
export function YearPage({ pageDate, isHijri, ...props }: Props) {
|
|
35
35
|
const startDate = useMemo(() => {
|
|
36
36
|
return DateUtil.startOfDecade(pageDate, isHijri);
|
|
37
37
|
}, [isHijri, pageDate]);
|
|
@@ -50,4 +50,4 @@ export const YearPage = ({ pageDate, isHijri, ...props }: Props) => {
|
|
|
50
50
|
))}
|
|
51
51
|
</div>
|
|
52
52
|
);
|
|
53
|
-
}
|
|
53
|
+
}
|