@fieldia/calendar 0.0.0-stage → 0.23.0
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/LICENSE +21 -0
- package/README.md +125 -2
- package/package.json +37 -3
- package/src/index.d.mts +3 -0
- package/src/index.d.ts +3 -0
- package/src/index.js +6 -0
- package/src/index.js.map +1 -0
- package/src/index.mjs +2 -0
- package/src/index.mjs.map +1 -0
- package/src/lib/calendar-core.d.mts +83 -0
- package/src/lib/calendar-core.d.ts +83 -0
- package/src/lib/calendar-core.js +18 -0
- package/src/lib/calendar-core.js.map +1 -0
- package/src/lib/calendar-core.mjs +13 -0
- package/src/lib/calendar-core.mjs.map +1 -0
- package/src/lib/calendar-view.d.mts +11 -0
- package/src/lib/calendar-view.d.ts +11 -0
- package/src/lib/calendar-view.js +829 -0
- package/src/lib/calendar-view.js.map +1 -0
- package/src/lib/calendar-view.mjs +826 -0
- package/src/lib/calendar-view.mjs.map +1 -0
- package/src/lib/dates.d.mts +43 -0
- package/src/lib/dates.d.ts +43 -0
- package/src/lib/dates.js +100 -0
- package/src/lib/dates.js.map +1 -0
- package/src/lib/dates.mjs +80 -0
- package/src/lib/dates.mjs.map +1 -0
- package/src/lib/events.d.mts +58 -0
- package/src/lib/events.d.ts +58 -0
- package/src/lib/events.js +136 -0
- package/src/lib/events.js.map +1 -0
- package/src/lib/events.mjs +125 -0
- package/src/lib/events.mjs.map +1 -0
- package/src/lib/gestures.d.mts +11 -0
- package/src/lib/gestures.d.ts +11 -0
- package/src/lib/gestures.js +215 -0
- package/src/lib/gestures.js.map +1 -0
- package/src/lib/gestures.mjs +210 -0
- package/src/lib/gestures.mjs.map +1 -0
- package/src/lib/keys.d.mts +5 -0
- package/src/lib/keys.d.ts +5 -0
- package/src/lib/keys.js +151 -0
- package/src/lib/keys.js.map +1 -0
- package/src/lib/keys.mjs +146 -0
- package/src/lib/keys.mjs.map +1 -0
- package/src/lib/labels.d.mts +65 -0
- package/src/lib/labels.d.ts +65 -0
- package/src/lib/labels.js +193 -0
- package/src/lib/labels.js.map +1 -0
- package/src/lib/labels.mjs +188 -0
- package/src/lib/labels.mjs.map +1 -0
- package/src/lib/list-view.d.mts +11 -0
- package/src/lib/list-view.d.ts +11 -0
- package/src/lib/list-view.js +54 -0
- package/src/lib/list-view.js.map +1 -0
- package/src/lib/list-view.mjs +51 -0
- package/src/lib/list-view.mjs.map +1 -0
- package/src/lib/move-to.d.mts +15 -0
- package/src/lib/move-to.d.ts +15 -0
- package/src/lib/move-to.js +122 -0
- package/src/lib/move-to.js.map +1 -0
- package/src/lib/move-to.mjs +118 -0
- package/src/lib/move-to.mjs.map +1 -0
- package/src/lib/settings.d.mts +11 -0
- package/src/lib/settings.d.ts +11 -0
- package/src/lib/settings.js +3 -0
- package/src/lib/settings.js.map +1 -0
- package/src/lib/settings.mjs +2 -0
- package/src/lib/settings.mjs.map +1 -0
- package/src/lib/styles.d.mts +9 -0
- package/src/lib/styles.d.ts +9 -0
- package/src/lib/styles.js +165 -0
- package/src/lib/styles.js.map +1 -0
- package/src/lib/styles.mjs +161 -0
- package/src/lib/styles.mjs.map +1 -0
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
import { linesIn } from './calendar-core.mjs';
|
|
2
|
+
import { addMinutes, atMinutes, minutesOf } from './dates.mjs';
|
|
3
|
+
import { moved, whereTo } from './events.mjs';
|
|
4
|
+
import { fill } from './labels.mjs';
|
|
5
|
+
/**
|
|
6
|
+
* A calendar's pointer: an empty slot pressed or dragged across for a new
|
|
7
|
+
* record, a record dragged to another time, day or person, and its end
|
|
8
|
+
* stretched. Each drag follows the pointer over the whole document until it
|
|
9
|
+
* is let go.
|
|
10
|
+
*/
|
|
11
|
+
/** How far a press moves before it is a drag rather than a click. */
|
|
12
|
+
const DRAG_FROM = 4;
|
|
13
|
+
/** Escape while a drag is held: `cancel` lets go of it, the key kept from anything else (a dialog round the calendar). */
|
|
14
|
+
function onEscape(doc, cancel) {
|
|
15
|
+
const escape = (k) => {
|
|
16
|
+
if (k.key !== 'Escape')
|
|
17
|
+
return;
|
|
18
|
+
k.preventDefault();
|
|
19
|
+
k.stopPropagation();
|
|
20
|
+
cancel();
|
|
21
|
+
};
|
|
22
|
+
doc.addEventListener('keydown', escape, true);
|
|
23
|
+
return () => doc.removeEventListener('keydown', escape, true);
|
|
24
|
+
}
|
|
25
|
+
/** A press on an empty slot: a new record there, or, dragged down or up, over the slots it crossed; none after Escape. */
|
|
26
|
+
export function pressSlot(cal, e, col, i) {
|
|
27
|
+
const { doc, state, slot } = cal;
|
|
28
|
+
const target = e.target;
|
|
29
|
+
if (e.button !== 0 || !target.classList.contains('fd-cal-slot'))
|
|
30
|
+
return;
|
|
31
|
+
e.preventDefault();
|
|
32
|
+
const perMinute = cal.hour / 60;
|
|
33
|
+
const top = col.getBoundingClientRect().top;
|
|
34
|
+
const minutesAt = (y) => Math.min(Math.max(state.shownHours.start * 60, state.shownHours.start * 60 + Math.floor((y - top) / perMinute / slot) * slot), state.shownHours.end * 60 - slot);
|
|
35
|
+
const first = Number(target.dataset['minutes']);
|
|
36
|
+
let last = first;
|
|
37
|
+
const picking = cal.make('div', { class: 'fd-cal-picking' });
|
|
38
|
+
const drawPick = () => {
|
|
39
|
+
const [a, b] = [Math.min(first, last), Math.max(first, last) + slot];
|
|
40
|
+
picking.style.top = `${(a - state.shownHours.start * 60) * perMinute}px`;
|
|
41
|
+
picking.style.height = `${(b - a) * perMinute}px`;
|
|
42
|
+
};
|
|
43
|
+
drawPick();
|
|
44
|
+
col.append(picking);
|
|
45
|
+
const move = (m) => {
|
|
46
|
+
last = minutesAt(m.clientY);
|
|
47
|
+
drawPick();
|
|
48
|
+
};
|
|
49
|
+
const stop = () => {
|
|
50
|
+
doc.removeEventListener('pointermove', move);
|
|
51
|
+
doc.removeEventListener('pointerup', up);
|
|
52
|
+
doc.removeEventListener('pointercancel', stop);
|
|
53
|
+
unescape();
|
|
54
|
+
picking.remove();
|
|
55
|
+
};
|
|
56
|
+
const unescape = onEscape(doc, stop);
|
|
57
|
+
const up = () => {
|
|
58
|
+
stop();
|
|
59
|
+
const column = state.columns[i];
|
|
60
|
+
const [a, b] = [Math.min(first, last), Math.max(first, last) + slot];
|
|
61
|
+
const dragged = a !== first || b !== first + slot;
|
|
62
|
+
void cal.createAt(atMinutes(column.day, a), dragged ? atMinutes(column.day, b) : null, column);
|
|
63
|
+
};
|
|
64
|
+
doc.addEventListener('pointermove', move);
|
|
65
|
+
doc.addEventListener('pointerup', up);
|
|
66
|
+
doc.addEventListener('pointercancel', stop);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* A press on a record: a click opens it; a drag moves it — to another time, day or person — where it is let go,
|
|
70
|
+
* by the slot; Escape while dragging puts it back. A drag of one that cannot move goes nowhere, and opens nothing.
|
|
71
|
+
*/
|
|
72
|
+
export function pressEvent(cal, e, event, block, movable) {
|
|
73
|
+
if (e.button !== 0)
|
|
74
|
+
return;
|
|
75
|
+
if (e.target.closest('.fd-cal-resize, .fd-cal-event-menu'))
|
|
76
|
+
return;
|
|
77
|
+
e.stopPropagation();
|
|
78
|
+
const { doc, state } = cal;
|
|
79
|
+
const startX = e.clientX;
|
|
80
|
+
const startY = e.clientY;
|
|
81
|
+
const home = block.parentElement;
|
|
82
|
+
const timedHere = home.classList.contains('fd-cal-col');
|
|
83
|
+
const homeTop = timedHere ? home.getBoundingClientRect().top : 0;
|
|
84
|
+
/** Minutes between the record's start (on this day) and where it was taken hold of. */
|
|
85
|
+
const day = new Date(`${(block.dataset['focus'] ?? '').split(':').pop()}T00:00:00`);
|
|
86
|
+
const segStart = cal.segment(event, day)?.start ?? event.start;
|
|
87
|
+
const grabbed = timedHere ? Math.round((startY - homeTop) / (cal.hour / 60)) - (minutesOf(segStart) - state.shownHours.start * 60) : 0;
|
|
88
|
+
/** How far into the record this day's part begins: a record from the night before is taken by its morning's part. */
|
|
89
|
+
const into = Math.round((segStart.getTime() - event.start.getTime()) / 60000);
|
|
90
|
+
let moving = false;
|
|
91
|
+
let dragged = false;
|
|
92
|
+
let landing = null;
|
|
93
|
+
const move = (m) => {
|
|
94
|
+
if (!moving && Math.hypot(m.clientX - startX, m.clientY - startY) < DRAG_FROM)
|
|
95
|
+
return;
|
|
96
|
+
dragged = true;
|
|
97
|
+
if (!movable)
|
|
98
|
+
return;
|
|
99
|
+
if (!moving) {
|
|
100
|
+
moving = true;
|
|
101
|
+
block.setAttribute('data-moving', '');
|
|
102
|
+
}
|
|
103
|
+
landing = landingAt(cal, m.clientX, m.clientY, event, timedHere, grabbed, block);
|
|
104
|
+
if (landing && into)
|
|
105
|
+
landing = { ...landing, start: addMinutes(landing.start, -into) };
|
|
106
|
+
};
|
|
107
|
+
const finish = (commitIt) => {
|
|
108
|
+
doc.removeEventListener('pointermove', move);
|
|
109
|
+
doc.removeEventListener('pointerup', up);
|
|
110
|
+
doc.removeEventListener('pointercancel', cancel);
|
|
111
|
+
unescape();
|
|
112
|
+
if (!moving)
|
|
113
|
+
return;
|
|
114
|
+
block.removeAttribute('data-moving');
|
|
115
|
+
if (!commitIt || !landing)
|
|
116
|
+
return cal.draw();
|
|
117
|
+
const values = moved(event, landing.start, cal.spec, cal.page, landing.column?.resource ?? undefined);
|
|
118
|
+
void cal.commit(event, values, fill(cal.labels.moved, { name: event.title, when: whereTo(event, landing.start, cal.locale) }));
|
|
119
|
+
};
|
|
120
|
+
const up = () => {
|
|
121
|
+
finish(true);
|
|
122
|
+
if (!dragged)
|
|
123
|
+
cal.open(event);
|
|
124
|
+
};
|
|
125
|
+
const cancel = () => finish(false);
|
|
126
|
+
const unescape = onEscape(doc, cancel);
|
|
127
|
+
doc.addEventListener('pointermove', move);
|
|
128
|
+
doc.addEventListener('pointerup', up);
|
|
129
|
+
doc.addEventListener('pointercancel', cancel);
|
|
130
|
+
}
|
|
131
|
+
/** Where a record dragged to (x, y) lands: a day's column and the slot under it, or a day (a whole day's record, the month). */
|
|
132
|
+
function landingAt(cal, x, y, event, timed, grabbed, block) {
|
|
133
|
+
const { body, state, slot } = cal;
|
|
134
|
+
const under = cal.doc.elementFromPoint(x, y);
|
|
135
|
+
if (timed) {
|
|
136
|
+
const col = under?.closest('.fd-cal-col');
|
|
137
|
+
if (!col || !body.contains(col))
|
|
138
|
+
return null;
|
|
139
|
+
const column = state.columns[Number(col.dataset['column'])];
|
|
140
|
+
const top = col.getBoundingClientRect().top;
|
|
141
|
+
const length = Math.round((event.end.getTime() - event.start.getTime()) / 60000);
|
|
142
|
+
let minutes = state.shownHours.start * 60 + Math.round(((y - top) / (cal.hour / 60) - grabbed) / slot) * slot;
|
|
143
|
+
minutes = Math.min(Math.max(0, minutes), 24 * 60 - Math.min(length, slot));
|
|
144
|
+
const start = atMinutes(column.day, minutes);
|
|
145
|
+
// It shows where it would land: in that column, at that time.
|
|
146
|
+
if (block.parentElement !== col)
|
|
147
|
+
col.append(block);
|
|
148
|
+
block.style.top = `${(minutes - state.shownHours.start * 60) * (cal.hour / 60)}px`;
|
|
149
|
+
block.style.insetInlineStart = '1px';
|
|
150
|
+
block.style.width = 'calc(100% - 3px)';
|
|
151
|
+
const shownTime = block.querySelector('.fd-cal-event-time');
|
|
152
|
+
if (shownTime)
|
|
153
|
+
shownTime.textContent = cal.time(start);
|
|
154
|
+
return { start, column };
|
|
155
|
+
}
|
|
156
|
+
const cell = under?.closest('[data-day]');
|
|
157
|
+
if (!cell || !body.contains(cell) || cell.classList.contains('fd-cal-col'))
|
|
158
|
+
return null;
|
|
159
|
+
const [y4, mo, d] = (cell.dataset['day'] ?? '').split('-').map(Number);
|
|
160
|
+
const start = new Date(y4, mo - 1, d, event.start.getHours(), event.start.getMinutes());
|
|
161
|
+
if (block.parentElement !== cell)
|
|
162
|
+
cell.append(block);
|
|
163
|
+
const column = cell.dataset['column'] !== undefined ? (state.columns[Number(cell.dataset['column'])] ?? null) : null;
|
|
164
|
+
return { start, column };
|
|
165
|
+
}
|
|
166
|
+
/** Its end dragged: a longer or shorter record, by the slot, never shorter than one; as it was after Escape. */
|
|
167
|
+
export function stretch(cal, e, event, block, col) {
|
|
168
|
+
if (e.button !== 0)
|
|
169
|
+
return;
|
|
170
|
+
e.preventDefault();
|
|
171
|
+
e.stopPropagation();
|
|
172
|
+
const { doc, state, slot } = cal;
|
|
173
|
+
const perMinute = cal.hour / 60;
|
|
174
|
+
const top = col.getBoundingClientRect().top;
|
|
175
|
+
const startMinutes = minutesOf(event.start);
|
|
176
|
+
let end = event.end;
|
|
177
|
+
let moving = false;
|
|
178
|
+
const move = (m) => {
|
|
179
|
+
moving = true;
|
|
180
|
+
block.setAttribute('data-moving', '');
|
|
181
|
+
const minutes = Math.max(startMinutes + slot, Math.min(24 * 60, state.shownHours.start * 60 + Math.round((m.clientY - top) / perMinute / slot) * slot));
|
|
182
|
+
end = atMinutes(event.start, minutes);
|
|
183
|
+
const height = (minutes - startMinutes) * perMinute - 2;
|
|
184
|
+
block.style.height = `${height}px`;
|
|
185
|
+
block.style.setProperty('--fd-cal-lines', String(linesIn(height)));
|
|
186
|
+
};
|
|
187
|
+
const stop = () => {
|
|
188
|
+
doc.removeEventListener('pointermove', move);
|
|
189
|
+
doc.removeEventListener('pointerup', up);
|
|
190
|
+
doc.removeEventListener('pointercancel', cancel);
|
|
191
|
+
unescape();
|
|
192
|
+
block.removeAttribute('data-moving');
|
|
193
|
+
};
|
|
194
|
+
const up = () => {
|
|
195
|
+
stop();
|
|
196
|
+
if (!moving || end.getTime() === event.end.getTime())
|
|
197
|
+
return cal.draw();
|
|
198
|
+
void cal.commit(event, moved(event, event.start, cal.spec, cal.page, undefined, end), fill(cal.labels.stretched, { name: event.title, when: cal.time(end) }));
|
|
199
|
+
};
|
|
200
|
+
// Taken away by the browser (a touch become a scroll), or Escape: drawn back as it was, and nothing follows the pointer after.
|
|
201
|
+
const cancel = () => {
|
|
202
|
+
stop();
|
|
203
|
+
cal.draw();
|
|
204
|
+
};
|
|
205
|
+
const unescape = onEscape(doc, cancel);
|
|
206
|
+
doc.addEventListener('pointermove', move);
|
|
207
|
+
doc.addEventListener('pointerup', up);
|
|
208
|
+
doc.addEventListener('pointercancel', cancel);
|
|
209
|
+
}
|
|
210
|
+
//# sourceMappingURL=gestures.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gestures.mjs","sourceRoot":"","sources":["../../../../../libs/calendar/src/lib/gestures.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { CalendarCore } from './calendar-core.mjs';
|
|
2
|
+
import type { CalendarEvent } from './events.mjs';
|
|
3
|
+
export declare function onEventKey(cal: CalendarCore, e: KeyboardEvent, event: CalendarEvent, block: HTMLElement, pressed?: boolean): void;
|
|
4
|
+
export declare function onSlotKey(cal: CalendarCore, e: KeyboardEvent, column: number, minutes: number): void;
|
|
5
|
+
export declare function onDayKey(cal: CalendarCore, e: KeyboardEvent, day: Date): void;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { CalendarCore } from './calendar-core';
|
|
2
|
+
import type { CalendarEvent } from './events';
|
|
3
|
+
export declare function onEventKey(cal: CalendarCore, e: KeyboardEvent, event: CalendarEvent, block: HTMLElement, pressed?: boolean): void;
|
|
4
|
+
export declare function onSlotKey(cal: CalendarCore, e: KeyboardEvent, column: number, minutes: number): void;
|
|
5
|
+
export declare function onDayKey(cal: CalendarCore, e: KeyboardEvent, day: Date): void;
|
package/src/lib/keys.js
ADDED
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.onEventKey = onEventKey;
|
|
4
|
+
exports.onSlotKey = onSlotKey;
|
|
5
|
+
exports.onDayKey = onDayKey;
|
|
6
|
+
const dates_1 = require("./dates");
|
|
7
|
+
/**
|
|
8
|
+
* A calendar's keys. On a record: Enter opens it, M (or the menu key, or
|
|
9
|
+
* Shift+F10) opens Move to…, up and down reach the record before or after,
|
|
10
|
+
* left and right the day or person beside. On the slots: the arrows move a
|
|
11
|
+
* slot or a column, Home and End to the first and last hour, Page Up and
|
|
12
|
+
* Page Down a span, Enter makes a record there. On a month's days: the arrows
|
|
13
|
+
* move a day or a week, Home and End to the week's ends, Page Up and Page
|
|
14
|
+
* Down a month. Left and right go as the line reads, so they flip right to
|
|
15
|
+
* left.
|
|
16
|
+
*/
|
|
17
|
+
const sideways = (cal, key) => (key === 'ArrowRight' ? 1 : key === 'ArrowLeft' ? -1 : 0) * (cal.rtl() ? -1 : 1);
|
|
18
|
+
function onEventKey(cal, e, event, block, pressed = false) {
|
|
19
|
+
if (!pressed && e.target !== block)
|
|
20
|
+
return;
|
|
21
|
+
const { body, state } = cal;
|
|
22
|
+
const movable = !!block.closest('.fd-cal-event')?.hasAttribute('data-moves');
|
|
23
|
+
if (e.key === 'Enter' || e.key === ' ') {
|
|
24
|
+
e.preventDefault();
|
|
25
|
+
if (cal.canOpen)
|
|
26
|
+
cal.open(event);
|
|
27
|
+
else if (movable)
|
|
28
|
+
cal.openMove(event, block);
|
|
29
|
+
}
|
|
30
|
+
else if (movable && (e.key === 'm' || e.key === 'M' || e.key === 'ContextMenu' || (e.key === 'F10' && e.shiftKey))) {
|
|
31
|
+
e.preventDefault();
|
|
32
|
+
cal.openMove(event, block);
|
|
33
|
+
}
|
|
34
|
+
else if (e.key === 'ArrowUp' || e.key === 'ArrowDown' || e.key === 'ArrowLeft' || e.key === 'ArrowRight') {
|
|
35
|
+
e.preventDefault();
|
|
36
|
+
// In a crowded slot's list: the one before or after, in it alone.
|
|
37
|
+
const list = block.closest('.fd-cal-crowd');
|
|
38
|
+
if (list) {
|
|
39
|
+
const rows = [...list.querySelectorAll('[data-focus^="e:"]')];
|
|
40
|
+
rows[rows.indexOf(block) + (e.key === 'ArrowUp' ? -1 : e.key === 'ArrowDown' ? 1 : sideways(cal, e.key))]?.focus();
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
const all = [...body.querySelectorAll('[data-focus^="e:"][tabindex="0"]')];
|
|
44
|
+
if (state.view === 'agenda' || state.view === 'month' || (!e.key.includes('Left') && !e.key.includes('Right'))) {
|
|
45
|
+
// Up and down: the record before or after, in the order they are read.
|
|
46
|
+
const step = e.key === 'ArrowUp' ? -1 : e.key === 'ArrowDown' ? 1 : sideways(cal, e.key);
|
|
47
|
+
if (state.view === 'day' || state.view === 'week') {
|
|
48
|
+
const here = all.filter((b) => b.parentElement === block.parentElement).sort((a, b) => a.offsetTop - b.offsetTop || all.indexOf(a) - all.indexOf(b));
|
|
49
|
+
here[here.indexOf(block) + step]?.focus();
|
|
50
|
+
}
|
|
51
|
+
else
|
|
52
|
+
all[all.indexOf(block) + step]?.focus();
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
// Left and right: the day or person beside, at the same time.
|
|
56
|
+
const col = block.closest('[data-column]');
|
|
57
|
+
const next = Number(col?.dataset['column'] ?? 0) + sideways(cal, e.key);
|
|
58
|
+
const minutes = cal.clampMinutes((0, dates_1.minutesOf)(event.start));
|
|
59
|
+
const target = body.querySelector(`[data-focus="s:${next}:${minutes}"]`) ?? body.querySelector(`[data-column="${next}"] [data-focus^="e:"][tabindex="0"]`);
|
|
60
|
+
target?.focus();
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
function onSlotKey(cal, e, column, minutes) {
|
|
64
|
+
const { body, state, slot } = cal;
|
|
65
|
+
let next = { column, minutes };
|
|
66
|
+
if (e.key === 'ArrowUp')
|
|
67
|
+
next.minutes -= slot;
|
|
68
|
+
else if (e.key === 'ArrowDown')
|
|
69
|
+
next.minutes += slot;
|
|
70
|
+
else if (e.key === 'ArrowLeft' || e.key === 'ArrowRight')
|
|
71
|
+
next.column += sideways(cal, e.key);
|
|
72
|
+
else if (e.key === 'Home')
|
|
73
|
+
next.minutes = state.shownHours.start * 60;
|
|
74
|
+
else if (e.key === 'End')
|
|
75
|
+
next.minutes = state.shownHours.end * 60 - slot;
|
|
76
|
+
else if (e.key === 'PageUp' || e.key === 'PageDown') {
|
|
77
|
+
e.preventDefault();
|
|
78
|
+
state.cursor = { ...state.cursor, day: (0, dates_1.stepFrom)(state.view, state.columns[column].day, e.key === 'PageUp' ? -1 : 1), minutes };
|
|
79
|
+
state.anchor = (0, dates_1.startOfDay)(state.cursor.day);
|
|
80
|
+
void cal.reload().then(() => body.querySelector('.fd-cal-slot[tabindex="0"]')?.focus());
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
else if (e.key === 'Enter' || e.key === ' ') {
|
|
84
|
+
e.preventDefault();
|
|
85
|
+
const col = state.columns[column];
|
|
86
|
+
void cal.createAt((0, dates_1.atMinutes)(col.day, minutes), null, col);
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
else
|
|
90
|
+
return;
|
|
91
|
+
e.preventDefault();
|
|
92
|
+
// Past the first or the last column: the span before or after.
|
|
93
|
+
if (next.column < 0 || next.column >= state.columns.length) {
|
|
94
|
+
if (state.view === 'day' && cal.spec.resource)
|
|
95
|
+
return;
|
|
96
|
+
const by = next.column < 0 ? -1 : 1;
|
|
97
|
+
const day = (0, dates_1.addDays)(state.columns[column].day, by);
|
|
98
|
+
state.cursor = { day, minutes, column: by < 0 ? 6 : 0 };
|
|
99
|
+
state.anchor = (0, dates_1.startOfDay)(day);
|
|
100
|
+
void cal.reload().then(() => body.querySelector('.fd-cal-slot[tabindex="0"]')?.focus());
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
next = { column: next.column, minutes: cal.clampMinutes(next.minutes) };
|
|
104
|
+
const target = body.querySelector(`[data-focus="s:${next.column}:${next.minutes}"]`);
|
|
105
|
+
if (!target)
|
|
106
|
+
return;
|
|
107
|
+
for (const cell of body.querySelectorAll('.fd-cal-slot[tabindex="0"]'))
|
|
108
|
+
cell.tabIndex = -1;
|
|
109
|
+
target.tabIndex = 0;
|
|
110
|
+
target.focus();
|
|
111
|
+
target.scrollIntoView?.({ block: 'nearest', inline: 'nearest' });
|
|
112
|
+
}
|
|
113
|
+
function onDayKey(cal, e, day) {
|
|
114
|
+
const { body, state, firstDay } = cal;
|
|
115
|
+
let by;
|
|
116
|
+
if (e.key === 'ArrowLeft' || e.key === 'ArrowRight')
|
|
117
|
+
by = sideways(cal, e.key);
|
|
118
|
+
else if (e.key === 'ArrowUp')
|
|
119
|
+
by = -7;
|
|
120
|
+
else if (e.key === 'ArrowDown')
|
|
121
|
+
by = 7;
|
|
122
|
+
else if (e.key === 'Home')
|
|
123
|
+
by = -((day.getDay() - firstDay + 7) % 7);
|
|
124
|
+
else if (e.key === 'End')
|
|
125
|
+
by = 6 - ((day.getDay() - firstDay + 7) % 7);
|
|
126
|
+
else if (e.key === 'PageUp' || e.key === 'PageDown') {
|
|
127
|
+
e.preventDefault();
|
|
128
|
+
const next = (0, dates_1.stepFrom)('month', day, e.key === 'PageUp' ? -1 : 1);
|
|
129
|
+
state.cursor = { ...state.cursor, day: next };
|
|
130
|
+
state.anchor = (0, dates_1.startOfDay)(next);
|
|
131
|
+
void cal.reload().then(() => body.querySelector(`[data-focus="d:${(0, dates_1.dayKey)(next)}"]`)?.focus());
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
else
|
|
135
|
+
return;
|
|
136
|
+
e.preventDefault();
|
|
137
|
+
const next = (0, dates_1.addDays)(day, by);
|
|
138
|
+
state.cursor = { ...state.cursor, day: next };
|
|
139
|
+
const target = body.querySelector(`[data-focus="d:${(0, dates_1.dayKey)(next)}"]`);
|
|
140
|
+
if (target) {
|
|
141
|
+
for (const n of body.querySelectorAll('.fd-cal-daynum[tabindex="0"]'))
|
|
142
|
+
n.tabIndex = -1;
|
|
143
|
+
target.tabIndex = 0;
|
|
144
|
+
target.focus();
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
// Into the month before or after.
|
|
148
|
+
state.anchor = (0, dates_1.startOfDay)(next);
|
|
149
|
+
void cal.reload().then(() => body.querySelector(`[data-focus="d:${(0, dates_1.dayKey)(next)}"]`)?.focus());
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=keys.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keys.js","sourceRoot":"","sources":["../../../../../libs/calendar/src/lib/keys.ts"],"names":[],"mappings":"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"}
|
package/src/lib/keys.mjs
ADDED
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { addDays, atMinutes, dayKey, minutesOf, startOfDay, stepFrom } from './dates.mjs';
|
|
2
|
+
/**
|
|
3
|
+
* A calendar's keys. On a record: Enter opens it, M (or the menu key, or
|
|
4
|
+
* Shift+F10) opens Move to…, up and down reach the record before or after,
|
|
5
|
+
* left and right the day or person beside. On the slots: the arrows move a
|
|
6
|
+
* slot or a column, Home and End to the first and last hour, Page Up and
|
|
7
|
+
* Page Down a span, Enter makes a record there. On a month's days: the arrows
|
|
8
|
+
* move a day or a week, Home and End to the week's ends, Page Up and Page
|
|
9
|
+
* Down a month. Left and right go as the line reads, so they flip right to
|
|
10
|
+
* left.
|
|
11
|
+
*/
|
|
12
|
+
const sideways = (cal, key) => (key === 'ArrowRight' ? 1 : key === 'ArrowLeft' ? -1 : 0) * (cal.rtl() ? -1 : 1);
|
|
13
|
+
export function onEventKey(cal, e, event, block, pressed = false) {
|
|
14
|
+
if (!pressed && e.target !== block)
|
|
15
|
+
return;
|
|
16
|
+
const { body, state } = cal;
|
|
17
|
+
const movable = !!block.closest('.fd-cal-event')?.hasAttribute('data-moves');
|
|
18
|
+
if (e.key === 'Enter' || e.key === ' ') {
|
|
19
|
+
e.preventDefault();
|
|
20
|
+
if (cal.canOpen)
|
|
21
|
+
cal.open(event);
|
|
22
|
+
else if (movable)
|
|
23
|
+
cal.openMove(event, block);
|
|
24
|
+
}
|
|
25
|
+
else if (movable && (e.key === 'm' || e.key === 'M' || e.key === 'ContextMenu' || (e.key === 'F10' && e.shiftKey))) {
|
|
26
|
+
e.preventDefault();
|
|
27
|
+
cal.openMove(event, block);
|
|
28
|
+
}
|
|
29
|
+
else if (e.key === 'ArrowUp' || e.key === 'ArrowDown' || e.key === 'ArrowLeft' || e.key === 'ArrowRight') {
|
|
30
|
+
e.preventDefault();
|
|
31
|
+
// In a crowded slot's list: the one before or after, in it alone.
|
|
32
|
+
const list = block.closest('.fd-cal-crowd');
|
|
33
|
+
if (list) {
|
|
34
|
+
const rows = [...list.querySelectorAll('[data-focus^="e:"]')];
|
|
35
|
+
rows[rows.indexOf(block) + (e.key === 'ArrowUp' ? -1 : e.key === 'ArrowDown' ? 1 : sideways(cal, e.key))]?.focus();
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
const all = [...body.querySelectorAll('[data-focus^="e:"][tabindex="0"]')];
|
|
39
|
+
if (state.view === 'agenda' || state.view === 'month' || (!e.key.includes('Left') && !e.key.includes('Right'))) {
|
|
40
|
+
// Up and down: the record before or after, in the order they are read.
|
|
41
|
+
const step = e.key === 'ArrowUp' ? -1 : e.key === 'ArrowDown' ? 1 : sideways(cal, e.key);
|
|
42
|
+
if (state.view === 'day' || state.view === 'week') {
|
|
43
|
+
const here = all.filter((b) => b.parentElement === block.parentElement).sort((a, b) => a.offsetTop - b.offsetTop || all.indexOf(a) - all.indexOf(b));
|
|
44
|
+
here[here.indexOf(block) + step]?.focus();
|
|
45
|
+
}
|
|
46
|
+
else
|
|
47
|
+
all[all.indexOf(block) + step]?.focus();
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
// Left and right: the day or person beside, at the same time.
|
|
51
|
+
const col = block.closest('[data-column]');
|
|
52
|
+
const next = Number(col?.dataset['column'] ?? 0) + sideways(cal, e.key);
|
|
53
|
+
const minutes = cal.clampMinutes(minutesOf(event.start));
|
|
54
|
+
const target = body.querySelector(`[data-focus="s:${next}:${minutes}"]`) ?? body.querySelector(`[data-column="${next}"] [data-focus^="e:"][tabindex="0"]`);
|
|
55
|
+
target?.focus();
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
export function onSlotKey(cal, e, column, minutes) {
|
|
59
|
+
const { body, state, slot } = cal;
|
|
60
|
+
let next = { column, minutes };
|
|
61
|
+
if (e.key === 'ArrowUp')
|
|
62
|
+
next.minutes -= slot;
|
|
63
|
+
else if (e.key === 'ArrowDown')
|
|
64
|
+
next.minutes += slot;
|
|
65
|
+
else if (e.key === 'ArrowLeft' || e.key === 'ArrowRight')
|
|
66
|
+
next.column += sideways(cal, e.key);
|
|
67
|
+
else if (e.key === 'Home')
|
|
68
|
+
next.minutes = state.shownHours.start * 60;
|
|
69
|
+
else if (e.key === 'End')
|
|
70
|
+
next.minutes = state.shownHours.end * 60 - slot;
|
|
71
|
+
else if (e.key === 'PageUp' || e.key === 'PageDown') {
|
|
72
|
+
e.preventDefault();
|
|
73
|
+
state.cursor = { ...state.cursor, day: stepFrom(state.view, state.columns[column].day, e.key === 'PageUp' ? -1 : 1), minutes };
|
|
74
|
+
state.anchor = startOfDay(state.cursor.day);
|
|
75
|
+
void cal.reload().then(() => body.querySelector('.fd-cal-slot[tabindex="0"]')?.focus());
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
else if (e.key === 'Enter' || e.key === ' ') {
|
|
79
|
+
e.preventDefault();
|
|
80
|
+
const col = state.columns[column];
|
|
81
|
+
void cal.createAt(atMinutes(col.day, minutes), null, col);
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
else
|
|
85
|
+
return;
|
|
86
|
+
e.preventDefault();
|
|
87
|
+
// Past the first or the last column: the span before or after.
|
|
88
|
+
if (next.column < 0 || next.column >= state.columns.length) {
|
|
89
|
+
if (state.view === 'day' && cal.spec.resource)
|
|
90
|
+
return;
|
|
91
|
+
const by = next.column < 0 ? -1 : 1;
|
|
92
|
+
const day = addDays(state.columns[column].day, by);
|
|
93
|
+
state.cursor = { day, minutes, column: by < 0 ? 6 : 0 };
|
|
94
|
+
state.anchor = startOfDay(day);
|
|
95
|
+
void cal.reload().then(() => body.querySelector('.fd-cal-slot[tabindex="0"]')?.focus());
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
next = { column: next.column, minutes: cal.clampMinutes(next.minutes) };
|
|
99
|
+
const target = body.querySelector(`[data-focus="s:${next.column}:${next.minutes}"]`);
|
|
100
|
+
if (!target)
|
|
101
|
+
return;
|
|
102
|
+
for (const cell of body.querySelectorAll('.fd-cal-slot[tabindex="0"]'))
|
|
103
|
+
cell.tabIndex = -1;
|
|
104
|
+
target.tabIndex = 0;
|
|
105
|
+
target.focus();
|
|
106
|
+
target.scrollIntoView?.({ block: 'nearest', inline: 'nearest' });
|
|
107
|
+
}
|
|
108
|
+
export function onDayKey(cal, e, day) {
|
|
109
|
+
const { body, state, firstDay } = cal;
|
|
110
|
+
let by;
|
|
111
|
+
if (e.key === 'ArrowLeft' || e.key === 'ArrowRight')
|
|
112
|
+
by = sideways(cal, e.key);
|
|
113
|
+
else if (e.key === 'ArrowUp')
|
|
114
|
+
by = -7;
|
|
115
|
+
else if (e.key === 'ArrowDown')
|
|
116
|
+
by = 7;
|
|
117
|
+
else if (e.key === 'Home')
|
|
118
|
+
by = -((day.getDay() - firstDay + 7) % 7);
|
|
119
|
+
else if (e.key === 'End')
|
|
120
|
+
by = 6 - ((day.getDay() - firstDay + 7) % 7);
|
|
121
|
+
else if (e.key === 'PageUp' || e.key === 'PageDown') {
|
|
122
|
+
e.preventDefault();
|
|
123
|
+
const next = stepFrom('month', day, e.key === 'PageUp' ? -1 : 1);
|
|
124
|
+
state.cursor = { ...state.cursor, day: next };
|
|
125
|
+
state.anchor = startOfDay(next);
|
|
126
|
+
void cal.reload().then(() => body.querySelector(`[data-focus="d:${dayKey(next)}"]`)?.focus());
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
else
|
|
130
|
+
return;
|
|
131
|
+
e.preventDefault();
|
|
132
|
+
const next = addDays(day, by);
|
|
133
|
+
state.cursor = { ...state.cursor, day: next };
|
|
134
|
+
const target = body.querySelector(`[data-focus="d:${dayKey(next)}"]`);
|
|
135
|
+
if (target) {
|
|
136
|
+
for (const n of body.querySelectorAll('.fd-cal-daynum[tabindex="0"]'))
|
|
137
|
+
n.tabIndex = -1;
|
|
138
|
+
target.tabIndex = 0;
|
|
139
|
+
target.focus();
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
// Into the month before or after.
|
|
143
|
+
state.anchor = startOfDay(next);
|
|
144
|
+
void cal.reload().then(() => body.querySelector(`[data-focus="d:${dayKey(next)}"]`)?.focus());
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=keys.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keys.mjs","sourceRoot":"","sources":["../../../../../libs/calendar/src/lib/keys.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import type { CalendarView, Locale } from '@fieldia/core';
|
|
2
|
+
/** The words a calendar shows itself. `{name}`, `{when}`, `{n}` are filled in where they stand. */
|
|
3
|
+
export interface CalendarLabels {
|
|
4
|
+
/** Its name on the list's switcher, and for a screen reader. */
|
|
5
|
+
calendar: string;
|
|
6
|
+
today: string;
|
|
7
|
+
previous: Record<CalendarView, string>;
|
|
8
|
+
next: Record<CalendarView, string>;
|
|
9
|
+
views: Record<CalendarView, string>;
|
|
10
|
+
/** The group of Day, Week, Month and Agenda, for a screen reader. */
|
|
11
|
+
showAs: string;
|
|
12
|
+
/** The group of Today, back and on. */
|
|
13
|
+
moveThrough: string;
|
|
14
|
+
newRecord: string;
|
|
15
|
+
allDay: string;
|
|
16
|
+
/** The hours' column head, for a screen reader. */
|
|
17
|
+
time: string;
|
|
18
|
+
loadFailed: string;
|
|
19
|
+
retry: string;
|
|
20
|
+
nothing: string;
|
|
21
|
+
/** Under a month's day with more than it shows: "+2 more". */
|
|
22
|
+
more: string;
|
|
23
|
+
/** The same, said in full: "2 more on Wednesday 14 October". */
|
|
24
|
+
moreOn: string;
|
|
25
|
+
/** The column of records with no one. */
|
|
26
|
+
noResource: string;
|
|
27
|
+
tooMany: string;
|
|
28
|
+
/** How long a record is: "10:00 to 10:30". */
|
|
29
|
+
fromTo: string;
|
|
30
|
+
/** Who a record is with: "with Dr Karim". */
|
|
31
|
+
withWho: string;
|
|
32
|
+
/** Said of a slot nothing takes. */
|
|
33
|
+
free: string;
|
|
34
|
+
/** How many a slot holds: "1 record", "{n} records". */
|
|
35
|
+
holds: string;
|
|
36
|
+
holdsOne: string;
|
|
37
|
+
keysOpen: string;
|
|
38
|
+
keysMove: string;
|
|
39
|
+
keysOpenMove: string;
|
|
40
|
+
keysSlots: string;
|
|
41
|
+
keysDays: string;
|
|
42
|
+
moveTo: string;
|
|
43
|
+
moveTitle: string;
|
|
44
|
+
moveDay: string;
|
|
45
|
+
moveTime: string;
|
|
46
|
+
move: string;
|
|
47
|
+
cancel: string;
|
|
48
|
+
/** Move to…'s day refused: no day, or one far from the record's ("0026", "2062"). */
|
|
49
|
+
badDay: string;
|
|
50
|
+
badTime: string;
|
|
51
|
+
moved: string;
|
|
52
|
+
stretched: string;
|
|
53
|
+
undo: string;
|
|
54
|
+
undone: string;
|
|
55
|
+
close: string;
|
|
56
|
+
notMoved: string;
|
|
57
|
+
/** Why a record cannot be moved, when its source gives no reason of its own. */
|
|
58
|
+
cannotMove: string;
|
|
59
|
+
saving: string;
|
|
60
|
+
}
|
|
61
|
+
export declare const CALENDAR_LABELS: Record<Locale, CalendarLabels>;
|
|
62
|
+
/** The calendar's words in a page's language, the app's own over them. */
|
|
63
|
+
export declare function calendarLabels(locale: Locale, own?: Partial<CalendarLabels>): CalendarLabels;
|
|
64
|
+
/** Words with their `{name}`s filled in. */
|
|
65
|
+
export declare const fill: (words: string, values: Record<string, string | number>) => string;
|