@trackunit/react-date-and-time-components 1.17.14 → 1.18.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.
- package/index.cjs.js +9 -8
- package/index.esm.js +9 -8
- package/package.json +5 -5
package/index.cjs.js
CHANGED
|
@@ -469,7 +469,7 @@ const useFilterTemporalPeriodsInRange = () => {
|
|
|
469
469
|
return difference(start ?? new Date(), end ?? new Date(), "day");
|
|
470
470
|
}, [calculateDateRange, difference]);
|
|
471
471
|
return react.useCallback(({ temporalPeriods, maxDaysInRange, }) => {
|
|
472
|
-
if (
|
|
472
|
+
if (maxDaysInRange === undefined || maxDaysInRange === 0) {
|
|
473
473
|
return temporalPeriods;
|
|
474
474
|
}
|
|
475
475
|
return temporalPeriods.filter(period => {
|
|
@@ -612,7 +612,8 @@ const TEMPORAL_DIRECTIONS = ["last", "next"];
|
|
|
612
612
|
* @param value - The value to check.
|
|
613
613
|
* @returns {boolean} - Whether the value is a temporal period.
|
|
614
614
|
*/
|
|
615
|
-
const isTemporalPeriod = (value) =>
|
|
615
|
+
const isTemporalPeriod = (value) => value !== null &&
|
|
616
|
+
value !== undefined &&
|
|
616
617
|
typeof value === "object" &&
|
|
617
618
|
"direction" in value &&
|
|
618
619
|
"count" in value &&
|
|
@@ -866,7 +867,7 @@ const Timeline = ({ className, "data-testid": dataTestId, children, dateHeader,
|
|
|
866
867
|
setIsLoadingMore(true);
|
|
867
868
|
// Use requestAnimationFrame to avoid layout thrashing
|
|
868
869
|
requestAnimationFrame(() => {
|
|
869
|
-
const scrollPos = ref.current?.scrollTop
|
|
870
|
+
const scrollPos = ref.current?.scrollTop ?? 0;
|
|
870
871
|
setVisibleCount(prev => Math.min(prev + ITEMS_PER_PAGE, middleChildren.length));
|
|
871
872
|
// After state update, preserve scroll position
|
|
872
873
|
setTimeout(() => {
|
|
@@ -884,7 +885,7 @@ const Timeline = ({ className, "data-testid": dataTestId, children, dateHeader,
|
|
|
884
885
|
setIsLoadingMore(false);
|
|
885
886
|
}
|
|
886
887
|
}, [isOpen]);
|
|
887
|
-
const renderToggleButton = () => (jsxRuntime.jsxs("div", { className: cvaTimelineElement(), children: [childProps.date ? (jsxRuntime.jsx("div", { className: cvaTimelineElementTime({
|
|
888
|
+
const renderToggleButton = () => (jsxRuntime.jsxs("div", { className: cvaTimelineElement(), children: [childProps.date !== undefined ? (jsxRuntime.jsx("div", { className: cvaTimelineElementTime({
|
|
888
889
|
width: hourCycle === "h12" || hourCycle === "h11" ? "large" : "small",
|
|
889
890
|
}) })) : null, jsxRuntime.jsx("div", { className: cvaDotWrapper(), children: jsxRuntime.jsx("div", { className: cvaLine({ lineStyle: childProps.lineStyle }) }) }), jsxRuntime.jsxs("div", { className: "min-h-8 flex cursor-pointer items-center text-sm text-neutral-500 hover:text-neutral-600", "data-testid": "timeline-toggle-btn", onClick: () => {
|
|
890
891
|
if (toggleButton?.onClick) {
|
|
@@ -896,13 +897,13 @@ const Timeline = ({ className, "data-testid": dataTestId, children, dateHeader,
|
|
|
896
897
|
if (!dateHeader) {
|
|
897
898
|
return null;
|
|
898
899
|
}
|
|
899
|
-
if (customHeader) {
|
|
900
|
+
if (customHeader !== undefined && customHeader !== null) {
|
|
900
901
|
return null;
|
|
901
902
|
}
|
|
902
903
|
const { date, dateRange, showTime } = dateHeader;
|
|
903
904
|
return (jsxRuntime.jsx("div", { className: "pb-4", "data-testid": "timeline-date-header", children: date ? (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(reactComponents.Text, { size: "medium", type: "span", weight: "thick", children: formatDate(date, { selectFormat: !showTime ? "dateOnly" : undefined }) }), jsxRuntime.jsx(reactComponents.Text, { className: "text-neutral-500", size: "medium", type: "span", weight: "thick", children: ` (${dateAndTimeUtils.timeSinceAuto(date, new Date(), undefined, locale)})` })] })) : (jsxRuntime.jsx(reactComponents.Text, { className: "pr-1", size: "medium", type: "span", weight: "thick", children: formatRange(dateRange, { dateStyle: !showTime ? "medium" : undefined }) })) }));
|
|
904
905
|
}, [dateHeader, formatDate, formatRange, customHeader, locale]);
|
|
905
|
-
return (jsxRuntime.jsxs("div", { className: className, "data-testid": dataTestId, ref: refProp, children: [renderDateHeader(), customHeader ? jsxRuntime.jsx("div", { className: "text-sm font-semibold", children: customHeader }) : null, toggleButton && middleChildren.length > 0 ? (jsxRuntime.jsxs("div", { children: [firstChild, middleChildren.length > 0 ? renderToggleButton() : null, jsxRuntime.jsxs("div", { "aria-hidden": !isOpen, className: "overflow-hidden overflow-y-auto transition-all duration-300", ref: ref, children: [jsxRuntime.jsx("div", {}), visibleMiddleChildren, isOpen && visibleCount < middleChildren.length ? (jsxRuntime.jsx("div", { className: "flex justify-center py-2", onClick: e => {
|
|
906
|
+
return (jsxRuntime.jsxs("div", { className: className, "data-testid": dataTestId, ref: refProp, children: [renderDateHeader(), customHeader !== undefined && customHeader !== null ? jsxRuntime.jsx("div", { className: "text-sm font-semibold", children: customHeader }) : null, toggleButton && middleChildren.length > 0 ? (jsxRuntime.jsxs("div", { children: [firstChild, middleChildren.length > 0 ? renderToggleButton() : null, jsxRuntime.jsxs("div", { "aria-hidden": !isOpen, className: "overflow-hidden overflow-y-auto transition-all duration-300", ref: ref, children: [jsxRuntime.jsx("div", {}), visibleMiddleChildren, isOpen && visibleCount < middleChildren.length ? (jsxRuntime.jsx("div", { className: "flex justify-center py-2", onClick: e => {
|
|
906
907
|
e.stopPropagation(); // Prevent parent handlers from firing
|
|
907
908
|
loadMoreItems();
|
|
908
909
|
}, children: jsxRuntime.jsx(reactComponents.Text, { className: "cursor-pointer text-neutral-500 hover:text-neutral-600", "data-testid": "load-more-text", size: "small", type: "span", children: t("timeline.loadMore") }) })) : null, jsxRuntime.jsx("div", {})] }), lastChild] })) : (jsxRuntime.jsx("div", { children: children }))] }));
|
|
@@ -944,7 +945,7 @@ const renderDot = (customDot, isHovered, selected) => {
|
|
|
944
945
|
: defaultDot(isHovered, selected);
|
|
945
946
|
};
|
|
946
947
|
const renderHeader = (header, dataTestId) => {
|
|
947
|
-
if (
|
|
948
|
+
if (header === undefined || header === null) {
|
|
948
949
|
return null;
|
|
949
950
|
}
|
|
950
951
|
if (typeof header === "string") {
|
|
@@ -953,7 +954,7 @@ const renderHeader = (header, dataTestId) => {
|
|
|
953
954
|
return header;
|
|
954
955
|
};
|
|
955
956
|
const renderChildren = (children) => {
|
|
956
|
-
if (
|
|
957
|
+
if (children === undefined || children === null) {
|
|
957
958
|
return null;
|
|
958
959
|
}
|
|
959
960
|
return jsxRuntime.jsx("div", { className: "mt-0.5 content-center text-sm", children: children });
|
package/index.esm.js
CHANGED
|
@@ -467,7 +467,7 @@ const useFilterTemporalPeriodsInRange = () => {
|
|
|
467
467
|
return difference(start ?? new Date(), end ?? new Date(), "day");
|
|
468
468
|
}, [calculateDateRange, difference]);
|
|
469
469
|
return useCallback(({ temporalPeriods, maxDaysInRange, }) => {
|
|
470
|
-
if (
|
|
470
|
+
if (maxDaysInRange === undefined || maxDaysInRange === 0) {
|
|
471
471
|
return temporalPeriods;
|
|
472
472
|
}
|
|
473
473
|
return temporalPeriods.filter(period => {
|
|
@@ -610,7 +610,8 @@ const TEMPORAL_DIRECTIONS = ["last", "next"];
|
|
|
610
610
|
* @param value - The value to check.
|
|
611
611
|
* @returns {boolean} - Whether the value is a temporal period.
|
|
612
612
|
*/
|
|
613
|
-
const isTemporalPeriod = (value) =>
|
|
613
|
+
const isTemporalPeriod = (value) => value !== null &&
|
|
614
|
+
value !== undefined &&
|
|
614
615
|
typeof value === "object" &&
|
|
615
616
|
"direction" in value &&
|
|
616
617
|
"count" in value &&
|
|
@@ -864,7 +865,7 @@ const Timeline = ({ className, "data-testid": dataTestId, children, dateHeader,
|
|
|
864
865
|
setIsLoadingMore(true);
|
|
865
866
|
// Use requestAnimationFrame to avoid layout thrashing
|
|
866
867
|
requestAnimationFrame(() => {
|
|
867
|
-
const scrollPos = ref.current?.scrollTop
|
|
868
|
+
const scrollPos = ref.current?.scrollTop ?? 0;
|
|
868
869
|
setVisibleCount(prev => Math.min(prev + ITEMS_PER_PAGE, middleChildren.length));
|
|
869
870
|
// After state update, preserve scroll position
|
|
870
871
|
setTimeout(() => {
|
|
@@ -882,7 +883,7 @@ const Timeline = ({ className, "data-testid": dataTestId, children, dateHeader,
|
|
|
882
883
|
setIsLoadingMore(false);
|
|
883
884
|
}
|
|
884
885
|
}, [isOpen]);
|
|
885
|
-
const renderToggleButton = () => (jsxs("div", { className: cvaTimelineElement(), children: [childProps.date ? (jsx("div", { className: cvaTimelineElementTime({
|
|
886
|
+
const renderToggleButton = () => (jsxs("div", { className: cvaTimelineElement(), children: [childProps.date !== undefined ? (jsx("div", { className: cvaTimelineElementTime({
|
|
886
887
|
width: hourCycle === "h12" || hourCycle === "h11" ? "large" : "small",
|
|
887
888
|
}) })) : null, jsx("div", { className: cvaDotWrapper(), children: jsx("div", { className: cvaLine({ lineStyle: childProps.lineStyle }) }) }), jsxs("div", { className: "min-h-8 flex cursor-pointer items-center text-sm text-neutral-500 hover:text-neutral-600", "data-testid": "timeline-toggle-btn", onClick: () => {
|
|
888
889
|
if (toggleButton?.onClick) {
|
|
@@ -894,13 +895,13 @@ const Timeline = ({ className, "data-testid": dataTestId, children, dateHeader,
|
|
|
894
895
|
if (!dateHeader) {
|
|
895
896
|
return null;
|
|
896
897
|
}
|
|
897
|
-
if (customHeader) {
|
|
898
|
+
if (customHeader !== undefined && customHeader !== null) {
|
|
898
899
|
return null;
|
|
899
900
|
}
|
|
900
901
|
const { date, dateRange, showTime } = dateHeader;
|
|
901
902
|
return (jsx("div", { className: "pb-4", "data-testid": "timeline-date-header", children: date ? (jsxs(Fragment, { children: [jsx(Text, { size: "medium", type: "span", weight: "thick", children: formatDate(date, { selectFormat: !showTime ? "dateOnly" : undefined }) }), jsx(Text, { className: "text-neutral-500", size: "medium", type: "span", weight: "thick", children: ` (${timeSinceAuto(date, new Date(), undefined, locale)})` })] })) : (jsx(Text, { className: "pr-1", size: "medium", type: "span", weight: "thick", children: formatRange(dateRange, { dateStyle: !showTime ? "medium" : undefined }) })) }));
|
|
902
903
|
}, [dateHeader, formatDate, formatRange, customHeader, locale]);
|
|
903
|
-
return (jsxs("div", { className: className, "data-testid": dataTestId, ref: refProp, children: [renderDateHeader(), customHeader ? jsx("div", { className: "text-sm font-semibold", children: customHeader }) : null, toggleButton && middleChildren.length > 0 ? (jsxs("div", { children: [firstChild, middleChildren.length > 0 ? renderToggleButton() : null, jsxs("div", { "aria-hidden": !isOpen, className: "overflow-hidden overflow-y-auto transition-all duration-300", ref: ref, children: [jsx("div", {}), visibleMiddleChildren, isOpen && visibleCount < middleChildren.length ? (jsx("div", { className: "flex justify-center py-2", onClick: e => {
|
|
904
|
+
return (jsxs("div", { className: className, "data-testid": dataTestId, ref: refProp, children: [renderDateHeader(), customHeader !== undefined && customHeader !== null ? jsx("div", { className: "text-sm font-semibold", children: customHeader }) : null, toggleButton && middleChildren.length > 0 ? (jsxs("div", { children: [firstChild, middleChildren.length > 0 ? renderToggleButton() : null, jsxs("div", { "aria-hidden": !isOpen, className: "overflow-hidden overflow-y-auto transition-all duration-300", ref: ref, children: [jsx("div", {}), visibleMiddleChildren, isOpen && visibleCount < middleChildren.length ? (jsx("div", { className: "flex justify-center py-2", onClick: e => {
|
|
904
905
|
e.stopPropagation(); // Prevent parent handlers from firing
|
|
905
906
|
loadMoreItems();
|
|
906
907
|
}, children: jsx(Text, { className: "cursor-pointer text-neutral-500 hover:text-neutral-600", "data-testid": "load-more-text", size: "small", type: "span", children: t("timeline.loadMore") }) })) : null, jsx("div", {})] }), lastChild] })) : (jsx("div", { children: children }))] }));
|
|
@@ -942,7 +943,7 @@ const renderDot = (customDot, isHovered, selected) => {
|
|
|
942
943
|
: defaultDot(isHovered, selected);
|
|
943
944
|
};
|
|
944
945
|
const renderHeader = (header, dataTestId) => {
|
|
945
|
-
if (
|
|
946
|
+
if (header === undefined || header === null) {
|
|
946
947
|
return null;
|
|
947
948
|
}
|
|
948
949
|
if (typeof header === "string") {
|
|
@@ -951,7 +952,7 @@ const renderHeader = (header, dataTestId) => {
|
|
|
951
952
|
return header;
|
|
952
953
|
};
|
|
953
954
|
const renderChildren = (children) => {
|
|
954
|
-
if (
|
|
955
|
+
if (children === undefined || children === null) {
|
|
955
956
|
return null;
|
|
956
957
|
}
|
|
957
958
|
return jsx("div", { className: "mt-0.5 content-center text-sm", children: children });
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@trackunit/react-date-and-time-components",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.18.0",
|
|
4
4
|
"repository": "https://github.com/Trackunit/manager",
|
|
5
5
|
"license": "SEE LICENSE IN LICENSE.txt",
|
|
6
6
|
"engines": {
|
|
@@ -9,13 +9,13 @@
|
|
|
9
9
|
"dependencies": {
|
|
10
10
|
"react": "19.0.0",
|
|
11
11
|
"@trackunit/react-components": "1.18.9",
|
|
12
|
-
"@trackunit/date-and-time-utils": "1.11.
|
|
13
|
-
"@trackunit/react-date-and-time-hooks": "1.
|
|
12
|
+
"@trackunit/date-and-time-utils": "1.11.70",
|
|
13
|
+
"@trackunit/react-date-and-time-hooks": "1.15.0",
|
|
14
14
|
"@trackunit/css-class-variance-utilities": "1.11.68",
|
|
15
15
|
"@trackunit/ui-icons": "1.11.66",
|
|
16
16
|
"@trackunit/shared-utils": "1.13.68",
|
|
17
|
-
"@trackunit/i18n-library-translation": "1.
|
|
18
|
-
"@trackunit/react-form-components": "1.
|
|
17
|
+
"@trackunit/i18n-library-translation": "1.13.0",
|
|
18
|
+
"@trackunit/react-form-components": "1.16.0",
|
|
19
19
|
"string-ts": "^2.0.0",
|
|
20
20
|
"tailwind-merge": "^2.0.0",
|
|
21
21
|
"react-calendar": "^6.0.0"
|