@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.
Files changed (75) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +125 -2
  3. package/package.json +37 -3
  4. package/src/index.d.mts +3 -0
  5. package/src/index.d.ts +3 -0
  6. package/src/index.js +6 -0
  7. package/src/index.js.map +1 -0
  8. package/src/index.mjs +2 -0
  9. package/src/index.mjs.map +1 -0
  10. package/src/lib/calendar-core.d.mts +83 -0
  11. package/src/lib/calendar-core.d.ts +83 -0
  12. package/src/lib/calendar-core.js +18 -0
  13. package/src/lib/calendar-core.js.map +1 -0
  14. package/src/lib/calendar-core.mjs +13 -0
  15. package/src/lib/calendar-core.mjs.map +1 -0
  16. package/src/lib/calendar-view.d.mts +11 -0
  17. package/src/lib/calendar-view.d.ts +11 -0
  18. package/src/lib/calendar-view.js +829 -0
  19. package/src/lib/calendar-view.js.map +1 -0
  20. package/src/lib/calendar-view.mjs +826 -0
  21. package/src/lib/calendar-view.mjs.map +1 -0
  22. package/src/lib/dates.d.mts +43 -0
  23. package/src/lib/dates.d.ts +43 -0
  24. package/src/lib/dates.js +100 -0
  25. package/src/lib/dates.js.map +1 -0
  26. package/src/lib/dates.mjs +80 -0
  27. package/src/lib/dates.mjs.map +1 -0
  28. package/src/lib/events.d.mts +58 -0
  29. package/src/lib/events.d.ts +58 -0
  30. package/src/lib/events.js +136 -0
  31. package/src/lib/events.js.map +1 -0
  32. package/src/lib/events.mjs +125 -0
  33. package/src/lib/events.mjs.map +1 -0
  34. package/src/lib/gestures.d.mts +11 -0
  35. package/src/lib/gestures.d.ts +11 -0
  36. package/src/lib/gestures.js +215 -0
  37. package/src/lib/gestures.js.map +1 -0
  38. package/src/lib/gestures.mjs +210 -0
  39. package/src/lib/gestures.mjs.map +1 -0
  40. package/src/lib/keys.d.mts +5 -0
  41. package/src/lib/keys.d.ts +5 -0
  42. package/src/lib/keys.js +151 -0
  43. package/src/lib/keys.js.map +1 -0
  44. package/src/lib/keys.mjs +146 -0
  45. package/src/lib/keys.mjs.map +1 -0
  46. package/src/lib/labels.d.mts +65 -0
  47. package/src/lib/labels.d.ts +65 -0
  48. package/src/lib/labels.js +193 -0
  49. package/src/lib/labels.js.map +1 -0
  50. package/src/lib/labels.mjs +188 -0
  51. package/src/lib/labels.mjs.map +1 -0
  52. package/src/lib/list-view.d.mts +11 -0
  53. package/src/lib/list-view.d.ts +11 -0
  54. package/src/lib/list-view.js +54 -0
  55. package/src/lib/list-view.js.map +1 -0
  56. package/src/lib/list-view.mjs +51 -0
  57. package/src/lib/list-view.mjs.map +1 -0
  58. package/src/lib/move-to.d.mts +15 -0
  59. package/src/lib/move-to.d.ts +15 -0
  60. package/src/lib/move-to.js +122 -0
  61. package/src/lib/move-to.js.map +1 -0
  62. package/src/lib/move-to.mjs +118 -0
  63. package/src/lib/move-to.mjs.map +1 -0
  64. package/src/lib/settings.d.mts +11 -0
  65. package/src/lib/settings.d.ts +11 -0
  66. package/src/lib/settings.js +3 -0
  67. package/src/lib/settings.js.map +1 -0
  68. package/src/lib/settings.mjs +2 -0
  69. package/src/lib/settings.mjs.map +1 -0
  70. package/src/lib/styles.d.mts +9 -0
  71. package/src/lib/styles.d.ts +9 -0
  72. package/src/lib/styles.js +165 -0
  73. package/src/lib/styles.js.map +1 -0
  74. package/src/lib/styles.mjs +161 -0
  75. 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;
@@ -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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"}
@@ -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;