@sunsama/event-calendar 0.11.3 → 0.11.5
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/lib/commonjs/components/event-container.js +7 -6
- package/lib/commonjs/components/event-container.js.map +1 -1
- package/lib/commonjs/utils/generate-event-layouts.js +12 -12
- package/lib/commonjs/utils/generate-event-layouts.js.map +1 -1
- package/lib/module/components/event-container.js +8 -7
- package/lib/module/components/event-container.js.map +1 -1
- package/lib/module/utils/generate-event-layouts.js +12 -12
- package/lib/module/utils/generate-event-layouts.js.map +1 -1
- package/lib/typescript/commonjs/components/event-container.d.ts.map +1 -1
- package/lib/typescript/commonjs/utils/generate-event-layouts.d.ts.map +1 -1
- package/lib/typescript/module/components/event-container.d.ts.map +1 -1
- package/lib/typescript/module/utils/generate-event-layouts.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/components/event-container.tsx +9 -11
- package/src/utils/__tests___/generate-event-layout.test.ts +112 -0
- package/src/utils/generate-event-layouts.ts +16 -15
|
@@ -15,23 +15,24 @@ const EventContainer = ({
|
|
|
15
15
|
}) => {
|
|
16
16
|
const {
|
|
17
17
|
onPressEvent,
|
|
18
|
-
renderEvent
|
|
19
|
-
initialZoomLevel
|
|
18
|
+
renderEvent
|
|
20
19
|
} = (0, _react.useContext)(_globals.ConfigProvider);
|
|
21
20
|
const render = (0, _react.useMemo)(() => renderEvent(layout.event, layout.extend ? layout.extend : _types.EventExtend.None), [layout, renderEvent]);
|
|
22
|
-
const stylePosition = (0, _react.useMemo)(() => ({
|
|
23
|
-
height: Math.max(28, 24 * initialZoomLevel)
|
|
24
|
-
}), [initialZoomLevel]);
|
|
25
21
|
const onPress = (0, _react.useCallback)(() => {
|
|
26
22
|
onPressEvent && onPressEvent(layout.event);
|
|
27
23
|
}, [layout.event, onPressEvent]);
|
|
28
24
|
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNativeGestureHandler.Pressable, {
|
|
29
25
|
onPress: onPress,
|
|
30
26
|
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
|
|
31
|
-
style:
|
|
27
|
+
style: styles.position,
|
|
32
28
|
children: render
|
|
33
29
|
})
|
|
34
30
|
});
|
|
35
31
|
};
|
|
36
32
|
var _default = exports.default = EventContainer;
|
|
33
|
+
const styles = _reactNative.StyleSheet.create({
|
|
34
|
+
position: {
|
|
35
|
+
height: 28
|
|
36
|
+
}
|
|
37
|
+
});
|
|
37
38
|
//# sourceMappingURL=event-container.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_globals","require","_react","_reactNativeGestureHandler","_reactNative","_types","_jsxRuntime","EventContainer","layout","onPressEvent","renderEvent","
|
|
1
|
+
{"version":3,"names":["_globals","require","_react","_reactNativeGestureHandler","_reactNative","_types","_jsxRuntime","EventContainer","layout","onPressEvent","renderEvent","useContext","ConfigProvider","render","useMemo","event","extend","EventExtend","None","onPress","useCallback","jsx","Pressable","children","View","style","styles","position","_default","exports","default","StyleSheet","create","height"],"sourceRoot":"../../../src","sources":["components/event-container.tsx"],"mappings":";;;;;;AAAA,IAAAA,QAAA,GAAAC,OAAA;AACA,IAAAC,MAAA,GAAAD,OAAA;AACA,IAAAE,0BAAA,GAAAF,OAAA;AACA,IAAAG,YAAA,GAAAH,OAAA;AACA,IAAAI,MAAA,GAAAJ,OAAA;AAIkB,IAAAK,WAAA,GAAAL,OAAA;AAMlB,MAAMM,cAAc,GAAGA,CAA0B;EAC/CC;AACsB,CAAC,KAAK;EAC5B,MAAM;IAAEC,YAAY;IAAEC;EAAY,CAAC,GAAG,IAAAC,iBAAU,EAACC,uBAAc,CAAC;EAEhE,MAAMC,MAAM,GAAG,IAAAC,cAAO,EACpB,MACEJ,WAAW,CACTF,MAAM,CAACO,KAAK,EACXP,MAAM,CAA8BQ,MAAM,GACtCR,MAAM,CAA8BQ,MAAM,GAC3CC,kBAAW,CAACC,IAClB,CAAC,EACH,CAACV,MAAM,EAAEE,WAAW,CACtB,CAAC;EAED,MAAMS,OAAO,GAAG,IAAAC,kBAAW,EAAC,MAAM;IAChCX,YAAY,IAAIA,YAAY,CAACD,MAAM,CAACO,KAAK,CAAC;EAC5C,CAAC,EAAE,CAACP,MAAM,CAACO,KAAK,EAAEN,YAAY,CAAC,CAAC;EAEhC,oBACE,IAAAH,WAAA,CAAAe,GAAA,EAAClB,0BAAA,CAAAmB,SAAS;IAACH,OAAO,EAAEA,OAAQ;IAAAI,QAAA,eAC1B,IAAAjB,WAAA,CAAAe,GAAA,EAACjB,YAAA,CAAAoB,IAAI;MAACC,KAAK,EAAEC,MAAM,CAACC,QAAS;MAAAJ,QAAA,EAAEV;IAAM,CAAO;EAAC,CACpC,CAAC;AAEhB,CAAC;AAAC,IAAAe,QAAA,GAAAC,OAAA,CAAAC,OAAA,GAEavB,cAAc;AAE7B,MAAMmB,MAAM,GAAGK,uBAAU,CAACC,MAAM,CAAC;EAC/BL,QAAQ,EAAE;IACRM,MAAM,EAAE;EACV;AACF,CAAC,CAAC","ignoreList":[]}
|
|
@@ -127,12 +127,14 @@ const combineEventPosition = (dayDate, timezone, collisionObject) => {
|
|
|
127
127
|
};
|
|
128
128
|
};
|
|
129
129
|
const handleCollisions = (allEvents, userCalendarId, dayDate, timezone) => {
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
130
|
+
// Sort by start asc (primary), then primary calendar flag, then duration asc,
|
|
131
|
+
// then id (stable tiebreaker)
|
|
132
|
+
const sortById = event => event.id;
|
|
133
|
+
const sortByDuration = event => (0, _dateUtils.getDuration)(event);
|
|
134
|
+
const sortByStartDate = event => new Date(event.start).valueOf();
|
|
135
|
+
const sortByPrimaryCalendar = event => event.calendarId && event.calendarId !== userCalendarId;
|
|
136
|
+
const stackableEvents = (0, _sortBy2.default)([...allEvents], [sortByStartDate, sortByPrimaryCalendar, sortByDuration, sortById]);
|
|
137
|
+
|
|
136
138
|
// calculate overlap stack properties
|
|
137
139
|
const stackedEvtsByPos = {};
|
|
138
140
|
let curStack = [];
|
|
@@ -142,14 +144,12 @@ const handleCollisions = (allEvents, userCalendarId, dayDate, timezone) => {
|
|
|
142
144
|
const stackEvt = curStack[idx];
|
|
143
145
|
if (stackEvt) {
|
|
144
146
|
const stackEvtEnd = new Date(stackEvt.event.end).valueOf();
|
|
145
|
-
const stackEvtStart = new Date(stackEvt.event.start).valueOf();
|
|
146
147
|
const eventStart = new Date(evt.start).valueOf();
|
|
147
148
|
|
|
148
|
-
//
|
|
149
|
-
//
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
if (endDate <= eventStart) {
|
|
149
|
+
// Use half-open interval semantics [start, end):
|
|
150
|
+
// an active event is removed when its end is less than or equal to the next start.
|
|
151
|
+
// Do not pad short events when determining overlap/collision.
|
|
152
|
+
if (stackEvtEnd <= eventStart) {
|
|
153
153
|
// null out this event's position in stack
|
|
154
154
|
curStack[idx] = null;
|
|
155
155
|
if (curStack.length > 1) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_partition2","_interopRequireDefault","require","_reduce2","_sortBy2","_reverse2","_momentTimezone","_calendarLayout","_dateUtils","_computePositioning","_types","e","__esModule","default","generateEventLayouts","events","startCalendarDate","endCalendarDate","userCalendarId","calendarViewInterval","startDayOfWeekOffset","timezone","allDayEvents","partDayEvents","_partition","event","isAllDayOrSpansMidnight","allDayEventsSorted","_sortBy","id","getDurationInDays","_reverse","Date","start","valueOf","partDayEventsSorted","getDuration","calendarViewDayEvents","visibleDayCount","moment","tz","diff","visibleDays","dayCount","push","add","format","calendarViewDateRanges","map","visibleDay","computeCalendarDateRange","result","forEach","date","calendarLayoutOptions","visibleX","dayIndexes","enableWeekBreaks","startOfWeekXOffset","basisDate","startOfUserWeek","calendarViewDayLayout","_reduce","calendarLayout","eventStartIndex","startOf","eventDurationDays","findFitAndInsert","CalendarLayout","calendarViewDayRowHeight","height","calendarDates","calendarDate","currentDayDate","startDate","toDate","endDate","endOf","showHours","includes","dayId","allDayEventsLayout","partDayEventsLayout","x","y","visibleWidthDays","extend","EventExtend","None","isPrimaryRendered","getViewAt","rowIndex","concat","handleCollisions","filter","dateRangeIntersect","end","exports","combineEventPosition","dayDate","collisionObject","position","computePositioning","startOfDayMoment","allEvents","
|
|
1
|
+
{"version":3,"names":["_partition2","_interopRequireDefault","require","_reduce2","_sortBy2","_reverse2","_momentTimezone","_calendarLayout","_dateUtils","_computePositioning","_types","e","__esModule","default","generateEventLayouts","events","startCalendarDate","endCalendarDate","userCalendarId","calendarViewInterval","startDayOfWeekOffset","timezone","allDayEvents","partDayEvents","_partition","event","isAllDayOrSpansMidnight","allDayEventsSorted","_sortBy","id","getDurationInDays","_reverse","Date","start","valueOf","partDayEventsSorted","getDuration","calendarViewDayEvents","visibleDayCount","moment","tz","diff","visibleDays","dayCount","push","add","format","calendarViewDateRanges","map","visibleDay","computeCalendarDateRange","result","forEach","date","calendarLayoutOptions","visibleX","dayIndexes","enableWeekBreaks","startOfWeekXOffset","basisDate","startOfUserWeek","calendarViewDayLayout","_reduce","calendarLayout","eventStartIndex","startOf","eventDurationDays","findFitAndInsert","CalendarLayout","calendarViewDayRowHeight","height","calendarDates","calendarDate","currentDayDate","startDate","toDate","endDate","endOf","showHours","includes","dayId","allDayEventsLayout","partDayEventsLayout","x","y","visibleWidthDays","extend","EventExtend","None","isPrimaryRendered","getViewAt","rowIndex","concat","handleCollisions","filter","dateRangeIntersect","end","exports","combineEventPosition","dayDate","collisionObject","position","computePositioning","startOfDayMoment","allEvents","sortById","sortByDuration","sortByStartDate","sortByPrimaryCalendar","calendarId","stackableEvents","stackedEvtsByPos","curStack","evt","idx","length","stackEvt","stackEvtEnd","eventStart","collisions","total","order","some","el","spliceIdx","findIndex","splice","stackedEvents","Object","keys","pos","_default"],"sourceRoot":"../../../src","sources":["utils/generate-event-layouts.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
import { ConfigProvider } from "../utils/globals.js";
|
|
4
4
|
import { useCallback, useContext, useMemo } from "react";
|
|
5
5
|
import { Pressable } from "react-native-gesture-handler";
|
|
6
|
-
import { View } from "react-native";
|
|
6
|
+
import { StyleSheet, View } from "react-native";
|
|
7
7
|
import { EventExtend } from "../types.js";
|
|
8
8
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
9
9
|
const EventContainer = ({
|
|
@@ -11,23 +11,24 @@ const EventContainer = ({
|
|
|
11
11
|
}) => {
|
|
12
12
|
const {
|
|
13
13
|
onPressEvent,
|
|
14
|
-
renderEvent
|
|
15
|
-
initialZoomLevel
|
|
14
|
+
renderEvent
|
|
16
15
|
} = useContext(ConfigProvider);
|
|
17
16
|
const render = useMemo(() => renderEvent(layout.event, layout.extend ? layout.extend : EventExtend.None), [layout, renderEvent]);
|
|
18
|
-
const stylePosition = useMemo(() => ({
|
|
19
|
-
height: Math.max(28, 24 * initialZoomLevel)
|
|
20
|
-
}), [initialZoomLevel]);
|
|
21
17
|
const onPress = useCallback(() => {
|
|
22
18
|
onPressEvent && onPressEvent(layout.event);
|
|
23
19
|
}, [layout.event, onPressEvent]);
|
|
24
20
|
return /*#__PURE__*/_jsx(Pressable, {
|
|
25
21
|
onPress: onPress,
|
|
26
22
|
children: /*#__PURE__*/_jsx(View, {
|
|
27
|
-
style:
|
|
23
|
+
style: styles.position,
|
|
28
24
|
children: render
|
|
29
25
|
})
|
|
30
26
|
});
|
|
31
27
|
};
|
|
32
28
|
export default EventContainer;
|
|
29
|
+
const styles = StyleSheet.create({
|
|
30
|
+
position: {
|
|
31
|
+
height: 28
|
|
32
|
+
}
|
|
33
|
+
});
|
|
33
34
|
//# sourceMappingURL=event-container.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["ConfigProvider","useCallback","useContext","useMemo","Pressable","View","EventExtend","jsx","_jsx","EventContainer","layout","onPressEvent","renderEvent","
|
|
1
|
+
{"version":3,"names":["ConfigProvider","useCallback","useContext","useMemo","Pressable","StyleSheet","View","EventExtend","jsx","_jsx","EventContainer","layout","onPressEvent","renderEvent","render","event","extend","None","onPress","children","style","styles","position","create","height"],"sourceRoot":"../../../src","sources":["components/event-container.tsx"],"mappings":";;AAAA,SAASA,cAAc,QAAQ,qBAAkB;AACjD,SAASC,WAAW,EAAEC,UAAU,EAAEC,OAAO,QAAQ,OAAO;AACxD,SAASC,SAAS,QAAQ,8BAA8B;AACxD,SAASC,UAAU,EAAEC,IAAI,QAAQ,cAAc;AAC/C,SAGEC,WAAW,QACN,aAAU;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAMlB,MAAMC,cAAc,GAAGA,CAA0B;EAC/CC;AACsB,CAAC,KAAK;EAC5B,MAAM;IAAEC,YAAY;IAAEC;EAAY,CAAC,GAAGX,UAAU,CAACF,cAAc,CAAC;EAEhE,MAAMc,MAAM,GAAGX,OAAO,CACpB,MACEU,WAAW,CACTF,MAAM,CAACI,KAAK,EACXJ,MAAM,CAA8BK,MAAM,GACtCL,MAAM,CAA8BK,MAAM,GAC3CT,WAAW,CAACU,IAClB,CAAC,EACH,CAACN,MAAM,EAAEE,WAAW,CACtB,CAAC;EAED,MAAMK,OAAO,GAAGjB,WAAW,CAAC,MAAM;IAChCW,YAAY,IAAIA,YAAY,CAACD,MAAM,CAACI,KAAK,CAAC;EAC5C,CAAC,EAAE,CAACJ,MAAM,CAACI,KAAK,EAAEH,YAAY,CAAC,CAAC;EAEhC,oBACEH,IAAA,CAACL,SAAS;IAACc,OAAO,EAAEA,OAAQ;IAAAC,QAAA,eAC1BV,IAAA,CAACH,IAAI;MAACc,KAAK,EAAEC,MAAM,CAACC,QAAS;MAAAH,QAAA,EAAEL;IAAM,CAAO;EAAC,CACpC,CAAC;AAEhB,CAAC;AAED,eAAeJ,cAAc;AAE7B,MAAMW,MAAM,GAAGhB,UAAU,CAACkB,MAAM,CAAC;EAC/BD,QAAQ,EAAE;IACRE,MAAM,EAAE;EACV;AACF,CAAC,CAAC","ignoreList":[]}
|
|
@@ -121,12 +121,14 @@ const combineEventPosition = (dayDate, timezone, collisionObject) => {
|
|
|
121
121
|
};
|
|
122
122
|
};
|
|
123
123
|
const handleCollisions = (allEvents, userCalendarId, dayDate, timezone) => {
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
124
|
+
// Sort by start asc (primary), then primary calendar flag, then duration asc,
|
|
125
|
+
// then id (stable tiebreaker)
|
|
126
|
+
const sortById = event => event.id;
|
|
127
|
+
const sortByDuration = event => getDuration(event);
|
|
128
|
+
const sortByStartDate = event => new Date(event.start).valueOf();
|
|
129
|
+
const sortByPrimaryCalendar = event => event.calendarId && event.calendarId !== userCalendarId;
|
|
130
|
+
const stackableEvents = _sortBy([...allEvents], [sortByStartDate, sortByPrimaryCalendar, sortByDuration, sortById]);
|
|
131
|
+
|
|
130
132
|
// calculate overlap stack properties
|
|
131
133
|
const stackedEvtsByPos = {};
|
|
132
134
|
let curStack = [];
|
|
@@ -136,14 +138,12 @@ const handleCollisions = (allEvents, userCalendarId, dayDate, timezone) => {
|
|
|
136
138
|
const stackEvt = curStack[idx];
|
|
137
139
|
if (stackEvt) {
|
|
138
140
|
const stackEvtEnd = new Date(stackEvt.event.end).valueOf();
|
|
139
|
-
const stackEvtStart = new Date(stackEvt.event.start).valueOf();
|
|
140
141
|
const eventStart = new Date(evt.start).valueOf();
|
|
141
142
|
|
|
142
|
-
//
|
|
143
|
-
//
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
if (endDate <= eventStart) {
|
|
143
|
+
// Use half-open interval semantics [start, end):
|
|
144
|
+
// an active event is removed when its end is less than or equal to the next start.
|
|
145
|
+
// Do not pad short events when determining overlap/collision.
|
|
146
|
+
if (stackEvtEnd <= eventStart) {
|
|
147
147
|
// null out this event's position in stack
|
|
148
148
|
curStack[idx] = null;
|
|
149
149
|
if (curStack.length > 1) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_partition","_reduce","_sortBy","_reverse","moment","CalendarLayout","computeCalendarDateRange","dateRangeIntersect","getDuration","getDurationInDays","isAllDayOrSpansMidnight","startOfUserWeek","computePositioning","EventExtend","generateEventLayouts","events","startCalendarDate","endCalendarDate","userCalendarId","calendarViewInterval","startDayOfWeekOffset","timezone","allDayEvents","partDayEvents","event","allDayEventsSorted","id","Date","start","valueOf","partDayEventsSorted","calendarViewDayEvents","visibleDayCount","tz","diff","visibleDays","dayCount","push","add","format","calendarViewDateRanges","map","visibleDay","result","forEach","date","calendarLayoutOptions","visibleX","dayIndexes","enableWeekBreaks","startOfWeekXOffset","basisDate","calendarViewDayLayout","calendarLayout","eventStartIndex","startOf","eventDurationDays","findFitAndInsert","calendarViewDayRowHeight","height","calendarDates","calendarDate","currentDayDate","startDate","toDate","endDate","endOf","showHours","includes","dayId","allDayEventsLayout","partDayEventsLayout","x","y","visibleWidthDays","extend","None","isPrimaryRendered","getViewAt","rowIndex","concat","handleCollisions","filter","end","combineEventPosition","dayDate","collisionObject","position","startOfDayMoment","allEvents","
|
|
1
|
+
{"version":3,"names":["_partition","_reduce","_sortBy","_reverse","moment","CalendarLayout","computeCalendarDateRange","dateRangeIntersect","getDuration","getDurationInDays","isAllDayOrSpansMidnight","startOfUserWeek","computePositioning","EventExtend","generateEventLayouts","events","startCalendarDate","endCalendarDate","userCalendarId","calendarViewInterval","startDayOfWeekOffset","timezone","allDayEvents","partDayEvents","event","allDayEventsSorted","id","Date","start","valueOf","partDayEventsSorted","calendarViewDayEvents","visibleDayCount","tz","diff","visibleDays","dayCount","push","add","format","calendarViewDateRanges","map","visibleDay","result","forEach","date","calendarLayoutOptions","visibleX","dayIndexes","enableWeekBreaks","startOfWeekXOffset","basisDate","calendarViewDayLayout","calendarLayout","eventStartIndex","startOf","eventDurationDays","findFitAndInsert","calendarViewDayRowHeight","height","calendarDates","calendarDate","currentDayDate","startDate","toDate","endDate","endOf","showHours","includes","dayId","allDayEventsLayout","partDayEventsLayout","x","y","visibleWidthDays","extend","None","isPrimaryRendered","getViewAt","rowIndex","concat","handleCollisions","filter","end","combineEventPosition","dayDate","collisionObject","position","startOfDayMoment","allEvents","sortById","sortByDuration","sortByStartDate","sortByPrimaryCalendar","calendarId","stackableEvents","stackedEvtsByPos","curStack","evt","idx","length","stackEvt","stackEvtEnd","eventStart","collisions","total","order","some","el","spliceIdx","findIndex","splice","stackedEvents","Object","keys","pos"],"sourceRoot":"../../../src","sources":["utils/generate-event-layouts.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-container.d.ts","sourceRoot":"","sources":["../../../../src/components/event-container.tsx"],"names":[],"mappings":"AAIA,OAAO,EACL,qBAAqB,EACrB,KAAK,aAAa,EAEnB,MAAM,UAAU,CAAC;AAElB,KAAK,mBAAmB,CAAC,CAAC,SAAS,aAAa,IAAI;IAClD,MAAM,EAAE,qBAAqB,CAAC,CAAC,CAAC,CAAC;CAClC,CAAC;AAEF,QAAA,MAAM,cAAc,GAAI,CAAC,SAAS,aAAa,eAE5C,mBAAmB,CAAC,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"event-container.d.ts","sourceRoot":"","sources":["../../../../src/components/event-container.tsx"],"names":[],"mappings":"AAIA,OAAO,EACL,qBAAqB,EACrB,KAAK,aAAa,EAEnB,MAAM,UAAU,CAAC;AAElB,KAAK,mBAAmB,CAAC,CAAC,SAAS,aAAa,IAAI;IAClD,MAAM,EAAE,qBAAqB,CAAC,CAAC,CAAC,CAAC;CAClC,CAAC;AAEF,QAAA,MAAM,cAAc,GAAI,CAAC,SAAS,aAAa,eAE5C,mBAAmB,CAAC,CAAC,CAAC,gCAuBxB,CAAC;AAEF,eAAe,cAAc,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate-event-layouts.d.ts","sourceRoot":"","sources":["../../../../src/utils/generate-event-layouts.ts"],"names":[],"mappings":"AAeA,OAAO,EAEL,aAAa,EACb,wBAAwB,EAGxB,uBAAuB,EAExB,MAAM,UAAU,CAAC;AAElB,UAAU,oBAAoB,CAAC,CAAC,SAAS,aAAa;IACpD,MAAM,EAAE,CAAC,EAAE,CAAC;IACZ,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,oBAAoB,CAAC,EAAE,wBAAwB,CAAC;CACjD;AAED,eAAO,MAAM,oBAAoB,GAAI,CAAC,SAAS,aAAa,yHAQzD,oBAAoB,CAAC,CAAC,CAAC;;CA8JzB,CAAC;
|
|
1
|
+
{"version":3,"file":"generate-event-layouts.d.ts","sourceRoot":"","sources":["../../../../src/utils/generate-event-layouts.ts"],"names":[],"mappings":"AAeA,OAAO,EAEL,aAAa,EACb,wBAAwB,EAGxB,uBAAuB,EAExB,MAAM,UAAU,CAAC;AAElB,UAAU,oBAAoB,CAAC,CAAC,SAAS,aAAa;IACpD,MAAM,EAAE,CAAC,EAAE,CAAC;IACZ,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,oBAAoB,CAAC,EAAE,wBAAwB,CAAC;CACjD;AAED,eAAO,MAAM,oBAAoB,GAAI,CAAC,SAAS,aAAa,yHAQzD,oBAAoB,CAAC,CAAC,CAAC;;CA8JzB,CAAC;AAiHF,eAAe,oBAAoB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-container.d.ts","sourceRoot":"","sources":["../../../../src/components/event-container.tsx"],"names":[],"mappings":"AAIA,OAAO,EACL,qBAAqB,EACrB,KAAK,aAAa,EAEnB,MAAM,UAAU,CAAC;AAElB,KAAK,mBAAmB,CAAC,CAAC,SAAS,aAAa,IAAI;IAClD,MAAM,EAAE,qBAAqB,CAAC,CAAC,CAAC,CAAC;CAClC,CAAC;AAEF,QAAA,MAAM,cAAc,GAAI,CAAC,SAAS,aAAa,eAE5C,mBAAmB,CAAC,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"event-container.d.ts","sourceRoot":"","sources":["../../../../src/components/event-container.tsx"],"names":[],"mappings":"AAIA,OAAO,EACL,qBAAqB,EACrB,KAAK,aAAa,EAEnB,MAAM,UAAU,CAAC;AAElB,KAAK,mBAAmB,CAAC,CAAC,SAAS,aAAa,IAAI;IAClD,MAAM,EAAE,qBAAqB,CAAC,CAAC,CAAC,CAAC;CAClC,CAAC;AAEF,QAAA,MAAM,cAAc,GAAI,CAAC,SAAS,aAAa,eAE5C,mBAAmB,CAAC,CAAC,CAAC,gCAuBxB,CAAC;AAEF,eAAe,cAAc,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate-event-layouts.d.ts","sourceRoot":"","sources":["../../../../src/utils/generate-event-layouts.ts"],"names":[],"mappings":"AAeA,OAAO,EAEL,aAAa,EACb,wBAAwB,EAGxB,uBAAuB,EAExB,MAAM,UAAU,CAAC;AAElB,UAAU,oBAAoB,CAAC,CAAC,SAAS,aAAa;IACpD,MAAM,EAAE,CAAC,EAAE,CAAC;IACZ,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,oBAAoB,CAAC,EAAE,wBAAwB,CAAC;CACjD;AAED,eAAO,MAAM,oBAAoB,GAAI,CAAC,SAAS,aAAa,yHAQzD,oBAAoB,CAAC,CAAC,CAAC;;CA8JzB,CAAC;
|
|
1
|
+
{"version":3,"file":"generate-event-layouts.d.ts","sourceRoot":"","sources":["../../../../src/utils/generate-event-layouts.ts"],"names":[],"mappings":"AAeA,OAAO,EAEL,aAAa,EACb,wBAAwB,EAGxB,uBAAuB,EAExB,MAAM,UAAU,CAAC;AAElB,UAAU,oBAAoB,CAAC,CAAC,SAAS,aAAa;IACpD,MAAM,EAAE,CAAC,EAAE,CAAC;IACZ,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,oBAAoB,CAAC,EAAE,wBAAwB,CAAC;CACjD;AAED,eAAO,MAAM,oBAAoB,GAAI,CAAC,SAAS,aAAa,yHAQzD,oBAAoB,CAAC,CAAC,CAAC;;CA8JzB,CAAC;AAiHF,eAAe,oBAAoB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { ConfigProvider } from "../utils/globals";
|
|
2
2
|
import { useCallback, useContext, useMemo } from "react";
|
|
3
3
|
import { Pressable } from "react-native-gesture-handler";
|
|
4
|
-
import { View } from "react-native";
|
|
4
|
+
import { StyleSheet, View } from "react-native";
|
|
5
5
|
import {
|
|
6
6
|
AllDayEventLayoutType,
|
|
7
7
|
type CalendarEvent,
|
|
@@ -15,8 +15,7 @@ type EventContainerProps<T extends CalendarEvent> = {
|
|
|
15
15
|
const EventContainer = <T extends CalendarEvent>({
|
|
16
16
|
layout,
|
|
17
17
|
}: EventContainerProps<T>) => {
|
|
18
|
-
const { onPressEvent, renderEvent
|
|
19
|
-
useContext(ConfigProvider);
|
|
18
|
+
const { onPressEvent, renderEvent } = useContext(ConfigProvider);
|
|
20
19
|
|
|
21
20
|
const render = useMemo(
|
|
22
21
|
() =>
|
|
@@ -29,22 +28,21 @@ const EventContainer = <T extends CalendarEvent>({
|
|
|
29
28
|
[layout, renderEvent]
|
|
30
29
|
);
|
|
31
30
|
|
|
32
|
-
const stylePosition = useMemo(
|
|
33
|
-
() => ({
|
|
34
|
-
height: Math.max(28, 24 * initialZoomLevel),
|
|
35
|
-
}),
|
|
36
|
-
[initialZoomLevel]
|
|
37
|
-
);
|
|
38
|
-
|
|
39
31
|
const onPress = useCallback(() => {
|
|
40
32
|
onPressEvent && onPressEvent(layout.event);
|
|
41
33
|
}, [layout.event, onPressEvent]);
|
|
42
34
|
|
|
43
35
|
return (
|
|
44
36
|
<Pressable onPress={onPress}>
|
|
45
|
-
<View style={
|
|
37
|
+
<View style={styles.position}>{render}</View>
|
|
46
38
|
</Pressable>
|
|
47
39
|
);
|
|
48
40
|
};
|
|
49
41
|
|
|
50
42
|
export default EventContainer;
|
|
43
|
+
|
|
44
|
+
const styles = StyleSheet.create({
|
|
45
|
+
position: {
|
|
46
|
+
height: 28,
|
|
47
|
+
},
|
|
48
|
+
});
|
|
@@ -107,6 +107,118 @@ describe("generateEventLayouts", () => {
|
|
|
107
107
|
expect(partDayEventsLayout[1].collisions).toBe(undefined);
|
|
108
108
|
});
|
|
109
109
|
|
|
110
|
+
it("should treat touching events as non-overlapping: [09:00,10:00) and [10:00,11:00)", () => {
|
|
111
|
+
const events: CalendarEvent[] = [
|
|
112
|
+
{
|
|
113
|
+
id: "1",
|
|
114
|
+
calendarId: "primary-calendar",
|
|
115
|
+
title: "Event A",
|
|
116
|
+
start: "2023-10-10T09:00:00Z",
|
|
117
|
+
end: "2023-10-10T10:00:00Z",
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
id: "2",
|
|
121
|
+
calendarId: "primary-calendar",
|
|
122
|
+
title: "Event B",
|
|
123
|
+
start: "2023-10-10T10:00:00Z",
|
|
124
|
+
end: "2023-10-10T11:00:00Z",
|
|
125
|
+
},
|
|
126
|
+
];
|
|
127
|
+
|
|
128
|
+
const layouts = generateEventLayouts({
|
|
129
|
+
startCalendarDate: "2023-10-10",
|
|
130
|
+
endCalendarDate: "2023-10-10",
|
|
131
|
+
events,
|
|
132
|
+
timezone: "UTC",
|
|
133
|
+
userCalendarId: "primary-calendar",
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
const dayLayout = layouts["2023-10-10"];
|
|
137
|
+
expect(dayLayout).toBeDefined();
|
|
138
|
+
const { partDayEventsLayout } = dayLayout;
|
|
139
|
+
expect(partDayEventsLayout.length).toBe(2);
|
|
140
|
+
// Touching at boundary should not collide
|
|
141
|
+
expect(partDayEventsLayout[0].collisions).toBeUndefined();
|
|
142
|
+
expect(partDayEventsLayout[1].collisions).toBeUndefined();
|
|
143
|
+
// Both should have full width
|
|
144
|
+
expect(partDayEventsLayout[0].position.width).toBe("100%");
|
|
145
|
+
expect(partDayEventsLayout[1].position.width).toBe("100%");
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
it("should treat touching events as non-overlapping: reversed order [10:00,11:00) then [09:00,10:00)", () => {
|
|
149
|
+
const events: CalendarEvent[] = [
|
|
150
|
+
{
|
|
151
|
+
id: "1",
|
|
152
|
+
calendarId: "primary-calendar",
|
|
153
|
+
title: "Event A",
|
|
154
|
+
start: "2023-10-10T10:00:00Z",
|
|
155
|
+
end: "2023-10-10T11:00:00Z",
|
|
156
|
+
},
|
|
157
|
+
{
|
|
158
|
+
id: "0",
|
|
159
|
+
calendarId: "primary-calendar",
|
|
160
|
+
title: "Event B",
|
|
161
|
+
start: "2023-10-10T09:00:00Z",
|
|
162
|
+
end: "2023-10-10T10:00:00Z",
|
|
163
|
+
},
|
|
164
|
+
];
|
|
165
|
+
|
|
166
|
+
const layouts = generateEventLayouts({
|
|
167
|
+
startCalendarDate: "2023-10-10",
|
|
168
|
+
endCalendarDate: "2023-10-10",
|
|
169
|
+
events,
|
|
170
|
+
timezone: "UTC",
|
|
171
|
+
userCalendarId: "primary-calendar",
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
const dayLayout = layouts["2023-10-10"];
|
|
175
|
+
expect(dayLayout).toBeDefined();
|
|
176
|
+
const { partDayEventsLayout } = dayLayout;
|
|
177
|
+
expect(partDayEventsLayout.length).toBe(2);
|
|
178
|
+
expect(partDayEventsLayout[0].collisions).toBeUndefined();
|
|
179
|
+
expect(partDayEventsLayout[1].collisions).toBeUndefined();
|
|
180
|
+
expect(partDayEventsLayout[0].position.width).toBe("100%");
|
|
181
|
+
expect(partDayEventsLayout[1].position.width).toBe("100%");
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
it("should not collide zero-duration event with an event starting at the same time", () => {
|
|
185
|
+
const events: CalendarEvent[] = [
|
|
186
|
+
{
|
|
187
|
+
id: "1",
|
|
188
|
+
calendarId: "primary-calendar",
|
|
189
|
+
title: "Instant",
|
|
190
|
+
start: "2023-10-10T10:00:00Z",
|
|
191
|
+
end: "2023-10-10T10:00:00Z",
|
|
192
|
+
},
|
|
193
|
+
{
|
|
194
|
+
id: "2",
|
|
195
|
+
calendarId: "primary-calendar",
|
|
196
|
+
title: "One hour",
|
|
197
|
+
start: "2023-10-10T10:00:00Z",
|
|
198
|
+
end: "2023-10-10T11:00:00Z",
|
|
199
|
+
},
|
|
200
|
+
];
|
|
201
|
+
|
|
202
|
+
const layouts = generateEventLayouts({
|
|
203
|
+
startCalendarDate: "2023-10-10",
|
|
204
|
+
endCalendarDate: "2023-10-10",
|
|
205
|
+
events,
|
|
206
|
+
timezone: "UTC",
|
|
207
|
+
userCalendarId: "primary-calendar",
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
const dayLayout = layouts["2023-10-10"];
|
|
211
|
+
expect(dayLayout).toBeDefined();
|
|
212
|
+
const { partDayEventsLayout } = dayLayout;
|
|
213
|
+
expect(partDayEventsLayout.length).toBe(2);
|
|
214
|
+
// Neither should have collisions
|
|
215
|
+
expect(partDayEventsLayout[0].collisions).toBeUndefined();
|
|
216
|
+
expect(partDayEventsLayout[1].collisions).toBeUndefined();
|
|
217
|
+
// Both should be full width
|
|
218
|
+
expect(partDayEventsLayout[0].position.width).toBe("100%");
|
|
219
|
+
expect(partDayEventsLayout[1].position.width).toBe("100%");
|
|
220
|
+
});
|
|
221
|
+
|
|
110
222
|
it("should handle an empty event list", () => {
|
|
111
223
|
const events: CalendarEvent[] = [];
|
|
112
224
|
|
|
@@ -224,14 +224,19 @@ const handleCollisions = <T extends CalendarEvent>(
|
|
|
224
224
|
dayDate: Moment,
|
|
225
225
|
timezone: string
|
|
226
226
|
): PartDayEventLayoutType<T>[] => {
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
227
|
+
// Sort by start asc (primary), then primary calendar flag, then duration asc,
|
|
228
|
+
// then id (stable tiebreaker)
|
|
229
|
+
const sortById = (event: T) => event.id;
|
|
230
|
+
const sortByDuration = (event: T) => getDuration(event);
|
|
231
|
+
const sortByStartDate = (event: T) => new Date(event.start).valueOf();
|
|
232
|
+
const sortByPrimaryCalendar = (event: T) =>
|
|
233
|
+
event.calendarId && event.calendarId !== userCalendarId;
|
|
234
|
+
|
|
235
|
+
const stackableEvents = _sortBy(
|
|
236
|
+
[...allEvents],
|
|
237
|
+
[sortByStartDate, sortByPrimaryCalendar, sortByDuration, sortById]
|
|
234
238
|
);
|
|
239
|
+
|
|
235
240
|
// calculate overlap stack properties
|
|
236
241
|
const stackedEvtsByPos: Record<string, PartDayEventLayoutType<T>[]> = {};
|
|
237
242
|
let curStack: (CollisionObject<T> | null)[] = [];
|
|
@@ -243,16 +248,12 @@ const handleCollisions = <T extends CalendarEvent>(
|
|
|
243
248
|
|
|
244
249
|
if (stackEvt) {
|
|
245
250
|
const stackEvtEnd = new Date(stackEvt.event.end).valueOf();
|
|
246
|
-
const stackEvtStart = new Date(stackEvt.event.start).valueOf();
|
|
247
251
|
const eventStart = new Date(evt.start).valueOf();
|
|
248
252
|
|
|
249
|
-
//
|
|
250
|
-
//
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
duration < 15 ? stackEvtStart + 15 * 60 * 1000 : stackEvtEnd;
|
|
254
|
-
|
|
255
|
-
if (endDate <= eventStart) {
|
|
253
|
+
// Use half-open interval semantics [start, end):
|
|
254
|
+
// an active event is removed when its end is less than or equal to the next start.
|
|
255
|
+
// Do not pad short events when determining overlap/collision.
|
|
256
|
+
if (stackEvtEnd <= eventStart) {
|
|
256
257
|
// null out this event's position in stack
|
|
257
258
|
curStack[idx] = null;
|
|
258
259
|
|