@vue-skuilder/common-ui 0.2.33 → 0.2.35

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.
Files changed (33) hide show
  1. package/dist/{MarkdownRenderer-kStoDRNE.mjs → MarkdownRenderer-U_iPiA2x.mjs} +219 -216
  2. package/dist/MarkdownRenderer-U_iPiA2x.mjs.map +1 -0
  3. package/dist/admin/admin.css +1 -1
  4. package/dist/admin/common-ui-admin.es.js +24754 -638
  5. package/dist/admin/common-ui-admin.es.js.map +1 -1
  6. package/dist/admin/components/EChart.vue.d.ts +14 -0
  7. package/dist/admin/components/EChart.vue.d.ts.map +1 -0
  8. package/dist/admin/components/LearnerDiagnostics.vue.d.ts +3 -3
  9. package/dist/admin/components/LearnerDiagnostics.vue.d.ts.map +1 -1
  10. package/dist/admin/components/LearnerTagElo.vue.d.ts +14 -0
  11. package/dist/admin/components/LearnerTagElo.vue.d.ts.map +1 -0
  12. package/dist/admin/index.d.ts +1 -0
  13. package/dist/admin/index.d.ts.map +1 -1
  14. package/dist/common-ui.es.js +3 -3
  15. package/dist/common-ui.es.js.map +1 -1
  16. package/dist/common-ui.umd.js +2 -2
  17. package/dist/common-ui.umd.js.map +1 -1
  18. package/dist/components/CourseCardBrowser.vue.d.ts +3 -3
  19. package/dist/components/CourseInformation.vue.d.ts +3 -3
  20. package/dist/components/PaginatingToolbar.vue.d.ts +3 -3
  21. package/dist/components/SkMouseTrapToolTip.vue.d.ts +1 -1
  22. package/dist/composables/CompositionViewable.d.ts +2 -2
  23. package/dist/composables/CompositionViewable.d.ts.map +1 -1
  24. package/dist/composables/Displayable.d.ts +6 -1
  25. package/dist/composables/Displayable.d.ts.map +1 -1
  26. package/package.json +5 -4
  27. package/src/admin/components/EChart.vue +59 -0
  28. package/src/admin/components/LearnerDiagnostics.vue +8 -4
  29. package/src/admin/components/LearnerTagElo.vue +563 -0
  30. package/src/admin/index.ts +1 -0
  31. package/src/composables/CompositionViewable.ts +11 -5
  32. package/src/composables/Displayable.ts +7 -1
  33. package/dist/MarkdownRenderer-kStoDRNE.mjs.map +0 -1
@@ -297,7 +297,7 @@ declare const _default: import('vue').DefineComponent<import('vue').ExtractPropT
297
297
  readonly required: false;
298
298
  readonly default: "";
299
299
  };
300
- }>, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, ("first" | "prev" | "next" | "last" | "set-page")[], "first" | "prev" | "next" | "last" | "set-page", import('vue').PublicProps, Readonly<import('vue').ExtractPropTypes<{
300
+ }>, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, ("next" | "prev" | "first" | "last" | "set-page")[], "next" | "prev" | "first" | "last" | "set-page", import('vue').PublicProps, Readonly<import('vue').ExtractPropTypes<{
301
301
  readonly pages: {
302
302
  readonly type: PropType<number[]>;
303
303
  readonly required: true;
@@ -317,9 +317,9 @@ declare const _default: import('vue').DefineComponent<import('vue').ExtractPropT
317
317
  readonly default: "";
318
318
  };
319
319
  }>> & Readonly<{
320
- onFirst?: ((...args: any[]) => any) | undefined;
321
- onPrev?: ((...args: any[]) => any) | undefined;
322
320
  onNext?: ((...args: any[]) => any) | undefined;
321
+ onPrev?: ((...args: any[]) => any) | undefined;
322
+ onFirst?: ((...args: any[]) => any) | undefined;
323
323
  onLast?: ((...args: any[]) => any) | undefined;
324
324
  "onSet-page"?: ((...args: any[]) => any) | undefined;
325
325
  }>, {
@@ -341,7 +341,7 @@ declare const _default: import('vue').DefineComponent<import('vue').ExtractPropT
341
341
  readonly required: false;
342
342
  readonly default: "";
343
343
  };
344
- }>, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, ("first" | "prev" | "next" | "last" | "set-page")[], "first" | "prev" | "next" | "last" | "set-page", import('vue').PublicProps, Readonly<import('vue').ExtractPropTypes<{
344
+ }>, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, ("next" | "prev" | "first" | "last" | "set-page")[], "next" | "prev" | "first" | "last" | "set-page", import('vue').PublicProps, Readonly<import('vue').ExtractPropTypes<{
345
345
  readonly pages: {
346
346
  readonly type: PropType<number[]>;
347
347
  readonly required: true;
@@ -361,9 +361,9 @@ declare const _default: import('vue').DefineComponent<import('vue').ExtractPropT
361
361
  readonly default: "";
362
362
  };
363
363
  }>> & Readonly<{
364
- onFirst?: ((...args: any[]) => any) | undefined;
365
- onPrev?: ((...args: any[]) => any) | undefined;
366
364
  onNext?: ((...args: any[]) => any) | undefined;
365
+ onPrev?: ((...args: any[]) => any) | undefined;
366
+ onFirst?: ((...args: any[]) => any) | undefined;
367
367
  onLast?: ((...args: any[]) => any) | undefined;
368
368
  "onSet-page"?: ((...args: any[]) => any) | undefined;
369
369
  }>, {
@@ -18,7 +18,7 @@ declare const _default: import('vue').DefineComponent<import('vue').ExtractPropT
18
18
  readonly required: false;
19
19
  readonly default: "";
20
20
  };
21
- }>, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, ("first" | "prev" | "next" | "last" | "set-page")[], "first" | "prev" | "next" | "last" | "set-page", import('vue').PublicProps, Readonly<import('vue').ExtractPropTypes<{
21
+ }>, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, ("next" | "prev" | "first" | "last" | "set-page")[], "next" | "prev" | "first" | "last" | "set-page", import('vue').PublicProps, Readonly<import('vue').ExtractPropTypes<{
22
22
  readonly pages: {
23
23
  readonly type: PropType<number[]>;
24
24
  readonly required: true;
@@ -38,9 +38,9 @@ declare const _default: import('vue').DefineComponent<import('vue').ExtractPropT
38
38
  readonly default: "";
39
39
  };
40
40
  }>> & Readonly<{
41
- onFirst?: ((...args: any[]) => any) | undefined;
42
- onPrev?: ((...args: any[]) => any) | undefined;
43
41
  onNext?: ((...args: any[]) => any) | undefined;
42
+ onPrev?: ((...args: any[]) => any) | undefined;
43
+ onFirst?: ((...args: any[]) => any) | undefined;
44
44
  onLast?: ((...args: any[]) => any) | undefined;
45
45
  "onSet-page"?: ((...args: any[]) => any) | undefined;
46
46
  }>, {
@@ -59,7 +59,7 @@ declare const _default: import('vue').DefineComponent<import('vue').ExtractPropT
59
59
  showTooltip: boolean;
60
60
  position: "left" | "top" | "bottom" | "right";
61
61
  disabled: boolean;
62
- highlightEffect: "none" | "glow" | "scale" | "border";
62
+ highlightEffect: "none" | "border" | "glow" | "scale";
63
63
  }, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
64
64
  export default _default;
65
65
  //# sourceMappingURL=SkMouseTrapToolTip.vue.d.ts.map
@@ -1,5 +1,5 @@
1
1
  import { default as moment } from 'moment';
2
- import { ComputedRef, Ref } from 'vue';
2
+ import { Ref } from 'vue';
3
3
  import { CardRecord, QuestionRecord } from '@vue-skuilder/db';
4
4
  import { HotKey } from '../utils/SkldrMouseTrap';
5
5
  import { Question } from './Displayable';
@@ -7,7 +7,7 @@ import { ViewData, Answer } from '@vue-skuilder/common';
7
7
  export interface ViewableUtils {
8
8
  startTime: Ref<moment.Moment>;
9
9
  hotKeys: Ref<HotKey[]>;
10
- timeSpent: ComputedRef<number>;
10
+ timeSpent: Readonly<Ref<number>>;
11
11
  logger: ViewableLogger;
12
12
  getURL: (item: string, dataShapeIndex?: number) => string;
13
13
  emitResponse: (record: CardRecord) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"CompositionViewable.d.ts","sourceRoot":"","sources":["../../src/composables/CompositionViewable.ts"],"names":[],"mappings":"AAEA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAY,WAAW,EAAO,GAAG,EAAE,MAAM,KAAK,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAGxD,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC9B,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;IACvB,SAAS,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC/B,MAAM,EAAE,cAAc,CAAC;IACvB,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IAC1D,YAAY,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;CAC5C;AAED,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACvD,KAAK,EAAE,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACzD,IAAI,EAAE,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;CACzD;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;;OAIG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB,CAAC,CAAC,SAAS,QAAQ;IACnD,iBAAiB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC/B,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC3B,YAAY,EAAE,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;IACtC,kBAAkB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAChC,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC7B,QAAQ,EAAE,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;IAC7B,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,eAAe,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,gBAAgB,KAAK,cAAc,CAAC;CACrG;AAGD,wBAAgB,WAAW,CACzB,KAAK,EAAE;IAAE,IAAI,EAAE,QAAQ,EAAE,CAAA;CAAE,EAC3B,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,EACjD,aAAa,EAAE,MAAM,GACpB,aAAa,CAsCf;AAGD,wBAAgB,eAAe,CAAC,CAAC,SAAS,QAAQ,EAChD,aAAa,EAAE,aAAa,GAE3B,iBAAiB,CAAC,CAAC,CAAC,CAqDtB;AAGD,wBAAgB,cAAc,CAAC,SAAS,EAAE,OAAO,GAAG,SAAS,IAAI,iBAAiB,CAAC,QAAQ,CAAC,CAO3F"}
1
+ {"version":3,"file":"CompositionViewable.d.ts","sourceRoot":"","sources":["../../src/composables/CompositionViewable.ts"],"names":[],"mappings":"AAEA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAkB,GAAG,EAAE,MAAM,KAAK,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAGxD,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC9B,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;IACvB,SAAS,EAAE,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;IACjC,MAAM,EAAE,cAAc,CAAC;IACvB,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IAC1D,YAAY,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;CAC5C;AAED,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACvD,KAAK,EAAE,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACzD,IAAI,EAAE,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;CACzD;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;;OAIG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB,CAAC,CAAC,SAAS,QAAQ;IACnD,iBAAiB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC/B,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC3B,YAAY,EAAE,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;IACtC,kBAAkB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAChC,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC7B,QAAQ,EAAE,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;IAC7B,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,eAAe,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,gBAAgB,KAAK,cAAc,CAAC;CACrG;AAGD,wBAAgB,WAAW,CACzB,KAAK,EAAE;IAAE,IAAI,EAAE,QAAQ,EAAE,CAAA;CAAE,EAC3B,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,EACjD,aAAa,EAAE,MAAM,GACpB,aAAa,CA2Cf;AAGD,wBAAgB,eAAe,CAAC,CAAC,SAAS,QAAQ,EAChD,aAAa,EAAE,aAAa,GAE3B,iBAAiB,CAAC,CAAC,CAAC,CAsDtB;AAGD,wBAAgB,cAAc,CAAC,SAAS,EAAE,OAAO,GAAG,SAAS,IAAI,iBAAiB,CAAC,QAAQ,CAAC,CAO3F"}
@@ -1,5 +1,5 @@
1
1
  import { DefineComponent, defineComponent } from 'vue';
2
- import { DataShape, ViewData, Answer, Evaluation } from '@vue-skuilder/common';
2
+ import { DataShape, ViewData, Answer, Evaluation, SeedMeta } from '@vue-skuilder/common';
3
3
  export type ViewComponent = DefineComponent<unknown, unknown, unknown> | ReturnType<typeof defineComponent>;
4
4
  export declare function isDefineComponent(v: ViewComponent): v is DefineComponent<unknown, unknown, unknown>;
5
5
  export declare abstract class Displayable {
@@ -14,6 +14,11 @@ export declare abstract class Displayable {
14
14
  * data, and not want any user input.
15
15
  */
16
16
  static acceptsUserData: boolean;
17
+ /**
18
+ * Optional tags and starting ELO for the cards seeded from one seedData
19
+ * item. Without it, seeded cards start untagged at ~1000.
20
+ */
21
+ static seedMeta?: (item: unknown) => SeedMeta;
17
22
  /**
18
23
  *
19
24
  */
@@ -1 +1 @@
1
- {"version":3,"file":"Displayable.d.ts","sourceRoot":"","sources":["../../src/composables/Displayable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,eAAe,EAAE,eAAe,EAAE,MAAM,KAAK,CAAC;AAC5D,OAAO,EAAa,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAG1F,MAAM,MAAM,aAAa,GACrB,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,GAC1C,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC;AAEvC,wBAAgB,iBAAiB,CAC/B,CAAC,EAAE,aAAa,GACf,CAAC,IAAI,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAEjD;AAOD,8BAAsB,WAAW;IAC/B,OAAc,UAAU,EAAE,SAAS,EAAE,CAAC;IAEtC,OAAc,KAAK,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC;IAC1C,OAAc,QAAQ,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IACxC;;;;;;OAMG;IACH,OAAc,eAAe,EAAE,OAAO,CAAQ;IAE9C;;OAEG;gBACS,QAAQ,EAAE,QAAQ,EAAE;aAShB,UAAU,IAAI,SAAS,EAAE;aACzB,KAAK,IAAI,KAAK,CAAC,aAAa,CAAC;CAC9C;AAeD,8BAAsB,QAAS,SAAQ,WAAW;IAChD;;;;OAIG;IACH,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IACrD;;;;;;;OAOG;IACH,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM;IAmBnE;;;;;OAKG;IACI,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,UAAU;CA8B/D"}
1
+ {"version":3,"file":"Displayable.d.ts","sourceRoot":"","sources":["../../src/composables/Displayable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,eAAe,EAAE,eAAe,EAAE,MAAM,KAAK,CAAC;AAC5D,OAAO,EAAa,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAGpG,MAAM,MAAM,aAAa,GACrB,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,GAC1C,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC;AAEvC,wBAAgB,iBAAiB,CAC/B,CAAC,EAAE,aAAa,GACf,CAAC,IAAI,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAEjD;AAOD,8BAAsB,WAAW;IAC/B,OAAc,UAAU,EAAE,SAAS,EAAE,CAAC;IAEtC,OAAc,KAAK,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC;IAC1C,OAAc,QAAQ,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IACxC;;;;;;OAMG;IACH,OAAc,eAAe,EAAE,OAAO,CAAQ;IAE9C;;;OAGG;IACH,OAAc,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,QAAQ,CAAC;IAErD;;OAEG;gBACS,QAAQ,EAAE,QAAQ,EAAE;aAShB,UAAU,IAAI,SAAS,EAAE;aACzB,KAAK,IAAI,KAAK,CAAC,aAAa,CAAC;CAC9C;AAeD,8BAAsB,QAAS,SAAQ,WAAW;IAChD;;;;OAIG;IACH,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IACrD;;;;;;;OAOG;IACH,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM;IAmBnE;;;;;OAKG;IACI,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,UAAU;CA8B/D"}
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "publishConfig": {
4
4
  "access": "public"
5
5
  },
6
- "version": "0.2.33",
6
+ "version": "0.2.35",
7
7
  "sideEffects": false,
8
8
  "main": "./dist/common-ui.umd.js",
9
9
  "module": "./dist/common-ui.es.js",
@@ -47,8 +47,9 @@
47
47
  "@highlightjs/vue-plugin": "^2.1.2",
48
48
  "@mdi/font": "^7.3.67",
49
49
  "@vojtechlanka/vue-tags-input": "^3",
50
- "@vue-skuilder/common": "0.2.33",
51
- "@vue-skuilder/db": "0.2.33",
50
+ "@vue-skuilder/common": "0.2.35",
51
+ "@vue-skuilder/db": "0.2.35",
52
+ "echarts": "6.1.0",
52
53
  "highlight.js": "^11.0.1",
53
54
  "marked": "^15.0.6",
54
55
  "moment": "^2.29.4",
@@ -84,5 +85,5 @@
84
85
  "vite-plugin-dts": "^4.5.3",
85
86
  "vitest": "^4.1.0"
86
87
  },
87
- "stableVersion": "0.2.33"
88
+ "stableVersion": "0.2.35"
88
89
  }
@@ -0,0 +1,59 @@
1
+ <template>
2
+ <div ref="el" :style="{ height: `${height}px`, width: '100%' }" />
3
+ </template>
4
+
5
+ <script setup lang="ts">
6
+ import { onBeforeUnmount, onMounted, ref, shallowRef, watch } from 'vue';
7
+ import { init, use, type ECElementEvent, type EChartsCoreOption, type EChartsType } from 'echarts/core';
8
+ import { LineChart, ScatterChart } from 'echarts/charts';
9
+ import {
10
+ DataZoomComponent,
11
+ GridComponent,
12
+ LegendComponent,
13
+ MarkLineComponent,
14
+ TooltipComponent,
15
+ } from 'echarts/components';
16
+ import { CanvasRenderer } from 'echarts/renderers';
17
+
18
+ /**
19
+ * An ECharts canvas for the admin views. Registers only what they draw, so
20
+ * the admin bundle carries a fraction of ECharts. Options are replaced
21
+ * whole on change (`notMerge`): callers compute the full option.
22
+ */
23
+ use([
24
+ LineChart,
25
+ ScatterChart,
26
+ DataZoomComponent,
27
+ GridComponent,
28
+ LegendComponent,
29
+ MarkLineComponent,
30
+ TooltipComponent,
31
+ CanvasRenderer,
32
+ ]);
33
+
34
+ const props = defineProps<{ option: EChartsCoreOption; height: number }>();
35
+ const emit = defineEmits<{ click: [event: ECElementEvent] }>();
36
+
37
+ const el = ref<HTMLElement | null>(null);
38
+ const chart = shallowRef<EChartsType | null>(null);
39
+ let resize: ResizeObserver | null = null;
40
+
41
+ onMounted(() => {
42
+ if (!el.value) return;
43
+ chart.value = init(el.value);
44
+ chart.value.setOption(props.option, { notMerge: true });
45
+ chart.value.on('click', (e) => emit('click', e as ECElementEvent));
46
+ resize = new ResizeObserver(() => chart.value?.resize());
47
+ resize.observe(el.value);
48
+ });
49
+
50
+ watch(
51
+ () => props.option,
52
+ (option) => chart.value?.setOption(option, { notMerge: true })
53
+ );
54
+
55
+ onBeforeUnmount(() => {
56
+ resize?.disconnect();
57
+ chart.value?.dispose();
58
+ });
59
+ </script>
@@ -4,6 +4,7 @@
4
4
  <v-tab value="sessions">Sessions ({{ dataset.sessions.length }})</v-tab>
5
5
  <v-tab value="cards">Cards ({{ dataset.cardHistories.length }})</v-tab>
6
6
  <v-tab v-if="dataset.strategies" value="pipeline">Pipeline</v-tab>
7
+ <v-tab value="elo">ELO</v-tab>
7
8
  </v-tabs>
8
9
 
9
10
  <template v-if="tab === 'sessions'">
@@ -40,6 +41,8 @@
40
41
  :stats="pipelineStats"
41
42
  :stats-label="dataset.username"
42
43
  />
44
+
45
+ <learner-tag-elo v-else-if="tab === 'elo'" :dataset="dataset" :interpreters="interpreters" />
43
46
  </div>
44
47
  </template>
45
48
 
@@ -49,20 +52,21 @@ import { pipelineRunStats, type DiagnosticsInterpreters, type LearnerDataset } f
49
52
  import LearnerCardHistory from './LearnerCardHistory.vue';
50
53
  import LearnerSessionDetail from './LearnerSessionDetail.vue';
51
54
  import LearnerSessionList from './LearnerSessionList.vue';
55
+ import LearnerTagElo from './LearnerTagElo.vue';
52
56
  import PipelineOverview from './PipelineOverview.vue';
53
57
 
54
58
  /**
55
- * One learner: sessions (list, then a session's detail), card history, and,
59
+ * One learner: sessions (list, then a session's detail), card history,
56
60
  * when the dataset carries the course's strategy docs, the pipeline with this
57
- * learner's run stats. Session timelines link into card history. Navigation is internal;
58
- * hosts that want URLs can compose the three views themselves.
61
+ * learner's run stats, and per-tag ELO. Session timelines link into card history. Navigation is internal;
62
+ * hosts that want URLs can compose the views themselves.
59
63
  */
60
64
  const props = defineProps<{
61
65
  dataset: LearnerDataset;
62
66
  interpreters?: DiagnosticsInterpreters;
63
67
  }>();
64
68
 
65
- const tab = ref<'sessions' | 'cards' | 'pipeline'>('sessions');
69
+ const tab = ref<'sessions' | 'cards' | 'pipeline' | 'elo'>('sessions');
66
70
  const sessionId = ref<string | null>(null);
67
71
  const focusCard = ref<string | undefined>(undefined);
68
72
  const pipelineStats = computed(() => pipelineRunStats(props.dataset));