@vue-skuilder/common-ui 0.2.7 → 0.2.9
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/assets/index.css +1 -1
- package/dist/common-ui.es.js +175 -200
- package/dist/common-ui.es.js.map +1 -1
- package/dist/common-ui.umd.js +17 -17
- package/dist/common-ui.umd.js.map +1 -1
- package/dist/components/SessionControllerDebug.vue.d.ts +3 -2
- package/dist/components/SessionControllerDebug.vue.d.ts.map +1 -1
- package/dist/components/StudySession.types.d.ts +0 -11
- package/dist/components/StudySession.types.d.ts.map +1 -1
- package/dist/components/StudySession.vue.d.ts +1 -0
- package/dist/components/StudySession.vue.d.ts.map +1 -1
- package/package.json +4 -4
- package/src/components/SessionControllerDebug.vue +22 -45
- package/src/components/StudySession.types.ts +0 -12
- package/src/components/StudySession.vue +0 -4
|
@@ -7,6 +7,7 @@ interface QueueDebugInfo {
|
|
|
7
7
|
courseID: string;
|
|
8
8
|
cardID: string;
|
|
9
9
|
status: string;
|
|
10
|
+
score?: number;
|
|
10
11
|
}>;
|
|
11
12
|
}
|
|
12
13
|
interface HydratedCacheInfo {
|
|
@@ -18,8 +19,7 @@ interface HydratedCacheInfo {
|
|
|
18
19
|
}>;
|
|
19
20
|
}
|
|
20
21
|
export interface SessionDebugInfo {
|
|
21
|
-
|
|
22
|
-
newQueue: QueueDebugInfo;
|
|
22
|
+
supplyQueue: QueueDebugInfo;
|
|
23
23
|
failedQueue: QueueDebugInfo;
|
|
24
24
|
hydratedCache: HydratedCacheInfo;
|
|
25
25
|
}
|
|
@@ -30,6 +30,7 @@ declare const _default: import('vue').DefineComponent<import('vue').ExtractPropT
|
|
|
30
30
|
};
|
|
31
31
|
}>, {
|
|
32
32
|
debugInfo: import('vue').ComputedRef<SessionDebugInfo>;
|
|
33
|
+
fmtScore: (score?: number) => string;
|
|
33
34
|
}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<import('vue').ExtractPropTypes<{
|
|
34
35
|
sessionController: {
|
|
35
36
|
type: PropType<SessionController<any> | null>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionControllerDebug.vue.d.ts","sourceRoot":"","sources":["../../src/components/SessionControllerDebug.vue"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"SessionControllerDebug.vue.d.ts","sourceRoot":"","sources":["../../src/components/SessionControllerDebug.vue"],"names":[],"mappings":"AA0GA;AAAA,OAqOO,EAAmB,QAAQ,EAAyC,MAAM,KAAK,CAAC;AACvF,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAErD,UAAU,cAAc;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACpF;AAED,UAAU,iBAAiB;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,CAAC;IACxB,KAAK,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACpD;AAED,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,cAAc,CAAC;IAC5B,WAAW,EAAE,cAAc,CAAC;IAC5B,aAAa,EAAE,iBAAiB,CAAC;CAClC;;;cAOqB,QAAQ,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;;;;;uBAsC/B,MAAM,KAAG,MAAM;;;cAtCvB,QAAQ,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;;;;AAL7D,wBAsDG"}
|
|
@@ -18,17 +18,6 @@ export type StudySessionConfig = {
|
|
|
18
18
|
* Default (when omitted): 20
|
|
19
19
|
*/
|
|
20
20
|
defaultBatchLimit?: number;
|
|
21
|
-
/**
|
|
22
|
-
* Maximum number of reviews enqueued at session start.
|
|
23
|
-
*
|
|
24
|
-
* Reviews live outside the replan flow — they're loaded once at session
|
|
25
|
-
* setup and drain via consumption (no mid-session refill). The session
|
|
26
|
-
* timer caps total exposure, so overfilling is intentional.
|
|
27
|
-
*
|
|
28
|
-
* Default (when omitted): 200, generous enough for Anki-style power
|
|
29
|
-
* users. Apps targeting short, nimble sessions should set this lower.
|
|
30
|
-
*/
|
|
31
|
-
initialReviewCap?: number;
|
|
32
21
|
/**
|
|
33
22
|
* Optional session-durable hints applied from session init onward.
|
|
34
23
|
* Uses the same format as `ReplanOptions.hints` — boost/exclude/require tags.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StudySession.types.d.ts","sourceRoot":"","sources":["../../src/components/StudySession.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAErE;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAC/B,aAAa,EAAE,OAAO,CAAC;IAEvB;;;;;;;;;;;;OAYG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B;;;;;;;;;OASG;IACH,
|
|
1
|
+
{"version":3,"file":"StudySession.types.d.ts","sourceRoot":"","sources":["../../src/components/StudySession.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAErE;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAC/B,aAAa,EAAE,OAAO,CAAC;IAEvB;;;;;;;;;;;;OAYG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B;;;;;;;;;OASG;IACH,SAAS,CAAC,EAAE,WAAW,CAAC;IAExB;;;;;;;;;OASG;IACH,gBAAgB,CAAC,EAAE,eAAe,EAAE,CAAC;CACtC,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,oBAAoB,GAAG,gBAAgB,GAAG,YAAY,GAAG,YAAY,CAAC;AAElF,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC"}
|
|
@@ -438,6 +438,7 @@ declare const _default: import('vue').DefineComponent<import('vue').ExtractPropT
|
|
|
438
438
|
};
|
|
439
439
|
}>, {
|
|
440
440
|
debugInfo: import('vue').ComputedRef<import('./SessionControllerDebug.vue').SessionDebugInfo>;
|
|
441
|
+
fmtScore: (score?: number) => string;
|
|
441
442
|
}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<import('vue').ExtractPropTypes<{
|
|
442
443
|
sessionController: {
|
|
443
444
|
type: PropType<SessionController<any> | null>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StudySession.vue.d.ts","sourceRoot":"","sources":["../../src/components/StudySession.vue"],"names":[],"mappings":"AAiFA;AAAA,
|
|
1
|
+
{"version":3,"file":"StudySession.vue.d.ts","sourceRoot":"","sources":["../../src/components/StudySession.vue"],"names":[],"mappings":"AAiFA;AAAA,OAyzBO,EAAE,eAAe,EAAW,QAAQ,EAAE,MAAM,KAAK,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAM/C,OAAO,UAAU,MAAM,gCAAgC,CAAC;AAGxD,OAAO,EAAE,SAAS,EAAuB,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChF,OAAO,EACL,WAAW,EACX,UAAU,EAEV,eAAe,EACf,qBAAqB,EACrB,iBAAiB,EAEjB,YAAY,EAGZ,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,eAAe,EAChB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAEpG,UAAU,SAAS;IACjB,aAAa,EAAE,cAAc,CAAC;IAC9B,UAAU,EAAE,YAAY,CAAC,OAAO,UAAU,CAAC,CAAC;CAC7C;AAED,KAAK,aAAa,GAAG,UAAU,CAAC,OAAO,eAAe,CAAC,GAAG;IACxD,KAAK,EAAE,SAAS,CAAC;CAClB,CAAC;;;;;;;cAqBmB,QAAQ,CAAC,eAAe,EAAE,CAAC;;;;cAI1B,QAAQ,CAAC,eAAe,CAAC;;;;cAIzB,QAAQ,CAAC,iBAAiB,CAAC;;;;cAI3B,QAAQ,CAAC,kBAAkB,CAAC;;;;;;cAI1B,QAAQ,CAAC,CAAC,MAAM,EAAE,MAAM,KAAK,aAAa,CAAC;;;;;;;;;;;;cAY7C,QAAQ,CAAC,oBAAoB,GAAG,MAAM,CAAC;;;;cAIvC,QAAQ,CAAC,kBAAkB,CAAC;;;;;UAoB9B,aAAa,GAAG,IAAI;UACtB,QAAQ,EAAE;;;iBAGH;QAAE,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE;;uBAEtB,iBAAiB,CAAC,aAAa,CAAC,GAAG,IAAI;;;mBAG7C,kBAAkB,EAAE;;;;sBAIf,qBAAqB,GAAG,IAAI;2BACzB,kBAAkB,EAAE;;;mBAG1B,aAAa,GAAG,IAAI;4BACX,MAAM,GAAG,IAAI;qBACpB,MAAM,CAAC,OAAO,GAAG,IAAI;;;;mBAOjC,kBAAkB;;IAoDjC;;;OAGG;;IAYH;;;;;;;;;;;;;OAaG;kCAC2B,aAAa;uBAUxB,MAAM,GAAG,SAAS;kCASxB,OAAO;;;;8BAkJM,MAAM,WAAW,MAAM,GAAG,MAAM;0BAI9B,aAAa,KAAK,UAAU;6BAiF/B,cAAc;;qBAsDhB,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;mBAO/C,YAAY,GAAG,IAAI;;;;;;;cAtdvB,QAAQ,CAAC,eAAe,EAAE,CAAC;;;;cAI1B,QAAQ,CAAC,eAAe,CAAC;;;;cAIzB,QAAQ,CAAC,iBAAiB,CAAC;;;;cAI3B,QAAQ,CAAC,kBAAkB,CAAC;;;;;;cAI1B,QAAQ,CAAC,CAAC,MAAM,EAAE,MAAM,KAAK,aAAa,CAAC;;;;;;;;;;;;cAY7C,QAAQ,CAAC,oBAAoB,GAAG,MAAM,CAAC;;;;cAIvC,QAAQ,CAAC,kBAAkB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAnDlD,wBAohBG"}
|
package/package.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"publishConfig": {
|
|
4
4
|
"access": "public"
|
|
5
5
|
},
|
|
6
|
-
"version": "0.2.
|
|
6
|
+
"version": "0.2.9",
|
|
7
7
|
"sideEffects": false,
|
|
8
8
|
"main": "./dist/common-ui.umd.js",
|
|
9
9
|
"module": "./dist/common-ui.es.js",
|
|
@@ -34,8 +34,8 @@
|
|
|
34
34
|
"@highlightjs/vue-plugin": "^2.1.2",
|
|
35
35
|
"@mdi/font": "^7.3.67",
|
|
36
36
|
"@vojtechlanka/vue-tags-input": "^3",
|
|
37
|
-
"@vue-skuilder/common": "0.2.
|
|
38
|
-
"@vue-skuilder/db": "0.2.
|
|
37
|
+
"@vue-skuilder/common": "0.2.9",
|
|
38
|
+
"@vue-skuilder/db": "0.2.9",
|
|
39
39
|
"highlight.js": "^11.0.1",
|
|
40
40
|
"marked": "^15.0.6",
|
|
41
41
|
"moment": "^2.29.4",
|
|
@@ -71,5 +71,5 @@
|
|
|
71
71
|
"vite-plugin-dts": "^4.5.3",
|
|
72
72
|
"vitest": "^4.1.0"
|
|
73
73
|
},
|
|
74
|
-
"stableVersion": "0.2.
|
|
74
|
+
"stableVersion": "0.2.9"
|
|
75
75
|
}
|
|
@@ -8,58 +8,29 @@
|
|
|
8
8
|
|
|
9
9
|
<v-card-text class="pa-2">
|
|
10
10
|
<v-row dense>
|
|
11
|
-
<!--
|
|
12
|
-
<v-col cols="12" md="
|
|
13
|
-
<div class="debug-section">
|
|
14
|
-
<div class="debug-header">
|
|
15
|
-
<v-icon size="x-small" class="mr-1">mdi-calendar-check</v-icon>
|
|
16
|
-
<strong>Review Queue</strong>
|
|
17
|
-
</div>
|
|
18
|
-
<div class="debug-stats">
|
|
19
|
-
<span class="text-caption">Length: {{ debugInfo.reviewQueue.length }}</span>
|
|
20
|
-
<span class="text-caption ml-2">Dequeued: {{ debugInfo.reviewQueue.dequeueCount }}</span>
|
|
21
|
-
</div>
|
|
22
|
-
<div v-if="debugInfo.reviewQueue.items.length > 0" class="debug-items">
|
|
23
|
-
<div
|
|
24
|
-
v-for="(item, idx) in debugInfo.reviewQueue.items.slice(0, 5)"
|
|
25
|
-
:key="idx"
|
|
26
|
-
class="debug-item"
|
|
27
|
-
>
|
|
28
|
-
<span class="text-caption">{{ idx }}: {{ item.courseID }}::{{ item.cardID }}</span>
|
|
29
|
-
<span class="text-caption text-grey ml-1">({{ item.status }})</span>
|
|
30
|
-
</div>
|
|
31
|
-
<div v-if="debugInfo.reviewQueue.items.length > 5" class="text-caption text-grey">
|
|
32
|
-
... +{{ debugInfo.reviewQueue.items.length - 5 }} more
|
|
33
|
-
</div>
|
|
34
|
-
</div>
|
|
35
|
-
<div v-else class="text-caption text-grey">
|
|
36
|
-
(empty)
|
|
37
|
-
</div>
|
|
38
|
-
</div>
|
|
39
|
-
</v-col>
|
|
40
|
-
|
|
41
|
-
<!-- New Cards Queue -->
|
|
42
|
-
<v-col cols="12" md="4">
|
|
11
|
+
<!-- Supply Queue (new + review, rank-ordered) -->
|
|
12
|
+
<v-col cols="12" md="8">
|
|
43
13
|
<div class="debug-section">
|
|
44
14
|
<div class="debug-header">
|
|
45
|
-
<v-icon size="x-small" class="mr-1">mdi-
|
|
46
|
-
<strong>
|
|
15
|
+
<v-icon size="x-small" class="mr-1">mdi-sort</v-icon>
|
|
16
|
+
<strong>Supply Queue</strong>
|
|
47
17
|
</div>
|
|
48
18
|
<div class="debug-stats">
|
|
49
|
-
<span class="text-caption">Length: {{ debugInfo.
|
|
50
|
-
<span class="text-caption ml-2">Dequeued: {{ debugInfo.
|
|
19
|
+
<span class="text-caption">Length: {{ debugInfo.supplyQueue.length }}</span>
|
|
20
|
+
<span class="text-caption ml-2">Dequeued: {{ debugInfo.supplyQueue.dequeueCount }}</span>
|
|
51
21
|
</div>
|
|
52
|
-
<div v-if="debugInfo.
|
|
22
|
+
<div v-if="debugInfo.supplyQueue.items.length > 0" class="debug-items">
|
|
53
23
|
<div
|
|
54
|
-
v-for="(item, idx) in debugInfo.
|
|
24
|
+
v-for="(item, idx) in debugInfo.supplyQueue.items.slice(0, 8)"
|
|
55
25
|
:key="idx"
|
|
56
26
|
class="debug-item"
|
|
57
27
|
>
|
|
58
28
|
<span class="text-caption">{{ idx }}: {{ item.courseID }}::{{ item.cardID }}</span>
|
|
59
29
|
<span class="text-caption text-grey ml-1">({{ item.status }})</span>
|
|
30
|
+
<span class="text-caption ml-1" style="color:#90caf9">{{ fmtScore(item.score) }}</span>
|
|
60
31
|
</div>
|
|
61
|
-
<div v-if="debugInfo.
|
|
62
|
-
... +{{ debugInfo.
|
|
32
|
+
<div v-if="debugInfo.supplyQueue.items.length > 8" class="text-caption text-grey">
|
|
33
|
+
... +{{ debugInfo.supplyQueue.items.length - 8 }} more
|
|
63
34
|
</div>
|
|
64
35
|
</div>
|
|
65
36
|
<div v-else class="text-caption text-grey">
|
|
@@ -141,7 +112,7 @@ import { SessionController } from '@vue-skuilder/db';
|
|
|
141
112
|
interface QueueDebugInfo {
|
|
142
113
|
length: number;
|
|
143
114
|
dequeueCount: number;
|
|
144
|
-
items: Array<{ courseID: string; cardID: string; status: string }>;
|
|
115
|
+
items: Array<{ courseID: string; cardID: string; status: string; score?: number }>;
|
|
145
116
|
}
|
|
146
117
|
|
|
147
118
|
interface HydratedCacheInfo {
|
|
@@ -151,8 +122,7 @@ interface HydratedCacheInfo {
|
|
|
151
122
|
}
|
|
152
123
|
|
|
153
124
|
export interface SessionDebugInfo {
|
|
154
|
-
|
|
155
|
-
newQueue: QueueDebugInfo;
|
|
125
|
+
supplyQueue: QueueDebugInfo;
|
|
156
126
|
failedQueue: QueueDebugInfo;
|
|
157
127
|
hydratedCache: HydratedCacheInfo;
|
|
158
128
|
}
|
|
@@ -190,8 +160,7 @@ export default defineComponent({
|
|
|
190
160
|
|
|
191
161
|
if (!props.sessionController) {
|
|
192
162
|
return {
|
|
193
|
-
|
|
194
|
-
newQueue: { length: 0, dequeueCount: 0, items: [] },
|
|
163
|
+
supplyQueue: { length: 0, dequeueCount: 0, items: [] },
|
|
195
164
|
failedQueue: { length: 0, dequeueCount: 0, items: [] },
|
|
196
165
|
hydratedCache: { count: 0, failedCacheSize: 0, items: [] },
|
|
197
166
|
};
|
|
@@ -200,8 +169,16 @@ export default defineComponent({
|
|
|
200
169
|
return props.sessionController.getDebugInfo();
|
|
201
170
|
});
|
|
202
171
|
|
|
172
|
+
/** Format a rank score: finite → 2dp, `+INF` → REQ (required), missing → ''. */
|
|
173
|
+
const fmtScore = (score?: number): string => {
|
|
174
|
+
if (score === undefined) return '';
|
|
175
|
+
if (!Number.isFinite(score)) return 'REQ';
|
|
176
|
+
return score.toFixed(2);
|
|
177
|
+
};
|
|
178
|
+
|
|
203
179
|
return {
|
|
204
180
|
debugInfo,
|
|
181
|
+
fmtScore,
|
|
205
182
|
};
|
|
206
183
|
},
|
|
207
184
|
});
|
|
@@ -21,18 +21,6 @@ export type StudySessionConfig = {
|
|
|
21
21
|
*/
|
|
22
22
|
defaultBatchLimit?: number;
|
|
23
23
|
|
|
24
|
-
/**
|
|
25
|
-
* Maximum number of reviews enqueued at session start.
|
|
26
|
-
*
|
|
27
|
-
* Reviews live outside the replan flow — they're loaded once at session
|
|
28
|
-
* setup and drain via consumption (no mid-session refill). The session
|
|
29
|
-
* timer caps total exposure, so overfilling is intentional.
|
|
30
|
-
*
|
|
31
|
-
* Default (when omitted): 200, generous enough for Anki-style power
|
|
32
|
-
* users. Apps targeting short, nimble sessions should set this lower.
|
|
33
|
-
*/
|
|
34
|
-
initialReviewCap?: number;
|
|
35
|
-
|
|
36
24
|
/**
|
|
37
25
|
* Optional session-durable hints applied from session init onward.
|
|
38
26
|
* Uses the same format as `ReplanOptions.hints` — boost/exclude/require tags.
|
|
@@ -388,15 +388,11 @@ export default defineComponent({
|
|
|
388
388
|
|
|
389
389
|
const scOptions: {
|
|
390
390
|
defaultBatchLimit?: number;
|
|
391
|
-
initialReviewCap?: number;
|
|
392
391
|
outcomeObservers?: OutcomeObserver[];
|
|
393
392
|
} = {};
|
|
394
393
|
if (this.sessionConfig?.defaultBatchLimit !== undefined) {
|
|
395
394
|
scOptions.defaultBatchLimit = this.sessionConfig.defaultBatchLimit;
|
|
396
395
|
}
|
|
397
|
-
if (this.sessionConfig?.initialReviewCap !== undefined) {
|
|
398
|
-
scOptions.initialReviewCap = this.sessionConfig.initialReviewCap;
|
|
399
|
-
}
|
|
400
396
|
if (this.sessionConfig?.outcomeObservers?.length) {
|
|
401
397
|
scOptions.outcomeObservers = this.sessionConfig.outcomeObservers;
|
|
402
398
|
}
|