@pie-element/categorize 13.2.0-next.20 → 13.2.0-next.22
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/browser/{alert-dialog-Cxmcc8UK.js → alert-dialog-BD8IHb5_.js} +11 -5
- package/dist/browser/alert-dialog-BD8IHb5_.js.map +1 -0
- package/dist/browser/author/index.js +1 -1
- package/dist/browser/controller/index.js +2 -2
- package/dist/browser/controller/index.js.map +1 -1
- package/dist/browser/delivery/index.js +1 -1
- package/dist/browser/editor-runtime/{alert-dialog-BWczQUJH.js → alert-dialog-C8lWYQ3Q.js} +11 -5
- package/dist/browser/editor-runtime/alert-dialog-C8lWYQ3Q.js.map +1 -0
- package/dist/browser/editor-runtime/author/index.js +1 -1
- package/dist/browser/editor-runtime/controller/index.js +2 -2
- package/dist/browser/editor-runtime/controller/index.js.map +1 -1
- package/dist/browser/editor-runtime/delivery/index.js +1 -1
- package/dist/index.iife.js +1 -1
- package/package.json +8 -8
- package/dist/browser/alert-dialog-Cxmcc8UK.js.map +0 -1
- package/dist/browser/editor-runtime/alert-dialog-BWczQUJH.js.map +0 -1
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
}
|
|
18
18
|
})([["cb0f0518b022d739", (url) => "@font-face{font-family:Symbola;src:local(Symbola Regular),local(Symbola),url(\"" + url(() => new URL("../assets/Symbola-4c507403.woff2", import.meta.url)) + "\")format(\"woff2\")}.mq-editable-field{display:inline-block}.mq-editable-field .mq-cursor{z-index:1;border-left:1px solid #000;margin-left:-1px;padding:0;display:inline-block;position:relative}.mq-editable-field .mq-cursor.mq-blink{visibility:hidden}.mq-editable-field,.mq-math-mode .mq-editable-field{border:1px solid gray}.mq-editable-field.mq-focused,.mq-math-mode .mq-editable-field.mq-focused{border-color:#709ac0;border-radius:1px;box-shadow:0 0 1px 2px #8bd,inset 0 0 2px #6ae}.mq-math-mode .mq-editable-field{margin:1px}.mq-editable-field .mq-latex-command-input{color:inherit;border:1px solid gray;margin-left:2px;margin-right:1px;padding-right:1px;font-family:Courier New,monospace}.mq-editable-field .mq-latex-command-input.mq-empty{background:0 0}.mq-editable-field .mq-latex-command-input.mq-hasCursor{border-color:activeborder}.mq-editable-field.mq-empty:after,.mq-editable-field.mq-text-mode:after,.mq-math-mode .mq-empty:after,.mq-editable-field .mq-cursor:only-child:after,.mq-editable-field .mq-textarea+.mq-cursor:last-child:after{visibility:hidden;content:\"c\"}.mq-editable-field .mq-text-mode .mq-cursor:only-child:after{content:\"\"}.mq-editable-field.mq-text-mode{overflow:auto hidden}.mq-root-block,.mq-math-mode .mq-root-block{box-sizing:border-box;white-space:nowrap;vertical-align:middle;width:100%;padding:2px;display:inline-block;overflow:hidden}.mq-math-mode{font-variant:normal;font-size:115%;font-style:normal;font-weight:400;line-height:1;display:inline-block}.mq-math-mode .mq-non-leaf,.mq-math-mode .mq-scaled{display:inline-block}.mq-math-mode var,.mq-math-mode .mq-text-mode,.mq-math-mode .mq-nonSymbola{font-family:Times New Roman,Symbola,serif;line-height:.9}.mq-math-mode *{font-size:inherit;line-height:inherit;-webkit-user-select:none;user-select:none;box-sizing:border-box;border-color:#000;margin:0;padding:0}.mq-math-mode .mq-empty,.mq-math-mode.mq-empty{background:0 0}.mq-math-mode .mq-text-mode{white-space:pre;display:inline-block}.mq-math-mode .mq-text-mode.mq-hasCursor{min-width:1ex;margin:0 -.1em;padding:0 .1em;box-shadow:inset 0 .1em .2em #a9a9a9}.mq-math-mode .mq-font{font:1em Times New Roman,Symbola,serif}.mq-math-mode .mq-font *{font-family:inherit;font-style:inherit}.mq-math-mode b,.mq-math-mode b.mq-font{font-weight:bolder}.mq-math-mode var,.mq-math-mode i,.mq-math-mode i.mq-font{font-style:italic}.mq-math-mode var.mq-f{margin-left:.1em;margin-right:.2em}.mq-math-mode .mq-roman var.mq-f{margin:0}.mq-math-mode big{font-size:200%}.mq-math-mode .mq-int>big{vertical-align:-.16em;display:inline-block;transform:scaleX(.7)}.mq-math-mode .mq-int>.mq-supsub{vertical-align:-1.1em;padding-right:.2em;font-size:80%}.mq-math-mode .mq-int>.mq-supsub>.mq-sup>.mq-sup-inner{vertical-align:1.3em}.mq-math-mode .mq-int>.mq-supsub>.mq-sub{margin-left:-.35em}.mq-math-mode .mq-roman{font-style:normal}.mq-math-mode .mq-sans-serif{font-family:sans-serif,Symbola,serif}.mq-math-mode .mq-monospace{font-family:monospace,Symbola,serif}.mq-math-mode .mq-overleftrightarrow{margin-top:.35em;position:relative}.mq-math-mode .mq-overleftrightarrow .mq-overleftrightarrow-inner{text-align:center;border-top:.14em solid #4d4d4d;min-width:1em;margin:0 .1em;padding-top:.35em;display:inline-block;position:relative}.mq-math-mode .mq-overleftrightarrow .mq-overleftrightarrow-inner .mq-empty{min-width:1em;margin-top:.1em;display:inline-block}.mq-math-mode .mq-overleftrightarrow .mq-overleftrightarrow-inner .mq-overleftrightarrow-inner-right{text-align:right;font-family:LearnosityIconsRegular;font-size:.75em;line-height:1em;display:block;position:absolute;top:-.562em;right:-.4em}.mq-math-mode .mq-overleftrightarrow .mq-overleftrightarrow-inner .mq-overleftrightarrow-inner-left{text-align:left;font-family:LearnosityIconsRegular;font-size:.75em;line-height:1em;display:block;position:absolute;top:-.562em;left:-.4em}.mq-math-mode .mq-overline .mq-overline-inner{text-align:center;border-top:.14em solid #4d4d4d;margin-left:.1em;padding-top:.2em;padding-right:.1em;display:inline-block}.mq-math-mode .mq-overline .mq-overline-inner .mq-empty{min-width:1em;margin-top:.1em;display:inline-block}.mq-math-mode .mq-overline .mq-overline-inner .mq-overline-inner-right,.mq-math-mode .mq-overline .mq-overline-inner .mq-overline-inner-left{display:none}.mq-math-mode .mq-longdiv{padding-top:.2em}.mq-math-mode .mq-longdiv .mq-longdiv-curve-border{border-top-right-radius:100em;border-bottom-right-radius:100em;width:2px;max-width:2px;margin-right:-.12em;padding-top:.2em;font-size:1.4em;display:inline}.mq-math-mode .mq-longdiv .mq-longdiv-inner{text-align:center;border-top:1px solid gray;border-radius:0 0 0 10px;min-width:1em;margin-left:-.2em;margin-right:.15em;padding-top:.19em;padding-left:.44em;font-size:1em;display:inline}.mq-math-mode .mq-longdiv .mq-longdiv-inner .mq-empty{min-width:1.5em;display:inline-block}.mq-math-mode .mq-underline{border-bottom:1px solid #000;margin-bottom:1px}.mq-math-mode .mq-underline.mq-empty{min-width:1em}.mq-math-mode .mq-overarc{-moz-border-radius-topright:50% .3em;-moz-border-radius-topleft:50% .3em;border-top:1px solid #000;border-top-left-radius:50% .3em;border-top-right-radius:50% .3em;margin-top:1px;padding-top:.15em}.mq-math-mode .mq-overarrow{margin-top:.35em;position:relative}.mq-math-mode .mq-overarrow .mq-overarrow-inner{text-align:center;border-top:.14em solid #4d4d4d;min-width:1em;margin:0 .1em;padding-top:.35em;display:inline-block;position:relative}.mq-math-mode .mq-overarrow .mq-overarrow-inner .mq-empty{min-width:1em;margin-top:.1em;display:inline-block}.mq-math-mode .mq-overarrow .mq-overarrow-inner .mq-overarrow-inner-right{text-align:right;font-family:LearnosityIconsRegular;font-size:.75em;line-height:1em;display:block;position:absolute;top:-.562em;right:-.4em}.mq-math-mode .mq-overarrow .mq-overarrow-inner .mq-overarrow-inner-left{text-align:left;font-family:LearnosityIconsRegular;font-size:.75em;line-height:1em;display:none;position:absolute;top:-.562em;left:-.4em}.mq-math-mode .mq-overarrow.mq-arrow-left .mq-overarrow-inner .mq-overarrow-inner-right{display:none}.mq-math-mode .mq-overarrow.mq-arrow-left .mq-overarrow-inner .mq-overarrow-inner-left{display:block}.mq-math-mode .mq-overarrow.mq-arrow-both{vertical-align:text-bottom}.mq-math-mode .mq-overarrow.mq-arrow-both.mq-empty{min-height:1.23em}.mq-math-mode .mq-overarrow.mq-arrow-both.mq-empty:after{top:-.34em}.mq-math-mode .mq-overarrow.mq-arrow-both:before{filter:FlipH;-ms-filter:\"FlipH\";transform:scaleX(-1)}.mq-math-mode .mq-overarrow.mq-arrow-both:after{content:\"➤\";visibility:visible;text-align:right;font-size:.5em;line-height:0;display:block;position:relative;top:-2.3em}.mq-math-mode .mq-xarrow{text-align:center;vertical-align:.9em;padding:0 .2em;font-size:70%;position:relative}.mq-math-mode .mq-xarrow .mq-xarrow-over{border-bottom:1px solid #000;padding:.1em .1em .2em;display:block;position:relative}.mq-math-mode .mq-xarrow .mq-xarrow-under{float:left;margin-bottom:.2em;padding:0 .1em .2em;position:relative;top:.2em}.mq-math-mode .mq-xarrow .mq-xarrow-over:before{content:\"➤\";height:1em;font-size:.6em;display:block;position:absolute;bottom:-.62em;right:-.3em}.mq-math-mode .mq-xarrow.mq-arrow-left .mq-xarrow-over:before{filter:FlipH;-ms-filter:\"FlipH\";left:-.3em;right:auto;transform:scaleX(-1)}.mq-math-mode .mq-binary-operator{padding:0 .2em;display:inline-block}.mq-math-mode .mq-supsub{text-align:left;vertical-align:-.5em;font-size:90%}.mq-math-mode .mq-supsub.mq-sup-only{vertical-align:.5em}.mq-math-mode .mq-supsub.mq-sup-only .mq-sup{vertical-align:text-bottom;display:inline-block}.mq-math-mode .mq-supsub .mq-sup{display:block}.mq-math-mode .mq-supsub .mq-sub{float:left;display:block}.mq-math-mode .mq-supsub .mq-binary-operator{padding:0 .1em}.mq-math-mode .mq-supsub .mq-fraction{font-size:70%}.mq-math-mode sup.mq-nthroot{vertical-align:.8em;min-width:.5em;margin-left:.2em;margin-right:-.6em;font-size:80%}.mq-math-mode .mq-paren{vertical-align:top;transform-origin:50% .06em;padding:0 .1em}.mq-math-mode .mq-paren.mq-ghost{color:silver}.mq-math-mode .mq-paren+span{margin-top:.1em;margin-bottom:.1em}.mq-math-mode .mq-array{vertical-align:middle;text-align:center}.mq-math-mode .mq-array>span{display:block}.mq-math-mode .mq-operator-name{font-family:Symbola,Times New Roman,serif;font-style:normal;line-height:.9}.mq-math-mode var.mq-operator-name.mq-first{padding-left:.2em}.mq-math-mode var.mq-operator-name.mq-last,.mq-math-mode .mq-supsub.mq-after-operator-name{padding-right:.2em}.mq-math-mode .mq-fraction{text-align:center;vertical-align:-.4em;padding:0 .2em;font-size:90%}.mq-math-mode .mq-fraction,.mq-math-mode .mq-large-operator{display:-moz-groupbox}.mq-math-mode x:-moz-any-link{display:-moz-groupbox}.mq-math-mode .mq-fraction,.mq-math-mode .mq-large-operator,.mq-math-mode x:default{display:inline-block}.mq-math-mode x:-moz-any-link{display:inline-block}.mq-math-mode .mq-underset.mq-tilde-vector .mq-under{line-height:.6em}.mq-math-mode .mq-numerator,.mq-math-mode .mq-denominator,.mq-math-mode .mq-dot-recurring,.mq-math-mode .mq-over,.mq-math-mode .mq-under{display:block}.mq-math-mode .mq-numerator,.mq-math-mode .mq-over{margin-bottom:.2em;padding:0 .1em}.mq-math-mode .mq-denominator{float:right;border-top:1px solid;width:100%;padding:.3em .1em .1em}.mq-math-mode .mq-dot-recurring{text-align:center;height:.6em}.mq-math-mode .mq-overunder{text-align:center;position:relative;top:.01em}.mq-math-mode .mq-overunder .mq-font{font-family:inherit}.mq-math-mode .mq-overunder.mq-underset{vertical-align:text-top}.mq-math-mode .mq-overunder.mq-underset .mq-under,.mq-math-mode .mq-overunder.mq-overset .mq-over{font-size:.7em;display:block}.mq-math-mode .mq-sqrt-prefix{vertical-align:top;transform-origin:top;padding-top:0;position:relative;top:.1em}.mq-math-mode .mq-sqrt-stem{border-top:1px solid;margin-top:1px;margin-right:.1em;padding-top:1px;padding-left:.15em;padding-right:.2em}.mq-math-mode .mq-diacritic-above{text-align:center;line-height:.4em;display:block}.mq-math-mode .mq-diacritic-stem{text-align:center;display:block}.mq-math-mode .mq-hat-prefix{text-align:center;margin-bottom:-.7em;line-height:.95em;display:block;transform:scaleX(1.5)}.mq-math-mode .mq-hat-stem{display:block}.mq-math-mode .mq-large-operator{vertical-align:-.2em;text-align:center;vertical-align:middle;padding:.2em}.mq-math-mode .mq-large-operator .mq-from,.mq-math-mode .mq-large-operator big,.mq-math-mode .mq-large-operator .mq-to{display:block}.mq-math-mode .mq-large-operator .mq-from,.mq-math-mode .mq-large-operator .mq-to{font-size:80%}.mq-math-mode .mq-large-operator .mq-from{float:right;width:100%}.mq-math-mode .mq-lim{text-align:center}.mq-math-mode .mq-lim span{display:block}.mq-math-mode .mq-lim .mq-approaches{float:right;width:100%;font-size:80%}.mq-math-mode .mq-lim .mq-approaches span>span{display:inline}.mq-math-mode .mq-matrix{vertical-align:middle;margin-left:.1em;margin-right:.1em}.mq-math-mode .mq-matrix table{border-spacing:3px;border-collapse:separate;border-bottom:none;width:auto}.mq-math-mode .mq-matrix table.mq-rows-1{vertical-align:middle;margin-bottom:1px}.mq-math-mode .mq-matrix td{vertical-align:baseline;border:1px dotted #fff;width:auto;padding:.1em .3em}.mq-math-mode .mq-matrix td.mq-empty{border:1px dotted #000}.mq-math-mode .mq-abs{border-left:1px solid #000;border-right:1px solid #000;margin-left:.1em;margin-right:.1em;padding-left:.2em;padding-right:.2em}.mq-math-mode .mq-lrnplaceholder{margin-left:.05em;margin-right:.05em}.mq-math-mode .mq-parallelogram{margin-top:-.5em;line-height:1em;position:relative;overflow:hidden}.mq-math-mode .mq-parallelogram .mq-parallelogram-inner{font-size:2em;position:relative;top:.23em}.mq-math-mode,.mq-math-mode .mq-editable-field{cursor:text;font-family:Symbola,Times New Roman,serif}.mq-math-mode .mq-longdiv .mq-longdiv-curve-border,.mq-math-mode .mq-editable-field .mq-longdiv .mq-longdiv-curve-border{font-size:1.33em}.mq-overarrow{text-align:center;border-top:1px solid #000;min-width:.5em;margin-top:1px;padding-top:.2em}.mq-overarrow:before{content:\"➤\";text-align:right;font-size:.5em;line-height:0;display:block;position:relative;top:-.34em}.mq-overarrow.mq-arrow-left:before{filter:FlipH;-ms-filter:\"FlipH\";transform:scaleX(-1)}.mq-overarrow.mq-arrow-both{vertical-align:text-bottom}.mq-overarrow.mq-arrow-both.mq-empty{min-height:1.23em}.mq-overarrow.mq-arrow-both.mq-empty:after{top:-.34em}.mq-overarrow.mq-arrow-both:before{filter:FlipH;-ms-filter:\"FlipH\";transform:scaleX(-1)}.mq-overarrow.mq-arrow-both:after{content:\"➤\";visibility:visible;text-align:right;font-size:.5em;line-height:0;display:block;position:relative;top:-2.3em}.mq-math-mode .mq-selection,.mq-editable-field .mq-selection,.mq-math-mode .mq-selection .mq-non-leaf,.mq-editable-field .mq-selection .mq-non-leaf,.mq-math-mode .mq-selection .mq-scaled,.mq-editable-field .mq-selection .mq-scaled{color:highlighttext;border-color:highlighttext;background:highlight!important}.mq-math-mode .mq-selection .mq-matrixed,.mq-editable-field .mq-selection .mq-matrixed{background:#39f!important}.mq-math-mode .mq-selection .mq-matrixed-container,.mq-editable-field .mq-selection .mq-matrixed-container{filter:progid:DXImageTransform.Microsoft.Chroma(color=\"#3399FF\")!important}.mq-math-mode .mq-selection.mq-blur,.mq-editable-field .mq-selection.mq-blur,.mq-math-mode .mq-selection.mq-blur .mq-non-leaf,.mq-editable-field .mq-selection.mq-blur .mq-non-leaf,.mq-math-mode .mq-selection.mq-blur .mq-scaled,.mq-editable-field .mq-selection.mq-blur .mq-scaled,.mq-math-mode .mq-selection.mq-blur .mq-matrixed,.mq-editable-field .mq-selection.mq-blur .mq-matrixed{color:#000;border-color:#000;background:#d4d4d4!important}.mq-math-mode .mq-selection.mq-blur .mq-matrixed-container,.mq-editable-field .mq-selection.mq-blur .mq-matrixed-container{filter:progid:DXImageTransform.Microsoft.Chroma(color=\"#D4D4D4\")!important}.mq-editable-field .mq-textarea,.mq-math-mode .mq-textarea{-webkit-user-select:text;user-select:text;position:relative}.mq-editable-field .mq-textarea>textarea,.mq-math-mode .mq-textarea>textarea{opacity:0;overflow:hidden}.mq-editable-field .mq-textarea *,.mq-math-mode .mq-textarea *,.mq-editable-field .mq-selectable,.mq-math-mode .mq-selectable{-webkit-user-select:text;user-select:text;clip:rect(1em 1em 1em 1em);resize:none;box-sizing:content-box;width:1px;height:1px;position:absolute;transform:scale(0)}.mq-math-mode .mq-matrixed{background:#fff;display:inline-block}.mq-math-mode .mq-matrixed-container{filter:progid:DXImageTransform.Microsoft.Chroma(color=\"white\");margin-top:-.1em}.mq-math-mode .mq-matrix table{border-spacing:2px}button .mq-math-mode .mq-matrix table.mq-rows-2 td,button .mq-math-mode .mq-matrix table.mq-rows-3 td{width:.9em;font-size:.3em}button .mq-math-mode .mq-matrix table.mq-rows-2{margin-bottom:-2px}button .mq-math-mode .mq-matrix table.mq-rows-1{margin-bottom:3px}button .mq-math-mode .mq-matrix table.mq-rows-1 td{width:1.1em;margin-bottom:3px;font-size:.6em}button .mq-math-mode .mq-matrix .matrix-edit-content-row{text-align:center;vertical-align:middle;display:inline-block}button .mq-math-mode .mq-matrix .matrix-edit-content-row p{font-size:.7em}button .mq-math-mode .mq-matrix .matrix-edit-content-col{text-align:center;vertical-align:middle;display:inline-block}button .mq-math-mode .mq-matrix .matrix-edit-content-col p{padding:0 .15em;font-size:.7em}button .mq-math-mode .mq-matrix .mq-paren{padding:0;display:inline-block;transform:scale(1.13,1.77)}button .matrix-edit .mq-empty{width:.8em;margin:.1em;padding:.1em;font-size:.4em}\n"]]);
|
|
19
19
|
import { a as e, i as t, n, r, t as i } from "../rolldown-runtime-CHQKHQ89.js";
|
|
20
|
-
import { $ as a, A as o, At as s, B as c, Bt as l, Ct as u, D as d, Dt as f, Et as p, Ft as m, G as h, Ht as g, I as _, It as v, J as y, K as b, L as x, Lt as S, M as C, Mt as w, N as T, Nt as E, O as D, Ot as ee, P as O, Pt as te, Q as k, R as ne, Rt as re, St as A, Tt as ie, U as ae, Ut as oe, V as se, Vt as ce, W as le, X as j, Y as M, Z as ue, _ as de, _t as fe, a as pe, at as me, b as he, c as ge, ct as _e, d as ve, dt as ye, et as N, f as P, ft as be, g as xe, gt as Se, h as Ce, ht as we, i as Te, it as Ee, j as De, jt as F, k as Oe, kt as ke, l as Ae, lt as je, mt as Me, n as Ne, nt as Pe, o as Fe, ot as Ie, pt as Le, q as Re, r as ze, rt as Be, s as Ve, st as He, t as Ue, tt as I, u as We, ut as Ge, v as Ke, vt as qe, wt as Je, x as Ye, xt as Xe, y as Ze, z as Qe, zt as $e } from "../alert-dialog-
|
|
20
|
+
import { $ as a, A as o, At as s, B as c, Bt as l, Ct as u, D as d, Dt as f, Et as p, Ft as m, G as h, Ht as g, I as _, It as v, J as y, K as b, L as x, Lt as S, M as C, Mt as w, N as T, Nt as E, O as D, Ot as ee, P as O, Pt as te, Q as k, R as ne, Rt as re, St as A, Tt as ie, U as ae, Ut as oe, V as se, Vt as ce, W as le, X as j, Y as M, Z as ue, _ as de, _t as fe, a as pe, at as me, b as he, c as ge, ct as _e, d as ve, dt as ye, et as N, f as P, ft as be, g as xe, gt as Se, h as Ce, ht as we, i as Te, it as Ee, j as De, jt as F, k as Oe, kt as ke, l as Ae, lt as je, mt as Me, n as Ne, nt as Pe, o as Fe, ot as Ie, pt as Le, q as Re, r as ze, rt as Be, s as Ve, st as He, t as Ue, tt as I, u as We, ut as Ge, v as Ke, vt as qe, wt as Je, x as Ye, xt as Xe, y as Ze, z as Qe, zt as $e } from "../alert-dialog-C8lWYQ3Q.js";
|
|
21
21
|
import { C as et, D as tt, E as nt, S as rt, T as it, _ as at, a as ot, b as st, c as ct, d as lt, f as ut, g as dt, h as ft, i as pt, l as mt, m as ht, n as gt, o as _t, p as vt, r as yt, s as bt, u as xt, v as St, w as Ct, x as wt, y as Tt } from "../dist-BiRlv37L.js";
|
|
22
22
|
import * as L from "react";
|
|
23
23
|
import R, { Component as Et, createContext as Dt, createElement as Ot, createRef as kt, forwardRef as At, memo as jt, useCallback as Mt, useContext as Nt, useDebugValue as Pt, useEffect as Ft, useLayoutEffect as It, useMemo as Lt, useRef as Rt, useState as zt, version as Bt } from "react";
|
|
@@ -138,7 +138,7 @@ async function v(e, t, n, r = "value") {
|
|
|
138
138
|
let a = g(e);
|
|
139
139
|
if (n && typeof n == "function") try {
|
|
140
140
|
let e = h(a.map((e) => e[r]));
|
|
141
|
-
_(e) ? console.error(`shuffledValues is an empty array - refusing to call updateSession. shuffledChoices: ${JSON.stringify(a)}, key: ${r}`) :
|
|
141
|
+
_(e) ? console.error(`shuffledValues is an empty array - refusing to call updateSession. shuffledChoices: ${JSON.stringify(a)}, key: ${r}`) : await n(t.id, t.element, { shuffledValues: e });
|
|
142
142
|
} catch (e) {
|
|
143
143
|
console.warn("Unable to save shuffled order for choices"), console.error(e);
|
|
144
144
|
}
|
|
@@ -146,7 +146,7 @@ async function v(e, t, n, r = "value") {
|
|
|
146
146
|
return a;
|
|
147
147
|
}
|
|
148
148
|
function y(e, t, n) {
|
|
149
|
-
return !!(e.lockChoiceOrder || n["@pie-element"]?.lockChoiceOrder
|
|
149
|
+
return !!(e.lockChoiceOrder || n?.["@pie-element"]?.lockChoiceOrder);
|
|
150
150
|
}
|
|
151
151
|
var b = /* @__PURE__ */ m({ enabled: () => x });
|
|
152
152
|
function x(e, t, n) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../../../../lib-react/categorize/dist/scoring.js","../../../../../../shared/feedback/dist/index.js","../../../../../../shared/controller-utils/dist/index.js","../../../../src/controller/defaults.ts","../../../../src/controller/utils.ts","../../../../src/controller/index.ts"],"sourcesContent":["import e from \"debug\";\n//#region src/scoring.ts\nvar t = e(\"@pie-lib:categorize:scoring\"), n = (e) => !e || !e.weighting ? [] : e.weighting.enabled && e.weighting && e.weighting.rules || [], r = (e, n) => {\n\tif (t(\"partial? \", e), !(!e || !e.enabled)) {\n\t\tlet t = e.rules.find((e) => e.category === n);\n\t\treturn t && t.rules || [];\n\t}\n}, i = (e, i) => new Promise((a) => {\n\tt(\"categories: \", e, \"scoring: \", i);\n\tlet o = n(i), s = e.map((e) => ({\n\t\t...o.find((t) => t.category === e.id) || { points: 1 },\n\t\tcategory: e.id\n\t}));\n\tt(\"weights: \", s);\n\tlet c = e.reduce((e, t) => {\n\t\tlet n = s.find((e) => e.category === t.id);\n\t\treturn e += n.points;\n\t}, 0);\n\tt(\"total: \", c);\n\tlet l = e.map((e) => {\n\t\tlet n = s.find((t) => t.category === e.id).points;\n\t\tif (t(\"category: \", e), e.correct === !0) return {\n\t\t\tcategory: e.id,\n\t\t\tscore: n,\n\t\t\tpoints: n\n\t\t};\n\t\t{\n\t\t\tlet a = r(i.partial, e.id);\n\t\t\tif (t(\"partial rules for category: \", a), a) {\n\t\t\t\tlet r = (e.choices || []).filter((e) => e.correct).length;\n\t\t\t\tt(\"correctCount: \", r);\n\t\t\t\tlet i = a.find((e) => e.count === r);\n\t\t\t\tt(\"rule: \", i), i ||= {\n\t\t\t\t\tpercent: 0,\n\t\t\t\t\tcount: r\n\t\t\t\t};\n\t\t\t\tlet o = n * (i.percent / 100);\n\t\t\t\treturn {\n\t\t\t\t\tcategory: e.id,\n\t\t\t\t\tscore: o,\n\t\t\t\t\tpoints: n,\n\t\t\t\t\tpartial: {\n\t\t\t\t\t\tcorrectChoices: r,\n\t\t\t\t\t\trule: i\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t} else return {\n\t\t\t\tcategory: e.id,\n\t\t\t\tscore: 0,\n\t\t\t\tpoints: n\n\t\t\t};\n\t\t}\n\t}), u = l.reduce((e, t) => e += t.score, 0);\n\tt(\"weightedScore: \", u), a({\n\t\tscore: parseFloat((u / c).toFixed(2), 10),\n\t\tdetails: {\n\t\t\tweighted: {\n\t\t\t\ttotal: c,\n\t\t\t\tscore: u\n\t\t\t},\n\t\t\tcategories: l\n\t\t}\n\t});\n});\n//#endregion\nexport { i as score };\n","//#region src/defaults.ts\nvar e = {\n\tcorrect: {\n\t\ttype: \"default\",\n\t\tdefault: \"Correct\",\n\t\tcustom: \"Correct\"\n\t},\n\tincorrect: {\n\t\ttype: \"default\",\n\t\tdefault: \"Incorrect\",\n\t\tcustom: \"Incorrect\"\n\t},\n\tpartial: {\n\t\ttype: \"default\",\n\t\tdefault: \"Nearly\",\n\t\tcustom: \"Nearly\"\n\t},\n\tunanswered: {\n\t\ttype: \"default\",\n\t\tdefault: \"You have not entered a response\",\n\t\tcustom: \"You have not entered a response\"\n\t}\n};\n//#endregion\n//#region src/utils.ts\nfunction t(e) {\n\treturn e === \"partially-correct\" ? \"partial\" : e;\n}\n//#endregion\n//#region src/index.ts\nfunction n(n, i = {}) {\n\treturn new Promise((a) => {\n\t\tlet o = {\n\t\t\t...e,\n\t\t\t...i\n\t\t}, s = t(n), c = o[s], l = e[s];\n\t\tr(c, l[c.type]).then(a);\n\t});\n}\nfunction r(e, t) {\n\treturn new Promise((n) => {\n\t\tif (!e || e.type === \"none\") {\n\t\t\tn(void 0);\n\t\t\treturn;\n\t\t}\n\t\tn(e[e.type] || t);\n\t});\n}\nfunction i(n, r = {}) {\n\tlet i = {\n\t\t...e,\n\t\t...r\n\t}, o = t(n), s = i[o], c = e[o];\n\treturn a(s, c[s.type]);\n}\nfunction a(e, t) {\n\tif (!(!e || e.type === \"none\")) return e[e.type] || t;\n}\n//#endregion\nexport { e as defaultFeedback, a as getActualFeedback, i as getActualFeedbackForCorrectness, r as getFeedback, n as getFeedbackForCorrectness, t as normalizeCorrectness };\n","//#region \\0rolldown/runtime.js\nvar e = Object.defineProperty, t = (t, n) => {\n\tlet r = {};\n\tfor (var i in t) e(r, i, {\n\t\tget: t[i],\n\t\tenumerable: !0\n\t});\n\treturn n || e(r, Symbol.toStringTag, { value: \"Module\" }), r;\n};\n//#endregion\n//#region src/persistence.ts\nfunction n(e) {\n\treturn Array.isArray(e) ? e.filter((e) => e != null) : [];\n}\nfunction r(e) {\n\tlet t = [...e];\n\tfor (let e = t.length - 1; e > 0; e--) {\n\t\tlet n = Math.floor(Math.random() * (e + 1));\n\t\t[t[e], t[n]] = [t[n], t[e]];\n\t}\n\treturn t;\n}\nfunction i(e) {\n\treturn e == null ? !0 : Array.isArray(e) ? e.length === 0 : typeof e == \"object\" && Object.keys(e).length === 0;\n}\nasync function a(e, t, a, o = \"value\") {\n\tlet s = n(t?.data?.shuffledValues ?? t?.shuffledValues ?? []);\n\tif (!t) {\n\t\tconsole.warn(\"Unable to save shuffled choices because there's no session.\");\n\t\treturn;\n\t}\n\tif (!i(s)) return n(s.map((t) => e.find((e) => e[o] === t)));\n\tlet c = r(e);\n\tif (a && typeof a == \"function\") try {\n\t\tlet e = n(c.map((e) => e[o]));\n\t\ti(e) ? console.error(`shuffledValues is an empty array - refusing to call updateSession. shuffledChoices: ${JSON.stringify(c)}, key: ${o}`) : t.id && t.element && await a(t.id, t.element, { shuffledValues: e });\n\t} catch (e) {\n\t\tconsole.warn(\"Unable to save shuffled order for choices\"), console.error(e);\n\t}\n\telse console.warn(\"Unable to save shuffled choices, shuffle will happen every time.\");\n\treturn c;\n}\nfunction o(e, t, n) {\n\treturn !!(e.lockChoiceOrder || n[\"@pie-element\"]?.lockChoiceOrder || (n.role ?? \"student\") === \"instructor\");\n}\n//#endregion\n//#region src/partial-scoring.ts\nvar s = /* @__PURE__ */ t({ enabled: () => c });\nfunction c(e, t, n) {\n\treturn e?.partialScoring === !1 || t?.partialScoring === !1 ? !1 : typeof n != \"boolean\" || n;\n}\n//#endregion\nexport { a as getShuffledChoices, o as lockChoices, s as partialScoring };\n","// @ts-nocheck\n/**\n * @synced-from pie-elements/packages/categorize/controller/src/defaults.js\n * @auto-generated\n *\n * This file is automatically synced from pie-elements and converted to TypeScript.\n * Manual edits will be overwritten on next sync.\n * To make changes, edit the upstream JavaScript file and run sync again.\n */\n\nexport default {\n alternates: [],\n categories: [],\n categoriesPerRow: 2,\n choices: [],\n choicesLabel: '',\n choicesPosition: 'below',\n correctResponse: [],\n feedbackEnabled: false,\n lockChoiceOrder: true,\n maxAnswerChoices: 6,\n maxChoicesPerCategory: 0,\n partialScoring: true,\n prompt: '',\n promptEnabled: true,\n rationale: '',\n rationaleEnabled: true,\n rowLabels: [''],\n studentInstructionsEnabled: true,\n teacherInstructions: '',\n teacherInstructionsEnabled: true,\n toolbarEditorPosition: 'bottom',\n minRowHeight: '80px',\n};\n","// @ts-nocheck\n/**\n * @synced-from pie-elements/packages/categorize/controller/src/utils.js\n * @auto-generated\n *\n * This file is automatically synced from pie-elements and converted to TypeScript.\n * Manual edits will be overwritten on next sync.\n * To make changes, edit the upstream JavaScript file and run sync again.\n */\n\n// used in configure too, for consistency modify it there too\nexport const multiplePlacements = { enabled: 'Yes', disabled: 'No', perChoice: 'Set Per Choice' };\n\n// used to validate the config\nexport const isCorrectResponseDuplicated = (choices, alternate) => {\n if (choices.length < 1 || alternate.length < 1) {\n return -1;\n }\n\n const stringChoices = JSON.stringify(choices.sort());\n const stringAlternate = alternate.reduce(\n (total, current) => (current.length > 0 ? [...total, JSON.stringify(current.sort())] : total),\n [],\n );\n const foundIndexDuplicate = stringAlternate.findIndex((alternate) => alternate.length && alternate === stringChoices);\n\n return foundIndexDuplicate;\n};\n\nexport const isAlternateDuplicated = (alternate) => {\n if (alternate.length <= 1) {\n return -1;\n }\n\n const elementSet = new Set();\n const stringAlternate = alternate.reduce(\n (total, current) => (current.length > 0 ? [...total, JSON.stringify(current.sort())] : total),\n [],\n );\n\n for (let i = 0; i < stringAlternate.length; i++) {\n if (elementSet.has(stringAlternate[i]) && stringAlternate[i]) {\n return i;\n }\n\n elementSet.add(stringAlternate[i]);\n }\n\n return -1;\n};\n\n// calculate the minimum number of populated response areas (categories) in the correct answer or alternates\n// and create an array with the possible responses ids\nexport const getCompleteResponseDetails = (correctResponse, alternates, allChoices) => {\n const choicesPerCategory = correctResponse.map((category) => category.choices);\n const possibleResponses = [choicesPerCategory.flat()];\n let responseAreasToBeFilled = choicesPerCategory.filter((choices) => choices.length).length;\n\n if (alternates.length) {\n const alternatesPerChoice = alternates[0]?.length || 0; // number of alternates\n\n [...Array(alternatesPerChoice).keys()].forEach((index) => {\n const alternatesPerResponse = alternates.map((alternate) => alternate[index]);\n const filledCategories = alternatesPerResponse.filter((category) => category?.length).length;\n possibleResponses.push(alternatesPerResponse.flat());\n\n if (filledCategories < responseAreasToBeFilled) {\n responseAreasToBeFilled = filledCategories;\n }\n });\n }\n\n // check if any correct answer have any unplaced answer choices\n const hasUnplacedChoices = possibleResponses.some(\n (response) => !allChoices.every((val) => response.includes(val?.id)),\n );\n\n return { responseAreasToBeFilled, possibleResponses, hasUnplacedChoices };\n};\n","// @ts-nocheck\n/**\n * @synced-from pie-elements/packages/categorize/controller/src/index.js\n * @auto-generated\n *\n * This file is automatically synced from pie-elements and converted to TypeScript.\n * Manual edits will be overwritten on next sync.\n * To make changes, edit the upstream JavaScript file and run sync again.\n */\n\nimport { isEmpty } from '@pie-element/shared-lodash';\nimport { buildState, score } from '@pie-lib/categorize';\nimport { getFeedbackForCorrectness } from '@pie-element/shared-feedback';\nimport { lockChoices, getShuffledChoices, partialScoring } from '@pie-element/shared-controller-utils';\nimport Translator from '@pie-lib/translator';\n\nconst { translator } = Translator;\nimport defaults from './defaults.js';\nimport { getCompleteResponseDetails, isAlternateDuplicated, isCorrectResponseDuplicated, multiplePlacements } from './utils.js';\n\n// eslint-disable-next-line no-console\n\nexport { score };\n\nexport const getPartialScore = (correctResponse, builtCategories) => {\n // in the resulted best scenario we make a sum with all the correct responses\n // and all the placements\n const { placements, score } = builtCategories.reduce(\n (acc, { choices = [] }) => ({\n placements: acc.placements + choices.length,\n score: acc.score + choices.filter((ch) => ch.correct).length,\n }),\n { placements: 0, score: 0 },\n );\n\n // in the correct response, we make a sum of the max possible score\n const { maxScore } = correctResponse.reduce(\n (acc, { choices }) => ({\n maxScore: acc.maxScore + choices.length,\n }),\n { maxScore: 0 },\n );\n\n // if there are any extra placements, we subtract from the obtained score\n const extraPlacements = placements > maxScore ? placements - maxScore : 0;\n const totalScore = (score - extraPlacements) / maxScore;\n\n return totalScore < 0 ? 0 : parseFloat(totalScore.toFixed(2));\n};\n\nconst getAlternates = (correctResponse) =>\n correctResponse.map((c) => c.alternateResponses).filter((alternate) => alternate);\n\nexport const getTotalScore = (question, session, env) => {\n if (!session) {\n return 0;\n }\n\n if (Object.keys(session).length === 0) {\n return 0;\n }\n const { categories, choices } = question || {};\n let { correctResponse } = question || {};\n let { answers } = session || {};\n answers = answers || [];\n correctResponse = correctResponse || [];\n\n // this function is used in pie-ui/categorize as well, in order to get the best scenario\n // so we get the best scenario and calculate the score\n const { categories: builtCategories, correct } = buildState(categories, choices, answers, correctResponse);\n\n const alternates = getAlternates(correctResponse);\n const enabled = partialScoring.enabled(question, env);\n\n // if there are any alternates, there will be no partial scoring!\n if (enabled && !alternates.length) {\n // we apply partial scoring\n return getPartialScore(correctResponse, builtCategories);\n }\n\n // else we apply dichotomous\n return correct ? 1 : 0;\n};\n\nexport const getCorrectness = (question, session, env) => {\n return new Promise((resolve) => {\n if (env.mode === 'evaluate') {\n const score = getTotalScore(question, session, env);\n if (score === 1) {\n resolve('correct');\n } else if (score === 0) {\n resolve('incorrect');\n } else {\n resolve('partially-correct');\n }\n } else {\n resolve(undefined);\n }\n });\n};\n\nexport const createDefaultModel = (model = {}) =>\n new Promise((resolve) => {\n resolve({\n ...defaults,\n ...model,\n });\n });\n\nexport const normalize = (question) => ({ ...defaults, ...question });\n\n/**\n *\n * @param {*} question\n * @param {*} session\n * @param {*} env\n * @param {*} updateSession - optional - a function that will set the properties passed into it on the session.\n */\nexport const model = async (question, session, env, updateSession) => {\n const normalizedQuestion = normalize(question);\n const answerCorrectness = await getCorrectness(normalizedQuestion, session, env);\n\n const { mode, role } = env || {};\n\n const {\n categories,\n categoriesPerRow,\n choicesLabel,\n choicesPosition,\n correctResponse,\n feedback,\n feedbackEnabled,\n promptEnabled,\n prompt,\n rowLabels,\n rationaleEnabled,\n rationale,\n teacherInstructionsEnabled,\n teacherInstructions,\n language,\n maxChoicesPerCategory,\n extraCSSRules,\n minRowHeight,\n fontSizeFactor,\n autoplayAudioEnabled,\n completeAudioEnabled,\n customAudioButton,\n } = normalizedQuestion;\n let { choices, note } = normalizedQuestion;\n let fb;\n\n const lockChoiceOrder = lockChoices(normalizedQuestion, session, env);\n\n const filteredCorrectResponse = correctResponse.map((response) => {\n const filteredChoices = (response.choices || []).filter((choice) => choice !== 'null');\n return { ...response, choices: filteredChoices };\n });\n\n if (mode === 'evaluate' && feedbackEnabled) {\n fb = await getFeedbackForCorrectness(answerCorrectness, feedback);\n }\n\n if (!lockChoiceOrder) {\n choices = await getShuffledChoices(choices, session, updateSession, 'id');\n }\n\n const resolvedAllowMultiple = (() => {\n if (question.allowMultiplePlacementsEnabled != null) {\n return question.allowMultiplePlacementsEnabled;\n }\n // Derive from correct response: if any choice id appears in more than one category, reuse is required\n const allChoiceIds = (correctResponse || []).flatMap((cr) => cr.choices || []);\n const isExclusive = allChoiceIds.length === new Set(allChoiceIds).size;\n return isExclusive ? multiplePlacements.disabled : multiplePlacements.enabled;\n })();\n\n choices = (choices || []).map((c) => {\n let categoryCount;\n if (resolvedAllowMultiple === multiplePlacements.enabled) {\n categoryCount = 0;\n } else if (resolvedAllowMultiple === multiplePlacements.disabled) {\n categoryCount = 1;\n } else {\n // perChoice — use the value set on each choice individually\n categoryCount = c.categoryCount || 0;\n }\n return { ...c, categoryCount };\n });\n\n if (!note) {\n note = translator.t('common:commonCorrectAnswerWithAlternates', { lng: language });\n }\n\n const alternates = getAlternates(filteredCorrectResponse);\n const { responseAreasToBeFilled, possibleResponses, hasUnplacedChoices } = getCompleteResponseDetails(\n filteredCorrectResponse,\n normalizedQuestion.allowAlternateEnabled ? alternates : [],\n normalizedQuestion.choices,\n );\n const out = {\n categories: categories || [],\n categoriesPerRow: categoriesPerRow || 2,\n maxChoicesPerCategory,\n correctness: answerCorrectness,\n choices: choices || [],\n choicesLabel: choicesLabel || '',\n choicesPosition,\n disabled: mode !== 'gather',\n feedback: fb,\n lockChoiceOrder,\n prompt: promptEnabled ? prompt : null,\n rowLabels,\n note,\n env,\n showNote: alternates && alternates.length > 0,\n correctResponse: mode === 'evaluate' ? filteredCorrectResponse : undefined,\n language,\n extraCSSRules,\n fontSizeFactor,\n minRowHeight: minRowHeight,\n autoplayAudioEnabled,\n completeAudioEnabled,\n customAudioButton,\n possibleResponses,\n responseAreasToBeFilled,\n hasUnplacedChoices,\n ...(question.allowMultiplePlacementsEnabled == null && { allowMultiplePlacementsEnabled: resolvedAllowMultiple }),\n };\n\n if (role === 'instructor' && (mode === 'view' || mode === 'evaluate')) {\n out.rationale = rationaleEnabled ? rationale : null;\n out.teacherInstructions = teacherInstructionsEnabled ? teacherInstructions : null;\n } else {\n out.rationale = null;\n out.teacherInstructions = null;\n }\n\n return out;\n};\n\n /**\n * Generates detailed trace log for scoring evaluation\n * @param {Object} model - the question model\n * @param {Object} session - the student session\n * @param {Object} env - the environment\n * @returns {Array} traceLog - array of trace messages\n */\nexport const getLogTrace = (model, session, env) => {\n const traceLog = [];\n const { answers } = session || {};\n const { categories, choices, correctResponse } = model || {};\n\n const draggedChoices = answers.reduce(\n (sum, a) => sum + (a.choices?.length || 0),\n 0\n );\n\n const alternates = getAlternates(correctResponse);\n const hasAlternates = alternates.length > 0;\n const partialScoringEnabled = partialScoring.enabled(model, env);\n\n const builtState =\n draggedChoices > 0\n ? buildState(categories, choices, answers, correctResponse)\n : null;\n\n const builtCategories = builtState?.categories || [];\n \n if (draggedChoices > 0) {\n traceLog.push(`Student placed ${draggedChoices} choice(s) into categories.`);\n \n (categories || []).forEach((category) => {\n const categoryId = category.id;\n const builtCategory = builtCategories.find(c => c.id === categoryId);\n const studentChoices = builtCategory ? builtCategory.choices || [] : [];\n const correctResponseForCategory = (correctResponse || []).find(cr => cr.category === categoryId);\n const expectedChoices = correctResponseForCategory ? correctResponseForCategory.choices || [] : [];\n \n if (expectedChoices.length > 0) {\n if (studentChoices.length === 0) {\n traceLog.push(`Category ${categoryId}: student left empty (should contain ${expectedChoices.length} choice(s)).`);\n } else {\n const correctCount = studentChoices.filter(choice => choice.correct).length;\n const incorrectCount = studentChoices.length - correctCount;\n \n if (correctCount > 0 && incorrectCount === 0) {\n traceLog.push(`Category ${categoryId}: student placed ${correctCount} correct choice(s).`);\n } else if (correctCount === 0 && incorrectCount > 0) {\n traceLog.push(`Category ${categoryId}: student placed ${incorrectCount} incorrect choice(s).`);\n } else {\n traceLog.push(`Category ${categoryId}: student placed ${correctCount} correct and ${incorrectCount} incorrect choice(s).`);\n }\n }\n }\n });\n } else {\n traceLog.push('Student did not place any choices into categories.');\n }\n\n if (hasAlternates) {\n traceLog.push('Alternate response combinations are accepted for this question.');\n }\n\n if (hasAlternates) {\n traceLog.push('Score calculated using all-or-nothing scoring (alternate responses disable partial scoring).');\n traceLog.push('Student must get all categories completely correct to receive full credit.');\n } else if (partialScoringEnabled) {\n traceLog.push('Score calculated using partial scoring.');\n traceLog.push('Student receives credit for each correct placement, with deductions for incorrect placements beyond required amount.');\n \n if (draggedChoices > 0) {\n const totalCorrect = builtCategories.reduce((sum, cat) => \n sum + (cat.choices || []).filter(choice => choice.correct).length, 0);\n const totalIncorrect = draggedChoices - totalCorrect;\n const maxPossible = (correctResponse || []).reduce((sum, cat) => \n sum + (cat.choices || []).length, 0);\n \n traceLog.push(`Partial scoring calculation: ${totalCorrect} correct placements, ${totalIncorrect} incorrect placements.`);\n \n if (draggedChoices > maxPossible) {\n const extraPlacements = draggedChoices - maxPossible;\n traceLog.push(`${extraPlacements} extra placement(s) beyond required amount will be deducted from score.`);\n }\n }\n } else {\n traceLog.push('Score calculated using all-or-nothing scoring.');\n traceLog.push('Student must get all categories completely correct to receive full credit.');\n }\n\n const score = getTotalScore(model, session, env);\n traceLog.push(`Final score: ${score}.`);\n\n return traceLog;\n}\n\nexport const outcome = (question, session, env) => {\n if (env.mode !== 'evaluate') {\n return Promise.reject(new Error('Can not call outcome when mode is not evaluate'));\n } else {\n return new Promise((resolve) => {\n // A player sends an untouched item's session as `{ id, element }`, without `answers`.\n if (!session || isEmpty(session) || !session.answers) {\n resolve({\n score: 0,\n empty: true,\n traceLog: ['Student did not place any choices into categories. Score is 0.'],\n });\n } else {\n const traceLog = getLogTrace(question, session, env);\n const score = getTotalScore(question, session, env);\n \n resolve({\n score,\n empty: false,\n traceLog,\n });\n }\n });\n }\n};\n\nexport const createCorrectResponseSession = (question, env) => {\n return new Promise((resolve) => {\n const { mode, role } = env || {};\n\n if (mode !== 'evaluate' && role === 'instructor') {\n const { correctResponse } = question;\n\n resolve({ answers: correctResponse, id: 1 });\n } else {\n return resolve(null);\n }\n });\n};\n\n// remove all html tags\nconst getInnerText = (html) => (html || '').replaceAll(/<[^>]*>/g, '');\n\n// remove all html tags except img, iframe and source tag for audio\nconst getContent = (html) => (html || '').replace(/(<(?!img|iframe|source)([^>]+)>)/gi, '');\n\nexport const validate = (model = {}, config = {}) => {\n const { categories, choices, correctResponse, maxAnswerChoices } = model;\n const {\n minChoices = 1,\n minCategories = 1,\n maxCategories = 12,\n maxLengthPerChoice = 300,\n maxLengthPerCategory = 150,\n } = config;\n const reversedChoices = [...(choices || [])].reverse();\n const errors = {};\n const choicesErrors = {};\n const categoriesErrors = {};\n\n ['teacherInstructions', 'prompt', 'rationale'].forEach((field) => {\n if (config[field]?.required && !getContent(model[field])) {\n errors[field] = 'This field is required.';\n }\n });\n\n (categories || []).forEach((category) => {\n const { id, label } = category;\n\n if (getInnerText(label).length > maxLengthPerCategory) {\n categoriesErrors[id] = `Category labels should be no more than ${maxLengthPerCategory} characters long.`;\n }\n });\n\n (reversedChoices || []).forEach((choice, index) => {\n const { id, content } = choice;\n\n if (getInnerText(content).length > maxLengthPerChoice) {\n choicesErrors[id] = `Tokens should be no more than ${maxLengthPerChoice} characters long.`;\n }\n\n if (!getContent(content)) {\n choicesErrors[id] = 'Tokens should not be empty.';\n } else {\n const identicalAnswer = reversedChoices.slice(index + 1).some((c) => c.content === content);\n\n if (identicalAnswer) {\n choicesErrors[id] = 'Tokens content should be unique.';\n }\n }\n });\n\n const nbOfCategories = (categories || []).length;\n const nbOfChoices = (choices || []).length;\n\n if (nbOfCategories > maxCategories) {\n errors.categoriesError = `No more than ${maxCategories} categories should be defined.`;\n } else if (nbOfCategories < minCategories) {\n errors.categoriesError = `There should be at least ${minCategories} category defined.`;\n }\n\n if (nbOfChoices < minChoices) {\n errors.choicesError = `There should be at least ${minChoices} choices defined.`;\n } else if (nbOfChoices > maxAnswerChoices) {\n errors.choicesError = `No more than ${maxAnswerChoices} choices should be defined.`;\n }\n\n if (nbOfChoices && nbOfCategories) {\n let hasAssociations = false;\n\n (correctResponse || []).forEach((response) => {\n const { choices = [], alternateResponses = [] } = response;\n\n if (choices.length) {\n hasAssociations = true;\n } else {\n alternateResponses.forEach((alternate) => {\n if ((alternate || []).length) {\n hasAssociations = true;\n }\n });\n }\n });\n\n let duplicateAlternateIndex = -1;\n let duplicateCategory = '';\n (correctResponse || []).forEach((response) => {\n const { choices = [], alternateResponses = [], category } = response;\n\n if (duplicateAlternateIndex === -1) {\n duplicateAlternateIndex = isCorrectResponseDuplicated(choices, alternateResponses);\n\n if (duplicateAlternateIndex === -1) {\n duplicateAlternateIndex = isAlternateDuplicated(alternateResponses);\n }\n\n duplicateCategory = category;\n }\n });\n\n if (duplicateAlternateIndex > -1) {\n errors.duplicateAlternate = { index: duplicateAlternateIndex, category: duplicateCategory };\n }\n\n if (!hasAssociations) {\n errors.associationError = 'At least one token should be assigned to at least one category.';\n }\n }\n\n if (!isEmpty(choicesErrors)) {\n errors.choicesErrors = choicesErrors;\n }\n\n if (!isEmpty(categoriesErrors)) {\n errors.categoriesErrors = categoriesErrors;\n }\n\n return errors;\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../../../../lib-react/categorize/dist/scoring.js","../../../../../../shared/feedback/dist/index.js","../../../../../../shared/controller-utils/dist/index.js","../../../../src/controller/defaults.ts","../../../../src/controller/utils.ts","../../../../src/controller/index.ts"],"sourcesContent":["import e from \"debug\";\n//#region src/scoring.ts\nvar t = e(\"@pie-lib:categorize:scoring\"), n = (e) => !e || !e.weighting ? [] : e.weighting.enabled && e.weighting && e.weighting.rules || [], r = (e, n) => {\n\tif (t(\"partial? \", e), !(!e || !e.enabled)) {\n\t\tlet t = e.rules.find((e) => e.category === n);\n\t\treturn t && t.rules || [];\n\t}\n}, i = (e, i) => new Promise((a) => {\n\tt(\"categories: \", e, \"scoring: \", i);\n\tlet o = n(i), s = e.map((e) => ({\n\t\t...o.find((t) => t.category === e.id) || { points: 1 },\n\t\tcategory: e.id\n\t}));\n\tt(\"weights: \", s);\n\tlet c = e.reduce((e, t) => {\n\t\tlet n = s.find((e) => e.category === t.id);\n\t\treturn e += n.points;\n\t}, 0);\n\tt(\"total: \", c);\n\tlet l = e.map((e) => {\n\t\tlet n = s.find((t) => t.category === e.id).points;\n\t\tif (t(\"category: \", e), e.correct === !0) return {\n\t\t\tcategory: e.id,\n\t\t\tscore: n,\n\t\t\tpoints: n\n\t\t};\n\t\t{\n\t\t\tlet a = r(i.partial, e.id);\n\t\t\tif (t(\"partial rules for category: \", a), a) {\n\t\t\t\tlet r = (e.choices || []).filter((e) => e.correct).length;\n\t\t\t\tt(\"correctCount: \", r);\n\t\t\t\tlet i = a.find((e) => e.count === r);\n\t\t\t\tt(\"rule: \", i), i ||= {\n\t\t\t\t\tpercent: 0,\n\t\t\t\t\tcount: r\n\t\t\t\t};\n\t\t\t\tlet o = n * (i.percent / 100);\n\t\t\t\treturn {\n\t\t\t\t\tcategory: e.id,\n\t\t\t\t\tscore: o,\n\t\t\t\t\tpoints: n,\n\t\t\t\t\tpartial: {\n\t\t\t\t\t\tcorrectChoices: r,\n\t\t\t\t\t\trule: i\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t} else return {\n\t\t\t\tcategory: e.id,\n\t\t\t\tscore: 0,\n\t\t\t\tpoints: n\n\t\t\t};\n\t\t}\n\t}), u = l.reduce((e, t) => e += t.score, 0);\n\tt(\"weightedScore: \", u), a({\n\t\tscore: parseFloat((u / c).toFixed(2), 10),\n\t\tdetails: {\n\t\t\tweighted: {\n\t\t\t\ttotal: c,\n\t\t\t\tscore: u\n\t\t\t},\n\t\t\tcategories: l\n\t\t}\n\t});\n});\n//#endregion\nexport { i as score };\n","//#region src/defaults.ts\nvar e = {\n\tcorrect: {\n\t\ttype: \"default\",\n\t\tdefault: \"Correct\",\n\t\tcustom: \"Correct\"\n\t},\n\tincorrect: {\n\t\ttype: \"default\",\n\t\tdefault: \"Incorrect\",\n\t\tcustom: \"Incorrect\"\n\t},\n\tpartial: {\n\t\ttype: \"default\",\n\t\tdefault: \"Nearly\",\n\t\tcustom: \"Nearly\"\n\t},\n\tunanswered: {\n\t\ttype: \"default\",\n\t\tdefault: \"You have not entered a response\",\n\t\tcustom: \"You have not entered a response\"\n\t}\n};\n//#endregion\n//#region src/utils.ts\nfunction t(e) {\n\treturn e === \"partially-correct\" ? \"partial\" : e;\n}\n//#endregion\n//#region src/index.ts\nfunction n(n, i = {}) {\n\treturn new Promise((a) => {\n\t\tlet o = {\n\t\t\t...e,\n\t\t\t...i\n\t\t}, s = t(n), c = o[s], l = e[s];\n\t\tr(c, l[c.type]).then(a);\n\t});\n}\nfunction r(e, t) {\n\treturn new Promise((n) => {\n\t\tif (!e || e.type === \"none\") {\n\t\t\tn(void 0);\n\t\t\treturn;\n\t\t}\n\t\tn(e[e.type] || t);\n\t});\n}\nfunction i(n, r = {}) {\n\tlet i = {\n\t\t...e,\n\t\t...r\n\t}, o = t(n), s = i[o], c = e[o];\n\treturn a(s, c[s.type]);\n}\nfunction a(e, t) {\n\tif (!(!e || e.type === \"none\")) return e[e.type] || t;\n}\n//#endregion\nexport { e as defaultFeedback, a as getActualFeedback, i as getActualFeedbackForCorrectness, r as getFeedback, n as getFeedbackForCorrectness, t as normalizeCorrectness };\n","//#region \\0rolldown/runtime.js\nvar e = Object.defineProperty, t = (t, n) => {\n\tlet r = {};\n\tfor (var i in t) e(r, i, {\n\t\tget: t[i],\n\t\tenumerable: !0\n\t});\n\treturn n || e(r, Symbol.toStringTag, { value: \"Module\" }), r;\n};\n//#endregion\n//#region src/persistence.ts\nfunction n(e) {\n\treturn Array.isArray(e) ? e.filter((e) => e != null) : [];\n}\nfunction r(e) {\n\tlet t = [...e];\n\tfor (let e = t.length - 1; e > 0; e--) {\n\t\tlet n = Math.floor(Math.random() * (e + 1));\n\t\t[t[e], t[n]] = [t[n], t[e]];\n\t}\n\treturn t;\n}\nfunction i(e) {\n\treturn e == null ? !0 : Array.isArray(e) ? e.length === 0 : typeof e == \"object\" && Object.keys(e).length === 0;\n}\nasync function a(e, t, a, o = \"value\") {\n\tlet s = n(t?.data?.shuffledValues ?? t?.shuffledValues ?? []);\n\tif (!t) {\n\t\tconsole.warn(\"Unable to save shuffled choices because there's no session.\");\n\t\treturn;\n\t}\n\tif (!i(s)) return n(s.map((t) => e.find((e) => e[o] === t)));\n\tlet c = r(e);\n\tif (a && typeof a == \"function\") try {\n\t\tlet e = n(c.map((e) => e[o]));\n\t\ti(e) ? console.error(`shuffledValues is an empty array - refusing to call updateSession. shuffledChoices: ${JSON.stringify(c)}, key: ${o}`) : await a(t.id, t.element, { shuffledValues: e });\n\t} catch (e) {\n\t\tconsole.warn(\"Unable to save shuffled order for choices\"), console.error(e);\n\t}\n\telse console.warn(\"Unable to save shuffled choices, shuffle will happen every time.\");\n\treturn c;\n}\nfunction o(e, t, n) {\n\treturn !!(e.lockChoiceOrder || n?.[\"@pie-element\"]?.lockChoiceOrder);\n}\n//#endregion\n//#region src/partial-scoring.ts\nvar s = /* @__PURE__ */ t({ enabled: () => c });\nfunction c(e, t, n) {\n\treturn e?.partialScoring === !1 || t?.partialScoring === !1 ? !1 : typeof n != \"boolean\" || n;\n}\n//#endregion\nexport { a as getShuffledChoices, o as lockChoices, s as partialScoring };\n","// @ts-nocheck\n/**\n * @synced-from pie-elements/packages/categorize/controller/src/defaults.js\n * @auto-generated\n *\n * This file is automatically synced from pie-elements and converted to TypeScript.\n * Manual edits will be overwritten on next sync.\n * To make changes, edit the upstream JavaScript file and run sync again.\n */\n\nexport default {\n alternates: [],\n categories: [],\n categoriesPerRow: 2,\n choices: [],\n choicesLabel: '',\n choicesPosition: 'below',\n correctResponse: [],\n feedbackEnabled: false,\n lockChoiceOrder: true,\n maxAnswerChoices: 6,\n maxChoicesPerCategory: 0,\n partialScoring: true,\n prompt: '',\n promptEnabled: true,\n rationale: '',\n rationaleEnabled: true,\n rowLabels: [''],\n studentInstructionsEnabled: true,\n teacherInstructions: '',\n teacherInstructionsEnabled: true,\n toolbarEditorPosition: 'bottom',\n minRowHeight: '80px',\n};\n","// @ts-nocheck\n/**\n * @synced-from pie-elements/packages/categorize/controller/src/utils.js\n * @auto-generated\n *\n * This file is automatically synced from pie-elements and converted to TypeScript.\n * Manual edits will be overwritten on next sync.\n * To make changes, edit the upstream JavaScript file and run sync again.\n */\n\n// used in configure too, for consistency modify it there too\nexport const multiplePlacements = { enabled: 'Yes', disabled: 'No', perChoice: 'Set Per Choice' };\n\n// used to validate the config\nexport const isCorrectResponseDuplicated = (choices, alternate) => {\n if (choices.length < 1 || alternate.length < 1) {\n return -1;\n }\n\n const stringChoices = JSON.stringify(choices.sort());\n const stringAlternate = alternate.reduce(\n (total, current) => (current.length > 0 ? [...total, JSON.stringify(current.sort())] : total),\n [],\n );\n const foundIndexDuplicate = stringAlternate.findIndex((alternate) => alternate.length && alternate === stringChoices);\n\n return foundIndexDuplicate;\n};\n\nexport const isAlternateDuplicated = (alternate) => {\n if (alternate.length <= 1) {\n return -1;\n }\n\n const elementSet = new Set();\n const stringAlternate = alternate.reduce(\n (total, current) => (current.length > 0 ? [...total, JSON.stringify(current.sort())] : total),\n [],\n );\n\n for (let i = 0; i < stringAlternate.length; i++) {\n if (elementSet.has(stringAlternate[i]) && stringAlternate[i]) {\n return i;\n }\n\n elementSet.add(stringAlternate[i]);\n }\n\n return -1;\n};\n\n// calculate the minimum number of populated response areas (categories) in the correct answer or alternates\n// and create an array with the possible responses ids\nexport const getCompleteResponseDetails = (correctResponse, alternates, allChoices) => {\n const choicesPerCategory = correctResponse.map((category) => category.choices);\n const possibleResponses = [choicesPerCategory.flat()];\n let responseAreasToBeFilled = choicesPerCategory.filter((choices) => choices.length).length;\n\n if (alternates.length) {\n const alternatesPerChoice = alternates[0]?.length || 0; // number of alternates\n\n [...Array(alternatesPerChoice).keys()].forEach((index) => {\n const alternatesPerResponse = alternates.map((alternate) => alternate[index]);\n const filledCategories = alternatesPerResponse.filter((category) => category?.length).length;\n possibleResponses.push(alternatesPerResponse.flat());\n\n if (filledCategories < responseAreasToBeFilled) {\n responseAreasToBeFilled = filledCategories;\n }\n });\n }\n\n // check if any correct answer have any unplaced answer choices\n const hasUnplacedChoices = possibleResponses.some(\n (response) => !allChoices.every((val) => response.includes(val?.id)),\n );\n\n return { responseAreasToBeFilled, possibleResponses, hasUnplacedChoices };\n};\n","// @ts-nocheck\n/**\n * @synced-from pie-elements/packages/categorize/controller/src/index.js\n * @auto-generated\n *\n * This file is automatically synced from pie-elements and converted to TypeScript.\n * Manual edits will be overwritten on next sync.\n * To make changes, edit the upstream JavaScript file and run sync again.\n */\n\nimport { isEmpty } from '@pie-element/shared-lodash';\nimport { buildState, score } from '@pie-lib/categorize';\nimport { getFeedbackForCorrectness } from '@pie-element/shared-feedback';\nimport { lockChoices, getShuffledChoices, partialScoring } from '@pie-element/shared-controller-utils';\nimport Translator from '@pie-lib/translator';\n\nconst { translator } = Translator;\nimport defaults from './defaults.js';\nimport { getCompleteResponseDetails, isAlternateDuplicated, isCorrectResponseDuplicated, multiplePlacements } from './utils.js';\n\n// eslint-disable-next-line no-console\n\nexport { score };\n\nexport const getPartialScore = (correctResponse, builtCategories) => {\n // in the resulted best scenario we make a sum with all the correct responses\n // and all the placements\n const { placements, score } = builtCategories.reduce(\n (acc, { choices = [] }) => ({\n placements: acc.placements + choices.length,\n score: acc.score + choices.filter((ch) => ch.correct).length,\n }),\n { placements: 0, score: 0 },\n );\n\n // in the correct response, we make a sum of the max possible score\n const { maxScore } = correctResponse.reduce(\n (acc, { choices }) => ({\n maxScore: acc.maxScore + choices.length,\n }),\n { maxScore: 0 },\n );\n\n // if there are any extra placements, we subtract from the obtained score\n const extraPlacements = placements > maxScore ? placements - maxScore : 0;\n const totalScore = (score - extraPlacements) / maxScore;\n\n return totalScore < 0 ? 0 : parseFloat(totalScore.toFixed(2));\n};\n\nconst getAlternates = (correctResponse) =>\n correctResponse.map((c) => c.alternateResponses).filter((alternate) => alternate);\n\nexport const getTotalScore = (question, session, env) => {\n if (!session) {\n return 0;\n }\n\n if (Object.keys(session).length === 0) {\n return 0;\n }\n const { categories, choices } = question || {};\n let { correctResponse } = question || {};\n let { answers } = session || {};\n answers = answers || [];\n correctResponse = correctResponse || [];\n\n // this function is used in pie-ui/categorize as well, in order to get the best scenario\n // so we get the best scenario and calculate the score\n const { categories: builtCategories, correct } = buildState(categories, choices, answers, correctResponse);\n\n const alternates = getAlternates(correctResponse);\n const enabled = partialScoring.enabled(question, env);\n\n // if there are any alternates, there will be no partial scoring!\n if (enabled && !alternates.length) {\n // we apply partial scoring\n return getPartialScore(correctResponse, builtCategories);\n }\n\n // else we apply dichotomous\n return correct ? 1 : 0;\n};\n\nexport const getCorrectness = (question, session, env) => {\n return new Promise((resolve) => {\n if (env.mode === 'evaluate') {\n const score = getTotalScore(question, session, env);\n if (score === 1) {\n resolve('correct');\n } else if (score === 0) {\n resolve('incorrect');\n } else {\n resolve('partially-correct');\n }\n } else {\n resolve(undefined);\n }\n });\n};\n\nexport const createDefaultModel = (model = {}) =>\n new Promise((resolve) => {\n resolve({\n ...defaults,\n ...model,\n });\n });\n\nexport const normalize = (question) => ({ ...defaults, ...question });\n\n/**\n *\n * @param {*} question\n * @param {*} session\n * @param {*} env\n * @param {*} updateSession - optional - a function that will set the properties passed into it on the session.\n */\nexport const model = async (question, session, env, updateSession) => {\n const normalizedQuestion = normalize(question);\n const answerCorrectness = await getCorrectness(normalizedQuestion, session, env);\n\n const { mode, role } = env || {};\n\n const {\n categories,\n categoriesPerRow,\n choicesLabel,\n choicesPosition,\n correctResponse,\n feedback,\n feedbackEnabled,\n promptEnabled,\n prompt,\n rowLabels,\n rationaleEnabled,\n rationale,\n teacherInstructionsEnabled,\n teacherInstructions,\n language,\n maxChoicesPerCategory,\n extraCSSRules,\n minRowHeight,\n fontSizeFactor,\n autoplayAudioEnabled,\n completeAudioEnabled,\n customAudioButton,\n } = normalizedQuestion;\n let { choices, note } = normalizedQuestion;\n let fb;\n\n const lockChoiceOrder = lockChoices(normalizedQuestion, session, env);\n\n const filteredCorrectResponse = correctResponse.map((response) => {\n const filteredChoices = (response.choices || []).filter((choice) => choice !== 'null');\n return { ...response, choices: filteredChoices };\n });\n\n if (mode === 'evaluate' && feedbackEnabled) {\n fb = await getFeedbackForCorrectness(answerCorrectness, feedback);\n }\n\n if (!lockChoiceOrder) {\n choices = await getShuffledChoices(choices, session, updateSession, 'id');\n }\n\n const resolvedAllowMultiple = (() => {\n if (question.allowMultiplePlacementsEnabled != null) {\n return question.allowMultiplePlacementsEnabled;\n }\n // Derive from correct response: if any choice id appears in more than one category, reuse is required\n const allChoiceIds = (correctResponse || []).flatMap((cr) => cr.choices || []);\n const isExclusive = allChoiceIds.length === new Set(allChoiceIds).size;\n return isExclusive ? multiplePlacements.disabled : multiplePlacements.enabled;\n })();\n\n choices = (choices || []).map((c) => {\n let categoryCount;\n if (resolvedAllowMultiple === multiplePlacements.enabled) {\n categoryCount = 0;\n } else if (resolvedAllowMultiple === multiplePlacements.disabled) {\n categoryCount = 1;\n } else {\n // perChoice — use the value set on each choice individually\n categoryCount = c.categoryCount || 0;\n }\n return { ...c, categoryCount };\n });\n\n if (!note) {\n note = translator.t('common:commonCorrectAnswerWithAlternates', { lng: language });\n }\n\n const alternates = getAlternates(filteredCorrectResponse);\n const { responseAreasToBeFilled, possibleResponses, hasUnplacedChoices } = getCompleteResponseDetails(\n filteredCorrectResponse,\n normalizedQuestion.allowAlternateEnabled ? alternates : [],\n normalizedQuestion.choices,\n );\n const out = {\n categories: categories || [],\n categoriesPerRow: categoriesPerRow || 2,\n maxChoicesPerCategory,\n correctness: answerCorrectness,\n choices: choices || [],\n choicesLabel: choicesLabel || '',\n choicesPosition,\n disabled: mode !== 'gather',\n feedback: fb,\n lockChoiceOrder,\n prompt: promptEnabled ? prompt : null,\n rowLabels,\n note,\n env,\n showNote: alternates && alternates.length > 0,\n correctResponse: mode === 'evaluate' ? filteredCorrectResponse : undefined,\n language,\n extraCSSRules,\n fontSizeFactor,\n minRowHeight: minRowHeight,\n autoplayAudioEnabled,\n completeAudioEnabled,\n customAudioButton,\n possibleResponses,\n responseAreasToBeFilled,\n hasUnplacedChoices,\n ...(question.allowMultiplePlacementsEnabled == null && { allowMultiplePlacementsEnabled: resolvedAllowMultiple }),\n };\n\n if (role === 'instructor' && (mode === 'view' || mode === 'evaluate')) {\n out.rationale = rationaleEnabled ? rationale : null;\n out.teacherInstructions = teacherInstructionsEnabled ? teacherInstructions : null;\n } else {\n out.rationale = null;\n out.teacherInstructions = null;\n }\n\n return out;\n};\n\n /**\n * Generates detailed trace log for scoring evaluation\n * @param {Object} model - the question model\n * @param {Object} session - the student session\n * @param {Object} env - the environment\n * @returns {Array} traceLog - array of trace messages\n */\nexport const getLogTrace = (model, session, env) => {\n const traceLog = [];\n const { answers } = session || {};\n const { categories, choices, correctResponse } = model || {};\n\n const draggedChoices = answers.reduce(\n (sum, a) => sum + (a.choices?.length || 0),\n 0\n );\n\n const alternates = getAlternates(correctResponse);\n const hasAlternates = alternates.length > 0;\n const partialScoringEnabled = partialScoring.enabled(model, env);\n\n const builtState =\n draggedChoices > 0\n ? buildState(categories, choices, answers, correctResponse)\n : null;\n\n const builtCategories = builtState?.categories || [];\n \n if (draggedChoices > 0) {\n traceLog.push(`Student placed ${draggedChoices} choice(s) into categories.`);\n \n (categories || []).forEach((category) => {\n const categoryId = category.id;\n const builtCategory = builtCategories.find(c => c.id === categoryId);\n const studentChoices = builtCategory ? builtCategory.choices || [] : [];\n const correctResponseForCategory = (correctResponse || []).find(cr => cr.category === categoryId);\n const expectedChoices = correctResponseForCategory ? correctResponseForCategory.choices || [] : [];\n \n if (expectedChoices.length > 0) {\n if (studentChoices.length === 0) {\n traceLog.push(`Category ${categoryId}: student left empty (should contain ${expectedChoices.length} choice(s)).`);\n } else {\n const correctCount = studentChoices.filter(choice => choice.correct).length;\n const incorrectCount = studentChoices.length - correctCount;\n \n if (correctCount > 0 && incorrectCount === 0) {\n traceLog.push(`Category ${categoryId}: student placed ${correctCount} correct choice(s).`);\n } else if (correctCount === 0 && incorrectCount > 0) {\n traceLog.push(`Category ${categoryId}: student placed ${incorrectCount} incorrect choice(s).`);\n } else {\n traceLog.push(`Category ${categoryId}: student placed ${correctCount} correct and ${incorrectCount} incorrect choice(s).`);\n }\n }\n }\n });\n } else {\n traceLog.push('Student did not place any choices into categories.');\n }\n\n if (hasAlternates) {\n traceLog.push('Alternate response combinations are accepted for this question.');\n }\n\n if (hasAlternates) {\n traceLog.push('Score calculated using all-or-nothing scoring (alternate responses disable partial scoring).');\n traceLog.push('Student must get all categories completely correct to receive full credit.');\n } else if (partialScoringEnabled) {\n traceLog.push('Score calculated using partial scoring.');\n traceLog.push('Student receives credit for each correct placement, with deductions for incorrect placements beyond required amount.');\n \n if (draggedChoices > 0) {\n const totalCorrect = builtCategories.reduce((sum, cat) => \n sum + (cat.choices || []).filter(choice => choice.correct).length, 0);\n const totalIncorrect = draggedChoices - totalCorrect;\n const maxPossible = (correctResponse || []).reduce((sum, cat) => \n sum + (cat.choices || []).length, 0);\n \n traceLog.push(`Partial scoring calculation: ${totalCorrect} correct placements, ${totalIncorrect} incorrect placements.`);\n \n if (draggedChoices > maxPossible) {\n const extraPlacements = draggedChoices - maxPossible;\n traceLog.push(`${extraPlacements} extra placement(s) beyond required amount will be deducted from score.`);\n }\n }\n } else {\n traceLog.push('Score calculated using all-or-nothing scoring.');\n traceLog.push('Student must get all categories completely correct to receive full credit.');\n }\n\n const score = getTotalScore(model, session, env);\n traceLog.push(`Final score: ${score}.`);\n\n return traceLog;\n}\n\nexport const outcome = (question, session, env) => {\n if (env.mode !== 'evaluate') {\n return Promise.reject(new Error('Can not call outcome when mode is not evaluate'));\n } else {\n return new Promise((resolve) => {\n // A player sends an untouched item's session as `{ id, element }`, without `answers`.\n if (!session || isEmpty(session) || !session.answers) {\n resolve({\n score: 0,\n empty: true,\n traceLog: ['Student did not place any choices into categories. Score is 0.'],\n });\n } else {\n const traceLog = getLogTrace(question, session, env);\n const score = getTotalScore(question, session, env);\n \n resolve({\n score,\n empty: false,\n traceLog,\n });\n }\n });\n }\n};\n\nexport const createCorrectResponseSession = (question, env) => {\n return new Promise((resolve) => {\n const { mode, role } = env || {};\n\n if (mode !== 'evaluate' && role === 'instructor') {\n const { correctResponse } = question;\n\n resolve({ answers: correctResponse, id: 1 });\n } else {\n return resolve(null);\n }\n });\n};\n\n// remove all html tags\nconst getInnerText = (html) => (html || '').replaceAll(/<[^>]*>/g, '');\n\n// remove all html tags except img, iframe and source tag for audio\nconst getContent = (html) => (html || '').replace(/(<(?!img|iframe|source)([^>]+)>)/gi, '');\n\nexport const validate = (model = {}, config = {}) => {\n const { categories, choices, correctResponse, maxAnswerChoices } = model;\n const {\n minChoices = 1,\n minCategories = 1,\n maxCategories = 12,\n maxLengthPerChoice = 300,\n maxLengthPerCategory = 150,\n } = config;\n const reversedChoices = [...(choices || [])].reverse();\n const errors = {};\n const choicesErrors = {};\n const categoriesErrors = {};\n\n ['teacherInstructions', 'prompt', 'rationale'].forEach((field) => {\n if (config[field]?.required && !getContent(model[field])) {\n errors[field] = 'This field is required.';\n }\n });\n\n (categories || []).forEach((category) => {\n const { id, label } = category;\n\n if (getInnerText(label).length > maxLengthPerCategory) {\n categoriesErrors[id] = `Category labels should be no more than ${maxLengthPerCategory} characters long.`;\n }\n });\n\n (reversedChoices || []).forEach((choice, index) => {\n const { id, content } = choice;\n\n if (getInnerText(content).length > maxLengthPerChoice) {\n choicesErrors[id] = `Tokens should be no more than ${maxLengthPerChoice} characters long.`;\n }\n\n if (!getContent(content)) {\n choicesErrors[id] = 'Tokens should not be empty.';\n } else {\n const identicalAnswer = reversedChoices.slice(index + 1).some((c) => c.content === content);\n\n if (identicalAnswer) {\n choicesErrors[id] = 'Tokens content should be unique.';\n }\n }\n });\n\n const nbOfCategories = (categories || []).length;\n const nbOfChoices = (choices || []).length;\n\n if (nbOfCategories > maxCategories) {\n errors.categoriesError = `No more than ${maxCategories} categories should be defined.`;\n } else if (nbOfCategories < minCategories) {\n errors.categoriesError = `There should be at least ${minCategories} category defined.`;\n }\n\n if (nbOfChoices < minChoices) {\n errors.choicesError = `There should be at least ${minChoices} choices defined.`;\n } else if (nbOfChoices > maxAnswerChoices) {\n errors.choicesError = `No more than ${maxAnswerChoices} choices should be defined.`;\n }\n\n if (nbOfChoices && nbOfCategories) {\n let hasAssociations = false;\n\n (correctResponse || []).forEach((response) => {\n const { choices = [], alternateResponses = [] } = response;\n\n if (choices.length) {\n hasAssociations = true;\n } else {\n alternateResponses.forEach((alternate) => {\n if ((alternate || []).length) {\n hasAssociations = true;\n }\n });\n }\n });\n\n let duplicateAlternateIndex = -1;\n let duplicateCategory = '';\n (correctResponse || []).forEach((response) => {\n const { choices = [], alternateResponses = [], category } = response;\n\n if (duplicateAlternateIndex === -1) {\n duplicateAlternateIndex = isCorrectResponseDuplicated(choices, alternateResponses);\n\n if (duplicateAlternateIndex === -1) {\n duplicateAlternateIndex = isAlternateDuplicated(alternateResponses);\n }\n\n duplicateCategory = category;\n }\n });\n\n if (duplicateAlternateIndex > -1) {\n errors.duplicateAlternate = { index: duplicateAlternateIndex, category: duplicateCategory };\n }\n\n if (!hasAssociations) {\n errors.associationError = 'At least one token should be assigned to at least one category.';\n }\n }\n\n if (!isEmpty(choicesErrors)) {\n errors.choicesErrors = choicesErrors;\n }\n\n if (!isEmpty(categoriesErrors)) {\n errors.categoriesErrors = categoriesErrors;\n }\n\n return errors;\n};\n"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { a as e } from "../rolldown-runtime-CHQKHQ89.js";
|
|
2
|
-
import { Bt as t, C as n, Dt as r, E as i, F as a, H as o, Mt as s, Nt as c, St as l, T as u, Tt as d, Ut as f, _ as p, bt as m, d as h, f as g, g as ee, gt as _, h as v, jt as y, l as b, m as x, p as S, s as te, t as ne, u as re, w as C, yt as ie, zt as ae } from "../alert-dialog-
|
|
2
|
+
import { Bt as t, C as n, Dt as r, E as i, F as a, H as o, Mt as s, Nt as c, St as l, T as u, Tt as d, Ut as f, _ as p, bt as m, d as h, f as g, g as ee, gt as _, h as v, jt as y, l as b, m as x, p as S, s as te, t as ne, u as re, w as C, yt as ie, zt as ae } from "../alert-dialog-C8lWYQ3Q.js";
|
|
3
3
|
import { D as oe, E as w, l as T, r as E, t as se } from "../dist-BiRlv37L.js";
|
|
4
4
|
import * as D from "react";
|
|
5
5
|
import O, { useRef as k, useState as ce } from "react";
|