@progress/kendo-react-layout 5.17.0-dev.202308101212 → 5.17.0-dev.202308110815
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/dist/cdn/js/kendo-react-layout.js +1 -1
- package/dist/es/package-metadata.js +1 -1
- package/dist/es/panelbar/interfaces/PanelBarItemProps.d.ts +2 -1
- package/dist/es/panelbar/interfaces/PanelBarItemProps.js +1 -0
- package/dist/es/timeline/Timeline.d.ts +8 -0
- package/dist/es/timeline/Timeline.js +6 -5
- package/dist/es/timeline/TimelineCard.d.ts +1 -0
- package/dist/es/timeline/TimelineCard.js +1 -1
- package/dist/es/timeline/TimelineHorizontal.js +100 -14
- package/dist/es/timeline/TimelineVertical.js +43 -4
- package/dist/npm/package-metadata.js +1 -1
- package/dist/npm/panelbar/interfaces/PanelBarItemProps.d.ts +2 -1
- package/dist/npm/panelbar/interfaces/PanelBarItemProps.js +1 -0
- package/dist/npm/timeline/Timeline.d.ts +8 -0
- package/dist/npm/timeline/Timeline.js +6 -5
- package/dist/npm/timeline/TimelineCard.d.ts +1 -0
- package/dist/npm/timeline/TimelineCard.js +1 -1
- package/dist/npm/timeline/TimelineHorizontal.js +99 -13
- package/dist/npm/timeline/TimelineVertical.js +42 -3
- package/dist/systemjs/kendo-react-layout.js +1 -1
- package/package.json +13 -13
|
@@ -5,7 +5,7 @@ export var packageMetadata = {
|
|
|
5
5
|
name: '@progress/kendo-react-layout',
|
|
6
6
|
productName: 'KendoReact',
|
|
7
7
|
productCodes: ['KENDOUIREACT', 'KENDOUICOMPLETE'],
|
|
8
|
-
publishDate:
|
|
8
|
+
publishDate: 1691739447,
|
|
9
9
|
version: '',
|
|
10
10
|
licensingDocsUrl: 'https://www.telerik.com/kendo-react-ui/my-license/?utm_medium=product&utm_source=kendoreact&utm_campaign=kendo-ui-react-purchase-license-keys-warning'
|
|
11
11
|
};
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
/// <reference types="react" />
|
|
2
|
+
import { SVGIcon } from '@progress/kendo-react-common';
|
|
2
3
|
/**
|
|
3
4
|
* Represents the props of the PanelBarItem component.
|
|
4
5
|
*/
|
|
@@ -42,7 +43,7 @@ export interface PanelBarItemProps {
|
|
|
42
43
|
/**
|
|
43
44
|
* Defines an SVG icon that will be rendered next to the title ([see example]({% slug titlesitems_panelbar %}#toc-adding-icons)).
|
|
44
45
|
*/
|
|
45
|
-
svgIcon?:
|
|
46
|
+
svgIcon?: SVGIcon;
|
|
46
47
|
/**
|
|
47
48
|
* Defines an icon with a custom CSS class that will be rendered next to the title ([see example]({% slug titlesitems_panelbar %}#toc-adding-icons)).
|
|
48
49
|
*/
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
|
+
import { Navigation } from '@progress/kendo-react-common';
|
|
2
3
|
import { EventDataProps } from './TimelineCard';
|
|
3
4
|
export interface TimelineEventProps {
|
|
4
5
|
/**
|
|
@@ -69,6 +70,11 @@ export interface TimelineProps {
|
|
|
69
70
|
* - `400ms` for vertical
|
|
70
71
|
*/
|
|
71
72
|
transitionDuration?: number;
|
|
73
|
+
/**
|
|
74
|
+
* If set to `true`, the user can use dedicated shortcuts to interact with the Timeline.
|
|
75
|
+
* By default, navigation is disabled.
|
|
76
|
+
*/
|
|
77
|
+
navigatable?: boolean;
|
|
72
78
|
/**
|
|
73
79
|
* An event that is called when event card is toggled.
|
|
74
80
|
*/
|
|
@@ -85,6 +91,8 @@ export interface TimelineDirectionsProps {
|
|
|
85
91
|
eventsData: TimelineEventProps[];
|
|
86
92
|
dateFormat?: string;
|
|
87
93
|
transitionDuration?: number;
|
|
94
|
+
navigatable?: boolean;
|
|
95
|
+
navigation?: React.MutableRefObject<Navigation>;
|
|
88
96
|
onActionClick?: (event: EventDataProps) => void;
|
|
89
97
|
}
|
|
90
98
|
export declare const Timeline: React.FunctionComponent<TimelineProps>;
|
|
@@ -4,20 +4,21 @@ import { classNames } from '@progress/kendo-react-common';
|
|
|
4
4
|
import { TimelineHorizontal } from './TimelineHorizontal';
|
|
5
5
|
import { TimelineVertical } from './TimelineVertical';
|
|
6
6
|
export var Timeline = function (props) {
|
|
7
|
-
var collapsibleEvents = props.collapsibleEvents, transitionDuration = props.transitionDuration, className = props.className, alterMode = props.alterMode, horizontal = props.horizontal, events = props.events, dateFormat = props.dateFormat, onChange = props.onChange, onActionClick = props.onActionClick;
|
|
7
|
+
var collapsibleEvents = props.collapsibleEvents, transitionDuration = props.transitionDuration, className = props.className, alterMode = props.alterMode, navigatable = props.navigatable, horizontal = props.horizontal, events = props.events, dateFormat = props.dateFormat, onChange = props.onChange, onActionClick = props.onActionClick;
|
|
8
8
|
var _a = React.useState(), trackAxisWidth = _a[0], setTrackAxisWidth = _a[1];
|
|
9
9
|
var trackWrapRef = React.useRef(null);
|
|
10
10
|
React.useEffect(function () {
|
|
11
|
-
|
|
12
|
-
|
|
11
|
+
if (trackWrapRef.current) {
|
|
12
|
+
setTrackAxisWidth(trackWrapRef.current.offsetWidth);
|
|
13
|
+
}
|
|
13
14
|
}, []);
|
|
14
15
|
return (React.createElement("div", { ref: trackWrapRef, className: classNames('k-timeline', {
|
|
15
16
|
'k-timeline-collapsible': collapsibleEvents,
|
|
16
17
|
'k-timeline-vertical': !horizontal,
|
|
17
18
|
'k-timeline-alternating': alterMode,
|
|
18
19
|
'k-timeline-horizontal': horizontal
|
|
19
|
-
}, className), style: { width: "".concat(trackAxisWidth, "px") } }, horizontal ? React.createElement(TimelineHorizontal, { eventsData: events, dateFormat: dateFormat, transitionDuration: transitionDuration, onActionClick: onActionClick })
|
|
20
|
-
: React.createElement(TimelineVertical, { eventsData: events, dateFormat: dateFormat, alterMode: alterMode, collapsibleEvents: collapsibleEvents, transitionDuration: transitionDuration, onChange: onChange, onActionClick: onActionClick })));
|
|
20
|
+
}, className), style: { width: "".concat(trackAxisWidth, "px") } }, horizontal ? React.createElement(TimelineHorizontal, { navigatable: navigatable, eventsData: events, dateFormat: dateFormat, transitionDuration: transitionDuration, onActionClick: onActionClick })
|
|
21
|
+
: React.createElement(TimelineVertical, { navigatable: navigatable, eventsData: events, dateFormat: dateFormat, alterMode: alterMode, collapsibleEvents: collapsibleEvents, transitionDuration: transitionDuration, onChange: onChange, onActionClick: onActionClick })));
|
|
21
22
|
};
|
|
22
23
|
Timeline.defaultProps = {
|
|
23
24
|
alterMode: false,
|
|
@@ -42,7 +42,7 @@ export var TimelineCard = function (props) {
|
|
|
42
42
|
React.createElement("p", null, description),
|
|
43
43
|
images && images.map(function (image, index) { return (React.createElement(CardImage, { key: index, src: image.src })); }))),
|
|
44
44
|
React.createElement(CardActions, null, actions && actions.map(function (action, index) { return (React.createElement("a", { key: index, href: action.url, className: "k-button k-button-md k-rounded-md k-button-flat k-button-flat-primary", onClick: actionClick }, action.text)); })))); };
|
|
45
|
-
return (React.createElement("div", { className: classNames('k-timeline-card', { 'k-collapsed': props.collapsible && opened }) },
|
|
45
|
+
return (React.createElement("div", { "data-testid": "k-timeline-card", className: classNames('k-timeline-card', { 'k-collapsed': props.collapsible && opened }) },
|
|
46
46
|
React.createElement(Card, { "aria-live": "polite", "aria-describedby": props.id, "aria-atomic": "true", tabIndex: props.tabindex, role: props.horizontal ? 'tabpanel' : 'button', "aria-expanded": props.collapsible && opened },
|
|
47
47
|
React.createElement("span", { style: props.calloutStyle, className: classNames('k-timeline-card-callout', 'k-card-callout', { 'k-callout-n': props.horizontal }, { 'k-callout-e': props.alternated && !props.horizontal }, { 'k-callout-w': !props.alternated && !props.horizontal }) }),
|
|
48
48
|
React.createElement("div", { className: 'k-card-inner' },
|
|
@@ -15,7 +15,7 @@ import { TimelineCard } from './TimelineCard';
|
|
|
15
15
|
import { addYearsFlags } from './utils';
|
|
16
16
|
import { caretAltLeftIcon, caretAltRightIcon } from '@progress/kendo-svg-icons';
|
|
17
17
|
import { useInternationalization } from '@progress/kendo-react-intl';
|
|
18
|
-
import { classNames, canUseDOM, SvgIcon } from '@progress/kendo-react-common';
|
|
18
|
+
import { classNames, canUseDOM, SvgIcon, Navigation } from '@progress/kendo-react-common';
|
|
19
19
|
export var TimelineHorizontal = function (props) {
|
|
20
20
|
var DEFAULT_EVENT_POINT_WITH = 150;
|
|
21
21
|
var EVENT_CARD_TRANSITION_DURATION = 300;
|
|
@@ -36,8 +36,41 @@ export var TimelineHorizontal = function (props) {
|
|
|
36
36
|
var trackWrapRef = React.useRef(null);
|
|
37
37
|
var trackRef = React.useRef(null);
|
|
38
38
|
var arrowLeftRef = React.useRef(null);
|
|
39
|
+
var eventsData = props.eventsData, dateFormat = props.dateFormat, navigatable = props.navigatable, onActionClick = props.onActionClick;
|
|
39
40
|
var tabWith = tabFlexWith ? "".concat(tabFlexWith, "%") : "".concat(DEFAULT_EVENT_POINT_WITH, "px");
|
|
40
|
-
var
|
|
41
|
+
var navigation = React.useRef(new Navigation({
|
|
42
|
+
tabIndex: 0,
|
|
43
|
+
root: trackWrapRef,
|
|
44
|
+
selectors: ['.k-timeline-scrollable-wrap']
|
|
45
|
+
}));
|
|
46
|
+
React.useEffect(function () {
|
|
47
|
+
if (trackWrapRef.current) {
|
|
48
|
+
if (props.navigatable) {
|
|
49
|
+
setTimeout(function () {
|
|
50
|
+
var firstCell = navigation.current.first;
|
|
51
|
+
if (firstCell) {
|
|
52
|
+
firstCell.setAttribute('tabindex', String(0));
|
|
53
|
+
}
|
|
54
|
+
}, 0);
|
|
55
|
+
navigation.current.keyboardEvents = {
|
|
56
|
+
keydown: {
|
|
57
|
+
'ArrowRight': onRight,
|
|
58
|
+
'ArrowLeft': onLeft,
|
|
59
|
+
'End': onEnd,
|
|
60
|
+
'Home': onHome
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}, [props.navigatable, currentEvent, visibleTabs]);
|
|
66
|
+
React.useEffect(function () {
|
|
67
|
+
navigation.current.update();
|
|
68
|
+
});
|
|
69
|
+
var handleKeyDown = function (e) {
|
|
70
|
+
if (navigatable && navigation.current) {
|
|
71
|
+
navigation.current.triggerKeyboardEvent(e);
|
|
72
|
+
}
|
|
73
|
+
};
|
|
41
74
|
React.useEffect(function () {
|
|
42
75
|
var _a;
|
|
43
76
|
var observerResize = canUseDOM && window.ResizeObserver && new window.ResizeObserver(repositionEvents);
|
|
@@ -50,7 +83,7 @@ export var TimelineHorizontal = function (props) {
|
|
|
50
83
|
repositionEvents();
|
|
51
84
|
setEventsPositions([cardWith, 0, -cardWith]);
|
|
52
85
|
return function () {
|
|
53
|
-
observerResize.disconnect();
|
|
86
|
+
observerResize && observerResize.disconnect();
|
|
54
87
|
};
|
|
55
88
|
}, []);
|
|
56
89
|
React.useEffect(function () {
|
|
@@ -73,6 +106,60 @@ export var TimelineHorizontal = function (props) {
|
|
|
73
106
|
positionCallout(currentTab);
|
|
74
107
|
}
|
|
75
108
|
}, [visibleTabs, tabFlexWith, currentEvent]);
|
|
109
|
+
var onRight = function (_target, _nav, ev) {
|
|
110
|
+
if (trackRef.current) {
|
|
111
|
+
var nextChildren = trackRef.current.children[currentEvent + 1];
|
|
112
|
+
var nextPoint = nextChildren && nextChildren.classList.contains('k-timeline-flag-wrap')
|
|
113
|
+
? currentEvent + 2
|
|
114
|
+
: currentEvent + 1;
|
|
115
|
+
if (eventsOnTrack && eventsOnTrack.length <= nextPoint) {
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
if ((visibleTabs + firstIndexInView) <= nextPoint) {
|
|
119
|
+
handleNextClick();
|
|
120
|
+
}
|
|
121
|
+
onPointClick(nextPoint, ev);
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
var onLeft = function (_target, _nav, ev) {
|
|
125
|
+
if (trackRef.current) {
|
|
126
|
+
var prevChildren = trackRef.current && trackRef.current.children[currentEvent - 1];
|
|
127
|
+
var prevPoint = prevChildren && prevChildren.classList.contains('k-timeline-flag-wrap')
|
|
128
|
+
? currentEvent - 2
|
|
129
|
+
: currentEvent - 1;
|
|
130
|
+
if (prevPoint <= 0) {
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
if (prevPoint < firstIndexInView) {
|
|
134
|
+
handlePrevClick();
|
|
135
|
+
}
|
|
136
|
+
onPointClick(prevPoint, ev);
|
|
137
|
+
}
|
|
138
|
+
};
|
|
139
|
+
var onHome = function (_target, _nav, ev) {
|
|
140
|
+
if (trackRef.current) {
|
|
141
|
+
if (currentEvent <= 1) {
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
var firstChild = 1;
|
|
145
|
+
var translateUpdate = 0;
|
|
146
|
+
moveView(true, firstChild, 0, translateUpdate);
|
|
147
|
+
onPointClick(firstChild, ev);
|
|
148
|
+
}
|
|
149
|
+
};
|
|
150
|
+
var onEnd = function (_target, _nav, ev) {
|
|
151
|
+
if (trackRef.current) {
|
|
152
|
+
var lastChild = trackRef.current && trackRef.current.children.length - 1;
|
|
153
|
+
if (lastChild <= currentEvent) {
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
var scrollViewsCount = Math.floor(lastChild / visibleTabs);
|
|
157
|
+
var translateUpdate = (scrollViewsCount) * -100;
|
|
158
|
+
var firstTabToUpdate = scrollViewsCount * visibleTabs;
|
|
159
|
+
moveView(true, lastChild, firstTabToUpdate, translateUpdate);
|
|
160
|
+
onPointClick(lastChild, ev);
|
|
161
|
+
}
|
|
162
|
+
};
|
|
76
163
|
var setYearsFlags = function () {
|
|
77
164
|
var trackData = addYearsFlags(eventsData);
|
|
78
165
|
setEventsOnTrack(trackData);
|
|
@@ -88,11 +175,7 @@ export var TimelineHorizontal = function (props) {
|
|
|
88
175
|
? lastIndexInView - 1
|
|
89
176
|
: lastIndexInView;
|
|
90
177
|
var translateUpdate = translate + 100 > 0 ? 0 : translate + 100;
|
|
91
|
-
|
|
92
|
-
repositionEvents();
|
|
93
|
-
setFirstIndexInView(firstTabToUpdate);
|
|
94
|
-
setTranslate(translateUpdate);
|
|
95
|
-
setCurrentEvent(currentEventToUpdate);
|
|
178
|
+
moveView(false, currentEventToUpdate, firstTabToUpdate, translateUpdate);
|
|
96
179
|
}
|
|
97
180
|
};
|
|
98
181
|
var handleNextClick = function () {
|
|
@@ -103,13 +186,16 @@ export var TimelineHorizontal = function (props) {
|
|
|
103
186
|
? firstTabToUpdate + 1
|
|
104
187
|
: firstTabToUpdate;
|
|
105
188
|
var translateUpdate = translate - 100;
|
|
106
|
-
|
|
107
|
-
repositionEvents();
|
|
108
|
-
setFirstIndexInView(firstTabToUpdate);
|
|
109
|
-
setTranslate(translateUpdate);
|
|
110
|
-
setCurrentEvent(currentEventToUpdate);
|
|
189
|
+
moveView(true, currentEventToUpdate, firstTabToUpdate, translateUpdate);
|
|
111
190
|
}
|
|
112
191
|
};
|
|
192
|
+
var moveView = function (direction, eventToUpdate, firstTab, translateToUpdate) {
|
|
193
|
+
updatePage(direction, eventToUpdate);
|
|
194
|
+
repositionEvents();
|
|
195
|
+
setFirstIndexInView(firstTab);
|
|
196
|
+
setTranslate(translateToUpdate);
|
|
197
|
+
setCurrentEvent(eventToUpdate);
|
|
198
|
+
};
|
|
113
199
|
var updatePage = function (forward, current) {
|
|
114
200
|
var _a;
|
|
115
201
|
if (eventsToShow && eventsOnTrack) {
|
|
@@ -181,7 +267,7 @@ export var TimelineHorizontal = function (props) {
|
|
|
181
267
|
transform: "translateX(".concat(translation, "%)"), transformOrigin: 'left top'
|
|
182
268
|
}); };
|
|
183
269
|
return (React.createElement(React.Fragment, null,
|
|
184
|
-
React.createElement("div", { className: "k-timeline-track-wrap", ref: trackWrapRef },
|
|
270
|
+
React.createElement("div", { className: "k-timeline-track-wrap", ref: trackWrapRef, onKeyDown: handleKeyDown },
|
|
185
271
|
React.createElement("a", { ref: arrowLeftRef, "aria-hidden": "true", onClick: function () { return arrowLeft && handlePrevClick(); }, className: classNames('k-timeline-arrow', 'k-timeline-arrow-left', 'k-button k-button-md k-rounded-md k-button-solid k-button-solid-base k-icon-button', { 'k-disabled': !arrowLeft }) },
|
|
186
272
|
React.createElement(SvgIcon, { icon: caretAltLeftIcon })),
|
|
187
273
|
React.createElement("a", { "aria-hidden": "true", onClick: function () { return arrowRight && handleNextClick(); }, className: classNames('k-timeline-arrow', 'k-timeline-arrow-right', 'k-button k-button-md k-rounded-md k-button-solid k-button-solid-base k-icon-button', { 'k-disabled': !arrowRight }) },
|
|
@@ -2,16 +2,55 @@ import * as React from 'react';
|
|
|
2
2
|
import * as PropTypes from 'prop-types';
|
|
3
3
|
import { TimelineCard } from './TimelineCard';
|
|
4
4
|
import { addYearsFlags } from './utils';
|
|
5
|
-
import { classNames, guid } from '@progress/kendo-react-common';
|
|
5
|
+
import { Navigation, classNames, guid } from '@progress/kendo-react-common';
|
|
6
6
|
import { useInternationalization } from '@progress/kendo-react-intl';
|
|
7
7
|
export var TimelineVertical = function (props) {
|
|
8
8
|
var intl = useInternationalization();
|
|
9
9
|
var _a = React.useState(), eventsList = _a[0], setEventsList = _a[1];
|
|
10
|
-
var collapsibleEvents = props.collapsibleEvents, transitionDuration = props.transitionDuration, eventsData = props.eventsData, dateFormat = props.dateFormat, alterMode = props.alterMode, onChange = props.onChange, onActionClick = props.onActionClick;
|
|
10
|
+
var collapsibleEvents = props.collapsibleEvents, transitionDuration = props.transitionDuration, eventsData = props.eventsData, dateFormat = props.dateFormat, alterMode = props.alterMode, navigatable = props.navigatable, onChange = props.onChange, onActionClick = props.onActionClick;
|
|
11
|
+
var eventAxisRef = React.useRef(null);
|
|
12
|
+
var navigation = React.useRef(new Navigation({
|
|
13
|
+
tabIndex: 0,
|
|
14
|
+
root: eventAxisRef,
|
|
15
|
+
selectors: ['.k-card-vertical']
|
|
16
|
+
}));
|
|
17
|
+
React.useEffect(function () {
|
|
18
|
+
if (eventAxisRef.current) {
|
|
19
|
+
if (props.navigatable) {
|
|
20
|
+
setTimeout(function () {
|
|
21
|
+
var firstCell = navigation.current.first;
|
|
22
|
+
if (firstCell) {
|
|
23
|
+
firstCell.setAttribute('tabindex', String(0));
|
|
24
|
+
}
|
|
25
|
+
}, 0);
|
|
26
|
+
navigation.current.keyboardEvents = {
|
|
27
|
+
keydown: {
|
|
28
|
+
'Space': onEnter,
|
|
29
|
+
'Enter': onEnter
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}, [props.navigatable]);
|
|
11
35
|
React.useEffect(function () {
|
|
12
36
|
setEventsList(addYearsFlags(eventsData));
|
|
13
37
|
}, []);
|
|
14
|
-
|
|
38
|
+
React.useEffect(function () {
|
|
39
|
+
navigation.current.update();
|
|
40
|
+
});
|
|
41
|
+
var handleKeyDown = function (e) {
|
|
42
|
+
if (navigatable && navigation.current) {
|
|
43
|
+
navigation.current.triggerKeyboardEvent(e);
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
var onEnter = function (target, _nav, ev) {
|
|
47
|
+
ev.preventDefault();
|
|
48
|
+
var element = target.querySelector('.k-card-title .k-event-collapse');
|
|
49
|
+
if (element) {
|
|
50
|
+
element.click();
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
return (React.createElement("ul", { ref: eventAxisRef, onKeyDown: handleKeyDown }, eventsList && eventsList.map(function (event, index) {
|
|
15
54
|
var cardId = guid();
|
|
16
55
|
return (React.createElement(React.Fragment, { key: index }, event.yearFlag
|
|
17
56
|
? (React.createElement("li", { className: "k-timeline-flag-wrap" },
|
|
@@ -20,7 +59,7 @@ export var TimelineVertical = function (props) {
|
|
|
20
59
|
React.createElement("div", { className: "k-timeline-date-wrap" },
|
|
21
60
|
React.createElement("span", { className: "k-timeline-date", id: cardId }, intl.formatDate(event.date, dateFormat))),
|
|
22
61
|
React.createElement("a", { className: "k-timeline-circle" }),
|
|
23
|
-
React.createElement(TimelineCard, { id: cardId, tabindex: 0, eventData: event, alternated: alterMode && index % 2 !== 0, collapsible: collapsibleEvents, transitionDuration: transitionDuration, onChange: onChange, onActionClick: onActionClick })))));
|
|
62
|
+
React.createElement(TimelineCard, { id: cardId, tabindex: navigatable ? 0 : -1, eventData: event, alternated: alterMode && index % 2 !== 0, collapsible: collapsibleEvents, transitionDuration: transitionDuration, onChange: onChange, onActionClick: onActionClick })))));
|
|
24
63
|
})));
|
|
25
64
|
};
|
|
26
65
|
TimelineVertical.propTypes = {
|
|
@@ -8,7 +8,7 @@ exports.packageMetadata = {
|
|
|
8
8
|
name: '@progress/kendo-react-layout',
|
|
9
9
|
productName: 'KendoReact',
|
|
10
10
|
productCodes: ['KENDOUIREACT', 'KENDOUICOMPLETE'],
|
|
11
|
-
publishDate:
|
|
11
|
+
publishDate: 1691739447,
|
|
12
12
|
version: '',
|
|
13
13
|
licensingDocsUrl: 'https://www.telerik.com/kendo-react-ui/my-license/?utm_medium=product&utm_source=kendoreact&utm_campaign=kendo-ui-react-purchase-license-keys-warning'
|
|
14
14
|
};
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
/// <reference types="react" />
|
|
2
|
+
import { SVGIcon } from '@progress/kendo-react-common';
|
|
2
3
|
/**
|
|
3
4
|
* Represents the props of the PanelBarItem component.
|
|
4
5
|
*/
|
|
@@ -42,7 +43,7 @@ export interface PanelBarItemProps {
|
|
|
42
43
|
/**
|
|
43
44
|
* Defines an SVG icon that will be rendered next to the title ([see example]({% slug titlesitems_panelbar %}#toc-adding-icons)).
|
|
44
45
|
*/
|
|
45
|
-
svgIcon?:
|
|
46
|
+
svgIcon?: SVGIcon;
|
|
46
47
|
/**
|
|
47
48
|
* Defines an icon with a custom CSS class that will be rendered next to the title ([see example]({% slug titlesitems_panelbar %}#toc-adding-icons)).
|
|
48
49
|
*/
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
|
+
import { Navigation } from '@progress/kendo-react-common';
|
|
2
3
|
import { EventDataProps } from './TimelineCard';
|
|
3
4
|
export interface TimelineEventProps {
|
|
4
5
|
/**
|
|
@@ -69,6 +70,11 @@ export interface TimelineProps {
|
|
|
69
70
|
* - `400ms` for vertical
|
|
70
71
|
*/
|
|
71
72
|
transitionDuration?: number;
|
|
73
|
+
/**
|
|
74
|
+
* If set to `true`, the user can use dedicated shortcuts to interact with the Timeline.
|
|
75
|
+
* By default, navigation is disabled.
|
|
76
|
+
*/
|
|
77
|
+
navigatable?: boolean;
|
|
72
78
|
/**
|
|
73
79
|
* An event that is called when event card is toggled.
|
|
74
80
|
*/
|
|
@@ -85,6 +91,8 @@ export interface TimelineDirectionsProps {
|
|
|
85
91
|
eventsData: TimelineEventProps[];
|
|
86
92
|
dateFormat?: string;
|
|
87
93
|
transitionDuration?: number;
|
|
94
|
+
navigatable?: boolean;
|
|
95
|
+
navigation?: React.MutableRefObject<Navigation>;
|
|
88
96
|
onActionClick?: (event: EventDataProps) => void;
|
|
89
97
|
}
|
|
90
98
|
export declare const Timeline: React.FunctionComponent<TimelineProps>;
|
|
@@ -7,20 +7,21 @@ var kendo_react_common_1 = require("@progress/kendo-react-common");
|
|
|
7
7
|
var TimelineHorizontal_1 = require("./TimelineHorizontal");
|
|
8
8
|
var TimelineVertical_1 = require("./TimelineVertical");
|
|
9
9
|
var Timeline = function (props) {
|
|
10
|
-
var collapsibleEvents = props.collapsibleEvents, transitionDuration = props.transitionDuration, className = props.className, alterMode = props.alterMode, horizontal = props.horizontal, events = props.events, dateFormat = props.dateFormat, onChange = props.onChange, onActionClick = props.onActionClick;
|
|
10
|
+
var collapsibleEvents = props.collapsibleEvents, transitionDuration = props.transitionDuration, className = props.className, alterMode = props.alterMode, navigatable = props.navigatable, horizontal = props.horizontal, events = props.events, dateFormat = props.dateFormat, onChange = props.onChange, onActionClick = props.onActionClick;
|
|
11
11
|
var _a = React.useState(), trackAxisWidth = _a[0], setTrackAxisWidth = _a[1];
|
|
12
12
|
var trackWrapRef = React.useRef(null);
|
|
13
13
|
React.useEffect(function () {
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
if (trackWrapRef.current) {
|
|
15
|
+
setTrackAxisWidth(trackWrapRef.current.offsetWidth);
|
|
16
|
+
}
|
|
16
17
|
}, []);
|
|
17
18
|
return (React.createElement("div", { ref: trackWrapRef, className: (0, kendo_react_common_1.classNames)('k-timeline', {
|
|
18
19
|
'k-timeline-collapsible': collapsibleEvents,
|
|
19
20
|
'k-timeline-vertical': !horizontal,
|
|
20
21
|
'k-timeline-alternating': alterMode,
|
|
21
22
|
'k-timeline-horizontal': horizontal
|
|
22
|
-
}, className), style: { width: "".concat(trackAxisWidth, "px") } }, horizontal ? React.createElement(TimelineHorizontal_1.TimelineHorizontal, { eventsData: events, dateFormat: dateFormat, transitionDuration: transitionDuration, onActionClick: onActionClick })
|
|
23
|
-
: React.createElement(TimelineVertical_1.TimelineVertical, { eventsData: events, dateFormat: dateFormat, alterMode: alterMode, collapsibleEvents: collapsibleEvents, transitionDuration: transitionDuration, onChange: onChange, onActionClick: onActionClick })));
|
|
23
|
+
}, className), style: { width: "".concat(trackAxisWidth, "px") } }, horizontal ? React.createElement(TimelineHorizontal_1.TimelineHorizontal, { navigatable: navigatable, eventsData: events, dateFormat: dateFormat, transitionDuration: transitionDuration, onActionClick: onActionClick })
|
|
24
|
+
: React.createElement(TimelineVertical_1.TimelineVertical, { navigatable: navigatable, eventsData: events, dateFormat: dateFormat, alterMode: alterMode, collapsibleEvents: collapsibleEvents, transitionDuration: transitionDuration, onChange: onChange, onActionClick: onActionClick })));
|
|
24
25
|
};
|
|
25
26
|
exports.Timeline = Timeline;
|
|
26
27
|
exports.Timeline.defaultProps = {
|
|
@@ -45,7 +45,7 @@ var TimelineCard = function (props) {
|
|
|
45
45
|
React.createElement("p", null, description),
|
|
46
46
|
images && images.map(function (image, index) { return (React.createElement(CardImage_1.CardImage, { key: index, src: image.src })); }))),
|
|
47
47
|
React.createElement(CardActions_1.CardActions, null, actions && actions.map(function (action, index) { return (React.createElement("a", { key: index, href: action.url, className: "k-button k-button-md k-rounded-md k-button-flat k-button-flat-primary", onClick: actionClick }, action.text)); })))); };
|
|
48
|
-
return (React.createElement("div", { className: (0, kendo_react_common_1.classNames)('k-timeline-card', { 'k-collapsed': props.collapsible && opened }) },
|
|
48
|
+
return (React.createElement("div", { "data-testid": "k-timeline-card", className: (0, kendo_react_common_1.classNames)('k-timeline-card', { 'k-collapsed': props.collapsible && opened }) },
|
|
49
49
|
React.createElement(Card_1.Card, { "aria-live": "polite", "aria-describedby": props.id, "aria-atomic": "true", tabIndex: props.tabindex, role: props.horizontal ? 'tabpanel' : 'button', "aria-expanded": props.collapsible && opened },
|
|
50
50
|
React.createElement("span", { style: props.calloutStyle, className: (0, kendo_react_common_1.classNames)('k-timeline-card-callout', 'k-card-callout', { 'k-callout-n': props.horizontal }, { 'k-callout-e': props.alternated && !props.horizontal }, { 'k-callout-w': !props.alternated && !props.horizontal }) }),
|
|
51
51
|
React.createElement("div", { className: 'k-card-inner' },
|
|
@@ -39,8 +39,41 @@ var TimelineHorizontal = function (props) {
|
|
|
39
39
|
var trackWrapRef = React.useRef(null);
|
|
40
40
|
var trackRef = React.useRef(null);
|
|
41
41
|
var arrowLeftRef = React.useRef(null);
|
|
42
|
+
var eventsData = props.eventsData, dateFormat = props.dateFormat, navigatable = props.navigatable, onActionClick = props.onActionClick;
|
|
42
43
|
var tabWith = tabFlexWith ? "".concat(tabFlexWith, "%") : "".concat(DEFAULT_EVENT_POINT_WITH, "px");
|
|
43
|
-
var
|
|
44
|
+
var navigation = React.useRef(new kendo_react_common_1.Navigation({
|
|
45
|
+
tabIndex: 0,
|
|
46
|
+
root: trackWrapRef,
|
|
47
|
+
selectors: ['.k-timeline-scrollable-wrap']
|
|
48
|
+
}));
|
|
49
|
+
React.useEffect(function () {
|
|
50
|
+
if (trackWrapRef.current) {
|
|
51
|
+
if (props.navigatable) {
|
|
52
|
+
setTimeout(function () {
|
|
53
|
+
var firstCell = navigation.current.first;
|
|
54
|
+
if (firstCell) {
|
|
55
|
+
firstCell.setAttribute('tabindex', String(0));
|
|
56
|
+
}
|
|
57
|
+
}, 0);
|
|
58
|
+
navigation.current.keyboardEvents = {
|
|
59
|
+
keydown: {
|
|
60
|
+
'ArrowRight': onRight,
|
|
61
|
+
'ArrowLeft': onLeft,
|
|
62
|
+
'End': onEnd,
|
|
63
|
+
'Home': onHome
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}, [props.navigatable, currentEvent, visibleTabs]);
|
|
69
|
+
React.useEffect(function () {
|
|
70
|
+
navigation.current.update();
|
|
71
|
+
});
|
|
72
|
+
var handleKeyDown = function (e) {
|
|
73
|
+
if (navigatable && navigation.current) {
|
|
74
|
+
navigation.current.triggerKeyboardEvent(e);
|
|
75
|
+
}
|
|
76
|
+
};
|
|
44
77
|
React.useEffect(function () {
|
|
45
78
|
var _a;
|
|
46
79
|
var observerResize = kendo_react_common_1.canUseDOM && window.ResizeObserver && new window.ResizeObserver(repositionEvents);
|
|
@@ -53,7 +86,7 @@ var TimelineHorizontal = function (props) {
|
|
|
53
86
|
repositionEvents();
|
|
54
87
|
setEventsPositions([cardWith, 0, -cardWith]);
|
|
55
88
|
return function () {
|
|
56
|
-
observerResize.disconnect();
|
|
89
|
+
observerResize && observerResize.disconnect();
|
|
57
90
|
};
|
|
58
91
|
}, []);
|
|
59
92
|
React.useEffect(function () {
|
|
@@ -76,6 +109,60 @@ var TimelineHorizontal = function (props) {
|
|
|
76
109
|
positionCallout(currentTab);
|
|
77
110
|
}
|
|
78
111
|
}, [visibleTabs, tabFlexWith, currentEvent]);
|
|
112
|
+
var onRight = function (_target, _nav, ev) {
|
|
113
|
+
if (trackRef.current) {
|
|
114
|
+
var nextChildren = trackRef.current.children[currentEvent + 1];
|
|
115
|
+
var nextPoint = nextChildren && nextChildren.classList.contains('k-timeline-flag-wrap')
|
|
116
|
+
? currentEvent + 2
|
|
117
|
+
: currentEvent + 1;
|
|
118
|
+
if (eventsOnTrack && eventsOnTrack.length <= nextPoint) {
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
if ((visibleTabs + firstIndexInView) <= nextPoint) {
|
|
122
|
+
handleNextClick();
|
|
123
|
+
}
|
|
124
|
+
onPointClick(nextPoint, ev);
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
var onLeft = function (_target, _nav, ev) {
|
|
128
|
+
if (trackRef.current) {
|
|
129
|
+
var prevChildren = trackRef.current && trackRef.current.children[currentEvent - 1];
|
|
130
|
+
var prevPoint = prevChildren && prevChildren.classList.contains('k-timeline-flag-wrap')
|
|
131
|
+
? currentEvent - 2
|
|
132
|
+
: currentEvent - 1;
|
|
133
|
+
if (prevPoint <= 0) {
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
if (prevPoint < firstIndexInView) {
|
|
137
|
+
handlePrevClick();
|
|
138
|
+
}
|
|
139
|
+
onPointClick(prevPoint, ev);
|
|
140
|
+
}
|
|
141
|
+
};
|
|
142
|
+
var onHome = function (_target, _nav, ev) {
|
|
143
|
+
if (trackRef.current) {
|
|
144
|
+
if (currentEvent <= 1) {
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
var firstChild = 1;
|
|
148
|
+
var translateUpdate = 0;
|
|
149
|
+
moveView(true, firstChild, 0, translateUpdate);
|
|
150
|
+
onPointClick(firstChild, ev);
|
|
151
|
+
}
|
|
152
|
+
};
|
|
153
|
+
var onEnd = function (_target, _nav, ev) {
|
|
154
|
+
if (trackRef.current) {
|
|
155
|
+
var lastChild = trackRef.current && trackRef.current.children.length - 1;
|
|
156
|
+
if (lastChild <= currentEvent) {
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
var scrollViewsCount = Math.floor(lastChild / visibleTabs);
|
|
160
|
+
var translateUpdate = (scrollViewsCount) * -100;
|
|
161
|
+
var firstTabToUpdate = scrollViewsCount * visibleTabs;
|
|
162
|
+
moveView(true, lastChild, firstTabToUpdate, translateUpdate);
|
|
163
|
+
onPointClick(lastChild, ev);
|
|
164
|
+
}
|
|
165
|
+
};
|
|
79
166
|
var setYearsFlags = function () {
|
|
80
167
|
var trackData = (0, utils_1.addYearsFlags)(eventsData);
|
|
81
168
|
setEventsOnTrack(trackData);
|
|
@@ -91,11 +178,7 @@ var TimelineHorizontal = function (props) {
|
|
|
91
178
|
? lastIndexInView - 1
|
|
92
179
|
: lastIndexInView;
|
|
93
180
|
var translateUpdate = translate + 100 > 0 ? 0 : translate + 100;
|
|
94
|
-
|
|
95
|
-
repositionEvents();
|
|
96
|
-
setFirstIndexInView(firstTabToUpdate);
|
|
97
|
-
setTranslate(translateUpdate);
|
|
98
|
-
setCurrentEvent(currentEventToUpdate);
|
|
181
|
+
moveView(false, currentEventToUpdate, firstTabToUpdate, translateUpdate);
|
|
99
182
|
}
|
|
100
183
|
};
|
|
101
184
|
var handleNextClick = function () {
|
|
@@ -106,13 +189,16 @@ var TimelineHorizontal = function (props) {
|
|
|
106
189
|
? firstTabToUpdate + 1
|
|
107
190
|
: firstTabToUpdate;
|
|
108
191
|
var translateUpdate = translate - 100;
|
|
109
|
-
|
|
110
|
-
repositionEvents();
|
|
111
|
-
setFirstIndexInView(firstTabToUpdate);
|
|
112
|
-
setTranslate(translateUpdate);
|
|
113
|
-
setCurrentEvent(currentEventToUpdate);
|
|
192
|
+
moveView(true, currentEventToUpdate, firstTabToUpdate, translateUpdate);
|
|
114
193
|
}
|
|
115
194
|
};
|
|
195
|
+
var moveView = function (direction, eventToUpdate, firstTab, translateToUpdate) {
|
|
196
|
+
updatePage(direction, eventToUpdate);
|
|
197
|
+
repositionEvents();
|
|
198
|
+
setFirstIndexInView(firstTab);
|
|
199
|
+
setTranslate(translateToUpdate);
|
|
200
|
+
setCurrentEvent(eventToUpdate);
|
|
201
|
+
};
|
|
116
202
|
var updatePage = function (forward, current) {
|
|
117
203
|
var _a;
|
|
118
204
|
if (eventsToShow && eventsOnTrack) {
|
|
@@ -184,7 +270,7 @@ var TimelineHorizontal = function (props) {
|
|
|
184
270
|
transform: "translateX(".concat(translation, "%)"), transformOrigin: 'left top'
|
|
185
271
|
}); };
|
|
186
272
|
return (React.createElement(React.Fragment, null,
|
|
187
|
-
React.createElement("div", { className: "k-timeline-track-wrap", ref: trackWrapRef },
|
|
273
|
+
React.createElement("div", { className: "k-timeline-track-wrap", ref: trackWrapRef, onKeyDown: handleKeyDown },
|
|
188
274
|
React.createElement("a", { ref: arrowLeftRef, "aria-hidden": "true", onClick: function () { return arrowLeft && handlePrevClick(); }, className: (0, kendo_react_common_1.classNames)('k-timeline-arrow', 'k-timeline-arrow-left', 'k-button k-button-md k-rounded-md k-button-solid k-button-solid-base k-icon-button', { 'k-disabled': !arrowLeft }) },
|
|
189
275
|
React.createElement(kendo_react_common_1.SvgIcon, { icon: kendo_svg_icons_1.caretAltLeftIcon })),
|
|
190
276
|
React.createElement("a", { "aria-hidden": "true", onClick: function () { return arrowRight && handleNextClick(); }, className: (0, kendo_react_common_1.classNames)('k-timeline-arrow', 'k-timeline-arrow-right', 'k-button k-button-md k-rounded-md k-button-solid k-button-solid-base k-icon-button', { 'k-disabled': !arrowRight }) },
|