Skip to content

Commit 5da9500

Browse files
fix(calendar): update dialog positioning logic
1 parent 98a715d commit 5da9500

File tree

4 files changed

+44
-13
lines changed

4 files changed

+44
-13
lines changed

components/calendar/dialog/surface.tsx

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ export default function DialogSurface({
3434
offset,
3535
children,
3636
}: DialogSurfaceProps): JSX.Element {
37-
const { editing, setDialog, dragging, setRnd } = useCalendarState();
37+
const { editing, editingLeftPercent, editingWidthPercent, setDialog, dragging, setRnd } = useCalendarState();
3838

3939
const measured = useRef<boolean>(false);
4040
const [visible, setVisible] = useState<boolean>(false);
@@ -57,8 +57,11 @@ export default function DialogSurface({
5757
const [measureRef, bounds] = useMeasure({ polyfill });
5858

5959
const rndPosition = useMemo(
60-
() => getPosition(editing.time.from, rndWidth + RND_MARGIN),
61-
[editing.time.from, rndWidth]
60+
() => {
61+
const { x, y } = getPosition(editing.time.from, rndWidth + RND_MARGIN);
62+
return { y, x: x + editingLeftPercent * rndWidth };
63+
},
64+
[editing.time.from, rndWidth, editingLeftPercent]
6265
);
6366
const rndHeight = useMemo(() => getHeight(editing.time), [editing.time]);
6467

@@ -67,9 +70,9 @@ export default function DialogSurface({
6770
return visible && !dragging ? x : x + 12;
6871
}, [offset.x, dragging, visible, rndPosition.x, bounds.width]);
6972
const onRight = useMemo(() => {
70-
const x = offset.x + rndPosition.x + rndWidth + PREVIEW_MARGIN;
73+
const x = offset.x + rndPosition.x + rndWidth * editingWidthPercent + PREVIEW_MARGIN;
7174
return visible && !dragging ? x : x - 12;
72-
}, [offset.x, dragging, visible, rndPosition.x, rndWidth]);
75+
}, [offset.x, dragging, visible, rndPosition.x, rndWidth, editingWidthPercent]);
7376

7477
const alignedTop = useMemo(() => offset.y + rndPosition.y, [
7578
offset.y,
@@ -96,7 +99,7 @@ export default function DialogSurface({
9699

97100
const props = useSpring({
98101
onRest: () => (!visible && measured.current ? setDialog(false) : undefined),
99-
left: rndPosition.x < rndWidth * 3 ? onRight : onLeft,
102+
left: onRight + bounds.width < window.innerWidth ? onRight : onLeft,
100103
config: { tension: 250, velocity: 50 },
101104
immediate: !measured.current || dragging,
102105
top,

components/calendar/index.tsx

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,8 @@ export default function Calendar({
204204
// the body scrollbar disappear, moving the `fixed` position values).
205205
const [offset, setOffset] = useState<Position>({ x: 0, y: 0 });
206206
const [width, setWidth] = useState<number>(0);
207+
const [editingLeftPercent, setEditingLeftPercent] = useState<number>(0);
208+
const [editingWidthPercent, setEditingWidthPercent] = useState<number>(0);
207209

208210
const onEditStop = useCallback(
209211
(evt?: FormEvent) => {
@@ -224,6 +226,10 @@ export default function Calendar({
224226
editing,
225227
setEditing,
226228
onEditStop,
229+
editingLeftPercent,
230+
setEditingLeftPercent,
231+
editingWidthPercent,
232+
setEditingWidthPercent,
227233
rnd,
228234
setRnd,
229235
dialog,
@@ -239,6 +245,10 @@ export default function Calendar({
239245
editing,
240246
setEditing,
241247
onEditStop,
248+
editingLeftPercent,
249+
setEditingLeftPercent,
250+
editingWidthPercent,
251+
setEditingWidthPercent,
242252
rnd,
243253
setRnd,
244254
dialog,

components/calendar/meetings/item.tsx

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@ export default function MeetingItem({
5555
const {
5656
editing,
5757
setEditing,
58+
setEditingLeftPercent,
59+
setEditingWidthPercent,
5860
rnd,
5961
setRnd,
6062
dialog,
@@ -90,6 +92,8 @@ export default function MeetingItem({
9092
if (mouseMovement > 10) {
9193
removeListeners();
9294
setEditing(meeting);
95+
setEditingLeftPercent(leftPercent);
96+
setEditingWidthPercent(widthPercent);
9397
setEventTarget('middle');
9498
setEventData({
9599
screenX: e.screenX,
@@ -107,6 +111,8 @@ export default function MeetingItem({
107111
removeListeners();
108112
setRnd(false);
109113
setEditing(meeting);
114+
setEditingLeftPercent(leftPercent);
115+
setEditingWidthPercent(widthPercent);
110116
setDialogPage(DialogPage.Display);
111117
setDialog(true);
112118
};
@@ -126,6 +132,8 @@ export default function MeetingItem({
126132
onMouseDown={(evt) => {
127133
evt.stopPropagation();
128134
setEditing(meeting);
135+
setEditingLeftPercent(leftPercent);
136+
setEditingWidthPercent(widthPercent);
129137
setEventTarget('bottom');
130138
setEventData({
131139
screenX: evt.screenX,
@@ -143,6 +151,8 @@ export default function MeetingItem({
143151
onMouseDown={(evt) => {
144152
evt.stopPropagation();
145153
setEditing(meeting);
154+
setEditingLeftPercent(leftPercent);
155+
setEditingWidthPercent(widthPercent);
146156
setEventTarget('top');
147157
setEventData({
148158
screenX: evt.screenX,

components/calendar/state.ts

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { FormEvent, createContext, useContext } from 'react';
22

3-
import { Callback, CallbackParam } from 'lib/model/callback';
3+
import { Callback } from 'lib/model/callback';
44
import { Meeting } from 'lib/model/meeting';
55
import { MeetingsQuery } from 'lib/model/query/meetings';
66

@@ -17,6 +17,10 @@ export interface CalendarState {
1717
editing: Meeting;
1818
setEditing: Callback<Meeting>;
1919
onEditStop: (evt?: FormEvent) => void;
20+
editingLeftPercent: number;
21+
setEditingLeftPercent: Callback<number>;
22+
editingWidthPercent: number;
23+
setEditingWidthPercent: Callback<number>;
2024
rnd: boolean;
2125
setRnd: Callback<boolean>;
2226
dialog: boolean;
@@ -31,15 +35,19 @@ export interface CalendarState {
3135
export const CalendarStateContext = createContext<CalendarState>({
3236
start: new MeetingsQuery().from,
3337
editing: new Meeting(),
34-
setEditing: (param: CallbackParam<Meeting>) => {},
35-
onEditStop: (evt?: FormEvent) => {},
38+
setEditing: () => {},
39+
onEditStop: () => {},
40+
editingLeftPercent: 0,
41+
setEditingLeftPercent: () => {},
42+
editingWidthPercent: 0,
43+
setEditingWidthPercent: () => {},
3644
rnd: false,
37-
setRnd: (param: CallbackParam<boolean>) => {},
45+
setRnd: () => {},
3846
dialog: false,
39-
setDialog: (param: CallbackParam<boolean>) => {},
40-
setDialogPage: (param: CallbackParam<DialogPage>) => {},
47+
setDialog: () => {},
48+
setDialogPage: () => {},
4149
dragging: false,
42-
setDragging: (param: CallbackParam<boolean>) => {},
50+
setDragging: () => {},
4351
display: 'Week',
4452
setDisplay: () => {},
4553
});

0 commit comments

Comments
 (0)