@vue-skuilder/common-ui 0.2.28 → 0.2.29
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/dist/admin/admin.css +1 -1
- package/dist/admin/common-ui-admin.es.js +748 -390
- package/dist/admin/common-ui-admin.es.js.map +1 -1
- package/dist/admin/components/LearnerDiagnostics.vue.d.ts +3 -2
- package/dist/admin/components/LearnerDiagnostics.vue.d.ts.map +1 -1
- package/dist/admin/components/PipelineOverview.vue.d.ts +18 -0
- package/dist/admin/components/PipelineOverview.vue.d.ts.map +1 -0
- package/dist/admin/components/RunDetail.vue.d.ts.map +1 -1
- package/dist/admin/index.d.ts +1 -0
- package/dist/admin/index.d.ts.map +1 -1
- package/dist/components/auth/UserRegistration.vue.d.ts.map +1 -1
- package/dist/stores/useAuthStore.d.ts.map +1 -1
- package/package.json +4 -4
- package/src/admin/components/LearnerDiagnostics.vue +23 -6
- package/src/admin/components/PipelineOverview.vue +390 -0
- package/src/admin/components/RunDetail.vue +21 -1
- package/src/admin/index.ts +1 -0
|
@@ -1,19 +1,20 @@
|
|
|
1
|
-
import { Fragment as e, computed as t, createBlock as n, createCommentVNode as r, createElementBlock as i, createElementVNode as a, createTextVNode as o, createVNode as s, defineComponent as c, nextTick as l, normalizeClass as u,
|
|
2
|
-
import { SESSION_FLAGS as
|
|
1
|
+
import { Fragment as e, computed as t, createBlock as n, createCommentVNode as r, createElementBlock as i, createElementVNode as a, createTextVNode as o, createVNode as s, defineComponent as c, nextTick as l, normalizeClass as u, normalizeStyle as d, onMounted as f, openBlock as p, ref as m, renderList as h, resolveComponent as g, shallowRef as _, toDisplayString as v, unref as y, watch as b, withCtx as x, withKeys as S } from "vue";
|
|
2
|
+
import { SESSION_FLAGS as C, cardDossiers as w, dumpFileName as T, eloLedger as E, fetchLearnerDump as D, fmtAnswer as O, fmtDelta as k, fmtDuration as A, fromDump as j, isSkillTag as M, parseLearnerDump as N, pipelineRunStats as P, recordPerformance as F, regulatorText as I, runText as L, scoredTagDeltas as R, servedTags as z, sessionDetail as B, sessionText as V, shortTag as H, summarizeSessions as U } from "@vue-skuilder/db/diagnostics";
|
|
3
|
+
import { PIPELINE_STAGES as W, planPipeline as ee } from "@vue-skuilder/db";
|
|
3
4
|
//#region \0rolldown/runtime.js
|
|
4
|
-
var
|
|
5
|
+
var te = Object.defineProperty, __name = (e, t) => te(e, "name", {
|
|
5
6
|
value: t,
|
|
6
7
|
configurable: !0
|
|
7
8
|
});
|
|
8
9
|
//#endregion
|
|
9
10
|
//#region src/admin/composables/useLearnerDataset.ts
|
|
10
11
|
function useLearnerDataset() {
|
|
11
|
-
let e =
|
|
12
|
+
let e = _(null), t = _(null), n = m(!1), r = m(null);
|
|
12
13
|
async function load(i, a) {
|
|
13
14
|
n.value = !0, r.value = null;
|
|
14
15
|
try {
|
|
15
16
|
let n = await i();
|
|
16
|
-
t.value =
|
|
17
|
+
t.value = j(n, a), e.value = n;
|
|
17
18
|
} catch (e) {
|
|
18
19
|
r.value = e instanceof Error ? e.message : String(e);
|
|
19
20
|
} finally {
|
|
@@ -21,13 +22,13 @@ function useLearnerDataset() {
|
|
|
21
22
|
}
|
|
22
23
|
}
|
|
23
24
|
function loadFromCouch(e) {
|
|
24
|
-
return load(() =>
|
|
25
|
+
return load(() => D({
|
|
25
26
|
...e,
|
|
26
27
|
auth: { kind: "cookie" }
|
|
27
28
|
}), e.courseId);
|
|
28
29
|
}
|
|
29
30
|
function loadFromFile(e, t) {
|
|
30
|
-
return load(async () =>
|
|
31
|
+
return load(async () => N(await e.text()), t);
|
|
31
32
|
}
|
|
32
33
|
return {
|
|
33
34
|
dump: e,
|
|
@@ -40,14 +41,14 @@ function useLearnerDataset() {
|
|
|
40
41
|
}
|
|
41
42
|
function downloadLearnerDump(e) {
|
|
42
43
|
let t = new Blob([JSON.stringify(e, null, 2)], { type: "application/json" }), n = URL.createObjectURL(t), r = document.createElement("a");
|
|
43
|
-
r.href = n, r.download =
|
|
44
|
+
r.href = n, r.download = T(e), r.click(), URL.revokeObjectURL(n);
|
|
44
45
|
}
|
|
45
46
|
//#endregion
|
|
46
47
|
//#region src/admin/components/LearnerDatasetSource.vue?vue&type=script&setup=true&lang.ts
|
|
47
|
-
var
|
|
48
|
+
var ne = { class: "d-flex flex-wrap align-center ga-2" }, re = {
|
|
48
49
|
key: 1,
|
|
49
50
|
class: "d-flex flex-wrap align-center ga-2 mt-3"
|
|
50
|
-
},
|
|
51
|
+
}, ie = /* @__PURE__ */ c({
|
|
51
52
|
__name: "LearnerDatasetSource",
|
|
52
53
|
props: {
|
|
53
54
|
couchUrl: {},
|
|
@@ -57,8 +58,8 @@ var H = { class: "d-flex flex-wrap align-center ga-2" }, U = {
|
|
|
57
58
|
},
|
|
58
59
|
emits: ["loaded"],
|
|
59
60
|
setup(c, { emit: l }) {
|
|
60
|
-
let u = c,
|
|
61
|
-
let e =
|
|
61
|
+
let u = c, d = l, { dump: h, dataset: _, loading: C, error: w, loadFromCouch: T, loadFromFile: E } = useLearnerDataset(), D = m(u.initialUsername ?? ""), O = m(null), k = t(() => {
|
|
62
|
+
let e = _.value?.sessions ?? [];
|
|
62
63
|
return e.length ? `${e[0].startTime.slice(0, 10)} .. ${e[e.length - 1].startTime.slice(0, 10)}` : "";
|
|
63
64
|
});
|
|
64
65
|
function loadLive() {
|
|
@@ -72,16 +73,16 @@ var H = { class: "d-flex flex-wrap align-center ga-2" }, U = {
|
|
|
72
73
|
let t = e.target, n = t.files?.[0];
|
|
73
74
|
n && E(n, u.courseId), t.value = "";
|
|
74
75
|
}
|
|
75
|
-
return
|
|
76
|
-
e &&
|
|
77
|
-
}),
|
|
76
|
+
return b(_, (e) => {
|
|
77
|
+
e && h.value && d("loaded", e, h.value);
|
|
78
|
+
}), f(() => {
|
|
78
79
|
u.autoload && loadLive();
|
|
79
80
|
}), (t, c) => {
|
|
80
|
-
let l =
|
|
81
|
-
return
|
|
82
|
-
default:
|
|
83
|
-
default:
|
|
84
|
-
a("div",
|
|
81
|
+
let l = g("v-text-field"), u = g("v-btn"), d = g("v-alert"), f = g("v-spacer"), m = g("v-card-text"), b = g("v-card");
|
|
82
|
+
return p(), n(b, { variant: "outlined" }, {
|
|
83
|
+
default: x(() => [s(m, null, {
|
|
84
|
+
default: x(() => [
|
|
85
|
+
a("div", ne, [
|
|
85
86
|
s(l, {
|
|
86
87
|
modelValue: D.value,
|
|
87
88
|
"onUpdate:modelValue": c[0] || (c[0] = (e) => D.value = e),
|
|
@@ -90,15 +91,15 @@ var H = { class: "d-flex flex-wrap align-center ga-2" }, U = {
|
|
|
90
91
|
"hide-details": "",
|
|
91
92
|
style: { "max-width": "16rem" },
|
|
92
93
|
disabled: !t.couchUrl || !t.courseId,
|
|
93
|
-
onKeydown:
|
|
94
|
+
onKeydown: S(loadLive, ["enter"])
|
|
94
95
|
}, null, 8, ["modelValue", "disabled"]),
|
|
95
96
|
s(u, {
|
|
96
97
|
color: "primary",
|
|
97
|
-
loading:
|
|
98
|
+
loading: y(C),
|
|
98
99
|
disabled: !t.couchUrl || !t.courseId || !D.value,
|
|
99
100
|
onClick: loadLive
|
|
100
101
|
}, {
|
|
101
|
-
default:
|
|
102
|
+
default: x(() => c[3] || (c[3] = [o(" Load ")])),
|
|
102
103
|
_: 1
|
|
103
104
|
}, 8, ["loading", "disabled"]),
|
|
104
105
|
c[5] || (c[5] = a("span", { class: "text-medium-emphasis mx-2" }, "or", -1)),
|
|
@@ -107,7 +108,7 @@ var H = { class: "d-flex flex-wrap align-center ga-2" }, U = {
|
|
|
107
108
|
"prepend-icon": "mdi-file-upload-outline",
|
|
108
109
|
onClick: c[1] || (c[1] = (e) => O.value?.click())
|
|
109
110
|
}, {
|
|
110
|
-
default:
|
|
111
|
+
default: x(() => c[4] || (c[4] = [o(" Open dump file ")])),
|
|
111
112
|
_: 1
|
|
112
113
|
}),
|
|
113
114
|
a("input", {
|
|
@@ -119,32 +120,32 @@ var H = { class: "d-flex flex-wrap align-center ga-2" }, U = {
|
|
|
119
120
|
onChange: onFile
|
|
120
121
|
}, null, 544)
|
|
121
122
|
]),
|
|
122
|
-
|
|
123
|
+
y(w) ? (p(), n(d, {
|
|
123
124
|
key: 0,
|
|
124
125
|
type: "error",
|
|
125
126
|
variant: "tonal",
|
|
126
127
|
density: "compact",
|
|
127
128
|
class: "mt-3"
|
|
128
129
|
}, {
|
|
129
|
-
default:
|
|
130
|
+
default: x(() => [o(v(y(w)), 1)]),
|
|
130
131
|
_: 1
|
|
131
132
|
})) : r("", !0),
|
|
132
|
-
|
|
133
|
+
y(_) && y(h) ? (p(), i("div", re, [
|
|
133
134
|
a("span", null, [
|
|
134
|
-
a("strong", null,
|
|
135
|
-
o(" · " +
|
|
136
|
-
k.value ? (
|
|
137
|
-
o(" · " +
|
|
138
|
-
|
|
135
|
+
a("strong", null, v(y(_).username), 1),
|
|
136
|
+
o(" · " + v(y(_).sessions.length) + " sessions ", 1),
|
|
137
|
+
k.value ? (p(), i(e, { key: 0 }, [o("(" + v(k.value) + ")", 1)], 64)) : r("", !0),
|
|
138
|
+
o(" · " + v(y(_).cardHistories.length) + " cards seen · as of " + v(y(_).asOf.slice(0, 16)) + "Z ", 1),
|
|
139
|
+
y(_).cards ? r("", !0) : (p(), i(e, { key: 1 }, [o("· no course slice")], 64))
|
|
139
140
|
]),
|
|
140
|
-
s(
|
|
141
|
+
s(f),
|
|
141
142
|
s(u, {
|
|
142
143
|
variant: "text",
|
|
143
144
|
size: "small",
|
|
144
145
|
"prepend-icon": "mdi-download",
|
|
145
|
-
onClick: c[2] || (c[2] = (e) =>
|
|
146
|
+
onClick: c[2] || (c[2] = (e) => y(downloadLearnerDump)(y(h)))
|
|
146
147
|
}, {
|
|
147
|
-
default:
|
|
148
|
+
default: x(() => c[6] || (c[6] = [o(" Save dump ")])),
|
|
148
149
|
_: 1
|
|
149
150
|
})
|
|
150
151
|
])) : r("", !0)
|
|
@@ -202,7 +203,7 @@ function shortId(e, t = 28) {
|
|
|
202
203
|
return e.length > t ? `…${e.slice(-(t - 2))}` : e;
|
|
203
204
|
}
|
|
204
205
|
function useCopy() {
|
|
205
|
-
let e =
|
|
206
|
+
let e = m(null), t = null;
|
|
206
207
|
async function copy(n, r) {
|
|
207
208
|
try {
|
|
208
209
|
await navigator.clipboard.writeText(n), e.value = r, t && clearTimeout(t), t = setTimeout(() => e.value = null, 1400);
|
|
@@ -217,22 +218,22 @@ function useCopy() {
|
|
|
217
218
|
}
|
|
218
219
|
//#endregion
|
|
219
220
|
//#region src/admin/components/CardDossierDetail.vue?vue&type=script&setup=true&lang.ts
|
|
220
|
-
var
|
|
221
|
+
var ae = {
|
|
221
222
|
key: 0,
|
|
222
223
|
class: "text-caption mb-2"
|
|
223
|
-
},
|
|
224
|
+
}, oe = { class: "text-medium-emphasis" }, se = { class: "d-flex flex-wrap mb-2 ga-1" }, ce = {
|
|
224
225
|
key: 0,
|
|
225
226
|
class: "text-caption text-disabled"
|
|
226
|
-
},
|
|
227
|
+
}, le = { class: "text-caption text-medium-emphasis mb-2" }, ue = {
|
|
227
228
|
key: 0,
|
|
228
229
|
class: "text-error"
|
|
229
|
-
},
|
|
230
|
+
}, de = { class: "text-no-wrap" }, fe = {
|
|
230
231
|
key: 2,
|
|
231
232
|
class: "text-disabled"
|
|
232
|
-
},
|
|
233
|
+
}, pe = {
|
|
233
234
|
class: "text-truncate",
|
|
234
235
|
style: { "max-width": "200px" }
|
|
235
|
-
},
|
|
236
|
+
}, me = /* @__PURE__ */ c({
|
|
236
237
|
__name: "CardDossierDetail",
|
|
237
238
|
props: {
|
|
238
239
|
dossier: {},
|
|
@@ -240,34 +241,34 @@ var ee = {
|
|
|
240
241
|
},
|
|
241
242
|
setup(t) {
|
|
242
243
|
function perf(e) {
|
|
243
|
-
let t =
|
|
244
|
+
let t = F(e);
|
|
244
245
|
return t === null ? "—" : t.toFixed(2);
|
|
245
246
|
}
|
|
246
247
|
function fmtInterval(e) {
|
|
247
248
|
return e ? e < 3600 ? `${Math.round(e / 60)}m` : e < 86400 ? `${Math.round(e / 3600)}h` : `${Math.round(e / 86400)}d` : "none";
|
|
248
249
|
}
|
|
249
250
|
return (t, c) => {
|
|
250
|
-
let l =
|
|
251
|
-
return
|
|
252
|
-
t.dossier.card && Object.keys(t.dossier.card.data).length ? (
|
|
251
|
+
let l = g("v-chip"), d = g("v-icon"), f = g("v-table");
|
|
252
|
+
return p(), i("div", null, [
|
|
253
|
+
t.dossier.card && Object.keys(t.dossier.card.data).length ? (p(), i("div", ae, [(p(!0), i(e, null, h(t.dossier.card.data, (e, t) => (p(), i("span", {
|
|
253
254
|
key: t,
|
|
254
255
|
class: "mr-3"
|
|
255
|
-
}, [a("span",
|
|
256
|
-
a("div",
|
|
256
|
+
}, [a("span", oe, v(t) + ":", 1), o(" " + v(y(O)(e, 60)), 1)]))), 128))])) : r("", !0),
|
|
257
|
+
a("div", se, [(p(!0), i(e, null, h(t.dossier.card?.tags ?? [], (e) => (p(), n(l, {
|
|
257
258
|
key: e,
|
|
258
259
|
size: "x-small",
|
|
259
260
|
variant: "outlined",
|
|
260
|
-
color:
|
|
261
|
+
color: y(M)(t.interpreters, e) ? "primary" : void 0
|
|
261
262
|
}, {
|
|
262
|
-
default:
|
|
263
|
+
default: x(() => [o(v(e), 1)]),
|
|
263
264
|
_: 2
|
|
264
|
-
}, 1032, ["color"]))), 128)), t.dossier.card ? r("", !0) : (
|
|
265
|
-
a("div",
|
|
266
|
-
s(
|
|
265
|
+
}, 1032, ["color"]))), 128)), t.dossier.card ? r("", !0) : (p(), i("span", ce, "no course data in this dataset"))]),
|
|
266
|
+
a("div", le, [o(" lapses " + v(t.dossier.lapses) + " · streak " + v(t.dossier.streak) + " · best interval " + v(fmtInterval(t.dossier.bestIntervalSeconds)) + " · ", 1), t.dossier.pendingReview ? (p(), i(e, { key: 0 }, [o(" next review " + v(y(fmtTime)(t.dossier.pendingReview.reviewTime)) + " ", 1), t.dossier.pendingReview.overdue ? (p(), i("span", ue, "(overdue)")) : r("", !0)], 64)) : (p(), i(e, { key: 1 }, [o("no review scheduled")], 64))]),
|
|
267
|
+
s(f, {
|
|
267
268
|
density: "compact",
|
|
268
269
|
class: "sk-record-table"
|
|
269
270
|
}, {
|
|
270
|
-
default:
|
|
271
|
+
default: x(() => [c[2] || (c[2] = a("thead", null, [a("tr", null, [
|
|
271
272
|
a("th", null, "#"),
|
|
272
273
|
a("th", null, "When"),
|
|
273
274
|
a("th", null, "Result"),
|
|
@@ -275,51 +276,51 @@ var ee = {
|
|
|
275
276
|
a("th", null, "Prior att."),
|
|
276
277
|
a("th", null, "Time"),
|
|
277
278
|
a("th", null, "Answer")
|
|
278
|
-
])], -1)), a("tbody", null, [(
|
|
279
|
+
])], -1)), a("tbody", null, [(p(!0), i(e, null, h(t.dossier.records, (e, t) => (p(), i("tr", {
|
|
279
280
|
key: t,
|
|
280
281
|
class: u(e.isCorrect === !1 ? "sk-fail-row" : "")
|
|
281
282
|
}, [
|
|
282
|
-
a("td", null,
|
|
283
|
-
a("td",
|
|
284
|
-
a("td", null, [e.isCorrect === !0 ? (
|
|
283
|
+
a("td", null, v(t + 1), 1),
|
|
284
|
+
a("td", de, v(y(fmtTime)(e.timeStamp)), 1),
|
|
285
|
+
a("td", null, [e.isCorrect === !0 ? (p(), n(d, {
|
|
285
286
|
key: 0,
|
|
286
287
|
size: "small",
|
|
287
288
|
color: "success"
|
|
288
289
|
}, {
|
|
289
|
-
default:
|
|
290
|
+
default: x(() => c[0] || (c[0] = [o("mdi-check")])),
|
|
290
291
|
_: 1
|
|
291
|
-
})) : e.isCorrect === !1 ? (
|
|
292
|
+
})) : e.isCorrect === !1 ? (p(), n(d, {
|
|
292
293
|
key: 1,
|
|
293
294
|
size: "small",
|
|
294
295
|
color: "error"
|
|
295
296
|
}, {
|
|
296
|
-
default:
|
|
297
|
+
default: x(() => c[1] || (c[1] = [o("mdi-close")])),
|
|
297
298
|
_: 1
|
|
298
|
-
})) : (
|
|
299
|
-
a("td", null,
|
|
300
|
-
a("td", null,
|
|
301
|
-
a("td", null,
|
|
302
|
-
a("td",
|
|
299
|
+
})) : (p(), i("span", fe, "—"))]),
|
|
300
|
+
a("td", null, v(perf(e)), 1),
|
|
301
|
+
a("td", null, v(e.priorAttemps ?? "—"), 1),
|
|
302
|
+
a("td", null, v(((e.timeSpent ?? 0) / 1e3).toFixed(1)) + "s", 1),
|
|
303
|
+
a("td", pe, v(y(O)(e.userAnswer)), 1)
|
|
303
304
|
], 2))), 128))])]),
|
|
304
305
|
_: 1
|
|
305
306
|
})
|
|
306
307
|
]);
|
|
307
308
|
};
|
|
308
309
|
}
|
|
309
|
-
}),
|
|
310
|
+
}), K = /* @__PURE__ */ __name((e, t) => {
|
|
310
311
|
let n = e.__vccOpts || e;
|
|
311
312
|
for (let [e, r] of t) n[e] = r;
|
|
312
313
|
return n;
|
|
313
|
-
}, "default"),
|
|
314
|
+
}, "default"), q = /* @__PURE__ */ K(me, [["__scopeId", "data-v-76b0a622"]]), he = { class: "text-caption text-medium-emphasis mb-4" }, ge = { class: "text-h6" }, _e = { class: "text-caption" }, ve = { class: "d-flex align-center flex-wrap mb-3 ga-3" }, ye = {
|
|
314
315
|
class: "d-flex align-center flex-wrap ga-2",
|
|
315
316
|
style: { width: "100%" }
|
|
316
|
-
},
|
|
317
|
+
}, be = { class: "text-body-2 font-weight-medium" }, xe = { class: "text-caption text-medium-emphasis" }, Se = {
|
|
317
318
|
key: 2,
|
|
318
319
|
class: "text-caption"
|
|
319
|
-
},
|
|
320
|
+
}, Ce = {
|
|
320
321
|
key: 0,
|
|
321
322
|
class: "ml-1 text-disabled"
|
|
322
|
-
},
|
|
323
|
+
}, J = /* @__PURE__ */ K(/* @__PURE__ */ c({
|
|
323
324
|
__name: "LearnerCardHistory",
|
|
324
325
|
props: {
|
|
325
326
|
dataset: {},
|
|
@@ -327,29 +328,29 @@ var ee = {
|
|
|
327
328
|
focus: {}
|
|
328
329
|
},
|
|
329
330
|
setup(c) {
|
|
330
|
-
let d = c,
|
|
331
|
-
stuck:
|
|
332
|
-
failed:
|
|
333
|
-
frozen:
|
|
331
|
+
let d = c, f = t(() => w(d.dataset)), _ = m("all"), S = m(""), C = m([]), T = m(null), E = t(() => ({
|
|
332
|
+
stuck: f.value.filter((e) => e.stuck).length,
|
|
333
|
+
failed: f.value.filter((e) => e.fails > 0).length,
|
|
334
|
+
frozen: f.value.filter((e) => e.frozenElo).length
|
|
334
335
|
})), D = t(() => [
|
|
335
336
|
{
|
|
336
337
|
label: "cards seen",
|
|
337
|
-
value:
|
|
338
|
+
value: f.value.length,
|
|
338
339
|
color: "primary"
|
|
339
340
|
},
|
|
340
341
|
{
|
|
341
342
|
label: "total attempts",
|
|
342
|
-
value:
|
|
343
|
+
value: f.value.reduce((e, t) => e + t.attempts, 0),
|
|
343
344
|
color: "primary"
|
|
344
345
|
},
|
|
345
346
|
{
|
|
346
347
|
label: "total fails",
|
|
347
|
-
value:
|
|
348
|
+
value: f.value.reduce((e, t) => e + t.fails, 0),
|
|
348
349
|
color: "error"
|
|
349
350
|
},
|
|
350
351
|
{
|
|
351
352
|
label: "time on cards",
|
|
352
|
-
value:
|
|
353
|
+
value: A(f.value.reduce((e, t) => e + t.totalTimeMs, 0) / 1e3),
|
|
353
354
|
color: "grey"
|
|
354
355
|
},
|
|
355
356
|
{
|
|
@@ -363,8 +364,8 @@ var ee = {
|
|
|
363
364
|
color: "warning"
|
|
364
365
|
}
|
|
365
366
|
]), O = t(() => {
|
|
366
|
-
let e =
|
|
367
|
-
|
|
367
|
+
let e = f.value;
|
|
368
|
+
_.value === "stuck" ? e = e.filter((e) => e.stuck) : _.value === "failed" ? e = e.filter((e) => e.fails > 0) : _.value === "frozen" && (e = e.filter((e) => e.frozenElo));
|
|
368
369
|
let t = S.value?.trim().toLowerCase();
|
|
369
370
|
return t && (e = e.filter((e) => e.cardId.toLowerCase().includes(t) || (e.card?.questionType ?? "").toLowerCase().includes(t) || (e.card?.tags ?? []).some((e) => e.toLowerCase().includes(t)) || Object.values(e.card?.data ?? {}).some((e) => typeof e == "string" && e.toLowerCase().includes(t)))), e;
|
|
370
371
|
});
|
|
@@ -373,23 +374,23 @@ var ee = {
|
|
|
373
374
|
return typeof t == "string" ? t : "";
|
|
374
375
|
}
|
|
375
376
|
async function applyFocus(e) {
|
|
376
|
-
!e || !
|
|
377
|
+
!e || !f.value.some((t) => t.cardId === e) || (_.value = "all", S.value = e, C.value = [e], await l(), document.querySelector(`[data-card="${CSS.escape(e)}"]`)?.scrollIntoView({
|
|
377
378
|
behavior: "smooth",
|
|
378
379
|
block: "center"
|
|
379
380
|
}), T.value = e, setTimeout(() => {
|
|
380
381
|
T.value === e && (T.value = null);
|
|
381
382
|
}, 2200));
|
|
382
383
|
}
|
|
383
|
-
return
|
|
384
|
-
let l =
|
|
385
|
-
return
|
|
386
|
-
a("p",
|
|
384
|
+
return b(() => d.focus, (e) => void applyFocus(e), { immediate: !0 }), (t, c) => {
|
|
385
|
+
let l = g("v-icon"), d = g("v-card"), m = g("v-col"), b = g("v-row"), w = g("v-btn"), k = g("v-btn-toggle"), j = g("v-text-field"), M = g("v-alert"), N = g("v-spacer"), P = g("v-chip"), F = g("v-expansion-panel-title"), I = g("v-expansion-panel-text"), L = g("v-expansion-panel"), R = g("v-expansion-panels");
|
|
386
|
+
return p(), i("div", null, [
|
|
387
|
+
a("p", he, [
|
|
387
388
|
c[5] || (c[5] = o(" Every card the learner has met, most painful first (time sunk × failures), with its pending review and current card ELO. ")),
|
|
388
389
|
s(l, {
|
|
389
390
|
size: "x-small",
|
|
390
391
|
color: "error"
|
|
391
392
|
}, {
|
|
392
|
-
default:
|
|
393
|
+
default: x(() => c[3] || (c[3] = [o("mdi-sync-alert")])),
|
|
393
394
|
_: 1
|
|
394
395
|
}),
|
|
395
396
|
c[6] || (c[6] = o(" is a failed card holding an overdue review; ")),
|
|
@@ -397,81 +398,81 @@ var ee = {
|
|
|
397
398
|
size: "x-small",
|
|
398
399
|
color: "warning"
|
|
399
400
|
}, {
|
|
400
|
-
default:
|
|
401
|
+
default: x(() => c[4] || (c[4] = [o("mdi-snowflake")])),
|
|
401
402
|
_: 1
|
|
402
403
|
}),
|
|
403
404
|
c[7] || (c[7] = o(" is a repeatedly failed card whose ELO has fewer updates than failures. "))
|
|
404
405
|
]),
|
|
405
|
-
s(
|
|
406
|
+
s(b, {
|
|
406
407
|
dense: "",
|
|
407
408
|
class: "mb-2"
|
|
408
409
|
}, {
|
|
409
|
-
default:
|
|
410
|
+
default: x(() => [(p(!0), i(e, null, h(D.value, (e) => (p(), n(m, {
|
|
410
411
|
key: e.label,
|
|
411
412
|
cols: "6",
|
|
412
413
|
sm: "4",
|
|
413
414
|
md: "2"
|
|
414
415
|
}, {
|
|
415
|
-
default:
|
|
416
|
+
default: x(() => [s(d, {
|
|
416
417
|
variant: "tonal",
|
|
417
418
|
color: e.color,
|
|
418
419
|
class: "pa-2 text-center"
|
|
419
420
|
}, {
|
|
420
|
-
default:
|
|
421
|
+
default: x(() => [a("div", ge, v(e.value), 1), a("div", _e, v(e.label), 1)]),
|
|
421
422
|
_: 2
|
|
422
423
|
}, 1032, ["color"])]),
|
|
423
424
|
_: 2
|
|
424
425
|
}, 1024))), 128))]),
|
|
425
426
|
_: 1
|
|
426
427
|
}),
|
|
427
|
-
a("div",
|
|
428
|
-
modelValue:
|
|
429
|
-
"onUpdate:modelValue": c[0] || (c[0] = (e) =>
|
|
428
|
+
a("div", ve, [s(k, {
|
|
429
|
+
modelValue: _.value,
|
|
430
|
+
"onUpdate:modelValue": c[0] || (c[0] = (e) => _.value = e),
|
|
430
431
|
density: "compact",
|
|
431
432
|
color: "primary",
|
|
432
433
|
variant: "outlined"
|
|
433
434
|
}, {
|
|
434
|
-
default:
|
|
435
|
-
s(
|
|
435
|
+
default: x(() => [
|
|
436
|
+
s(w, {
|
|
436
437
|
value: "all",
|
|
437
438
|
size: "small"
|
|
438
439
|
}, {
|
|
439
|
-
default:
|
|
440
|
+
default: x(() => [o("All (" + v(f.value.length) + ")", 1)]),
|
|
440
441
|
_: 1
|
|
441
442
|
}),
|
|
442
|
-
s(
|
|
443
|
+
s(w, {
|
|
443
444
|
value: "stuck",
|
|
444
445
|
size: "small"
|
|
445
446
|
}, {
|
|
446
|
-
default:
|
|
447
|
+
default: x(() => [s(l, {
|
|
447
448
|
start: "",
|
|
448
449
|
size: "small",
|
|
449
450
|
color: "error"
|
|
450
451
|
}, {
|
|
451
|
-
default:
|
|
452
|
+
default: x(() => c[8] || (c[8] = [o("mdi-sync-alert")])),
|
|
452
453
|
_: 1
|
|
453
|
-
}), o(" Stuck (" +
|
|
454
|
+
}), o(" Stuck (" + v(E.value.stuck) + ") ", 1)]),
|
|
454
455
|
_: 1
|
|
455
456
|
}),
|
|
456
|
-
s(
|
|
457
|
+
s(w, {
|
|
457
458
|
value: "failed",
|
|
458
459
|
size: "small"
|
|
459
460
|
}, {
|
|
460
|
-
default:
|
|
461
|
+
default: x(() => [o("Ever failed (" + v(E.value.failed) + ")", 1)]),
|
|
461
462
|
_: 1
|
|
462
463
|
}),
|
|
463
|
-
s(
|
|
464
|
+
s(w, {
|
|
464
465
|
value: "frozen",
|
|
465
466
|
size: "small"
|
|
466
467
|
}, {
|
|
467
|
-
default:
|
|
468
|
+
default: x(() => [s(l, {
|
|
468
469
|
start: "",
|
|
469
470
|
size: "small",
|
|
470
471
|
color: "warning"
|
|
471
472
|
}, {
|
|
472
|
-
default:
|
|
473
|
+
default: x(() => c[9] || (c[9] = [o("mdi-snowflake")])),
|
|
473
474
|
_: 1
|
|
474
|
-
}), o(" Frozen ELO (" +
|
|
475
|
+
}), o(" Frozen ELO (" + v(E.value.frozen) + ") ", 1)]),
|
|
475
476
|
_: 1
|
|
476
477
|
})
|
|
477
478
|
]),
|
|
@@ -487,64 +488,64 @@ var ee = {
|
|
|
487
488
|
"prepend-inner-icon": "mdi-magnify",
|
|
488
489
|
style: { "max-width": "320px" }
|
|
489
490
|
}, null, 8, ["modelValue"])]),
|
|
490
|
-
|
|
491
|
+
f.value.length === 0 ? (p(), n(M, {
|
|
491
492
|
key: 0,
|
|
492
493
|
type: "info",
|
|
493
494
|
variant: "tonal"
|
|
494
495
|
}, {
|
|
495
|
-
default:
|
|
496
|
+
default: x(() => c[10] || (c[10] = [o("No card history for this learner.")])),
|
|
496
497
|
_: 1
|
|
497
|
-
})) : (
|
|
498
|
+
})) : (p(), n(R, {
|
|
498
499
|
key: 1,
|
|
499
|
-
modelValue:
|
|
500
|
-
"onUpdate:modelValue": c[2] || (c[2] = (e) =>
|
|
500
|
+
modelValue: C.value,
|
|
501
|
+
"onUpdate:modelValue": c[2] || (c[2] = (e) => C.value = e),
|
|
501
502
|
multiple: "",
|
|
502
503
|
variant: "accordion"
|
|
503
504
|
}, {
|
|
504
|
-
default:
|
|
505
|
+
default: x(() => [(p(!0), i(e, null, h(O.value, (e) => (p(), n(L, {
|
|
505
506
|
key: e.cardId,
|
|
506
507
|
value: e.cardId,
|
|
507
508
|
"data-card": e.cardId,
|
|
508
509
|
class: u(e.cardId === T.value ? "sk-card-flash" : "")
|
|
509
510
|
}, {
|
|
510
|
-
default:
|
|
511
|
-
default:
|
|
512
|
-
e.stuck ? (
|
|
511
|
+
default: x(() => [s(F, null, {
|
|
512
|
+
default: x(() => [a("div", ye, [
|
|
513
|
+
e.stuck ? (p(), n(l, {
|
|
513
514
|
key: 0,
|
|
514
515
|
color: "error",
|
|
515
516
|
size: "small",
|
|
516
517
|
title: "failed + overdue review"
|
|
517
518
|
}, {
|
|
518
|
-
default:
|
|
519
|
+
default: x(() => c[11] || (c[11] = [o("mdi-sync-alert")])),
|
|
519
520
|
_: 1
|
|
520
521
|
})) : r("", !0),
|
|
521
|
-
e.frozenElo ? (
|
|
522
|
+
e.frozenElo ? (p(), n(l, {
|
|
522
523
|
key: 1,
|
|
523
524
|
color: "warning",
|
|
524
525
|
size: "small",
|
|
525
526
|
title: "repeatedly failed, ELO barely updated"
|
|
526
527
|
}, {
|
|
527
|
-
default:
|
|
528
|
+
default: x(() => c[12] || (c[12] = [o(" mdi-snowflake ")])),
|
|
528
529
|
_: 1
|
|
529
530
|
})) : r("", !0),
|
|
530
|
-
a("span",
|
|
531
|
-
a("code",
|
|
532
|
-
headline(e) ? (
|
|
531
|
+
a("span", be, v(e.card?.questionType ?? "card"), 1),
|
|
532
|
+
a("code", xe, v(y(shortId)(e.cardId, 24)), 1),
|
|
533
|
+
headline(e) ? (p(), i("span", Se, v(headline(e)), 1)) : r("", !0),
|
|
533
534
|
s(N),
|
|
534
|
-
e.fails > 0 ? (
|
|
535
|
+
e.fails > 0 ? (p(), n(P, {
|
|
535
536
|
key: 3,
|
|
536
537
|
size: "x-small",
|
|
537
538
|
color: "error",
|
|
538
539
|
variant: "tonal"
|
|
539
540
|
}, {
|
|
540
|
-
default:
|
|
541
|
+
default: x(() => [o(v(e.fails) + " fail" + v(e.fails === 1 ? "" : "s"), 1)]),
|
|
541
542
|
_: 2
|
|
542
543
|
}, 1024)) : r("", !0),
|
|
543
544
|
s(P, {
|
|
544
545
|
size: "x-small",
|
|
545
546
|
variant: "tonal"
|
|
546
547
|
}, {
|
|
547
|
-
default:
|
|
548
|
+
default: x(() => [o(v(e.attempts) + " view" + v(e.attempts === 1 ? "" : "s"), 1)]),
|
|
548
549
|
_: 2
|
|
549
550
|
}, 1024),
|
|
550
551
|
s(P, {
|
|
@@ -552,16 +553,16 @@ var ee = {
|
|
|
552
553
|
variant: "tonal",
|
|
553
554
|
color: "grey"
|
|
554
555
|
}, {
|
|
555
|
-
default:
|
|
556
|
+
default: x(() => [o(v(y(A)(e.totalTimeMs / 1e3)), 1)]),
|
|
556
557
|
_: 2
|
|
557
558
|
}, 1024),
|
|
558
|
-
e.pendingReview ? (
|
|
559
|
+
e.pendingReview ? (p(), n(P, {
|
|
559
560
|
key: 4,
|
|
560
561
|
size: "x-small",
|
|
561
562
|
color: e.pendingReview.overdue ? "error" : "success",
|
|
562
563
|
variant: "flat"
|
|
563
564
|
}, {
|
|
564
|
-
default:
|
|
565
|
+
default: x(() => [o(" review " + v(e.pendingReview.overdue ? "overdue" : "scheduled"), 1)]),
|
|
565
566
|
_: 2
|
|
566
567
|
}, 1032, ["color"])) : r("", !0),
|
|
567
568
|
s(P, {
|
|
@@ -569,13 +570,13 @@ var ee = {
|
|
|
569
570
|
variant: "tonal",
|
|
570
571
|
color: e.frozenElo ? "warning" : void 0
|
|
571
572
|
}, {
|
|
572
|
-
default:
|
|
573
|
+
default: x(() => [o(" ELO " + v(e.cardElo === null ? "?" : Math.round(e.cardElo)) + " ", 1), e.cardEloCount === null ? r("", !0) : (p(), i("span", Ce, "/" + v(e.cardEloCount), 1))]),
|
|
573
574
|
_: 2
|
|
574
575
|
}, 1032, ["color"])
|
|
575
576
|
])]),
|
|
576
577
|
_: 2
|
|
577
578
|
}, 1024), s(I, null, {
|
|
578
|
-
default:
|
|
579
|
+
default: x(() => [s(q, {
|
|
579
580
|
dossier: e,
|
|
580
581
|
interpreters: t.interpreters
|
|
581
582
|
}, null, 8, ["dossier", "interpreters"])]),
|
|
@@ -592,30 +593,33 @@ var ee = {
|
|
|
592
593
|
]);
|
|
593
594
|
};
|
|
594
595
|
}
|
|
595
|
-
}), [["__scopeId", "data-v-bb6b302b"]]),
|
|
596
|
+
}), [["__scopeId", "data-v-bb6b302b"]]), we = { class: "sk-run-detail" }, Te = {
|
|
596
597
|
key: 0,
|
|
597
598
|
class: "mb-2"
|
|
598
|
-
},
|
|
599
|
+
}, Ee = { class: "text-right" }, De = { class: "text-right" }, Oe = { class: "text-right" }, ke = { class: "text-right" }, Ae = {
|
|
599
600
|
key: 1,
|
|
600
601
|
class: "mb-2"
|
|
601
|
-
},
|
|
602
|
+
}, je = { class: "text-right" }, Me = { class: "text-right" }, Ne = { class: "text-right" }, Pe = {
|
|
602
603
|
key: 2,
|
|
603
604
|
class: "mb-2"
|
|
604
|
-
},
|
|
605
|
-
key: 1,
|
|
606
|
-
title: "runner-up"
|
|
607
|
-
}, Ae = ["onClick"], je = { class: "text-right" }, Me = { class: "text-caption font-weight-medium" }, Ne = ["onClick"], Pe = { class: "text-medium-emphasis" }, Fe = { class: "text-no-wrap" }, Ie = { class: "text-no-wrap" }, Le = { class: "text-right text-no-wrap" }, Re = { class: "text-caption" }, ze = {
|
|
605
|
+
}, Fe = {
|
|
608
606
|
key: 3,
|
|
609
607
|
class: "mb-2"
|
|
610
|
-
},
|
|
608
|
+
}, Ie = {
|
|
609
|
+
key: 1,
|
|
610
|
+
title: "runner-up"
|
|
611
|
+
}, Le = ["onClick"], Re = { class: "text-right" }, ze = { class: "text-caption font-weight-medium" }, Be = ["onClick"], Ve = { class: "text-medium-emphasis" }, He = { class: "text-no-wrap" }, Ue = { class: "text-no-wrap" }, We = { class: "text-right text-no-wrap" }, Ge = { class: "text-caption" }, Ke = {
|
|
611
612
|
key: 4,
|
|
613
|
+
class: "mb-2"
|
|
614
|
+
}, qe = { class: "sk-hint-block" }, Je = {
|
|
615
|
+
key: 5,
|
|
612
616
|
class: "text-caption text-medium-emphasis"
|
|
613
|
-
},
|
|
617
|
+
}, Ye = { key: 2 }, Y = /* @__PURE__ */ K(/* @__PURE__ */ c({
|
|
614
618
|
__name: "RunDetail",
|
|
615
619
|
props: { run: {} },
|
|
616
620
|
emits: ["open-card"],
|
|
617
621
|
setup(c, { emit: l }) {
|
|
618
|
-
let d = c,
|
|
622
|
+
let d = c, f = l, m = t(() => {
|
|
619
623
|
let e = d.run.unselectedNew, t = [];
|
|
620
624
|
return e?.nextInLine && t.push({
|
|
621
625
|
label: "next new card in line",
|
|
@@ -629,129 +633,135 @@ var ee = {
|
|
|
629
633
|
return Math.abs(e) >= .01 || e === 0 ? e.toFixed(2) : e.toExponential(1);
|
|
630
634
|
}
|
|
631
635
|
return (t, c) => {
|
|
632
|
-
let l =
|
|
633
|
-
return
|
|
634
|
-
t.run.generators?.length ? (
|
|
636
|
+
let l = g("v-table"), d = g("v-icon");
|
|
637
|
+
return p(), i("div", we, [
|
|
638
|
+
t.run.generators?.length ? (p(), i("div", Te, [c[1] || (c[1] = a("div", { class: "text-caption font-weight-medium" }, "generators", -1)), s(l, {
|
|
635
639
|
density: "compact",
|
|
636
640
|
class: "sk-mini-table"
|
|
637
641
|
}, {
|
|
638
|
-
default:
|
|
642
|
+
default: x(() => [c[0] || (c[0] = a("thead", null, [a("tr", null, [
|
|
639
643
|
a("th"),
|
|
640
644
|
a("th", { class: "text-right" }, "cards"),
|
|
641
645
|
a("th", { class: "text-right" }, "new"),
|
|
642
646
|
a("th", { class: "text-right" }, "review"),
|
|
643
647
|
a("th", { class: "text-right" }, "top")
|
|
644
|
-
])], -1)), a("tbody", null, [(
|
|
645
|
-
a("td", null,
|
|
646
|
-
a("td",
|
|
647
|
-
a("td",
|
|
648
|
-
a("td",
|
|
649
|
-
a("td",
|
|
648
|
+
])], -1)), a("tbody", null, [(p(!0), i(e, null, h(t.run.generators, (e) => (p(), i("tr", { key: e.name }, [
|
|
649
|
+
a("td", null, v(e.name), 1),
|
|
650
|
+
a("td", Ee, v(e.cardCount), 1),
|
|
651
|
+
a("td", De, v(e.newCount), 1),
|
|
652
|
+
a("td", Oe, v(e.reviewCount), 1),
|
|
653
|
+
a("td", ke, v(e.topScore.toFixed(2)), 1)
|
|
650
654
|
]))), 128))])]),
|
|
651
655
|
_: 1
|
|
652
656
|
})])) : r("", !0),
|
|
653
|
-
t.run.filters?.length ? (
|
|
657
|
+
t.run.filters?.length ? (p(), i("div", Ae, [c[3] || (c[3] = a("div", { class: "text-caption font-weight-medium" }, "filters", -1)), s(l, {
|
|
654
658
|
density: "compact",
|
|
655
659
|
class: "sk-mini-table"
|
|
656
660
|
}, {
|
|
657
|
-
default:
|
|
661
|
+
default: x(() => [c[2] || (c[2] = a("thead", null, [a("tr", null, [
|
|
658
662
|
a("th"),
|
|
663
|
+
a("th", null, "kind"),
|
|
659
664
|
a("th", { class: "text-right" }, "boosted"),
|
|
660
665
|
a("th", { class: "text-right" }, "penalized"),
|
|
661
666
|
a("th", { class: "text-right" }, "passed"),
|
|
662
667
|
a("th", { class: "text-right" }, "removed")
|
|
663
|
-
])], -1)), a("tbody", null, [(
|
|
664
|
-
a("td", null,
|
|
665
|
-
a("td",
|
|
666
|
-
a("td",
|
|
667
|
-
a("td",
|
|
668
|
-
a("td",
|
|
668
|
+
])], -1)), a("tbody", null, [(p(!0), i(e, null, h(t.run.filters, (e) => (p(), i("tr", { key: e.name }, [
|
|
669
|
+
a("td", null, v(e.name), 1),
|
|
670
|
+
a("td", null, v(e.kind ?? "—"), 1),
|
|
671
|
+
a("td", je, v(e.boosted), 1),
|
|
672
|
+
a("td", Me, v(e.penalized), 1),
|
|
673
|
+
a("td", Ne, v(e.passed), 1),
|
|
674
|
+
a("td", { class: u(["text-right", e.removed > 0 ? "text-error" : ""]) }, v(e.removed), 3)
|
|
669
675
|
]))), 128))])]),
|
|
670
676
|
_: 1
|
|
671
677
|
})])) : r("", !0),
|
|
672
|
-
t.run.
|
|
678
|
+
t.run.regulators?.length ? (p(), i("div", Pe, [c[4] || (c[4] = a("div", { class: "text-caption font-weight-medium" }, "regulators", -1)), (p(!0), i(e, null, h(t.run.regulators, (e) => (p(), i("div", {
|
|
679
|
+
key: e.name,
|
|
680
|
+
class: "sk-mini-line"
|
|
681
|
+
}, [a("span", { class: u(e.multiplier > 1 ? "text-warning" : "text-medium-emphasis") }, " ×" + v(e.multiplier.toFixed(2)), 3), o(" " + v(y(I)(e)), 1)]))), 128))])) : r("", !0),
|
|
682
|
+
t.run.cards?.length ? (p(), i("div", Fe, [c[7] || (c[7] = a("div", { class: "text-caption font-weight-medium" }, "selection", -1)), s(l, {
|
|
673
683
|
density: "compact",
|
|
674
684
|
class: "sk-mini-table"
|
|
675
685
|
}, {
|
|
676
|
-
default:
|
|
686
|
+
default: x(() => [c[6] || (c[6] = a("thead", null, [a("tr", null, [
|
|
677
687
|
a("th"),
|
|
678
688
|
a("th", null, "card"),
|
|
679
689
|
a("th", null, "origin"),
|
|
680
690
|
a("th", null, "generator"),
|
|
681
691
|
a("th", { class: "text-right" }, "score")
|
|
682
|
-
])], -1)), a("tbody", null, [(
|
|
692
|
+
])], -1)), a("tbody", null, [(p(!0), i(e, null, h(t.run.cards, (e) => (p(), i("tr", {
|
|
683
693
|
key: e.cardId,
|
|
684
694
|
class: u(e.selected ? "" : "text-medium-emphasis")
|
|
685
695
|
}, [
|
|
686
|
-
a("td", null, [e.selected ? (
|
|
696
|
+
a("td", null, [e.selected ? (p(), n(d, {
|
|
687
697
|
key: 0,
|
|
688
698
|
size: "x-small",
|
|
689
699
|
color: "success"
|
|
690
700
|
}, {
|
|
691
|
-
default:
|
|
701
|
+
default: x(() => c[5] || (c[5] = [o("mdi-check")])),
|
|
692
702
|
_: 1
|
|
693
|
-
})) : (
|
|
703
|
+
})) : (p(), i("span", Ie, "·"))]),
|
|
694
704
|
a("td", null, [a("a", {
|
|
695
705
|
class: "sk-card-link",
|
|
696
|
-
onClick: (t) =>
|
|
697
|
-
},
|
|
698
|
-
a("td", null,
|
|
699
|
-
a("td", null,
|
|
700
|
-
a("td",
|
|
706
|
+
onClick: (t) => f("open-card", e.cardId)
|
|
707
|
+
}, v(e.cardId), 9, Le)]),
|
|
708
|
+
a("td", null, v(e.origin), 1),
|
|
709
|
+
a("td", null, v(e.generator ?? "—"), 1),
|
|
710
|
+
a("td", Re, v(fmtScore(e.score)), 1)
|
|
701
711
|
], 2))), 128))])]),
|
|
702
712
|
_: 1
|
|
703
713
|
})])) : r("", !0),
|
|
704
|
-
(
|
|
714
|
+
(p(!0), i(e, null, h(m.value, (t) => (p(), i("div", {
|
|
705
715
|
key: t.label,
|
|
706
716
|
class: "mb-2"
|
|
707
|
-
}, [a("div",
|
|
708
|
-
o(
|
|
717
|
+
}, [a("div", ze, [
|
|
718
|
+
o(v(t.label) + ": ", 1),
|
|
709
719
|
a("a", {
|
|
710
720
|
class: "sk-card-link",
|
|
711
|
-
onClick: (e) =>
|
|
712
|
-
},
|
|
713
|
-
a("span",
|
|
721
|
+
onClick: (e) => f("open-card", t.card.cardId)
|
|
722
|
+
}, v(t.card.cardId), 9, Be),
|
|
723
|
+
a("span", Ve, " (" + v(t.card.origin) + ", " + v(t.card.generator ?? "?") + ") final " + v(fmtScore(t.card.score)), 1)
|
|
714
724
|
]), s(l, {
|
|
715
725
|
density: "compact",
|
|
716
726
|
class: "sk-mini-table"
|
|
717
727
|
}, {
|
|
718
|
-
default:
|
|
719
|
-
a("td",
|
|
720
|
-
a("td",
|
|
721
|
-
a("td",
|
|
722
|
-
a("td",
|
|
728
|
+
default: x(() => [a("tbody", null, [(p(!0), i(e, null, h(t.card.trail, (e, t) => (p(), i("tr", { key: t }, [
|
|
729
|
+
a("td", He, v(e.action), 1),
|
|
730
|
+
a("td", Ue, v(e.strategyName), 1),
|
|
731
|
+
a("td", We, v(fmtScore(e.score)), 1),
|
|
732
|
+
a("td", Ge, v(e.reason), 1)
|
|
723
733
|
]))), 128))])]),
|
|
724
734
|
_: 2
|
|
725
735
|
}, 1024)]))), 128)),
|
|
726
|
-
t.run.hints ? (
|
|
727
|
-
t.run.discardedTail ? (
|
|
728
|
-
o(" discarded tail: " +
|
|
729
|
-
t.run.discardedTail.scoreRange ? (
|
|
730
|
-
t.run.discardedTail.eloRange ? (
|
|
731
|
-
t.run.discardedTail.note ? (
|
|
736
|
+
t.run.hints ? (p(), i("div", Ke, [c[8] || (c[8] = a("div", { class: "text-caption font-weight-medium" }, "hints", -1)), a("pre", qe, v(JSON.stringify(t.run.hints, null, 2)), 1)])) : r("", !0),
|
|
737
|
+
t.run.discardedTail ? (p(), i("div", Je, [
|
|
738
|
+
o(" discarded tail: " + v(t.run.discardedTail.count) + " cards ", 1),
|
|
739
|
+
t.run.discardedTail.scoreRange ? (p(), i(e, { key: 0 }, [o(" · score [" + v(t.run.discardedTail.scoreRange[0].toFixed(2)) + ", " + v(t.run.discardedTail.scoreRange[1].toFixed(2)) + "] ", 1)], 64)) : r("", !0),
|
|
740
|
+
t.run.discardedTail.eloRange ? (p(), i(e, { key: 1 }, [o(" · ELO [" + v(Math.round(t.run.discardedTail.eloRange[0])) + ", " + v(Math.round(t.run.discardedTail.eloRange[1])) + "] ", 1)], 64)) : r("", !0),
|
|
741
|
+
t.run.discardedTail.note ? (p(), i("div", Ye, v(t.run.discardedTail.note), 1)) : r("", !0)
|
|
732
742
|
])) : r("", !0)
|
|
733
743
|
]);
|
|
734
744
|
};
|
|
735
745
|
}
|
|
736
|
-
}), [["__scopeId", "data-v-
|
|
746
|
+
}), [["__scopeId", "data-v-70675763"]]), Xe = { class: "d-flex align-center flex-wrap mb-4 ga-2" }, Ze = { class: "text-caption text-medium-emphasis" }, Qe = { class: "text-right" }, $e = { class: "text-right" }, et = {
|
|
737
747
|
key: 1,
|
|
738
748
|
class: "text-caption text-disabled"
|
|
739
|
-
},
|
|
749
|
+
}, tt = { class: "sk-hint-block" }, nt = { class: "sk-hint-block" }, rt = { class: "text-caption text-medium-emphasis mb-4" }, it = { class: "text-right" }, at = { class: "text-right" }, ot = { class: "text-disabled" }, st = { class: "text-right" }, ct = { class: "d-flex flex-wrap ga-5" }, lt = { class: "text-caption text-medium-emphasis" }, ut = { class: "text-h6 text-success" }, dt = { class: "text-caption text-medium-emphasis" }, ft = { class: "text-h6 text-error" }, pt = { class: "text-h6" }, mt = { class: "text-caption text-disabled" }, ht = { class: "d-flex align-center flex-wrap mb-2 ga-3" }, gt = {
|
|
740
750
|
key: 4,
|
|
741
751
|
class: "sk-timeline"
|
|
742
|
-
},
|
|
752
|
+
}, _t = { class: "sk-tl-time text-caption text-disabled" }, vt = { class: "sk-tl-gutter" }, yt = {
|
|
743
753
|
key: 0,
|
|
744
754
|
class: "sk-tl-body"
|
|
745
|
-
},
|
|
755
|
+
}, bt = { class: "d-flex align-center flex-wrap ga-1" }, xt = { class: "font-weight-medium" }, St = { class: "text-caption text-medium-emphasis ml-2" }, Ct = {
|
|
746
756
|
key: 1,
|
|
747
757
|
class: "text-caption text-error ml-2"
|
|
748
|
-
},
|
|
758
|
+
}, wt = {
|
|
749
759
|
key: 1,
|
|
750
760
|
class: "sk-tl-body"
|
|
751
|
-
},
|
|
761
|
+
}, Tt = ["title", "onClick"], Et = { class: "text-caption" }, Dt = { class: "text-caption text-medium-emphasis ml-2" }, Ot = {
|
|
752
762
|
key: 0,
|
|
753
763
|
class: "text-caption text-disabled ml-2"
|
|
754
|
-
},
|
|
764
|
+
}, X = /* @__PURE__ */ K(/* @__PURE__ */ c({
|
|
755
765
|
__name: "LearnerSessionDetail",
|
|
756
766
|
props: {
|
|
757
767
|
dataset: {},
|
|
@@ -760,29 +770,29 @@ var ee = {
|
|
|
760
770
|
},
|
|
761
771
|
emits: ["open-card"],
|
|
762
772
|
setup(c, { emit: l }) {
|
|
763
|
-
let d = c,
|
|
764
|
-
let e =
|
|
765
|
-
return !
|
|
766
|
-
}), N =
|
|
773
|
+
let d = c, f = l, _ = t(() => B(d.dataset, d.sessionId, d.interpreters)), b = t(() => _.value.summary.doc), S = t(() => z(_.value?.timeline ?? [], d.interpreters)), w = t(() => E(_.value?.timeline ?? [])), T = t(() => _.value?.timeline.filter((e) => e.kind === "response").length ?? 0), D = m("all"), j = t(() => {
|
|
774
|
+
let e = _.value?.timeline ?? [];
|
|
775
|
+
return !D.value || D.value === "all" ? e : e.filter((e) => e.kind === D.value);
|
|
776
|
+
}), N = m(/* @__PURE__ */ new Set());
|
|
767
777
|
function toggle(e) {
|
|
768
778
|
let t = new Set(N.value);
|
|
769
779
|
t.has(e) ? t.delete(e) : t.add(e), N.value = t;
|
|
770
780
|
}
|
|
771
|
-
let { copied:
|
|
781
|
+
let { copied: P, copy: F } = useCopy();
|
|
772
782
|
function asText() {
|
|
773
|
-
return
|
|
774
|
-
servedTags:
|
|
783
|
+
return _.value ? V(d.dataset.username, _.value, {
|
|
784
|
+
servedTags: S.value,
|
|
775
785
|
eloLedger: w.value
|
|
776
786
|
}, d.interpreters) : "";
|
|
777
787
|
}
|
|
778
|
-
let
|
|
779
|
-
let e =
|
|
788
|
+
let I = t(() => {
|
|
789
|
+
let e = _.value?.summary;
|
|
780
790
|
if (!e) return "";
|
|
781
|
-
let t =
|
|
782
|
-
return e.durationSeconds === null ? `— of ${t}` : `${
|
|
791
|
+
let t = A(e.doc.plannedSeconds);
|
|
792
|
+
return e.durationSeconds === null ? `— of ${t}` : `${A(e.durationSeconds)} of ${t}`;
|
|
783
793
|
});
|
|
784
794
|
function skillTags(e) {
|
|
785
|
-
return e.filter((e) =>
|
|
795
|
+
return e.filter((e) => M(d.interpreters, e)).slice(0, 3);
|
|
786
796
|
}
|
|
787
797
|
function fmtNum(e) {
|
|
788
798
|
return e === null ? "—" : Number.isInteger(e) ? String(e) : e.toFixed(1);
|
|
@@ -800,22 +810,22 @@ var ee = {
|
|
|
800
810
|
return e.kind === "run" ? "sk-tl-run" : e.isCorrect === !1 ? "sk-tl-fail" : "";
|
|
801
811
|
}
|
|
802
812
|
return (t, c) => {
|
|
803
|
-
let l =
|
|
804
|
-
return
|
|
805
|
-
a("div",
|
|
813
|
+
let l = g("v-alert"), d = g("v-chip"), m = g("v-icon"), E = g("v-spacer"), A = g("v-btn"), z = g("v-table"), B = g("v-card"), V = g("v-col"), U = g("v-row"), W = g("v-btn-toggle");
|
|
814
|
+
return p(), i("div", null, [_.value ? (p(), i(e, { key: 1 }, [
|
|
815
|
+
a("div", Xe, [
|
|
806
816
|
s(d, {
|
|
807
817
|
size: "small",
|
|
808
818
|
variant: "flat",
|
|
809
|
-
color:
|
|
819
|
+
color: y(statusColor)(b.value.status)
|
|
810
820
|
}, {
|
|
811
|
-
default:
|
|
821
|
+
default: x(() => [o(v(b.value.status), 1)]),
|
|
812
822
|
_: 1
|
|
813
823
|
}, 8, ["color"]),
|
|
814
824
|
s(d, {
|
|
815
825
|
size: "small",
|
|
816
826
|
variant: "tonal"
|
|
817
827
|
}, {
|
|
818
|
-
default:
|
|
828
|
+
default: x(() => [o(v(y(fmtTime)(b.value.startTime)), 1)]),
|
|
819
829
|
_: 1
|
|
820
830
|
}),
|
|
821
831
|
s(d, {
|
|
@@ -823,97 +833,97 @@ var ee = {
|
|
|
823
833
|
variant: "tonal",
|
|
824
834
|
color: "grey"
|
|
825
835
|
}, {
|
|
826
|
-
default:
|
|
836
|
+
default: x(() => [o(v(I.value), 1)]),
|
|
827
837
|
_: 1
|
|
828
838
|
}),
|
|
829
|
-
(
|
|
839
|
+
(p(!0), i(e, null, h(_.value.summary.flags, (e) => (p(), n(d, {
|
|
830
840
|
key: e,
|
|
831
841
|
size: "small",
|
|
832
842
|
variant: "tonal",
|
|
833
|
-
color:
|
|
834
|
-
title:
|
|
843
|
+
color: y(G)[e].color,
|
|
844
|
+
title: y(C)[e].help
|
|
835
845
|
}, {
|
|
836
|
-
default:
|
|
846
|
+
default: x(() => [s(m, {
|
|
837
847
|
start: "",
|
|
838
848
|
size: "small"
|
|
839
849
|
}, {
|
|
840
|
-
default:
|
|
850
|
+
default: x(() => [o(v(y(G)[e].icon), 1)]),
|
|
841
851
|
_: 2
|
|
842
|
-
}, 1024), o(" " +
|
|
852
|
+
}, 1024), o(" " + v(y(C)[e].label), 1)]),
|
|
843
853
|
_: 2
|
|
844
854
|
}, 1032, ["color", "title"]))), 128)),
|
|
845
|
-
s(
|
|
846
|
-
a("code",
|
|
847
|
-
s(
|
|
855
|
+
s(E),
|
|
856
|
+
a("code", Ze, v(t.sessionId), 1),
|
|
857
|
+
s(A, {
|
|
848
858
|
variant: "text",
|
|
849
859
|
size: "small",
|
|
850
|
-
"prepend-icon":
|
|
851
|
-
color:
|
|
852
|
-
onClick: c[0] || (c[0] = (e) =>
|
|
860
|
+
"prepend-icon": y(P) === "session" ? "mdi-check" : "mdi-clipboard-text-outline",
|
|
861
|
+
color: y(P) === "session" ? "success" : void 0,
|
|
862
|
+
onClick: c[0] || (c[0] = (e) => y(F)(asText(), "session"))
|
|
853
863
|
}, {
|
|
854
|
-
default:
|
|
864
|
+
default: x(() => [o(v(y(P) === "session" ? "Copied" : "Copy as text"), 1)]),
|
|
855
865
|
_: 1
|
|
856
866
|
}, 8, ["prepend-icon", "color"])
|
|
857
867
|
]),
|
|
858
|
-
|
|
868
|
+
_.value.responsesMissing ? (p(), n(l, {
|
|
859
869
|
key: 0,
|
|
860
870
|
type: "warning",
|
|
861
871
|
variant: "tonal",
|
|
862
872
|
density: "compact",
|
|
863
873
|
class: "mb-4"
|
|
864
874
|
}, {
|
|
865
|
-
default:
|
|
875
|
+
default: x(() => [o(" The session records " + v(b.value.tally?.responses) + " responses but only " + v(T.value) + " card records carry its id. The timeline is incomplete. ", 1)]),
|
|
866
876
|
_: 1
|
|
867
877
|
})) : r("", !0),
|
|
868
878
|
s(U, { class: "mb-2" }, {
|
|
869
|
-
default:
|
|
879
|
+
default: x(() => [s(V, {
|
|
870
880
|
cols: "12",
|
|
871
881
|
md: "6"
|
|
872
882
|
}, {
|
|
873
|
-
default:
|
|
883
|
+
default: x(() => [s(B, {
|
|
874
884
|
variant: "outlined",
|
|
875
885
|
class: "pa-3 h-100"
|
|
876
886
|
}, {
|
|
877
|
-
default:
|
|
887
|
+
default: x(() => [
|
|
878
888
|
c[4] || (c[4] = a("div", { class: "text-subtitle-2 mb-1" }, "Learner state", -1)),
|
|
879
889
|
c[5] || (c[5] = a("div", { class: "text-caption text-medium-emphasis mb-3" }, " What the navigator was choosing against, and what moved. ", -1)),
|
|
880
|
-
|
|
890
|
+
_.value.summary.state.length ? (p(), n(z, {
|
|
881
891
|
key: 0,
|
|
882
892
|
density: "compact",
|
|
883
893
|
class: "sk-mini-table"
|
|
884
894
|
}, {
|
|
885
|
-
default:
|
|
895
|
+
default: x(() => [c[3] || (c[3] = a("thead", null, [a("tr", null, [
|
|
886
896
|
a("th"),
|
|
887
897
|
a("th", { class: "text-right" }, "Start"),
|
|
888
898
|
a("th", { class: "text-right" }, "End"),
|
|
889
899
|
a("th", { class: "text-right" }, "Δ")
|
|
890
|
-
])], -1)), a("tbody", null, [(
|
|
891
|
-
a("td", null,
|
|
892
|
-
a("td",
|
|
893
|
-
a("td",
|
|
894
|
-
a("td", { class: u(["text-right",
|
|
900
|
+
])], -1)), a("tbody", null, [(p(!0), i(e, null, h(_.value.summary.state, (e) => (p(), i("tr", { key: e.label }, [
|
|
901
|
+
a("td", null, v(e.label), 1),
|
|
902
|
+
a("td", Qe, v(fmtNum(e.from)), 1),
|
|
903
|
+
a("td", $e, v(fmtNum(e.to)), 1),
|
|
904
|
+
a("td", { class: u(["text-right", y(deltaClass)(e.delta)]) }, v(y(k)(e.delta)), 3)
|
|
895
905
|
]))), 128))])]),
|
|
896
906
|
_: 1
|
|
897
|
-
})) : (
|
|
907
|
+
})) : (p(), i("div", et, "No state snapshot recorded."))
|
|
898
908
|
]),
|
|
899
909
|
_: 1
|
|
900
910
|
})]),
|
|
901
911
|
_: 1
|
|
902
|
-
}), s(
|
|
912
|
+
}), s(V, {
|
|
903
913
|
cols: "12",
|
|
904
914
|
md: "6"
|
|
905
915
|
}, {
|
|
906
|
-
default:
|
|
916
|
+
default: x(() => [s(B, {
|
|
907
917
|
variant: "outlined",
|
|
908
918
|
class: "pa-3 h-100"
|
|
909
919
|
}, {
|
|
910
|
-
default:
|
|
920
|
+
default: x(() => [
|
|
911
921
|
c[6] || (c[6] = a("div", { class: "text-subtitle-2 mb-1" }, "Session hints", -1)),
|
|
912
922
|
c[7] || (c[7] = a("div", { class: "text-caption text-medium-emphasis mb-3" }, " What outcome observers told the navigator. They act only through these. ", -1)),
|
|
913
923
|
c[8] || (c[8] = a("span", { class: "text-caption font-weight-medium" }, "at open", -1)),
|
|
914
|
-
a("pre",
|
|
924
|
+
a("pre", tt, v(fmtHints(b.value.config?.initHints)), 1),
|
|
915
925
|
c[9] || (c[9] = a("span", { class: "text-caption font-weight-medium" }, "at close", -1)),
|
|
916
|
-
a("pre",
|
|
926
|
+
a("pre", nt, v(fmtHints(b.value.finalHints)), 1)
|
|
917
927
|
]),
|
|
918
928
|
_: 1
|
|
919
929
|
})]),
|
|
@@ -921,212 +931,212 @@ var ee = {
|
|
|
921
931
|
})]),
|
|
922
932
|
_: 1
|
|
923
933
|
}),
|
|
924
|
-
a("div",
|
|
925
|
-
|
|
934
|
+
a("div", rt, [o(" batch limit " + v(b.value.config?.defaultBatchLimit ?? "?") + " · " + v(b.value.config?.sourceCount ?? "?") + " source(s) · opening queues supply " + v(b.value.initialQueues?.supplyQ ?? "?") + " / failed " + v(b.value.initialQueues?.failedQ ?? "?") + " ", 1), b.value.tally ? (p(), i(e, { key: 0 }, [o(" · ended with " + v(b.value.tally.failedQRemaining) + " still in the failed queue", 1)], 64)) : r("", !0)]),
|
|
935
|
+
S.value.length ? (p(), n(B, {
|
|
926
936
|
key: 1,
|
|
927
937
|
variant: "outlined",
|
|
928
938
|
class: "pa-3 mb-4"
|
|
929
939
|
}, {
|
|
930
|
-
default:
|
|
940
|
+
default: x(() => [
|
|
931
941
|
c[11] || (c[11] = a("div", { class: "text-subtitle-2 mb-1" }, "Served tags", -1)),
|
|
932
942
|
c[12] || (c[12] = a("div", { class: "text-caption text-medium-emphasis mb-2" }, " What this sitting put in front of the learner, by content tag. A response with several tags counts toward each. ", -1)),
|
|
933
|
-
s(
|
|
943
|
+
s(z, {
|
|
934
944
|
density: "compact",
|
|
935
945
|
class: "sk-mini-table"
|
|
936
946
|
}, {
|
|
937
|
-
default:
|
|
947
|
+
default: x(() => [c[10] || (c[10] = a("thead", null, [a("tr", null, [
|
|
938
948
|
a("th", null, "Tag"),
|
|
939
949
|
a("th", { class: "text-right" }, "Resp."),
|
|
940
950
|
a("th", { class: "text-right" }, "Cards"),
|
|
941
951
|
a("th", { class: "text-right" }, "Accuracy"),
|
|
942
952
|
a("th", { class: "text-right" }, "Time")
|
|
943
|
-
])], -1)), a("tbody", null, [(
|
|
944
|
-
a("td", null, [a("code", { class: u(
|
|
945
|
-
a("td",
|
|
946
|
-
a("td",
|
|
947
|
-
a("td", { class: u(["text-right",
|
|
948
|
-
a("td",
|
|
953
|
+
])], -1)), a("tbody", null, [(p(!0), i(e, null, h(S.value, (n) => (p(), i("tr", { key: n.tag }, [
|
|
954
|
+
a("td", null, [a("code", { class: u(y(M)(t.interpreters, n.tag) ? "text-primary" : "") }, v(n.tag), 3)]),
|
|
955
|
+
a("td", it, v(n.responses), 1),
|
|
956
|
+
a("td", at, v(n.cards), 1),
|
|
957
|
+
a("td", { class: u(["text-right", y(accuracyClass)(n.accuracy)]) }, [n.accuracy === null ? (p(), i(e, { key: 0 }, [o("—")], 64)) : (p(), i(e, { key: 1 }, [o(v(Math.round(n.accuracy * 100)) + "% ", 1), a("span", ot, "(" + v(n.correct) + "/" + v(n.correct + n.incorrect) + ")", 1)], 64))], 2),
|
|
958
|
+
a("td", st, v((n.totalTimeMs / 1e3).toFixed(1)) + "s", 1)
|
|
949
959
|
]))), 128))])]),
|
|
950
960
|
_: 1
|
|
951
961
|
})
|
|
952
962
|
]),
|
|
953
963
|
_: 1
|
|
954
964
|
})) : r("", !0),
|
|
955
|
-
w.value ? (
|
|
965
|
+
w.value ? (p(), n(B, {
|
|
956
966
|
key: 2,
|
|
957
967
|
variant: "outlined",
|
|
958
968
|
class: "pa-3 mb-4"
|
|
959
969
|
}, {
|
|
960
|
-
default:
|
|
970
|
+
default: x(() => [
|
|
961
971
|
c[15] || (c[15] = a("div", { class: "text-subtitle-2 mb-1" }, "ELO ledger", -1)),
|
|
962
972
|
c[16] || (c[16] = a("div", { class: "text-caption text-medium-emphasis mb-3" }, " The per-response learner global-ELO exchanges that net to the session's ELO move. Wins above the learner's level pay little; losses below it cost a lot, so a high hit rate can still net negative. ", -1)),
|
|
963
|
-
a("div",
|
|
964
|
-
a("div", null, [c[13] || (c[13] = a("div", { class: "text-caption text-medium-emphasis" }, "net", -1)), a("div", { class: u(["text-h6",
|
|
965
|
-
a("div", null, [a("div",
|
|
966
|
-
a("div", null, [a("div",
|
|
973
|
+
a("div", ct, [
|
|
974
|
+
a("div", null, [c[13] || (c[13] = a("div", { class: "text-caption text-medium-emphasis" }, "net", -1)), a("div", { class: u(["text-h6", y(deltaClass)(w.value.net)]) }, v(y(k)(w.value.net)), 3)]),
|
|
975
|
+
a("div", null, [a("div", lt, "gained · " + v(w.value.wins) + " win(s)", 1), a("div", ut, v(y(k)(w.value.gained)), 1)]),
|
|
976
|
+
a("div", null, [a("div", dt, "lost · " + v(w.value.losses) + " loss(es)", 1), a("div", ft, v(y(k)(w.value.lost)), 1)]),
|
|
967
977
|
a("div", null, [
|
|
968
978
|
c[14] || (c[14] = a("div", { class: "text-caption text-medium-emphasis" }, "exchanges", -1)),
|
|
969
|
-
a("div",
|
|
970
|
-
a("div",
|
|
979
|
+
a("div", pt, v(w.value.count), 1),
|
|
980
|
+
a("div", mt, "of " + v(T.value) + " response(s)", 1)
|
|
971
981
|
])
|
|
972
982
|
])
|
|
973
983
|
]),
|
|
974
984
|
_: 1
|
|
975
985
|
})) : r("", !0),
|
|
976
|
-
a("div",
|
|
977
|
-
modelValue:
|
|
978
|
-
"onUpdate:modelValue": c[1] || (c[1] = (e) =>
|
|
986
|
+
a("div", ht, [c[17] || (c[17] = a("h2", { class: "text-h6" }, "Timeline", -1)), s(W, {
|
|
987
|
+
modelValue: D.value,
|
|
988
|
+
"onUpdate:modelValue": c[1] || (c[1] = (e) => D.value = e),
|
|
979
989
|
density: "compact",
|
|
980
990
|
color: "primary",
|
|
981
991
|
variant: "outlined"
|
|
982
992
|
}, {
|
|
983
|
-
default:
|
|
984
|
-
s(
|
|
993
|
+
default: x(() => [
|
|
994
|
+
s(A, {
|
|
985
995
|
value: "all",
|
|
986
996
|
size: "small"
|
|
987
997
|
}, {
|
|
988
|
-
default:
|
|
998
|
+
default: x(() => [o("All (" + v(_.value.timeline.length) + ")", 1)]),
|
|
989
999
|
_: 1
|
|
990
1000
|
}),
|
|
991
|
-
s(
|
|
1001
|
+
s(A, {
|
|
992
1002
|
value: "response",
|
|
993
1003
|
size: "small"
|
|
994
1004
|
}, {
|
|
995
|
-
default:
|
|
1005
|
+
default: x(() => [o("Responses (" + v(T.value) + ")", 1)]),
|
|
996
1006
|
_: 1
|
|
997
1007
|
}),
|
|
998
|
-
s(
|
|
1008
|
+
s(A, {
|
|
999
1009
|
value: "run",
|
|
1000
1010
|
size: "small"
|
|
1001
1011
|
}, {
|
|
1002
|
-
default:
|
|
1012
|
+
default: x(() => [o("Runs (" + v(_.value.timeline.length - T.value) + ")", 1)]),
|
|
1003
1013
|
_: 1
|
|
1004
1014
|
})
|
|
1005
1015
|
]),
|
|
1006
1016
|
_: 1
|
|
1007
1017
|
}, 8, ["modelValue"])]),
|
|
1008
|
-
|
|
1018
|
+
_.value.timeline.length === 0 ? (p(), n(l, {
|
|
1009
1019
|
key: 3,
|
|
1010
1020
|
type: "info",
|
|
1011
1021
|
variant: "tonal"
|
|
1012
1022
|
}, {
|
|
1013
|
-
default:
|
|
1023
|
+
default: x(() => c[18] || (c[18] = [o("Nothing recorded for this session.")])),
|
|
1014
1024
|
_: 1
|
|
1015
|
-
})) : (
|
|
1016
|
-
key:
|
|
1025
|
+
})) : (p(), i("div", gt, [(p(!0), i(e, null, h(j.value, (l, g) => (p(), i("div", {
|
|
1026
|
+
key: g,
|
|
1017
1027
|
class: u(["sk-tl-row", rowClass(l)])
|
|
1018
1028
|
}, [
|
|
1019
|
-
a("div",
|
|
1020
|
-
a("div",
|
|
1029
|
+
a("div", _t, v(y(fmtClock)(l.at)), 1),
|
|
1030
|
+
a("div", vt, [s(m, {
|
|
1021
1031
|
size: "small",
|
|
1022
1032
|
color: entryColor(l)
|
|
1023
1033
|
}, {
|
|
1024
|
-
default:
|
|
1034
|
+
default: x(() => [o(v(entryIcon(l)), 1)]),
|
|
1025
1035
|
_: 2
|
|
1026
1036
|
}, 1032, ["color"])]),
|
|
1027
|
-
l.kind === "run" ? (
|
|
1028
|
-
a("span",
|
|
1029
|
-
l.run.mode ? (
|
|
1037
|
+
l.kind === "run" ? (p(), i("div", yt, [a("div", bt, [
|
|
1038
|
+
a("span", xt, v(l.run.label), 1),
|
|
1039
|
+
l.run.mode ? (p(), n(d, {
|
|
1030
1040
|
key: 0,
|
|
1031
1041
|
size: "x-small",
|
|
1032
1042
|
variant: "tonal"
|
|
1033
1043
|
}, {
|
|
1034
|
-
default:
|
|
1044
|
+
default: x(() => [o(v(l.run.mode), 1)]),
|
|
1035
1045
|
_: 2
|
|
1036
1046
|
}, 1024)) : r("", !0),
|
|
1037
|
-
a("span",
|
|
1038
|
-
l.run.generatedCount > 0 && l.run.finalCount === 0 ? (
|
|
1039
|
-
typeof l.run.userElo == "number" ? (
|
|
1047
|
+
a("span", St, " generated " + v(l.run.generatedCount) + " → selected " + v(l.run.finalCount) + " (" + v(l.run.newSelected) + " new, " + v(l.run.reviewsSelected) + " review) ", 1),
|
|
1048
|
+
l.run.generatedCount > 0 && l.run.finalCount === 0 ? (p(), i("span", Ct, " nothing survived ")) : r("", !0),
|
|
1049
|
+
typeof l.run.userElo == "number" ? (p(), n(d, {
|
|
1040
1050
|
key: 2,
|
|
1041
1051
|
size: "x-small",
|
|
1042
1052
|
variant: "tonal",
|
|
1043
1053
|
color: "grey",
|
|
1044
1054
|
class: "ml-2"
|
|
1045
1055
|
}, {
|
|
1046
|
-
default:
|
|
1056
|
+
default: x(() => [o(" ELO " + v(Math.round(l.run.userElo)), 1)]),
|
|
1047
1057
|
_: 2
|
|
1048
1058
|
}, 1024)) : r("", !0),
|
|
1049
|
-
s(
|
|
1050
|
-
s(
|
|
1059
|
+
s(E),
|
|
1060
|
+
s(A, {
|
|
1051
1061
|
icon: N.value.has(l.run.runId) ? "mdi-chevron-up" : "mdi-chevron-down",
|
|
1052
1062
|
size: "x-small",
|
|
1053
1063
|
variant: "text",
|
|
1054
1064
|
onClick: (e) => toggle(l.run.runId)
|
|
1055
1065
|
}, null, 8, ["icon", "onClick"]),
|
|
1056
|
-
s(
|
|
1057
|
-
icon:
|
|
1066
|
+
s(A, {
|
|
1067
|
+
icon: y(P) === l.run.runId ? "mdi-check" : "mdi-content-copy",
|
|
1058
1068
|
size: "x-small",
|
|
1059
1069
|
variant: "text",
|
|
1060
|
-
color:
|
|
1070
|
+
color: y(P) === l.run.runId ? "success" : void 0,
|
|
1061
1071
|
title: "Copy run as text",
|
|
1062
|
-
onClick: (e) =>
|
|
1072
|
+
onClick: (e) => y(F)(y(L)(l.run), l.run.runId)
|
|
1063
1073
|
}, null, 8, [
|
|
1064
1074
|
"icon",
|
|
1065
1075
|
"color",
|
|
1066
1076
|
"onClick"
|
|
1067
1077
|
])
|
|
1068
|
-
]), N.value.has(l.run.runId) ? (
|
|
1078
|
+
]), N.value.has(l.run.runId) ? (p(), n(Y, {
|
|
1069
1079
|
key: 0,
|
|
1070
1080
|
run: l.run,
|
|
1071
1081
|
class: "mt-1",
|
|
1072
|
-
onOpenCard: c[2] || (c[2] = (e) =>
|
|
1073
|
-
}, null, 8, ["run"])) : r("", !0)])) : (
|
|
1082
|
+
onOpenCard: c[2] || (c[2] = (e) => f("open-card", e))
|
|
1083
|
+
}, null, 8, ["run"])) : r("", !0)])) : (p(), i("div", wt, [
|
|
1074
1084
|
a("a", {
|
|
1075
1085
|
class: "sk-card-link",
|
|
1076
1086
|
title: `Open ${l.cardId} in card history`,
|
|
1077
|
-
onClick: (e) =>
|
|
1078
|
-
}, [o(
|
|
1079
|
-
(
|
|
1087
|
+
onClick: (e) => f("open-card", l.cardId)
|
|
1088
|
+
}, [o(v(l.questionType ?? "card") + " ", 1), a("code", Et, v(y(shortId)(l.cardId)), 1)], 8, Tt),
|
|
1089
|
+
(p(!0), i(e, null, h(skillTags(l.tags), (e) => (p(), n(d, {
|
|
1080
1090
|
key: e,
|
|
1081
1091
|
size: "x-small",
|
|
1082
1092
|
variant: "outlined",
|
|
1083
1093
|
color: "primary",
|
|
1084
1094
|
class: "ml-1"
|
|
1085
1095
|
}, {
|
|
1086
|
-
default:
|
|
1096
|
+
default: x(() => [o(v(y(H)(t.interpreters, e)), 1)]),
|
|
1087
1097
|
_: 2
|
|
1088
1098
|
}, 1024))), 128)),
|
|
1089
|
-
a("span",
|
|
1090
|
-
l.userAnswer == null ? r("", !0) : (
|
|
1091
|
-
l.elo ? (
|
|
1099
|
+
a("span", Dt, [o(v((l.timeSpentMs / 1e3).toFixed(1)) + "s ", 1), l.priorAttempts ? (p(), i(e, { key: 0 }, [o(" · attempt " + v(l.priorAttempts + 1), 1)], 64)) : r("", !0)]),
|
|
1100
|
+
l.userAnswer == null ? r("", !0) : (p(), i("span", Ot, "“" + v(y(O)(l.userAnswer)) + "”", 1)),
|
|
1101
|
+
l.elo ? (p(), i(e, { key: 1 }, [s(d, {
|
|
1092
1102
|
size: "x-small",
|
|
1093
1103
|
variant: "tonal",
|
|
1094
|
-
color:
|
|
1104
|
+
color: y(deltaColor)(l.elo.global.delta),
|
|
1095
1105
|
class: "ml-2",
|
|
1096
1106
|
title: `learner global ELO ${l.elo.global.before} → ${l.elo.global.after} · userScore ${l.elo.userScore.toFixed(2)}`
|
|
1097
1107
|
}, {
|
|
1098
|
-
default:
|
|
1108
|
+
default: x(() => [o(" ELO " + v(y(k)(l.elo.global.delta)), 1)]),
|
|
1099
1109
|
_: 2
|
|
1100
|
-
}, 1032, ["color", "title"]), (
|
|
1110
|
+
}, 1032, ["color", "title"]), (p(!0), i(e, null, h(y(R)(l.elo), (e) => (p(), n(d, {
|
|
1101
1111
|
key: e.tag,
|
|
1102
1112
|
size: "x-small",
|
|
1103
1113
|
variant: "text",
|
|
1104
|
-
color:
|
|
1114
|
+
color: y(deltaColor)(e.delta),
|
|
1105
1115
|
class: "sk-elo-tag",
|
|
1106
1116
|
title: `${e.tag}: ${e.before} → ${e.after} (score ${e.score?.toFixed(2)})`
|
|
1107
1117
|
}, {
|
|
1108
|
-
default:
|
|
1118
|
+
default: x(() => [o(v(y(H)(t.interpreters, e.tag)) + " " + v(y(k)(e.delta)), 1)]),
|
|
1109
1119
|
_: 2
|
|
1110
1120
|
}, 1032, ["color", "title"]))), 128))], 64)) : r("", !0)
|
|
1111
1121
|
]))
|
|
1112
1122
|
], 2))), 128))]))
|
|
1113
|
-
], 64)) : (
|
|
1123
|
+
], 64)) : (p(), n(l, {
|
|
1114
1124
|
key: 0,
|
|
1115
1125
|
type: "info",
|
|
1116
1126
|
variant: "tonal"
|
|
1117
1127
|
}, {
|
|
1118
|
-
default:
|
|
1128
|
+
default: x(() => [o("No session with id " + v(t.sessionId) + ".", 1)]),
|
|
1119
1129
|
_: 1
|
|
1120
1130
|
}))]);
|
|
1121
1131
|
};
|
|
1122
1132
|
}
|
|
1123
|
-
}), [["__scopeId", "data-v-36c9215c"]]),
|
|
1133
|
+
}), [["__scopeId", "data-v-36c9215c"]]), kt = { class: "text-h6" }, At = { class: "text-caption" }, jt = { class: "d-flex align-center flex-wrap mb-3 ga-3" }, Mt = ["onClick"], Nt = { class: "text-no-wrap" }, Pt = { class: "text-right" }, Ft = { class: "text-right" }, It = {
|
|
1124
1134
|
key: 1,
|
|
1125
1135
|
class: "text-disabled"
|
|
1126
|
-
},
|
|
1136
|
+
}, Lt = { class: "text-right" }, Rt = { class: "text-no-wrap text-caption" }, zt = { class: "text-no-wrap text-caption" }, Bt = { key: 0 }, Vt = {
|
|
1127
1137
|
key: 0,
|
|
1128
1138
|
class: "text-disabled"
|
|
1129
|
-
},
|
|
1139
|
+
}, Ht = { class: "text-right" }, Z = /* @__PURE__ */ K(/* @__PURE__ */ c({
|
|
1130
1140
|
__name: "LearnerSessionList",
|
|
1131
1141
|
props: {
|
|
1132
1142
|
dataset: {},
|
|
@@ -1134,15 +1144,15 @@ var ee = {
|
|
|
1134
1144
|
},
|
|
1135
1145
|
emits: ["open"],
|
|
1136
1146
|
setup(c, { emit: l }) {
|
|
1137
|
-
let d = c,
|
|
1147
|
+
let d = c, f = l, _ = t(() => U(d.dataset, d.interpreters)), b = m("all"), S = t(() => {
|
|
1138
1148
|
let e = /* @__PURE__ */ new Map();
|
|
1139
|
-
for (let t of
|
|
1149
|
+
for (let t of _.value) for (let n of t.flags) e.set(n, (e.get(n) ?? 0) + 1);
|
|
1140
1150
|
return [...e.entries()].map(([e, t]) => ({
|
|
1141
1151
|
flag: e,
|
|
1142
1152
|
count: t
|
|
1143
1153
|
})).sort((e, t) => t.count - e.count);
|
|
1144
|
-
}), w = t(() => !
|
|
1145
|
-
let e =
|
|
1154
|
+
}), w = t(() => !b.value || b.value === "all" ? _.value : _.value.filter((e) => e.flags.includes(b.value))), T = t(() => {
|
|
1155
|
+
let e = _.value, t = e.filter((e) => e.doc.status === "closed").length, n = e.reduce((e, t) => e + (t.doc.tally?.responses ?? 0), 0), r = e.reduce((e, t) => e + (t.doc.tally?.correct ?? 0), 0), i = e.reduce((e, t) => e + (t.durationSeconds ?? 0), 0);
|
|
1146
1156
|
return [
|
|
1147
1157
|
{
|
|
1148
1158
|
label: "sessions",
|
|
@@ -1171,7 +1181,7 @@ var ee = {
|
|
|
1171
1181
|
},
|
|
1172
1182
|
{
|
|
1173
1183
|
label: "time studied",
|
|
1174
|
-
value:
|
|
1184
|
+
value: A(i),
|
|
1175
1185
|
color: "grey"
|
|
1176
1186
|
}
|
|
1177
1187
|
];
|
|
@@ -1192,83 +1202,83 @@ var ee = {
|
|
|
1192
1202
|
return t;
|
|
1193
1203
|
}
|
|
1194
1204
|
function clockText(e) {
|
|
1195
|
-
let t =
|
|
1196
|
-
return e.durationSeconds === null ? `— of ${t}` : `${
|
|
1205
|
+
let t = A(e.doc.plannedSeconds);
|
|
1206
|
+
return e.durationSeconds === null ? `— of ${t}` : `${A(e.durationSeconds)} of ${t}`;
|
|
1197
1207
|
}
|
|
1198
1208
|
return (t, c) => {
|
|
1199
|
-
let l =
|
|
1200
|
-
return
|
|
1209
|
+
let l = g("v-card"), d = g("v-col"), m = g("v-row"), E = g("v-btn"), D = g("v-icon"), O = g("v-btn-toggle"), A = g("v-alert"), j = g("v-chip"), M = g("v-table");
|
|
1210
|
+
return p(), i("div", null, [
|
|
1201
1211
|
c[4] || (c[4] = a("p", { class: "text-caption text-medium-emphasis mb-4" }, [
|
|
1202
1212
|
o(" One row per sitting. Flags name a specific way the session failed to do its job; open one to read its interleaved timeline of responses and pipeline runs. "),
|
|
1203
1213
|
a("strong", null, "Δ"),
|
|
1204
1214
|
o(" is movement across the session: ELO, then any progress metrics the course declares. ")
|
|
1205
1215
|
], -1)),
|
|
1206
|
-
s(
|
|
1216
|
+
s(m, {
|
|
1207
1217
|
dense: "",
|
|
1208
1218
|
class: "mb-2"
|
|
1209
1219
|
}, {
|
|
1210
|
-
default:
|
|
1220
|
+
default: x(() => [(p(!0), i(e, null, h(T.value, (e) => (p(), n(d, {
|
|
1211
1221
|
key: e.label,
|
|
1212
1222
|
cols: "6",
|
|
1213
1223
|
sm: "4",
|
|
1214
1224
|
md: "2"
|
|
1215
1225
|
}, {
|
|
1216
|
-
default:
|
|
1226
|
+
default: x(() => [s(l, {
|
|
1217
1227
|
variant: "tonal",
|
|
1218
1228
|
color: e.color,
|
|
1219
1229
|
class: "pa-2 text-center"
|
|
1220
1230
|
}, {
|
|
1221
|
-
default:
|
|
1231
|
+
default: x(() => [a("div", kt, v(e.value), 1), a("div", At, v(e.label), 1)]),
|
|
1222
1232
|
_: 2
|
|
1223
1233
|
}, 1032, ["color"])]),
|
|
1224
1234
|
_: 2
|
|
1225
1235
|
}, 1024))), 128))]),
|
|
1226
1236
|
_: 1
|
|
1227
1237
|
}),
|
|
1228
|
-
a("div",
|
|
1229
|
-
modelValue:
|
|
1230
|
-
"onUpdate:modelValue": c[0] || (c[0] = (e) =>
|
|
1238
|
+
a("div", jt, [s(O, {
|
|
1239
|
+
modelValue: b.value,
|
|
1240
|
+
"onUpdate:modelValue": c[0] || (c[0] = (e) => b.value = e),
|
|
1231
1241
|
density: "compact",
|
|
1232
1242
|
color: "primary",
|
|
1233
1243
|
variant: "outlined"
|
|
1234
1244
|
}, {
|
|
1235
|
-
default:
|
|
1245
|
+
default: x(() => [s(E, {
|
|
1236
1246
|
value: "all",
|
|
1237
1247
|
size: "small"
|
|
1238
1248
|
}, {
|
|
1239
|
-
default:
|
|
1249
|
+
default: x(() => [o("All (" + v(_.value.length) + ")", 1)]),
|
|
1240
1250
|
_: 1
|
|
1241
|
-
}), (
|
|
1251
|
+
}), (p(!0), i(e, null, h(S.value, (e) => (p(), n(E, {
|
|
1242
1252
|
key: e.flag,
|
|
1243
1253
|
value: e.flag,
|
|
1244
1254
|
size: "small",
|
|
1245
|
-
title:
|
|
1255
|
+
title: y(C)[e.flag].help
|
|
1246
1256
|
}, {
|
|
1247
|
-
default:
|
|
1257
|
+
default: x(() => [s(D, {
|
|
1248
1258
|
start: "",
|
|
1249
1259
|
size: "small",
|
|
1250
|
-
color:
|
|
1260
|
+
color: y(G)[e.flag].color
|
|
1251
1261
|
}, {
|
|
1252
|
-
default:
|
|
1262
|
+
default: x(() => [o(v(y(G)[e.flag].icon), 1)]),
|
|
1253
1263
|
_: 2
|
|
1254
|
-
}, 1032, ["color"]), o(" " +
|
|
1264
|
+
}, 1032, ["color"]), o(" " + v(y(C)[e.flag].label) + " (" + v(e.count) + ") ", 1)]),
|
|
1255
1265
|
_: 2
|
|
1256
1266
|
}, 1032, ["value", "title"]))), 128))]),
|
|
1257
1267
|
_: 1
|
|
1258
1268
|
}, 8, ["modelValue"])]),
|
|
1259
|
-
|
|
1269
|
+
_.value.length === 0 ? (p(), n(A, {
|
|
1260
1270
|
key: 0,
|
|
1261
1271
|
type: "info",
|
|
1262
1272
|
variant: "tonal"
|
|
1263
1273
|
}, {
|
|
1264
|
-
default:
|
|
1274
|
+
default: x(() => c[1] || (c[1] = [o(" No study sessions recorded. Session records began with a framework release; there is no backfill, so earlier activity shows only in card history. ")])),
|
|
1265
1275
|
_: 1
|
|
1266
|
-
})) : (
|
|
1276
|
+
})) : (p(), n(M, {
|
|
1267
1277
|
key: 1,
|
|
1268
1278
|
density: "compact",
|
|
1269
1279
|
class: "sk-admin-table"
|
|
1270
1280
|
}, {
|
|
1271
|
-
default:
|
|
1281
|
+
default: x(() => [c[3] || (c[3] = a("thead", null, [a("tr", null, [
|
|
1272
1282
|
a("th", null, "Started"),
|
|
1273
1283
|
a("th", null, "Status"),
|
|
1274
1284
|
a("th", { class: "text-right" }, "Cards"),
|
|
@@ -1278,117 +1288,465 @@ var ee = {
|
|
|
1278
1288
|
a("th", null, "Δ"),
|
|
1279
1289
|
a("th", null, "Flags"),
|
|
1280
1290
|
a("th")
|
|
1281
|
-
])], -1)), a("tbody", null, [(
|
|
1291
|
+
])], -1)), a("tbody", null, [(p(!0), i(e, null, h(w.value, (t) => (p(), i("tr", {
|
|
1282
1292
|
key: t.doc.sessionId,
|
|
1283
1293
|
class: "sk-admin-row",
|
|
1284
|
-
onClick: (e) =>
|
|
1294
|
+
onClick: (e) => f("open", t.doc.sessionId)
|
|
1285
1295
|
}, [
|
|
1286
|
-
a("td",
|
|
1296
|
+
a("td", Nt, v(y(fmtTime)(t.doc.startTime)), 1),
|
|
1287
1297
|
a("td", null, [s(j, {
|
|
1288
1298
|
size: "x-small",
|
|
1289
1299
|
variant: "flat",
|
|
1290
|
-
color:
|
|
1300
|
+
color: y(statusColor)(t.doc.status)
|
|
1291
1301
|
}, {
|
|
1292
|
-
default:
|
|
1302
|
+
default: x(() => [o(v(t.doc.status), 1)]),
|
|
1293
1303
|
_: 2
|
|
1294
1304
|
}, 1032, ["color"])]),
|
|
1295
|
-
a("td",
|
|
1296
|
-
a("td",
|
|
1305
|
+
a("td", Pt, v(t.doc.tally?.cardsPresented ?? "—"), 1),
|
|
1306
|
+
a("td", Ft, [t.accuracy === null ? (p(), i("span", It, "—")) : (p(), i("span", {
|
|
1297
1307
|
key: 0,
|
|
1298
|
-
class: u(
|
|
1299
|
-
},
|
|
1300
|
-
a("td",
|
|
1301
|
-
a("td",
|
|
1302
|
-
a("td",
|
|
1303
|
-
a("td", null, [(
|
|
1308
|
+
class: u(y(accuracyClass)(t.accuracy))
|
|
1309
|
+
}, v(Math.round(t.accuracy * 100)) + "% ", 3))]),
|
|
1310
|
+
a("td", Lt, v(t.doc.runs?.length ?? 0), 1),
|
|
1311
|
+
a("td", Rt, v(clockText(t)), 1),
|
|
1312
|
+
a("td", zt, [(p(!0), i(e, null, h(deltas(t), (t, n) => (p(), i(e, { key: t.label }, [n > 0 ? (p(), i("span", Bt, " · ")) : r("", !0), a("span", { class: u(y(deltaClass)(t.delta)) }, v(y(k)(t.delta)) + "\xA0" + v(t.label), 3)], 64))), 128)), deltas(t).length === 0 ? (p(), i("span", Vt, "—")) : r("", !0)]),
|
|
1313
|
+
a("td", null, [(p(!0), i(e, null, h(t.flags, (e) => (p(), n(D, {
|
|
1304
1314
|
key: e,
|
|
1305
1315
|
size: "small",
|
|
1306
1316
|
class: "mr-1",
|
|
1307
|
-
color:
|
|
1308
|
-
title: `${
|
|
1317
|
+
color: y(G)[e].color,
|
|
1318
|
+
title: `${y(C)[e].label}: ${y(C)[e].help}`
|
|
1309
1319
|
}, {
|
|
1310
|
-
default:
|
|
1320
|
+
default: x(() => [o(v(y(G)[e].icon), 1)]),
|
|
1311
1321
|
_: 2
|
|
1312
1322
|
}, 1032, ["color", "title"]))), 128))]),
|
|
1313
|
-
a("td",
|
|
1323
|
+
a("td", Ht, [s(D, {
|
|
1314
1324
|
size: "small",
|
|
1315
1325
|
class: "text-disabled"
|
|
1316
1326
|
}, {
|
|
1317
|
-
default:
|
|
1327
|
+
default: x(() => c[2] || (c[2] = [o("mdi-chevron-right")])),
|
|
1318
1328
|
_: 1
|
|
1319
1329
|
})])
|
|
1320
|
-
], 8,
|
|
1330
|
+
], 8, Mt))), 128))])]),
|
|
1321
1331
|
_: 1
|
|
1322
1332
|
}))
|
|
1323
1333
|
]);
|
|
1324
1334
|
};
|
|
1325
1335
|
}
|
|
1326
|
-
}), [["__scopeId", "data-v-5c46cc58"]]),
|
|
1336
|
+
}), [["__scopeId", "data-v-5c46cc58"]]), Ut = { class: "sk-pipeline" }, Wt = { class: "d-flex flex-wrap align-center ga-2 mb-3" }, Gt = { class: "text-caption" }, Kt = {
|
|
1337
|
+
key: 0,
|
|
1338
|
+
class: "text-caption text-medium-emphasis"
|
|
1339
|
+
}, qt = { class: "sk-stage" }, Jt = { class: "d-flex align-center mb-1" }, Yt = { class: "sk-stage-num" }, Xt = { class: "font-weight-medium" }, Zt = { class: "text-caption text-medium-emphasis mb-2" }, Qt = { class: "d-flex flex-wrap align-center ga-2" }, $t = { class: "font-weight-medium" }, en = { class: "text-caption" }, tn = {
|
|
1340
|
+
key: 0,
|
|
1341
|
+
class: "text-caption mt-1"
|
|
1342
|
+
}, nn = {
|
|
1343
|
+
key: 1,
|
|
1344
|
+
class: "text-caption mt-1"
|
|
1345
|
+
}, rn = {
|
|
1346
|
+
key: 1,
|
|
1347
|
+
class: "text-medium-emphasis"
|
|
1348
|
+
}, an = {
|
|
1349
|
+
key: 2,
|
|
1350
|
+
class: "mt-1"
|
|
1351
|
+
}, on = ["onClick"], sn = {
|
|
1352
|
+
key: 0,
|
|
1353
|
+
class: "sk-config"
|
|
1354
|
+
}, cn = {
|
|
1355
|
+
key: 0,
|
|
1356
|
+
class: "text-caption text-medium-emphasis"
|
|
1357
|
+
}, ln = { class: "d-flex flex-wrap align-center ga-2" }, un = { class: "font-weight-medium" }, dn = { class: "text-caption" }, fn = {
|
|
1358
|
+
key: 0,
|
|
1359
|
+
class: "text-caption mt-1"
|
|
1360
|
+
}, pn = {
|
|
1361
|
+
key: 1,
|
|
1362
|
+
class: "text-caption mt-1 text-medium-emphasis"
|
|
1363
|
+
}, mn = {
|
|
1364
|
+
key: 2,
|
|
1365
|
+
class: "mt-1"
|
|
1366
|
+
}, hn = { class: "sk-impact-bar" }, gn = ["title"], _n = { class: "text-caption" }, vn = {
|
|
1367
|
+
key: 1,
|
|
1368
|
+
class: "text-caption text-medium-emphasis"
|
|
1369
|
+
}, yn = {
|
|
1370
|
+
key: 3,
|
|
1371
|
+
class: "mt-1"
|
|
1372
|
+
}, bn = ["onClick"], Q = {
|
|
1373
|
+
key: 0,
|
|
1374
|
+
class: "sk-config"
|
|
1375
|
+
}, xn = { class: "sk-nav" }, Sn = { class: "d-flex flex-wrap align-center ga-2" }, Cn = { class: "text-caption mt-1" }, wn = {
|
|
1376
|
+
key: 0,
|
|
1377
|
+
class: "text-caption mt-1"
|
|
1378
|
+
}, Tn = { class: "sk-nav" }, En = { class: "d-flex flex-wrap align-center ga-2" }, Dn = { class: "text-caption mt-1" }, On = {
|
|
1379
|
+
key: 0,
|
|
1380
|
+
class: "text-caption mt-1"
|
|
1381
|
+
}, kn = {
|
|
1382
|
+
key: 0,
|
|
1383
|
+
class: "text-caption text-medium-emphasis"
|
|
1384
|
+
}, An = {
|
|
1385
|
+
key: 3,
|
|
1386
|
+
class: "text-caption"
|
|
1387
|
+
}, jn = {
|
|
1388
|
+
key: 0,
|
|
1389
|
+
class: "sk-stage-arrow"
|
|
1390
|
+
}, Mn = {
|
|
1391
|
+
key: 0,
|
|
1392
|
+
class: "text-caption text-medium-emphasis mt-3"
|
|
1393
|
+
}, $ = /* @__PURE__ */ K(/* @__PURE__ */ c({
|
|
1394
|
+
__name: "PipelineOverview",
|
|
1395
|
+
props: {
|
|
1396
|
+
strategies: {},
|
|
1397
|
+
courseId: {},
|
|
1398
|
+
stats: {},
|
|
1399
|
+
statsLabel: {}
|
|
1400
|
+
},
|
|
1401
|
+
setup(c) {
|
|
1402
|
+
let l = c, f = {
|
|
1403
|
+
"strategy-doc": {
|
|
1404
|
+
label: "strategy doc",
|
|
1405
|
+
color: "primary"
|
|
1406
|
+
},
|
|
1407
|
+
"assembler-default": {
|
|
1408
|
+
label: "added by the assembler",
|
|
1409
|
+
color: "secondary"
|
|
1410
|
+
},
|
|
1411
|
+
"default-pipeline": {
|
|
1412
|
+
label: "default pipeline",
|
|
1413
|
+
color: "warning"
|
|
1414
|
+
}
|
|
1415
|
+
}, regStat = (e) => l.stats?.regulators.find((t) => t.name === e);
|
|
1416
|
+
function regStatText(e) {
|
|
1417
|
+
return `In these runs: active (×>1) in ${e.runsActive}/${e.runs}, mean ×${e.meanMultiplier.toFixed(2)}, max ×${e.maxMultiplier.toFixed(2)}. Last: ${I(e.last)}.`;
|
|
1418
|
+
}
|
|
1419
|
+
let _ = {
|
|
1420
|
+
gate: "Gate: its penalties mean not ready yet; regulators will not lift what it penalized.",
|
|
1421
|
+
signal: "Signal: its penalties express preference."
|
|
1422
|
+
};
|
|
1423
|
+
function filterKind(e) {
|
|
1424
|
+
let t = e.kind ?? filterStat(e.name)?.kind;
|
|
1425
|
+
return t ? {
|
|
1426
|
+
kind: t,
|
|
1427
|
+
label: t,
|
|
1428
|
+
help: _[t]
|
|
1429
|
+
} : {
|
|
1430
|
+
kind: "gate",
|
|
1431
|
+
label: "gate (undeclared)",
|
|
1432
|
+
help: `${_.gate} Its class declares no kind, so it counts as a gate.`
|
|
1433
|
+
};
|
|
1434
|
+
}
|
|
1435
|
+
let b = t(() => ee(l.strategies, l.courseId)), S = t(() => new Map((l.stats?.generators ?? []).map((e) => [e.name, e]))), C = t(() => new Map((l.stats?.filters ?? []).map((e) => [e.name, e]))), genStat = (e) => S.value.get(e), filterStat = (e) => C.value.get(e), w = t(() => {
|
|
1436
|
+
let e = [...b.value.notes], t = l.stats;
|
|
1437
|
+
if (!t) return e;
|
|
1438
|
+
for (let t of b.value.filters) {
|
|
1439
|
+
let n = filterStat(t.name);
|
|
1440
|
+
n && n.boosted + n.penalized + n.removed === 0 && e.push(`${t.name} changed no candidate's score in ${n.runs} runs.`);
|
|
1441
|
+
}
|
|
1442
|
+
if (t.runsWithSelection > 0) for (let t of b.value.generators) {
|
|
1443
|
+
let n = genStat(t.name);
|
|
1444
|
+
n && n.runs > 0 && n.selected === 0 && e.push(`${t.name} proposed candidates in ${n.runs} runs, and none was selected.`);
|
|
1445
|
+
}
|
|
1446
|
+
return e;
|
|
1447
|
+
});
|
|
1448
|
+
function accuracyOf(e) {
|
|
1449
|
+
return e.firstAttempts > 0 ? e.firstAttemptsCorrect / e.firstAttempts : null;
|
|
1450
|
+
}
|
|
1451
|
+
function impactParts(e) {
|
|
1452
|
+
let t = e.boosted + e.penalized + e.passed + e.removed || 1;
|
|
1453
|
+
return [
|
|
1454
|
+
{
|
|
1455
|
+
key: "boosted",
|
|
1456
|
+
count: e.boosted,
|
|
1457
|
+
color: "success"
|
|
1458
|
+
},
|
|
1459
|
+
{
|
|
1460
|
+
key: "penalized",
|
|
1461
|
+
count: e.penalized,
|
|
1462
|
+
color: "warning"
|
|
1463
|
+
},
|
|
1464
|
+
{
|
|
1465
|
+
key: "passed",
|
|
1466
|
+
count: e.passed,
|
|
1467
|
+
color: "grey"
|
|
1468
|
+
},
|
|
1469
|
+
{
|
|
1470
|
+
key: "removed",
|
|
1471
|
+
count: e.removed,
|
|
1472
|
+
color: "error"
|
|
1473
|
+
}
|
|
1474
|
+
].map((e) => ({
|
|
1475
|
+
...e,
|
|
1476
|
+
share: e.count / t
|
|
1477
|
+
}));
|
|
1478
|
+
}
|
|
1479
|
+
function fmtNum(e) {
|
|
1480
|
+
return e >= 10 ? Math.round(e).toString() : e.toFixed(1);
|
|
1481
|
+
}
|
|
1482
|
+
function fmtPct(e) {
|
|
1483
|
+
return e === 0 ? "0%" : e < .01 ? "<1%" : `${Math.round(e * 100)}%`;
|
|
1484
|
+
}
|
|
1485
|
+
let T = m(/* @__PURE__ */ new Set());
|
|
1486
|
+
function toggleConfig(e) {
|
|
1487
|
+
let t = new Set(T.value);
|
|
1488
|
+
t.has(e) ? t.delete(e) : t.add(e), T.value = t;
|
|
1489
|
+
}
|
|
1490
|
+
function prettyConfig(e) {
|
|
1491
|
+
if (!e) return "";
|
|
1492
|
+
try {
|
|
1493
|
+
let t = JSON.parse(e), n = JSON.stringify(t, null, 2);
|
|
1494
|
+
return n === "{}" ? "" : n;
|
|
1495
|
+
} catch {
|
|
1496
|
+
return e;
|
|
1497
|
+
}
|
|
1498
|
+
}
|
|
1499
|
+
return (t, c) => {
|
|
1500
|
+
let l = g("v-chip"), m = g("v-alert"), _ = g("v-icon");
|
|
1501
|
+
return p(), i("div", Ut, [
|
|
1502
|
+
a("div", Wt, [
|
|
1503
|
+
s(l, {
|
|
1504
|
+
size: "small",
|
|
1505
|
+
variant: "tonal",
|
|
1506
|
+
color: b.value.kind === "default" ? "warning" : "primary"
|
|
1507
|
+
}, {
|
|
1508
|
+
default: x(() => [o(v(b.value.kind === "default" ? "default pipeline: the course has no strategy docs" : "assembled from strategy docs"), 1)]),
|
|
1509
|
+
_: 1
|
|
1510
|
+
}, 8, ["color"]),
|
|
1511
|
+
a("span", Gt, v(b.value.generators.length) + " generator(s) · " + v(b.value.filters.length) + " filter(s) ", 1),
|
|
1512
|
+
t.stats ? (p(), i("span", Kt, " · run stats" + v(t.statsLabel ? ` for ${t.statsLabel}` : "") + ": " + v(t.stats.runs) + " runs over " + v(t.stats.sessions) + " sessions, " + v(y(fmtTime)(t.stats.firstRunAt)) + " – " + v(y(fmtTime)(t.stats.lastRunAt)), 1)) : r("", !0)
|
|
1513
|
+
]),
|
|
1514
|
+
(p(!0), i(e, null, h(b.value.skipped, (e) => (p(), n(m, {
|
|
1515
|
+
key: e.strategy._id,
|
|
1516
|
+
type: "warning",
|
|
1517
|
+
variant: "tonal",
|
|
1518
|
+
density: "compact",
|
|
1519
|
+
class: "mb-2"
|
|
1520
|
+
}, {
|
|
1521
|
+
default: x(() => [
|
|
1522
|
+
a("strong", null, v(e.strategy.name), 1),
|
|
1523
|
+
c[0] || (c[0] = o(" (")),
|
|
1524
|
+
a("code", null, v(e.strategy.implementingClass), 1),
|
|
1525
|
+
o(") is " + v(e.reason) + " in this app, so it would not run here. A course's own navigators only plan correctly in the app that registers them. ", 1)
|
|
1526
|
+
]),
|
|
1527
|
+
_: 2
|
|
1528
|
+
}, 1024))), 128)),
|
|
1529
|
+
(p(!0), i(e, null, h(b.value.warnings, (e) => (p(), n(m, {
|
|
1530
|
+
key: e,
|
|
1531
|
+
type: "warning",
|
|
1532
|
+
variant: "tonal",
|
|
1533
|
+
density: "compact",
|
|
1534
|
+
class: "mb-2"
|
|
1535
|
+
}, {
|
|
1536
|
+
default: x(() => [o(v(e), 1)]),
|
|
1537
|
+
_: 2
|
|
1538
|
+
}, 1024))), 128)),
|
|
1539
|
+
(p(!0), i(e, null, h(w.value, (e) => (p(), n(m, {
|
|
1540
|
+
key: e,
|
|
1541
|
+
type: "info",
|
|
1542
|
+
variant: "tonal",
|
|
1543
|
+
density: "compact",
|
|
1544
|
+
class: "mb-2"
|
|
1545
|
+
}, {
|
|
1546
|
+
default: x(() => [o(v(e), 1)]),
|
|
1547
|
+
_: 2
|
|
1548
|
+
}, 1024))), 128)),
|
|
1549
|
+
(p(!0), i(e, null, h(y(W), (m, g) => (p(), i("div", { key: m.key }, [a("div", qt, [
|
|
1550
|
+
a("div", Jt, [a("span", Yt, v(g + 1), 1), a("span", Xt, v(m.title), 1)]),
|
|
1551
|
+
a("div", Zt, v(m.summary), 1),
|
|
1552
|
+
m.key === "generate" ? (p(!0), i(e, { key: 0 }, h(b.value.generators, (n) => (p(), i("div", {
|
|
1553
|
+
key: n.name,
|
|
1554
|
+
class: "sk-nav"
|
|
1555
|
+
}, [
|
|
1556
|
+
a("div", Qt, [
|
|
1557
|
+
a("span", $t, v(n.name), 1),
|
|
1558
|
+
a("code", en, v(n.implementingClass), 1),
|
|
1559
|
+
s(l, {
|
|
1560
|
+
size: "x-small",
|
|
1561
|
+
variant: "outlined",
|
|
1562
|
+
color: f[n.origin].color
|
|
1563
|
+
}, {
|
|
1564
|
+
default: x(() => [o(v(f[n.origin].label), 1)]),
|
|
1565
|
+
_: 2
|
|
1566
|
+
}, 1032, ["color"])
|
|
1567
|
+
]),
|
|
1568
|
+
n.strategy?.description ? (p(), i("div", tn, v(n.strategy.description), 1)) : r("", !0),
|
|
1569
|
+
t.stats ? (p(), i("div", nn, [genStat(n.name) ? (p(), i(e, { key: 0 }, [o(v(fmtNum(genStat(n.name).meanCards)) + " candidates/run (" + v(fmtNum(genStat(n.name).meanNew)) + " new, " + v(fmtNum(genStat(n.name).meanReview)) + " review) · top score " + v(genStat(n.name).topScoreLast.toFixed(2)) + " last, " + v(genStat(n.name).topScoreMax.toFixed(2)) + " max ", 1), t.stats.runsWithSelection > 0 ? (p(), i(e, { key: 0 }, [
|
|
1570
|
+
c[1] || (c[1] = o(" · ")),
|
|
1571
|
+
a("strong", null, v(genStat(n.name).selected), 1),
|
|
1572
|
+
c[2] || (c[2] = o(" selected ")),
|
|
1573
|
+
genStat(n.name).firstAttempts > 0 ? (p(), i(e, { key: 0 }, [o(" · first attempts " + v(genStat(n.name).firstAttemptsCorrect) + "/" + v(genStat(n.name).firstAttempts) + " correct ", 1), a("span", { class: u(y(accuracyClass)(accuracyOf(genStat(n.name)))) }, " (" + v(Math.round(100 * accuracyOf(genStat(n.name)))) + "%) ", 3)], 64)) : r("", !0)
|
|
1574
|
+
], 64)) : r("", !0)], 64)) : (p(), i("span", rn, "absent from these runs"))])) : r("", !0),
|
|
1575
|
+
prettyConfig(n.strategy?.serializedData) ? (p(), i("div", an, [a("a", {
|
|
1576
|
+
class: "sk-config-link text-caption",
|
|
1577
|
+
onClick: (e) => toggleConfig(`g:${n.name}`)
|
|
1578
|
+
}, v(T.value.has(`g:${n.name}`) ? "Hide" : "Show") + " config ", 9, on), T.value.has(`g:${n.name}`) ? (p(), i("pre", sn, v(prettyConfig(n.strategy?.serializedData)), 1)) : r("", !0)])) : r("", !0)
|
|
1579
|
+
]))), 128)) : m.key === "filter" ? (p(), i(e, { key: 1 }, [b.value.filters.length === 0 ? (p(), i("div", cn, "No filters.")) : r("", !0), (p(!0), i(e, null, h(b.value.filters, (m) => (p(), i("div", {
|
|
1580
|
+
key: m.name,
|
|
1581
|
+
class: "sk-nav"
|
|
1582
|
+
}, [
|
|
1583
|
+
a("div", ln, [
|
|
1584
|
+
a("span", un, v(m.name), 1),
|
|
1585
|
+
a("code", dn, v(m.implementingClass), 1),
|
|
1586
|
+
s(l, {
|
|
1587
|
+
size: "x-small",
|
|
1588
|
+
variant: "outlined",
|
|
1589
|
+
color: f[m.origin].color
|
|
1590
|
+
}, {
|
|
1591
|
+
default: x(() => [o(v(f[m.origin].label), 1)]),
|
|
1592
|
+
_: 2
|
|
1593
|
+
}, 1032, ["color"]),
|
|
1594
|
+
m.strategy?.learnable ? (p(), n(l, {
|
|
1595
|
+
key: 0,
|
|
1596
|
+
size: "x-small",
|
|
1597
|
+
variant: "outlined"
|
|
1598
|
+
}, {
|
|
1599
|
+
default: x(() => c[3] || (c[3] = [o("learnable weight")])),
|
|
1600
|
+
_: 1
|
|
1601
|
+
})) : r("", !0),
|
|
1602
|
+
s(l, {
|
|
1603
|
+
size: "x-small",
|
|
1604
|
+
variant: "tonal",
|
|
1605
|
+
color: filterKind(m).kind === "gate" ? "deep-orange" : "blue-grey",
|
|
1606
|
+
title: filterKind(m).help
|
|
1607
|
+
}, {
|
|
1608
|
+
default: x(() => [o(v(filterKind(m).label), 1)]),
|
|
1609
|
+
_: 2
|
|
1610
|
+
}, 1032, ["color", "title"])
|
|
1611
|
+
]),
|
|
1612
|
+
m.strategy?.description ? (p(), i("div", fn, v(m.strategy.description), 1)) : m.strategy ? r("", !0) : (p(), i("div", pn, " Built in code; no strategy document. ")),
|
|
1613
|
+
t.stats ? (p(), i("div", mn, [filterStat(m.name) ? (p(), i(e, { key: 0 }, [a("div", hn, [(p(!0), i(e, null, h(impactParts(filterStat(m.name)), (e) => (p(), i("div", {
|
|
1614
|
+
key: e.key,
|
|
1615
|
+
class: u(`bg-${e.color}`),
|
|
1616
|
+
style: d({ width: `${e.share * 100}%` }),
|
|
1617
|
+
title: `${e.key}: ${e.count}`
|
|
1618
|
+
}, null, 14, gn))), 128))]), a("div", _n, [o(" over " + v(filterStat(m.name).runs) + " runs: ", 1), (p(!0), i(e, null, h(impactParts(filterStat(m.name)), (e) => (p(), i("span", {
|
|
1619
|
+
key: e.key,
|
|
1620
|
+
class: "mr-2"
|
|
1621
|
+
}, [a("span", { class: u(`text-${e.color}`) }, "●", 2), o(" " + v(e.key) + " " + v(fmtPct(e.share)), 1)]))), 128))])], 64)) : (p(), i("span", vn, "absent from these runs"))])) : r("", !0),
|
|
1622
|
+
prettyConfig(m.strategy?.serializedData) ? (p(), i("div", yn, [a("a", {
|
|
1623
|
+
class: "sk-config-link text-caption",
|
|
1624
|
+
onClick: (e) => toggleConfig(`f:${m.name}`)
|
|
1625
|
+
}, v(T.value.has(`f:${m.name}`) ? "Hide" : "Show") + " config ", 9, bn), T.value.has(`f:${m.name}`) ? (p(), i("pre", Q, v(prettyConfig(m.strategy?.serializedData)), 1)) : r("", !0)])) : r("", !0)
|
|
1626
|
+
]))), 128))], 64)) : m.key === "regulate" ? (p(), i(e, { key: 2 }, [
|
|
1627
|
+
a("div", xn, [
|
|
1628
|
+
a("div", Sn, [c[5] || (c[5] = a("span", { class: "font-weight-medium" }, "Review mass", -1)), s(l, {
|
|
1629
|
+
size: "x-small",
|
|
1630
|
+
variant: "outlined"
|
|
1631
|
+
}, {
|
|
1632
|
+
default: x(() => c[4] || (c[4] = [o("on review cards")])),
|
|
1633
|
+
_: 1
|
|
1634
|
+
})]),
|
|
1635
|
+
a("div", Cn, " Each due review weighs its SRS urgency (0–1) times the filters' net effect on it. Above " + v(b.value.regulators.reviewMass.healthyMass) + " card-equivalents, every review is multiplied by ×" + v(b.value.regulators.reviewMass.rate) + " per " + v(b.value.regulators.reviewMass.healthyMass) + " in excess (uncapped). Reviews without an urgency weigh their score against " + v(b.value.regulators.reviewMass.referenceScore) + ". ", 1),
|
|
1636
|
+
regStat("review-mass") ? (p(), i("div", wn, v(regStatText(regStat("review-mass"))), 1)) : r("", !0)
|
|
1637
|
+
]),
|
|
1638
|
+
a("div", Tn, [
|
|
1639
|
+
a("div", En, [c[7] || (c[7] = a("span", { class: "font-weight-medium" }, "Intake", -1)), s(l, {
|
|
1640
|
+
size: "x-small",
|
|
1641
|
+
variant: "outlined"
|
|
1642
|
+
}, {
|
|
1643
|
+
default: x(() => c[6] || (c[6] = [o("on new cards no gate penalized")])),
|
|
1644
|
+
_: 1
|
|
1645
|
+
})]),
|
|
1646
|
+
a("div", Dn, " ×" + v(b.value.regulators.intake.rate) + " per " + v(b.value.regulators.intake.scaleHours) + " hours since a new card was last presented (uncapped). The clock stops while no eligible new card exists. ", 1),
|
|
1647
|
+
regStat("intake") ? (p(), i("div", On, v(regStatText(regStat("intake"))), 1)) : r("", !0)
|
|
1648
|
+
]),
|
|
1649
|
+
t.stats && t.stats.regulators.length === 0 ? (p(), i("div", kn, " None of these runs recorded regulator readings (recorded from 0.2.29). ")) : r("", !0)
|
|
1650
|
+
], 64)) : m.key === "select" && t.stats && t.stats.runsWithSelection > 0 ? (p(), i("div", An, [
|
|
1651
|
+
o(v(t.stats.selectedUnattributed) + " selected card(s) had no generator: forced in by a hint's ", 1),
|
|
1652
|
+
c[8] || (c[8] = a("code", null, "requireCards", -1)),
|
|
1653
|
+
c[9] || (c[9] = o(". "))
|
|
1654
|
+
])) : r("", !0)
|
|
1655
|
+
]), g < y(W).length - 1 ? (p(), i("div", jn, [s(_, { size: "small" }, {
|
|
1656
|
+
default: x(() => c[10] || (c[10] = [o("mdi-arrow-down")])),
|
|
1657
|
+
_: 1
|
|
1658
|
+
})])) : r("", !0)]))), 128)),
|
|
1659
|
+
t.stats && t.stats.runsWithSelection === 0 ? (p(), i("div", Mn, " None of these runs recorded which cards they selected (recorded from 0.2.28), so selection and first-attempt counts are not shown. ")) : r("", !0)
|
|
1660
|
+
]);
|
|
1661
|
+
};
|
|
1662
|
+
}
|
|
1663
|
+
}), [["__scopeId", "data-v-24b6038f"]]), Nn = /* @__PURE__ */ c({
|
|
1327
1664
|
__name: "LearnerDiagnostics",
|
|
1328
1665
|
props: {
|
|
1329
1666
|
dataset: {},
|
|
1330
1667
|
interpreters: {}
|
|
1331
1668
|
},
|
|
1332
|
-
setup(
|
|
1333
|
-
let
|
|
1669
|
+
setup(a) {
|
|
1670
|
+
let c = a, l = m("sessions"), u = m(null), d = m(void 0), f = t(() => P(c.dataset));
|
|
1334
1671
|
function openCard(e) {
|
|
1335
|
-
|
|
1672
|
+
d.value = void 0, l.value = "cards", setTimeout(() => d.value = e);
|
|
1336
1673
|
}
|
|
1337
|
-
return
|
|
1338
|
-
|
|
1339
|
-
}), (t,
|
|
1340
|
-
let
|
|
1341
|
-
return
|
|
1342
|
-
modelValue:
|
|
1343
|
-
"onUpdate:modelValue":
|
|
1674
|
+
return b(() => c.dataset, () => {
|
|
1675
|
+
l.value = "sessions", u.value = null, d.value = void 0;
|
|
1676
|
+
}), (t, a) => {
|
|
1677
|
+
let c = g("v-tab"), m = g("v-tabs"), h = g("v-btn");
|
|
1678
|
+
return p(), i("div", null, [s(m, {
|
|
1679
|
+
modelValue: l.value,
|
|
1680
|
+
"onUpdate:modelValue": a[0] || (a[0] = (e) => l.value = e),
|
|
1344
1681
|
density: "compact",
|
|
1345
1682
|
class: "mb-4"
|
|
1346
1683
|
}, {
|
|
1347
|
-
default:
|
|
1348
|
-
|
|
1349
|
-
|
|
1350
|
-
|
|
1351
|
-
|
|
1352
|
-
|
|
1353
|
-
|
|
1684
|
+
default: x(() => [
|
|
1685
|
+
s(c, { value: "sessions" }, {
|
|
1686
|
+
default: x(() => [o("Sessions (" + v(t.dataset.sessions.length) + ")", 1)]),
|
|
1687
|
+
_: 1
|
|
1688
|
+
}),
|
|
1689
|
+
s(c, { value: "cards" }, {
|
|
1690
|
+
default: x(() => [o("Cards (" + v(t.dataset.cardHistories.length) + ")", 1)]),
|
|
1691
|
+
_: 1
|
|
1692
|
+
}),
|
|
1693
|
+
t.dataset.strategies ? (p(), n(c, {
|
|
1694
|
+
key: 0,
|
|
1695
|
+
value: "pipeline"
|
|
1696
|
+
}, {
|
|
1697
|
+
default: x(() => a[3] || (a[3] = [o("Pipeline")])),
|
|
1698
|
+
_: 1
|
|
1699
|
+
})) : r("", !0)
|
|
1700
|
+
]),
|
|
1354
1701
|
_: 1
|
|
1355
|
-
}, 8, ["modelValue"]),
|
|
1702
|
+
}, 8, ["modelValue"]), l.value === "sessions" ? (p(), i(e, { key: 0 }, [u.value ? (p(), i(e, { key: 0 }, [s(h, {
|
|
1356
1703
|
variant: "text",
|
|
1357
1704
|
size: "small",
|
|
1358
1705
|
"prepend-icon": "mdi-arrow-left",
|
|
1359
1706
|
class: "mb-2",
|
|
1360
|
-
onClick:
|
|
1707
|
+
onClick: a[1] || (a[1] = (e) => u.value = null)
|
|
1361
1708
|
}, {
|
|
1362
|
-
default:
|
|
1709
|
+
default: x(() => a[4] || (a[4] = [o(" All sessions ")])),
|
|
1363
1710
|
_: 1
|
|
1364
|
-
}), s(
|
|
1711
|
+
}), s(X, {
|
|
1365
1712
|
dataset: t.dataset,
|
|
1366
|
-
"session-id":
|
|
1713
|
+
"session-id": u.value,
|
|
1367
1714
|
interpreters: t.interpreters,
|
|
1368
1715
|
onOpenCard: openCard
|
|
1369
1716
|
}, null, 8, [
|
|
1370
1717
|
"dataset",
|
|
1371
1718
|
"session-id",
|
|
1372
1719
|
"interpreters"
|
|
1373
|
-
])], 64)) : (
|
|
1720
|
+
])], 64)) : (p(), n(Z, {
|
|
1374
1721
|
key: 1,
|
|
1375
1722
|
dataset: t.dataset,
|
|
1376
1723
|
interpreters: t.interpreters,
|
|
1377
|
-
onOpen:
|
|
1378
|
-
}, null, 8, ["dataset", "interpreters"]))], 64)) : (
|
|
1724
|
+
onOpen: a[2] || (a[2] = (e) => u.value = e)
|
|
1725
|
+
}, null, 8, ["dataset", "interpreters"]))], 64)) : l.value === "cards" ? (p(), n(J, {
|
|
1379
1726
|
key: 1,
|
|
1380
1727
|
dataset: t.dataset,
|
|
1381
1728
|
interpreters: t.interpreters,
|
|
1382
|
-
focus:
|
|
1729
|
+
focus: d.value
|
|
1383
1730
|
}, null, 8, [
|
|
1384
1731
|
"dataset",
|
|
1385
1732
|
"interpreters",
|
|
1386
1733
|
"focus"
|
|
1387
|
-
]))
|
|
1734
|
+
])) : l.value === "pipeline" && t.dataset.strategies ? (p(), n($, {
|
|
1735
|
+
key: 2,
|
|
1736
|
+
strategies: t.dataset.strategies,
|
|
1737
|
+
"course-id": t.dataset.courseId,
|
|
1738
|
+
stats: f.value,
|
|
1739
|
+
"stats-label": t.dataset.username
|
|
1740
|
+
}, null, 8, [
|
|
1741
|
+
"strategies",
|
|
1742
|
+
"course-id",
|
|
1743
|
+
"stats",
|
|
1744
|
+
"stats-label"
|
|
1745
|
+
])) : r("", !0)]);
|
|
1388
1746
|
};
|
|
1389
1747
|
}
|
|
1390
1748
|
});
|
|
1391
1749
|
//#endregion
|
|
1392
|
-
export {
|
|
1750
|
+
export { q as CardDossierDetail, J as LearnerCardHistory, ie as LearnerDatasetSource, Nn as LearnerDiagnostics, X as LearnerSessionDetail, Z as LearnerSessionList, $ as PipelineOverview, Y as RunDetail, downloadLearnerDump, useLearnerDataset };
|
|
1393
1751
|
|
|
1394
1752
|
//# sourceMappingURL=common-ui-admin.es.js.map
|