Skip to content

Commit 546e295

Browse files
✨ Feat: move someday event to from week or month section using keyboard shortcuts (#533)
* chore(web): extract start-end date update logic into dedicated functions * feat(web): move someday event from/to week or month section using keyboard shortcuts
1 parent d122fb6 commit 546e295

File tree

4 files changed

+90
-37
lines changed

4 files changed

+90
-37
lines changed

packages/web/src/common/utils/web.date.util.ts

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,11 @@ import {
77
YMDHAM_FORMAT,
88
YMDHM_FORMAT,
99
} from "@core/constants/date.constants";
10-
import { Categories_Event, Direction_Migrate } from "@core/types/event.types";
10+
import {
11+
Categories_Event,
12+
Direction_Migrate,
13+
Schema_Event,
14+
} from "@core/types/event.types";
1115
import { Option_Time } from "@web/common/types/util.types";
1216
import { GRID_TIME_STEP } from "@web/views/Calendar/layout.constants";
1317
import { roundToNext } from ".";
@@ -345,3 +349,29 @@ const _getWeeklyMigrationDates = (
345349

346350
return { startDate, endDate };
347351
};
352+
353+
export const setEventStartEndDatesToCurrentWeek = (
354+
event: Schema_Event,
355+
): Schema_Event => {
356+
const weekStart = dayjs(new Date()).startOf("week");
357+
const weekEnd = dayjs(new Date()).endOf("week");
358+
359+
return {
360+
...event,
361+
startDate: weekStart.format(),
362+
endDate: weekEnd.format(),
363+
};
364+
};
365+
366+
export const setEventStartEndDatesToCurrentMonth = (
367+
event: Schema_Event,
368+
): Schema_Event => {
369+
const monthStart = dayjs(new Date()).startOf("month");
370+
const monthEnd = dayjs(new Date()).endOf("month");
371+
372+
return {
373+
...event,
374+
startDate: monthStart.format(),
375+
endDate: monthEnd.format(),
376+
};
377+
};

packages/web/src/views/Calendar/components/Draft/sidebar/hooks/useSidebarActions.ts

Lines changed: 32 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ import { getX } from "@web/common/utils/grid.util";
2626
import {
2727
getDatesByCategory,
2828
getMigrationDates,
29+
setEventStartEndDatesToCurrentMonth,
30+
setEventStartEndDatesToCurrentWeek,
2931
} from "@web/common/utils/web.date.util";
3032
import {
3133
selectDraft,
@@ -359,28 +361,37 @@ export const useSidebarActions = (
359361
createDefaultSomeday();
360362
};
361363

362-
const onSubmit = async (category: Categories_Event) => {
363-
if (!state.draft) return;
364+
const onSubmit = async (
365+
category: Categories_Event,
366+
event: Schema_Event | null = state.draft,
367+
) => {
368+
if (!event) return;
364369

365-
const { startDate, endDate } = getDatesByCategory(
366-
category,
367-
viewStart,
368-
viewEnd,
369-
);
370-
const _event = { ...state.draft, startDate, endDate };
370+
let _event = { ...event };
371+
372+
if (!_event.startDate || !_event.endDate) {
373+
// This probably means we are creating a new event, hence why we don't have start/end dates
374+
const { startDate, endDate } = getDatesByCategory(
375+
category,
376+
viewStart,
377+
viewEnd,
378+
);
379+
_event.startDate = startDate;
380+
_event.endDate = endDate;
381+
}
371382

372383
const userId = await getUserId();
373-
const event = prepEvtBeforeSubmit(_event, userId);
384+
_event = prepEvtBeforeSubmit(_event, userId);
374385

375-
const isExisting = event._id;
386+
const isExisting = _event._id;
376387
if (isExisting) {
377-
const isRecurring = event.recurrence?.rule;
378-
const wasRecurring = event.recurrence?.rule === null;
388+
const isRecurring = _event.recurrence?.rule;
389+
const wasRecurring = _event.recurrence?.rule === null;
379390

380391
dispatch(
381392
editEventSlice.actions.request({
382-
_id: event._id,
383-
event,
393+
_id: _event._id,
394+
event: _event,
384395
applyTo: isRecurring || wasRecurring ? "all" : null,
385396
}),
386397
);
@@ -391,7 +402,7 @@ export const useSidebarActions = (
391402
: state.somedayMonthIds.length;
392403

393404
const eventWithOrder = {
394-
...event,
405+
..._event,
395406
order,
396407
};
397408
dispatch(createEventSlice.actions.request(eventWithOrder));
@@ -438,38 +449,24 @@ export const useSidebarActions = (
438449
};
439450
setSomedayEvents(newState);
440451

441-
const draggedEvent = state.somedayEvents.events[draggableId];
452+
let draggedEvent = state.somedayEvents.events[draggableId];
442453

443454
const draggedToMonthColumn = destColumn.id === COLUMN_MONTH;
444455

445-
let newStartDate;
446-
let newEndDate;
447-
448456
if (draggedToMonthColumn) {
449-
// set month start-end to current month
450-
const monthStart = dayjs(new Date()).startOf("month");
451-
const monthEnd = dayjs(new Date()).endOf("month");
452-
newStartDate = monthStart.format();
453-
newEndDate = monthEnd.format();
457+
draggedEvent = setEventStartEndDatesToCurrentMonth(draggedEvent);
454458
} else {
455-
// set week start-end to current week
456-
const weekStart = dayjs(new Date()).startOf("week");
457-
const weekEnd = dayjs(new Date()).endOf("week");
458-
newStartDate = weekStart.format();
459-
newEndDate = weekEnd.format();
459+
draggedEvent = setEventStartEndDatesToCurrentWeek(draggedEvent);
460460
}
461461

462462
const newOrder = destEventIds.indexOf(draggableId);
463463

464+
draggedEvent.order = newOrder;
465+
464466
dispatch(
465467
editEventSlice.actions.request({
466468
_id: draggedEvent._id,
467-
event: {
468-
...draggedEvent,
469-
startDate: newStartDate,
470-
endDate: newEndDate,
471-
order: newOrder,
472-
},
469+
event: draggedEvent,
473470
}),
474471
);
475472
};

packages/web/src/views/Calendar/components/Sidebar/SomedayTab/SomedayEvents/DraggableSomedayEvent/DraggableSomedayEvent.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ export const DraggableSomedayEvent: FC<Props> = ({
4242
isDrafting={isDraftingThisEvent}
4343
isOverGrid={isOverGrid}
4444
onMigrate={actions.onMigrate}
45-
onSubmit={() => actions.onSubmit(category)}
45+
onSubmit={(event) => actions.onSubmit(category, event)}
4646
provided={provided}
4747
snapshot={snapshot}
4848
setEvent={setters.setDraft}

packages/web/src/views/Forms/SomedayEventForm/SomedayEventForm.tsx

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@ import "react-toastify/dist/ReactToastify.css";
66
import { Key } from "ts-key-enum";
77
import { ID_SOMEDAY_EVENT_FORM } from "@web/common/constants/web.constants";
88
import { colorByPriority } from "@web/common/styles/theme.util";
9+
import {
10+
setEventStartEndDatesToCurrentMonth,
11+
setEventStartEndDatesToCurrentWeek,
12+
} from "@web/common/utils/web.date.util";
913
import { getSomedayEventsSlice } from "@web/ducks/events/slices/someday.slice";
1014
import { useAppDispatch } from "@web/store/store.hooks";
1115
import { useDraftContext } from "@web/views/Calendar/components/Draft/context/useDraftContext";
@@ -125,6 +129,28 @@ export const SomedayEventForm: React.FC<FormProps> = ({
125129
[_onSubmit],
126130
);
127131

132+
useHotkeys(
133+
"ctrl+meta+up",
134+
(e) => {
135+
e.preventDefault();
136+
const updatedEvent = setEventStartEndDatesToCurrentWeek(event);
137+
onSubmit(updatedEvent);
138+
},
139+
hotkeysOptions,
140+
[event],
141+
);
142+
143+
useHotkeys(
144+
"ctrl+meta+down",
145+
async (e) => {
146+
e.preventDefault();
147+
const updatedEvent = setEventStartEndDatesToCurrentMonth(event);
148+
onSubmit(updatedEvent);
149+
},
150+
hotkeysOptions,
151+
[event],
152+
);
153+
128154
const onSetEventField: SetEventFormField = (field) => {
129155
const newEvent = { ...event, ...field };
130156

0 commit comments

Comments
 (0)