tsviewer 1.0.27 → 1.0.28

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.
@@ -0,0 +1,732 @@
1
+ import { ref as C, computed as D, watch as te, onMounted as ne, createElementBlock as oe, openBlock as ae, normalizeStyle as ie, unref as J, nextTick as re } from "vue";
2
+ import { h as se, g as le, u as V, p as j, e as ce } from "./index-BtnXpu3W.mjs";
3
+ import { storeToRefs as ee } from "pinia";
4
+ import { u as N } from "./useToken-CJWB6KGF.mjs";
5
+ import { b as P, u as B } from "./request_composable-DV-ftNZG.mjs";
6
+ import { f as ue, h as de } from "./TSViewerCanvas-CeGKq-zQ.mjs";
7
+ import { p as G } from "./pathOr-DE7WGRqe.mjs";
8
+ import { g as fe } from "./_commonjsHelpers-DaMA6jEr.mjs";
9
+ const I = (t, d) => {
10
+ let u;
11
+ if (/^#([A-Fa-f0-9]{3}){1,2}$/.test(t))
12
+ return u = t.substring(1).split(""), u.length === 3 && (u = [u[0], u[0], u[1], u[1], u[2], u[2]]), u = "0x" + u.join(""), "rgba(" + [u >> 16 & 255, u >> 8 & 255, u & 255].join(",") + "," + d + ")";
13
+ throw new Error("Bad Hex");
14
+ }, ve = (t) => {
15
+ t.sort((d, u) => d.start < u.start ? -1 : d.start > u.start ? 1 : 0);
16
+ }, K = (t, d) => {
17
+ const u = (t == null ? void 0 : t.layer_id) || 0;
18
+ return se({}, ue(le("id", u), d));
19
+ }, Q = (t, d, u, a = 0, c = !1) => {
20
+ let v;
21
+ return c ? v = q(t, d, a, t.length - 1, u) : v = W(t, d, a, t.length - 1, u), v === -1 ? v = 0 : v < 0 && (v = -v - 2), v;
22
+ }, W = (t, d, u, a, c) => {
23
+ if (a < u) {
24
+ let y = a >= 0 ? a : -a - 2;
25
+ if (y === -1) return y;
26
+ const w = t[y].start;
27
+ for (; y >= 0 && t[y].start === w; )
28
+ y--;
29
+ return -y - 2;
30
+ }
31
+ const v = parseInt((u + a) / 2);
32
+ if (t[v].start > d)
33
+ return W(t, d, u, v - 1, c);
34
+ if (t[v].start < d)
35
+ return W(t, d, v + 1, a, c);
36
+ {
37
+ let y = v;
38
+ if (c) {
39
+ for (; y >= 0 && t[y].start === d; )
40
+ y--;
41
+ y++;
42
+ } else {
43
+ for (; y < t.length && t[y].start === d; )
44
+ y++;
45
+ y--;
46
+ }
47
+ return y;
48
+ }
49
+ }, q = (t, d, u, a, c) => {
50
+ if (a < u) {
51
+ let w = a >= 0 ? a : -a - 2;
52
+ if (w === -1) return w;
53
+ const S = t[w].start + t[w].duration;
54
+ for (; w >= 0 && t[w].start + t[w].duration === S; )
55
+ w--;
56
+ return -w - 2;
57
+ }
58
+ const v = parseInt((u + a) / 2), y = t[v].start + t[v].duration;
59
+ if (y > d)
60
+ return q(t, d, u, v - 1, c);
61
+ if (y < d)
62
+ return q(t, d, v + 1, a, c);
63
+ {
64
+ let w = v;
65
+ if (c) {
66
+ for (; w >= 0 && t[w].start + t[w].duration === d; )
67
+ w--;
68
+ w++;
69
+ } else {
70
+ for (; w < t.length && t[w].start + t[w].duration === d; )
71
+ w++;
72
+ w--;
73
+ }
74
+ return w;
75
+ }
76
+ }, Y = (t, d, u = 0) => d * (t + u);
77
+ function he() {
78
+ const t = V(), { viewerChannels: d, viewerAnnotations: u, viewerMontageScheme: a } = ee(t), c = C([]), v = C([]), y = D(() => t.config), w = (g) => {
79
+ const n = a.value !== "NOT_MONTAGED";
80
+ let e = j("", "id", g);
81
+ if (n) {
82
+ const r = e.split("_");
83
+ e = r.length ? de(r) : e;
84
+ }
85
+ return e;
86
+ }, S = async (g, n, e, r, h) => {
87
+ const i = [];
88
+ i.push({ start: g, end: e.tsEnd });
89
+ let l = 0;
90
+ for (let o = 0; o < c.value.length; o++) {
91
+ const s = c.value[o];
92
+ if (g >= s.start && n <= s.end)
93
+ return;
94
+ if (i[0].start > n)
95
+ break;
96
+ if (s.start <= i[0].start && s.end >= g)
97
+ l = o + 1, i[0].start = s.end;
98
+ else if (s.start > i[0].start) {
99
+ l = o;
100
+ break;
101
+ }
102
+ }
103
+ const f = u.value.reduce((o, s) => o + s.annotations.length, 0);
104
+ if (i[0].start >= i[0].end && f > 0)
105
+ return;
106
+ const m = 0;
107
+ for (let o = l; o < c.value.length; o++)
108
+ if (c.value[o].start >= i[m].start)
109
+ if (i[m].end = c.value[o].start, c.value[o].end < n)
110
+ i.push({ start: c.value[o].end, end: e.tsEnd });
111
+ else
112
+ break;
113
+ if (!(i[0].start >= i[0].end && f > 0) && i.length > 0) {
114
+ d.value.map((o) => w(o));
115
+ for (const o of i) {
116
+ for (const s of u.value) {
117
+ if (!s.id) {
118
+ console.warn("Layer ID is undefined, skipping annotation request for layer:", s);
119
+ continue;
120
+ }
121
+ const L = Math.floor(o.end), O = {
122
+ id: r.content.id,
123
+ start: Math.floor(o.start),
124
+ end: L,
125
+ layerId: s.id,
126
+ limit: e.constants.LIMITANNFETCH
127
+ };
128
+ try {
129
+ const p = await N(), b = `${y.value.apiUrl}/timeseries/${r.content.id}/layers/${s.id}/annotations?api_key=${p}`, T = Object.keys(O).map((H) => `&${H}=${O[H]}`).join(""), E = `${b}${T}`, A = await fetch(E, {
130
+ method: "GET",
131
+ headers: { "Content-type": "application/json" }
132
+ });
133
+ if (A.status >= 400)
134
+ throw new Error(A.status);
135
+ const $ = await A.json();
136
+ await M($, h);
137
+ } catch (p) {
138
+ P(p);
139
+ }
140
+ }
141
+ c.value.push({
142
+ start: Math.floor(o.start),
143
+ end: Math.floor(o.end)
144
+ });
145
+ }
146
+ c.value.sort((o, s) => o.start < s.start ? -1 : o.start > s.start ? 1 : 0);
147
+ }
148
+ }, M = async (g, n) => {
149
+ const e = j({}, "linkedPackages", g);
150
+ let r = G([], ["annotations", "results"], g);
151
+ if (r.length >= 500) {
152
+ let i = 0;
153
+ for (const l of r)
154
+ l.start > i && (i = l.start);
155
+ for (const l of c.value)
156
+ if (l.end > i && l.start < i) {
157
+ l.end = i;
158
+ break;
159
+ }
160
+ }
161
+ const h = a.value !== "NOT_MONTAGED";
162
+ if (r.length > 0) {
163
+ const i = r.map((l) => {
164
+ const f = {
165
+ name: "",
166
+ id: l.id,
167
+ label: l.label,
168
+ description: l.description,
169
+ start: l.start,
170
+ duration: l.end - l.start,
171
+ end: l.end,
172
+ cStart: null,
173
+ cEnd: null,
174
+ selected: !1,
175
+ channelIds: l.channelIds,
176
+ allChannels: !1,
177
+ layer_id: l.layerId,
178
+ userId: l.userId
179
+ };
180
+ if (l.linkedPackage) {
181
+ const m = l.linkedPackage;
182
+ f.linkedPackage = G("", ["content", "id"], e[m]), f.linkedPackageDTO = e[m];
183
+ }
184
+ return (!h && f.channelIds.length === d.value.length || h && f.channelIds.length > d.value.length) && (f.allChannels = !0), f;
185
+ });
186
+ u.value.forEach((l) => {
187
+ const f = l.annotations, m = i.filter((o) => l.id === o.layer_id);
188
+ l.annotations = f.concat(m), t.updateLayer(l);
189
+ });
190
+ }
191
+ n("annotationsReceived");
192
+ };
193
+ return {
194
+ cachedAnnRange: c,
195
+ annLayerInfo: v,
196
+ checkAnnotationRange: S,
197
+ findNextAnnotation: (g) => {
198
+ const n = t.getViewerActiveLayer(), e = Q(n.annotations, g, !1);
199
+ return e < n.annotations.length ? n.annotations[e].start > g ? n.annotations[e] : n.annotations[e + 1] || n.annotations[e] : n.annotations[e];
200
+ },
201
+ findPreviousAnnotation: (g) => {
202
+ const n = t.getViewerActiveLayer(), e = Q(n.annotations, g, !0);
203
+ return n.annotations[e].start < g ? n.annotations[e] : e > 0 ? n.annotations[e - 1] : n.annotations[e];
204
+ },
205
+ getChannelId: w
206
+ };
207
+ }
208
+ function ge() {
209
+ const t = V(), { viewerAnnotations: d, viewerChannels: u } = ee(t), a = C([]), c = C([]), v = C(null), y = C(["#FFFF4E"]), w = D(() => t.config), S = (e, r) => {
210
+ var f, m;
211
+ const i = (((f = r.constants) == null ? void 0 : f.ANNOTATIONLABELHEIGHT) || 20) / 2 | 0, l = ((m = r.constants) == null ? void 0 : m.XOFFSET) || 0;
212
+ for (const o of e) {
213
+ let s = o.start, L = o.duration;
214
+ o.duration < 0 && (s = o.start + o.duration, L = -o.duration);
215
+ const O = l + (s - r.start) / r.rsPeriod;
216
+ if (o.cStart = O | 0, o.duration !== 0) {
217
+ const p = l + (s + L - r.start) / r.rsPeriod;
218
+ o.cEnd = p | 0;
219
+ } else
220
+ o.cEnd = o.cStart + r.cWidth / 40 | 0;
221
+ if (o.allChannels)
222
+ o.allOffsets = [i], o.cY = i;
223
+ else {
224
+ o.allOffsets = [], o.minOffset = r.cHeight | 0, o.maxOffset = 0;
225
+ const p = u.value;
226
+ for (const F of o.channelIds) {
227
+ let b = null;
228
+ for (const T of p)
229
+ if (T.id === F && T.visible) {
230
+ b = T.rowBaseline | 0, b < o.minOffset && (o.minOffset = b), b > o.maxOffset && (o.maxOffset = b), o.allOffsets.push(b);
231
+ break;
232
+ }
233
+ }
234
+ c.value.indexOf(o.minOffset) < 0 && c.value.push(o.minOffset), o.cY = o.minOffset;
235
+ }
236
+ }
237
+ }, M = (e, r, h, i) => {
238
+ var m, o;
239
+ const l = ((m = h.constants) == null ? void 0 : m.ANNOTATIONLABELHEIGHT) || 20, f = l / 2 | 0;
240
+ e.setTransform(h.pixelRatio, 0, 0, h.pixelRatio, 0, 0), e.save(), e.lineWidth = 1, e.setLineDash([8, 5]), e.strokeStyle = "rgba(0,0,0, 0.6)", e.fillStyle = "rgba(0,0,0,0.05)";
241
+ for (const s of r) {
242
+ const L = K(s, d.value);
243
+ s.selected && (e.save(), e.strokeStyle = L.selColor, e.fillStyle = L.bkColor, e.lineWidth = 1);
244
+ const O = Math.round(s.cStart) + 0.5, p = Math.round(s.cEnd) + 0.5;
245
+ s.allChannels ? s.duration === 0 ? (e.beginPath(), e.moveTo(O + 1, l), e.lineTo(O, i), e.stroke()) : (e.fillRect(O, l, p - O, i - l), e.beginPath(), e.moveTo(O, l), e.lineTo(O, i), e.moveTo(p, l), e.lineTo(p, i), e.stroke()) : ((o = s == null ? void 0 : s.channelIds) == null ? void 0 : o.length) === 1 ? s.duration === 0 && (e.beginPath(), e.moveTo(O, s.minOffset + f), e.lineTo(O, s.minOffset + f + 8), e.stroke()) : s.duration === 0 ? (e.beginPath(), e.moveTo(O, s.minOffset + f), e.lineTo(O, s.maxOffset - f), e.stroke()) : (e.fillRect(
246
+ O - 1,
247
+ s.minOffset + f,
248
+ p - O + 1,
249
+ s.maxOffset - s.minOffset - l
250
+ ), e.beginPath(), e.moveTo(O, s.minOffset + f), e.lineTo(O, s.maxOffset - f), e.moveTo(p, s.minOffset + f), e.lineTo(p, s.maxOffset - f), e.stroke()), s.selected && e.restore();
251
+ }
252
+ e.restore();
253
+ }, R = async (e, r, h, i, l, f) => {
254
+ var s;
255
+ const m = ((s = h.constants) == null ? void 0 : s.ANNOTATIONLABELHEIGHT) || 20, o = m / 2 | 0;
256
+ e.setTransform(h.pixelRatio, 0, 0, h.pixelRatio, 0, 0), e.save(), e.lineWidth = 2, e.font = "14px sans-serif", e.textAlign = "left";
257
+ for (const L of r) {
258
+ const O = K(L, d.value);
259
+ if (L === v.value && i)
260
+ continue;
261
+ L.selected ? (e.fillStyle = O.selColor || "rgba(51,204,102, 0.8)", e.strokeStyle = "white") : (e.fillStyle = O.color || "rgba(51,204,102,0.8)", e.strokeStyle = L === v.value ? "white" : "rgba(255,255,255,0.8)");
262
+ const p = Math.round(L.cStart) + 1, F = Math.round(L.cEnd);
263
+ let b = 0;
264
+ for (let A = 0; A < L.allOffsets.length; A++)
265
+ e.fillRect(
266
+ p - 1,
267
+ L.allOffsets[A] - o,
268
+ F - p + 2,
269
+ m
270
+ ), L.allOffsets[A] === L.minOffset && (b = A);
271
+ const T = L.allOffsets[b];
272
+ if (["annSelect", "annResize-left", "annResize-right"].includes(l) && f === "annotate" && (e.beginPath(), L.duration !== 0 && (e.moveTo(F - 3, T - o + 3), e.lineTo(F - 3, T + o - 3)), e.moveTo(p + 3, T - o + 3), e.lineTo(p + 3, T + o - 3), e.stroke()), F - p > L.label.length * 8 + 10) {
273
+ e.fillStyle = y.value.indexOf(O.hexColor) >= 0 ? "black" : "white";
274
+ const A = L.linkedPackage ? p + 30 : p + 10, $ = L.linkedPackage ? T + o - o / 2 : T + o - 6;
275
+ e.fillText(L.label, A, $);
276
+ }
277
+ const E = L.linkedPackageDTO;
278
+ E && F - p >= 30 && await k(e, E, p, T, o, m);
279
+ }
280
+ e.restore();
281
+ }, k = async (e, r, h, i, l, f) => {
282
+ const m = G({}, ["objects", "view", 1, "content"], r), o = j("", "fileType", m), s = new Image();
283
+ if (o === "PNG") {
284
+ const { id: L, packageId: O } = m, p = w.value.apiUrl;
285
+ try {
286
+ const F = await N();
287
+ s.src = `${p}/packages/${O}/files/${L}/presign/?api_key=${F}`, s.complete ? e.drawImage(s, h, i - l, 27, f) : s.addEventListener("load", () => {
288
+ e.drawImage(s, h, i - l, 27, f);
289
+ }, { once: !0 });
290
+ } catch (F) {
291
+ console.error("Error loading image:", F);
292
+ }
293
+ } else
294
+ s.src = g(), e.drawImage(s, h + 5, i - l, 20, 20);
295
+ }, g = (e) => "/path/to/default/icon.png";
296
+ return {
297
+ renderAnn: a,
298
+ hoverOffsets: c,
299
+ focusedAnn: v,
300
+ render: (e, r, h, i) => {
301
+ var L, O, p, F;
302
+ if (!r) {
303
+ console.warn("TSAnnotationCanvas: annotationsCanvas prop is undefined or null");
304
+ return;
305
+ }
306
+ const l = r.getContext("2d"), f = h.getContext("2d");
307
+ l.setTransform(e.pixelRatio, 0, 0, e.pixelRatio, 0, 0), f.setTransform(e.pixelRatio, 0, 0, e.pixelRatio, 0, 0), c.value = [(((L = e.constants) == null ? void 0 : L.ANNOTATIONLABELHEIGHT) || 20) / 2], l.clearRect(0, 0, e.cWidth, e.cHeight), f.clearRect(0, 0, e.cWidth, e.cHeight), a.value = [];
308
+ const m = e.duration && e.duration > 0 ? e.duration : 15e6, o = e.start || 0, s = o + m;
309
+ console.log("🎨 Annotation render debug:", {
310
+ start: o,
311
+ duration: m,
312
+ end: s,
313
+ layerCount: ((O = d.value) == null ? void 0 : O.length) || 0,
314
+ totalAnnotations: ((p = d.value) == null ? void 0 : p.reduce((b, T) => {
315
+ var E;
316
+ return b + (((E = T.annotations) == null ? void 0 : E.length) || 0);
317
+ }, 0)) || 0
318
+ });
319
+ for (const b of d.value)
320
+ if (b.visible && ((F = b.annotations) == null ? void 0 : F.length) > 0) {
321
+ console.log(`🔍 Processing layer "${b.name}" with ${b.annotations.length} annotations`);
322
+ const T = b.annotations.filter((E) => {
323
+ const A = E.start, $ = E.end || E.start + (E.duration || 0), H = A < s && $ > o;
324
+ return H && console.log(` ✅ Including annotation "${E.label}": ${A} - ${$}`), H;
325
+ });
326
+ console.log(` 📊 Found ${T.length} annotations in viewport`), T.length > 0 && (T.sort((E, A) => E.start - A.start), a.value.push(...T));
327
+ }
328
+ if (console.log(`🎯 Total annotations to render: ${a.value.length}`), a.value.length === 0) {
329
+ console.log("⚠️ No annotations found in viewport");
330
+ return;
331
+ }
332
+ ve(a.value), S(a.value, e), M(l, a.value, e, i), R(f, a.value, e, !0, e.pointerMode, e.viewerActiveTool), v.value && R(f, [v.value], e, !1, e.pointerMode, e.viewerActiveTool), console.log(`✅ Rendered ${a.value.length} annotations successfully`);
333
+ },
334
+ computeRenderOptions: S,
335
+ renderAnnotationAreas: M,
336
+ renderAnnotationLabels: R
337
+ };
338
+ }
339
+ function ye(t, d, u) {
340
+ const a = V(), c = C([0, 0]), v = (n, e) => {
341
+ const h = ((e == null ? void 0 : e.ANNOTATIONLABELHEIGHT) || 20) / 2;
342
+ for (const i of u.value)
343
+ if (n >= i - h && n <= i + h)
344
+ return !0;
345
+ return !1;
346
+ }, y = (n, e, r) => {
347
+ var l;
348
+ const i = ((r == null ? void 0 : r.ANNOTATIONLABELHEIGHT) || 20) / 2;
349
+ for (let f = 0; f < (((l = d.value) == null ? void 0 : l.length) || 0); f++) {
350
+ const m = d.value[f];
351
+ if (m.cStart < n && m.cEnd > n) {
352
+ if (e > m.cY - i && e < m.cY + i)
353
+ return f;
354
+ } else if (m.cStart > n)
355
+ break;
356
+ }
357
+ return null;
358
+ }, w = (n, e, r) => {
359
+ if (!r) return e;
360
+ switch (e) {
361
+ case "annotate":
362
+ return n <= r.cStart + 10 ? "annResize-left" : n >= r.cEnd - 10 && r.duration > 0 ? "annResize-right" : "annSelect";
363
+ case "pointer":
364
+ return "annSelect";
365
+ default:
366
+ return e;
367
+ }
368
+ };
369
+ return {
370
+ mouseDownPosition: c,
371
+ shouldCheckAnnotationHover: v,
372
+ findAnnotationAtPosition: y,
373
+ determinePointerMode: w,
374
+ resetFocusedAnnotation: () => {
375
+ var n;
376
+ ((n = t.value) == null ? void 0 : n.oldStart) !== void 0 && (t.value.start = t.value.oldStart, t.value.duration = t.value.oldDuration, t.value.end = t.value.start + t.value.duration);
377
+ },
378
+ selectFocusedAnnotation: () => t.value ? (a.setActiveAnnotation(t.value), !0) : !1,
379
+ onMouseDown: (n, e, r) => {
380
+ t.value && ["annResize-left", "annResize-right"].includes(r) && (t.value.oldStart = t.value.start, t.value.oldDuration = t.value.duration, c.value = [n, e]);
381
+ },
382
+ onMouseMove: (n, e, r, h, i) => {
383
+ let l = r;
384
+ if (h && c.value) {
385
+ const f = (n - c.value[0]) * i.rsPeriod;
386
+ switch (r) {
387
+ case "annResize-left":
388
+ t.value.oldDuration > 0 ? (t.value.start = t.value.oldStart + f, t.value.duration = t.value.oldDuration - f, t.value.end = t.value.start + t.value.duration) : t.value.start = t.value.oldStart + f;
389
+ break;
390
+ case "annResize-right":
391
+ t.value.duration = t.value.oldDuration + f, t.value.end = t.value.start + t.value.duration;
392
+ break;
393
+ }
394
+ } else {
395
+ const f = v(e, i.constants);
396
+ if (l = i.viewerActiveTool, f) {
397
+ const m = y(n, e, i.constants);
398
+ if (m !== null) {
399
+ const o = t.value, s = d.value[m];
400
+ (!o || n < t.value.cStart || n > t.value.cEnd) && (t.value = s), l = w(n, i.viewerActiveTool, t.value);
401
+ } else
402
+ t.value = null;
403
+ } else
404
+ t.value = null, l = i.viewerActiveTool;
405
+ }
406
+ return l;
407
+ },
408
+ onMouseUp: (n, e) => {
409
+ if (t.value && ["annResize-left", "annResize-right"].includes(n)) {
410
+ if (t.value.duration < 0) {
411
+ const r = -t.value.duration, h = t.value.start - r;
412
+ t.value.start = h, t.value.duration = r, t.value.end = h + r;
413
+ }
414
+ a.setActiveAnnotation(t.value), e("updateAnnotation", t.value);
415
+ }
416
+ }
417
+ };
418
+ }
419
+ var _ = { exports: {} }, Z;
420
+ function we() {
421
+ if (Z) return _.exports;
422
+ Z = 1;
423
+ function t() {
424
+ }
425
+ return t.prototype = {
426
+ on: function(d, u, a) {
427
+ var c = this.e || (this.e = {});
428
+ return (c[d] || (c[d] = [])).push({
429
+ fn: u,
430
+ ctx: a
431
+ }), this;
432
+ },
433
+ once: function(d, u, a) {
434
+ var c = this;
435
+ function v() {
436
+ c.off(d, v), u.apply(a, arguments);
437
+ }
438
+ return v._ = u, this.on(d, v, a);
439
+ },
440
+ emit: function(d) {
441
+ var u = [].slice.call(arguments, 1), a = ((this.e || (this.e = {}))[d] || []).slice(), c = 0, v = a.length;
442
+ for (c; c < v; c++)
443
+ a[c].fn.apply(a[c].ctx, u);
444
+ return this;
445
+ },
446
+ off: function(d, u) {
447
+ var a = this.e || (this.e = {}), c = a[d], v = [];
448
+ if (c && u)
449
+ for (var y = 0, w = c.length; y < w; y++)
450
+ c[y].fn !== u && c[y].fn._ !== u && v.push(c[y]);
451
+ return v.length ? a[d] = v : delete a[d], this;
452
+ }
453
+ }, _.exports = t, _.exports.TinyEmitter = t, _.exports;
454
+ }
455
+ var z, X;
456
+ function me() {
457
+ if (X) return z;
458
+ X = 1;
459
+ var t = we();
460
+ return z = new t(), z;
461
+ }
462
+ var Te = me();
463
+ const U = /* @__PURE__ */ fe(Te), x = {
464
+ $emit: (...t) => U.emit(...t),
465
+ $on: (...t) => U.on(...t),
466
+ $off: (...t) => U.off(...t),
467
+ $once: (...t) => U.once(...t)
468
+ };
469
+ function Le() {
470
+ const t = V(), d = C([]), u = C([
471
+ "#18BA62",
472
+ "#FFBC27",
473
+ "#E94B4B",
474
+ "#0D4EFF",
475
+ "#FF4FFF",
476
+ "#50FFFF",
477
+ "#FFFF4E",
478
+ "#512BAF",
479
+ "#8A6ECF",
480
+ "#389BAD",
481
+ "#187D46",
482
+ "#B12800",
483
+ "#0C2475",
484
+ "#FF5321",
485
+ "#FF99CC",
486
+ "#DCC180",
487
+ "#FF6C21",
488
+ "#000000",
489
+ "#9B9B9B",
490
+ "#00FF00",
491
+ "#FA8072",
492
+ "#808000",
493
+ "#A0522D",
494
+ "#2760FF"
495
+ ]), a = D(() => t.config), c = async (k, g) => {
496
+ const n = [];
497
+ if (k.results.length === 0)
498
+ await v({
499
+ name: "Default",
500
+ color: "#18BA62",
501
+ description: "Default Annotation Layer"
502
+ }, null, g);
503
+ else {
504
+ for (let e = 0; e < k.results.length; e++) {
505
+ const r = k.results[e];
506
+ let h = r.color || u.value[e % u.value.length];
507
+ const i = {
508
+ id: r.id,
509
+ name: r.name,
510
+ description: r.description,
511
+ visible: !0,
512
+ selected: e === 0,
513
+ // First layer is selected by default
514
+ annotations: [],
515
+ color: I(h, 0.7),
516
+ hexColor: h,
517
+ bkColor: I(h, 0.15),
518
+ selColor: I(h, 0.9)
519
+ };
520
+ n.push(i);
521
+ }
522
+ t.setAnnotations(n), g("annLayersInitialized");
523
+ }
524
+ d.value = k.results;
525
+ }, v = async (k, g, n) => {
526
+ try {
527
+ const e = await N(), r = `${a.value.apiUrl}/timeseries/${g.content.id}/layers?api_key=${e}`, h = await B(r, {
528
+ method: "POST",
529
+ body: {
530
+ name: k.name,
531
+ color: k.color,
532
+ description: k.description || k.name
533
+ }
534
+ }), i = {
535
+ ...h,
536
+ annotations: [],
537
+ hexColor: h.color,
538
+ color: I(h.color, 0.7),
539
+ bkColor: I(h.color, 0.15),
540
+ selColor: I(h.color, 0.9),
541
+ visible: !0,
542
+ selected: !0
543
+ };
544
+ return t.createLayer(i), t.setActiveAnnotationLayer(i.id), x.$emit("toast", {
545
+ detail: {
546
+ msg: `'${i.name}' Layer Created`
547
+ }
548
+ }), i;
549
+ } catch (e) {
550
+ throw P(e), e;
551
+ } finally {
552
+ n && n("closeAnnotationLayerWindow");
553
+ }
554
+ };
555
+ return {
556
+ annLayerInfo: d,
557
+ defaultColors: u,
558
+ initializeLayers: c,
559
+ createAnnotationLayer: v,
560
+ updateLayerVisibility: (k, g) => {
561
+ console.log(`[useAnnotationLayers] Updating layer ${k} visibility to:`, g);
562
+ const n = t.viewerAnnotations.find((e) => e.id === k);
563
+ if (n) {
564
+ console.log("[useAnnotationLayers] Found layer:", n.name, "current visible:", n.visible), n.visible = g, t.updateLayer(n), console.log("[useAnnotationLayers] Updated layer:", n.name, "new visible:", n.visible);
565
+ const e = t.viewerAnnotations.find((r) => r.id === k);
566
+ console.log("[useAnnotationLayers] Verification - layer visible is now:", e == null ? void 0 : e.visible);
567
+ } else
568
+ console.error("[useAnnotationLayers] Layer not found with ID:", k), console.log("[useAnnotationLayers] Available layers:", t.viewerAnnotations.map((e) => ({ id: e.id, name: e.name })));
569
+ },
570
+ selectLayer: (k) => {
571
+ t.viewerAnnotations.forEach((n) => {
572
+ n.selected = !1, t.updateLayer(n);
573
+ });
574
+ const g = t.viewerAnnotations.find((n) => n.id === k);
575
+ g && (g.selected = !0, t.updateLayer(g), t.setActiveAnnotationLayer(k));
576
+ },
577
+ deleteLayer: async (k, g) => {
578
+ try {
579
+ const n = await N(), e = `${a.value.apiUrl}/timeseries/${g.content.id}/layers/${k}?api_key=${n}`;
580
+ await B(e, { method: "DELETE" }), t.removeLayer(k), x.$emit("toast", {
581
+ detail: {
582
+ msg: "Layer deleted successfully"
583
+ }
584
+ });
585
+ } catch (n) {
586
+ throw P(n), n;
587
+ }
588
+ },
589
+ updateLayerColor: async (k, g, n) => {
590
+ try {
591
+ const e = await N(), r = `${a.value.apiUrl}/timeseries/${n.content.id}/layers/${k}?api_key=${e}`, h = await B(r, {
592
+ method: "PUT",
593
+ body: { color: g }
594
+ }), i = t.viewerAnnotations.find((l) => l.id === k);
595
+ return i && (i.hexColor = g, i.color = I(g, 0.7), i.bkColor = I(g, 0.15), i.selColor = I(g, 0.9), t.updateLayer(i)), h;
596
+ } catch (e) {
597
+ throw P(e), e;
598
+ }
599
+ },
600
+ loadLayers: async (k, g) => {
601
+ try {
602
+ const n = await N(), e = `${a.value.apiUrl}/timeseries/${k.content.id}/layers?api_key=${n}`, r = await B(e);
603
+ return await c(r, g), r;
604
+ } catch (n) {
605
+ throw P(n), n;
606
+ }
607
+ }
608
+ };
609
+ }
610
+ const ke = ["width", "height"], pe = {
611
+ __name: "TSAnnotationCanvas",
612
+ props: {
613
+ cWidth: { type: Number, default: 0 },
614
+ cHeight: Number,
615
+ start: Number,
616
+ duration: Number,
617
+ tsEnd: Number,
618
+ rsPeriod: Number,
619
+ pixelRatio: Number,
620
+ constants: {
621
+ type: Object,
622
+ default: () => ({
623
+ ANNOTATIONLABELHEIGHT: 20,
624
+ XOFFSET: 0,
625
+ LIMITANNFETCH: 500
626
+ })
627
+ },
628
+ pointerMode: String,
629
+ annotationsCanvas: [HTMLCanvasElement, Object],
630
+ activeViewer: { type: Object, required: !0 },
631
+ viewerActiveTool: String
632
+ },
633
+ emits: [
634
+ "annLayersInitialized",
635
+ "annotationsReceived",
636
+ "closeAnnotationLayerWindow",
637
+ "updateAnnotation"
638
+ ],
639
+ setup(t, { expose: d, emit: u }) {
640
+ const a = t, c = u, v = C(null), {
641
+ checkAnnotationRange: y,
642
+ findNextAnnotation: w,
643
+ findPreviousAnnotation: S
644
+ } = he(), {
645
+ renderAnn: M,
646
+ hoverOffsets: R,
647
+ focusedAnn: k,
648
+ render: g
649
+ } = ge(), {
650
+ resetFocusedAnnotation: n,
651
+ selectFocusedAnnotation: e,
652
+ onMouseDown: r,
653
+ onMouseMove: h,
654
+ onMouseUp: i
655
+ } = ye(k, M, R), {
656
+ createAnnotationLayer: l,
657
+ loadLayers: f
658
+ } = Le(), m = D(() => a.cHeight - 20), o = D(() => ({
659
+ width: a.cWidth + "px",
660
+ height: m.value + "px"
661
+ })), s = () => {
662
+ g(a, a.annotationsCanvas, v.value, m.value);
663
+ }, L = (T, E) => {
664
+ r(T, E, a.pointerMode);
665
+ }, O = (T, E, A, $) => h(T, E, A, $, a), p = () => {
666
+ i(a.pointerMode, c);
667
+ }, F = () => {
668
+ e() && re(() => s());
669
+ }, b = async (T) => {
670
+ try {
671
+ await l(T, a.activeViewer, c);
672
+ } catch (E) {
673
+ console.error("Error creating layer:", E);
674
+ }
675
+ };
676
+ return te(
677
+ () => a.activeViewer,
678
+ async (T) => {
679
+ try {
680
+ await f(T, c), await y(
681
+ a.start,
682
+ a.start + a.duration,
683
+ a,
684
+ T,
685
+ c
686
+ );
687
+ } catch (E) {
688
+ console.error("Error loading annotations for new viewer:", E);
689
+ }
690
+ }
691
+ ), ne(async () => {
692
+ console.log("TSAnnotationCanvas mounted with props:", {
693
+ constants: a.constants,
694
+ annotationsCanvas: a.annotationsCanvas,
695
+ viewerActiveTool: a.viewerActiveTool
696
+ });
697
+ try {
698
+ await f(a.activeViewer, c), await y(
699
+ a.start,
700
+ a.start + a.duration,
701
+ a,
702
+ a.activeViewer,
703
+ c
704
+ );
705
+ } catch (T) {
706
+ console.error("Error initializing annotations:", T);
707
+ }
708
+ }), d({
709
+ render: s,
710
+ resetFocusedAnnotation: n,
711
+ findNextAnnotation: w,
712
+ findPreviousAnnotation: S,
713
+ checkAnnotationRange: (T, E) => y(T, E, a, a.activeViewer, c),
714
+ selectFocusedAnn: F,
715
+ createAnnotationLayer: b,
716
+ onMouseDown: L,
717
+ onMouseMove: O,
718
+ onMouseUp: p
719
+ }), (T, E) => (ae(), oe("canvas", {
720
+ id: "annLabelArea",
721
+ ref_key: "annLabelArea",
722
+ ref: v,
723
+ class: "timeseries-annotation-canvas",
724
+ width: J(Y)(t.cWidth, t.pixelRatio, 0),
725
+ height: J(Y)(m.value, t.pixelRatio, 0),
726
+ style: ie(o.value)
727
+ }, null, 12, ke));
728
+ }
729
+ }, Me = /* @__PURE__ */ ce(pe, [["__scopeId", "data-v-41f7f1c2"]]);
730
+ export {
731
+ Me as default
732
+ };