@umriss-ui/schedule 0.43.0 → 0.44.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/CHANGELOG.md +15 -0
- package/README.md +2 -0
- package/dist/index.d.ts +4 -33
- package/dist/schedule.js +1051 -1032
- package/docs/llms-full.md +131 -41
- package/package.json +5 -5
package/dist/schedule.js
CHANGED
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import "./schedule.css";
|
|
3
|
-
import { localOffset as
|
|
4
|
-
import { useContext as
|
|
5
|
-
import { jsxs as N, Fragment as
|
|
6
|
-
import { useFormats as
|
|
7
|
-
function
|
|
3
|
+
import { localOffset as Kt, toWorkingTimeClamped as H, calendarFrom as vt, toWallClock as Vt, MINUTE as q, DAY as U, timeStep as bs, workingTimeTicks as Ms, HOUR as jt, LinearScale as Ts, resolveColours as Ss, removedIntervals as Is, subscribeTheme as Ls } from "@umriss-ui/charts";
|
|
4
|
+
import { useContext as Ge, createContext as He, useRef as V, useEffect as j, useId as As, useState as at, useLayoutEffect as pt, useImperativeHandle as Cs, useSyncExternalStore as Ye, useMemo as W, createElement as Ds } from "react";
|
|
5
|
+
import { jsxs as N, Fragment as lt, jsx as m } from "react/jsx-runtime";
|
|
6
|
+
import { useFormats as Wt, useWording as yt, Skeleton as _s, AngleGlyph as Os, VisuallyHidden as ve, createLongPress as Fs } from "@umriss-ui/core";
|
|
7
|
+
function nt(s) {
|
|
8
8
|
return { from: s.from - (s.leadIn ?? 0), to: s.to + (s.leadOut ?? 0) };
|
|
9
9
|
}
|
|
10
|
-
function
|
|
10
|
+
function zt(s, t) {
|
|
11
11
|
return (s.leaves ?? "leadOut") === "main" ? t.to : t.to + (t.leadOut ?? 0);
|
|
12
12
|
}
|
|
13
|
-
function
|
|
13
|
+
function Ut(s, t) {
|
|
14
14
|
return (s.arrives ?? "leadIn") === "main" ? t.from : t.from - (t.leadIn ?? 0);
|
|
15
15
|
}
|
|
16
|
-
function
|
|
16
|
+
function ye(s, t) {
|
|
17
17
|
if (t.kind === "place" || t.subtask !== s.id) return s;
|
|
18
18
|
switch (t.kind) {
|
|
19
19
|
case "move":
|
|
@@ -27,7 +27,7 @@ function ve(s, t) {
|
|
|
27
27
|
return { ...s, lane: t.lane };
|
|
28
28
|
}
|
|
29
29
|
}
|
|
30
|
-
function
|
|
30
|
+
function Fi(s, t) {
|
|
31
31
|
return {
|
|
32
32
|
id: t,
|
|
33
33
|
task: s.task,
|
|
@@ -38,22 +38,22 @@ function xi(s, t) {
|
|
|
38
38
|
...s.leadOut === void 0 ? {} : { leadOut: s.leadOut }
|
|
39
39
|
};
|
|
40
40
|
}
|
|
41
|
-
function
|
|
41
|
+
function Xt(s) {
|
|
42
42
|
const t = [], e = /* @__PURE__ */ new Map();
|
|
43
|
-
s.forEach((
|
|
44
|
-
const { from: o, to: r } =
|
|
43
|
+
s.forEach((i, n) => {
|
|
44
|
+
const { from: o, to: r } = nt(i);
|
|
45
45
|
if (!(o < r)) return;
|
|
46
|
-
const a = e.get(
|
|
47
|
-
a.push({ subtask:
|
|
46
|
+
const a = e.get(i.lane) ?? [];
|
|
47
|
+
a.push({ subtask: i, index: n, from: o, to: r }), e.set(i.lane, a);
|
|
48
48
|
});
|
|
49
|
-
for (const [
|
|
50
|
-
|
|
51
|
-
for (let o = 0; o <
|
|
52
|
-
const r =
|
|
53
|
-
for (let a = o + 1; a <
|
|
54
|
-
const l =
|
|
49
|
+
for (const [i, n] of e) {
|
|
50
|
+
n.sort((o, r) => o.from - r.from || o.index - r.index);
|
|
51
|
+
for (let o = 0; o < n.length; o++) {
|
|
52
|
+
const r = n[o];
|
|
53
|
+
for (let a = o + 1; a < n.length; a++) {
|
|
54
|
+
const l = n[a];
|
|
55
55
|
if (l.from >= r.to) break;
|
|
56
|
-
t.push({ lane:
|
|
56
|
+
t.push({ lane: i, first: r.subtask.id, second: l.subtask.id, from: l.from, to: Math.min(r.to, l.to) });
|
|
57
57
|
}
|
|
58
58
|
}
|
|
59
59
|
}
|
|
@@ -61,372 +61,361 @@ function Ut(s) {
|
|
|
61
61
|
}
|
|
62
62
|
function Es(s) {
|
|
63
63
|
const t = /* @__PURE__ */ new Map(), e = /* @__PURE__ */ new Map();
|
|
64
|
-
for (const
|
|
65
|
-
const
|
|
64
|
+
for (const i of s) {
|
|
65
|
+
const n = nt(i), o = e.get(i.lane) ?? [];
|
|
66
66
|
let r = 0;
|
|
67
|
-
if (
|
|
68
|
-
for (const a of o)
|
|
69
|
-
o.push(
|
|
67
|
+
if (n.from < n.to) {
|
|
68
|
+
for (const a of o) n.from < a.to && a.from < n.to && r++;
|
|
69
|
+
o.push(n);
|
|
70
70
|
}
|
|
71
|
-
e.set(
|
|
71
|
+
e.set(i.lane, o), t.set(i.id, r);
|
|
72
72
|
}
|
|
73
73
|
return t;
|
|
74
74
|
}
|
|
75
|
-
function
|
|
76
|
-
const e = new Map(s.map((
|
|
77
|
-
for (const
|
|
78
|
-
const o = e.get(
|
|
75
|
+
function qt(s, t) {
|
|
76
|
+
const e = new Map(s.map((n) => [n.id, n])), i = [];
|
|
77
|
+
for (const n of t) {
|
|
78
|
+
const o = e.get(n.from), r = e.get(n.to);
|
|
79
79
|
if (o === void 0 || r === void 0) continue;
|
|
80
|
-
const a =
|
|
81
|
-
d > 0 &&
|
|
80
|
+
const a = zt(n, o), l = Ut(n, r), d = a + n.lag - l;
|
|
81
|
+
d > 0 && i.push({ dependency: n.id, departure: a, arrival: l, shortBy: d });
|
|
82
82
|
}
|
|
83
|
-
return
|
|
83
|
+
return i;
|
|
84
84
|
}
|
|
85
|
-
function
|
|
85
|
+
function Ke(s, t) {
|
|
86
86
|
const e = [];
|
|
87
|
-
for (const
|
|
88
|
-
const
|
|
87
|
+
for (const i of s) {
|
|
88
|
+
const n = nt(i);
|
|
89
89
|
for (const o of t)
|
|
90
|
-
o.lane !==
|
|
90
|
+
o.lane !== i.lane || !(n.from < o.to && o.from < n.to) || e.push({ subtask: i.id, blocked: o.id, lane: o.lane, from: Math.max(n.from, o.from), to: Math.min(n.to, o.to) });
|
|
91
91
|
}
|
|
92
92
|
return e;
|
|
93
93
|
}
|
|
94
|
-
function
|
|
94
|
+
function Ei(s, t, e = []) {
|
|
95
95
|
return {
|
|
96
|
-
overlaps:
|
|
97
|
-
violatedDependencies:
|
|
98
|
-
inBlockedTime:
|
|
96
|
+
overlaps: Xt(s),
|
|
97
|
+
violatedDependencies: qt(s, t),
|
|
98
|
+
inBlockedTime: Ke(s, e)
|
|
99
99
|
};
|
|
100
100
|
}
|
|
101
|
-
function
|
|
101
|
+
function $i(s, t, e) {
|
|
102
102
|
if (e.kind === "place") return [];
|
|
103
|
-
const
|
|
103
|
+
const i = new Map(s.map((l) => [l.id, ye(l, e)])), n = /* @__PURE__ */ new Map();
|
|
104
104
|
for (const l of t) {
|
|
105
|
-
const d =
|
|
106
|
-
d.push(l),
|
|
105
|
+
const d = n.get(l.from) ?? [];
|
|
106
|
+
d.push(l), n.set(l.from, d);
|
|
107
107
|
}
|
|
108
108
|
const o = /* @__PURE__ */ new Map(), r = [e.subtask];
|
|
109
109
|
let a = (s.length + 1) * (t.length + 1);
|
|
110
110
|
for (; r.length > 0 && a-- > 0; ) {
|
|
111
|
-
const l = r.shift(), d =
|
|
111
|
+
const l = r.shift(), d = i.get(l);
|
|
112
112
|
if (d !== void 0)
|
|
113
|
-
for (const h of
|
|
113
|
+
for (const h of n.get(l) ?? []) {
|
|
114
114
|
if (h.to === e.subtask) continue;
|
|
115
|
-
const
|
|
116
|
-
if (
|
|
117
|
-
const f =
|
|
115
|
+
const c = i.get(h.to);
|
|
116
|
+
if (c === void 0) continue;
|
|
117
|
+
const f = zt(h, d) + h.lag - Ut(h, c);
|
|
118
118
|
if (!(f > 0)) continue;
|
|
119
|
-
const g = { kind: "move", subtask:
|
|
120
|
-
|
|
119
|
+
const g = { kind: "move", subtask: c.id, from: c.from + f, to: c.to + f };
|
|
120
|
+
i.set(c.id, ye(c, g)), o.set(c.id, g), r.push(c.id);
|
|
121
121
|
}
|
|
122
122
|
}
|
|
123
123
|
return [...o.values()];
|
|
124
124
|
}
|
|
125
|
-
function
|
|
126
|
-
const { step: e, offset:
|
|
125
|
+
function $s(s, t) {
|
|
126
|
+
const { step: e, offset: i } = typeof t == "number" ? { step: t, offset: 0 } : t;
|
|
127
127
|
if (!(e > 0) || !Number.isFinite(s)) return s;
|
|
128
|
-
const
|
|
129
|
-
return
|
|
128
|
+
const n = Kt(s) + i;
|
|
129
|
+
return n + Math.round((s - n) / e) * e;
|
|
130
130
|
}
|
|
131
|
-
function
|
|
132
|
-
return e === 0 || !Number.isFinite(e) ? [] : s.filter((
|
|
131
|
+
function Ri(s, t, e) {
|
|
132
|
+
return e === 0 || !Number.isFinite(e) ? [] : s.filter((i) => i.task === t).map((i) => ({ kind: "move", subtask: i.id, from: i.from + e, to: i.to + e }));
|
|
133
133
|
}
|
|
134
134
|
function wt(s) {
|
|
135
|
-
let t = !1, e = !1,
|
|
135
|
+
let t = !1, e = !1, i = !1, n = !1;
|
|
136
136
|
for (const o of s ?? [])
|
|
137
|
-
o === "provisional" ? (t = !0, e = !1) : o === "fixed" ? (e = !0, t = !1) : o === "muted" ?
|
|
138
|
-
return { dashed: t, hatched: e, muted:
|
|
137
|
+
o === "provisional" ? (t = !0, e = !1) : o === "fixed" ? (e = !0, t = !1) : o === "muted" ? i = !0 : o === "open" && (n = !0);
|
|
138
|
+
return { dashed: t, hatched: e, muted: i, open: n };
|
|
139
139
|
}
|
|
140
|
-
const
|
|
141
|
-
function
|
|
142
|
-
return
|
|
140
|
+
const Ve = /* @__PURE__ */ He(null), je = /* @__PURE__ */ He(null);
|
|
141
|
+
function We() {
|
|
142
|
+
return Ge(je);
|
|
143
143
|
}
|
|
144
|
-
function
|
|
145
|
-
const t =
|
|
144
|
+
function Rs(s) {
|
|
145
|
+
const t = Ge(Ve);
|
|
146
146
|
if (t === null)
|
|
147
147
|
throw new Error(`@umriss-ui/schedule: <${s}> must be used inside a <Schedule>.`);
|
|
148
148
|
return t;
|
|
149
149
|
}
|
|
150
|
-
function
|
|
151
|
-
const o =
|
|
150
|
+
function Jt(s, t, e, i, n) {
|
|
151
|
+
const o = Rs(s), r = V(null);
|
|
152
152
|
j(() => (r.current = e(o, t), () => {
|
|
153
|
-
r.current !== null &&
|
|
153
|
+
r.current !== null && n(o, r.current), r.current = null;
|
|
154
154
|
}), [o]), j(() => {
|
|
155
|
-
r.current !== null &&
|
|
155
|
+
r.current !== null && i(o, r.current, t);
|
|
156
156
|
});
|
|
157
157
|
}
|
|
158
|
-
function
|
|
159
|
-
|
|
158
|
+
function xs(s) {
|
|
159
|
+
Jt("Lane", s, (t, e) => t.registerLane(e), (t, e, i) => t.updateLane(e, i), (t, e) => t.unregisterLane(e));
|
|
160
160
|
}
|
|
161
|
-
function
|
|
162
|
-
|
|
161
|
+
function Bs(s) {
|
|
162
|
+
Jt("LaneGroup", s, (t, e) => t.registerGroup(e), (t, e, i) => t.updateGroup(e, i), (t, e) => t.unregisterGroup(e));
|
|
163
163
|
}
|
|
164
164
|
function bt(s, t) {
|
|
165
|
-
|
|
165
|
+
Jt(s, t, (e, i) => e.registerLayer(i), (e, i, n) => e.updateLayer(i, n), (e, i) => e.unregisterLayer(i));
|
|
166
166
|
}
|
|
167
|
-
|
|
168
|
-
try {
|
|
169
|
-
return process.env.NODE_ENV !== "production";
|
|
170
|
-
} catch {
|
|
171
|
-
return !1;
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
const $s = Bs(), ye = /* @__PURE__ */ new Set();
|
|
175
|
-
function We(s, t) {
|
|
176
|
-
!$s || ye.has(s) || (ye.add(s), console.warn(`@umriss-ui/schedule: ${t}`));
|
|
177
|
-
}
|
|
178
|
-
const Gs = (s, t) => We(`deprecated:${s}`, `${s} is deprecated and goes in the next minor release; use ${t}.`), ze = 24, Hs = 4, Ys = 3, Ft = 4;
|
|
167
|
+
const ze = 24, Ns = 4, Ps = 3, Et = 4;
|
|
179
168
|
function we(s) {
|
|
180
|
-
const { lanes: t, groups: e, collapsed:
|
|
181
|
-
const
|
|
182
|
-
let
|
|
183
|
-
const
|
|
184
|
-
for (;
|
|
185
|
-
|
|
186
|
-
return
|
|
169
|
+
const { lanes: t, groups: e, collapsed: i, laneHeight: n, headHeight: o = ze } = s, r = new Map(e.map((w) => [w.id, w])), a = (w) => w !== void 0 && r.has(w) ? w : void 0, l = /* @__PURE__ */ new Map(), d = (w) => {
|
|
170
|
+
const M = [];
|
|
171
|
+
let T = a(w.parent);
|
|
172
|
+
const F = /* @__PURE__ */ new Set();
|
|
173
|
+
for (; T !== void 0 && !F.has(T); )
|
|
174
|
+
F.add(T), M.unshift(T), T = a(r.get(T).parent);
|
|
175
|
+
return M;
|
|
187
176
|
}, h = /* @__PURE__ */ new Map();
|
|
188
|
-
for (const
|
|
189
|
-
const
|
|
190
|
-
h.set(
|
|
191
|
-
for (const
|
|
192
|
-
const
|
|
193
|
-
|
|
177
|
+
for (const w of t) {
|
|
178
|
+
const M = d(w);
|
|
179
|
+
h.set(w.id, M);
|
|
180
|
+
for (const T of M) {
|
|
181
|
+
const F = l.get(T) ?? [];
|
|
182
|
+
F.push(w.id), l.set(T, F);
|
|
194
183
|
}
|
|
195
184
|
}
|
|
196
|
-
const
|
|
197
|
-
let g = [], v = null,
|
|
198
|
-
const
|
|
185
|
+
const c = [], f = /* @__PURE__ */ new Map();
|
|
186
|
+
let g = [], v = null, A = 0;
|
|
187
|
+
const I = (w) => (c.push({ ...w, top: A }), A += w.height, c.length - 1), L = (w) => w.find((M) => i.has(M)), D = () => {
|
|
199
188
|
if (v === null) return;
|
|
200
|
-
const { row:
|
|
201
|
-
|
|
202
|
-
const
|
|
203
|
-
|
|
204
|
-
const
|
|
205
|
-
f.set(
|
|
206
|
-
top:
|
|
207
|
-
height:
|
|
189
|
+
const { row: w, lanes: M } = v, T = c[w], F = Math.max(T.height, M.length * Ns + 2 * Et);
|
|
190
|
+
c[w] = { ...T, height: F }, A += F - T.height;
|
|
191
|
+
const O = F - 2 * Et, x = Math.max(Ps, Math.floor(O / M.length));
|
|
192
|
+
M.forEach((X, ft) => {
|
|
193
|
+
const mt = h.get(X) ?? [];
|
|
194
|
+
f.set(X, {
|
|
195
|
+
top: T.top + Et + ft * x,
|
|
196
|
+
height: x,
|
|
208
197
|
miniature: !0,
|
|
209
|
-
group:
|
|
198
|
+
group: mt[mt.length - 1]
|
|
210
199
|
});
|
|
211
200
|
}), v = null;
|
|
212
201
|
};
|
|
213
|
-
for (const
|
|
214
|
-
const
|
|
215
|
-
if (v !== null &&
|
|
216
|
-
v.lanes.push(
|
|
202
|
+
for (const w of t) {
|
|
203
|
+
const M = (h.get(w.id) ?? []).filter((O) => (l.get(O) ?? []).length > 0), T = L(M);
|
|
204
|
+
if (v !== null && T === v.group) {
|
|
205
|
+
v.lanes.push(w.id);
|
|
217
206
|
continue;
|
|
218
207
|
}
|
|
219
|
-
|
|
220
|
-
const
|
|
221
|
-
g = g.slice(0,
|
|
222
|
-
for (const
|
|
223
|
-
if (g.push(
|
|
224
|
-
|
|
208
|
+
D();
|
|
209
|
+
const F = M.filter((O, x) => g[x] === O).length;
|
|
210
|
+
g = g.slice(0, F);
|
|
211
|
+
for (const O of M.slice(F)) {
|
|
212
|
+
if (g.push(O), O === T) break;
|
|
213
|
+
I({
|
|
225
214
|
kind: "groupHead",
|
|
226
215
|
lane: void 0,
|
|
227
|
-
group:
|
|
216
|
+
group: O,
|
|
228
217
|
depth: g.length - 1,
|
|
229
218
|
within: [...g],
|
|
230
|
-
lanes: (l.get(
|
|
219
|
+
lanes: (l.get(O) ?? []).length,
|
|
231
220
|
height: o
|
|
232
221
|
});
|
|
233
222
|
}
|
|
234
|
-
if (
|
|
235
|
-
const
|
|
223
|
+
if (T !== void 0) {
|
|
224
|
+
const O = M.indexOf(T), x = I({
|
|
236
225
|
kind: "miniature",
|
|
237
226
|
lane: void 0,
|
|
238
|
-
group:
|
|
239
|
-
depth:
|
|
240
|
-
within:
|
|
241
|
-
lanes: (l.get(
|
|
242
|
-
height:
|
|
227
|
+
group: T,
|
|
228
|
+
depth: O,
|
|
229
|
+
within: M.slice(0, O + 1),
|
|
230
|
+
lanes: (l.get(T) ?? []).length,
|
|
231
|
+
height: n
|
|
243
232
|
});
|
|
244
|
-
v = { group:
|
|
233
|
+
v = { group: T, row: x, lanes: [w.id] };
|
|
245
234
|
continue;
|
|
246
235
|
}
|
|
247
|
-
|
|
248
|
-
top:
|
|
249
|
-
height:
|
|
236
|
+
I({ kind: "lane", lane: w.id, group: M[M.length - 1], depth: M.length, within: M, lanes: 1, height: n }), f.set(w.id, {
|
|
237
|
+
top: c[c.length - 1].top,
|
|
238
|
+
height: n,
|
|
250
239
|
miniature: !1,
|
|
251
|
-
group:
|
|
240
|
+
group: M[M.length - 1]
|
|
252
241
|
});
|
|
253
242
|
}
|
|
254
|
-
return
|
|
243
|
+
return D(), { rows: c, slots: f, height: A };
|
|
255
244
|
}
|
|
256
|
-
function
|
|
245
|
+
function Gs(s, t) {
|
|
257
246
|
if (t.size === 0) return s;
|
|
258
247
|
const e = /* @__PURE__ */ new Set();
|
|
259
|
-
for (const
|
|
248
|
+
for (const i of s) t.has(i) || e.add(i);
|
|
260
249
|
return e;
|
|
261
250
|
}
|
|
262
|
-
function
|
|
251
|
+
function st(s, t) {
|
|
263
252
|
if (t < 0 || t >= s.height) return null;
|
|
264
|
-
let e = 0,
|
|
265
|
-
for (; e <=
|
|
266
|
-
const
|
|
267
|
-
if (t < o.top)
|
|
268
|
-
else if (t >= o.top + o.height) e =
|
|
253
|
+
let e = 0, i = s.rows.length - 1;
|
|
254
|
+
for (; e <= i; ) {
|
|
255
|
+
const n = e + i >> 1, o = s.rows[n];
|
|
256
|
+
if (t < o.top) i = n - 1;
|
|
257
|
+
else if (t >= o.top + o.height) e = n + 1;
|
|
269
258
|
else return o;
|
|
270
259
|
}
|
|
271
260
|
return null;
|
|
272
261
|
}
|
|
273
|
-
function
|
|
262
|
+
function Zt(s, t) {
|
|
274
263
|
return s.slots.get(t) ?? null;
|
|
275
264
|
}
|
|
276
|
-
function
|
|
277
|
-
const e =
|
|
265
|
+
function Hs(s, t) {
|
|
266
|
+
const e = st(s, t);
|
|
278
267
|
if (e === null) return null;
|
|
279
268
|
if (e.kind === "lane") return e.lane ?? null;
|
|
280
269
|
if (e.kind === "groupHead") return null;
|
|
281
|
-
for (const [
|
|
282
|
-
if (
|
|
270
|
+
for (const [i, n] of s.slots)
|
|
271
|
+
if (n.miniature && t >= n.top && t < n.top + n.height) return i;
|
|
283
272
|
return null;
|
|
284
273
|
}
|
|
285
|
-
const
|
|
286
|
-
function
|
|
274
|
+
const Ys = 6, Ue = 3, rt = 2, be = 3, Me = 3;
|
|
275
|
+
function $(s, t) {
|
|
287
276
|
return Math.round(s.scale.toPx(H(t, s.calendar)));
|
|
288
277
|
}
|
|
289
278
|
function J(s, t) {
|
|
290
|
-
const e =
|
|
279
|
+
const e = Zt(s.rows, t);
|
|
291
280
|
return e === null ? null : { ...e, top: e.top - s.scrollY };
|
|
292
281
|
}
|
|
293
|
-
function
|
|
282
|
+
function Qt(s, t) {
|
|
294
283
|
const e = J(s, t.lane);
|
|
295
|
-
return e === null ? null : { x:
|
|
284
|
+
return e === null ? null : { x: $(s, t.at), y: e.top + e.height / 2, half: Math.max(2, Math.min(7, e.height * 0.3)) };
|
|
296
285
|
}
|
|
297
286
|
function Te(s, t) {
|
|
298
|
-
return
|
|
287
|
+
return Hs(s.rows, t + s.scrollY);
|
|
299
288
|
}
|
|
300
|
-
function Xe(s, t, e,
|
|
301
|
-
const
|
|
289
|
+
function Xe(s, t, e, i) {
|
|
290
|
+
const n = e.miniature ? 0 : Ys, o = e.miniature ? 0 : Me * be, r = Math.max(e.miniature ? 1 : 4, e.height - 2 * n - o), a = e.top - s.scrollY + Math.floor((e.height - r) / 2), l = nt(t);
|
|
302
291
|
return {
|
|
303
292
|
subtask: t,
|
|
304
293
|
miniature: e.miniature,
|
|
305
|
-
depth:
|
|
306
|
-
y: a + (e.miniature ? 0 : Math.min(
|
|
294
|
+
depth: i,
|
|
295
|
+
y: a + (e.miniature ? 0 : Math.min(i, Me) * be),
|
|
307
296
|
height: r,
|
|
308
|
-
outerFrom:
|
|
309
|
-
mainFrom:
|
|
310
|
-
mainTo:
|
|
311
|
-
outerTo:
|
|
297
|
+
outerFrom: $(s, l.from),
|
|
298
|
+
mainFrom: $(s, t.from),
|
|
299
|
+
mainTo: $(s, t.to),
|
|
300
|
+
outerTo: $(s, l.to)
|
|
312
301
|
};
|
|
313
302
|
}
|
|
314
303
|
function qe(s, t, e) {
|
|
315
304
|
if (e < s.y || e > s.y + s.height) return null;
|
|
316
|
-
const
|
|
317
|
-
return t < s.outerFrom -
|
|
305
|
+
const i = Math.max(0, (6 - (s.outerTo - s.outerFrom)) / 2);
|
|
306
|
+
return t < s.outerFrom - i || t > s.outerTo + i ? null : t < s.mainFrom ? "leadIn" : t > s.mainTo ? "leadOut" : "main";
|
|
318
307
|
}
|
|
319
|
-
function
|
|
308
|
+
function Ks(s, t, e, i = 5) {
|
|
320
309
|
if (e < s.y || e > s.y + s.height) return null;
|
|
321
|
-
const
|
|
322
|
-
return Math.min(
|
|
310
|
+
const n = Math.abs(t - s.mainFrom), o = Math.abs(t - s.mainTo);
|
|
311
|
+
return Math.min(n, o) > i ? null : n <= o ? "from" : "to";
|
|
323
312
|
}
|
|
324
|
-
function
|
|
313
|
+
function Bt(s, t, e) {
|
|
325
314
|
return s.outerTo >= 0 && s.outerFrom <= t && s.y + s.height >= 0 && s.y <= e;
|
|
326
315
|
}
|
|
327
|
-
function
|
|
328
|
-
let
|
|
316
|
+
function Vs(s, t, e) {
|
|
317
|
+
let n = Math.min(s.x1, s.x2, s.c1x, s.c2x), o = Math.max(s.x1, s.x2, s.c1x, s.c2x), r = Math.min(s.y1, s.y2), a = Math.max(s.y1, s.y2);
|
|
329
318
|
for (let l = 0; l + 1 < s.points.length; l += 2)
|
|
330
|
-
|
|
331
|
-
return o >= -8 &&
|
|
319
|
+
n = Math.min(n, s.points[l]), o = Math.max(o, s.points[l]), r = Math.min(r, s.points[l + 1]), a = Math.max(a, s.points[l + 1]);
|
|
320
|
+
return o >= -8 && n <= t + 8 && a >= -8 && r <= e + 8;
|
|
332
321
|
}
|
|
333
|
-
const
|
|
334
|
-
function
|
|
322
|
+
const js = 64;
|
|
323
|
+
function Ws(s, t) {
|
|
335
324
|
if (s.miniature) return null;
|
|
336
|
-
const e = wt(s.subtask.appearance).hatched ?
|
|
337
|
-
return
|
|
325
|
+
const e = wt(s.subtask.appearance).hatched ? rt + Ue + 1 : 0, i = Math.max(s.mainFrom + e, 0), n = Math.min(s.mainTo - e, t) - i;
|
|
326
|
+
return n < js ? null : { x: i, width: n, y: s.y, height: s.height };
|
|
338
327
|
}
|
|
339
|
-
const
|
|
328
|
+
const zs = 10;
|
|
340
329
|
function Se(s, t, e) {
|
|
341
|
-
const
|
|
342
|
-
return s === "centre" || e.y === t.y ?
|
|
330
|
+
const i = Math.round(t.y + t.height / 2);
|
|
331
|
+
return s === "centre" || e.y === t.y ? i : Math.round(e.y > t.y ? t.y + t.height - 1 : t.y + 1);
|
|
343
332
|
}
|
|
344
|
-
function Nt(s, t, e,
|
|
345
|
-
const o = t.route ??
|
|
333
|
+
function Nt(s, t, e, i, n) {
|
|
334
|
+
const o = t.route ?? n.route, r = t.attach ?? n.attach, a = t.ends ?? n.ends, l = $(s, zt(t, e.subtask)), d = $(s, Ut(t, i.subtask)), h = Se(r, e, i), c = Se(r, i, e);
|
|
346
335
|
if (o === "straight")
|
|
347
|
-
return { dependency: t, kind: o, ends: a, x1: l, y1: h, x2: d, y2:
|
|
336
|
+
return { dependency: t, kind: o, ends: a, x1: l, y1: h, x2: d, y2: c, c1x: l, c2x: d, points: [l, h, d, c] };
|
|
348
337
|
if (o === "orthogonal") {
|
|
349
|
-
const
|
|
350
|
-
return { dependency: t, kind: o, ends: a, x1: l, y1: h, x2: d, y2:
|
|
351
|
-
}
|
|
352
|
-
const f = Math.max(14, Math.abs(d - l) / 2), g = l + f, v = d - f,
|
|
353
|
-
for (let
|
|
354
|
-
const
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
338
|
+
const I = l + zs, L = h === c ? I : Math.round((I + d) / 2);
|
|
339
|
+
return { dependency: t, kind: o, ends: a, x1: l, y1: h, x2: d, y2: c, c1x: l, c2x: d, points: h === c ? [l, h, d, c] : [l, h, L, h, L, c, d, c] };
|
|
340
|
+
}
|
|
341
|
+
const f = Math.max(14, Math.abs(d - l) / 2), g = l + f, v = d - f, A = [];
|
|
342
|
+
for (let I = 0; I <= 16; I++) {
|
|
343
|
+
const L = I / 16, D = 1 - L;
|
|
344
|
+
A.push(
|
|
345
|
+
D * D * D * l + 3 * D * D * L * g + 3 * D * L * L * v + L * L * L * d,
|
|
346
|
+
D * D * D * h + 3 * D * D * L * h + 3 * D * L * L * c + L * L * L * c
|
|
358
347
|
);
|
|
359
348
|
}
|
|
360
|
-
return { dependency: t, kind: "curve", ends: a, x1: l, y1: h, x2: d, y2:
|
|
349
|
+
return { dependency: t, kind: "curve", ends: a, x1: l, y1: h, x2: d, y2: c, c1x: g, c2x: v, points: A };
|
|
361
350
|
}
|
|
362
|
-
function
|
|
363
|
-
let
|
|
364
|
-
const
|
|
365
|
-
for (let o = 0; o + 3 <
|
|
366
|
-
const r =
|
|
367
|
-
|
|
351
|
+
function Us(s, t, e) {
|
|
352
|
+
let i = 1 / 0;
|
|
353
|
+
const n = s.points;
|
|
354
|
+
for (let o = 0; o + 3 < n.length; o += 2) {
|
|
355
|
+
const r = n[o], a = n[o + 1], l = n[o + 2], d = n[o + 3], h = l - r, c = d - a, f = h * h + c * c, g = f === 0 ? 0 : Math.max(0, Math.min(1, ((t - r) * h + (e - a) * c) / f));
|
|
356
|
+
i = Math.min(i, Math.hypot(t - (r + g * h), e - (a + g * c)));
|
|
368
357
|
}
|
|
369
|
-
return
|
|
358
|
+
return i;
|
|
370
359
|
}
|
|
371
360
|
const Je = [], Ze = 56;
|
|
372
|
-
function
|
|
361
|
+
function Xs(s) {
|
|
373
362
|
return s > 16 ? s / 16 : 1;
|
|
374
363
|
}
|
|
375
|
-
function
|
|
376
|
-
return s > 0 ? Math.min(
|
|
364
|
+
function qs(s, t = Ze) {
|
|
365
|
+
return s > 0 ? Math.min(U, Math.max(15 * q, bs(s * t, 1))) : 15 * q;
|
|
377
366
|
}
|
|
378
|
-
function
|
|
379
|
-
const [
|
|
380
|
-
return Ms(e,
|
|
367
|
+
function Js(s, t, e = Je) {
|
|
368
|
+
const [i, n] = Qe(s, e);
|
|
369
|
+
return Ms(e, i, n, t, Kt(i)).filter(
|
|
381
370
|
(o) => o.workingTime >= s[0] && o.workingTime <= s[1]
|
|
382
371
|
);
|
|
383
372
|
}
|
|
384
|
-
function
|
|
385
|
-
const [e,
|
|
386
|
-
for (o.setHours(0, 0, 0, 0); o.getTime() <
|
|
373
|
+
function Zs(s, t = Je) {
|
|
374
|
+
const [e, i] = Qe(s, t), n = [], o = new Date(e);
|
|
375
|
+
for (o.setHours(0, 0, 0, 0); o.getTime() < i && n.length < 400; ) {
|
|
387
376
|
const r = o.getTime();
|
|
388
377
|
o.setDate(o.getDate() + 1);
|
|
389
378
|
const a = o.getTime();
|
|
390
|
-
|
|
379
|
+
n.push({
|
|
391
380
|
start: r,
|
|
392
381
|
from: H(r, t),
|
|
393
382
|
to: H(a, t)
|
|
394
383
|
});
|
|
395
384
|
}
|
|
396
|
-
return
|
|
385
|
+
return n;
|
|
397
386
|
}
|
|
398
|
-
const
|
|
399
|
-
function
|
|
400
|
-
return
|
|
387
|
+
const $t = [1, 2, 7, 14, 28];
|
|
388
|
+
function Qs(s, t) {
|
|
389
|
+
return $t.find((e) => e * s >= t) ?? $t[$t.length - 1];
|
|
401
390
|
}
|
|
402
|
-
function
|
|
403
|
-
return ((Math.round((s -
|
|
391
|
+
function Rt(s, t) {
|
|
392
|
+
return ((Math.round((s - Kt(s)) / U) - 4) % t + t) % t === 0;
|
|
404
393
|
}
|
|
405
|
-
function
|
|
406
|
-
const
|
|
407
|
-
if (!(
|
|
408
|
-
const o = Math.min(
|
|
394
|
+
function tn(s, t, e, i) {
|
|
395
|
+
const n = s[1] - s[0];
|
|
396
|
+
if (!(n > 0)) return [s[0], s[1]];
|
|
397
|
+
const o = Math.min(i.max, Math.max(i.min, n * e)), r = (t - s[0]) / n, a = t - r * o;
|
|
409
398
|
return [a, a + o];
|
|
410
399
|
}
|
|
411
|
-
function
|
|
400
|
+
function en(s, t) {
|
|
412
401
|
return [s[0] + t, s[1] + t];
|
|
413
402
|
}
|
|
414
|
-
function
|
|
403
|
+
function ht(s, t) {
|
|
415
404
|
const e = vt(t);
|
|
416
|
-
return e.intervals.length === 0 ? s :
|
|
405
|
+
return e.intervals.length === 0 ? s : Vt(Math.max(0, Math.min(e.total, s)), e);
|
|
417
406
|
}
|
|
418
407
|
function Qe(s, t) {
|
|
419
|
-
return [
|
|
408
|
+
return [ht(s[0], t), ht(s[1], t)];
|
|
420
409
|
}
|
|
421
|
-
const
|
|
422
|
-
class
|
|
410
|
+
const Pt = 44;
|
|
411
|
+
class sn {
|
|
423
412
|
constructor(t) {
|
|
424
413
|
this.data = t;
|
|
425
414
|
}
|
|
426
415
|
options = {
|
|
427
|
-
laneHeight:
|
|
416
|
+
laneHeight: Pt,
|
|
428
417
|
calendar: [],
|
|
429
|
-
zoomLimits: { min:
|
|
418
|
+
zoomLimits: { min: jt, max: 28 * U },
|
|
430
419
|
snap: "ticks",
|
|
431
420
|
intents: [],
|
|
432
421
|
now: null,
|
|
@@ -436,14 +425,14 @@ class rn {
|
|
|
436
425
|
};
|
|
437
426
|
/** The root font size over 16 px, 1 at the default size and below (`fontScaleOf`). */
|
|
438
427
|
fontScale = 1;
|
|
439
|
-
domain = [0,
|
|
428
|
+
domain = [0, U];
|
|
440
429
|
scrollY = 0;
|
|
441
430
|
width = 0;
|
|
442
431
|
height = 0;
|
|
443
432
|
/* What is laid out from top to bottom (`rows.ts`). It is derived here and
|
|
444
433
|
not in the data, because a row's height comes from a view option; every y
|
|
445
434
|
in the package reads it. */
|
|
446
|
-
rows = we({ lanes: [], groups: [], collapsed: /* @__PURE__ */ new Set(), laneHeight:
|
|
435
|
+
rows = we({ lanes: [], groups: [], collapsed: /* @__PURE__ */ new Set(), laneHeight: Pt });
|
|
447
436
|
/** The folded groups, as the scene holds them. */
|
|
448
437
|
collapsed = /* @__PURE__ */ new Set();
|
|
449
438
|
/** The groups a gesture in flight holds open. Dropped when it ends; the
|
|
@@ -477,11 +466,11 @@ class rn {
|
|
|
477
466
|
}
|
|
478
467
|
/** Takes new options; a new calendar keeps the wall-clock span in view. */
|
|
479
468
|
setOptions(t) {
|
|
480
|
-
const e = t.calendar !== this.options.calendar,
|
|
469
|
+
const e = t.calendar !== this.options.calendar, i = this.options.calendar;
|
|
481
470
|
if (this.options = t, e) {
|
|
482
|
-
const
|
|
483
|
-
const a =
|
|
484
|
-
return H(
|
|
471
|
+
const n = vt(i), o = (r) => {
|
|
472
|
+
const a = n.intervals.length === 0 ? r : Math.max(0, Math.min(n.total, r));
|
|
473
|
+
return H(Vt(a, n), t.calendar) + (r - a);
|
|
485
474
|
};
|
|
486
475
|
this.domain = [o(this.domain[0]), o(this.domain[1])];
|
|
487
476
|
}
|
|
@@ -508,42 +497,42 @@ class rn {
|
|
|
508
497
|
/** The fine band's step at the current zoom. */
|
|
509
498
|
step() {
|
|
510
499
|
const t = this.domain[1] - this.domain[0];
|
|
511
|
-
return
|
|
500
|
+
return qs(this.width > 0 ? t / this.width : t, Ze * this.fontScale);
|
|
512
501
|
}
|
|
513
502
|
/** Lays the rows out, clamps the scroll, and lays the data out anew. */
|
|
514
503
|
layout() {
|
|
515
504
|
this.moved = !1, this.rows = we({
|
|
516
505
|
lanes: this.data.lanes,
|
|
517
506
|
groups: this.data.groups,
|
|
518
|
-
collapsed:
|
|
507
|
+
collapsed: Gs(this.collapsed, this.openForGesture),
|
|
519
508
|
laneHeight: Math.round(this.options.laneHeight * this.fontScale),
|
|
520
509
|
headHeight: Math.round(ze * this.fontScale)
|
|
521
510
|
}), this.scrollY = Math.max(0, Math.min(this.maxScroll(), this.scrollY));
|
|
522
511
|
const t = this.viewport();
|
|
523
512
|
this.laidBoxes = [], this.laidBoxById = /* @__PURE__ */ new Map();
|
|
524
513
|
for (const e of this.data.subtasks) {
|
|
525
|
-
const
|
|
526
|
-
if (
|
|
527
|
-
const
|
|
528
|
-
this.laidBoxes.push(
|
|
514
|
+
const i = Zt(this.rows, e.lane);
|
|
515
|
+
if (i === null) continue;
|
|
516
|
+
const n = Xe(t, e, i, this.data.depth.get(e.id) ?? 0);
|
|
517
|
+
this.laidBoxes.push(n), this.laidBoxById.set(e.id, n);
|
|
529
518
|
}
|
|
530
519
|
this.laidPaths = [];
|
|
531
520
|
for (const e of this.data.dependencies) {
|
|
532
|
-
const
|
|
533
|
-
|
|
521
|
+
const i = this.boxById.get(e.from), n = this.boxById.get(e.to);
|
|
522
|
+
i === void 0 || n === void 0 || this.laidPaths.push(Nt(t, e, i, n, this.options));
|
|
534
523
|
}
|
|
535
524
|
}
|
|
536
525
|
/** The days of the coarse band and the ticks of the fine band, in pixels. */
|
|
537
526
|
bands() {
|
|
538
527
|
const t = this.step();
|
|
539
528
|
if (this.width <= 0) return { days: [], ticks: [], step: t };
|
|
540
|
-
const e = this.viewport().scale,
|
|
529
|
+
const e = this.viewport().scale, i = this.options.calendar;
|
|
541
530
|
return {
|
|
542
|
-
days:
|
|
543
|
-
const o = Math.round(e.toPx(
|
|
544
|
-
return { start:
|
|
531
|
+
days: Zs(this.domain, i).map((n) => {
|
|
532
|
+
const o = Math.round(e.toPx(n.from));
|
|
533
|
+
return { start: n.start, x: o, width: Math.round(e.toPx(n.to)) - o };
|
|
545
534
|
}),
|
|
546
|
-
ticks:
|
|
535
|
+
ticks: Js(this.domain, t, i).map((n) => ({ wallClock: n.wallClock, x: Math.round(e.toPx(n.workingTime)) })),
|
|
547
536
|
step: t
|
|
548
537
|
};
|
|
549
538
|
}
|
|
@@ -555,28 +544,28 @@ class rn {
|
|
|
555
544
|
return e >= 0 && e <= this.width ? e : null;
|
|
556
545
|
}
|
|
557
546
|
hitAt(t, e) {
|
|
558
|
-
const
|
|
547
|
+
const i = this.viewport();
|
|
559
548
|
for (let a = this.data.milestones.length - 1; a >= 0; a--) {
|
|
560
|
-
const l = this.data.milestones[a], d =
|
|
549
|
+
const l = this.data.milestones[a], d = Qt(i, l);
|
|
561
550
|
if (d !== null && Math.abs(t - d.x) + Math.abs(e - d.y) <= d.half + 2) return { kind: "milestone", milestone: l };
|
|
562
551
|
}
|
|
563
552
|
for (let a = this.boxes.length - 1; a >= 0; a--) {
|
|
564
553
|
const l = this.boxes[a], d = qe(l, t, e);
|
|
565
554
|
if (d !== null) return { kind: "subtask", subtask: l.subtask, part: d };
|
|
566
555
|
}
|
|
567
|
-
let
|
|
556
|
+
let n = null, o = 4;
|
|
568
557
|
for (const a of this.paths) {
|
|
569
|
-
const l =
|
|
570
|
-
l <= o && (o = l,
|
|
558
|
+
const l = Us(a, t, e);
|
|
559
|
+
l <= o && (o = l, n = a);
|
|
571
560
|
}
|
|
572
|
-
if (
|
|
561
|
+
if (n !== null) return { kind: "dependency", dependency: n.dependency };
|
|
573
562
|
const r = Te(this.viewport(), e);
|
|
574
563
|
return r !== null ? { kind: "lane", lane: r } : { kind: "nothing" };
|
|
575
564
|
}
|
|
576
565
|
/** The wall-clock time at a plot x; within the calendar's extent. */
|
|
577
566
|
timeAt(t) {
|
|
578
567
|
const e = this.viewport().scale.fromPx(t);
|
|
579
|
-
return
|
|
568
|
+
return ht(e, this.options.calendar);
|
|
580
569
|
}
|
|
581
570
|
/** The lane at a y, strips included: what the pointer is ON.
|
|
582
571
|
|
|
@@ -595,419 +584,407 @@ class rn {
|
|
|
595
584
|
aim at. Hover, the tooltip and selection do read a strip - they cost
|
|
596
585
|
nothing if they are a pixel out. */
|
|
597
586
|
dropLaneIdAt(t) {
|
|
598
|
-
const e =
|
|
587
|
+
const e = st(this.rows, t + this.scrollY);
|
|
599
588
|
return e === null || e.kind !== "lane" ? null : e.lane ?? null;
|
|
600
589
|
}
|
|
601
590
|
/** The folded group a y lies over, or null. */
|
|
602
591
|
foldedGroupAt(t) {
|
|
603
|
-
const e =
|
|
592
|
+
const e = st(this.rows, t + this.scrollY);
|
|
604
593
|
return e !== null && e.kind === "miniature" ? e.group ?? null : null;
|
|
605
594
|
}
|
|
606
595
|
/** Pans by pixels. Says what moved: the span through time, the lanes, or
|
|
607
596
|
neither - a scroll through the lanes is no news about the time. */
|
|
608
597
|
pan(t, e) {
|
|
609
|
-
const
|
|
610
|
-
this.width > 0 && t !== 0 && (this.domain =
|
|
611
|
-
const r = this.domain[0] !==
|
|
612
|
-
return { moved: r || this.scrollY !==
|
|
598
|
+
const i = this.domain[0], n = this.scrollY, o = this.domain[1] - i;
|
|
599
|
+
this.width > 0 && t !== 0 && (this.domain = en(this.domain, t / this.width * o)), this.scrollY = Math.max(0, Math.min(this.maxScroll(), this.scrollY + e));
|
|
600
|
+
const r = this.domain[0] !== i;
|
|
601
|
+
return { moved: r || this.scrollY !== n, time: r };
|
|
613
602
|
}
|
|
614
603
|
/** Zooms around a plot x; says whether the span changed. */
|
|
615
604
|
zoomAt(t, e) {
|
|
616
605
|
if (this.width <= 0 || !Number.isFinite(e)) return !1;
|
|
617
|
-
const
|
|
618
|
-
return this.domain =
|
|
619
|
-
}
|
|
620
|
-
}
|
|
621
|
-
const
|
|
622
|
-
root:
|
|
623
|
-
corner:
|
|
624
|
-
dayBand:
|
|
625
|
-
tickBand:
|
|
626
|
-
day:
|
|
627
|
-
dayLabel:
|
|
628
|
-
tick:
|
|
629
|
-
tickLabel:
|
|
630
|
-
headers:
|
|
631
|
-
header:
|
|
632
|
-
headerLabel:
|
|
633
|
-
headerCount:
|
|
634
|
-
chevron:
|
|
635
|
-
plot:
|
|
636
|
-
focusRing:
|
|
637
|
-
layer:
|
|
638
|
-
grip:
|
|
639
|
-
ghostLabel:
|
|
640
|
-
finding:
|
|
641
|
-
refusal:
|
|
642
|
-
tooltip:
|
|
643
|
-
tooltipHead:
|
|
644
|
-
tooltipTimes:
|
|
645
|
-
now:
|
|
646
|
-
barLabel:
|
|
647
|
-
barLabelText:
|
|
606
|
+
const i = this.domain, n = this.viewport().scale.fromPx(t);
|
|
607
|
+
return this.domain = tn(this.domain, n, e, this.options.zoomLimits), i[0] !== this.domain[0] || i[1] !== this.domain[1];
|
|
608
|
+
}
|
|
609
|
+
}
|
|
610
|
+
const nn = "_root_mm9nj_4 _text_18806_22", on = "_corner_mm9nj_19", rn = "_dayBand_mm9nj_23", an = "_tickBand_mm9nj_24", ln = "_day_mm9nj_23", dn = "_dayLabel_mm9nj_50", hn = "_tick_mm9nj_24", cn = "_tickLabel_mm9nj_71", un = "_headers_mm9nj_81", fn = "_header_mm9nj_81", mn = "_headerLabel_mm9nj_100", pn = "_headerCount_mm9nj_136", gn = "_chevron_mm9nj_145", kn = "_plot_mm9nj_223", vn = "_focusRing_mm9nj_237", yn = "_layer_mm9nj_255", wn = "_grip_mm9nj_282", bn = "_ghostLabel_mm9nj_292", Mn = "_finding_mm9nj_305", Tn = "_refusal_mm9nj_313", Sn = "_tooltip_mm9nj_317", In = "_tooltipHead_mm9nj_336", Ln = "_tooltipTimes_mm9nj_341", An = "_now_mm9nj_350", Cn = "_barLabel_mm9nj_364", Dn = "_barLabelText_mm9nj_377", p = {
|
|
611
|
+
root: nn,
|
|
612
|
+
corner: on,
|
|
613
|
+
dayBand: rn,
|
|
614
|
+
tickBand: an,
|
|
615
|
+
day: ln,
|
|
616
|
+
dayLabel: dn,
|
|
617
|
+
tick: hn,
|
|
618
|
+
tickLabel: cn,
|
|
619
|
+
headers: un,
|
|
620
|
+
header: fn,
|
|
621
|
+
headerLabel: mn,
|
|
622
|
+
headerCount: pn,
|
|
623
|
+
chevron: gn,
|
|
624
|
+
plot: kn,
|
|
625
|
+
focusRing: vn,
|
|
626
|
+
layer: yn,
|
|
627
|
+
grip: wn,
|
|
628
|
+
ghostLabel: bn,
|
|
629
|
+
finding: Mn,
|
|
630
|
+
refusal: Tn,
|
|
631
|
+
tooltip: Sn,
|
|
632
|
+
tooltipHead: In,
|
|
633
|
+
tooltipTimes: Ln,
|
|
634
|
+
now: An,
|
|
635
|
+
barLabel: Cn,
|
|
636
|
+
barLabelText: Dn
|
|
648
637
|
};
|
|
649
638
|
function ts() {
|
|
650
639
|
const s = yt();
|
|
651
640
|
return (t) => {
|
|
652
|
-
const e = Math.round(t / q),
|
|
653
|
-
return [
|
|
641
|
+
const e = Math.round(t / q), i = Math.floor(e / 60), n = e % 60;
|
|
642
|
+
return [i > 0 ? s.hoursShort(i) : "", n > 0 || i === 0 ? s.minutesShort(n) : ""].filter(Boolean).join(" ");
|
|
654
643
|
};
|
|
655
644
|
}
|
|
656
|
-
function
|
|
657
|
-
const e =
|
|
645
|
+
function _n({ target: s, lane: t }) {
|
|
646
|
+
const e = Wt(), i = yt(), n = ts(), o = (c) => e.time(new Date(c), !1);
|
|
658
647
|
if (s.kind === "subtask") {
|
|
659
|
-
const { subtask:
|
|
660
|
-
f?.name ??
|
|
661
|
-
|
|
662
|
-
`${e.dateShort(new Date(
|
|
663
|
-
...s.overlapping.map((v) =>
|
|
664
|
-
...s.violatedDependencies.map((v) =>
|
|
665
|
-
...s.blocked.map((v) =>
|
|
648
|
+
const { subtask: c, task: f } = s, g = [
|
|
649
|
+
f?.name ?? c.task,
|
|
650
|
+
c.name ?? c.id,
|
|
651
|
+
`${e.dateShort(new Date(c.from))} ${i.scheduleGhostTimes(o(c.from), o(c.to))}`,
|
|
652
|
+
...s.overlapping.map((v) => i.scheduleOverlapWith(v.name ?? v.id)),
|
|
653
|
+
...s.violatedDependencies.map((v) => i.scheduleViolatedBy(n(v.shortBy))),
|
|
654
|
+
...s.blocked.map((v) => i.scheduleInBlockedTime(v.label))
|
|
666
655
|
];
|
|
667
|
-
return /* @__PURE__ */ N(
|
|
656
|
+
return /* @__PURE__ */ N(lt, { children: [
|
|
668
657
|
t,
|
|
669
658
|
`, ${g.join(", ")}`
|
|
670
659
|
] });
|
|
671
660
|
}
|
|
672
661
|
if (s.kind === "milestone") {
|
|
673
|
-
const { milestone:
|
|
674
|
-
return /* @__PURE__ */ N(
|
|
662
|
+
const { milestone: c } = s;
|
|
663
|
+
return /* @__PURE__ */ N(lt, { children: [
|
|
675
664
|
t,
|
|
676
|
-
`, ${
|
|
665
|
+
`, ${i.scheduleMilestone(c.label ?? c.id)}, ${e.dateShort(new Date(c.at))} ${o(c.at)}`
|
|
677
666
|
] });
|
|
678
667
|
}
|
|
679
668
|
const { dependency: r, task: a, from: l, to: d, violated: h } = s;
|
|
680
669
|
return [
|
|
681
670
|
a?.name ?? a?.id ?? r.id,
|
|
682
|
-
`${
|
|
683
|
-
|
|
684
|
-
...h === void 0 ? [] : [
|
|
671
|
+
`${i.scheduleDependency} ${n(r.lag)}`,
|
|
672
|
+
i.scheduleRoute(l?.name ?? r.from, d?.name ?? r.to),
|
|
673
|
+
...h === void 0 ? [] : [i.scheduleViolatedBy(n(h.shortBy))]
|
|
685
674
|
].join(", ");
|
|
686
675
|
}
|
|
687
|
-
function
|
|
688
|
-
const t =
|
|
676
|
+
function On({ target: s }) {
|
|
677
|
+
const t = Wt(), e = yt(), i = (h) => t.time(new Date(h), !1), n = ts();
|
|
689
678
|
if (s.kind === "subtask") {
|
|
690
|
-
const { subtask: h, task:
|
|
691
|
-
return /* @__PURE__ */ N(
|
|
692
|
-
/* @__PURE__ */ m("span", { className: p.tooltipHead, children:
|
|
679
|
+
const { subtask: h, task: c } = s;
|
|
680
|
+
return /* @__PURE__ */ N(lt, { children: [
|
|
681
|
+
/* @__PURE__ */ m("span", { className: p.tooltipHead, children: c?.name ?? h.task }),
|
|
693
682
|
/* @__PURE__ */ m("span", { children: h.name ?? h.id }),
|
|
694
|
-
/* @__PURE__ */ m("span", { className: p.tooltipTimes, children: e.scheduleGhostTimes(
|
|
695
|
-
(h.leadIn ?? 0) > 0 && /* @__PURE__ */ m("span", { children: `${e.scheduleLeadIn} ${
|
|
696
|
-
(h.leadOut ?? 0) > 0 && /* @__PURE__ */ m("span", { children: `${e.scheduleLeadOut} ${
|
|
683
|
+
/* @__PURE__ */ m("span", { className: p.tooltipTimes, children: e.scheduleGhostTimes(i(h.from), i(h.to)) }),
|
|
684
|
+
(h.leadIn ?? 0) > 0 && /* @__PURE__ */ m("span", { children: `${e.scheduleLeadIn} ${n(h.leadIn)}` }),
|
|
685
|
+
(h.leadOut ?? 0) > 0 && /* @__PURE__ */ m("span", { children: `${e.scheduleLeadOut} ${n(h.leadOut)}` }),
|
|
697
686
|
s.overlapping.map((f) => /* @__PURE__ */ m("span", { className: p.finding, children: e.scheduleOverlapWith(f.name ?? f.id) }, f.id)),
|
|
698
|
-
s.violatedDependencies.map((f) => /* @__PURE__ */ m("span", { className: p.finding, children: e.scheduleViolatedBy(
|
|
687
|
+
s.violatedDependencies.map((f) => /* @__PURE__ */ m("span", { className: p.finding, children: e.scheduleViolatedBy(n(f.shortBy)) }, f.dependency)),
|
|
699
688
|
s.blocked.map((f) => /* @__PURE__ */ m("span", { className: p.finding, children: e.scheduleInBlockedTime(f.label) }, f.id))
|
|
700
689
|
] });
|
|
701
690
|
}
|
|
702
691
|
if (s.kind === "milestone") {
|
|
703
692
|
const { milestone: h } = s;
|
|
704
|
-
return /* @__PURE__ */ N(
|
|
693
|
+
return /* @__PURE__ */ N(lt, { children: [
|
|
705
694
|
/* @__PURE__ */ m("span", { className: p.tooltipHead, children: e.scheduleMilestone(h.label ?? h.id) }),
|
|
706
|
-
/* @__PURE__ */ m("span", { className: p.tooltipTimes, children: `${t.dateShort(new Date(h.at))} ${
|
|
695
|
+
/* @__PURE__ */ m("span", { className: p.tooltipTimes, children: `${t.dateShort(new Date(h.at))} ${i(h.at)}` })
|
|
707
696
|
] });
|
|
708
697
|
}
|
|
709
698
|
const { dependency: o, task: r, from: a, to: l, violated: d } = s;
|
|
710
|
-
return /* @__PURE__ */ N(
|
|
699
|
+
return /* @__PURE__ */ N(lt, { children: [
|
|
711
700
|
/* @__PURE__ */ m("span", { className: p.tooltipHead, children: r?.name ?? r?.id ?? o.id }),
|
|
712
701
|
/* @__PURE__ */ m("span", { children: e.scheduleRoute(a?.name ?? o.from, l?.name ?? o.to) }),
|
|
713
|
-
/* @__PURE__ */ m("span", { children: `${e.scheduleDependency} ${
|
|
714
|
-
d !== void 0 && /* @__PURE__ */ m("span", { className: p.finding, children: e.scheduleViolatedBy(
|
|
702
|
+
/* @__PURE__ */ m("span", { children: `${e.scheduleDependency} ${n(o.lag)}` }),
|
|
703
|
+
d !== void 0 && /* @__PURE__ */ m("span", { className: p.finding, children: e.scheduleViolatedBy(n(d.shortBy)) })
|
|
715
704
|
] });
|
|
716
705
|
}
|
|
717
|
-
const
|
|
718
|
-
function
|
|
706
|
+
const Fn = [], Ie = { min: jt, max: 28 * U }, En = [], Le = 20, $n = 44, Rn = 84, xn = 200;
|
|
707
|
+
function Bn(s) {
|
|
719
708
|
const {
|
|
720
709
|
ref: t,
|
|
721
710
|
scene: e,
|
|
722
|
-
"aria-label":
|
|
723
|
-
"aria-labelledby":
|
|
711
|
+
"aria-label": i,
|
|
712
|
+
"aria-labelledby": n,
|
|
724
713
|
"aria-describedby": o,
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
ends: E = "dot",
|
|
714
|
+
height: r,
|
|
715
|
+
laneHeight: a = Pt,
|
|
716
|
+
headerWidth: l = 160,
|
|
717
|
+
calendar: d = En,
|
|
718
|
+
zoomLimits: h,
|
|
719
|
+
snap: c = "ticks",
|
|
720
|
+
intents: f = Fn,
|
|
721
|
+
onIntent: g,
|
|
722
|
+
canMoveTo: v,
|
|
723
|
+
onInteraction: A,
|
|
724
|
+
selectedTask: I,
|
|
725
|
+
onSelectedTaskChange: L,
|
|
726
|
+
placing: D,
|
|
727
|
+
route: w = "curve",
|
|
728
|
+
attach: M = "centre",
|
|
729
|
+
ends: T = "dot",
|
|
742
730
|
label: F,
|
|
743
|
-
tooltip:
|
|
744
|
-
now:
|
|
745
|
-
loading:
|
|
746
|
-
className:
|
|
747
|
-
style:
|
|
731
|
+
tooltip: O,
|
|
732
|
+
now: x,
|
|
733
|
+
loading: X = !1,
|
|
734
|
+
className: ft,
|
|
735
|
+
style: mt,
|
|
748
736
|
children: ds,
|
|
749
737
|
...hs
|
|
750
|
-
} = s;
|
|
751
|
-
r !== void 0 && Gs("ariaLabel", "aria-label");
|
|
752
|
-
const te = { "aria-label": n ?? r, "aria-labelledby": i }, Mt = As(), Tt = `${Mt}-summary`, pt = V(null), ee = V(null), se = V(null), ne = V(null), Y = jt(), R = yt(), ie = u?.min ?? Ie.min, oe = u?.max ?? Ie.max, re = typeof f == "object" ? f.step : null, ae = typeof f == "object" ? f.offset : null, le = typeof f == "object" ? null : f, [cs, us] = dt(() => Date.now());
|
|
738
|
+
} = s, ee = { "aria-label": i, "aria-labelledby": n }, Mt = As(), Tt = `${Mt}-summary`, St = V(null), se = V(null), ne = V(null), ie = V(null), Y = Wt(), B = yt(), oe = h?.min ?? Ie.min, re = h?.max ?? Ie.max, ae = typeof c == "object" ? c.step : null, le = typeof c == "object" ? c.offset : null, de = typeof c == "object" ? null : c, [cs, us] = at(() => Date.now());
|
|
753
739
|
j(() => {
|
|
754
|
-
if (
|
|
755
|
-
const
|
|
756
|
-
return () => clearInterval(
|
|
757
|
-
}, [
|
|
758
|
-
const
|
|
759
|
-
|
|
760
|
-
const
|
|
761
|
-
e.setOptions({ laneHeight:
|
|
762
|
-
}, [e,
|
|
763
|
-
e.setHandlers({ onIntent:
|
|
764
|
-
}, [e, v,
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
740
|
+
if (x !== !0) return;
|
|
741
|
+
const u = setInterval(() => us(Date.now()), q);
|
|
742
|
+
return () => clearInterval(u);
|
|
743
|
+
}, [x]);
|
|
744
|
+
const he = x === !0 ? cs : typeof x == "number" ? x : null;
|
|
745
|
+
pt(() => {
|
|
746
|
+
const u = de ?? { step: ae ?? 0, offset: le ?? 0 };
|
|
747
|
+
e.setOptions({ laneHeight: a, calendar: d, zoomLimits: { min: oe, max: re }, snap: u, intents: f, now: he, route: w, attach: M, ends: T });
|
|
748
|
+
}, [e, a, d, oe, re, de, ae, le, f, he, w, M, T]), j(() => {
|
|
749
|
+
e.setHandlers({ onIntent: g, canMoveTo: v, onInteraction: A, onSelectedTaskChange: L });
|
|
750
|
+
}, [e, g, v, A, L]), Cs(t, () => St.current, []), j(() => {
|
|
751
|
+
e.setLoading(X);
|
|
752
|
+
}, [e, X]), j(() => {
|
|
753
|
+
e.setControlledTask(I);
|
|
754
|
+
}, [e, I]), j(() => {
|
|
755
|
+
e.setPlacing(D ?? null);
|
|
756
|
+
}, [e, D]), j(() => {
|
|
757
|
+
const u = St.current, y = se.current, S = ne.current, E = ie.current;
|
|
758
|
+
if (!u || !y || !S || !E) return;
|
|
759
|
+
e.bind(u, y, S, E);
|
|
760
|
+
const C = y.getBoundingClientRect();
|
|
761
|
+
e.resize(C.width, C.height);
|
|
762
|
+
const _ = new ResizeObserver((K) => {
|
|
763
|
+
const Ft = K[K.length - 1]?.contentRect;
|
|
764
|
+
Ft !== void 0 && e.resize(Ft.width, Ft.height);
|
|
772
765
|
});
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
e.
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
const
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
const O = new ResizeObserver((K) => {
|
|
786
|
-
const Ot = K[K.length - 1]?.contentRect;
|
|
787
|
-
Ot !== void 0 && e.resize(Ot.width, Ot.height);
|
|
788
|
-
});
|
|
789
|
-
O.observe(y);
|
|
790
|
-
const P = document.createElement("div");
|
|
791
|
-
P.setAttribute("aria-hidden", "true"), P.style.cssText = "position:absolute;visibility:hidden;pointer-events:none;width:1rem;height:0", c.appendChild(P);
|
|
792
|
-
const B = () => e.setFontScale(Zs(parseFloat(getComputedStyle(P).width)));
|
|
793
|
-
B();
|
|
794
|
-
const $ = new ResizeObserver(B);
|
|
795
|
-
$.observe(P);
|
|
796
|
-
const et = (K) => e.wheel(K);
|
|
797
|
-
c.addEventListener("wheel", et, { passive: !1 });
|
|
798
|
-
const pe = (K) => e.touchMove(K);
|
|
799
|
-
c.addEventListener("touchmove", pe, { passive: !1 });
|
|
800
|
-
const ge = (K) => {
|
|
766
|
+
_.observe(y);
|
|
767
|
+
const R = document.createElement("div");
|
|
768
|
+
R.setAttribute("aria-hidden", "true"), R.style.cssText = "position:absolute;visibility:hidden;pointer-events:none;width:1rem;height:0", u.appendChild(R);
|
|
769
|
+
const P = () => e.setFontScale(Xs(parseFloat(getComputedStyle(R).width)));
|
|
770
|
+
P();
|
|
771
|
+
const G = new ResizeObserver(P);
|
|
772
|
+
G.observe(R);
|
|
773
|
+
const tt = (K) => e.wheel(K);
|
|
774
|
+
u.addEventListener("wheel", tt, { passive: !1 });
|
|
775
|
+
const ge = (K) => e.touchMove(K);
|
|
776
|
+
u.addEventListener("touchmove", ge, { passive: !1 });
|
|
777
|
+
const ke = (K) => {
|
|
801
778
|
K.key === "Escape" && e.cancelEdit() && K.preventDefault();
|
|
802
779
|
};
|
|
803
|
-
return window.addEventListener("keydown",
|
|
804
|
-
window.removeEventListener("keydown",
|
|
780
|
+
return window.addEventListener("keydown", ke), () => {
|
|
781
|
+
window.removeEventListener("keydown", ke), u.removeEventListener("wheel", tt), u.removeEventListener("touchmove", ge), _.disconnect(), G.disconnect(), R.remove(), e.unbind();
|
|
805
782
|
};
|
|
806
783
|
}, [e]);
|
|
807
|
-
const k =
|
|
808
|
-
const
|
|
809
|
-
return y >= ms ? Y.dateLong(
|
|
810
|
-
}, gs = k.days.reduce((
|
|
811
|
-
const
|
|
784
|
+
const k = Ye(e.subscribe, e.getSnapshot, e.getServerSnapshot), { fontScale: it } = k, It = $n * it, fs = Rn * it, ms = xn * it, ps = (u, y) => {
|
|
785
|
+
const S = new Date(u);
|
|
786
|
+
return y >= ms ? Y.dateLong(S) : y >= fs ? Y.date(S) : y >= It ? Y.dateShort(S) : "";
|
|
787
|
+
}, gs = k.days.reduce((u, y) => Math.max(u, y.width), 0), Z = Qs(gs, It), ce = k.step >= U ? Z : 1, b = k.ghost, Q = k.spoken, Lt = k.summary, ue = (u) => `${Y.dateShort(new Date(u))} ${Y.time(new Date(u), !1)}`, At = (u) => `${Mt}-row-${encodeURIComponent(u.key)}`, ks = W(() => {
|
|
788
|
+
const u = /* @__PURE__ */ new Map();
|
|
812
789
|
for (const y of k.headers)
|
|
813
|
-
for (const
|
|
814
|
-
y.kind === "groupHead" &&
|
|
815
|
-
return
|
|
816
|
-
}, [k.headers, Mt]),
|
|
817
|
-
|
|
818
|
-
const
|
|
819
|
-
if (
|
|
790
|
+
for (const S of y.within)
|
|
791
|
+
y.kind === "groupHead" && S === y.group || u.set(S, [...u.get(S) ?? [], At(y)]);
|
|
792
|
+
return u;
|
|
793
|
+
}, [k.headers, Mt]), fe = V(null);
|
|
794
|
+
pt(() => {
|
|
795
|
+
const u = fe.current;
|
|
796
|
+
if (u === null) return;
|
|
820
797
|
let y = !0;
|
|
821
|
-
const
|
|
798
|
+
const S = () => {
|
|
822
799
|
if (!y) return;
|
|
823
|
-
const
|
|
824
|
-
for (const
|
|
825
|
-
const
|
|
826
|
-
const
|
|
827
|
-
if (!(
|
|
828
|
-
const
|
|
829
|
-
return
|
|
800
|
+
const _ = [...u.querySelectorAll("[data-lane-count]")];
|
|
801
|
+
for (const P of _) P.hidden = !1;
|
|
802
|
+
const R = _.some((P) => {
|
|
803
|
+
const G = P.previousElementSibling;
|
|
804
|
+
if (!(G instanceof HTMLElement)) return !1;
|
|
805
|
+
const tt = parseFloat(getComputedStyle(G).lineHeight);
|
|
806
|
+
return G.scrollWidth > G.clientWidth || G.clientHeight > tt * 1.5;
|
|
830
807
|
});
|
|
831
|
-
for (const
|
|
808
|
+
for (const P of _) P.hidden = R;
|
|
832
809
|
};
|
|
833
|
-
|
|
834
|
-
const
|
|
835
|
-
|
|
836
|
-
const
|
|
837
|
-
return
|
|
838
|
-
y = !1,
|
|
810
|
+
S(), document.fonts?.ready.then(S);
|
|
811
|
+
const E = new ResizeObserver(S);
|
|
812
|
+
E.observe(u);
|
|
813
|
+
const C = new MutationObserver(S);
|
|
814
|
+
return C.observe(u, { childList: !0, characterData: !0, subtree: !0 }), () => {
|
|
815
|
+
y = !1, E.disconnect(), C.disconnect();
|
|
839
816
|
};
|
|
840
817
|
}, []);
|
|
841
|
-
const vs = W(() => new Set(
|
|
842
|
-
|
|
843
|
-
const
|
|
844
|
-
if (
|
|
845
|
-
const y = 4,
|
|
846
|
-
x: Math.max(2, Math.min(
|
|
847
|
-
y:
|
|
848
|
-
at:
|
|
818
|
+
const vs = W(() => new Set(b?.refusedLanes ?? []), [b?.refusedLanes]), me = V(null), [Ct, ys] = at({ x: 0, y: 0, at: "" }), Dt = b === null ? "" : `${b.x}:${b.y}:${b.from}:${b.to}:${b.overlap}:${b.violated}:${b.refused}:${b.blocked}`;
|
|
819
|
+
pt(() => {
|
|
820
|
+
const u = me.current;
|
|
821
|
+
if (b === null || u === null) return;
|
|
822
|
+
const y = 4, S = b.y - u.offsetHeight - y, E = b.y + b.height + y, C = {
|
|
823
|
+
x: Math.max(2, Math.min(b.x, k.width - u.offsetWidth - 2)),
|
|
824
|
+
y: S >= 2 ? S : Math.min(E, k.height - u.offsetHeight - 2),
|
|
825
|
+
at: Dt
|
|
849
826
|
};
|
|
850
|
-
ys((
|
|
851
|
-
}, [
|
|
852
|
-
const
|
|
853
|
-
return
|
|
854
|
-
const
|
|
855
|
-
if (
|
|
856
|
-
const y = 12,
|
|
857
|
-
const
|
|
858
|
-
return Math.max(4, Math.min(
|
|
859
|
-
},
|
|
860
|
-
x:
|
|
861
|
-
y:
|
|
862
|
-
at:
|
|
827
|
+
ys((_) => _.x === C.x && _.y === C.y && _.at === C.at ? _ : C);
|
|
828
|
+
}, [b, Dt, k.width, k.height]);
|
|
829
|
+
const pe = V(null), [_t, ws] = at({ x: 0, y: 0, at: "" }), z = k.tooltip, Ot = z === null ? "" : `${z.x}:${z.y}:${z.target.kind}`;
|
|
830
|
+
return pt(() => {
|
|
831
|
+
const u = pe.current;
|
|
832
|
+
if (z === null || u === null) return;
|
|
833
|
+
const y = 12, S = (C, _, R) => {
|
|
834
|
+
const P = C + y, G = C - y - _, tt = P + _ <= R - 4 || G < 4 ? P : G;
|
|
835
|
+
return Math.max(4, Math.min(tt, R - _ - 4));
|
|
836
|
+
}, E = {
|
|
837
|
+
x: S(z.x, u.offsetWidth, k.width),
|
|
838
|
+
y: S(z.y, u.offsetHeight, k.height),
|
|
839
|
+
at: Ot
|
|
863
840
|
};
|
|
864
|
-
ws((
|
|
865
|
-
}, [
|
|
841
|
+
ws((C) => C.x === E.x && C.y === E.y && C.at === E.at ? C : E);
|
|
842
|
+
}, [z, Ot, k.width, k.height]), /* @__PURE__ */ N(Ve, { value: e, children: [
|
|
866
843
|
/* @__PURE__ */ N(
|
|
867
844
|
"div",
|
|
868
845
|
{
|
|
869
846
|
...hs,
|
|
870
|
-
ref:
|
|
847
|
+
ref: St,
|
|
871
848
|
role: "figure",
|
|
872
|
-
...
|
|
873
|
-
className:
|
|
874
|
-
style: { ...
|
|
849
|
+
...ee,
|
|
850
|
+
className: ft ? `${p.root} ${ft}` : p.root,
|
|
851
|
+
style: { ...r === void 0 ? { height: "100%", minHeight: 400 } : { height: `${r}px` }, gridTemplateColumns: `min(${l}px, 40%) minmax(0, 1fr)`, ...mt },
|
|
875
852
|
children: [
|
|
876
853
|
/* @__PURE__ */ m("div", { className: p.corner }),
|
|
877
|
-
/* @__PURE__ */ m("div", { className: p.dayBand, "aria-hidden": "true", "data-schedule-days": "", "data-schedule-clip": "day band", children: k.days.map((
|
|
878
|
-
const
|
|
879
|
-
return /* @__PURE__ */ m("span", { className: p.day, style: { left: `${
|
|
854
|
+
/* @__PURE__ */ m("div", { className: p.dayBand, "aria-hidden": "true", "data-schedule-days": "", "data-schedule-clip": "day band", children: k.days.map((u, y) => {
|
|
855
|
+
const S = Z === 1 || y === 0 || Rt(u.start, Z), E = Z === 1 ? u.x + u.width : k.days.slice(y + 1).find((R) => Rt(R.start, Z))?.x ?? k.width, C = Math.max(0, -u.x), _ = Math.min(E, k.width) - Math.max(u.x, 0);
|
|
856
|
+
return /* @__PURE__ */ m("span", { className: p.day, style: { left: `${u.x}px`, width: `${S ? E - u.x : u.width}px` }, children: /* @__PURE__ */ m("span", { className: p.dayLabel, "data-schedule-overlay": "day label", style: { marginLeft: `${C}px` }, children: S ? ps(u.start, Z === 1 ? _ : Math.min(_, It)) : "" }) }, u.start);
|
|
880
857
|
}) }),
|
|
881
|
-
/* @__PURE__ */ m("div", { ref:
|
|
882
|
-
|
|
883
|
-
k.headers.map((
|
|
858
|
+
/* @__PURE__ */ m("div", { ref: fe, className: p.headers, "data-schedule-headers": "", children: /* @__PURE__ */ N("div", { className: p.headerRun, style: { transform: `translateY(${-k.scrollY}px)` }, children: [
|
|
859
|
+
X && k.headers.length === 0 && Array.from({ length: Math.floor(k.height / Math.round(a * it)) }, (u, y) => /* @__PURE__ */ m("div", { className: p.header, style: { height: `${Math.round(a * it)}px` }, children: /* @__PURE__ */ m(_s, { width: "60%" }) }, y)),
|
|
860
|
+
k.headers.map((u) => /* @__PURE__ */ N(
|
|
884
861
|
"div",
|
|
885
862
|
{
|
|
886
|
-
id:
|
|
863
|
+
id: At(u),
|
|
887
864
|
className: p.header,
|
|
888
|
-
style: { height: `${
|
|
889
|
-
"data-lane":
|
|
890
|
-
"data-group":
|
|
891
|
-
"data-row":
|
|
892
|
-
"data-schedule-clip": `header ${
|
|
893
|
-
"data-refused":
|
|
865
|
+
style: { height: `${u.height}px`, paddingLeft: `calc(var(--u-space-3) + ${u.depth} * var(--u-space-3))` },
|
|
866
|
+
"data-lane": u.lane,
|
|
867
|
+
"data-group": u.group,
|
|
868
|
+
"data-row": u.kind,
|
|
869
|
+
"data-schedule-clip": `header ${u.kind}`,
|
|
870
|
+
"data-refused": u.lane !== void 0 && vs.has(u.lane) ? "" : void 0,
|
|
894
871
|
children: [
|
|
895
|
-
|
|
872
|
+
u.kind !== "lane" && u.group !== void 0 && /* @__PURE__ */ m(
|
|
896
873
|
"button",
|
|
897
874
|
{
|
|
898
875
|
type: "button",
|
|
899
876
|
className: p.chevron,
|
|
900
877
|
"data-schedule-overlay": "fold control",
|
|
901
|
-
"aria-expanded":
|
|
902
|
-
"aria-controls": (ks.get(
|
|
903
|
-
"aria-label": `${
|
|
904
|
-
onClick: () => e.toggleGroup(
|
|
905
|
-
children: /* @__PURE__ */ m(Os, { size: 9, "data-open":
|
|
878
|
+
"aria-expanded": u.collapsed === !1,
|
|
879
|
+
"aria-controls": (ks.get(u.group) ?? [At(u)]).join(" "),
|
|
880
|
+
"aria-label": `${u.collapsed === !0 ? B.scheduleUnfoldGroup : B.scheduleFoldGroup}: ${typeof u.label == "string" ? u.label : u.group}`,
|
|
881
|
+
onClick: () => e.toggleGroup(u.group),
|
|
882
|
+
children: /* @__PURE__ */ m(Os, { size: 9, "data-open": u.collapsed === !1 ? "" : void 0 })
|
|
906
883
|
}
|
|
907
884
|
),
|
|
908
|
-
/* @__PURE__ */ m("span", { className: p.headerLabel, "data-schedule-overlay": "header label", children:
|
|
909
|
-
|
|
885
|
+
/* @__PURE__ */ m("span", { className: p.headerLabel, "data-schedule-overlay": "header label", children: u.label }),
|
|
886
|
+
u.kind !== "lane" && /* @__PURE__ */ m("span", { className: p.headerCount, "data-schedule-overlay": "lane count", "data-lane-count": u.lanes, children: B.scheduleLaneCount(u.lanes) })
|
|
910
887
|
]
|
|
911
888
|
},
|
|
912
|
-
|
|
889
|
+
u.key
|
|
913
890
|
))
|
|
914
891
|
] }) }),
|
|
915
892
|
/* @__PURE__ */ N(
|
|
916
893
|
"div",
|
|
917
894
|
{
|
|
918
|
-
ref:
|
|
895
|
+
ref: se,
|
|
919
896
|
className: p.plot,
|
|
920
897
|
"data-schedule-plot": "",
|
|
921
898
|
"data-schedule-clip": "plot",
|
|
922
899
|
style: { cursor: k.cursor },
|
|
923
|
-
"aria-busy":
|
|
900
|
+
"aria-busy": X || void 0,
|
|
924
901
|
"data-stale": k.loading && k.headers.length > 0 || void 0,
|
|
925
902
|
tabIndex: 0,
|
|
926
903
|
role: "application",
|
|
927
|
-
"aria-roledescription":
|
|
928
|
-
...
|
|
904
|
+
"aria-roledescription": B.scheduleRoleDescription,
|
|
905
|
+
...ee,
|
|
929
906
|
"aria-describedby": o ? `${Tt} ${o}` : Tt,
|
|
930
|
-
onKeyDown: (
|
|
931
|
-
e.key(
|
|
907
|
+
onKeyDown: (u) => {
|
|
908
|
+
e.key(u.nativeEvent) && u.preventDefault();
|
|
932
909
|
},
|
|
933
|
-
onFocus: (
|
|
910
|
+
onFocus: (u) => e.focus(Nn(u.currentTarget)),
|
|
934
911
|
onBlur: () => e.blur(),
|
|
935
|
-
onPointerDown: (
|
|
936
|
-
onPointerMove: (
|
|
937
|
-
onPointerUp: (
|
|
938
|
-
onPointerCancel: (
|
|
912
|
+
onPointerDown: (u) => e.pointerDown(u.nativeEvent),
|
|
913
|
+
onPointerMove: (u) => e.pointerMove(u.nativeEvent),
|
|
914
|
+
onPointerUp: (u) => e.pointerUp(u.nativeEvent),
|
|
915
|
+
onPointerCancel: (u) => e.pointerCancel(u.nativeEvent),
|
|
939
916
|
onPointerLeave: () => e.pointerLeave(),
|
|
940
|
-
onContextMenu: (
|
|
941
|
-
onDragOver: (
|
|
942
|
-
onDrop: (
|
|
943
|
-
onDragLeave: (
|
|
944
|
-
const y =
|
|
945
|
-
(!(y instanceof Node) || !
|
|
917
|
+
onContextMenu: (u) => e.contextMenu(u.nativeEvent),
|
|
918
|
+
onDragOver: (u) => e.dragOver(u.nativeEvent),
|
|
919
|
+
onDrop: (u) => e.drop(u.nativeEvent),
|
|
920
|
+
onDragLeave: (u) => {
|
|
921
|
+
const y = u.nativeEvent.relatedTarget;
|
|
922
|
+
(!(y instanceof Node) || !u.currentTarget.contains(y)) && e.dragLeave();
|
|
946
923
|
},
|
|
947
924
|
children: [
|
|
948
|
-
/* @__PURE__ */ m("canvas", { ref: se, className: p.layer, "aria-hidden": "true" }),
|
|
949
925
|
/* @__PURE__ */ m("canvas", { ref: ne, className: p.layer, "aria-hidden": "true" }),
|
|
950
|
-
|
|
926
|
+
/* @__PURE__ */ m("canvas", { ref: ie, className: p.layer, "aria-hidden": "true" }),
|
|
927
|
+
k.grips.map((u) => /* @__PURE__ */ m(
|
|
951
928
|
"span",
|
|
952
929
|
{
|
|
953
|
-
"data-grip":
|
|
954
|
-
"data-schedule-overlay": `${
|
|
930
|
+
"data-grip": u.kind,
|
|
931
|
+
"data-schedule-overlay": `${u.kind} grip`,
|
|
955
932
|
"aria-hidden": "true",
|
|
956
933
|
className: p.grip,
|
|
957
|
-
style: { left: `${
|
|
934
|
+
style: { left: `${u.x}px`, top: `${u.y}px`, height: `${u.height}px` }
|
|
958
935
|
},
|
|
959
|
-
|
|
936
|
+
u.kind
|
|
960
937
|
)),
|
|
961
|
-
F !== void 0 && k.bars.map((
|
|
938
|
+
F !== void 0 && k.bars.map((u) => /* @__PURE__ */ m(
|
|
962
939
|
"span",
|
|
963
940
|
{
|
|
964
941
|
className: p.barLabel,
|
|
965
|
-
"data-bar-label":
|
|
942
|
+
"data-bar-label": u.subtask.id,
|
|
966
943
|
"data-schedule-overlay": "bar label",
|
|
967
944
|
"data-schedule-may-cover": "",
|
|
968
|
-
"data-on":
|
|
969
|
-
style: { left: `${
|
|
970
|
-
children: /* @__PURE__ */ m("span", { className: p.barLabelText, children: F(
|
|
945
|
+
"data-on": u.dark ? "dark" : "light",
|
|
946
|
+
style: { left: `${u.x}px`, top: `${u.y}px`, width: `${u.width}px`, height: `${u.height}px` },
|
|
947
|
+
children: /* @__PURE__ */ m("span", { className: p.barLabelText, children: F(u.subtask) })
|
|
971
948
|
},
|
|
972
|
-
|
|
949
|
+
u.subtask.id
|
|
973
950
|
)),
|
|
974
|
-
|
|
951
|
+
O !== !1 && k.tooltip !== null && /* @__PURE__ */ m(
|
|
975
952
|
"span",
|
|
976
953
|
{
|
|
977
|
-
ref:
|
|
954
|
+
ref: pe,
|
|
978
955
|
role: "tooltip",
|
|
979
956
|
className: p.tooltip,
|
|
980
957
|
"data-schedule-tooltip": "",
|
|
981
958
|
"data-schedule-overlay": "tooltip",
|
|
982
959
|
style: {
|
|
983
|
-
left: `${
|
|
984
|
-
top: `${
|
|
985
|
-
visibility:
|
|
960
|
+
left: `${_t.x}px`,
|
|
961
|
+
top: `${_t.y}px`,
|
|
962
|
+
visibility: _t.at === Ot ? void 0 : "hidden"
|
|
986
963
|
},
|
|
987
|
-
children: typeof
|
|
964
|
+
children: typeof O == "function" ? O(k.tooltip.target) : /* @__PURE__ */ m(On, { target: k.tooltip.target })
|
|
988
965
|
}
|
|
989
966
|
),
|
|
990
|
-
|
|
967
|
+
b !== null && /* @__PURE__ */ N(
|
|
991
968
|
"span",
|
|
992
969
|
{
|
|
993
|
-
ref:
|
|
970
|
+
ref: me,
|
|
994
971
|
className: p.ghostLabel,
|
|
995
972
|
"data-ghost": "",
|
|
996
973
|
"data-schedule-overlay": "ghost label",
|
|
997
|
-
"data-findings": [
|
|
998
|
-
"data-refused":
|
|
999
|
-
"data-blocked":
|
|
974
|
+
"data-findings": [b.overlap ? "overlap" : "", b.violated ? "violated-dependency" : ""].filter(Boolean).join(" "),
|
|
975
|
+
"data-refused": b.refused ? "" : void 0,
|
|
976
|
+
"data-blocked": b.blocked ? "" : void 0,
|
|
1000
977
|
style: {
|
|
1001
|
-
left: `${
|
|
1002
|
-
top: `${
|
|
1003
|
-
visibility:
|
|
978
|
+
left: `${Ct.x}px`,
|
|
979
|
+
top: `${Ct.y}px`,
|
|
980
|
+
visibility: Ct.at === Dt ? void 0 : "hidden"
|
|
1004
981
|
},
|
|
1005
982
|
children: [
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
983
|
+
B.scheduleGhostTimes(Y.time(new Date(b.from), !1), Y.time(new Date(b.to), !1)),
|
|
984
|
+
b.refused && /* @__PURE__ */ m("span", { className: p.refusal, children: B.scheduleLaneRefused }),
|
|
985
|
+
b.blocked && /* @__PURE__ */ m("span", { className: p.refusal, children: B.scheduleBlockedTime }),
|
|
986
|
+
b.overlap && /* @__PURE__ */ m("span", { className: p.finding, children: B.scheduleOverlap }),
|
|
987
|
+
b.violated && /* @__PURE__ */ m("span", { className: p.finding, children: B.scheduleViolatedDependency })
|
|
1011
988
|
]
|
|
1012
989
|
}
|
|
1013
990
|
),
|
|
@@ -1018,55 +995,66 @@ function Gn(s) {
|
|
|
1018
995
|
/* @__PURE__ */ m("div", { className: p.corner }),
|
|
1019
996
|
/* @__PURE__ */ N("div", { className: p.tickBand, "aria-hidden": "true", "data-schedule-ticks": "", "data-schedule-clip": "time band", children: [
|
|
1020
997
|
k.now !== null && /* @__PURE__ */ m("span", { className: p.now, "data-now": "", "data-schedule-overlay": "now mark", style: { left: `${k.now}px` } }),
|
|
1021
|
-
k.ticks.map((
|
|
998
|
+
k.ticks.map((u) => /* @__PURE__ */ m("span", { className: p.tick, style: { left: `${u.x}px` }, children: u.x >= Le && u.x <= k.width - Le && (ce === 1 || Rt(u.wallClock, ce)) && /* @__PURE__ */ m("span", { className: p.tickLabel, "data-schedule-overlay": "time label", children: k.step >= U ? Y.dateShort(new Date(u.wallClock)) : Y.time(new Date(u.wallClock), !1) }) }, u.wallClock))
|
|
1022
999
|
] }),
|
|
1023
|
-
/* @__PURE__ */ m(
|
|
1024
|
-
|
|
1000
|
+
/* @__PURE__ */ m(ve, { "aria-live": "polite", children: Q !== null && /* @__PURE__ */ m(
|
|
1001
|
+
_n,
|
|
1025
1002
|
{
|
|
1026
|
-
target:
|
|
1027
|
-
lane:
|
|
1003
|
+
target: Q.target,
|
|
1004
|
+
lane: Q.lane === null ? null : e.data.lanes.find((u) => u.id === Q.lane)?.label ?? Q.lane
|
|
1028
1005
|
},
|
|
1029
|
-
|
|
1006
|
+
Q.count
|
|
1030
1007
|
) }),
|
|
1031
|
-
/* @__PURE__ */ m(
|
|
1008
|
+
/* @__PURE__ */ m(ve, { id: Tt, children: k === e.getServerSnapshot() ? B.scheduleKeyHelp : `${B.scheduleSummary({ ...Lt, from: ue(Lt.from), to: ue(Lt.to) })} ${B.scheduleKeyHelp}` })
|
|
1032
1009
|
]
|
|
1033
1010
|
}
|
|
1034
1011
|
),
|
|
1035
1012
|
ds
|
|
1036
1013
|
] });
|
|
1037
1014
|
}
|
|
1038
|
-
function
|
|
1015
|
+
function Nn(s) {
|
|
1039
1016
|
try {
|
|
1040
1017
|
return s.matches(":focus-visible");
|
|
1041
1018
|
} catch {
|
|
1042
1019
|
return !0;
|
|
1043
1020
|
}
|
|
1044
1021
|
}
|
|
1045
|
-
function
|
|
1046
|
-
const e =
|
|
1047
|
-
return
|
|
1022
|
+
function Pn({ id: s, label: t }) {
|
|
1023
|
+
const e = We(), i = W(() => ({ id: s, label: t ?? s, ...e === null ? {} : { parent: e } }), [s, t, e]);
|
|
1024
|
+
return xs(i), null;
|
|
1048
1025
|
}
|
|
1049
|
-
function
|
|
1050
|
-
const
|
|
1051
|
-
return
|
|
1026
|
+
function Gn({ id: s, label: t, children: e }) {
|
|
1027
|
+
const i = We(), n = W(() => ({ id: s, label: t ?? s, ...i === null ? {} : { parent: i } }), [s, t, i]);
|
|
1028
|
+
return Bs(n), /* @__PURE__ */ m(je, { value: s, children: e });
|
|
1052
1029
|
}
|
|
1053
|
-
function
|
|
1030
|
+
function Hn({ data: s, tasks: t }) {
|
|
1054
1031
|
const e = W(() => ({ kind: "subtasks", data: s, tasks: t }), [s, t]);
|
|
1055
1032
|
return bt("Subtasks", e), null;
|
|
1056
1033
|
}
|
|
1057
|
-
function
|
|
1034
|
+
function Yn({ data: s }) {
|
|
1058
1035
|
const t = W(() => ({ kind: "dependencies", data: s }), [s]);
|
|
1059
1036
|
return bt("Dependencies", t), null;
|
|
1060
1037
|
}
|
|
1061
|
-
function
|
|
1038
|
+
function Kn({ data: s }) {
|
|
1062
1039
|
const t = W(() => ({ kind: "blocked", data: s }), [s]);
|
|
1063
1040
|
return bt("BlockedTimes", t), null;
|
|
1064
1041
|
}
|
|
1065
|
-
function
|
|
1042
|
+
function Vn({ data: s }) {
|
|
1066
1043
|
const t = W(() => ({ kind: "milestones", data: s }), [s]);
|
|
1067
1044
|
return bt("Milestones", t), null;
|
|
1068
1045
|
}
|
|
1069
|
-
|
|
1046
|
+
function jn() {
|
|
1047
|
+
try {
|
|
1048
|
+
return process.env.NODE_ENV !== "production";
|
|
1049
|
+
} catch {
|
|
1050
|
+
return !1;
|
|
1051
|
+
}
|
|
1052
|
+
}
|
|
1053
|
+
const es = jn(), Ae = /* @__PURE__ */ new Set();
|
|
1054
|
+
function ot(s, t) {
|
|
1055
|
+
!es || Ae.has(s) || (Ae.add(s), console.warn(`@umriss-ui/schedule: ${t}`));
|
|
1056
|
+
}
|
|
1057
|
+
class Wn {
|
|
1070
1058
|
/** `changed` is called after every registration change. */
|
|
1071
1059
|
constructor(t) {
|
|
1072
1060
|
this.changed = t;
|
|
@@ -1131,14 +1119,45 @@ class Un {
|
|
|
1131
1119
|
rebuild() {
|
|
1132
1120
|
if (!this.dirty) return !1;
|
|
1133
1121
|
this.dirty = !1;
|
|
1134
|
-
const t = (e) => [...e.keys()].sort((
|
|
1122
|
+
const t = (e) => [...e.keys()].sort((i, n) => i - n).map((i) => e.get(i));
|
|
1135
1123
|
this.lanes = t(this.laneEntries), this.groups = t(this.groupEntries), this.layers = t(this.layerEntries), this.subtasks = [], this.dependencies = [], this.blocked = [], this.milestones = [], this.tasks = /* @__PURE__ */ new Map();
|
|
1136
1124
|
for (const e of this.layers)
|
|
1137
1125
|
if (e.kind === "subtasks") {
|
|
1138
1126
|
this.subtasks.push(...e.data);
|
|
1139
|
-
for (const
|
|
1127
|
+
for (const i of e.tasks) this.tasks.set(i.id, i);
|
|
1140
1128
|
} else e.kind === "dependencies" ? this.dependencies.push(...e.data) : e.kind === "milestones" ? this.milestones.push(...e.data) : this.blocked.push(...e.data);
|
|
1141
|
-
return this.subtaskById = new Map(this.subtasks.map((e) => [e.id, e])), this.overlaps =
|
|
1129
|
+
return this.subtaskById = new Map(this.subtasks.map((e) => [e.id, e])), this.overlaps = Xt(this.subtasks), this.violatedById = new Map(qt(this.subtasks, this.dependencies).map((e) => [e.dependency, e])), this.depth = Es(this.subtasks), this.inBlocked = Ke(this.subtasks, this.blocked), this.warnOfMalformedData(), !0;
|
|
1130
|
+
}
|
|
1131
|
+
/** Says in development what the data gets wrong and is drawn, dropped or
|
|
1132
|
+
counted regardless. It runs here, once the parts have registered, so a
|
|
1133
|
+
lane declared after its subtasks is not missing; with no lane declared
|
|
1134
|
+
the lanes are still on their way, and an empty `tasks` is a plan drawn
|
|
1135
|
+
muted on purpose. */
|
|
1136
|
+
warnOfMalformedData() {
|
|
1137
|
+
if (!es) return;
|
|
1138
|
+
const t = (n, o) => {
|
|
1139
|
+
const r = /* @__PURE__ */ new Set();
|
|
1140
|
+
for (const a of o)
|
|
1141
|
+
r.has(a) && ot(`twice:${n}:${a}`, `the ${n} id "${a}" stands twice; give each ${n} an id of its own, or only the first is found.`), r.add(a);
|
|
1142
|
+
};
|
|
1143
|
+
t("subtask", this.subtasks.map((n) => n.id)), t("dependency", this.dependencies.map((n) => n.id)), t("lane", this.lanes.map((n) => n.id));
|
|
1144
|
+
for (const n of this.subtasks)
|
|
1145
|
+
n.to > n.from || ot(`span:${n.id}`, `subtask "${n.id}" does not end after it starts (from ${n.from}, to ${n.to}); a point in time is a Milestone, and a span with no length is drawn as a hairline.`);
|
|
1146
|
+
for (const n of this.layers) {
|
|
1147
|
+
if (n.kind !== "subtasks" || n.tasks.length === 0) continue;
|
|
1148
|
+
const o = new Set(n.tasks.map((r) => r.id));
|
|
1149
|
+
for (const r of n.data)
|
|
1150
|
+
o.has(r.task) || ot(`task:${r.id}`, `subtask "${r.id}" names the task "${r.task}", which is not among the tasks of its Subtasks layer; it is drawn muted. Add the task, or correct the subtask's task.`);
|
|
1151
|
+
}
|
|
1152
|
+
for (const n of this.dependencies)
|
|
1153
|
+
for (const o of [n.from, n.to])
|
|
1154
|
+
this.subtaskById.has(o) || ot(`end:${n.id}:${o}`, `dependency "${n.id}" names the subtask "${o}", and no subtask has that id; the dependency is left out.`);
|
|
1155
|
+
if (this.lanes.length === 0) return;
|
|
1156
|
+
const e = new Set(this.lanes.map((n) => n.id)), i = (n, o) => {
|
|
1157
|
+
for (const { id: r, lane: a } of o)
|
|
1158
|
+
e.has(a) || ot(`lane:${n}:${r}`, `${n} "${r}" is on the lane "${a}", which no Lane declares; it is left out. Declare <Lane id="${a}" />.`);
|
|
1159
|
+
};
|
|
1160
|
+
i("subtask", this.subtasks), i("milestone", this.milestones), i("blocked time", this.blocked);
|
|
1142
1161
|
}
|
|
1143
1162
|
/** The task a dependency belongs to: its departing subtask's. */
|
|
1144
1163
|
taskOfDependency(t) {
|
|
@@ -1148,76 +1167,76 @@ class Un {
|
|
|
1148
1167
|
data knows about it - its task, and the findings it stands in. */
|
|
1149
1168
|
tooltipTargetFor(t) {
|
|
1150
1169
|
if (t.kind === "subtask") {
|
|
1151
|
-
const
|
|
1170
|
+
const n = t.subtask.id, o = this.overlaps.filter((l) => l.first === n || l.second === n).map((l) => this.subtaskById.get(l.first === n ? l.second : l.first)).filter((l) => l !== void 0), r = this.dependencies.filter((l) => l.from === n || l.to === n).map((l) => this.violatedById.get(l.id)).filter((l) => l !== void 0), a = this.inBlocked.filter((l) => l.subtask === n).map((l) => this.blocked.find((d) => d.id === l.blocked)).filter((l) => l !== void 0);
|
|
1152
1171
|
return { kind: "subtask", subtask: t.subtask, task: this.tasks.get(t.subtask.task), overlapping: o, violatedDependencies: r, blocked: a };
|
|
1153
1172
|
}
|
|
1154
1173
|
if (t.kind === "milestone") return { kind: "milestone", milestone: t.milestone };
|
|
1155
1174
|
if (t.kind !== "dependency") return null;
|
|
1156
|
-
const e = t.dependency,
|
|
1175
|
+
const e = t.dependency, i = this.taskOfDependency(e);
|
|
1157
1176
|
return {
|
|
1158
1177
|
kind: "dependency",
|
|
1159
1178
|
dependency: e,
|
|
1160
|
-
task:
|
|
1179
|
+
task: i !== null ? this.tasks.get(i) : void 0,
|
|
1161
1180
|
from: this.subtaskById.get(e.from),
|
|
1162
1181
|
to: this.subtaskById.get(e.to),
|
|
1163
1182
|
violated: this.violatedById.get(e.id)
|
|
1164
1183
|
};
|
|
1165
1184
|
}
|
|
1166
1185
|
}
|
|
1167
|
-
const
|
|
1168
|
-
function
|
|
1169
|
-
s.save(), s.beginPath(), s.rect(t, e,
|
|
1170
|
-
for (let r = t -
|
|
1171
|
-
s.moveTo(r, e +
|
|
1186
|
+
const zn = 6;
|
|
1187
|
+
function ss(s, t, e, i, n, o) {
|
|
1188
|
+
s.save(), s.beginPath(), s.rect(t, e, i, n), s.clip(), s.globalAlpha = 0.35, s.strokeStyle = o, s.lineWidth = 1, s.beginPath();
|
|
1189
|
+
for (let r = t - n; r < t + i + n; r += zn)
|
|
1190
|
+
s.moveTo(r, e + n), s.lineTo(r + n, e);
|
|
1172
1191
|
s.stroke(), s.restore();
|
|
1173
1192
|
}
|
|
1174
|
-
function
|
|
1175
|
-
if (
|
|
1176
|
-
const { width:
|
|
1177
|
-
for (const r of
|
|
1193
|
+
function Un(s, t, e, i) {
|
|
1194
|
+
if (i.size === 0) return;
|
|
1195
|
+
const { width: n, height: o } = t.view;
|
|
1196
|
+
for (const r of i) {
|
|
1178
1197
|
const a = J(e, r);
|
|
1179
1198
|
if (a === null) continue;
|
|
1180
1199
|
const { top: l, height: d } = a;
|
|
1181
|
-
l + d < 0 || l > o || (s.globalAlpha = 0.6, s.fillStyle = t.colours.surface, s.fillRect(0, l,
|
|
1200
|
+
l + d < 0 || l > o || (s.globalAlpha = 0.6, s.fillStyle = t.colours.surface, s.fillRect(0, l, n, d), s.globalAlpha = 1, ss(s, 0, l, n, d, t.colours.muted));
|
|
1182
1201
|
}
|
|
1183
1202
|
}
|
|
1184
|
-
function
|
|
1185
|
-
const { data:
|
|
1186
|
-
if (
|
|
1187
|
-
for (const
|
|
1188
|
-
const o =
|
|
1203
|
+
function Xn(s, t, e) {
|
|
1204
|
+
const { data: i } = t;
|
|
1205
|
+
if (i.violatedById.size !== 0)
|
|
1206
|
+
for (const n of i.violatedById.values()) {
|
|
1207
|
+
const o = i.dependencies.find((c) => c.id === n.dependency), r = o === void 0 ? void 0 : i.subtaskById.get(o.to);
|
|
1189
1208
|
if (r === void 0) continue;
|
|
1190
1209
|
const a = J(e, r.lane);
|
|
1191
1210
|
if (a === null || !a.miniature) continue;
|
|
1192
|
-
const l =
|
|
1211
|
+
const l = st(e.rows, a.top + e.scrollY);
|
|
1193
1212
|
if (l === null) continue;
|
|
1194
|
-
const d =
|
|
1195
|
-
|
|
1213
|
+
const d = $(e, n.arrival), h = Math.max(d + 2, $(e, n.arrival + n.shortBy));
|
|
1214
|
+
Gt(s, t, d, h, l.top - e.scrollY + 1, 3);
|
|
1196
1215
|
}
|
|
1197
1216
|
}
|
|
1198
|
-
function
|
|
1217
|
+
function Gt(s, t, e, i, n, o) {
|
|
1199
1218
|
if (!t.colours.forced) {
|
|
1200
|
-
s.fillStyle = t.colours.alarm, s.fillRect(e,
|
|
1219
|
+
s.fillStyle = t.colours.alarm, s.fillRect(e, n, i - e, o);
|
|
1201
1220
|
return;
|
|
1202
1221
|
}
|
|
1203
|
-
s.strokeStyle = t.colours.alarm, s.lineWidth = o, s.setLineDash([4, 3]), s.beginPath(), s.moveTo(e,
|
|
1222
|
+
s.strokeStyle = t.colours.alarm, s.lineWidth = o, s.setLineDash([4, 3]), s.beginPath(), s.moveTo(e, n + o / 2), s.lineTo(i, n + o / 2), s.stroke(), s.setLineDash([]);
|
|
1204
1223
|
}
|
|
1205
|
-
function
|
|
1206
|
-
const
|
|
1207
|
-
if (
|
|
1208
|
-
const o = Math.max(0,
|
|
1209
|
-
r <= o || (s.globalAlpha = 0.1, s.fillStyle = t.colours.muted, s.fillRect(o,
|
|
1224
|
+
function qn(s, t, e, i) {
|
|
1225
|
+
const n = J(e, i.lane);
|
|
1226
|
+
if (n === null || n.top + n.height < 0 || n.top > t.view.height) return;
|
|
1227
|
+
const o = Math.max(0, $(e, i.from)), r = Math.min(t.view.width, $(e, i.to));
|
|
1228
|
+
r <= o || (s.globalAlpha = 0.1, s.fillStyle = t.colours.muted, s.fillRect(o, n.top, r - o, n.height), s.globalAlpha = 1, ss(s, o, n.top, r - o, n.height, t.colours.muted));
|
|
1210
1229
|
}
|
|
1211
|
-
function
|
|
1212
|
-
const
|
|
1213
|
-
if (
|
|
1214
|
-
const o =
|
|
1215
|
-
if (s.fillStyle = t.colours.alarm, s.globalAlpha = 0.14, s.fillRect(o,
|
|
1216
|
-
const a =
|
|
1217
|
-
a !== null &&
|
|
1230
|
+
function Ht(s, t, e, i) {
|
|
1231
|
+
const n = J(e, i.lane);
|
|
1232
|
+
if (n === null) return;
|
|
1233
|
+
const o = $(e, i.from), r = Math.max(o + 2, $(e, i.to));
|
|
1234
|
+
if (s.fillStyle = t.colours.alarm, s.globalAlpha = 0.14, s.fillRect(o, n.top + 1, r - o, Math.max(1, n.height - 2)), s.globalAlpha = 1, Gt(s, t, o, r, n.top + 1, Math.min(3, Math.max(1, n.height - 1))), n.miniature) {
|
|
1235
|
+
const a = st(e.rows, n.top + e.scrollY);
|
|
1236
|
+
a !== null && Gt(s, t, o, r, a.top - e.scrollY + 1, 3);
|
|
1218
1237
|
}
|
|
1219
1238
|
}
|
|
1220
|
-
const
|
|
1239
|
+
const Jn = {
|
|
1221
1240
|
line: "var(--u-hairline)",
|
|
1222
1241
|
lineStrong: "var(--u-hairline-strong)",
|
|
1223
1242
|
text: "var(--u-color-text)",
|
|
@@ -1231,7 +1250,7 @@ const Qn = {
|
|
|
1231
1250
|
/* What text and marks take ON a filled bar - the same token the bar labels
|
|
1232
1251
|
use in CSS, so a cap and the label beside it are one colour. */
|
|
1233
1252
|
onAccent: "var(--u-color-on-accent)"
|
|
1234
|
-
},
|
|
1253
|
+
}, ns = {
|
|
1235
1254
|
line: "GrayText",
|
|
1236
1255
|
lineStrong: "CanvasText",
|
|
1237
1256
|
text: "CanvasText",
|
|
@@ -1241,282 +1260,282 @@ const Qn = {
|
|
|
1241
1260
|
active: "Highlight",
|
|
1242
1261
|
now: "GrayText",
|
|
1243
1262
|
onAccent: "Canvas"
|
|
1244
|
-
},
|
|
1245
|
-
function
|
|
1246
|
-
const e =
|
|
1247
|
-
for (const r of t.tasks.values())
|
|
1248
|
-
const
|
|
1249
|
-
for (const r of t.tasks.values()) o.set(r.id,
|
|
1263
|
+
}, Zn = (s) => s ? ns : Jn, Qn = () => typeof window < "u" && typeof window.matchMedia == "function" && window.matchMedia("(forced-colors: active)").matches;
|
|
1264
|
+
function ti(s, t) {
|
|
1265
|
+
const e = Qn(), i = {};
|
|
1266
|
+
for (const r of t.tasks.values()) i[`task:${r.id}`] = e ? ns.text : r.color;
|
|
1267
|
+
const n = Ss(s, { ...Zn(e), ...i }), o = /* @__PURE__ */ new Map();
|
|
1268
|
+
for (const r of t.tasks.values()) o.set(r.id, n[`task:${r.id}`] ?? r.color);
|
|
1250
1269
|
return {
|
|
1251
|
-
line:
|
|
1252
|
-
lineStrong:
|
|
1253
|
-
text:
|
|
1254
|
-
muted:
|
|
1255
|
-
alarm:
|
|
1256
|
-
surface:
|
|
1257
|
-
active:
|
|
1258
|
-
now:
|
|
1259
|
-
onAccent:
|
|
1270
|
+
line: n.line,
|
|
1271
|
+
lineStrong: n.lineStrong,
|
|
1272
|
+
text: n.text,
|
|
1273
|
+
muted: n.muted,
|
|
1274
|
+
alarm: n.alarm,
|
|
1275
|
+
surface: n.surface,
|
|
1276
|
+
active: n.active,
|
|
1277
|
+
now: n.now,
|
|
1278
|
+
onAccent: n.onAccent,
|
|
1260
1279
|
tasks: o,
|
|
1261
1280
|
forced: e
|
|
1262
1281
|
};
|
|
1263
1282
|
}
|
|
1264
|
-
function
|
|
1283
|
+
function ct(s) {
|
|
1265
1284
|
const t = s.match(/[\d.]+/g);
|
|
1266
1285
|
return t === null || t.length < 3 ? null : [Number(t[0]), Number(t[1]), Number(t[2])];
|
|
1267
1286
|
}
|
|
1268
|
-
function
|
|
1269
|
-
const t =
|
|
1270
|
-
return t === null ? 0 : is(
|
|
1287
|
+
function Ce(s) {
|
|
1288
|
+
const t = ct(s);
|
|
1289
|
+
return t === null ? 0 : os(is(t));
|
|
1271
1290
|
}
|
|
1272
|
-
function
|
|
1291
|
+
function is(s) {
|
|
1273
1292
|
return s.map((t) => {
|
|
1274
1293
|
const e = t / 255;
|
|
1275
1294
|
return e <= 0.04045 ? e / 12.92 : ((e + 0.055) / 1.055) ** 2.4;
|
|
1276
1295
|
});
|
|
1277
1296
|
}
|
|
1278
|
-
function
|
|
1297
|
+
function os([s, t, e]) {
|
|
1279
1298
|
return 0.2126 * s + 0.7152 * t + 0.0722 * e;
|
|
1280
1299
|
}
|
|
1281
|
-
function
|
|
1282
|
-
const e =
|
|
1283
|
-
return (Math.max(e,
|
|
1300
|
+
function De(s, t) {
|
|
1301
|
+
const e = Ce(s), i = Ce(t);
|
|
1302
|
+
return (Math.max(e, i) + 0.05) / (Math.min(e, i) + 0.05);
|
|
1284
1303
|
}
|
|
1285
|
-
function
|
|
1304
|
+
function _e(s, t, e) {
|
|
1286
1305
|
if (s === null) return null;
|
|
1287
|
-
const
|
|
1288
|
-
s.width !==
|
|
1306
|
+
const i = typeof window > "u" ? 1 : window.devicePixelRatio || 1, n = Math.round(t * i), o = Math.round(e * i);
|
|
1307
|
+
s.width !== n && (s.width = n), s.height !== o && (s.height = o);
|
|
1289
1308
|
const r = s.getContext("2d");
|
|
1290
|
-
return r === null ? null : (r.setTransform(
|
|
1309
|
+
return r === null ? null : (r.setTransform(i, 0, 0, i, 0, 0), r.clearRect(0, 0, t, e), r);
|
|
1291
1310
|
}
|
|
1292
|
-
function
|
|
1293
|
-
const { data: e, view:
|
|
1294
|
-
|
|
1295
|
-
for (const o of e.blocked)
|
|
1296
|
-
|
|
1311
|
+
function ei(s, t) {
|
|
1312
|
+
const { data: e, view: i } = t, n = i.viewport();
|
|
1313
|
+
ii(s, t, n);
|
|
1314
|
+
for (const o of e.blocked) qn(s, t, n, o);
|
|
1315
|
+
oi(s, t);
|
|
1297
1316
|
for (const o of e.layers) {
|
|
1298
1317
|
if (o.kind === "blocked" || o.kind === "milestones") continue;
|
|
1299
1318
|
const r = new Set(o.data);
|
|
1300
1319
|
if (o.kind === "dependencies")
|
|
1301
|
-
for (const a of
|
|
1320
|
+
for (const a of i.paths) r.has(a.dependency) && Vs(a, i.width, i.height) && Yt(s, t, a, !1);
|
|
1302
1321
|
else
|
|
1303
|
-
for (const a of
|
|
1322
|
+
for (const a of i.boxes) r.has(a.subtask) && as(s, t, a, 1);
|
|
1304
1323
|
}
|
|
1305
|
-
for (const o of e.overlaps)
|
|
1306
|
-
for (const o of e.inBlocked)
|
|
1307
|
-
|
|
1308
|
-
for (const o of e.milestones)
|
|
1309
|
-
|
|
1324
|
+
for (const o of e.overlaps) Ht(s, t, n, o);
|
|
1325
|
+
for (const o of e.inBlocked) Ht(s, t, n, o);
|
|
1326
|
+
Xn(s, t, n);
|
|
1327
|
+
for (const o of e.milestones) ls(s, t, n, o, !1);
|
|
1328
|
+
fi(s, t);
|
|
1310
1329
|
}
|
|
1311
|
-
function
|
|
1312
|
-
const { view: e, hover:
|
|
1330
|
+
function si(s, t) {
|
|
1331
|
+
const { view: e, hover: i } = t, n = e.viewport();
|
|
1313
1332
|
if (t.ghost === null) {
|
|
1314
|
-
if (
|
|
1315
|
-
const
|
|
1316
|
-
|
|
1317
|
-
} else if (
|
|
1318
|
-
const
|
|
1319
|
-
|
|
1320
|
-
} else
|
|
1333
|
+
if (i.kind === "subtask") {
|
|
1334
|
+
const c = e.boxById.get(i.subtask.id);
|
|
1335
|
+
c !== void 0 && ci(s, t, c);
|
|
1336
|
+
} else if (i.kind === "dependency") {
|
|
1337
|
+
const c = e.paths.find((f) => f.dependency === i.dependency);
|
|
1338
|
+
c !== void 0 && Yt(s, t, c, !0);
|
|
1339
|
+
} else i.kind === "milestone" && ls(s, t, n, i.milestone, !0);
|
|
1321
1340
|
return;
|
|
1322
1341
|
}
|
|
1323
1342
|
const o = t.ghost, { ghost: r, overlaps: a, violated: l } = o;
|
|
1324
|
-
|
|
1325
|
-
const d =
|
|
1343
|
+
Un(s, t, n, o.refusedLanes);
|
|
1344
|
+
const d = rs(n, r);
|
|
1326
1345
|
if (d === null) return;
|
|
1327
|
-
for (const
|
|
1328
|
-
const h = new Set(l.map((
|
|
1329
|
-
for (const
|
|
1330
|
-
if (
|
|
1331
|
-
const f = e.boxById.get(
|
|
1346
|
+
for (const c of a) Ht(s, t, n, c);
|
|
1347
|
+
const h = new Set(l.map((c) => c.dependency));
|
|
1348
|
+
for (const c of t.data.dependencies) {
|
|
1349
|
+
if (c.from !== r.id && c.to !== r.id) continue;
|
|
1350
|
+
const f = e.boxById.get(c.from === r.id ? c.to : c.from);
|
|
1332
1351
|
if (f === void 0) continue;
|
|
1333
|
-
const g =
|
|
1334
|
-
|
|
1352
|
+
const g = c.from === r.id ? Nt(n, c, d, f, e.options) : Nt(n, c, f, d, e.options);
|
|
1353
|
+
Yt(s, t, g, !0, h.has(c.id));
|
|
1335
1354
|
}
|
|
1336
|
-
|
|
1355
|
+
as(s, { ...t, selectedTask: null }, d, 0.55), s.strokeStyle = t.colours.text, s.lineWidth = 1, s.setLineDash([3, 2]), s.strokeRect(d.outerFrom + 0.5, d.y + 0.5, Math.max(1, d.outerTo - d.outerFrom - 1), d.height - 1), s.setLineDash([]), o.tether !== null && ni(s, t, d, o.tether);
|
|
1337
1356
|
}
|
|
1338
|
-
function
|
|
1339
|
-
const
|
|
1340
|
-
Math.hypot(
|
|
1357
|
+
function ni(s, t, e, i) {
|
|
1358
|
+
const n = Math.max(e.outerFrom, Math.min(e.outerTo, i.x)), o = Math.max(e.y, Math.min(e.y + e.height, i.y));
|
|
1359
|
+
Math.hypot(i.x - n, i.y - o) < 2 || (s.strokeStyle = t.colours.text, s.lineWidth = 1, s.setLineDash([2, 3]), s.beginPath(), s.moveTo(n + 0.5, o + 0.5), s.lineTo(i.x + 0.5, i.y + 0.5), s.stroke(), s.setLineDash([]));
|
|
1341
1360
|
}
|
|
1342
|
-
function
|
|
1343
|
-
const e =
|
|
1361
|
+
function rs(s, t) {
|
|
1362
|
+
const e = Zt(s.rows, t.lane);
|
|
1344
1363
|
return e === null ? null : Xe(s, t, e, 0);
|
|
1345
1364
|
}
|
|
1346
|
-
function
|
|
1347
|
-
const { view:
|
|
1348
|
-
s.lineWidth = 1, s.strokeStyle =
|
|
1365
|
+
function ii(s, t, e) {
|
|
1366
|
+
const { view: i, colours: n, bands: o } = t, { width: r, height: a } = i;
|
|
1367
|
+
s.lineWidth = 1, s.strokeStyle = n.line, s.beginPath();
|
|
1349
1368
|
for (const h of o.ticks)
|
|
1350
1369
|
s.moveTo(h.x + 0.5, 0), s.lineTo(h.x + 0.5, a);
|
|
1351
1370
|
for (const h of e.rows.rows) {
|
|
1352
|
-
const
|
|
1353
|
-
|
|
1371
|
+
const c = h.top + h.height - e.scrollY - 0.5;
|
|
1372
|
+
c < 0 || c > a || (s.moveTo(0, c), s.lineTo(r, c));
|
|
1354
1373
|
}
|
|
1355
|
-
const l = [...e.rows.slots.values()].filter((h) => h.miniature).sort((h,
|
|
1356
|
-
l.forEach((h,
|
|
1357
|
-
const f = l[
|
|
1374
|
+
const l = [...e.rows.slots.values()].filter((h) => h.miniature).sort((h, c) => h.top - c.top);
|
|
1375
|
+
l.forEach((h, c) => {
|
|
1376
|
+
const f = l[c + 1];
|
|
1358
1377
|
if (f === void 0 || f.top !== h.top + h.height || f.group === h.group) return;
|
|
1359
1378
|
const g = h.top + h.height - e.scrollY - 0.5;
|
|
1360
1379
|
g < 0 || g > a || (s.moveTo(0, g), s.lineTo(r, g));
|
|
1361
|
-
}), s.stroke(), s.strokeStyle =
|
|
1380
|
+
}), s.stroke(), s.strokeStyle = n.lineStrong, s.beginPath();
|
|
1362
1381
|
for (const h of o.days)
|
|
1363
1382
|
s.moveTo(h.x + 0.5, 0), s.lineTo(h.x + 0.5, a);
|
|
1364
1383
|
s.stroke();
|
|
1365
|
-
const d = Is(
|
|
1384
|
+
const d = Is(i.options.calendar);
|
|
1366
1385
|
if (d.length > 0) {
|
|
1367
|
-
s.strokeStyle =
|
|
1386
|
+
s.strokeStyle = n.muted, s.setLineDash([2, 3]), s.beginPath();
|
|
1368
1387
|
for (const h of d) {
|
|
1369
|
-
const
|
|
1370
|
-
|
|
1388
|
+
const c = Math.round(e.scale.toPx(h.workingTime)) + 0.5;
|
|
1389
|
+
c < 0 || c > r || (s.moveTo(c, 0), s.lineTo(c, a));
|
|
1371
1390
|
}
|
|
1372
1391
|
s.stroke(), s.setLineDash([]);
|
|
1373
1392
|
}
|
|
1374
1393
|
}
|
|
1375
|
-
function
|
|
1394
|
+
function oi(s, t) {
|
|
1376
1395
|
const e = t.view.nowX();
|
|
1377
1396
|
e !== null && (s.fillStyle = t.colours.now, s.fillRect(e, 0, 2, t.view.height));
|
|
1378
1397
|
}
|
|
1379
|
-
function
|
|
1380
|
-
const
|
|
1381
|
-
s.fillStyle =
|
|
1398
|
+
function ri(s, t, e, i) {
|
|
1399
|
+
const n = ut(t.colours, t, e.subtask.task, e.subtask.id);
|
|
1400
|
+
s.fillStyle = n;
|
|
1382
1401
|
for (const [o, r] of [
|
|
1383
1402
|
[e.outerFrom, e.mainFrom],
|
|
1384
1403
|
[e.mainTo, e.outerTo]
|
|
1385
1404
|
])
|
|
1386
|
-
r <= o || (s.globalAlpha = 0.28 *
|
|
1387
|
-
s.globalAlpha =
|
|
1405
|
+
r <= o || (s.globalAlpha = 0.28 * i, s.fillRect(o, e.y, r - o, e.height));
|
|
1406
|
+
s.globalAlpha = i, s.fillRect(e.mainFrom, e.y, Math.max(1, e.mainTo - e.mainFrom), e.height), s.globalAlpha = 1;
|
|
1388
1407
|
}
|
|
1389
|
-
function
|
|
1408
|
+
function te(s, t, e) {
|
|
1390
1409
|
if (s.dashed) return { fill: null, onDark: !1 };
|
|
1391
|
-
const
|
|
1392
|
-
return { fill:
|
|
1410
|
+
const i = s.muted ? ai(t, e.surface, 0.5) : t;
|
|
1411
|
+
return { fill: i, onDark: De(i, e.onAccent) > De(i, e.text) };
|
|
1393
1412
|
}
|
|
1394
|
-
function
|
|
1395
|
-
const
|
|
1396
|
-
if (
|
|
1397
|
-
const o = (r) => Math.round(
|
|
1413
|
+
function ai(s, t, e) {
|
|
1414
|
+
const i = ct(s), n = ct(t);
|
|
1415
|
+
if (i === null || n === null) return s;
|
|
1416
|
+
const o = (r) => Math.round(i[r] + (n[r] - i[r]) * e);
|
|
1398
1417
|
return `rgb(${o(0)}, ${o(1)}, ${o(2)})`;
|
|
1399
1418
|
}
|
|
1400
|
-
function
|
|
1401
|
-
const e =
|
|
1419
|
+
function Oe(s, t) {
|
|
1420
|
+
const e = ct(s);
|
|
1402
1421
|
if (e === null || t === 0) return s;
|
|
1403
|
-
const
|
|
1404
|
-
const d = l + (
|
|
1422
|
+
const i = is(e), n = os(i), [o, r, a] = i.map((l) => {
|
|
1423
|
+
const d = l + (n - l) * t, h = d <= 31308e-7 ? d * 12.92 : 1.055 * d ** (1 / 2.4) - 0.055;
|
|
1405
1424
|
return Math.round(Math.min(1, Math.max(0, h)) * 255);
|
|
1406
1425
|
});
|
|
1407
1426
|
return `rgb(${o}, ${r}, ${a})`;
|
|
1408
1427
|
}
|
|
1409
|
-
function
|
|
1410
|
-
const
|
|
1411
|
-
return t.selectedTask === null ?
|
|
1428
|
+
function ut(s, t, e, i) {
|
|
1429
|
+
const n = (e === null ? void 0 : s.tasks.get(e)) ?? s.muted;
|
|
1430
|
+
return t.selectedTask === null ? n : e !== t.selectedTask ? s.forced ? s.muted : Oe(n, 1) : s.forced || t.selectedSubtask === null || i === null || i === t.selectedSubtask ? n : Oe(n, 0.5);
|
|
1412
1431
|
}
|
|
1413
|
-
const
|
|
1414
|
-
function
|
|
1415
|
-
const { view:
|
|
1416
|
-
if (!
|
|
1432
|
+
const li = 2;
|
|
1433
|
+
function as(s, t, e, i) {
|
|
1434
|
+
const { view: n, colours: o } = t;
|
|
1435
|
+
if (!Bt(e, n.width, n.height)) return;
|
|
1417
1436
|
if (e.miniature) {
|
|
1418
|
-
|
|
1437
|
+
ri(s, t, e, i);
|
|
1419
1438
|
return;
|
|
1420
1439
|
}
|
|
1421
|
-
const r = wt(e.subtask.appearance), a =
|
|
1440
|
+
const r = wt(e.subtask.appearance), a = ut(o, t, e.subtask.task, e.subtask.id), l = te(r, a, o), d = e.y, h = e.height, c = Math.max(1, e.mainTo - e.mainFrom), f = l.onDark ? o.onAccent : o.text;
|
|
1422
1441
|
s.lineWidth = 1, s.fillStyle = a, s.strokeStyle = a;
|
|
1423
|
-
for (const [v,
|
|
1442
|
+
for (const [v, A] of [
|
|
1424
1443
|
[e.outerFrom, e.mainFrom],
|
|
1425
1444
|
[e.mainTo, e.outerTo]
|
|
1426
1445
|
])
|
|
1427
|
-
|
|
1428
|
-
l.fill !== null && (s.globalAlpha =
|
|
1446
|
+
A <= v || (s.globalAlpha = 0.28 * i, s.fillRect(v, d, A - v, h), s.globalAlpha = i, s.strokeRect(v + 0.5, d + 0.5, A - v - 1, h - 1));
|
|
1447
|
+
l.fill !== null && (s.globalAlpha = i, s.fillStyle = l.fill, s.fillRect(e.mainFrom, d, c, h));
|
|
1429
1448
|
const g = e.subtask.progress;
|
|
1430
1449
|
if (g !== void 0) {
|
|
1431
|
-
const v = Math.min(4, Math.max(2, Math.round(h / 6))),
|
|
1432
|
-
s.fillStyle = l.fill === null ? a : f, s.globalAlpha = 0.3 *
|
|
1450
|
+
const v = Math.min(4, Math.max(2, Math.round(h / 6))), A = d + h - v - li, I = Math.round(c * Math.max(0, Math.min(1, g)));
|
|
1451
|
+
s.fillStyle = l.fill === null ? a : f, s.globalAlpha = 0.3 * i, s.fillRect(e.mainFrom, A, c, v), s.globalAlpha = i, I > 0 && s.fillRect(e.mainFrom, A, I, v);
|
|
1433
1452
|
}
|
|
1434
1453
|
if (r.hatched) {
|
|
1435
|
-
const v = Math.max(1, Math.min(Ue, Math.floor((
|
|
1436
|
-
s.globalAlpha =
|
|
1454
|
+
const v = Math.max(1, Math.min(Ue, Math.floor((c - 2 * rt) / 3))), A = c >= 4 * v ? rt : 0, I = h >= 4 * rt ? rt : 0;
|
|
1455
|
+
s.globalAlpha = i, s.fillStyle = f, s.fillRect(e.mainFrom + A, d + I, v, h - 2 * I), s.fillRect(e.mainTo - A - v, d + I, v, h - 2 * I);
|
|
1437
1456
|
}
|
|
1438
|
-
r.open &&
|
|
1457
|
+
r.open && hi(s, e, d, h, o.surface, n.width), r.dashed && (s.globalAlpha = i, s.strokeStyle = a, s.setLineDash([4, 3]), s.strokeRect(e.mainFrom + 0.5, d + 0.5, c - 1, h - 1), s.setLineDash([])), s.globalAlpha = 1, e.depth > 0 && i === 1 && (s.strokeStyle = o.surface, s.strokeRect(e.outerFrom - 0.5, d - 0.5, e.outerTo - e.outerFrom + 1, h + 1));
|
|
1439
1458
|
}
|
|
1440
|
-
const
|
|
1441
|
-
function
|
|
1442
|
-
const r = t.mainFrom < 0, a = t.mainTo > o, l = Math.max(1, Math.min(t.mainTo, o) - Math.max(t.mainFrom, 0)), d = Math.min(
|
|
1443
|
-
r &&
|
|
1459
|
+
const di = 16;
|
|
1460
|
+
function hi(s, t, e, i, n, o) {
|
|
1461
|
+
const r = t.mainFrom < 0, a = t.mainTo > o, l = Math.max(1, Math.min(t.mainTo, o) - Math.max(t.mainFrom, 0)), d = Math.min(di, l);
|
|
1462
|
+
r && Fe(s, 0, d, e, i, n), a && Fe(s, o, -d, e, i, n);
|
|
1444
1463
|
}
|
|
1445
|
-
function
|
|
1464
|
+
function Fe(s, t, e, i, n, o) {
|
|
1446
1465
|
const r = s.createLinearGradient(t, 0, t + e, 0);
|
|
1447
|
-
r.addColorStop(0,
|
|
1466
|
+
r.addColorStop(0, Ee(o, 1)), r.addColorStop(1, Ee(o, 0)), s.globalAlpha = 1, s.fillStyle = r, s.fillRect(Math.min(t, t + e), i, Math.abs(e), n);
|
|
1448
1467
|
}
|
|
1449
|
-
function
|
|
1450
|
-
const e =
|
|
1468
|
+
function Ee(s, t) {
|
|
1469
|
+
const e = ct(s);
|
|
1451
1470
|
return e === null ? s : `rgba(${e[0]}, ${e[1]}, ${e[2]}, ${t})`;
|
|
1452
1471
|
}
|
|
1453
|
-
function
|
|
1454
|
-
const { data: o, colours: r } = t, a = o.taskOfDependency(e.dependency), l =
|
|
1455
|
-
if (s.strokeStyle = h, s.fillStyle = h, s.lineWidth =
|
|
1472
|
+
function Yt(s, t, e, i, n) {
|
|
1473
|
+
const { data: o, colours: r } = t, a = o.taskOfDependency(e.dependency), l = n ?? o.violatedById.has(e.dependency.id), d = a !== null && a === t.selectedTask, h = l ? r.alarm : ut(r, t, a, null);
|
|
1474
|
+
if (s.strokeStyle = h, s.fillStyle = h, s.lineWidth = i || d ? 2 : 1.25, s.setLineDash(l ? [4, 3] : []), s.beginPath(), s.moveTo(e.x1, e.y1), e.kind === "curve")
|
|
1456
1475
|
s.bezierCurveTo(e.c1x, e.y1, e.c2x, e.y2, e.x2, e.y2);
|
|
1457
1476
|
else
|
|
1458
|
-
for (let
|
|
1477
|
+
for (let c = 2; c + 1 < e.points.length; c += 2) s.lineTo(e.points[c], e.points[c + 1]);
|
|
1459
1478
|
if (s.stroke(), s.setLineDash([]), e.ends === "dot")
|
|
1460
|
-
for (const [
|
|
1479
|
+
for (const [c, f] of [
|
|
1461
1480
|
[e.x1, e.y1],
|
|
1462
1481
|
[e.x2, e.y2]
|
|
1463
1482
|
])
|
|
1464
|
-
s.beginPath(), s.arc(
|
|
1483
|
+
s.beginPath(), s.arc(c, f, l ? 3 : 2.5, 0, Math.PI * 2), s.fill();
|
|
1465
1484
|
}
|
|
1466
|
-
function
|
|
1467
|
-
const o =
|
|
1485
|
+
function ls(s, t, e, i, n) {
|
|
1486
|
+
const o = Qt(e, i);
|
|
1468
1487
|
if (o === null || o.x < -o.half || o.x > t.view.width + o.half) return;
|
|
1469
1488
|
const r = (a) => {
|
|
1470
1489
|
s.beginPath(), s.moveTo(o.x, o.y - a), s.lineTo(o.x + a, o.y), s.lineTo(o.x, o.y + a), s.lineTo(o.x - a, o.y), s.closePath();
|
|
1471
1490
|
};
|
|
1472
|
-
|
|
1491
|
+
n && (r(o.half + 3), s.fillStyle = t.colours.active, s.fill()), r(o.half + 1), s.fillStyle = t.colours.surface, s.fill(), r(o.half), s.fillStyle = t.colours.text, s.fill();
|
|
1473
1492
|
}
|
|
1474
|
-
function
|
|
1475
|
-
const { colours:
|
|
1476
|
-
if (
|
|
1477
|
-
s.strokeStyle =
|
|
1493
|
+
function ci(s, t, e) {
|
|
1494
|
+
const { colours: i } = t, n = wt(e.subtask.appearance), o = te(n, ut(i, t, e.subtask.task, e.subtask.id), i);
|
|
1495
|
+
if (i.forced) {
|
|
1496
|
+
s.strokeStyle = i.active, s.lineWidth = 2, s.strokeRect(e.outerFrom - 2, e.y - 2, Math.max(1, e.outerTo - e.outerFrom) + 4, e.height + 4);
|
|
1478
1497
|
return;
|
|
1479
1498
|
}
|
|
1480
|
-
s.globalAlpha =
|
|
1499
|
+
s.globalAlpha = ui, s.fillStyle = o.onDark ? i.onAccent : i.text, s.fillRect(e.outerFrom, e.y, Math.max(1, e.outerTo - e.outerFrom), e.height), s.globalAlpha = 1;
|
|
1481
1500
|
}
|
|
1482
|
-
const
|
|
1483
|
-
function
|
|
1501
|
+
const ui = 0.2;
|
|
1502
|
+
function fi(s, t) {
|
|
1484
1503
|
const e = t.selectedTask;
|
|
1485
1504
|
if (e !== null) {
|
|
1486
1505
|
s.strokeStyle = t.colours.text;
|
|
1487
|
-
for (const
|
|
1488
|
-
if (
|
|
1489
|
-
const
|
|
1490
|
-
s.lineWidth =
|
|
1491
|
-
const o =
|
|
1492
|
-
s.strokeRect(
|
|
1506
|
+
for (const i of t.view.boxes) {
|
|
1507
|
+
if (i.subtask.task !== e) continue;
|
|
1508
|
+
const n = i.subtask.id === t.selectedSubtask;
|
|
1509
|
+
s.lineWidth = n ? 2 : 1;
|
|
1510
|
+
const o = n ? 1 : 0.5;
|
|
1511
|
+
s.strokeRect(i.outerFrom - o, i.y - o, i.outerTo - i.outerFrom + 2 * o, i.height + 2 * o);
|
|
1493
1512
|
}
|
|
1494
1513
|
}
|
|
1495
1514
|
}
|
|
1496
|
-
const gt = 32,
|
|
1497
|
-
function
|
|
1515
|
+
const gt = 32, mi = 18;
|
|
1516
|
+
function $e(s, t) {
|
|
1498
1517
|
if (!(t > 2 * gt)) return 0;
|
|
1499
|
-
const e = gt - s,
|
|
1500
|
-
if (
|
|
1501
|
-
const o = Math.min(1,
|
|
1518
|
+
const e = gt - s, i = s - (t - gt), n = Math.max(e, i);
|
|
1519
|
+
if (n <= 0) return 0;
|
|
1520
|
+
const o = Math.min(1, n / gt), r = mi * o * o;
|
|
1502
1521
|
return e > 0 ? -r : r;
|
|
1503
1522
|
}
|
|
1504
|
-
function
|
|
1505
|
-
const
|
|
1506
|
-
const r =
|
|
1507
|
-
return
|
|
1523
|
+
function dt(s, t, e) {
|
|
1524
|
+
const i = (n, o) => {
|
|
1525
|
+
const r = nt(n);
|
|
1526
|
+
return n.lane === o.lane && r.from < o.to && o.from < r.to;
|
|
1508
1527
|
};
|
|
1509
|
-
return e.some((
|
|
1528
|
+
return e.some((n) => i(s, n) && !(t !== null && i(t, n)));
|
|
1510
1529
|
}
|
|
1511
|
-
function
|
|
1512
|
-
const
|
|
1513
|
-
if (
|
|
1530
|
+
function pi(s, t, e, i) {
|
|
1531
|
+
const n = /* @__PURE__ */ new Set();
|
|
1532
|
+
if (i === void 0) return n;
|
|
1514
1533
|
for (const o of s)
|
|
1515
|
-
o !== e && (
|
|
1516
|
-
return
|
|
1534
|
+
o !== e && (i(t, o) || n.add(o));
|
|
1535
|
+
return n;
|
|
1517
1536
|
}
|
|
1518
|
-
const
|
|
1519
|
-
function
|
|
1537
|
+
const Re = "\0placing", xe = /* @__PURE__ */ new Set();
|
|
1538
|
+
function xt(s) {
|
|
1520
1539
|
switch (s.kind) {
|
|
1521
1540
|
case "subtask":
|
|
1522
1541
|
return `subtask:${s.subtask.id}:${s.part}`;
|
|
@@ -1530,8 +1549,8 @@ function Pt(s) {
|
|
|
1530
1549
|
return "nothing";
|
|
1531
1550
|
}
|
|
1532
1551
|
}
|
|
1533
|
-
const
|
|
1534
|
-
class
|
|
1552
|
+
const Be = 3, gi = 10, ki = 600;
|
|
1553
|
+
class vi {
|
|
1535
1554
|
constructor(t) {
|
|
1536
1555
|
this.host = t;
|
|
1537
1556
|
}
|
|
@@ -1597,46 +1616,46 @@ class wi {
|
|
|
1597
1616
|
ghostSummary() {
|
|
1598
1617
|
const t = this.gesture;
|
|
1599
1618
|
if (t.kind !== "edit" && t.kind !== "place") return null;
|
|
1600
|
-
const e =
|
|
1619
|
+
const e = rs(this.host.view.viewport(), t.ghost);
|
|
1601
1620
|
if (e === null) return null;
|
|
1602
|
-
const
|
|
1621
|
+
const i = this.ghostFindings(t.ghost, this.ghostHome(t)), n = t.kind === "edit" && (t.mode === "leadIn" || t.mode === "leadOut"), o = n ? nt(t.ghost) : t.ghost;
|
|
1603
1622
|
return {
|
|
1604
1623
|
refused: this.refused,
|
|
1605
1624
|
refusedLanes: [...t.refused],
|
|
1606
1625
|
blocked: this.blocked,
|
|
1607
|
-
x:
|
|
1626
|
+
x: n ? e.outerFrom : e.mainFrom,
|
|
1608
1627
|
y: e.y,
|
|
1609
1628
|
height: e.height,
|
|
1610
1629
|
from: o.from,
|
|
1611
1630
|
to: o.to,
|
|
1612
|
-
overlap:
|
|
1613
|
-
violated:
|
|
1631
|
+
overlap: i.overlaps.length > 0,
|
|
1632
|
+
violated: i.violated.length > 0
|
|
1614
1633
|
};
|
|
1615
1634
|
}
|
|
1616
1635
|
/* ---------------------------------------------------------------- */
|
|
1617
1636
|
/* Pointer */
|
|
1618
1637
|
/* ---------------------------------------------------------------- */
|
|
1619
1638
|
local(t, e) {
|
|
1620
|
-
const
|
|
1621
|
-
return { x: t - (
|
|
1639
|
+
const i = this.host.plotElement()?.getBoundingClientRect();
|
|
1640
|
+
return { x: t - (i?.left ?? 0), y: e - (i?.top ?? 0) };
|
|
1622
1641
|
}
|
|
1623
|
-
report(t, e,
|
|
1642
|
+
report(t, e, i, n, o, r) {
|
|
1624
1643
|
const a = this.host.view;
|
|
1625
|
-
this.host.handlers().onInteraction?.({ type: t, hit: e, clientX:
|
|
1644
|
+
this.host.handlers().onInteraction?.({ type: t, hit: e, clientX: i, clientY: n, time: a.timeAt(o), lane: a.laneIdAt(r) });
|
|
1626
1645
|
}
|
|
1627
1646
|
/** The plan is on its way: no drag, no hover, no placing begins. One under
|
|
1628
1647
|
way finishes and reports as usual. */
|
|
1629
1648
|
loading = !1;
|
|
1630
1649
|
pointerDown(t) {
|
|
1631
1650
|
if (this.loading) return;
|
|
1632
|
-
const { x: e, y:
|
|
1633
|
-
if (t.pointerType === "touch" && (this.touches.set(t.pointerId, { x: e, y:
|
|
1651
|
+
const { x: e, y: i } = this.local(t.clientX, t.clientY);
|
|
1652
|
+
if (t.pointerType === "touch" && (this.touches.set(t.pointerId, { x: e, y: i }), this.touches.size >= 2)) {
|
|
1634
1653
|
this.press.dispose(), this.armed = !1, this.gesture.kind !== "pinch" && (this.cancelEdit(), this.gesture = { kind: "pinch", distance: this.touchDistance() });
|
|
1635
1654
|
return;
|
|
1636
1655
|
}
|
|
1637
1656
|
if (t.button !== 0) return;
|
|
1638
|
-
const
|
|
1639
|
-
t.pointerType === "touch" ? (this.gesture = { kind: "pending", pointerId: t.pointerId, x0: e, y0:
|
|
1657
|
+
const n = t.target?.closest?.("[data-grip]")?.getAttribute("data-grip"), o = this.host.selectedSubtask(), r = o !== null ? this.host.data.subtaskById.get(o) ?? null : null;
|
|
1658
|
+
t.pointerType === "touch" ? (this.gesture = { kind: "pending", pointerId: t.pointerId, x0: e, y0: i, mode: "pan", subtask: null }, this.armed = this.modeAt(e, i).mode === "move", this.press.pointerDown(t)) : (n === "leadIn" || n === "leadOut") && r !== null ? this.gesture = { kind: "pending", pointerId: t.pointerId, x0: e, y0: i, mode: n, subtask: r } : this.gesture = { kind: "pending", pointerId: t.pointerId, x0: e, y0: i, ...this.modeAt(e, i) }, this.host.plotElement()?.setPointerCapture?.(t.pointerId);
|
|
1640
1659
|
}
|
|
1641
1660
|
/** A drag over a folded group: resting on one opens it for the GESTURE.
|
|
1642
1661
|
|
|
@@ -1646,12 +1665,12 @@ class wi {
|
|
|
1646
1665
|
never written to and no change is reported, because the application did
|
|
1647
1666
|
not fold anything (ADR-0025). */
|
|
1648
1667
|
restOver(t) {
|
|
1649
|
-
const e = this.host.view,
|
|
1650
|
-
|
|
1651
|
-
group:
|
|
1668
|
+
const e = this.host.view, i = e.foldedGroupAt(t);
|
|
1669
|
+
i !== this.resting?.group && (this.stopResting(), i !== null && (this.resting = {
|
|
1670
|
+
group: i,
|
|
1652
1671
|
timer: setTimeout(() => {
|
|
1653
|
-
this.resting = null, e.openForGesture = /* @__PURE__ */ new Set([...e.openForGesture,
|
|
1654
|
-
},
|
|
1672
|
+
this.resting = null, e.openForGesture = /* @__PURE__ */ new Set([...e.openForGesture, i]), this.host.viewChanged();
|
|
1673
|
+
}, ki)
|
|
1655
1674
|
}));
|
|
1656
1675
|
}
|
|
1657
1676
|
stopResting() {
|
|
@@ -1679,64 +1698,64 @@ class wi {
|
|
|
1679
1698
|
gesture that cannot change a lane at all asks nothing: the intents the
|
|
1680
1699
|
caller handles decide whether the question exists. */
|
|
1681
1700
|
askRefused(t, e) {
|
|
1682
|
-
if (!this.host.view.options.intents.includes(e === null ? "place" : "lane")) return
|
|
1683
|
-
const
|
|
1684
|
-
return
|
|
1701
|
+
if (!this.host.view.options.intents.includes(e === null ? "place" : "lane")) return xe;
|
|
1702
|
+
const i = this.host.data.lanes.map((n) => n.id);
|
|
1703
|
+
return pi(i, t, e, this.host.handlers().canMoveTo);
|
|
1685
1704
|
}
|
|
1686
1705
|
/** What a press at a point would start, given the intents the caller handles. */
|
|
1687
1706
|
modeAt(t, e) {
|
|
1688
|
-
const
|
|
1689
|
-
if (
|
|
1690
|
-
for (let o =
|
|
1691
|
-
const r =
|
|
1692
|
-
if (
|
|
1693
|
-
const a =
|
|
1707
|
+
const i = this.host.view, n = i.options.intents;
|
|
1708
|
+
if (i.hitAt(t, e).kind === "milestone") return { mode: "pan", subtask: null };
|
|
1709
|
+
for (let o = i.boxes.length - 1; o >= 0; o--) {
|
|
1710
|
+
const r = i.boxes[o];
|
|
1711
|
+
if (n.includes("stretch")) {
|
|
1712
|
+
const a = Ks(r, t, e);
|
|
1694
1713
|
if (a !== null) return { mode: a === "from" ? "stretch-from" : "stretch-to", subtask: r.subtask };
|
|
1695
1714
|
}
|
|
1696
1715
|
if (qe(r, t, e) !== null)
|
|
1697
|
-
return
|
|
1716
|
+
return n.includes("move") || n.includes("lane") ? { mode: "move", subtask: r.subtask } : { mode: "pan", subtask: r.subtask };
|
|
1698
1717
|
}
|
|
1699
1718
|
return { mode: "pan", subtask: null };
|
|
1700
1719
|
}
|
|
1701
1720
|
pointerMove(t) {
|
|
1702
|
-
const { x: e, y:
|
|
1703
|
-
if (t.pointerType === "touch" && this.touches.has(t.pointerId) && (this.touches.set(t.pointerId, { x: e, y:
|
|
1721
|
+
const { x: e, y: i } = this.local(t.clientX, t.clientY);
|
|
1722
|
+
if (t.pointerType === "touch" && this.touches.has(t.pointerId) && (this.touches.set(t.pointerId, { x: e, y: i }), this.press.pointerMove(t), this.gesture.kind === "pinch")) {
|
|
1704
1723
|
const r = this.touchDistance();
|
|
1705
1724
|
r > 0 && this.gesture.distance > 0 && this.host.view.zoomAt(this.touchCentre(), this.gesture.distance / r) && this.host.viewMoved(!0), this.gesture = { kind: "pinch", distance: r };
|
|
1706
1725
|
return;
|
|
1707
1726
|
}
|
|
1708
|
-
const
|
|
1709
|
-
if (
|
|
1710
|
-
if (Math.hypot(e -
|
|
1711
|
-
|
|
1727
|
+
const n = this.gesture;
|
|
1728
|
+
if (n.kind === "pending" && n.pointerId === t.pointerId) {
|
|
1729
|
+
if (Math.hypot(e - n.x0, i - n.y0) < (t.pointerType === "touch" ? gi : Be)) return;
|
|
1730
|
+
n.mode === "pan" || n.subtask === null ? (this.gesture = { kind: "pan", pointerId: n.pointerId, lastX: n.x0, lastY: n.y0 }, this.setCursor("grabbing")) : this.startEdit(n, n.mode, n.subtask);
|
|
1712
1731
|
}
|
|
1713
1732
|
const o = this.gesture;
|
|
1714
1733
|
if (o.kind === "pan" && o.pointerId === t.pointerId) {
|
|
1715
|
-
const r = this.host.view.pan(o.lastX - e, o.lastY -
|
|
1716
|
-
r.moved && this.host.viewMoved(r.time), this.gesture = { ...o, lastX: e, lastY:
|
|
1734
|
+
const r = this.host.view.pan(o.lastX - e, o.lastY - i);
|
|
1735
|
+
r.moved && this.host.viewMoved(r.time), this.gesture = { ...o, lastX: e, lastY: i };
|
|
1717
1736
|
return;
|
|
1718
1737
|
}
|
|
1719
1738
|
if (o.kind === "edit" && o.pointerId === t.pointerId) {
|
|
1720
|
-
this.lastClient = { x: t.clientX, y: t.clientY }, this.dragPoint = { x: e, y:
|
|
1739
|
+
this.lastClient = { x: t.clientX, y: t.clientY }, this.dragPoint = { x: e, y: i }, this.restOver(i), this.gesture = { ...o, ghost: this.heldGhost(o, e, i) }, this.setCursor(this.refused || this.blocked ? "not-allowed" : o.mode === "move" ? "grabbing" : "ew-resize"), this.host.interactionChanged(), this.autoPan();
|
|
1721
1740
|
return;
|
|
1722
1741
|
}
|
|
1723
|
-
o.kind === "none" && !this.loading && (this.byKeyboard = !1, this.hoverAt(t.clientX, t.clientY, e,
|
|
1742
|
+
o.kind === "none" && !this.loading && (this.byKeyboard = !1, this.hoverAt(t.clientX, t.clientY, e, i));
|
|
1724
1743
|
}
|
|
1725
1744
|
/** The drag of `subtask` in `mode`, taking hold where the pending press
|
|
1726
1745
|
stands. */
|
|
1727
|
-
startEdit(t, e,
|
|
1746
|
+
startEdit(t, e, i) {
|
|
1728
1747
|
this.gesture = {
|
|
1729
1748
|
kind: "edit",
|
|
1730
1749
|
pointerId: t.pointerId,
|
|
1731
1750
|
mode: e,
|
|
1732
|
-
subtask:
|
|
1751
|
+
subtask: i,
|
|
1733
1752
|
/* The working time the drag took hold at - not a pixel, because
|
|
1734
1753
|
auto-pan moves the scale under a drag in flight. */
|
|
1735
1754
|
t0: this.host.view.viewport().scale.fromPx(t.x0),
|
|
1736
|
-
ghost:
|
|
1755
|
+
ghost: i,
|
|
1737
1756
|
/* Asked here, once, and drawn from the first frame of the drag: the
|
|
1738
1757
|
lanes that are closed are marked before the pointer reaches one. */
|
|
1739
|
-
refused: e === "move" ? this.askRefused(
|
|
1758
|
+
refused: e === "move" ? this.askRefused(i, i.lane) : xe
|
|
1740
1759
|
}, this.setCursor(e === "move" ? "grabbing" : "ew-resize");
|
|
1741
1760
|
}
|
|
1742
1761
|
/** The finger has been held on a bar: the bar is grabbed, unless the finger
|
|
@@ -1744,8 +1763,8 @@ class wi {
|
|
|
1744
1763
|
grab(t) {
|
|
1745
1764
|
const e = this.gesture;
|
|
1746
1765
|
if (!this.armed || this.loading || e.kind !== "pending") return;
|
|
1747
|
-
const { x:
|
|
1748
|
-
o !== "move" || r === null || (this.lastClient = { x: t.x, y: t.y }, this.dragPoint = { x:
|
|
1766
|
+
const { x: i, y: n } = this.local(t.x, t.y), { mode: o, subtask: r } = this.modeAt(e.x0, e.y0);
|
|
1767
|
+
o !== "move" || r === null || (this.lastClient = { x: t.x, y: t.y }, this.dragPoint = { x: i, y: n }, this.startEdit(e, o, r), this.host.interactionChanged());
|
|
1749
1768
|
}
|
|
1750
1769
|
/** The page's own scroll, while a bar is grabbed. Registered as not passive
|
|
1751
1770
|
by the component: a passive listener cannot cancel it. Before the grab and
|
|
@@ -1759,13 +1778,13 @@ class wi {
|
|
|
1759
1778
|
this.touches.size === 1 && o !== void 0 ? this.gesture = { kind: "pan", pointerId: o[0], lastX: o[1].x, lastY: o[1].y } : this.touches.size === 0 && (this.gesture = { kind: "none" });
|
|
1760
1779
|
return;
|
|
1761
1780
|
}
|
|
1762
|
-
const e = this.gesture, { x:
|
|
1781
|
+
const e = this.gesture, { x: i, y: n } = this.local(t.clientX, t.clientY);
|
|
1763
1782
|
if (e.kind === "pending" && e.pointerId === t.pointerId)
|
|
1764
|
-
this.gesture = { kind: "none" }, this.click(t.clientX, t.clientY,
|
|
1783
|
+
this.gesture = { kind: "none" }, this.click(t.clientX, t.clientY, i, n);
|
|
1765
1784
|
else if (e.kind === "pan" && e.pointerId === t.pointerId)
|
|
1766
|
-
this.gesture = { kind: "none" }, this.setCursor("default"), this.hoverAt(t.clientX, t.clientY,
|
|
1785
|
+
this.gesture = { kind: "none" }, this.setCursor("default"), this.hoverAt(t.clientX, t.clientY, i, n);
|
|
1767
1786
|
else if (e.kind === "edit" && e.pointerId === t.pointerId) {
|
|
1768
|
-
if (t.pointerType === "touch" && (
|
|
1787
|
+
if (t.pointerType === "touch" && (i < 0 || n < 0 || i > this.host.view.width || n > this.host.view.height)) {
|
|
1769
1788
|
this.cancelEdit();
|
|
1770
1789
|
return;
|
|
1771
1790
|
}
|
|
@@ -1786,14 +1805,14 @@ class wi {
|
|
|
1786
1805
|
this.panFrame = 0;
|
|
1787
1806
|
const e = this.gesture;
|
|
1788
1807
|
if (e.kind !== "edit" && e.kind !== "place") return;
|
|
1789
|
-
const
|
|
1808
|
+
const i = this.host.view, { x: n, y: o } = this.local(this.lastClient.x, this.lastClient.y), r = $e(n, i.width), a = $e(o, i.height);
|
|
1790
1809
|
if (r === 0 && a === 0) return;
|
|
1791
|
-
const l =
|
|
1810
|
+
const l = i.pan(r, a);
|
|
1792
1811
|
if (l.moved) {
|
|
1793
|
-
if (this.dragPoint = { x:
|
|
1794
|
-
this.gesture = { ...e, ghost: this.heldGhost(e,
|
|
1812
|
+
if (this.dragPoint = { x: n, y: o }, e.kind === "edit")
|
|
1813
|
+
this.gesture = { ...e, ghost: this.heldGhost(e, n, o) };
|
|
1795
1814
|
else {
|
|
1796
|
-
const d = this.placeGhost(e.item,
|
|
1815
|
+
const d = this.placeGhost(e.item, n, o, e.refused);
|
|
1797
1816
|
this.refused = d.refused, this.blocked = d.blocked, this.gesture = { ...e, ghost: d.ghost ?? e.ghost };
|
|
1798
1817
|
}
|
|
1799
1818
|
this.host.viewMoved(l.time), this.panFrame = requestAnimationFrame(t);
|
|
@@ -1813,8 +1832,8 @@ class wi {
|
|
|
1813
1832
|
times would be a lie. Nothing is reported: no interaction happened. */
|
|
1814
1833
|
refreshHover() {
|
|
1815
1834
|
if (!this.idle || this.hoverKey === "nothing" || this.byKeyboard) return;
|
|
1816
|
-
const { x: t, y: e } = this.hoverPoint,
|
|
1817
|
-
this.hover =
|
|
1835
|
+
const { x: t, y: e } = this.hoverPoint, i = this.host.view.hitAt(t, e);
|
|
1836
|
+
this.hover = i, this.hoverKey = xt(i);
|
|
1818
1837
|
}
|
|
1819
1838
|
pointerLeave() {
|
|
1820
1839
|
this.gesture.kind !== "none" || this.byKeyboard || this.setHover({ kind: "nothing" }, "nothing");
|
|
@@ -1826,19 +1845,19 @@ class wi {
|
|
|
1826
1845
|
}
|
|
1827
1846
|
contextMenu(t) {
|
|
1828
1847
|
if (this.host.handlers().onInteraction === void 0 || (t.preventDefault(), this.armed || this.editing || this.loading)) return;
|
|
1829
|
-
const { x: e, y:
|
|
1830
|
-
this.report("contextmenu", this.host.view.hitAt(e,
|
|
1848
|
+
const { x: e, y: i } = this.local(t.clientX, t.clientY);
|
|
1849
|
+
this.report("contextmenu", this.host.view.hitAt(e, i), t.clientX, t.clientY, e, i);
|
|
1831
1850
|
}
|
|
1832
1851
|
/** The wheel, as every scrolling area has it:
|
|
1833
1852
|
vertical scrolls the lanes, and lets the page scroll on once they are at
|
|
1834
1853
|
their end; Ctrl or ⌘ zooms - a trackpad pinch arrives as a wheel with
|
|
1835
1854
|
Ctrl -; horizontal or Shift pans through time. */
|
|
1836
1855
|
wheel(t) {
|
|
1837
|
-
const e = this.host.view,
|
|
1856
|
+
const e = this.host.view, i = Math.max(0, Math.min(e.width, this.local(t.clientX, t.clientY).x)), n = t.deltaMode === 1 ? 16 : t.deltaMode === 2 ? e.height : 1, o = t.deltaX * n, r = t.deltaY * n;
|
|
1838
1857
|
if (t.ctrlKey || t.metaKey) {
|
|
1839
1858
|
t.preventDefault();
|
|
1840
1859
|
const d = Math.abs(r) < 50 ? 0.01 : 15e-4;
|
|
1841
|
-
e.zoomAt(
|
|
1860
|
+
e.zoomAt(i, Math.exp(r * d)) && this.host.viewMoved(!0);
|
|
1842
1861
|
return;
|
|
1843
1862
|
}
|
|
1844
1863
|
if (Math.abs(o) > Math.abs(r) || t.shiftKey) {
|
|
@@ -1853,23 +1872,23 @@ class wi {
|
|
|
1853
1872
|
const l = e.pan(0, r);
|
|
1854
1873
|
l.moved && this.host.viewMoved(l.time);
|
|
1855
1874
|
}
|
|
1856
|
-
click(t, e,
|
|
1857
|
-
const o = this.host.view.hitAt(
|
|
1858
|
-
this.host.select(r, o.kind === "subtask" ? o.subtask.id : null), this.report("click", o, t, e,
|
|
1875
|
+
click(t, e, i, n) {
|
|
1876
|
+
const o = this.host.view.hitAt(i, n), r = o.kind === "subtask" ? o.subtask.task : o.kind === "dependency" ? this.host.data.taskOfDependency(o.dependency) : null;
|
|
1877
|
+
this.host.select(r, o.kind === "subtask" ? o.subtask.id : null), this.report("click", o, t, e, i, n);
|
|
1859
1878
|
}
|
|
1860
|
-
hoverAt(t, e,
|
|
1861
|
-
const o = this.host.view.hitAt(
|
|
1862
|
-
if (this.setCursor(a === "move" ? "grab" : a === "stretch-from" || a === "stretch-to" ? "ew-resize" : "default"), this.hoverPoint = { x:
|
|
1879
|
+
hoverAt(t, e, i, n) {
|
|
1880
|
+
const o = this.host.view.hitAt(i, n), r = xt(o), { mode: a } = this.modeAt(i, n);
|
|
1881
|
+
if (this.setCursor(a === "move" ? "grab" : a === "stretch-from" || a === "stretch-to" ? "ew-resize" : "default"), this.hoverPoint = { x: i, y: n }, r === this.hoverKey) {
|
|
1863
1882
|
(o.kind === "subtask" || o.kind === "dependency" || o.kind === "milestone") && this.host.hoverChanged();
|
|
1864
1883
|
return;
|
|
1865
1884
|
}
|
|
1866
|
-
this.setHover(o, r), this.report("hover", o, t, e,
|
|
1885
|
+
this.setHover(o, r), this.report("hover", o, t, e, i, n);
|
|
1867
1886
|
}
|
|
1868
1887
|
/** The keyboard sets the hover: drawn, and its tooltip shown, as the
|
|
1869
1888
|
pointer's would be - and reported to nobody, since `onInteraction`
|
|
1870
1889
|
speaks of pointer positions. `nothing` hands the hover back. */
|
|
1871
1890
|
setKeyboardHover(t, e) {
|
|
1872
|
-
this.byKeyboard = t.kind !== "nothing", this.hoverPoint = e, this.hover = t, this.hoverKey =
|
|
1891
|
+
this.byKeyboard = t.kind !== "nothing", this.hoverPoint = e, this.hover = t, this.hoverKey = xt(t), this.host.interactionChanged();
|
|
1873
1892
|
}
|
|
1874
1893
|
setHover(t, e) {
|
|
1875
1894
|
e !== this.hoverKey && (this.hoverKey = e, this.hover = t, this.host.hoverChanged());
|
|
@@ -1892,10 +1911,10 @@ class wi {
|
|
|
1892
1911
|
dragging and handles the place intent, the drop is accepted and a ghost
|
|
1893
1912
|
shows where the work would land. */
|
|
1894
1913
|
dragOver(t, e) {
|
|
1895
|
-
const
|
|
1896
|
-
if (this.loading || e === null || !
|
|
1897
|
-
const { x:
|
|
1898
|
-
if (
|
|
1914
|
+
const i = this.host.view;
|
|
1915
|
+
if (this.loading || e === null || !i.options.intents.includes("place")) return;
|
|
1916
|
+
const { x: n, y: o } = this.local(t.clientX, t.clientY);
|
|
1917
|
+
if (i.laneIdAt(o) === null && i.foldedGroupAt(o) === null) {
|
|
1899
1918
|
this.clearPlacing();
|
|
1900
1919
|
return;
|
|
1901
1920
|
}
|
|
@@ -1905,34 +1924,34 @@ class wi {
|
|
|
1905
1924
|
pointer is not over one either, the rule is asked about an item
|
|
1906
1925
|
whose own lane is empty - which is the truth of it: `canMoveTo`
|
|
1907
1926
|
is asked ABOUT a lane, and the one this item is on is none. */
|
|
1908
|
-
this.askRefused(this.askedFor(e, this.onLane(o) ?? "",
|
|
1909
|
-
), a = this.placeGhost(e,
|
|
1927
|
+
this.askRefused(this.askedFor(e, this.onLane(o) ?? "", n), null)
|
|
1928
|
+
), a = this.placeGhost(e, n, o, r);
|
|
1910
1929
|
this.refused = a.refused, this.blocked = a.blocked, this.setCursor(a.refused || a.blocked ? "not-allowed" : "default");
|
|
1911
1930
|
const l = this.gesture.kind === "place" ? this.gesture.ghost : null, d = a.ghost ?? (a.refused || a.blocked ? l : null);
|
|
1912
|
-
t.dataTransfer !== null && (t.dataTransfer.dropEffect = d === null ? "none" : "copy"), d !== null && (this.lastClient = { x: t.clientX, y: t.clientY }, this.dragPoint = { x:
|
|
1931
|
+
t.dataTransfer !== null && (t.dataTransfer.dropEffect = d === null ? "none" : "copy"), d !== null && (this.lastClient = { x: t.clientX, y: t.clientY }, this.dragPoint = { x: n, y: o }, this.gesture = { kind: "place", ghost: d, item: e, refused: r }, this.host.interactionChanged(), this.autoPan());
|
|
1913
1932
|
}
|
|
1914
1933
|
/** The ghost of a drag from outside at a point on the plot: none off the
|
|
1915
1934
|
lanes, none where the caller refuses that lane and none where it would
|
|
1916
1935
|
cover blocked time - which the answer says apart, because they mean
|
|
1917
1936
|
different things to the drag. */
|
|
1918
|
-
placeGhost(t, e,
|
|
1919
|
-
const o = this.onLane(
|
|
1937
|
+
placeGhost(t, e, i, n) {
|
|
1938
|
+
const o = this.onLane(i);
|
|
1920
1939
|
if (o === null) return { ghost: null, refused: !1, blocked: !1 };
|
|
1921
|
-
if (
|
|
1922
|
-
const r = { ...this.askedFor(t, o, e), id:
|
|
1923
|
-
return
|
|
1940
|
+
if (n.has(o)) return { ghost: null, refused: !0, blocked: !1 };
|
|
1941
|
+
const r = { ...this.askedFor(t, o, e), id: Re };
|
|
1942
|
+
return dt(r, null, this.host.data.blocked) ? { ghost: null, refused: !1, blocked: !0 } : { ghost: r, refused: !1, blocked: !1 };
|
|
1924
1943
|
}
|
|
1925
1944
|
/** The dragged item as a subtask, under the caller's key for it - not the
|
|
1926
1945
|
internal sentinel: the rule is asked about the thing the application says
|
|
1927
1946
|
it is dragging, and the ghost only afterwards takes the sentinel. */
|
|
1928
|
-
askedFor(t, e,
|
|
1929
|
-
const
|
|
1947
|
+
askedFor(t, e, i) {
|
|
1948
|
+
const n = this.snapInside(this.host.view.timeAt(i), this.snapStep());
|
|
1930
1949
|
return {
|
|
1931
1950
|
id: t.item,
|
|
1932
1951
|
task: t.task,
|
|
1933
1952
|
lane: e,
|
|
1934
|
-
from:
|
|
1935
|
-
to:
|
|
1953
|
+
from: n,
|
|
1954
|
+
to: n + t.duration,
|
|
1936
1955
|
...t.leadIn === void 0 ? {} : { leadIn: t.leadIn },
|
|
1937
1956
|
...t.leadOut === void 0 ? {} : { leadOut: t.leadOut }
|
|
1938
1957
|
};
|
|
@@ -1943,17 +1962,17 @@ class wi {
|
|
|
1943
1962
|
const e = this.gesture;
|
|
1944
1963
|
if (e.kind !== "place") return;
|
|
1945
1964
|
t.preventDefault();
|
|
1946
|
-
const { ghost:
|
|
1947
|
-
if (this.stopAutoPan(), this.closeGestureFolds(), this.gesture = { kind: "none" }, this.refused = !1, this.blocked = !1, this.cursor = "default", this.host.interactionChanged(), !this.allowed({ ...
|
|
1965
|
+
const { ghost: i, item: n } = e;
|
|
1966
|
+
if (this.stopAutoPan(), this.closeGestureFolds(), this.gesture = { kind: "none" }, this.refused = !1, this.blocked = !1, this.cursor = "default", this.host.interactionChanged(), !this.allowed({ ...i, id: n.item }, i.lane)) return;
|
|
1948
1967
|
const o = {
|
|
1949
1968
|
kind: "place",
|
|
1950
|
-
item:
|
|
1951
|
-
task:
|
|
1952
|
-
lane:
|
|
1953
|
-
from:
|
|
1954
|
-
to:
|
|
1955
|
-
...
|
|
1956
|
-
...
|
|
1969
|
+
item: n.item,
|
|
1970
|
+
task: i.task,
|
|
1971
|
+
lane: i.lane,
|
|
1972
|
+
from: i.from,
|
|
1973
|
+
to: i.to,
|
|
1974
|
+
...i.leadIn === void 0 ? {} : { leadIn: i.leadIn },
|
|
1975
|
+
...i.leadOut === void 0 ? {} : { leadOut: i.leadOut }
|
|
1957
1976
|
};
|
|
1958
1977
|
this.host.handlers().onIntent?.(o);
|
|
1959
1978
|
}
|
|
@@ -1975,20 +1994,20 @@ class wi {
|
|
|
1975
1994
|
put the work into blocked time it did not already cover, the ghost where
|
|
1976
1995
|
it last stood. It is held, not clamped: a pointer carried on past the
|
|
1977
1996
|
blocked time takes the ghost along again. */
|
|
1978
|
-
heldGhost(t, e,
|
|
1979
|
-
const
|
|
1980
|
-
return this.blocked =
|
|
1997
|
+
heldGhost(t, e, i) {
|
|
1998
|
+
const n = this.ghostFor(t, e, i);
|
|
1999
|
+
return this.blocked = dt(n, t.subtask, this.host.data.blocked), this.blocked ? t.ghost : n;
|
|
1981
2000
|
}
|
|
1982
|
-
ghostFor(t, e,
|
|
1983
|
-
const
|
|
2001
|
+
ghostFor(t, e, i) {
|
|
2002
|
+
const n = this.host.view, o = t.subtask, r = this.snapStep(), a = n.options.intents, l = this.snapInside(n.timeAt(e), r);
|
|
1984
2003
|
switch (t.mode) {
|
|
1985
2004
|
case "move": {
|
|
1986
2005
|
let d = o.from;
|
|
1987
|
-
const h =
|
|
1988
|
-
a.includes("move") && Math.abs(
|
|
2006
|
+
const h = n.viewport().scale, c = h.fromPx(e) - t.t0;
|
|
2007
|
+
a.includes("move") && Math.abs(c * h.m) >= Be && (d = this.shifted(o.from, c, r));
|
|
1989
2008
|
let f = t.ghost.lane;
|
|
1990
2009
|
if (a.includes("lane")) {
|
|
1991
|
-
const g = this.onLane(
|
|
2010
|
+
const g = this.onLane(i) ?? f;
|
|
1992
2011
|
this.refused = t.refused.has(g), this.refused || (f = g);
|
|
1993
2012
|
} else
|
|
1994
2013
|
this.refused = !1;
|
|
@@ -2007,20 +2026,20 @@ class wi {
|
|
|
2007
2026
|
/** A time moved by an amount of WORKING time and snapped: a drag moves
|
|
2008
2027
|
a start this way, and a key by one step of the raster - one arithmetic,
|
|
2009
2028
|
so a key proposes exactly what a drag of that length would. */
|
|
2010
|
-
shifted(t, e,
|
|
2011
|
-
const
|
|
2012
|
-
return this.snapInside(r,
|
|
2029
|
+
shifted(t, e, i) {
|
|
2030
|
+
const n = vt(this.host.view.options.calendar), o = H(t, n) + e, r = ht(o, n);
|
|
2031
|
+
return this.snapInside(r, i);
|
|
2013
2032
|
}
|
|
2014
2033
|
/** Snapped - and, where the raster lands in time the calendar removes, moved
|
|
2015
2034
|
on to the seam, where time counts again. An intent never asks for a time
|
|
2016
2035
|
nobody works. */
|
|
2017
2036
|
snapInside(t, e) {
|
|
2018
|
-
const
|
|
2019
|
-
return
|
|
2037
|
+
const i = $s(t, e), n = vt(this.host.view.options.calendar);
|
|
2038
|
+
return n.intervals.length === 0 ? i : Vt(H(i, n), n);
|
|
2020
2039
|
}
|
|
2021
|
-
intentsOf(t, e,
|
|
2022
|
-
const
|
|
2023
|
-
return
|
|
2040
|
+
intentsOf(t, e, i) {
|
|
2041
|
+
const n = [], o = this.host.view.options.intents, r = t.id;
|
|
2042
|
+
return i === "move" ? (e.from !== t.from && o.includes("move") && n.push({ kind: "move", subtask: r, from: e.from, to: e.to }), e.lane !== t.lane && o.includes("lane") && n.push({ kind: "lane", subtask: r, lane: e.lane })) : i === "stretch-from" || i === "stretch-to" ? (e.from !== t.from || e.to !== t.to) && n.push({ kind: "stretch", subtask: r, from: e.from, to: e.to }) : i === "leadIn" ? (e.leadIn ?? 0) !== (t.leadIn ?? 0) && n.push({ kind: "leadIn", subtask: r, leadIn: e.leadIn ?? 0 }) : (e.leadOut ?? 0) !== (t.leadOut ?? 0) && n.push({ kind: "leadOut", subtask: r, leadOut: e.leadOut ?? 0 }), n;
|
|
2024
2043
|
}
|
|
2025
2044
|
/** The lane the ghost came from - the only other lane a drag can touch. */
|
|
2026
2045
|
ghostHome(t) {
|
|
@@ -2036,33 +2055,33 @@ class wi {
|
|
|
2036
2055
|
keeps a plan of hundreds of tasks fluid while a drag runs, since this is
|
|
2037
2056
|
computed on every pointer movement. */
|
|
2038
2057
|
ghostFindings(t, e) {
|
|
2039
|
-
const
|
|
2040
|
-
return { overlaps:
|
|
2058
|
+
const i = this.host.data, n = (h) => h.lane === t.lane || h.lane === e, r = [...i.subtasks.filter((h) => h.id !== t.id && n(h)), t], a = (h) => h.first === t.id || h.second === t.id, l = i.dependencies.filter((h) => h.from === t.id || h.to === t.id), d = t.id === Re ? i.subtasks : i.subtasks.map((h) => h.id === t.id ? t : h);
|
|
2059
|
+
return { overlaps: Xt(r).filter(a), violated: qt(d, l) };
|
|
2041
2060
|
}
|
|
2042
2061
|
}
|
|
2043
|
-
function
|
|
2062
|
+
function yi(s, t) {
|
|
2044
2063
|
const e = /* @__PURE__ */ new Map();
|
|
2045
|
-
for (const
|
|
2046
|
-
const
|
|
2064
|
+
for (const i of t) {
|
|
2065
|
+
const n = s.slots.get(i.lane), o = n === void 0 ? null : st(s, n.top);
|
|
2047
2066
|
if (o === null) continue;
|
|
2048
2067
|
const r = s.rows.indexOf(o);
|
|
2049
|
-
e.set(r, [...e.get(r) ?? [],
|
|
2068
|
+
e.set(r, [...e.get(r) ?? [], i]);
|
|
2050
2069
|
}
|
|
2051
|
-
return [...e.entries()].sort(([
|
|
2070
|
+
return [...e.entries()].sort(([i], [n]) => i - n).map(([, i]) => i.sort((n, o) => n.from - o.from || n.to - o.to));
|
|
2052
2071
|
}
|
|
2053
2072
|
const Ne = (s, t) => t < s.from ? s.from - t : t > s.to ? t - s.to : 0;
|
|
2054
|
-
function
|
|
2055
|
-
let
|
|
2056
|
-
for (let d = 0; d < s.length && t !== null &&
|
|
2057
|
-
o = s[d].findIndex((h) => h.id === t), o >= 0 && (
|
|
2058
|
-
if (
|
|
2073
|
+
function wi(s, t, e, i) {
|
|
2074
|
+
let n = -1, o = -1;
|
|
2075
|
+
for (let d = 0; d < s.length && t !== null && n < 0; d++)
|
|
2076
|
+
o = s[d].findIndex((h) => h.id === t), o >= 0 && (n = d);
|
|
2077
|
+
if (n < 0) {
|
|
2059
2078
|
for (const d of s) {
|
|
2060
|
-
const h = d.find((
|
|
2079
|
+
const h = d.find((c) => c.to > i[0] && c.from < i[1]);
|
|
2061
2080
|
if (h !== void 0) return h;
|
|
2062
2081
|
}
|
|
2063
2082
|
return s[0]?.[0] ?? null;
|
|
2064
2083
|
}
|
|
2065
|
-
const r = s[
|
|
2084
|
+
const r = s[n], a = r[o], l = (i[1] - i[0]) / 10;
|
|
2066
2085
|
switch (e) {
|
|
2067
2086
|
case "next":
|
|
2068
2087
|
return r[o + 1] ?? a;
|
|
@@ -2079,25 +2098,25 @@ function Mi(s, t, e, n) {
|
|
|
2079
2098
|
return r[0];
|
|
2080
2099
|
case "up":
|
|
2081
2100
|
case "down": {
|
|
2082
|
-
const d = s[e === "up" ?
|
|
2101
|
+
const d = s[e === "up" ? n - 1 : n + 1];
|
|
2083
2102
|
if (d === void 0) return a;
|
|
2084
2103
|
const h = (a.from + a.to) / 2;
|
|
2085
|
-
return d.reduce((
|
|
2104
|
+
return d.reduce((c, f) => Ne(f, h) < Ne(c, h) ? f : c);
|
|
2086
2105
|
}
|
|
2087
2106
|
}
|
|
2088
2107
|
}
|
|
2089
|
-
function
|
|
2108
|
+
function bi(s, t, e, i) {
|
|
2090
2109
|
if (e.kind === "milestone") return e;
|
|
2091
2110
|
if (e.kind === "dependency") {
|
|
2092
|
-
const o = s.find((a) => a.id === e.id), r = o === void 0 ? void 0 :
|
|
2111
|
+
const o = s.find((a) => a.id === e.id), r = o === void 0 ? void 0 : i === "out" ? o.to : o.from;
|
|
2093
2112
|
return r !== void 0 && t.has(r) ? { kind: "subtask", id: r } : e;
|
|
2094
2113
|
}
|
|
2095
|
-
const
|
|
2096
|
-
(o) => (
|
|
2114
|
+
const n = s.find(
|
|
2115
|
+
(o) => (i === "out" ? o.from : o.to) === e.id && t.has(i === "out" ? o.to : o.from)
|
|
2097
2116
|
);
|
|
2098
|
-
return
|
|
2117
|
+
return n === void 0 ? e : { kind: "dependency", id: n.id };
|
|
2099
2118
|
}
|
|
2100
|
-
const kt = "\0milestone:",
|
|
2119
|
+
const kt = "\0milestone:", Mi = 150, Ti = {
|
|
2101
2120
|
ArrowRight: "next",
|
|
2102
2121
|
ArrowLeft: "previous",
|
|
2103
2122
|
ArrowUp: "up",
|
|
@@ -2107,7 +2126,7 @@ const kt = "\0milestone:", Si = 150, Ii = {
|
|
|
2107
2126
|
PageDown: "pageNext",
|
|
2108
2127
|
PageUp: "pagePrevious"
|
|
2109
2128
|
};
|
|
2110
|
-
class
|
|
2129
|
+
class Si {
|
|
2111
2130
|
constructor(t) {
|
|
2112
2131
|
this.host = t;
|
|
2113
2132
|
}
|
|
@@ -2132,32 +2151,32 @@ class Li {
|
|
|
2132
2151
|
key(t) {
|
|
2133
2152
|
const e = this.host.gestures;
|
|
2134
2153
|
if (t.metaKey || !e.idle) return !1;
|
|
2135
|
-
const
|
|
2136
|
-
if (t.key === "]" || t.key === "[" ||
|
|
2154
|
+
const i = t.key.toLowerCase() === "t" && !t.ctrlKey && !t.altKey;
|
|
2155
|
+
if (t.key === "]" || t.key === "[" || i) {
|
|
2137
2156
|
const o = this.active();
|
|
2138
2157
|
if (o === null) return !1;
|
|
2139
|
-
const r = this.host.data, a =
|
|
2140
|
-
return this.show(
|
|
2158
|
+
const r = this.host.data, a = i ? !t.shiftKey : t.key === "]";
|
|
2159
|
+
return this.show(bi(r.dependencies, r.subtaskById, o, a ? "out" : "back")), !0;
|
|
2141
2160
|
}
|
|
2142
2161
|
if (t.ctrlKey) return !1;
|
|
2143
2162
|
if (t.altKey) return this.edit(t);
|
|
2144
2163
|
if (t.key === "Escape")
|
|
2145
2164
|
return e.byKeyboard ? (this.blur(), !0) : !1;
|
|
2146
2165
|
if (t.key === "Enter" || t.key === " ") return this.select();
|
|
2147
|
-
const
|
|
2148
|
-
return
|
|
2166
|
+
const n = t.shiftKey ? void 0 : Ti[t.key];
|
|
2167
|
+
return n === void 0 ? !1 : (this.walk(n), !0);
|
|
2149
2168
|
}
|
|
2150
2169
|
walk(t) {
|
|
2151
|
-
const { data: e, view:
|
|
2152
|
-
let a =
|
|
2170
|
+
const { data: e, view: i } = this.host, n = this.active(), o = n === null ? null : n.kind === "subtask" ? n.id : n.kind === "milestone" ? kt + n.id : e.dependencies.find((d) => d.id === n.id)?.from ?? null, r = [...e.subtasks, ...e.milestones.map((d) => ({ id: kt + d.id, lane: d.lane, from: d.at, to: d.at }))];
|
|
2171
|
+
let a = yi(i.rows, r);
|
|
2153
2172
|
if (o === null) {
|
|
2154
2173
|
const d = a.filter((h) => {
|
|
2155
|
-
const
|
|
2156
|
-
return
|
|
2174
|
+
const c = J(i.viewport(), h[0].lane);
|
|
2175
|
+
return c !== null && c.top + c.height > 0 && c.top < i.height;
|
|
2157
2176
|
});
|
|
2158
2177
|
d.length > 0 && (a = d);
|
|
2159
2178
|
}
|
|
2160
|
-
const l =
|
|
2179
|
+
const l = wi(a, o, t, this.host.visibleDomain());
|
|
2161
2180
|
l !== null && this.show(l.id.startsWith(kt) ? { kind: "milestone", id: l.id.slice(kt.length) } : { kind: "subtask", id: l.id });
|
|
2162
2181
|
}
|
|
2163
2182
|
/** Space and Enter select as a click does: the whole task, and the subtask. */
|
|
@@ -2172,64 +2191,64 @@ class Li {
|
|
|
2172
2191
|
end - the intents a drag of that length reports (ADR-0023), and only
|
|
2173
2192
|
where the caller handles them. Nothing is applied here. */
|
|
2174
2193
|
edit(t) {
|
|
2175
|
-
const e = this.host.gestures.hover,
|
|
2176
|
-
if (
|
|
2194
|
+
const e = this.host.gestures.hover, i = t.key === "ArrowRight" ? 1 : t.key === "ArrowLeft" ? -1 : 0;
|
|
2195
|
+
if (i === 0) return !1;
|
|
2177
2196
|
if (this.host.gestures.loading || e.kind !== "subtask") return !0;
|
|
2178
|
-
const
|
|
2197
|
+
const n = e.subtask, o = this.host.gestures, r = this.host.view.options.intents, a = o.snapStep(), l = a.step > 0 ? a : { step: this.host.view.step(), offset: 0 }, d = this.host.data.blocked;
|
|
2179
2198
|
let h = null;
|
|
2180
2199
|
if (!t.shiftKey && r.includes("move")) {
|
|
2181
|
-
const
|
|
2182
|
-
let f =
|
|
2200
|
+
const c = (g) => ({ ...n, from: g, to: g + (n.to - n.from) });
|
|
2201
|
+
let f = n.from;
|
|
2183
2202
|
for (let g = 0; g < 1e3; g++) {
|
|
2184
|
-
const v = o.shifted(f,
|
|
2185
|
-
if (v === f || (f = v, !
|
|
2203
|
+
const v = o.shifted(f, i * l.step, l);
|
|
2204
|
+
if (v === f || (f = v, !dt(c(f), n, d))) break;
|
|
2186
2205
|
}
|
|
2187
|
-
f !==
|
|
2206
|
+
f !== n.from && !dt(c(f), n, d) && (h = { kind: "move", subtask: n.id, from: f, to: c(f).to });
|
|
2188
2207
|
} else if (t.shiftKey && r.includes("stretch")) {
|
|
2189
|
-
const
|
|
2190
|
-
|
|
2208
|
+
const c = Math.max(o.shifted(n.to, i * l.step, l), n.from + Math.max(l.step, q));
|
|
2209
|
+
c !== n.to && !dt({ ...n, to: c }, n, d) && (h = { kind: "stretch", subtask: n.id, from: n.from, to: c });
|
|
2191
2210
|
}
|
|
2192
2211
|
return o.byKeyboard = !0, h !== null && this.host.handlers().onIntent?.(h), this.scheduleReadout(), !0;
|
|
2193
2212
|
}
|
|
2194
2213
|
/** The keys stand on this target: brought into view, drawn as the hover. */
|
|
2195
2214
|
show(t, e = !0) {
|
|
2196
|
-
const
|
|
2197
|
-
if (n === null) return;
|
|
2198
|
-
e && this.reveal(t);
|
|
2199
|
-
const i = this.bounds(t);
|
|
2215
|
+
const i = this.hitOf(t);
|
|
2200
2216
|
if (i === null) return;
|
|
2217
|
+
e && this.reveal(t);
|
|
2218
|
+
const n = this.bounds(t);
|
|
2219
|
+
if (n === null) return;
|
|
2201
2220
|
const { view: o } = this.host, r = (a, l) => Math.max(0, Math.min(l, a));
|
|
2202
|
-
this.host.gestures.setKeyboardHover(
|
|
2203
|
-
x: (r(
|
|
2204
|
-
y: (r(
|
|
2221
|
+
this.host.gestures.setKeyboardHover(i, {
|
|
2222
|
+
x: (r(n.x0, o.width) + r(n.x1, o.width)) / 2,
|
|
2223
|
+
y: (r(n.y0, o.height) + r(n.y1, o.height)) / 2
|
|
2205
2224
|
}), e && this.scheduleReadout();
|
|
2206
2225
|
}
|
|
2207
2226
|
hitOf(t) {
|
|
2208
2227
|
const e = this.host.data;
|
|
2209
2228
|
if (t.kind === "subtask") {
|
|
2210
|
-
const
|
|
2211
|
-
return
|
|
2229
|
+
const n = e.subtaskById.get(t.id);
|
|
2230
|
+
return n === void 0 ? null : { kind: "subtask", subtask: n, part: "main" };
|
|
2212
2231
|
}
|
|
2213
2232
|
if (t.kind === "milestone") {
|
|
2214
|
-
const
|
|
2215
|
-
return
|
|
2233
|
+
const n = e.milestones.find((o) => o.id === t.id);
|
|
2234
|
+
return n === void 0 ? null : { kind: "milestone", milestone: n };
|
|
2216
2235
|
}
|
|
2217
|
-
const
|
|
2218
|
-
return
|
|
2236
|
+
const i = e.dependencies.find((n) => n.id === t.id);
|
|
2237
|
+
return i === void 0 ? null : { kind: "dependency", dependency: i };
|
|
2219
2238
|
}
|
|
2220
2239
|
/** Where a target lies on the plot: a subtask's bar, or the span between
|
|
2221
2240
|
the two bars a dependency joins. */
|
|
2222
2241
|
bounds(t) {
|
|
2223
|
-
const e = this.host.view,
|
|
2242
|
+
const e = this.host.view, i = (a) => e.boxById.get(a);
|
|
2224
2243
|
if (t.kind === "subtask") {
|
|
2225
|
-
const a =
|
|
2244
|
+
const a = i(t.id);
|
|
2226
2245
|
return a === void 0 ? null : { x0: a.outerFrom, x1: a.outerTo, y0: a.y, y1: a.y + a.height };
|
|
2227
2246
|
}
|
|
2228
2247
|
if (t.kind === "milestone") {
|
|
2229
|
-
const a = this.host.data.milestones.find((d) => d.id === t.id), l = a === void 0 ? null :
|
|
2248
|
+
const a = this.host.data.milestones.find((d) => d.id === t.id), l = a === void 0 ? null : Qt(e.viewport(), a);
|
|
2230
2249
|
return l === null ? null : { x0: l.x - l.half, x1: l.x + l.half, y0: l.y - l.half, y1: l.y + l.half };
|
|
2231
2250
|
}
|
|
2232
|
-
const
|
|
2251
|
+
const n = this.host.data.dependencies.find((a) => a.id === t.id), o = n === void 0 ? void 0 : i(n.from), r = n === void 0 ? void 0 : i(n.to);
|
|
2233
2252
|
return o === void 0 || r === void 0 ? null : {
|
|
2234
2253
|
x0: Math.min(o.mainTo, r.mainFrom),
|
|
2235
2254
|
x1: Math.max(o.mainTo, r.mainFrom),
|
|
@@ -2241,11 +2260,11 @@ class Li {
|
|
|
2241
2260
|
at the side it came in from; a target wider than the view shows its
|
|
2242
2261
|
start. As a drag at the edge pans along, the keys do. */
|
|
2243
2262
|
reveal(t) {
|
|
2244
|
-
const e = this.bounds(t),
|
|
2245
|
-
if (e === null ||
|
|
2246
|
-
const
|
|
2263
|
+
const e = this.bounds(t), i = this.host.view;
|
|
2264
|
+
if (e === null || i.width <= 0) return;
|
|
2265
|
+
const n = Math.min(24, i.width / 10), o = e.x0 < 0 ? e.x0 - n : e.x1 > i.width ? Math.max(0, Math.min(e.x1 - i.width + n, e.x0 - n)) : 0, r = e.y0 < 0 ? e.y0 : e.y1 > i.height ? Math.min(e.y1 - i.height, e.y0) : 0;
|
|
2247
2266
|
if (o === 0 && r === 0) return;
|
|
2248
|
-
const a =
|
|
2267
|
+
const a = i.pan(o, r);
|
|
2249
2268
|
a.moved && this.host.viewMoved(a.time);
|
|
2250
2269
|
}
|
|
2251
2270
|
/** After the data or the view changed: the keys' target is read anew by its
|
|
@@ -2263,36 +2282,36 @@ class Li {
|
|
|
2263
2282
|
if (!this.host.gestures.byKeyboard) return;
|
|
2264
2283
|
const e = this.host.data.tooltipTargetFor(t);
|
|
2265
2284
|
e !== null && (this.spoken = { target: e, lane: t.kind === "subtask" ? t.subtask.lane : t.kind === "milestone" ? t.milestone.lane : null, count: (this.spoken?.count ?? 0) + 1 }, this.host.spokenChanged());
|
|
2266
|
-
},
|
|
2285
|
+
}, Mi);
|
|
2267
2286
|
}
|
|
2268
2287
|
/** Unmount: no readout after it. */
|
|
2269
2288
|
stop() {
|
|
2270
2289
|
this.timer !== null && clearTimeout(this.timer), this.timer = null;
|
|
2271
2290
|
}
|
|
2272
2291
|
}
|
|
2273
|
-
const
|
|
2274
|
-
function
|
|
2292
|
+
const et = (s) => JSON.stringify([s.domain ?? null, [...s.folded ?? []].sort()]);
|
|
2293
|
+
function Ii(s, t) {
|
|
2275
2294
|
if (t.size === 0 || s.folded === void 0) return s;
|
|
2276
|
-
const e = s.folded.filter((
|
|
2295
|
+
const e = s.folded.filter((i) => t.has(i));
|
|
2277
2296
|
return e.length === s.folded.length ? s : { ...s.domain ? { domain: s.domain } : {}, ...e.length ? { folded: e } : {} };
|
|
2278
2297
|
}
|
|
2279
|
-
function
|
|
2298
|
+
function Li(s, t, e = (i) => i) {
|
|
2280
2299
|
if (s.length === 0) return null;
|
|
2281
|
-
let
|
|
2300
|
+
let i = 1 / 0, n = -1 / 0;
|
|
2282
2301
|
for (const a of s)
|
|
2283
|
-
|
|
2284
|
-
|
|
2285
|
-
const o = Math.min(t.max, Math.max(t.min,
|
|
2302
|
+
i = Math.min(i, a.from - (a.leadIn ?? 0)), n = Math.max(n, a.to + (a.leadOut ?? 0));
|
|
2303
|
+
i = e(i), n = e(n);
|
|
2304
|
+
const o = Math.min(t.max, Math.max(t.min, n - i)), r = (i + n) / 2;
|
|
2286
2305
|
return [r - o / 2, r + o / 2];
|
|
2287
2306
|
}
|
|
2288
|
-
const
|
|
2307
|
+
const Pe = {
|
|
2289
2308
|
width: 0,
|
|
2290
2309
|
height: 0,
|
|
2291
2310
|
scrollY: 0,
|
|
2292
2311
|
headers: [],
|
|
2293
2312
|
days: [],
|
|
2294
2313
|
ticks: [],
|
|
2295
|
-
step:
|
|
2314
|
+
step: jt,
|
|
2296
2315
|
fontScale: 1,
|
|
2297
2316
|
ghost: null,
|
|
2298
2317
|
grips: [],
|
|
@@ -2304,9 +2323,9 @@ const Be = {
|
|
|
2304
2323
|
spoken: null,
|
|
2305
2324
|
summary: { lanes: 0, subtasks: 0, from: 0, to: 0, overlaps: 0, violated: 0, blocked: 0, milestones: 0 }
|
|
2306
2325
|
};
|
|
2307
|
-
class
|
|
2308
|
-
data = new
|
|
2309
|
-
view = new
|
|
2326
|
+
class Ai {
|
|
2327
|
+
data = new Wn(() => this.viewChanged());
|
|
2328
|
+
view = new sn(this.data);
|
|
2310
2329
|
gestures;
|
|
2311
2330
|
keys;
|
|
2312
2331
|
handlersNow = {};
|
|
@@ -2347,27 +2366,27 @@ class Di {
|
|
|
2347
2366
|
movePending = !1;
|
|
2348
2367
|
domainFrame = 0;
|
|
2349
2368
|
unsubscribeTheme = null;
|
|
2350
|
-
snapshot =
|
|
2369
|
+
snapshot = Pe;
|
|
2351
2370
|
listeners = /* @__PURE__ */ new Set();
|
|
2352
2371
|
constructor(t = {}) {
|
|
2353
|
-
this.folded = t.folded ?? [], this.domainInView = t.domain ?? null, this.domainInView !== null && this.view.showWall(this.domainInView), this.viewNow = this.currentView(), this.gestures = new
|
|
2372
|
+
this.folded = t.folded ?? [], this.domainInView = t.domain ?? null, this.domainInView !== null && this.view.showWall(this.domainInView), this.viewNow = this.currentView(), this.gestures = new vi({
|
|
2354
2373
|
data: this.data,
|
|
2355
2374
|
view: this.view,
|
|
2356
2375
|
plotElement: () => this.plot,
|
|
2357
2376
|
handlers: () => this.handlersNow,
|
|
2358
2377
|
selectedSubtask: () => this.selected,
|
|
2359
|
-
select: (e,
|
|
2378
|
+
select: (e, i) => this.select(e, i),
|
|
2360
2379
|
viewChanged: () => this.viewChanged(),
|
|
2361
2380
|
viewMoved: (e) => this.viewMoved(e),
|
|
2362
2381
|
interactionChanged: () => this.interactionChanged(),
|
|
2363
2382
|
hoverChanged: () => this.hoverChanged()
|
|
2364
|
-
}), this.keys = new
|
|
2383
|
+
}), this.keys = new Si({
|
|
2365
2384
|
data: this.data,
|
|
2366
2385
|
view: this.view,
|
|
2367
2386
|
gestures: this.gestures,
|
|
2368
2387
|
handlers: () => this.handlersNow,
|
|
2369
2388
|
visibleDomain: () => this.visibleDomain(),
|
|
2370
|
-
select: (e,
|
|
2389
|
+
select: (e, i) => this.select(e, i),
|
|
2371
2390
|
viewMoved: (e) => this.viewMoved(e),
|
|
2372
2391
|
spokenChanged: () => this.publish()
|
|
2373
2392
|
});
|
|
@@ -2411,7 +2430,7 @@ class Di {
|
|
|
2411
2430
|
getView = () => this.viewNow;
|
|
2412
2431
|
/** Goes to a whole view (`setView`); what it leaves out goes back to its default. */
|
|
2413
2432
|
applyView(t) {
|
|
2414
|
-
|
|
2433
|
+
et(t) !== et(this.viewNow) && (this.actedOn = !0, this.folded = t.folded ?? [], this.setDomain(t.domain ?? null));
|
|
2415
2434
|
}
|
|
2416
2435
|
/** Puts a span of two wall-clock instants in view; null shows the
|
|
2417
2436
|
subtasks' extent. */
|
|
@@ -2421,7 +2440,7 @@ class Di {
|
|
|
2421
2440
|
/** Folds or unfolds one group. */
|
|
2422
2441
|
toggleGroup = (t) => {
|
|
2423
2442
|
const e = this.viewNow.folded ?? [];
|
|
2424
|
-
this.actedOn = !0, this.folded = e.includes(t) ? e.filter((
|
|
2443
|
+
this.actedOn = !0, this.folded = e.includes(t) ? e.filter((i) => i !== t) : [...e, t], this.viewChanged();
|
|
2425
2444
|
};
|
|
2426
2445
|
foldAll = () => {
|
|
2427
2446
|
this.actedOn = !0, this.folded = this.data.groups.map((t) => t.id), this.viewChanged();
|
|
@@ -2430,14 +2449,14 @@ class Di {
|
|
|
2430
2449
|
this.actedOn = !0, this.folded = [], this.viewChanged();
|
|
2431
2450
|
};
|
|
2432
2451
|
currentView() {
|
|
2433
|
-
return
|
|
2452
|
+
return Ii(
|
|
2434
2453
|
{ ...this.domainInView === null ? {} : { domain: this.domainInView }, ...this.folded.length > 0 ? { folded: this.folded } : {} },
|
|
2435
2454
|
new Set(this.data.groups.map((t) => t.id))
|
|
2436
2455
|
);
|
|
2437
2456
|
}
|
|
2438
2457
|
publishView() {
|
|
2439
2458
|
const t = this.currentView();
|
|
2440
|
-
if (
|
|
2459
|
+
if (et(t) !== et(this.viewNow)) {
|
|
2441
2460
|
this.viewNow = t;
|
|
2442
2461
|
for (const e of this.viewListeners) e();
|
|
2443
2462
|
}
|
|
@@ -2445,13 +2464,13 @@ class Di {
|
|
|
2445
2464
|
/** The subtasks' extent within the zoom limits, while the view names no
|
|
2446
2465
|
span - and the local day of today while there is no work to show. */
|
|
2447
2466
|
fit() {
|
|
2448
|
-
const t = this.view.options.calendar, e =
|
|
2467
|
+
const t = this.view.options.calendar, e = Li(this.data.subtasks, this.view.options.zoomLimits, (n) => H(n, t));
|
|
2449
2468
|
if (e !== null) {
|
|
2450
2469
|
this.view.domain = e, this.fitted = !0;
|
|
2451
2470
|
return;
|
|
2452
2471
|
}
|
|
2453
|
-
const
|
|
2454
|
-
|
|
2472
|
+
const i = /* @__PURE__ */ new Date();
|
|
2473
|
+
i.setHours(0, 0, 0, 0), this.view.showWall([i.getTime(), i.getTime() + U]);
|
|
2455
2474
|
}
|
|
2456
2475
|
/** `undefined`: the scene keeps the selection itself. */
|
|
2457
2476
|
setControlledTask(t) {
|
|
@@ -2468,14 +2487,14 @@ class Di {
|
|
|
2468
2487
|
return t !== void 0 && t.task === this.selectedTask ? t.id : null;
|
|
2469
2488
|
}
|
|
2470
2489
|
select(t, e) {
|
|
2471
|
-
const
|
|
2472
|
-
this.selected = e, t !== this.selectedTask && this.controlledTask === void 0 && (this.ownTask = t),
|
|
2490
|
+
const i = t !== this.selectedTask || e !== this.selected;
|
|
2491
|
+
this.selected = e, t !== this.selectedTask && this.controlledTask === void 0 && (this.ownTask = t), i && this.handlersNow.onSelectedTaskChange?.(t, e), this.interactionChanged();
|
|
2473
2492
|
}
|
|
2474
2493
|
/* ---------------------------------------------------------------- */
|
|
2475
2494
|
/* DOM binding */
|
|
2476
2495
|
/* ---------------------------------------------------------------- */
|
|
2477
|
-
bind(t, e,
|
|
2478
|
-
this.root = t, this.plot = e, this.dataCanvas =
|
|
2496
|
+
bind(t, e, i, n) {
|
|
2497
|
+
this.root = t, this.plot = e, this.dataCanvas = i, this.overlayCanvas = n, this.unsubscribeTheme = Ls(() => {
|
|
2479
2498
|
this.colours = null, this.dataStale = !0, this.requestDraw();
|
|
2480
2499
|
}), this.viewChanged();
|
|
2481
2500
|
}
|
|
@@ -2483,14 +2502,14 @@ class Di {
|
|
|
2483
2502
|
this.gestures.cancelEdit(), this.keys.stop(), this.unsubscribeTheme?.(), this.unsubscribeTheme = null, this.frame !== 0 && cancelAnimationFrame(this.frame), this.domainFrame !== 0 && cancelAnimationFrame(this.domainFrame), this.frame = this.domainFrame = 0, this.movePending = !1, this.root = this.plot = this.dataCanvas = this.overlayCanvas = null;
|
|
2484
2503
|
}
|
|
2485
2504
|
resize(t, e) {
|
|
2486
|
-
const
|
|
2487
|
-
|
|
2505
|
+
const i = Math.max(0, Math.round(t)), n = Math.max(0, Math.round(e));
|
|
2506
|
+
i === this.view.width && n === this.view.height || (this.view.width = i, this.view.height = n, this.viewChanged());
|
|
2488
2507
|
}
|
|
2489
2508
|
subscribe = (t) => (this.listeners.add(t), () => {
|
|
2490
2509
|
this.listeners.delete(t);
|
|
2491
2510
|
});
|
|
2492
2511
|
getSnapshot = () => this.snapshot;
|
|
2493
|
-
getServerSnapshot = () =>
|
|
2512
|
+
getServerSnapshot = () => Pe;
|
|
2494
2513
|
/* ---------------------------------------------------------------- */
|
|
2495
2514
|
/* Changes */
|
|
2496
2515
|
/* ---------------------------------------------------------------- */
|
|
@@ -2521,8 +2540,8 @@ class Di {
|
|
|
2521
2540
|
this.requestDraw();
|
|
2522
2541
|
}
|
|
2523
2542
|
publish() {
|
|
2524
|
-
const t = this.view, e = this.selected !== null ? t.boxById.get(this.selected) : void 0,
|
|
2525
|
-
e !== void 0 && !e.miniature && !this.gestures.editing && e.subtask.task === this.selectedTask && (t.options.intents.includes("leadIn") &&
|
|
2543
|
+
const t = this.view, e = this.selected !== null ? t.boxById.get(this.selected) : void 0, i = [];
|
|
2544
|
+
e !== void 0 && !e.miniature && !this.gestures.editing && e.subtask.task === this.selectedTask && (t.options.intents.includes("leadIn") && i.push({ kind: "leadIn", x: e.outerFrom, y: e.y, height: e.height }), t.options.intents.includes("leadOut") && i.push({ kind: "leadOut", x: e.outerTo, y: e.y, height: e.height })), this.snapshot = {
|
|
2526
2545
|
width: t.width,
|
|
2527
2546
|
height: t.height,
|
|
2528
2547
|
scrollY: t.scrollY,
|
|
@@ -2530,7 +2549,7 @@ class Di {
|
|
|
2530
2549
|
...t.bands(),
|
|
2531
2550
|
fontScale: t.fontScale,
|
|
2532
2551
|
ghost: this.gestures.ghostSummary(),
|
|
2533
|
-
grips:
|
|
2552
|
+
grips: i,
|
|
2534
2553
|
cursor: this.gestures.cursor,
|
|
2535
2554
|
tooltip: this.tooltip(),
|
|
2536
2555
|
loading: this.gestures.loading,
|
|
@@ -2539,25 +2558,25 @@ class Di {
|
|
|
2539
2558
|
spoken: this.keys.spoken,
|
|
2540
2559
|
summary: this.summary()
|
|
2541
2560
|
};
|
|
2542
|
-
for (const
|
|
2561
|
+
for (const n of this.listeners) n();
|
|
2543
2562
|
}
|
|
2544
2563
|
/** One header per row, with what it says and where it sits. The scroll is
|
|
2545
2564
|
not taken off here: the header column is moved as a whole, as it always
|
|
2546
2565
|
was, so that a header and its row cannot drift apart by a rounding. */
|
|
2547
2566
|
headers() {
|
|
2548
|
-
const t = new Map(this.data.lanes.map((
|
|
2549
|
-
return this.view.rows.rows.map((
|
|
2550
|
-
key:
|
|
2551
|
-
kind:
|
|
2552
|
-
lane:
|
|
2553
|
-
group:
|
|
2554
|
-
label: (
|
|
2555
|
-
depth:
|
|
2556
|
-
within:
|
|
2557
|
-
lanes:
|
|
2558
|
-
collapsed:
|
|
2559
|
-
top:
|
|
2560
|
-
height:
|
|
2567
|
+
const t = new Map(this.data.lanes.map((n) => [n.id, n.label])), e = new Map(this.data.groups.map((n) => [n.id, n.label])), i = new Set(this.folded);
|
|
2568
|
+
return this.view.rows.rows.map((n) => ({
|
|
2569
|
+
key: n.lane ?? n.group ?? "",
|
|
2570
|
+
kind: n.kind,
|
|
2571
|
+
lane: n.lane,
|
|
2572
|
+
group: n.group,
|
|
2573
|
+
label: (n.lane !== void 0 ? t.get(n.lane) : e.get(n.group ?? "")) ?? n.lane ?? n.group ?? "",
|
|
2574
|
+
depth: n.depth,
|
|
2575
|
+
within: n.within,
|
|
2576
|
+
lanes: n.lanes,
|
|
2577
|
+
collapsed: n.group === void 0 ? void 0 : i.has(n.group),
|
|
2578
|
+
top: n.top,
|
|
2579
|
+
height: n.height
|
|
2561
2580
|
}));
|
|
2562
2581
|
}
|
|
2563
2582
|
/** The bars a label could stand in: the visible part of every main time,
|
|
@@ -2567,27 +2586,27 @@ class Di {
|
|
|
2567
2586
|
const t = this.view;
|
|
2568
2587
|
if (t.width <= 0) return [];
|
|
2569
2588
|
const e = this.colours;
|
|
2570
|
-
return t.boxes.flatMap((
|
|
2571
|
-
if (!
|
|
2572
|
-
const
|
|
2573
|
-
if (
|
|
2574
|
-
const o = e === null ? !0 :
|
|
2575
|
-
wt(
|
|
2576
|
-
|
|
2589
|
+
return t.boxes.flatMap((i) => {
|
|
2590
|
+
if (!Bt(i, t.width, t.height)) return [];
|
|
2591
|
+
const n = Ws(i, t.width);
|
|
2592
|
+
if (n === null) return [];
|
|
2593
|
+
const o = e === null ? !0 : te(
|
|
2594
|
+
wt(i.subtask.appearance),
|
|
2595
|
+
ut(e, { selectedTask: this.selectedTask, selectedSubtask: this.selectedSubtask }, i.subtask.task, i.subtask.id),
|
|
2577
2596
|
e
|
|
2578
2597
|
).onDark;
|
|
2579
|
-
return [{ subtask:
|
|
2598
|
+
return [{ subtask: i.subtask, ...n, dark: o }];
|
|
2580
2599
|
});
|
|
2581
2600
|
}
|
|
2582
2601
|
/** The findings count the whole plan - an overlap out of view is still one
|
|
2583
2602
|
to know of -, the subtasks only what is in view. */
|
|
2584
2603
|
summary() {
|
|
2585
|
-
const t = this.view, [e,
|
|
2604
|
+
const t = this.view, [e, i] = this.visibleDomain();
|
|
2586
2605
|
return {
|
|
2587
2606
|
lanes: this.data.lanes.length,
|
|
2588
|
-
subtasks: t.boxes.filter((
|
|
2607
|
+
subtasks: t.boxes.filter((n) => Bt(n, t.width, t.height)).length,
|
|
2589
2608
|
from: e,
|
|
2590
|
-
to:
|
|
2609
|
+
to: i,
|
|
2591
2610
|
overlaps: this.data.overlaps.length,
|
|
2592
2611
|
violated: this.data.violatedById.size,
|
|
2593
2612
|
blocked: this.data.inBlocked.length,
|
|
@@ -2599,12 +2618,12 @@ class Di {
|
|
|
2599
2618
|
if (!this.gestures.idle) return null;
|
|
2600
2619
|
const e = this.data.tooltipTargetFor(t);
|
|
2601
2620
|
if (e === null) return null;
|
|
2602
|
-
const { x:
|
|
2603
|
-
return { target: e, x:
|
|
2621
|
+
const { x: i, y: n } = this.gestures.hoverPoint;
|
|
2622
|
+
return { target: e, x: i, y: n };
|
|
2604
2623
|
}
|
|
2605
2624
|
/** The visible span, as two wall-clock instants. */
|
|
2606
2625
|
visibleDomain() {
|
|
2607
|
-
const t = (e) =>
|
|
2626
|
+
const t = (e) => ht(e, this.view.options.calendar);
|
|
2608
2627
|
return [t(this.view.domain[0]), t(this.view.domain[1])];
|
|
2609
2628
|
}
|
|
2610
2629
|
/** A pan or zoom of the planner's goes into the view once per frame,
|
|
@@ -2618,18 +2637,18 @@ class Di {
|
|
|
2618
2637
|
}
|
|
2619
2638
|
/** The time and the lane at a client point, or null outside the plot. */
|
|
2620
2639
|
positionAt(t, e) {
|
|
2621
|
-
const
|
|
2622
|
-
if (
|
|
2623
|
-
const
|
|
2624
|
-
return
|
|
2640
|
+
const i = this.plot?.getBoundingClientRect();
|
|
2641
|
+
if (i === void 0) return null;
|
|
2642
|
+
const n = t - i.left, o = e - i.top;
|
|
2643
|
+
return n < 0 || o < 0 || n > i.width || o > i.height ? null : { time: this.view.timeAt(n), lane: this.view.laneIdAt(o) };
|
|
2625
2644
|
}
|
|
2626
2645
|
/** The client point of a time, on a lane's middle where one is named, or
|
|
2627
2646
|
null while the schedule is not on screen. */
|
|
2628
2647
|
clientPointOf(t, e) {
|
|
2629
|
-
const
|
|
2630
|
-
if (
|
|
2631
|
-
const
|
|
2632
|
-
return { x:
|
|
2648
|
+
const i = this.plot?.getBoundingClientRect();
|
|
2649
|
+
if (i === void 0) return null;
|
|
2650
|
+
const n = this.view.viewport(), o = e === void 0 ? null : J(n, e), r = o === null ? 0 : o.top + o.height / 2;
|
|
2651
|
+
return { x: i.left + $(n, t), y: i.top + r };
|
|
2633
2652
|
}
|
|
2634
2653
|
/** Whether a lane has a row of its own on a mounted plot: not unknown, not
|
|
2635
2654
|
in a folded group, whose lanes are strips and no rows. */
|
|
@@ -2641,8 +2660,8 @@ class Di {
|
|
|
2641
2660
|
moved, for a lane without a row. */
|
|
2642
2661
|
scrollToLane(t) {
|
|
2643
2662
|
if (!this.hasRow(t)) return !1;
|
|
2644
|
-
const e = this.view.rows.slots.get(t),
|
|
2645
|
-
return this.view.pan(0,
|
|
2663
|
+
const e = this.view.rows.slots.get(t), i = e.top - this.view.scrollY, n = i < 0 ? i : i + e.height > this.view.height ? Math.min(i + e.height - this.view.height, i) : 0;
|
|
2664
|
+
return this.view.pan(0, n).moved && this.viewMoved(!1), !0;
|
|
2646
2665
|
}
|
|
2647
2666
|
/** Brings a subtask's lane and time into view, the span keeping its width;
|
|
2648
2667
|
false, and nothing moved, for one without a row. */
|
|
@@ -2661,9 +2680,9 @@ class Di {
|
|
|
2661
2680
|
}
|
|
2662
2681
|
draw() {
|
|
2663
2682
|
if (this.root === null) return;
|
|
2664
|
-
this.colours === null && (this.colours =
|
|
2665
|
-
const { width: t, height: e } = this.view,
|
|
2666
|
-
if (
|
|
2683
|
+
this.colours === null && (this.colours = ti(this.root, this.data), this.publish());
|
|
2684
|
+
const { width: t, height: e } = this.view, i = this.dataStale ? _e(this.dataCanvas, t, e) : null, n = _e(this.overlayCanvas, t, e);
|
|
2685
|
+
if (n === null || t === 0 || this.dataStale && i === null) return;
|
|
2667
2686
|
this.dataStale = !1;
|
|
2668
2687
|
const o = {
|
|
2669
2688
|
data: this.data,
|
|
@@ -2675,7 +2694,7 @@ class Di {
|
|
|
2675
2694
|
hover: this.gestures.hover,
|
|
2676
2695
|
ghost: this.gestures.ghostDrawing()
|
|
2677
2696
|
};
|
|
2678
|
-
|
|
2697
|
+
i !== null && ei(i, o), si(n, o);
|
|
2679
2698
|
}
|
|
2680
2699
|
/* ---------------------------------------------------------------- */
|
|
2681
2700
|
/* Gestures, as the component hands them in */
|
|
@@ -2696,49 +2715,49 @@ class Di {
|
|
|
2696
2715
|
focus = (t) => this.keys.focus(t);
|
|
2697
2716
|
blur = () => this.keys.blur();
|
|
2698
2717
|
}
|
|
2699
|
-
function
|
|
2700
|
-
const { initialView: t, onViewChange: e } = s, [
|
|
2701
|
-
const l = (d) => Ds(
|
|
2718
|
+
function xi(s = {}) {
|
|
2719
|
+
const { initialView: t, onViewChange: e } = s, [i] = at(() => new Ai(t)), n = V(""), [o] = at(() => {
|
|
2720
|
+
const l = (d) => Ds(Bn, { ...d, scene: i });
|
|
2702
2721
|
return l.displayName = "Schedule", {
|
|
2703
2722
|
Schedule: l,
|
|
2704
|
-
Lane:
|
|
2705
|
-
LaneGroup:
|
|
2706
|
-
Subtasks:
|
|
2707
|
-
Dependencies:
|
|
2708
|
-
BlockedTimes:
|
|
2709
|
-
Milestones:
|
|
2723
|
+
Lane: Pn,
|
|
2724
|
+
LaneGroup: Gn,
|
|
2725
|
+
Subtasks: Hn,
|
|
2726
|
+
Dependencies: Yn,
|
|
2727
|
+
BlockedTimes: Kn,
|
|
2728
|
+
Milestones: Vn,
|
|
2710
2729
|
setView: (d) => {
|
|
2711
|
-
|
|
2730
|
+
i.applyView(d), n.current = et(i.getView());
|
|
2712
2731
|
},
|
|
2713
|
-
setDomain:
|
|
2714
|
-
positionAt: (d, h) =>
|
|
2715
|
-
clientPointOf: (d, h) =>
|
|
2716
|
-
visibleDomain: () =>
|
|
2717
|
-
scrollToLane: (d) =>
|
|
2718
|
-
scrollToSubtask: (d) =>
|
|
2719
|
-
focusSubtask: (d) =>
|
|
2720
|
-
toggleGroup:
|
|
2721
|
-
foldAll:
|
|
2722
|
-
unfoldAll:
|
|
2732
|
+
setDomain: i.setDomain,
|
|
2733
|
+
positionAt: (d, h) => i.positionAt(d, h),
|
|
2734
|
+
clientPointOf: (d, h) => i.clientPointOf(d, h),
|
|
2735
|
+
visibleDomain: () => i.visibleDomain(),
|
|
2736
|
+
scrollToLane: (d) => i.scrollToLane(d),
|
|
2737
|
+
scrollToSubtask: (d) => i.scrollToSubtask(d),
|
|
2738
|
+
focusSubtask: (d) => i.focusSubtask(d),
|
|
2739
|
+
toggleGroup: i.toggleGroup,
|
|
2740
|
+
foldAll: i.foldAll,
|
|
2741
|
+
unfoldAll: i.unfoldAll
|
|
2723
2742
|
};
|
|
2724
|
-
}), r =
|
|
2743
|
+
}), r = Ye(i.subscribeView, i.getView, i.getView), a = et(r);
|
|
2725
2744
|
return j(() => {
|
|
2726
|
-
|
|
2745
|
+
n.current !== a && (n.current = a, i.acted && e?.(r));
|
|
2727
2746
|
}, [a]), W(() => ({ ...o, view: r }), [o, r]);
|
|
2728
2747
|
}
|
|
2729
2748
|
export {
|
|
2730
|
-
|
|
2731
|
-
|
|
2732
|
-
|
|
2733
|
-
|
|
2734
|
-
|
|
2735
|
-
|
|
2736
|
-
|
|
2749
|
+
ye as applyIntent,
|
|
2750
|
+
Ut as arrival,
|
|
2751
|
+
zt as departure,
|
|
2752
|
+
Ei as findings,
|
|
2753
|
+
Ke as inBlockedTime,
|
|
2754
|
+
nt as occupied,
|
|
2755
|
+
Xt as overlaps,
|
|
2737
2756
|
wt as resolveAppearance,
|
|
2738
|
-
|
|
2739
|
-
|
|
2740
|
-
|
|
2741
|
-
|
|
2742
|
-
|
|
2743
|
-
|
|
2757
|
+
$i as ripple,
|
|
2758
|
+
Ri as shiftTask,
|
|
2759
|
+
$s as snapTime,
|
|
2760
|
+
Fi as subtaskFromPlace,
|
|
2761
|
+
xi as useSchedule,
|
|
2762
|
+
qt as violatedDependencies
|
|
2744
2763
|
};
|