@sunsama/event-calendar 0.13.2 → 0.13.4
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/all-day-events.js +1 -1
- package/lib/commonjs/components/all-day-events.js.map +1 -1
- package/lib/commonjs/components/edit-event-container.js +9 -1
- package/lib/commonjs/components/edit-event-container.js.map +1 -1
- package/lib/commonjs/components/event-container.js +2 -1
- package/lib/commonjs/components/event-container.js.map +1 -1
- package/lib/commonjs/components/timed-event-container.js +1 -1
- package/lib/commonjs/components/timed-event-container.js.map +1 -1
- package/lib/commonjs/hooks/use-auto-scroll.js +11 -1
- package/lib/commonjs/hooks/use-auto-scroll.js.map +1 -1
- package/lib/commonjs/hooks/use-events.js +7 -6
- package/lib/commonjs/hooks/use-events.js.map +1 -1
- package/lib/commonjs/index.js +33 -32
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/utils/calendar-layout.js +15 -2
- package/lib/commonjs/utils/calendar-layout.js.map +1 -1
- package/lib/commonjs/utils/compute-positioning.js +1 -1
- package/lib/commonjs/utils/compute-positioning.js.map +1 -1
- package/lib/commonjs/utils/date-utils.js +40 -11
- package/lib/commonjs/utils/date-utils.js.map +1 -1
- package/lib/commonjs/utils/generate-event-layouts.js +9 -6
- package/lib/commonjs/utils/generate-event-layouts.js.map +1 -1
- package/lib/module/components/all-day-events.js +2 -2
- package/lib/module/components/all-day-events.js.map +1 -1
- package/lib/module/components/edit-event-container.js +9 -1
- package/lib/module/components/edit-event-container.js.map +1 -1
- package/lib/module/components/event-container.js +3 -2
- package/lib/module/components/event-container.js.map +1 -1
- package/lib/module/components/timed-event-container.js +1 -1
- package/lib/module/components/timed-event-container.js.map +1 -1
- package/lib/module/hooks/use-auto-scroll.js +11 -1
- package/lib/module/hooks/use-auto-scroll.js.map +1 -1
- package/lib/module/hooks/use-events.js +8 -7
- package/lib/module/hooks/use-events.js.map +1 -1
- package/lib/module/index.js +33 -32
- package/lib/module/index.js.map +1 -1
- package/lib/module/utils/calendar-layout.js +15 -2
- package/lib/module/utils/calendar-layout.js.map +1 -1
- package/lib/module/utils/compute-positioning.js +1 -1
- package/lib/module/utils/compute-positioning.js.map +1 -1
- package/lib/module/utils/date-utils.js +40 -11
- package/lib/module/utils/date-utils.js.map +1 -1
- package/lib/module/utils/generate-event-layouts.js +9 -6
- package/lib/module/utils/generate-event-layouts.js.map +1 -1
- package/lib/typescript/commonjs/components/all-day-events.d.ts.map +1 -1
- package/lib/typescript/commonjs/components/edit-event-container.d.ts.map +1 -1
- package/lib/typescript/commonjs/components/event-container.d.ts +2 -1
- package/lib/typescript/commonjs/components/event-container.d.ts.map +1 -1
- package/lib/typescript/commonjs/components/timed-event-container.d.ts.map +1 -1
- package/lib/typescript/commonjs/hooks/use-auto-scroll.d.ts.map +1 -1
- package/lib/typescript/commonjs/hooks/use-events.d.ts.map +1 -1
- package/lib/typescript/commonjs/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/utils/calendar-layout.d.ts +3 -1
- package/lib/typescript/commonjs/utils/calendar-layout.d.ts.map +1 -1
- package/lib/typescript/commonjs/utils/compute-positioning.d.ts.map +1 -1
- package/lib/typescript/commonjs/utils/date-utils.d.ts.map +1 -1
- package/lib/typescript/commonjs/utils/generate-event-layouts.d.ts.map +1 -1
- package/lib/typescript/module/components/all-day-events.d.ts.map +1 -1
- package/lib/typescript/module/components/edit-event-container.d.ts.map +1 -1
- package/lib/typescript/module/components/event-container.d.ts +2 -1
- package/lib/typescript/module/components/event-container.d.ts.map +1 -1
- package/lib/typescript/module/components/timed-event-container.d.ts.map +1 -1
- package/lib/typescript/module/hooks/use-auto-scroll.d.ts.map +1 -1
- package/lib/typescript/module/hooks/use-events.d.ts.map +1 -1
- package/lib/typescript/module/index.d.ts.map +1 -1
- package/lib/typescript/module/utils/calendar-layout.d.ts +3 -1
- package/lib/typescript/module/utils/calendar-layout.d.ts.map +1 -1
- package/lib/typescript/module/utils/compute-positioning.d.ts.map +1 -1
- package/lib/typescript/module/utils/date-utils.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/all-day-events.tsx +8 -4
- package/src/components/edit-event-container.tsx +11 -1
- package/src/components/event-container.tsx +14 -5
- package/src/components/timed-event-container.tsx +3 -0
- package/src/hooks/use-auto-scroll.ts +11 -1
- package/src/hooks/use-events.tsx +12 -8
- package/src/index.tsx +68 -34
- package/src/utils/calendar-layout.ts +15 -4
- package/src/utils/compute-positioning.ts +4 -3
- package/src/utils/date-utils.ts +52 -26
- package/src/utils/generate-event-layouts.ts +12 -19
|
@@ -2,6 +2,7 @@ import { AllDayEventLayoutType, type CalendarEvent } from "../types";
|
|
|
2
2
|
type EventContainerProps<T extends CalendarEvent> = {
|
|
3
3
|
layout: AllDayEventLayoutType<T>;
|
|
4
4
|
};
|
|
5
|
-
declare const
|
|
5
|
+
declare const EventContainerInner: <T extends CalendarEvent>({ layout, }: EventContainerProps<T>) => import("react").JSX.Element;
|
|
6
|
+
declare const EventContainer: typeof EventContainerInner;
|
|
6
7
|
export default EventContainer;
|
|
7
8
|
//# sourceMappingURL=event-container.d.ts.map
|
|
@@ -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,
|
|
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,mBAAmB,GAAI,CAAC,SAAS,aAAa,eAEjD,mBAAmB,CAAC,CAAC,CAAC,gCAqBxB,CAAC;AAEF,QAAA,MAAM,cAAc,EASf,OAAO,mBAAmB,CAAC;AAEhC,eAAe,cAAc,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timed-event-container.d.ts","sourceRoot":"","sources":["../../../../src/components/timed-event-container.tsx"],"names":[],"mappings":"AAOA,OAAO,EAEL,SAAS,EAMV,MAAM,OAAO,CAAC;AAMf,OAAO,EACL,KAAK,aAAa,EAElB,sBAAsB,EACvB,MAAM,UAAU,CAAC;AAElB,KAAK,wBAAwB,CAAC,CAAC,SAAS,aAAa,IAAI;IACvD,MAAM,EAAE,sBAAsB,CAAC,CAAC,CAAC,CAAC;IAClC,WAAW,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC;CAC7B,CAAC;
|
|
1
|
+
{"version":3,"file":"timed-event-container.d.ts","sourceRoot":"","sources":["../../../../src/components/timed-event-container.tsx"],"names":[],"mappings":"AAOA,OAAO,EAEL,SAAS,EAMV,MAAM,OAAO,CAAC;AAMf,OAAO,EACL,KAAK,aAAa,EAElB,sBAAsB,EACvB,MAAM,UAAU,CAAC;AAElB,KAAK,wBAAwB,CAAC,CAAC,SAAS,aAAa,IAAI;IACvD,MAAM,EAAE,sBAAsB,CAAC,CAAC,CAAC,CAAC;IAClC,WAAW,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC;CAC7B,CAAC;AA8JF,QAAA,MAAM,mBAAmB,EAAoD,CAC3E,CAAC,SAAS,aAAa,EAEvB,KAAK,EAAE,wBAAwB,CAAC,CAAC,CAAC,KAC/B,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC;AAEvB,eAAe,mBAAmB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-auto-scroll.d.ts","sourceRoot":"","sources":["../../../../src/hooks/use-auto-scroll.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,EAAE,EACf,KAAK,WAAW,EAChB,KAAK,WAAW,EAGjB,MAAM,yBAAyB,CAAC;AAMjC,KAAK,gBAAgB,GAAG;IACtB,SAAS,EAAE,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAC5C,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC7B,gBAAgB,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACtC,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACjC,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC9B,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACjC,QAAQ,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;IAC/B,gBAAgB,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACvC,SAAS,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAChC,WAAW,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAClC,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,EACpC,SAAS,EACT,OAAO,EACP,gBAAgB,EAChB,WAAW,EACX,QAAQ,EACR,WAAW,EACX,QAAQ,EACR,gBAAgB,EAChB,SAAS,EACT,WAAW,EACX,YAAY,GACb,EAAE,gBAAgB,
|
|
1
|
+
{"version":3,"file":"use-auto-scroll.d.ts","sourceRoot":"","sources":["../../../../src/hooks/use-auto-scroll.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,EAAE,EACf,KAAK,WAAW,EAChB,KAAK,WAAW,EAGjB,MAAM,yBAAyB,CAAC;AAMjC,KAAK,gBAAgB,GAAG;IACtB,SAAS,EAAE,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAC5C,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC7B,gBAAgB,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACtC,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACjC,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC9B,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACjC,QAAQ,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;IAC/B,gBAAgB,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACvC,SAAS,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAChC,WAAW,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAClC,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,EACpC,SAAS,EACT,OAAO,EACP,gBAAgB,EAChB,WAAW,EACX,QAAQ,EACR,WAAW,EACX,QAAQ,EACR,gBAAgB,EAChB,SAAS,EACT,WAAW,EACX,YAAY,GACb,EAAE,gBAAgB,QAiElB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-events.d.ts","sourceRoot":"","sources":["../../../../src/hooks/use-events.tsx"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,QAAQ,EACb,SAAS,EACT,KAAK,cAAc,
|
|
1
|
+
{"version":3,"file":"use-events.d.ts","sourceRoot":"","sources":["../../../../src/hooks/use-events.tsx"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,QAAQ,EACb,SAAS,EACT,KAAK,cAAc,EAMpB,MAAM,OAAO,CAAC;AAGf,OAAO,EACL,aAAa,EACb,wBAAwB,EACxB,uBAAuB,EACxB,MAAM,UAAU,CAAC;AAElB,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,aAAa,IAAI;IACjD,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,CAAC;AAEF,KAAK,iBAAiB,CAAC,CAAC,SAAS,aAAa,IAAI;IAChD,YAAY,EAAE,CAAC,EAAE,CAAC;IAClB,kBAAkB,EAAE,QAAQ,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAClD,YAAY,EAAE,uBAAuB,CAAC,CAAC,CAAC,CAAC;IACzC,kBAAkB,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;CACrD,CAAC;AAKF;;GAEG;AACH,eAAO,MAAM,cAAc,GAAI,CAAC,SAAS,aAAa,0DAInD;IACD,QAAQ,EAAE,SAAS,CAAC;IACpB,YAAY,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IAC7B,yBAAyB,CAAC,EAAE,OAAO,CAAC;CACrC,gCA6DA,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,SAAS,8BAMrB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,EAEZ,KAAK,GAAG,EAKT,MAAM,OAAO,CAAC;AAIf,OAAO,KAAK,EACV,aAAa,EACb,MAAM,EAEN,aAAa,EACb,UAAU,EACX,MAAM,SAAS,CAAC;AAKjB,cAAc,SAAS,CAAC;AAExB,UAAU,SAAS,CAAC,CAAC,SAAS,aAAa,GAAG,aAAa;IACzD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;IACvC,YAAY,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;IACzC,cAAc,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC;IAC7C,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;IACtC,uBAAuB,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC;IAC/D,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,oBAAoB,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC;IACzD,YAAY,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;IACzC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;IACzC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yBAAyB,CAAC,EAAE,OAAO,CAAC;CACrC;AAED,MAAM,WAAW,kBAAkB,CAAC,CAAC,SAAS,aAAa,GAAG,aAAa,CACzE,SAAQ,SAAS,CAAC,CAAC,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,CAAC,EAAE,CAAC;IACZ,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAgBD,MAAM,WAAW,oBAAoB;IACnC,YAAY,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7E,cAAc,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IACxD,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,YAAY,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9C;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,8 @@ export declare class CalendarLayout {
|
|
|
4
4
|
visibleX: Set<number>;
|
|
5
5
|
enableWeekBreaks: boolean;
|
|
6
6
|
startOfWeekXOffset: number;
|
|
7
|
+
private cachedHeight;
|
|
8
|
+
private cachedHeightDirty;
|
|
7
9
|
constructor({ visibleX, enableWeekBreaks, startOfWeekXOffset, }: {
|
|
8
10
|
visibleX: number[];
|
|
9
11
|
enableWeekBreaks: boolean;
|
|
@@ -20,7 +22,7 @@ export declare class CalendarLayout {
|
|
|
20
22
|
fit(x: number, y: number, duration: number): boolean;
|
|
21
23
|
findFit(x: number, duration: number): number;
|
|
22
24
|
findFitAndInsert(eventStartIndex: number, eventDurationDays: number, event: any): void;
|
|
23
|
-
height():
|
|
25
|
+
height(): number;
|
|
24
26
|
getViewAt(x: number, y: number): {
|
|
25
27
|
event?: undefined;
|
|
26
28
|
visibleWidthDays?: undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"calendar-layout.d.ts","sourceRoot":"","sources":["../../../../src/utils/calendar-layout.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"calendar-layout.d.ts","sourceRoot":"","sources":["../../../../src/utils/calendar-layout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEvC,qBAAa,cAAc;IAIzB,OAAO,EAAE,GAAG,EAAE,CAAC;IACf,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACtB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,OAAO,CAAC,YAAY,CAAa;IACjC,OAAO,CAAC,iBAAiB,CAAiB;gBAE9B,EACV,QAAQ,EACR,gBAAgB,EAChB,kBAAkB,GACnB,EAAE;QACD,QAAQ,EAAE,MAAM,EAAE,CAAC;QACnB,gBAAgB,EAAE,OAAO,CAAC;QAC1B,kBAAkB,EAAE,MAAM,CAAC;KAC5B;IAOD,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM;IAI1B,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE;QAAE,KAAK,EAAE,GAAG,CAAC;QAAC,IAAI,EAAE;YAAE,CAAC,EAAE,GAAG,CAAA;SAAE,CAAA;KAAE;IAUnE,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG;IAM3D,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;IAS1C,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;IAQnC,gBAAgB,CACd,eAAe,EAAE,MAAM,EACvB,iBAAiB,EAAE,MAAM,EACzB,KAAK,EAAE,GAAG;IAMZ,MAAM;IAeN,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM;;;;;;;;;;;CA4D/B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compute-positioning.d.ts","sourceRoot":"","sources":["../../../../src/utils/compute-positioning.ts"],"names":[],"mappings":"AAAA,OAAe,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,KAAK,aAAa,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE9E,KAAK,kBAAkB,CAAC,CAAC,SAAS,aAAa,IAAI;IAEjD,eAAe,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC;IACpC,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,QAAA,MAAM,kBAAkB,GAAI,CAAC,SAAS,aAAa,oDAIhD,kBAAkB,CAAC,CAAC,CAAC,KAAG,
|
|
1
|
+
{"version":3,"file":"compute-positioning.d.ts","sourceRoot":"","sources":["../../../../src/utils/compute-positioning.ts"],"names":[],"mappings":"AAAA,OAAe,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,KAAK,aAAa,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE9E,KAAK,kBAAkB,CAAC,CAAC,SAAS,aAAa,IAAI;IAEjD,eAAe,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC;IACpC,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,QAAA,MAAM,kBAAkB,GAAI,CAAC,SAAS,aAAa,oDAIhD,kBAAkB,CAAC,CAAC,CAAC,KAAG,aA4B1B,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"date-utils.d.ts","sourceRoot":"","sources":["../../../../src/utils/date-utils.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,EAAE,EAAE,KAAK,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAEtD,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"date-utils.d.ts","sourceRoot":"","sources":["../../../../src/utils/date-utils.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,EAAE,EAAE,KAAK,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAEtD,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAwBrD,eAAO,MAAM,mBAAmB,gBAClB,MAAM,KACjB,UAAU,EAwBZ,CAAC;AAIF,eAAO,MAAM,eAAe,yBACJ,MAAM,gBACd,IAAI,GAAG,MAAM,GAAG,MAAM,YAC1B,MAAM,kBAejB,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAAI,CAAC,SAAS,aAAa,iBAC9C,CAAC,YACN,MAAM,YAqBjB,CAAC;AAGF,eAAO,MAAM,iBAAiB,GAAI,CAAC,SAAS,aAAa,iBACxC,CAAC,YACN,MAAM,WAiBjB,CAAC;AAGF,eAAO,MAAM,WAAW,sCAIrB;IACD,SAAS,EAAE,IAAI,GAAG,MAAM,CAAC;IACzB,OAAO,EAAE,IAAI,GAAG,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;CAClB,aAkBA,CAAC;AAEF,eAAO,MAAM,WAAW,GAAI,CAAC,SAAS,aAAa,iBAClC,CAAC,iBACD,OAAO,WAWvB,CAAC;AAEF,eAAO,MAAM,wBAAwB,SAC7B,MAAM,GAAG,IAAI,GAAG,MAAM,MACxB,MAAM,YACA,OAAO,GAAG,UAAU,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,wBACnC,MAAM;;;;;;;;;CAiE7B,CAAC;AAGF,eAAO,MAAM,kBAAkB,yCACS;IAAE,SAAS,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,IAAI,CAAA;CAAE,wCAClC;IAAE,SAAS,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,IAAI,CAAA;CAAE,YAgBzE,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;;
|
|
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;;CAuJzB,CAAC;AAyIF,eAAe,oBAAoB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { memo, useCallback, useContext, useState } from "react";
|
|
1
|
+
import { memo, useCallback, useContext, useMemo, useState } from "react";
|
|
2
2
|
import { ConfigProvider, DEFAULT_MINUTE_HEIGHT } from "../utils/globals";
|
|
3
3
|
import { LayoutChangeEvent, StyleSheet, Text, View } from "react-native";
|
|
4
4
|
import EventContainer from "../components/event-container";
|
|
@@ -48,9 +48,13 @@ const AllDayEvents = memo(
|
|
|
48
48
|
}
|
|
49
49
|
}, [canCreateEvents, onCreateEvent]);
|
|
50
50
|
|
|
51
|
-
const allDayEvents =
|
|
52
|
-
|
|
53
|
-
|
|
51
|
+
const allDayEvents = useMemo(
|
|
52
|
+
() =>
|
|
53
|
+
showAllDayEvents
|
|
54
|
+
? layout.allDayEventsLayout
|
|
55
|
+
: layout.allDayEventsLayout.slice(0, maxAllDayEvents),
|
|
56
|
+
[showAllDayEvents, layout.allDayEventsLayout, maxAllDayEvents]
|
|
57
|
+
);
|
|
54
58
|
const restEventAmount =
|
|
55
59
|
layout.allDayEventsLayout.length - allDayEvents.length;
|
|
56
60
|
|
|
@@ -53,6 +53,16 @@ const EditEventContainer = memo(
|
|
|
53
53
|
} = useContext(ConfigProvider);
|
|
54
54
|
const height = useSharedValue(0);
|
|
55
55
|
const bottomEdgeY = useDerivedValue(() => currentY.value + height.value);
|
|
56
|
+
// isDragging flips true the instant the long-press starts, but currentY and
|
|
57
|
+
// height are only initialized from editingEvent.position by a JS-thread
|
|
58
|
+
// effect a few frames later. During that window topEdge/bottomEdge are 0, so
|
|
59
|
+
// the auto-scroll sees the event at the very top of the day and force-scrolls
|
|
60
|
+
// the viewport upward (jumping by the bottom-inset amount when the user is
|
|
61
|
+
// scrolled into the floating-tab-bar padding). Gate auto-scroll on the
|
|
62
|
+
// geometry being initialized (height > 0). (#11368)
|
|
63
|
+
const autoScrollActive = useDerivedValue(
|
|
64
|
+
() => isDragging.value && height.value > 0
|
|
65
|
+
);
|
|
56
66
|
|
|
57
67
|
useAutoScroll({
|
|
58
68
|
scrollRef,
|
|
@@ -61,7 +71,7 @@ const EditEventContainer = memo(
|
|
|
61
71
|
maximumHour,
|
|
62
72
|
topEdgeY: currentY,
|
|
63
73
|
bottomEdgeY,
|
|
64
|
-
isActive:
|
|
74
|
+
isActive: autoScrollActive,
|
|
65
75
|
autoScrollOffset,
|
|
66
76
|
positionY: currentY,
|
|
67
77
|
});
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ConfigProvider } from "../utils/globals";
|
|
2
|
-
import { useCallback, useContext, useMemo } from "react";
|
|
2
|
+
import { memo, useCallback, useContext, useMemo } from "react";
|
|
3
3
|
import { Pressable } from "react-native-gesture-handler";
|
|
4
4
|
import { StyleSheet, View } from "react-native";
|
|
5
5
|
import {
|
|
@@ -12,7 +12,7 @@ type EventContainerProps<T extends CalendarEvent> = {
|
|
|
12
12
|
layout: AllDayEventLayoutType<T>;
|
|
13
13
|
};
|
|
14
14
|
|
|
15
|
-
const
|
|
15
|
+
const EventContainerInner = <T extends CalendarEvent>({
|
|
16
16
|
layout,
|
|
17
17
|
}: EventContainerProps<T>) => {
|
|
18
18
|
const { onPressEvent, renderEvent } = useContext(ConfigProvider);
|
|
@@ -21,9 +21,7 @@ const EventContainer = <T extends CalendarEvent>({
|
|
|
21
21
|
() =>
|
|
22
22
|
renderEvent(
|
|
23
23
|
layout.event,
|
|
24
|
-
|
|
25
|
-
? (layout as AllDayEventLayoutType<T>).extend
|
|
26
|
-
: EventExtend.None
|
|
24
|
+
layout.extend ? layout.extend : EventExtend.None
|
|
27
25
|
),
|
|
28
26
|
[layout, renderEvent]
|
|
29
27
|
);
|
|
@@ -39,6 +37,17 @@ const EventContainer = <T extends CalendarEvent>({
|
|
|
39
37
|
);
|
|
40
38
|
};
|
|
41
39
|
|
|
40
|
+
const EventContainer = memo(
|
|
41
|
+
EventContainerInner,
|
|
42
|
+
(prev, next) =>
|
|
43
|
+
prev.layout.event.id === next.layout.event.id &&
|
|
44
|
+
prev.layout.event.start === next.layout.event.start &&
|
|
45
|
+
prev.layout.event.end === next.layout.event.end &&
|
|
46
|
+
prev.layout.event.title === next.layout.event.title &&
|
|
47
|
+
prev.layout.event.isAllDay === next.layout.event.isAllDay &&
|
|
48
|
+
prev.layout.extend === next.layout.extend
|
|
49
|
+
) as typeof EventContainerInner;
|
|
50
|
+
|
|
42
51
|
export default EventContainer;
|
|
43
52
|
|
|
44
53
|
const styles = StyleSheet.create({
|
|
@@ -174,6 +174,9 @@ const arePropsEqual = <T extends CalendarEvent>(
|
|
|
174
174
|
pl.event.id === nl.event.id &&
|
|
175
175
|
pl.event.start === nl.event.start &&
|
|
176
176
|
pl.event.end === nl.event.end &&
|
|
177
|
+
pl.event.title === nl.event.title &&
|
|
178
|
+
pl.event.calendarId === nl.event.calendarId &&
|
|
179
|
+
pl.event.isAllDay === nl.event.isAllDay &&
|
|
177
180
|
pl.position.top === nl.position.top &&
|
|
178
181
|
pl.position.height === nl.position.height &&
|
|
179
182
|
pl.position.width === nl.position.width &&
|
|
@@ -69,14 +69,24 @@ export default function useAutoScroll({
|
|
|
69
69
|
if (scrollDelta === 0) return;
|
|
70
70
|
|
|
71
71
|
const maxScrollY = Math.max(0, maximumHour.value - scrollViewHeight.value);
|
|
72
|
+
// maxScrollY ignores the calendar's bottom content inset (padding for the
|
|
73
|
+
// floating tab bar), so when the user has scrolled into that inset scrollY
|
|
74
|
+
// can exceed it. Never clamp BELOW the current offset, otherwise the first
|
|
75
|
+
// qualifying frame yanks the viewport up to maxScrollY. (#11368)
|
|
76
|
+
const effectiveMaxScrollY = Math.max(maxScrollY, scrollY.value);
|
|
72
77
|
const newScrollY = Math.min(
|
|
73
|
-
|
|
78
|
+
effectiveMaxScrollY,
|
|
74
79
|
Math.max(0, scrollY.value + scrollDelta)
|
|
75
80
|
);
|
|
76
81
|
const actualDelta = newScrollY - scrollY.value;
|
|
77
82
|
|
|
78
83
|
if (Math.abs(actualDelta) < 0.5) return;
|
|
79
84
|
|
|
85
|
+
// Belt-and-suspenders: never move opposite to the chosen direction.
|
|
86
|
+
// (#11368 -- the bottom-inset yank is already prevented by
|
|
87
|
+
// effectiveMaxScrollY above; this guards any future clamp changes.)
|
|
88
|
+
if (actualDelta * scrollDelta < 0) return;
|
|
89
|
+
|
|
80
90
|
scrollTo(scrollRef, 0, newScrollY, false);
|
|
81
91
|
scrollY.value = newScrollY;
|
|
82
92
|
|
package/src/hooks/use-events.tsx
CHANGED
|
@@ -6,6 +6,7 @@ import {
|
|
|
6
6
|
useCallback,
|
|
7
7
|
useContext,
|
|
8
8
|
useEffect,
|
|
9
|
+
useMemo,
|
|
9
10
|
useState,
|
|
10
11
|
} from "react";
|
|
11
12
|
import { cloneDeep, isEqual } from "lodash";
|
|
@@ -93,15 +94,18 @@ export const EventsProvider = <T extends CalendarEvent>({
|
|
|
93
94
|
updateEventsLayout({ ...initialProps, events: clonedEvents });
|
|
94
95
|
}, [initialProps, clonedEvents, updateEventsLayout]);
|
|
95
96
|
|
|
97
|
+
const contextValue = useMemo(
|
|
98
|
+
() => ({
|
|
99
|
+
clonedEvents,
|
|
100
|
+
updateClonedEvents: setClonedEvents,
|
|
101
|
+
eventsLayout,
|
|
102
|
+
updateEventsLayout,
|
|
103
|
+
}),
|
|
104
|
+
[clonedEvents, eventsLayout, updateEventsLayout]
|
|
105
|
+
);
|
|
106
|
+
|
|
96
107
|
return (
|
|
97
|
-
<EventsContext.Provider
|
|
98
|
-
value={{
|
|
99
|
-
clonedEvents,
|
|
100
|
-
updateClonedEvents: setClonedEvents,
|
|
101
|
-
eventsLayout,
|
|
102
|
-
updateEventsLayout,
|
|
103
|
-
}}
|
|
104
|
-
>
|
|
108
|
+
<EventsContext.Provider value={contextValue}>
|
|
105
109
|
{children}
|
|
106
110
|
</EventsContext.Provider>
|
|
107
111
|
);
|
package/src/index.tsx
CHANGED
|
@@ -210,42 +210,76 @@ function EventCalendarContentInner<T extends CalendarEvent>(
|
|
|
210
210
|
}
|
|
211
211
|
);
|
|
212
212
|
|
|
213
|
+
const configValue = useMemo(
|
|
214
|
+
() => ({
|
|
215
|
+
dayDate: startCalendarDate,
|
|
216
|
+
timeFormat,
|
|
217
|
+
layout: eventsLayout,
|
|
218
|
+
zoomLevel,
|
|
219
|
+
initialZoomLevel: initialZoomLevel || defaultZoomLevel,
|
|
220
|
+
defaultZoomLevel,
|
|
221
|
+
maxZoomLevel,
|
|
222
|
+
minZoomLevel,
|
|
223
|
+
createY,
|
|
224
|
+
onCreateEvent,
|
|
225
|
+
timezone,
|
|
226
|
+
renderEvent,
|
|
227
|
+
onPressEvent,
|
|
228
|
+
showTimeIndicator,
|
|
229
|
+
maxAllDayEvents,
|
|
230
|
+
canCreateEvents,
|
|
231
|
+
renderNewEventContainer,
|
|
232
|
+
fiveMinuteInterval,
|
|
233
|
+
canEditEvent,
|
|
234
|
+
onEventEdit,
|
|
235
|
+
renderDragBars,
|
|
236
|
+
maximumHour,
|
|
237
|
+
extraTimedComponents,
|
|
238
|
+
onZoomChange,
|
|
239
|
+
updateLocalStateAfterEdit,
|
|
240
|
+
theme,
|
|
241
|
+
initialEventEdit,
|
|
242
|
+
scrollY,
|
|
243
|
+
scrollRef: refScrollView,
|
|
244
|
+
scrollViewHeight,
|
|
245
|
+
}),
|
|
246
|
+
[
|
|
247
|
+
startCalendarDate,
|
|
248
|
+
timeFormat,
|
|
249
|
+
eventsLayout,
|
|
250
|
+
zoomLevel,
|
|
251
|
+
initialZoomLevel,
|
|
252
|
+
defaultZoomLevel,
|
|
253
|
+
maxZoomLevel,
|
|
254
|
+
minZoomLevel,
|
|
255
|
+
createY,
|
|
256
|
+
onCreateEvent,
|
|
257
|
+
timezone,
|
|
258
|
+
renderEvent,
|
|
259
|
+
onPressEvent,
|
|
260
|
+
showTimeIndicator,
|
|
261
|
+
maxAllDayEvents,
|
|
262
|
+
canCreateEvents,
|
|
263
|
+
renderNewEventContainer,
|
|
264
|
+
fiveMinuteInterval,
|
|
265
|
+
canEditEvent,
|
|
266
|
+
onEventEdit,
|
|
267
|
+
renderDragBars,
|
|
268
|
+
maximumHour,
|
|
269
|
+
extraTimedComponents,
|
|
270
|
+
onZoomChange,
|
|
271
|
+
updateLocalStateAfterEdit,
|
|
272
|
+
theme,
|
|
273
|
+
initialEventEdit,
|
|
274
|
+
scrollY,
|
|
275
|
+
refScrollView,
|
|
276
|
+
scrollViewHeight,
|
|
277
|
+
]
|
|
278
|
+
);
|
|
279
|
+
|
|
213
280
|
return (
|
|
214
281
|
<View style={[styles.container, theme?.container]}>
|
|
215
|
-
<ConfigProvider.Provider
|
|
216
|
-
value={{
|
|
217
|
-
dayDate: startCalendarDate,
|
|
218
|
-
timeFormat,
|
|
219
|
-
layout: eventsLayout,
|
|
220
|
-
zoomLevel,
|
|
221
|
-
initialZoomLevel: initialZoomLevel || defaultZoomLevel,
|
|
222
|
-
defaultZoomLevel,
|
|
223
|
-
maxZoomLevel,
|
|
224
|
-
minZoomLevel,
|
|
225
|
-
createY,
|
|
226
|
-
onCreateEvent,
|
|
227
|
-
timezone,
|
|
228
|
-
renderEvent,
|
|
229
|
-
onPressEvent,
|
|
230
|
-
showTimeIndicator,
|
|
231
|
-
maxAllDayEvents,
|
|
232
|
-
canCreateEvents,
|
|
233
|
-
renderNewEventContainer,
|
|
234
|
-
fiveMinuteInterval,
|
|
235
|
-
canEditEvent,
|
|
236
|
-
onEventEdit,
|
|
237
|
-
renderDragBars,
|
|
238
|
-
maximumHour,
|
|
239
|
-
extraTimedComponents,
|
|
240
|
-
onZoomChange,
|
|
241
|
-
updateLocalStateAfterEdit,
|
|
242
|
-
theme,
|
|
243
|
-
initialEventEdit,
|
|
244
|
-
scrollY,
|
|
245
|
-
scrollRef: refScrollView,
|
|
246
|
-
scrollViewHeight,
|
|
247
|
-
}}
|
|
248
|
-
>
|
|
282
|
+
<ConfigProvider.Provider value={configValue}>
|
|
249
283
|
<AllDayEvents />
|
|
250
284
|
<AnimatedScrollView
|
|
251
285
|
onLayout={onLayoutScrollView}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { max } from "lodash";
|
|
2
1
|
import { EventExtend } from "../types";
|
|
3
2
|
|
|
4
3
|
export class CalendarLayout {
|
|
@@ -9,6 +8,8 @@ export class CalendarLayout {
|
|
|
9
8
|
visibleX: Set<number>;
|
|
10
9
|
enableWeekBreaks: boolean;
|
|
11
10
|
startOfWeekXOffset: number;
|
|
11
|
+
private cachedHeight: number = 0;
|
|
12
|
+
private cachedHeightDirty: boolean = true;
|
|
12
13
|
|
|
13
14
|
constructor({
|
|
14
15
|
visibleX,
|
|
@@ -36,6 +37,7 @@ export class CalendarLayout {
|
|
|
36
37
|
this.array2d[x] = column;
|
|
37
38
|
}
|
|
38
39
|
column[y] = value;
|
|
40
|
+
this.cachedHeightDirty = true;
|
|
39
41
|
}
|
|
40
42
|
// assign value to the line of cells from (x, y) to (x + w, y)
|
|
41
43
|
setRange(x: number, y: number, duration: number, value: any) {
|
|
@@ -71,9 +73,18 @@ export class CalendarLayout {
|
|
|
71
73
|
}
|
|
72
74
|
// find the height of the 2d array
|
|
73
75
|
height() {
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
76
|
+
if (!this.cachedHeightDirty) {
|
|
77
|
+
return this.cachedHeight;
|
|
78
|
+
}
|
|
79
|
+
let maxHeight = 0;
|
|
80
|
+
for (const col of this.array2d) {
|
|
81
|
+
if (col && col.length > maxHeight) {
|
|
82
|
+
maxHeight = col.length;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
this.cachedHeight = maxHeight;
|
|
86
|
+
this.cachedHeightDirty = false;
|
|
87
|
+
return this.cachedHeight;
|
|
77
88
|
}
|
|
78
89
|
// get the event and associated view data for the given cell
|
|
79
90
|
getViewAt(x: number, y: number) {
|
|
@@ -14,9 +14,10 @@ const computePositioning = <T extends CalendarEvent>({
|
|
|
14
14
|
timezone,
|
|
15
15
|
}: ComputePositioning<T>): EventPosition => {
|
|
16
16
|
const startDateMoment = moment.tz(collisionObject.event.start, timezone);
|
|
17
|
-
const durationMinutes =
|
|
18
|
-
|
|
19
|
-
|
|
17
|
+
const durationMinutes =
|
|
18
|
+
(new Date(collisionObject.event.end).getTime() -
|
|
19
|
+
new Date(collisionObject.event.start).getTime()) /
|
|
20
|
+
60000;
|
|
20
21
|
|
|
21
22
|
let width = 100;
|
|
22
23
|
let margin = 0;
|
package/src/utils/date-utils.ts
CHANGED
|
@@ -2,6 +2,28 @@ import moment, { type Moment } from "moment-timezone";
|
|
|
2
2
|
import { isDate, range, size } from "lodash";
|
|
3
3
|
import { CalendarEvent, PrefabHour } from "../types";
|
|
4
4
|
|
|
5
|
+
// Cached Intl.DateTimeFormat instances for fast timezone-aware day/hour extraction.
|
|
6
|
+
// Avoids creating Moment instances in hot paths like isAllDayOrSpansMidnight.
|
|
7
|
+
let _cachedTz = "";
|
|
8
|
+
let _dayFormatter: Intl.DateTimeFormat;
|
|
9
|
+
let _hourFormatter: Intl.DateTimeFormat;
|
|
10
|
+
|
|
11
|
+
function ensureFormatters(timezone: string) {
|
|
12
|
+
if (timezone !== _cachedTz) {
|
|
13
|
+
_cachedTz = timezone;
|
|
14
|
+
_dayFormatter = new Intl.DateTimeFormat("en-CA", { timeZone: timezone });
|
|
15
|
+
_hourFormatter = new Intl.DateTimeFormat("en-GB", {
|
|
16
|
+
hour: "2-digit",
|
|
17
|
+
hour12: false,
|
|
18
|
+
timeZone: timezone,
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function toDate(date: Date | string): Date {
|
|
24
|
+
return typeof date === "string" ? new Date(date) : date;
|
|
25
|
+
}
|
|
26
|
+
|
|
5
27
|
export const generatePrefabHours = (
|
|
6
28
|
timeFormat: string = "HH:mm"
|
|
7
29
|
): PrefabHour[] => {
|
|
@@ -62,15 +84,19 @@ export const isAllDayOrSpansMidnight = <T extends CalendarEvent>(
|
|
|
62
84
|
return true;
|
|
63
85
|
}
|
|
64
86
|
|
|
65
|
-
|
|
66
|
-
const startMoment = moment.tz(start, timezone);
|
|
67
|
-
const endMoment = moment.tz(end, timezone);
|
|
87
|
+
ensureFormatters(timezone);
|
|
68
88
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
);
|
|
89
|
+
const endDateObj = toDate(end);
|
|
90
|
+
|
|
91
|
+
// If end hour is 0 in user's timezone, subtract 1 minute so events
|
|
92
|
+
// ending exactly at midnight aren't considered as spanning midnight
|
|
93
|
+
const endHour = parseInt(_hourFormatter.format(endDateObj), 10);
|
|
94
|
+
const effectiveEnd =
|
|
95
|
+
endHour === 0 ? new Date(endDateObj.getTime() - 60_000) : endDateObj;
|
|
96
|
+
|
|
97
|
+
const startDay = _dayFormatter.format(toDate(start));
|
|
98
|
+
const endDay = _dayFormatter.format(effectiveEnd);
|
|
99
|
+
return startDay !== endDay;
|
|
74
100
|
};
|
|
75
101
|
|
|
76
102
|
// Returns the count of unique dates in the provided timezone
|
|
@@ -79,17 +105,20 @@ export const getDurationInDays = <T extends CalendarEvent>(
|
|
|
79
105
|
timezone: string
|
|
80
106
|
) => {
|
|
81
107
|
// the event duration in days calculation depends on if the event is all day
|
|
82
|
-
|
|
83
|
-
|
|
108
|
+
if (calendarEvent.isAllDay) {
|
|
109
|
+
return (
|
|
110
|
+
moment
|
|
84
111
|
.tz(calendarEvent.end, timezone)
|
|
85
112
|
.diff(moment.tz(calendarEvent.start, timezone), "days") + 1
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
113
|
+
);
|
|
114
|
+
}
|
|
115
|
+
return size(
|
|
116
|
+
daysInRange({
|
|
117
|
+
startDate: calendarEvent.start,
|
|
118
|
+
endDate: calendarEvent.end,
|
|
119
|
+
timezone,
|
|
120
|
+
})
|
|
121
|
+
);
|
|
93
122
|
};
|
|
94
123
|
|
|
95
124
|
// Returns an array of days (e.g. ['2022-01-02']) in a given date range.
|
|
@@ -102,23 +131,20 @@ export const daysInRange = ({
|
|
|
102
131
|
endDate: Date | string;
|
|
103
132
|
timezone: string;
|
|
104
133
|
}) => {
|
|
105
|
-
const
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
const startDay = moment.tz(startDate, timezone).format("YYYY-MM-DD");
|
|
134
|
+
const startMoment = moment.tz(startDate, timezone);
|
|
135
|
+
const endMoment = moment.tz(endDate, timezone);
|
|
136
|
+
const countOfDaysInRange = endMoment.diff(startMoment, "days");
|
|
109
137
|
const days = [];
|
|
138
|
+
const maxIterations = Math.min(30, Math.abs(countOfDaysInRange));
|
|
110
139
|
// Make sure we loop at a max of 30 times here as we had events that were scheduled for all day long for
|
|
111
140
|
// 1000 years in the future and this was causing the app to crash
|
|
112
141
|
for (
|
|
113
142
|
let countOfDaysAfterStart = 0;
|
|
114
|
-
countOfDaysAfterStart <=
|
|
143
|
+
countOfDaysAfterStart <= maxIterations;
|
|
115
144
|
countOfDaysAfterStart++
|
|
116
145
|
) {
|
|
117
146
|
days.push(
|
|
118
|
-
|
|
119
|
-
.tz(startDay, timezone)
|
|
120
|
-
.add(countOfDaysAfterStart, "day")
|
|
121
|
-
.format("YYYY-MM-DD")
|
|
147
|
+
startMoment.clone().add(countOfDaysAfterStart, "day").format("YYYY-MM-DD")
|
|
122
148
|
);
|
|
123
149
|
}
|
|
124
150
|
return days;
|
|
@@ -76,16 +76,13 @@ export const generateEventLayouts = <T extends CalendarEvent>({
|
|
|
76
76
|
...(calendarViewInterval === "month" ? partDayEventsSorted : []),
|
|
77
77
|
];
|
|
78
78
|
|
|
79
|
-
const
|
|
80
|
-
|
|
81
|
-
|
|
79
|
+
const startCalendarMoment = moment.tz(startCalendarDate, timezone);
|
|
80
|
+
const endCalendarMoment = moment.tz(endCalendarDate, timezone);
|
|
81
|
+
const visibleDayCount = endCalendarMoment.diff(startCalendarMoment, "days");
|
|
82
82
|
const visibleDays: string[] = [];
|
|
83
83
|
for (let dayCount = 0; dayCount <= visibleDayCount; dayCount++) {
|
|
84
84
|
visibleDays.push(
|
|
85
|
-
|
|
86
|
-
.tz(startCalendarDate, timezone)
|
|
87
|
-
.add(dayCount, "day")
|
|
88
|
-
.format("YYYY-MM-DD")
|
|
85
|
+
startCalendarMoment.clone().add(dayCount, "day").format("YYYY-MM-DD")
|
|
89
86
|
);
|
|
90
87
|
}
|
|
91
88
|
|
|
@@ -103,15 +100,14 @@ export const generateEventLayouts = <T extends CalendarEvent>({
|
|
|
103
100
|
} = {};
|
|
104
101
|
|
|
105
102
|
calendarViewDateRanges.forEach((date) => {
|
|
103
|
+
const basisMoment = moment.tz(date.basisDate, timezone);
|
|
106
104
|
const calendarLayoutOptions = {
|
|
107
105
|
visibleX: date.dayIndexes,
|
|
108
106
|
enableWeekBreaks: calendarViewInterval === "month",
|
|
109
|
-
startOfWeekXOffset:
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
"days"
|
|
114
|
-
),
|
|
107
|
+
startOfWeekXOffset: basisMoment.diff(
|
|
108
|
+
startOfUserWeek(startDayOfWeekOffset, date.basisDate!, timezone),
|
|
109
|
+
"days"
|
|
110
|
+
),
|
|
115
111
|
};
|
|
116
112
|
const calendarViewDayLayout = _reduce(
|
|
117
113
|
calendarViewDayEvents,
|
|
@@ -119,7 +115,7 @@ export const generateEventLayouts = <T extends CalendarEvent>({
|
|
|
119
115
|
const eventStartIndex = moment
|
|
120
116
|
.tz(event.start, timezone)
|
|
121
117
|
.startOf("day")
|
|
122
|
-
.diff(
|
|
118
|
+
.diff(basisMoment, "days");
|
|
123
119
|
const eventDurationDays = getDurationInDays(event, timezone);
|
|
124
120
|
|
|
125
121
|
calendarLayout.findFitAndInsert(
|
|
@@ -139,16 +135,13 @@ export const generateEventLayouts = <T extends CalendarEvent>({
|
|
|
139
135
|
calendarDates.forEach((calendarDate) => {
|
|
140
136
|
const currentDayDate = moment.tz(calendarDate, timezone).startOf("day");
|
|
141
137
|
const startDate = currentDayDate.toDate();
|
|
142
|
-
const endDate =
|
|
138
|
+
const endDate = currentDayDate.clone().endOf("day").toDate();
|
|
143
139
|
const showHours = !["month"].includes(calendarViewInterval);
|
|
144
140
|
const dayId = calendarDate;
|
|
145
141
|
const allDayEventsLayout: AllDayEventLayoutType<T>[] = [];
|
|
146
142
|
let partDayEventsLayout: PartDayEventLayoutType<T>[] = [];
|
|
147
143
|
|
|
148
|
-
const x =
|
|
149
|
-
moment.tz(date.basisDate, timezone),
|
|
150
|
-
"days"
|
|
151
|
-
);
|
|
144
|
+
const x = currentDayDate.diff(basisMoment, "days");
|
|
152
145
|
for (let y = 0; y < calendarViewDayRowHeight; ++y) {
|
|
153
146
|
const {
|
|
154
147
|
event,
|