trackhome-react 0.4.0 → 0.5.1
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/README.md +4 -2
- package/dist/index.d.ts +8 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +59 -474
- package/dist/index.js.map +1 -1
- package/dist/widgets/categorical.d.ts +6 -0
- package/dist/widgets/categorical.d.ts.map +1 -0
- package/dist/widgets/categorical.js +37 -0
- package/dist/widgets/categorical.js.map +1 -0
- package/dist/widgets/common.d.ts +42 -0
- package/dist/widgets/common.d.ts.map +1 -0
- package/dist/widgets/common.js +39 -0
- package/dist/widgets/common.js.map +1 -0
- package/dist/widgets/funnel.d.ts +3 -0
- package/dist/widgets/funnel.d.ts.map +1 -0
- package/dist/widgets/funnel.js +83 -0
- package/dist/widgets/funnel.js.map +1 -0
- package/dist/widgets/index.d.ts +4 -0
- package/dist/widgets/index.d.ts.map +1 -0
- package/dist/widgets/index.js +4 -0
- package/dist/widgets/index.js.map +1 -0
- package/dist/widgets/inputs.d.ts +32 -0
- package/dist/widgets/inputs.d.ts.map +1 -0
- package/dist/widgets/inputs.js +312 -0
- package/dist/widgets/inputs.js.map +1 -0
- package/dist/widgets/metric.d.ts +3 -0
- package/dist/widgets/metric.d.ts.map +1 -0
- package/dist/widgets/metric.js +15 -0
- package/dist/widgets/metric.js.map +1 -0
- package/dist/widgets/registry.d.ts +26 -0
- package/dist/widgets/registry.d.ts.map +1 -0
- package/dist/widgets/registry.js +53 -0
- package/dist/widgets/registry.js.map +1 -0
- package/dist/widgets/timeseries.d.ts +4 -0
- package/dist/widgets/timeseries.d.ts.map +1 -0
- package/dist/widgets/timeseries.js +34 -0
- package/dist/widgets/timeseries.js.map +1 -0
- package/dist/widgets/types.d.ts +87 -0
- package/dist/widgets/types.d.ts.map +1 -0
- package/dist/widgets/types.js +18 -0
- package/dist/widgets/types.js.map +1 -0
- package/package.json +2 -7
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* Autosuggest inputs shared by every widget EditForm.
|
|
4
|
+
*
|
|
5
|
+
* Zero deps; each fetches /e/<key>/<uid>/suggest/* with a 150ms debounce.
|
|
6
|
+
* - AutosuggestInput — single value (event type / tag prefix)
|
|
7
|
+
* - TagsAutosuggestInput — multi value chips (tag filters)
|
|
8
|
+
*/
|
|
9
|
+
import { useState, useEffect } from 'react';
|
|
10
|
+
function useDebounced(value, delayMs) {
|
|
11
|
+
const [debounced, setDebounced] = useState(value);
|
|
12
|
+
useEffect(() => {
|
|
13
|
+
const t = setTimeout(() => setDebounced(value), delayMs);
|
|
14
|
+
return () => clearTimeout(t);
|
|
15
|
+
}, [value, delayMs]);
|
|
16
|
+
return debounced;
|
|
17
|
+
}
|
|
18
|
+
export function AutosuggestInput({ endpoint, authKey, uid, suggestPath, value, onChange, placeholder, theme, inputStyle, }) {
|
|
19
|
+
const [text, setText] = useState(value);
|
|
20
|
+
const [open, setOpen] = useState(false);
|
|
21
|
+
const [highlight, setHighlight] = useState(0);
|
|
22
|
+
const [items, setItems] = useState([]);
|
|
23
|
+
const [loading, setLoading] = useState(false);
|
|
24
|
+
const debounced = useDebounced(text.trim(), 150);
|
|
25
|
+
useEffect(() => {
|
|
26
|
+
setText(value);
|
|
27
|
+
}, [value]);
|
|
28
|
+
useEffect(() => {
|
|
29
|
+
let cancelled = false;
|
|
30
|
+
if (!open || debounced.length === 0) {
|
|
31
|
+
setItems([]);
|
|
32
|
+
setLoading(false);
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
setLoading(true);
|
|
36
|
+
const url = `${endpoint.replace(/\/$/, '')}/e/${authKey}/${uid}/suggest/${suggestPath}?q=${encodeURIComponent(debounced)}&limit=10`;
|
|
37
|
+
fetch(url)
|
|
38
|
+
.then((r) => (r.ok ? r.json() : Promise.reject(new Error(String(r.status)))))
|
|
39
|
+
.then((body) => {
|
|
40
|
+
if (cancelled)
|
|
41
|
+
return;
|
|
42
|
+
setItems(body.items ?? []);
|
|
43
|
+
setHighlight(0);
|
|
44
|
+
})
|
|
45
|
+
.catch(() => {
|
|
46
|
+
if (cancelled)
|
|
47
|
+
return;
|
|
48
|
+
setItems([]);
|
|
49
|
+
})
|
|
50
|
+
.finally(() => {
|
|
51
|
+
if (!cancelled)
|
|
52
|
+
setLoading(false);
|
|
53
|
+
});
|
|
54
|
+
return () => {
|
|
55
|
+
cancelled = true;
|
|
56
|
+
};
|
|
57
|
+
}, [endpoint, authKey, uid, suggestPath, debounced, open]);
|
|
58
|
+
const showItemCreate = text.trim().length > 0 && !items.some((it) => it.value === text.trim());
|
|
59
|
+
function commit(v) {
|
|
60
|
+
setText(v);
|
|
61
|
+
onChange(v);
|
|
62
|
+
setOpen(false);
|
|
63
|
+
}
|
|
64
|
+
function onKeyDown(e) {
|
|
65
|
+
const totalOptions = items.length + (showItemCreate ? 1 : 0);
|
|
66
|
+
if (e.key === 'ArrowDown' && totalOptions > 0) {
|
|
67
|
+
e.preventDefault();
|
|
68
|
+
setOpen(true);
|
|
69
|
+
setHighlight((h) => Math.min(h + 1, totalOptions - 1));
|
|
70
|
+
}
|
|
71
|
+
else if (e.key === 'ArrowUp' && totalOptions > 0) {
|
|
72
|
+
e.preventDefault();
|
|
73
|
+
setHighlight((h) => Math.max(h - 1, 0));
|
|
74
|
+
}
|
|
75
|
+
else if (e.key === 'Enter') {
|
|
76
|
+
if (open && totalOptions > 0) {
|
|
77
|
+
e.preventDefault();
|
|
78
|
+
if (highlight < items.length)
|
|
79
|
+
commit(items[highlight].value);
|
|
80
|
+
else
|
|
81
|
+
commit(text.trim());
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
else if (e.key === 'Escape') {
|
|
85
|
+
setOpen(false);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
const dropdownBg = theme === 'dark' ? '#0f172a' : '#ffffff';
|
|
89
|
+
const dropdownBorder = theme === 'dark' ? '#334155' : '#cbd5e1';
|
|
90
|
+
const hoverBg = theme === 'dark' ? '#1e293b' : '#eef2ff';
|
|
91
|
+
const subText = theme === 'dark' ? '#94a3b8' : '#64748b';
|
|
92
|
+
return (_jsxs("div", { style: { position: 'relative' }, children: [_jsx("input", { style: inputStyle, value: text, onChange: (e) => {
|
|
93
|
+
setText(e.target.value);
|
|
94
|
+
onChange(e.target.value);
|
|
95
|
+
setOpen(true);
|
|
96
|
+
setHighlight(0);
|
|
97
|
+
}, onFocus: () => setOpen(true), onBlur: () => setTimeout(() => setOpen(false), 120), onKeyDown: onKeyDown, placeholder: placeholder, autoComplete: "off", spellCheck: false }), open && text.trim().length > 0 && (_jsxs("div", { style: {
|
|
98
|
+
position: 'absolute',
|
|
99
|
+
top: 'calc(100% + 2px)',
|
|
100
|
+
left: 0,
|
|
101
|
+
right: 0,
|
|
102
|
+
background: dropdownBg,
|
|
103
|
+
border: `1px solid ${dropdownBorder}`,
|
|
104
|
+
borderRadius: 6,
|
|
105
|
+
boxShadow: '0 8px 24px rgba(0,0,0,0.15)',
|
|
106
|
+
zIndex: 1100,
|
|
107
|
+
maxHeight: 240,
|
|
108
|
+
overflowY: 'auto',
|
|
109
|
+
fontSize: 12,
|
|
110
|
+
}, onMouseDown: (e) => e.preventDefault(), children: [loading && _jsx("div", { style: { padding: '8px 10px', color: subText }, children: "Searching\u2026" }), !loading && items.length === 0 && !showItemCreate && (_jsx("div", { style: { padding: '8px 10px', color: subText }, children: "No matches." })), items.map((it, i) => (_jsxs("div", { onMouseEnter: () => setHighlight(i), onMouseDown: (e) => {
|
|
111
|
+
e.preventDefault();
|
|
112
|
+
commit(it.value);
|
|
113
|
+
}, style: {
|
|
114
|
+
padding: '6px 10px',
|
|
115
|
+
cursor: 'pointer',
|
|
116
|
+
display: 'flex',
|
|
117
|
+
justifyContent: 'space-between',
|
|
118
|
+
gap: 8,
|
|
119
|
+
background: i === highlight ? hoverBg : 'transparent',
|
|
120
|
+
borderRadius: 4,
|
|
121
|
+
fontFamily: suggestPath === 'prefixes' ? 'monospace' : undefined,
|
|
122
|
+
}, children: [_jsx("span", { style: { overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }, children: it.value }), _jsx("span", { style: { color: subText, flexShrink: 0, fontVariantNumeric: 'tabular-nums' }, children: it.count.toLocaleString() })] }, it.value))), showItemCreate && (_jsxs("div", { onMouseEnter: () => setHighlight(items.length), onMouseDown: (e) => {
|
|
123
|
+
e.preventDefault();
|
|
124
|
+
commit(text.trim());
|
|
125
|
+
}, style: {
|
|
126
|
+
padding: '6px 10px',
|
|
127
|
+
cursor: 'pointer',
|
|
128
|
+
borderTop: `1px dashed ${dropdownBorder}`,
|
|
129
|
+
marginTop: items.length > 0 ? 4 : 0,
|
|
130
|
+
background: highlight === items.length ? hoverBg : 'transparent',
|
|
131
|
+
borderRadius: 4,
|
|
132
|
+
color: '#4f46e5',
|
|
133
|
+
fontStyle: 'italic',
|
|
134
|
+
}, children: ["Use \"", text.trim(), "\"", suggestPath === 'prefixes' ? ' (new prefix)' : ' (new)'] }))] }))] }));
|
|
135
|
+
}
|
|
136
|
+
export function TagsAutosuggestInput({ endpoint, authKey, uid, tags, onChange, placeholder, theme, inputStyle, inputId = 'tag-input-internal', }) {
|
|
137
|
+
const [text, setText] = useState('');
|
|
138
|
+
const [open, setOpen] = useState(false);
|
|
139
|
+
const [highlight, setHighlight] = useState(0);
|
|
140
|
+
const [items, setItems] = useState([]);
|
|
141
|
+
const [loading, setLoading] = useState(false);
|
|
142
|
+
const debounced = useDebounced(text.trim(), 150);
|
|
143
|
+
useEffect(() => {
|
|
144
|
+
let cancelled = false;
|
|
145
|
+
if (!open || debounced.length === 0) {
|
|
146
|
+
setItems([]);
|
|
147
|
+
setLoading(false);
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
setLoading(true);
|
|
151
|
+
const url = `${endpoint.replace(/\/$/, '')}/e/${authKey}/${uid}/suggest/tags?q=${encodeURIComponent(debounced)}&limit=10`;
|
|
152
|
+
fetch(url)
|
|
153
|
+
.then((r) => (r.ok ? r.json() : Promise.reject(new Error(String(r.status)))))
|
|
154
|
+
.then((body) => {
|
|
155
|
+
if (cancelled)
|
|
156
|
+
return;
|
|
157
|
+
setItems(body.items ?? []);
|
|
158
|
+
setHighlight(0);
|
|
159
|
+
})
|
|
160
|
+
.catch(() => {
|
|
161
|
+
if (cancelled)
|
|
162
|
+
return;
|
|
163
|
+
setItems([]);
|
|
164
|
+
})
|
|
165
|
+
.finally(() => {
|
|
166
|
+
if (!cancelled)
|
|
167
|
+
setLoading(false);
|
|
168
|
+
});
|
|
169
|
+
return () => {
|
|
170
|
+
cancelled = true;
|
|
171
|
+
};
|
|
172
|
+
}, [endpoint, authKey, uid, debounced, open]);
|
|
173
|
+
function addTag(raw) {
|
|
174
|
+
const v = raw.trim();
|
|
175
|
+
if (!v)
|
|
176
|
+
return;
|
|
177
|
+
const next = Array.from(new Set([...tags, v]));
|
|
178
|
+
onChange(next);
|
|
179
|
+
setText('');
|
|
180
|
+
setItems([]);
|
|
181
|
+
setHighlight(0);
|
|
182
|
+
}
|
|
183
|
+
function removeTag(t) {
|
|
184
|
+
onChange(tags.filter((x) => x !== t));
|
|
185
|
+
}
|
|
186
|
+
function onKeyDown(e) {
|
|
187
|
+
const totalOptions = items.length + (text.trim().length > 0 && !items.some((it) => it.value === text.trim()) ? 1 : 0);
|
|
188
|
+
if (e.key === 'ArrowDown' && totalOptions > 0) {
|
|
189
|
+
e.preventDefault();
|
|
190
|
+
setOpen(true);
|
|
191
|
+
setHighlight((h) => Math.min(h + 1, totalOptions - 1));
|
|
192
|
+
}
|
|
193
|
+
else if (e.key === 'ArrowUp' && totalOptions > 0) {
|
|
194
|
+
e.preventDefault();
|
|
195
|
+
setHighlight((h) => Math.max(h - 1, 0));
|
|
196
|
+
}
|
|
197
|
+
else if (e.key === 'Enter' || e.key === ',') {
|
|
198
|
+
e.preventDefault();
|
|
199
|
+
if (open && totalOptions > 0) {
|
|
200
|
+
if (highlight < items.length)
|
|
201
|
+
addTag(items[highlight].value);
|
|
202
|
+
else
|
|
203
|
+
addTag(text.trim());
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
addTag(text.trim());
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
else if (e.key === 'Backspace' && text === '' && tags.length > 0) {
|
|
210
|
+
removeTag(tags[tags.length - 1]);
|
|
211
|
+
}
|
|
212
|
+
else if (e.key === 'Escape') {
|
|
213
|
+
setOpen(false);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
const dropdownBg = theme === 'dark' ? '#0f172a' : '#ffffff';
|
|
217
|
+
const dropdownBorder = theme === 'dark' ? '#334155' : '#cbd5e1';
|
|
218
|
+
const hoverBg = theme === 'dark' ? '#1e293b' : '#eef2ff';
|
|
219
|
+
const subText = theme === 'dark' ? '#94a3b8' : '#64748b';
|
|
220
|
+
const chipBg = theme === 'dark' ? '#334155' : '#e0e7ff';
|
|
221
|
+
const chipText = theme === 'dark' ? '#f1f5f9' : '#3730a3';
|
|
222
|
+
const showItemCreate = text.trim().length > 0 && !items.some((it) => it.value === text.trim());
|
|
223
|
+
return (_jsxs("div", { style: {
|
|
224
|
+
...inputStyle,
|
|
225
|
+
display: 'flex',
|
|
226
|
+
flexWrap: 'wrap',
|
|
227
|
+
gap: 4,
|
|
228
|
+
alignItems: 'center',
|
|
229
|
+
padding: '4px 6px',
|
|
230
|
+
cursor: 'text',
|
|
231
|
+
minHeight: inputStyle.padding ?? 36,
|
|
232
|
+
}, onMouseDown: () => {
|
|
233
|
+
const i = document.getElementById(inputId);
|
|
234
|
+
if (i)
|
|
235
|
+
i.focus();
|
|
236
|
+
}, children: [tags.map((t) => (_jsxs("span", { style: {
|
|
237
|
+
display: 'inline-flex',
|
|
238
|
+
alignItems: 'center',
|
|
239
|
+
gap: 4,
|
|
240
|
+
background: chipBg,
|
|
241
|
+
color: chipText,
|
|
242
|
+
padding: '2px 4px 2px 8px',
|
|
243
|
+
borderRadius: 4,
|
|
244
|
+
fontSize: 11,
|
|
245
|
+
fontFamily: 'monospace',
|
|
246
|
+
}, children: [t, _jsx("button", { type: "button", onMouseDown: (e) => {
|
|
247
|
+
e.preventDefault();
|
|
248
|
+
e.stopPropagation();
|
|
249
|
+
removeTag(t);
|
|
250
|
+
}, style: {
|
|
251
|
+
border: 'none',
|
|
252
|
+
background: 'transparent',
|
|
253
|
+
color: chipText,
|
|
254
|
+
cursor: 'pointer',
|
|
255
|
+
fontSize: 13,
|
|
256
|
+
lineHeight: 1,
|
|
257
|
+
padding: '0 4px',
|
|
258
|
+
}, "aria-label": `Remove ${t}`, children: "\u00D7" })] }, t))), _jsxs("div", { style: { position: 'relative', flex: 1, minWidth: 80 }, children: [_jsx("input", { id: inputId, style: {
|
|
259
|
+
width: '100%',
|
|
260
|
+
background: 'transparent',
|
|
261
|
+
border: 'none',
|
|
262
|
+
outline: 'none',
|
|
263
|
+
color: 'inherit',
|
|
264
|
+
fontSize: 13,
|
|
265
|
+
padding: '4px 2px',
|
|
266
|
+
fontFamily: 'monospace',
|
|
267
|
+
}, value: text, onChange: (e) => {
|
|
268
|
+
const next = e.target.value.replace(/,/g, '');
|
|
269
|
+
setText(next);
|
|
270
|
+
setOpen(true);
|
|
271
|
+
setHighlight(0);
|
|
272
|
+
}, onFocus: () => setOpen(true), onBlur: () => setTimeout(() => setOpen(false), 120), onKeyDown: onKeyDown, placeholder: tags.length === 0 ? placeholder : '', autoComplete: "off", spellCheck: false }), open && text.trim().length > 0 && (_jsxs("div", { style: {
|
|
273
|
+
position: 'absolute',
|
|
274
|
+
top: 'calc(100% + 2px)',
|
|
275
|
+
left: 0,
|
|
276
|
+
right: 0,
|
|
277
|
+
background: dropdownBg,
|
|
278
|
+
border: `1px solid ${dropdownBorder}`,
|
|
279
|
+
borderRadius: 6,
|
|
280
|
+
boxShadow: '0 8px 24px rgba(0,0,0,0.15)',
|
|
281
|
+
zIndex: 1100,
|
|
282
|
+
maxHeight: 240,
|
|
283
|
+
overflowY: 'auto',
|
|
284
|
+
fontSize: 12,
|
|
285
|
+
}, onMouseDown: (e) => e.preventDefault(), children: [loading && _jsx("div", { style: { padding: '8px 10px', color: subText }, children: "Searching\u2026" }), !loading && items.length === 0 && !showItemCreate && (_jsx("div", { style: { padding: '8px 10px', color: subText }, children: "No matches." })), items.map((it, i) => (_jsxs("div", { onMouseEnter: () => setHighlight(i), onMouseDown: (e) => {
|
|
286
|
+
e.preventDefault();
|
|
287
|
+
addTag(it.value);
|
|
288
|
+
}, style: {
|
|
289
|
+
padding: '6px 10px',
|
|
290
|
+
cursor: 'pointer',
|
|
291
|
+
display: 'flex',
|
|
292
|
+
justifyContent: 'space-between',
|
|
293
|
+
gap: 8,
|
|
294
|
+
background: i === highlight ? hoverBg : 'transparent',
|
|
295
|
+
borderRadius: 4,
|
|
296
|
+
fontFamily: 'monospace',
|
|
297
|
+
}, children: [_jsx("span", { style: { overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }, children: it.value }), _jsx("span", { style: { color: subText, flexShrink: 0, fontVariantNumeric: 'tabular-nums' }, children: it.count.toLocaleString() })] }, it.value))), showItemCreate && (_jsxs("div", { onMouseEnter: () => setHighlight(items.length), onMouseDown: (e) => {
|
|
298
|
+
e.preventDefault();
|
|
299
|
+
addTag(text.trim());
|
|
300
|
+
}, style: {
|
|
301
|
+
padding: '6px 10px',
|
|
302
|
+
cursor: 'pointer',
|
|
303
|
+
borderTop: `1px dashed ${dropdownBorder}`,
|
|
304
|
+
marginTop: items.length > 0 ? 4 : 0,
|
|
305
|
+
background: highlight === items.length ? hoverBg : 'transparent',
|
|
306
|
+
borderRadius: 4,
|
|
307
|
+
color: '#4f46e5',
|
|
308
|
+
fontStyle: 'italic',
|
|
309
|
+
fontFamily: 'monospace',
|
|
310
|
+
}, children: ["Add \"", text.trim(), "\" (new tag)"] }))] }))] })] }));
|
|
311
|
+
}
|
|
312
|
+
//# sourceMappingURL=inputs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inputs.js","sourceRoot":"","sources":["../../src/widgets/inputs.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metric.d.ts","sourceRoot":"","sources":["../../src/widgets/metric.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAI3C,eAAO,MAAM,YAAY,EAAE,QAwB1B,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { ACCENT } from './types.js';
|
|
3
|
+
import { Field, EventTypeField } from './common.js';
|
|
4
|
+
export const metricWidget = {
|
|
5
|
+
meta: { value: 'metric', label: 'Metric', hint: 'Single big number (count over last N minutes)' },
|
|
6
|
+
defaultConfig: () => ({ minutes: 5 }),
|
|
7
|
+
Render: ({ data }) => {
|
|
8
|
+
// The metric resolver (realtime) returns a bare number; tolerate both that
|
|
9
|
+
// and a { count } object so a shape change never breaks the render.
|
|
10
|
+
const count = typeof data === 'number' ? data : (data?.count ?? 0);
|
|
11
|
+
return _jsx("div", { style: { fontSize: 28, fontWeight: 700, color: ACCENT }, children: count.toLocaleString() });
|
|
12
|
+
},
|
|
13
|
+
EditForm: ({ draft, update, ctx }) => (_jsxs(_Fragment, { children: [_jsx(Field, { label: "Window (minutes)", ctx: ctx, children: _jsx("input", { type: "number", min: 1, style: ctx.inputStyle, value: draft.minutes ?? 5, onChange: (e) => update({ minutes: Number(e.target.value) || 5 }) }) }), _jsx(EventTypeField, { draft: draft, update: update, ctx: ctx })] })),
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=metric.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metric.js","sourceRoot":"","sources":["../../src/widgets/metric.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACpC,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAEpD,MAAM,CAAC,MAAM,YAAY,GAAa;IACpC,IAAI,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,+CAA+C,EAAE;IACjG,aAAa,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;IACrC,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE;QACnB,2EAA2E;QAC3E,oEAAoE;QACpE,MAAM,KAAK,GACT,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAE,IAAkC,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC;QACtF,OAAO,cAAK,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,YAAG,KAAK,CAAC,cAAc,EAAE,GAAO,CAAC;IACtG,CAAC;IACD,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CACpC,8BACE,KAAC,KAAK,IAAC,KAAK,EAAC,kBAAkB,EAAC,GAAG,EAAE,GAAG,YACtC,gBACE,IAAI,EAAC,QAAQ,EACb,GAAG,EAAE,CAAC,EACN,KAAK,EAAE,GAAG,CAAC,UAAU,EACrB,KAAK,EAAE,KAAK,CAAC,OAAO,IAAI,CAAC,EACzB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,GACjE,GACI,EACR,KAAC,cAAc,IAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,GAAI,IACzD,CACJ;CACF,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Widget UI registry — maps each kind to its self-contained module
|
|
3
|
+
* (metadata + defaults + renderer + edit form). Adding a widget kind = add a
|
|
4
|
+
* module and register it here; index.tsx never branches on kind.
|
|
5
|
+
*
|
|
6
|
+
* Typed as Record<WidgetKind, WidgetUI> so a kind missing a module is a
|
|
7
|
+
* compile error.
|
|
8
|
+
*/
|
|
9
|
+
import type { WidgetUI, WidgetKind, Widget } from './types.js';
|
|
10
|
+
export declare const uiRegistry: Record<WidgetKind, WidgetUI>;
|
|
11
|
+
/** Ordered metadata for the kind <select>. */
|
|
12
|
+
export declare const WIDGET_KINDS: {
|
|
13
|
+
value: WidgetKind;
|
|
14
|
+
label: string;
|
|
15
|
+
hint: string;
|
|
16
|
+
}[];
|
|
17
|
+
/** Build a fresh widget of the given kind with common base + kind defaults. */
|
|
18
|
+
export declare function defaultWidget(kind: WidgetKind, partial?: Partial<Widget>): Widget;
|
|
19
|
+
/**
|
|
20
|
+
* Upgrade a legacy stored widget so old embed dashboards keep loading:
|
|
21
|
+
* - `unique_visitors` → `timeseries` + metric 'unique'
|
|
22
|
+
* - drop `funnelSlug`/`funnelId` (funnels now carry inline steps)
|
|
23
|
+
* - funnel widgets missing `steps` → empty array
|
|
24
|
+
*/
|
|
25
|
+
export declare function normalizeWidget(raw: Widget): Widget;
|
|
26
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/widgets/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAO/D,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,QAAQ,CASnD,CAAC;AAEF,8CAA8C;AAC9C,eAAO,MAAM,YAAY;;;;GAA2E,CAAC;AAErG,+EAA+E;AAC/E,wBAAgB,aAAa,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAajF;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAWnD"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { DEFAULT_W, newId } from './types.js';
|
|
2
|
+
import { metricWidget } from './metric.js';
|
|
3
|
+
import { timeseriesWidget, areaWidget } from './timeseries.js';
|
|
4
|
+
import { barWidget, pieWidget, topEventsWidget, topTagsWidget } from './categorical.js';
|
|
5
|
+
import { funnelWidget } from './funnel.js';
|
|
6
|
+
export const uiRegistry = {
|
|
7
|
+
metric: metricWidget,
|
|
8
|
+
timeseries: timeseriesWidget,
|
|
9
|
+
area: areaWidget,
|
|
10
|
+
bar: barWidget,
|
|
11
|
+
pie: pieWidget,
|
|
12
|
+
top_events: topEventsWidget,
|
|
13
|
+
top_tags: topTagsWidget,
|
|
14
|
+
funnel: funnelWidget,
|
|
15
|
+
};
|
|
16
|
+
/** Ordered metadata for the kind <select>. */
|
|
17
|
+
export const WIDGET_KINDS = Object.keys(uiRegistry).map((k) => uiRegistry[k].meta);
|
|
18
|
+
/** Build a fresh widget of the given kind with common base + kind defaults. */
|
|
19
|
+
export function defaultWidget(kind, partial) {
|
|
20
|
+
const widget = {
|
|
21
|
+
id: newId(),
|
|
22
|
+
title: 'New widget',
|
|
23
|
+
kind,
|
|
24
|
+
tags: [],
|
|
25
|
+
layout: { x: 0, y: 0, w: DEFAULT_W, h: 4 },
|
|
26
|
+
...uiRegistry[kind].defaultConfig(),
|
|
27
|
+
...partial,
|
|
28
|
+
};
|
|
29
|
+
// Ensure kind is authoritative even if `partial` carried a different one.
|
|
30
|
+
widget.kind = kind;
|
|
31
|
+
return widget;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Upgrade a legacy stored widget so old embed dashboards keep loading:
|
|
35
|
+
* - `unique_visitors` → `timeseries` + metric 'unique'
|
|
36
|
+
* - drop `funnelSlug`/`funnelId` (funnels now carry inline steps)
|
|
37
|
+
* - funnel widgets missing `steps` → empty array
|
|
38
|
+
*/
|
|
39
|
+
export function normalizeWidget(raw) {
|
|
40
|
+
const w = { ...raw };
|
|
41
|
+
delete w.funnelSlug;
|
|
42
|
+
delete w.funnelId;
|
|
43
|
+
if (w.kind === 'unique_visitors') {
|
|
44
|
+
w.kind = 'timeseries';
|
|
45
|
+
w.metric = 'unique';
|
|
46
|
+
}
|
|
47
|
+
if (w.kind === 'funnel' && !Array.isArray(w.steps))
|
|
48
|
+
w.steps = [];
|
|
49
|
+
if (!Array.isArray(w.tags))
|
|
50
|
+
w.tags = [];
|
|
51
|
+
return w;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/widgets/registry.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACxF,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,CAAC,MAAM,UAAU,GAAiC;IACtD,MAAM,EAAE,YAAY;IACpB,UAAU,EAAE,gBAAgB;IAC5B,IAAI,EAAE,UAAU;IAChB,GAAG,EAAE,SAAS;IACd,GAAG,EAAE,SAAS;IACd,UAAU,EAAE,eAAe;IAC3B,QAAQ,EAAE,aAAa;IACvB,MAAM,EAAE,YAAY;CACrB,CAAC;AAEF,8CAA8C;AAC9C,MAAM,CAAC,MAAM,YAAY,GAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AAErG,+EAA+E;AAC/E,MAAM,UAAU,aAAa,CAAC,IAAgB,EAAE,OAAyB;IACvE,MAAM,MAAM,GAAW;QACrB,EAAE,EAAE,KAAK,EAAE;QACX,KAAK,EAAE,YAAY;QACnB,IAAI;QACJ,IAAI,EAAE,EAAE;QACR,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,EAAE;QAC1C,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE;QACnC,GAAG,OAAO;KACX,CAAC;IACF,0EAA0E;IAC1E,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,GAAW;IACzC,MAAM,CAAC,GAAG,EAAE,GAAI,GAA6D,EAAE,CAAC;IAChF,OAAO,CAAC,CAAC,UAAU,CAAC;IACpB,OAAO,CAAC,CAAC,QAAQ,CAAC;IAClB,IAAK,CAAC,CAAC,IAAe,KAAK,iBAAiB,EAAE,CAAC;QAC7C,CAAC,CAAC,IAAI,GAAG,YAAY,CAAC;QACtB,CAAC,CAAC,MAAM,GAAG,QAAQ,CAAC;IACtB,CAAC;IACD,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;QAAE,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;IACjE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;QAAE,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC;IACxC,OAAO,CAAC,CAAC;AACX,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timeseries.d.ts","sourceRoot":"","sources":["../../src/widgets/timeseries.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAsC,MAAM,YAAY,CAAC;AA+C/E,eAAO,MAAM,gBAAgB,EAAE,QAK9B,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,QAKxB,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { ACCENT } from './types.js';
|
|
3
|
+
import { Field, NoData, MetricField, EventTypeField } from './common.js';
|
|
4
|
+
function TimechartRender({ widget, data, theme }) {
|
|
5
|
+
const d = Array.isArray(data) ? data : [];
|
|
6
|
+
if (d.length === 0)
|
|
7
|
+
return _jsx(NoData, { theme: theme });
|
|
8
|
+
const max = Math.max(...d.map((p) => p.count), 1);
|
|
9
|
+
return (_jsx("div", { style: { display: 'flex', alignItems: 'flex-end', gap: 2, height: 80 }, children: d.slice(-30).map((p, i) => (_jsx("div", { title: `${p.ts.slice(0, 10)}: ${p.count}`, style: {
|
|
10
|
+
flex: 1,
|
|
11
|
+
height: `${(p.count / max) * 100}%`,
|
|
12
|
+
minHeight: 2,
|
|
13
|
+
background: ACCENT,
|
|
14
|
+
opacity: widget.kind === 'area' ? 0.6 : 1,
|
|
15
|
+
borderRadius: '2px 2px 0 0',
|
|
16
|
+
} }, i))) }));
|
|
17
|
+
}
|
|
18
|
+
function TimechartEditForm({ draft, update, ctx }) {
|
|
19
|
+
return (_jsxs(_Fragment, { children: [_jsx(Field, { label: "Bucket interval", ctx: ctx, children: _jsxs("select", { style: ctx.inputStyle, value: draft.bucket ?? '1 day', onChange: (e) => update({ bucket: e.target.value }), children: [_jsx("option", { value: "1 hour", children: "1 hour" }), _jsx("option", { value: "6 hours", children: "6 hours" }), _jsx("option", { value: "1 day", children: "1 day" }), _jsx("option", { value: "7 days", children: "7 days" })] }) }), _jsx(MetricField, { draft: draft, update: update, ctx: ctx }), _jsx(EventTypeField, { draft: draft, update: update, ctx: ctx })] }));
|
|
20
|
+
}
|
|
21
|
+
const timechartConfig = () => ({ bucket: '1 day', metric: 'count' });
|
|
22
|
+
export const timeseriesWidget = {
|
|
23
|
+
meta: { value: 'timeseries', label: 'Time series', hint: 'Line chart over time' },
|
|
24
|
+
defaultConfig: timechartConfig,
|
|
25
|
+
Render: TimechartRender,
|
|
26
|
+
EditForm: TimechartEditForm,
|
|
27
|
+
};
|
|
28
|
+
export const areaWidget = {
|
|
29
|
+
meta: { value: 'area', label: 'Area', hint: 'Filled area chart over time' },
|
|
30
|
+
defaultConfig: timechartConfig,
|
|
31
|
+
Render: TimechartRender,
|
|
32
|
+
EditForm: TimechartEditForm,
|
|
33
|
+
};
|
|
34
|
+
//# sourceMappingURL=timeseries.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timeseries.js","sourceRoot":"","sources":["../../src/widgets/timeseries.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared widget contract for the embed component.
|
|
3
|
+
*
|
|
4
|
+
* This package is published standalone (vendor-neutral, zero runtime deps
|
|
5
|
+
* beyond React), so it keeps its own copy of the widget shape rather than
|
|
6
|
+
* importing @trackhome/shared. The shape mirrors the server contract: a common
|
|
7
|
+
* base ({ id, title, kind, tags, layout }) plus kind-specific fields, with
|
|
8
|
+
* funnel steps stored INLINE on the widget.
|
|
9
|
+
*/
|
|
10
|
+
import type React from 'react';
|
|
11
|
+
export type WidgetKind = 'metric' | 'timeseries' | 'area' | 'bar' | 'pie' | 'top_events' | 'top_tags' | 'funnel';
|
|
12
|
+
export type Theme = 'light' | 'dark';
|
|
13
|
+
export type Metric = 'count' | 'unique' | 'sum' | 'avg';
|
|
14
|
+
export interface FunnelStep {
|
|
15
|
+
type: string;
|
|
16
|
+
tags?: string[];
|
|
17
|
+
}
|
|
18
|
+
export interface WidgetLayout {
|
|
19
|
+
x: number;
|
|
20
|
+
y: number;
|
|
21
|
+
w: number;
|
|
22
|
+
h: number;
|
|
23
|
+
}
|
|
24
|
+
export interface Widget {
|
|
25
|
+
id: string;
|
|
26
|
+
title: string;
|
|
27
|
+
kind: WidgetKind;
|
|
28
|
+
tags: string[];
|
|
29
|
+
eventType?: string;
|
|
30
|
+
tagPrefix?: string;
|
|
31
|
+
bucket?: string;
|
|
32
|
+
metric?: Metric;
|
|
33
|
+
minutes?: number;
|
|
34
|
+
breakdown?: 'event_type' | 'tag';
|
|
35
|
+
steps?: FunnelStep[];
|
|
36
|
+
windowMinutes?: number;
|
|
37
|
+
filterTags?: string[];
|
|
38
|
+
layout?: WidgetLayout;
|
|
39
|
+
}
|
|
40
|
+
export interface EmbedConfig {
|
|
41
|
+
name: string;
|
|
42
|
+
widgets: Widget[];
|
|
43
|
+
theme?: Theme;
|
|
44
|
+
}
|
|
45
|
+
/** Width range in the 12-column grid. */
|
|
46
|
+
export declare const MIN_W = 2;
|
|
47
|
+
export declare const MAX_W = 12;
|
|
48
|
+
export declare const DEFAULT_W = 6;
|
|
49
|
+
export declare const ACCENT = "#4f46e5";
|
|
50
|
+
export declare function clampW(n: number): number;
|
|
51
|
+
export declare function newId(): string;
|
|
52
|
+
/** Context passed to every EditForm — endpoint info + themed input styles. */
|
|
53
|
+
export interface EditCtx {
|
|
54
|
+
endpoint: string;
|
|
55
|
+
authKey: string;
|
|
56
|
+
uid: string;
|
|
57
|
+
theme: Theme;
|
|
58
|
+
inputStyle: React.CSSProperties;
|
|
59
|
+
labelStyle: React.CSSProperties;
|
|
60
|
+
subLabelColor: string;
|
|
61
|
+
}
|
|
62
|
+
export interface RenderProps {
|
|
63
|
+
widget: Widget;
|
|
64
|
+
data: unknown;
|
|
65
|
+
theme: Theme;
|
|
66
|
+
}
|
|
67
|
+
export interface EditFormProps {
|
|
68
|
+
draft: Widget;
|
|
69
|
+
/** Merge a partial patch into the draft. */
|
|
70
|
+
update: (patch: Partial<Widget>) => void;
|
|
71
|
+
ctx: EditCtx;
|
|
72
|
+
}
|
|
73
|
+
/** One self-contained widget kind: metadata + factory + render + edit form. */
|
|
74
|
+
export interface WidgetUI {
|
|
75
|
+
meta: {
|
|
76
|
+
value: WidgetKind;
|
|
77
|
+
label: string;
|
|
78
|
+
hint: string;
|
|
79
|
+
};
|
|
80
|
+
/** Kind-specific config defaults (merged onto the common base). */
|
|
81
|
+
defaultConfig: () => Partial<Widget>;
|
|
82
|
+
Render: React.FC<RenderProps>;
|
|
83
|
+
EditForm: React.FC<EditFormProps>;
|
|
84
|
+
}
|
|
85
|
+
export declare function subTextColor(theme: Theme): string;
|
|
86
|
+
export declare function trackColor(theme: Theme): string;
|
|
87
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/widgets/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/** Width range in the 12-column grid. */
|
|
2
|
+
export const MIN_W = 2;
|
|
3
|
+
export const MAX_W = 12;
|
|
4
|
+
export const DEFAULT_W = 6;
|
|
5
|
+
export const ACCENT = '#4f46e5';
|
|
6
|
+
export function clampW(n) {
|
|
7
|
+
return Math.max(MIN_W, Math.min(MAX_W, Math.round(n)));
|
|
8
|
+
}
|
|
9
|
+
export function newId() {
|
|
10
|
+
return 'w_' + Math.random().toString(36).slice(2, 10) + Date.now().toString(36).slice(-4);
|
|
11
|
+
}
|
|
12
|
+
export function subTextColor(theme) {
|
|
13
|
+
return theme === 'dark' ? '#94a3b8' : '#64748b';
|
|
14
|
+
}
|
|
15
|
+
export function trackColor(theme) {
|
|
16
|
+
return theme === 'dark' ? '#334155' : '#f1f5f9';
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/widgets/types.ts"],"names":[],"mappings":"AA6DA,yCAAyC;AACzC,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC;AACvB,MAAM,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;AACxB,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAC;AAE3B,MAAM,CAAC,MAAM,MAAM,GAAG,SAAS,CAAC;AAEhC,MAAM,UAAU,MAAM,CAAC,CAAS;IAC9B,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,KAAK;IACnB,OAAO,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5F,CAAC;AAmCD,MAAM,UAAU,YAAY,CAAC,KAAY;IACvC,OAAO,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAY;IACrC,OAAO,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;AAClD,CAAC"}
|