@fieldia/calendar 0.0.0-stage → 0.22.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,136 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PALETTE = exports.kindOf = void 0;
|
|
4
|
+
exports.keyOf = keyOf;
|
|
5
|
+
exports.eventsOf = eventsOf;
|
|
6
|
+
exports.colourOf = colourOf;
|
|
7
|
+
exports.sideBySide = sideBySide;
|
|
8
|
+
exports.moved = moved;
|
|
9
|
+
exports.whereTo = whereTo;
|
|
10
|
+
exports.comma = comma;
|
|
11
|
+
const widgets_1 = require("@fieldia/widgets");
|
|
12
|
+
const dates_1 = require("./dates");
|
|
13
|
+
/** A link's id, or a value as it is, as a key. */
|
|
14
|
+
function keyOf(value) {
|
|
15
|
+
if (value === null || value === undefined || value === '' || value === false)
|
|
16
|
+
return null;
|
|
17
|
+
if (typeof value === 'object' && !Array.isArray(value) && 'id' in value)
|
|
18
|
+
return String(value.id);
|
|
19
|
+
return String(value);
|
|
20
|
+
}
|
|
21
|
+
/** The kind of moment a calendar's start keeps: a day, or a day and a time. */
|
|
22
|
+
const kindOf = (page, spec) => (page.fields[spec.start]?.type === 'date' ? 'date' : 'datetime');
|
|
23
|
+
exports.kindOf = kindOf;
|
|
24
|
+
/** Each record with a start as an event: an hour long with no end (or an end before its start), a whole day for a date. */
|
|
25
|
+
function eventsOf(records, spec, page, locale) {
|
|
26
|
+
const kind = (0, exports.kindOf)(page, spec);
|
|
27
|
+
const say = (name, values) => (name && page.fields[name] ? (0, widgets_1.displayValue)(page.fields[name], values[name], values, locale) : '');
|
|
28
|
+
const events = [];
|
|
29
|
+
for (const record of records) {
|
|
30
|
+
const values = record.values;
|
|
31
|
+
const start = (0, dates_1.readWhen)(values[spec.start], kind);
|
|
32
|
+
if (!start)
|
|
33
|
+
continue;
|
|
34
|
+
const given = spec.end ? (0, dates_1.readWhen)(values[spec.end], kind) : null;
|
|
35
|
+
let end;
|
|
36
|
+
if (kind === 'date')
|
|
37
|
+
end = (0, dates_1.addDays)(given && given >= start ? given : start, 1);
|
|
38
|
+
else
|
|
39
|
+
end = given && given > start ? given : (0, dates_1.addMinutes)(start, 60);
|
|
40
|
+
const allDay = kind === 'date' || ((0, dates_1.minutesOf)(start) === 0 && (0, dates_1.minutesOf)(end) === 0 && (0, dates_1.daysBetween)(start, end) >= 1);
|
|
41
|
+
events.push({
|
|
42
|
+
id: record.id,
|
|
43
|
+
record,
|
|
44
|
+
title: say(spec.title, values) || String(record.id),
|
|
45
|
+
start,
|
|
46
|
+
end,
|
|
47
|
+
allDay,
|
|
48
|
+
resource: spec.resource ? keyOf(values[spec.resource]) : null,
|
|
49
|
+
resourceLabel: say(spec.resource, values),
|
|
50
|
+
colour: spec.colour ? keyOf(values[spec.colour]) : null,
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
return events.sort((a, b) => a.start.getTime() - b.start.getTime() || b.end.getTime() - a.end.getTime());
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Eight colours that read on a light page and a dark one alike, each drawn as
|
|
57
|
+
* a tint of the surface with a bar of its own: the same value, the same one.
|
|
58
|
+
*/
|
|
59
|
+
exports.PALETTE = ['#2563eb', '#0d9488', '#c2410c', '#be185d', '#7c3aed', '#15803d', '#0e7490', '#a16207'];
|
|
60
|
+
/** A value's colour: one it names itself (#rrggbb), else one of the palette's, the same for the same value. */
|
|
61
|
+
function colourOf(key) {
|
|
62
|
+
if (key === null)
|
|
63
|
+
return null;
|
|
64
|
+
if (/^#[0-9a-fA-F]{6}$/.test(key))
|
|
65
|
+
return key;
|
|
66
|
+
let hash = 0;
|
|
67
|
+
for (const char of key)
|
|
68
|
+
hash = (hash * 31 + (char.codePointAt(0) ?? 0)) >>> 0;
|
|
69
|
+
return exports.PALETTE[hash % exports.PALETTE.length];
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Events that meet, side by side: each crowd (events joined by meeting one
|
|
73
|
+
* another) shares its width, each event in the first place free when it
|
|
74
|
+
* starts; one that meets none takes the whole width.
|
|
75
|
+
*/
|
|
76
|
+
function sideBySide(events) {
|
|
77
|
+
const placed = new Map();
|
|
78
|
+
const sorted = [...events].sort((a, b) => a.start.getTime() - b.start.getTime() || b.end.getTime() - a.end.getTime());
|
|
79
|
+
let crowd = [];
|
|
80
|
+
let crowdEnds = 0;
|
|
81
|
+
/** When each place in the crowd is free again. */
|
|
82
|
+
let free = [];
|
|
83
|
+
const close = () => {
|
|
84
|
+
for (const { id, column } of crowd)
|
|
85
|
+
placed.set(id, { column, columns: free.length });
|
|
86
|
+
crowd = [];
|
|
87
|
+
free = [];
|
|
88
|
+
};
|
|
89
|
+
for (const event of sorted) {
|
|
90
|
+
const start = event.start.getTime();
|
|
91
|
+
if (crowd.length && start >= crowdEnds)
|
|
92
|
+
close();
|
|
93
|
+
let column = free.findIndex((until) => until <= start);
|
|
94
|
+
if (column === -1)
|
|
95
|
+
column = free.push(0) - 1;
|
|
96
|
+
free[column] = event.end.getTime();
|
|
97
|
+
crowd.push({ id: event.id, column });
|
|
98
|
+
crowdEnds = Math.max(crowd.length === 1 ? 0 : crowdEnds, event.end.getTime());
|
|
99
|
+
}
|
|
100
|
+
close();
|
|
101
|
+
return placed;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* The values a move writes: its start where it lands (its length kept), or
|
|
105
|
+
* its end alone when stretched (`end`), and its person when it lands in
|
|
106
|
+
* another's column.
|
|
107
|
+
*/
|
|
108
|
+
function moved(event, start, spec, page, resource, end) {
|
|
109
|
+
const kind = (0, exports.kindOf)(page, spec);
|
|
110
|
+
const values = {};
|
|
111
|
+
if (end) {
|
|
112
|
+
if (spec.end)
|
|
113
|
+
values[spec.end] = (0, dates_1.writeWhen)(kind === 'date' ? (0, dates_1.addDays)((0, dates_1.startOfDay)(end), -1) : end, kind);
|
|
114
|
+
return values;
|
|
115
|
+
}
|
|
116
|
+
if (start.getTime() !== event.start.getTime()) {
|
|
117
|
+
values[spec.start] = (0, dates_1.writeWhen)(start, kind);
|
|
118
|
+
if (spec.end) {
|
|
119
|
+
const until = kind === 'date' ? (0, dates_1.addDays)(start, (0, dates_1.daysBetween)(event.start, event.end) - 1) : (0, dates_1.addMinutes)(start, (event.end.getTime() - event.start.getTime()) / 60000);
|
|
120
|
+
values[spec.end] = (0, dates_1.writeWhen)(until, kind);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
if (resource && spec.resource && resource.key !== event.resource)
|
|
124
|
+
values[spec.resource] = resource.value;
|
|
125
|
+
return values;
|
|
126
|
+
}
|
|
127
|
+
/** Where a move lands, in words: "Wed 14 Oct, 11:15", or the day alone for a whole day's; its year too, when it leaves the record's own. */
|
|
128
|
+
function whereTo(event, start, locale) {
|
|
129
|
+
const day = (0, dates_1.format)(locale, { weekday: 'short', day: 'numeric', month: 'short', ...(start.getFullYear() !== event.start.getFullYear() ? { year: 'numeric' } : {}) }).format(start);
|
|
130
|
+
return event.allDay ? day : `${day}${comma(locale)}${(0, dates_1.format)(locale, { hour: '2-digit', minute: '2-digit', hourCycle: 'h23' }).format(start)}`;
|
|
131
|
+
}
|
|
132
|
+
/** What joins the parts of a sentence as the language writes it: ", ", or in Arabic its own comma, "، ". */
|
|
133
|
+
function comma(locale) {
|
|
134
|
+
return locale.split('-')[0] === 'ar' ? '، ' : ', ';
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../../../../libs/calendar/src/lib/events.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { displayValue } from '@fieldia/widgets';
|
|
2
|
+
import { addDays, addMinutes, daysBetween, format, minutesOf, readWhen, startOfDay, writeWhen } from './dates.mjs';
|
|
3
|
+
/** A link's id, or a value as it is, as a key. */
|
|
4
|
+
export function keyOf(value) {
|
|
5
|
+
if (value === null || value === undefined || value === '' || value === false)
|
|
6
|
+
return null;
|
|
7
|
+
if (typeof value === 'object' && !Array.isArray(value) && 'id' in value)
|
|
8
|
+
return String(value.id);
|
|
9
|
+
return String(value);
|
|
10
|
+
}
|
|
11
|
+
/** The kind of moment a calendar's start keeps: a day, or a day and a time. */
|
|
12
|
+
export const kindOf = (page, spec) => (page.fields[spec.start]?.type === 'date' ? 'date' : 'datetime');
|
|
13
|
+
/** Each record with a start as an event: an hour long with no end (or an end before its start), a whole day for a date. */
|
|
14
|
+
export function eventsOf(records, spec, page, locale) {
|
|
15
|
+
const kind = kindOf(page, spec);
|
|
16
|
+
const say = (name, values) => (name && page.fields[name] ? displayValue(page.fields[name], values[name], values, locale) : '');
|
|
17
|
+
const events = [];
|
|
18
|
+
for (const record of records) {
|
|
19
|
+
const values = record.values;
|
|
20
|
+
const start = readWhen(values[spec.start], kind);
|
|
21
|
+
if (!start)
|
|
22
|
+
continue;
|
|
23
|
+
const given = spec.end ? readWhen(values[spec.end], kind) : null;
|
|
24
|
+
let end;
|
|
25
|
+
if (kind === 'date')
|
|
26
|
+
end = addDays(given && given >= start ? given : start, 1);
|
|
27
|
+
else
|
|
28
|
+
end = given && given > start ? given : addMinutes(start, 60);
|
|
29
|
+
const allDay = kind === 'date' || (minutesOf(start) === 0 && minutesOf(end) === 0 && daysBetween(start, end) >= 1);
|
|
30
|
+
events.push({
|
|
31
|
+
id: record.id,
|
|
32
|
+
record,
|
|
33
|
+
title: say(spec.title, values) || String(record.id),
|
|
34
|
+
start,
|
|
35
|
+
end,
|
|
36
|
+
allDay,
|
|
37
|
+
resource: spec.resource ? keyOf(values[spec.resource]) : null,
|
|
38
|
+
resourceLabel: say(spec.resource, values),
|
|
39
|
+
colour: spec.colour ? keyOf(values[spec.colour]) : null,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
return events.sort((a, b) => a.start.getTime() - b.start.getTime() || b.end.getTime() - a.end.getTime());
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Eight colours that read on a light page and a dark one alike, each drawn as
|
|
46
|
+
* a tint of the surface with a bar of its own: the same value, the same one.
|
|
47
|
+
*/
|
|
48
|
+
export const PALETTE = ['#2563eb', '#0d9488', '#c2410c', '#be185d', '#7c3aed', '#15803d', '#0e7490', '#a16207'];
|
|
49
|
+
/** A value's colour: one it names itself (#rrggbb), else one of the palette's, the same for the same value. */
|
|
50
|
+
export function colourOf(key) {
|
|
51
|
+
if (key === null)
|
|
52
|
+
return null;
|
|
53
|
+
if (/^#[0-9a-fA-F]{6}$/.test(key))
|
|
54
|
+
return key;
|
|
55
|
+
let hash = 0;
|
|
56
|
+
for (const char of key)
|
|
57
|
+
hash = (hash * 31 + (char.codePointAt(0) ?? 0)) >>> 0;
|
|
58
|
+
return PALETTE[hash % PALETTE.length];
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Events that meet, side by side: each crowd (events joined by meeting one
|
|
62
|
+
* another) shares its width, each event in the first place free when it
|
|
63
|
+
* starts; one that meets none takes the whole width.
|
|
64
|
+
*/
|
|
65
|
+
export function sideBySide(events) {
|
|
66
|
+
const placed = new Map();
|
|
67
|
+
const sorted = [...events].sort((a, b) => a.start.getTime() - b.start.getTime() || b.end.getTime() - a.end.getTime());
|
|
68
|
+
let crowd = [];
|
|
69
|
+
let crowdEnds = 0;
|
|
70
|
+
/** When each place in the crowd is free again. */
|
|
71
|
+
let free = [];
|
|
72
|
+
const close = () => {
|
|
73
|
+
for (const { id, column } of crowd)
|
|
74
|
+
placed.set(id, { column, columns: free.length });
|
|
75
|
+
crowd = [];
|
|
76
|
+
free = [];
|
|
77
|
+
};
|
|
78
|
+
for (const event of sorted) {
|
|
79
|
+
const start = event.start.getTime();
|
|
80
|
+
if (crowd.length && start >= crowdEnds)
|
|
81
|
+
close();
|
|
82
|
+
let column = free.findIndex((until) => until <= start);
|
|
83
|
+
if (column === -1)
|
|
84
|
+
column = free.push(0) - 1;
|
|
85
|
+
free[column] = event.end.getTime();
|
|
86
|
+
crowd.push({ id: event.id, column });
|
|
87
|
+
crowdEnds = Math.max(crowd.length === 1 ? 0 : crowdEnds, event.end.getTime());
|
|
88
|
+
}
|
|
89
|
+
close();
|
|
90
|
+
return placed;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* The values a move writes: its start where it lands (its length kept), or
|
|
94
|
+
* its end alone when stretched (`end`), and its person when it lands in
|
|
95
|
+
* another's column.
|
|
96
|
+
*/
|
|
97
|
+
export function moved(event, start, spec, page, resource, end) {
|
|
98
|
+
const kind = kindOf(page, spec);
|
|
99
|
+
const values = {};
|
|
100
|
+
if (end) {
|
|
101
|
+
if (spec.end)
|
|
102
|
+
values[spec.end] = writeWhen(kind === 'date' ? addDays(startOfDay(end), -1) : end, kind);
|
|
103
|
+
return values;
|
|
104
|
+
}
|
|
105
|
+
if (start.getTime() !== event.start.getTime()) {
|
|
106
|
+
values[spec.start] = writeWhen(start, kind);
|
|
107
|
+
if (spec.end) {
|
|
108
|
+
const until = kind === 'date' ? addDays(start, daysBetween(event.start, event.end) - 1) : addMinutes(start, (event.end.getTime() - event.start.getTime()) / 60000);
|
|
109
|
+
values[spec.end] = writeWhen(until, kind);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
if (resource && spec.resource && resource.key !== event.resource)
|
|
113
|
+
values[spec.resource] = resource.value;
|
|
114
|
+
return values;
|
|
115
|
+
}
|
|
116
|
+
/** Where a move lands, in words: "Wed 14 Oct, 11:15", or the day alone for a whole day's; its year too, when it leaves the record's own. */
|
|
117
|
+
export function whereTo(event, start, locale) {
|
|
118
|
+
const day = format(locale, { weekday: 'short', day: 'numeric', month: 'short', ...(start.getFullYear() !== event.start.getFullYear() ? { year: 'numeric' } : {}) }).format(start);
|
|
119
|
+
return event.allDay ? day : `${day}${comma(locale)}${format(locale, { hour: '2-digit', minute: '2-digit', hourCycle: 'h23' }).format(start)}`;
|
|
120
|
+
}
|
|
121
|
+
/** What joins the parts of a sentence as the language writes it: ", ", or in Arabic its own comma, "، ". */
|
|
122
|
+
export function comma(locale) {
|
|
123
|
+
return locale.split('-')[0] === 'ar' ? '، ' : ', ';
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=events.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.mjs","sourceRoot":"","sources":["../../../../../libs/calendar/src/lib/events.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type CalendarCore } from './calendar-core.mjs';
|
|
2
|
+
import { type CalendarEvent } from './events.mjs';
|
|
3
|
+
/** A press on an empty slot: a new record there, or, dragged down or up, over the slots it crossed; none after Escape. */
|
|
4
|
+
export declare function pressSlot(cal: CalendarCore, e: PointerEvent, col: HTMLElement, i: number): void;
|
|
5
|
+
/**
|
|
6
|
+
* A press on a record: a click opens it; a drag moves it — to another time, day or person — where it is let go,
|
|
7
|
+
* by the slot; Escape while dragging puts it back. A drag of one that cannot move goes nowhere, and opens nothing.
|
|
8
|
+
*/
|
|
9
|
+
export declare function pressEvent(cal: CalendarCore, e: PointerEvent, event: CalendarEvent, block: HTMLElement, movable: boolean): void;
|
|
10
|
+
/** Its end dragged: a longer or shorter record, by the slot, never shorter than one; as it was after Escape. */
|
|
11
|
+
export declare function stretch(cal: CalendarCore, e: PointerEvent, event: CalendarEvent, block: HTMLElement, col: HTMLElement): void;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type CalendarCore } from './calendar-core';
|
|
2
|
+
import { type CalendarEvent } from './events';
|
|
3
|
+
/** A press on an empty slot: a new record there, or, dragged down or up, over the slots it crossed; none after Escape. */
|
|
4
|
+
export declare function pressSlot(cal: CalendarCore, e: PointerEvent, col: HTMLElement, i: number): void;
|
|
5
|
+
/**
|
|
6
|
+
* A press on a record: a click opens it; a drag moves it — to another time, day or person — where it is let go,
|
|
7
|
+
* by the slot; Escape while dragging puts it back. A drag of one that cannot move goes nowhere, and opens nothing.
|
|
8
|
+
*/
|
|
9
|
+
export declare function pressEvent(cal: CalendarCore, e: PointerEvent, event: CalendarEvent, block: HTMLElement, movable: boolean): void;
|
|
10
|
+
/** Its end dragged: a longer or shorter record, by the slot, never shorter than one; as it was after Escape. */
|
|
11
|
+
export declare function stretch(cal: CalendarCore, e: PointerEvent, event: CalendarEvent, block: HTMLElement, col: HTMLElement): void;
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.pressSlot = pressSlot;
|
|
4
|
+
exports.pressEvent = pressEvent;
|
|
5
|
+
exports.stretch = stretch;
|
|
6
|
+
const calendar_core_1 = require("./calendar-core");
|
|
7
|
+
const dates_1 = require("./dates");
|
|
8
|
+
const events_1 = require("./events");
|
|
9
|
+
const labels_1 = require("./labels");
|
|
10
|
+
/**
|
|
11
|
+
* A calendar's pointer: an empty slot pressed or dragged across for a new
|
|
12
|
+
* record, a record dragged to another time, day or person, and its end
|
|
13
|
+
* stretched. Each drag follows the pointer over the whole document until it
|
|
14
|
+
* is let go.
|
|
15
|
+
*/
|
|
16
|
+
/** How far a press moves before it is a drag rather than a click. */
|
|
17
|
+
const DRAG_FROM = 4;
|
|
18
|
+
/** Escape while a drag is held: `cancel` lets go of it, the key kept from anything else (a dialog round the calendar). */
|
|
19
|
+
function onEscape(doc, cancel) {
|
|
20
|
+
const escape = (k) => {
|
|
21
|
+
if (k.key !== 'Escape')
|
|
22
|
+
return;
|
|
23
|
+
k.preventDefault();
|
|
24
|
+
k.stopPropagation();
|
|
25
|
+
cancel();
|
|
26
|
+
};
|
|
27
|
+
doc.addEventListener('keydown', escape, true);
|
|
28
|
+
return () => doc.removeEventListener('keydown', escape, true);
|
|
29
|
+
}
|
|
30
|
+
/** A press on an empty slot: a new record there, or, dragged down or up, over the slots it crossed; none after Escape. */
|
|
31
|
+
function pressSlot(cal, e, col, i) {
|
|
32
|
+
const { doc, state, slot } = cal;
|
|
33
|
+
const target = e.target;
|
|
34
|
+
if (e.button !== 0 || !target.classList.contains('fd-cal-slot'))
|
|
35
|
+
return;
|
|
36
|
+
e.preventDefault();
|
|
37
|
+
const perMinute = cal.hour / 60;
|
|
38
|
+
const top = col.getBoundingClientRect().top;
|
|
39
|
+
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);
|
|
40
|
+
const first = Number(target.dataset['minutes']);
|
|
41
|
+
let last = first;
|
|
42
|
+
const picking = cal.make('div', { class: 'fd-cal-picking' });
|
|
43
|
+
const drawPick = () => {
|
|
44
|
+
const [a, b] = [Math.min(first, last), Math.max(first, last) + slot];
|
|
45
|
+
picking.style.top = `${(a - state.shownHours.start * 60) * perMinute}px`;
|
|
46
|
+
picking.style.height = `${(b - a) * perMinute}px`;
|
|
47
|
+
};
|
|
48
|
+
drawPick();
|
|
49
|
+
col.append(picking);
|
|
50
|
+
const move = (m) => {
|
|
51
|
+
last = minutesAt(m.clientY);
|
|
52
|
+
drawPick();
|
|
53
|
+
};
|
|
54
|
+
const stop = () => {
|
|
55
|
+
doc.removeEventListener('pointermove', move);
|
|
56
|
+
doc.removeEventListener('pointerup', up);
|
|
57
|
+
doc.removeEventListener('pointercancel', stop);
|
|
58
|
+
unescape();
|
|
59
|
+
picking.remove();
|
|
60
|
+
};
|
|
61
|
+
const unescape = onEscape(doc, stop);
|
|
62
|
+
const up = () => {
|
|
63
|
+
stop();
|
|
64
|
+
const column = state.columns[i];
|
|
65
|
+
const [a, b] = [Math.min(first, last), Math.max(first, last) + slot];
|
|
66
|
+
const dragged = a !== first || b !== first + slot;
|
|
67
|
+
void cal.createAt((0, dates_1.atMinutes)(column.day, a), dragged ? (0, dates_1.atMinutes)(column.day, b) : null, column);
|
|
68
|
+
};
|
|
69
|
+
doc.addEventListener('pointermove', move);
|
|
70
|
+
doc.addEventListener('pointerup', up);
|
|
71
|
+
doc.addEventListener('pointercancel', stop);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* A press on a record: a click opens it; a drag moves it — to another time, day or person — where it is let go,
|
|
75
|
+
* by the slot; Escape while dragging puts it back. A drag of one that cannot move goes nowhere, and opens nothing.
|
|
76
|
+
*/
|
|
77
|
+
function pressEvent(cal, e, event, block, movable) {
|
|
78
|
+
if (e.button !== 0)
|
|
79
|
+
return;
|
|
80
|
+
if (e.target.closest('.fd-cal-resize, .fd-cal-event-menu'))
|
|
81
|
+
return;
|
|
82
|
+
e.stopPropagation();
|
|
83
|
+
const { doc, state } = cal;
|
|
84
|
+
const startX = e.clientX;
|
|
85
|
+
const startY = e.clientY;
|
|
86
|
+
const home = block.parentElement;
|
|
87
|
+
const timedHere = home.classList.contains('fd-cal-col');
|
|
88
|
+
const homeTop = timedHere ? home.getBoundingClientRect().top : 0;
|
|
89
|
+
/** Minutes between the record's start (on this day) and where it was taken hold of. */
|
|
90
|
+
const day = new Date(`${(block.dataset['focus'] ?? '').split(':').pop()}T00:00:00`);
|
|
91
|
+
const segStart = cal.segment(event, day)?.start ?? event.start;
|
|
92
|
+
const grabbed = timedHere ? Math.round((startY - homeTop) / (cal.hour / 60)) - ((0, dates_1.minutesOf)(segStart) - state.shownHours.start * 60) : 0;
|
|
93
|
+
/** How far into the record this day's part begins: a record from the night before is taken by its morning's part. */
|
|
94
|
+
const into = Math.round((segStart.getTime() - event.start.getTime()) / 60000);
|
|
95
|
+
let moving = false;
|
|
96
|
+
let dragged = false;
|
|
97
|
+
let landing = null;
|
|
98
|
+
const move = (m) => {
|
|
99
|
+
if (!moving && Math.hypot(m.clientX - startX, m.clientY - startY) < DRAG_FROM)
|
|
100
|
+
return;
|
|
101
|
+
dragged = true;
|
|
102
|
+
if (!movable)
|
|
103
|
+
return;
|
|
104
|
+
if (!moving) {
|
|
105
|
+
moving = true;
|
|
106
|
+
block.setAttribute('data-moving', '');
|
|
107
|
+
}
|
|
108
|
+
landing = landingAt(cal, m.clientX, m.clientY, event, timedHere, grabbed, block);
|
|
109
|
+
if (landing && into)
|
|
110
|
+
landing = { ...landing, start: (0, dates_1.addMinutes)(landing.start, -into) };
|
|
111
|
+
};
|
|
112
|
+
const finish = (commitIt) => {
|
|
113
|
+
doc.removeEventListener('pointermove', move);
|
|
114
|
+
doc.removeEventListener('pointerup', up);
|
|
115
|
+
doc.removeEventListener('pointercancel', cancel);
|
|
116
|
+
unescape();
|
|
117
|
+
if (!moving)
|
|
118
|
+
return;
|
|
119
|
+
block.removeAttribute('data-moving');
|
|
120
|
+
if (!commitIt || !landing)
|
|
121
|
+
return cal.draw();
|
|
122
|
+
const values = (0, events_1.moved)(event, landing.start, cal.spec, cal.page, landing.column?.resource ?? undefined);
|
|
123
|
+
void cal.commit(event, values, (0, labels_1.fill)(cal.labels.moved, { name: event.title, when: (0, events_1.whereTo)(event, landing.start, cal.locale) }));
|
|
124
|
+
};
|
|
125
|
+
const up = () => {
|
|
126
|
+
finish(true);
|
|
127
|
+
if (!dragged)
|
|
128
|
+
cal.open(event);
|
|
129
|
+
};
|
|
130
|
+
const cancel = () => finish(false);
|
|
131
|
+
const unescape = onEscape(doc, cancel);
|
|
132
|
+
doc.addEventListener('pointermove', move);
|
|
133
|
+
doc.addEventListener('pointerup', up);
|
|
134
|
+
doc.addEventListener('pointercancel', cancel);
|
|
135
|
+
}
|
|
136
|
+
/** 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). */
|
|
137
|
+
function landingAt(cal, x, y, event, timed, grabbed, block) {
|
|
138
|
+
const { body, state, slot } = cal;
|
|
139
|
+
const under = cal.doc.elementFromPoint(x, y);
|
|
140
|
+
if (timed) {
|
|
141
|
+
const col = under?.closest('.fd-cal-col');
|
|
142
|
+
if (!col || !body.contains(col))
|
|
143
|
+
return null;
|
|
144
|
+
const column = state.columns[Number(col.dataset['column'])];
|
|
145
|
+
const top = col.getBoundingClientRect().top;
|
|
146
|
+
const length = Math.round((event.end.getTime() - event.start.getTime()) / 60000);
|
|
147
|
+
let minutes = state.shownHours.start * 60 + Math.round(((y - top) / (cal.hour / 60) - grabbed) / slot) * slot;
|
|
148
|
+
minutes = Math.min(Math.max(0, minutes), 24 * 60 - Math.min(length, slot));
|
|
149
|
+
const start = (0, dates_1.atMinutes)(column.day, minutes);
|
|
150
|
+
// It shows where it would land: in that column, at that time.
|
|
151
|
+
if (block.parentElement !== col)
|
|
152
|
+
col.append(block);
|
|
153
|
+
block.style.top = `${(minutes - state.shownHours.start * 60) * (cal.hour / 60)}px`;
|
|
154
|
+
block.style.insetInlineStart = '1px';
|
|
155
|
+
block.style.width = 'calc(100% - 3px)';
|
|
156
|
+
const shownTime = block.querySelector('.fd-cal-event-time');
|
|
157
|
+
if (shownTime)
|
|
158
|
+
shownTime.textContent = cal.time(start);
|
|
159
|
+
return { start, column };
|
|
160
|
+
}
|
|
161
|
+
const cell = under?.closest('[data-day]');
|
|
162
|
+
if (!cell || !body.contains(cell) || cell.classList.contains('fd-cal-col'))
|
|
163
|
+
return null;
|
|
164
|
+
const [y4, mo, d] = (cell.dataset['day'] ?? '').split('-').map(Number);
|
|
165
|
+
const start = new Date(y4, mo - 1, d, event.start.getHours(), event.start.getMinutes());
|
|
166
|
+
if (block.parentElement !== cell)
|
|
167
|
+
cell.append(block);
|
|
168
|
+
const column = cell.dataset['column'] !== undefined ? (state.columns[Number(cell.dataset['column'])] ?? null) : null;
|
|
169
|
+
return { start, column };
|
|
170
|
+
}
|
|
171
|
+
/** Its end dragged: a longer or shorter record, by the slot, never shorter than one; as it was after Escape. */
|
|
172
|
+
function stretch(cal, e, event, block, col) {
|
|
173
|
+
if (e.button !== 0)
|
|
174
|
+
return;
|
|
175
|
+
e.preventDefault();
|
|
176
|
+
e.stopPropagation();
|
|
177
|
+
const { doc, state, slot } = cal;
|
|
178
|
+
const perMinute = cal.hour / 60;
|
|
179
|
+
const top = col.getBoundingClientRect().top;
|
|
180
|
+
const startMinutes = (0, dates_1.minutesOf)(event.start);
|
|
181
|
+
let end = event.end;
|
|
182
|
+
let moving = false;
|
|
183
|
+
const move = (m) => {
|
|
184
|
+
moving = true;
|
|
185
|
+
block.setAttribute('data-moving', '');
|
|
186
|
+
const minutes = Math.max(startMinutes + slot, Math.min(24 * 60, state.shownHours.start * 60 + Math.round((m.clientY - top) / perMinute / slot) * slot));
|
|
187
|
+
end = (0, dates_1.atMinutes)(event.start, minutes);
|
|
188
|
+
const height = (minutes - startMinutes) * perMinute - 2;
|
|
189
|
+
block.style.height = `${height}px`;
|
|
190
|
+
block.style.setProperty('--fd-cal-lines', String((0, calendar_core_1.linesIn)(height)));
|
|
191
|
+
};
|
|
192
|
+
const stop = () => {
|
|
193
|
+
doc.removeEventListener('pointermove', move);
|
|
194
|
+
doc.removeEventListener('pointerup', up);
|
|
195
|
+
doc.removeEventListener('pointercancel', cancel);
|
|
196
|
+
unescape();
|
|
197
|
+
block.removeAttribute('data-moving');
|
|
198
|
+
};
|
|
199
|
+
const up = () => {
|
|
200
|
+
stop();
|
|
201
|
+
if (!moving || end.getTime() === event.end.getTime())
|
|
202
|
+
return cal.draw();
|
|
203
|
+
void cal.commit(event, (0, events_1.moved)(event, event.start, cal.spec, cal.page, undefined, end), (0, labels_1.fill)(cal.labels.stretched, { name: event.title, when: cal.time(end) }));
|
|
204
|
+
};
|
|
205
|
+
// Taken away by the browser (a touch become a scroll), or Escape: drawn back as it was, and nothing follows the pointer after.
|
|
206
|
+
const cancel = () => {
|
|
207
|
+
stop();
|
|
208
|
+
cal.draw();
|
|
209
|
+
};
|
|
210
|
+
const unescape = onEscape(doc, cancel);
|
|
211
|
+
doc.addEventListener('pointermove', move);
|
|
212
|
+
doc.addEventListener('pointerup', up);
|
|
213
|
+
doc.addEventListener('pointercancel', cancel);
|
|
214
|
+
}
|
|
215
|
+
//# sourceMappingURL=gestures.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gestures.js","sourceRoot":"","sources":["../../../../../libs/calendar/src/lib/gestures.ts"],"names":[],"mappings":"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"}
|